rnd-20100616-1-src
[rocksndiamonds.git] / src / screens.c
index 527fbd055ac26f701447e875973bb3fc041bd239..fb511433864592ff21d8d9ae107f18e6db38ac07 100644 (file)
 #define SETUP_MODE_SOUND               4
 #define SETUP_MODE_ARTWORK             5
 #define SETUP_MODE_INPUT               6
-#define SETUP_MODE_SHORTCUTS_1         7
-#define SETUP_MODE_SHORTCUTS_2         8
+#define SETUP_MODE_SHORTCUTS           7
+#define SETUP_MODE_SHORTCUTS_1         8
+#define SETUP_MODE_SHORTCUTS_2         9
+#define SETUP_MODE_SHORTCUTS_3         10
+#define SETUP_MODE_SHORTCUTS_4         11
+#define SETUP_MODE_SHORTCUTS_5         12
 
 /* sub-screens on the setup screen (generic) */
-#define SETUP_MODE_CHOOSE_ARTWORK      9
-#define SETUP_MODE_CHOOSE_OTHER                10
+#define SETUP_MODE_CHOOSE_ARTWORK      13
+#define SETUP_MODE_CHOOSE_OTHER                14
 
 /* sub-screens on the setup screen (specific) */
-#define SETUP_MODE_CHOOSE_GAME_SPEED   11
-#define SETUP_MODE_CHOOSE_SCREEN_MODE  12
-#define SETUP_MODE_CHOOSE_SCROLL_DELAY 13
-#define SETUP_MODE_CHOOSE_GRAPHICS     14
-#define SETUP_MODE_CHOOSE_SOUNDS       15
-#define SETUP_MODE_CHOOSE_MUSIC                16
+#define SETUP_MODE_CHOOSE_GAME_SPEED   15
+#define SETUP_MODE_CHOOSE_SCREEN_MODE  16
+#define SETUP_MODE_CHOOSE_SCROLL_DELAY 17
+#define SETUP_MODE_CHOOSE_GRAPHICS     18
+#define SETUP_MODE_CHOOSE_SOUNDS       19
+#define SETUP_MODE_CHOOSE_MUSIC                20
 
-#define MAX_SETUP_MODES                        17
+#define MAX_SETUP_MODES                        21
 
 /* for input setup functions */
 #define SETUPINPUT_SCREEN_POS_START    0
 
 #define SC_BORDER_SIZE                 14
 
-#if 0
-/* other useful macro definitions */
-#define BUTTON_GRAPHIC_ACTIVE(g)                                              \
-       (g == IMG_MENU_BUTTON_LEFT       ? IMG_MENU_BUTTON_LEFT_ACTIVE       : \
-        g == IMG_MENU_BUTTON_RIGHT      ? IMG_MENU_BUTTON_RIGHT_ACTIVE      : \
-        g == IMG_MENU_BUTTON_UP         ? IMG_MENU_BUTTON_UP_ACTIVE         : \
-        g == IMG_MENU_BUTTON_DOWN       ? IMG_MENU_BUTTON_DOWN_ACTIVE       : \
-         g == IMG_MENU_BUTTON_LEAVE_MENU ? IMG_MENU_BUTTON_LEAVE_MENU_ACTIVE : \
-         g == IMG_MENU_BUTTON_ENTER_MENU ? IMG_MENU_BUTTON_ENTER_MENU_ACTIVE : \
-         g == IMG_MENU_BUTTON_PREV_LEVEL ? IMG_MENU_BUTTON_PREV_LEVEL_ACTIVE : \
-         g == IMG_MENU_BUTTON_NEXT_LEVEL ? IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE : \
-         g == IMG_MENU_BUTTON_NAME       ? IMG_MENU_BUTTON_NAME_ACTIVE       : \
-         g == IMG_MENU_BUTTON_LEVELS     ? IMG_MENU_BUTTON_LEVELS_ACTIVE     : \
-         g == IMG_MENU_BUTTON_SCORES     ? IMG_MENU_BUTTON_SCORES_ACTIVE     : \
-         g == IMG_MENU_BUTTON_EDITOR     ? IMG_MENU_BUTTON_EDITOR_ACTIVE     : \
-         g == IMG_MENU_BUTTON_INFO       ? IMG_MENU_BUTTON_INFO_ACTIVE       : \
-         g == IMG_MENU_BUTTON_GAME       ? IMG_MENU_BUTTON_GAME_ACTIVE       : \
-         g == IMG_MENU_BUTTON_SETUP      ? IMG_MENU_BUTTON_SETUP_ACTIVE      : \
-         g == IMG_MENU_BUTTON_QUIT       ? IMG_MENU_BUTTON_QUIT_ACTIVE       : \
-         IMG_MENU_BUTTON_ACTIVE)
-#endif
-
 
 /* forward declarations of internal functions */
 static void HandleScreenGadgets(struct GadgetInfo *);
@@ -254,7 +236,7 @@ static struct
                                 INFO_MODE_MAIN)
 
 #define DRAW_MODE_SETUP(i)     ((i) >= SETUP_MODE_MAIN &&              \
-                                (i) <= SETUP_MODE_SHORTCUTS_2 ? (i) :  \
+                                (i) <= SETUP_MODE_SHORTCUTS_5 ? (i) :  \
                                 (i) >= SETUP_MODE_CHOOSE_GRAPHICS &&   \
                                 (i) <= SETUP_MODE_CHOOSE_MUSIC ?       \
                                 SETUP_MODE_CHOOSE_ARTWORK :            \
@@ -747,6 +729,12 @@ static void InitializeTitleControls_CheckTitleInfo(boolean initial)
     Bitmap *bitmap = graphic_info[graphic].bitmap;
     int sort_priority = graphic_info[graphic].sort_priority;
 
+#if 0
+    /* skip images and messages (fonts!) when using forced custom graphics */
+    if (setup.override_level_graphics && !initial)
+      continue;
+#endif
+
     if (bitmap != NULL)
       InitializeTitleControlsExt_AddTitleInfo(TRUE, initial, i, sort_priority);
   }
@@ -757,6 +745,12 @@ static void InitializeTitleControls_CheckTitleInfo(boolean initial)
     char *filename = getLevelSetTitleMessageFilename(i, initial);
     int sort_priority = tmi->sort_priority;
 
+#if 0
+    /* skip images and messages (fonts!) when using forced custom graphics */
+    if (setup.override_level_graphics)
+      continue;
+#endif
+
     if (filename != NULL)
       InitializeTitleControlsExt_AddTitleInfo(FALSE, initial, i, sort_priority);
   }
@@ -766,9 +760,13 @@ static void InitializeTitleControls(boolean show_title_initial)
 {
   num_title_screens = 0;
 
+#if 1
+  /* 1st step: initialize title screens for game start (only when starting) */
   if (show_title_initial)
     InitializeTitleControls_CheckTitleInfo(TRUE);
+#endif
 
+  /* 2nd step: initialize title screens for current level set */
   InitializeTitleControls_CheckTitleInfo(FALSE);
 
   /* sort title screens according to sort_priority and title number */
@@ -1028,7 +1026,11 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y)
 
 static void drawCursorExt(int xpos, int ypos, boolean active, int graphic)
 {
+#if 1
+  static int cursor_array[MAX_LEV_FIELDY];
+#else
   static int cursor_array[SCR_FIELDY];
+#endif
   int x = mSX + TILEX * xpos;
   int y = mSY + TILEY * (MENU_SCREEN_START_YPOS + ypos);
 
@@ -1116,16 +1118,10 @@ void DrawTitleScreenImage(int nr, boolean initial)
 {
   int graphic = getTitleScreenGraphic(nr, initial);
   Bitmap *bitmap = graphic_info[graphic].bitmap;
-#if 1
   int width  = graphic_info[graphic].width;
   int height = graphic_info[graphic].height;
   int src_x = graphic_info[graphic].src_x;
   int src_y = graphic_info[graphic].src_y;
-#else
-  int width  = graphic_info[graphic].src_image_width;
-  int height = graphic_info[graphic].src_image_height;
-  int src_x = 0, src_y = 0;
-#endif
   int dst_x, dst_y;
 
   if (bitmap == NULL)
@@ -1155,52 +1151,20 @@ void DrawTitleScreenImage(int nr, boolean initial)
   ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
 
   if (DrawingOnBackground(dst_x, dst_y))
+  {
+    SetClipOrigin(bitmap, bitmap->stored_clip_gc, dst_x - src_x, dst_y - src_y);
     BlitBitmapMasked(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y);
+  }
   else
     BlitBitmap(bitmap, drawto, src_x, src_y, width, height, dst_x, dst_y);
 
   redraw_mask = REDRAW_ALL;
-
-  /* reset fading control values to default config settings */
-#if 1
-
-#if 0
-  title = getTitleFading(nr, initial, TRUE);
-#endif
-
-#else
-
-  title.fade_delay_final = title.fade_delay;
-  title.post_delay_final = title.post_delay;
-  title.auto_delay_final = title.auto_delay;
-
-  /* override default settings with image config settings, if defined */
-  if (graphic_info[graphic].anim_mode != ANIM_DEFAULT)
-    title.anim_mode = graphic_info[graphic].anim_mode;
-  if (graphic_info[graphic].fade_delay > -1)
-    title.fade_delay = graphic_info[graphic].fade_delay;
-  if (graphic_info[graphic].post_delay > -1)
-    title.post_delay = graphic_info[graphic].post_delay;
-  if (graphic_info[graphic].auto_delay > -1)
-    title.auto_delay = graphic_info[graphic].auto_delay;
-#endif
 }
 
 void DrawTitleScreenMessage(int nr, boolean initial)
 {
   char *filename = getLevelSetTitleMessageFilename(nr, initial);
   struct TitleMessageInfo *tmi = getTitleMessageInfo(nr, initial);
-#if 0
-  int font_nr = FONT_TEXT_1;
-  int font_width;
-  int font_height;
-  int pad_x = 16   + 4;
-  int pad_y = 32   + 14;
-  int sx = pad_x;
-  int sy = pad_y;
-  int max_chars_per_line;
-  int max_lines_per_screen;
-#endif
   int last_game_status = game_status;  /* save current game status */
 
   if (filename == NULL)
@@ -1226,22 +1190,9 @@ void DrawTitleScreenMessage(int nr, boolean initial)
 
   ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
 
-#if 0
-  font_width = getFontWidth(font_nr);
-  font_height = getFontHeight(font_nr);
-  max_chars_per_line = (WIN_XSIZE - 2 * pad_x) / font_width;
-  max_lines_per_screen = (WIN_YSIZE - pad_y) / font_height - 1;
-#endif
-
-#if 1
   DrawTextFile(ALIGNED_TEXT_XPOS(tmi), ALIGNED_TEXT_YPOS(tmi),
-              filename, tmi->font, tmi->chars, -1, tmi->lines, -1,
+              filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1,
               tmi->autowrap, tmi->centered, tmi->parse_comments);
-#else
-  DrawTextFile(sx, sy, filename, font_nr, max_chars_per_line, -1,
-              max_lines_per_screen, -1, tmi->autowrap, tmi->centered,
-              tmi->parse_comments);
-#endif
 
   game_status = last_game_status;      /* restore current game status */
 }
@@ -1276,50 +1227,14 @@ boolean CheckTitleScreen(boolean levelset_has_changed)
   return (show_titlescreen && num_title_screens > 0);
 }
 
