added centering levels that are smaller than the playfield (MM engine)
[rocksndiamonds.git] / src / screens.c
index c35cd84d6a442a71a92426108dde44d6f14e9fef..e20f4deb67a8fe729b207733fdf6dfc5d83ad83b 100644 (file)
 
 #define MAX_MENU_MODES                 MAX(MAX_INFO_MODES, MAX_SETUP_MODES)
 
+/* setup screen titles */
+#define STR_SETUP_MAIN                 "Setup"
+#define STR_SETUP_GAME                 "Game & Menu"
+#define STR_SETUP_EDITOR               "Editor"
+#define STR_SETUP_GRAPHICS             "Graphics"
+#define STR_SETUP_SOUND                        "Sound & Music"
+#define STR_SETUP_ARTWORK              "Custom Artwork"
+#define STR_SETUP_INPUT                        "Input Devices"
+#define STR_SETUP_TOUCH                        "Touch Controls"
+#define STR_SETUP_SHORTCUTS            "Key Shortcuts"
+#define STR_SETUP_EXIT                 "Exit"
+#define STR_SETUP_SAVE_AND_EXIT                "Save and Exit"
+
+#define STR_SETUP_CHOOSE_GAME_SPEED    "Game Speed"
+#define STR_SETUP_CHOOSE_SCROLL_DELAY  "Scroll Delay"
+#define STR_SETUP_CHOOSE_SNAPSHOT_MODE "Snapshot Mode"
+#define STR_SETUP_CHOOSE_WINDOW_SIZE   "Window Scaling"
+#define STR_SETUP_CHOOSE_SCALING_TYPE  "Anti-Aliasing"
+#define STR_SETUP_CHOOSE_RENDERING     "Rendering Mode"
+#define STR_SETUP_CHOOSE_VOLUME_SIMPLE "Sound Volume"
+#define STR_SETUP_CHOOSE_VOLUME_LOOPS  "Loops Volume"
+#define STR_SETUP_CHOOSE_VOLUME_MUSIC  "Music Volume"
+#define STR_SETUP_CHOOSE_TOUCH_CONTROL "Control Type"
+#define STR_SETUP_CHOOSE_MOVE_DISTANCE "Move Distance"
+#define STR_SETUP_CHOOSE_DROP_DISTANCE "Drop Distance"
+
 /* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
 #define SETUPINPUT_SCREEN_POS_END      (SCR_FIELDY - 4)
 #define SETUPINPUT_SCREEN_POS_EMPTY1   (SETUPINPUT_SCREEN_POS_START + 3)
 #define SETUPINPUT_SCREEN_POS_EMPTY2   (SETUPINPUT_SCREEN_POS_END - 1)
 
+#define MENU_SETUP_FONT_TITLE          FONT_TEXT_1
+#define MENU_SETUP_FONT_TEXT           FONT_TITLE_2
+
 /* for various menu stuff  */
 #define MENU_SCREEN_START_XPOS         1
 #define MENU_SCREEN_START_YPOS         2
 #define MENU_SCREEN_MAX_XPOS           (SCR_FIELDX - 1)
 #define MENU_TITLE1_YPOS               8
 #define MENU_TITLE2_YPOS               46
-#define MENU_TITLE_FONT_INFO           FONT_TEXT_1
-#define MENU_SPACING_TITLE             (menu.text.headline.normal_spacing)
+#define MENU_INFO_FONT_TITLE           FONT_TEXT_1
+#define MENU_INFO_FONT_HEAD            FONT_TEXT_2
+#define MENU_INFO_FONT_TEXT            FONT_TEXT_3
+#define MENU_INFO_FONT_FOOT            FONT_TEXT_4
+#define MENU_INFO_SPACE_HEAD           (menu.headline2_spacing_info[info_mode])
 #define MENU_SCREEN_INFO_XSTART                16
 #define MENU_SCREEN_INFO_YSTART1       100
-#define MENU_SCREEN_INFO_YSTART2       (MENU_SCREEN_INFO_YSTART1 +           \
-                                        getMenuTextStep(MENU_SPACING_TITLE,  \
-                                                        MENU_TITLE_FONT_INFO))
+#define MENU_SCREEN_INFO_YSTART2       (MENU_SCREEN_INFO_YSTART1 +            \
+                                        getMenuTextStep(MENU_INFO_SPACE_HEAD, \
+                                                        MENU_INFO_FONT_TITLE))
 #define MENU_SCREEN_INFO_YSTEP         (TILEY + 4)
 #define MENU_SCREEN_INFO_YBOTTOM       (SYSIZE - 20)
 #define MENU_SCREEN_INFO_YSIZE         (MENU_SCREEN_INFO_YBOTTOM -     \
