diff options
author | Damien Appert <dappert> | 2010-11-06 16:39:10 +0000 |
---|---|---|
committer | Damien Appert <dappert> | 2010-11-06 16:39:10 +0000 |
commit | 539abec71ab6e9706169ed854892551b7104beb3 (patch) | |
tree | 872c402f22d959c9fd7eb71529dd2f452eb69a45 | |
parent | cc5506a3ebc3a033c39d9ec9782ad9cbba56c8d1 (diff) | |
download | 2010-netlemmings-539abec71ab6e9706169ed854892551b7104beb3.tar.gz 2010-netlemmings-539abec71ab6e9706169ed854892551b7104beb3.tar.bz2 2010-netlemmings-539abec71ab6e9706169ed854892551b7104beb3.zip |
Copie des fichiers du lex/bison, remise en forme du .lex. Totu est à faire dans le .yy
git-svn-id: file:///var/svn/2010-netlemmings/trunk@139 077b3477-7977-48bd-8428-443f22f7bfda
-rw-r--r-- | src/parser/parse_ini.lex | 122 | ||||
-rw-r--r-- | src/parser/parse_ini.yy | 1030 |
2 files changed, 1152 insertions, 0 deletions
diff --git a/src/parser/parse_ini.lex b/src/parser/parse_ini.lex new file mode 100644 index 0000000..6a376f9 --- /dev/null +++ b/src/parser/parse_ini.lex @@ -0,0 +1,122 @@ +%{ +#include "y.tab.h" +#include <string.h> +#define MAX_STR_LEN 255 + + int string(int tok) { + int lg = strlen(yytext); + if ( lg > MAX_STR_LEN ) { + return LEXERROR; + } else { + yylval.str = malloc(sizeof(char)*(lg+1)); + strcpy(yylval.str, yytext); + return tok; + } + } +%} + +%option nounput +%option noyywrap + +BLANK [ \t] +NOT_BLANK [^ \t] +IDENT [a-zA-Z][a-zA-Z0-9_-]* +NUMBER "-"?[0-9]+ +COMMENT "#"[^\n]* + + /* + %s : inclusive start condition (inclus aussi les règles sans <cond>) + %x : exclusive start condition (règles sans <cond> inactives) + */ +%x INI_VALUE +%x STR_M +%x STR_MM +%% + +"=" { + BEGIN(INI_VALUE); + return AFF; + } + +<INI_VALUE>\n { + yylineno++; + BEGIN(INITIAL); + return EOL; + } + +<INI_VALUE>{NUMBER}{BLANK}*{COMMENT}? + { + yylval.num = atoi(yytext); + return INT; + } + +<INI_VALUE>"," { + return VIR; + } + +"style" { + BEGIN(STR_M); + return STYLE; + } + +"name" { + BEGIN(STR_M); + return NAME; + } + +"superlemming" { + BEGIN(STR_M); + return SLEM; + } + +"bgColor"i { + BEGIN(STR_M); + return BGCOLOR; + } + +"debrisColor" { + BEGIN(STR_M); + return DEBRISCOLOR; + } + +"particleColor" { + BEGIN(STR_M); + return PARTICLECOLOR; + } + +<STR_M>{BLANK}*"="{BLANK}* + { + BEGIN(STR_MM); + return AFF; + } + +<STR_M>{BLANK}* +<STR_MM>{BLANK}* + +<STR_MM>{BLANK}*[^\n]* + { + BEGIN(INITIAL); + return string(STR); + } + +<STR_MM>\n { + yylineno++; + BEGIN(INITIAL); + return EOL; + } + +{IDENT} { + return string(IDENT); + } + +"#"[^\n]*\n { yylineno++; } /* Single line Comment*/ +\r /* http://fr.wikipedia.org/wiki/Fin_de_ligne : CRLF*/ +\n { yylineno++; return EOL; } + +{BLANK}* /* Ignore */ + +{NOT_BLANK} { /* Pour tout ce qu'on a pas encore chopé */ + fprintf(stderr, "LEX : ERROR : unknown char '%c'", yytext[0]); + return LEXERROR; + } + diff --git a/src/parser/parse_ini.yy b/src/parser/parse_ini.yy new file mode 100644 index 0000000..cba649c --- /dev/null +++ b/src/parser/parse_ini.yy @@ -0,0 +1,1030 @@ +%{ +#include "y.tab.h" + +#include "SDL/SDL.h" +#include "SDL/SDL_image.h" + +#include <sys/types.h> +#include <dirent.h> + +#include <stdio.h> +#include <stdlib.h> + + /** time per frame in microseconds - this is the timing everything else is based on */ +#define FPS 150 + /** redraw animated level obejcts every 3rd frame (about 100ms) */ +#define ANIM_STEP_FPS 3 + + // the original formula is: release lemming every 4+(99-speed)/2 time steps + // where one step is 60ms (3s/50) or 66ms (4s/60). + // Lemmini runs at 30ms/33ms, so the term has to be multiplied by 2 + // 8+(99-releaseRate) should be correct + //releaseBase = 8 + (99 - releaseRate); + + extern FILE *yyin; + + const int TIME_WAIT_TRAP_START = 15000; // milliseconde + + const int INTERFACE_HEIGHT = 150;//200; + //Les attributs de l'écran (640 * 480) + const int SCREEN_WIDTH = 800;//1280 + const int SCREEN_HEIGHT = 500; // 480 //SCREEN_HEIGHT = LEVEL_HEIGHT + INTERFACE_HEIGHT + 30; + const int SCREEN_BPP = 32; + + //MINIMAP + /* +#define MINIMAP_X0 420 //636 +#define MINIMAP_Y0 365 +#define MINIMAP_MX 210 //464 +#define MINIMAP_MY 48 //120*/ + +#define MINIMAP_X0 420 +#define MINIMAP_Y0 325 +#define MINIMAP_MX 350 +#define MINIMAP_MY 175 + + const int INTER_BUTTON_X = 0; + const int INTER_BUTTON_Y = 50; + + //Les dimensions du niveau + const int LEVEL_WIDTH = 1664*2; + const int LEVEL_HEIGHT = 160*2; + + // Decale le tableau d'objet + //0: lemmfont.gif + //1: numfont.gif + //2: countdown.gif + //3: cursor.gif + //4: explode.gif + //5: border.gif + //6: replay.gif + //7: select.gif + //8: font7x10.bmp + //9: alphabet.gif + + //10: mask_10.gif + //11: mask_11.gif + //12: mask_6.gif + //13: mask_13.gif + //14: mask_14.gif + //15: mask_15.gif + //16: imask_13.gif + //17: imask_14.gif + //18: imask_15.gif +#define NBR_ADD_OBJ 19 + //9-21 : icone_XX.gif +#define NBR_BUTTON_LEMMING 13 + const int ADD_OBJ = NBR_ADD_OBJ + NBR_BUTTON_LEMMING; + + //cyan pixel color + Uint32 ccc_cyan= 0x00ffff; + //yellow pixel color + Uint32 ccc_yellow = 0xffff00; + //Red pixel color + Uint32 ccc_red= 0xff0000; + //green pixel color + Uint32 ccc_green= 0x00ff00; + // erase surface; + Uint32 ccc_black= 0x000000; + + // gimp + Uint32 ccc_gimp = 0xffffff; + + //Blanc cursor + Uint32 ccc_cursor = 0x000000; + //Noir colorKeyGif + Uint32 ccc_keyGif = 0x000000; + // lemming color + Uint32 ccc_lemming = 0x001a82; + + // object color + // terrain + Uint32 ccc_tRemove = 0x007f00ff; // Violet + Uint32 ccc_tRemoveNoOverwrite = 0x009932cd; // Lilas + Uint32 ccc_tFull = 0xff38b0de; // Ciel d'été + Uint32 ccc_tNoOverwrite = 0xff0000ff; // bleu + Uint32 ccc_tHidden = 0xff236b8e; // Bleu Acier + + // after conversion + // destructible => brick + Uint32 ccc_tBrick = 0x00edaa;//0x00ed4f; // vert + // empty => bgStencil + Uint32 ccc_bgStencil = 0x000000; + // steel + // indestructible => steel + Uint32 ccc_s = 0xff00aa;//0xff00ff;//rose bonbon + + // object + Uint32 ccc_oPassive = 0x6b8ebb;//0x6b8e23; // Vert olive clair + + Uint32 ccc_oNoDigLeft = 0xff7fbb;//0xff7f00; // Thé + Uint32 ccc_oNoDigRight = 0xd987bb;//0xd98719; // Ocre + + Uint32 ccc_oTrapDrown = 0x7fffbb;//0x7fff00;// Vert de Hooker + Uint32 ccc_oTrapAndNoLem = 0x8c17bb;//0x8c1717; // Ecarlate + Uint32 ccc_oTrapAndLem = 0xa62abb;//0xa62a2a; // Brun + + Uint32 ccc_oExit = 0xd9d9bb;//0xd9d919; // Blond + Uint32 ccc_oEntry = 0x855ebb;//0x855e42; // Bronze + + Uint32 ccc_oUnknow = 0xffffbb;//0xffffff; // Blanc + + + // error + Uint32 ccc_error = 0x666669; + + // lemming + Uint32 ccc_lWalk_on = 0xffddcc; + + Uint32 ccc_lStopper = 0xffffcb; + + Uint32 ccc_lStopperLeft = 0xffbbcb; + Uint32 ccc_lStopperRight = 0xffcccb; + + + + + // Config Cam + const int CAM_VITESSE = 8; + const int BOUND_SENSIBILITE = 50; + + + + //Les surfaces + + SDL_Surface *pTerrain = NULL; //Fond avec juste la map + SDL_Surface *pSpr_Lem = NULL; // Fond + lemmings + animations + SDL_Surface *screen = NULL; // Ecran via la caméra + SDL_Surface *pStencil= NULL; // Ecran Stencil + SDL_Surface *pStencilFixe= NULL; // Ecran Stencil Fixe + + struct list_int { + int val; + struct list_int *next; + }; + + struct val { + int type; + union ptr_u { char * str; struct list_int *ints;} ptr; + }; + + //DEBUT NEW CONCEPTION + + // DEBUT: MAP_STRUCTURE +#define NBR_STYLE_MAP 11 +#define PARTICULE_COUNT 16 + + enum eMapStyle { + brick , bubble , crystal , dirt , fire , marble , + pillar , rock , snow , special, undefined + }; + + char tabString_eMapStyle[NBR_STYLE_MAP][10] = { + "brick" , "bubble" , "crystal" , "dirt" , "fire" , "marble" , + "pillar" , "rock" , "snow" , "special", "undefined" + }; + + struct colorMap { + Uint32 bgColor;// background color present in "style".ini + Uint32 debrisColor;// debris color present in "style".ini + Uint32* particleColor; //particle color present in "style".ini + }; + + struct spriteObjet { + // ID == Objet.ID + int state; // number of state in terraino_XX.gif; + + // animation types + // 0 - don't animate + // 1 - animate continously + // 2 - trap - animate on trigger - else show first pic + // 3 - entry animation: animate once at level start + int anim; + + // object types + // 0 - passive + // 3 - no digging to the left + // 4 - no digging to the right + // 5 - trap which makes lemmings drown (water/quick sand/mud) + // 6 - trap which replaces lemming with death animation + // 7 - trap which triggers lemming death animation + // 8 - exit + // 32 - entry + int type; + + int sound; // numero of sound + }; + + struct mapStyle { + enum eMapStyle style; // map' style + int superLemming; // off = 0; on = 1; + int tiles; // number of terrain_XX.gif present in "style".ini + int tilesObjet; //number of terraino_XX.gif + int tilesSteel; // number of terrainom_XX.gif + + struct colorMap cmap; // level's info's color + + struct spriteObjet* tabDataSprO; // sprite'data ; default=NULL; + SDL_Surface **tabGif; // all gif are stored in; default=NULL; + }; + // FIN: MAP_STRUCTURE + + // DEBUT: LEMMINGS_STRUCTURE + // LEM_JOB == lemm_XX.gif + + +#define MAX_LEM_FALL 3 +#define MAX_LEM_FALL_FLOATER 2 +#define FALLER_MAX 126 +#define FLOATER_TO_FALLER 32 +#define MAX_LEM_FLOATER 2 + + /** a jumper moves up two pixels per frame */ +#define MAX_JUMPER_STEP 2 + /** if a walker jumps up 6 pixels, it becomes a jumper */ +#define MAX_JUMPER_JUMP 4 +#define MAX_BUILD_BRICK 9 +#define MAX_BUILD_END 3 + +#define WALKER_OBSTACLE_HEIGHT 14 +#define FALLER_STEP 3 +#define FLOATER_STEP 2 +#define FALL_DISTANCE_FALL 8 +#define FALL_DISTANCE_FORCE_FALL 2 * FALL_DISTANCE_FALL +#define FALL_DISTANCE_FLOAT 32 +#define JUMPER_STEP 2 +#define WALKER_STEP 1 +#define CLIMBER_STEP 1 +#define BASHER_FALL_DISTANCE 6 +#define STEPS_WARNING 9 +#define STEPS_MAX 12 + +#define LEM_JOB 17 + //0: walker + //1: faller + //2: climber + //3: climber_to_walker + //4: floater + //5: splat + //6: stopper + //7: drowning + //8: trap_death + //9: exIt + //10: bomber + //11: builder + //12: builder_end + //13: digger + //14: basher + //15: miner + //16: jumper +#define OTHER_LEM_JOB 6 + //17: died + //18: enter + //19: safe + //20: nuke + //21: bomber_stopper + //22: floater_start +#define TOTAL_LEM_JOB LEM_JOB + OTHER_LEM_JOB + + + enum eLemmingJob { + walker , faller , climber , climber_to_walker , floater , + splat , stopper , drowning , trap_death , exIt , bomber, + builder , builder_end , digger , basher , miner , jumper , + died , enter , safe , nuke , bomber_stopper , floater_start + }; + + char tabString_eLemmingJob[TOTAL_LEM_JOB][20] = { + "walker" , "faller" , "climber" , "climber_to_walker" , "floater" , + "splat" , "stopper" , "drowning" , "trap_death" , "exIt" , "bomber", + "builder" , "builder_end , digger" , "basher" , "miner" , "jumper", + "died" , "enter" , "safe" , "nuke", "bomber_stopper", "floater_start" + }; + + struct lemmingMask { + // ID == lemming.ID; + int stateM; // number of state in mask_XX.gif; + int dirM; // number of direction + int cooldown; // after <cooldown> animations of lemming animation, do mask action and increase mask frame idx + }; + + struct lemmingImask { + // ID == lemming.ID; + int stateI; // number of state in imask_XX.gif; + int dirI; // number of direction + }; + + struct lemmingJobAndSprite { + // ID == lemming.ID; + int state; // number of state in lemm_XX.gif; + int dir; // direction of lemming: 0=left(do FlipLR); 1=right; default=1; + int anim; // animation type: 0=loop, 1=once (state change if finished); + + // foot: director 's foot for collision 's test + // calcul the X' symetry if lemming.dir==0(left) + int footX; // position X of right's lemming's foot; + int footY; // position Y of right's lemming's foot; + int footSize; // size of lemming's foot; + + // mask for screen ... + struct lemmingMask* mask; // mask of this job; default=NULL; + struct lemmingImask* imask; // imask of this job; default=NULL; + }; + // FIN: LEMMINGS_STRUCTURE + + // DEBUT: INFOMAP +#define IDENT_COUNT 12 + + enum eParaMap { + releaseRate,numLemmings,numToRescue,timeLimit, + numClimbers,numFloaters,numBombers,numBlockers,numBuilders, + numBashers,numMiners,numDiggers + }; + + char tabString_eParaMap[IDENT_COUNT][32] = { + "releaseRate","numLemmings","numToRescue","timeLimit", + "numClimbers","numFloaters","numBombers","numBlockers", + "numBuilders","numBashers","numMiners","numDiggers" + }; + + struct infoMap { + char* name; // map name; default=NULL; + int paraMap[IDENT_COUNT]; // some parameter of this map + int xPos; // camera started position + int MaxFallDistance; // max pixel lemming fall before died;default=0; + int nuke; // hiroshima= 1; default =0; + int nbrEntry; // number of entry in this map; default=0; + struct mapStyle map; // map + struct lemmingJobAndSprite *lemmingDATA; // DATA of lemmingJob; default=NULL; + }; + // FIN: INFOMAP + + // DEBUT: GAMEINIT + struct paraTerrain { + int modif; //modifier: 8=NO_OVERWRITE, 4=UPSIDE_DOWN, 2=REMOVE (combining allowed, 0=FULL); + }; + + struct paraObjet { + int UD; // upside down (0,1); + int paintMode;// paint modes: 8=VIS_ON_TERRAIN, 4=NO_OVERWRITE, 0=FULL (only one value possible) + int cptState; // count number of frame for an animation at once, default=0; + }; + + struct paraSteel { + int w;// weight + int h;// height + }; + + struct paraLemming { + int dir; // direction of lemming; default=1; + int climber; // skill climber; default = 0; + int blocker; // skill blocker; default = 0; + int bomber; // skill bomber; default = -1; + int floater; // skill floater; default = 0; + int nuke; // nuked or not; default=0; + int cptFall; // count number of pixel when lemming falling;default = 0; + int cptFall2;// count number of pixel when lemming falling;default = 0; + int cptJump; // count number of pixel when lemming jumping;default = 0; + int cptBrick; // count number of brick ;default = 0; + int cptBoom; // count number of boom ;default = -1; + int cptState; // count number of frame for an animation at once, default=0; + }; + + struct listeSimplementChainee { + int ID; // ID for tabGif; + int x; // x position; + int y; // y position; + + union listeDataType { + struct paraTerrain *pt; // other para about terrain; default=NULL; + struct paraObjet *po; // other para about objet; default=NULL; + struct paraSteel *ps; // other para about steel; default=NULL; + struct paraLemming *pl; // other para about lemming; default=NULL; + } data; + + struct listeSimplementChainee *next;// default=NULL; + }; + + struct terrain { + int nbr; // number of terrain on this map; default=0; + struct listeSimplementChainee *lt; // list of terrain; default=NULL; + }; + + struct objet { + int nbr; // number of objet on this map; default=0; + struct listeSimplementChainee *lo; // list of objet; default=NULL; + }; + + struct steel { + int nbr; // number of steel on this map; default=0; + struct listeSimplementChainee *ls; // list of steel; default=NULL; + }; + + struct lemming { + int nbrInput; // number of lemming will be create; default=0; + int nbr; // number of lemming on this map; default=0; + int nbrDied; // number of lemming Died on this map; default=0; + int nbrSafe; // number of lemming Saved on this map; default=0; + struct listeSimplementChainee *ll; // list of lemming; default=NULL; + }; + + // game use some cpt +#define NBR_CPT 20 + + struct gameInit { + struct infoMap mapI; // all DATA of the map; + struct terrain t; // all DATA of terrain on this map; + struct objet o; // all DATA of objet on this map; + struct steel s; // all DATA of steel on this map; + struct lemming l; // all DATA of lemming on this map; + // 0-13 : BUTTON_LEMMING state button 0: off; 1: on; + // 14 : CURSOR STATE + // 15 : FREE CPT: for all need it ...; default=0; + // 16 : NBR_ENTRY OPEN; default=0; + // 17 : clic on mouse on lemning skill; default=-1; + // 18 : clic on mouse on lemning;default=0; + int cptGame[NBR_CPT]; // default=0; + }; + // FIN: GAMEINIT + + //FIN NEW CONCEPTION + + enum sens { UD , LR }; + + extern int yylineno; // Bidouille pour avoir le numero de ligne du lexer ^^ + + int yylex(); + void yyerror(struct gameInit *gInit, char *s); + + SDL_Surface *load_image( char* filename, Uint32 cbg ); + + // void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip ); + + int init(); + + SDL_Surface* flipSurfaceUD_LR(SDL_Surface* src, enum sens sensO, Uint32 c); + + int load_fields(char *folder, struct gameInit *gInit, int tabnum[255] ); + + int afficher(struct gameInit *gInit); + + int load_files(struct gameInit *gInit); + + int clean_up(); + + int anim_objet(int typeS, int typeO, int cptFps, int frames, int *cpt, struct gameInit *gInit);// returne le state de l'oblet a afficher + + Uint32 get_pixel32( int x, int y, SDL_Surface *surface ); + + int putPixel(SDL_Surface *surface,Uint16 x,Uint16 y,Uint32 color); + + int checkPixelDOWN(int nbr, int x, int y ); + + int checkPixelUP(int nbr, int x, int y, int size ); + + int outOfLowerMap(int y); + + int aboveGround(int x, int y); + + int midY(int y, int size); + + int reachedPlateau(int x, int y, int size, int dir); + + int stencilMid(int x, int y); + + int turnedByStopper(int x, int y, int dir); + + int explode(int x, int y, int size); + + int stateLemming(struct gameInit *gInit); + + int ereasePx(int x,int y,SDL_Surface *s,Uint32 bgColor); + + struct listeSimplementChainee* rev_listeO (struct listeSimplementChainee* liste); + + int initGame(struct gameInit *gInit); + + int creationLemming(struct gameInit *gInit); + + int paint_terrain (struct gameInit *gInit, int choix); + + int paint_manip(SDL_Surface *spr,SDL_Rect from,SDL_Surface *t,SDL_Rect to,Uint32 ccc_t, Uint32 ccc_spr, int mode, SDL_Surface *stencil); + + int paint_objet (struct gameInit *gInit, int cptFps); + + int paint_objet_stencil (struct gameInit *gInit, int cptFps); + + int supprLem (struct gameInit *gInit, int cptFps); + + int paint_lemming (struct gameInit *gInit, int cptFps); + + int test_O_UD(int UD); + + Uint32 string_to_Uint32 (char* c, int taille); + + Uint32* tab_of_string_to_Uint32 (char* c, int taille); + + int paint_letters (char* text); + + int findTerrain( struct gameInit *gInit,int x, int y, int x0); + + int paint_cursor(SDL_Surface *dst1,SDL_Surface *dst2, SDL_Surface *src, int x, int y, int x0, struct gameInit *gInit); + + int print_num(SDL_Surface *dst, SDL_Surface *font, int x, int y, int value); + + int print_alpha(SDL_Surface *dst, SDL_Surface *src, int x, int y, char* msg); + + int paint_bomber(int x,int y,int xMax,SDL_Surface *cooldown,SDL_Surface *dst,int cpt); + + int testAlpha(SDL_Surface *dst, SDL_Surface *src,SDL_Surface *src2, int x, int y); + + int legende (struct gameInit *gInit); + + int paint_interface(struct gameInit *gInit); + + int giveSkill (struct gameInit *gInit, struct listeSimplementChainee* k, int skill ); + + int mouse_action (struct gameInit *gInit, int x, int y, int camX , int camY); + + int lancement(); + + int test_blit(SDL_Surface *spr,SDL_Rect* from,SDL_Surface *t,SDL_Rect* to); + + int test_FillRect( SDL_Surface *t, SDL_Rect *to, Uint32 ccc); + + int miniMap (SDL_Surface *s, int x0, int y0, float coefX, float coefY); + + int paint_stencil=0; + + %} + + %parse-param { struct gameInit *gInit } + + %union {char* str; int num; struct list_int *ints; struct val *val;} + + %token LEXERROR + %token STYLE + %token NAME + %token SLEM + %token BGCOLOR + %token DEBRISCOLOR + %token PARTICLECOLOR + %token AFF + %token XC + %token EOL + %token VIR + %token <str> IDENT + %token <str> STR + %token <num> INT + + %type <ints> extra_vals + %type <val> val + + %start ini + + %% + + ini: + | ini decl + | ini EOL + + decl: STYLE AFF val { + int ok=0; + enum eMapStyle s; // STYLE + ////-DEBUG-printf("Le style\n"); + if ( $3->type != 0 ) { + //-DEBUG-printf("ERREUR: Fichier .ini corrompu (style n'est pas de style int)\n"); + } else { + s=0; + while(s<NBR_STYLE_MAP){ + + if ( (strcmp($3->ptr.str,"undefined")!=0)&& + (strcmp($3->ptr.str,tabString_eMapStyle[s]) == 0 ) ){ + + ok=2; + gInit->mapI.map.style=s; + break; + } + ++s; + } + if (ok!=2) { + // BUG ... + //-DEBUG-printf("Style [%s] invalide (undefined) !!\n",$3->ptr.str); + exit(2); + } + } + } +| NAME AFF val { + ////-DEBUG-printf("Le name \n"); + gInit->mapI.name=$3->ptr.str; //FIXME +} +| SLEM AFF val { + int res=99; + ////-DEBUG-printf("Le superlemming \n"); + if(strcmp($3->ptr.str,"true")==0){ + res = 1; + } + if(strcmp($3->ptr.str,"false")==0){ + res = 0; + } + if(res!=99){ + gInit->mapI.map.superLemming=res; + } else { + //-DEBUG-printf("superlemming value invalid: %d %s\n",res,$3->ptr.str); + exit(1); + } +} +| BGCOLOR AFF val { + //-DEBUG-printf("BGCOLOR XC\n"); + gInit->mapI.map.cmap.bgColor = string_to_Uint32($3->ptr.str,6); +} +| DEBRISCOLOR AFF val { + //-DEBUG-printf("DEBRISCOLOR XC\n"); + gInit->mapI.map.cmap.debrisColor = string_to_Uint32($3->ptr.str,6); +} +| PARTICLECOLOR AFF val { + gInit->mapI.map.cmap.particleColor=tab_of_string_to_Uint32($3->ptr.str,6); +} +| IDENT AFF val EOL { + enum eParaMap t; // parameter of this map + int i=0,state=0; + // cette variable sert a derteminer dans quel cas on se trouve + + // lvl*.ini => fichier de conf des d'une map de lemming + // state==0: aucun token detecter + // state==1: token para de la map detecter + // state==2: token xPos detecter + // state==3: token terrain_ detecter + // state==4: token object_ detecter + // state==5: token steel_ detecter + + // style.ini => fichire de conf des objets animes + // state==6: token frames_ detecter + // state==7: token anim_ detecter + // state==8: token type_ detecter + // state==9: token sound_ detecter + + // state==10: token title detecter FIXME + + // lemming.ini => fichier de conf des lemmings + // state==11: token lemm_ detecter + // state==12: token pos_ detecter + // state==13: token mask_ detecter + // state==14: token imask_ detecter + + // liste terrain || objet || steel + struct listeSimplementChainee **listeItem=NULL; + + ////-DEBUG-printf("'%s' ^\n ", $1); + // donne les parametres de la map + t=0; + while(t<IDENT_COUNT){ + if (strcmp($1,tabString_eParaMap[t]) == 0 ){ + state=1; + gInit->mapI.paraMap[t]=$3->ptr.ints->val; + break; + } + ++t; + } + if (state!=1){ + + if (strcmp($1,"xPos") == 0){ + state=2; + gInit->mapI.xPos=$3->ptr.ints->val; + } + + if(strncmp($1,"terrain_",8) == 0){ + state=3; + // init terrain + if(gInit->t.lt==NULL){ + gInit->t.nbr=0; + + } else { + gInit->t.nbr+=1; + } + listeItem=&gInit->t.lt; + } + + if(strncmp($1,"object_",7) == 0){ + state=4; + // init objet + if(gInit->o.lo==NULL){ + gInit->o.nbr=0; + } else { + gInit->o.nbr+=1; + } + listeItem=&gInit->o.lo; + } + + if(strncmp($1,"steel_",6) == 0){ + state=5; + // init steel + if(gInit->s.ls==NULL){ + gInit->s.nbr=0; + } else { + gInit->o.nbr+=1; + } + listeItem=&gInit->s.ls; + } + + + // Sprite Objet + if(strncmp($1,"frames_",7) == 0){ + state=6; + // 1ER CAS + if(gInit->mapI.map.tilesObjet == 0){//-DEBUG-printf("ERREUR: tilesObjet == 0 => exit to prevent a segFault\n"); + exit(4); + } + if(gInit->mapI.map.tabDataSprO == NULL){ + gInit->mapI.map.tabDataSprO= malloc((sizeof(struct spriteObjet))*(gInit->mapI.map.tilesObjet)); + gInit->cptGame[15] = -1; + } + gInit->cptGame[15] +=1; + gInit->mapI.map.tabDataSprO[gInit->cptGame[15]].state=$3->ptr.ints->val; + } + + if(strncmp($1,"anim_",5) == 0){ + state=7; + gInit->mapI.map.tabDataSprO[gInit->cptGame[15]].anim=$3->ptr.ints->val; + } + + if(strncmp($1,"type_",5) == 0){ + state=8; + gInit->mapI.map.tabDataSprO[gInit->cptGame[15]].type=$3->ptr.ints->val; + } + + if(strncmp($1,"sound_",6) == 0){ + state=9; + gInit->mapI.map.tabDataSprO[gInit->cptGame[15]].sound=$3->ptr.ints->val; + } + // "style".ini + if(strncmp($1,"tiles",5) == 0){ + state=10; + if($3->ptr.ints->val!=gInit->mapI.map.tiles){ + //-DEBUG-printf("BUG: variable parse && nbrFichier are different %d waiting and %d found\n",$3->ptr.ints->val,gInit->mapI.map.tiles); + exit(2); + } + //gInit->mapI.map.tiles=$3->ptr.ints->val; + } + + // lemming .ini + if(strncmp($1,"lemm_",5)==0){ + state=11; + // PREMIER CAS + if(gInit->mapI.lemmingDATA == NULL){ + // 1ER CAS + gInit->mapI.lemmingDATA=malloc((sizeof(struct lemmingJobAndSprite))*LEM_JOB); + gInit->cptGame[15] = -1; + } + gInit->cptGame[15] +=1; + gInit->mapI.lemmingDATA[gInit->cptGame[15]].mask=NULL; + gInit->mapI.lemmingDATA[gInit->cptGame[15]].imask=NULL; + } + + if(strncmp($1,"pos_",4)==0){ + state=12; + } + + if(strncmp($1,"mask_",5)==0){ + state=13; + gInit->mapI.lemmingDATA[gInit->cptGame[15]].mask=malloc(sizeof(struct lemmingMask)); + } + + if(strncmp($1,"imask_",6)==0){ + state=14; + gInit->mapI.lemmingDATA[gInit->cptGame[15]].imask=malloc(sizeof(struct lemmingImask)); + } + + if((state>2 && state<6)||(state>10 && state<15)){ + struct list_int *curr=$3->ptr.ints; + + struct listeSimplementChainee *k = malloc(sizeof(struct listeSimplementChainee)); + + //k->data.pt=NULL; + + + //i=0; + switch(state){ + // 3: terrain + case 3 : {i=0;k->data.pt=malloc(sizeof(struct paraTerrain));break;} + // 4: objet + case 4 : { + i=4; + k->data.po=malloc(sizeof(struct paraObjet)); + k->data.po->cptState=0; + break; + } + // 5 : steel + case 5 : {i=9;k->ID=0;k->data.ps=malloc(sizeof(struct paraSteel));break;} + + case 11 : {i=13;break;} + case 12 : {i=16;break;} + case 13 : {i=19;break;} + case 14 : {i=22;break;} + // en cas de BUG + default: //-DEBUG-printf("BUG parser: state = %d\n",state); + exit(6); + } + + while (curr!=NULL) { + // //-DEBUG-printf("%i ", curr->val); + switch(i) { + // pour les terrains + case 0: k->ID=curr->val; break; + case 3: k->x=curr->val; break; + case 2: k->y=curr->val; break; + case 1: { + k->data.pt->modif=curr->val; + switch(k->data.pt->modif){ + case 0: + case 2: + case 4: + case 6: + case 8: + case 10: + case 12: + case 14: + case 15: + break; + default: printf("Erreur valeur interdite pour modif Terrain %d\n",k->data.pt->modif);exit (9); + } + break; + } + // pour les objets + case 4: k->ID=curr->val; if(k->ID==1){++gInit->mapI.nbrEntry;} break; + case 8: k->x=curr->val; break; + case 7: k->y=curr->val; break; + case 6: { + k->data.po->paintMode=curr->val; + switch(k->data.po->paintMode){ + case 0: + case 2: + case 4: + case 8: + break; + default: printf("Erreur valeur interdite pour paint Objet %d\n",k->data.po->paintMode);exit (19); + } + break; + } + case 5: { + k->data.po->UD = curr->val; + if((k->data.po->UD!=0)&&(k->data.po->UD!=1)){ + printf("Erreur valeur interdite pour UD Objet %d\n",k->data.po->UD); + exit (29); + } + break; + } + // pour les steels + case 9: k->x=curr->val; break; + case 12: k->y=curr->val; break; + case 11: k->data.ps->w = curr->val; break; + case 10: k->data.ps->h = curr->val; break; + // pour les lemmings + // lemm_ + case 13: gInit->mapI.lemmingDATA[gInit->cptGame[15]].state=curr->val;break; + case 15: gInit->mapI.lemmingDATA[gInit->cptGame[15]].dir=curr->val;break; + case 14: gInit->mapI.lemmingDATA[gInit->cptGame[15]].anim=curr->val;break; + // pos_ + case 16: gInit->mapI.lemmingDATA[gInit->cptGame[15]].footX=curr->val;break; + case 18: gInit->mapI.lemmingDATA[gInit->cptGame[15]].footY=curr->val;break; + case 17: gInit->mapI.lemmingDATA[gInit->cptGame[15]].footSize=curr->val;break; + // mask_ + case 19: gInit->mapI.lemmingDATA[gInit->cptGame[15]].mask->stateM=curr->val;break; + case 21: gInit->mapI.lemmingDATA[gInit->cptGame[15]].mask->dirM=curr->val;break; + case 20: gInit->mapI.lemmingDATA[gInit->cptGame[15]].mask->cooldown=curr->val;break; + // imask_ + case 22: gInit->mapI.lemmingDATA[gInit->cptGame[15]].imask->stateI=curr->val;break; + case 23: gInit->mapI.lemmingDATA[gInit->cptGame[15]].imask->dirI=curr->val;break; + // en cas de BUG + default: //-DEBUG-printf("BUG parser i = %d\n",i); + exit(7); + } + curr=curr->next; + ++i; + } + // fichier lvl*.ini + if(state>2 && state<6){ + k->next=*listeItem; + *listeItem=k; + } + //free(curr); + } else { + + if(state == 0) { + //-DEBUG-printf("BUG: no parse for this token : %s \n",$1); + exit(8); + } + } + } // FIN ok==0 +} + +val: INT extra_vals { + // //-DEBUG-printf("creation de liste int ... \n"); + $$=malloc(sizeof(struct val)); + $$->type=1; + $$->ptr.ints=malloc(sizeof(struct list_int)); + $$->ptr.ints->val=$1; + $$->ptr.ints->next=$2; + // //-DEBUG-printf("liste int %d\n",$1); + } +| STR { + // //-DEBUG-printf("creation de liste STR ...\n"); + $$=malloc(sizeof(struct val)); + $$->type=0; + + $$->ptr.str=malloc(sizeof(char)*strlen($1)+1); + strcpy($$->ptr.str, $1); + // //-DEBUG-printf("liste STR %s\n",$1); +} +extra_vals: { $$=NULL; } +| extra_vals VIR INT { //FIXME : => VIR INT extra_vals + $$=malloc(sizeof(struct list_int)); + $$->val=$3; + $$->next=$1; +} + +%% + +void yyerror(struct gameInit *gInit, char *s) +{ + //fprintf(stderr, "Syntax Error : '%s' at l%d,c%d-l%d,c%d\n", s, @$.first_column, @$.last_line, @$.last_column); // Nécessite l'option %locations et un lexer qui va bien + fprintf(stderr, "(stdin):%i: error: %s\n", yylineno, s); + exit(9); +} + +#include "fonctions_integrees.c" +#include "fonctions_non_integrees.c" + + +int main (int argc, char **argv) +{ + int res,i,num,lt; + char *temp,*temp0; + //Uint32 ctest; + //int j,k; + //argc=3; + //argv[1]="1"; + //argv[2]="72"; + if (argc<2 || argc>3) { + fprintf(stderr, "Usage %s [Option] <Filename>\n",argv[0]); + fprintf(stderr,"\nOption:\n\t- 1: on se place dans le dossier 1_orig\n"); + fprintf(stderr,"\t- 2: on se place dans le dossier 2_ohno\n"); + fprintf(stderr,"\t- 3: on se place dans le dossier 3_test\n"); + fprintf(stderr,"Filename:\n\t- numero du lvl (ex: 1, 4, 13, 65b )\n"); + return(44); + } + if (argc==3) { + i=1; + num=atoi(argv[2]); + if (num >= 10) ++i; + if (num >= 100) ++i; + if (num >= 1000){ + fprintf(stderr,"Too many lvl (%d > 999)\n",num); + return(45); + } + temp0=malloc(sizeof(char)*(3-i));// => [00] [0] [] + switch(i){ + case 1 : temp0 = "00";break; + case 2 : temp0 = "0";break; + case 3 : temp0 = "";break; + default:fprintf(stderr,"BUG: i[=%d] > 3 ERREUR\n",i);return(46); + } + + lt = (strlen("../../../../trunk/level/1_orig/lvl.ini")+5);// + 4 : 4 chiffres lvl.ini, +1 : string + temp=malloc(sizeof(char)*lt); + switch(atoi(argv[1])){ + case 1 : sprintf(temp,"../../../../trunk/level/1_orig/lvl0%s%d.ini",temp0,num);break; + case 2 : sprintf(temp,"../../../../trunk/level/2_ohno/lvl1%s%d.ini",temp0,num);break; + case 3 : sprintf(temp,"../../../../trunk/level/3_test/lvl2%s%d.ini",temp0,num);break; + default:fprintf(stderr,"ERREUR: dossier [%d] inconnu\n",atoi(argv[1]));return(47); + } + } else { + temp=malloc(sizeof(char)*(strlen(argv[1])+1)); + sprintf(temp,"%s",argv[1]); + } + yyin=fopen(temp, "r"); + //yyin=fopen("./lvlTest01.ini", "r"); + if (yyin==NULL) { + fprintf(stderr,"Filename INVALIDE: %s\n",temp); + perror("Impossible d'ouvrir le niveau"); return(48); } + + /* + for(i=0;i<256;++i){ + for(j=0;j<256;++j){ + for(k=0;k<256;++k){ + ctest = ((i<<16 | j<<8 | k) & 0xffffff); + //-DEBUG-printf("[i]=%d, R = %X G = %X B = %X\n", + i, ((ctest>>16) & 0xff), + ((ctest>>8) & 0xff), + (ctest & 0xff) ); + }}}*/ + + res=lancement(); + printf("code retour %d\n",res); + //fclose(yyin); fait dans lancement + + return res; + +} + + |