-void DrawMainMenuExt(int redraw_mask, boolean do_fading)
+void DrawMainMenuExt(int fade_mask, boolean do_fading)
 {
   static LevelDirTree *leveldir_last_valid = NULL;
   boolean levelset_has_changed = FALSE;
-#if 0
-  boolean local_team_mode = (!options.network && setup.team_mode);
-  char *name_text = (local_team_mode ? "Team:" : "Name:");
-  int name_width, level_width;
-#endif
-#if 0
-  int i;
-#endif
-
-#if 0
-  /* !!! CHANGE THIS !!! */
-  title = title_default;
-#endif
-
-#if 0
-  {
-    int graphicA = element_info[EL_EM_DYNAMITE_ACTIVE].special_graphic[GFX_SPECIAL_ARG_EDITOR];
-    int graphicB = element_info[EL_EM_DYNAMITE_ACTIVE].special_graphic[GFX_SPECIAL_ARG_PANEL];
-    int graphic1 = element_info[EL_CONVEYOR_BELT_1_MIDDLE].special_graphic[GFX_SPECIAL_ARG_EDITOR];
-    int graphic2 = element_info[EL_CONVEYOR_BELT_1_MIDDLE_ACTIVE].special_graphic[GFX_SPECIAL_ARG_EDITOR];
-
-    printf("::: %d [%d] -> %d, %d [%d, %d]\n",
-          graphicA, graphicB,
-          graphic_info[graphicA].src_x,
-          graphic_info[graphicA].src_y,
-          graphic1, graphic2);
-  }
-#endif
-
-#if 0
-  printf("::: %d, %d\n", fading.anim_mode == ANIM_CROSSFADE,
-        redraw_mask == REDRAW_ALL);
-#endif
 
   FadeSetLeaveScreen();
 
-  /* (does not work well when changing to editor, which fades out itself) */
-#if 0
-  FadeOut(redraw_mask);
-#endif
+  /* do not fade out here -- function may continue and fade on editor screen */
 
   UnmapAllGadgets();
   FadeSoundsAndMusic();
@@ -1343,13 +1258,6 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
     return;
   }
 
-#if 1
-  FadeOut(redraw_mask);
-#endif
-
-  /* needed if last screen was the editor screen */
-  UndrawSpecialEditorDoor();
-
   /* needed if last screen was the setup screen and fullscreen state changed */
   ToggleFullscreenIfNeeded();
 
@@ -1363,37 +1271,35 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
   /* store valid level series information */
   leveldir_last_valid = leveldir_current;
 
+  init_last = init;                    /* switch to new busy animation */
+
   /* needed if last screen (level choice) changed graphics, sounds or music */
   ReloadCustomArtwork(0);
 
-#if defined(TARGET_SDL)
-  SetDrawtoField(DRAW_BACKBUFFER);
-#endif
+  if (redraw_mask & REDRAW_ALL)
+    fade_mask = REDRAW_ALL;
+
+#if 1
+  FadeOut(fade_mask);
 
+  /* needed if last screen was the editor screen */
+  UndrawSpecialEditorDoor();
 #if 0
-  if (levelset_has_changed)
-    fading = title_default;
+  if (fade_mask == REDRAW_FIELD)
+    BackToFront();
+#endif
 #endif
 
 #if 1
-  if (CheckTitleScreen(levelset_has_changed))
-  {
-    game_status = GAME_MODE_TITLE;
-
-    DrawTitleScreen();
-
-    return;
-  }
+  /* needed if different viewport properties defined for menues */
+  ChangeViewportPropertiesIfNeeded();
+#endif
 
-#else
+#if defined(TARGET_SDL)
+  SetDrawtoField(DRAW_BACKBUFFER);
+#endif
 
-  if (setup.show_titlescreen &&
-      ((levelset_has_changed &&
-       (graphic_info[IMG_TITLESCREEN_1].bitmap != NULL ||
-        getLevelSetMessageFilename(1, FALSE) != NULL)) ||
-       (show_title_initial &&
-       (graphic_info[IMG_TITLESCREEN_INITIAL_1].bitmap != NULL ||
-        getLevelSetMessageFilename(1, TRUE) != NULL))))
+  if (CheckTitleScreen(levelset_has_changed))
   {
     game_status = GAME_MODE_TITLE;
 
@@ -1401,114 +1307,32 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
 
     return;
   }
-#endif
 
   /* level_nr may have been set to value over handicap with level editor */
   if (setup.handicap && level_nr > leveldir_current->handicap_level)
     level_nr = leveldir_current->handicap_level;
 
   LoadLevel(level_nr);
+  LoadScore(level_nr);
 
   SetMainBackgroundImage(IMG_BACKGROUND_MAIN);
 
-#if 0
-  FadeOut(redraw_mask);
-#endif
-
 #if 1
