rocksndiamonds-3.0.8
[rocksndiamonds.git] / src / main.h
index 1108cbf76d19aa265912e6e10eb17313e9f81b10..9484a5c6a90c9f4eb9f12dab53007840e732a057 100644 (file)
@@ -14,9 +14,6 @@
 #ifndef MAIN_H
 #define MAIN_H
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
 #include <time.h>
 #include <sys/time.h>
 #include <sys/types.h>
@@ -29,6 +26,7 @@
 
 #include "conf_gfx.h"  /* include auto-generated data structure definitions */
 #include "conf_snd.h"  /* include auto-generated data structure definitions */
+#include "conf_mus.h"  /* include auto-generated data structure definitions */
 
 #define IMG_UNDEFINED          (-1)
 #define IMG_EMPTY              IMG_EMPTY_SPACE
@@ -38,6 +36,7 @@
 #define IMG_CUSTOM_START       IMG_CUSTOM_1
 
 #define SND_UNDEFINED          (-1)
+#define MUS_UNDEFINED          (-1)
 
 #define WIN_XSIZE              672
 #define WIN_YSIZE              560
@@ -63,7 +62,7 @@
 
 /* values for configurable properties (custom elem's only, else pre-defined) */
 #define EP_DIGGABLE            0
-#define EP_COLLECTIBLE         1
+#define EP_COLLECTIBLE_ONLY    1
 #define EP_DONT_RUN_INTO       2
 #define EP_DONT_COLLIDE_WITH   3
 #define EP_DONT_TOUCH          4
 #define EP_PASSABLE_OVER       19
 #define EP_PASSABLE_INSIDE     20
 #define EP_PASSABLE_UNDER      21
-#define EP_UNUSED_22           22
-#define EP_UNUSED_23           23
+#define EP_DROPPABLE           22
+#define EP_CAN_EXPLODE_1X1     23
 #define EP_PUSHABLE            24
 
+/* values for pre-defined properties */
+#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_CONTENT         52
+#define EP_ACTIVE_BOMB         53
+#define EP_INACTIVE            54
+
 /* values for special configurable properties (depending on level settings) */
-#define EP_EM_SLIPPERY_WALL    32
+#define EP_EM_SLIPPERY_WALL    55
 
 /* values for special graphics properties (no effect on game engine) */
-#define EP_CAN_BE_CRUMBLED     33
-
-/* values for pre-defined properties */
-#define EP_PLAYER              34
-#define EP_CAN_PASS_MAGIC_WALL 35
-#define EP_SWITCHABLE          36
-#define EP_BD_ELEMENT          37
-#define EP_SP_ELEMENT          38
-#define EP_SB_ELEMENT          39
-#define EP_GEM                 40
-#define EP_FOOD_DARK_YAMYAM    41
-#define EP_FOOD_PENGUIN                42
-#define EP_FOOD_PIG            43
-#define EP_HISTORIC_WALL       44
-#define EP_HISTORIC_SOLID      45
-#define EP_CLASSIC_ENEMY       46
-#define EP_BELT                        47
-#define EP_BELT_ACTIVE         48
-#define EP_BELT_SWITCH         49
-#define EP_TUBE                        50
-#define EP_KEYGATE             51
-#define EP_AMOEBOID            52
-#define EP_AMOEBALIVE          53
-#define EP_HAS_CONTENT         54
-#define EP_ACTIVE_BOMB         55
-#define EP_INACTIVE            56
+#define EP_GFX_CRUMBLED                56
 
 /* values for derived properties (determined from properties above) */
 #define EP_ACCESSIBLE_OVER     57
 #define EP_WALKABLE            60
 #define EP_PASSABLE            61
 #define EP_ACCESSIBLE          62
-#define EP_SNAPPABLE           63
-#define EP_WALL                        64
-#define EP_SOLID_FOR_PUSHING   65
-#define EP_DRAGONFIRE_PROOF    66
-#define EP_EXPLOSION_PROOF     67
-#define EP_CAN_SMASH           68
-#define EP_CAN_EXPLODE         69
+#define EP_COLLECTIBLE         63
+#define EP_SNAPPABLE           64
+#define EP_WALL                        65
+#define EP_SOLID_FOR_PUSHING   66
+#define EP_DRAGONFIRE_PROOF    67
+#define EP_EXPLOSION_PROOF     68
+#define EP_CAN_SMASH           69
+#define EP_CAN_EXPLODE         70
+#define EP_CAN_EXPLODE_3X3     71
 
 /* values for internal purpose only (level editor) */
-#define EP_EXPLODE_RESULT      70
-#define EP_WALK_TO_OBJECT      71
-#define EP_DEADLY              72
+#define EP_EXPLODE_RESULT      72
+#define EP_WALK_TO_OBJECT      73
+#define EP_DEADLY              74
 
-#define NUM_ELEMENT_PROPERTIES 73
+#define NUM_ELEMENT_PROPERTIES 75
 
 #define NUM_EP_BITFIELDS       ((NUM_ELEMENT_PROPERTIES + 31) / 32)
 #define EP_BITFIELD_BASE       0
                                 (PROPERTY_VAR(e,p) &= ~PROPERTY_BIT(p)))
 
 
-/* values for change events for custom elements */
+/* values for change events for custom elements (stored in level file) */
 #define CE_DELAY               0
 #define CE_TOUCHED_BY_PLAYER   1
 #define CE_PRESSED_BY_PLAYER   2
 #define CE_PUSHED_BY_PLAYER    3
-#define CE_IMPACT              4
-#define CE_SMASHED             5
-#define CE_OTHER_COLLECTING    6
-#define CE_OTHER_PUSHING       7
-#define CE_OTHER_CHANGING      8
-#define CE_OTHER_EXPLODING     9
-
-/* values for internal purpose only (level editor) */
-#define CE_BY_PLAYER           10
-#define CE_IMPACT_SMASHED      11
-#define CE_BY_OTHER            12
-
-#define NUM_CHANGE_EVENTS      13
+#define CE_DROPPED_BY_PLAYER   4
+#define CE_COLLISION_ACTIVE    5
+#define CE_IMPACT              6
+#define CE_SMASHED             7
+#define CE_OTHER_IS_TOUCHING   8
+#define CE_OTHER_IS_CHANGING   9
+#define CE_OTHER_IS_EXPLODING  10
+#define CE_OTHER_GETS_TOUCHED  11
+#define CE_OTHER_GETS_PRESSED  12
+#define CE_OTHER_GETS_PUSHED   13
+#define CE_OTHER_GETS_COLLECTED        14
+#define CE_OTHER_GETS_DROPPED  15
+#define CE_BY_PLAYER_OBSOLETE  16      /* obsolete; now CE_BY_DIRECT_ACTION */
+#define CE_BY_COLLISION_OBSOLETE 17    /* obsolete; now CE_BY_DIRECT_ACTION */
+#define CE_BY_OTHER_ACTION     18      /* activates other element events */
+#define CE_BY_DIRECT_ACTION    19      /* activates direct element events */
+#define CE_OTHER_GETS_DIGGED   20
+#define CE_ENTERED_BY_PLAYER   21
+#define CE_LEFT_BY_PLAYER      22
+#define CE_OTHER_GETS_ENTERED  23
+#define CE_OTHER_GETS_LEFT     24
+#define CE_SWITCHED            25
+#define CE_OTHER_IS_SWITCHING  26
+#define CE_COLLISION_PASSIVE   27
+#define CE_OTHER_IS_COLL_ACTIVE        28
+#define CE_OTHER_IS_COLL_PASSIVE 29
+
+#define NUM_CHANGE_EVENTS      30
 
 #define CE_BITMASK_DEFAULT     0
 
 #define CH_EVENT_BIT(c)                (1 << (c))
