rnd-20030413-4-src
[rocksndiamonds.git] / src / main.h
index f00ab2a7d74187d43dc543728931be7c3b00a48a..d92af3dcbc4342dd34aa68af4d45fd5513922ee4 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)
+/* property values */
+#define EP_AMOEBALIVE          0
+#define EP_AMOEBOID            1
+#define EP_SCHLUESSEL          2
+#define EP_PFORTE              3
+#define EP_SOLID               4
+#define EP_INDESTRUCTIBLE      5
+#define EP_SLIPPERY            6
+#define EP_ENEMY               7
+#define EP_MAUER               8
+#define EP_CAN_FALL            9
+#define EP_CAN_SMASH           10
+#define EP_CAN_CHANGE          11
+#define EP_CAN_MOVE            12
+#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_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_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_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 NUM_ELEMENT_PROPERTIES 38
+
+#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 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_PFORTE          PROPERTY_BIT(EP_PFORTE)
+#define EP_BIT_SOLID           PROPERTY_BIT(EP_SOLID)
+#define EP_BIT_INDESTRUCTIBLE  PROPERTY_BIT(EP_INDESTRUCTIBLE)
+#define EP_BIT_SLIPPERY                PROPERTY_BIT(EP_SLIPPERY)
+#define EP_BIT_ENEMY           PROPERTY_BIT(EP_ENEMY)
+#define EP_BIT_MAUER           PROPERTY_BIT(EP_MAUER)
+#define EP_BIT_CAN_FALL                PROPERTY_BIT(EP_CAN_FALL)
+#define EP_BIT_CAN_SMASH       PROPERTY_BIT(EP_CAN_SMASH)
+#define EP_BIT_CAN_CHANGE      PROPERTY_BIT(EP_CAN_CHANGE)
+#define EP_BIT_CAN_MOVE                PROPERTY_BIT(EP_CAN_MOVE)
+#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_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_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_OVER_PLAYER     PROPERTY_BIT(EP_OVER_PLAYER)
+#define EP_BIT_ACTIVE_BOMB     PROPERTY_BIT(EP_ACTIVE_BOMB)
 
 /* 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)
+#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_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)
+/* 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_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&      \
                                 (e) <= EL_CUSTOM_END)
 #define EL_CHAR_ASCII0_END             (EL_CHAR_ASCII0 + 111)
 #define EL_CHAR_END                    (EL_CHAR_START  + 79)
 
-#define EL_CHAR(x)                     ((x) == 'Ä' ? EL_CHAR_AE         : \
-                                        (x) == 'Ö' ? EL_CHAR_OE         : \
-                                        (x) == 'Ü' ? EL_CHAR_UE         : \
-                                        (x) == '^' ? EL_CHAR_COPYRIGHT  : \
-                                        (x) == '_' ? EL_CHAR_UNDERSCORE : \
-                                        (x) == '°' ? EL_CHAR_DEGREE     : \
-                                        (x) == '´' ? EL_CHAR_TM         : \
-                                        (x) == '|' ? EL_CHAR_CURSOR     : \
-                                        EL_CHAR_A + (x) - 'A')
+#define EL_CHAR(c)                     (EL_CHAR_ASCII0 + MAP_FONT_ASCII(c))
 
 #define EL_EXPANDABLE_WALL_HORIZONTAL  200
 #define EL_EXPANDABLE_WALL_VERTICAL    201
 #define GFX_ARG_POSITION                       19
 #define GFX_ARG_DRAW_XOFFSET                   20
 #define GFX_ARG_DRAW_YOFFSET                   21
-#define GFX_ARG_FORMAT                         22
-#define GFX_ARG_NAME                           23
+#define GFX_ARG_NAME                           22
 
-#define NUM_GFX_ARGS                           24
+#define NUM_GFX_ARGS                           23
 
 
 /* values for sound configuration suffixes */
 #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_TAPE_RECORDER                     19
-#define FONT_LEVEL_NUMBER                      20
-
-#define NUM_FONTS                              21
+#define FONT_INPUT_1                           12
+#define FONT_INPUT_1_ACTIVE                    13
+#define FONT_INPUT_2                           14
+#define FONT_INPUT_2_ACTIVE                    15
+#define FONT_OPTION_OFF                                16
+#define FONT_OPTION_ON                         17
+#define FONT_VALUE_1                           18
+#define FONT_VALUE_2                           19
+#define FONT_VALUE_OLD                         20
+#define FONT_LEVEL_NUMBER                      21
+#define FONT_TAPE_RECORDER                     22
+#define FONT_GAME_INFO                         23
+
+#define NUM_FONTS                              24
 #define NUM_INITIAL_FONTS                      4
 
-
 /* values for game_status */
 #define EXITGAME               0
 #define MAINMENU               1
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
-#define PROGRAM_RIGHTS_STRING  "Copyright ^1995-2003 by"
+#define PROGRAM_RIGHTS_STRING  "Copyright ©1995-2003 by"
 #define PROGRAM_DOS_PORT_STRING        "DOS port done by Guido Schulz"
 #define PROGRAM_IDENT_STRING   PROGRAM_VERSION_STRING " " TARGET_STRING
 #define WINDOW_TITLE_STRING    PROGRAM_TITLE_STRING " " PROGRAM_IDENT_STRING
@@ -996,6 +1044,8 @@ struct LevelInfo
   boolean gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
 
+  short custom_element_successor[NUM_CUSTOM_ELEMENTS];
+
   boolean no_level_file;
 };
 
@@ -1107,6 +1157,7 @@ struct GraphicInfo
   int width, height;           /* width/height of each animation frame */
   int offset_x, offset_y;      /* x/y offset to next animation frame */
   int anim_frames;
+  int anim_frames_per_line;
   int anim_start_frame;
   int anim_delay;              /* important: delay of 1 means "no delay"! */
   int anim_mode;
@@ -1182,8 +1233,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];