rnd-20030428-1-src
[rocksndiamonds.git] / src / main.h
index 69d8e51bac8ab17c32094a81b4773f10f3aa2491..69f758a0ed50a1a4e86ad6a9c030fa566926971a 100644 (file)
 #define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2)
 #define IN_LEV_FIELD(x,y) ((x)>=0 && (x)<lev_fieldx && (y)>=0 &&(y)<lev_fieldy)
 
-/* values for 'Properties1' */
-#define EP_BIT_AMOEBALIVE      (1 << 0)
-#define EP_BIT_AMOEBOID                (1 << 1)
-#define EP_BIT_SCHLUESSEL      (1 << 2)
-#define EP_BIT_PFORTE          (1 << 3)
-#define EP_BIT_SOLID           (1 << 4)
-#define EP_BIT_INDESTRUCTIBLE  (1 << 5)
-#define EP_BIT_SLIPPERY                (1 << 6)
-#define EP_BIT_ENEMY           (1 << 7)
-#define EP_BIT_MAUER           (1 << 8)
-#define EP_BIT_CAN_FALL                (1 << 9)
-#define EP_BIT_CAN_SMASH       (1 << 10)
-#define EP_BIT_CAN_CHANGE      (1 << 11)
-#define EP_BIT_CAN_MOVE                (1 << 12)
-#define EP_BIT_COULD_MOVE      (1 << 13)
-#define EP_BIT_DONT_TOUCH      (1 << 14)
-#define EP_BIT_DONT_GO_TO      (1 << 15)
-#define EP_BIT_MAMPF2          (1 << 16)
-#define EP_BIT_CHAR            (1 << 17)
-#define EP_BIT_BD_ELEMENT      (1 << 18)
-#define EP_BIT_SB_ELEMENT      (1 << 19)
-#define EP_BIT_GEM             (1 << 20)
-#define EP_BIT_INACTIVE                (1 << 21)
-#define EP_BIT_EXPLOSIVE       (1 << 22)
-#define EP_BIT_MAMPF3          (1 << 23)
-#define EP_BIT_PUSHABLE                (1 << 24)
-#define EP_BIT_PLAYER          (1 << 25)
-#define EP_BIT_HAS_CONTENT     (1 << 26)
-#define EP_BIT_EATABLE         (1 << 27)
-#define EP_BIT_SP_ELEMENT      (1 << 28)
-#define EP_BIT_QUICK_GATE      (1 << 29)
-#define EP_BIT_OVER_PLAYER     (1 << 30)
-#define EP_BIT_ACTIVE_BOMB     (1 << 31)
-
-/* values for 'Properties2' */
-#define EP_BIT_BELT            (1 << 0)
-#define EP_BIT_BELT_ACTIVE     (1 << 1)
-#define EP_BIT_BELT_SWITCH     (1 << 2)
-#define EP_BIT_TUBE            (1 << 3)
-#define EP_BIT_EM_SLIPPERY_WALL        (1 << 4)
-#define EP_BIT_CAN_BE_CRUMBLED (1 << 5)
+/* values for configurable properties (custom elem's only, else pre-defined) */
+#define EP_DIGGABLE            0
+#define EP_COLLECTIBLE         1
+#define EP_UNUSED_2            2
+#define EP_UNUSED_3            3
+#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_FALL            9
+#define EP_CAN_SMASH           10
+#define EP_WALKABLE_OVER       11
+#define EP_WALKABLE_INSIDE     12
+#define EP_WALKABLE_UNDER      13
+#define EP_PASSABLE_OVER       14
+#define EP_PASSABLE_INSIDE     15
+#define EP_PASSABLE_UNDER      16
+#define EP_UNUSED_17           17
+#define EP_UNUSED_18           18
+#define EP_UNUSED_19           19
+#define EP_UNUSED_20           20
+#define EP_UNUSED_21           21
+#define EP_UNUSED_22           22
+#define EP_UNUSED_23           23
+#define EP_PUSHABLE            24
+
+/* values for special configurable properties (depending on level settings) */
+#define EP_EM_SLIPPERY_WALL    25
+
+/* values for pre-defined properties */
+#define EP_PLAYER              26
+#define EP_CAN_BE_CRUMBLED     27
+#define EP_CAN_MOVE            28
+#define EP_CAN_PASS_MAGIC_WALL 29
+#define EP_DONT_TOUCH          30
+#define EP_ENEMY               31
+#define EP_DONT_GO_TO          32
+#define EP_CAN_EXPLODE         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_FOOD_PIG            40
+#define EP_HISTORIC_WALL       41
+#define EP_HISTORIC_SOLID      42
+#define EP_BELT                        43
+#define EP_BELT_ACTIVE         44
+#define EP_BELT_SWITCH         45
+#define EP_TUBE                        46
+#define EP_KEYGATE             47
+#define EP_AMOEBOID            48
+#define EP_AMOEBALIVE          49
+#define EP_HAS_CONTENT         50
+#define EP_ACTIVE_BOMB         51
+#define EP_INACTIVE            52
+
+/* values for derived properties (determined from properties above) */
+#define EP_ACCESSIBLE_OVER     53
+#define EP_ACCESSIBLE_INSIDE   54
+#define EP_ACCESSIBLE_UNDER    55
+#define EP_WALKABLE            56
+#define EP_PASSABLE            57
+#define EP_ACCESSIBLE          58
+#define EP_WALL                        59
+#define EP_SOLID_FOR_PUSHING   60
+#define EP_DRAGONFIRE_PROOF    61
+#define EP_EXPLOSION_PROOF     62
+
+#define NUM_ELEMENT_PROPERTIES 63
+
+#define NUM_EP_BITFIELDS       ((NUM_ELEMENT_PROPERTIES + 31) / 32)
+#define EP_BITFIELD_BASE       0
 
 #define EP_BITMASK_DEFAULT     0
 
