summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2010-11-21 22:13:17 +0000
committerLudovic Pouzenc <ludovic@pouzenc.fr>2010-11-21 22:13:17 +0000
commit0ee8598e757d1bfc41bc537c5ea24a59967fb207 (patch)
treefdd6a42cd81031acf585365a2975821d347dfa8b /src
parent0ff965a42f0ad7ab72829b9941bef0b8c20aea45 (diff)
download2010-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')
-rw-r--r--src/CMakeLists.txt33
-rw-r--r--src/game.c15
-rw-r--r--src/include/data_ini.h3
-rw-r--r--src/include/data_network.h11
-rw-r--r--src/include/data_ress.h2
-rw-r--r--src/include/game.h20
-rw-r--r--src/include/netgame.h1
-rw-r--r--src/include/timing.h12
-rw-r--r--src/loader.c10
-rw-r--r--src/netgame.c2
-rw-r--r--src/netlem.c7
-rw-r--r--src/netlem_ds.c4
-rw-r--r--src/parser/.svnignore4
-rw-r--r--src/parser/ginit.h325
-rw-r--r--src/parser/parse_ini.yy146
-rw-r--r--src/test/CMakeLists.txt9
-rw-r--r--src/test/Makefile13
-rw-r--r--src/test/test.c28
-rw-r--r--src/test/test_load.c50
-rw-r--r--src/test/testfunc_001_lex.c (renamed from src/test/test_lex.c)0
-rwxr-xr-xsrc/test/testfunc_001_lex.sh (renamed from src/test/test_lex.sh)0
-rw-r--r--src/test/testfunc_002_parse.c (renamed from src/test/test_parse.c)0
-rwxr-xr-xsrc/test/testfunc_002_parse.sh (renamed from src/test/test_parse.sh)0
-rw-r--r--src/test/testfunc_003_loadress.c57
-rwxr-xr-xsrc/test/testfunc_003_loadress.sh (renamed from src/test/test_load.sh)0
-rw-r--r--src/timing.c15
-rw-r--r--src/utils.c5
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)
-
diff --git a/src/game.c b/src/game.c
index 21af368..7a93832 100644
--- a/src/game.c
+++ b/src/game.c
@@ -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);
}
}