git » fp-git.git » commit ac5eca7

Falling flag. Tiles now supports back attribute.

author ecalot
2004-10-26 16:10:56 UTC
committer ecalot
2004-10-26 16:10:56 UTC
parent 3e4d0f49b0b1731819106f77be1993afa64bd058

Falling flag. Tiles now supports back attribute.

FP/src/conf/flags.conf +5 -4
FP/src/include/tiles.h +1 -1
FP/src/ker/kid.c +13 -1
FP/src/ker/object.c +13 -1
FP/src/ker/states.c +6 -9
FP/src/res/tiles.c +11 -3

diff --git a/FP/src/conf/flags.conf b/FP/src/conf/flags.conf
index 2d8125f..f41d926 100644
--- a/FP/src/conf/flags.conf
+++ b/FP/src/conf/flags.conf
@@ -1,8 +1,9 @@
-u go up a screen
-h go left
-j go right
-n go down
+#u go up a screen
+#h go left
+#j go right
+#n go down
 p press the floor
 c press the ceiling
 s make a sound
 g you hit the guard/kid
+f fall down
diff --git a/FP/src/include/tiles.h b/FP/src/include/tiles.h
index 25bba9e..e1d6499 100644
--- a/FP/src/include/tiles.h
+++ b/FP/src/include/tiles.h
@@ -35,7 +35,7 @@ tiles.h: FreePrince : Tile functions
 
 #include "tiles_conf.h"
 
-int isInGroup(unsigned char tile,short group);
+int isInGroup(unsigned char tile,unsigned char backtile,short group);
 
 #endif
 