-#define IS_AMOEBALIVE(e)       (Properties1[e] & EP_BIT_AMOEBALIVE)
-#define IS_AMOEBOID(e)         (Properties1[e] & EP_BIT_AMOEBOID)
-#define IS_SCHLUESSEL(e)       (Properties1[e] & EP_BIT_SCHLUESSEL)
-#define IS_PFORTE(e)           (Properties1[e] & EP_BIT_PFORTE)
-#define IS_SOLID(e)            (Properties1[e] & EP_BIT_SOLID)
-#define IS_INDESTRUCTIBLE(e)   (Properties1[e] & EP_BIT_INDESTRUCTIBLE)
-#define IS_SLIPPERY(e)         (Properties1[e] & EP_BIT_SLIPPERY)
-#define IS_ENEMY(e)            (Properties1[e] & EP_BIT_ENEMY)
-#define IS_MAUER(e)            (Properties1[e] & EP_BIT_MAUER)
-#define CAN_FALL(e)            (Properties1[e] & EP_BIT_CAN_FALL)
-#define CAN_SMASH(e)           (Properties1[e] & EP_BIT_CAN_SMASH)
-#define CAN_CHANGE(e)          (Properties1[e] & EP_BIT_CAN_CHANGE)
-#define CAN_MOVE(e)            (Properties1[e] & EP_BIT_CAN_MOVE)
-#define COULD_MOVE(e)          (Properties1[e] & EP_BIT_COULD_MOVE)
-#define DONT_TOUCH(e)          (Properties1[e] & EP_BIT_DONT_TOUCH)
-#define DONT_GO_TO(e)          (Properties1[e] & EP_BIT_DONT_GO_TO)
-#define IS_MAMPF2(e)           (Properties1[e] & EP_BIT_MAMPF2)
-#define IS_CHAR(e)             (Properties1[e] & EP_BIT_CHAR)
-#define IS_BD_ELEMENT(e)       (Properties1[e] & EP_BIT_BD_ELEMENT)
-#define IS_SB_ELEMENT(e)       (Properties1[e] & EP_BIT_SB_ELEMENT)
-#define IS_GEM(e)              (Properties1[e] & EP_BIT_GEM)
-#define IS_INACTIVE(e)         (Properties1[e] & EP_BIT_INACTIVE)
-#define IS_EXPLOSIVE(e)                (Properties1[e] & EP_BIT_EXPLOSIVE)
-#define IS_MAMPF3(e)           (Properties1[e] & EP_BIT_MAMPF3)
-#define IS_PUSHABLE(e)         (Properties1[e] & EP_BIT_PUSHABLE)
-#define ELEM_IS_PLAYER(e)      (Properties1[e] & EP_BIT_PLAYER)
-#define HAS_CONTENT(e)         (Properties1[e] & EP_BIT_HAS_CONTENT)
-#define IS_EATABLE(e)          (Properties1[e] & EP_BIT_EATABLE)
-#define IS_SP_ELEMENT(e)       (Properties1[e] & EP_BIT_SP_ELEMENT)
-#define IS_QUICK_GATE(e)       (Properties1[e] & EP_BIT_QUICK_GATE)
-#define IS_OVER_PLAYER(e)      (Properties1[e] & EP_BIT_OVER_PLAYER)
-#define IS_ACTIVE_BOMB(e)      (Properties1[e] & EP_BIT_ACTIVE_BOMB)
-
-#define IS_BELT(e)             (Properties2[e] & EP_BIT_BELT)
-#define IS_BELT_ACTIVE(e)      (Properties2[e] & EP_BIT_BELT_ACTIVE)
-#define IS_BELT_SWITCH(e)      (Properties2[e] & EP_BIT_BELT_SWITCH)
-#define IS_TUBE(e)             (Properties2[e] & EP_BIT_TUBE)
-#define IS_EM_SLIPPERY_WALL(e) (Properties2[e] & EP_BIT_EM_SLIPPERY_WALL)
-#define CAN_BE_CRUMBLED(e)     (Properties2[e] & EP_BIT_CAN_BE_CRUMBLED)
+#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) ?                                     \
+                                (PROPERTY_VAR(e,p) |=  PROPERTY_BIT(p)) : \
+                                (PROPERTY_VAR(e,p) &= ~PROPERTY_BIT(p)))
+
+/* 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_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_WALKABLE_INSIDE(e)  HAS_PROPERTY(e, EP_WALKABLE_INSIDE)
+#define IS_WALKABLE_UNDER(e)   HAS_PROPERTY(e, EP_WALKABLE_UNDER)
+#define IS_PASSABLE_OVER(e)    HAS_PROPERTY(e, EP_PASSABLE_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)
+
+/* macros for special configurable properties */
+#define IS_EM_SLIPPERY_WALL(e) HAS_PROPERTY(e, EP_EM_SLIPPERY_WALL)
+
+/* 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_PASS_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_MAGIC_WALL)
+#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_CAN_EXPLODE(e)      HAS_PROPERTY(e, EP_CAN_EXPLODE)
+#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_BELT_ACTIVE(e)      HAS_PROPERTY(e, EP_BELT_ACTIVE)
+#define IS_BELT_SWITCH(e)      HAS_PROPERTY(e, EP_BELT_SWITCH)
+#define IS_TUBE(e)             HAS_PROPERTY(e, EP_TUBE)
+#define IS_KEYGATE(e)          HAS_PROPERTY(e, EP_KEYGATE)
+#define IS_AMOEBOID(e)         HAS_PROPERTY(e, EP_AMOEBOID)
+#define IS_AMOEBALIVE(e)       HAS_PROPERTY(e, EP_AMOEBALIVE)
+#define HAS_CONTENT(e)         HAS_PROPERTY(e, EP_HAS_CONTENT)
+#define IS_ACTIVE_BOMB(e)      HAS_PROPERTY(e, EP_ACTIVE_BOMB)
+#define IS_INACTIVE(e)         HAS_PROPERTY(e, EP_INACTIVE)
+
+/* macros for derived properties */
+#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_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_WALL(e)             HAS_PROPERTY(e, EP_WALL)
+#define IS_SOLID_FOR_PUSHING(e)        HAS_PROPERTY(e, EP_SOLID_FOR_PUSHING)
+#define IS_DRAGONFIRE_PROOF(e) HAS_PROPERTY(e, EP_DRAGONFIRE_PROOF)
+#define IS_EXPLOSION_PROOF(e)  HAS_PROPERTY(e, EP_EXPLOSION_PROOF)
 
 #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_ACCESSIBLE_INSIDE(Feld[x][y]) &&    \
