diff options
Diffstat (limited to 'src/netlem.c')
-rw-r--r-- | src/netlem.c | 101 |
1 files changed, 36 insertions, 65 deletions
diff --git a/src/netlem.c b/src/netlem.c index e75336b..52750af 100644 --- a/src/netlem.c +++ b/src/netlem.c @@ -13,6 +13,7 @@ //#include "events.h" #include "loader.h" #include "timing.h" +#include "netlem_state_machine.h" // Application version number #include "netlem.h" @@ -41,7 +42,6 @@ int loadLevelProc(void *a); // Client-specific functions void signals(int signum); -state_t getOrChangeState(state_t s, TCPsocket sockClient); int init(gameConfig_t *conf, gameGraphics_t *graph); void loadGameConfig(gameConfig_t *conf); void processLocalEvents(); @@ -50,7 +50,7 @@ int updateGraphics(); int main(int argc, char **argv) { - int drift_ms=0,result; + int drift_ms=0, endMainLoop, result; Uint32 tick=0, timeBefore_ms; Uint8 loadProgress=0; @@ -91,6 +91,7 @@ int main(int argc, char **argv) { return 3; } + // Config file loading loadGameConfig(&conf); // Libraries initialization @@ -121,27 +122,28 @@ int main(int argc, char **argv) { args2.loadProgress=&loadProgress; SDL_Thread *loadLevelThread = SDL_CreateThread(loadLevelProc, &args2); if(!loadLevelThread) { - logs2(LOG_ERROR,"getOrChangeState(), SDL_CreateThread()", SDL_GetError()); + logs2(LOG_ERROR,"main(), SDL_CreateThread()", SDL_GetError()); return 4; //FIXME : autre num } //TODO : faire les menus et ne pas forcer ça ici - if ( getOrChangeState(eMultiLoading, client.sockClient) == eNull ) { + if ( changeStateAndNotify(eMultiLoading, client.sockClient) == eNull ) { return 6; } // Main game loop - while(getOrChangeState(eNull,NULL)!=eEnd) { + endMainLoop=0; + while(!endMainLoop) { timeBefore_ms = SDL_GetTicks(); // Process local player keyboard and mouse events // (note: remote events are processed by network read thread) processLocalEvents(); - switch(getOrChangeState(eNull,NULL)) { + switch(getState()) { case eMultiLoading: if(loadProgress==100) { - getOrChangeState(eMultiWaitLoading,client.sockClient); + changeStateAndNotify(eMultiWaitLoading,client.sockClient); } break; case eMultiWaitLoading: @@ -152,7 +154,8 @@ int main(int argc, char **argv) { return 7; break; case 0: - getOrChangeState(eMultiGame,NULL); +//FIXME : check return value + changeState(eMultiGame); break; default: break; @@ -164,6 +167,7 @@ int main(int argc, char **argv) { play(tick++); break; default: + endMainLoop=1; break; } @@ -184,50 +188,6 @@ int main(int argc, char **argv) { return 0; } -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 eMultiLoading: - //TODO : check current state before switching - logs(LOG_INFO, "Start game loading"); - result=SDL_SemPost(semLoadLevel); - 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; - - case eNull: - break; - default: - return eNull; - } - - return state; -} - void signals(int signum) { static int force=0; char buf[128]; @@ -235,7 +195,7 @@ void signals(int signum) { logs(LOG_WARN, buf); if(!force) { - getOrChangeState(eEnd,NULL); + changeState(eEnd); force=1; logs(LOG_WARN, "Trying to stop smoothly..."); } else { @@ -248,7 +208,7 @@ int init(gameConfig_t *conf, gameGraphics_t *graph) { int result; - //Initialisation des sous-systèmes de SDL + // SDL subsystems initialization result = SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO ); if ( result != 0 ) { logs2(LOG_ERROR, "init(), SDL_Init()", SDL_GetError()); @@ -257,19 +217,20 @@ int init(gameConfig_t *conf, gameGraphics_t *graph) { atexit(SDL_Quit); signal(2,signals); - //Mise en place de l'écran + // Screen setup graph->screen = SDL_SetVideoMode(conf->screen.w, conf->screen.h, SCREEN_BPP, SDL_HWSURFACE | SDL_DOUBLEBUF ); if( graph->screen == NULL ) { logs2(LOG_ERROR, "init(), SDL_SetVideoMode()", SDL_GetError()); return 2; } - //Titre de la fenêtre SDL + // SDL main window caption SDL_WM_SetCaption(WIN_CAPTION, NULL); - //Désactiver le pointeur de la souris + // We dont want to see the standard mouse cursor in our main window SDL_ShowCursor(0); - // Allocation et initialisation des différents calques d'affichage et de collision + + // Memory allocation and initialization for all display layers graph->terrain = SDL_CreateRGBSurface(SDL_HWSURFACE, LEVEL_WIDTH, LEVEL_HEIGHT, SCREEN_BPP,0,0,0,0); if( graph->terrain == NULL ) { logs2(LOG_ERROR, "init(), SDL_CreateRGBSurface()", SDL_GetError()); @@ -300,12 +261,12 @@ int networkReadProc(void *a) { struct _networkReadProc_args *args = (struct _networkReadProc_args *)a; - while( getOrChangeState(eNull,NULL) != eEnd ) { + while( getState() != eEnd ) { // logs(LOG_DEBUG, "Waiting event"); result=receiveEvent(args->client,&e); if (result != 0) { logs(LOG_WARN, "networkReadProc(), receiveEvents() error"); - getOrChangeState(eEnd,NULL); + changeState(eEnd); continue; //TODO : je doute que ça skipe vriament la syncrho du temps :s } // logs(LOG_DEBUG, "Got event"); @@ -337,6 +298,15 @@ int networkReadProc(void *a) { return 0; } +int startLoadLevel() { + int result; + + logs(LOG_INFO, "Start game loading"); + result=SDL_SemPost(semLoadLevel); + + return result; +} + int loadLevelProc(void *a) { int result,i; //char logMsg[128]; @@ -344,7 +314,7 @@ int loadLevelProc(void *a) { struct _loadLevelProc_args *args = (struct _loadLevelProc_args *)a; logs(LOG_WARN, "loadLevelProc(), beginnng"); - while( getOrChangeState(eNull,NULL) != eEnd ) { + while( getState() != eEnd ) { result=SDL_SemWait(semLoadLevel); if (result!=0) { logs2(LOG_ERROR, "main(), SDL_SemTryWaitTimeout()", SDL_GetError()); @@ -352,10 +322,11 @@ int loadLevelProc(void *a) { } logs(LOG_WARN, "loadLevelProc(), start load level"); - for(i=0;i<100;i+=(rand()%10)) { - SDL_Delay(rand()%100); - *(args->loadProgress)=i; - } + + + + + *(args->loadProgress)=100; logs(LOG_WARN, "loadLevelProc(), end load level"); |