rnd-20031008-1-src
[rocksndiamonds.git] / src / main.c
index 23901e1685be507cce6b436f353ca9989de39dd1..f6dc5542481490d36043e11ccff279ef926c0d3b 100644 (file)
@@ -17,6 +17,7 @@
 #include "init.h"
 #include "game.h"
 #include "events.h"
+#include "config.h"
 
 #if 0
 GC                     tile_clip_gc;
@@ -26,10 +27,10 @@ Bitmap                     *bitmap_db_field, *bitmap_db_door;
 #if 0
 Pixmap                 tile_clipmask[NUM_TILES];
 #endif
-DrawBuffer          *fieldbuffer;
-DrawBuffer          *drawto_field;
+DrawBuffer            *fieldbuffer;
+DrawBuffer            *drawto_field;
 
-int                    game_status = MAINMENU;
+int                    game_status = -1;
 boolean                        level_editor_test_game = FALSE;
 boolean                        network_playing = FALSE;
 
@@ -39,14 +40,18 @@ boolean                     redraw[MAX_BUF_XSIZE][MAX_BUF_YSIZE];
 int                    redraw_x1 = 0, redraw_y1 = 0;
 
 short                  Feld[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
-short                  Ur[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  MovPos[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  MovDir[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  MovDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short                  ChangeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  Store[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  Store2[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  StorePlayer[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short                  Back[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 boolean                        Stop[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+boolean                        Pushed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+unsigned long          Changed[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+unsigned long          ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaCnt[MAX_NUM_AMOEBA];
@@ -54,12 +59,12 @@ short                       AmoebaCnt2[MAX_NUM_AMOEBA];
 short                  ExplodePhase[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  ExplodeField[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
-unsigned long          Properties1[MAX_NUM_ELEMENTS];
-unsigned long          Properties2[MAX_NUM_ELEMENTS];
+unsigned long          Properties[MAX_NUM_ELEMENTS][NUM_EP_BITFIELDS];
 
 int                    GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 int                    GfxAction[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 int                    GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+int                    GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
 int                    lev_fieldx, lev_fieldy;
 int                    scroll_x, scroll_y;
@@ -83,13 +88,15 @@ int                 TimeFrames, TimePlayed, TimeLeft;
 
 boolean                        network_player_action_received = FALSE;
 
-struct LevelInfo       level;
+struct LevelInfo       level, level_template;
 struct PlayerInfo      stored_player[MAX_PLAYERS], *local_player = NULL;
 struct HiScore         highscore[MAX_SCORE_ENTRIES];
 struct TapeInfo                tape;
 struct SetupInfo       setup;
 struct GameInfo                game;
 struct GlobalInfo      global;
+struct MenuInfo                menu;
+struct DoorInfo                door_1, door_2;
 struct GraphicInfo     *graphic_info = NULL;
 struct SoundInfo       *sound_info = NULL;
 
@@ -100,6 +107,8 @@ struct SoundInfo       *sound_info = NULL;
 
 struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
 {
+  /* keyword to start parser: "ELEMENT_INFO_START" <-- do not change! */
+
   /* ----------------------------------------------------------------------- */
   /* "real" level file elements                                              */
   /* ----------------------------------------------------------------------- */
@@ -120,9 +129,9 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "normal wall"
   },
   {
-    "wall_crumbled",
+    "wall_slippery",
     "wall",
-    "round wall"
+    "slippery wall"
   },
   {
     "rock",
@@ -131,8 +140,8 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "key_obsolete",
-    "key",
-    "key"
+    "obsolete",
+    "key (OBSOLETE)"
   },
   {
     "emerald",
@@ -146,18 +155,18 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "player_obsolete",
-    "player",
-    "player"
+    "obsolete",
+    "player (OBSOLETE)"
   },
   {
     "bug",
     "bug",
-    "bug"
+    "bug (random start direction)"
   },
   {
     "spaceship",
     "spaceship",
-    "spaceship"
+    "spaceship (random start direction)"
   },
   {
     "yamyam",
@@ -235,8 +244,8 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "nut with emerald"
   },
   {
-    "gameoflife",
-    "gameoflife",
+    "game_of_life",
+    "game_of_life",
     "Conway's wall of life"
   },
   {
@@ -245,7 +254,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "biomaze"
   },
   {
-    "dynamite_active",
+    "dynamite.active",
     "dynamite",
     "burning dynamite"
   },
@@ -260,65 +269,65 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "magic wheel"
   },
   {
-    "robot_wheel_active",
+    "robot_wheel.active",
     "robot_wheel",
     "magic wheel (running)"
   },
   {
-    "key1",
+    "key_1",
     "key",
     "red key"
   },
   {
-    "key2",
+    "key_2",
     "key",
     "yellow key"
   },
   {
-    "key3",
+    "key_3",
     "key",
     "green key"
   },
   {
-    "key4",
+    "key_4",
     "key",
     "blue key"
   },
   {
-    "gate1",
+    "gate_1",
     "gate",
     "red door"
   },
   {
-    "gate2",
+    "gate_2",
     "gate",
     "yellow door"
   },
   {
-    "gate3",
+    "gate_3",
     "gate",
     "green door"
   },
   {
-    "gate4",
+    "gate_4",
     "gate",
     "blue door"
   },
   {
-    "gate1_gray",
+    "gate_1_gray",
     "gate",
     "gray door (opened by red key)"
   },
   {
-    "gate2_gray",
+    "gate_2_gray",
     "gate",
     "gray door (opened by yellow key)"},
   {
-    "gate3_gray",
+    "gate_3_gray",
     "gate",
     "gray door (opened by green key)"},
   {
-    "gate4_gray",
+    "gate_4_gray",
     "gate",
     "gray door (opened by blue key)"},
   {
@@ -329,7 +338,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   {
     "pacman",
     "pacman",
-    "pac man"
+    "pac man (random start direction)"
   },
   {
     "invisible_wall",
@@ -342,7 +351,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "lamp (off)"
   },
   {
-    "lamp_active",
+    "lamp.active",
     "lamp",
     "lamp (on)"
   },
@@ -377,7 +386,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "time orb (empty)"
   },
   {
-    "wall_growing",
+    "expandable_wall",
     "wall",
     "growing wall"
   },
@@ -422,156 +431,156 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "(not used)"
   },
   {
-    "dynabomb_nr",
-    "dynabomb_nr",
+    "dynabomb_increase_number",
+    "dynabomb",
     "increases number of bombs"
   },
   {
-    "dynabomb_sz",
-    "dynabomb_sz",
+    "dynabomb_increase_size",
+    "dynabomb",
     "increases explosion size"
   },
   {
-    "dynabomb_xl",
-    "dynabomb_xl",
+    "dynabomb_increase_power",
+    "dynabomb",
     "increases power of explosion"
   },
   {
     "sokoban_object",
-    "sokoban_object",
+    "sokoban",
     "sokoban object"
   },
   {
     "sokoban_field_empty",
-    "sokoban_field",
+    "sokoban",
     "sokoban empty field"
   },
   {
     "sokoban_field_full",
-    "sokoban_field",
+    "sokoban",
     "sokoban field with object"
   },
   {
-    "bd_butterfly_right",
+    "bd_butterfly.right",
     "bd_butterfly",
     "butterfly (starts moving right)"},
   {
-    "bd_butterfly_up",
+    "bd_butterfly.up",
     "bd_butterfly",
     "butterfly (starts moving up)"
   },
   {
-    "bd_butterfly_left",
+    "bd_butterfly.left",
     "bd_butterfly",
     "butterfly (starts moving left)"},
   {
-    "bd_butterfly_down",
+    "bd_butterfly.down",
     "bd_butterfly",
     "butterfly (starts moving down)"},
   {
-    "bd_firefly_right",
+    "bd_firefly.right",
     "bd_firefly",
     "firefly (starts moving right)"
   },
   {
-    "bd_firefly_up",
+    "bd_firefly.up",
     "bd_firefly",
     "firefly (starts moving up)"
   },
   {
-    "bd_firefly_left",
+    "bd_firefly.left",
     "bd_firefly",
     "firefly (starts moving left)"
   },
   {
-    "bd_firefly_down",
+    "bd_firefly.down",
     "bd_firefly",
     "firefly (starts moving down)"
   },
   {
     "bd_butterfly",
     "bd_butterfly",
-    "butterfly"
+    "butterfly (random start direction)"
   },
   {
     "bd_firefly",
     "bd_firefly",
-    "firefly"
+    "firefly (random start direction)"
   },
   {
-    "player1",
+    "player_1",
     "player",
     "yellow player"
   },
   {
-    "player2",
+    "player_2",
     "player",
     "red player"
   },
   {
-    "player3",
+    "player_3",
     "player",
     "green player"
   },
   {
-    "player4",
+    "player_4",
     "player",
     "blue player"
   },
   {
-    "bug_right",
+    "bug.right",
     "bug",
     "bug (starts moving right)"
   },
   {
-    "bug_up",
+    "bug.up",
     "bug",
     "bug (starts moving up)"
   },
   {
-    "bug_left",
+    "bug.left",
     "bug",
     "bug (starts moving left)"
   },
   {
-    "bug_down",
+    "bug.down",
     "bug",
     "bug (starts moving down)"
   },
   {
-    "spaceship_right",
+    "spaceship.right",
     "spaceship",
     "spaceship (starts moving right)"},
   {
-    "spaceship_up",
+    "spaceship.up",
     "spaceship",
     "spaceship (starts moving up)"
   },
   {
-    "spaceship_left",
+    "spaceship.left",
     "spaceship",
     "spaceship (starts moving left)"},
   {
-    "spaceship_down",
+    "spaceship.down",
     "spaceship",
     "spaceship (starts moving down)"},
   {
-    "pacman_right",
+    "pacman.right",
     "pacman",
     "pac man (starts moving right)"
   },
   {
-    "pacman_up",
+    "pacman.up",
     "pacman",
     "pac man (starts moving up)"
   },
   {
-    "pacman_left",
+    "pacman.left",
     "pacman",
     "pac man (starts moving left)"
   },
   {
-    "pacman_down",
+    "pacman.down",
     "pacman",
     "pac man (starts moving down)"
   },
@@ -596,27 +605,27 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "wall with purple emerald"
   },
   {
-    "acidpool_topleft",
+    "acid_pool_topleft",
     "wall",
     "acid pool (top left)"
   },
   {
-    "acidpool_topright",
+    "acid_pool_topright",
     "wall",
     "acid pool (top right)"
   },
   {
-    "acidpool_bottomleft",
+    "acid_pool_bottomleft",
     "wall",
     "acid pool (bottom left)"
   },
   {
-    "acidpool_bottom",
+    "acid_pool_bottom",
     "wall",
     "acid pool (bottom)"
   },
   {
-    "acidpool_bottomright",
+    "acid_pool_bottomright",
     "wall",
     "acid pool (bottom right)"
   },
@@ -638,7 +647,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   {
     "black_orb",
     "black_orb",
-    "black orb bomb"
+    "bomb"
   },
   {
     "amoeba_to_diamond",
@@ -648,7 +657,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   {
     "mole",
     "mole",
-    "mole"
+    "mole (random start direction)"
   },
   {
     "penguin",
@@ -661,22 +670,22 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "satellite"
   },
   {
-    "arrow_blue_left",
+    "arrow_left",
     "arrow",
     "arrow left"
   },
   {
-    "arrow_blue_right",
+    "arrow_right",
     "arrow",
     "arrow right"
   },
   {
-    "arrow_blue_up",
+    "arrow_up",
     "arrow",
     "arrow up"
   },
   {
-    "arrow_blue_down",
+    "arrow_down",
     "arrow",
     "arrow down"
   },
@@ -691,9 +700,9 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "fire breathing dragon"
   },
   {
-    "em_key1_file",
-    "key",
-    "red key (EM style)"
+    "em_key_1_file_obsolete",
+    "obsolete",
+    "key (OBSOLETE)"
   },
   {
     "char_space",
@@ -991,64 +1000,64 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "letter 'Z'"
   },
   {
-    "char_ae",
+    "char_bracketleft",
     "char",
-    "letter 'Ä'"
+    "letter '['"
   },
   {
-    "char_oe",
+    "char_backslash",
     "char",
-    "letter 'Ö'"
+    "letter '\\'"
   },
   {
-    "char_ue",
+    "char_bracketright",
     "char",
-    "letter 'Ü'"
+    "letter ']'"
   },
   {
-    "char_copyright",
+    "char_asciicircum",
     "char",
     "letter '^'"
   },
   {
     "char_underscore",
     "char",
-    "letter ''"
+    "letter '_'"
   },
   {
-    "char_empty",
+    "char_copyright",
     "char",
-    "letter ''"
+    "letter '©'"
   },
   {
-    "char_degree",
+    "char_aumlaut",
     "char",
-    "letter ''"
+    "letter 'Ä'"
   },
   {
-    "char_tm",
+    "char_oumlaut",
     "char",
-    "letter ''"
+    "letter 'Ö'"
   },
   {
-    "char_cursor",
+    "char_uumlaut",
     "char",
-    "letter ''"
+    "letter 'Ü'"
   },
   {
-    "char_unused",
+    "char_degree",
     "char",
-    "letter ''"
+    "letter '°'"
   },
   {
-    "char_unused",
+    "char_trademark",
     "char",
-    "letter ''"
+    "letter '®'"
   },
   {
-    "char_unused",
+    "char_cursor",
     "char",
-    "letter ''"
+    "letter ' '"
   },
   {
     "char_unused",
@@ -1096,54 +1105,54 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "letter ''"
   },
   {
-    "wall_growing_x",
+    "expandable_wall_horizontal",
     "wall",
     "growing wall (horizontal)"
   },
   {
-    "wall_growing_y",
+    "expandable_wall_vertical",
     "wall",
     "growing wall (vertical)"
   },
   {
-    "wall_growing_xy",
+    "expandable_wall_any",
     "wall",
-    "growing wall (all directions)"
+    "growing wall (any direction)"
   },
   {
-    "em_gate1",
+    "em_gate_1",
     "gate",
     "red door (EM style)"
   },
   {
-    "em_gate2",
+    "em_gate_2",
     "gate",
     "yellow door (EM style)"
   },
   {
-    "em_gate3",
+    "em_gate_3",
     "gate",
     "green door (EM style)"
   },
   {
-    "em_gate4",
+    "em_gate_4",
     "gate",
     "blue door (EM style)"
   },
   {
-    "em_key2_file",
-    "key",
-    "yellow key (EM style)"
+    "em_key_2_file_obsolete",
+    "obsolete",
+    "key (OBSOLETE)"
   },
   {
-    "em_key3_file",
-    "key",
-    "green key (EM style)"
+    "em_key_3_file_obsolete",
+    "obsolete",
+    "key (OBSOLETE)"
   },
   {
-    "em_key4_file",
-    "key",
-    "blue key (EM style)"
+    "em_key_4_file_obsolete",
+    "obsolete",
+    "key (OBSOLETE)"
   },
   {
     "sp_empty_space",
@@ -1176,7 +1185,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "chip (single)"
   },
   {
-    "sp_hard_gray",
+    "sp_hardware_gray",
     "wall",
     "hardware"
   },
@@ -1191,44 +1200,44 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "orange disk"
   },
   {
-    "sp_port1_right",
+    "sp_port_right",
     "sp_port",
     "port (leading right)"
   },
   {
-    "sp_port1_down",
+    "sp_port_down",
     "sp_port",
     "port (leading down)"
   },
   {
-    "sp_port1_left",
+    "sp_port_left",
     "sp_port",
     "port (leading left)"
   },
   {
-    "sp_port1_up",
+    "sp_port_up",
     "sp_port",
     "port (leading up)"
   },
   {
-    "sp_port2_right",
+    "sp_gravity_port_right",
     "sp_port",
-    "port (leading right)"
+    "gravity port (leading right)"
   },
   {
-    "sp_port2_down",
+    "sp_gravity_port_down",
     "sp_port",
-    "port (leading down)"
+    "gravity port (leading down)"
   },
   {
-    "sp_port2_left",
+    "sp_gravity_port_left",
     "sp_port",
-    "port (leading left)"
+    "gravity port (leading left)"
   },
   {
-    "sp_port2_up",
+    "sp_gravity_port_up",
     "sp_port",
-    "port (leading up)"
+    "gravity port (leading up)"
   },
   {
     "sp_sniksnak",
@@ -1247,23 +1256,23 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "sp_disk_red",
-    "sp_disk_red",
+    "dynamite",
     "red disk"
   },
   {
-    "sp_port_y",
+    "sp_port_vertical",
     "sp_port",
     "port (vertical)"
   },
   {
-    "sp_port_x",
+    "sp_port_horizontal",
     "sp_port",
     "port (horizontal)"
   },
   {
-    "sp_port_xy",
+    "sp_port_any",
     "sp_port",
-    "port (all directions)"
+    "port (any direction)"
   },
   {
     "sp_electron",
@@ -1286,82 +1295,82 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "chip (right half)"
   },
   {
-    "sp_hard_base1",
+    "sp_hardware_base_1",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_green",
+    "sp_hardware_green",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_blue",
+    "sp_hardware_blue",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_red",
+    "sp_hardware_red",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_yellow",
+    "sp_hardware_yellow",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_base2",
+    "sp_hardware_base_2",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_base3",
+    "sp_hardware_base_3",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_base4",
+    "sp_hardware_base_4",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_base5",
+    "sp_hardware_base_5",
     "wall",
     "hardware"
   },
   {
-    "sp_hard_base6",
+    "sp_hardware_base_6",
     "wall",
     "hardware"
   },
   {
-    "sp_chip_upper",
+    "sp_chip_top",
     "wall",
     "chip (upper half)"
   },
   {
-    "sp_chip_lower",
+    "sp_chip_bottom",
     "wall",
     "chip (lower half)"
   },
   {
-    "em_gate1_gray",
+    "em_gate_1_gray",
     "gate",
     "gray door (EM style, red key)"
   },
   {
-    "em_gate2_gray",
+    "em_gate_2_gray",
     "gate",
     "gray door (EM style, yellow key)"
   },
   {
-    "em_gate3_gray",
+    "em_gate_3_gray",
     "gate",
     "gray door (EM style, green key)"
   },
   {
-    "em_gate4_gray",
+    "em_gate_4_gray",
     "gate",
     "gray door (EM style, blue key)"
   },
@@ -1451,122 +1460,122 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "conveyor_belt1_left",
+    "conveyor_belt_1_left",
     "conveyor_belt",
     "red conveyor belt (left)"
   },
   {
-    "conveyor_belt1_middle",
+    "conveyor_belt_1_middle",
     "conveyor_belt",
     "red conveyor belt (middle)"
   },
   {
-    "conveyor_belt1_right",
+    "conveyor_belt_1_right",
     "conveyor_belt",
     "red conveyor belt (right)"
   },
   {
-    "conveyor_belt1_switch_left",
+    "conveyor_belt_1_switch_left",
     "conveyor_belt_switch",
     "switch for red conveyor belt (left)"
   },
   {
-    "conveyor_belt1_switch_middle",
+    "conveyor_belt_1_switch_middle",
     "conveyor_belt_switch",
     "switch for red conveyor belt (middle)"
   },
   {
-    "conveyor_belt1_switch_right",
+    "conveyor_belt_1_switch_right",
     "conveyor_belt_switch",
     "switch for red conveyor belt (right)"
   },
   {
-    "conveyor_belt2_left",
+    "conveyor_belt_2_left",
     "conveyor_belt",
     "yellow conveyor belt (left)"
   },
   {
-    "conveyor_belt2_middle",
+    "conveyor_belt_2_middle",
     "conveyor_belt",
     "yellow conveyor belt (middle)"
   },
   {
-    "conveyor_belt2_right",
+    "conveyor_belt_2_right",
     "conveyor_belt",
     "yellow conveyor belt (right)"
   },
   {
-    "conveyor_belt2_switch_left",
+    "conveyor_belt_2_switch_left",
     "conveyor_belt_switch",
     "switch for yellow conveyor belt (left)"
   },
   {
-    "conveyor_belt2_switch_middle",
+    "conveyor_belt_2_switch_middle",
     "conveyor_belt_switch",
     "switch for yellow conveyor belt (middle)"
   },
   {
-    "conveyor_belt2_switch_right",
+    "conveyor_belt_2_switch_right",
     "conveyor_belt_switch",
     "switch for yellow conveyor belt (right)"
   },
   {
-    "conveyor_belt3_left",
+    "conveyor_belt_3_left",
     "conveyor_belt",
     "green conveyor belt (left)"
   },
   {
-    "conveyor_belt3_middle",
+    "conveyor_belt_3_middle",
     "conveyor_belt",
     "green conveyor belt (middle)"
   },
   {
-    "conveyor_belt3_right",
+    "conveyor_belt_3_right",
     "conveyor_belt",
     "green conveyor belt (right)"
   },
   {
-    "conveyor_belt3_switch_left",
+    "conveyor_belt_3_switch_left",
     "conveyor_belt_switch",
     "switch for green conveyor belt (left)"
   },
   {
-    "conveyor_belt3_switch_middle",
+    "conveyor_belt_3_switch_middle",
     "conveyor_belt_switch",
     "switch for green conveyor belt (middle)"
   },
   {
-    "conveyor_belt3_switch_right",
+    "conveyor_belt_3_switch_right",
     "conveyor_belt_switch",
     "switch for green conveyor belt (right)"
   },
   {
-    "conveyor_belt4_left",
+    "conveyor_belt_4_left",
     "conveyor_belt",
     "blue conveyor belt (left)"
   },
   {
-    "conveyor_belt4_middle",
+    "conveyor_belt_4_middle",
     "conveyor_belt",
     "blue conveyor belt (middle)"
   },
   {
-    "conveyor_belt4_right",
+    "conveyor_belt_4_right",
     "conveyor_belt",
     "blue conveyor belt (right)"
   },
   {
-    "conveyor_belt4_switch_left",
+    "conveyor_belt_4_switch_left",
     "conveyor_belt_switch",
     "switch for blue conveyor belt (left)"
   },
   {
-    "conveyor_belt4_switch_middle",
+    "conveyor_belt_4_switch_middle",
     "conveyor_belt_switch",
     "switch for blue conveyor belt (middle)"
   },
   {
-    "conveyor_belt4_switch_right",
+    "conveyor_belt_4_switch_right",
     "conveyor_belt_switch",
     "switch for blue conveyor belt (right)"
   },
@@ -1576,9 +1585,9 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "land mine"
   },
   {
-    "envelope",
-    "envelope",
-    "mail envelope"
+    "envelope_obsolete",
+    "obsolete",
+    "envelope (OBSOLETE)"
   },
   {
     "light_switch",
@@ -1586,7 +1595,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "light switch (off)"
   },
   {
-    "light_switch_active",
+    "light_switch.active",
     "light_switch",
     "light switch (on)"
   },
@@ -1651,29 +1660,29 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "sign (other)"
   },
   {
-    "mole_left",
+    "mole.left",
     "mole",
     "mole (starts moving left)"
   },
   {
-    "mole_right",
+    "mole.right",
     "mole",
     "mole (starts moving right)"
   },
   {
-    "mole_up",
+    "mole.up",
     "mole",
     "mole (starts moving up)"
   },
   {
-    "mole_down",
+    "mole.down",
     "mole",
     "mole (starts moving down)"
   },
   {
-    "steelwall_slanted",
+    "steelwall_slippery",
     "wall",
-    "steel wall (slanted)"
+    "slippery steel wall"
   },
   {
     "invisible_sand",
@@ -1716,7 +1725,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "time gate (closed)"
   },
   {
-    "timegate_switch_active",
+    "timegate_switch.active",
     "timegate_switch",
     "switch for time gate"
   },
@@ -1731,94 +1740,94 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "balloon"
   },
   {
-    "balloon_send_left",
+    "balloon_switch_left",
     "balloon_switch",
     "send balloon to the left"
   },
   {
-    "balloon_send_right",
+    "balloon_switch_right",
     "balloon_switch",
     "send balloon to the right"
   },
   {
-    "balloon_send_up",
+    "balloon_switch_up",
     "balloon_switch",
     "send balloon up"
   },
   {
-    "balloon_send_down",
+    "balloon_switch_down",
     "balloon_switch",
     "send balloon down"
   },
   {
-    "balloon_send_any_direction",
+    "balloon_switch_any",
     "balloon_switch",
     "send balloon in any direction"
   },
   {
-    "emc_steelwall1",
+    "emc_steelwall_1",
     "wall",
     "steel wall"
   },
   {
-    "emc_steelwall2",
+    "emc_steelwall_2",
     "wall",
     "steel wall"
   },
   {
-    "emc_steelwall3",
+    "emc_steelwall_3",
     "wall",
     "steel wall"
   },
   {
-    "emc_steelwall4",
+    "emc_steelwall_4",
     "wall",
     "steel wall"
   },
   {
-    "emc_wall_pillar_upper",
+    "emc_wall_1",
     "wall",
     "normal wall"
   },
   {
-    "emc_wall_pillar_middle",
+    "emc_wall_2",
     "wall",
     "normal wall"
   },
   {
-    "emc_wall_pillar_lower",
+    "emc_wall_3",
     "wall",
     "normal wall"
   },
   {
-    "emc_wall4",
+    "emc_wall_4",
     "wall",
     "normal wall"
   },
   {
-    "emc_wall5",
+    "emc_wall_5",
     "wall",
     "normal wall"
   },
   {
-    "emc_wall6",
+    "emc_wall_6",
     "wall",
     "normal wall"
   },
   {
-    "emc_wall7",
+    "emc_wall_7",
     "wall",
     "normal wall"
   },
   {
-    "emc_wall8",
+    "emc_wall_8",
     "wall",
     "normal wall"
   },
   {
-    "tube_all",
+    "tube_any",
     "tube",
-    "tube (all directions)"
+    "tube (any direction)"
   },
   {
     "tube_vertical",
@@ -1882,7 +1891,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "dx_supabomb",
-    "dx_bomb",
+    "bomb",
     "stable bomb (DX style)"
   },
   {
@@ -1897,823 +1906,1498 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "custom_1",
-    "custom_1",
+    "custom",
     "custom element 1"
   },
   {
     "custom_2",
-    "custom_2",
+    "custom",
     "custom element 2"
   },
   {
     "custom_3",
-    "custom_3",
+    "custom",
     "custom element 3"
   },
   {
     "custom_4",
-    "custom_4",
+    "custom",
     "custom element 4"
   },
   {
     "custom_5",
-    "custom_5",
+    "custom",
     "custom element 5"
   },
   {
     "custom_6",
-    "custom_6",
+    "custom",
     "custom element 6"
   },
   {
     "custom_7",
-    "custom_7",
+    "custom",
     "custom element 7"
   },
   {
     "custom_8",
-    "custom_8",
+    "custom",
     "custom element 8"
   },
   {
     "custom_9",
-    "custom_9",
+    "custom",
     "custom element 9"
   },
   {
     "custom_10",
-    "custom_10",
+    "custom",
     "custom element 10"
   },
   {
     "custom_11",
-    "custom_11",
+    "custom",
     "custom element 11"
   },
   {
     "custom_12",
-    "custom_12",
+    "custom",
     "custom element 12"
   },
   {
     "custom_13",
-    "custom_13",
+    "custom",
     "custom element 13"
   },
   {
     "custom_14",
-    "custom_14",
+    "custom",
     "custom element 14"
   },
   {
     "custom_15",
-    "custom_15",
+    "custom",
     "custom element 15"
   },
   {
     "custom_16",
-    "custom_16",
+    "custom",
     "custom element 16"
   },
   {
     "custom_17",
-    "custom_17",
+    "custom",
     "custom element 17"
   },
   {
     "custom_18",
-    "custom_18",
+    "custom",
     "custom element 18"
   },
   {
     "custom_19",
-    "custom_19",
+    "custom",
     "custom element 19"
   },
   {
     "custom_20",
-    "custom_20",
+    "custom",
     "custom element 20"
   },
   {
     "custom_21",
-    "custom_21",
+    "custom",
     "custom element 21"
   },
   {
     "custom_22",
-    "custom_22",
+    "custom",
     "custom element 22"
   },
   {
     "custom_23",
-    "custom_23",
+    "custom",
     "custom element 23"
   },
   {
     "custom_24",
-    "custom_24",
+    "custom",
     "custom element 24"
   },
   {
     "custom_25",
-    "custom_25",
+    "custom",
     "custom element 25"
   },
   {
     "custom_26",
-    "custom_26",
+    "custom",
     "custom element 26"
   },
   {
     "custom_27",
-    "custom_27",
+    "custom",
     "custom element 27"
   },
   {
     "custom_28",
-    "custom_28",
+    "custom",
     "custom element 28"
   },
   {
     "custom_29",
-    "custom_29",
+    "custom",
     "custom element 29"
   },
   {
     "custom_30",
-    "custom_30",
+    "custom",
     "custom element 30"
   },
   {
     "custom_31",
-    "custom_31",
+    "custom",
     "custom element 31"
   },
   {
     "custom_32",
-    "custom_32",
+    "custom",
     "custom element 32"
   },
   {
     "custom_33",
-    "custom_33",
+    "custom",
     "custom element 33"
   },
   {
     "custom_34",
-    "custom_34",
+    "custom",
     "custom element 34"
   },
   {
     "custom_35",
-    "custom_35",
+    "custom",
     "custom element 35"
   },
   {
     "custom_36",
-    "custom_36",
+    "custom",
     "custom element 36"
   },
   {
     "custom_37",
-    "custom_37",
+    "custom",
     "custom element 37"
   },
   {
     "custom_38",
-    "custom_38",
+    "custom",
     "custom element 38"
   },
   {
     "custom_39",
-    "custom_39",
+    "custom",
     "custom element 39"
   },
   {
     "custom_40",
-    "custom_40",
+    "custom",
     "custom element 40"
   },
   {
     "custom_41",
-    "custom_41",
+    "custom",
     "custom element 41"
   },
   {
     "custom_42",
-    "custom_42",
+    "custom",
     "custom element 42"
   },
   {
     "custom_43",
-    "custom_43",
+    "custom",
     "custom element 43"
   },
   {
     "custom_44",
-    "custom_44",
+    "custom",
     "custom element 44"
   },
   {
     "custom_45",
-    "custom_45",
+    "custom",
     "custom element 45"
   },
   {
     "custom_46",
-    "custom_46",
+    "custom",
     "custom element 46"
   },
   {
     "custom_47",
-    "custom_47",
+    "custom",
     "custom element 47"
   },
   {
     "custom_48",
-    "custom_48",
+    "custom",
     "custom element 48"
   },
   {
     "custom_49",
-    "custom_49",
+    "custom",
     "custom element 49"
   },
   {
     "custom_50",
-    "custom_50",
+    "custom",
     "custom element 50"
   },
   {
     "custom_51",
-    "custom_51",
+    "custom",
     "custom element 51"
   },
   {
     "custom_52",
-    "custom_52",
+    "custom",
     "custom element 52"
   },
   {
     "custom_53",
-    "custom_53",
+    "custom",
     "custom element 53"
   },
   {
     "custom_54",
-    "custom_54",
+    "custom",
     "custom element 54"
   },
   {
     "custom_55",
-    "custom_55",
+    "custom",
     "custom element 55"
   },
   {
     "custom_56",
-    "custom_56",
+    "custom",
     "custom element 56"
   },
   {
     "custom_57",
-    "custom_57",
+    "custom",
     "custom element 57"
   },
   {
     "custom_58",
-    "custom_58",
+    "custom",
     "custom element 58"
   },
   {
     "custom_59",
-    "custom_59",
+    "custom",
     "custom element 59"
   },
   {
     "custom_60",
-    "custom_60",
+    "custom",
     "custom element 60"
   },
   {
     "custom_61",
-    "custom_61",
+    "custom",
     "custom element 61"
   },
   {
     "custom_62",
-    "custom_62",
+    "custom",
     "custom element 62"
   },
   {
     "custom_63",
-    "custom_63",
+    "custom",
     "custom element 63"
   },
   {
     "custom_64",
-    "custom_64",
+    "custom",
     "custom element 64"
   },
   {
     "custom_65",
-    "custom_65",
+    "custom",
     "custom element 65"
   },
   {
     "custom_66",
-    "custom_66",
+    "custom",
     "custom element 66"
   },
   {
     "custom_67",
-    "custom_67",
+    "custom",
     "custom element 67"
   },
   {
     "custom_68",
-    "custom_68",
+    "custom",
     "custom element 68"
   },
   {
     "custom_69",
-    "custom_69",
+    "custom",
     "custom element 69"
   },
   {
     "custom_70",
-    "custom_70",
+    "custom",
     "custom element 70"
   },
   {
     "custom_71",
-    "custom_71",
+    "custom",
     "custom element 71"
   },
   {
     "custom_72",
-    "custom_72",
+    "custom",
     "custom element 72"
   },
   {
     "custom_73",
-    "custom_73",
+    "custom",
     "custom element 73"
   },
   {
     "custom_74",
-    "custom_74",
+    "custom",
     "custom element 74"
   },
   {
     "custom_75",
-    "custom_75",
+    "custom",
     "custom element 75"
   },
   {
     "custom_76",
-    "custom_76",
+    "custom",
     "custom element 76"
   },
   {
     "custom_77",
-    "custom_77",
+    "custom",
     "custom element 77"
   },
   {
     "custom_78",
-    "custom_78",
+    "custom",
     "custom element 78"
   },
   {
     "custom_79",
-    "custom_79",
+    "custom",
     "custom element 79"
   },
   {
     "custom_80",
-    "custom_80",
+    "custom",
     "custom element 80"
   },
   {
     "custom_81",
-    "custom_81",
+    "custom",
     "custom element 81"
   },
   {
     "custom_82",
-    "custom_82",
+    "custom",
     "custom element 82"
   },
   {
     "custom_83",
-    "custom_83",
+    "custom",
     "custom element 83"
   },
   {
     "custom_84",
-    "custom_84",
+    "custom",
     "custom element 84"
   },
   {
     "custom_85",
-    "custom_85",
+    "custom",
     "custom element 85"
   },
   {
     "custom_86",
-    "custom_86",
+    "custom",
     "custom element 86"
   },
   {
     "custom_87",
-    "custom_87",
+    "custom",
     "custom element 87"
   },
   {
     "custom_88",
-    "custom_88",
+    "custom",
     "custom element 88"
   },
   {
     "custom_89",
-    "custom_89",
+    "custom",
     "custom element 89"
   },
   {
     "custom_90",
-    "custom_90",
+    "custom",
     "custom element 90"
   },
   {
     "custom_91",
-    "custom_91",
+    "custom",
     "custom element 91"
   },
   {
     "custom_92",
-    "custom_92",
+    "custom",
     "custom element 92"
   },
   {
     "custom_93",
-    "custom_93",
+    "custom",
     "custom element 93"
   },
   {
     "custom_94",
-    "custom_94",
+    "custom",
     "custom element 94"
   },
   {
     "custom_95",
-    "custom_95",
+    "custom",
     "custom element 95"
   },
   {
     "custom_96",
-    "custom_96",
+    "custom",
     "custom element 96"
   },
   {
     "custom_97",
-    "custom_97",
+    "custom",
     "custom element 97"
   },
   {
     "custom_98",
-    "custom_98",
+    "custom",
     "custom element 98"
   },
   {
     "custom_99",
-    "custom_99",
+    "custom",
     "custom element 99"
   },
   {
     "custom_100",
-    "custom_100",
+    "custom",
     "custom element 100"
   },
   {
     "custom_101",
-    "custom_101",
+    "custom",
     "custom element 101"
   },
   {
     "custom_102",
-    "custom_102",
+    "custom",
     "custom element 102"
   },
   {
     "custom_103",
-    "custom_103",
+    "custom",
     "custom element 103"
   },
   {
     "custom_104",
-    "custom_104",
+    "custom",
     "custom element 104"
   },
   {
     "custom_105",
-    "custom_105",
+    "custom",
     "custom element 105"
   },
   {
     "custom_106",
-    "custom_106",
+    "custom",
     "custom element 106"
   },
   {
     "custom_107",
-    "custom_107",
+    "custom",
     "custom element 107"
   },
   {
     "custom_108",
-    "custom_108",
+    "custom",
     "custom element 108"
   },
   {
     "custom_109",
-    "custom_109",
+    "custom",
     "custom element 109"
   },
   {
     "custom_110",
-    "custom_110",
+    "custom",
     "custom element 110"
   },
   {
     "custom_111",
-    "custom_111",
+    "custom",
     "custom element 111"
   },
   {
     "custom_112",
-    "custom_112",
+    "custom",
     "custom element 112"
   },
   {
     "custom_113",
-    "custom_113",
+    "custom",
     "custom element 113"
   },
   {
     "custom_114",
-    "custom_114",
+    "custom",
     "custom element 114"
   },
   {
     "custom_115",
-    "custom_115",
+    "custom",
     "custom element 115"
   },
   {
     "custom_116",
-    "custom_116",
+    "custom",
     "custom element 116"
   },
   {
     "custom_117",
-    "custom_117",
+    "custom",
     "custom element 117"
   },
   {
     "custom_118",
-    "custom_118",
+    "custom",
     "custom element 118"
   },
   {
     "custom_119",
-    "custom_119",
+    "custom",
     "custom element 119"
   },
   {
     "custom_120",
-    "custom_120",
+    "custom",
     "custom element 120"
   },
   {
     "custom_121",
-    "custom_121",
+    "custom",
     "custom element 121"
   },
   {
     "custom_122",
-    "custom_122",
+    "custom",
     "custom element 122"
   },
   {
     "custom_123",
-    "custom_123",
+    "custom",
     "custom element 123"
   },
   {
     "custom_124",
-    "custom_124",
+    "custom",
     "custom element 124"
   },
   {
     "custom_125",
-    "custom_125",
+    "custom",
     "custom element 125"
   },
   {
     "custom_126",
-    "custom_126",
+    "custom",
     "custom element 126"
   },
   {
     "custom_127",
-    "custom_127",
+    "custom",
     "custom element 127"
   },
   {
     "custom_128",
-    "custom_128",
+    "custom",
     "custom element 128"
   },
-
-  /* ----------------------------------------------------------------------- */
-  /* "real" (and therefore drawable) runtime elements                        */
-  /* ----------------------------------------------------------------------- */
-
   {
-    "em_key1",
-    "key",
-    "-"
-    },
+    "custom_129",
+    "custom",
+    "custom element 129"
+  },
   {
-    "em_key2",
-    "key",
-    "-"
-    },
+    "custom_130",
+    "custom",
+    "custom element 130"
+  },
   {
-    "em_key3",
-    "key",
-    "-"
+    "custom_131",
+    "custom",
+    "custom element 131"
   },
   {
-    "em_key4",
-    "key",
-    "-"
+    "custom_132",
+    "custom",
+    "custom element 132"
   },
   {
-    "dynabomb_player1_active",
-    "dynabomb",
-    "-"
+    "custom_133",
+    "custom",
+    "custom element 133"
   },
   {
-    "dynabomb_player2_active",
-    "dynabomb",
-    "-"
+    "custom_134",
+    "custom",
+    "custom element 134"
   },
   {
-    "dynabomb_player3_active",
-    "dynabomb",
-    "-"
+    "custom_135",
+    "custom",
+    "custom element 135"
   },
   {
-    "dynabomb_player4_active",
-    "dynabomb",
-    "-"
+    "custom_136",
+    "custom",
+    "custom element 136"
   },
   {
-    "sp_disk_red_active",
-    "dynamite",
-    "-"
+    "custom_137",
+    "custom",
+    "custom element 137"
   },
   {
-    "switchgate_opening",
-    "switchgate",
-    "-"
+    "custom_138",
+    "custom",
+    "custom element 138"
   },
   {
-    "switchgate_closing",
-    "switchgate",
-    "-"
+    "custom_139",
+    "custom",
+    "custom element 139"
   },
   {
-    "timegate_opening",
-    "timegate",
-    "-"
+    "custom_140",
+    "custom",
+    "custom element 140"
   },
   {
-    "timegate_closing",
-    "timegate",
-    "-"
+    "custom_141",
+    "custom",
+    "custom element 141"
   },
   {
-    "pearl_breaking",
-    "pearl",
-    "-"
+    "custom_142",
+    "custom",
+    "custom element 142"
   },
   {
-    "trap_active",
-    "trap",
-    "-"
+    "custom_143",
+    "custom",
+    "custom element 143"
   },
   {
-    "invisible_steelwall_active",
-    "wall",
-    "-"
+    "custom_144",
+    "custom",
+    "custom element 144"
   },
   {
-    "invisible_wall_active",
-    "wall",
-    "-"
+    "custom_145",
+    "custom",
+    "custom element 145"
   },
   {
-    "invisible_sand_active",
-    "sand",
-    "-"
+    "custom_146",
+    "custom",
+    "custom element 146"
   },
   {
-    "conveyor_belt1_left_active",
-    "conveyor_belt",
-    "-"
+    "custom_147",
+    "custom",
+    "custom element 147"
   },
   {
-    "conveyor_belt1_middle_active",
-    "conveyor_belt",
-    "-"
+    "custom_148",
+    "custom",
+    "custom element 148"
   },
   {
-    "conveyor_belt1_right_active",
-    "conveyor_belt",
-    "-"
+    "custom_149",
+    "custom",
+    "custom element 149"
   },
   {
-    "conveyor_belt2_left_active",
-    "conveyor_belt",
-    "-"
+    "custom_150",
+    "custom",
+    "custom element 150"
   },
   {
-    "conveyor_belt2_middle_active",
-    "conveyor_belt",
-    "-"
+    "custom_151",
+    "custom",
+    "custom element 151"
   },
   {
-    "conveyor_belt2_right_active",
-    "conveyor_belt",
-    "-"
+    "custom_152",
+    "custom",
+    "custom element 152"
   },
   {
-    "conveyor_belt3_left_active",
-    "conveyor_belt",
-    "-"
+    "custom_153",
+    "custom",
+    "custom element 153"
   },
   {
-    "conveyor_belt3_middle_active",
-    "conveyor_belt",
-    "-"
+    "custom_154",
+    "custom",
+    "custom element 154"
   },
   {
-    "conveyor_belt3_right_active",
-    "conveyor_belt",
-    "-"
+    "custom_155",
+    "custom",
+    "custom element 155"
   },
   {
-    "conveyor_belt4_left_active",
-    "conveyor_belt",
-    "-"
+    "custom_156",
+    "custom",
+    "custom element 156"
   },
   {
-    "conveyor_belt4_middle_active",
-    "conveyor_belt",
-    "-"
+    "custom_157",
+    "custom",
+    "custom element 157"
   },
   {
-    "conveyor_belt4_right_active",
-    "conveyor_belt",
-    "-"
+    "custom_158",
+    "custom",
+    "custom element 158"
   },
   {
-    "exit_opening",
-    "exit",
-    "-"
+    "custom_159",
+    "custom",
+    "custom element 159"
   },
   {
-    "sp_exit_open",
-    "sp_exit",
-    "-"
+    "custom_160",
+    "custom",
+    "custom element 160"
   },
   {
-    "sp_terminal_active",
-    "sp_terminal",
-    "-"
+    "custom_161",
+    "custom",
+    "custom element 161"
   },
   {
-    "sp_buggy_base_activating",
-    "sp_buggy_base",
-    "-"
+    "custom_162",
+    "custom",
+    "custom element 162"
   },
   {
-    "sp_buggy_base_active",
-    "sp_buggy_base",
-    "-"
+    "custom_163",
+    "custom",
+    "custom element 163"
+  },
+  {
+    "custom_164",
+    "custom",
+    "custom element 164"
+  },
+  {
+    "custom_165",
+    "custom",
+    "custom element 165"
+  },
+  {
+    "custom_166",
+    "custom",
+    "custom element 166"
+  },
+  {
+    "custom_167",
+    "custom",
+    "custom element 167"
+  },
+  {
+    "custom_168",
+    "custom",
+    "custom element 168"
+  },
+  {
+    "custom_169",
+    "custom",
+    "custom element 169"
+  },
+  {
+    "custom_170",
+    "custom",
+    "custom element 170"
+  },
+  {
+    "custom_171",
+    "custom",
+    "custom element 171"
+  },
+  {
+    "custom_172",
+    "custom",
+    "custom element 172"
+  },
+  {
+    "custom_173",
+    "custom",
+    "custom element 173"
+  },
+  {
+    "custom_174",
+    "custom",
+    "custom element 174"
+  },
+  {
+    "custom_175",
+    "custom",
+    "custom element 175"
+  },
+  {
+    "custom_176",
+    "custom",
+    "custom element 176"
+  },
+  {
+    "custom_177",
+    "custom",
+    "custom element 177"
+  },
+  {
+    "custom_178",
+    "custom",
+    "custom element 178"
+  },
+  {
+    "custom_179",
+    "custom",
+    "custom element 179"
+  },
+  {
+    "custom_180",
+    "custom",
+    "custom element 180"
+  },
+  {
+    "custom_181",
+    "custom",
+    "custom element 181"
+  },
+  {
+    "custom_182",
+    "custom",
+    "custom element 182"
+  },
+  {
+    "custom_183",
+    "custom",
+    "custom element 183"
+  },
+  {
+    "custom_184",
+    "custom",
+    "custom element 184"
+  },
+  {
+    "custom_185",
+    "custom",
+    "custom element 185"
+  },
+  {
+    "custom_186",
+    "custom",
+    "custom element 186"
+  },
+  {
+    "custom_187",
+    "custom",
+    "custom element 187"
+  },
+  {
+    "custom_188",
+    "custom",
+    "custom element 188"
+  },
+  {
+    "custom_189",
+    "custom",
+    "custom element 189"
+  },
+  {
+    "custom_190",
+    "custom",
+    "custom element 190"
+  },
+  {
+    "custom_191",
+    "custom",
+    "custom element 191"
+  },
+  {
+    "custom_192",
+    "custom",
+    "custom element 192"
+  },
+  {
+    "custom_193",
+    "custom",
+    "custom element 193"
+  },
+  {
+    "custom_194",
+    "custom",
+    "custom element 194"
+  },
+  {
+    "custom_195",
+    "custom",
+    "custom element 195"
+  },
+  {
+    "custom_196",
+    "custom",
+    "custom element 196"
+  },
+  {
+    "custom_197",
+    "custom",
+    "custom element 197"
+  },
+  {
+    "custom_198",
+    "custom",
+    "custom element 198"
+  },
+  {
+    "custom_199",
+    "custom",
+    "custom element 199"
+  },
+  {
+    "custom_200",
+    "custom",
+    "custom element 200"
+  },
+  {
+    "custom_201",
+    "custom",
+    "custom element 201"
+  },
+  {
+    "custom_202",
+    "custom",
+    "custom element 202"
+  },
+  {
+    "custom_203",
+    "custom",
+    "custom element 203"
+  },
+  {
+    "custom_204",
+    "custom",
+    "custom element 204"
+  },
+  {
+    "custom_205",
+    "custom",
+    "custom element 205"
+  },
+  {
+    "custom_206",
+    "custom",
+    "custom element 206"
+  },
+  {
+    "custom_207",
+    "custom",
+    "custom element 207"
+  },
+  {
+    "custom_208",
+    "custom",
+    "custom element 208"
+  },
+  {
+    "custom_209",
+    "custom",
+    "custom element 209"
+  },
+  {
+    "custom_210",
+    "custom",
+    "custom element 210"
+  },
+  {
+    "custom_211",
+    "custom",
+    "custom element 211"
+  },
+  {
+    "custom_212",
+    "custom",
+    "custom element 212"
+  },
+  {
+    "custom_213",
+    "custom",
+    "custom element 213"
+  },
+  {
+    "custom_214",
+    "custom",
+    "custom element 214"
+  },
+  {
+    "custom_215",
+    "custom",
+    "custom element 215"
+  },
+  {
+    "custom_216",
+    "custom",
+    "custom element 216"
+  },
+  {
+    "custom_217",
+    "custom",
+    "custom element 217"
+  },
+  {
+    "custom_218",
+    "custom",
+    "custom element 218"
+  },
+  {
+    "custom_219",
+    "custom",
+    "custom element 219"
+  },
+  {
+    "custom_220",
+    "custom",
+    "custom element 220"
+  },
+  {
+    "custom_221",
+    "custom",
+    "custom element 221"
+  },
+  {
+    "custom_222",
+    "custom",
+    "custom element 222"
+  },
+  {
+    "custom_223",
+    "custom",
+    "custom element 223"
+  },
+  {
+    "custom_224",
+    "custom",
+    "custom element 224"
+  },
+  {
+    "custom_225",
+    "custom",
+    "custom element 225"
+  },
+  {
+    "custom_226",
+    "custom",
+    "custom element 226"
+  },
+  {
+    "custom_227",
+    "custom",
+    "custom element 227"
+  },
+  {
+    "custom_228",
+    "custom",
+    "custom element 228"
+  },
+  {
+    "custom_229",
+    "custom",
+    "custom element 229"
+  },
+  {
+    "custom_230",
+    "custom",
+    "custom element 230"
+  },
+  {
+    "custom_231",
+    "custom",
+    "custom element 231"
+  },
+  {
+    "custom_232",
+    "custom",
+    "custom element 232"
+  },
+  {
+    "custom_233",
+    "custom",
+    "custom element 233"
+  },
+  {
+    "custom_234",
+    "custom",
+    "custom element 234"
+  },
+  {
+    "custom_235",
+    "custom",
+    "custom element 235"
+  },
+  {
+    "custom_236",
+    "custom",
+    "custom element 236"
+  },
+  {
+    "custom_237",
+    "custom",
+    "custom element 237"
+  },
+  {
+    "custom_238",
+    "custom",
+    "custom element 238"
+  },
+  {
+    "custom_239",
+    "custom",
+    "custom element 239"
+  },
+  {
+    "custom_240",
+    "custom",
+    "custom element 240"
+  },
+  {
+    "custom_241",
+    "custom",
+    "custom element 241"
+  },
+  {
+    "custom_242",
+    "custom",
+    "custom element 242"
+  },
+  {
+    "custom_243",
+    "custom",
+    "custom element 243"
+  },
+  {
+    "custom_244",
+    "custom",
+    "custom element 244"
+  },
+  {
+    "custom_245",
+    "custom",
+    "custom element 245"
+  },
+  {
+    "custom_246",
+    "custom",
+    "custom element 246"
+  },
+  {
+    "custom_247",
+    "custom",
+    "custom element 247"
+  },
+  {
+    "custom_248",
+    "custom",
+    "custom element 248"
+  },
+  {
+    "custom_249",
+    "custom",
+    "custom element 249"
+  },
+  {
+    "custom_250",
+    "custom",
+    "custom element 250"
+  },
+  {
+    "custom_251",
+    "custom",
+    "custom element 251"
+  },
+  {
+    "custom_252",
+    "custom",
+    "custom element 252"
+  },
+  {
+    "custom_253",
+    "custom",
+    "custom element 253"
+  },
+  {
+    "custom_254",
+    "custom",
+    "custom element 254"
+  },
+  {
+    "custom_255",
+    "custom",
+    "custom element 255"
+  },
+  {
+    "custom_256",
+    "custom",
+    "custom element 256"
+  },
+  {
+    "em_key_1",
+    "key",
+    "red key (EM style)"
+    },
+  {
+    "em_key_2",
+    "key",
+    "yellow key (EM style)"
+    },
+  {
+    "em_key_3",
+    "key",
+    "green key (EM style)"
+  },
+  {
+    "em_key_4",
+    "key",
+    "blue key (EM style)"
+  },
+  {
+    "envelope_1",
+    "envelope",
+    "mail envelope 1"
+  },
+  {
+    "envelope_2",
+    "envelope",
+    "mail envelope 2"
+  },
+  {
+    "envelope_3",
+    "envelope",
+    "mail envelope 3"
+  },
+  {
+    "envelope_4",
+    "envelope",
+    "mail envelope 4"
+  },
+
+  /* ----------------------------------------------------------------------- */
+  /* "real" (and therefore drawable) runtime elements                        */
+  /* ----------------------------------------------------------------------- */
+
+  {
+    "dynabomb_player_1.active",
+    "dynabomb",
+    "-"
+  },
+  {
+    "dynabomb_player_2.active",
+    "dynabomb",
+    "-"
+  },
+  {
+    "dynabomb_player_3.active",
+    "dynabomb",
+    "-"
+  },
+  {
+    "dynabomb_player_4.active",
+    "dynabomb",
+    "-"
+  },
+  {
+    "sp_disk_red.active",
+    "dynamite",
+    "-"
+  },
+  {
+    "switchgate.opening",
+    "switchgate",
+    "-"
+  },
+  {
+    "switchgate.closing",
+    "switchgate",
+    "-"
+  },
+  {
+    "timegate.opening",
+    "timegate",
+    "-"
+  },
+  {
+    "timegate.closing",
+    "timegate",
+    "-"
+  },
+  {
+    "pearl.breaking",
+    "pearl",
+    "-"
+  },
+  {
+    "trap.active",
+    "trap",
+    "-"
+  },
+  {
+    "invisible_steelwall.active",
+    "wall",
+    "-"
+  },
+  {
+    "invisible_wall.active",
+    "wall",
+    "-"
+  },
+  {
+    "invisible_sand.active",
+    "sand",
+    "-"
+  },
+  {
+    "conveyor_belt_1_left.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_1_middle.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_1_right.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_2_left.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_2_middle.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_2_right.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_3_left.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_3_middle.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_3_right.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_4_left.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_4_middle.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "conveyor_belt_4_right.active",
+    "conveyor_belt",
+    "-"
+  },
+  {
+    "exit.opening",
+    "exit",
+    "-"
+  },
+  {
+    "exit.closing",
+    "exit",
+    "-"
+  },
+  {
+    "sp_exit.opening",
+    "sp_exit",
+    "-"
+  },
+  {
+    "sp_exit.closing",
+    "sp_exit",
+    "-"
+  },
+  {
+    "sp_exit_open",
+    "sp_exit",
+    "-"
+  },
+  {
+    "sp_terminal.active",
+    "sp_terminal",
+    "-"
+  },
+  {
+    "sp_buggy_base.activating",
+    "sp_buggy_base",
+    "-"
+  },
+  {
+    "sp_buggy_base.active",
+    "sp_buggy_base",
+    "-"
   },
   {
     "sp_murphy_clone",
@@ -2721,22 +3405,22 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "amoeba_dripping",
+    "amoeba.dropping",
     "amoeba",
     "-"
   },
   {
-    "quicksand_emptying",
+    "quicksand.emptying",
     "quicksand",
     "-"
   },
   {
-    "magic_wall_active",
+    "magic_wall.active",
     "magic_wall",
     "-"
   },
   {
-    "bd_magic_wall_active",
+    "bd_magic_wall.active",
     "magic_wall",
     "-"
   },
@@ -2751,12 +3435,12 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "magic_wall_emptying",
+    "magic_wall.emptying",
     "magic_wall",
     "-"
   },
   {
-    "bd_magic_wall_emptying",
+    "bd_magic_wall.emptying",
     "magic_wall",
     "-"
   },
@@ -2786,7 +3470,12 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "nut_cracking",
+    "nut_breaking",
+    "-",
+    "-"
+  },
+  {
+    "diamond_breaking",
     "-",
     "-"
   },
@@ -2801,7 +3490,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "amoeba_creating",
+    "amoeba_growing",
     "-",
     "-"
   },
