summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-17 15:50:28 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-17 15:50:28 +0200
commit5cdd053de62373920422400200d1d9f79f6f3d0b (patch)
tree010910c0620672a89660d64f3cc17a4b2c748b73
parent25df857bd3a0f5fe4a4917e1e1488f22675a0574 (diff)
downloadmplemmings-5cdd053de62373920422400200d1d9f79f6f3d0b.tar.gz
mplemmings-5cdd053de62373920422400200d1d9f79f6f3d0b.tar.bz2
mplemmings-5cdd053de62373920422400200d1d9f79f6f3d0b.zip
Debut ajout changement des ressources. Ajout de checks dans le parser
(limites sur INT). Factorisation de la macro mpl_check macro dans utils.h
-rw-r--r--Makefile.am6
-rw-r--r--src/include/data_ini.h9
-rw-r--r--src/include/data_ress.h30
-rw-r--r--src/include/loader.h10
-rw-r--r--src/include/utils.h9
-rw-r--r--src/loader.c233
-rw-r--r--src/parser.c172
-rw-r--r--src/sandbox/sprite.c9
-rw-r--r--src/sandbox/sprite_gif.c24
-rw-r--r--src/test/testrender.c51
10 files changed, 379 insertions, 174 deletions
diff --git a/Makefile.am b/Makefile.am
index 9d44947..d08a130 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4,11 +4,12 @@ ACLOCAL_AMFLAGS = -I m4 --install
bin_PROGRAMS = mplemmings mplemmings_ds
# Target list of programs that will not installed anywhere (dev helping tiny programs)
-noinst_PROGRAMS = sbsprite sbspritegif testparseall
+noinst_PROGRAMS = sbsprite sbspritegif testparseall testrender
# Use configure detected necessary cflags and ldflags
AM_CFLAGS = -Wall -Werror -I src/include/ -I src/minini/dev/ $(DEPS_CFLAGS)
LIBS = $(DEPS_LIBS)
+PARSER_MODULES=src/minini/dev/minIni.c src/minini/dev/my_SDL_stdinc.c src/parser.c
# Per target specs
mplemmings_SOURCES = src/mplemmings.c
@@ -16,7 +17,8 @@ mplemmings_ds_SOURCES = src/mplemmings_ds.c
#mplemmings_ds_CPPFLAGS = -DDEBUG
sbsprite_SOURCES = src/sandbox/sprite.c
sbspritegif_SOURCES = src/sandbox/sprite_gif.c
-testparseall_SOURCES = src/minini/dev/minIni.c src/minini/dev/my_SDL_stdinc.c src/parser.c src/test/testparseall.c
+testparseall_SOURCES = $(PARSER_MODULES) src/test/testparseall.c
+testrender_SOURCES = $(PARSER_MODULES) src/loader.c src/test/testrender.c
# Extra files to be shipped in the tarball (make dist)
EXTRA_DIST = m4/.dont-remove rm-all-generated-files.sh
diff --git a/src/include/data_ini.h b/src/include/data_ini.h
index 9b14899..06b1c47 100644
--- a/src/include/data_ini.h
+++ b/src/include/data_ini.h
@@ -3,9 +3,8 @@
#include <SDL_stdinc.h>
-// Original game level size is fixed to 1664x160. We want to display all the game with a x2 zoom
-#define LEVEL_WIDTH 1664*2
-#define LEVEL_HEIGHT 160*2
+#define LEVEL_WIDTH 1664
+#define LEVEL_HEIGHT 160
#define MAX_NAMELEN 64
@@ -16,6 +15,9 @@
#define MAX_TERRAINS_COUNT 1024
#define MAX_STEELS_COUNT 256
+#define MAX_TILES_COUNT 128
+#define MAX_SOUNDS_COUNT 24
+#define MAX_LEMMANIM_COUNT 17
//////////////////////// LEVEL INI FILES ////////////////////////
// Item should be an object, terrain or steel
@@ -52,7 +54,6 @@ struct levelPackIni {
//////////////////////// STYLE INI FILES ////////////////////////
struct styleIni {
- char name[MAX_NAMELEN];
uint32_t bgColor, debrisColor;
int tiles, particleColorCount;
uint32_t particleColor[MAX_PARTICLE_COLORS];
diff --git a/src/include/data_ress.h b/src/include/data_ress.h
new file mode 100644
index 0000000..1b8bba7
--- /dev/null
+++ b/src/include/data_ress.h
@@ -0,0 +1,30 @@
+#ifndef DATA_RESS_H
+#define DATA_RESS_H
+
+#include <SDL.h> /* SDL_texture def */
+#include <SDL_mixer.h> /* Mix_Chunk and Mix_Music defs */
+#include "data_ini.h" /* For MAX_* macros */
+
+typedef struct {
+ SDL_Texture *t;
+ SDL_Rect size;
+ /* int frames; Already in gIni->style->frames, but convenient here also */
+} sprite_t;
+
+typedef struct {
+ /* Style */
+ sprite_t tiles[MAX_TILES_COUNT];
+ sprite_t objects[MAX_OBJECTS_COUNT];
+ sprite_t objectMasks[MAX_OBJECTS_COUNT];
+ /* Misc */
+ sprite_t lemmingAnims[MAX_LEMMANIM_COUNT];
+ sprite_t lemmingMasks[MAX_LEMMANIM_COUNT];
+ sprite_t lemmingImask[MAX_LEMMANIM_COUNT];
+ sprite_t font1, font2, countdown, cursor;
+ /* Music */
+ Mix_Music *musics[MAX_MUSICS_COUNT];
+ /* Sound */
+ Mix_Chunk *sounds[MAX_SOUNDS_COUNT];
+} gameRess_t;
+
+#endif /*DATA_RESS_H*/
diff --git a/src/include/loader.h b/src/include/loader.h
new file mode 100644
index 0000000..adf8777
--- /dev/null
+++ b/src/include/loader.h
@@ -0,0 +1,10 @@
+#ifndef LOADER_H
+#define LOADER_H
+
+#include "data_ini.h"
+#include "data_ress.h"
+
+// Load all textures needed for style and level from gIni
+int loadRessources(gameIni_t *gIni, char databasepath[], gameRess_t *gRess);
+
+#endif /*LOADER_H*/
diff --git a/src/include/utils.h b/src/include/utils.h
new file mode 100644
index 0000000..f0af3d0
--- /dev/null
+++ b/src/include/utils.h
@@ -0,0 +1,9 @@
+
+/* Macro for error checking and logging */
+#define mpl_check(expr, fail_code, priority, ...) \
+ if (! (expr)) { \
+ SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,priority,__VA_ARGS__); \
+ SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,priority, \
+ "-> last SDL error : %s\n", SDL_GetError()); \
+ fail_code; \
+ }
diff --git a/src/loader.c b/src/loader.c
new file mode 100644
index 0000000..7a3d328
--- /dev/null
+++ b/src/loader.c
@@ -0,0 +1,233 @@
+#include "loader.h"
+#include "utils.h" /* mpl_check */
+
+#include <SDL_image.h>
+#if ! SDL_VERSION_ATLEAST(2,0,0)
+#error "This code is only for SDL 2+. No backward compatibility with previous SDL versions, sorry."
+#endif
+
+SDL_Texture * my_sdl_load_texture(SDL_Renderer *rend, char *giffilepath, SDL_Rect *size);
+
+int loadRessources(gameIni_t *gIni, char databasepath[], gameRess_t *gRess) {
+ return 1; //FIXME
+}
+
+#if 0
+int loadRessources(gameIni_t *gIni, gameRess_t *gRess) {
+ int i, res, filenamelen;
+ char *filepath;
+
+ filenamelen = sizeof(char)*(strlen(PATH_STYLE)+2*strlen(gIni->style.name)+strlen("//om_00.gif")+1);
+ filepath = malloc(filenamelen);
+
+ gRess->style.tiles=malloc(sizeof(SDL_Surface *)*gIni->style.tiles);
+ if (gRess->style.tiles==NULL) {
+ logp(LOG_ERROR, "loadRessources(), malloc()");
+ return 1;
+ }
+ for(i=0; i < gIni->style.tiles ; ++i) {
+ snprintf(filepath, filenamelen, "%s/%s/%s_%d.gif", PATH_STYLE, gIni->style.name, gIni->style.name, i);
+ gRess->style.tiles[i] = loadGif(filepath);
+ if(gRess->style.tiles[i]==NULL) {
+ logs2(LOG_WARN, "loadRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+ }
+
+ gRess->style.objects=malloc(sizeof(SDL_Surface *)*gIni->style.objectCount);
+ if (gRess->style.objects==NULL) {
+ logp(LOG_ERROR, "loadRessources(), malloc()");
+ return 1;
+ }
+
+ gRess->style.objectMasks=malloc(sizeof(SDL_Surface *)*gIni->style.objectCount);
+ if (gRess->style.objectMasks==NULL) {
+ logp(LOG_ERROR, "loadRessources(), malloc()");
+ return 1;
+ }
+
+
+ for(i=0; i < gIni->style.objectCount ; ++i) {
+ snprintf(filepath, filenamelen, "%s/%s/%so_%d.gif", PATH_STYLE, gIni->style.name, gIni->style.name, i);
+ gRess->style.objects[i] = loadGif(filepath);
+ if (gRess->style.objects[i]==NULL) {
+ logs2(LOG_WARN, "loadRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+
+ switch(gIni->style.objects[i].type) {
+ case 5:
+ case 6:
+ case 7:
+ case 8:
+ snprintf(filepath, filenamelen, "%s/%s/%som_%d.gif", PATH_STYLE, gIni->style.name, gIni->style.name, i);
+ // ... cheater !! I'm not cheating, I just want KISS (Keep It Simple and Stupid)
+ gRess->style.objectMasks[i] = loadGif(filepath);
+ if (gRess->style.objectMasks[i]==NULL) {
+ logs2(LOG_WARN, "loadRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+ break;
+ default:
+ /* No mask for other types */
+ break;
+ }
+ }
+
+ free(filepath);
+
+ res=_loadMiscRessources(gIni, gRess);
+
+ return res;
+}
+
+int _loadMiscRessources(gameIni_t *gIni, gameRess_t *gRess) {
+ int i, filenamelen;
+ char *filepath;
+
+ filenamelen = sizeof(char)*(strlen(PATH_MISC)+16);
+ filepath = malloc(filenamelen);
+
+ gRess->misc.lemmingAnims=malloc(sizeof(SDL_Surface *)*gIni->misc.lemmingAnimCount);
+ if (gRess->misc.lemmingAnims==NULL) {
+ logp(LOG_ERROR, "_loadMiscRessources(), malloc()");
+ return 1;
+ }
+
+ gRess->misc.lemmingMasks=malloc(sizeof(SDL_Surface *)*gIni->misc.lemmingAnimCount);
+ if (gRess->misc.lemmingMasks==NULL) {
+ logp(LOG_ERROR, "_loadMiscRessources(), malloc()");
+ return 1;
+ }
+
+ gRess->misc.lemmingImasks=malloc(sizeof(SDL_Surface *)*gIni->misc.lemmingAnimCount);
+ if (gRess->misc.lemmingImasks==NULL) {
+ logp(LOG_ERROR, "_loadMiscRessources(), malloc()");
+ return 1;
+ }
+
+ for(i=0; i < gIni->misc.lemmingAnimCount ; ++i) {
+ snprintf(filepath, filenamelen, "%s/lemm_%d.gif", PATH_MISC, i);
+ gRess->misc.lemmingAnims[i] = loadGif(filepath);
+ if (gRess->misc.lemmingAnims[i]==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+
+ if ( gIni->misc.lemmingAnims[i].haveImask == 1 ) {
+ snprintf(filepath, filenamelen, "%s/mask_%d.gif", PATH_MISC, i);
+ gRess->misc.lemmingImasks[i] = loadGif(filepath);
+ if (gRess->misc.lemmingImasks[i]==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+ }
+
+ if ( gIni->misc.lemmingAnims[i].haveMask == 1 ) {
+ snprintf(filepath, filenamelen, "%s/mask_%d.gif", PATH_MISC, i);
+ gRess->misc.lemmingImasks[i] = loadGif(filepath);
+ if (gRess->misc.lemmingImasks[i]==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+ }
+ }
+
+ gRess->misc.icons=malloc(sizeof(SDL_Surface *)*MISC_ICON_COUNT);
+ if (gRess->misc.icons==NULL) {
+ logp(LOG_ERROR, "_loadMiscRessources(), malloc()");
+ return 1;
+ }
+
+ for(i=0; i < MISC_ICON_COUNT ; ++i) {
+ snprintf(filepath, filenamelen, "%s/icon_%d.gif", PATH_MISC, i);
+ gRess->misc.icons[i] = loadGif(filepath);
+ if (gRess->misc.icons[i]==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+ }
+
+ snprintf(filepath, filenamelen, "%s/lemmfont.gif", PATH_MISC);
+ gRess->misc.font1 = loadGif(filepath);
+ if (gRess->misc.font1==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+
+ snprintf(filepath, filenamelen, "%s/numfont.gif", PATH_MISC);
+ gRess->misc.font2 = loadGif(filepath);
+ if (gRess->misc.font2==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+
+ snprintf(filepath, filenamelen, "%s/lemmfont2.gif", PATH_MISC);
+ gRess->misc.font2 = loadGif(filepath);
+ if (gRess->misc.font2==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+
+ snprintf(filepath, filenamelen, "%s/countdown.gif", PATH_MISC);
+ gRess->misc.countdown = loadGif(filepath);
+ if (gRess->misc.countdown==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+
+ snprintf(filepath, filenamelen, "%s/cursor.gif", PATH_MISC);
+ gRess->misc.cursor = loadGif(filepath);
+ if (gRess->misc.cursor==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+
+ snprintf(filepath, filenamelen, "%s/explode.gif", PATH_MISC);
+ gRess->misc.explode = loadGif(filepath);
+ if (gRess->misc.explode==NULL) {
+ logs2(LOG_WARN, "_loadMiscRessources(), loadGif() error for ", filepath);
+ return 2;
+ }
+
+ free(filepath);
+
+ return 0;
+}
+
+#endif
+
+SDL_Texture * my_sdl_load_texture(SDL_Renderer *rend, char *giffilepath, SDL_Rect *size) {
+ SDL_Surface *s;
+ SDL_Texture *t;
+ SDL_RWops *rwop;
+ //int res;
+
+ rwop = SDL_RWFromFile(giffilepath,"r");
+ s = IMG_LoadGIF_RW(rwop);
+ SDL_RWclose(rwop);
+
+ mpl_check(
+ s,
+ {return NULL;},
+ SDL_LOG_PRIORITY_WARN,
+ "my_sdl_load_texture(rend, \"%s\") failed",giffilepath
+ );
+
+ t = SDL_CreateTextureFromSurface(rend, s);
+ mpl_check(
+ t,
+ {SDL_FreeSurface(s); return NULL;},
+ SDL_LOG_PRIORITY_WARN,
+ "my_sdl_load_texture(rend, \"%s\") : can't convert surface to texture",giffilepath
+ );
+
+ if (size != NULL) {
+ size->x=0; size->y=0;
+ size->w=s->w; size->h=s->h;
+ }
+ /* Surface no longer useful (everything was copied in the texture) */
+ SDL_FreeSurface(s);
+ return t;
+}
+
diff --git a/src/parser.c b/src/parser.c
index 812b4c1..0720881 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -1,133 +1,23 @@
#include "parser.h"
-#ifndef PARSER_H
-#define PARSER_H
-
-#include "data_ini.h"
-#ifndef DATA_INI_H
-#define DATA_INI_H
-
-#include <SDL_stdinc.h>
-
-// Original game level size is fixed to 1664x160. We want to display all the game with a x2 zoom
-#define LEVEL_WIDTH 1664*2
-#define LEVEL_HEIGHT 160*2
-
-#define MAX_NAMELEN 64
-
-#define MAX_PARTICLE_COLORS 16
-#define MAX_MUSICS_COUNT 32
-#define MAX_DIFFICULTY_COUNT 8
-#define MAX_OBJECTS_COUNT 256
-#define MAX_TERRAINS_COUNT 1024
-#define MAX_STEELS_COUNT 256
-
-//////////////////////// LEVEL INI FILES ////////////////////////
-
-// Item should be an object, terrain or steel
-struct levelItem {
- int id, xpos, ypos; // Common to all types (but no id for steel)
- int paintMode, ud; // Specific to objects
- int modifier; // Specific to terrains
- int width, height; // Specific to steels
-};
-
-struct levelIni {
- int releaseRate, numLemmings, numToRescue, timeLimit;
- int numClimbers, numFloaters, numBlockers, numBombers;
- int numBuilders, numBashers, numMiners, numDiggers;
- int xPos; // Initial camera position on level
- char style[MAX_NAMELEN], name[MAX_NAMELEN];
- int superLemming;
- int objectCount, terrainCount, steelCount;
- struct levelItem objects[MAX_OBJECTS_COUNT];
- struct levelItem terrains[MAX_OBJECTS_COUNT];
- struct levelItem steels[MAX_OBJECTS_COUNT];
-};
-
-
-//////////////////////// LEVELPACK INI FILES ////////////////////////
-struct levelPackIni {
- char name[MAX_NAMELEN];
- int maxFallDistance;
- char codeSeed[MAX_NAMELEN];
- int musicCount, levelDifficultyCount;
- char music[MAX_MUSICS_COUNT][MAX_NAMELEN];
- char levelDifficulty[MAX_DIFFICULTY_COUNT][MAX_NAMELEN];
-};
-
-//////////////////////// STYLE INI FILES ////////////////////////
-struct styleIni {
- char name[MAX_NAMELEN];
- uint32_t bgColor, debrisColor;
- int tiles, particleColorCount;
- uint32_t particleColor[MAX_PARTICLE_COLORS];
- int objectCount;
- int frames[MAX_OBJECTS_COUNT];
- int anim[MAX_OBJECTS_COUNT];
- int type[MAX_OBJECTS_COUNT];
- int sound[MAX_OBJECTS_COUNT];
-};
-
-/*////////////////////// MISC/LEMMING.INI FILE ////////////////////////
-struct lemmingAnim {
- int haveMask, haveImask;
-
- int lemmFrames, lemmDirs, lemmAnimType;
- int maskFrames, maskDirs, maskStartFrame;
- int imaskFrames, imaskDirs;
- int xPos, yPos, posFlags;
-};
-
-struct miscIni {
- int lemmingAnimCount;
- struct lemmingAnim *lemmingAnims;
-};
-*/
-
-//////////////////////// GLOBAL INI FILES ////////////////////////
-typedef struct {
- struct styleIni style;
- struct levelIni level;
- struct levelPackIni levelPack;
- //struct miscIni misc;
-} gameIni_t;
-
-
-#endif /*DATA_INI_H*/
-
-//#define OUT_OF_BOUNDS "out of bounds"
-//#define CANNOT_BE_NEGATIVE "cannot be negative"
-//#define BAD_VALUE "bad value"
-
-//#define MAX_LEMMTYPES_COUNT 16
-//#define MAX_OBJECT_FRAMES 64
-//#define MAX_NUMLEMMINGS 100
-//#define STEEL_MAX_WIDTH 256
-//#define STEEL_MAX_HEIGHT 256
-
-#define ERR_UNKNOWN_KEY 1
-#define ERR_NOT_YET_IMPLEMENTED 2
-#define ERR_KEY_OUT_OF_RANGE 3
-#define ERR_VAL_OUT_OF_RANGE 4
-#define ERR_STRING_TOO_LONG 5
-
-enum ini_type { ini_style, ini_levelpack, ini_level };
-
-int loadIni(enum ini_type type, const char *filepath, gameIni_t *ini);
-
-#endif /*PARSER_H*/
#include "minIni.h"
-#define _MATCH_SIMPLETYPE(keysymbol,parsefunc) \
+#define MATCH_HEXCOLOR(keysymbol) \
do { \
if (SDL_strcasecmp(key,#keysymbol)==0) { \
- data->keysymbol = parsefunc(value); \
+ data->keysymbol = hextext2rgb(value); \
return 1; \
} \
} while(0)
-#define MATCH_INT(keysymbol) _MATCH_SIMPLETYPE(keysymbol,SDL_atoi)
-#define MATCH_HEXCOLOR(keysymbol) _MATCH_SIMPLETYPE(keysymbol,hextext2rgb)
+#define MATCH_INT(keysymbol,maxval) \
+ do { \
+ if (SDL_strcasecmp(key,#keysymbol)==0) { \
+ int v = SDL_atoi(value); \
+ if ( v > maxval ) { *err=ERR_VAL_OUT_OF_RANGE; return 0; } \
+ data->keysymbol = v; \
+ return 1; \
+ } \
+ } while(0)
#define _SAFE_STRING_COPY(dst,src,maxlen) \
do { \
@@ -208,9 +98,14 @@ int loadIni(enum ini_type type, const char *filepath, gameIni_t *ini) {
return -1; //Should be unreachable
}
if (res!=1) {
- res=state.error_code;
//FIXME : logging
- printf("Parse error %i for this key/value pair : %s\n", state.error_code, state.error_line_content);
+ if (state.error_code == 0) {
+ res=-1;
+ printf("Unknown error on '%s' : can't read file ?\n", filepath);
+ } else {
+ res=state.error_code;
+ printf("Parse error %i in '%s'. key/value : %s\n", state.error_code, filepath, state.error_line_content);
+ }
} else {
res=0;
}
@@ -252,7 +147,7 @@ int callback_ini_style(const mTCHAR *section, const mTCHAR *key, const mTCHAR *v
// Common cases, extensive use of macros
MATCH_HEXCOLOR(bgColor);
MATCH_HEXCOLOR(debrisColor);
- MATCH_INT(tiles);
+ MATCH_INT(tiles,MAX_TILES_COUNT);
MATCH_INT_ARRAY(frames,MAX_OBJECTS_COUNT,data->objectCount,data->frames,0,32);
MATCH_INT_ARRAY(anim ,MAX_OBJECTS_COUNT,data->objectCount,data->anim ,0,3);
MATCH_INT_ARRAY(type ,MAX_OBJECTS_COUNT,data->objectCount,data->type ,0,32);
@@ -269,7 +164,7 @@ int callback_ini_levelpack(const mTCHAR *section, const mTCHAR *key, const mTCHA
int i;
MATCH_STRING(name,MAX_NAMELEN);
- MATCH_INT(maxFallDistance);
+ MATCH_INT(maxFallDistance,LEVEL_HEIGHT);
MATCH_STRING(codeSeed,MAX_NAMELEN);
MATCH_STRING_ARRAY(music,MAX_MUSICS_COUNT,data->musicCount,data->music,MAX_NAMELEN);
@@ -295,21 +190,22 @@ int callback_ini_level(const mTCHAR *section, const mTCHAR *key, const mTCHAR *v
struct levelIni *data = &(((parserState_t*) userData)->ini->level);
int *err= &(((parserState_t*) userData)->error_code);
- MATCH_INT(releaseRate);
- MATCH_INT(numLemmings);
- MATCH_INT(numToRescue);
- MATCH_INT(timeLimit);
- MATCH_INT(numClimbers);
- MATCH_INT(numFloaters);
- MATCH_INT(numBombers);
- MATCH_INT(numBlockers);
- MATCH_INT(numBuilders);
- MATCH_INT(numBashers);
- MATCH_INT(numMiners);
- MATCH_INT(numDiggers);
- MATCH_INT(xPos);
+ MATCH_INT(releaseRate,100);
+ MATCH_INT(numLemmings,100);
+ MATCH_INT(numToRescue,100);
+ MATCH_INT(timeLimit,100);
+ MATCH_INT(numClimbers,100);
+ MATCH_INT(numFloaters,100);
+ MATCH_INT(numBombers,100);
+ MATCH_INT(numBlockers,100);
+ MATCH_INT(numBuilders,100);
+ MATCH_INT(numBashers,100);
+ MATCH_INT(numMiners,100);
+ MATCH_INT(numDiggers,100);
+ MATCH_INT(xPos,LEVEL_WIDTH);
MATCH_STRING(style,MAX_NAMELEN);
MATCH_STRING(name,MAX_NAMELEN);
+
// TODO : object/terrain/steel à la main (car struct, et complications)
// No match is an error (unkown key)
diff --git a/src/sandbox/sprite.c b/src/sandbox/sprite.c
index 7aafccf..57c6f06 100644
--- a/src/sandbox/sprite.c
+++ b/src/sandbox/sprite.c
@@ -3,6 +3,7 @@
#error "This code is only for SDL 2+. No backward compatibility with previous SDL versions, sorry."
#endif
+#include "utils.h"
#define MPL_WINDOW_TITLE __FILE__
#define MPL_WINDOW_WIDTH 640
@@ -83,14 +84,6 @@ int main(int argc, char *argv[]) {
}
-#define mpl_check(expr, fail_code, priority, ...) \
- if (! (expr)) { \
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,priority,__VA_ARGS__); \
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,priority, \
- "-> last SDL error : %s\n", SDL_GetError()); \
- fail_code; \
- }
-
void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint32 win_flags, Uint32 rend_flags, SDL_Window **win, SDL_Renderer **rend, SDL_RendererInfo *rend_info, SDL_Rect *viewport)
{
int res, i;
diff --git a/src/sandbox/sprite_gif.c b/src/sandbox/sprite_gif.c
index eb7f58a..28c57aa 100644
--- a/src/sandbox/sprite_gif.c
+++ b/src/sandbox/sprite_gif.c
@@ -5,6 +5,7 @@
#error "This code is only for SDL 2+. No backward compatibility with previous SDL versions, sorry."
#endif
+#include "utils.h"
#define MPL_WINDOW_TITLE __FILE__
#define MPL_WINDOW_WIDTH 640
@@ -85,14 +86,6 @@ int main(int argc, char *argv[]) {
}
-#define mpl_check(expr, fail_code, priority, ...) \
- if (! (expr)) { \
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,priority,__VA_ARGS__); \
- SDL_LogMessage(SDL_LOG_CATEGORY_APPLICATION,priority, \
- "-> last SDL error : %s\n", SDL_GetError()); \
- fail_code; \
- }
-
void my_SDL_init_or_die(char title[], SDL_Rect win_pos, Uint32 init_flags, Uint32 win_flags, Uint32 rend_flags, SDL_Window **win, SDL_Renderer **rend, SDL_RendererInfo *rend_info, SDL_Rect *viewport)
{
int res, i;
@@ -188,21 +181,7 @@ SDL_Texture * my_sdl_load_texture(SDL_Renderer *rend, char *giffilepath, SDL_Rec
SDL_LOG_PRIORITY_WARN,
"my_sdl_load_texture(rend, \"%s\") failed",giffilepath
);
-/* mpl_check(
- s->format->BitsPerPixel==24,
- {SDL_FreeSurface(s); return NULL;},
- SDL_LOG_PRIORITY_WARN,
- "my_sdl_load_texture(rend, \"%s\") : BitsPerPixel == %i",bmpfilepath,s->format->BitsPerPixel
- );
- res=SDL_SetColorKey(s, SDL_TRUE, MPL_COLOR_KEY);
- mpl_check(
- res==0,
- {SDL_FreeSurface(s); return NULL;},
- SDL_LOG_PRIORITY_WARN,
- "my_sdl_load_texture(rend, \"%s\") : can't set colorkey %x",bmpfilepath,MPL_COLOR_KEY
- );
-*/
t = SDL_CreateTextureFromSurface(rend, s);
mpl_check(
t,
@@ -219,3 +198,4 @@ SDL_Texture * my_sdl_load_texture(SDL_Renderer *rend, char *giffilepath, SDL_Rec
SDL_FreeSurface(s);
return t;
}
+
diff --git a/src/test/testrender.c b/src/test/testrender.c
new file mode 100644
index 0000000..98a940f
--- /dev/null
+++ b/src/test/testrender.c
@@ -0,0 +1,51 @@
+#include "parser.h"
+#include "loader.h"
+
+#define DATA_BASEPATH "./data"
+#define MAX_PATH_LEN 255
+
+int main(int argc, char **argv) {
+ int res;
+ char filepath[MAX_PATH_LEN];
+ gameIni_t gIni;
+ gameRess_t gRess;
+
+ if (argc != 3) {
+ fprintf(stderr, "Usage %s <levelpack_name> <level_ini_name>\n", argv[0]);
+ return 1;
+ }
+
+ // Setting default values
+ SDL_memset(&gIni,0,sizeof(gameIni_t));
+
+ // Loading levelpack.ini
+ SDL_snprintf(filepath, MAX_PATH_LEN, "%s/level/%s/levelpack.ini", DATA_BASEPATH, argv[1]);
+ res=loadIni(ini_levelpack, filepath, &gIni);
+ if (res!=0) exit(res);
+
+ // Loading lvl ini file
+ SDL_snprintf(filepath, MAX_PATH_LEN, "%s/level/%s/%s.ini", DATA_BASEPATH, argv[1], argv[2]);
+ res=loadIni(ini_level, filepath, &gIni);
+ if (res!=0) exit(res);
+
+ // 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
+ SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%s.ini", DATA_BASEPATH, gIni.level.style, gIni.level.style);
+ res=loadIni(ini_style, filepath, &gIni);
+ if (res!=0) exit(res);
+
+ /* Loading misc/lemming.ini
+ SDL_snprintf(filepath, MAX_PATH_LEN, "%s/lemming.ini", PATH_MISC);
+ res=loadIni(&gIni, filepath);
+ if (res!=0) exit(res);
+ */
+
+ res=loadRessources(&gIni, DATA_BASEPATH, &gRess);
+
+ return res;
+}