+                                IS_INDESTRUCTIBLE(Feld[x][y]))
 #define PLAYER_PROTECTED(x,y)  (SHIELD_ON(PLAYERINFO(x, y)) ||         \
                                 PROTECTED_FIELD(x, y))
 
 
 #define NUM_ACTIONS                            26
 
-/* values for special image configuration suffixes */
+/* values for special image configuration suffixes (must match game mode) */
 #define GFX_SPECIAL_ARG_MAIN                   0
 #define GFX_SPECIAL_ARG_LEVELS                 1
 #define GFX_SPECIAL_ARG_SCORES                 2
 #define FONT_TITLE_2                           5
 #define FONT_MENU_1                            6
 #define FONT_MENU_2                            7
-#define FONT_TEXT_1                            8
-#define FONT_TEXT_2                            9
-#define FONT_TEXT_3                            10
-#define FONT_TEXT_4                            11
-#define FONT_INPUT                             12
-#define FONT_INPUT_ACTIVE                      13
-#define FONT_OPTION_OFF                                14
-#define FONT_OPTION_ON                         15
-#define FONT_VALUE_1                           16
-#define FONT_VALUE_2                           17
-#define FONT_VALUE_OLD                         18
-#define FONT_LEVEL_NUMBER                      19
-#define FONT_TAPE_RECORDER                     20
-#define FONT_GAME_INFO                         21
-
-#define NUM_FONTS                              22
+#define FONT_TEXT_1_ACTIVE                     8
+#define FONT_TEXT_2_ACTIVE                     9
+#define FONT_TEXT_3_ACTIVE                     10
+#define FONT_TEXT_4_ACTIVE                     11
+#define FONT_TEXT_1                            12
+#define FONT_TEXT_2                            13
+#define FONT_TEXT_3                            14
+#define FONT_TEXT_4                            15
+#define FONT_INPUT_1_ACTIVE                    16
+#define FONT_INPUT_2_ACTIVE                    17
+#define FONT_INPUT_1                           18
+#define FONT_INPUT_2                           19
+#define FONT_OPTION_OFF                                20
+#define FONT_OPTION_ON                         21
+#define FONT_VALUE_1                           22
+#define FONT_VALUE_2                           23
+#define FONT_VALUE_OLD                         24
+#define FONT_LEVEL_NUMBER                      25
+#define FONT_TAPE_RECORDER                     26
+#define FONT_GAME_INFO                         27
+
+#define NUM_FONTS                              28
 #define NUM_INITIAL_FONTS                      4
 