diff --git a/FP/src/ker/kid.c b/FP/src/ker/kid.c
index 3223532..6645563 100644
--- a/FP/src/ker/kid.c
+++ b/FP/src/ker/kid.c
@@ -141,7 +141,19 @@ void kidDraw(tKid kid) {
 
 int kidMove(tKid* kid,tKey key,tRoom* room) {
 #ifdef NEW_KERNEL
-	return stateUpdate(&key,kid,room);
+	short flags;
+	flags=stateUpdate(&key,kid,room);
+	if (flags&STATES_FLAG_P)
+		mapPressedTile(
+			room->level,
+			roomGetTile(room,(kid->location/10)+1,kid->floor+1),
+			room->id,
+			(kid->location/TILE_W)+1,
+			kid->floor+1
+		);
+	if (flags&STATES_FLAG_F)
+		kid->floor++;
+	return flags;
 #else
 	int result;
 	tTile tile;
diff --git a/FP/src/ker/object.c b/FP/src/ker/object.c
index 3223532..6645563 100644
--- a/FP/src/ker/object.c
+++ b/FP/src/ker/object.c
@@ -141,7 +141,19 @@ void kidDraw(tKid kid) {
 
 int kidMove(tKid* kid,tKey key,tRoom* room) {
 #ifdef NEW_KERNEL
-	return stateUpdate(&key,kid,room);
+	short flags;
+	flags=stateUpdate(&key,kid,room);
+	if (flags&STATES_FLAG_P)
+		mapPressedTile(
+			room->level,
+			roomGetTile(room,(kid->location/10)+1,kid->floor+1),
+			room->id,
+			(kid->location/TILE_W)+1,
+			kid->floor+1
+		);
+	if (flags&STATES_FLAG_F)
+		kid->floor++;
+	return flags;
 #else
 	int result;
 	tTile tile;
diff --git a/FP/src/ker/states.c b/FP/src/ker/states.c
index 371e09d..fd0edda 100644
--- a/FP/src/ker/states.c
+++ b/FP/src/ker/states.c
@@ -5,10 +5,7 @@
 #include "kid.h" /* DIR_LEFT DIR_RIGHT */
 
 void debugShowFlag(short optionflag) {
-	if (optionflag&STATES_FLAG_U) printf("ScreenUp ");
-	if (optionflag&STATES_FLAG_H) printf("ScreenLeft ");
-	if (optionflag&STATES_FLAG_J) printf("ScreenRight ");
-	if (optionflag&STATES_FLAG_N) printf("ScreenDown ");
+	if (optionflag&STATES_FLAG_F) printf("Falling ");
 	if (optionflag&STATES_FLAG_P) printf("PressFloor ");
 	if (optionflag&STATES_FLAG_C) printf("PressCeiling ");
 	if (optionflag&STATES_FLAG_S) printf("Sound");
@@ -79,23 +76,23 @@ int evaluateCondition(int condition,tKey* key, tKid* kid, tRoom* room) {
 			STATES_CONDRESULT_TRUE:STATES_CONDRESULT_FALSE;
 	case esMapUp:
 		DefaultFalse(room);
-		return isInGroup(room->fore[thisTile-12],c.argument)?
+		return isInGroup(room->fore[thisTile-12],room->back[thisTile-12],c.argument)?
 			STATES_CONDRESULT_TRUE:STATES_CONDRESULT_FALSE;
 	case esMapDown:
 		DefaultFalse(room);
-		return isInGroup(room->fore[thisTile+12],c.argument)?
+		return isInGroup(room->fore[thisTile+12],room->back[thisTile+12],c.argument)?
 			STATES_CONDRESULT_TRUE:STATES_CONDRESULT_FALSE;
 	case esMapForward:
 		DefaultFalse(room);
-		return isInGroup(room->fore[thisTile+((kid->direction==DIR_LEFT)?-1:1)],c.argument)?
+		return isInGroup(room->fore[thisTile+((kid->direction==DIR_LEFT)?-1:1)],room->back[thisTile+((kid->direction==DIR_LEFT)?-1:1)],c.argument)?
 			STATES_CONDRESULT_TRUE:STATES_CONDRESULT_FALSE;
 	case esMapBack:
 		DefaultFalse(room);
-		return isInGroup(room->fore[thisTile+((kid->direction==DIR_LEFT)?1:-1)],c.argument)?
+		return isInGroup(room->fore[thisTile+((kid->direction==DIR_LEFT)?1:-1)],room->back[thisTile+((kid->direction==DIR_LEFT)?1:-1)],c.argument)?
 			STATES_CONDRESULT_TRUE:STATES_CONDRESULT_FALSE;
 	case esMapOn:
 		DefaultFalse(room);
-		return isInGroup(room->fore[thisTile],c.argument)?
+		return isInGroup(room->fore[thisTile],room->back[thisTile],c.argument)?
 			STATES_CONDRESULT_TRUE:STATES_CONDRESULT_FALSE;
 	case esForwardTileNearerThan:
 		DefaultFalse(kid);
diff --git a/FP/src/res/tiles.c b/FP/src/res/tiles.c
index 39ab8bf..17e5dbf 100644
--- a/FP/src/res/tiles.c
+++ b/FP/src/res/tiles.c
@@ -35,13 +35,21 @@ tiles.c: FreePrince : Tile functions
 
 #include "tiles_conf.h"
 
-int isInGroup(unsigned char tile,short group) {
+int isInGroup(unsigned char tile,unsigned char backtile,short group) {
 	static unsigned char tileList[]=TILES_GROUP_LIST;
 	unsigned char* i=tileList+group;
+	int docontinue;
 	tile=tile&0x1F; /* get the last 5 bits and clear the beginning */
 	tile++;
-	
-	while ((*i)&&(*i!=tile)) i++;
+	do {
+		docontinue=0;
+		while ((*i)&&(((*i)&0x7f)!=tile)) i++;
+		if ((*i)&0x80) {
+			i++;
+			if ((*i)==(backtile+1)) return 1;
+			docontinue=1;
+		}
+	} while (docontinue);
 	return *i; /* returns non-zero if true and zero if false */
 }