diff options
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 172 |
1 files changed, 34 insertions, 138 deletions
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) |