RolePlayingDesign: Difference between revisions
Content deleted Content added
No edit summary |
imported>Hendrik Brummermann No edit summary |
||
| (184 intermediate revisions by 5 users not shown) | |||
Line 1:
{{Navigation for Marauroa Top|Internals}}
{{Navigation for Marauroa Developers}}
This is possibly the most complex part of all the middleware that makes up Arianne.<br>
Role Playing Design is the determining factor on how ''easy'' is to create a new game for Arianne. We had to choose easing the creation of turn time limited based games. Arianne will work better with this kind of games (also known as realtime games).
Role Playing Design tries to be generic and game agnostic (independant of the game being made).
The very basic idea behind RPManager is:
<pre>
Line 14 ⟶ 18:
To achieve this we use several classes:
* RPManager
* IRPRuleProcessor is the interface that you need to
* RPWorld
* IRPZone is
=RPManager=
The goal of the RP Manager is to handle the
* run RPActions from clients
* manage RPWorld
Line 26 ⟶ 31:
* control AI
RPManager
* <i>addRPAction</i> <br> This function queues an action for a particular player to be executed on the next turn.
* <i>getRPObject</i> <br> This is an interface to manage RPWorld to ease the aquisition of the RPObject when exiting the game.
* <i>onInit Player</i>
* <i>onExit Player</i><br> These are callback functions that are used by GameManager to notify that a player has entered or exited the game.
* <i>transferContent</i><br> is a callback function that is called by RPRuleProcessor to stream content to players.
The main flow of RPManager is:
<pre>
forever
{
Procced through every action in this turn
{
rpRuleProcessor executes action
}
Build Perception
Remove timed out players
Line 53 ⟶ 59:
RPScheduler is the class that handles actions to be queued for each player. All the complexity of Action management should be handled here.
All the actions code MUST be here.<br>
By implementing RPRuleProcessor you personalize Marauroa to the game you want to make. However, keep in mind that you are ''limited'' to a realtime style game.
=Objects and Actions=
The whole Marauroa system is managed by two main entities, RPAction and RPObject. There are also several helper classes like Attributes, RPSlot and RPClass
==Attributes==
Attributes is a collection of pairs of values in the form name-value.
We can store almost any basic type in a Attribute object:
* strings
* integer
* floats
* boolean
We can't store structures in the attribute, but you can convert groups of data to a string and store it as a string. Marauroa provides helper methods for this.
==Objects==
Mandatory Object Attributes: id, type and zoneid
id is an unique identification for the Object
An id is only unique inside the zone which contains that object.
- Attributes that begin with ! are completely hidden
- Attributes that begin with # are completely hidden for all
===Classes of Objects Explained===
Classes of Objects are the basic way of structuring Marauroa data structures.
The type of an attribute of a given object must be equal to a RPClass name of the type class you wish to use.
The data types available are:
Line 97 ⟶ 103:
* Flag ( it is a binary attribute )
Attributes can
===Slots===
To have
For example
and we can store objects
Once
As attributes, slots have two special types:
* Slots names that start with ! are only sent to owner player. (Hence only seen by the owner)
* Slots names that start with # are not sent to players. (Invisible to all)
=
To express the willingness of a client to do something it must send the server a MessageC2SAction message.
An action is composed of several attributes. (an attribute is similar to a variable in that it has a name and contains a value).
There are optional and mandatory attributes. If a mandatory attribute is not found, the message is skipped by the RPServerManager.
Mandatory Action Attributes are action_id and type.
The action_id is used to identify the action when a resulting response comes in a perception
=Perceptions=
The basic structure for sending world updates to clients is called perceptions.
There are two types of perception:
* Sync perceptions: these are used to synchronize clients with the server world representation. This is the only valid way of knowing world's status.
* Delta perception: this is used to send only the changes to the world since the last perception.
Our actual Perception system is called Delta<sup>2</sup>. It is heavily attached to the Marauroa core, so I recommend you to use it :)
== How Perceptions and Actions work ==
Actions are sent from the client to the server in order to make the character perform an action. In order for the client to know the result of the action the Server needs to send a reply to the client. How will this be done?
In a first attempt, we send clients back an action that was the result of their action. However, this made the code really hard because we had to update two different things, perceptions and actions. Instead the solution appears intuitively: Why not join action reply and perceptions.
So the action reply is stored inside each object (that executed the action ) with a set of attributes that determine the action return status and the attributes. This way of doing replies makes it a bit harder on RPManager but it simplifies the creation of new clients a lot.
See Actions reply in the Objects documentation to know exactly what is returned. However, keep in mind that the return result depends of each particular game.
==Delta<sup>2</sup> perception Algorithm==
The idea behind the DPA is to avoid sending ALL the objects to a client each time, but only those that have been modified.
Imagine that we have 1000 objects, and only O1 and O505 are active objects that are modified each turn.
The Traditional method:
<pre>
- Get objects that our player should see ( 1000 objects )
Line 141 ⟶ 170:
</pre>
I hope you see the problem...
The delta perception algorithm:
Line 158 ⟶ 187:
</pre>
The next step
The delta
* List of added objects
Line 167 ⟶ 196:
* List of deleted objects
An area
To make perceptions work, it is important to call the modify method in RPZone, so this way objects modified are stored in the modified list.
=Zones and Worlds=
Worlds in Marauroa can be so big, so huge, that we need to split them in to several pieces.
Each of these pieces are what we call an RPZone.
So our world is made of several RPZones that are '''independent''' of each other.
To move from one RPZone to another RPZone you have to code the correct behaviour in RPRuleProcessor. Just look at any of our coded examples.
==RPWorld==
As we have already said, RPWorld stores several RPZones that are independent of each other.<br>
RPWorld provides onInit and onFinish methods that are called on server initialisation and server finalization to define what to do with the world on these events. There is no default behaviour and you need to extend this class to redefine the behaviour.
Also it provides methods for adding and getting new RPZones:
* addRPZone
* getRPZone, which can be used with either RPZone.ID or RPObject.ID
Finally it also contains methods for managing RPObjects as:
* addRPObject, that need that our RPObject contains a valid RPZone.ID inside its RPObject.ID
* getRPObject
* modifyRPObject
* changeZone that moves one object from the old zone to the new zone and adds a proper valid id.
At last, RPWorld also contains a method called nextTurn that is called by RPManager to move from one turn to the next turn. It resets the delta<sup>2</sup> data.
==RPZone==
Objects must be stored somewhere, and we use Zones now to store them. A zone is just a container of Objects which has a name.
Each RPZone '''must''' have a unique name.
In order to improve the modifiability of the Marauroa platform we have made RPZone to be an interface so that if you want you can implement it as you require.
But in most cases, if you think the Delta<sup>2</sup> system is fine and matches your games style, you can use MarauroaRPZone that is our reference implementation of Delta<sup>2</sup> algorithm.
The actual Marauroa RPZone consists of several data structures:
* a HashMap of RPObject.ID to RPObject
* a List of RPObject
* a Perception
The idea is to have already computed, in the Zone, the perception
The perception is the same for all the players in the Zone.
In order to make perceptions work, you have to manually call the modify method so that you notify the zone about changes in a character or object.
[[Category:Marauroa]]
{{#breadcrumbs: [[Marauroa]] | [[Navigation for Marauroa Developers|Internals]] | [[RolePlayingDesign|Role Playing Design]] }}
| |||