The Observer client should implement the core protocol. However, since the Observer does not have to participate in games (though nothing stops it), it is not strictly necessary that it be capable of sending or receiving Join, JoinAck, Leave, GameStart or GameOver packets. It must however be able to receive Chatter and GameList packets as it will be considered to be in the Lobby if not joined to a game.

It is not particularly helpful to model the observer as a state machine. Instead, think of it as maintaining a list of observed games and associated state.

The additional packets the observer can send are as follows:

Observe::

Notifies the server that the observer wishes to observe a particular game. The server will then send a GameState packet in response.

!EndObserve::

Notifies the server that the observer no longer wishes to receive status updates for a particular game.

During the period of observation it can receive any of these packets:

!PlayerStateUpdateJoin::

when a player joins the game.

!PlayerStateUpdateLeave::

when a player leaves the game.

!PlayerStateUpdate::

when a player makes a guess.

The Observer is responsible for keeping track of these updates, as a complete GameState will only be sent when it initially begins observing.