-  if (redraw_mask == REDRAW_ALL)
+  if (fade_mask == REDRAW_ALL)
   {
-#if 0
-    int door_state = GetDoorState();
-#endif
+    // int door_state = GetDoorState();
 
     RedrawBackground();
 
     // OpenDoor(door_state | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
-
-#if 0
-#if 1
-    OpenDoor(DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
-#else
-    OpenDoor(DOOR_CLOSE_1 | DOOR_CLOSE_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
-#endif
-#endif
   }
 #endif
 
-  ClearWindow();
+  ClearField();
 
-#if 1
   InitializeMainControls();
 
-#if 1
   DrawCursorAndText_Main(-1, FALSE);
-#else
-  for (i = 0; main_controls[i].nr != -1; i++)
-  {
-    struct MenuPosInfo *pos_button = main_controls[i].pos_button;
-    struct MenuPosInfo *pos_text   = main_controls[i].pos_text;
-    struct MenuPosInfo *pos_input  = main_controls[i].pos_input;
-    char *text                     = main_controls[i].text;
-    char *input                    = main_controls[i].input;
-    int button_graphic             = main_controls[i].button_graphic;
-    int font_text                  = main_controls[i].font_text;
-    int font_input                 = main_controls[i].font_input;
-
-    if (pos_button != NULL)
-      DrawGraphicThruMaskExt(drawto, mSX + pos_button->x, mSY + pos_button->y,
-                            button_graphic, 0);
-
-    if (pos_text != NULL && text != NULL)
-      DrawText(mSX + pos_text->x, mSY + pos_text->y, text, font_text);
-
-    if (pos_input != NULL && input != NULL)
-      DrawText(mSX + pos_input->x, mSY + pos_input->y, input, font_input);
-  }
-#endif
-
-#else
-
-  DrawHeadline();
-
-  DrawText(mSX + 32, mSY + 2 * 32, name_text,       FONT_MENU_1);
-  DrawText(mSX + 32, mSY + 3 * 32, "Levelset",      FONT_MENU_1);
-  DrawText(mSX + 32, mSY + 4 * 32, "Hall Of Fame",  FONT_MENU_1);
-  DrawText(mSX + 32, mSY + 5 * 32, "Level Creator", FONT_MENU_1);
-  DrawText(mSX + 32, mSY + 6 * 32, "Info Screen",   FONT_MENU_1);
-  DrawText(mSX + 32, mSY + 7 * 32, "Start Game",    FONT_MENU_1);
-  DrawText(mSX + 32, mSY + 8 * 32, "Setup",         FONT_MENU_1);
-  DrawText(mSX + 32, mSY + 9 * 32, "Quit",          FONT_MENU_1);
-
-  /* calculated after (possible) reload of custom artwork */
-  name_width  = getTextWidth(name_text,  FONT_MENU_1);
-  level_width = 9 * 32;
-
-  DrawText(mSX + 32 + name_width, mSY + 2 * 32, setup.player_name,
-          FONT_INPUT_1);
-
-  DrawText(mSX + getCurrentLevelTextPos() * 32, mSY + 3 * 32,
-          int2str(level_nr, 3), FONT_VALUE_1);
-
-  {
-    int text_height = getFontHeight(FONT_TEXT_3);
-    int xpos = getLevelRangeTextPos() * 32 + 8;
-    int ypos2 = 3 * 32 + 16;
-    int ypos1 = ypos2 - text_height;
-
-    DrawTextF(mSX - SX + xpos, mSY - SY + ypos1, FONT_TEXT_3,
-             "%03d", leveldir_current->first_level);
-    DrawTextF(mSX - SX + xpos, mSY - SY + ypos2, FONT_TEXT_3,
-             "%03d", leveldir_current->last_level);
-  }
-
-  for (i = 0; i < 8; i++)
-    initCursor(i, (i == 1 || i == 4 || i == 6 ? IMG_MENU_BUTTON_ENTER_MENU :
-                  IMG_MENU_BUTTON));
-
-  DrawTextSCentered(326, FONT_TITLE_2, PROGRAM_GAME_BY_STRING);
-#endif
-
   DrawPreviewLevel(TRUE);
 
   HandleMainMenu(0, 0, 0, 0, MB_MENU_INITIALIZE);
@@ -1525,64 +1349,30 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
   FreeScreenGadgets();
   CreateScreenGadgets();
 
-#if 0
-  BlitBitmap(drawto, window, VX, VY, VXSIZE, VYSIZE, VX, VY);
-  Delay(3000);
-#endif
-
   /* map gadgets for main menu screen */
   MapTapeButtons();
   MapScreenMenuGadgets(SCREEN_MASK_MAIN);
 
 #if 1
-  DrawMaskedBorder(REDRAW_ALL);
-#endif
-
-#if 1
-  if (redraw_mask == REDRAW_ALL)
+  if (fade_mask == REDRAW_ALL)
   {
     int door_state = GetDoorState();
 
+    // RedrawBackground();
+
     OpenDoor(door_state | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
   }
 #endif
 
-#if 0
- {
-   game_status = GAME_MODE_PSEUDO_PREVIEW;
-
-   DrawText(20, 400, "text_3.PREVIEW", FONT_TEXT_3);
-   DrawText(20, 420, "text_4.PREVIEW", FONT_TEXT_4);
-
-   game_status = GAME_MODE_MAIN;
-
-   DrawText(20, 440, "text_3.MAIN", FONT_TEXT_3);
-   DrawText(20, 460, "text_4.MAIN", FONT_TEXT_4);
- }
-#endif
+  DrawMaskedBorder(REDRAW_ALL);
 
-#if 1
-  FadeIn(redraw_mask);
-#else
-#if 1
-  if (!do_fading)
-    BackToFront();
-  else if (fading.anim_mode == ANIM_CROSSFADE)
-    FadeCross(redraw_mask);
-  else
-    FadeIn(redraw_mask);
-#else
-  if (do_fading)
-    FadeIn(redraw_mask);
-  else
-    BackToFront();
-#endif
-#endif
+  FadeIn(fade_mask);
+  FadeSetEnterMenu();
 
 #if 1
-  FadeSetEnterMenu();
-#else
-  fading = title_default;
+  /* update screen area with special editor door */
+  redraw_mask |= REDRAW_ALL;
+  BackToFront();
 #endif
 
   SetMouseCursor(CURSOR_DEFAULT);
@@ -1592,9 +1382,9 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
   OpenDoor(DOOR_CLOSE_1 | DOOR_OPEN_2);
 }
 
-void DrawAndFadeInMainMenu(int redraw_mask)
+void DrawAndFadeInMainMenu(int fade_mask)
 {
-  DrawMainMenuExt(redraw_mask, TRUE);
+  DrawMainMenuExt(fade_mask, TRUE);
 }
 
 void DrawMainMenu()
@@ -1602,7 +1392,7 @@ void DrawMainMenu()
   DrawMainMenuExt(REDRAW_ALL, FALSE);
 }
 
-#if 0
+#if defined(CREATE_SPECIAL_EDITION_RND_JUE)
 static void gotoTopLevelDir()
 {
   /* move upwards to top level directory */
@@ -1640,13 +1430,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
   static int last_sound = -1, last_music = -1;
   boolean return_to_main_menu = FALSE;
   boolean use_fading_main_menu = TRUE;
-#if 0
-#if 1
-  boolean use_cross_fading = FALSE;
-#else
-  boolean use_cross_fading = !show_title_initial;              /* default */
-#endif
-#endif
   struct TitleControlInfo *tci;
   struct TitleFadingInfo fading_default;
   struct TitleFadingInfo fading_last = fading;
@@ -1655,14 +1438,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
 
   if (button == MB_MENU_INITIALIZE)
   {
-#if 0
-    boolean use_cross_fading = (fading.anim_mode == ANIM_CROSSFADE);
-#endif
-
-#if 0
-    int last_game_status = game_status;        /* save current game status */
-#endif
-
     title_delay = 0;
     title_screen_nr = 0;
     tci = &title_controls[title_screen_nr];
@@ -1670,11 +1445,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
     last_sound = SND_UNDEFINED;
     last_music = MUS_UNDEFINED;
 
-#if 0
-    /* determine number of title screens to display (images and messages) */
-    InitializeTitleControls();
-#endif
-
     if (game_status == GAME_MODE_INFO)
     {
       if (num_title_screens == 0)
@@ -1682,12 +1452,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
        DrawInfoScreen_NotAvailable("Title screen information:",
                                    "No title screen for this level set.");
 
-#if 0
-       /* use default settings for fading, but always disable auto delay */
-       fading = title_default;
-       fading.auto_delay = -1;
-#endif
-
        return;
       }
 
@@ -1737,8 +1501,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
 
     SetMouseCursor(CURSOR_NONE);
 
-    // printf("::: mode: %d, delay: %d\n", fading.fade_mode, fading.fade_delay);
-
 #if 1
     FadeIn(REDRAW_ALL);
 #endif
@@ -1765,10 +1527,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
   }
   else if (button == MB_MENU_CHOICE)
   {
-#if 0
-    boolean use_cross_fading = (fading.anim_mode == ANIM_CROSSFADE);
-#endif
-
     if (game_status == GAME_MODE_INFO && num_title_screens == 0)
     {
 #if 0
@@ -1788,25 +1546,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
 
     if (title_screen_nr < num_title_screens)
     {
-#if 1
-#if 0
-      boolean use_cross_fading = (fading.anim_mode == ANIM_CROSSFADE);
-#endif
-#else
-      int anim_mode;
-
-      if (tci->is_image)
-       anim_mode =
-         graphic_info[getTitleScreenGraphic(tci->local_nr,
-                                            tci->initial)].anim_mode;
-      else
-       anim_mode = ANIM_FADE;  /* ??? */
-
-      use_cross_fading = (anim_mode == ANIM_FADE ? FALSE :
-                         anim_mode == ANIM_CROSSFADE ? TRUE :
-                         use_cross_fading);
-#endif
-
       sound = getTitleSound(tci);
       music = getTitleMusic(tci);
 
@@ -1839,10 +1578,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
       last_music = music;
 #endif
 
-#if 0
-      printf("::: %d -> %d\n", fading.fade_mode, fading_next.fade_mode);
-#endif
-
 #if 1
       /* last screen already faded out, next screen has no animation */
       if (!(fading.fade_mode & FADE_TYPE_TRANSFORM) &&
@@ -1867,22 +1602,6 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
     {
       FadeSoundsAndMusic();
 
-#if 0
-#if 1
-      {
-#if 0
-       boolean use_cross_fading = (fading.anim_mode == ANIM_CROSSFADE);
-#endif
-
-#if 1
-       FadeOut(REDRAW_ALL);
-#endif
-      }
-#else
-      FadeOut(REDRAW_ALL);
-#endif
-#endif
-
       return_to_main_menu = TRUE;
     }
   }
@@ -1948,13 +1667,9 @@ void HandleMainMenu_SelectLevel(int step, int direction)
 
     level_nr = new_level_nr;
 
-#if 1
     DrawText(mSX + mci->pos_text->x, mSY + mci->pos_text->y,
             int2str(level_nr, menu.main.text.level_number.size),
             mci->pos_text->font);
-#else
-    DrawText(mSX + 11 * 32, mSY + 3 * 32, int2str(level_nr, 3), FONT_VALUE_1);
-#endif
 
     LoadLevel(level_nr);
     DrawPreviewLevel(TRUE);
@@ -1969,8 +1684,6 @@ void HandleMainMenu_SelectLevel(int step, int direction)
   }
 }
 
-#if 1
-
 void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 {
   static int choice = MAIN_CONTROL_GAME;
@@ -2046,7 +1759,7 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
          SaveLevelSetup_LastSeries();
          SaveLevelSetup_SeriesInfo();
 
-#if 0
+#if defined(CREATE_SPECIAL_EDITION_RND_JUE)
          gotoTopLevelDir();
 #endif
 
@@ -2069,6 +1782,11 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
        FadeSetEnterScreen();
 
+#if 0
+       /* needed if different viewport properties defined for editor */
+       ChangeViewportPropertiesIfNeeded();
+#endif
+
        DrawLevelEd();
       }
       else if (pos == MAIN_CONTROL_INFO)
@@ -2076,15 +1794,11 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
        game_status = GAME_MODE_INFO;
        info_mode = INFO_MODE_MAIN;
 
-#if 0
-       fading = menu.navigation;
-#endif
-
        DrawInfoScreen();
       }
       else if (pos == MAIN_CONTROL_GAME)
       {
-       StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
+       StartGameActions(options.network, setup.autorecord, level.random_seed);
       }
       else if (pos == MAIN_CONTROL_SETUP)
       {
@@ -2111,129 +1825,6 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
   }
 }
 
-#else
-
-void HandleMainMenu(int mx, int my, int dx, int dy, int button)
-{
-  static int choice = 5;
-  int x = 0;
-  int y = choice;
-
-  if (button == MB_MENU_INITIALIZE)
-  {
-    drawCursor(choice, TRUE);
-
-    return;
-  }
-
-  if (mx || my)                /* mouse input */
-  {
-    x = (mx - mSX) / 32;
-    y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS;
-  }
-  else if (dx || dy)   /* keyboard input */
-  {
-    if (dx && choice == 1)
-      x = (dx < 0 ? 10 : 14);
-    else if (dx > 0)
-    {
-      if (choice == 4 || choice == 6)
-       button = MB_MENU_CHOICE;
-    }
-    else if (dy)
-      y = choice + dy;
-  }
-
-  if (y == 1 && dx != 0 && button)
-  {
-    HandleMainMenu_SelectLevel(1, dx < 0 ? -1 : +1);
-  }
-  else if (IN_VIS_FIELD(x, y) &&
-          y >= 0 && y <= 7 && (y != 1 || x < 10))
-  {
-    if (button)
-    {
-      if (y != choice)
-      {
-       drawCursor(choice, FALSE);
-       drawCursor(y, TRUE);
-
-       choice = y;
-      }
-    }
-    else
-    {
-      if (y == 0)
-      {
-       game_status = GAME_MODE_PSEUDO_TYPENAME;
-       HandleTypeName(strlen(setup.player_name), 0);
-      }
-      else if (y == 1)
-      {
-       if (leveldir_first)
-       {
-         game_status = GAME_MODE_LEVELS;
-
-         SaveLevelSetup_LastSeries();
-         SaveLevelSetup_SeriesInfo();
-
-#if 0
-         gotoTopLevelDir();
-#endif
-
-         DrawChooseLevel();
-       }
-      }
-      else if (y == 2)
-      {
-       game_status = GAME_MODE_SCORES;
-       DrawHallOfFame(-1);
-      }
-      else if (y == 3)
-      {
-       if (leveldir_current->readonly &&
-           !strEqual(setup.player_name, "Artsoft"))
-         Request("This level is read only !", REQ_CONFIRM);
-       game_status = GAME_MODE_EDITOR;
-       DrawLevelEd();
-      }
-      else if (y == 4)
-      {
-       game_status = GAME_MODE_INFO;
-       info_mode = INFO_MODE_MAIN;
-       DrawInfoScreen();
-      }
-      else if (y == 5)
-      {
-       StartGameActions(options.network, setup.autorecord, NEW_RANDOMIZE);
-      }
-      else if (y == 6)
-      {
-       game_status = GAME_MODE_SETUP;
-       setup_mode = SETUP_MODE_MAIN;
-
-       DrawSetupScreen();
-      }
-      else if (y == 7)
-      {
-       SaveLevelSetup_LastSeries();
-       SaveLevelSetup_SeriesInfo();
-
-        if (Request("Do you really want to quit ?", REQ_ASK | REQ_STAY_CLOSED))
-         game_status = GAME_MODE_QUIT;
-      }
-    }
-  }
-
-  if (game_status == GAME_MODE_MAIN)
-  {
-    DrawPreviewLevel(FALSE);
-    DoAnimation();
-  }
-}
-
-#endif
-
 
 /* ========================================================================= */
 /* info screen functions                                                     */
@@ -2244,86 +1835,58 @@ static int num_info_info;
 
 static void execInfoTitleScreen()
 {
-#if 0
-  FadeSetEnterScreen();
-#endif
-
   info_mode = INFO_MODE_TITLE;
+
   DrawInfoScreen();
 }
 
 static void execInfoElements()
 {
-#if 0
-  FadeSetEnterScreen();
-#endif
-
   info_mode = INFO_MODE_ELEMENTS;
+
   DrawInfoScreen();
 }
 
 static void execInfoMusic()
 {
-#if 0
-  FadeSetEnterScreen();
-#endif
-
   info_mode = INFO_MODE_MUSIC;
+
   DrawInfoScreen();
 }
 
 static void execInfoCredits()
 {
-#if 0
-  FadeSetEnterScreen();
-#endif
-
   info_mode = INFO_MODE_CREDITS;
+
   DrawInfoScreen();
 }
 
 static void execInfoProgram()
 {
-#if 0
-  FadeSetEnterScreen();
-#endif
-
   info_mode = INFO_MODE_PROGRAM;
+
   DrawInfoScreen();
 }
 
 static void execInfoVersion()
 {
-#if 0
-  FadeSetEnterScreen();
-#endif
-
   info_mode = INFO_MODE_VERSION;
+
   DrawInfoScreen();
 }
 
 static void execInfoLevelSet()
 {
-#if 0
-  FadeSetEnterScreen();
-#endif
-
   info_mode = INFO_MODE_LEVELSET;
+
   DrawInfoScreen();
 }
 
 static void execExitInfo()
 {
-#if 0
-  FadeSetLeaveMenu();
-#endif
-
   game_status = GAME_MODE_MAIN;
-#if 1
+
   DrawMainMenuExt(REDRAW_FIELD, FALSE);
-#else
-  DrawMainMenu();
-#endif
 }
 
 static struct TokenInfo info_info_main[] =
@@ -2356,7 +1919,7 @@ static void DrawCursorAndText_Info(int pos, boolean active)
     drawCursor(pos, active);
 }
 