@@ -271,7 +303,7 @@ static struct
   char *text;
 } scaling_types_list[] =
 {
-  {    SCALING_QUALITY_NEAREST, "None"         },
+  {    SCALING_QUALITY_NEAREST, "Off"          },
   {    SCALING_QUALITY_LINEAR,  "Linear"       },
   {    SCALING_QUALITY_BEST,    "Anisotropic"  },
 
@@ -389,6 +421,7 @@ static struct
   char *text;
 } touch_controls_list[] =
 {
+  {    TOUCH_CONTROL_OFF,              "Off"                   },
   {    TOUCH_CONTROL_VIRTUAL_BUTTONS,  "Virtual Buttons"       },
   {    TOUCH_CONTROL_WIPE_GESTURES,    "Wipe Gestures"         },
   {    TOUCH_CONTROL_FOLLOW_FINGER,    "Follow Finger"         },
@@ -421,7 +454,7 @@ static struct
                                 GAME_MODE_MAIN : GAME_MODE_DEFAULT)
 
 /* (there are no draw offset definitions needed for INFO_MODE_TITLE) */
-#define DRAW_MODE_INFO(i)      ((i) >= INFO_MODE_ELEMENTS &&           \
+#define DRAW_MODE_INFO(i)      ((i) >= INFO_MODE_TITLE &&              \
                                 (i) <= INFO_MODE_LEVELSET ? (i) :      \
                                 INFO_MODE_MAIN)
 
@@ -438,6 +471,9 @@ static struct
 #define DRAW_YOFFSET_INFO(i)   (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ?  \
                                 menu.draw_yoffset[GAME_MODE_INFO] :    \
                                 menu.draw_yoffset_info[DRAW_MODE_INFO(i)])
+#define EXTRA_SPACING_INFO(i)  (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ? \
+                                menu.extra_spacing[GAME_MODE_INFO] :   \
+                                menu.extra_spacing_info[DRAW_MODE_INFO(i)])
 
 #define DRAW_XOFFSET_SETUP(i)  (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ? \
                                 menu.draw_xoffset[GAME_MODE_SETUP] :   \
@@ -445,6 +481,9 @@ static struct
 #define DRAW_YOFFSET_SETUP(i)  (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ? \
                                 menu.draw_yoffset[GAME_MODE_SETUP] :   \
                                 menu.draw_yoffset_setup[DRAW_MODE_SETUP(i)])
+#define EXTRA_SPACING_SETUP(i) (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ? \
+                                menu.extra_spacing[GAME_MODE_SETUP] :  \
+                                menu.extra_spacing_setup[DRAW_MODE_SETUP(i)])
 
 #define DRAW_XOFFSET(s)                ((s) == GAME_MODE_INFO ?                \
                                 DRAW_XOFFSET_INFO(info_mode) :         \
@@ -456,6 +495,11 @@ static struct
                                 (s) == GAME_MODE_SETUP ?               \
                                 DRAW_YOFFSET_SETUP(setup_mode) :       \
                                 menu.draw_yoffset[DRAW_MODE(s)])
+#define EXTRA_SPACING(s)       ((s) == GAME_MODE_INFO ?                \
+                                EXTRA_SPACING_INFO(info_mode) :        \
+                                (s) == GAME_MODE_SETUP ?               \
+                                EXTRA_SPACING_SETUP(setup_mode) :      \
+                                menu.extra_spacing[DRAW_MODE(s)])
 
 #define mSX                    (SX + DRAW_XOFFSET(game_status))
 #define mSY                    (SY + DRAW_YOFFSET(game_status))
@@ -538,6 +582,9 @@ static char *main_text_level_year           = NULL;
 static char *main_text_level_imported_from     = NULL;
 static char *main_text_level_imported_by       = NULL;
 static char *main_text_level_tested_by         = NULL;