@@ -2811,7 +3500,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "wall_growing_active",
+    "expandable_wall.growing",
     "-",
     "-"
   },
@@ -2826,17 +3515,17 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "quicksand_filling",
-    "-",
+    "quicksand.filling",
+    "quicksand",
     "-"
   },
   {
-    "magic_wall_filling",
+    "magic_wall.filling",
     "-",
     "-"
   },
   {
-    "bd_magic_wall_filling",
+    "bd_magic_wall.filling",
     "-",
     "-"
   },
@@ -2906,30 +3595,72 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
     "-"
   },
   {
-    "sand_crumbled",
+    "dynabomb",
+    "-",
+    "-"
+  },
+  {
+    "dynabomb.active",
     "-",
     "-"
   },
   {
-    "dynabomb_active",
+    "dynabomb_player_1",
     "-",
     "-"
   },
   {
-    "shield_normal_active",
+    "dynabomb_player_2",
     "-",
     "-"
   },
   {
-    "shield_deadly_active",
+    "dynabomb_player_3",
     "-",
     "-"
   },
+  {
+    "dynabomb_player_4",
+    "-",
+    "-"
+  },
+  {
+    "shield_normal.active",
+    "-",
+    "-"
+  },
+  {
+    "shield_deadly.active",
+    "-",
+    "-"
+  },
+  {
+    "[default]",
+    "default",
+    "-"
+  },
+  {
+    "[bd_default]",
+    "bd_default",
+    "-"
+  },
+  {
+    "[sp_default]",
+    "sp_default",
+    "-"
+  },
+  {
+    "[sb_default]",
+    "sb_default",
+    "-"
+  },
+
+  /* keyword to stop parser: "ELEMENT_INFO_END" <-- do not change! */
 
   {
     NULL,
     NULL,
-    "-"
+    NULL
   }
 };
 
