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