rnd-20070420-2-src
[rocksndiamonds.git] / src / main.h
index 62764d596b2d99f3a0e999e89dc3e50e5ce2724e..76304e2a2dc1c7f5f7832043576120bfe5e28fd1 100644 (file)
 #define MAX_LEV_FIELDX                 MAX_PLAYFIELD_WIDTH
 #define MAX_LEV_FIELDY                 MAX_PLAYFIELD_HEIGHT
 
+#define MIN_SCROLL_DELAY               0
+#define STD_SCROLL_DELAY               3
+#define MAX_SCROLL_DELAY               8
+
 #define SCREENX(a)                     ((a) - scroll_x)
 #define SCREENY(a)                     ((a) - scroll_y)
 #define LEVELX(a)                      ((a) + scroll_x)
@@ -72,6 +76,7 @@
 #define IN_SCR_FIELD(x, y)             IN_FIELD_MINMAX(x,y, BX1,BY1, BX2,BY2)
 
 /* values for configurable properties (custom elem's only, else pre-defined) */
+/* (never change these values, as they are stored in level files!) */
 #define EP_DIGGABLE                    0
 #define EP_COLLECTIBLE_ONLY            1
 #define EP_DONT_RUN_INTO               2
 #define EP_GRAVITY_REACHABLE           30
 
 /* values for pre-defined properties */
+/* (from here on, values can be changed by inserting new values) */
 #define EP_PLAYER                      32
 #define EP_CAN_PASS_MAGIC_WALL         33
-#define EP_SWITCHABLE                  34
-#define EP_BD_ELEMENT                  35
-#define EP_SP_ELEMENT                  36
-#define EP_SB_ELEMENT                  37
-#define EP_GEM                         38
-#define EP_FOOD_DARK_YAMYAM            39
-#define EP_FOOD_PENGUIN                        40
-#define EP_FOOD_PIG                    41
-#define EP_HISTORIC_WALL               42
-#define EP_HISTORIC_SOLID              43
-#define EP_CLASSIC_ENEMY               44
-#define EP_BELT                                45
-#define EP_BELT_ACTIVE                 46
-#define EP_BELT_SWITCH                 47
-#define EP_TUBE                                48
-#define EP_KEYGATE                     49
-#define EP_AMOEBOID                    50
-#define EP_AMOEBALIVE                  51
-#define EP_HAS_EDITOR_CONTENT          52
-#define EP_CAN_TURN_EACH_MOVE          53
-#define EP_CAN_GROW                    54
-#define EP_ACTIVE_BOMB                 55
-#define EP_INACTIVE                    56
+#define EP_CAN_PASS_DC_MAGIC_WALL      34
+#define EP_SWITCHABLE                  35
+#define EP_BD_ELEMENT                  36
+#define EP_SP_ELEMENT                  37
+#define EP_SB_ELEMENT                  38
+#define EP_GEM                         39
+#define EP_FOOD_DARK_YAMYAM            40
+#define EP_FOOD_PENGUIN                        41
+#define EP_FOOD_PIG                    42
+#define EP_HISTORIC_WALL               43
+#define EP_HISTORIC_SOLID              44
+#define EP_CLASSIC_ENEMY               45
+#define EP_BELT                                46
+#define EP_BELT_ACTIVE                 47
+#define EP_BELT_SWITCH                 48
+#define EP_TUBE                                49
+#define EP_ACID_POOL                   50
+#define EP_KEYGATE                     51
+#define EP_AMOEBOID                    52
+#define EP_AMOEBALIVE                  53
+#define EP_HAS_EDITOR_CONTENT          54
+#define EP_CAN_TURN_EACH_MOVE          55
+#define EP_CAN_GROW                    56
+#define EP_ACTIVE_BOMB                 57
+#define EP_INACTIVE                    58
 
 /* values for special configurable properties (depending on level settings) */
-#define EP_EM_SLIPPERY_WALL            57
+#define EP_EM_SLIPPERY_WALL            59
 
 /* values for special graphics properties (no effect on game engine) */
-#define EP_GFX_CRUMBLED                        58
+#define EP_GFX_CRUMBLED                        60
 
 /* values for derived properties (determined from properties above) */