-static void DrawInfoScreen_Main(int redraw_mask, boolean do_fading)
+static void DrawInfoScreen_Main(int fade_mask, boolean do_fading)
 {
   int i;
 
@@ -2369,32 +1932,31 @@ static void DrawInfoScreen_Main(int redraw_mask, boolean do_fading)
   FadeSetLeaveScreen();
 
 #if 1
-  FadeOut(redraw_mask);
+  FadeOut(fade_mask);
 #endif
 
 #if 1
-  if (redraw_mask == REDRAW_ALL)
+  if (fade_mask == REDRAW_ALL)
   {
     RedrawBackground();
+
     OpenDoor(DOOR_CLOSE_1 | DOOR_CLOSE_2 | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
   }
 #endif
 
-  ClearWindow();
+  ClearField();
 
   DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Info Screen");
 
   info_info = info_info_main;
   num_info_info = 0;
 
+#if 1
+  for (i = 0; info_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
+#else
   for (i = 0; info_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++)
-  {
-#if 0
-    int xpos = MENU_SCREEN_START_XPOS;
-    int ypos = MENU_SCREEN_START_YPOS + i;
-    int font_nr = FONT_MENU_1;
 #endif
-
+  {
     if (info_info[i].type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST))
       initCursor(i, IMG_MENU_BUTTON_ENTER_MENU);
     else if (info_info[i].type & (TYPE_LEAVE_MENU|TYPE_LEAVE_LIST))
@@ -2402,11 +1964,7 @@ static void DrawInfoScreen_Main(int redraw_mask, boolean do_fading)
     else if (info_info[i].type & ~TYPE_SKIP_ENTRY)
       initCursor(i, IMG_MENU_BUTTON);
 
-#if 1
     DrawCursorAndText_Info(i, FALSE);
-#else
-    DrawText(mSX + xpos * 32, mSY + ypos * 32, info_info[i].text, font_nr);
-#endif
 
     num_info_info++;
   }
@@ -2416,25 +1974,9 @@ static void DrawInfoScreen_Main(int redraw_mask, boolean do_fading)
   PlayMenuSound();
   PlayMenuMusic();
 
-  DrawMaskedBorder(redraw_mask);
+  DrawMaskedBorder(fade_mask);
 
-#if 1
-  FadeIn(redraw_mask);
-#else
-#if 1
-  if (!do_fading)
-    BackToFront();
-  else if (fading.anim_mode == ANIM_CROSSFADE)
-    FadeCross(redraw_mask);
-  else
-    FadeIn(redraw_mask);
-#else
-  if (do_fading)
-    FadeIn(redraw_mask);
-  else
-    BackToFront();
-#endif
-#endif
+  FadeIn(fade_mask);
 
   InitAnimation();
 }
@@ -2454,11 +1996,7 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button)
       choice++;
     choice_store[info_mode] = choice;
 
-#if 1
     DrawCursorAndText_Info(choice, TRUE);
-#else
-    drawCursor(choice, TRUE);
-#endif
 
     return;
   }
@@ -2494,7 +2032,8 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button)
 
       if (info_info[choice].type & menu_navigation_type ||
          info_info[choice].type & TYPE_ENTER_SCREEN ||
-         info_info[choice].type & TYPE_BOOLEAN_STYLE)
+         info_info[choice].type & TYPE_BOOLEAN_STYLE ||
+         info_info[choice].type & TYPE_YES_NO_AUTO)
        button = MB_MENU_CHOICE;
     }
     else if (dy)
@@ -2515,13 +2054,8 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button)
       {
        PlaySound(SND_MENU_ITEM_ACTIVATING);
 
-#if 1
        DrawCursorAndText_Info(choice, FALSE);
        DrawCursorAndText_Info(y, TRUE);
-#else
-       drawCursor(choice, FALSE);
-       drawCursor(y, TRUE);
-#endif
 
        choice = choice_store[info_mode] = y;
       }
@@ -2544,23 +2078,15 @@ void HandleInfoScreen_Main(int mx, int my, int dx, int dy, int button)
 
 void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
 {
-#if 1
   int ystart1 = mSY - SY + 100;
   int ystart2 = mSY - SY + 150;
   int ybottom = mSY - SY + SYSIZE - 20;
-#else
-  int ystart1 = 100;
-  int ystart2 = 150;
-  int ybottom = SYSIZE - 20;
-#endif
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET);
 
-#if 1
   FadeOut(REDRAW_FIELD);
-#endif
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextSCentered(ystart1, FONT_TEXT_1, text_title);
@@ -2569,9 +2095,7 @@ void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
   DrawTextSCentered(ybottom, FONT_TEXT_4,
                    "Press any key or button for info menu");
 
-#if 1
   FadeIn(REDRAW_FIELD);
-#endif
 }
 
 void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
@@ -2594,7 +2118,7 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
     for (i = 0; i < MAX_INFO_ELEMENTS_ON_SCREEN; i++)
       infoscreen_step[i] = infoscreen_frame[i] = 0;
 
-    ClearWindow();
+    ClearField();
     DrawHeadline();
 
     DrawTextSCentered(ystart1, FONT_TEXT_1, "The Game Elements:");
@@ -2704,11 +2228,7 @@ static char *getHelpText(int element, int action, int direction)
 
 void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
 {
-#if 1
   int font_nr = FONT_INFO_ELEMENTS;
-#else
-  int font_nr = FONT_LEVEL_NUMBER;
-#endif
   int font_width = getFontWidth(font_nr);
   int sx = mSX + MINI_TILEX + TILEX + MINI_TILEX;
   int sy = mSY + 65 + 2 * 32 + 1;
@@ -2736,14 +2256,9 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
   if (strlen(text) <= max_chars_per_line)      /* only one line of text */
     sy += getFontHeight(font_nr) / 2;
 
-#if 1
   DrawTextBuffer(sx, sy + ypos * ystep, text, font_nr,
-                max_chars_per_line, -1, max_lines_per_text, -1,
+                max_chars_per_line, -1, max_lines_per_text, 0, -1,
                 TRUE, FALSE, FALSE);
-#else
-  DrawTextWrapped(sx, sy + ypos * ystep, text, font_nr,
-                 max_chars_per_line, max_lines_per_text);
-#endif
 }
 
 void DrawInfoScreen_TitleScreen()
@@ -2760,18 +2275,14 @@ void DrawInfoScreen_Elements()
 {
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_ELEMENTS);
 
-#if 1
   FadeOut(REDRAW_FIELD);
