rnd-20030703-1-src
[rocksndiamonds.git] / src / main.c
index 4e4f38ac98d24a8a3094e0b529847780bcf5dff0..dc2c783438227082168a5dc1012e58895531d186 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;
 
@@ -43,10 +44,13 @@ 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];
 short                  JustStopped[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaCnt[MAX_NUM_AMOEBA];
@@ -54,11 +58,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];
-short                  GfxAction[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;
@@ -89,19 +94,23 @@ struct TapeInfo             tape;
 struct SetupInfo       setup;
 struct GameInfo                game;
 struct GlobalInfo      global;
-struct FileInfo               *image_files;
-struct FileInfo               *sound_files;
-struct GraphicInfo     graphic_info[NUM_IMAGE_FILES];
-struct SoundInfo       sound_info[NUM_SOUND_FILES];
+struct MenuInfo                menu;
+struct DoorInfo                door;
+struct GraphicInfo     *graphic_info = NULL;
+struct SoundInfo       *sound_info = NULL;
 
 
 /* ------------------------------------------------------------------------- */
 /* element definitions                                                       */
 /* ------------------------------------------------------------------------- */
 
-struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
+struct ElementInfo element_info[MAX_NUM_ELEMENTS + 1] =
 {
-  /* "real" level file elements */
+  /* keyword to start parser: "ELEMENT_INFO_START" <-- do not change! */
+
+  /* ----------------------------------------------------------------------- */
+  /* "real" level file elements                                              */
+  /* ----------------------------------------------------------------------- */
 
   {
     "empty_space",
@@ -234,8 +243,8 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "nut with emerald"
   },
   {
-    "gameoflife",
-    "gameoflife",
+    "game_of_life",
+    "game_of_life",
     "Conway's wall of life"
   },
   {
@@ -264,60 +273,60 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "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)"},
   {
@@ -376,7 +385,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "time orb (empty)"
   },
   {
-    "wall_growing",
+    "expandable_wall",
     "wall",
     "growing wall"
   },
@@ -421,33 +430,33 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "(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"
   },
   {
@@ -498,22 +507,22 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "firefly"
   },
   {
-    "player1",
+    "player_1",
     "player",
     "yellow player"
   },
   {
-    "player2",
+    "player_2",
     "player",
     "red player"
   },
   {
-    "player3",
+    "player_3",
     "player",
     "green player"
   },
   {
-    "player4",
+    "player_4",
     "player",
     "blue player"
   },
@@ -595,27 +604,27 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "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)"
   },
@@ -637,7 +646,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
   {
     "black_orb",
     "black_orb",
-    "black orb bomb"
+    "bomb"
   },
   {
     "amoeba_to_diamond",
@@ -660,22 +669,22 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "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"
   },
@@ -690,7 +699,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "fire breathing dragon"
   },
   {
-    "em_key1_file",
+    "em_key_1_file",
     "key",
     "red key (EM style)"
   },
@@ -990,64 +999,64 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "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",
@@ -1095,52 +1104,52 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "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",
+    "em_key_2_file",
     "key",
     "yellow key (EM style)"
   },
   {
-    "em_key3_file",
+    "em_key_3_file",
     "key",
     "green key (EM style)"
   },
   {
-    "em_key4_file",
+    "em_key_4_file",
     "key",
     "blue key (EM style)"
   },
@@ -1175,7 +1184,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "chip (single)"
   },
   {
-    "sp_hard_gray",
+    "sp_hardware_gray",
     "wall",
     "hardware"
   },
@@ -1190,42 +1199,42 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "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)"
   },
   {
-    "sp_port2_down",
+    "sp_gravity_port_down",
     "sp_port",
     "port (leading down)"
   },
   {
-    "sp_port2_left",
+    "sp_gravity_port_left",
     "sp_port",
     "port (leading left)"
   },
   {
-    "sp_port2_up",
+    "sp_gravity_port_up",
     "sp_port",
     "port (leading up)"
   },