-#define EP_ACCESSIBLE_OVER             59
-#define EP_ACCESSIBLE_INSIDE           60
-#define EP_ACCESSIBLE_UNDER            61
-#define EP_WALKABLE                    62
-#define EP_PASSABLE                    63
-#define EP_ACCESSIBLE                  64
-#define EP_COLLECTIBLE                 65
-#define EP_SNAPPABLE                   66
-#define EP_WALL                                67
-#define EP_SOLID_FOR_PUSHING           68
-#define EP_DRAGONFIRE_PROOF            69
-#define EP_EXPLOSION_PROOF             70
-#define EP_CAN_SMASH                   71
-#define EP_EXPLODES_3X3_OLD            72
-#define EP_CAN_EXPLODE_BY_FIRE         73
-#define EP_CAN_EXPLODE_SMASHED         74
-#define EP_CAN_EXPLODE_IMPACT          75
-#define EP_SP_PORT                     76
-#define EP_CAN_EXPLODE_BY_DRAGONFIRE   77
-#define EP_CAN_EXPLODE_BY_EXPLOSION    78
-#define EP_COULD_MOVE_INTO_ACID                79
-#define EP_MAYBE_DONT_COLLIDE_WITH     80
-#define EP_CAN_BE_CLONED_BY_ANDROID    81
+#define EP_ACCESSIBLE_OVER             61
+#define EP_ACCESSIBLE_INSIDE           62
+#define EP_ACCESSIBLE_UNDER            63
+#define EP_WALKABLE                    64
+#define EP_PASSABLE                    65
+#define EP_ACCESSIBLE                  66
+#define EP_COLLECTIBLE                 67
+#define EP_SNAPPABLE                   68
+#define EP_WALL                                69
+#define EP_SOLID_FOR_PUSHING           70
+#define EP_DRAGONFIRE_PROOF            71
+#define EP_EXPLOSION_PROOF             72
+#define EP_CAN_SMASH                   73
+#define EP_EXPLODES_3X3_OLD            74
+#define EP_CAN_EXPLODE_BY_FIRE         75
+#define EP_CAN_EXPLODE_SMASHED         76
+#define EP_CAN_EXPLODE_IMPACT          77
+#define EP_SP_PORT                     78
+#define EP_CAN_EXPLODE_BY_DRAGONFIRE   79
+#define EP_CAN_EXPLODE_BY_EXPLOSION    80
+#define EP_COULD_MOVE_INTO_ACID                81
+#define EP_MAYBE_DONT_COLLIDE_WITH     82
+#define EP_CAN_BE_CLONED_BY_ANDROID    83
 
 /* values for internal purpose only (level editor) */
-#define EP_WALK_TO_OBJECT              82
-#define EP_DEADLY                      83
-#define EP_EDITOR_CASCADE              84
-#define EP_EDITOR_CASCADE_ACTIVE       85
-#define EP_EDITOR_CASCADE_INACTIVE     86
+#define EP_WALK_TO_OBJECT              84
+#define EP_DEADLY                      85
+#define EP_EDITOR_CASCADE              86
+#define EP_EDITOR_CASCADE_ACTIVE       87
+#define EP_EDITOR_CASCADE_INACTIVE     88
 
 /* values for internal purpose only (game engine) */
-#define EP_HAS_ACTION                  87
-#define EP_CAN_CHANGE_OR_HAS_ACTION    88
+#define EP_HAS_ACTION                  89
+#define EP_CAN_CHANGE_OR_HAS_ACTION    90
 
 /* values for internal purpose only (other) */
-#define EP_OBSOLETE                    89
+#define EP_OBSOLETE                    91
 
-#define NUM_ELEMENT_PROPERTIES         90
+#define NUM_ELEMENT_PROPERTIES         92
 
 #define NUM_EP_BITFIELDS               ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE_NR            0
 /* macros for pre-defined properties */
 #define ELEM_IS_PLAYER(e)      HAS_PROPERTY(e, EP_PLAYER)
 #define CAN_PASS_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_MAGIC_WALL)
+#define CAN_PASS_DC_MAGIC_WALL(e) HAS_PROPERTY(e, EP_CAN_PASS_DC_MAGIC_WALL)
 #define IS_SWITCHABLE(e)       HAS_PROPERTY(e, EP_SWITCHABLE)
 #define IS_BD_ELEMENT(e)       HAS_PROPERTY(e, EP_BD_ELEMENT)
 #define IS_SP_ELEMENT(e)       HAS_PROPERTY(e, EP_SP_ELEMENT)
 #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_ACID_POOL(e)                HAS_PROPERTY(e, EP_ACID_POOL)
 #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 IS_OBSOLETE(e)         HAS_PROPERTY(e, EP_OBSOLETE)
 
 /* special macros used in game engine */
