rnd-20030902-1-src
[rocksndiamonds.git] / src / main.h
index b81abcb12d261e95b7a0e62c6e2a2877a98f9520..68ad89ca303d0a240c3c656f0e3d25204e26c355 100644 (file)
@@ -33,6 +33,7 @@
 #define IMG_UNDEFINED          (-1)
 #define IMG_EMPTY              IMG_EMPTY_SPACE
 #define IMG_SP_EMPTY           IMG_SP_EMPTY_SPACE
+#define IMG_EXPLOSION          IMG_DEFAULT_EXPLODING
 #define IMG_CHAR_START         IMG_CHAR_SPACE
 #define IMG_CUSTOM_START       IMG_CUSTOM_1
 
 #define IN_SCR_FIELD(x,y) ((x)>=BX1 && (x)<=BX2 && (y)>=BY1 &&(y)<=BY2)
 #define IN_LEV_FIELD(x,y) ((x)>=0 && (x)<lev_fieldx && (y)>=0 &&(y)<lev_fieldy)
 
-/* values for 'Properties1' */
-#define EP_BIT_AMOEBALIVE      (1 << 0)
-#define EP_BIT_AMOEBOID                (1 << 1)
-#define EP_BIT_SCHLUESSEL      (1 << 2)
-#define EP_BIT_PFORTE          (1 << 3)
-#define EP_BIT_SOLID           (1 << 4)
-#define EP_BIT_INDESTRUCTIBLE  (1 << 5)
-#define EP_BIT_SLIPPERY                (1 << 6)
-#define EP_BIT_ENEMY           (1 << 7)
-#define EP_BIT_MAUER           (1 << 8)
-#define EP_BIT_CAN_FALL                (1 << 9)
-#define EP_BIT_CAN_SMASH       (1 << 10)
-#define EP_BIT_CAN_CHANGE      (1 << 11)
-#define EP_BIT_CAN_MOVE                (1 << 12)
-#define EP_BIT_COULD_MOVE      (1 << 13)
-#define EP_BIT_DONT_TOUCH      (1 << 14)
-#define EP_BIT_DONT_GO_TO      (1 << 15)
-#define EP_BIT_MAMPF2          (1 << 16)
-#define EP_BIT_CHAR            (1 << 17)
-#define EP_BIT_BD_ELEMENT      (1 << 18)
-#define EP_BIT_SB_ELEMENT      (1 << 19)
-#define EP_BIT_GEM             (1 << 20)
-#define EP_BIT_INACTIVE                (1 << 21)
-#define EP_BIT_EXPLOSIVE       (1 << 22)
-#define EP_BIT_MAMPF3          (1 << 23)
-#define EP_BIT_PUSHABLE                (1 << 24)
-#define EP_BIT_PLAYER          (1 << 25)
-#define EP_BIT_HAS_CONTENT     (1 << 26)
-#define EP_BIT_EATABLE         (1 << 27)
-#define EP_BIT_SP_ELEMENT      (1 << 28)
-#define EP_BIT_QUICK_GATE      (1 << 29)
-#define EP_BIT_OVER_PLAYER     (1 << 30)
-#define EP_BIT_ACTIVE_BOMB     (1 << 31)
-
-/* values for 'Properties2' */
-#define EP_BIT_BELT            (1 << 0)
-#define EP_BIT_BELT_ACTIVE     (1 << 1)
-#define EP_BIT_BELT_SWITCH     (1 << 2)
-#define EP_BIT_TUBE            (1 << 3)
-#define EP_BIT_EM_SLIPPERY_WALL        (1 << 4)
+/* values for configurable properties (custom elem's only, else pre-defined) */
+#define EP_DIGGABLE            0
+#define EP_COLLECTIBLE_ONLY    1
+#define EP_DONT_RUN_INTO       2
+#define EP_DONT_COLLIDE_WITH   3
+#define EP_DONT_TOUCH          4
+#define EP_INDESTRUCTIBLE      5
+#define EP_SLIPPERY            6
+#define EP_CAN_CHANGE          7
+#define EP_CAN_MOVE            8
+#define EP_CAN_FALL            9
+#define EP_CAN_SMASH_PLAYER    10
+#define EP_CAN_SMASH_ENEMIES   11
+#define EP_CAN_SMASH_EVERYTHING        12
+#define EP_CAN_EXPLODE_BY_FIRE 13
+#define EP_CAN_EXPLODE_SMASHED 14
+#define EP_CAN_EXPLODE_IMPACT  15
+#define EP_WALKABLE_OVER       16
+#define EP_WALKABLE_INSIDE     17
+#define EP_WALKABLE_UNDER      18
+#define EP_PASSABLE_OVER       19
+#define EP_PASSABLE_INSIDE     20
+#define EP_PASSABLE_UNDER      21
+#define EP_DROPPABLE           22
+#define EP_CAN_EXPLODE_1X1     23
+#define EP_PUSHABLE            24
+
+/* values for special configurable properties (depending on level settings) */
+#define EP_EM_SLIPPERY_WALL    32
+
+/* 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
+
+/* values for derived properties (determined from properties above) */
+#define EP_ACCESSIBLE_OVER     57
+#define EP_ACCESSIBLE_INSIDE   58
+#define EP_ACCESSIBLE_UNDER    59
+#define EP_WALKABLE            60
+#define EP_PASSABLE            61
+#define EP_ACCESSIBLE          62
+#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      72
+#define EP_WALK_TO_OBJECT      73
+#define EP_DEADLY              74
+
+#define NUM_ELEMENT_PROPERTIES 75
+
+#define NUM_EP_BITFIELDS       ((NUM_ELEMENT_PROPERTIES + 31) / 32)
+#define EP_BITFIELD_BASE       0
 
 #define EP_BITMASK_DEFAULT     0
 
