From 5cdd053de62373920422400200d1d9f79f6f3d0b Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Wed, 17 Jul 2013 15:50:28 +0200 Subject: Debut ajout changement des ressources. Ajout de checks dans le parser (limites sur INT). Factorisation de la macro mpl_check macro dans utils.h --- Makefile.am | 6 +- src/include/data_ini.h | 9 +- src/include/data_ress.h | 30 ++++++ src/include/loader.h | 10 ++ src/include/utils.h | 9 ++ src/loader.c | 233 +++++++++++++++++++++++++++++++++++++++++++++++ src/parser.c | 172 +++++++--------------------------- src/sandbox/sprite.c | 9 +- src/sandbox/sprite_gif.c | 24 +---- src/test/testrender.c | 51 +++++++++++ 10 files changed, 379 insertions(+), 174 deletions(-) create mode 100644 src/include/data_ress.h create mode 100644 src/include/loader.h create mode 100644 src/include/utils.h create mode 100644 src/loader.c create mode 100644 src/test/testrender.c 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 -// 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_texture def */ +#include /* 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 +#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 - -// 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 \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; +} -- cgit v1.2.3