+#define IS_FILE_ELEMENT(e)     ((e) >= 0 &&                            \
+                                (e) <= NUM_FILE_ELEMENTS)
+
+#define IS_DRAWABLE_ELEMENT(e) ((e) >= 0 &&                            \
+                                (e) <= NUM_DRAWABLE_ELEMENTS)
+
+#define IS_RUNTIME_ELEMENT(e)  ((e) >= 0 &&                            \
+                                (e) <= NUM_RUNTIME_ELEMENTS)
+
+#define IS_VALID_ELEMENT(e)    ((e) >= 0 &&                            \
+                                (e) <= MAX_NUM_ELEMENTS)
+
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&              \
                                 (e) <= EL_CUSTOM_END)
 
 #define EM_KEY_NR(e)           ((e) - EL_EM_KEY_1)
 #define EMC_KEY_NR(e)          ((e) - EL_EMC_KEY_5 + 4)
 #define KEY_NR(e)              (IS_RND_KEY(e) ? RND_KEY_NR(e) :        \
-                                IS_EM_KEY(e) ?  EM_KEY_NR(e) :         \
+                                IS_EM_KEY(e)  ? EM_KEY_NR(e)  :        \
                                 IS_EMC_KEY(e) ? EMC_KEY_NR(e) : 0)
 
 #define IS_RND_GATE(e)         ((e) >= EL_GATE_1 &&                    \
                                 IS_EM_GATE_GRAY(e) ?  EM_GATE_GRAY_NR(e) :   \
                                 IS_EMC_GATE_GRAY(e) ? EMC_GATE_GRAY_NR(e) : 0)
 
+#define IS_ACID_POOL_OR_ACID(e)        (IS_ACID_POOL(e) || (e) == EL_ACID)
+
+#define IS_EMC_PILLAR(e)       ((e) >= EL_EMC_WALL_1 &&                \
+                                (e) <= EL_EMC_WALL_3)
+#define IS_SP_CHIP(e)          ((e) == EL_SP_CHIP_SINGLE ||            \
+                                (e) == EL_SP_CHIP_LEFT ||              \
+                                (e) == EL_SP_CHIP_RIGHT ||             \
+                                (e) == EL_SP_CHIP_TOP ||               \
+                                (e) == EL_SP_CHIP_BOTTOM)
+#define IS_SP_HARDWARE_BASE(e) ((e) == EL_SP_HARDWARE_BASE_1 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_2 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_3 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_4 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_5 ||        \
+                                (e) == EL_SP_HARDWARE_BASE_6)
+
+#define IS_DC_STEELWALL_2(e)   ((e) >= EL_DC_STEELWALL_2_LEFT &&       \
+                                (e) <= EL_DC_STEELWALL_2_SINGLE)
+
 #define GFX_ELEMENT(e)         (element_info[e].use_gfx_element ?      \
                                 element_info[e].gfx_element : e)
 
                                 (e) == EL_EMERALD_RED    ? EL_DIAMOND :    \
                                 (e) == EL_EMERALD_PURPLE ? EL_DIAMOND :    \
                                 EL_ROCK)
-#define EL_CHANGED2(e)         ((e) == EL_ROCK           ? EL_BD_DIAMOND : \
+#define EL_CHANGED_BD(e)       ((e) == EL_ROCK           ? EL_BD_DIAMOND : \
                                 (e) == EL_BD_ROCK        ? EL_BD_DIAMOND : \
                                 EL_BD_ROCK)
+#define EL_CHANGED_DC(e)       ((e) == EL_ROCK           ? EL_EMERALD :    \
+                                (e) == EL_BD_ROCK        ? EL_BD_DIAMOND : \
+                                (e) == EL_EMERALD        ? EL_DIAMOND :    \
+                                (e) == EL_EMERALD_YELLOW ? EL_DIAMOND :    \
+                                (e) == EL_EMERALD_RED    ? EL_DIAMOND :    \
+                                (e) == EL_EMERALD_PURPLE ? EL_DIAMOND :    \
+                                (e) == EL_PEARL          ? EL_BOMB    :    \
+                                (e) == EL_CRYSTAL        ? EL_CRYSTAL :    \
+                                EL_ROCK)
 #define IS_DRAWABLE(e)         ((e) < EL_BLOCKED)
 #define IS_NOT_DRAWABLE(e)     ((e) >= EL_BLOCKED)
 #define TAPE_IS_EMPTY(x)       ((x).length == 0)
 
 #define IS_LOOP_SOUND(s)       (sound_info[s].loop)
 
+#define IS_SPECIAL_GFX_ARG(a)  ((a) >= 0 && (a) < NUM_SPECIAL_GFX_ARGS)
+
 #define EL_CASCADE_ACTIVE(e)   (IS_EDITOR_CASCADE_INACTIVE(e) ? (e) + 1 : (e))
 #define EL_CASCADE_INACTIVE(e) (IS_EDITOR_CASCADE_ACTIVE(e)   ? (e) - 1 : (e))
 #define EL_CASCADE_TOGGLE(e)   (IS_EDITOR_CASCADE_INACTIVE(e) ? (e) + 1 :    \
                                 (d) == MV_UP    ? "MV_UP"    :         \
                                 (d) == MV_DOWN  ? "MV_DOWN"  : "(various)")
 