-#define IS_AMOEBALIVE(e)       (Properties1[e] & EP_BIT_AMOEBALIVE)
-#define IS_AMOEBOID(e)         (Properties1[e] & EP_BIT_AMOEBOID)
-#define IS_SCHLUESSEL(e)       (Properties1[e] & EP_BIT_SCHLUESSEL)
-#define IS_PFORTE(e)           (Properties1[e] & EP_BIT_PFORTE)
-#define IS_SOLID(e)            (Properties1[e] & EP_BIT_SOLID)
-#define IS_INDESTRUCTIBLE(e)   (Properties1[e] & EP_BIT_INDESTRUCTIBLE)
-#define IS_SLIPPERY(e)         (Properties1[e] & EP_BIT_SLIPPERY)
-#define IS_ENEMY(e)            (Properties1[e] & EP_BIT_ENEMY)
-#define IS_MAUER(e)            (Properties1[e] & EP_BIT_MAUER)
-#define CAN_FALL(e)            (Properties1[e] & EP_BIT_CAN_FALL)
-#define CAN_SMASH(e)           (Properties1[e] & EP_BIT_CAN_SMASH)
-#define CAN_CHANGE(e)          (Properties1[e] & EP_BIT_CAN_CHANGE)
-#define CAN_MOVE(e)            (Properties1[e] & EP_BIT_CAN_MOVE)
-#define COULD_MOVE(e)          (Properties1[e] & EP_BIT_COULD_MOVE)
-#define DONT_TOUCH(e)          (Properties1[e] & EP_BIT_DONT_TOUCH)
-#define DONT_GO_TO(e)          (Properties1[e] & EP_BIT_DONT_GO_TO)
-#define IS_MAMPF2(e)           (Properties1[e] & EP_BIT_MAMPF2)
-#define IS_CHAR(e)             (Properties1[e] & EP_BIT_CHAR)
-#define IS_BD_ELEMENT(e)       (Properties1[e] & EP_BIT_BD_ELEMENT)
-#define IS_SB_ELEMENT(e)       (Properties1[e] & EP_BIT_SB_ELEMENT)
-#define IS_GEM(e)              (Properties1[e] & EP_BIT_GEM)
-#define IS_INACTIVE(e)         (Properties1[e] & EP_BIT_INACTIVE)
-#define IS_EXPLOSIVE(e)                (Properties1[e] & EP_BIT_EXPLOSIVE)
-#define IS_MAMPF3(e)           (Properties1[e] & EP_BIT_MAMPF3)
-#define IS_PUSHABLE(e)         (Properties1[e] & EP_BIT_PUSHABLE)
-#define ELEM_IS_PLAYER(e)      (Properties1[e] & EP_BIT_PLAYER)
-#define HAS_CONTENT(e)         (Properties1[e] & EP_BIT_HAS_CONTENT)
-#define IS_EATABLE(e)          (Properties1[e] & EP_BIT_EATABLE)
-#define IS_SP_ELEMENT(e)       (Properties1[e] & EP_BIT_SP_ELEMENT)
-#define IS_QUICK_GATE(e)       (Properties1[e] & EP_BIT_QUICK_GATE)
-#define IS_OVER_PLAYER(e)      (Properties1[e] & EP_BIT_OVER_PLAYER)
-#define IS_ACTIVE_BOMB(e)      (Properties1[e] & EP_BIT_ACTIVE_BOMB)
-
-#define IS_BELT(e)             (Properties2[e] & EP_BIT_BELT)
-#define IS_BELT_ACTIVE(e)      (Properties2[e] & EP_BIT_BELT_ACTIVE)
-#define IS_BELT_SWITCH(e)      (Properties2[e] & EP_BIT_BELT_SWITCH)
-#define IS_TUBE(e)             (Properties2[e] & EP_BIT_TUBE)
-#define IS_EM_SLIPPERY_WALL(e) (Properties2[e] & EP_BIT_EM_SLIPPERY_WALL)
-
-#define IS_CUSTOM_ELEMENT(e)   ((e) >= EL_CUSTOM_START &&      \
+#define PROPERTY_BIT(p)                (1 << ((p) % 32))
+#define PROPERTY_VAR(e,p)      (Properties[e][(p) / 32])
+#define HAS_PROPERTY(e,p)      ((PROPERTY_VAR(e, p) & PROPERTY_BIT(p)) != 0)
+#define SET_PROPERTY(e,p,v)    ((v) ?                                     \
+                                (PROPERTY_VAR(e,p) |=  PROPERTY_BIT(p)) : \
+                                (PROPERTY_VAR(e,p) &= ~PROPERTY_BIT(p)))
+
+
+/* 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_DROPPED_BY_PLAYER   4
+#define CE_COLLISION           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
+
+/* values for activating change events (also stored in level file!) */
+#define CE_BY_PLAYER           16
+#define CE_BY_COLLISION                17
+#define CE_BY_OTHER            18
+
+#define NUM_CHANGE_EVENTS      19
+
+#define CE_BITMASK_DEFAULT     0
+
+#define CH_EVENT_BIT(c)                (1 << (c))
+#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 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
+
+/* 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)
+
+/* 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_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_INDESTRUCTIBLE(e)   HAS_PROPERTY(e, EP_INDESTRUCTIBLE)
+#define IS_SLIPPERY(e)         HAS_PROPERTY(e, EP_SLIPPERY)
+#define CAN_CHANGE(e)          HAS_PROPERTY(e, EP_CAN_CHANGE)
+#define CAN_MOVE(e)            HAS_PROPERTY(e, EP_CAN_MOVE)
+#define CAN_FALL(e)            HAS_PROPERTY(e, EP_CAN_FALL)
+#define CAN_SMASH_PLAYER(e)    HAS_PROPERTY(e, EP_CAN_SMASH_PLAYER)
+#define CAN_SMASH_ENEMIES(e)   HAS_PROPERTY(e, EP_CAN_SMASH_ENEMIES)
+#define CAN_SMASH_EVERYTHING(e)        HAS_PROPERTY(e, EP_CAN_SMASH_EVERYTHING)
+#define CAN_EXPLODE_BY_FIRE(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_BY_FIRE)
+#define CAN_EXPLODE_SMASHED(e) HAS_PROPERTY(e, EP_CAN_EXPLODE_SMASHED)
+#define CAN_EXPLODE_IMPACT(e)  HAS_PROPERTY(e, EP_CAN_EXPLODE_IMPACT)
+#define IS_WALKABLE_OVER(e)    HAS_PROPERTY(e, EP_WALKABLE_OVER)
+#define IS_WALKABLE_INSIDE(e)  HAS_PROPERTY(e, EP_WALKABLE_INSIDE)
+#define IS_WALKABLE_UNDER(e)   HAS_PROPERTY(e, EP_WALKABLE_UNDER)
+#define IS_PASSABLE_OVER(e)    HAS_PROPERTY(e, EP_PASSABLE_OVER)
+#define IS_PASSABLE_INSIDE(e)  HAS_PROPERTY(e, EP_PASSABLE_INSIDE)
+#define IS_PASSABLE_UNDER(e)   HAS_PROPERTY(e, EP_PASSABLE_UNDER)
+#define IS_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)
+
+/* 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 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_SB_ELEMENT(e)       HAS_PROPERTY(e, EP_SB_ELEMENT)
+#define IS_GEM(e)              HAS_PROPERTY(e, EP_GEM)
+#define IS_FOOD_DARK_YAMYAM(e) HAS_PROPERTY(e, EP_FOOD_DARK_YAMYAM)
+#define IS_FOOD_PENGUIN(e)     HAS_PROPERTY(e, EP_FOOD_PENGUIN)
+#define IS_FOOD_PIG(e)         HAS_PROPERTY(e, EP_FOOD_PIG)
+#define IS_HISTORIC_WALL(e)    HAS_PROPERTY(e, EP_HISTORIC_WALL)
+#define IS_HISTORIC_SOLID(e)   HAS_PROPERTY(e, EP_HISTORIC_SOLID)
+#define IS_CLASSIC_ENEMY(e)    HAS_PROPERTY(e, EP_CLASSIC_ENEMY)
+#define IS_BELT(e)             HAS_PROPERTY(e, EP_BELT)
+#define IS_BELT_ACTIVE(e)      HAS_PROPERTY(e, EP_BELT_ACTIVE)
+#define IS_BELT_SWITCH(e)      HAS_PROPERTY(e, EP_BELT_SWITCH)
+#define IS_TUBE(e)             HAS_PROPERTY(e, EP_TUBE)
+#define IS_KEYGATE(e)          HAS_PROPERTY(e, EP_KEYGATE)
+#define IS_AMOEBOID(e)         HAS_PROPERTY(e, EP_AMOEBOID)
+#define IS_AMOEBALIVE(e)       HAS_PROPERTY(e, EP_AMOEBALIVE)
+#define HAS_CONTENT(e)         HAS_PROPERTY(e, EP_HAS_CONTENT)
+#define IS_ACTIVE_BOMB(e)      HAS_PROPERTY(e, EP_ACTIVE_BOMB)
+#define IS_INACTIVE(e)         HAS_PROPERTY(e, EP_INACTIVE)
+
+/* macros for derived properties */
+#define IS_ACCESSIBLE_OVER(e)  HAS_PROPERTY(e, EP_ACCESSIBLE_OVER)
+#define IS_ACCESSIBLE_INSIDE(e)        HAS_PROPERTY(e, EP_ACCESSIBLE_INSIDE)
+#define IS_ACCESSIBLE_UNDER(e) HAS_PROPERTY(e, EP_ACCESSIBLE_UNDER)
+#define IS_WALKABLE(e)         HAS_PROPERTY(e, EP_WALKABLE)
+#define IS_PASSABLE(e)         HAS_PROPERTY(e, EP_PASSABLE)
+#define IS_ACCESSIBLE(e)       HAS_PROPERTY(e, EP_ACCESSIBLE)
+#define IS_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 GFX_ELEMENT(e)         (element_info[e].use_gfx_element ?      \
+                                element_info[e].gfx_element : e)
+
 #define IS_PLAYER(x,y)         (ELEM_IS_PLAYER(StorePlayer[x][y]))
 
 #define IS_FREE(x,y)           (Feld[x][y] == EL_EMPTY && !IS_PLAYER(x,y))
 #define TAPE_IS_EMPTY(x)       ((x).length == 0)
 #define TAPE_IS_STOPPED(x)     (!(x).recording && !(x).playing)
 