-#define CH_EVENT_VAR(e)                (element_info[e].change.events)
+#define CH_EVENT_VAR(e)                (element_info[e].change->events)
+#define CH_ANY_EVENT_VAR(e)    (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 HAS_ANY_CHANGE_EVENT(e,c) (IS_CUSTOM_ELEMENT(e) &&               \
+                                (CH_ANY_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)
 
+/* values for change sides for custom elements */
+#define CH_SIDE_NONE           MV_NO_MOVING
+#define CH_SIDE_LEFT           MV_LEFT
+#define CH_SIDE_RIGHT          MV_RIGHT
+#define CH_SIDE_TOP            MV_UP
+#define CH_SIDE_BOTTOM         MV_DOWN
+#define CH_SIDE_LEFT_RIGHT     MV_HORIZONTAL
+#define CH_SIDE_TOP_BOTTOM     MV_VERTICAL
+#define CH_SIDE_ANY            MV_ANY_DIRECTION
+
 /* values for change power for custom elements */
 #define CP_NON_DESTRUCTIVE     0
 #define CP_HALF_DESTRUCTIVE    1
 #define CP_FULL_DESTRUCTIVE    2
 
+/* values for special move patterns (bits 0-3: basic move directions) */
+#define MV_BIT_TOWARDS_PLAYER  4
+#define MV_BIT_AWAY_FROM_PLAYER        5
+#define MV_BIT_ALONG_LEFT_SIDE 6
+#define MV_BIT_ALONG_RIGHT_SIDE        7
+#define MV_BIT_TURNING_LEFT    8
+#define MV_BIT_TURNING_RIGHT   9
+#define MV_BIT_WHEN_PUSHED     10
+#define MV_BIT_MAZE_RUNNER     11
+#define MV_BIT_MAZE_HUNTER     12
+
+/* values for special move patterns for custom elements */
+#define MV_HORIZONTAL          (MV_LEFT | MV_RIGHT)
+#define MV_VERTICAL            (MV_UP | MV_DOWN)
+#define MV_ALL_DIRECTIONS      (MV_HORIZONTAL | MV_VERTICAL)
+#define MV_ANY_DIRECTION       (MV_ALL_DIRECTIONS)
+#define MV_TOWARDS_PLAYER      (1 << MV_BIT_TOWARDS_PLAYER)
+#define MV_AWAY_FROM_PLAYER    (1 << MV_BIT_AWAY_FROM_PLAYER)
+#define MV_ALONG_LEFT_SIDE     (1 << MV_BIT_ALONG_LEFT_SIDE)
+#define MV_ALONG_RIGHT_SIDE    (1 << MV_BIT_ALONG_RIGHT_SIDE)
+#define MV_TURNING_LEFT                (1 << MV_BIT_TURNING_LEFT)
+#define MV_TURNING_RIGHT       (1 << MV_BIT_TURNING_RIGHT)
+#define MV_WHEN_PUSHED         (1 << MV_BIT_WHEN_PUSHED)
+#define MV_MAZE_RUNNER         (1 << MV_BIT_MAZE_RUNNER)
+#define MV_MAZE_HUNTER         (1 << MV_BIT_MAZE_HUNTER)
+#define MV_MAZE_RUNNER_STYLE   (MV_MAZE_RUNNER | MV_MAZE_HUNTER)
+
+/* values for slippery property for custom elements */
+#define SLIPPERY_ANY_RANDOM    0
+#define SLIPPERY_ANY_LEFT_RIGHT        1
+#define SLIPPERY_ANY_RIGHT_LEFT        2
+#define SLIPPERY_ONLY_LEFT     3
+#define SLIPPERY_ONLY_RIGHT    4
 
 /* macros for configurable properties */
 #define IS_DIGGABLE(e)         HAS_PROPERTY(e, EP_DIGGABLE)
-#define IS_COLLECTIBLE(e)      HAS_PROPERTY(e, EP_COLLECTIBLE)
+#define IS_COLLECTIBLE_ONLY(e) HAS_PROPERTY(e, EP_COLLECTIBLE_ONLY)
 #define DONT_RUN_INTO(e)       HAS_PROPERTY(e, EP_DONT_RUN_INTO)
 #define DONT_COLLIDE_WITH(e)   HAS_PROPERTY(e, EP_DONT_COLLIDE_WITH)
 #define DONT_TOUCH(e)          HAS_PROPERTY(e, EP_DONT_TOUCH)
 #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_DROPPABLE(e)                HAS_PROPERTY(e, EP_DROPPABLE)
+#define CAN_EXPLODE_1X1(e)     HAS_PROPERTY(e, EP_CAN_EXPLODE_1X1)
 #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 special graphics properties */
-#define CAN_BE_CRUMBLED(e)     HAS_PROPERTY(GFX_ELEMENT(e),EP_CAN_BE_CRUMBLED)
+#define GFX_CRUMBLED(e)                HAS_PROPERTY(GFX_ELEMENT(e), EP_GFX_CRUMBLED)
 
 /* macros for pre-defined properties */
 #define ELEM_IS_PLAYER(e)      HAS_PROPERTY(e, EP_PLAYER)
 #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_COLLECTIBLE(e)      HAS_PROPERTY(e, EP_COLLECTIBLE)
+#define IS_SNAPPABLE(e)                HAS_PROPERTY(e, EP_SNAPPABLE)
 #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 CAN_SMASH(e)           HAS_PROPERTY(e, EP_CAN_SMASH)
 #define CAN_EXPLODE(e)         HAS_PROPERTY(e, EP_CAN_EXPLODE)
+#define CAN_EXPLODE_3X3(e)     HAS_PROPERTY(e, EP_CAN_EXPLODE_3X3)
 
 /* special macros used in game engine */
 #define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&              \
                                 (e) <= EL_CUSTOM_END)
 
+#define IS_ENVELOPE(e)         ((e) >= EL_ENVELOPE_1 &&                \
+                                (e) <= EL_ENVELOPE_4)
+
 #define GFX_ELEMENT(e)         (element_info[e].use_gfx_element ?      \
                                 element_info[e].gfx_element : e)
 
 #define PLAYER_PROTECTED(x,y)  (SHIELD_ON(PLAYERINFO(x, y)) ||         \
                                 PROTECTED_FIELD(x, y))
 