+#define ELEMENT_ACTIVE(e)      (ActiveElement[e])
+#define BUTTON_ACTIVE(b)       (ActiveButton[b])
+#define FONT_ACTIVE(f)         (ActiveFont[f])
+
+
 /* fundamental game speed values */
 #define MICROLEVEL_SCROLL_DELAY        50      /* delay for scrolling micro level */
 #define MICROLEVEL_LABEL_DELAY 250     /* delay for micro level label */
 #define MAX_ELEMENT_NAME_LEN   32
 #define MAX_TAPES_PER_SET      1024
 #define MAX_SCORE_ENTRIES      100
-#define MAX_NUM_TITLE_SCREENS  5
+#define MAX_NUM_TITLE_IMAGES   5
+#define MAX_NUM_TITLE_MESSAGES 5
 
 #define MAX_NUM_AMOEBA         100
 
-#define NUM_BELTS              4
-#define NUM_BELT_PARTS         3
 #define NUM_ENVELOPES          4
 #define MIN_ENVELOPE_XSIZE     1
 #define MIN_ENVELOPE_YSIZE     1
 
 #define EL_DC_GATE_FAKE_GRAY           859
 
-#define NUM_FILE_ELEMENTS              860
+#define EL_DC_MAGIC_WALL               860
+
+#define EL_QUICKSAND_FAST_EMPTY                861
+#define EL_QUICKSAND_FAST_FULL         862
+
+#define NUM_FILE_ELEMENTS              863
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define EL_SP_MURPHY_CLONE             (EL_FIRST_RUNTIME_REAL + 40)
 #define EL_AMOEBA_DROPPING             (EL_FIRST_RUNTIME_REAL + 41)
 #define EL_QUICKSAND_EMPTYING          (EL_FIRST_RUNTIME_REAL + 42)
