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