rnd-20030513-1-src
[rocksndiamonds.git] / src / main.h
index 2c7b84c3f40ff2610736974e80c192bb72c9d639..dc4b8fa33c248277a9cc89e18ef1e1b37eeae207 100644 (file)
@@ -68,8 +68,8 @@
 #define EP_UNUSED_4            4
 #define EP_INDESTRUCTIBLE      5
 #define EP_SLIPPERY            6
-#define EP_UNUSED_7            7
-#define EP_UNUSED_8            8
+#define EP_CAN_EXPLODE         7
+#define EP_CAN_MOVE            8
 #define EP_CAN_FALL            9
 #define EP_CAN_SMASH           10
 #define EP_WALKABLE_OVER       11
@@ -78,7 +78,7 @@
 #define EP_PASSABLE_OVER       14
 #define EP_PASSABLE_INSIDE     15
 #define EP_PASSABLE_UNDER      16
-#define EP_UNUSED_17           17
+#define EP_CHANGEABLE          17
 #define EP_UNUSED_18           18
 #define EP_UNUSED_19           19
 #define EP_UNUSED_20           20
 /* values for special configurable properties (depending on level settings) */
 #define EP_EM_SLIPPERY_WALL    25
 
+/* values for special graphics properties (no effect on game engine) */
+#define EP_CAN_BE_CRUMBLED     26
+
 /* values for pre-defined properties */
-#define EP_PLAYER              26
-#define EP_CAN_BE_CRUMBLED     27
-#define EP_CAN_MOVE            28
-#define EP_CAN_CHANGE          29
+#define EP_PLAYER              27
+#define EP_CAN_PASS_MAGIC_WALL 28
+#define EP_SWITCHABLE          29
 #define EP_DONT_TOUCH          30
 #define EP_ENEMY               31
 #define EP_DONT_GO_TO          32
-#define EP_EXPLOSIVE           33
-#define EP_BD_ELEMENT          34
-#define EP_SP_ELEMENT          35
-#define EP_SB_ELEMENT          36
-#define EP_GEM                 37
-#define EP_FOOD_DARK_YAMYAM    38
-#define EP_FOOD_PENGUIN                39
+#define EP_BD_ELEMENT          33
+#define EP_SP_ELEMENT          34
+#define EP_SB_ELEMENT          35
+#define EP_GEM                 36
+#define EP_FOOD_DARK_YAMYAM    37
+#define EP_FOOD_PENGUIN                38
+#define EP_FOOD_PIG            39
 #define EP_HISTORIC_WALL       40
 #define EP_HISTORIC_SOLID      41
 #define EP_BELT                        42
 #define EP_WALKABLE            55
 #define EP_PASSABLE            56
 #define EP_ACCESSIBLE          57
-#define EP_WALL                        58
-#define EP_SOLID_FOR_PUSHING   59
-#define EP_DRAGONFIRE_PROOF    60
-#define EP_EXPLOSION_PROOF     61
-#define NUM_ELEMENT_PROPERTIES 63
+#define EP_SNAPPABLE           58
+#define EP_WALL                        59
+#define EP_SOLID_FOR_PUSHING   60
+#define EP_DRAGONFIRE_PROOF    61
+#define EP_EXPLOSION_PROOF     62
+
+/* values for internal purpose only (level editor) */
+#define EP_WALK_TO_OBJECT      63
+
+#define NUM_ELEMENT_PROPERTIES 64
 
 #define NUM_EP_BITFIELDS       ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE       0
 #define EP_BITMASK_DEFAULT     0
 
 #define PROPERTY_BIT(p)                (1 << ((p) % 32))
-#define PROPERTY_VAR(e, p)     (Properties[e][(p) / 32])
-#define HAS_PROPERTY(e, p)     ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
-#define SET_PROPERTY(e, p, v)  ((v) ?                                     \
+#define PROPERTY_VAR(e,p)      (Properties[e][(p) / 32])
+#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)))
 
+
+/* values for change events for custom elements */
+#define CE_DELAY_FIXED         0
+#define CE_DELAY_RANDOM                1
+
+#define NUM_CHANGE_EVENTS      2
+
+#define CE_BITMASK_DEFAULT     0
+
+#define CUSTOM_ELEMENT_INFO(e) (level.custom_element[(e) - EL_CUSTOM_START])
+
+#define CH_EVENT_BIT(c)                (1 << (c))
+#define CH_EVENT_VAR(e)                (CUSTOM_ELEMENT_INFO(e).change.events)
+
+#define HAS_CHANGE_EVENT(e,c)  (IS_CUSTOM_ELEMENT(e) &&                  \
+                                (CH_EVENT_VAR(e) & CH_EVENT_BIT(c)) != 0)
+#define SET_CHANGE_EVENT(e,c,v)        (IS_CUSTOM_ELEMENT(e) ?                   \
+                                ((v) ?                                   \
+                                 (CH_EVENT_VAR(e) |=  CH_EVENT_BIT(c)) : \
+                                 (CH_EVENT_VAR(e) &= ~CH_EVENT_BIT(c))) : 0)
+
+
 /* macros for configurable properties */
 #define IS_DIGGABLE(e)         HAS_PROPERTY(e, EP_DIGGABLE)
 #define IS_COLLECTIBLE(e)      HAS_PROPERTY(e, EP_COLLECTIBLE)
 #define IS_INDESTRUCTIBLE(e)   HAS_PROPERTY(e, EP_INDESTRUCTIBLE)
 #define IS_SLIPPERY(e)         HAS_PROPERTY(e, EP_SLIPPERY)