@@ -1246,23 +1255,23 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
   },
   {
     "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",
@@ -1285,82 +1294,82 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "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)"
   },
@@ -1450,122 +1459,122 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "-"
   },
   {
-    "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)"
   },
@@ -1730,94 +1739,94 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "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",
@@ -1881,7 +1890,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
   },
   {
     "dx_supabomb",
-    "dx_bomb",
+    "bomb",
     "stable bomb (DX style)"
   },
   {
@@ -2535,48 +2544,55 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "custom element 128"
   },
 
-  /* "real" (and therefore drawable) runtime elements */
+  /* ----------------------------------------------------------------------- */
+  /* "real" (and therefore drawable) runtime elements                        */
+  /* ----------------------------------------------------------------------- */
 
   {
-    "em_key1",
+    "em_key_1",
     "key",
     "-"
     },
   {
-    "em_key2",
+    "em_key_2",
     "key",
     "-"
     },
   {
-    "em_key3",
+    "em_key_3",
     "key",
     "-"
   },
   {
-    "em_key4",
+    "em_key_4",
     "key",
     "-"
   },
   {
-    "dynabomb_player1_active",
+    "dynabomb_player_1_active",
     "dynabomb",
     "-"
   },
   {
-    "dynabomb_player2_active",
+    "dynabomb_player_2_active",
     "dynabomb",
     "-"
   },
   {
-    "dynabomb_player3_active",
+    "dynabomb_player_3_active",
     "dynabomb",
     "-"
   },
   {
-    "dynabomb_player4_active",
+    "dynabomb_player_4_active",
     "dynabomb",
     "-"
   },
+  {
+    "sp_disk_red_active",
+    "dynamite",
+    "-"
+  },
   {
     "switchgate_opening",
     "switchgate",
@@ -2623,62 +2639,62 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "-"
   },
   {
-    "conveyor_belt1_left_active",
+    "conveyor_belt_1_left_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt1_middle_active",
+    "conveyor_belt_1_middle_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt1_right_active",
+    "conveyor_belt_1_right_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt2_left_active",
+    "conveyor_belt_2_left_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt2_middle_active",
+    "conveyor_belt_2_middle_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt2_right_active",
+    "conveyor_belt_2_right_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt3_left_active",
+    "conveyor_belt_3_left_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt3_middle_active",
+    "conveyor_belt_3_middle_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt3_right_active",
+    "conveyor_belt_3_right_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt4_left_active",
+    "conveyor_belt_4_left_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt4_middle_active",
+    "conveyor_belt_4_middle_active",
     "conveyor_belt",
     "-"
   },
   {
-    "conveyor_belt4_right_active",
+    "conveyor_belt_4_right_active",
     "conveyor_belt",
     "-"
   },
@@ -2713,7 +2729,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "-"
   },
   {
-    "amoeba_dripping",
+    "amoeba_dropping",
     "amoeba",
     "-"
   },
@@ -2763,10 +2779,192 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
     "-"
   },
 
+  /* ----------------------------------------------------------------------- */
+  /* "unreal" (and therefore not drawable) runtime elements                  */
+  /* ----------------------------------------------------------------------- */
+
+  {
+    "blocked",
+    "-",
+    "-"
+  },
+  {
+    "explosion",
+    "-",
+    "-"
+  },
+  {
+    "nut_breaking",
+    "-",
+    "-"
+  },
+  {
+    "diamond_breaking",
+    "-",
+    "-"
+  },
+  {
+    "acid_splash_left",
+    "-",
+    "-"
+  },
+  {
+    "acid_splash_right",
+    "-",
+    "-"
+  },
+  {
+    "amoeba_growing",
+    "-",
+    "-"
+  },
+  {
+    "amoeba_shrinking",
+    "-",
+    "-"
+  },
+  {
+    "expandable_wall_growing",
+    "-",
+    "-"
+  },
+  {
+    "flames",
+    "-",
+    "-"
+  },
+  {
+    "player_is_leaving",
+    "-",
+    "-"
+  },
+  {
+    "quicksand_filling",
+    "quicksand",
+    "-"
+  },
+  {
+    "magic_wall_filling",
+    "-",
+    "-"
+  },
+  {
+    "bd_magic_wall_filling",
+    "-",
+    "-"
+  },
+
+  /* ----------------------------------------------------------------------- */
+  /* dummy elements (never used as game elements, only used as graphics)     */
+  /* ----------------------------------------------------------------------- */
+
+  {
+    "steelwall_topleft",
+    "-",
+    "-"
+  },
+  {
+    "steelwall_topright",
+    "-",
+    "-"
+  },
+  {
+    "steelwall_bottomleft",
+    "-",
+    "-"
+  },
+  {
+    "steelwall_bottomright",
+    "-",
+    "-"
+  },
+  {
+    "steelwall_horizontal",
+    "-",
+    "-"
+  },
+  {
+    "steelwall_vertical",
+    "-",
+    "-"
+  },
+  {
+    "invisible_steelwall_topleft",
+    "-",
+    "-"
+  },
+  {
+    "invisible_steelwall_topright",
+    "-",
+    "-"
+  },
+  {
+    "invisible_steelwall_bottomleft",
+    "-",
+    "-"
+  },
+  {
+    "invisible_steelwall_bottomright",
+    "-",
+    "-"
+  },
+  {
+    "invisible_steelwall_horizontal",
+    "-",
+    "-"
+  },
+  {
+    "invisible_steelwall_vertical",
+    "-",
+    "-"
+  },
+  {
+    "sand_crumbled",
+    "-",
+    "-"
+  },
+  {
+    "dynabomb_active",
+    "-",
+    "-"
+  },
+  {
+    "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
   }
 };
 
@@ -2775,7 +2973,7 @@ struct ElementInfo element_info[MAX_NUM_ELEMENTS] =
 /* element action and direction definitions                                  */
 /* ------------------------------------------------------------------------- */
 
-struct ElementActionInfo element_action_info[] =
+struct ElementActionInfo element_action_info[NUM_ACTIONS + 1] =
 {
   { ".[DEFAULT]",      ACTION_DEFAULT,         TRUE    },
   { ".waiting",                ACTION_WAITING,         TRUE    },
@@ -2784,32 +2982,122 @@ struct ElementActionInfo element_action_info[] =
   { ".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   },
 
-  { NULL,              0,                      0       },
+  { NULL,              0,                      0       }
 };
 
-struct ElementDirectionInfo element_direction_info[] =
+struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS + 1] =
 {
   { ".left",           MV_BIT_LEFT                     },
   { ".right",          MV_BIT_RIGHT                    },
   { ".up",             MV_BIT_UP                       },
   { ".down",           MV_BIT_DOWN                     },
 
-  { NULL,              0                               },
+  { NULL,              0                               }
+};
+
+struct SpecialSuffixInfo special_suffix_info[NUM_SPECIAL_GFX_ARGS + 1] =
+{
+  { ".MAIN",           GAME_MODE_MAIN,                 },
+  { ".LEVELS",         GAME_MODE_LEVELS                },
+  { ".SCORES",         GAME_MODE_SCORES,               },
+  { ".EDITOR",         GAME_MODE_EDITOR,               },
+  { ".INFO",           GAME_MODE_INFO,                 },
+  { ".SETUP",          GAME_MODE_SETUP,                },
+  { ".DOOR",           GAME_MODE_PSEUDO_DOOR,          },
+  { ".PREVIEW",                GAME_MODE_PSEUDO_PREVIEW,       },
+
+  { 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.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.step_offset",                &door.step_offset                          },
+  { "door.step_delay",         &door.step_delay                           },
+
+  { 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.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.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"           },
 };
 
 
@@ -2819,9 +3107,14 @@ struct ElementDirectionInfo element_direction_info[] =
 
 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();