+#define PLAYER_SWITCHING(p,x,y)        ((p)->is_switching &&                   \
+                                (p)->switch_x == (x) && (p)->switch_y == (y))
+
 #define PLAYER_NR_GFX(g,i)     ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1))
 
 #define ANIM_FRAMES(g)         (graphic_info[g].anim_frames)
 #define IS_LOOP_SOUND(s)       (sound_info[s].loop)
 
 
+/* fundamental game speed values */
+#define GAME_FRAME_DELAY       20      /* frame delay in milliseconds */
+#define FFWD_FRAME_DELAY       10      /* 200% speed for fast forward */
+#define FRAMES_PER_SECOND      (1000 / GAME_FRAME_DELAY)
+#define MICROLEVEL_SCROLL_DELAY        50      /* delay for scrolling micro level */
+#define MICROLEVEL_LABEL_DELAY 250     /* delay for micro level label */
+
 /* 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_ELEMENT_NAME_LEN   32
+#define MAX_TAPELEN            (1000 * FRAMES_PER_SECOND) /* max.time x fps */
 #define MAX_SCORE_ENTRIES      100
 #define MAX_NUM_AMOEBA         100
+#define MAX_INVENTORY_SIZE     1000
+#define MIN_ENVELOPE_XSIZE     1
+#define MIN_ENVELOPE_YSIZE     1
+#define MAX_ENVELOPE_XSIZE     30
+#define MAX_ENVELOPE_YSIZE     20
+#define MAX_ENVELOPE_TEXT_LEN  (MAX_ENVELOPE_XSIZE * MAX_ENVELOPE_YSIZE)
+#define MIN_CHANGE_PAGES       1
+#define MAX_CHANGE_PAGES       16
 
 /* values for elements with content */
 #define MIN_ELEMENT_CONTENTS   1
 
 #define LEVEL_SCORE_ELEMENTS   16      /* level elements with score */
 
-/* fundamental game speed values */
-#define GAME_FRAME_DELAY       20      /* frame delay in milliseconds */
-#define FFWD_FRAME_DELAY       10      /* 200% speed for fast forward */
-#define FRAMES_PER_SECOND      (1000 / GAME_FRAME_DELAY)
-#define MICROLEVEL_SCROLL_DELAY        50      /* delay for scrolling micro level */
-#define MICROLEVEL_LABEL_DELAY 250     /* delay for micro level label */
-
 /* often used screen positions */
 #define SX                     8
 #define SY                     8
 #define EL_EMPTY                       EL_EMPTY_SPACE
 #define EL_SAND                                1
 #define EL_WALL                                2
-#define EL_WALL_CRUMBLED               3
+#define EL_WALL_SLIPPERY               3
 #define EL_ROCK                                4
-#define EL_KEY_OBSOLETE                        5 /* obsolete; mapped to EL_KEY_1 */
+#define EL_KEY_OBSOLETE                        5       /* obsolete; now EL_KEY_1 */
 #define EL_EMERALD                     6
 #define EL_EXIT_CLOSED                 7
-#define EL_PLAYER_OBSOLETE             8 /* obsolete; mapped to EL_PLAYER_1 */
+#define EL_PLAYER_OBSOLETE             8       /* obsolete; now EL_PLAYER_1 */
 #define EL_BUG                         9
 #define EL_SPACESHIP                   10
 #define EL_YAMYAM                      11
 #define EL_BD_MAGIC_WALL               61
 #define EL_INVISIBLE_STEELWALL         62
 
-#define EL_UNUSED_63                   63
+#define EL_MAZE_RUNNER                 63
 
 #define EL_DYNABOMB_INCREASE_NUMBER    64
 #define EL_DYNABOMB_INCREASE_SIZE      65
 #define EL_PIG                         117
 #define EL_DRAGON                      118
 
-#define EL_EM_KEY_1_FILE               119
+#define EL_EM_KEY_1_FILE_OBSOLETE      119     /* obsolete; now EL_EM_KEY_1 */
 
 #define EL_CHAR_START                  120
 #define EL_CHAR_ASCII0                 (EL_CHAR_START  - 32)
 #define EL_EM_GATE_3                   205
 #define EL_EM_GATE_4                   206
 
-#define EL_EM_KEY_2_FILE                       207
-#define EL_EM_KEY_3_FILE                       208
-#define EL_EM_KEY_4_FILE                       209
+#define EL_EM_KEY_2_FILE_OBSOLETE      207     /* obsolete; now EL_EM_KEY_2 */
+#define EL_EM_KEY_3_FILE_OBSOLETE      208     /* obsolete; now EL_EM_KEY_3 */
+#define EL_EM_KEY_4_FILE_OBSOLETE      209     /* obsolete; now EL_EM_KEY_4 */
 
 #define EL_SP_START                    210
 #define EL_SP_EMPTY_SPACE              (EL_SP_START + 0)
 #define EL_CONVEYOR_BELT_4_SWITCH_MIDDLE 293
 #define EL_CONVEYOR_BELT_4_SWITCH_RIGHT         294
 #define EL_LANDMINE                    295
-#define EL_ENVELOPE                    296
+#define EL_ENVELOPE_OBSOLETE           296   /* obsolete; now EL_ENVELOPE_1 */
 #define EL_LIGHT_SWITCH                        297
 #define EL_LIGHT_SWITCH_ACTIVE         298
 #define EL_SIGN_EXCLAMATION            299
 #define EL_MOLE_RIGHT                  312
 #define EL_MOLE_UP                     313
 #define EL_MOLE_DOWN                   314
-#define EL_STEELWALL_SLANTED           315
+#define EL_STEELWALL_SLIPPERY          315
 #define EL_INVISIBLE_SAND              316
 #define EL_DX_UNKNOWN_15               317
 #define EL_DX_UNKNOWN_42               318
 #define EL_UNUSED_358                  358
 #define EL_UNUSED_359                  359
 
+/* ---------- begin of custom elements section ----------------------------- */
 #define EL_CUSTOM_START                        360
 
 #include "conf_cus.h"  /* include auto-generated data structure definitions */
 
-#define EL_CUSTOM_END                  (EL_CUSTOM_START + 127)
+#define NUM_CUSTOM_ELEMENTS            256
+#define EL_CUSTOM_END                  615
+/* ---------- end of custom elements section ------------------------------- */
+
+#define EL_EM_KEY_1                    616
+#define EL_EM_KEY_2                    617
+#define EL_EM_KEY_3                    618
+#define EL_EM_KEY_4                    619
+#define EL_ENVELOPE_1                  620
+#define EL_ENVELOPE_2                  621
+#define EL_ENVELOPE_3                  622
+#define EL_ENVELOPE_4                  623
 
-#define NUM_CUSTOM_ELEMENTS            128
-#define NUM_FILE_ELEMENTS              488
+#define NUM_FILE_ELEMENTS              624
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define EL_FIRST_RUNTIME_REAL          NUM_FILE_ELEMENTS
 