-#define PLAYERINFO(x,y)                (&stored_player[StorePlayer[x][y]-EL_PLAYER1])
+#define PLAYERINFO(x,y)                (&stored_player[StorePlayer[x][y]-EL_PLAYER_1])
 #define SHIELD_ON(p)           ((p)->shield_normal_time_left > 0)
-#define PROTECTED_FIELD(x,y)   (IS_TUBE(Feld[x][y]))
+#define PROTECTED_FIELD(x,y)   (IS_ACCESSIBLE_INSIDE(Feld[x][y]) &&    \
+                                IS_INDESTRUCTIBLE(Feld[x][y]))
 #define PLAYER_PROTECTED(x,y)  (SHIELD_ON(PLAYERINFO(x, y)) ||         \
                                 PROTECTED_FIELD(x, y))
 
-#define PLAYER_NR_GFX(g,i)     ((g) + i * (IMG_PLAYER2 - IMG_PLAYER1))
+#define PLAYER_NR_GFX(g,i)     ((g) + i * (IMG_PLAYER_2 - IMG_PLAYER_1))
 
 #define ANIM_FRAMES(g)         (graphic_info[g].anim_frames)
 #define ANIM_DELAY(g)          (graphic_info[g].anim_delay)
 #define IS_LOOP_SOUND(s)       (sound_info[s].loop)
 
 
-#if 0
-
-/* Bitmaps with graphic file */
-#define PIX_BACK               0
-#define PIX_DOOR               1
-#define PIX_TOONS              2
-#define PIX_FONT_BIG           3
-#define PIX_FONT_SMALL         4
-#define PIX_FONT_MEDIUM                5
-#define PIX_FONT_EM            6
-/* Bitmaps without graphic file */
-#define PIX_DB_DOOR            7
-#define PIX_DB_FIELD           8
-
-#define NUM_PICTURES           7
-#define NUM_BITMAPS            9
-
-#else
-
-/* Bitmaps with graphic file */
-#define PIX_BACK               0
-#define PIX_ELEMENTS           1
-#define PIX_DOOR               2
-#define PIX_HEROES             3
-#define PIX_TOONS              4
-#define PIX_SP                 5
-#define PIX_DC                 6
-#define PIX_MORE               7
-#define PIX_FONT_BIG           8
-#define PIX_FONT_SMALL         9
-#define PIX_FONT_MEDIUM                10
-#define PIX_FONT_EM            11
-/* Bitmaps without graphic file */
-#define PIX_DB_DOOR            12
-#define PIX_DB_FIELD           13
-
-#define NUM_PICTURES           12
-#define NUM_BITMAPS            14
-
-#endif
+/* 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
-#if 0
-#define MAX_ELEMENTS           700             /* 500 static + 200 runtime */
-#define MAX_GRAPHICS           1536            /* see below: NUM_TILES */
-#endif
 #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       10
 
 /* 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_KEY1 */
+#define EL_KEY_OBSOLETE                        5 /* obsolete; mapped to EL_KEY_1 */
 #define EL_EMERALD                     6
 #define EL_EXIT_CLOSED                 7
-#define EL_PLAYER_OBSOLETE             8  /* obsolete; mapped to EL_PLAYER1 */
+#define EL_PLAYER_OBSOLETE             8 /* obsolete; mapped to EL_PLAYER_1 */
 #define EL_BUG                         9
 #define EL_SPACESHIP                   10
 #define EL_YAMYAM                      11
 #define EL_AMOEBA_WET                  23
 #define EL_AMOEBA_DRY                  24
 #define EL_NUT                         25
-#define EL_GAMEOFLIFE                  26
+#define EL_GAME_OF_LIFE                        26
 #define EL_BIOMAZE                     27
 #define EL_DYNAMITE_ACTIVE             28
 #define EL_STONEBLOCK                  29
 #define EL_ROBOT_WHEEL                 30
 #define EL_ROBOT_WHEEL_ACTIVE          31
-#define EL_KEY1                                32
-#define EL_KEY2                                33
-#define EL_KEY3                                34
-#define EL_KEY4                                35
-#define EL_GATE                      36
-#define EL_GATE                      37
-#define EL_GATE                      38
-#define EL_GATE                      39
-#define EL_GATE1_GRAY                  40
-#define EL_GATE2_GRAY                  41
-#define EL_GATE3_GRAY                  42
-#define EL_GATE4_GRAY                  43
+#define EL_KEY_1                       32
+#define EL_KEY_2                       33
+#define EL_KEY_3                       34
+#define EL_KEY_4                       35
+#define EL_GATE_1                      36
+#define EL_GATE_2                      37
+#define EL_GATE_3                      38
+#define EL_GATE_4                      39
+#define EL_GATE_1_GRAY                 40
+#define EL_GATE_2_GRAY                 41
+#define EL_GATE_3_GRAY                 42
+#define EL_GATE_4_GRAY                 43
 #define EL_DYNAMITE                    44
 #define EL_PACMAN                      45
 #define EL_INVISIBLE_WALL              46
 #define EL_BD_AMOEBA                   52
 #define EL_TIME_ORB_FULL               53
 #define EL_TIME_ORB_EMPTY              54
-#define EL_WALL_GROWING                        55
+#define EL_EXPANDABLE_WALL             55
 #define EL_BD_DIAMOND                  56
 #define EL_EMERALD_YELLOW              57
 #define EL_WALL_BD_DIAMOND             58
 
 #define EL_UNUSED_63                   63
 
-#define EL_DYNABOMB_NR                 64
-#define EL_DYNABOMB_SZ                 65
-#define EL_DYNABOMB_XL                 66
+#define EL_DYNABOMB_INCREASE_NUMBER    64
+#define EL_DYNABOMB_INCREASE_SIZE      65
+#define EL_DYNABOMB_INCREASE_POWER     66
 #define EL_SOKOBAN_OBJECT              67
 #define EL_SOKOBAN_FIELD_EMPTY         68
 #define EL_SOKOBAN_FIELD_FULL          69
 #define EL_BD_FIREFLY_4                        EL_BD_FIREFLY_UP
 #define EL_BD_BUTTERFLY                        78
 #define EL_BD_FIREFLY                  79
