diff options
Diffstat (limited to 'src/parser/parse_ini.yy')
-rw-r--r-- | src/parser/parse_ini.yy | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/src/parser/parse_ini.yy b/src/parser/parse_ini.yy index 0927011..ead019d 100644 --- a/src/parser/parse_ini.yy +++ b/src/parser/parse_ini.yy @@ -13,7 +13,9 @@ extern int yyparse(gameIni_t *gIni); int yylex(); void yyerror(gameIni_t *gIni, char *s); + void yyassert(int condition, char what[], char why[]); +int parse(gameIni_t *gIni); void callocIfNull(void **ptr, size_t nmemb, size_t size); uint32_t convrgb(uint32_t in); @@ -30,7 +32,9 @@ uint32_t convrgb(uint32_t in); %token BGCOLOR DEBRISCOLOR PARTICLECOLOR %token XPOS OBJECT TERRAIN STEEL RELEASERATE NUMLEMMINGS NUMTORESCUE TIMELIMIT %token NUMCLIMBERS NUMFLOATERS NUMBOMBERS NUMBLOCKERS NUMBUILDERS NUMBASHERS NUMMINERS NUMDIGGERS -%token MAXFALLDISTANCE CODESEED MUSIC LEVEL DIFFICULTY +%token MAXFALLDISTANCE CODESEED MUSIC LEVEL +%token LEMM POS MASK IMASK +%token DIFFICULTY %token AFF %token VIR @@ -156,8 +160,8 @@ decl: BGCOLOR AFF INTHEX { gIni->style.bgColor = convrgb($3); } if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_OBJECTS_COUNT, "object_ index", OUT_OF_BOUNDS); yyassert($4>=0 , "object_ id value", OUT_OF_BOUNDS); - yyassert($6%2==0 , "object_ xpos is odd", BAD_VALUE); - yyassert($8%2==0 , "object_ ypos is odd", BAD_VALUE); + //yyassert($6%2==0 , "object_ xpos is odd", BAD_VALUE); + //yyassert($8%2==0 , "object_ ypos is odd", BAD_VALUE); yyassert($10==0 || $10==4 || $10==8, "object_ paintMode value", BAD_VALUE); yyassert($12==0 || $12==1, "object_ ud value", BAD_VALUE); @@ -175,8 +179,8 @@ decl: BGCOLOR AFF INTHEX { gIni->style.bgColor = convrgb($3); } if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_TERRAINS_COUNT, "terrain_ index", OUT_OF_BOUNDS); yyassert($4>=0 , "terrain_ id value", OUT_OF_BOUNDS); - yyassert($6%2==0 , "terrain_ xpos is odd", BAD_VALUE); - yyassert($8%2==0 , "terrain_ ypos is odd", BAD_VALUE); + //yyassert($6%2==0 , "terrain_ xpos is odd", BAD_VALUE); + //yyassert($8%2==0 , "terrain_ ypos is odd", BAD_VALUE); yyassert($10>=0 && $10<16, "terrain_ modifier value", BAD_VALUE); gIni->level.terrainCount++; @@ -191,8 +195,8 @@ decl: BGCOLOR AFF INTHEX { gIni->style.bgColor = convrgb($3); } | STEEL INT AFF INT VIR INT VIR INT VIR INT { if ( gIni->firstPass==1 ) { yyassert($2>=0 && $2<MAX_STEELS_COUNT, "steel_ index", OUT_OF_BOUNDS); - yyassert($4%2==0 , "steel_ xpos is odd", BAD_VALUE); - yyassert($6%2==0 , "steel_ ypos is odd", BAD_VALUE); + //yyassert($4%2==0 , "steel_ xpos is odd", BAD_VALUE); + //yyassert($6%2==0 , "steel_ ypos is odd", BAD_VALUE); 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); @@ -207,6 +211,58 @@ decl: BGCOLOR AFF INTHEX { gIni->style.bgColor = convrgb($3); } gIni->level.steels[$2].height = $10; } } +| LEMM INT AFF INT VIR INT VIR INT { + if ( gIni->firstPass==1 ) { + yyassert($2>=0 && $2<MAX_LEMMTYPES_COUNT, "lemm_ index", OUT_OF_BOUNDS); + yyassert($4>=0 , "lemm_ frame value", OUT_OF_BOUNDS); + yyassert($6==1 || $6==2, "lemm_ dirs", BAD_VALUE); + yyassert($8==0 || $8==1, "lemm_ animType value", BAD_VALUE); + + gIni->misc.lemmingAnimCount++; + } else { + yyassert($2<gIni->misc.lemmingAnimCount, "lemm_ index", OUT_OF_BOUNDS); + gIni->misc.lemmingAnims[$2].lemmFrames = $4; + gIni->misc.lemmingAnims[$2].lemmDirs = $6; + gIni->misc.lemmingAnims[$2].lemmAnimType = $8; + } + } +| POS INT AFF INT VIR INT VIR INT { + if ( gIni->firstPass==1 ) { + yyassert($2>=0 && $2<MAX_LEMMTYPES_COUNT, "pos_ index", OUT_OF_BOUNDS); + yyassert($4>=0, "pos_ x value", OUT_OF_BOUNDS); + yyassert($6>=0, "pos_ y dirs", BAD_VALUE); + yyassert($8==8, "pos_ flags value", BAD_VALUE); + } else { + yyassert($2<gIni->misc.lemmingAnimCount, "pos_ index", OUT_OF_BOUNDS); + gIni->misc.lemmingAnims[$2].xPos = $4; + gIni->misc.lemmingAnims[$2].yPos = $6; + gIni->misc.lemmingAnims[$2].posFlags = $8; + } + } +| MASK INT AFF INT VIR INT VIR INT { + if ( gIni->firstPass==1 ) { + yyassert($2>=0 && $2<MAX_LEMMTYPES_COUNT, "mask_ index", OUT_OF_BOUNDS); + yyassert($4>=0 , "mask_ frame value", OUT_OF_BOUNDS); + yyassert($6==1 || $6==2, "mask_ dirs value", BAD_VALUE); + yyassert($8>=0, "mask_ startFrame value", BAD_VALUE); + } else { + yyassert($2<gIni->misc.lemmingAnimCount, "mask_ index", OUT_OF_BOUNDS); + gIni->misc.lemmingAnims[$2].maskFrames = $4; + gIni->misc.lemmingAnims[$2].maskDirs = $6; + gIni->misc.lemmingAnims[$2].maskStartFrame = $8; + } + } +| IMASK INT AFF INT VIR INT { + if ( gIni->firstPass==1 ) { + yyassert($2>=0 && $2<MAX_LEMMTYPES_COUNT, "imask_ index", OUT_OF_BOUNDS); + yyassert($4>=0 , "imask_ frame value", OUT_OF_BOUNDS); + yyassert($6==1 || $6==2, "imask_ dirs value", BAD_VALUE); + } else { + yyassert($2<gIni->misc.lemmingAnimCount, "imask_ index", OUT_OF_BOUNDS); + gIni->misc.lemmingAnims[$2].imaskFrames = $4; + gIni->misc.lemmingAnims[$2].imaskDirs = $6; + } + } | NAME AFF STR { gIni->level.name = $3; } /* TODO : attention, si fichier levelpack, name n'est pas le nom d'unniveau */ /* levelpack.ini */ | MAXFALLDISTANCE AFF INT { @@ -235,7 +291,10 @@ int parse(gameIni_t *gIni) { callocIfNull((void **)&gIni->level.terrains, gIni->level.terrainCount, sizeof(struct levelItem)); callocIfNull((void **)&gIni->level.steels, gIni->level.steelCount, sizeof(struct levelItem)); + callocIfNull((void **)&gIni->misc.lemmingAnims, gIni->misc.lemmingAnimCount, sizeof(struct lemmingAnim)); + rewind(yyin); + yylineno=0; gIni->firstPass=0; yyparse(gIni); |