-#define EL_EM_KEY_1                    (EL_FIRST_RUNTIME_REAL + 0)
-#define EL_EM_KEY_2                    (EL_FIRST_RUNTIME_REAL + 1)
-#define EL_EM_KEY_3                    (EL_FIRST_RUNTIME_REAL + 2)
-#define EL_EM_KEY_4                    (EL_FIRST_RUNTIME_REAL + 3)
-#define EL_DYNABOMB_PLAYER_1_ACTIVE    (EL_FIRST_RUNTIME_REAL + 4)
-#define EL_DYNABOMB_PLAYER_2_ACTIVE    (EL_FIRST_RUNTIME_REAL + 5)
-#define EL_DYNABOMB_PLAYER_3_ACTIVE    (EL_FIRST_RUNTIME_REAL + 6)
-#define EL_DYNABOMB_PLAYER_4_ACTIVE    (EL_FIRST_RUNTIME_REAL + 7)
-#define EL_SP_DISK_RED_ACTIVE          (EL_FIRST_RUNTIME_REAL + 8)
-#define EL_SWITCHGATE_OPENING          (EL_FIRST_RUNTIME_REAL + 9)
-#define EL_SWITCHGATE_CLOSING          (EL_FIRST_RUNTIME_REAL + 10)
-#define EL_TIMEGATE_OPENING            (EL_FIRST_RUNTIME_REAL + 11)
-#define EL_TIMEGATE_CLOSING            (EL_FIRST_RUNTIME_REAL + 12)
-#define EL_PEARL_BREAKING              (EL_FIRST_RUNTIME_REAL + 13)
-#define EL_TRAP_ACTIVE                 (EL_FIRST_RUNTIME_REAL + 14)
-#define EL_INVISIBLE_STEELWALL_ACTIVE  (EL_FIRST_RUNTIME_REAL + 15)
-#define EL_INVISIBLE_WALL_ACTIVE       (EL_FIRST_RUNTIME_REAL + 16)
-#define EL_INVISIBLE_SAND_ACTIVE       (EL_FIRST_RUNTIME_REAL + 17)
-#define EL_CONVEYOR_BELT_1_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 18)
-#define EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 19)
-#define EL_CONVEYOR_BELT_1_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 20)
-#define EL_CONVEYOR_BELT_2_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 21)
-#define EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 22)
-#define EL_CONVEYOR_BELT_2_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 23)
-#define EL_CONVEYOR_BELT_3_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 24)
-#define EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 25)
-#define EL_CONVEYOR_BELT_3_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 26)
-#define EL_CONVEYOR_BELT_4_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 27)
-#define EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 28)
-#define EL_CONVEYOR_BELT_4_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 29)
-#define EL_EXIT_OPENING                        (EL_FIRST_RUNTIME_REAL + 30)
-#define EL_SP_EXIT_OPEN                        (EL_FIRST_RUNTIME_REAL + 31)
-#define EL_SP_TERMINAL_ACTIVE          (EL_FIRST_RUNTIME_REAL + 32)
-#define EL_SP_BUGGY_BASE_ACTIVATING    (EL_FIRST_RUNTIME_REAL + 33)
-#define EL_SP_BUGGY_BASE_ACTIVE                (EL_FIRST_RUNTIME_REAL + 34)
-#define EL_SP_MURPHY_CLONE             (EL_FIRST_RUNTIME_REAL + 35)
-#define EL_AMOEBA_DROPPING             (EL_FIRST_RUNTIME_REAL + 36)
-#define EL_QUICKSAND_EMPTYING          (EL_FIRST_RUNTIME_REAL + 37)
-#define EL_MAGIC_WALL_ACTIVE           (EL_FIRST_RUNTIME_REAL + 38)
-#define EL_BD_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 39)
-#define EL_MAGIC_WALL_FULL             (EL_FIRST_RUNTIME_REAL + 40)
-#define EL_BD_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 41)
-#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 42)
-#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 43)
-#define EL_MAGIC_WALL_DEAD             (EL_FIRST_RUNTIME_REAL + 44)
-#define EL_BD_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 45)
+#define EL_DYNABOMB_PLAYER_1_ACTIVE    (EL_FIRST_RUNTIME_REAL + 0)
+#define EL_DYNABOMB_PLAYER_2_ACTIVE    (EL_FIRST_RUNTIME_REAL + 1)
+#define EL_DYNABOMB_PLAYER_3_ACTIVE    (EL_FIRST_RUNTIME_REAL + 2)
+#define EL_DYNABOMB_PLAYER_4_ACTIVE    (EL_FIRST_RUNTIME_REAL + 3)
+#define EL_SP_DISK_RED_ACTIVE          (EL_FIRST_RUNTIME_REAL + 4)
+#define EL_SWITCHGATE_OPENING          (EL_FIRST_RUNTIME_REAL + 5)
+#define EL_SWITCHGATE_CLOSING          (EL_FIRST_RUNTIME_REAL + 6)
+#define EL_TIMEGATE_OPENING            (EL_FIRST_RUNTIME_REAL + 7)
+#define EL_TIMEGATE_CLOSING            (EL_FIRST_RUNTIME_REAL + 8)
+#define EL_PEARL_BREAKING              (EL_FIRST_RUNTIME_REAL + 9)
+#define EL_TRAP_ACTIVE                 (EL_FIRST_RUNTIME_REAL + 10)
+#define EL_INVISIBLE_STEELWALL_ACTIVE  (EL_FIRST_RUNTIME_REAL + 11)
+#define EL_INVISIBLE_WALL_ACTIVE       (EL_FIRST_RUNTIME_REAL + 12)
+#define EL_INVISIBLE_SAND_ACTIVE       (EL_FIRST_RUNTIME_REAL + 13)
+#define EL_CONVEYOR_BELT_1_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 14)
+#define EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 15)
+#define EL_CONVEYOR_BELT_1_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 16)
+#define EL_CONVEYOR_BELT_2_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 17)
+#define EL_CONVEYOR_BELT_2_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 18)
+#define EL_CONVEYOR_BELT_2_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 19)
+#define EL_CONVEYOR_BELT_3_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 20)
+#define EL_CONVEYOR_BELT_3_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 21)
+#define EL_CONVEYOR_BELT_3_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 22)
+#define EL_CONVEYOR_BELT_4_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 23)
+#define EL_CONVEYOR_BELT_4_MIDDLE_ACTIVE (EL_FIRST_RUNTIME_REAL + 24)
+#define EL_CONVEYOR_BELT_4_RIGHT_ACTIVE         (EL_FIRST_RUNTIME_REAL + 25)
+#define EL_EXIT_OPENING                        (EL_FIRST_RUNTIME_REAL + 26)
+#define EL_EXIT_CLOSING                        (EL_FIRST_RUNTIME_REAL + 27)
+#define EL_SP_EXIT_OPENING             (EL_FIRST_RUNTIME_REAL + 28)
+#define EL_SP_EXIT_CLOSING             (EL_FIRST_RUNTIME_REAL + 29)
+#define EL_SP_EXIT_OPEN                        (EL_FIRST_RUNTIME_REAL + 30)
+#define EL_SP_TERMINAL_ACTIVE          (EL_FIRST_RUNTIME_REAL + 31)
+#define EL_SP_BUGGY_BASE_ACTIVATING    (EL_FIRST_RUNTIME_REAL + 32)
+#define EL_SP_BUGGY_BASE_ACTIVE                (EL_FIRST_RUNTIME_REAL + 33)
+#define EL_SP_MURPHY_CLONE             (EL_FIRST_RUNTIME_REAL + 34)
+#define EL_AMOEBA_DROPPING             (EL_FIRST_RUNTIME_REAL + 35)
+#define EL_QUICKSAND_EMPTYING          (EL_FIRST_RUNTIME_REAL + 36)
+#define EL_MAGIC_WALL_ACTIVE           (EL_FIRST_RUNTIME_REAL + 37)
+#define EL_BD_MAGIC_WALL_ACTIVE                (EL_FIRST_RUNTIME_REAL + 38)
+#define EL_MAGIC_WALL_FULL             (EL_FIRST_RUNTIME_REAL + 39)
+#define EL_BD_MAGIC_WALL_FULL          (EL_FIRST_RUNTIME_REAL + 40)
+#define EL_MAGIC_WALL_EMPTYING         (EL_FIRST_RUNTIME_REAL + 41)
+#define EL_BD_MAGIC_WALL_EMPTYING      (EL_FIRST_RUNTIME_REAL + 42)
+#define EL_MAGIC_WALL_DEAD             (EL_FIRST_RUNTIME_REAL + 43)
+#define EL_BD_MAGIC_WALL_DEAD          (EL_FIRST_RUNTIME_REAL + 44)
 
 /* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 46)
+#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 45)
 
 #define EL_BLOCKED                     (EL_FIRST_RUNTIME_UNREAL + 0)
 #define EL_EXPLOSION                   (EL_FIRST_RUNTIME_UNREAL + 1)
 #define EL_INVISIBLE_STEELWALL_BOTTOMRIGHT     (EL_FIRST_DUMMY + 9)
 #define EL_INVISIBLE_STEELWALL_HORIZONTAL      (EL_FIRST_DUMMY + 10)
 #define EL_INVISIBLE_STEELWALL_VERTICAL                (EL_FIRST_DUMMY + 11)
-#define EL_SAND_CRUMBLED                       (EL_FIRST_DUMMY + 12)
+#define EL_DYNABOMB                            (EL_FIRST_DUMMY + 12)
 #define EL_DYNABOMB_ACTIVE                     (EL_FIRST_DUMMY + 13)
-#define EL_SHIELD_NORMAL_ACTIVE                        (EL_FIRST_DUMMY + 14)
-#define EL_SHIELD_DEADLY_ACTIVE                        (EL_FIRST_DUMMY + 15)
-#define EL_DEFAULT                             (EL_FIRST_DUMMY + 16)
-#define EL_BD_DEFAULT                          (EL_FIRST_DUMMY + 17)
-#define EL_SP_DEFAULT                          (EL_FIRST_DUMMY + 18)
-#define EL_SB_DEFAULT                          (EL_FIRST_DUMMY + 19)
-
-#define MAX_NUM_ELEMENTS                       (EL_FIRST_DUMMY + 20)
+#define EL_DYNABOMB_PLAYER_1                   (EL_FIRST_DUMMY + 14)
+#define EL_DYNABOMB_PLAYER_2                   (EL_FIRST_DUMMY + 15)
+#define EL_DYNABOMB_PLAYER_3                   (EL_FIRST_DUMMY + 16)
+#define EL_DYNABOMB_PLAYER_4                   (EL_FIRST_DUMMY + 17)
+#define EL_SHIELD_NORMAL_ACTIVE                        (EL_FIRST_DUMMY + 18)
+#define EL_SHIELD_DEADLY_ACTIVE                        (EL_FIRST_DUMMY + 19)
+#define EL_AMOEBA                              (EL_FIRST_DUMMY + 20)
+#define EL_DEFAULT                             (EL_FIRST_DUMMY + 21)
+#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_DUMMY                               (EL_FIRST_DUMMY + 25)
+
+#define MAX_NUM_ELEMENTS                       (EL_FIRST_DUMMY + 26)
 
 
 /* values for graphics/sounds action types */
 #define ACTION_EMPTYING                                22
 #define ACTION_CHANGING                                23
 #define ACTION_EXPLODING                       24