+static char *main_text_title_1                 = NULL;
+static char *main_text_title_2                 = NULL;
+static char *main_text_title_3                 = NULL;
 
 struct MainControlInfo
 {
@@ -687,19 +734,19 @@ static struct MainControlInfo main_controls[] =
   {
     MAIN_CONTROL_TITLE_1,
     NULL,                              -1,
-    &menu.main.text.title_1,           &setup.internal.program_title,
+    &menu.main.text.title_1,           &main_text_title_1,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_TITLE_2,
     NULL,                              -1,
-    &menu.main.text.title_2,           &setup.internal.program_copyright,
+    &menu.main.text.title_2,           &main_text_title_2,
     NULL,                              NULL,
   },
   {
     MAIN_CONTROL_TITLE_3,
     NULL,                              -1,
-    &menu.main.text.title_3,           &setup.internal.program_company,
+    &menu.main.text.title_3,           &main_text_title_3,
     NULL,                              NULL,
   },
 
@@ -971,6 +1018,10 @@ static void InitializeMainControls()
   main_text_level_imported_by  = leveldir_current->imported_by;
   main_text_level_tested_by    = leveldir_current->tested_by;
 
+  main_text_title_1 = getConfigProgramTitleString();
+  main_text_title_2 = getConfigProgramCopyrightString();
+  main_text_title_3 = getConfigProgramCompanyString();
+
   /* set main control screen positions to dynamically determined values */
   for (i = 0; main_controls[i].nr != -1; i++)
   {
@@ -1279,9 +1330,8 @@ static void drawChooseTreeCursor(int ypos, boolean active)
 
 void DrawHeadline()
 {
-  DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, getProgramTitleString());
-  DrawTextSCentered(MENU_TITLE2_YPOS, FONT_TITLE_2,
-                   setup.internal.program_copyright);
+  DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, main_text_title_1);
+  DrawTextSCentered(MENU_TITLE2_YPOS, FONT_TITLE_2, main_text_title_2);
 }
 
 void DrawTitleScreenImage(int nr, boolean initial)
@@ -1469,7 +1519,7 @@ void DrawMainMenu()
   if (redraw_mask & REDRAW_ALL)
     fade_mask = REDRAW_ALL;
 
-  if (CheckIfGlobalBorderHasChanged())
+  if (CheckIfGlobalBorderOrPlayfieldViewportHasChanged())
     fade_mask = REDRAW_ALL;
 
   FadeOut(fade_mask);
@@ -2169,7 +2219,7 @@ static void DrawInfoScreen_Main()
   if (redraw_mask & REDRAW_ALL)
     fade_mask = REDRAW_ALL;
 
-  if (CheckIfGlobalBorderHasChanged())
+  if (CheckIfGlobalBorderOrPlayfieldViewportHasChanged())
     fade_mask = REDRAW_ALL;
 
   UnmapAllGadgets();
@@ -2526,15 +2576,16 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button)
 
 static int getMenuFontSpacing(int spacing_height, int font_nr)
 {
-  return (spacing_height < 0 ? ABS(spacing_height) * getFontHeight(font_nr) :
+  int font_spacing = getFontHeight(font_nr) + EXTRA_SPACING(game_status);
+
+  return (spacing_height < 0 ? ABS(spacing_height) * font_spacing :
          spacing_height);
 }
 
 static int getMenuTextSpacing(int spacing_height, int font_nr)
 {
-  int extra_spacing = menu.text.all.extra_spacing;
-
-  return getMenuFontSpacing(spacing_height, font_nr) + extra_spacing;
+  return (getMenuFontSpacing(spacing_height, font_nr) +
+         EXTRA_SPACING(game_status));
 }
 
 static int getMenuTextStep(int spacing_height, int font_nr)
@@ -2544,10 +2595,10 @@ static int getMenuTextStep(int spacing_height, int font_nr)
 
 void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
 {
-  int font_title = FONT_TEXT_1;
+  int font_title = MENU_INFO_FONT_TITLE;
   int font_error = FONT_TEXT_2;
-  int font_foot  = FONT_TEXT_4;
-  int spacing_title = menu.text.headline.large_spacing;
+  int font_foot  = MENU_INFO_FONT_FOOT;
+  int spacing_title = menu.headline1_spacing_info[info_mode];
   int ystep_title = getMenuTextStep(spacing_title, font_title);
   int ystart1 = mSY - SY + 100;
   int ystart2 = ystart1 + ystep_title;
@@ -2573,8 +2624,8 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
 {
   static int infoscreen_step[MAX_INFO_ELEMENTS_ON_SCREEN];
   static int infoscreen_frame[MAX_INFO_ELEMENTS_ON_SCREEN];
-  int font_title = FONT_TEXT_1;
-  int font_foot  = FONT_TEXT_4;
+  int font_title = MENU_INFO_FONT_TITLE;
+  int font_foot  = MENU_INFO_FONT_FOOT;
   int xstart = mSX + MENU_SCREEN_INFO_XSTART;
   int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1;
   int ystart2 = mSY + MENU_SCREEN_INFO_YSTART2;
@@ -2860,16 +2911,14 @@ void DrawInfoScreen_Music()
 void HandleInfoScreen_Music(int button)
 {
   static struct MusicFileInfo *list = NULL;
-  int font_title = FONT_TEXT_1;
-  int font_head  = FONT_TEXT_2;
-  int font_text  = FONT_TEXT_3;
-  int font_foot  = FONT_TEXT_4;
-  int spacing_title = menu.text.headline.large_spacing;
-  int spacing_head  = menu.text.headline.normal_spacing;
-  int spacing_line  = menu.text.line.large_spacing;
+  int font_title = MENU_INFO_FONT_TITLE;
+  int font_head  = MENU_INFO_FONT_HEAD;
+  int font_text  = MENU_INFO_FONT_TEXT;
+  int font_foot  = MENU_INFO_FONT_FOOT;
+  int spacing_title = menu.headline1_spacing_info[info_mode];
+  int spacing_head  = menu.headline2_spacing_info[info_mode];
   int ystep_title = getMenuTextStep(spacing_title, font_title);
   int ystep_head  = getMenuTextStep(spacing_head,  font_head);
-  int ystep_line  = getMenuTextStep(spacing_line,  font_text);
   int ystart = mSY - SY + 100;
   int ybottom = mSY - SY + SYSIZE - 20;
 
@@ -2965,7 +3014,7 @@ void HandleInfoScreen_Music(int button)
       }
 
       DrawTextFCentered(ystart, font_text, "\"%s\"", list->title);
-      ystart += ystep_line;
+      ystart += ystep_head;
     }
 
     if (!strEqual(list->artist, UNKNOWN_NAME))
@@ -2978,7 +3027,7 @@ void HandleInfoScreen_Music(int button)
       ystart += ystep_head;
 
       DrawTextFCentered(ystart, font_text, "%s", list->artist);
-      ystart += ystep_line;
+      ystart += ystep_head;
     }
 
     if (!strEqual(list->album, UNKNOWN_NAME))
@@ -2991,7 +3040,7 @@ void HandleInfoScreen_Music(int button)
       ystart += ystep_head;
 
       DrawTextFCentered(ystart, font_text, "\"%s\"", list->album);
-      ystart += ystep_line;
+      ystart += ystep_head;
     }
 
     if (!strEqual(list->year, UNKNOWN_NAME))
