Marauroa Core API
Marauroa公開了精簡後的非常簡單的API,因此您可以輕鬆地開發自己的遊戲. A nightly build JavaDoc API Documentation is available, too.
內容[編輯]
您應該了解的主要實體:
- Attributes
- RPAction
- RPObject
- RPSlot
- RPClass
- IRPZone interface
- IRPRuleProcessor interface
- RPWorld
要了解這些元素,請參閱 RolePlayingDesign 和 GameDesign.
或者,如果您希望使用Python來開發遊戲規則,請參閱:
- PythonRP
- PythonWorld
The Python API can be found at PyArianneAPIDefinition and an example of its use at PyArianneAPIExample. 您可以在我們的遊戲教程中閱讀有關使用Python進行開發的更多信息。 HowToWriteGamesUsingArianne. Please note that Python support is dormant.
Attributes[編輯]
屬性是存儲在列表中的數據對. 每個屬性由 name 和 value 元素組成. 屬性是在Arianne中存儲數據的標準方式. 一個屬性的例子是您的年齡, 即 name="age" 和 value=21
每個屬性還具有與之關聯的類型,在 RPClass 中定義. 屬性是 RPClass 的實例(關於 RPClass 的更多內容請參閱下節).
屬性中有兩個特殊條目:
- type: 定義對象所屬的RPClass的名稱.
- id: 定義一個唯一的標識符
Attributes類向遊戲開發人員公開的方法如下所示。 可以用來修改屬性的功能.
設置屬性的值:
public void put(String name, String value)
public void put(String name, int value)
向已經存在的屬性的值元素添加數量:
public void add(String name, int quantity)
返回屬性的值:
public String get(String name)
public int get(String name)
從屬性列表中刪除屬性條目:
public void remove(String name)
如果屬性存在則返回True:
public boolean has(String name)
例子:
Attributes test=new Attributes();
test.put("name","Test attribute");
test.put("hp",100);
if(test.has("hp")) {
test.add("hp",10);
}
test.remove("name");
RPClass[編輯]
此類是Arianne的關鍵概念。 RPClass非常類似於Java類,但是對於Arianne RPObjects來說:RPClass定義了組成對象(對象是屬性的集合,例如對於人類而言,年齡、身高等屬性)的屬性的類型(字符串、整數、布爾值...)和可見性(隱藏,私有或可見)。
RPClass 由5個不同部分組成:
數據類型定義:
- String: 字符串,最多 2^32 字節
- Short String: 字符串,最多 255 字節
- Integer: 32 位整數
- Short: 16 位整數
- Byte: 8 位整數
- Flag: 二進制標誌.
數據的可見性:
- Visible: 屬性對客戶端可見.
- Hidden: 屬性對客戶端不可見.
- Private: 該屬性僅對與之關聯的客戶端可見(如客戶端控制的玩家對象)
RPClass的創建方法: (這些是每個RPClass實例的一部分,有關用法,請參見下面的示例)
public void add(String name, byte type)
public void add(String name, byte type, byte visibility)
public void isA(String parent)
public void isA(RPClass parent)
這些方法將屬性添加到RPClass並設置其類型和可見性。 您也可以設置此類的父類。 當然也可以沒有父類.
填充完類後,您可以使用這些方法查詢數據。 這些方法使您可以獲取類的類名稱,屬性的類型,確定屬性是否存在以及知道RPClass是否為另一個的子類.
查詢:
public String getName()
public byte getType(String name)
public byte getVisibility(String name)
public boolean hasAttribute(String name)
public boolean subclassOf(String parentclass)
您可以使用以下方法查詢系統類. 注意在運行時修改類 不是 一個好主意. 類定義在連接時發送到客戶端,因此,如果您在遊戲過程中更改類定義,則會使客戶端崩潰!
Class wide query:
boolean hasRPClass(String name)
RPClass getRPClass(String name)
當編寫類定義時您可以跳過 id 和 type 屬性,它們由 RPClass 自動定義.
例子:
// 一个带位置信息的实体
RPClass objclass = new RPClass("entity");
objclass.add("x", RPClass.BYTE);
objclass.add("y", RPClass.BYTE);
// 一个玩家实体
objclass = RPClass("player");
objclass.isA("entity");
objclass.add("name", RPClass.SHORT_STRING);
objclass.add("direction", RPClass.SHORT_STRING);
objclass.add("score", RPClass.INT);
objclass.add("super", RPClass.BYTE);
objclass.add("!vdir", RPClass.STRING,RPClass.HIDDEN);
objclass.add("!hdir", RPClass.STRING,RPClass.HIDDEN);
objclass.add("?kill", RPClass.FLAG);
每次您創建一個新的RPClass時,只要您給它命名(例如:entity,player,...),它將被添加到系統的類列表中.
注意,在示例中,如果您希望RPClass具有此屬性,則必須指定hidden屬性,否則默認情況下,該屬性可見.
注意:您可以選擇在應用程式中不使用RPClass,但是這會增加網絡帶寬的使用率.
RPAction[編輯]
RPAction是一個對象,用於表示玩家想要執行的動作. 在設計遊戲時,由您自己決定,因為它們是針對每個遊戲的(您還應該為它們定義RPClass).
RPObject 和 RPSlot[編輯]
RPObject是Arianne中數據的容器。 一個RPObject是附加了RPSlot列表的Attributes元素.
RPSlot是RPObject擁有的插槽,可以在其中放置其他RPObject(例如背包中的物品)
RPObject修改插槽的方法是:
public void addSlot(RPSlot slot)
public RPSlot getSlot(String name)
public void removeSlot(String name)
public boolean hasSlot(String name)
public Iterator slotIterator()
以上方法用於將插槽添加到對象,對其進行檢索,將其刪除並測試該插槽是否存在。 最後,插槽迭代器用於訪問對象中的所有插槽.
public RPObject.ID getID()
這是獲取對象唯一ID的輔助方法.
RPSlot的簡單API:
public void add(RPObject object)
public RPObject get(RPObject.ID id)
public boolean has(RPObject.ID id)
public RPObject remove(RPObject.ID id)
public void clear()
這些方法修改RPSlot中的對象。 clear()方法刪除插槽中的所有對象.
public Iterator iterator()
用於訪問該插槽的所有對象.
// 创建一个玩家RPClass的对象并设置一些属性值
RPObject object = new RPObject("player");
object.put("name", "example");
object.put("score", 0);
// 创建一个名为背包的插槽
RPSlot slot = new RPSlot("backpack");
object.addSlot(slot);
// 创建一个钱币RPClass的对象并且放入插槽
RPObject coin = new RPObject("coin");
slot.add(coin);
現在來看最複雜的部分。 稍微有點瘋狂!: IRPZone 和 IRPRuleProcessor 接口
RPWorld[編輯]
此類只是區域Zone的容器.
RPWorld 提供了幾種方法來簡化RPZone的處理.
在伺服器啟動和完成時調用onInit和onFinish。 您需要將RPWorld子類化以使其具有適當的行為.
public void onInit() throws Exception
public void onFinish() throws Exception
一些添加區域並對其進行迭代的輔助方法.
public void addRPZone(IRPZone zone)
public IRPZone getRPZone(IRPZone.ID zoneid)
public IRPZone getRPZone(RPObject.ID objectid)
public Iterator<IRPZone> iterator()
public int size()
添加,獲取,測試存在,刪除和修改對象的方法。 modify() 採用delta ^ 2算法.
public void add(RPObject object) throws NoRPZoneException, RPObjectInvalidException
public RPObject get(RPObject.ID id) throws NoRPZoneException, RPObjectInvalidException
public boolean has(RPObject.ID id) throws NoRPZoneException, RPObjectInvalidException
public RPObject remove(RPObject.ID id) throws NoRPZoneException, RPObjectNotFoundException
public void modify(RPObject object) throws NoRPZoneException
這些是用於更改對象區域的輔助方法。 用它們代替手工操作.
public void changeZone(IRPZone.ID oldzoneid, IRPZone.ID newzoneid, RPObject object) throws NoRPZoneException
public void changeZone(String oldzone, String newzone, RPObject object) throws NoRPZoneException
IRPZone[編輯]
IRPZone是處理世界內容和感知的接口。 在大多數情況下,您應該使用實現MarauroaRPZone並將其擴展.
這些方法是:
/** This method is called when the zone is created to populate it */
public void onInit() throws Exception;
/** This method is called when the server finish to save the content of the zone */
public void onFinish() throws Exception;
/** This method adds an object to the Zone */
public void add(RPObject object) throws RPObjectInvalidException;
/** This method tag an object of the Zone as modified */
public void modify(RPObject object) throws RPObjectInvalidException;
/** This method removed an object of the Zone and return it.*/
public RPObject remove(RPObject.ID id) throws RPObjectNotFoundException;
/** This method returns an object of the Zone */
public RPObject get(RPObject.ID id) throws RPObjectNotFoundException;
/** This method returns true if the object exists in the Zone */
public boolean has(RPObject.ID id);
/** This method create a new RPObject with a valid id */
public RPObject create();
/** Iterates over the elements of the zone */
public Iterator iterator();
/** Returns the number of elements of the zone */
public long size();
/** This method return the perception of a zone for a player */
public Perception getPerception(RPObject.ID id, byte type);
/** This method is called to take zone to the next turn */
public void nextTurn();
/** Method to create the map to send to player's client */
public java.util.List buildMapObjectsList(RPObject.ID id);
在大多數情況下,您希望修改的只是:
- onInit
- onFinish
- buildMapObjectsList
IRPRuleProcessor[編輯]
此類必須完全實現,但與IRPZone :)相比,它是一個兒童玩具。 這是您編寫所有遊戲規則的地方.
API如下:
/** Set the context where the actions are executed.
* @param zone The zone where actions happens. */
public void setContext(IRPZone zone);
/** Pass the whole list of actions so that it can approve or deny the actions in it.
* @param id the id of the object owner of the actions.
* @param actionList the list of actions that the player wants to execute. */
public void approvedActions(RPObject.ID id, RPActionList actionList);
/** Execute an action in the name of a player.
* @param id the id of the object owner of the actions.
* @param action the action to execute
* @return the action status, that can be Success, Fail or incomplete, please
* refer to Actions Explained for more info. */
public RPAction.Status execute(RPObject.ID id, RPAction action);
/** Notify it when a new turn happens */
public void nextTurn();
/** Callback method called when a new player enters in the game
* @param object the new player that enters in the game. */
public boolean onInit(RPObject object) throws RPObjectInvalidException;
/** Callback method called when a new player exits the game
* @param id the new player id that exits the game.
* @return true to update the player on database. */
public boolean onExit(RPObject.ID id) throws RPObjectNotFoundException;
/** Callback method called when a new player time out
* @param id the new player id that timeouts. */
public boolean onTimeout(RPObject.ID id) throws RPObjectNotFoundException;