summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--misc/lemming.ini2
-rw-r--r--sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini16
-rw-r--r--sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy174
3 files changed, 143 insertions, 49 deletions
diff --git a/misc/lemming.ini b/misc/lemming.ini
index 88179c0..523a198 100644
--- a/misc/lemming.ini
+++ b/misc/lemming.ini
@@ -29,7 +29,7 @@ pos_1 = 16, 17, 8
lemm_2 = 8, 2, 0
pos_2 = 13, 23, 8
-# climber to walker, 8 frames, 2 dirs, once
+# climber to faller, 8 frames, 2 dirs, once
lemm_3 = 8, 2, 1
pos_3 = 14, 25, 8
diff --git a/sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini b/sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini
index e97a799..cdeb330 100644
--- a/sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini
+++ b/sdl-test/SDL_tuto/TestParserLemmingsLVL/lvlTest01.ini
@@ -17,19 +17,21 @@ style = brick
# Objects
# id, xpos, ypos, paint mode (), upside down (0,1)
# paint modes: 8=VIS_ON_TERRAIN, 4=NO_OVERWRITE, 0=FULL (only one value possible)
+object_0 = 7, 748, 86, 4 , 0
+#object_1 = 1, 350, 0, 4, 0
object_2 = 1, 600, 0, 4, 0
# Terrain
# id, xpos, ypos, modifier
# modifier: 8=NO_OVERWRITE, 4=UPSIDE_DOWN, 2=REMOVE (combining allowed, 0=FULL)
terrain_0 = 26, 300, 150, 0
-terrain_1 = 26, 364, 151, 0
-terrain_2 = 26, 428, 152, 0
-terrain_3 = 26, 492, 153, 0
-terrain_4 = 26, 556, 154, 0
-terrain_5 = 26, 620, 155, 0
-terrain_6 = 26, 684, 156, 0
-terrain_7 = 26, 748, 157, 0
+terrain_1 = 26, 364, 150, 0
+terrain_2 = 26, 428, 150, 0
+terrain_3 = 26, 492, 150, 0
+terrain_4 = 26, 556, 150, 0
+terrain_5 = 26, 620, 150, 0
+terrain_6 = 26, 684, 150, 0
+terrain_7 = 26, 748, 150, 0
terrain_8 = 46, 600, 0, 0
diff --git a/sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy b/sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy
index 26928e1..541abaa 100644
--- a/sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy
+++ b/sdl-test/SDL_tuto/TestParserLemmingsLVL/parse_ini.yy
@@ -54,6 +54,14 @@
#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;
//Blanc cursor
@@ -159,6 +167,13 @@
#define OTHER_LEM_JOB 3
#define LEM_JOB 20
#define MAX_LEM_FALL 3
+ #define FALLER_MAX 64
+ #define FLOATER_TO_FALLER 32
+ #define MAX_LEM_FLOATER 2
+ #define MAX_BUILD_BRICK 9
+ #define MAX_BUILD_END 3
+ #define MAX_JUMPER 8
+
enum eLemmingJob {
walker , faller , climber , climber_to_faller , floater ,
@@ -334,6 +349,8 @@
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 );
+
+ void putPixel(SDL_Surface *surface,Uint16 x,Uint16 y,Uint32 color);
void stateLemming(struct gameInit *gInit, SDL_Surface *s);
@@ -894,6 +911,40 @@ Uint32 get_pixel32( int x, int y, SDL_Surface *surface )
}
+void putPixel(SDL_Surface *surface,Uint16 x,Uint16 y,Uint32 color)
+{
+ /* bpp de la surface ecran */
+ Uint8 bpp = surface->format->BytesPerPixel;
+
+ /* pointeur vers le pixel a remplacer */
+ Uint8 *p = ((Uint8 *)surface->pixels) + y * surface->pitch + x * bpp;
+
+ switch(bpp)
+ {
+ case 1:
+ *p = (Uint8) color;
+ break;
+ case 2:
+ *(Uint16 *)p = (Uint16) color;
+ break;
+ case 3:
+ if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
+ {
+ *(Uint16 *)p = ((color >> 8) & 0xff00) | ((color >> 8) & 0xff);
+ *(p + 2) = color & 0xff;
+ }
+ else
+ {
+ *(Uint16 *)p = color & 0xffff;
+ *(p + 2) = ((color >> 16) & 0xff) ;
+ }
+ break;
+ case 4:
+ *(Uint32 *)p = color;
+ break;
+ }
+}
+
void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
struct listeSimplementChainee *unl;
@@ -903,12 +954,15 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
// [4] : 0:left, 1:right, 2:up, 3:down
// [7] : x0,weightGif,y0,henghtGif,id,anim,type
- int pixCtrlLem[2][4];
- // 0 : x, 1 : y
- // 4
+ int pixCtrlLem[2][5];
+ // line 0 : x, 1 : y
+ // pt 0-3 : 3
+ //[lemmingFoot] 2
+ // 0 1
+ // pt 4 : pt G lemming
- int i=0,j,d;
- int heightGif,weightGif,x0,y0;
+ int i=0,j,d,step=0;
+ int heightGif,weightGif,x0,y0,beginO,endO;
int heightLem,weightLem;
int min_up =-200;
int min_down = LEVEL_HEIGHT;
@@ -919,7 +973,7 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
unl=gInit->l.ll;
for(i=0;i<4;++i){
- for(j=0;j<4;++j){
+ for(j=0;j<7;++j){
coor[i][j]=909;
}
}
@@ -929,10 +983,12 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
sfT = gInit->mapI.map.tabGif[gInit->mapI.map.tiles*2 + gInit->mapI.map.tilesObjet*2 +gInit->mapI.map.tilesSteel +(unl->ID)*2+(unl->data.pl->dir) + ADD_OBJ];
// foot of lemming
- d= unl->y + gInit->mapI.lemmingDATA[unl->ID].footY;
+ d = unl->y + gInit->mapI.lemmingDATA[unl->ID].footY;
+
+
if(unl->data.pl->dir==1){//right
- i= unl->x + gInit->mapI.lemmingDATA[unl->ID].footX + gInit->mapI.lemmingDATA[unl->ID].footSize;
+ i= unl->x + gInit->mapI.lemmingDATA[unl->ID].footX + gInit->mapI.lemmingDATA[unl->ID].footSize - 1;
pixCtrlLem[0][0]= i;
pixCtrlLem[1][0]= d + 1 ;
@@ -948,7 +1004,7 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
} else {//left
- i = unl->x+(sfT->w-gInit->mapI.lemmingDATA[unl->ID].footX - gInit->mapI.lemmingDATA[unl->ID].footSize) ;
+ i = unl->x+(sfT->w-gInit->mapI.lemmingDATA[unl->ID].footX - gInit->mapI.lemmingDATA[unl->ID].footSize) + 1 ;
pixCtrlLem[0][0]= i ;
pixCtrlLem[1][0]= d + 1 ;
@@ -967,7 +1023,21 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
weightLem=sfT->w;
heightLem=sfT->h/(gInit->mapI.lemmingDATA[unl->ID].state);
-
+ pixCtrlLem[0][4]= unl->x + sfT->w/2;
+ pixCtrlLem[1][4]= unl->x + heightLem/2;
+ //for(i=0;i<4;++i){
+ // putPixel(pSpr_Lem,pixCtrlLem[0][0],pixCtrlLem[1][0] ,ccc_cyan);
+ // putPixel(pSpr_Lem,pixCtrlLem[0][1],pixCtrlLem[1][1] ,ccc_red);
+ // putPixel(pSpr_Lem,pixCtrlLem[0][2],pixCtrlLem[1][2] ,ccc_green);
+ // putPixel(pSpr_Lem,pixCtrlLem[0][3],pixCtrlLem[1][3] ,ccc_yellow);
+ //}
+/* // if(unl->data.pl->dir==1){
+ for(i=0;i<gInit->mapI.lemmingDATA[unl->ID].footSize;++i){
+ putPixel(pSpr_Lem,gInit->mapI.lemmingDATA[unl->ID].footX+unl->x+i,unl->y+gInit->mapI.lemmingDATA[unl->ID].footY,ccc_green);
+ }//} else {
+ for(i=gInit->mapI.lemmingDATA[unl->ID].footSize;i>0;--i){
+ putPixel(pSpr_Lem,unl->x+(sfT->w-gInit->mapI.lemmingDATA[unl->ID].footX - gInit->mapI.lemmingDATA[unl->ID].footSize)+i,unl->y+gInit->mapI.lemmingDATA[unl->ID].footY,ccc_red);
+ }//}*/
k=gInit->o.lo;
@@ -979,11 +1049,18 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
y0 = k->y;
heightGif = sfT->h/(gInit->mapI.map.tabDataSprO[k->ID].state);
+ if(k->data.po->UD==0){// Up==0 or Down==1 ?
+ beginO=y0;
+ endO=y0+heightGif;
+ } else {
+ beginO=y0-heightGif;
+ endO=y0;
+ }
// verif objet autour du lemming
// verif left and right
- if ((pixCtrlLem[1][2] >= y0)&&((pixCtrlLem[1][2]) <= (y0 + heightGif))){
+ if ((pixCtrlLem[1][2] >= beginO )&&(pixCtrlLem[1][2] <= endO )){
// verif left
if ((pixCtrlLem[0][2]) >= (x0 + weightGif)){
if (min_left <= (x0 + weightGif)){
@@ -992,7 +1069,7 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
coor[0][0]=x0;
coor[0][1]=weightGif;
coor[0][2]=y0;
- coor[0][3]=heightGif;
+ coor[0][3]=endO-y0;
coor[0][4]=k->ID;
coor[0][5]=gInit->mapI.map.tabDataSprO[k->ID].anim;
coor[0][6]=gInit->mapI.map.tabDataSprO[k->ID].type;
@@ -1006,7 +1083,7 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
coor[1][0]=x0;
coor[1][1]=weightGif;
coor[1][2]=y0;
- coor[1][3]=heightGif;
+ coor[1][3]=endO-y0;
coor[1][4]=k->ID;
coor[1][5]=gInit->mapI.map.tabDataSprO[k->ID].anim;
coor[1][6]=gInit->mapI.map.tabDataSprO[k->ID].type;
@@ -1017,28 +1094,28 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
// verif up and down
if ((pixCtrlLem[0][2] >= x0)&&((pixCtrlLem[0][2] ) <= (x0 + weightGif))){
// verif up
- if (unl->y >= (y0 + heightGif)){
- if (min_up <= (y0 + heightGif)){
- min_up = (y0 + heightGif);
+ if ( pixCtrlLem[1][2] >= endO){
+ if (min_up <= endO){
+ min_up = endO;
// printf("\t--> verif up\n");
coor[2][0]=x0;
coor[2][1]=weightGif;
coor[2][2]=y0;
- coor[2][3]=heightGif;
+ coor[2][3]=endO-y0;
coor[2][4]=k->ID;
coor[2][5]=gInit->mapI.map.tabDataSprO[k->ID].anim;
coor[2][6]=gInit->mapI.map.tabDataSprO[k->ID].type;
}
}
// verif down
- if ((pixCtrlLem[1][0]) <= y0) {
- if (min_down >= y0){
- min_down = y0;
+ if (pixCtrlLem[1][2] <= beginO) {
+ if (min_down >= beginO){
+ min_down = beginO;
//printf("\t--> verif down\n");
coor[3][0]=x0;
coor[3][1]=weightGif;
coor[3][2]=y0;
- coor[3][3]=heightGif;
+ coor[3][3]=endO-y0;
coor[3][4]=k->ID;
coor[3][5]=gInit->mapI.map.tabDataSprO[k->ID].anim;
coor[3][6]=gInit->mapI.map.tabDataSprO[k->ID].type;
@@ -1047,9 +1124,11 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
}
k=k->next;
}
-
+ for(i=0;i<4;++i){
+ printf("Objet %d : ID=%d, anim=%d, type=%d, (x0=%d,w=%d,y0=%d,h=%d)\n",i,coor[i][4],coor[i][5],coor[i][6],coor[i][0],coor[i][1],coor[i][2],coor[i][3]);
+ }
//test object collision
- for(i=0;i<4;++i){
+ for(i=0;i<4;++i){//foot lemming is on the half of trap
if( (pixCtrlLem[0][2] == ( coor[i][0] + (coor[i][1])/2 ))&&
(pixCtrlLem[1][2] <= ( coor[i][2] + (coor[i][3]) ))
){
@@ -1084,52 +1163,60 @@ void stateLemming(struct gameInit *gInit, SDL_Surface *surf ){
// changement state + test collision avec le terrain
-
- // test de test faller :
- //get_pixel32( event.motion.x, event.motion.y, screen );
+ // not saving and not dying
if((unl->ID != 9)&&(unl->ID != 8)){
+ // test de test faller :
- if (get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ) == gInit->mapI.map.cmap.bgColor ){
+ // test pixel under lemming foot
+
+ if ((step==0)&&(get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ) == gInit->mapI.map.cmap.bgColor )){
// tombe:
unl->ID=1;
- for(i=0;i<MAX_LEM_FALL;++i){
+ unl->y += 1;
+ for(i=1;i<MAX_LEM_FALL;++i){
if (get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] + i , surf ) == gInit->mapI.map.cmap.bgColor )
- { unl->y += 1;} else {break;}
+ {
+ unl->y += 1;
+ } else {break;}
}
- }
-
- // walker collision
- if (get_pixel32( pixCtrlLem[0][2] , pixCtrlLem[1][2] , surf ) != gInit->mapI.map.cmap.bgColor ){
- // tourne a gauche:
- unl->data.pl->dir=0;
+ step=1;
}
+
// walker collision
- if (get_pixel32( pixCtrlLem[0][2] , pixCtrlLem[1][2] , surf ) != gInit->mapI.map.cmap.bgColor ){
- // tourne a droite:
- unl->data.pl->dir=1;
+ if ((step==0)&&(get_pixel32( pixCtrlLem[0][2] , pixCtrlLem[1][2] , surf ) != gInit->mapI.map.cmap.bgColor )){
+ if(unl->data.pl->dir==0)
+ // turn on left:
+ { unl->data.pl->dir=1;}
+ // turn on right:
+ else {unl->data.pl->dir=0;}
}
// walker
- if (get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ) != gInit->mapI.map.cmap.bgColor ){
+ //printf("val pix test IN %d x=%d, y=%d\n",get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ),pixCtrlLem[0][0],pixCtrlLem[1][0]);
+ if ((step==0)&&(get_pixel32( pixCtrlLem[0][0] , pixCtrlLem[1][0] , surf ) != gInit->mapI.map.cmap.bgColor )){
// marche:
+ if(unl->ID==1){unl->y-=2;}//FIXME
unl->ID=0;
if(unl->data.pl->dir == 1){
unl->x += 1;
} else {
unl->x -= 1;
}
- break;
+ step=1;
}
+
// dans la map
if(pixCtrlLem[1][0] >= LEVEL_HEIGHT ){
// hors de la map => mort du lemming
unl->ID=17;
unl->data.pl->cptState = 0;
+
}
}
}
+ step=0;
unl=unl->next;
}
@@ -1738,6 +1825,11 @@ void creationLemming(struct gameInit *gInit){
int coorE[10][2];
int i=0;
//DEBUT TEST CREATION UN LEMMING
+
+ // DEBUT DEBUG: LEMMING COLLISION
+ gInit->mapI.paraMap[1]=1;
+ // FIN DEBUG: LEMMING COLLISION
+
nbLem=gInit->mapI.paraMap[1];
//nbLem=1;
//printf("nbLem %d\n",nbLem);
@@ -2394,7 +2486,7 @@ int main (int argc, char **argv)
sprintf(temp,"%s",argv[1]);
}
yyin=fopen(temp, "r");
- //yyin=fopen("./fichierTest.ini", "r");
+// yyin=fopen("./lvlTest01.ini", "r");
if (yyin==NULL) {
fprintf(stderr,"Filename INVALIDE: %s\n",temp);
perror("Impossible d'ouvrir le niveau"); exit(42); }