@@ -3004,7 +3053,7 @@ void HandleInfoScreen_Music(int button)
       ystart += ystep_head;
 
       DrawTextFCentered(ystart, font_text, "%s", list->year);
-      ystart += ystep_line;
+      ystart += ystep_head;
     }
 
     DrawTextSCentered(ybottom, FONT_TEXT_4,
@@ -3020,20 +3069,18 @@ void HandleInfoScreen_Music(int button)
 
 static void DrawInfoScreen_CreditsScreen(int screen_nr)
 {
-  int font_title = FONT_TEXT_1;
-  int font_head  = FONT_TEXT_2;
-  int font_text  = FONT_TEXT_3;
-  int font_foot  = FONT_TEXT_4;
-  int spacing_title = menu.text.headline.large_spacing;
-  int spacing_head  = menu.text.headline.normal_spacing;
-  int spacing_para  = menu.text.paragraph.large_spacing;
-  int spacing_line  = menu.text.line.large_spacing;
-  int spacing_line1 = menu.text.line.normal_spacing;
+  int font_title = MENU_INFO_FONT_TITLE;
+  int font_head  = MENU_INFO_FONT_HEAD;
+  int font_text  = MENU_INFO_FONT_TEXT;
+  int font_foot  = MENU_INFO_FONT_FOOT;
+  int spacing_title = menu.headline1_spacing_info[info_mode];
+  int spacing_head  = menu.headline2_spacing_info[info_mode];
+  int spacing_para  = menu.paragraph_spacing_info[info_mode];
+  int spacing_line  = menu.line_spacing_info[info_mode];
   int ystep_title = getMenuTextStep(spacing_title, font_title);
   int ystep_head  = getMenuTextStep(spacing_head,  font_head);
   int ystep_para  = getMenuTextStep(spacing_para,  font_text);
   int ystep_line  = getMenuTextStep(spacing_line,  font_text);
-  int ystep_line1 = getMenuTextStep(spacing_line1, font_text);
   int ystart = mSY - SY + 100;
   int ybottom = mSY - SY + SYSIZE - 20;
 
@@ -3050,19 +3097,19 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Peter Liepa");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for creating");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "\"Boulder Dash\"");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "in the year");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "1984");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "published by");
     ystart += ystep_head;
