/* property values */
#define EP_AMOEBALIVE 0
#define EP_AMOEBOID 1
-#define EP_SCHLUESSEL 2
+#define EP_CAN_BE_CRUMBLED 2
#define EP_PFORTE 3
#define EP_SOLID 4
#define EP_INDESTRUCTIBLE 5
#define EP_COULD_MOVE 13
#define EP_DONT_TOUCH 14
#define EP_DONT_GO_TO 15
-#define EP_MAMPF2 16
-#define EP_CHAR 17
+#define EP_FOOD_DARK_YAMYAM 16
+#define EP_EM_SLIPPERY_WALL 17
#define EP_BD_ELEMENT 18
#define EP_SB_ELEMENT 19
#define EP_GEM 20
#define EP_INACTIVE 21
#define EP_EXPLOSIVE 22
-#define EP_MAMPF3 23
+#define EP_FOOD_PENGUIN 23
#define EP_PUSHABLE 24
#define EP_PLAYER 25
-#define EP_HAS_CONTENT 26
-#define EP_EATABLE 27
-#define EP_SP_ELEMENT 28
-#define EP_QUICK_GATE 29
+#define EP_WALKABLE_OVER 26
+#define EP_DIGGABLE 27
+#define EP_COLLECTIBLE 28
+#define EP_WALKABLE_THROUGH 29
#define EP_OVER_PLAYER 30
#define EP_ACTIVE_BOMB 31
#define EP_BELT 32
#define EP_BELT_ACTIVE 33
#define EP_BELT_SWITCH 34
-#define EP_TUBE 35
-#define EP_EM_SLIPPERY_WALL 36
-#define EP_CAN_BE_CRUMBLED 37
+#define EP_WALKABLE_UNDER 35
+#define EP_SP_ELEMENT 36
+#define EP_HAS_CONTENT 37
+#define EP_SOLID_NEW 38
-#define NUM_ELEMENT_PROPERTIES 38
+#define NUM_ELEMENT_PROPERTIES 39
#define NUM_EP_BITFIELDS ((NUM_ELEMENT_PROPERTIES + 31) / 32)
#define EP_BITFIELD_BASE 0
#define PROPERTY_BIT(p) (1 << ((p) % 32))
#define PROPERTY_VAR(e, p) (Properties[e][(p) / 32])
-#define PROPERTY_VALUE(e, p) (PROPERTY_VAR(e, p) & PROPERTY_BIT(p))
+#define HAS_PROPERTY(e, p) ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
#define SET_PROPERTY(e, p, v) ((v) ? \
(PROPERTY_VAR(e,p) |= PROPERTY_BIT(p)) : \
(PROPERTY_VAR(e,p) &= ~PROPERTY_BIT(p)))
/* property bit masks */
#define EP_BIT_AMOEBALIVE PROPERTY_BIT(EP_AMOEBALIVE)
#define EP_BIT_AMOEBOID PROPERTY_BIT(EP_AMOEBOID)
-#define EP_BIT_SCHLUESSEL PROPERTY_BIT(EP_SCHLUESSEL)
+#define EP_BIT_CAN_BE_CRUMBLED PROPERTY_BIT(EP_CAN_BE_CRUMBLED)
#define EP_BIT_PFORTE PROPERTY_BIT(EP_PFORTE)
#define EP_BIT_SOLID PROPERTY_BIT(EP_SOLID)
#define EP_BIT_INDESTRUCTIBLE PROPERTY_BIT(EP_INDESTRUCTIBLE)
#define EP_BIT_COULD_MOVE PROPERTY_BIT(EP_COULD_MOVE)
#define EP_BIT_DONT_TOUCH PROPERTY_BIT(EP_DONT_TOUCH)
#define EP_BIT_DONT_GO_TO PROPERTY_BIT(EP_DONT_GO_TO)
-#define EP_BIT_MAMPF2 PROPERTY_BIT(EP_MAMPF2)
-#define EP_BIT_CHAR PROPERTY_BIT(EP_CHAR)
+#define EP_BIT_FOOD_DARK_YAMYAM PROPERTY_BIT(EP_FOOD_DARK_YAMYAM)
+#define EP_BIT_EM_SLIPPERY_WALL PROPERTY_BIT(EP_EM_SLIPPERY_WALL)
#define EP_BIT_BD_ELEMENT PROPERTY_BIT(EP_BD_ELEMENT)
#define EP_BIT_SB_ELEMENT PROPERTY_BIT(EP_SB_ELEMENT)
#define EP_BIT_GEM PROPERTY_BIT(EP_GEM)
#define EP_BIT_INACTIVE PROPERTY_BIT(EP_INACTIVE)
#define EP_BIT_EXPLOSIVE PROPERTY_BIT(EP_EXPLOSIVE)
-#define EP_BIT_MAMPF3 PROPERTY_BIT(EP_MAMPF3)
+#define EP_BIT_FOOD_PENGUIN PROPERTY_BIT(EP_FOOD_PENGUIN)
#define EP_BIT_PUSHABLE PROPERTY_BIT(EP_PUSHABLE)
#define EP_BIT_PLAYER PROPERTY_BIT(EP_PLAYER)
-#define EP_BIT_HAS_CONTENT PROPERTY_BIT(EP_HAS_CONTENT)
-#define EP_BIT_EATABLE PROPERTY_BIT(EP_EATABLE)
-#define EP_BIT_SP_ELEMENT PROPERTY_BIT(EP_SP_ELEMENT)
-#define EP_BIT_QUICK_GATE PROPERTY_BIT(EP_QUICK_GATE)
+#define EP_BIT_WALKABLE_OVER PROPERTY_BIT(EP_WALKABLE_OVER)
+#define EP_BIT_DIGGABLE PROPERTY_BIT(EP_DIGGABLE)
+#define EP_BIT_COLLECTIBLE PROPERTY_BIT(EP_COLLECTIBLE)
+#define EP_BIT_WALKABLE_THROUGH PROPERTY_BIT(EP_WALKABLE_THROUGH)
#define EP_BIT_OVER_PLAYER PROPERTY_BIT(EP_OVER_PLAYER)
#define EP_BIT_ACTIVE_BOMB PROPERTY_BIT(EP_ACTIVE_BOMB)
-/* values for 'Properties2' */
#define EP_BIT_BELT PROPERTY_BIT(EP_BELT)
#define EP_BIT_BELT_ACTIVE PROPERTY_BIT(EP_BELT_ACTIVE)
#define EP_BIT_BELT_SWITCH PROPERTY_BIT(EP_BELT_SWITCH)
-#define EP_BIT_TUBE PROPERTY_BIT(EP_TUBE)
-#define EP_BIT_EM_SLIPPERY_WALL PROPERTY_BIT(EP_EM_SLIPPERY_WALL)
-#define EP_BIT_CAN_BE_CRUMBLED PROPERTY_BIT(EP_CAN_BE_CRUMBLED)
+#define EP_BIT_WALKABLE_UNDER PROPERTY_BIT(EP_WALKABLE_UNDER)
+#define EP_BIT_SP_ELEMENT PROPERTY_BIT(EP_SP_ELEMENT)
+#define EP_BIT_HAS_CONTENT PROPERTY_BIT(EP_HAS_CONTENT)
+#define EP_BIT_SOLID_NEW PROPERTY_BIT(EP_SOLID_NEW)
#define EP_BITMASK_DEFAULT 0
/* property macros */
-#define IS_AMOEBALIVE(e) PROPERTY_VALUE(e, EP_AMOEBALIVE)
-#define IS_AMOEBOID(e) PROPERTY_VALUE(e, EP_AMOEBOID)
-#define IS_SCHLUESSEL(e) PROPERTY_VALUE(e, EP_SCHLUESSEL)
-#define IS_PFORTE(e) PROPERTY_VALUE(e, EP_PFORTE)
-#define IS_SOLID(e) PROPERTY_VALUE(e, EP_SOLID)
-#define IS_INDESTRUCTIBLE(e) PROPERTY_VALUE(e, EP_INDESTRUCTIBLE)
-#define IS_SLIPPERY(e) PROPERTY_VALUE(e, EP_SLIPPERY)
-#define IS_ENEMY(e) PROPERTY_VALUE(e, EP_ENEMY)
-#define IS_MAUER(e) PROPERTY_VALUE(e, EP_MAUER)
-#define CAN_FALL(e) PROPERTY_VALUE(e, EP_CAN_FALL)
-#define CAN_SMASH(e) PROPERTY_VALUE(e, EP_CAN_SMASH)
-#define CAN_CHANGE(e) PROPERTY_VALUE(e, EP_CAN_CHANGE)
-#define CAN_MOVE(e) PROPERTY_VALUE(e, EP_CAN_MOVE)
-#define COULD_MOVE(e) PROPERTY_VALUE(e, EP_COULD_MOVE)
-#define DONT_TOUCH(e) PROPERTY_VALUE(e, EP_DONT_TOUCH)
-#define DONT_GO_TO(e) PROPERTY_VALUE(e, EP_DONT_GO_TO)
-#define IS_MAMPF2(e) PROPERTY_VALUE(e, EP_MAMPF2)
-#define IS_CHAR(e) PROPERTY_VALUE(e, EP_CHAR)
-#define IS_BD_ELEMENT(e) PROPERTY_VALUE(e, EP_BD_ELEMENT)
-#define IS_SB_ELEMENT(e) PROPERTY_VALUE(e, EP_SB_ELEMENT)
-#define IS_GEM(e) PROPERTY_VALUE(e, EP_GEM)
-#define IS_INACTIVE(e) PROPERTY_VALUE(e, EP_INACTIVE)
-#define IS_EXPLOSIVE(e) PROPERTY_VALUE(e, EP_EXPLOSIVE)
-#define IS_MAMPF3(e) PROPERTY_VALUE(e, EP_MAMPF3)
-#define IS_PUSHABLE(e) PROPERTY_VALUE(e, EP_PUSHABLE)
-#define ELEM_IS_PLAYER(e) PROPERTY_VALUE(e, EP_PLAYER)
-#define HAS_CONTENT(e) PROPERTY_VALUE(e, EP_HAS_CONTENT)
-#define IS_EATABLE(e) PROPERTY_VALUE(e, EP_EATABLE)
-#define IS_SP_ELEMENT(e) PROPERTY_VALUE(e, EP_SP_ELEMENT)
-#define IS_QUICK_GATE(e) PROPERTY_VALUE(e, EP_QUICK_GATE)
-#define IS_OVER_PLAYER(e) PROPERTY_VALUE(e, EP_OVER_PLAYER)
-#define IS_ACTIVE_BOMB(e) PROPERTY_VALUE(e, EP_ACTIVE_BOMB)
-
-#define IS_BELT(e) PROPERTY_VALUE(e, EP_BELT)
-#define IS_BELT_ACTIVE(e) PROPERTY_VALUE(e, EP_BELT_ACTIVE)
-#define IS_BELT_SWITCH(e) PROPERTY_VALUE(e, EP_BELT_SWITCH)
-#define IS_TUBE(e) PROPERTY_VALUE(e, EP_TUBE)
-#define IS_EM_SLIPPERY_WALL(e) PROPERTY_VALUE(e, EP_EM_SLIPPERY_WALL)
-#define CAN_BE_CRUMBLED(e) PROPERTY_VALUE(e, EP_CAN_BE_CRUMBLED)
+#define IS_AMOEBALIVE(e) HAS_PROPERTY(e, EP_AMOEBALIVE)
+#define IS_AMOEBOID(e) HAS_PROPERTY(e, EP_AMOEBOID)
+#define CAN_BE_CRUMBLED(e) HAS_PROPERTY(e, EP_CAN_BE_CRUMBLED)
+#define IS_PFORTE(e) HAS_PROPERTY(e, EP_PFORTE)
+#define IS_SOLID(e) HAS_PROPERTY(e, EP_SOLID)
+#define IS_INDESTRUCTIBLE(e) HAS_PROPERTY(e, EP_INDESTRUCTIBLE)
+#define IS_SLIPPERY(e) HAS_PROPERTY(e, EP_SLIPPERY)
+#define IS_ENEMY(e) HAS_PROPERTY(e, EP_ENEMY)
+#define IS_MAUER(e) HAS_PROPERTY(e, EP_MAUER)
+#define CAN_FALL(e) HAS_PROPERTY(e, EP_CAN_FALL)
+#define CAN_SMASH(e) HAS_PROPERTY(e, EP_CAN_SMASH)
+#define CAN_CHANGE(e) HAS_PROPERTY(e, EP_CAN_CHANGE)
+#define CAN_MOVE(e) HAS_PROPERTY(e, EP_CAN_MOVE)
+#define COULD_MOVE(e) HAS_PROPERTY(e, EP_COULD_MOVE)
+#define DONT_TOUCH(e) HAS_PROPERTY(e, EP_DONT_TOUCH)
+#define DONT_GO_TO(e) HAS_PROPERTY(e, EP_DONT_GO_TO)
+#define IS_FOOD_DARK_YAMYAM(e) HAS_PROPERTY(e, EP_FOOD_DARK_YAMYAM)
+#define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL)
+#define IS_BD_ELEMENT(e) HAS_PROPERTY(e, EP_BD_ELEMENT)
+#define IS_SB_ELEMENT(e) HAS_PROPERTY(e, EP_SB_ELEMENT)
+#define IS_GEM(e) HAS_PROPERTY(e, EP_GEM)
+#define IS_INACTIVE(e) HAS_PROPERTY(e, EP_INACTIVE)
+#define IS_EXPLOSIVE(e) HAS_PROPERTY(e, EP_EXPLOSIVE)
+#define IS_FOOD_PENGUIN(e) HAS_PROPERTY(e, EP_FOOD_PENGUIN)
+#define IS_PUSHABLE(e) HAS_PROPERTY(e, EP_PUSHABLE)
+#define ELEM_IS_PLAYER(e) HAS_PROPERTY(e, EP_PLAYER)
+#define IS_WALKABLE_OVER(e) HAS_PROPERTY(e, EP_WALKABLE_OVER)
+#define IS_DIGGABLE(e) HAS_PROPERTY(e, EP_DIGGABLE)
+#define IS_COLLECTIBLE(e) HAS_PROPERTY(e, EP_COLLECTIBLE)
+#define IS_WALKABLE_THROUGH(e) HAS_PROPERTY(e, EP_WALKABLE_THROUGH)
+#define IS_OVER_PLAYER(e) HAS_PROPERTY(e, EP_OVER_PLAYER)
+#define IS_ACTIVE_BOMB(e) HAS_PROPERTY(e, EP_ACTIVE_BOMB)
+
+#define IS_BELT(e) HAS_PROPERTY(e, EP_BELT)
+#define IS_BELT_ACTIVE(e) HAS_PROPERTY(e, EP_BELT_ACTIVE)
+#define IS_BELT_SWITCH(e) HAS_PROPERTY(e, EP_BELT_SWITCH)
+#define IS_WALKABLE_UNDER(e) HAS_PROPERTY(e, EP_WALKABLE_UNDER)
+#define IS_SP_ELEMENT(e) HAS_PROPERTY(e, EP_SP_ELEMENT)
+#define HAS_CONTENT(e) HAS_PROPERTY(e, EP_HAS_CONTENT)
+#define IS_SOLID_NEW(e) HAS_PROPERTY(e, EP_SOLID_NEW)
#define IS_CUSTOM_ELEMENT(e) ((e) >= EL_CUSTOM_START && \
(e) <= EL_CUSTOM_END)
#define PLAYERINFO(x,y) (&stored_player[StorePlayer[x][y]-EL_PLAYER_1])
#define SHIELD_ON(p) ((p)->shield_normal_time_left > 0)
-#define PROTECTED_FIELD(x,y) (IS_TUBE(Feld[x][y]))
+#define PROTECTED_FIELD(x,y) (IS_WALKABLE_UNDER(Feld[x][y]) && \
+ IS_INDESTRUCTIBLE(Feld[x][y]))
#define PLAYER_PROTECTED(x,y) (SHIELD_ON(PLAYERINFO(x, y)) || \
PROTECTED_FIELD(x, y))