diff options
author | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2010-11-21 22:13:17 +0000 |
---|---|---|
committer | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2010-11-21 22:13:17 +0000 |
commit | 0ee8598e757d1bfc41bc537c5ea24a59967fb207 (patch) | |
tree | fdd6a42cd81031acf585365a2975821d347dfa8b /src | |
parent | 0ff965a42f0ad7ab72829b9941bef0b8c20aea45 (diff) | |
download | 2010-netlemmings-0ee8598e757d1bfc41bc537c5ea24a59967fb207.tar.gz 2010-netlemmings-0ee8598e757d1bfc41bc537c5ea24a59967fb207.tar.bz2 2010-netlemmings-0ee8598e757d1bfc41bc537c5ea24a59967fb207.zip |
CMakeLists par dossier puis beaucoup de retouches pour que ça compile à nouveau. Début de formalisation des tests fonctionnels.
git-svn-id: file:///var/svn/2010-netlemmings/trunk@165 077b3477-7977-48bd-8428-443f22f7bfda
Diffstat (limited to 'src')
27 files changed, 222 insertions, 550 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dd99fcf..5547dbf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,37 +1,28 @@ -cmake_minimum_required (VERSION 2.6) -project (NetLemmings C) -# The version number. -set (NetLemmings_VERSION_MAJOR 0) -set (NetLemmings_VERSION_MINOR 1) +set(SRC_COMMON events.c netgame.c timing.c utils.c) -set(SRC_COMMON events.c game.c utils.c) -set(INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/include/") - -# Check if all necessary libs are here -find_package(SDL REQUIRED) -find_package(SDL_net REQUIRED) +# Include the directory itself as a path to include directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) +#set(INCLUDE_DIRECTORIES "${PROJECT_SOURCE_DIR}/include") +set(INCLUDE_DIRECTORIES include) +# 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}") # configure a header file to pass some of the CMake settings # to the source code configure_file ( - "${PROJECT_SOURCE_DIR}/netlem.h.in" + "netlem.h.in" "${PROJECT_BINARY_DIR}/netlem.h" ) configure_file ( - "${PROJECT_SOURCE_DIR}/netlem_ds.h.in" + "netlem_ds.h.in" "${PROJECT_BINARY_DIR}/netlem_ds.h" ) -# 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 -D_POSIX_SOURCE -g) - -add_executable(netlem WIN32 netlem.c ${SRC_COMMON} parser/lex.yy.c parser/y.tab.c ) +add_executable(netlem WIN32 netlem.c ${SRC_COMMON} game.c loader.c parser/lex.yy.c parser/y.tab.c ) target_link_libraries(netlem SDL SDL_net) -add_executable(netlem_ds WIN32 netlem_ds.c ${SRC_COMMON}) +add_executable(netlem_ds WIN32 netlem_ds.c ${SRC_COMMON} ) target_link_libraries(netlem_ds SDL SDL_net) - @@ -1,17 +1,10 @@ +#include <stdio.h> +#include "SDL/SDL_timer.h" + #include "game.h" #include "utils.h" -inline tick_t getGameCurrentTick(Uint32 startTime_ms) { -/* char buf[128]; - sprintf(buf, "SDL_GetTicks()==%i, startTime_ms==%i, TICK_DURATION_MS==%i", SDL_GetTicks(), startTime_ms, TICK_DURATION_MS); - logs(LOG_DEBUG, buf);*/ - tick_t t = SDL_GetTicks()-startTime_ms; //FIXME Débodements possibles ?!? - return t/TICK_DURATION_MS; -} - - - -void play(int tick) { +void play(tick_t tick) { if (tick%100==0) { printf("tick==%i\n",tick); } //TODO : boucle de jeu principale ici (maj état de jeu) diff --git a/src/include/data_ini.h b/src/include/data_ini.h index 0efce09..ff1605c 100644 --- a/src/include/data_ini.h +++ b/src/include/data_ini.h @@ -1,6 +1,9 @@ #ifndef DATA_INI_H #define DATA_INI_H +#define LEVEL_WIDTH 1664*2 +#define LEVEL_HEIGHT 160*2 + struct styleObjects { int frames, anim, type, sound; }; diff --git a/src/include/data_network.h b/src/include/data_network.h index c12e9d2..dfc93a0 100644 --- a/src/include/data_network.h +++ b/src/include/data_network.h @@ -9,6 +9,15 @@ #define DEFAULT_LISTEN_PORT 9999 +enum gameState { gameNew, gameRunning, gameEnded }; + +typedef struct { + enum gameState state; + int startTime_ms; + int clientCount; + struct _client_t **clients; // FIXME: il y a toujours la boucle ? +} game_t; + enum clientState { clientNew, clientReady }; typedef struct _client_t { @@ -19,7 +28,7 @@ typedef struct _client_t { SDL_sem *semEventAvailable; SDL_sem *semGameStart; int lastEventSendTime_ms; - //game_t *game; + game_t *game; stateLem_t *lems; } client_t; diff --git a/src/include/data_ress.h b/src/include/data_ress.h index 7b5e599..0018500 100644 --- a/src/include/data_ress.h +++ b/src/include/data_ress.h @@ -1,6 +1,8 @@ #ifndef DATA_RESS_H #define DATA_RESS_H +#include "SDL/SDL.h" + struct styleRess { SDL_Surface **tiles, **objects, **objectMasks; }; diff --git a/src/include/game.h b/src/include/game.h index bcd902f..79d16c4 100644 --- a/src/include/game.h +++ b/src/include/game.h @@ -1,26 +1,8 @@ #ifndef GAME_H #define GAME_H -#define TICK_DURATION_MS 30 - -#define LEVEL_WIDTH 1664*2 -#define LEVEL_HEIGHT 160*2 - -#include "SDL/SDL.h" - #include "data_types.h" -enum gameState { gameNew, gameRunning, gameEnded }; - -typedef struct { - enum gameState state; - int startTime_ms; - int clientCount; - struct _client_t **clients; // FIXME: il y a toujours la boucle ? -} game_t; - -tick_t getGameCurrentTick(Uint32 startTime_ms); - -void play(int tick); +void play(tick_t tick); #endif //GAME_H diff --git a/src/include/netgame.h b/src/include/netgame.h index d9f606b..452c7b9 100644 --- a/src/include/netgame.h +++ b/src/include/netgame.h @@ -1,6 +1,7 @@ #ifndef NETGAME_H #define NETGAME_H +#include "data_types.h" #include "data_network.h" #include "events.h" diff --git a/src/include/timing.h b/src/include/timing.h new file mode 100644 index 0000000..31aea11 --- /dev/null +++ b/src/include/timing.h @@ -0,0 +1,12 @@ +#ifndef TIME_H +#define TIME_H + +#include "SDL/SDL.h" +#include "data_types.h" + +#define TICK_DURATION_MS 30 + +tick_t getGameCurrentTick(Uint32 startTime_ms); +void waitForNextTick(Uint32 timeBefore_ms, Uint32 drift_ms); + +#endif /*TIME_H*/ diff --git a/src/loader.c b/src/loader.c index e744a9e..8c0154e 100644 --- a/src/loader.c +++ b/src/loader.c @@ -1,3 +1,4 @@ +#include "SDL/SDL_stdinc.h" #include "loader.h" #include "utils.h" @@ -6,7 +7,7 @@ int loadRessources(gameIni_t *gIni, gameRess_t *gRess) { int i; - char *filepath, *kind; + char *filepath; filepath = malloc(sizeof(char)*(strlen(PATH_STYLE)+strlen(gIni->style.name)+strlen("/om_00.gif")+1)); @@ -14,7 +15,7 @@ int loadRessources(gameIni_t *gIni, gameRess_t *gRess) { //(if null...) for(i=0; i < gIni->style.tiles ; ++i) { sprintf(filepath, "%s/%s_%d.gif", PATH_STYLE, gIni->style.name, i); - gRess->style.tiles[i] = load_image(filepath,ccc_keyGif); +//TODO gRess->style.tiles[i] = load_image(filepath,ccc_keyGif); } gRess->style.objects=malloc(sizeof(SDL_Surface *)*gIni->style.objectCount); @@ -23,9 +24,10 @@ int loadRessources(gameIni_t *gIni, gameRess_t *gRess) { //(if null...) for(i=0; i < gIni->style.objectCount ; ++i) { sprintf(filepath, "%s/%so_%d.gif", PATH_STYLE, gIni->style.name, i); - gRess->style.objects[i] = load_image(filepath,ccc_keyGif); +//TODO gRess->style.objects[i] = load_image(filepath,ccc_keyGif); sprintf(filepath, "%s/%som_%d.gif", PATH_STYLE, gIni->style.name, i); - gRess->style.objectMasks[i] = load_image(filepath,ccc_keyGif); +//TODO gRess->style.objectMasks[i] = load_image(filepath,ccc_keyGif); } + return 0; } diff --git a/src/netgame.c b/src/netgame.c index ac64546..ab174be 100644 --- a/src/netgame.c +++ b/src/netgame.c @@ -1,5 +1,4 @@ #include "netgame.h" - #include "utils.h" int initNetGame(netGame_t *ng, id_t lemCount) { @@ -78,3 +77,4 @@ int receiveEvent(client_t *c, event_t *e) { free(buf); return 0; } + diff --git a/src/netlem.c b/src/netlem.c index 9985b54..e75336b 100644 --- a/src/netlem.c +++ b/src/netlem.c @@ -1,3 +1,4 @@ +#include <signal.h> #include "SDL/SDL.h" #include "SDL/SDL_net.h" @@ -11,6 +12,7 @@ #include "game.h" //#include "events.h" #include "loader.h" +#include "timing.h" // Application version number #include "netlem.h" @@ -49,7 +51,7 @@ int updateGraphics(); int main(int argc, char **argv) { int drift_ms=0,result; - Uint32 tick=0, timeBefore_ms, delay_ms; + Uint32 tick=0, timeBefore_ms; Uint8 loadProgress=0; client_t client; @@ -169,8 +171,7 @@ int main(int argc, char **argv) { updateGraphics(); // Delay that we have to wait for the next frame (depends on execution time and network time drift) - delay_ms=TICK_DURATION_MS-(SDL_GetTicks()-timeBefore_ms)+drift_ms; - if (delay_ms>0) SDL_Delay(delay_ms); //TODO Si le client rame trop, faut décrocher la partie + waitForNextTick(timeBefore_ms, drift_ms); } // Close communcation with the server, stop threads, close logs and go out diff --git a/src/netlem_ds.c b/src/netlem_ds.c index fc4123c..46a3dfb 100644 --- a/src/netlem_ds.c +++ b/src/netlem_ds.c @@ -1,9 +1,13 @@ +#include <signal.h> + #include "SDL/SDL.h" #include "SDL/SDL_net.h" #include "SDL/SDL_thread.h" +#include "game.h" #include "netgame.h" #include "utils.h" +#include "timing.h" // Application version number and some constants #include "netlem_ds.h" diff --git a/src/parser/.svnignore b/src/parser/.svnignore new file mode 100644 index 0000000..ab1e9e5 --- /dev/null +++ b/src/parser/.svnignore @@ -0,0 +1,4 @@ +y.output +lex.yy.c +y.tab.h +y.tab.c diff --git a/src/parser/ginit.h b/src/parser/ginit.h deleted file mode 100644 index 77a6989..0000000 --- a/src/parser/ginit.h +++ /dev/null @@ -1,325 +0,0 @@ -#ifndef GINIT_H -#define GINIT_H - -#include "SDL/SDL.h" - -#define LEVEL_WIDTH (1664*2) -#define LEVEL_HEIGHT (160*2) - -struct styleObjects { - int frames, anim, type, sound; -}; - -struct style { - char *name; - uint32_t bgColor, debrisColor; - int tiles, particleColorCount, objectCount; - uint32_t *particleColor; - struct styleObjects *objects; -}; - -struct skills { - int releaseRate, numLemmings, numToRescue, timeLimit; - int numClimbers, numFloaters, numBlockers, numBombers, numBuilders, numBashers, numMiners, numDiggers; -}; - -// Item should be an object, terrain or steel -struct levelItem { - int id, xpos, ypos; // Common to all types - int paintMode, ud; // Specific to objects - int modifier; // Specific to terrain - int width, height; // Specific to steels -}; - -struct level { - struct skills initSkills; - int xPos; - char *style, *name; - int superLemming; - int objectCount, terrainCount, steelCount; - struct levelItem *objects, *terrains, *steels; -}; - -struct levelPack { - int maxFallDistance; - char *codeSeed; -}; - -struct gameInit { - struct style style; - struct level level; - struct levelPack levelPack; - int firstPass; -}; -/* - struct colorMap { - Uint32 bgColor;// background color present in "style".ini - Uint32 debrisColor;// debris color present in "style".ini - Uint32* particleColor; //particle color present in "style".ini - }; - - struct spriteObjet { - // ID == Objet.ID - int state; // number of state in terraino_XX.gif; - - // animation types - // 0 - don't animate - // 1 - animate continously - // 2 - trap - animate on trigger - else show first pic - // 3 - entry animation: animate once at level start - int anim; - - // object types - // 0 - passive - // 3 - no digging to the left - // 4 - no digging to the right - // 5 - trap which makes lemmings drown (water/quick sand/mud) - // 6 - trap which replaces lemming with death animation - // 7 - trap which triggers lemming death animation - // 8 - exit - // 32 - entry - int type; - - int sound; // numero of sound - }; - - struct mapStyle { - char *style; // map' style - int superLemming; // off = 0; on = 1; - int tiles; // number of terrain_XX.gif present in "style".ini - int tilesObjet; //number of terraino_XX.gif - int tilesSteel; // number of terrainom_XX.gif - - struct colorMap cmap; // level's info's color - - struct spriteObjet* tabDataSprO; // sprite'data ; default=NULL; - SDL_Surface **tabGif; // all gif are stored in; default=NULL; - }; - // FIN: MAP_STRUCTURE - - // DEBUT: LEMMINGS_STRUCTURE - // LEM_JOB == lemm_XX.gif - - -#define MAX_LEM_FALL 3 -#define MAX_LEM_FALL_FLOATER 2 -#define FALLER_MAX 126 -#define FLOATER_TO_FALLER 32 -#define MAX_LEM_FLOATER 2 - - // a jumper moves up two pixels per frame -#define MAX_JUMPER_STEP 2 - // if a walker jumps up 6 pixels, it becomes a jumper -#define MAX_JUMPER_JUMP 4 -#define MAX_BUILD_BRICK 9 -#define MAX_BUILD_END 3 - -#define WALKER_OBSTACLE_HEIGHT 14 -#define FALLER_STEP 3 -#define FLOATER_STEP 2 -#define FALL_DISTANCE_FALL 8 -#define FALL_DISTANCE_FORCE_FALL 2 * FALL_DISTANCE_FALL -#define FALL_DISTANCE_FLOAT 32 -#define JUMPER_STEP 2 -#define WALKER_STEP 1 -#define CLIMBER_STEP 1 -#define BASHER_FALL_DISTANCE 6 -#define STEPS_WARNING 9 -#define STEPS_MAX 12 - -#define LEM_JOB 17 - //0: walker - //1: faller - //2: climber - //3: climber_to_walker - //4: floater - //5: splat - //6: stopper - //7: drowning - //8: trap_death - //9: exIt - //10: bomber - //11: builder - //12: builder_end - //13: digger - //14: basher - //15: miner - //16: jumper -#define OTHER_LEM_JOB 6 - //17: died - //18: enter - //19: safe - //20: nuke - //21: bomber_stopper - //22: floater_start -#define TOTAL_LEM_JOB LEM_JOB + OTHER_LEM_JOB - - - enum eLemmingJob { - walker , faller , climber , climber_to_walker , floater , - splat , stopper , drowning , trap_death , exIt , bomber, - builder , builder_end , digger , basher , miner , jumper , - died , enter , safe , nuke , bomber_stopper , floater_start - }; - - char tabString_eLemmingJob[TOTAL_LEM_JOB][20] = { - "walker" , "faller" , "climber" , "climber_to_walker" , "floater" , - "splat" , "stopper" , "drowning" , "trap_death" , "exIt" , "bomber", - "builder" , "builder_end , digger" , "basher" , "miner" , "jumper", - "died" , "enter" , "safe" , "nuke", "bomber_stopper", "floater_start" - }; - - struct lemmingMask { - // ID == lemming.ID; - int stateM; // number of state in mask_XX.gif; - int dirM; // number of direction - int cooldown; // after <cooldown> animations of lemming animation, do mask action and increase mask frame idx - }; - - struct lemmingImask { - // ID == lemming.ID; - int stateI; // number of state in imask_XX.gif; - int dirI; // number of direction - }; - - struct lemmingJobAndSprite { - // ID == lemming.ID; - int state; // number of state in lemm_XX.gif; - int dir; // direction of lemming: 0=left(do FlipLR); 1=right; default=1; - int anim; // animation type: 0=loop, 1=once (state change if finished); - - // foot: director 's foot for collision 's test - // calcul the X' symetry if lemming.dir==0(left) - int footX; // position X of right's lemming's foot; - int footY; // position Y of right's lemming's foot; - int footSize; // size of lemming's foot; - - // mask for screen ... - struct lemmingMask* mask; // mask of this job; default=NULL; - struct lemmingImask* imask; // imask of this job; default=NULL; - }; - // FIN: LEMMINGS_STRUCTURE - - // DEBUT: INFOMAP -#define IDENT_COUNT 12 - - enum eParaMap { - releaseRate,numLemmings,numToRescue,timeLimit, - numClimbers,numFloaters,numBombers,numBlockers,numBuilders, - numBashers,numMiners,numDiggers - }; - - char tabString_eParaMap[IDENT_COUNT][32] = { - "releaseRate","numLemmings","numToRescue","timeLimit", - "numClimbers","numFloaters","numBombers","numBlockers", - "numBuilders","numBashers","numMiners","numDiggers" - }; - - struct skills { - int releaseRate,numLemmings,numToRescue,timeLimit; - int numClimbers,numFloaters,numBombers,numBlockers,numBuilders,numBashers,numMiners,numDiggers; - }; - - struct infoMap { - char* name; // map name; default=NULL; - int xPos; // camera started position - int maxFallDistance; // max pixel lemming fall before died;default=0; -// int nuke; // hiroshima= 1; default =0; - int nbrEntry; // number of entry in this map; default=0; - struct mapStyle map; // map - struct lemmingJobAndSprite *lemmingDATA; // DATA of lemmingJob; default=NULL; - struct skills initSkills; - }; - // FIN: INFOMAP - - // DEBUT: GAMEINIT - struct paraTerrain { - int modif; //modifier: 8=NO_OVERWRITE, 4=UPSIDE_DOWN, 2=REMOVE (combining allowed, 0=FULL); - }; - - struct paraObjet { - int UD; // upside down (0,1); - int paintMode;// paint modes: 8=VIS_ON_TERRAIN, 4=NO_OVERWRITE, 0=FULL (only one value possible) - int cptState; // count number of frame for an animation at once, default=0; - }; - - struct paraSteel { - int w;// weight - int h;// height - }; - - struct paraLemming { - int dir; // direction of lemming; default=1; - int climber; // skill climber; default = 0; - int blocker; // skill blocker; default = 0; - int bomber; // skill bomber; default = -1; - int floater; // skill floater; default = 0; - int nuke; // nuked or not; default=0; - int cptFall; // count number of pixel when lemming falling;default = 0; - int cptFall2;// count number of pixel when lemming falling;default = 0; - int cptJump; // count number of pixel when lemming jumping;default = 0; - int cptBrick; // count number of brick ;default = 0; - int cptBoom; // count number of boom ;default = -1; - int cptState; // count number of frame for an animation at once, default=0; - }; - - struct listeSimplementChainee { - int ID; // ID for tabGif; - int x; // x position; - int y; // y position; - - union listeDataType { - struct paraTerrain *pt; // other para about terrain; default=NULL; - struct paraObjet *po; // other para about objet; default=NULL; - struct paraSteel *ps; // other para about steel; default=NULL; - struct paraLemming *pl; // other para about lemming; default=NULL; - } data; - - struct listeSimplementChainee *next;// default=NULL; - }; - - struct terrain { - int nbr; // number of terrain on this map; default=0; - struct listeSimplementChainee *lt; // list of terrain; default=NULL; - }; - - struct objet { - int nbr; // number of objet on this map; default=0; - struct listeSimplementChainee *lo; // list of objet; default=NULL; - }; - - struct steel { - int nbr; // number of steel on this map; default=0; - struct listeSimplementChainee *ls; // list of steel; default=NULL; - }; - - struct lemming { - int nbrInput; // number of lemming will be create; default=0; - int nbr; // number of lemming on this map; default=0; - int nbrDied; // number of lemming Died on this map; default=0; - int nbrSafe; // number of lemming Saved on this map; default=0; - struct listeSimplementChainee *ll; // list of lemming; default=NULL; - }; - - // game use some cpt -#define NBR_CPT 20 - - struct gameInit { - struct infoMap mapI; // all DATA of the map; - struct terrain t; // all DATA of terrain on this map; - struct objet o; // all DATA of objet on this map; - struct steel s; // all DATA of steel on this map; - struct lemming l; // all DATA of lemming on this map; - int parseError; - - // 0-13 : BUTTON_LEMMING state button 0: off; 1: on; - // 14 : CURSOR STATE - // 15 : FREE CPT: for all need it ...; default=0; - // 16 : NBR_ENTRY OPEN; default=0; - // 17 : clic on mouse on lemning skill; default=-1; - // 18 : clic on mouse on lemning;default=0; -// int cptGame[NBR_CPT]; // default=0; - }; - -*/ -#endif /*GINIT_H*/ diff --git a/src/parser/parse_ini.yy b/src/parser/parse_ini.yy index ad32d4f..9b82368 100644 --- a/src/parser/parse_ini.yy +++ b/src/parser/parse_ini.yy @@ -4,7 +4,7 @@ #include <strings.h> #include <stdint.h> -#include "ginit.h" +#include "data_ini.h" #define OUT_OF_BOUNDS "out of bounds" #define CANNOT_BE_NEGATIVE "cannot be negative" @@ -23,9 +23,9 @@ extern FILE *yyin; extern int yylineno; extern char *yytext; -extern int yyparse(struct gameInit *gInit); +extern int yyparse(gameIni_t *gIni); -void yyerror(struct gameInit *gInit, char *s); +void yyerror(gameIni_t *gIni, char *s); void yyassert(int condition, char what[], char why[]); int yylex(); @@ -35,22 +35,22 @@ void callocIfNull(void **ptr, size_t nmemb, size_t size) { } } -void parse(struct gameInit *gInit) { - gInit->firstPass=1; - yyparse(gInit); +void parse(gameIni_t *gIni) { + gIni->firstPass=1; + yyparse(gIni); - callocIfNull(&gInit->style.objects, gInit->style.objectCount, sizeof(struct styleObjects)); - callocIfNull(&gInit->level.objects, gInit->level.objectCount, sizeof(struct levelItem)); - callocIfNull(&gInit->level.terrains, gInit->level.terrainCount, sizeof(struct levelItem)); - callocIfNull(&gInit->level.steels, gInit->level.steelCount, sizeof(struct levelItem)); + callocIfNull((void **)&gIni->style.objects, gIni->style.objectCount, sizeof(struct styleObjects)); + callocIfNull((void **)&gIni->level.objects, gIni->level.objectCount, sizeof(struct levelItem)); + callocIfNull((void **)&gIni->level.terrains, gIni->level.terrainCount, sizeof(struct levelItem)); + callocIfNull((void **)&gIni->level.steels, gIni->level.steelCount, sizeof(struct levelItem)); rewind(yyin); - gInit->firstPass=0; - yyparse(gInit); + gIni->firstPass=0; + yyparse(gIni); } %} -%parse-param { struct gameInit *gInit } +%parse-param { gameIni_t *gIni } %union {char* str; int num; uint32_t uint32; uint32_t *p_uint32;} @@ -80,165 +80,165 @@ ini: /*epsilon*/ | EOL ini /* styles/...ini */ -decl: BGCOLOR AFF INTHEX { gInit->style.bgColor = $3; } -| DEBRISCOLOR AFF INTHEX { gInit->style.debrisColor = $3; } +decl: BGCOLOR AFF INTHEX { gIni->style.bgColor = $3; } +| DEBRISCOLOR AFF INTHEX { gIni->style.debrisColor = $3; } | PARTICLECOLOR AFF particles { - gInit->style.particleColorCount=16; - gInit->style.particleColor = $3; + gIni->style.particleColorCount=16; + gIni->style.particleColor = $3; } | TILES AFF INT { yyassert($3>0 && $3<100,"tiles", OUT_OF_BOUNDS); - gInit->style.tiles = $3; + gIni->style.tiles = $3; //TODO check coherence par rapport aux fichiers trouvés } | FRAMES INT AFF INT { - if ( gInit->firstPass==1 ) { + if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "frame_ index", OUT_OF_BOUNDS); yyassert($4>0 && $4<MAX_OBJECT_FRAMES, "frame_ value", OUT_OF_BOUNDS); - gInit->style.objectCount++; + gIni->style.objectCount++; } else { - yyassert($2<gInit->style.objectCount, "frame_ index", OUT_OF_BOUNDS); - gInit->style.objects[$2].frames = $4; + yyassert($2<gIni->style.objectCount, "frame_ index", OUT_OF_BOUNDS); + gIni->style.objects[$2].frames = $4; } } | ANIM INT AFF INT { - if ( gInit->firstPass==1 ) { + if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "anim_ index", OUT_OF_BOUNDS); yyassert($4>=0 && $4<=3, "anim_ value", BAD_VALUE); } else { - yyassert($2<gInit->style.objectCount, "anim_ index", OUT_OF_BOUNDS); - gInit->style.objects[$2].anim = $4; + yyassert($2<gIni->style.objectCount, "anim_ index", OUT_OF_BOUNDS); + gIni->style.objects[$2].anim = $4; } } | TYPE INT AFF INT { - if ( gInit->firstPass==1 ) { + if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "type_ index", OUT_OF_BOUNDS); yyassert($4==0 || $4==32 || ($4>=3 && $4<=8), "type_ value", BAD_VALUE); } else { - yyassert($2<gInit->style.objectCount, "type_ index", OUT_OF_BOUNDS); - gInit->style.objects[$2].type = $4; + yyassert($2<gIni->style.objectCount, "type_ index", OUT_OF_BOUNDS); + gIni->style.objects[$2].type = $4; } } | SOUND INT AFF INT { - if ( gInit->firstPass==1 ) { + if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "sound_ index", OUT_OF_BOUNDS); yyassert($4>=-1 && $4<=MAX_SOUNDS_COUNT, "sound_ value", OUT_OF_BOUNDS); } else { - yyassert($2<gInit->style.objectCount, "sound_ index", OUT_OF_BOUNDS); - gInit->style.objects[$2].sound = $4; + yyassert($2<gIni->style.objectCount, "sound_ index", OUT_OF_BOUNDS); + gIni->style.objects[$2].sound = $4; } } /*lvl_xxxx.ini*/ | RELEASERATE AFF INT { yyassert($3>=0 && $3<=99, "releaseRate", OUT_OF_BOUNDS); - gInit->level.initSkills.releaseRate = $3; + gIni->level.initSkills.releaseRate = $3; } | NUMLEMMINGS AFF INT { yyassert($3>=0 && $3<=MAX_NUMLEMMINGS, "numLemmings", OUT_OF_BOUNDS); - gInit->level.initSkills.numLemmings = $3; } + gIni->level.initSkills.numLemmings = $3; } | NUMTORESCUE AFF INT { yyassert($3>=0 && $3<=99, "numToRescue", OUT_OF_BOUNDS); - gInit->level.initSkills.numToRescue = $3; + gIni->level.initSkills.numToRescue = $3; } | TIMELIMIT AFF INT { yyassert($3>=0 && $3<=99, "timeLimit", OUT_OF_BOUNDS); - gInit->level.initSkills.timeLimit = $3; + gIni->level.initSkills.timeLimit = $3; } | NUMCLIMBERS AFF INT { yyassert($3>=0 && $3<=99, "numClimbers", OUT_OF_BOUNDS); - gInit->level.initSkills.numClimbers = $3; + gIni->level.initSkills.numClimbers = $3; } | NUMFLOATERS AFF INT { yyassert($3>=0 && $3<=99, "numFloaters", OUT_OF_BOUNDS); - gInit->level.initSkills.numFloaters = $3; + gIni->level.initSkills.numFloaters = $3; } | NUMBOMBERS AFF INT { yyassert($3>=0 && $3<=99, "numBombers", OUT_OF_BOUNDS); - gInit->level.initSkills.numBombers = $3; + gIni->level.initSkills.numBombers = $3; } | NUMBLOCKERS AFF INT { yyassert($3>=0 && $3<=99, "numBlockers", OUT_OF_BOUNDS); - gInit->level.initSkills.numBlockers = $3; + gIni->level.initSkills.numBlockers = $3; } | NUMBUILDERS AFF INT { yyassert($3>=0 && $3<=99, "numBuilders", OUT_OF_BOUNDS); - gInit->level.initSkills.numBuilders = $3; + gIni->level.initSkills.numBuilders = $3; } | NUMBASHERS AFF INT { yyassert($3>=0 && $3<=99, "numBashers", OUT_OF_BOUNDS); - gInit->level.initSkills.numBashers = $3; + gIni->level.initSkills.numBashers = $3; } | NUMMINERS AFF INT { yyassert($3>=0 && $3<=99, "numMiners", OUT_OF_BOUNDS); - gInit->level.initSkills.numMiners = $3; + gIni->level.initSkills.numMiners = $3; } | NUMDIGGERS AFF INT { yyassert($3>=0 && $3<=99, "numDiggers", OUT_OF_BOUNDS); - gInit->level.initSkills.numDiggers = $3; + gIni->level.initSkills.numDiggers = $3; } | XPOS AFF INT { yyassert($3>=0 && $3<=LEVEL_WIDTH, "xPos", OUT_OF_BOUNDS); - gInit->level.xPos = $3; + gIni->level.xPos = $3; } -| STYLE AFF STR { gInit->level.style = $3; } -| SLEM AFF STR { gInit->level.superLemming = strcasecmp("true", $3)==0; } +| STYLE AFF STR { gIni->level.style = $3; } +| SLEM AFF STR { gIni->level.superLemming = strcasecmp("true", $3)==0; } | OBJECT INT AFF INT VIR INT VIR INT VIR INT VIR INT { - if ( gInit->firstPass==1 ) { + if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_OBJECTS_COUNT, "object_ index", OUT_OF_BOUNDS); yyassert($4>=0 , "object_ id value", OUT_OF_BOUNDS); yyassert($10==0 || $10==4 || $10==8, "object_ paintMode value", BAD_VALUE); yyassert($12==0 || $12==1, "object_ ud value", BAD_VALUE); - gInit->level.objectCount++; + gIni->level.objectCount++; } else { - yyassert($2<gInit->level.objectCount, "object_ index", OUT_OF_BOUNDS); - gInit->level.objects[$2].id = $4; - gInit->level.objects[$2].xpos = $6; - gInit->level.objects[$2].ypos = $8; - gInit->level.objects[$2].paintMode = $10; - gInit->level.objects[$2].ud = $12; + yyassert($2<gIni->level.objectCount, "object_ index", OUT_OF_BOUNDS); + gIni->level.objects[$2].id = $4; + gIni->level.objects[$2].xpos = $6; + gIni->level.objects[$2].ypos = $8; + gIni->level.objects[$2].paintMode = $10; + gIni->level.objects[$2].ud = $12; } } | TERRAIN INT AFF INT VIR INT VIR INT VIR INT { - if ( gInit->firstPass==1 ) { + if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_TERRAINS_COUNT, "terrain_ index", OUT_OF_BOUNDS); yyassert($4>=0 , "terrain_ id value", OUT_OF_BOUNDS); yyassert($10>=0 && $10<16, "terrain_ modifier value", BAD_VALUE); - gInit->level.terrainCount++; + gIni->level.terrainCount++; } else { - yyassert($2<gInit->level.terrainCount, "terrain_ index", OUT_OF_BOUNDS); - gInit->level.terrains[$2].id = $4; - gInit->level.terrains[$2].xpos = $6; - gInit->level.terrains[$2].ypos = $8; - gInit->level.terrains[$2].modifier = $10; + yyassert($2<gIni->level.terrainCount, "terrain_ index", OUT_OF_BOUNDS); + gIni->level.terrains[$2].id = $4; + gIni->level.terrains[$2].xpos = $6; + gIni->level.terrains[$2].ypos = $8; + gIni->level.terrains[$2].modifier = $10; } } | STEEL INT AFF INT VIR INT VIR INT VIR INT { - if ( gInit->firstPass==1 ) { + if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_STEELS_COUNT, "steel_ index", OUT_OF_BOUNDS); yyassert($4>=0 && $4<LEVEL_WIDTH , "steel_ xpos value", OUT_OF_BOUNDS); yyassert($6>=0 && $6<LEVEL_HEIGHT , "steel_ ypos value", OUT_OF_BOUNDS); yyassert($8>=0 && $8<=STEEL_MAX_WIDTH, "steel_ width value", BAD_VALUE); yyassert($10>=0 && $10<=STEEL_MAX_HEIGHT, "steel_ height value", BAD_VALUE); - gInit->level.steelCount++; + gIni->level.steelCount++; } else { - yyassert($2<gInit->level.steelCount, "steel_ index", OUT_OF_BOUNDS); - gInit->level.steels[$2].xpos = $4; - gInit->level.steels[$2].ypos = $6; - gInit->level.steels[$2].width = $8; - gInit->level.steels[$2].height = $10; + yyassert($2<gIni->level.steelCount, "steel_ index", OUT_OF_BOUNDS); + gIni->level.steels[$2].xpos = $4; + gIni->level.steels[$2].ypos = $6; + gIni->level.steels[$2].width = $8; + gIni->level.steels[$2].height = $10; } } -| NAME AFF STR { gInit->level.name = $3; } /* TODO : attention, si fichier levelpack, name n'est pas le nom d'unniveau */ +| NAME AFF STR { gIni->level.name = $3; } /* TODO : attention, si fichier levelpack, name n'est pas le nom d'unniveau */ /* levelpack.ini */ | MAXFALLDISTANCE AFF INT { yyassert($3>=0, "maxFallDistance", OUT_OF_BOUNDS); - gInit->levelPack.maxFallDistance = $3; + gIni->levelPack.maxFallDistance = $3; } -| CODESEED AFF STR { gInit->levelPack.codeSeed = $3; } +| CODESEED AFF STR { gIni->levelPack.codeSeed = $3; } | MUSIC INT AFF STR { } | LEVEL INT AFF STR {} | DIFFICULTY INT AFF STR VIR INT {} @@ -255,9 +255,9 @@ void yyassert(int condition, char what[], char why[]){ yyerror(NULL, msg); } } -void yyerror(struct gameInit *gInit, char *s) { +void yyerror(gameIni_t *gIni, char *s) { fprintf(stderr, "(stdin):%i: error: %s near '%s'\n", yylineno, s, yytext); - gInit=NULL; /* Faire quelque chose de propre ici */ + gIni=NULL; /* Faire quelque chose de propre ici */ exit(1); } diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt new file mode 100644 index 0000000..8133b44 --- /dev/null +++ b/src/test/CMakeLists.txt @@ -0,0 +1,9 @@ + +# Include the directory itself as a path to include directories +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(PARSER_FILES ../parser/lex.yy.c ../parser/y.tab.c) + +add_executable(testfunc_001_lex WIN32 testfunc_001_lex.c ${PARSER_FILES} ) +add_executable(testfunc_002_parse WIN32 testfunc_002_parse.c ${PARSER_FILES} ) +add_executable(testfunc_003_loadress WIN32 testfunc_003_loadress.c ${PARSER_FILES} ) + diff --git a/src/test/Makefile b/src/test/Makefile deleted file mode 100644 index bf08627..0000000 --- a/src/test/Makefile +++ /dev/null @@ -1,13 +0,0 @@ -all: test_lex test_parse test_load - -test_lex: test_lex.c ../parser/lex.yy.c - gcc -Wall --std=c99 -D_POSIX_SOURCE -g -o $@ $^ - -test_parse: test_parse.c ../parser/y.tab.c ../parser/lex.yy.c - gcc -Wall --std=c99 -D_POSIX_SOURCE -g -o $@ $^ - -test_load: test_load.c ../parser/y.tab.c ../parser/lex.yy.c ../loader.c - gcc -Wall --std=c99 -D_POSIX_SOURCE -g -o $@ $^ -clean: - -rm test_lex test_parse test_load - diff --git a/src/test/test.c b/src/test/test.c deleted file mode 100644 index 4f157b1..0000000 --- a/src/test/test.c +++ /dev/null @@ -1,28 +0,0 @@ - -#include <stdio.h> -#include "SDL/SDL.h" - - -Uint32 timeSyncInsertNullEventsIfNeeded(Uint32 interval, void *args) { - static i=0; - printf("%i\n",i++); - return 2000; -} - -int main(void) { - - SDL_TimerID timerTimeSync; - - - SDL_Init(SDL_INIT_TIMER); - printf("before addtimer\n"); - timerTimeSync = SDL_AddTimer(2000, timeSyncInsertNullEventsIfNeeded, NULL); - printf("after addtimer\n"); - - if ( timerTimeSync==NULL ) { - printf("bug addtimer\n"); - } - - SDL_Delay(100000); -} - diff --git a/src/test/test_load.c b/src/test/test_load.c deleted file mode 100644 index 91be214..0000000 --- a/src/test/test_load.c +++ /dev/null @@ -1,50 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include "SDL/SDL.h" -#include "../parser/y.tab.h" -#include "../parser/ginit.h" -#include "../loader.h" - -#define PATH_STYLE "../styles" - -extern FILE *yyin; - -int main(int argc, char **argv) { - char *filepath=NULL; - struct gameInit gInit; - - if (argc<2) { - fprintf(stderr, "Usage %s <level_subfolder/ini_file>\n", argv[0]); - return 1; - } - filepath=argv[1]; - - yyin=fopen(filepath, "r"); - if (yyin == NULL ) { - fprintf(stderr, "main(), Could not open '%s'\n", filepath); - return 2; - } - memset(&gInit,0,sizeof(gInit)); - printf("Parsing '%s'\n", filepath); - parse(&gInit); - fclose(yyin); - - if (gInit.level.style==NULL) { - fprintf(stderr, "No valid style detected\n"); - exit(1); - } - filepath=malloc(sizeof(char)*(strlen(gInit.level.style)*2+strlen(PATH_STYLE)+5)); - sprintf(filepath, "%s/%s/%s.ini", PATH_STYLE, gInit.level.style, gInit.level.style); - - yyin=fopen(filepath, "r"); - if (yyin == NULL ) { - fprintf(stderr, "main(), Could not open '%s'\n", filepath); - return 2; - } - memset(&gInit,0,sizeof(gInit)); - printf("Parsing '%s'\n", filepath); - parse(&gInit); - fclose(yyin); - - return loadRessources(&gInit); -} diff --git a/src/test/test_lex.c b/src/test/testfunc_001_lex.c index d936e7b..d936e7b 100644 --- a/src/test/test_lex.c +++ b/src/test/testfunc_001_lex.c diff --git a/src/test/test_lex.sh b/src/test/testfunc_001_lex.sh index 452f29f..452f29f 100755 --- a/src/test/test_lex.sh +++ b/src/test/testfunc_001_lex.sh diff --git a/src/test/test_parse.c b/src/test/testfunc_002_parse.c index 62c71bd..62c71bd 100644 --- a/src/test/test_parse.c +++ b/src/test/testfunc_002_parse.c diff --git a/src/test/test_parse.sh b/src/test/testfunc_002_parse.sh index 07fa640..07fa640 100755 --- a/src/test/test_parse.sh +++ b/src/test/testfunc_002_parse.sh diff --git a/src/test/testfunc_003_loadress.c b/src/test/testfunc_003_loadress.c new file mode 100644 index 0000000..5edaedc --- /dev/null +++ b/src/test/testfunc_003_loadress.c @@ -0,0 +1,57 @@ +#include <stdio.h> +#include <string.h> +#include "SDL/SDL.h" +#include "../parser/y.tab.h" +#include "../include/loader.h" + +#define PATH_STYLE "../styles" +#define PATH_LEVEL "../level" + +#define MAX_PATH_LEN 255 +extern FILE *yyin; + +void load_ini(gamaeIni_t *gIni, char filepath) { + yyin=fopen(filepath, "r"); + if (yyin == NULL ) { + fprintf(stderr, "main(), Could not open '%s'\n", filepath); + return 2; + } + printf("Parsing '%s'\n", filepath); + parse(&gIni); + fclose(yyin); +} + +int main(int argc, char **argv) { + char filepath[MAX_PATH_LEN]; + gameIni_t gIni; + gameRess_t gRess; + + if (argc != 3) { + fprintf(stderr, "Usage %s <levelpack_name> <level_number>\n", argv[0]); + return 1; + } + + // Setting default values + memset(gIni,0,sizeof(gameIni_t)); + + // Loading levelpack.ini + snprintf(filepath, MAX_PATH_LEN, "%s/%s/levelpack.ini", PATH_LEVEL, argv[1]); + load_ini(&gIni, filepath); + + // Loading lvl ini file + snprintf(filepath, MAX_PATH_LEN, "%s/%s/lvl%04i.ini", PATH_LEVEL, argv[1], atoi(argv[2])); + load_ini(&gIni, filepath); + + // Check if we found a "style =" line in level ini file + if (gIni.level.style==NULL) { + fprintf(stderr, "No valid style detected\n"); + exit(1); + } + + // Loading style ini file + snprintf(filepath, MAX_PATH_LEN, "%s/%s/%2$s.ini", PATH_STYLE, gIni.level.style); + load_ini(&gIni, filepath); + + + return loadRessources(&gIni, &gRess); +} diff --git a/src/test/test_load.sh b/src/test/testfunc_003_loadress.sh index 0b744f9..0b744f9 100755 --- a/src/test/test_load.sh +++ b/src/test/testfunc_003_loadress.sh diff --git a/src/timing.c b/src/timing.c new file mode 100644 index 0000000..01b0aee --- /dev/null +++ b/src/timing.c @@ -0,0 +1,15 @@ +#include "timing.h" + +inline tick_t getGameCurrentTick(Uint32 startTime_ms) { +/* char buf[128]; + sprintf(buf, "SDL_GetTicks()==%i, startTime_ms==%i, TICK_DURATION_MS==%i", SDL_GetTicks(), startTime_ms, TICK_DURATION_MS); + logs(LOG_DEBUG, buf);*/ + tick_t t = SDL_GetTicks()-startTime_ms; //FIXME Débordements possibles ?!? + return t/TICK_DURATION_MS; +} + +inline void waitForNextTick(Uint32 timeBefore_ms, Uint32 drift_ms) { + int delay_ms; + delay_ms=TICK_DURATION_MS-(SDL_GetTicks()-timeBefore_ms)+drift_ms; + if (delay_ms>0) SDL_Delay(delay_ms); //TODO Si le client rame trop, faut décrocher la partie +} diff --git a/src/utils.c b/src/utils.c index 635b325..5d828ab 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,3 +1,7 @@ +#include <stdio.h> //fprintf() +#include <string.h> //strerror() +#include <errno.h> //errno + #include "utils.h" static FILE *fdLog=NULL; @@ -8,7 +12,6 @@ void openLog(char path[]) { } else { //TODO : à implementer fprintf(stderr,"openLog : not yet implemented\n"); - exit(128); } } |