@@ -3076,19 +3123,19 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Klaus Heinz & Volker Wertich");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for creating");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "\"Emerald Mine\"");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "in the year");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "1987");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "published by");
     ystart += ystep_head;
@@ -3102,19 +3149,19 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Michael Stopp & Philip Jespersen");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for creating");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "\"Supaplex\"");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "in the year");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "1991");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "published by");
     ystart += ystep_head;
@@ -3128,19 +3175,19 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Hiroyuki Imabayashi");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for creating");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "\"Sokoban\"");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "in the year");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "1982");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "published by");
     ystart += ystep_head;
@@ -3154,16 +3201,16 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Alan Bond");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "and");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "J\xfcrgen Bonhagen");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for the continuous creation");
-    ystart += ystep_line1;
+    ystart += ystep_line;
     DrawTextSCentered(ystart, font_head,
                      "of outstanding level sets");
   }
@@ -3174,7 +3221,7 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Peter Elzner");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for ideas and inspiration by");
     ystart += ystep_head;
@@ -3187,7 +3234,7 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Steffest");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for ideas and inspiration by");
     ystart += ystep_head;
@@ -3201,10 +3248,10 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "David Tritscher");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for the code base used for the");
-    ystart += ystep_line1;
+    ystart += ystep_line;
     DrawTextSCentered(ystart, font_head,
                      "native Emerald Mine engine");
   }
@@ -3215,7 +3262,7 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Guido Schulz");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for the initial DOS port");
     ystart += ystep_para;
@@ -3225,7 +3272,7 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "Karl H\xf6rnell");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "for some additional toons");
   }
@@ -3233,16 +3280,16 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
   {
     DrawTextSCentered(ystart, font_head,
                      "And not to forget:");
-    ystart += ystep_line;
+    ystart += ystep_head;
     DrawTextSCentered(ystart, font_head,
                      "Many thanks to");
     ystart += ystep_head;
     DrawTextSCentered(ystart, font_text,
                      "All those who contributed");
-    ystart += ystep_line1;
+    ystart += ystep_line;
     DrawTextSCentered(ystart, font_text,
                      "levels to this game");
-    ystart += ystep_line1;
+    ystart += ystep_line;
     DrawTextSCentered(ystart, font_text,
                      "since 1995");
   }