@@ -2938,7 +3669,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
 /* element action and direction definitions                                  */
 /* ------------------------------------------------------------------------- */
 
-struct ElementActionInfo element_action_info[NUM_ACTIONS + 1] =
+struct ElementActionInfo element_action_info[NUM_ACTIONS + 1 + 1] =
 {
   { ".[DEFAULT]",      ACTION_DEFAULT,         TRUE    },
   { ".waiting",                ACTION_WAITING,         TRUE    },
@@ -2947,21 +3678,30 @@ struct ElementActionInfo element_action_info[NUM_ACTIONS + 1] =
   { ".digging",                ACTION_DIGGING,         FALSE   },
   { ".snapping",       ACTION_SNAPPING,        FALSE   },
   { ".collecting",     ACTION_COLLECTING,      FALSE   },
+  { ".dropping",       ACTION_DROPPING,        FALSE   },
   { ".pushing",                ACTION_PUSHING,         FALSE   },
+  { ".walking",                ACTION_WALKING,         FALSE   },
   { ".passing",                ACTION_PASSING,         FALSE   },
   { ".impact",         ACTION_IMPACT,          FALSE   },
-  { ".cracking",       ACTION_CRACKING,        FALSE   },
   { ".breaking",       ACTION_BREAKING,        FALSE   },
   { ".activating",     ACTION_ACTIVATING,      FALSE   },
+  { ".deactivating",   ACTION_DEACTIVATING,    FALSE   },
   { ".opening",                ACTION_OPENING,         FALSE   },
   { ".closing",                ACTION_CLOSING,         FALSE   },
-  { ".eating",         ACTION_EATING,          FALSE   },
   { ".attacking",      ACTION_ATTACKING,       TRUE    },
   { ".growing",                ACTION_GROWING,         TRUE    },
   { ".shrinking",      ACTION_SHRINKING,       FALSE   },
   { ".active",         ACTION_ACTIVE,          TRUE    },
+  { ".filling",                ACTION_FILLING,         FALSE   },
+  { ".emptying",       ACTION_EMPTYING,        FALSE   },
+  { ".changing",       ACTION_CHANGING,        FALSE   },
+  { ".exploding",      ACTION_EXPLODING,       FALSE   },
+  { ".dying",          ACTION_DYING,           FALSE   },
   { ".other",          ACTION_OTHER,           FALSE   },
 
+  /* empty suffix always matches -- check as last entry in InitSoundInfo() */
+  { "",                        ACTION_DEFAULT,         TRUE    },
+
   { NULL,              0,                      0       }
 };
 
