summaryrefslogtreecommitdiff
path: root/src/parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c172
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)