@@ -3323,20 +3370,18 @@ void HandleInfoScreen_Credits(int button)
 
 void DrawInfoScreen_Program()
 {
-  int font_title = FONT_TEXT_1;
-  int font_head  = FONT_TEXT_2;
-  int font_text  = FONT_TEXT_3;
-  int font_foot  = FONT_TEXT_4;
-  int spacing_title = menu.text.headline.large_spacing;
-  int spacing_head  = menu.text.headline.normal_spacing;
-  int spacing_para  = menu.text.paragraph.large_spacing;
-  int spacing_line  = menu.text.line.large_spacing;
-  int spacing_line1 = menu.text.line.normal_spacing;
+  int font_title = MENU_INFO_FONT_TITLE;
+  int font_head  = MENU_INFO_FONT_HEAD;
+  int font_text  = MENU_INFO_FONT_TEXT;
+  int font_foot  = MENU_INFO_FONT_FOOT;
+  int spacing_title = menu.headline1_spacing_info[info_mode];
+  int spacing_head  = menu.headline2_spacing_info[info_mode];
+  int spacing_para  = menu.paragraph_spacing_info[info_mode];
+  int spacing_line  = menu.line_spacing_info[info_mode];
   int ystep_title = getMenuTextStep(spacing_title, font_title);
   int ystep_head  = getMenuTextStep(spacing_head,  font_head);
   int ystep_para  = getMenuTextStep(spacing_para,  font_text);
   int ystep_line  = getMenuTextStep(spacing_line,  font_text);
-  int ystep_line1 = getMenuTextStep(spacing_line1, font_text);
   int ystart = mSY - SY + 100;
   int ybottom = mSY - SY + SYSIZE - 20;
 
@@ -3352,7 +3397,7 @@ void DrawInfoScreen_Program()
 
   DrawTextSCentered(ystart, font_head,
                    "This game is Freeware!");
-  ystart += ystep_line;
+  ystart += ystep_head;
   DrawTextSCentered(ystart, font_head,
                    "If you like it, send e-mail to:");
   ystart += ystep_head;
@@ -3369,10 +3414,10 @@ void DrawInfoScreen_Program()
 
   DrawTextSCentered(ystart, font_head,
                    "If you have created new levels,");
-  ystart += ystep_line1;
+  ystart += ystep_line;
   DrawTextSCentered(ystart, font_head,
                    "send them to me to include them!");
-  ystart += ystep_line;
+  ystart += ystep_head;
   DrawTextSCentered(ystart, font_head,
                    ":-)");
 
@@ -3410,14 +3455,14 @@ void HandleInfoScreen_Program(int button)
 
 void DrawInfoScreen_Version()
 {
-  int font_title = FONT_TEXT_1;
-  int font_head  = FONT_TEXT_2;
-  int font_text  = FONT_TEXT_3;
-  int font_foot  = FONT_TEXT_4;
-  int spacing_title = menu.text.headline.large_spacing;
-  int spacing_head  = menu.text.headline.normal_spacing;
-  int spacing_para  = menu.text.paragraph.normal_spacing;
-  int spacing_line  = menu.text.line.normal_spacing;
+  int font_title = MENU_INFO_FONT_TITLE;
+  int font_head  = MENU_INFO_FONT_HEAD;
+  int font_text  = MENU_INFO_FONT_TEXT;
+  int font_foot  = MENU_INFO_FONT_FOOT;
+  int spacing_title = menu.headline1_spacing_info[info_mode];
+  int spacing_head  = menu.headline2_spacing_info[info_mode];
+  int spacing_para  = menu.paragraph_spacing_info[info_mode];
+  int spacing_line  = menu.line_spacing_info[info_mode];
   int xstep = getFontWidth(font_text);
   int ystep_title = getMenuTextStep(spacing_title, font_title);
   int ystep_head  = getMenuTextStep(spacing_head,  font_head);
@@ -3826,7 +3871,7 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
 {
   int fade_mask = REDRAW_FIELD;
 
-  if (CheckIfGlobalBorderHasChanged())
+  if (CheckIfGlobalBorderOrPlayfieldViewportHasChanged())
     fade_mask = REDRAW_ALL;
 
   if (strEqual((*ti_ptr)->subdir, STRING_TOP_DIRECTORY))
@@ -4345,7 +4390,7 @@ void DrawHallOfFame(int highlight_position)
 {
   int fade_mask = REDRAW_FIELD;
 
-  if (CheckIfGlobalBorderHasChanged())
+  if (CheckIfGlobalBorderOrPlayfieldViewportHasChanged())
     fade_mask = REDRAW_ALL;
 
   UnmapAllGadgets();
@@ -4541,7 +4586,7 @@ static void execSetupGame_setGameSpeeds()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Game Speed");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_GAME_SPEED);
 
       pushTreeInfo(&game_speeds, ti);
     }
@@ -4591,7 +4636,7 @@ static void execSetupGame_setScrollDelays()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Scroll Delay");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_SCROLL_DELAY);
 
       pushTreeInfo(&scroll_delays, ti);
     }
@@ -4641,7 +4686,7 @@ static void execSetupGame_setSnapshotModes()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Snapshot Mode");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_SNAPSHOT_MODE);
 
       pushTreeInfo(&snapshot_modes, ti);
     }
@@ -4738,7 +4783,7 @@ static void execSetupGraphics_setWindowSizes(boolean update_list)
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Window Scaling");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_WINDOW_SIZE);
 
       pushTreeInfo(&window_sizes, ti);
 
@@ -4763,7 +4808,7 @@ static void execSetupGraphics_setWindowSizes(boolean update_list)
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Window Scaling");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_WINDOW_SIZE);
 
       pushTreeInfo(&window_sizes, ti);
     }
@@ -4815,7 +4860,7 @@ static void execSetupGraphics_setScalingTypes()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Anti-Aliasing");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_SCALING_TYPE);
 
       pushTreeInfo(&scaling_types, ti);
     }
@@ -4865,7 +4910,7 @@ static void execSetupGraphics_setRenderingModes()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Special Rendering");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_RENDERING);
 
       pushTreeInfo(&rendering_modes, ti);
     }
@@ -4992,7 +5037,7 @@ static void execSetupSound()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Sound Volume");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_VOLUME_SIMPLE);
 
       pushTreeInfo(&volumes_simple, ti);
 
@@ -5017,7 +5062,7 @@ static void execSetupSound()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Sound Volume");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_VOLUME_SIMPLE);
 
       pushTreeInfo(&volumes_simple, ti);
     }
@@ -5060,7 +5105,7 @@ static void execSetupSound()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Loops Volume");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_VOLUME_LOOPS);
 
       pushTreeInfo(&volumes_loops, ti);
 
@@ -5085,7 +5130,7 @@ static void execSetupSound()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Loops Volume");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_VOLUME_LOOPS);
 
       pushTreeInfo(&volumes_loops, ti);
     }