@@ -2977,37 +3717,98 @@ struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS + 1] =
 
 struct SpecialSuffixInfo special_suffix_info[NUM_SPECIAL_GFX_ARGS + 1] =
 {
-  { ".EDITOR",         0,                              },
-  { ".PREVIEW",                0,                              },
+  { ".MAIN",           GAME_MODE_MAIN,                 },
+  { ".LEVELS",         GAME_MODE_LEVELS                },
+  { ".SCORES",         GAME_MODE_SCORES,               },
+  { ".EDITOR",         GAME_MODE_EDITOR,               },
+  { ".INFO",           GAME_MODE_INFO,                 },
+  { ".SETUP",          GAME_MODE_SETUP,                },
+  { ".PLAYING",                GAME_MODE_PLAYING,              },
+  { ".DOOR",           GAME_MODE_PSEUDO_DOOR,          },
+  { ".PREVIEW",                GAME_MODE_PSEUDO_PREVIEW,       },
+  { ".CRUMBLED",       GAME_MODE_PSEUDO_CRUMBLED,      },
 
   { NULL,              0,                              }
 };
 
+struct TokenIntPtrInfo image_config_vars[] =
+{
+  { "global.num_toons",                &global.num_toons                          },
+
+  { "menu.draw_xoffset",       &menu.draw_xoffset_default                 },
+  { "menu.draw_yoffset",       &menu.draw_yoffset_default                 },
+  { "menu.draw_xoffset.MAIN",  &menu.draw_xoffset[GFX_SPECIAL_ARG_MAIN]   },
+  { "menu.draw_yoffset.MAIN",  &menu.draw_yoffset[GFX_SPECIAL_ARG_MAIN]   },
+  { "menu.draw_xoffset.LEVELS",        &menu.draw_xoffset[GFX_SPECIAL_ARG_LEVELS] },
+  { "menu.draw_yoffset.LEVELS",        &menu.draw_yoffset[GFX_SPECIAL_ARG_LEVELS] },
+  { "menu.draw_xoffset.SCORES",        &menu.draw_xoffset[GFX_SPECIAL_ARG_SCORES] },
+  { "menu.draw_yoffset.SCORES",        &menu.draw_yoffset[GFX_SPECIAL_ARG_SCORES] },
+  { "menu.draw_xoffset.EDITOR",        &menu.draw_xoffset[GFX_SPECIAL_ARG_EDITOR] },
+  { "menu.draw_yoffset.EDITOR",        &menu.draw_yoffset[GFX_SPECIAL_ARG_EDITOR] },
+  { "menu.draw_xoffset.INFO",  &menu.draw_xoffset[GFX_SPECIAL_ARG_INFO]   },
+  { "menu.draw_yoffset.INFO",  &menu.draw_yoffset[GFX_SPECIAL_ARG_INFO]   },
+  { "menu.draw_xoffset.SETUP", &menu.draw_xoffset[GFX_SPECIAL_ARG_SETUP]  },
+  { "menu.draw_yoffset.SETUP", &menu.draw_yoffset[GFX_SPECIAL_ARG_SETUP]  },
+
+  { "menu.scrollbar_xoffset",  &menu.scrollbar_xoffset                    },
+
+  { "menu.list_size",          &menu.list_size_default                    },
+  { "menu.list_size.LEVELS",   &menu.list_size[GFX_SPECIAL_ARG_LEVELS]    },
+  { "menu.list_size.SCORES",   &menu.list_size[GFX_SPECIAL_ARG_SCORES]    },
+  { "menu.list_size.INFO",     &menu.list_size[GFX_SPECIAL_ARG_INFO]      },
+
+  { "door_1.step_offset",      &door_1.step_offset                        },
+  { "door_1.step_delay",       &door_1.step_delay                         },
+  { "door_1.anim_mode",                &door_1.anim_mode                          },
+  { "door_2.step_offset",      &door_2.step_offset                        },
+  { "door_2.step_delay",       &door_2.step_delay                         },
+  { "door_2.anim_mode",                &door_2.anim_mode                          },
+
+  { NULL,                      NULL,                                      }
+};
+
+
 /* ------------------------------------------------------------------------- */
 /* font definitions                                                          */
 /* ------------------------------------------------------------------------- */
 