-#define EL_MAGIC_WALL_ACTIVE           (EL_FIRST_RUNTIME_REAL + 43)
-#define EL_BD_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 44)
-#define EL_MAGIC_WALL_FULL             (EL_FIRST_RUNTIME_REAL + 45)
-#define EL_BD_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 46)
-#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 47)
-#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 48)
-#define EL_MAGIC_WALL_DEAD             (EL_FIRST_RUNTIME_REAL + 49)
-#define EL_BD_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 50)
-#define EL_EMC_FAKE_GRASS_ACTIVE       (EL_FIRST_RUNTIME_REAL + 51)
-#define EL_GATE_1_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 52)
-#define EL_GATE_2_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 53)
-#define EL_GATE_3_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 54)
-#define EL_GATE_4_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 55)
-#define EL_EM_GATE_1_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 56)
-#define EL_EM_GATE_2_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 57)
-#define EL_EM_GATE_3_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 58)
-#define EL_EM_GATE_4_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 59)
-#define EL_EMC_GATE_5_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 60)
-#define EL_EMC_GATE_6_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 61)
-#define EL_EMC_GATE_7_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 62)
-#define EL_EMC_GATE_8_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 63)
-#define EL_DC_GATE_WHITE_GRAY_ACTIVE   (EL_FIRST_RUNTIME_REAL + 64)
-#define EL_EMC_DRIPPER_ACTIVE          (EL_FIRST_RUNTIME_REAL + 65)
-#define EL_EMC_SPRING_BUMPER_ACTIVE    (EL_FIRST_RUNTIME_REAL + 66)
+#define EL_QUICKSAND_FAST_EMPTYING     (EL_FIRST_RUNTIME_REAL + 43)
+#define EL_MAGIC_WALL_ACTIVE           (EL_FIRST_RUNTIME_REAL + 44)
+#define EL_BD_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 45)
+#define EL_DC_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 46)
+#define EL_MAGIC_WALL_FULL             (EL_FIRST_RUNTIME_REAL + 47)
+#define EL_BD_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 48)
+#define EL_DC_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 49)
+#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 50)
+#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 51)
+#define EL_DC_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 52)
+#define EL_MAGIC_WALL_DEAD             (EL_FIRST_RUNTIME_REAL + 53)
+#define EL_BD_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 54)
+#define EL_DC_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 55)
+#define EL_EMC_FAKE_GRASS_ACTIVE       (EL_FIRST_RUNTIME_REAL + 56)
+#define EL_GATE_1_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 57)
+#define EL_GATE_2_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 58)
+#define EL_GATE_3_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 59)
+#define EL_GATE_4_GRAY_ACTIVE          (EL_FIRST_RUNTIME_REAL + 60)
+#define EL_EM_GATE_1_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 61)
+#define EL_EM_GATE_2_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 62)
+#define EL_EM_GATE_3_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 63)
+#define EL_EM_GATE_4_GRAY_ACTIVE       (EL_FIRST_RUNTIME_REAL + 64)
+#define EL_EMC_GATE_5_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 65)
+#define EL_EMC_GATE_6_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 66)
+#define EL_EMC_GATE_7_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 67)
+#define EL_EMC_GATE_8_GRAY_ACTIVE      (EL_FIRST_RUNTIME_REAL + 68)
+#define EL_DC_GATE_WHITE_GRAY_ACTIVE   (EL_FIRST_RUNTIME_REAL + 69)
+#define EL_EMC_DRIPPER_ACTIVE          (EL_FIRST_RUNTIME_REAL + 70)
+#define EL_EMC_SPRING_BUMPER_ACTIVE    (EL_FIRST_RUNTIME_REAL + 71)
+
+#define NUM_DRAWABLE_ELEMENTS          (EL_FIRST_RUNTIME_REAL + 72)
 
 /* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 67)
+#define EL_FIRST_RUNTIME_UNREAL                (NUM_DRAWABLE_ELEMENTS)
 
 #define EL_BLOCKED                     (EL_FIRST_RUNTIME_UNREAL + 0)
 #define EL_EXPLOSION                   (EL_FIRST_RUNTIME_UNREAL + 1)
 #define EL_PLAYER_IS_EXPLODING_3       (EL_FIRST_RUNTIME_UNREAL + 14)
 #define EL_PLAYER_IS_EXPLODING_4       (EL_FIRST_RUNTIME_UNREAL + 15)
 #define EL_QUICKSAND_FILLING           (EL_FIRST_RUNTIME_UNREAL + 16)
-#define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 17)
-#define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 18)
-#define EL_ELEMENT_SNAPPING            (EL_FIRST_RUNTIME_UNREAL + 19)
-#define EL_DIAGONAL_SHRINKING          (EL_FIRST_RUNTIME_UNREAL + 20)
-#define EL_DIAGONAL_GROWING            (EL_FIRST_RUNTIME_UNREAL + 21)
+#define EL_QUICKSAND_FAST_FILLING      (EL_FIRST_RUNTIME_UNREAL + 17)
+#define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 18)
+#define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 19)
+#define EL_DC_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 20)
+#define EL_ELEMENT_SNAPPING            (EL_FIRST_RUNTIME_UNREAL + 21)
+#define EL_DIAGONAL_SHRINKING          (EL_FIRST_RUNTIME_UNREAL + 22)
+#define EL_DIAGONAL_GROWING            (EL_FIRST_RUNTIME_UNREAL + 23)
 
-#define NUM_RUNTIME_ELEMENTS           (EL_FIRST_RUNTIME_UNREAL + 22)
+#define NUM_RUNTIME_ELEMENTS           (EL_FIRST_RUNTIME_UNREAL + 24)
 
 /* dummy elements (never used as game elements, only used as graphics) */
 #define EL_FIRST_DUMMY                 NUM_RUNTIME_ELEMENTS
 #define EL_BD_DEFAULT                  (EL_FIRST_DUMMY + 22)
 #define EL_SP_DEFAULT                  (EL_FIRST_DUMMY + 23)
 #define EL_SB_DEFAULT                  (EL_FIRST_DUMMY + 24)
+#define EL_GRAPHIC_1                   (EL_FIRST_DUMMY + 25)
+#define EL_GRAPHIC_2                   (EL_FIRST_DUMMY + 26)
+#define EL_GRAPHIC_3                   (EL_FIRST_DUMMY + 27)
+#define EL_GRAPHIC_4                   (EL_FIRST_DUMMY + 28)
+#define EL_GRAPHIC_5                   (EL_FIRST_DUMMY + 29)
+#define EL_GRAPHIC_6                   (EL_FIRST_DUMMY + 30)
+#define EL_GRAPHIC_7                   (EL_FIRST_DUMMY + 31)
+#define EL_GRAPHIC_8                   (EL_FIRST_DUMMY + 32)
 
 /* internal elements (only used for internal purposes like copying) */
-#define EL_FIRST_INTERNAL              (EL_FIRST_DUMMY + 25)
+#define EL_FIRST_INTERNAL              (EL_FIRST_DUMMY + 33)
 
 #define EL_INTERNAL_CLIPBOARD_CUSTOM   (EL_FIRST_INTERNAL + 0)
 #define EL_INTERNAL_CLIPBOARD_CHANGE   (EL_FIRST_INTERNAL + 1)
 
 /* values for special image configuration suffixes (must match game mode) */
 #define GFX_SPECIAL_ARG_DEFAULT                0