@@ -5128,7 +5173,7 @@ static void execSetupSound()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Music Volume");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_VOLUME_MUSIC);
 
       pushTreeInfo(&volumes_music, ti);
 
@@ -5153,7 +5198,7 @@ static void execSetupSound()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Music Volume");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_VOLUME_MUSIC);
 
       pushTreeInfo(&volumes_music, ti);
     }
@@ -5232,7 +5277,7 @@ static void execSetupTouch()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Control Type");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_TOUCH_CONTROL);
 
       pushTreeInfo(&touch_controls, ti);
     }
@@ -5274,7 +5319,7 @@ static void execSetupTouch()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Move Distance");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_MOVE_DISTANCE);
 
       pushTreeInfo(&move_distances, ti);
     }
@@ -5317,7 +5362,7 @@ static void execSetupTouch()
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, "Drop Distance");
+      setString(&ti->infotext, STR_SETUP_CHOOSE_DROP_DISTANCE);
 
       pushTreeInfo(&drop_distances, ti);
     }
@@ -5465,17 +5510,17 @@ static void execSaveAndExitSetup()
 
 static struct TokenInfo setup_info_main[] =
 {
-  { TYPE_ENTER_MENU,   execSetupGame,          "Game & Menu"           },
-  { TYPE_ENTER_MENU,   execSetupEditor,        "Editor"                },
-  { TYPE_ENTER_MENU,   execSetupGraphics,      "Graphics"              },
-  { TYPE_ENTER_MENU,   execSetupSound,         "Sound & Music"         },
-  { TYPE_ENTER_MENU,   execSetupArtwork,       "Custom Artwork"        },
-  { TYPE_ENTER_MENU,   execSetupInput,         "Input Devices"         },
-  { TYPE_ENTER_MENU,   execSetupTouch,         "Touch Controls"        },
-  { TYPE_ENTER_MENU,   execSetupShortcuts,     "Key Shortcuts"         },
+  { TYPE_ENTER_MENU,   execSetupGame,          STR_SETUP_GAME          },
+  { TYPE_ENTER_MENU,   execSetupEditor,        STR_SETUP_EDITOR        },
+  { TYPE_ENTER_MENU,   execSetupGraphics,      STR_SETUP_GRAPHICS      },
+  { TYPE_ENTER_MENU,   execSetupSound,         STR_SETUP_SOUND         },
+  { TYPE_ENTER_MENU,   execSetupArtwork,       STR_SETUP_ARTWORK       },
+  { TYPE_ENTER_MENU,   execSetupInput,         STR_SETUP_INPUT         },
+  { TYPE_ENTER_MENU,   execSetupTouch,         STR_SETUP_TOUCH         },
+  { TYPE_ENTER_MENU,   execSetupShortcuts,     STR_SETUP_SHORTCUTS     },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execExitSetup,          "Exit"                  },
-  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and Exit"         },
+  { TYPE_LEAVE_MENU,   execExitSetup,          STR_SETUP_EXIT          },
+  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   STR_SETUP_SAVE_AND_EXIT },
 
   { 0,                 NULL,                   NULL                    }
 };
@@ -5998,7 +6043,7 @@ static void DrawSetupScreen_Generic()
   char *title_string = NULL;
   int i;
 
-  if (CheckIfGlobalBorderHasChanged())
+  if (CheckIfGlobalBorderOrPlayfieldViewportHasChanged())
     fade_mask = REDRAW_ALL;
 
   UnmapAllGadgets();