-#define EL_PLAYER                    80
-#define EL_PLAYER                    81
-#define EL_PLAYER                    82
-#define EL_PLAYER                    83
+#define EL_PLAYER_1                    80
+#define EL_PLAYER_2                    81
+#define EL_PLAYER_3                    82
+#define EL_PLAYER_4                    83
 #define EL_BUG_RIGHT                   84
 #define EL_BUG_UP                      85
 #define EL_BUG_LEFT                    86
 #define EL_EMERALD_PURPLE              97
 #define EL_WALL_EMERALD_RED            98
 #define EL_WALL_EMERALD_PURPLE         99
-#define EL_ACIDPOOL_TOPLEFT            100
-#define EL_ACIDPOOL_TOPRIGHT           101
-#define EL_ACIDPOOL_BOTTOMLEFT         102
-#define EL_ACIDPOOL_BOTTOM             103
-#define EL_ACIDPOOL_BOTTOMRIGHT                104
+#define EL_ACID_POOL_TOPLEFT           100
+#define EL_ACID_POOL_TOPRIGHT          101
+#define EL_ACID_POOL_BOTTOMLEFT                102
+#define EL_ACID_POOL_BOTTOM            103
+#define EL_ACID_POOL_BOTTOMRIGHT       104
 #define EL_BD_WALL                     105
 #define EL_BD_ROCK                     106
 #define EL_EXIT_OPEN                   107
 #define EL_PIG                         117
 #define EL_DRAGON                      118
 
-#define EL_EM_KEY1_FILE                        119
+#define EL_EM_KEY_1_FILE               119
 
 #define EL_CHAR_START                  120
 #define EL_CHAR_ASCII0                 (EL_CHAR_START  - 32)
 #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_WALL_GROWING_X              200
-#define EL_WALL_GROWING_Y              201
-#define EL_WALL_GROWING_XY             202
-
-#define EL_EM_GATE1                    203
-#define EL_EM_GATE2                    204
-#define EL_EM_GATE3                    205
-#define EL_EM_GATE4                    206
-
-#define EL_EM_KEY2_FILE                        207
-#define EL_EM_KEY3_FILE                        208
-#define EL_EM_KEY4_FILE                        209
+#define EL_CHAR(c)                     (EL_CHAR_ASCII0 + MAP_FONT_ASCII(c))
+
+#define EL_EXPANDABLE_WALL_HORIZONTAL  200
+#define EL_EXPANDABLE_WALL_VERTICAL    201
+#define EL_EXPANDABLE_WALL_ANY         202
+
+#define EL_EM_GATE_1                   203
+#define EL_EM_GATE_2                   204
+#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_SP_START                    210
 #define EL_SP_EMPTY_SPACE              (EL_SP_START + 0)
 #define EL_SP_MURPHY                   (EL_SP_START + 3)
 #define EL_SP_INFOTRON                 (EL_SP_START + 4)
 #define EL_SP_CHIP_SINGLE              (EL_SP_START + 5)
-#define EL_SP_HARD_GRAY                        (EL_SP_START + 6)
+#define EL_SP_HARDWARE_GRAY            (EL_SP_START + 6)
 #define EL_SP_EXIT_CLOSED              (EL_SP_START + 7)
 #define EL_SP_DISK_ORANGE              (EL_SP_START + 8)
-#define EL_SP_PORT1_RIGHT              (EL_SP_START + 9)
-#define EL_SP_PORT1_DOWN               (EL_SP_START + 10)
-#define EL_SP_PORT1_LEFT               (EL_SP_START + 11)
-#define EL_SP_PORT1_UP                 (EL_SP_START + 12)
-#define EL_SP_PORT2_RIGHT              (EL_SP_START + 13)
-#define EL_SP_PORT2_DOWN               (EL_SP_START + 14)
-#define EL_SP_PORT2_LEFT               (EL_SP_START + 15)
-#define EL_SP_PORT2_UP                 (EL_SP_START + 16)
+#define EL_SP_PORT_RIGHT               (EL_SP_START + 9)
+#define EL_SP_PORT_DOWN                        (EL_SP_START + 10)
+#define EL_SP_PORT_LEFT                        (EL_SP_START + 11)
+#define EL_SP_PORT_UP                  (EL_SP_START + 12)
+#define EL_SP_GRAVITY_PORT_RIGHT       (EL_SP_START + 13)
+#define EL_SP_GRAVITY_PORT_DOWN                (EL_SP_START + 14)
+#define EL_SP_GRAVITY_PORT_LEFT                (EL_SP_START + 15)
+#define EL_SP_GRAVITY_PORT_UP          (EL_SP_START + 16)
 #define EL_SP_SNIKSNAK                 (EL_SP_START + 17)
 #define EL_SP_DISK_YELLOW              (EL_SP_START + 18)
 #define EL_SP_TERMINAL                 (EL_SP_START + 19)
 #define EL_SP_DISK_RED                 (EL_SP_START + 20)
-#define EL_SP_PORT_Y                   (EL_SP_START + 21)
-#define EL_SP_PORT_X                   (EL_SP_START + 22)
-#define EL_SP_PORT_XY                  (EL_SP_START + 23)
+#define EL_SP_PORT_VERTICAL            (EL_SP_START + 21)
+#define EL_SP_PORT_HORIZONTAL          (EL_SP_START + 22)
+#define EL_SP_PORT_ANY                 (EL_SP_START + 23)
 #define EL_SP_ELECTRON                 (EL_SP_START + 24)
 #define EL_SP_BUGGY_BASE               (EL_SP_START + 25)
 #define EL_SP_CHIP_LEFT                        (EL_SP_START + 26)
 #define EL_SP_CHIP_RIGHT               (EL_SP_START + 27)
-#define EL_SP_HARD_BASE1               (EL_SP_START + 28)
-#define EL_SP_HARD_GREEN               (EL_SP_START + 29)
-#define EL_SP_HARD_BLUE                        (EL_SP_START + 30)
-#define EL_SP_HARD_RED                 (EL_SP_START + 31)
-#define EL_SP_HARD_YELLOW              (EL_SP_START + 32)
-#define EL_SP_HARD_BASE2               (EL_SP_START + 33)
-#define EL_SP_HARD_BASE3               (EL_SP_START + 34)
-#define EL_SP_HARD_BASE4               (EL_SP_START + 35)
-#define EL_SP_HARD_BASE5               (EL_SP_START + 36)
-#define EL_SP_HARD_BASE6               (EL_SP_START + 37)
-#define EL_SP_CHIP_UPPER               (EL_SP_START + 38)
-#define EL_SP_CHIP_LOWER               (EL_SP_START + 39)
+#define EL_SP_HARDWARE_BASE_1          (EL_SP_START + 28)
+#define EL_SP_HARDWARE_GREEN           (EL_SP_START + 29)
+#define EL_SP_HARDWARE_BLUE            (EL_SP_START + 30)
+#define EL_SP_HARDWARE_RED             (EL_SP_START + 31)
+#define EL_SP_HARDWARE_YELLOW          (EL_SP_START + 32)
+#define EL_SP_HARDWARE_BASE_2          (EL_SP_START + 33)
+#define EL_SP_HARDWARE_BASE_3          (EL_SP_START + 34)
+#define EL_SP_HARDWARE_BASE_4          (EL_SP_START + 35)
+#define EL_SP_HARDWARE_BASE_5          (EL_SP_START + 36)
+#define EL_SP_HARDWARE_BASE_6          (EL_SP_START + 37)
+#define EL_SP_CHIP_TOP                 (EL_SP_START + 38)
+#define EL_SP_CHIP_BOTTOM              (EL_SP_START + 39)
 #define EL_SP_END                      (EL_SP_START + 39)
 