-#define GFX_SPECIAL_ARG_TITLE          1
-#define GFX_SPECIAL_ARG_MESSAGE                2
+#define GFX_SPECIAL_ARG_TITLE_INITIAL  1
+#define GFX_SPECIAL_ARG_TITLE          2
 #define GFX_SPECIAL_ARG_MAIN           3
 #define GFX_SPECIAL_ARG_LEVELS         4
 #define GFX_SPECIAL_ARG_SCORES         5
 #define GFX_SPECIAL_ARG_SETUP          8
 #define GFX_SPECIAL_ARG_PLAYING                9
 #define GFX_SPECIAL_ARG_DOOR           10
-#define GFX_SPECIAL_ARG_PREVIEW                11
-#define GFX_SPECIAL_ARG_CRUMBLED       12
+#define GFX_SPECIAL_ARG_PANEL          11
+#define GFX_SPECIAL_ARG_PREVIEW                12
+#define GFX_SPECIAL_ARG_CRUMBLED       13
 
-#define NUM_SPECIAL_GFX_ARGS           13
+#define NUM_SPECIAL_GFX_ARGS           14
 
 /* these additional definitions are currently only used for draw offsets */
 #define GFX_SPECIAL_ARG_INFO_MAIN      0
 #define GFX_SPECIAL_ARG_INFO_MUSIC     3
 #define GFX_SPECIAL_ARG_INFO_CREDITS   4
 #define GFX_SPECIAL_ARG_INFO_PROGRAM   5
-#define GFX_SPECIAL_ARG_INFO_LEVELSET  6
+#define GFX_SPECIAL_ARG_INFO_VERSION   6
+#define GFX_SPECIAL_ARG_INFO_LEVELSET  7
 
-#define NUM_SPECIAL_GFX_INFO_ARGS      7
+#define NUM_SPECIAL_GFX_INFO_ARGS      8
+
+/* these additional definitions are currently only used for draw offsets */
+#define GFX_SPECIAL_ARG_SETUP_MAIN             0
+#define GFX_SPECIAL_ARG_SETUP_GAME             1
+#define GFX_SPECIAL_ARG_SETUP_EDITOR           2
+#define GFX_SPECIAL_ARG_SETUP_GRAPHICS         3
+#define GFX_SPECIAL_ARG_SETUP_SOUND            4
+#define GFX_SPECIAL_ARG_SETUP_ARTWORK          5
+#define GFX_SPECIAL_ARG_SETUP_INPUT            6
+#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_1      7
+#define GFX_SPECIAL_ARG_SETUP_SHORTCUTS_2      8
+#define GFX_SPECIAL_ARG_SETUP_CHOOSE_ARTWORK   9
+#define GFX_SPECIAL_ARG_SETUP_CHOOSE_OTHER     10
+
+#define NUM_SPECIAL_GFX_SETUP_ARGS             11
 
 
 /* values for image configuration suffixes */
 #define GFX_ARG_NAME                   36
 #define GFX_ARG_SCALE_UP_FACTOR                37
 #define GFX_ARG_CLONE_FROM             38
-#define GFX_ARG_FADE_DELAY             39
-#define GFX_ARG_POST_DELAY             40
-#define GFX_ARG_AUTO_DELAY             41
+#define GFX_ARG_FADE_MODE              39
+#define GFX_ARG_FADE_DELAY             40
+#define GFX_ARG_POST_DELAY             41
+#define GFX_ARG_AUTO_DELAY             42
+#define GFX_ARG_ALIGN                  43
+#define GFX_ARG_VALIGN                 44
+#define GFX_ARG_SORT_PRIORITY          45
 
-#define NUM_GFX_ARGS                   42
+#define NUM_GFX_ARGS                   46
 
 
 /* values for sound configuration suffixes */
 #define FONT_LEVEL_NUMBER              32
 #define FONT_TAPE_RECORDER             33
 #define FONT_GAME_INFO                 34
+#define FONT_INFO_ELEMENTS             35
+#define FONT_INFO_LEVELSET             36
 
-#define NUM_FONTS                      35
+#define NUM_FONTS                      37
 #define NUM_INITIAL_FONTS              4
 
+#if 0
 #define FONT_ACTIVE(f)                                                   \
        ((f) == FONT_MENU_1             ? FONT_MENU_1_ACTIVE            : \
         (f) == FONT_MENU_2             ? FONT_MENU_2_ACTIVE            : \
         (f) == FONT_INPUT_2            ? FONT_INPUT_2_ACTIVE           : \
         (f) == FONT_LEVEL_NUMBER       ? FONT_LEVEL_NUMBER_ACTIVE      : \
         (f))