@@ -6024,37 +6069,37 @@ static void DrawSetupScreen_Generic()
   if (setup_mode == SETUP_MODE_MAIN)
   {
     setup_info = setup_info_main;
-    title_string = "Setup";
+    title_string = STR_SETUP_MAIN;
   }
   else if (setup_mode == SETUP_MODE_GAME)
   {
     setup_info = setup_info_game;
-    title_string = "Setup Game";
+    title_string = STR_SETUP_GAME;
   }
   else if (setup_mode == SETUP_MODE_EDITOR)
   {
     setup_info = setup_info_editor;
-    title_string = "Setup Editor";
+    title_string = STR_SETUP_EDITOR;
   }
   else if (setup_mode == SETUP_MODE_GRAPHICS)
   {
     setup_info = setup_info_graphics;
-    title_string = "Setup Graphics";
+    title_string = STR_SETUP_GRAPHICS;
   }
   else if (setup_mode == SETUP_MODE_SOUND)
   {
     setup_info = setup_info_sound;
-    title_string = "Setup Sound";
+    title_string = STR_SETUP_SOUND;
   }
   else if (setup_mode == SETUP_MODE_ARTWORK)
   {
     setup_info = setup_info_artwork;
-    title_string = "Custom Artwork";
+    title_string = STR_SETUP_ARTWORK;
   }
   else if (setup_mode == SETUP_MODE_TOUCH)
   {
     setup_info = setup_info_touch;
-    title_string = "Setup Touch Ctrls";
+    title_string = STR_SETUP_TOUCH;
 
     if (strEqual(setup.touch.control_type, TOUCH_CONTROL_WIPE_GESTURES))
       setup_info = setup_info_touch_wipe_gestures;
@@ -6062,32 +6107,32 @@ static void DrawSetupScreen_Generic()
   else if (setup_mode == SETUP_MODE_SHORTCUTS)
   {
     setup_info = setup_info_shortcuts;
-    title_string = "Setup Shortcuts";
+    title_string = STR_SETUP_SHORTCUTS;
   }
   else if (setup_mode == SETUP_MODE_SHORTCUTS_1)
   {
     setup_info = setup_info_shortcuts_1;
-    title_string = "Setup Shortcuts";
+    title_string = STR_SETUP_SHORTCUTS;
   }
   else if (setup_mode == SETUP_MODE_SHORTCUTS_2)
   {
     setup_info = setup_info_shortcuts_2;
-    title_string = "Setup Shortcuts";
+    title_string = STR_SETUP_SHORTCUTS;
   }
   else if (setup_mode == SETUP_MODE_SHORTCUTS_3)
   {
     setup_info = setup_info_shortcuts_3;
-    title_string = "Setup Shortcuts";
+    title_string = STR_SETUP_SHORTCUTS;
   }
   else if (setup_mode == SETUP_MODE_SHORTCUTS_4)
   {
     setup_info = setup_info_shortcuts_4;
-    title_string = "Setup Shortcuts";
+    title_string = STR_SETUP_SHORTCUTS;
   }
   else if (setup_mode == SETUP_MODE_SHORTCUTS_5)
   {
     setup_info = setup_info_shortcuts_5;
-    title_string = "Setup Shortcuts";
+    title_string = STR_SETUP_SHORTCUTS;
   }
 
   /* use modified setup info without setup entries marked as hidden */
@@ -6135,7 +6180,7 @@ void DrawSetupScreen_Input()
 
   setup_info = setup_info_input;
 
-  DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Setup Input");
+  DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, STR_SETUP_INPUT);
 
   for (i = 0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
   {
@@ -6542,16 +6587,14 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick)
   int alpha = 200, alpha_step = -1;
   int alpha_ticks = 0;
   char mapping[4096], temp[4096];
-  int font_name = FONT_TEXT_1;
-  int font_info = FONT_REQUEST;
-  int spacing_name  = menu.text.line.normal_spacing;
-  int spacing_line  = menu.text.line.normal_spacing;
-  int spacing_line2 = menu.text.line.large_spacing;
-  int ystep_name  = getMenuTextStep(spacing_name,  font_name);
-  int ystep_line  = getMenuTextStep(spacing_line,  font_info);
-  int ystep_line2 = getMenuTextStep(spacing_line2, font_info);
-  // int ystep1 = getFontHeight(font_name) + 2;
-  // int ystep2 = getFontHeight(font_info) + 2;
+  int font_name = MENU_SETUP_FONT_TITLE;
+  int font_info = MENU_SETUP_FONT_TEXT;
+  int spacing_name = menu.line_spacing_setup[SETUP_MODE_INPUT];
+  int spacing_line = menu.line_spacing_setup[SETUP_MODE_INPUT];
+  int spacing_para = menu.paragraph_spacing_setup[SETUP_MODE_INPUT];
+  int ystep_name = getMenuTextStep(spacing_name, font_name);
+  int ystep_line = getMenuTextStep(spacing_line, font_info);
+  int ystep_para = getMenuTextStep(spacing_para, font_info);
   int i, j;
 
   struct
@@ -6674,7 +6717,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick)
       ystart2 += ystep_line;
       DrawTextSCentered(ystart2, font_info,
                        "(Your controller may look different.)");
-      ystart2 += ystep_line2;
+      ystart2 += ystep_para;
 
 #if defined(PLATFORM_ANDROID)
       DrawTextSCentered(ystart2, font_info,
@@ -7048,6 +7091,9 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
 
 void HandleGameActions()
 {
+  if (game.restart_game_message != NULL)
+    RequestRestartGame(game.restart_game_message);
+
   if (game_status != GAME_MODE_PLAYING)
     return;