-#define EL_EM_GATE1_GRAY               250
-#define EL_EM_GATE2_GRAY               251
-#define EL_EM_GATE3_GRAY               252
-#define EL_EM_GATE4_GRAY               253
+#define EL_EM_GATE_1_GRAY              250
+#define EL_EM_GATE_2_GRAY              251
+#define EL_EM_GATE_3_GRAY              252
+#define EL_EM_GATE_4_GRAY              253
 
 #define EL_UNUSED_254                  254
 #define EL_UNUSED_255                  255
 #define EL_UNUSED_269                  269
 #define EL_UNUSED_270                  270
 
-#define EL_CONVEYOR_BELT1_LEFT         271
-#define EL_CONVEYOR_BELT1_MIDDLE       272
-#define EL_CONVEYOR_BELT1_RIGHT                273
-#define EL_CONVEYOR_BELT1_SWITCH_LEFT  274
-#define EL_CONVEYOR_BELT1_SWITCH_MIDDLE        275
-#define EL_CONVEYOR_BELT1_SWITCH_RIGHT 276
-#define EL_CONVEYOR_BELT2_LEFT         277
-#define EL_CONVEYOR_BELT2_MIDDLE       278
-#define EL_CONVEYOR_BELT2_RIGHT                279
-#define EL_CONVEYOR_BELT2_SWITCH_LEFT  280
-#define EL_CONVEYOR_BELT2_SWITCH_MIDDLE        281
-#define EL_CONVEYOR_BELT2_SWITCH_RIGHT 282
-#define EL_CONVEYOR_BELT3_LEFT         283
-#define EL_CONVEYOR_BELT3_MIDDLE       284
-#define EL_CONVEYOR_BELT3_RIGHT                285
-#define EL_CONVEYOR_BELT3_SWITCH_LEFT  286
-#define EL_CONVEYOR_BELT3_SWITCH_MIDDLE        287
-#define EL_CONVEYOR_BELT3_SWITCH_RIGHT 288
-#define EL_CONVEYOR_BELT4_LEFT         289
-#define EL_CONVEYOR_BELT4_MIDDLE       290
-#define EL_CONVEYOR_BELT4_RIGHT                291
-#define EL_CONVEYOR_BELT4_SWITCH_LEFT  292
-#define EL_CONVEYOR_BELT4_SWITCH_MIDDLE        293
-#define EL_CONVEYOR_BELT4_SWITCH_RIGHT 294
+#define EL_CONVEYOR_BELT_1_LEFT                 271
+#define EL_CONVEYOR_BELT_1_MIDDLE       272
+#define EL_CONVEYOR_BELT_1_RIGHT        273
+#define EL_CONVEYOR_BELT_1_SWITCH_LEFT  274
+#define EL_CONVEYOR_BELT_1_SWITCH_MIDDLE 275
+#define EL_CONVEYOR_BELT_1_SWITCH_RIGHT         276
+#define EL_CONVEYOR_BELT_2_LEFT                 277
+#define EL_CONVEYOR_BELT_2_MIDDLE       278
+#define EL_CONVEYOR_BELT_2_RIGHT        279
+#define EL_CONVEYOR_BELT_2_SWITCH_LEFT  280
+#define EL_CONVEYOR_BELT_2_SWITCH_MIDDLE 281
+#define EL_CONVEYOR_BELT_2_SWITCH_RIGHT         282
+#define EL_CONVEYOR_BELT_3_LEFT                 283
+#define EL_CONVEYOR_BELT_3_MIDDLE       284
+#define EL_CONVEYOR_BELT_3_RIGHT        285
+#define EL_CONVEYOR_BELT_3_SWITCH_LEFT  286
+#define EL_CONVEYOR_BELT_3_SWITCH_MIDDLE 287
+#define EL_CONVEYOR_BELT_3_SWITCH_RIGHT         288
+#define EL_CONVEYOR_BELT_4_LEFT                 289
+#define EL_CONVEYOR_BELT_4_MIDDLE       290
+#define EL_CONVEYOR_BELT_4_RIGHT        291
+#define EL_CONVEYOR_BELT_4_SWITCH_LEFT  292
+#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_LIGHT_SWITCH                        297
 #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_TIMEGATE_SWITCH             325
 
 #define EL_BALLOON                     326
-#define EL_BALLOON_SEND_LEFT           327
-#define EL_BALLOON_SEND_RIGHT          328
-#define EL_BALLOON_SEND_UP             329
-#define EL_BALLOON_SEND_DOWN           330
-#define EL_BALLOON_SEND_ANY_DIRECTION  331
-
-#define EL_EMC_STEELWALL             332
-#define EL_EMC_STEELWALL             333
-#define EL_EMC_STEELWALL             334
-#define EL_EMC_STEELWALL             335
-#define EL_EMC_WALL_PILLAR_UPPER       336
-#define EL_EMC_WALL_PILLAR_MIDDLE      337
-#define EL_EMC_WALL_PILLAR_LOWER       338
-#define EL_EMC_WALL                  339
-#define EL_EMC_WALL                  340
-#define EL_EMC_WALL                  341
-#define EL_EMC_WALL                  342
-#define EL_EMC_WALL                  343
-
-#define EL_TUBE_ALL                    344
+#define EL_BALLOON_SWITCH_LEFT         327
+#define EL_BALLOON_SWITCH_RIGHT                328
+#define EL_BALLOON_SWITCH_UP           329
+#define EL_BALLOON_SWITCH_DOWN         330
+#define EL_BALLOON_SWITCH_ANY          331
+
+#define EL_EMC_STEELWALL_1             332
+#define EL_EMC_STEELWALL_2             333
+#define EL_EMC_STEELWALL_3             334
+#define EL_EMC_STEELWALL_4             335
+#define EL_EMC_WALL_1                  336
+#define EL_EMC_WALL_2                  337
+#define EL_EMC_WALL_3                  338
+#define EL_EMC_WALL_4                  339
+#define EL_EMC_WALL_5                  340
+#define EL_EMC_WALL_6                  341
+#define EL_EMC_WALL_7                  342
+#define EL_EMC_WALL_8                  343
+
+#define EL_TUBE_ANY                    344
 #define EL_TUBE_VERTICAL               345
 #define EL_TUBE_HORIZONTAL             346
 #define EL_TUBE_VERTICAL_LEFT          347
 
 #include "conf_cus.h"  /* include auto-generated data structure definitions */
 
-#define EL_CUSTOM_END                  (EL_CUSTOM_START + 127)
+#define NUM_CUSTOM_ELEMENTS            256
 
