summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien Appert <dappert>2010-11-06 16:12:47 +0000
committerDamien Appert <dappert>2010-11-06 16:12:47 +0000
commitcc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1 (patch)
treeb3a91499d5b181fd717f703726351e234971ea6c
parent6def15e34244c5b889f70724f0219afd16dbd6d4 (diff)
download2010-netlemmings-cc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1.tar.gz
2010-netlemmings-cc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1.tar.bz2
2010-netlemmings-cc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1.zip
Début d'intégration du chargement de la map dans le client. Amélioration de la machine à états, ajout de '-g' dans les paramètres de CMake
git-svn-id: file:///var/svn/2010-netlemmings/trunk@138 077b3477-7977-48bd-8428-443f22f7bfda
-rwxr-xr-xdoc/dependances-ubuntu.sh2
-rw-r--r--sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c1
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/netlem.c183
-rw-r--r--src/netlem.h.in34
5 files changed, 159 insertions, 63 deletions
diff --git a/doc/dependances-ubuntu.sh b/doc/dependances-ubuntu.sh
index 17f6801..385d854 100755
--- a/doc/dependances-ubuntu.sh
+++ b/doc/dependances-ubuntu.sh
@@ -1,2 +1,2 @@
#!/bin/sh
-aptitude install libsdl1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsdl-net1.2-dev libsdl-gfx1.2-dev
+aptitude install libsdl1.2-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsdl-net1.2-dev libsdl-gfx1.2-dev bison flex cmake
diff --git a/sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c b/sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c
index 8d29498..26e1699 100644
--- a/sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c
+++ b/sdl-test/SDL_tuto/TestParserLemmingsLVL/fonctions_non_integrees.c
@@ -3161,6 +3161,7 @@ int lancement (){
//La structure d'evenement
SDL_Event event;
event.type=0;
+ //event.key.keysym.sym=0;
//paint_stencil=1;
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index a1741f8..52cff76 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -26,7 +26,7 @@ configure_file (
# add the binary tree to the search path for include files
# so that we will find netlem.h and netlem_ds.h
include_directories("${INCLUDE_DIRECTORIES}" "${PROJECT_BINARY_DIR}")
-add_definitions(-Wall -Wextra -pedantic -Werror -std=c99)
+add_definitions(-Wall -Wextra -pedantic -Werror -std=c99 -g)
add_executable(netlem WIN32 netlem.c ${SRC_COMMON})
target_link_libraries(netlem SDL SDL_net)
diff --git a/src/netlem.c b/src/netlem.c
index 39b7913..beba79c 100644
--- a/src/netlem.c
+++ b/src/netlem.c
@@ -15,39 +15,30 @@
//TODO : Trucs brouillons à déplacer à terme
typedef struct {
- SDL_Rect screen;
-
-} gameConfig_t;
-
-typedef struct {
- SDL_Surface *screen, *pTerrain, *pSpr_Lem, *pStencil, *pStencilFixe;
-
-} gameGraphics_t;
-
-typedef enum {
- e_null, // Pseudo_state for getOrChangeState : do not change state, just return current state
- e_launching, // Initial state, during system objects initialization
- e_splash, // State for displaying Game Logo
- e_menu_main, // State for main menu (next lines are sub-menus)
- e_menu_options, // State for general options (screen resolution, music...)
- e_menu_single, // State for single player options (level selection...)
- e_menu_network_server, // State for network game server selection
- e_menu_network_options, // State for network game options selection (level, players, speed...)
- e_single_brief, // State for single player level briefing (number of Lemmings to save...)
- e_single_game, // State for single player game (user is actually playing)
- e_single_report, // State for single player game report (number of saved Lemmings, access code...)
- e_multi_wait_start, // State for multi player level briefing and network synchronization
- e_multi_game, //
- e_multi_report, //
- e_credits, //
- e_end // State reached when this program is exiting
-} state_t;
+ int todo;
+} gameInit_t;
// Fin trucs brouillon
-struct _networkReadProc_args { client_t *client; int *tick; int *drift_ms; SDL_sem *semGameStart; };
+// Thread arguments structures
+struct _networkReadProc_args {
+ client_t *client;
+ Uint32 *tick;
+ int *drift_ms;
+};
+
+struct _loadLevelProc_args {
+ serverParams_t *serverParams;
+ gameInit_t *gInit;
+ Uint8 *loadProgress;
+};
+
+// Material for thread synchronization and collaboration
+SDL_sem *semGameStart;
+SDL_sem *semLoadLevel;
// Thread entry points
int networkReadProc(void *a);
+int loadLevelProc(void *a);
// Client-specific functions
void signals(int signum);
@@ -61,16 +52,20 @@ int updateGraphics();
int main(int argc, char **argv) {
- int drift_ms=0, tick=0, timeBefore_ms, delay_ms, result;
+ int drift_ms=0,result;
+ Uint32 tick=0, timeBefore_ms, delay_ms;
+ Uint8 loadProgress=0;
client_t client;
+ serverParams_t serverParams;
gameConfig_t conf;
+ gameInit_t gInit;
gameGraphics_t graph;
- struct _networkReadProc_args args;
char logMsg[128];
+ struct _networkReadProc_args args;
+ struct _loadLevelProc_args args2;
- SDL_sem *semGameStart;
IPaddress ip;
if(argc!=2) {
@@ -108,49 +103,67 @@ int main(int argc, char **argv) {
// Synchronization tools intialization
semGameStart=SDL_CreateSemaphore(0);
+ semLoadLevel=SDL_CreateSemaphore(0);
// Network reader thread to process remote events and time sync
args.client=&client;
args.tick=&tick;
args.drift_ms=&drift_ms;
- args.semGameStart=semGameStart;
SDL_Thread *networkReadThread = SDL_CreateThread(networkReadProc, &args);
if(!networkReadThread) {
logs2(LOG_ERROR,"main(), SDL_CreateThread()", SDL_GetError());
return 4;
}
-
- //TODO : faire les menus et ne pas forcer ça ici
- if ( getOrChangeState(e_multi_wait_start, client.sockClient) == e_null ) {
- return 6;
+ // Worker thread for loading levels asynchronously (the thread begin with a SDL_Wait(semLevelLoadingStart))
+ args2.serverParams=&serverParams;
+ args2.gInit=&gInit;
+ args2.loadProgress=&loadProgress;
+ SDL_Thread *loadLevelThread = SDL_CreateThread(loadLevelProc, &args2);
+ if(!loadLevelThread) {
+ logs2(LOG_ERROR,"getOrChangeState(), SDL_CreateThread()", SDL_GetError());
+ return 4; //FIXME : autre num
}
-
- logs(LOG_INFO, "Waiting game start");
- result=SDL_SemWait(semGameStart);
- //FIXME Utiliser un SemWait avec un timeout de moins d'une seconde dans un while pour inclure la gestion des évènements (SQL_QUIT, touches clavier...)
- //Enfait le besoin est plus compliqué : il faut toujours être dans la boucle events/action/refresh, mais les actions dépendent d'une machine à état (menus, attente jeu...)
- if (result!=0) {
- logs2(LOG_ERROR, "main(), SDL_SemWait()", SDL_GetError());
- return 7;
+ //TODO : faire les menus et ne pas forcer ça ici
+ if ( getOrChangeState(eMultiLoading, client.sockClient) == eNull ) {
+ return 6;
}
- logs(LOG_INFO, "Game started !");
// Main game loop
- while(getOrChangeState(e_null,NULL)!=e_end) {
+ while(getOrChangeState(eNull,NULL)!=eEnd) {
timeBefore_ms = SDL_GetTicks();
// Process local player keyboard and mouse events
// (note: remote events are processed by network read thread)
processLocalEvents();
- switch(getOrChangeState(e_null,NULL)) {
- case e_single_game:
- case e_multi_game:
+ switch(getOrChangeState(eNull,NULL)) {
+ case eMultiLoading:
+ printf("DEBUG : loadProgress==%i\n", loadProgress);
+ if(loadProgress==100) {
+ getOrChangeState(eMultiWaitLoading,client.sockClient);
+ }
+ break;
+ case eMultiWaitLoading:
+ result=SDL_SemTryWait(semGameStart);
+ switch (result) {
+ case -1:
+ logs2(LOG_ERROR, "main(), SDL_SemTryWaitTimeout()", SDL_GetError());
+ return 7;
+ break;
+ case 0:
+ getOrChangeState(eMultiGame,NULL);
+ break;
+ default:
+ break;
+ }
+ break;
+ case eSingleGame:
+ case eMultiGame:
// Make game evolve from the current state to the next time chunk (ie. frame, or tick)
play(tick++);
- break;
+ break;
default:
break;
}
@@ -175,23 +188,43 @@ int main(int argc, char **argv) {
state_t getOrChangeState(state_t s, TCPsocket sockClient) {
const event_t evReady = {0,0,0,eReady,0,0,NULL,NULL};
- static state_t state=e_launching;
+ static state_t state=eLaunching;
int result;
switch(s) {
- case e_multi_wait_start:
+ 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 e_null;
-
+ if (result!=0) return eNull;
+
+ state=s;
+ break;
+ case eMultiGame:
+ //TODO : check current state before switching
+ logs(LOG_INFO, "Game started !");
state=s;
- case e_end:
+ break;
+ case eEnd:
state=s;
- case e_null:
+ break;
+
+ case eNull:
break;
default:
- return e_null;
+ return eNull;
}
return state;
@@ -204,7 +237,7 @@ void signals(int signum) {
logs(LOG_WARN, buf);
if(!force) {
- getOrChangeState(e_end,NULL);
+ getOrChangeState(eEnd,NULL);
force=1;
logs(LOG_WARN, "Trying to stop smoothly...");
} else {
@@ -281,12 +314,12 @@ int networkReadProc(void *a) {
struct _networkReadProc_args *args = (struct _networkReadProc_args *)a;
- while( getOrChangeState(e_null,NULL) != e_end ) {
+ while( getOrChangeState(eNull,NULL) != eEnd ) {
// logs(LOG_DEBUG, "Waiting event");
result=receiveEvent(args->client,&e);
if (result != 0) {
logs(LOG_WARN, "networkReadProc(), receiveEvents() error");
- getOrChangeState(e_end,NULL);
+ getOrChangeState(eEnd,NULL);
continue; //TODO : je doute que ça skipe vriament la syncrho du temps :s
}
// logs(LOG_DEBUG, "Got event");
@@ -296,7 +329,7 @@ int networkReadProc(void *a) {
logs(LOG_DEBUG, logMsg);
- result=SDL_SemPost(args->semGameStart);
+ result=SDL_SemPost(semGameStart);
if (result!=0) {
logs2(LOG_ERROR, "main(), SDL_SemPost()", SDL_GetError());
return 1;
@@ -318,6 +351,34 @@ int networkReadProc(void *a) {
return 0;
}
+int loadLevelProc(void *a) {
+ int result,i;
+ //char logMsg[128];
+
+ struct _loadLevelProc_args *args = (struct _loadLevelProc_args *)a;
+
+ logs(LOG_WARN, "loadLevelProc(), beginnng");
+ while( getOrChangeState(eNull,NULL) != eEnd ) {
+ result=SDL_SemWait(semLoadLevel);
+ if (result!=0) {
+ logs2(LOG_ERROR, "main(), SDL_SemTryWaitTimeout()", SDL_GetError());
+
+ }
+
+ 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");
+
+ }
+ logs(LOG_WARN, "loadLevelProc(), end thread");
+
+ return 0;
+}
+
void processLocalEvents() {
/*TODO : intégration des variables manipulées dans des structs qui vont bien
while( SDL_PollEvent( &event ) ) {
diff --git a/src/netlem.h.in b/src/netlem.h.in
index d7729aa..512746e 100644
--- a/src/netlem.h.in
+++ b/src/netlem.h.in
@@ -8,5 +8,39 @@
#define SCREEN_BPP 24
#define WIN_CAPTION "NetLemmings v@NetLemmings_VERSION_MAJOR@.@NetLemmings_VERSION_MINOR@"
+typedef enum {
+ eNull, // Pseudo_state for getOrChangeState : do not change state, just return current state
+ eLaunching, // Initial state, during system objects initialization
+ eSplash, // State for displaying Game Logo
+ eMenuMain, // State for main menu (next lines are sub-menus)
+ eMenuOptions, // State for general options (screen resolution, music...)
+ eMenuSingle, // State for single player options (level selection...)
+ eMenuMultiChooseServer, // State for network game server selection
+ eMenuMultiChooseOptions, // State for network game options selection (level, players, speed...)
+ eMultiWaitPlayers, // State for
+ eMultiLoading, //
+ eMultiWaitLoading, //
+ eMultiGame, //
+ eMultiReport, //
+ eSingleBrief, // State for single player level briefing (number of Lemmings to save...)
+ eSingleGame, // State for single player game (user is actually playing)
+ eSingleReport, // State for single player game report (number of saved Lemmings, access code...)
+ eCredits, //
+ eEnd // State reached when this program is exiting
+} state_t;
+
+typedef struct {
+ SDL_Rect screen;
+
+} gameConfig_t;
+
+typedef struct {
+ SDL_Surface *screen, *pTerrain, *pSpr_Lem, *pStencil, *pStencilFixe;
+
+} gameGraphics_t;
+
+typedef struct {
+ id_t level;
+} serverParams_t;
#endif /*NETLEM_H*/