summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2010-12-05 11:59:36 +0000
committerLudovic Pouzenc <ludovic@pouzenc.fr>2010-12-05 11:59:36 +0000
commit87047cefd3d77351382690a264c43186d7e081ed (patch)
treea790fd68b39d52cd94242a5fa894a6de4b02a60c
parentee60d05a1f3ebda199ed1517915bf017c78f0e31 (diff)
download2010-netlemmings-87047cefd3d77351382690a264c43186d7e081ed.tar.gz
2010-netlemmings-87047cefd3d77351382690a264c43186d7e081ed.tar.bz2
2010-netlemmings-87047cefd3d77351382690a264c43186d7e081ed.zip
Fin d'intégration du chargement niveau dans le netlem.c. Il reste en dur le nom du niveau (cat le chargement des levelpacks n'est pas encore intégré. Implémentation du début de updateGraphics et de processLocalEvents. C'est pas encre ça, mais bon on a un début de fond de niveau qui s'affiche ^^
git-svn-id: file:///var/svn/2010-netlemmings/trunk@184 077b3477-7977-48bd-8428-443f22f7bfda
-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());