-#define NUM_CUSTOM_ELEMENTS            128
-#define NUM_FILE_ELEMENTS              488
+#define EL_CUSTOM_END          (EL_CUSTOM_START + NUM_CUSTOM_ELEMENTS - 1)
+#define NUM_FILE_ELEMENTS      (EL_CUSTOM_START + NUM_CUSTOM_ELEMENTS)
 
 
 /* "real" (and therefore drawable) runtime elements */
 #define EL_FIRST_RUNTIME_REAL          NUM_FILE_ELEMENTS
 
-#define EL_EM_KEY1                     (EL_FIRST_RUNTIME_REAL + 0)
-#define EL_EM_KEY2                     (EL_FIRST_RUNTIME_REAL + 1)
-#define EL_EM_KEY3                     (EL_FIRST_RUNTIME_REAL + 2)
-#define EL_EM_KEY4                     (EL_FIRST_RUNTIME_REAL + 3)
-#define EL_DYNABOMB_PLAYER1_ACTIVE     (EL_FIRST_RUNTIME_REAL + 4)
-#define EL_DYNABOMB_PLAYER2_ACTIVE     (EL_FIRST_RUNTIME_REAL + 5)
-#define EL_DYNABOMB_PLAYER3_ACTIVE     (EL_FIRST_RUNTIME_REAL + 6)
-#define EL_DYNABOMB_PLAYER4_ACTIVE     (EL_FIRST_RUNTIME_REAL + 7)
-#define EL_SWITCHGATE_OPENING          (EL_FIRST_RUNTIME_REAL + 8)
-#define EL_SWITCHGATE_CLOSING          (EL_FIRST_RUNTIME_REAL + 9)
-#define EL_TIMEGATE_OPENING            (EL_FIRST_RUNTIME_REAL + 10)
-#define EL_TIMEGATE_CLOSING            (EL_FIRST_RUNTIME_REAL + 11)
-#define EL_PEARL_BREAKING              (EL_FIRST_RUNTIME_REAL + 12)
-#define EL_TRAP_ACTIVE                 (EL_FIRST_RUNTIME_REAL + 13)
-#define EL_INVISIBLE_STEELWALL_ACTIVE  (EL_FIRST_RUNTIME_REAL + 14)
-#define EL_INVISIBLE_WALL_ACTIVE       (EL_FIRST_RUNTIME_REAL + 15)
-#define EL_INVISIBLE_SAND_ACTIVE       (EL_FIRST_RUNTIME_REAL + 16)
-#define EL_CONVEYOR_BELT1_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 17)
-#define EL_CONVEYOR_BELT1_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 18)
-#define EL_CONVEYOR_BELT1_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 19)
-#define EL_CONVEYOR_BELT2_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 20)
-#define EL_CONVEYOR_BELT2_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 21)
-#define EL_CONVEYOR_BELT2_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 22)
-#define EL_CONVEYOR_BELT3_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 23)
-#define EL_CONVEYOR_BELT3_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 24)
-#define EL_CONVEYOR_BELT3_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 25)
-#define EL_CONVEYOR_BELT4_LEFT_ACTIVE  (EL_FIRST_RUNTIME_REAL + 26)
-#define EL_CONVEYOR_BELT4_MIDDLE_ACTIVE        (EL_FIRST_RUNTIME_REAL + 27)
-#define EL_CONVEYOR_BELT4_RIGHT_ACTIVE (EL_FIRST_RUNTIME_REAL + 28)
-#define EL_EXIT_OPENING                        (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_DRIPPING             (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)
+#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)
 
 /* "unreal" (and therefore not drawable) runtime elements */
-#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 45)
+#define EL_FIRST_RUNTIME_UNREAL                (EL_FIRST_RUNTIME_REAL + 46)
 
 #define EL_BLOCKED                     (EL_FIRST_RUNTIME_UNREAL + 0)
 #define EL_EXPLOSION                   (EL_FIRST_RUNTIME_UNREAL + 1)
-#define EL_NUT_CRACKING                        (EL_FIRST_RUNTIME_UNREAL + 2)
-#define EL_ACID_SPLASH_LEFT            (EL_FIRST_RUNTIME_UNREAL + 3)
-#define EL_ACID_SPLASH_RIGHT           (EL_FIRST_RUNTIME_UNREAL + 4)
-#define EL_AMOEBA_CREATING             (EL_FIRST_RUNTIME_UNREAL + 5)
-#define EL_AMOEBA_SHRINKING            (EL_FIRST_RUNTIME_UNREAL + 6)
-#define EL_WALL_GROWING_ACTIVE         (EL_FIRST_RUNTIME_UNREAL + 7)
-#define EL_FLAMES                      (EL_FIRST_RUNTIME_UNREAL + 8)
-#define EL_PLAYER_IS_LEAVING           (EL_FIRST_RUNTIME_UNREAL + 9)
-#define EL_QUICKSAND_FILLING           (EL_FIRST_RUNTIME_UNREAL + 10)
-#define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 11)
-#define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 12)
+#define EL_NUT_BREAKING                        (EL_FIRST_RUNTIME_UNREAL + 2)
+#define EL_DIAMOND_BREAKING            (EL_FIRST_RUNTIME_UNREAL + 3)
+#define EL_ACID_SPLASH_LEFT            (EL_FIRST_RUNTIME_UNREAL + 4)
+#define EL_ACID_SPLASH_RIGHT           (EL_FIRST_RUNTIME_UNREAL + 5)
+#define EL_AMOEBA_GROWING              (EL_FIRST_RUNTIME_UNREAL + 6)
+#define EL_AMOEBA_SHRINKING            (EL_FIRST_RUNTIME_UNREAL + 7)
+#define EL_EXPANDABLE_WALL_GROWING     (EL_FIRST_RUNTIME_UNREAL + 8)
+#define EL_FLAMES                      (EL_FIRST_RUNTIME_UNREAL + 9)
+#define EL_PLAYER_IS_LEAVING           (EL_FIRST_RUNTIME_UNREAL + 10)
+#define EL_QUICKSAND_FILLING           (EL_FIRST_RUNTIME_UNREAL + 11)
+#define EL_MAGIC_WALL_FILLING          (EL_FIRST_RUNTIME_UNREAL + 12)
+#define EL_BD_MAGIC_WALL_FILLING       (EL_FIRST_RUNTIME_UNREAL + 13)
 
 /* dummy elements (never used as game elements, only used as graphics) */
-#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 13)
+#define EL_FIRST_DUMMY                 (EL_FIRST_RUNTIME_UNREAL + 14)
 
 #define EL_STEELWALL_TOPLEFT                   (EL_FIRST_DUMMY + 0)
 #define EL_STEELWALL_TOPRIGHT                  (EL_FIRST_DUMMY + 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_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_DEFAULT                             (EL_FIRST_DUMMY + 20)
+#define EL_BD_DEFAULT                          (EL_FIRST_DUMMY + 21)
+#define EL_SP_DEFAULT                          (EL_FIRST_DUMMY + 22)
+#define EL_SB_DEFAULT                          (EL_FIRST_DUMMY + 23)
 
-#define MAX_NUM_ELEMENTS                       (EL_FIRST_DUMMY + 16)
+#define MAX_NUM_ELEMENTS                       (EL_FIRST_DUMMY + 24)
 
 
 /* values for graphics/sounds action types */
 #define ACTION_DIGGING                         4
 #define ACTION_SNAPPING                                5
 #define ACTION_COLLECTING                      6