-/* values for game_status */
-#define EXITGAME               0
-#define MAINMENU               1
-#define PLAYING                        2
-#define LEVELED                        3
-#define HELPSCREEN             4
-#define CHOOSELEVEL            5
-#define TYPENAME               6
-#define HALLOFFAME             7
-#define SETUP                  8
-#define PSEUDO_PREVIEW         9
-#define PSEUDO_DOOR            10
+/* values for game_status (must match special image configuration suffixes) */
+#define GAME_MODE_MAIN                         0
+#define GAME_MODE_LEVELS                       1
+#define GAME_MODE_SCORES                       2
+#define GAME_MODE_EDITOR                       3
+#define GAME_MODE_INFO                         4
+#define GAME_MODE_SETUP                                5
+#define GAME_MODE_PSEUDO_DOOR                  6
+#define GAME_MODE_PSEUDO_PREVIEW               7
+
+/* there are no special config file suffixes for these modes */
+#define GAME_MODE_PLAYING                      8
+#define GAME_MODE_PSEUDO_TYPENAME              9
+#define GAME_MODE_QUIT                         10
 
 #define PROGRAM_VERSION_MAJOR  2
 #define PROGRAM_VERSION_MINOR  2
 #define PROGRAM_VERSION_PATCH  0
-#define PROGRAM_VERSION_STRING "2.2.0rc4"
+#define PROGRAM_VERSION_STRING "2.2.0rc7"
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
@@ -1053,19 +1122,25 @@ struct GlobalInfo
 
   int num_toons;
 
-  int menu_draw_xoffset;
-  int menu_draw_yoffset;
-  int menu_draw_xoffset_MAIN;
-  int menu_draw_yoffset_MAIN;
-
-  int door_step_offset;
-  int door_step_delay;
-
   float frames_per_second;
   boolean fps_slowdown;
   int fps_slowdown_factor;
 };
 
+struct MenuInfo
+{
+  int draw_xoffset_default;
+  int draw_yoffset_default;
+  int draw_xoffset[NUM_SPECIAL_GFX_ARGS];
+  int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
+};
+
+struct DoorInfo
+{
+  int step_offset;
+  int step_delay;
+};
+
 struct ElementInfo
 {
   char *token_name;            /* element token used in config files */
@@ -1168,6 +1243,7 @@ extern short                      MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern boolean                 Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -1176,8 +1252,7 @@ extern short                      AmoebaCnt2[MAX_NUM_AMOEBA];
 extern short                   ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
-extern unsigned long           Properties1[MAX_NUM_ELEMENTS];
-extern unsigned long           Properties2[MAX_NUM_ELEMENTS];
+extern unsigned long           Properties[MAX_NUM_ELEMENTS][NUM_EP_BITFIELDS];
 
 extern int                     GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern int                     GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -1215,10 +1290,13 @@ extern struct HiScore           highscore[];
 extern struct TapeInfo         tape;
 extern struct GameInfo         game;
 extern struct GlobalInfo       global;
+extern struct MenuInfo         menu;
+extern struct DoorInfo         door;
 extern struct ElementInfo      element_info[];
 extern struct ElementActionInfo        element_action_info[];
 extern struct ElementDirectionInfo element_direction_info[];
 extern struct SpecialSuffixInfo special_suffix_info[];
+extern struct TokenIntPtrInfo  image_config_vars[];
 extern struct FontInfo         font_info[];
 extern struct GraphicInfo      *graphic_info;
 extern struct SoundInfo               *sound_info;