-
+#endif
 
 /* values for game_status (must match special image configuration suffixes) */
 #define GAME_MODE_DEFAULT              0
-#define GAME_MODE_TITLE                        1
-#define GAME_MODE_MESSAGE              2
+#define GAME_MODE_TITLE_INITIAL                1
+#define GAME_MODE_TITLE                        2
 #define GAME_MODE_MAIN                 3
 #define GAME_MODE_LEVELS               4
 #define GAME_MODE_SCORES               5
 #define GAME_MODE_SETUP                        8
 #define GAME_MODE_PLAYING              9
 #define GAME_MODE_PSEUDO_DOOR          10
-#define GAME_MODE_PSEUDO_PREVIEW       11
-#define GAME_MODE_PSEUDO_CRUMBLED      12
+#define GAME_MODE_PSEUDO_PANEL         11
+#define GAME_MODE_PSEUDO_PREVIEW       12
+#define GAME_MODE_PSEUDO_CRUMBLED      13
 
 /* there are no special config file suffixes for these modes */
-#define GAME_MODE_PSEUDO_TYPENAME      13
-#define GAME_MODE_QUIT                 14
+#define GAME_MODE_PSEUDO_TYPENAME      14
+#define GAME_MODE_QUIT                 15
 
 /* special definitions currently only used for custom artwork configuration */
 #define MUSIC_PREFIX_BACKGROUND                0
 #define PROGRAM_VERSION_MAJOR          3
 #define PROGRAM_VERSION_MINOR          2
 #define PROGRAM_VERSION_PATCH          4
-#define PROGRAM_VERSION_BUILD          0
+#define PROGRAM_VERSION_BUILD          2
 
 #define PROGRAM_TITLE_STRING           "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING          "Holger Schemel"
 
 struct BorderInfo
 {
-  int draw_masked[NUM_SPECIAL_GFX_ARGS];
-};
-
-struct MenuPosInfo
-{
-  int x, y;
-  int width, height;
-  int align;
+  boolean draw_masked[NUM_SPECIAL_GFX_ARGS];
+  boolean draw_masked_when_fading;
 };
 
 struct MenuMainButtonInfo
@@ -1962,28 +2059,34 @@ struct MenuMainButtonInfo
 
 struct MenuMainTextInfo
 {
-  struct MenuPosInfo name;
-  struct MenuPosInfo levels;
-  struct MenuPosInfo scores;
-  struct MenuPosInfo editor;
-  struct MenuPosInfo info;
-  struct MenuPosInfo game;
-  struct MenuPosInfo setup;
-  struct MenuPosInfo quit;
-
-  struct MenuPosInfo current_level;
-  struct MenuPosInfo first_level;
-  struct MenuPosInfo last_level;
-  struct MenuPosInfo level_info_1;
-  struct MenuPosInfo level_info_2;
-  struct MenuPosInfo title_1;
-  struct MenuPosInfo title_2;
-  struct MenuPosInfo title_3;
+  struct TextPosInfo name;
+  struct TextPosInfo levels;
+  struct TextPosInfo scores;
+  struct TextPosInfo editor;
+  struct TextPosInfo info;
+  struct TextPosInfo game;
+  struct TextPosInfo setup;
+  struct TextPosInfo quit;
+
+  struct TextPosInfo first_level;
+  struct TextPosInfo last_level;
+  struct TextPosInfo level_number;
+  struct TextPosInfo level_info_1;
+  struct TextPosInfo level_info_2;
+  struct TextPosInfo level_name;
+  struct TextPosInfo level_author;
+  struct TextPosInfo level_year;
+  struct TextPosInfo level_imported_from;
+  struct TextPosInfo level_imported_by;
+  struct TextPosInfo level_tested_by;
+  struct TextPosInfo title_1;
+  struct TextPosInfo title_2;
+  struct TextPosInfo title_3;
 };
 
 struct MenuMainInputInfo
 {
-  struct MenuPosInfo name;
+  struct TextPosInfo name;
 };
 
 struct MenuMainInfo
@@ -1993,15 +2096,30 @@ struct MenuMainInfo
   struct MenuMainInputInfo input;
 };
 
-struct TitleInfo
+struct TitleFadingInfo
 {
+  int fade_mode;
   int fade_delay;
   int post_delay;
   int auto_delay;
+};
 
-  int fade_delay_final;
-  int post_delay_final;
-  int auto_delay_final;
+struct TitleMessageInfo
+{
+  int x, y;
+  int width, height;
+  int chars, lines;
+  int align, valign;
+  int font;
+  boolean autowrap;
+  boolean centered;
+  boolean parse_comments;
+  int sort_priority;
+
+  int fade_mode;
+  int fade_delay;
+  int post_delay;
+  int auto_delay;
 };
 
 struct MenuInfo