-#define ACTION_PUSHING                         7
-#define ACTION_PASSING                         8
-#define ACTION_IMPACT                          9
-#define ACTION_CRACKING                                10
-#define ACTION_BREAKING                                11
-#define ACTION_ACTIVATING                      12
-#define ACTION_OPENING                         13
-#define ACTION_CLOSING                         14
-#define ACTION_EATING                          15
-#define ACTION_ATTACKING                       16
-#define ACTION_GROWING                         17
-#define ACTION_SHRINKING                       18
-#define ACTION_ACTIVE                          19
-#define ACTION_OTHER                           20
-
-#define NUM_ACTIONS                            21
-
-/* values for special image configuration suffixes */
-#define GFX_SPECIAL_ARG_EDITOR                 0
-#define GFX_SPECIAL_ARG_PREVIEW                        1
-
-#define NUM_SPECIAL_GFX_ARGS                   2
+#define ACTION_DROPPING                                7
+#define ACTION_PUSHING                         8
+#define ACTION_WALKING                         9
+#define ACTION_PASSING                         10
+#define ACTION_IMPACT                          11
+#define ACTION_BREAKING                                12
+#define ACTION_ACTIVATING                      13
+#define ACTION_DEACTIVATING                    14
+#define ACTION_OPENING                         15
+#define ACTION_CLOSING                         16
+#define ACTION_ATTACKING                       17
+#define ACTION_GROWING                         18
+#define ACTION_SHRINKING                       19
+#define ACTION_ACTIVE                          20
+#define ACTION_FILLING                         21
+#define ACTION_EMPTYING                                22
+#define ACTION_CHANGING                                23
+#define ACTION_EXPLODING                       24
+#define ACTION_DYING                           25
+#define ACTION_OTHER                           26
+
+#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_PLAYING                        6
+#define GFX_SPECIAL_ARG_DOOR                   7
+#define GFX_SPECIAL_ARG_PREVIEW                        8
+#define GFX_SPECIAL_ARG_CRUMBLED               9
+
+#define NUM_SPECIAL_GFX_ARGS                   10
 
 
 /* values for image configuration suffixes */
 #define GFX_ARG_XOFFSET                                8
 #define GFX_ARG_YOFFSET                                9
 #define GFX_ARG_FRAMES                         10
-#define GFX_ARG_START_FRAME                    11
-#define GFX_ARG_DELAY                          12
-#define GFX_ARG_MODE_LOOP                      13
-#define GFX_ARG_MODE_LINEAR                    14
-#define GFX_ARG_MODE_PINGPONG                  15
-#define GFX_ARG_MODE_PINGPONG2                 16
-#define GFX_ARG_MODE_RANDOM                    17
-#define GFX_ARG_MODE_REVERSE                   18
-#define GFX_ARG_GLOBAL_SYNC                    19
-#define GFX_ARG_STEP_OFFSET                    20
-#define GFX_ARG_STEP_DELAY                     21
-#define GFX_ARG_DIRECTION                      22
-#define GFX_ARG_POSITION                       23
-#define GFX_ARG_DRAW_XOFFSET                   24
-#define GFX_ARG_DRAW_YOFFSET                   25
-#define GFX_ARG_NAME                           26
-
-#define NUM_GFX_ARGS                           27
+#define GFX_ARG_FRAMES_PER_LINE                        11
+#define GFX_ARG_START_FRAME                    12
+#define GFX_ARG_DELAY                          13
+#define GFX_ARG_ANIM_MODE                      14
+#define GFX_ARG_GLOBAL_SYNC                    15
+#define GFX_ARG_CRUMBLED_LIKE                  16
+#define GFX_ARG_DIGGABLE_LIKE                  17
+#define GFX_ARG_STEP_OFFSET                    18
+#define GFX_ARG_STEP_DELAY                     19
+#define GFX_ARG_DIRECTION                      20
+#define GFX_ARG_POSITION                       21
+#define GFX_ARG_DRAW_XOFFSET                   22
+#define GFX_ARG_DRAW_YOFFSET                   23
+#define GFX_ARG_NAME                           24
+
+#define NUM_GFX_ARGS                           25
 
 
 /* values for sound configuration suffixes */
 
 /* values for font configuration */
 
-#define FIRST_IMG_FONT                         IMG_FONT_INITIAL_1
-#define LAST_IMG_FONT                          IMG_FONT_NARROW
-
-#define NUM_IMG_FONTS                          (LAST_IMG_FONT - \
-                                                FIRST_IMG_FONT + 1)
+#define FONT_INITIAL_1                         0
+#define FONT_INITIAL_2                         1
+#define FONT_INITIAL_3                         2
+#define FONT_INITIAL_4                         3
+#define FONT_TITLE_1                           4
+#define FONT_TITLE_2                           5
+#define FONT_MENU_1                            6
+#define FONT_MENU_2                            7
+#define FONT_TEXT_1_ACTIVE                     8
+#define FONT_TEXT_2_ACTIVE                     9
+#define FONT_TEXT_3_ACTIVE                     10
+#define FONT_TEXT_4_ACTIVE                     11
+#define FONT_TEXT_1                            12
+#define FONT_TEXT_2                            13
+#define FONT_TEXT_3                            14
+#define FONT_TEXT_4                            15
+#define FONT_INPUT_1_ACTIVE                    16
+#define FONT_INPUT_2_ACTIVE                    17
+#define FONT_INPUT_1                           18
+#define FONT_INPUT_2                           19
+#define FONT_OPTION_OFF                                20
+#define FONT_OPTION_ON                         21
+#define FONT_VALUE_1                           22
+#define FONT_VALUE_2                           23
+#define FONT_VALUE_OLD                         24
+#define FONT_LEVEL_NUMBER                      25
+#define FONT_TAPE_RECORDER                     26
+#define FONT_GAME_INFO                         27
+
+#define NUM_FONTS                              28
 #define NUM_INITIAL_FONTS                      4
 
-
-/* values for game_status */
-#define EXITGAME               0
-#define MAINMENU               1
-#define PLAYING                        2
-#define LEVELED                        3
-#define HELPSCREEN             4
-#define CHOOSELEVEL            5
-#define TYPENAME               6
-#define HALLOFFAME             7
-#define SETUP                  8
-
-#define PROGRAM_VERSION_MAJOR  2
-#define PROGRAM_VERSION_MINOR  2
-#define PROGRAM_VERSION_PATCH  0
-#define PROGRAM_VERSION_STRING "2.2.0rc4"
+/* 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_PLAYING                      6
+#define GAME_MODE_PSEUDO_DOOR                  7
+#define GAME_MODE_PSEUDO_PREVIEW               8
+#define GAME_MODE_PSEUDO_CRUMBLED              9
+
+/* there are no special config file suffixes for these modes */
+#define GAME_MODE_PSEUDO_TYPENAME              10
+#define GAME_MODE_QUIT                         11
+
+#define PROGRAM_VERSION_MAJOR  3
+#define PROGRAM_VERSION_MINOR  0
+#define PROGRAM_VERSION_PATCH  3
+#define PROGRAM_VERSION_RELEASE        0
+#define PROGRAM_VERSION_STRING "3.0.3"
 
 #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
 #define WINDOW_SUBTITLE_STRING PROGRAM_RIGHTS_STRING " " PROGRAM_AUTHOR_STRING
 #define ICON_TITLE_STRING      PROGRAM_TITLE_STRING