+/* Important: When one entry is a prefix of another entry, the longer entry
+   must come first, because the dynamic configuration does prefix matching! */
+
 struct FontInfo font_info[NUM_FONTS + 1] =
 {
-  { "font.initial_1"   },
-  { "font.initial_2"   },
-  { "font.initial_3"   },
-  { "font.initial_4"   },
-  { "font.big_1"       },
-  { "font.big_2"       },
-  { "font.big_3"       },
-  { "font.big_4"       },
-  { "font.medium_1"    },
-  { "font.medium_2"    },
-  { "font.medium_3"    },
-  { "font.medium_4"    },
-  { "font.small_1"     },
-  { "font.small_2"     },
-  { "font.small_3"     },
-  { "font.small_4"     },
-  { "font.tape"                },
-  { "font.game"                },
-  { "font.narrow"      },
+  { "font.initial_1"           },
+  { "font.initial_2"           },
+  { "font.initial_3"           },
+  { "font.initial_4"           },
+  { "font.title_1"             },
+  { "font.title_2"             },
+  { "font.menu_1"              },
+  { "font.menu_2"              },
+  { "font.text_1.active"       },
+  { "font.text_2.active"       },
+  { "font.text_3.active"       },
+  { "font.text_4.active"       },
+  { "font.text_1"              },
+  { "font.text_2"              },
+  { "font.text_3"              },
+  { "font.text_4"              },
+  { "font.envelope_1"          },
+  { "font.envelope_2"          },
+  { "font.envelope_3"          },
+  { "font.envelope_4"          },
+  { "font.input_1.active"      },
+  { "font.input_2.active"      },
+  { "font.input_1"             },
+  { "font.input_2"             },
+  { "font.option_off"          },
+  { "font.option_on"           },
+  { "font.value_1"             },
+  { "font.value_2"             },
+  { "font.value_old"           },
+  { "font.level_number"                },
+  { "font.tape_recorder"       },
+  { "font.game_info"           },
 };
 
 
@@ -3017,9 +3818,14 @@ struct FontInfo font_info[NUM_FONTS + 1] =
 
 int main(int argc, char *argv[])
 {
-  InitCommandName(argv[0]);
+  InitProgramInfo(argv[0], USERDATA_DIRECTORY,
+                 PROGRAM_TITLE_STRING, getWindowTitleString(),
+                 ICON_TITLE_STRING, X11_ICON_FILENAME, X11_ICONMASK_FILENAME,
+                 MSDOS_POINTER_FILENAME,
+                 COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL);
+
   InitExitFunction(CloseAllAndExit);
-  InitPlatformDependantStuff();
+  InitPlatformDependentStuff();
 
   GetOptions(argv);
   OpenAll();