@@ -2010,14 +2128,17 @@ struct MenuInfo
   int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
   int draw_xoffset_info[NUM_SPECIAL_GFX_INFO_ARGS];
   int draw_yoffset_info[NUM_SPECIAL_GFX_INFO_ARGS];
+  int draw_xoffset_setup[NUM_SPECIAL_GFX_SETUP_ARGS];
+  int draw_yoffset_setup[NUM_SPECIAL_GFX_SETUP_ARGS];
 
   int scrollbar_xoffset;
 
   int list_size[NUM_SPECIAL_GFX_ARGS];
 
-  int fade_delay;
-  int post_delay;
-  int auto_delay;
+  struct TitleFadingInfo enter_menu;
+  struct TitleFadingInfo leave_menu;
+  struct TitleFadingInfo enter_screen[NUM_SPECIAL_GFX_ARGS];
+  struct TitleFadingInfo leave_screen[NUM_SPECIAL_GFX_ARGS];
 
   int sound[NUM_SPECIAL_GFX_ARGS];
   int music[NUM_SPECIAL_GFX_ARGS];
@@ -2037,7 +2158,7 @@ struct DoorInfo
 struct PreviewInfo
 {
   int x, y;
-  int align;
+  int align, valign;
   int xsize, ysize;
   int xoffset, yoffset;
   int tile_size;
@@ -2062,6 +2183,9 @@ struct EnvelopeInfo
   int xsize;
   int ysize;
 
+  boolean autowrap;
+  boolean centered;
+
   char text[MAX_ENVELOPE_TEXT_LEN + 1];
 };
 
@@ -2176,6 +2300,7 @@ struct LevelInfo
   boolean use_spring_bug;      /* for compatibility with old levels */
   boolean use_time_orb_bug;    /* for compatibility with old levels */
   boolean instant_relocation;  /* no visual delay when relocating player */
+  boolean shifted_relocation;  /* no level centering when relocating player */
   boolean can_pass_to_walkable;        /* player can pass to empty or walkable tile */
   boolean grow_into_diggable;  /* amoeba can grow into anything diggable */
 
@@ -2210,6 +2335,13 @@ struct GlobalInfo
   float frames_per_second;
   boolean fps_slowdown;
   int fps_slowdown_factor;
+
+  /* global values for fading screens and masking borders */
+  int border_status;
+#if 0
+  int fading_status;
+  int fading_type;
+#endif
 };
 
 struct ElementChangeInfo
@@ -2375,6 +2507,9 @@ struct ElementInfo
 
   int collect_score;           /* runtime score value for collecting */
 
+  /* count of this element on playfield, calculated after each frame */
+  int element_count;
+
   /* ---------- internal values used in level editor ---------- */
 
   int access_type;             /* walkable or passable */
@@ -2447,9 +2582,12 @@ struct GraphicInfo
 
   int draw_masked;             /* optional setting for drawing envelope gfx */
 
+  int fade_mode;               /* optional setting for drawing title screens */
   int fade_delay;              /* optional setting for drawing title screens */
   int post_delay;              /* optional setting for drawing title screens */
   int auto_delay;              /* optional setting for drawing title screens */
+  int align, valign;           /* optional setting for drawing title screens */
+  int sort_priority;           /* optional setting for drawing title screens */
 
   boolean use_image_size;      /* use image size as default width and height */
 
@@ -2583,6 +2721,10 @@ extern int                       GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern int                     GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern int                     GfxDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
+extern int                     ActiveElement[MAX_NUM_ELEMENTS];
+extern int                     ActiveButton[NUM_IMAGE_FILES];
+extern int                     ActiveFont[NUM_FONTS];
+
 extern int                     lev_fieldx, lev_fieldy;
 extern int                     scroll_x, scroll_y;
 
@@ -2612,7 +2754,15 @@ extern struct HiScore            highscore[];
 extern struct TapeInfo         tape;
 extern struct GlobalInfo       global;
 extern struct BorderInfo       border;
-extern struct TitleInfo                title;
+extern struct TitleFadingInfo  fading;
+extern struct TitleFadingInfo  fading_none;
+extern struct TitleFadingInfo  title_initial_default;
+extern struct TitleFadingInfo  title_default;
+extern struct TitleMessageInfo titlemessage_initial_default;
+extern struct TitleMessageInfo titlemessage_initial[];
+extern struct TitleMessageInfo titlemessage_default;
+extern struct TitleMessageInfo titlemessage[];
+extern struct TitleMessageInfo readme;
 extern struct MenuInfo         menu;
 extern struct DoorInfo         door_1, door_2;
 extern struct PreviewInfo      preview;