-#define UNIX_USERDATA_DIRECTORY        ".rocksndiamonds"
 #define COOKIE_PREFIX          "ROCKSNDIAMONDS"
 #define FILENAME_PREFIX                "Rocks"
 
+#if defined(PLATFORM_UNIX)
+#define USERDATA_DIRECTORY     ".rocksndiamonds"
+#elif defined(PLATFORM_WIN32)
+#define USERDATA_DIRECTORY     PROGRAM_TITLE_STRING
+#else
+#define USERDATA_DIRECTORY     "userdata"
+#endif
+
 #define X11_ICON_FILENAME      "rocks_icon.xbm"
 #define X11_ICONMASK_FILENAME  "rocks_iconmask.xbm"
 #define MSDOS_POINTER_FILENAME "mouse.pcx"
 #define GAME_VERSION_1_4       FILE_VERSION_1_4
 #define GAME_VERSION_2_0       FILE_VERSION_2_0
 
-#define GAME_VERSION_ACTUAL    VERSION_IDENT(PROGRAM_VERSION_MAJOR, \
+#define GAME_VERSION_ACTUAL    RELEASE_IDENT(PROGRAM_VERSION_MAJOR, \
                                              PROGRAM_VERSION_MINOR, \
-                                             PROGRAM_VERSION_PATCH)
+                                             PROGRAM_VERSION_PATCH, \
+                                             PROGRAM_VERSION_RELEASE)
 
 /* values for game_emulation */
 #define EMU_NONE               0
@@ -891,12 +1073,13 @@ struct PlayerInfo
                                   through doors); overrides other actions */
 
   int jx,jy, last_jx,last_jy;
-  int MovDir, MovPos, GfxPos;
-  int Frame;
+  int MovDir, MovPos, GfxDir, GfxPos;
+  int Frame, StepFrame;
 
   int GfxAction;
 
   boolean use_murphy_graphic;
+  boolean use_disk_red_graphic;
 
   boolean Pushing;
   boolean Switching;
@@ -905,9 +1088,9 @@ struct PlayerInfo
 
   int last_move_dir;
   boolean is_moving;
-
-  boolean is_digging;
   boolean is_waiting;
+  boolean is_digging;
+  boolean is_collecting;
 
   unsigned long move_delay;
   int move_delay_value;
@@ -923,10 +1106,12 @@ struct PlayerInfo
   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 LevelInfo
@@ -938,15 +1123,16 @@ 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[MAX_ENVELOPE_TEXT_LEN + 1];
+  int envelope_xsize, envelope_ysize;
   int score[LEVEL_SCORE_ELEMENTS];
-  int yam_content[MAX_ELEMENT_CONTENTS][3][3];
-  int num_yam_contents;
+  int yamyam_content[MAX_ELEMENT_CONTENTS][3][3];
+  int num_yamyam_contents;
   int amoeba_speed;
   int amoeba_content;
   int time_magic_wall;
@@ -957,7 +1143,11 @@ struct LevelInfo
   boolean 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
@@ -966,6 +1156,7 @@ struct TapeInfo
   int game_version;    /* game release version the tape was created with */
   int engine_version;  /* game engine version the tape was recorded with */
 
+  char *level_identifier;
   int level_nr;
   unsigned long random_seed;
   unsigned long date;
@@ -1001,7 +1192,7 @@ struct GameInfo
   int initial_move_delay_value;
 
   /* variable within running game */
-  int yam_content_nr;
+  int yamyam_content_nr;
   boolean magic_wall_active;
   int magic_wall_time_left;
   int light_time_left;
@@ -1025,21 +1216,145 @@ struct GlobalInfo
   int fps_slowdown_factor;
 };
 
+struct MenuInfo
+{
+  int draw_xoffset_default;
+  int draw_yoffset_default;
+  int draw_xoffset[NUM_SPECIAL_GFX_ARGS];
+  int draw_yoffset[NUM_SPECIAL_GFX_ARGS];
+
+  int scrollbar_xoffset;
+
+  int list_size_default;
+  int list_size[NUM_SPECIAL_GFX_ARGS];
+};
+
+struct DoorInfo
+{
+  int step_offset;
+  int step_delay;
+};
+
+struct ElementChangeInfo
+{
+  boolean can_change;          /* use or ignore this change info */
+
+  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_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 */
+
+  /* functions that are called before, while and after the change of an
+     element -- currently only used for non-custom elements */
+  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 player_action;           /* touched/pressed/pushed by player */
+  int collide_action;          /* collision/impact/smashed */
+  int other_action;            /* various change actions */
+};
+
 struct ElementInfo
 {
-  char *token_name;            /* element token prefix used in config files */
-  char *sound_class_name;      /* classification for custom sound effects */
-  char *editor_description;    /* short description for level editor */
-  char *custom_description;    /* custom description for level editor */
+  /* ---------- token and description strings ---------- */
+
+  char *token_name;            /* element token used in config files */
+  char *class_name;            /* element class used in config files */
+  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 */
-                               /* special graphics for left/right/up/down */
   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 editor_graphic;          /* graphic displayed in level editor */
-  int preview_graphic;         /* graphic displayed in level preview */
+  int special_graphic[NUM_SPECIAL_GFX_ARGS];
+                               /* special graphics for certain screens */
 
   int sound[NUM_ACTIONS];      /* default sounds for several actions */
+
+  /* ---------- special element property values ---------- */
+
+  boolean use_gfx_element;     /* use custom graphic element */
+  short gfx_element;           /* optional custom graphic element */
+
+  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 */
+  int move_delay_fixed;                /* constant frame delay for moving */
+  int move_delay_random;       /* additional random frame delay for moving */
+
+  int move_pattern;            /* direction movable element moves to */
+  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_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_num[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
+{
+  char *token_name;            /* font token used in config files */
+
+  int graphic;                 /* default graphic for this font */
+  int special_graphic[NUM_SPECIAL_GFX_ARGS];
+                               /* special graphics for certain screens */
+  int special_bitmap_id[NUM_SPECIAL_GFX_ARGS];
+                               /* internal bitmap ID for special graphics */
 };
 
 struct GraphicInfo
@@ -1049,10 +1364,13 @@ 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;
   boolean anim_global_sync;
+  int crumbled_like;           /* element for cloning crumble graphics */
+  int diggable_like;           /* element for cloning digging graphics */
 
   int step_offset;             /* optional step offset of toon animations */
   int step_delay;              /* optional step delay of toon animations */
@@ -1109,14 +1427,17 @@ 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                   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 boolean                 Changing[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 extern short                   AmoebaCnt[MAX_NUM_AMOEBA];
@@ -1124,12 +1445,12 @@ 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];
 extern int                     GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+extern int                     GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
 extern int                     lev_fieldx, lev_fieldy;
 extern int                     scroll_x, scroll_y;
@@ -1156,16 +1477,20 @@ extern boolean                  network_player_action_received;
 
 extern int                     graphics_action_mapping[];
 
-extern struct LevelInfo                level;
+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 ElementInfo      element_info[];
 extern struct ElementActionInfo        element_action_info[];
 extern struct ElementDirectionInfo element_direction_info[];
 extern struct SpecialSuffixInfo special_suffix_info[];
+extern struct TokenIntPtrInfo  image_config_vars[];
+extern struct FontInfo         font_info[];
 extern struct GraphicInfo      *graphic_info;
 extern struct SoundInfo               *sound_info;
 extern struct ConfigInfo       image_config[], sound_config[];