summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLudovic Pouzenc <ludovic@pouzenc.fr>2010-11-18 21:12:10 +0000
committerLudovic Pouzenc <ludovic@pouzenc.fr>2010-11-18 21:12:10 +0000
commit1742d99de4ca6624570f2a06bbcf5797acd46772 (patch)
tree05553e6febcd3ba172b779188200ce540434d75c /src
parent895e96ddd85e36947c4048e31cde428fdb260664 (diff)
download2010-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.h3
-rw-r--r--src/parser/parse_ini.yy81
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 {