diff options
author | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2010-11-18 21:12:10 +0000 |
---|---|---|
committer | Ludovic Pouzenc <ludovic@pouzenc.fr> | 2010-11-18 21:12:10 +0000 |
commit | 1742d99de4ca6624570f2a06bbcf5797acd46772 (patch) | |
tree | 05553e6febcd3ba172b779188200ce540434d75c /src | |
parent | 895e96ddd85e36947c4048e31cde428fdb260664 (diff) | |
download | 2010-netlemmings-1742d99de4ca6624570f2a06bbcf5797acd46772.tar.gz 2010-netlemmings-1742d99de4ca6624570f2a06bbcf5797acd46772.tar.bz2 2010-netlemmings-1742d99de4ca6624570f2a06bbcf5797acd46772.zip |
Parser te2 passes terminé. Tout les fichiers ini on l'air de bien passer, les structure de données refletent les fichier .ini
git-svn-id: file:///var/svn/2010-netlemmings/trunk@160 077b3477-7977-48bd-8428-443f22f7bfda
Diffstat (limited to 'src')
-rw-r--r-- | src/parser/ginit.h | 3 | ||||
-rw-r--r-- | src/parser/parse_ini.yy | 81 |
2 files changed, 72 insertions, 12 deletions
diff --git a/src/parser/ginit.h b/src/parser/ginit.h index 1a2661c..5d1ac15 100644 --- a/src/parser/ginit.h +++ b/src/parser/ginit.h @@ -4,6 +4,7 @@ #include "SDL/SDL.h" #define LEVEL_WIDTH (1664*2) +#define LEVEL_HEIGHT (160*2) struct styleObjects { int frames, anim, type, sound; @@ -35,7 +36,7 @@ struct level { char *style, *name; int superLemming; int objectCount, terrainCount, steelCount; - struct levelItem *objects, *terrain, *steel; + struct levelItem *objects, *terrains, *steels; }; struct levelPack { diff --git a/src/parser/parse_ini.yy b/src/parser/parse_ini.yy index 5888582..2326572 100644 --- a/src/parser/parse_ini.yy +++ b/src/parser/parse_ini.yy @@ -12,8 +12,13 @@ #define MAX_OBJECT_TYPES 32 #define MAX_OBJECT_FRAMES 64 +#define MAX_OBJECTS_COUNT 256 +#define MAX_TERRAINS_COUNT 1024 +#define MAX_STEELS_COUNT 256 #define MAX_SOUNDS_COUNT 32 #define MAX_NUMLEMMINGS 100 +#define STEEL_MAX_WIDTH 256 +#define STEEL_MAX_HEIGHT 256 extern FILE *yyin; extern int yylineno; @@ -36,8 +41,8 @@ void parse(struct gameInit *gInit) { callocIfNull(&gInit->style.objects, gInit->style.objectCount, sizeof(struct styleObjects)); callocIfNull(&gInit->level.objects, gInit->level.objectCount, sizeof(struct levelItem)); - callocIfNull(&gInit->level.terrain, gInit->level.terrainCount, sizeof(struct levelItem)); - callocIfNull(&gInit->level.steel, gInit->level.steelCount, sizeof(struct levelItem)); + callocIfNull(&gInit->level.terrains, gInit->level.terrainCount, sizeof(struct levelItem)); + callocIfNull(&gInit->level.steels, gInit->level.steelCount, sizeof(struct levelItem)); rewind(yyin); gInit->firstPass=0; @@ -106,14 +111,22 @@ decl: BGCOLOR AFF INTHEX { gInit->style.bgColor = $3; } } } | TYPE INT AFF INT { - 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); -// gInit->style.objects[$2].type = $4; + if ( gInit->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; + } } | SOUND INT AFF INT { - yyassert($2>=0 && $2<MAX_OBJECT_TYPES, "sound_ index", OUT_OF_BOUNDS); - yyassert($4>=-1 && $4<=MAX_SOUNDS_COUNT, "sound value", OUT_OF_BOUNDS); -// gInit->style.objects[$2].sound = $4; + if ( gInit->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; + } } /*lvl_xxxx.ini*/ @@ -170,9 +183,55 @@ decl: BGCOLOR AFF INTHEX { gInit->style.bgColor = $3; } } | STYLE AFF STR { gInit->level.style = $3; } | SLEM AFF STR { gInit->level.superLemming = strcasecmp("true", $3)==0; } -| OBJECT INT AFF INT VIR INT VIR INT VIR INT VIR INT {} -| TERRAIN INT AFF INT VIR INT VIR INT VIR INT {} -| STEEL INT AFF INT VIR INT VIR INT VIR INT {} +| OBJECT INT AFF INT VIR INT VIR INT VIR INT VIR INT { + if ( gInit->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++; + } 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; + } + } +| TERRAIN INT AFF INT VIR INT VIR INT VIR INT { + if ( gInit->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++; + } 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; + } + } +| STEEL INT AFF INT VIR INT VIR INT VIR INT { + if ( gInit->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++; + } 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; + } + } | NAME AFF STR { gInit->level.name = $3; } /* TODO : attention, si fichier levelpack, name n'est pas le nom d'unniveau */ /* levelpack.ini */ | MAXFALLDISTANCE AFF INT { |