-#endif
 
   LoadHelpAnimInfo();
   LoadHelpTextInfo();
 
   HandleInfoScreen_Elements(MB_MENU_INITIALIZE);
 
-#if 1
   FadeIn(REDRAW_FIELD);
-#endif
 
   InitAnimation();
 }
@@ -2828,23 +2339,24 @@ void HandleInfoScreen_Elements(int button)
     {
       FadeSoundsAndMusic();
 
-#if 0
-      FadeOut(REDRAW_FIELD);
-#endif
-
       info_mode = INFO_MODE_MAIN;
       DrawAndFadeInInfoScreen(REDRAW_FIELD);
 
       return;
     }
 
+#if 1
+    if (page > 0)
+      FadeSetNextScreen();
+#endif
+
     if (button != MB_MENU_INITIALIZE)
-      FadeCrossSaveBackbuffer();
+      FadeOut(REDRAW_FIELD);
 
     DrawInfoScreen_HelpAnim(page * anims_per_page, num_anims, TRUE);
 
     if (button != MB_MENU_INITIALIZE)
-      FadeCross(REDRAW_FIELD);
+      FadeIn(REDRAW_FIELD);
   }
   else
   {
@@ -2864,7 +2376,7 @@ void DrawInfoScreen_Music()
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   LoadMusicInfo();
@@ -2892,7 +2404,7 @@ void HandleInfoScreen_Music(int button)
     {
       FadeSoundsAndMusic();
 
-      ClearWindow();
+      ClearField();
       DrawHeadline();
 
       DrawTextSCentered(ystart1, FONT_TEXT_1,
@@ -2932,10 +2444,6 @@ void HandleInfoScreen_Music(int button)
     {
       FadeSoundsAndMusic();
 
-#if 0
-      FadeOut(REDRAW_FIELD);
-#endif
-
       info_mode = INFO_MODE_MAIN;
       DrawAndFadeInInfoScreen(REDRAW_FIELD);
 
@@ -2944,10 +2452,15 @@ void HandleInfoScreen_Music(int button)
 
     FadeSoundsAndMusic();
 
+#if 1
+    if (list != music_file_info)
+      FadeSetNextScreen();
+#endif
+
     if (button != MB_MENU_INITIALIZE)
-      FadeCrossSaveBackbuffer();
+      FadeOut(REDRAW_FIELD);
 
-    ClearWindow();
+    ClearField();
     DrawHeadline();
 
     if (list->is_sound)
@@ -3010,24 +2523,21 @@ void HandleInfoScreen_Music(int button)
                      "Press any key or button for next page");
 
     if (button != MB_MENU_INITIALIZE)
-      FadeCross(REDRAW_FIELD);
+      FadeIn(REDRAW_FIELD);
   }
 
   if (list != NULL && list->is_sound && sound_info[list->music].loop)
     PlaySoundLoop(list->music);
 }
 
-static boolean DrawInfoScreen_CreditsScreen(int screen_nr)
+static void DrawInfoScreen_CreditsScreen(int screen_nr)
 {
   int ystart1 = mSY - SY + 100;
   int ystart2 = mSY - SY + 150;
   int ybottom = mSY - SY + SYSIZE - 20;
   int ystep = 30;
 
-  if (screen_nr > 8)
-    return FALSE;
-
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextSCentered(ystart1, FONT_TEXT_1, "Credits:");
@@ -3149,8 +2659,15 @@ static boolean DrawInfoScreen_CreditsScreen(int screen_nr)
                      "Thanks to");
     DrawTextSCentered(ystart2 + 1 * ystep, FONT_TEXT_3,
                      "David Tritscher");
+#if 1
+    DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
+                     "for the code base used for the");
+    DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_2,
+                     "native Emerald Mine engine");
+#else
     DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_2,
                      "for the new Emerald Mine engine");
+#endif
   }
   else if (screen_nr == 7)
   {
@@ -3181,17 +2698,9 @@ static boolean DrawInfoScreen_CreditsScreen(int screen_nr)
     DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_3,
                      "since 1995");
   }
-#if 0
-  else
-  {
-    return FALSE;
-  }
-#endif
 
   DrawTextSCentered(ybottom, FONT_TEXT_4,
                    "Press any key or button for next page");
-
-  return TRUE;
 }
 
 void DrawInfoScreen_Credits()
@@ -3214,14 +2723,16 @@ void DrawInfoScreen_Credits()
 void HandleInfoScreen_Credits(int button)
 {
   static int screen_nr = 0;
+  int num_screens = 9;
 
   if (button == MB_MENU_INITIALIZE)
   {
     screen_nr = 0;
 
-    DrawInfoScreen_CreditsScreen(screen_nr);
+    // DrawInfoScreen_CreditsScreen(screen_nr);
   }
-  else if (button == MB_MENU_LEAVE)
+
+  if (button == MB_MENU_LEAVE)
   {
     PlaySound(SND_MENU_ITEM_SELECTING);
 
@@ -3230,33 +2741,37 @@ void HandleInfoScreen_Credits(int button)
 
     return;
   }
-  else if (button == MB_MENU_CHOICE)
+  else if (button == MB_MENU_CHOICE || button == MB_MENU_INITIALIZE)
   {
-    boolean show_screen;
-
-    PlaySound(SND_MENU_ITEM_SELECTING);
-
-    screen_nr++;
-
-    FadeCrossSaveBackbuffer();
-
-    show_screen = DrawInfoScreen_CreditsScreen(screen_nr);
-  
-    if (show_screen)
+    if (button != MB_MENU_INITIALIZE)
     {
-      FadeCross(REDRAW_FIELD);
+      PlaySound(SND_MENU_ITEM_SELECTING);
+
+      screen_nr++;
     }
-    else
+
+    if (screen_nr >= num_screens)
     {
       FadeSoundsAndMusic();
 
-#if 0
-      FadeOut(REDRAW_FIELD);
-#endif
-
       info_mode = INFO_MODE_MAIN;
       DrawAndFadeInInfoScreen(REDRAW_FIELD);
+
+      return;
     }
+
+#if 1
+    if (screen_nr > 0)
+      FadeSetNextScreen();
+#endif
+
+    if (button != MB_MENU_INITIALIZE)
+      FadeOut(REDRAW_FIELD);
+
+    DrawInfoScreen_CreditsScreen(screen_nr);
+
+    if (button != MB_MENU_INITIALIZE)
+      FadeIn(REDRAW_FIELD);
   }
   else
   {
@@ -3277,7 +2792,7 @@ void DrawInfoScreen_Program()
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextSCentered(ystart1, FONT_TEXT_1, "Program Information:");
@@ -3372,7 +2887,7 @@ void DrawInfoScreen_Version()
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextSCentered(ystart1, FONT_TEXT_1, "Version Information:");
@@ -3539,14 +3054,14 @@ void DrawInfoScreen_LevelSet()
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextCentered(mSY + 100, FONT_TEXT_1, "Level Set Information:");
 
   if (filename != NULL)
     DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi),
-                filename, tmi->font, tmi->chars, -1, tmi->lines, -1,
+                filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1,
                 tmi->autowrap, tmi->centered, tmi->parse_comments);
   else
     DrawTextCentered(mSY + ALIGNED_TEXT_YPOS(tmi), FONT_TEXT_2,
@@ -3590,7 +3105,7 @@ void HandleInfoScreen_LevelSet(int button)
   }
 }
 
-static void DrawInfoScreenExt(int redraw_mask, boolean do_fading)
+static void DrawInfoScreenExt(int fade_mask, boolean do_fading)
 {
   SetMainBackgroundImage(IMG_BACKGROUND_INFO);
 
@@ -3609,7 +3124,7 @@ static void DrawInfoScreenExt(int redraw_mask, boolean do_fading)
   else if (info_mode == INFO_MODE_LEVELSET)
     DrawInfoScreen_LevelSet();
   else
-    DrawInfoScreen_Main(redraw_mask, do_fading);
+    DrawInfoScreen_Main(fade_mask, do_fading);
 
   if (info_mode != INFO_MODE_MAIN &&
       info_mode != INFO_MODE_TITLE &&
@@ -3620,9 +3135,9 @@ static void DrawInfoScreenExt(int redraw_mask, boolean do_fading)
   }
 }
 
-void DrawAndFadeInInfoScreen(int redraw_mask)
+void DrawAndFadeInInfoScreen(int fade_mask)
 {
-  DrawInfoScreenExt(redraw_mask, TRUE);
+  DrawInfoScreenExt(fade_mask, TRUE);
 }
 
 void DrawInfoScreen()
