GameDesign: Difference between revisions
Content deleted Content added
imported>StephenIerodiaconou No edit summary |
imported>Blacklads Undo revision 11673 by Ufizavipupu (Talk) |
||
| (90 intermediate revisions by 6 users not shown) | |||
Line 1:
{{Navigation for Marauroa Top|Internals}}
{{Navigation for Marauroa Developers}}
= Basic idea behind GameManager =
The idea behind the Game Manager is to handle all the "business logic". This Manager decides how to reply to each individual message.
Line 17 ⟶ 21:
So let's define the reply to each message. First, let's clarify that the best way of modelling this system is using finite automates, (a finite state machine) where, based on the input, we change the state we are currently in and produce an output.
== Login stage ==
<b>NOTE</b>: This stage has been split in 3 to allow proper secure login.
<b>NOTE</b>: Explain here how secure login works.
<pre>
Line 51 ⟶ 58:
Postcondition: The state MUST be NULL or STATE_LOGIN_COMPLETE
and a we have created a PlayerEntry for this player with
</pre>
== Choose character stage ==
<pre>
Process C2S ChooseCharacter ( STATE_LOGIN_COMPLETE )
Line 76 ⟶ 85:
</pre>
== Logout stage ==
<pre>
Line 98 ⟶ 109:
</pre>
== Perception confirmation stage ==
<pre>
Line 109 ⟶ 122:
</pre>
== Transfer confirmation stage ==
<pre>
Line 124 ⟶ 139:
Postcondition: The state is STATE_LOGIN_BEGIN and the content waiting for player is clear.
</pre>
=PlayerContainer Explained=
Line 242 ⟶ 145:
It consists of a list of RuntimePlayerEntry objects and is heavily linked with the PlayerDatabase, so we can hide the complexity to GameManager. By making PlayerDatabase hidden by PlayerContainer we achieve the illusion that managing the runtime behavior we modify automatically the permanent one.
RuntimePlayerEntry is the structure that contains the information
* <i>clientid</i><br>
Clientid is the field
* <i>source</i><br>
Source is the IPv4 address of the client
* <i>timestamp</i><br>
Timestamp is used to determine if a client has timed out
* <i>storedTimestamp</i><br>
storeTimestamp is used to determine when
* <i>username</i><br>
Username is filled in at runtime with a Login event.
* <i>choosenCharacter</i><br>
choosenCharacter is filled in at runtime with a ChooseCharacter event.
* <i>state</i><br>
State is a number expressing the state in which the player is. There are four states:
When we create the entity, by default, the state is <b>Have to login</b>. Once you have logged in correctly, the state changes to <b>Login Complete</b> and once the player has chosen a Character it changes to <b>game begin</b>. The logout state is pretty trivial :)
The idea is that some operations are only allowed in certain states, so the state property stores which state they are in to make validating actions easier. ( To read about Perceptions, [[RolePlayingDesign#Perceptions | click here]] )
*perception counter<br>
The Perception counter is used
*perception Previous RPObject<br>
Perception previous RPObject is the RPObject that was sent on the last perception
*perception Out of Sync<br>
This flag indicates
Hence, all we need to operate PlayerDatabase is a username and choosenCharacter. So using PlayerEntryContainer we can fully operate it.
==ClientID generation==
Each client MUST have a session id to
To make it even more secure, clientids are generated randomly for each player with the only condition that two different players MUST have two different clientids.
==Synchronization between Game and RP Managers==
Why bother with
So we
The idea behind the solution is that the each manger requests access to the PlayerEntryContainer via a central mutex (a mutex is a syncronisation element attached to a resource, which can be owned by one task at any point in time. If the mutex is owned already when a task tries to access the object protected by it then the mutex will inform the task that it doesn't have access at this point in time to the object).
In GameManager there are only Write actions, as this manager only modifies the state of the PlayerContainer. However, in the RP manager we have both Reads, when we build the perceptions, and Writes when the manager removes idle players. Hence here we have two different locks.
[[Marauroa]]
| |||