-#define ACTION_DYING                           25
-#define ACTION_OTHER                           26
+#define ACTION_BORING                          25
+#define ACTION_BORING_1                                26
+#define ACTION_BORING_2                                27
+#define ACTION_BORING_3                                28
+#define ACTION_BORING_4                                29
+#define ACTION_BORING_5                                30
+#define ACTION_BORING_6                                31
+#define ACTION_BORING_7                                32
+#define ACTION_BORING_8                                33
+#define ACTION_BORING_9                                34
+#define ACTION_BORING_10                       35
+#define ACTION_SLEEPING                                36
+#define ACTION_SLEEPING_1                      37
+#define ACTION_SLEEPING_2                      38
+#define ACTION_SLEEPING_3                      39
+#define ACTION_AWAKENING                       40
+#define ACTION_DYING                           41
+#define ACTION_TURNING                         42
+#define ACTION_TURNING_FROM_LEFT               43
+#define ACTION_TURNING_FROM_RIGHT              44
+#define ACTION_TURNING_FROM_UP                 45
+#define ACTION_TURNING_FROM_DOWN               46
+#define ACTION_OTHER                           47
+
+#define NUM_ACTIONS                            48
+
+#define ACTION_BORING_LAST                     ACTION_BORING_10
+#define ACTION_SLEEPING_LAST                   ACTION_SLEEPING_3
 
-#define NUM_ACTIONS                            27
 
 /* 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 GFX_SPECIAL_ARG_EDITOR                 3
-#define GFX_SPECIAL_ARG_INFO                   4
-#define GFX_SPECIAL_ARG_SETUP                  5
-#define GFX_SPECIAL_ARG_DOOR                   6
-#define GFX_SPECIAL_ARG_PREVIEW                        7
+#define GFX_SPECIAL_ARG_DEFAULT                        0
+#define GFX_SPECIAL_ARG_MAIN                   1
+#define GFX_SPECIAL_ARG_LEVELS                 2
+#define GFX_SPECIAL_ARG_SCORES                 3
+#define GFX_SPECIAL_ARG_EDITOR                 4
+#define GFX_SPECIAL_ARG_INFO                   5
+#define GFX_SPECIAL_ARG_SETUP                  6
+#define GFX_SPECIAL_ARG_PLAYING                        7
+#define GFX_SPECIAL_ARG_DOOR                   8
+#define GFX_SPECIAL_ARG_PREVIEW                        9
+#define GFX_SPECIAL_ARG_CRUMBLED               10
 
-#define NUM_SPECIAL_GFX_ARGS                   8
+#define NUM_SPECIAL_GFX_ARGS                   11
 
 
 /* values for image configuration suffixes */
 #define GFX_ARG_DELAY                          13
 #define GFX_ARG_ANIM_MODE                      14
 #define GFX_ARG_GLOBAL_SYNC                    15
