diff options
-rw-r--r-- | src/include/data_localgame.h | 3 | ||||
-rw-r--r-- | src/netlem.c | 229 | ||||
-rw-r--r-- | src/netlem_state_machine.c | 3 |
3 files changed, 151 insertions, 84 deletions
diff --git a/src/include/data_localgame.h b/src/include/data_localgame.h index 8a67b5f..5f67783 100644 --- a/src/include/data_localgame.h +++ b/src/include/data_localgame.h @@ -11,11 +11,12 @@ typedef struct { typedef struct { SDL_Surface *screen, *terrain, *stencil; - pos_t viewport; // Viewport top-left corner coords in screen + SDL_Rect viewport; // Viewport top-left corner coords in screen } gameGraphics_t; typedef struct { + id_t levelPack; id_t level; } serverParams_t; diff --git a/src/netlem.c b/src/netlem.c index 662b2f8..b8a7bce 100644 --- a/src/netlem.c +++ b/src/netlem.c @@ -27,8 +27,7 @@ struct _networkReadProc_args { }; struct _loadLevelProc_args { - //serverParams_t *serverParams; - char *lvlIniFilePath; + serverParams_t *serverParams; gameIni_t *gIni; gameRess_t *gRess; gameGraphics_t *gGraph; @@ -47,7 +46,7 @@ int loadLevelProc(void *a); void signals(int signum); int init(gameConfig_t *conf, gameGraphics_t *gGraph); void loadGameConfig(gameConfig_t *conf); -void processLocalEvents(); +void processLocalEvents(SDL_Rect *viewport, SDL_Rect *screen, SDL_Rect *terrain); int updateGraphics(gameGraphics_t *gGraph); @@ -58,7 +57,7 @@ int main(int argc, char **argv) { Uint8 loadProgress=0; client_t client; - //serverParams_t serverParams; + serverParams_t serverParams; gameConfig_t conf; gameIni_t gIni; gameRess_t gRess; @@ -94,6 +93,9 @@ int main(int argc, char **argv) { return 3; } + // Levelpack file loading + //loadLevelPacks(); + // Config file loading loadGameConfig(&conf); @@ -108,6 +110,9 @@ int main(int argc, char **argv) { semGameStart=SDL_CreateSemaphore(0); semLoadLevel=SDL_CreateSemaphore(0); + // Some data initialization + memset(&serverParams,0,sizeof(serverParams_t)); + // Network reader thread to process remote events and time sync args.client=&client; args.tick=&tick; @@ -119,9 +124,10 @@ int main(int argc, char **argv) { } // Worker thread for loading levels asynchronously (the thread begin with a SDL_Wait(semLevelLoadingStart)) - //args2.serverParams=&serverParams; + args2.serverParams=&serverParams; args2.gIni=&gIni; args2.gRess=&gRess; + args2.gGraph=&gGraph; args2.loadProgress=&loadProgress; SDL_Thread *loadLevelThread = SDL_CreateThread(loadLevelProc, &args2); if(!loadLevelThread) { @@ -131,6 +137,7 @@ int main(int argc, char **argv) { //TODO : faire les menus et ne pas forcer ça ici if ( changeStateAndNotify(eMultiLoading, client.sockClient) == eNull ) { + logs2(LOG_ERROR,"main()", "Could not force eMultiLoading state"); return 6; } @@ -141,7 +148,7 @@ int main(int argc, char **argv) { // Process local player keyboard and mouse events // (note: remote events are processed by network read thread) - processLocalEvents(); + processLocalEvents(&(gGraph.viewport), &(gGraph.screen->clip_rect), &(gGraph.terrain->clip_rect)); switch(getState()) { case eMultiLoading: @@ -153,7 +160,7 @@ int main(int argc, char **argv) { result=SDL_SemTryWait(semGameStart); switch (result) { case -1: - logs2(LOG_ERROR, "main(), SDL_SemTryWaitTimeout()", SDL_GetError()); + logs2(LOG_ERROR, "main(), SDL_SemTryWait()", SDL_GetError()); return 7; break; case 0: @@ -210,7 +217,6 @@ void signals(int signum) { int init(gameConfig_t *conf, gameGraphics_t *gGraph) { int result; - // SDL subsystems initialization result = SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO ); if ( result != 0 ) { @@ -221,7 +227,7 @@ int init(gameConfig_t *conf, gameGraphics_t *gGraph) { signal(2,signals); // Screen setup - gGraph->screen = SDL_SetVideoMode(conf->screen.w, conf->screen.h, SCREEN_BPP, SDL_HWSURFACE | SDL_DOUBLEBUF ); + gGraph->screen = SDL_SetVideoMode(conf->screen.w, conf->screen.h, SCREEN_BPP, SDL_HWSURFACE); if( gGraph->screen == NULL ) { logs2(LOG_ERROR, "init(), SDL_SetVideoMode()", SDL_GetError()); return 2; @@ -265,14 +271,14 @@ int networkReadProc(void *a) { struct _networkReadProc_args *args = (struct _networkReadProc_args *)a; while( getState() != eEnd ) { - // logs(LOG_DEBUG, "Waiting event"); + logs(LOG_DEBUG, "Waiting event"); result=receiveEvent(args->client,&e); if (result != 0) { logs(LOG_WARN, "networkReadProc(), receiveEvents() error"); changeState(eEnd); continue; //TODO : je doute que ça skipe vriament la syncrho du temps :s } - // logs(LOG_DEBUG, "Got event"); + logs(LOG_DEBUG, "Got event"); *(args->drift_ms)=( *(args->tick) - e.serverTick ); sprintf(logMsg, "serverTick==%i, tick==%i, drift_ms==%i\n", e.serverTick, *(args->tick), *(args->drift_ms)); @@ -296,7 +302,7 @@ int networkReadProc(void *a) { logs(LOG_ERROR, "serveClient(), Unknown event type"); } } - // logs(LOG_DEBUG, "networkReadProc() : end"); + logs(LOG_DEBUG, "networkReadProc() : end"); return 0; } @@ -309,12 +315,74 @@ int startLoadLevel() { return result; } + //FIXME : defines cnetraliser #define PATH_STYLE "../styles" -int loadLevelProc(void *a) { - int res, len; +#define PATH_LEVEL "../level" +int loadLevel(struct _loadLevelProc_args *args) { + int res,len; char *filepath; - + + // Setting default values + memset(args->gIni,0,sizeof(gameIni_t)); + *(args->loadProgress)=1; + + // Loading lvl ini file + //FIXME : dynamic ! + len=strlen(PATH_LEVEL)+strlen("1_orig")+strlen("lvl0003")+strlen("//.ini")+1; + filepath=malloc(sizeof(char)*len); + snprintf(filepath, len, "%s/%s/%s.ini", PATH_LEVEL, "1_orig", "lvl0003"); + + res=loadIni(args->gIni, filepath); + free(filepath); + if ( res != 0 ) { + logs2(LOG_ERROR, "loadLevel(), loadIni()", "Could not load level ini file"); + return 2; + } + *(args->loadProgress)=10; + + // Check if we found a "style =" line in level ini file + if (args->gIni->level.style==NULL) { + logs2(LOG_ERROR, "loadLevel()", "No valid style detected"); + return 3; + } + args->gIni->style.name=args->gIni->level.style; + + // Loading style ini file + len=strlen(PATH_STYLE)+2*strlen(args->gIni->level.style)+strlen("//.ini")+1; + filepath=malloc(sizeof(char)*len); + snprintf(filepath, len, "%s/%s/%s.ini", PATH_STYLE, args->gIni->level.style, args->gIni->level.style); + + res=loadIni(args->gIni, filepath); + free(filepath); + + if (res!=0) { + logs2(LOG_ERROR, "loadLevel(), loadIni()", "Could not load style ini file"); + return 4; + } + *(args->loadProgress)=20; + + res=loadRessources(args->gIni, args->gRess); + if (res!=0) { + logs(LOG_ERROR, "loadLevel(), loadRessources()"); + return 5; + } + *(args->loadProgress)=50; + + res=paintTerrain(args->gIni, args->gRess, args->gGraph); + if (res!=0) { + logs(LOG_ERROR, "loadLevel(), paintTerrain()"); + return 6; + } + + *(args->loadProgress)=80; + return 0; +} + +int loadLevelProc(void *a) { + int res; + char strerr[8]; + struct _loadLevelProc_args *args = (struct _loadLevelProc_args *)a; logs(LOG_WARN, "loadLevelProc(), beginnng"); @@ -326,42 +394,13 @@ int loadLevelProc(void *a) { logs(LOG_WARN, "loadLevelProc(), start load level"); - // Setting default values - memset(args->gIni,0,sizeof(gameIni_t)); - *(args->loadProgress)=1; - - // Loading lvl ini file - //snprintf(filepath, MAX_PATH_LEN, "%s/%s/%s", PATH_LEVEL, argv[1], argv[2]); - res=loadIni(args->gIni, args->lvlIniFilePath); - if (res==0) { - *(args->loadProgress)=10; - - // Check if we found a "style =" line in level ini file - if (args->gIni->level.style==NULL) { - logs(LOG_WARN, "No valid style detected\n"); - } else { - args->gIni->style.name=args->gIni->level.style; - - // Loading style ini file - len=strlen(PATH_STYLE)+2*strlen(args->gIni->level.style)+strlen("//.ini")+1; - filepath=malloc(sizeof(char)*len); - snprintf(filepath, len, "%s/%s/%s.ini", PATH_STYLE, args->gIni->level.style, args->gIni->level.style); - res=loadIni(args->gIni, filepath); - free(filepath); - if (res==0) { - *(args->loadProgress)=20; - res=loadRessources(args->gIni, args->gRess); - if (res==0) { - *(args->loadProgress)=50; - res=paintTerrain(args->gIni, args->gRess, args->gGraph); - if (res==0) { - *(args->loadProgress)=100; - } - } - } - } + res=loadLevel(args); + if (res!=0) { + sprintf(strerr, "%i", res); + logs2(LOG_ERROR, "loadLevelProc(), loadLevel()", strerr); + } else { + *(args->loadProgress)=100; } - logs(LOG_WARN, "loadLevelProc(), end load level"); } @@ -370,58 +409,82 @@ int loadLevelProc(void *a) { return 0; } -void processLocalEvents() { - /*TODO : intégration des variables manipulées dans des structs qui vont bien -while( SDL_PollEvent( &event ) ) { +#define BOUND_SENSIBILITE 16 +#define CAM_VITESSE 8 +void processLocalEvents(SDL_Rect *viewport, SDL_Rect *screen, SDL_Rect *terrain) { + int mouseX, mouseY; + SDL_Event event; + + while( SDL_PollEvent( &event ) ) { switch (event.type) { - case SDL_KEYBOARDEVENT: + case SDL_KEYDOWN: switch(event.key.keysym.sym){ - case SDLK_HOME : decalFps = 0; break; - case SDLK_END : decalFps = FPS-11; break; - case SDLK_PAGEUP : if(decalFps>0){decalFps -=1;}break; - case SDLK_PAGEDOWN : if(decalFps<(FPS-1)){decalFps +=1;}break; - case SDLK_w : paint_stencil = (paint_stencil==0)? 1 : 0 ; break; - case SDLK_ESCAPE : quit = 1; break; + //case SDLK_HOME : decalFps = 0; break; + //case SDLK_END : decalFps = FPS-11; break; + //case SDLK_PAGEUP : if(decalFps>0){decalFps -=1;}break; + //case SDLK_PAGEDOWN : if(decalFps<(FPS-1)){decalFps +=1;}break; + //case SDLK_w : paint_stencil = (paint_stencil==0)? 1 : 0 ; break; + case SDLK_ESCAPE : changeState(eEnd); break; default:break; } - break; + break; case SDL_MOUSEMOTION: mouseX = event.motion.x; mouseY = event.motion.y; - break; + break; case SDL_MOUSEBUTTONDOWN: - err=mouse_action(&gInit, mouseX, mouseY,camera.x,camera.y ); - if(err!=0){return err;} //FIXME : WTF ? - break; + //err=mouse_action(&gInit, mouseX, mouseY,camera.x,camera.y ); + //if(err!=0){return err;} //FIXME : WTF ? + break; case SDL_QUIT: - end=1; - break; + changeState(eEnd); + break; } } - if(mouseY <= LEVEL_HEIGHT){ - if (mouseX > (SCREEN_WIDTH - BOUND_SENSIBILITE)){ - if (camera.x < (LEVEL_WIDTH - SCREEN_WIDTH ) ) - {camera.x += CAM_VITESSE;} + + //if(mouseY <= LEVEL_HEIGHT){ + if (mouseX > (screen->w - BOUND_SENSIBILITE)){ + if (viewport->x < (terrain->w - screen->w ) ) { + viewport->x += CAM_VITESSE; + } } if (mouseX < BOUND_SENSIBILITE){ - if (camera.x >= CAM_VITESSE ) - {camera.x -= CAM_VITESSE;} + if (viewport->x >= CAM_VITESSE ) { + viewport->x -= CAM_VITESSE; + } } - */ + //} + + return; } int updateGraphics(gameGraphics_t *gGraph) { + int res; + static SDL_Rect lastViewport= {-1,-1,-1,-1}; + //TODO : modifier les calques - switch(getState()) { - case eMultiWaitLoading: - case eMultiGame: - //TODO : implémenter un système de dirt rectangles - SDL_BlitSurface(gGraph->terrain, &(gGraph->terrain->clip_rect), gGraph->screen, NULL); - break; - default: - break; - } + switch(getState()) { + case eMultiWaitLoading: + break; + case eMultiGame: + // If we had a camera movement, we have to refesh all the screen + if ( memcmp(&lastViewport, &(gGraph->viewport), sizeof(SDL_Rect)) != 0) { + lastViewport=gGraph->viewport; + res=SDL_BlitSurface(gGraph->terrain, NULL, gGraph->screen, &lastViewport); + if ( res!=0 ) { + logs2(LOG_DEBUG, "updateGraphics(), SDL_BlitSurface()", SDL_GetError()); + return res; + } + SDL_UpdateRect(gGraph->screen, 0,0,0,0); + } else { + // Else, we use a dirt rectangle method for performance + + } + break; + default: + break; + } return 0; } diff --git a/src/netlem_state_machine.c b/src/netlem_state_machine.c index f6bb4bc..c30214e 100644 --- a/src/netlem_state_machine.c +++ b/src/netlem_state_machine.c @@ -20,6 +20,9 @@ state_t _getOrChangeState(state_t newState, TCPsocket sockClient) { break; case eMultiLoading: //TODO : check current state before switching + if (state != eMultiWaitLoading && state != eLaunching) { + return eNull; + } result=startLoadLevel(); if (result!=0) { logs2(LOG_ERROR, "getOrChangeState()", SDL_GetError()); |