+#define CAN_EXPLODE(e)         HAS_PROPERTY(e, EP_CAN_EXPLODE)
+#define CAN_MOVE(e)            HAS_PROPERTY(e, EP_CAN_MOVE)
 #define CAN_FALL(e)            HAS_PROPERTY(e, EP_CAN_FALL)
 #define CAN_SMASH(e)           HAS_PROPERTY(e, EP_CAN_SMASH)
 #define IS_WALKABLE_OVER(e)    HAS_PROPERTY(e, EP_WALKABLE_OVER)
 #define IS_PASSABLE_INSIDE(e)  HAS_PROPERTY(e, EP_PASSABLE_INSIDE)
 #define IS_PASSABLE_UNDER(e)   HAS_PROPERTY(e, EP_PASSABLE_UNDER)
 #define IS_PUSHABLE(e)         HAS_PROPERTY(e, EP_PUSHABLE)
+#define IS_CHANGEABLE(e)       HAS_PROPERTY(e, EP_CHANGEABLE)
 
 /* macros for special configurable properties */
 #define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL)
 
+/* macros for special graphics properties */
+#define CAN_BE_CRUMBLED(e)     HAS_PROPERTY(GFX_ELEMENT(e),EP_CAN_BE_CRUMBLED)
+
 /* macros for pre-defined properties */
 #define ELEM_IS_PLAYER(e)      HAS_PROPERTY(e, EP_PLAYER)
-#define CAN_BE_CRUMBLED(e)     HAS_PROPERTY(e, EP_CAN_BE_CRUMBLED)
-#define CAN_MOVE(e)            HAS_PROPERTY(e, EP_CAN_MOVE)
-#define CAN_CHANGE(e)          HAS_PROPERTY(e, EP_CAN_CHANGE)
+#define CAN_PASS_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_MAGIC_WALL)
+#define IS_SWITCHABLE(e)       HAS_PROPERTY(e, EP_SWITCHABLE)
 #define DONT_TOUCH(e)          HAS_PROPERTY(e, EP_DONT_TOUCH)
 #define IS_ENEMY(e)            HAS_PROPERTY(e, EP_ENEMY)
 #define DONT_GO_TO(e)          HAS_PROPERTY(e, EP_DONT_GO_TO)
-#define IS_EXPLOSIVE(e)                HAS_PROPERTY(e, EP_EXPLOSIVE)
 #define IS_BD_ELEMENT(e)       HAS_PROPERTY(e, EP_BD_ELEMENT)
 #define IS_SP_ELEMENT(e)       HAS_PROPERTY(e, EP_SP_ELEMENT)
 #define IS_SB_ELEMENT(e)       HAS_PROPERTY(e, EP_SB_ELEMENT)
 #define IS_GEM(e)              HAS_PROPERTY(e, EP_GEM)
 #define IS_FOOD_DARK_YAMYAM(e) HAS_PROPERTY(e, EP_FOOD_DARK_YAMYAM)
 #define IS_FOOD_PENGUIN(e)     HAS_PROPERTY(e, EP_FOOD_PENGUIN)
+#define IS_FOOD_PIG(e)         HAS_PROPERTY(e, EP_FOOD_PIG)
 #define IS_HISTORIC_WALL(e)    HAS_PROPERTY(e, EP_HISTORIC_WALL)
 #define IS_HISTORIC_SOLID(e)   HAS_PROPERTY(e, EP_HISTORIC_SOLID)
 #define IS_BELT(e)             HAS_PROPERTY(e, EP_BELT)
 #define IS_ACCESSIBLE_OVER(e)  HAS_PROPERTY(e, EP_ACCESSIBLE_OVER)
 #define IS_ACCESSIBLE_INSIDE(e)        HAS_PROPERTY(e, EP_ACCESSIBLE_INSIDE)
 #define IS_ACCESSIBLE_UNDER(e) HAS_PROPERTY(e, EP_ACCESSIBLE_UNDER)