-#define GFX_ARG_STEP_OFFSET                    16
-#define GFX_ARG_STEP_DELAY                     17
-#define GFX_ARG_DIRECTION                      18
-#define GFX_ARG_POSITION                       19
-#define GFX_ARG_DRAW_XOFFSET                   20
-#define GFX_ARG_DRAW_YOFFSET                   21
-#define GFX_ARG_NAME                           22
-
-#define NUM_GFX_ARGS                           23
+#define GFX_ARG_CRUMBLED_LIKE                  16
+#define GFX_ARG_DIGGABLE_LIKE                  17
+#define GFX_ARG_BORDER_SIZE                    18
+#define GFX_ARG_STEP_OFFSET                    19
+#define GFX_ARG_STEP_DELAY                     20
+#define GFX_ARG_DIRECTION                      21
+#define GFX_ARG_POSITION                       22
+#define GFX_ARG_DRAW_XOFFSET                   23
+#define GFX_ARG_DRAW_YOFFSET                   24
+#define GFX_ARG_DRAW_MASKED                    25
+#define GFX_ARG_ANIM_DELAY_FIXED               26
+#define GFX_ARG_ANIM_DELAY_RANDOM              27
+#define GFX_ARG_POST_DELAY_FIXED               28
+#define GFX_ARG_POST_DELAY_RANDOM              29
+#define GFX_ARG_NAME                           30
+
+#define NUM_GFX_ARGS                           31
 
 
 /* values for sound configuration suffixes */
 #define NUM_SND_ARGS                           1
 
 
-/* values for font configuration */
+/* values for music configuration suffixes */
+#define MUS_ARG_MODE_LOOP                      0
+
+#define NUM_MUS_ARGS                           1
 
+
+/* values for font configuration */
 #define FONT_INITIAL_1                         0
 #define FONT_INITIAL_2                         1
 #define FONT_INITIAL_3                         2
 #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 FONT_ENVELOPE_1                                16
+#define FONT_ENVELOPE_2                                17
+#define FONT_ENVELOPE_3                                18
+#define FONT_ENVELOPE_4                                19
+#define FONT_INPUT_1_ACTIVE                    20
+#define FONT_INPUT_2_ACTIVE                    21
+#define FONT_INPUT_1                           22
+#define FONT_INPUT_2                           23
+#define FONT_OPTION_OFF                                24
+#define FONT_OPTION_ON                         25
+#define FONT_VALUE_1                           26
+#define FONT_VALUE_2                           27
+#define FONT_VALUE_OLD                         28
+#define FONT_LEVEL_NUMBER                      29
+#define FONT_TAPE_RECORDER                     30
+#define FONT_GAME_INFO                         31
+
+#define NUM_FONTS                              32
 #define NUM_INITIAL_FONTS                      4
 
 /* 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
+#define GAME_MODE_DEFAULT                      0
+#define GAME_MODE_MAIN                         1
+#define GAME_MODE_LEVELS                       2
+#define GAME_MODE_SCORES                       3
+#define GAME_MODE_EDITOR                       4
+#define GAME_MODE_INFO                         5
+#define GAME_MODE_SETUP                                6
+#define GAME_MODE_PLAYING                      7
+#define GAME_MODE_PSEUDO_DOOR                  8
+#define GAME_MODE_PSEUDO_PREVIEW               9
+#define GAME_MODE_PSEUDO_CRUMBLED              10
 
 /* 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 GAME_MODE_PSEUDO_TYPENAME              11
+#define GAME_MODE_QUIT                         12
 
-#define PROGRAM_VERSION_MAJOR  2
-#define PROGRAM_VERSION_MINOR  2
-#define PROGRAM_VERSION_PATCH  0
-#define PROGRAM_VERSION_RELEASE        7
-#define PROGRAM_VERSION_STRING "2.2.0rc7"
+/* special definitions currently only used for custom artwork configuration */
+#define MUSIC_PREFIX_BACKGROUND                        0
+#define NUM_MUSIC_PREFIXES                     1
+#define MAX_LEVELS                             1000
+
+/* definitions for demo animation lists */
+#define HELPANIM_LIST_NEXT                     -1
+#define HELPANIM_LIST_END                      -999
+
+
+/* program information and versioning definitions */
+
+#define PROGRAM_VERSION_MAJOR  3
+#define PROGRAM_VERSION_MINOR  0
+#define PROGRAM_VERSION_PATCH  8
+#define PROGRAM_VERSION_BUILD  3
 
 #define PROGRAM_TITLE_STRING   "Rocks'n'Diamonds"
 #define PROGRAM_AUTHOR_STRING  "Holger Schemel"
-#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
-#define WINDOW_SUBTITLE_STRING PROGRAM_RIGHTS_STRING " " PROGRAM_AUTHOR_STRING
+#define PROGRAM_COPYRIGHT_STRING "Copyright ©1995-2003 by Holger Schemel"
+
 #define ICON_TITLE_STRING      PROGRAM_TITLE_STRING
 #define COOKIE_PREFIX          "ROCKSNDIAMONDS"
 #define FILENAME_PREFIX                "Rocks"
 **     1.4 (still in use)
 **     2.0 (actual)
 */
-#define FILE_VERSION_1_0       VERSION_IDENT(1,0,0)
-#define FILE_VERSION_1_2       VERSION_IDENT(1,2,0)
-#define FILE_VERSION_1_4       VERSION_IDENT(1,4,0)
-#define FILE_VERSION_2_0       VERSION_IDENT(2,0,0)
+#define FILE_VERSION_1_0       VERSION_IDENT(1,0,0,0)
+#define FILE_VERSION_1_2       VERSION_IDENT(1,2,0,0)
+#define FILE_VERSION_1_4       VERSION_IDENT(1,4,0,0)
+#define FILE_VERSION_2_0       VERSION_IDENT(2,0,0,0)
 
 /* file version does not change for every program version, but is changed
    when new features are introduced that are incompatible with older file
 #define GAME_VERSION_1_4       FILE_VERSION_1_4
 #define GAME_VERSION_2_0       FILE_VERSION_2_0
 
-#define GAME_VERSION_ACTUAL    RELEASE_IDENT(PROGRAM_VERSION_MAJOR, \
+#define GAME_VERSION_ACTUAL    VERSION_IDENT(PROGRAM_VERSION_MAJOR, \
                                              PROGRAM_VERSION_MINOR, \
                                              PROGRAM_VERSION_PATCH, \
-                                             PROGRAM_VERSION_RELEASE)
+                                             PROGRAM_VERSION_BUILD)
 
 /* values for game_emulation */
 #define EMU_NONE               0
 #define EMU_SOKOBAN            2
 #define EMU_SUPAPLEX           3
 
