summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/include/data_localgame.h3
-rw-r--r--src/netlem.c229
-rw-r--r--src/netlem_state_machine.c3
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());