@@ -3661,29 +3176,13 @@ void HandleTypeName(int newxpos, Key key)
 {
   static char last_player_name[MAX_PLAYER_NAME_LEN + 1];
   struct MainControlInfo *mci = getMainControlInfo(MAIN_CONTROL_NAME);
-#if 1
   struct TextPosInfo *pos = mci->pos_input;
   int startx = mSX + ALIGNED_TEXT_XPOS(pos);
   int starty = mSY + ALIGNED_TEXT_YPOS(pos);
-#endif
-#if 1
   static int xpos = 0;
-#else
-  static int xpos = 0, ypos = 2;
-#endif
   int font_nr = pos->font;
   int font_active_nr = FONT_ACTIVE(font_nr);
   int font_width = getFontWidth(font_active_nr);
-#if 1
-#if 0
-  int startx = mSX + mci->pos_input->x;
-  int starty = mSY + mci->pos_input->y;
-#endif
-#else
-  int name_width = getFontWidth(FONT_MENU_1) * strlen("Name:");
-  int startx = mSX + 32 + name_width;
-  int starty = mSY + ypos * 32;
-#endif
   char key_char = getValidConfigValueChar(getCharFromKey(key));
   boolean is_valid_key_char = (key_char != 0 && (key_char != ' ' || xpos > 0));
   boolean is_active = TRUE;
@@ -3695,15 +3194,6 @@ void HandleTypeName(int newxpos, Key key)
     strcpy(last_player_name, setup.player_name);
 
     xpos = newxpos;
-
-#if 0
-    /* add one character width for added cursor character */
-    pos->width += font_width;
-    startx = mSX + ALIGNED_TEXT_XPOS(pos);
-
-    DrawText(startx, starty, setup.player_name, font_active_nr);
-    DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
-#endif
   }
   else if (is_valid_key_char && xpos < MAX_PLAYER_NAME_LEN)
   {
@@ -3711,42 +3201,15 @@ void HandleTypeName(int newxpos, Key key)
     setup.player_name[xpos + 1] = 0;
 
     xpos++;
-
-#if 0
-    /* add one character width for added name text character */
-    pos->width += font_width;
-    startx = mSX + ALIGNED_TEXT_XPOS(pos);
-
-    DrawText(startx, starty, setup.player_name, font_active_nr);
-    DrawText(startx + xpos * font_width, starty, "_", font_active_nr);
-#endif
   }
   else if ((key == KSYM_Delete || key == KSYM_BackSpace) && xpos > 0)
   {
     xpos--;
 
     setup.player_name[xpos] = 0;
-
-#if 0
-    /* remove one character width for removed name text character */
-    pos->width -= font_width;
-    startx = mSX + ALIGNED_TEXT_XPOS(pos);
-
-    DrawText(startx, starty, setup.player_name, font_active_nr);
-    DrawText(startx + xpos * font_width, starty, "_ ", font_active_nr);
-#endif
   }
   else if (key == KSYM_Return && xpos > 0)
   {
-#if 0
-    /* remove one character width for removed cursor text character */
-    pos->width -= font_width;
-    startx = mSX + ALIGNED_TEXT_XPOS(pos);
-
-    DrawText(startx, starty, setup.player_name, font_nr);
-    DrawText(startx + xpos * font_width, starty, " ", font_active_nr);
-#endif
-
     SaveSetup();
 
     is_active = FALSE;
@@ -3797,7 +3260,7 @@ static void DrawChooseTree(TreeInfo **ti_ptr)
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
 
   HandleChooseTree(0, 0, 0, 0, MB_MENU_INITIALIZE, ti_ptr);
   MapScreenTreeGadgets(*ti_ptr);
@@ -4006,11 +3469,8 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
     else
     {
       game_status = GAME_MODE_MAIN;
-#if 1
+
       DrawMainMenuExt(REDRAW_FIELD, FALSE);
-#else
-      DrawMainMenu();
-#endif
     }
 
     return;
@@ -4259,7 +3719,7 @@ static void drawHallOfFameList(int first_entry, int highlight_position)
   int i;
 
   SetMainBackgroundImage(IMG_BACKGROUND_SCORES);
-  ClearWindow();
+  ClearField();
 
   DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, "Hall Of Fame");
   DrawTextFCentered(MENU_TITLE2_YPOS, FONT_TITLE_2,
@@ -4379,20 +3839,13 @@ static char *music_set_name;
 
 static void execSetupMain()
 {
-#if 0
-  FadeSetLeaveMenu();
-#endif
-
   setup_mode = SETUP_MODE_MAIN;
+
   DrawSetupScreen();
 }
 
 static void execSetupGame()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   if (game_speeds == NULL)
   {
     int i;
@@ -4441,35 +3894,26 @@ static void execSetupGame()
   game_speed_text = game_speed_current->name;
 
   setup_mode = SETUP_MODE_GAME;
+
   DrawSetupScreen();
 }
 
 static void execSetupChooseGameSpeed()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_CHOOSE_GAME_SPEED;
+
   DrawSetupScreen();
 }
 
 static void execSetupEditor()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_EDITOR;
+
   DrawSetupScreen();
 }
 
 static void execSetupGraphics()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   if (video.fullscreen_available && screen_modes == NULL)
   {
     int i;
@@ -4581,41 +4025,35 @@ static void execSetupGraphics()
 
 static void execSetupChooseScreenMode()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   if (!video.fullscreen_available)
     return;
 
   setup_mode = SETUP_MODE_CHOOSE_SCREEN_MODE;
+
   DrawSetupScreen();
 }
 
 static void execSetupChooseScrollDelay()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_CHOOSE_SCROLL_DELAY;
+
   DrawSetupScreen();
 }
 
 static void execSetupSound()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_SOUND;
+
   DrawSetupScreen();
 }
 
 static void execSetupArtwork()
 {
 #if 0
-  FadeSetEnterMenu();
+  printf("::: '%s', '%s', '%s'\n",
+        artwork.gfx_current->subdir,
+        artwork.gfx_current->fullpath,
+        artwork.gfx_current->basepath);
 #endif
 
   setup.graphics_set = artwork.gfx_current->identifier;
@@ -4631,81 +4069,85 @@ static void execSetupArtwork()
   music_set_name = artwork.mus_current->name;
 
   setup_mode = SETUP_MODE_ARTWORK;
+
   DrawSetupScreen();
 }
 
 static void execSetupChooseGraphics()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_CHOOSE_GRAPHICS;
+
   DrawSetupScreen();
 }
 
 static void execSetupChooseSounds()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_CHOOSE_SOUNDS;
+
   DrawSetupScreen();
 }
 
 static void execSetupChooseMusic()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_CHOOSE_MUSIC;
+
   DrawSetupScreen();
 }
 
 static void execSetupInput()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_INPUT;
+
   DrawSetupScreen();
 }
 
-static void execSetupShortcuts1()
+static void execSetupShortcuts()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
+  setup_mode = SETUP_MODE_SHORTCUTS;
 
+  DrawSetupScreen();
+}
+
+static void execSetupShortcuts1()
+{
   setup_mode = SETUP_MODE_SHORTCUTS_1;
+
   DrawSetupScreen();
 }
 
 static void execSetupShortcuts2()
 {
-#if 0
-  FadeSetEnterMenu();
-#endif
-
   setup_mode = SETUP_MODE_SHORTCUTS_2;
+
   DrawSetupScreen();
 }
 
-static void execExitSetup()
+static void execSetupShortcuts3()
 {
-#if 0
-  FadeSetLeaveMenu();
-#endif
+  setup_mode = SETUP_MODE_SHORTCUTS_3;
+
+  DrawSetupScreen();
+}
+
+static void execSetupShortcuts4()
+{
+  setup_mode = SETUP_MODE_SHORTCUTS_4;
+
+  DrawSetupScreen();
+}
+
+static void execSetupShortcuts5()
+{
+  setup_mode = SETUP_MODE_SHORTCUTS_5;
 
+  DrawSetupScreen();
+}
+
+static void execExitSetup()
+{
   game_status = GAME_MODE_MAIN;
-#if 1
+
   DrawMainMenuExt(REDRAW_FIELD, FALSE);
-#else
-  DrawMainMenu();
-#endif
 }
 
 static void execSaveAndExitSetup()
@@ -4722,8 +4164,7 @@ static struct TokenInfo setup_info_main[] =
   { TYPE_ENTER_MENU,   execSetupSound,         "Sound & Music"         },
   { TYPE_ENTER_MENU,   execSetupArtwork,       "Custom Artwork"        },
   { TYPE_ENTER_MENU,   execSetupInput,         "Input Devices"         },
-  { TYPE_ENTER_MENU,   execSetupShortcuts1,    "Key Shortcuts 1"       },
-  { TYPE_ENTER_MENU,   execSetupShortcuts2,    "Key Shortcuts 2"       },
+  { TYPE_ENTER_MENU,   execSetupShortcuts,     "Key Shortcuts"         },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execExitSetup,          "Exit"                  },
   { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   "Save and Exit"         },
@@ -4792,7 +4233,6 @@ static struct TokenInfo setup_info_graphics[] =
   { TYPE_STRING,       &scroll_delay_text,     ""                      },
 #if 0
   { TYPE_SWITCH,       &setup.soft_scrolling,  "Soft Scrolling:"       },
-  { TYPE_SWITCH,       &setup.double_buffering,"Double-Buffering:"     },
 #endif
   { TYPE_SWITCH,       &setup.fade_screens,    "Fade Screens:"         },
   { TYPE_SWITCH,       &setup.quick_switch,    "Quick Player Focus Switch:" },
@@ -4800,6 +4240,7 @@ static struct TokenInfo setup_info_graphics[] =
   { TYPE_SWITCH,       &setup.show_titlescreen,"Show Title Screens:"   },
   { TYPE_SWITCH,       &setup.toons,           "Show Toons:"           },
   { TYPE_ECS_AGA,      &setup.prefer_aga_graphics,"EMC graphics preference:" },
+  { TYPE_SWITCH, &setup.sp_show_border_elements,"Supaplex Border Elements:" },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
 
@@ -4827,9 +4268,16 @@ static struct TokenInfo setup_info_artwork[] =
   { TYPE_STRING,       &music_set_name,        ""                      },
   { TYPE_EMPTY,                NULL,                   ""                      },
 #if 1
+#if 1
+  { TYPE_YES_NO_AUTO,&setup.override_level_graphics,"Override Level Graphics:"},
+  { TYPE_YES_NO_AUTO,&setup.override_level_sounds,  "Override Level Sounds:"  },
+  { TYPE_YES_NO_AUTO,&setup.override_level_music,   "Override Level Music:"   },
+#else
   { TYPE_YES_NO, &setup.override_level_graphics,"Override Level Graphics:" },
   { TYPE_YES_NO, &setup.override_level_sounds, "Override Level Sounds:"   },
   { TYPE_YES_NO, &setup.override_level_music,  "Override Level Music:"    },
+  { TYPE_YES_NO, &setup.auto_override_artwork, "Auto-Override Non-CE Sets:" },
+#endif
 #else
   { TYPE_STRING,       NULL,                   "Override Level Artwork:"},
   { TYPE_YES_NO,       &setup.override_level_graphics, "Graphics:"     },
@@ -4862,6 +4310,19 @@ static struct TokenInfo setup_info_input[] =
   { 0,                 NULL,                   NULL                    }
 };
 