+struct MenuInfo
+{
+  int draw_xoffset_default;
+  int draw_yoffset_default;
+  int draw_xoffset[NUM_SPECIAL_GFX_ARGS];
+  int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
+
+  int scrollbar_xoffset;
+
+  int list_size_default;
+  int list_size[NUM_SPECIAL_GFX_ARGS];
+
+  int sound[NUM_SPECIAL_GFX_ARGS];
+  int music[NUM_SPECIAL_GFX_ARGS];
+};
+
+struct DoorInfo
+{
+  int step_offset;
+  int step_delay;
+  int anim_mode;
+};
+
 struct HiScore
 {
   char Name[MAX_PLAYER_NAME_LEN + 1];
@@ -1013,25 +1188,45 @@ struct PlayerInfo
   byte programmed_action;      /* action forced by game itself (like moving
                                   through doors); overrides other actions */
 
-  int jx,jy, last_jx,last_jy;
+  int jx, jy, last_jx, last_jy;
   int MovDir, MovPos, GfxDir, GfxPos;
   int Frame, StepFrame;
 
   int GfxAction;
 
   boolean use_murphy_graphic;
-  boolean use_disk_red_graphic;
 
-  boolean Pushing;
-  boolean Switching;
   boolean LevelSolved, GameOver;
-  boolean snapped;
 
   int last_move_dir;
-  boolean is_moving;
+
   boolean is_waiting;
+  boolean is_moving;
   boolean is_digging;
+  boolean is_snapping;
   boolean is_collecting;
+  boolean is_pushing;
+  boolean is_switching;
+
+  boolean is_bored;
+  boolean is_sleeping;
+
+  int frame_counter_bored;
+  int frame_counter_sleeping;
+
+  int anim_delay_counter;
+  int post_delay_counter;
+
+  int action_waiting, last_action_waiting;
+  int special_action_bored;
+  int special_action_sleeping;
+
+  int num_special_action_bored;
+  int num_special_action_sleeping;
+
+  int switch_x, switch_y;
+
+  int show_envelope;
 
   unsigned long move_delay;
   int move_delay_value;
@@ -1041,16 +1236,25 @@ struct PlayerInfo
 
   unsigned long actual_frame_counter;
 
+  int step_counter;
+
   int score;
   int gems_still_needed;
   int sokobanfields_still_needed;
   int lights_still_needed;
   int friends_still_needed;
   int key[4];
-  int dynamite;
   int dynabomb_count, dynabomb_size, dynabombs_left, dynabomb_xl;
   int shield_normal_time_left;
   int shield_deadly_time_left;
+
+  int inventory_element[MAX_INVENTORY_SIZE];
+  int inventory_size;
+};
+
+struct LevelSetInfo
+{
+  int music[MAX_LEVELS];
 };
 
 struct LevelInfo
@@ -1062,12 +1266,13 @@ struct LevelInfo
   boolean encoding_16bit_yamyam;       /* yamyam contains 16-bit elements */
   boolean encoding_16bit_amoeba;       /* amoeba contains 16-bit elements */
 
-  int fieldx;
-  int fieldy;
+  int fieldx, fieldy;
   int time;
   int gems_needed;
   char name[MAX_LEVEL_NAME_LEN + 1];
   char author[MAX_LEVEL_AUTHOR_LEN + 1];
+  char envelope_text[4][MAX_ENVELOPE_TEXT_LEN + 1];
+  int envelope_xsize[4], envelope_ysize[4];
   int score[LEVEL_SCORE_ELEMENTS];
   int yamyam_content[MAX_ELEMENT_CONTENTS][3][3];
   int num_yamyam_contents;
@@ -1078,10 +1283,14 @@ struct LevelInfo
   int time_light;
   int time_timegate;
   boolean double_speed;
-  boolean gravity;
+  boolean initial_gravity;
   boolean em_slippery_gems;    /* EM style "gems slip from wall" behaviour */
 
-  boolean no_level_file;
+  short field[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+
+  boolean use_custom_template; /* use custom properties from template file */
+
+  boolean no_level_file;       /* set for currently undefined levels */
 };
 
 struct TapeInfo
@@ -1119,11 +1328,16 @@ struct TapeInfo
 
 struct GameInfo
 {
+  /* values for engine initialization */
+  int default_push_delay_fixed;
+  int default_push_delay_random;
+
   /* constant within running game */
   int engine_version;
   int emulation;
   int initial_move_delay;
   int initial_move_delay_value;
+  int initial_push_delay_value;
 
   /* variable within running game */
   int yamyam_content_nr;
@@ -1135,7 +1349,15 @@ struct GameInfo
   int belt_dir_nr[4];
   int switchgate_pos;
   int balloon_dir;
+  boolean gravity;
   boolean explosions_delayed;
+  boolean envelope_active;
+
+  /* values for player idle animation (no effect on engine) */
+  int player_boring_delay_fixed;
+  int player_boring_delay_random;
+  int player_sleeping_delay_fixed;
+  int player_sleeping_delay_random;
 };
 
 struct GlobalInfo
@@ -1150,38 +1372,26 @@ struct GlobalInfo
   int fps_slowdown_factor;
 };
 
-struct MenuInfo
+struct ElementChangeInfo
 {
-  int draw_xoffset_default;
-  int draw_yoffset_default;
-  int draw_xoffset[NUM_SPECIAL_GFX_ARGS];
-  int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
+  boolean can_change;          /* use or ignore this change info */
 
-  int list_size_default;
-  int list_size[NUM_SPECIAL_GFX_ARGS];
-};
-
-struct DoorInfo
-{
-  int step_offset;
-  int step_delay;
-};
+  unsigned long events;                /* change events */
+  int sides;                   /* change sides */
 
-struct ElementChangeInfo
-{
-  unsigned long events;                /* bitfield for change events */
+  short target_element;                /* target element after change */
 
   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 trigger;               /* custom element triggering change */
-
-  short target_element;                /* target element after change */
+  short trigger_element;       /* custom element triggering change */
 
   int content[3][3];           /* new elements after extended change */
   boolean use_content;         /* use extended change content */
   boolean only_complete;       /* only use complete content */
+  boolean use_random_change;   /* use random value for setting content */
+  int random;                  /* random value for setting content */
   int power;                   /* power of extended change */
 
   boolean explode;             /* explode instead of change */
@@ -1191,6 +1401,11 @@ struct ElementChangeInfo
   void (*pre_change_function)(int x, int y);
   void (*change_function)(int x, int y);
   void (*post_change_function)(int x, int y);
+
+  /* ---------- internal values used in level editor ---------- */
+
+  int direct_action;           /* change triggered by actions on element */
+  int other_action;            /* change triggered by other element actions */
 };
 
 struct ElementInfo
@@ -1199,14 +1414,20 @@ struct ElementInfo
 
   char *token_name;            /* element token used in config files */
   char *class_name;            /* element class used in config files */
