rnd-20030416-1-src
[rocksndiamonds.git] / src / main.h
index d92af3dcbc4342dd34aa68af4d45fd5513922ee4..6e46f348e52bb8a531acd74c74bd45484554a0c4 100644 (file)
@@ -63,7 +63,7 @@
 /* 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))