+static struct TokenInfo setup_info_shortcuts[] =
+{
+  { TYPE_ENTER_MENU,   execSetupShortcuts1,    "Various Keys"          },
+  { TYPE_ENTER_MENU,   execSetupShortcuts2,    "Player Focus"          },
+  { TYPE_ENTER_MENU,   execSetupShortcuts3,    "Tape Buttons"          },
+  { TYPE_ENTER_MENU,   execSetupShortcuts4,    "Sound & Music"         },
+  { TYPE_ENTER_MENU,   execSetupShortcuts5,    "TAS Snap Keys"         },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
+
+  { 0,                 NULL,                   NULL                    }
+};
+
 static struct TokenInfo setup_info_shortcuts_1[] =
 {
   { TYPE_KEYTEXT,      NULL,           "Quick Save Game to Tape:",     },
@@ -4874,7 +4335,7 @@ static struct TokenInfo setup_info_shortcuts_1[] =
   { TYPE_YES_NO,       &setup.ask_on_escape,   "Ask on 'Esc' Key:"     },
   { TYPE_YES_NO, &setup.ask_on_escape_editor,  "Ask on 'Esc' Key (Editor):" },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
+  { TYPE_LEAVE_MENU,   execSetupShortcuts,     "Back"                  },
 
   { 0,                 NULL,                   NULL                    }
 };
@@ -4892,7 +4353,57 @@ static struct TokenInfo setup_info_shortcuts_2[] =
   { TYPE_KEYTEXT,      NULL,           "Set Focus to All Players:",    },
   { TYPE_KEY,          &setup.shortcut.focus_player_all, ""            },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
+  { TYPE_LEAVE_MENU,   execSetupShortcuts,     "Back"                  },
+
+  { 0,                 NULL,                   NULL                    }
+};
+
+static struct TokenInfo setup_info_shortcuts_3[] =
+{
+  { TYPE_KEYTEXT,      NULL,                   "Eject Tape:",          },
+  { TYPE_KEY,          &setup.shortcut.tape_eject, ""                  },
+  { TYPE_KEYTEXT,      NULL,                   "Warp / Single Step:",  },
+  { TYPE_KEY,          &setup.shortcut.tape_extra, ""                  },
+  { TYPE_KEYTEXT,      NULL,                   "Stop Tape:",           },
+  { TYPE_KEY,          &setup.shortcut.tape_stop, ""                   },
+  { TYPE_KEYTEXT,      NULL,                   "Pause / Unpause Tape:",},
+  { TYPE_KEY,          &setup.shortcut.tape_pause, ""                  },
+  { TYPE_KEYTEXT,      NULL,                   "Record Tape:",         },
+  { TYPE_KEY,          &setup.shortcut.tape_record, ""                 },
+  { TYPE_KEYTEXT,      NULL,                   "Play Tape:",           },
+  { TYPE_KEY,          &setup.shortcut.tape_play, ""                   },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupShortcuts,     "Back"                  },
+
+  { 0,                 NULL,                   NULL                    }
+};
+
+static struct TokenInfo setup_info_shortcuts_4[] =
+{
+  { TYPE_KEYTEXT,      NULL,           "Toggle Sound Effects (Normal):", },
+  { TYPE_KEY,          &setup.shortcut.sound_simple, ""                },
+  { TYPE_KEYTEXT,      NULL,           "Toggle Sound Effects (Looping):", },
+  { TYPE_KEY,          &setup.shortcut.sound_loops, ""                 },
+  { TYPE_KEYTEXT,      NULL,           "Toggle Music:",                },
+  { TYPE_KEY,          &setup.shortcut.sound_music, ""                 },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupShortcuts,     "Back"                  },
+
+  { 0,                 NULL,                   NULL                    }
+};
+
+static struct TokenInfo setup_info_shortcuts_5[] =
+{
+  { TYPE_KEYTEXT,      NULL,                   "Snap Left:",           },
+  { TYPE_KEY,          &setup.shortcut.snap_left, ""                   },
+  { TYPE_KEYTEXT,      NULL,                   "Snap Right:",          },
+  { TYPE_KEY,          &setup.shortcut.snap_right, ""                  },
+  { TYPE_KEYTEXT,      NULL,                   "Snap Up:",             },
+  { TYPE_KEY,          &setup.shortcut.snap_up, ""                     },
+  { TYPE_KEYTEXT,      NULL,                   "Snap Down:",           },
+  { TYPE_KEY,          &setup.shortcut.snap_down, ""                   },
+  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_LEAVE_MENU,   execSetupShortcuts,     "Back"                  },
 
   { 0,                 NULL,                   NULL                    }
 };
@@ -4946,11 +4457,12 @@ static Key getSetupKey()
 
 static int getSetupTextFont(int type)
 {
-  if (type & (TYPE_SWITCH |
-             TYPE_YES_NO |
-             TYPE_STRING |
-             TYPE_ECS_AGA |
-             TYPE_KEYTEXT |
+  if (type & (TYPE_SWITCH      |
+             TYPE_YES_NO       |
+             TYPE_YES_NO_AUTO  |
+             TYPE_STRING       |
+             TYPE_ECS_AGA      |
+             TYPE_KEYTEXT      |
              TYPE_ENTER_LIST))
     return FONT_MENU_2;
   else
@@ -4967,6 +4479,9 @@ static int getSetupValueFont(int type, void *value)
     return FONT_VALUE_1;
   else if (type & TYPE_BOOLEAN_STYLE)
     return (*(boolean *)value ? FONT_OPTION_ON : FONT_OPTION_OFF);
+  else if (type & TYPE_YES_NO_AUTO)
+    return (*(int *)value == AUTO  ? FONT_OPTION_ON :
+           *(int *)value == FALSE ? FONT_OPTION_OFF : FONT_OPTION_ON);
   else
     return FONT_VALUE_1;
 }
@@ -4979,11 +4494,13 @@ static void drawSetupValue(int pos)
   int ypos = MENU_SCREEN_START_YPOS + pos;
   int startx = mSX + xpos * 32;
   int starty = mSY + ypos * 32;
-  int font_nr, font_width;
+  int font_nr, font_width, font_height;
   int type = setup_info[pos].type;
   void *value = setup_info[pos].value;
   char *value_string = getSetupValue(type, value);
+#if 1
   int i;
+#endif
 
   if (value_string == NULL)
     return;
@@ -4993,9 +4510,7 @@ static void drawSetupValue(int pos)
     xpos = MENU_SCREEN_START_XPOS;
 
     if (type & TYPE_QUERY)
-    {
       value_string = "<press key>";
-    }
   }
   else if (type & TYPE_STRING)
   {
@@ -5006,11 +4521,16 @@ static void drawSetupValue(int pos)
     if (strlen(value_string) > max_value_len)
       value_string[max_value_len] = '\0';
   }
+  else if (type & TYPE_YES_NO_AUTO)
+  {
+    xpos = MENU_SCREEN_VALUE_XPOS - 1;
+  }
 
   startx = mSX + xpos * 32;
   starty = mSY + ypos * 32;
   font_nr = getSetupValueFont(type, value);
   font_width = getFontWidth(font_nr);
+  font_height = getFontHeight(font_nr);
 
   /* downward compatibility correction for Juergen Bonhagen's menu settings */
   if (setup_mode != SETUP_MODE_INPUT)
@@ -5047,8 +4567,12 @@ static void drawSetupValue(int pos)
     }
   }
 
+#if 0
+  DrawBackground(startx, starty, SX + SXSIZE - startx, font_height);
+#else
   for (i = 0; i <= MENU_SCREEN_MAX_XPOS - xpos; i++)
     DrawText(startx + i * font_width, starty, " ", font_nr);
+#endif
 
   DrawText(startx, starty, value_string, font_nr);
 
@@ -5056,12 +4580,21 @@ static void drawSetupValue(int pos)
     getFontBitmapInfo(font_nr)->draw_xoffset = font_draw_xoffset_old;
 }
 