+#define IS_SNAPPABLE(e)                HAS_PROPERTY(e, EP_SNAPPABLE)
 #define IS_WALKABLE(e)         HAS_PROPERTY(e, EP_WALKABLE)
 #define IS_PASSABLE(e)         HAS_PROPERTY(e, EP_PASSABLE)
 #define IS_ACCESSIBLE(e)       HAS_PROPERTY(e, EP_ACCESSIBLE)
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&      \
                                 (e) <= EL_CUSTOM_END)
 
+#define GFX_ELEMENT(e)         (IS_CUSTOM_ELEMENT(e) &&                  \
+                                CUSTOM_ELEMENT_INFO(e).use_gfx_element ? \
+                                CUSTOM_ELEMENT_INFO(e).gfx_element : e)
+
 #define IS_PLAYER(x,y)         (ELEM_IS_PLAYER(StorePlayer[x][y]))
 
 #define IS_FREE(x,y)           (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x,y))
 #define IS_LOOP_SOUND(s)       (sound_info[s].loop)
 
 
-#if 0
-
-/* Bitmaps with graphic file */
-#define PIX_BACK               0
-#define PIX_DOOR               1
-#define PIX_TOONS              2
-#define PIX_FONT_BIG           3
-#define PIX_FONT_SMALL         4
-#define PIX_FONT_MEDIUM                5
-#define PIX_FONT_EM            6
-/* Bitmaps without graphic file */
-#define PIX_DB_DOOR            7
-#define PIX_DB_FIELD           8
-
-#define NUM_PICTURES           7
-#define NUM_BITMAPS            9
-
-#else
-
-/* Bitmaps with graphic file */
-#define PIX_BACK               0
-#define PIX_ELEMENTS           1
-#define PIX_DOOR               2
-#define PIX_HEROES             3
-#define PIX_TOONS              4
-#define PIX_SP                 5
-#define PIX_DC                 6
-#define PIX_MORE               7
-#define PIX_FONT_BIG           8
-#define PIX_FONT_SMALL         9
-#define PIX_FONT_MEDIUM                10
-#define PIX_FONT_EM            11
-/* Bitmaps without graphic file */
-#define PIX_DB_DOOR            12
-#define PIX_DB_FIELD           13
-
-#define NUM_PICTURES           12
-#define NUM_BITMAPS            14
-
-#endif
-
 /* boundaries of arrays etc. */
 #define MAX_LEVEL_NAME_LEN     32
 #define MAX_LEVEL_AUTHOR_LEN   32
 #define MAX_TAPELEN            (1000 * 50)     /* max. time * framerate */
 #define MAX_SCORE_ENTRIES      100
-#if 0
-#define MAX_ELEMENTS           700             /* 500 static + 200 runtime */
-#define MAX_GRAPHICS           1536            /* see below: NUM_TILES */
-#endif
 #define MAX_NUM_AMOEBA         100
 
 /* values for elements with content */
@@ -1025,6 +1019,32 @@ struct PlayerInfo
   int shield_deadly_time_left;
 };
 
+struct CustomElementChangeInfo
+{
+  unsigned long events;                /* bitfield for change events */
+
+  int delay_fixed;             /* added frame delay before changed (fixed) */
+  int delay_random;            /* added frame delay before changed (random) */
+  int delay_frames;            /* either 1 (frames) or 50 (seconds; 50 fps) */
+
+  short successor;             /* new custom element after change */
+};
+
+struct CustomElementInfo
+{
+  boolean use_gfx_element;
+  short gfx_element;           /* optional custom graphic element */
+
+  int move_direction;          /* direction movable element moves to */
+
+  int walk_to_action;          /* only for level editor; not stored */
+  int walkable_layer;          /* only for level editor; not stored */
+
+  int content[3][3];           /* new elements after explosion */
+
+  struct CustomElementChangeInfo change;
+};
+
 struct LevelInfo
 {
   int file_version;    /* file format version the level is stored with    */
@@ -1041,8 +1061,8 @@ struct LevelInfo
   char name[MAX_LEVEL_NAME_LEN + 1];
   char author[MAX_LEVEL_AUTHOR_LEN + 1];
   int score[LEVEL_SCORE_ELEMENTS];
-  int yam_content[MAX_ELEMENT_CONTENTS][3][3];
-  int num_yam_contents;
+  int yamyam_content[MAX_ELEMENT_CONTENTS][3][3];
+  int num_yamyam_contents;
   int amoeba_speed;
   int amoeba_content;
   int time_magic_wall;
@@ -1053,7 +1073,7 @@ struct LevelInfo
   boolean gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
 
-  short custom_element_successor[NUM_CUSTOM_ELEMENTS];
+  struct CustomElementInfo custom_element[NUM_CUSTOM_ELEMENTS];
 
   boolean no_level_file;
 };
@@ -1100,7 +1120,7 @@ struct GameInfo
   int initial_move_delay_value;
 
   /* variable within running game */
-  int yam_content_nr;
+  int yamyam_content_nr;
   boolean magic_wall_active;
   int magic_wall_time_left;
   int light_time_left;