-  char *editor_description;    /* short description for level editor */
-  char *custom_description;    /* custom description for level editor */
+  char *editor_description;    /* pre-defined description for level editor */
+  char *custom_description;    /* alternative description from config file */
+  char description[MAX_ELEMENT_NAME_LEN + 1];  /* for custom elements */
 
   /* ---------- graphic and sound definitions ---------- */
 
   int graphic[NUM_ACTIONS];    /* default graphics for several actions */
   int direction_graphic[NUM_ACTIONS][NUM_DIRECTIONS];
                                /* special graphics for left/right/up/down */
+
+  int crumbled[NUM_ACTIONS];   /* crumbled graphics for several actions */
+  int direction_crumbled[NUM_ACTIONS][NUM_DIRECTIONS];
+                               /* crumbled graphics for left/right/up/down */
+
   int special_graphic[NUM_SPECIAL_GFX_ARGS];
                                /* special graphics for certain screens */
 
@@ -1214,13 +1435,11 @@ struct ElementInfo
 
   /* ---------- special element property values ---------- */
 
-  boolean use_template;                /* use all properties from template file */
-
-  boolean use_gfx_element;
+  boolean use_gfx_element;     /* use custom graphic element */
   short gfx_element;           /* optional custom graphic element */
 
-  int score;                   /* score value for collecting */
-  int gem_count;               /* gem count value for collecting */
+  int collect_score;           /* score value for collecting */
+  int collect_count;           /* count value for collecting */
 
   int push_delay_fixed;                /* constant frame delay for pushing */
   int push_delay_random;       /* additional random frame delay for pushing */
@@ -1231,9 +1450,37 @@ struct ElementInfo
   int move_direction_initial;  /* initial direction element moves to */
   int move_stepsize;           /* step size element moves with */
 
+  int slippery_type;           /* how/where other elements slip away */
+
   int content[3][3];           /* new elements after explosion */
 
-  struct ElementChangeInfo change;
+  struct ElementChangeInfo *change_page; /* actual list of change pages */
+  struct ElementChangeInfo *change;     /* pointer to current change page */
+
+  int num_change_pages;                /* actual number of change pages */
+  int current_change_page;     /* currently edited change page */
+
+  /* ---------- internal values used at runtime when playing ---------- */
+
+  unsigned long change_events; /* bitfield for combined change events */
+
+  int event_page_nr[NUM_CHANGE_EVENTS]; /* page number for each event */
+  struct ElementChangeInfo *event_page[NUM_CHANGE_EVENTS]; /* page for event */
+
+  /* ---------- internal values used in level editor ---------- */
+
+  int access_type;             /* walkable or passable */
+  int access_layer;            /* accessible over/inside/under */
+  int walk_to_action;          /* diggable/collectible/pushable */
+  int smash_targets;           /* can smash player/enemies/everything */
+  int deadliness;              /* deadly when running/colliding/touching */
+  int consistency;             /* indestructible/can explode */
+
+  boolean can_explode_by_fire; /* element explodes by fire */
+  boolean can_explode_smashed; /* element explodes when smashed */
+  boolean can_explode_impact;  /* element explodes on impact */
+
+  boolean modified_settings;   /* set for all modified custom elements */
 };
 
 struct FontInfo
@@ -1259,12 +1506,22 @@ struct GraphicInfo
   int anim_delay;              /* important: delay of 1 means "no delay"! */
   int anim_mode;
   boolean anim_global_sync;
+  int crumbled_like;           /* element for cloning crumble graphics */
+  int diggable_like;           /* element for cloning digging graphics */
+  int border_size;             /* border size for "crumbled" graphics */
+
+  int anim_delay_fixed;                /* optional delay values for bored and   */
+  int anim_delay_random;       /* sleeping player animations (animation */
+  int post_delay_fixed;                /* intervall and following pause before  */
+  int post_delay_random;       /* next intervall (bored animation only) */
 
   int step_offset;             /* optional step offset of toon animations */
   int step_delay;              /* optional step delay of toon animations */
 
   int draw_x, draw_y;          /* optional offset for drawing fonts chars */
 
+  int draw_masked;             /* optional setting for drawing envelope gfx */
+
 #if defined(TARGET_X11_NATIVE_PERFORMANCE_WORKAROUND)
   Pixmap clip_mask;            /* single-graphic-only clip mask for X11 */
   GC clip_gc;                  /* single-graphic-only clip gc for X11 */
@@ -1276,6 +1533,38 @@ struct SoundInfo
   boolean loop;
 };
 
+struct MusicInfo
+{
+  boolean loop;
+};
+
+struct MusicPrefixInfo
+{
+  char *prefix;
+  boolean is_loop_music;
+};
+
+struct MusicFileInfo
+{
+  char *basename;
+
+  char *title_header;
+  char *artist_header;
+  char *album_header;
+  char *year_header;
+
+  char *title;
+  char *artist;
+  char *album;
+  char *year;
+
+  int music;
+
+  boolean is_sound;
+
+  struct MusicFileInfo *next;
+};
+
 struct ElementActionInfo
 {
   char *suffix;
@@ -1295,6 +1584,15 @@ struct SpecialSuffixInfo
   int value;
 };
 
+struct HelpAnimInfo
+{
+  int element;
+  int action;
+  int direction;
+
+  int delay;
+};
+
 
 #if 0
 extern GC                      tile_clip_gc;
@@ -1315,30 +1613,36 @@ extern boolean                  redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 extern int                     redraw_x1, redraw_y1;
 
 extern short                   Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short                   Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   ChangePage[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 boolean                 Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-extern short                   JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern unsigned long           Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern unsigned long           ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern short                   WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   AmoebaCnt[MAX_NUM_AMOEBA];
 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 int                     RunnerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int                     PlayerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
 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];
 extern int                     GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 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                     lev_fieldx, lev_fieldy;
 extern int                     scroll_x, scroll_y;
@@ -1365,23 +1669,35 @@ extern boolean                  network_player_action_received;
 
 extern int                     graphics_action_mapping[];
 
-extern struct LevelInfo                level;
+extern struct LevelSetInfo     levelset;
+extern struct LevelInfo                level, level_template;
 extern struct PlayerInfo       stored_player[], *local_player;
 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 DoorInfo         door_1, door_2;
 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 MusicPrefixInfo  music_prefix_info[];
 extern struct GraphicInfo      *graphic_info;
 extern struct SoundInfo               *sound_info;
-extern struct ConfigInfo       image_config[], sound_config[];
-extern struct ConfigInfo       image_config_suffix[], sound_config_suffix[];
+extern struct MusicInfo               *music_info;
+extern struct MusicFileInfo    *music_file_info;
+extern struct HelpAnimInfo     *helpanim_info;
+extern SetupFileHash           *helptext_info;
+extern struct ConfigInfo       image_config[];
+extern struct ConfigInfo       sound_config[];
+extern struct ConfigInfo       music_config[];
+extern struct ConfigInfo       image_config_suffix[];
+extern struct ConfigInfo       sound_config_suffix[];
+extern struct ConfigInfo       music_config_suffix[];
+extern struct ConfigInfo       helpanim_config[];
+extern struct ConfigInfo       helptext_config[];
 
 #endif /* MAIN_H */