diff options
Diffstat (limited to 'src/netlem_state_machine.c')
-rw-r--r-- | src/netlem_state_machine.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/netlem_state_machine.c b/src/netlem_state_machine.c new file mode 100644 index 0000000..b9b7433 --- /dev/null +++ b/src/netlem_state_machine.c @@ -0,0 +1,68 @@ +#include <stdlib.h> + +#include "netlem_state_machine.h" + +#include "events.h" +#include "netgame.h" +#include "utils.h" + +//FIXME #include netlem.h ? +extern int startLoadLevel(); + + +state_t _getOrChangeState(state_t s, TCPsocket sockClient) { + const event_t evReady = {0,0,0,eReady,0,0,NULL,NULL}; + static state_t state=eLaunching; + int result; + + switch(s) { + case eNull: + break; + case eMultiLoading: + //TODO : check current state before switching + result=startLoadLevel(); + if (result!=0) { + logs2(LOG_ERROR, "getOrChangeState()", SDL_GetError()); + return eNull; + } + + state=s; + break; + case eMultiWaitLoading: + //TODO : check current state before switching + + // Say to the server that we are ready to start the game and wait game start + result=sendEvent(sockClient, &evReady); + if (result!=0) return eNull; + + state=s; + break; + case eMultiGame: + //TODO : check current state before switching + logs(LOG_INFO, "Game started !"); + state=s; + break; + case eEnd: + state=s; + break; + + default: + return eNull; + } + + return state; +} + + +state_t getState() { + return _getOrChangeState(eNull, NULL); +} + +state_t changeState(state_t s) { + return _getOrChangeState(s, NULL); +} + +state_t changeStateAndNotify(state_t s, TCPsocket sockClient) { + return _getOrChangeState(s, sockClient); +} + |