The existing overall architecture is a three-tiered architecture:
- database layer: a single database server
- server layer: a login server and an area server for each location in the game
- client layer: a client that runs on the player's machine
Both the area/login servers and the clients are basically MVC architectures (though the area/login servers have no view!). So, in both of these, there is a model that stores the game state information and a command pattern that allows for the change of that state. You can find the commands that are supported in the package model.commands in the appropriate project (there are different commands on the clients than on the area servers).
All inter-machine communication is achieved using Messages in the [[Communication Protocol]].
The models in the area servers and the clients report state changes via an observer pattern that hides exactly what object you have to observe from the observer. This way, nothing outside the model needs to know where in the model state change reports are created. This part of the architecture is described in detail in [[Qualified Observable Pattern]].
This project is made of six Java projects:
* [[GameShared]] - things that are in both the area servers and the clients
* [[GameClient]] - things that are specific to the client
* [[GameServer]] - things that are specific to the area servers
* [[LoginServer]] - just manages logging into the system and assigning users to their area servers
* [[GameManager]] - a standalone app used to manage the system and record out of game quests
* [[GameSequenceTests]] - a framework that allows us to define the protocols between the servers and verify that each server obeys its portion of that protocol