summaryrefslogtreecommitdiff
path: root/src/netlem_state_machine.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/netlem_state_machine.c')
-rw-r--r--src/netlem_state_machine.c68
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);
+}
+