-static void changeSetupValue(int pos)
+static void changeSetupValue(int pos, int dx)
 {
   if (setup_info[pos].type & TYPE_BOOLEAN_STYLE)
   {
     *(boolean *)setup_info[pos].value ^= TRUE;
   }
+  else if (setup_info[pos].type & TYPE_YES_NO_AUTO)
+  {
+    *(int *)setup_info[pos].value =
+      (dx == -1 ?
+       (*(int *)setup_info[pos].value == AUTO ? TRUE :
+       *(int *)setup_info[pos].value == TRUE ? FALSE : AUTO) :
+       (*(int *)setup_info[pos].value == TRUE ? AUTO :
+       *(int *)setup_info[pos].value == AUTO ? FALSE : TRUE));
+  }
   else if (setup_info[pos].type & TYPE_KEY)
   {
     Key key;
@@ -5098,17 +4631,30 @@ static void DrawCursorAndText_Setup(int pos, boolean active)
 
 static void DrawSetupScreen_Generic()
 {
+  boolean redraw_all = FALSE;
   char *title_string = NULL;
   int i;
 
   UnmapAllGadgets();
   CloseDoor(DOOR_CLOSE_2);
 
-#if 1
+  if (redraw_mask & REDRAW_ALL)
+    redraw_all = TRUE;
+
+#if 0
+  printf("::: %s\n", (redraw_mask & REDRAW_FIELD ? "REDRAW_FIELD" :
+                     redraw_mask & REDRAW_ALL ? "REDRAW_ALL" :
+                     int2str(0, redraw_mask)));
+#endif
+
+#if 0
+  /* !!! usually REDRAW_NONE => DOES NOT WORK (with fade) => CHECK THIS !!! */
+  FadeOut(redraw_mask);
+#else
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
 
   if (setup_mode == SETUP_MODE_MAIN)
   {
@@ -5140,6 +4686,11 @@ static void DrawSetupScreen_Generic()
     setup_info = setup_info_artwork;
     title_string = "Custom Artwork";
   }
+  else if (setup_mode == SETUP_MODE_SHORTCUTS)
+  {
+    setup_info = setup_info_shortcuts;
+    title_string = "Setup Shortcuts";
+  }
   else if (setup_mode == SETUP_MODE_SHORTCUTS_1)
   {
     setup_info = setup_info_shortcuts_1;
@@ -5150,19 +4701,32 @@ static void DrawSetupScreen_Generic()
     setup_info = setup_info_shortcuts_2;
     title_string = "Setup Shortcuts";
   }
+  else if (setup_mode == SETUP_MODE_SHORTCUTS_3)
+  {
+    setup_info = setup_info_shortcuts_3;
+    title_string = "Setup Shortcuts";
+  }
+  else if (setup_mode == SETUP_MODE_SHORTCUTS_4)
+  {
+    setup_info = setup_info_shortcuts_4;
+    title_string = "Setup Shortcuts";
+  }
+  else if (setup_mode == SETUP_MODE_SHORTCUTS_5)
+  {
+    setup_info = setup_info_shortcuts_5;
+    title_string = "Setup Shortcuts";
+  }
 
   DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, title_string);
 
   num_setup_info = 0;
-  for (i = 0; setup_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++)
-  {
-    void *value_ptr = setup_info[i].value;
 #if 1
+  for (i = 0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
 #else
-    int xpos = MENU_SCREEN_START_XPOS;
-    int ypos = MENU_SCREEN_START_YPOS + i;
-    int font_nr;
+  for (i = 0; setup_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++)
 #endif
+  {
+    void *value_ptr = setup_info[i].value;
 
     /* set some entries to "unchangeable" according to other variables */
     if ((value_ptr == &setup.sound_simple && !audio.sound_available) ||
@@ -5179,13 +4743,7 @@ static void DrawSetupScreen_Generic()
     else if (setup_info[i].type & ~TYPE_SKIP_ENTRY)
       initCursor(i, IMG_MENU_BUTTON);
 
-#if 1
     DrawCursorAndText_Setup(i, FALSE);
-#else
-    font_nr = getSetupTextFont(setup_info[i].type);
-
-    DrawText(mSX + xpos * 32, mSY + ypos * 32, setup_info[i].text, font_nr);
-#endif
 
     if (setup_info[i].type & TYPE_VALUE)
       drawSetupValue(i);
@@ -5202,7 +4760,12 @@ static void DrawSetupScreen_Generic()
   HandleSetupScreen_Generic(0, 0, 0, 0, MB_MENU_INITIALIZE);
 #endif
 
+  if (redraw_all)
+    redraw_mask = REDRAW_ALL;
+
 #if 1
+  FadeIn(redraw_mask);
+#else
   FadeIn(REDRAW_FIELD);
 #endif
 
@@ -5227,11 +4790,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
       choice++;
     choice_store[setup_mode] = choice;
 
-#if 1
     DrawCursorAndText_Setup(choice, TRUE);
-#else
-    drawCursor(choice, TRUE);
-#endif
 
     return;
   }
@@ -5268,7 +4827,8 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
       int menu_navigation_type = (dx < 0 ? TYPE_LEAVE : TYPE_ENTER);
 
       if (setup_info[choice].type & menu_navigation_type ||
-         setup_info[choice].type & TYPE_BOOLEAN_STYLE)
+         setup_info[choice].type & TYPE_BOOLEAN_STYLE ||
+         setup_info[choice].type & TYPE_YES_NO_AUTO)
        button = MB_MENU_CHOICE;
     }
     else if (dy)
@@ -5288,13 +4848,8 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
       {
        PlaySound(SND_MENU_ITEM_ACTIVATING);
 
-#if 1
        DrawCursorAndText_Setup(choice, FALSE);
        DrawCursorAndText_Setup(y, TRUE);
-#else
-       drawCursor(choice, FALSE);
-       drawCursor(y, TRUE);
-#endif
 
        choice = choice_store[setup_mode] = y;
       }
@@ -5324,7 +4879,7 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
       else
       {
        if (setup_info[y].type & TYPE_VALUE)
-         changeSetupValue(y);
+         changeSetupValue(y, dx);
       }
     }
   }
@@ -5332,15 +4887,13 @@ void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
 
 void DrawSetupScreen_Input()
 {
-#if 1
   int i;
-#endif
 
 #if 1
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
 
 #if 1
   setup_info = setup_info_input;
@@ -5349,7 +4902,20 @@ void DrawSetupScreen_Input()
   DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Setup Input");
 
 #if 1
+#if 1
+  DrawTextSCentered(SYSIZE - 20, FONT_TITLE_2,
+                   "Joysticks deactivated on this screen");
+#else
+  DrawTextSCentered(SYSIZE - 20, FONT_TEXT_4,
+                   "Joysticks deactivated on this screen");
+#endif
+#endif
+
+#if 1
+  for (i = 0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
+#else
   for (i = 0; setup_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++)
+#endif
   {
     if (setup_info[i].type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST))
       initCursor(i, IMG_MENU_BUTTON_ENTER_MENU);
@@ -5360,23 +4926,19 @@ void DrawSetupScreen_Input()
 
     DrawCursorAndText_Setup(i, FALSE);
   }
-#else
-  initCursor(0,  IMG_MENU_BUTTON);
-  initCursor(1,  IMG_MENU_BUTTON);
-  initCursor(2,  IMG_MENU_BUTTON_ENTER_MENU);
-  initCursor(13, IMG_MENU_BUTTON_LEAVE_MENU);
-
-  DrawText(mSX + 32, mSY +  2 * 32, "Player:", FONT_MENU_1);
-  DrawText(mSX + 32, mSY +  3 * 32, "Device:", FONT_MENU_1);
-  DrawText(mSX + 32, mSY + 15 * 32, "Back",   FONT_MENU_1);
-#endif
 
 #if 0
   DeactivateJoystickForCalibration();
 #endif
+
+#if 0
 #if 1
+  DrawTextSCentered(SYSIZE - 20, FONT_TITLE_2,
+                   "Joysticks deactivated on this screen");
+#else
   DrawTextSCentered(SYSIZE - 20, FONT_TEXT_4,
                    "Joysticks deactivated on this screen");
+#endif
 #endif
 
   /* create gadgets for setup input menu screen */
@@ -5531,11 +5093,7 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button)
   {
     drawPlayerSetupInputInfo(input_player_nr, (choice == 2));
 
-#if 1
     DrawCursorAndText_Setup(choice, TRUE);
-#else
-    drawCursor(choice, TRUE);
-#endif
 
     return;
   }
@@ -5580,15 +5138,10 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button)
     {
       if (y != choice)
       {
-#if 1
        DrawCursorAndText_Setup(choice, FALSE);
        DrawCursorAndText_Setup(y, TRUE);
 
        drawPlayerSetupInputInfo(input_player_nr, (y == 2));
-#else
-       drawCursor(choice, FALSE);
-       drawCursor(y, TRUE);
-#endif
 
        choice = y;
       }
@@ -5668,7 +5221,7 @@ void CustomizeKeyboard(int player_nr)
   FadeSetEnterMenu();
   FadeOut(REDRAW_FIELD);
 
-  ClearWindow();
+  ClearField();
 
   DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Keyboard Input");
 
@@ -5811,7 +5364,7 @@ static boolean CalibrateJoystickMain(int player_nr)
   FadeSetEnterMenu();
   FadeOut(REDRAW_FIELD);
 
-  ClearWindow();
+  ClearField();
 
   for (y = 0; y < 3; y++)
   {
@@ -5843,11 +5396,7 @@ static boolean CalibrateJoystickMain(int player_nr)
 
   DrawGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_RED, 0);
 
-#if 1
   FadeIn(REDRAW_FIELD);
-#else
-  BackToFront();
-#endif
 
   while (Joystick(player_nr) & JOY_BUTTON);    /* wait for released button */
   InitAnimation();
@@ -5990,7 +5539,7 @@ void CalibrateJoystick(int player_nr)
     int xpos = mSX - SX;
     int ypos = mSY - SY;
 
-    ClearWindow();
+    ClearField();
 
     DrawTextF(xpos + 16, ypos + 6 * 32, FONT_TITLE_1, "   JOYSTICK %d   ", nr);
     DrawTextF(xpos + 16, ypos + 7 * 32, FONT_TITLE_1, " NOT AVAILABLE! ");
@@ -6165,13 +5714,21 @@ static struct
 {
   {
     IMG_MENU_BUTTON_UP, IMG_MENU_BUTTON_UP_ACTIVE,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     SC_SCROLL_UP_XPOS, SC_SCROLL_UP_YPOS,
+#endif
     SCREEN_CTRL_ID_SCROLL_UP,
     "scroll up"
   },
   {
     IMG_MENU_BUTTON_DOWN, IMG_MENU_BUTTON_DOWN_ACTIVE,
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     SC_SCROLL_DOWN_XPOS, SC_SCROLL_DOWN_YPOS,
+#endif
     SCREEN_CTRL_ID_SCROLL_DOWN,
     "scroll down"
   }
@@ -6197,8 +5754,13 @@ static struct
 #else
     IMG_MENU_SCROLLBAR, IMG_MENU_SCROLLBAR_ACTIVE,
 #endif
+#if 1
+    -1, -1,    /* these values are not constant, but can change at runtime */
+    -1, -1,    /* these values are not constant, but can change at runtime */
+#else
     SC_SCROLL_VERTICAL_XPOS, SC_SCROLL_VERTICAL_YPOS,
     SC_SCROLL_VERTICAL_XSIZE, SC_SCROLL_VERTICAL_YSIZE,
+#endif
     GD_TYPE_SCROLLBAR_VERTICAL,
     SCREEN_CTRL_ID_SCROLL_VERTICAL,
     "scroll level series vertically"
@@ -6264,6 +5826,12 @@ static void CreateScreenScrollbuttons()
   unsigned long event_mask;
   int i;
 
+  /* these values are not constant, but can change at runtime */
+  scrollbutton_info[0].x = SC_SCROLL_UP_XPOS;
+  scrollbutton_info[0].y = SC_SCROLL_UP_YPOS;
+  scrollbutton_info[1].x = SC_SCROLL_DOWN_XPOS;
+  scrollbutton_info[1].y = SC_SCROLL_DOWN_YPOS;
+
   for (i = 0; i < NUM_SCREEN_SCROLLBUTTONS; i++)
   {
     Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed;
@@ -6319,6 +5887,12 @@ static void CreateScreenScrollbars()
 {
   int i;
 
+  /* these values are not constant, but can change at runtime */
+  scrollbar_info[0].x = SC_SCROLL_VERTICAL_XPOS;
+  scrollbar_info[0].y = SC_SCROLL_VERTICAL_YPOS;
+  scrollbar_info[0].width  = SC_SCROLL_VERTICAL_XSIZE;
+  scrollbar_info[0].height = SC_SCROLL_VERTICAL_YSIZE;
+
   for (i = 0; i < NUM_SCREEN_SCROLLBARS; i++)
   {
     Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed;