rnd-20070113-1-src
[rocksndiamonds.git] / src / main.c
index 0d59cc5671d9288dfed6405e335bd6b1ea66090d..fca3cfeaf02c36318ba52aca6960ad172da61678 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Rocks'n'Diamonds -- McDuffin Strikes Back!               *
 *----------------------------------------------------------*
-* (c) 1995-2002 Artsoft Entertainment                      *
+* (c) 1995-2006 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
@@ -20,8 +20,9 @@
 #include "events.h"
 #include "config.h"
 
-Bitmap                *bitmap_db_title;
+Bitmap                *bitmap_db_cross;
 Bitmap                *bitmap_db_field;
+Bitmap                *bitmap_db_panel;
 Bitmap                *bitmap_db_door;
 DrawBuffer            *fieldbuffer;
 DrawBuffer            *drawto_field;
@@ -58,6 +59,7 @@ short                 ChangeEvent[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  WasJustMoving[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  WasJustFalling[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  CheckCollision[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
+short                  CheckImpact[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaNr[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 short                  AmoebaCnt[MAX_NUM_AMOEBA];
 short                  AmoebaCnt2[MAX_NUM_AMOEBA];
@@ -67,10 +69,6 @@ short                        ExplodeDelay[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 int                    RunnerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 int                    PlayerVisit[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 
-#if 0
-unsigned long          Properties[MAX_NUM_ELEMENTS][NUM_EP_BITFIELDS];
-#endif
-
 int                    GfxFrame[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 int                    GfxRandom[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
 int                    GfxElement[MAX_LEV_FIELDX][MAX_LEV_FIELDY];
@@ -107,8 +105,11 @@ struct TapeInfo            tape;
 struct SetupInfo       setup;
 struct GameInfo                game;
 struct GlobalInfo      global;
+struct BorderInfo      border;
+struct TitleInfo       title;
 struct MenuInfo                menu;
 struct DoorInfo                door_1, door_2;
+struct PreviewInfo     preview;
 struct GraphicInfo     *graphic_info = NULL;
 struct SoundInfo       *sound_info = NULL;
 struct MusicInfo       *music_info = NULL;
@@ -199,7 +200,7 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "steelwall",
-    "wall",
+    "steelwall",
     "steel wall"
   },
   {
@@ -444,7 +445,7 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "invisible_steelwall",
-    "wall",
+    "steelwall",
     "invisible steel wall"
   },
   {
@@ -1114,17 +1115,17 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
   {
     "char_unused",
     "char",
-    "letter ''"
+    "letter 'button'"
   },
   {
     "char_unused",
     "char",
-    "letter ''"
+    "letter 'up'"
   },
   {
     "char_unused",
     "char",
-    "letter ''"
+    "letter 'down'"
   },
   {
     "expandable_wall_horizontal",
@@ -1623,63 +1624,63 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "sign_exclamation",
-    "wall",
+    "sign",
     "sign (exclamation)"
   },
   {
     "sign_radioactivity",
-    "wall",
+    "sign",
     "sign (radio activity)"
   },
   {
     "sign_stop",
-    "wall",
+    "sign",
     "sign (stop)"
   },
   {
     "sign_wheelchair",
-    "wall",
+    "sign",
     "sign (wheel chair)"
   },
   {
     "sign_parking",
-    "wall",
+    "sign",
     "sign (parking)"
   },
   {
-    "sign_oneway",
-    "wall",
-    "sign (one way)"
+    "sign_no_entry",
+    "sign",
+    "sign (no entry)"
   },
   {
-    "sign_heart",
-    "wall",
-    "sign (heart)"
+    "sign_unused_1",
+    "sign",
+    "sign (unused)"
   },
   {
-    "sign_triangle",
-    "wall",
-    "sign (triangle)"
+    "sign_give_way",
+    "sign",
+    "sign (give way)"
   },
   {
-    "sign_round",
-    "wall",
-    "sign (round)"
+    "sign_entry_forbidden",
+    "sign",
+    "sign (entry forbidden)"
   },
   {
-    "sign_exit",
-    "wall",
-    "sign (exit)"
+    "sign_emergency_exit",
+    "sign",
+    "sign (emergency exit)"
   },
   {
-    "sign_yinyang",
-    "wall",
+    "sign_yin_yang",
+    "sign",
     "sign (yin yang)"
   },
   {
-    "sign_other",
-    "wall",
-    "sign (other)"
+    "sign_unused_2",
+    "sign",
+    "sign (unused)"
   },
   {
     "mole.left",
@@ -1703,7 +1704,7 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "steelwall_slippery",
-    "wall",
+    "steelwall",
     "slippery steel wall"
   },
   {
@@ -1788,22 +1789,22 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "emc_steelwall_1",
-    "wall",
+    "steelwall",
     "steel wall"
   },
   {
     "emc_steelwall_2",
-    "wall",
+    "steelwall",
     "steel wall"
   },
   {
     "emc_steelwall_3",
-    "wall",
+    "steelwall",
     "steel wall"
   },
   {
     "emc_steelwall_4",
-    "wall",
+    "steelwall",
     "steel wall"
   },
   {
@@ -3696,6 +3697,556 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
     "wall",
     "growing wall (horizontal, BD style)"
   },
+  {
+    "prev_ce_8",
+    "prev_ce",
+    "CE 8 positions earlier in list"
+  },
+  {
+    "prev_ce_7",
+    "prev_ce",
+    "CE 7 positions earlier in list"
+  },
+  {
+    "prev_ce_6",
+    "prev_ce",
+    "CE 6 positions earlier in list"
+  },
+  {
+    "prev_ce_5",
+    "prev_ce",
+    "CE 5 positions earlier in list"
+  },
+  {
+    "prev_ce_4",
+    "prev_ce",
+    "CE 4 positions earlier in list"
+  },
+  {
+    "prev_ce_3",
+    "prev_ce",
+    "CE 3 positions earlier in list"
+  },
+  {
+    "prev_ce_2",
+    "prev_ce",
+    "CE 2 positions earlier in list"
+  },
+  {
+    "prev_ce_1",
+    "prev_ce",
+    "CE 1 position earlier in list"
+  },
+  {
+    "self",
+    "self",
+    "the current custom element"
+  },
+  {
+    "next_ce_1",
+    "next_ce",
+    "CE 1 position later in list"
+  },
+  {
+    "next_ce_2",
+    "next_ce",
+    "CE 2 positions later in list"
+  },
+  {
+    "next_ce_3",
+    "next_ce",
+    "CE 3 positions later in list"
+  },
+  {
+    "next_ce_4",
+    "next_ce",
+    "CE 4 positions later in list"
+  },
+  {
+    "next_ce_5",
+    "next_ce",
+    "CE 5 positions later in list"
+  },
+  {
+    "next_ce_6",
+    "next_ce",
+    "CE 6 positions later in list"
+  },
+  {
+    "next_ce_7",
+    "next_ce",
+    "CE 7 positions later in list"
+  },
+  {
+    "next_ce_8",
+    "next_ce",
+    "CE 8 positions later in list"
+  },
+  {
+    "any_element",
+    "any_element",
+    "this element matches any element"
+  },
+  {
+    "steelchar_space",
+    "steelchar",
+    "steel letter ' '"
+  },
+  {
+    "steelchar_exclam",
+    "steelchar",
+    "steel letter '!'"
+  },
+  {
+    "steelchar_quotedbl",
+    "steelchar",
+    "steel letter '\"'"
+  },
+  {
+    "steelchar_numbersign",
+    "steelchar",
+    "steel letter '#'"
+  },
+  {
+    "steelchar_dollar",
+    "steelchar",
+    "steel letter '$'"
+  },
+  {
+    "steelchar_percent",
+    "steelchar",
+    "steel letter '%'"
+  },
+  {
+    "steelchar_ampersand",
+    "steelchar",
+    "steel letter '&'"
+  },
+  {
+    "steelchar_apostrophe",
+    "steelchar",
+    "steel letter '''"
+  },
+  {
+    "steelchar_parenleft",
+    "steelchar",
+    "steel letter '('"
+  },
+  {
+    "steelchar_parenright",
+    "steelchar",
+    "steel letter ')'"
+  },
+  {
+    "steelchar_asterisk",
+    "steelchar",
+    "steel letter '*'"
+  },
+  {
+    "steelchar_plus",
+    "steelchar",
+    "steel letter '+'"
+  },
+  {
+    "steelchar_comma",
+    "steelchar",
+    "steel letter ','"
+  },
+  {
+    "steelchar_minus",
+    "steelchar",
+    "steel letter '-'"
+  },
+  {
+    "steelchar_period",
+    "steelchar",
+    "steel letter '.'"
+  },
+  {
+    "steelchar_slash",
+    "steelchar",
+    "steel letter '/'"
+  },
+  {
+    "steelchar_0",
+    "steelchar",
+    "steel letter '0'"
+  },
+  {
+    "steelchar_1",
+    "steelchar",
+    "steel letter '1'"
+  },
+  {
+    "steelchar_2",
+    "steelchar",
+    "steel letter '2'"
+  },
+  {
+    "steelchar_3",
+    "steelchar",
+    "steel letter '3'"
+  },
+  {
+    "steelchar_4",
+    "steelchar",
+    "steel letter '4'"
+  },
+  {
+    "steelchar_5",
+    "steelchar",
+    "steel letter '5'"
+  },
+  {
+    "steelchar_6",
+    "steelchar",
+    "steel letter '6'"
+  },
+  {
+    "steelchar_7",
+    "steelchar",
+    "steel letter '7'"
+  },
+  {
+    "steelchar_8",
+    "steelchar",
+    "steel letter '8'"
+  },
+  {
+    "steelchar_9",
+    "steelchar",
+    "steel letter '9'"
+  },
+  {
+    "steelchar_colon",
+    "steelchar",
+    "steel letter ':'"
+  },
+  {
+    "steelchar_semicolon",
+    "steelchar",
+    "steel letter ';'"
+  },
+  {
+    "steelchar_less",
+    "steelchar",
+    "steel letter '<'"
+  },
+  {
+    "steelchar_equal",
+    "steelchar",
+    "steel letter '='"
+  },
+  {
+    "steelchar_greater",
+    "steelchar",
+    "steel letter '>'"
+  },
+  {
+    "steelchar_question",
+    "steelchar",
+    "steel letter '?'"
+  },
+  {
+    "steelchar_at",
+    "steelchar",
+    "steel letter '@'"
+  },
+  {
+    "steelchar_a",
+    "steelchar",
+    "steel letter 'A'"
+  },
+  {
+    "steelchar_b",
+    "steelchar",
+    "steel letter 'B'"
+  },
+  {
+    "steelchar_c",
+    "steelchar",
+    "steel letter 'C'"
+  },
+  {
+    "steelchar_d",
+    "steelchar",
+    "steel letter 'D'"
+  },
+  {
+    "steelchar_e",
+    "steelchar",
+    "steel letter 'E'"
+  },
+  {
+    "steelchar_f",
+    "steelchar",
+    "steel letter 'F'"
+  },
+  {
+    "steelchar_g",
+    "steelchar",
+    "steel letter 'G'"
+  },
+  {
+    "steelchar_h",
+    "steelchar",
+    "steel letter 'H'"
+  },
+  {
+    "steelchar_i",
+    "steelchar",
+    "steel letter 'I'"
+  },
+  {
+    "steelchar_j",
+    "steelchar",
+    "steel letter 'J'"
+  },
+  {
+    "steelchar_k",
+    "steelchar",
+    "steel letter 'K'"
+  },
+  {
+    "steelchar_l",
+    "steelchar",
+    "steel letter 'L'"
+  },
+  {
+    "steelchar_m",
+    "steelchar",
+    "steel letter 'M'"
+  },
+  {
+    "steelchar_n",
+    "steelchar",
+    "steel letter 'N'"
+  },
+  {
+    "steelchar_o",
+    "steelchar",
+    "steel letter 'O'"
+  },
+  {
+    "steelchar_p",
+    "steelchar",
+    "steel letter 'P'"
+  },
+  {
+    "steelchar_q",
+    "steelchar",
+    "steel letter 'Q'"
+  },
+  {
+    "steelchar_r",
+    "steelchar",
+    "steel letter 'R'"
+  },
+  {
+    "steelchar_s",
+    "steelchar",
+    "steel letter 'S'"
+  },
+  {
+    "steelchar_t",
+    "steelchar",
+    "steel letter 'T'"
+  },
+  {
+    "steelchar_u",
+    "steelchar",
+    "steel letter 'U'"
+  },
+  {
+    "steelchar_v",
+    "steelchar",
+    "steel letter 'V'"
+  },
+  {
+    "steelchar_w",
+    "steelchar",
+    "steel letter 'W'"
+  },
+  {
+    "steelchar_x",
+    "steelchar",
+    "steel letter 'X'"
+  },
+  {
+    "steelchar_y",
+    "steelchar",
+    "steel letter 'Y'"
+  },
+  {
+    "steelchar_z",
+    "steelchar",
+    "steel letter 'Z'"
+  },
+  {
+    "steelchar_bracketleft",
+    "steelchar",
+    "steel letter '['"
+  },
+  {
+    "steelchar_backslash",
+    "steelchar",
+    "steel letter '\\'"
+  },
+  {
+    "steelchar_bracketright",
+    "steelchar",
+    "steel letter ']'"
+  },
+  {
+    "steelchar_asciicircum",
+    "steelchar",
+    "steel letter '^'"
+  },
+  {
+    "steelchar_underscore",
+    "steelchar",
+    "steel letter '_'"
+  },
+  {
+    "steelchar_copyright",
+    "steelchar",
+    "steel letter '©'"
+  },
+  {
+    "steelchar_aumlaut",
+    "steelchar",
+    "steel letter 'Ä'"
+  },
+  {
+    "steelchar_oumlaut",
+    "steelchar",
+    "steel letter 'Ö'"
+  },
+  {
+    "steelchar_uumlaut",
+    "steelchar",
+    "steel letter 'Ü'"
+  },
+  {
+    "steelchar_degree",
+    "steelchar",
+    "steel letter '°'"
+  },
+  {
+    "steelchar_trademark",
+    "steelchar",
+    "steel letter '®'"
+  },
+  {
+    "steelchar_cursor",
+    "steelchar",
+    "steel letter ' '"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter ''"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter ''"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter ''"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter ''"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter ''"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter ''"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter 'button'"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter 'up'"
+  },
+  {
+    "steelchar_unused",
+    "steelchar",
+    "steel letter 'down'"
+  },
+  {
+    "sperms",
+    "frankie",
+    "sperms"
+  },
+  {
+    "bullet",
+    "frankie",
+    "bullet"
+  },
+  {
+    "heart",
+    "frankie",
+    "heart"
+  },
+  {
+    "cross",
+    "frankie",
+    "cross"
+  },
+  {
+    "frankie",
+    "frankie",
+    "frankie"
+  },
+  {
+    "sign_sperms",
+    "sign",
+    "sign (sperms)"
+  },
+  {
+    "sign_bullet",
+    "sign",
+    "sign (bullet)"
+  },
+  {
+    "sign_heart",
+    "sign",
+    "sign (heart)"
+  },
+  {
+    "sign_cross",
+    "sign",
+    "sign (cross)"
+  },
+  {
+    "sign_frankie",
+    "sign",
+    "sign (frankie)"
+  },
+  {
+    "steel_exit_closed",
+    "steel_exit",
+    "closed steel exit"
+  },
+  {
+    "steel_exit_open",
+    "steel_exit",
+    "open steel exit"
+  },
 
   /* ----------------------------------------------------------------------- */
   /* "real" (and therefore drawable) runtime elements                        */
@@ -3758,7 +4309,7 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
   },
   {
     "invisible_steelwall.active",
-    "wall",
+    "steelwall",
     "-"
   },
   {
@@ -3841,6 +4392,16 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
     "exit",
     "-"
   },
+  {
+    "steel_exit.opening",
+    "steel_exit",
+    "-"
+  },
+  {
+    "steel_exit.closing",
+    "steel_exit",
+    "-"
+  },
   {
     "sp_exit.opening",
     "sp_exit",
@@ -4352,6 +4913,16 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
     "internal",
     "hide text elements"
   },
+  {
+    "internal_cascade_steelchars",
+    "internal",
+    "show steel text elements"
+  },
+  {
+    "internal_cascade_steelchars.active",
+    "internal",
+    "hide steel text elements"
+  },
   {
     "internal_cascade_ce",
     "internal",
@@ -4373,24 +4944,24 @@ struct ElementNameInfo element_name_info[MAX_NUM_ELEMENTS + 1] =
     "hide group elements"
   },
   {
-    "internal_cascade_user",
+    "internal_cascade_ref",
     "internal",
-    "show user defined elements"
+    "show reference elements"
   },
   {
-    "internal_cascade_user.active",
+    "internal_cascade_ref.active",
     "internal",
-    "hide user defined elements"
+    "hide reference elements"
   },
   {
-    "internal_cascade_generic",
+    "internal_cascade_user",
     "internal",
-    "show elements"
+    "show user defined elements"
   },
   {
-    "internal_cascade_generic.active",
+    "internal_cascade_user.active",
     "internal",
-    "hide elements"
+    "hide user defined elements"
   },
   {
     "internal_cascade_dynamic",
@@ -4527,68 +5098,224 @@ struct ElementDirectionInfo element_direction_info[NUM_DIRECTIONS_FULL + 1] =
 
 struct SpecialSuffixInfo special_suffix_info[NUM_SPECIAL_GFX_ARGS + 1 + 1] =
 {
-  { ".[DEFAULT]",      GAME_MODE_DEFAULT,              },
-  { ".TITLE",          GAME_MODE_TITLE,                },
-  { ".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,      },
+  { ".[DEFAULT]",      GFX_SPECIAL_ARG_DEFAULT,        },
+  { ".TITLE",          GFX_SPECIAL_ARG_TITLE,          },
+  { ".MESSAGE",                GFX_SPECIAL_ARG_MESSAGE,        },
+  { ".MAIN",           GFX_SPECIAL_ARG_MAIN,           },
+  { ".LEVELS",         GFX_SPECIAL_ARG_LEVELS          },
+  { ".SCORES",         GFX_SPECIAL_ARG_SCORES,         },
+  { ".EDITOR",         GFX_SPECIAL_ARG_EDITOR,         },
+  { ".INFO",           GFX_SPECIAL_ARG_INFO,           },
+  { ".SETUP",          GFX_SPECIAL_ARG_SETUP,          },
+  { ".PLAYING",                GFX_SPECIAL_ARG_PLAYING,        },
+  { ".DOOR",           GFX_SPECIAL_ARG_DOOR,           },
+  { ".PREVIEW",                GFX_SPECIAL_ARG_PREVIEW,        },
+  { ".CRUMBLED",       GFX_SPECIAL_ARG_CRUMBLED,       },
 
   /* empty suffix always matches -- check as last entry in InitMusicInfo() */
-  { "",                        GAME_MODE_DEFAULT,              },
+  { "",                        GFX_SPECIAL_ARG_DEFAULT,        },
 
   { NULL,              0,                              }
 };
 
 struct TokenIntPtrInfo image_config_vars[] =
 {
-  { "global.num_toons",                &global.num_toons                          },
+  { "global.num_toons",                &global.num_toons                             },
+
+  { "border.draw_masked.TITLE",         &border.draw_masked[GFX_SPECIAL_ARG_TITLE]   },
+  { "border.draw_masked.MAIN",  &border.draw_masked[GFX_SPECIAL_ARG_MAIN]    },
+  { "border.draw_masked.LEVELS", &border.draw_masked[GFX_SPECIAL_ARG_LEVELS]  },
+  { "border.draw_masked.SCORES", &border.draw_masked[GFX_SPECIAL_ARG_SCORES]  },
+  { "border.draw_masked.EDITOR", &border.draw_masked[GFX_SPECIAL_ARG_EDITOR]  },
+  { "border.draw_masked.INFO",  &border.draw_masked[GFX_SPECIAL_ARG_INFO]    },
+  { "border.draw_masked.SETUP",         &border.draw_masked[GFX_SPECIAL_ARG_SETUP]   },
+  { "border.draw_masked.PLAYING",&border.draw_masked[GFX_SPECIAL_ARG_PLAYING] },
+  { "border.draw_masked.DOOR",  &border.draw_masked[GFX_SPECIAL_ARG_DOOR]    },
+
+  { "title.fade_delay",                &title.fade_delay                             },
+  { "title.post_delay",                &title.post_delay                             },
+  { "title.auto_delay",                &title.auto_delay                             },
 
-  { "menu.draw_xoffset",       &menu.draw_xoffset[GFX_SPECIAL_ARG_DEFAULT]},
-  { "menu.draw_yoffset",       &menu.draw_yoffset[GFX_SPECIAL_ARG_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.fade_delay",         &menu.fade_delay                              },
+  { "menu.post_delay",         &menu.post_delay                              },
+  { "menu.auto_delay",         &menu.auto_delay                              },
 
-  { "menu.scrollbar_xoffset",  &menu.scrollbar_xoffset                    },
+  { "menu.draw_xoffset",       &menu.draw_xoffset[GFX_SPECIAL_ARG_DEFAULT]   },
+  { "menu.draw_yoffset",       &menu.draw_yoffset[GFX_SPECIAL_ARG_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.INFO[ELEMENTS]",
+    &menu.draw_xoffset_info[GFX_SPECIAL_ARG_INFO_ELEMENTS]                   },
+  { "menu.draw_yoffset.INFO[ELEMENTS]",
+    &menu.draw_yoffset_info[GFX_SPECIAL_ARG_INFO_ELEMENTS]                   },
+  { "menu.draw_xoffset.INFO[MUSIC]",
+    &menu.draw_xoffset_info[GFX_SPECIAL_ARG_INFO_MUSIC]                              },
+  { "menu.draw_yoffset.INFO[MUSIC]",
+    &menu.draw_yoffset_info[GFX_SPECIAL_ARG_INFO_MUSIC]                              },
+  { "menu.draw_xoffset.INFO[CREDITS]",
+    &menu.draw_xoffset_info[GFX_SPECIAL_ARG_INFO_CREDITS]                    },
+  { "menu.draw_yoffset.INFO[CREDITS]",
+    &menu.draw_yoffset_info[GFX_SPECIAL_ARG_INFO_CREDITS]                    },
+  { "menu.draw_xoffset.INFO[PROGRAM]",
+    &menu.draw_xoffset_info[GFX_SPECIAL_ARG_INFO_PROGRAM]                    },
+  { "menu.draw_yoffset.INFO[PROGRAM]",
+    &menu.draw_yoffset_info[GFX_SPECIAL_ARG_INFO_PROGRAM]                    },
+  { "menu.draw_xoffset.INFO[LEVELSET]",
+    &menu.draw_xoffset_info[GFX_SPECIAL_ARG_INFO_LEVELSET]                   },
+  { "menu.draw_yoffset.INFO[LEVELSET]",
+    &menu.draw_yoffset_info[GFX_SPECIAL_ARG_INFO_LEVELSET]                   },
+  { "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[GFX_SPECIAL_ARG_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]      },
+  { "menu.scrollbar_xoffset",  &menu.scrollbar_xoffset                       },
 
-  { "door_1.width",            &door_1.width                              },
-  { "door_1.height",           &door_1.height                             },
-  { "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.width",            &door_2.width                              },
-  { "door_2.height",           &door_2.height                             },
-  { "door_2.step_offset",      &door_2.step_offset                        },
-  { "door_2.step_delay",       &door_2.step_delay                         },
-  { "door_2.anim_mode",                &door_2.anim_mode                          },
+  { "menu.list_size",          &menu.list_size[GFX_SPECIAL_ARG_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]         },
 
-  { "[player].boring_delay_fixed",     &game.player_boring_delay_fixed    },
-  { "[player].boring_delay_random",    &game.player_boring_delay_random   },
-  { "[player].sleeping_delay_fixed",   &game.player_sleeping_delay_fixed  },
-  { "[player].sleeping_delay_random",  &game.player_sleeping_delay_random },
+  { "main.button.name.x",      &menu.main.button.name.x                      },
+  { "main.button.name.y",      &menu.main.button.name.y                      },
+  { "main.button.levels.x",    &menu.main.button.levels.x                    },
+  { "main.button.levels.y",    &menu.main.button.levels.y                    },
+  { "main.button.scores.x",    &menu.main.button.scores.x                    },
+  { "main.button.scores.y",    &menu.main.button.scores.y                    },
+  { "main.button.editor.x",    &menu.main.button.editor.x                    },
+  { "main.button.editor.y",    &menu.main.button.editor.y                    },
+  { "main.button.info.x",      &menu.main.button.info.x                      },
+  { "main.button.info.y",      &menu.main.button.info.y                      },
+  { "main.button.game.x",      &menu.main.button.game.x                      },
+  { "main.button.game.y",      &menu.main.button.game.y                      },
+  { "main.button.setup.x",     &menu.main.button.setup.x                     },
+  { "main.button.setup.y",     &menu.main.button.setup.y                     },
+  { "main.button.quit.x",      &menu.main.button.quit.x                      },
+  { "main.button.quit.y",      &menu.main.button.quit.y                      },
 
-  { NULL,                      NULL,                                      }
+  { "main.button.prev_level.x",        &menu.main.button.prev_level.x                },
+  { "main.button.prev_level.y",        &menu.main.button.prev_level.y                },
+  { "main.button.next_level.x",        &menu.main.button.next_level.x                },
+  { "main.button.next_level.y",        &menu.main.button.next_level.y                },
+
+  { "main.text.name.x",                &menu.main.text.name.x                        },
+  { "main.text.name.y",                &menu.main.text.name.y                        },
+  { "main.text.name.width",    &menu.main.text.name.width                    },
+  { "main.text.name.height",   &menu.main.text.name.height                   },
+  { "main.text.name.align",    &menu.main.text.name.align                    },
+  { "main.text.levels.x",      &menu.main.text.levels.x                      },
+  { "main.text.levels.y",      &menu.main.text.levels.y                      },
+  { "main.text.levels.width",  &menu.main.text.levels.width                  },
+  { "main.text.levels.height", &menu.main.text.levels.height                 },
+  { "main.text.levels.align",  &menu.main.text.levels.align                  },
+  { "main.text.scores.x",      &menu.main.text.scores.x                      },
+  { "main.text.scores.y",      &menu.main.text.scores.y                      },
+  { "main.text.scores.width",  &menu.main.text.scores.width                  },
+  { "main.text.scores.height", &menu.main.text.scores.height                 },
+  { "main.text.scores.align",  &menu.main.text.scores.align                  },
+  { "main.text.editor.x",      &menu.main.text.editor.x                      },
+  { "main.text.editor.y",      &menu.main.text.editor.y                      },
+  { "main.text.editor.width",  &menu.main.text.editor.width                  },
+  { "main.text.editor.height", &menu.main.text.editor.height                 },
+  { "main.text.editor.align",  &menu.main.text.editor.align                  },
+  { "main.text.info.x",                &menu.main.text.info.x                        },
+  { "main.text.info.y",                &menu.main.text.info.y                        },
+  { "main.text.info.width",    &menu.main.text.info.width                    },
+  { "main.text.info.height",   &menu.main.text.info.height                   },
+  { "main.text.info.align",    &menu.main.text.info.align                    },
+  { "main.text.game.x",                &menu.main.text.game.x                        },
+  { "main.text.game.y",                &menu.main.text.game.y                        },
+  { "main.text.game.width",    &menu.main.text.game.width                    },
+  { "main.text.game.height",   &menu.main.text.game.height                   },
+  { "main.text.game.align",    &menu.main.text.game.align                    },
+  { "main.text.setup.x",       &menu.main.text.setup.x                       },
+  { "main.text.setup.y",       &menu.main.text.setup.y                       },
+  { "main.text.setup.width",   &menu.main.text.setup.width                   },
+  { "main.text.setup.height",  &menu.main.text.setup.height                  },
+  { "main.text.setup.align",   &menu.main.text.setup.align                   },
+  { "main.text.quit.x",                &menu.main.text.quit.x                        },
+  { "main.text.quit.y",                &menu.main.text.quit.y                        },
+  { "main.text.quit.width",    &menu.main.text.quit.width                    },
+  { "main.text.quit.height",   &menu.main.text.quit.height                   },
+  { "main.text.quit.align",    &menu.main.text.quit.align                    },
+
+  { "main.text.current_level.x",       &menu.main.text.current_level.x       },
+  { "main.text.current_level.y",       &menu.main.text.current_level.y       },
+  { "main.text.current_level.align",   &menu.main.text.current_level.align   },
+  { "main.text.first_level.x",         &menu.main.text.first_level.x         },
+  { "main.text.first_level.y",         &menu.main.text.first_level.y         },
+  { "main.text.first_level.align",     &menu.main.text.first_level.align     },
+  { "main.text.last_level.x",          &menu.main.text.last_level.x          },
+  { "main.text.last_level.y",          &menu.main.text.last_level.y          },
+  { "main.text.last_level.align",      &menu.main.text.last_level.align      },
+  { "main.text.level_info_1.x",                &menu.main.text.level_info_1.x        },
+  { "main.text.level_info_1.y",                &menu.main.text.level_info_1.y        },
+  { "main.text.level_info_1.align",    &menu.main.text.level_info_1.align    },
+  { "main.text.level_info_2.x",                &menu.main.text.level_info_2.x        },
+  { "main.text.level_info_2.y",                &menu.main.text.level_info_2.y        },
+  { "main.text.level_info_2.align",    &menu.main.text.level_info_2.align    },
+  { "main.text.title_1.x",             &menu.main.text.title_1.x             },
+  { "main.text.title_1.y",             &menu.main.text.title_1.y             },
+  { "main.text.title_1.align",         &menu.main.text.title_1.align         },
+  { "main.text.title_2.x",             &menu.main.text.title_2.x             },
+  { "main.text.title_2.y",             &menu.main.text.title_2.y             },
+  { "main.text.title_2.align",         &menu.main.text.title_2.align         },
+  { "main.text.title_3.x",             &menu.main.text.title_3.x             },
+  { "main.text.title_3.y",             &menu.main.text.title_3.y             },
+  { "main.text.title_3.align",         &menu.main.text.title_3.align         },
+
+  { "main.input.name.x",       &menu.main.input.name.x                       },
+  { "main.input.name.y",       &menu.main.input.name.y                       },
+  { "main.input.name.align",   &menu.main.input.name.align                   },
+
+  { "preview.x",               &preview.x                                    },
+  { "preview.y",               &preview.y                                    },
+  { "preview.align",           &preview.align                                },
+  { "preview.xsize",           &preview.xsize                                },
+  { "preview.ysize",           &preview.ysize                                },
+  { "preview.xoffset",         &preview.xoffset                              },
+  { "preview.yoffset",         &preview.yoffset                              },
+  { "preview.tile_size",       &preview.tile_size                            },
+  { "preview.step_offset",     &preview.step_offset                          },
+  { "preview.step_delay",      &preview.step_delay                           },
+  { "preview.anim_mode",       &preview.anim_mode                            },
+
+  { "door_1.width",            &door_1.width                                 },
+  { "door_1.height",           &door_1.height                                },
+  { "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.width",            &door_2.width                                 },
+  { "door_2.height",           &door_2.height                                },
+  { "door_2.step_offset",      &door_2.step_offset                           },
+  { "door_2.step_delay",       &door_2.step_delay                            },
+  { "door_2.anim_mode",                &door_2.anim_mode                             },
+
+  { "game.panel.level.x",      &game.panel.level.x                           },
+  { "game.panel.level.y",      &game.panel.level.y                           },
+  { "game.panel.gems.x",       &game.panel.gems.x                            },
+  { "game.panel.gems.y",       &game.panel.gems.y                            },
+  { "game.panel.inventory.x",  &game.panel.inventory.x                       },
+  { "game.panel.inventory.y",  &game.panel.inventory.y                       },
+  { "game.panel.keys.x",       &game.panel.keys.x                            },
+  { "game.panel.keys.y",       &game.panel.keys.y                            },
+  { "game.panel.score.x",      &game.panel.score.x                           },
+  { "game.panel.score.y",      &game.panel.score.y                           },
+  { "game.panel.time.x",       &game.panel.time.x                            },
+  { "game.panel.time.y",       &game.panel.time.y                            },
+
+  { "[player].boring_delay_fixed",     &game.player_boring_delay_fixed       },
+  { "[player].boring_delay_random",    &game.player_boring_delay_random      },
+  { "[player].sleeping_delay_fixed",   &game.player_sleeping_delay_fixed     },
+  { "[player].sleeping_delay_random",  &game.player_sleeping_delay_random    },
+
+  { NULL,                      NULL,                                         }
 };
 
 
@@ -4597,7 +5324,8 @@ struct TokenIntPtrInfo image_config_vars[] =
 /* ------------------------------------------------------------------------- */
 
 /* Important: When one entry is a prefix of another entry, the longer entry
-   must come first, because the dynamic configuration does prefix matching! */
+   must come first, because the dynamic configuration does prefix matching!
+   (These definitions must match the corresponding definitions in "main.h"!) */
 
 struct FontInfo font_info[NUM_FONTS + 1] =
 {
@@ -4607,6 +5335,8 @@ struct FontInfo font_info[NUM_FONTS + 1] =
   { "font.initial_4"           },
   { "font.title_1"             },
   { "font.title_2"             },
+  { "font.menu_1.active"       },
+  { "font.menu_2.active"       },
   { "font.menu_1"              },
   { "font.menu_2"              },
   { "font.text_1.active"       },
@@ -4688,9 +5418,11 @@ static void print_usage()
 
 int main(int argc, char *argv[])
 {
-  InitProgramInfo(argv[0], USERDATA_DIRECTORY,
-                 PROGRAM_TITLE_STRING, getWindowTitleString(),
-                 ICON_TITLE_STRING, X11_ICON_FILENAME, X11_ICONMASK_FILENAME,
+  char * window_title_string = getWindowTitleString();
+
+  InitProgramInfo(argv[0], USERDATA_DIRECTORY, USERDATA_DIRECTORY_UNIX,
+                 PROGRAM_TITLE_STRING, window_title_string, ICON_TITLE_STRING,
+                 X11_ICON_FILENAME, X11_ICONMASK_FILENAME, SDL_ICON_FILENAME,
                  MSDOS_POINTER_FILENAME,
                  COOKIE_PREFIX, FILENAME_PREFIX, GAME_VERSION_ACTUAL);