rocksndiamonds-3.3.1.1
[rocksndiamonds.git] / src / screens.c
index 3bc6c2b3ef1b50e7b1f5204d027e58be01636da6..8c38785210b777bfdcb744723d2b1faf4a1d25a4 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 MAX_SETUP_MODES                        17
+#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 SETUP_MODE_CHOOSE_VOLUME_SIMPLE        21
+#define SETUP_MODE_CHOOSE_VOLUME_LOOPS 22
+#define SETUP_MODE_CHOOSE_VOLUME_MUSIC 23
+
+#define MAX_SETUP_MODES                        24
 
 /* 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 *);
@@ -156,10 +141,12 @@ static void CustomizeKeyboard(int);
 static void CalibrateJoystick(int);
 static void execSetupGame(void);
 static void execSetupGraphics(void);
+static void execSetupSound(void);
 static void execSetupArtwork(void);
 static void HandleChooseTree(int, int, int, int, int, TreeInfo **);
 
-static void DrawChooseLevel(void);
+static void DrawChooseLevelSet(void);
+static void DrawChooseLevelNr(void);
 static void DrawInfoScreen(void);
 static void DrawAndFadeInInfoScreen(int);
 static void DrawSetupScreen(void);
@@ -193,6 +180,18 @@ static TreeInfo *scroll_delay_current = NULL;
 static TreeInfo *game_speeds = NULL;
 static TreeInfo *game_speed_current = NULL;
 
+static TreeInfo *volumes_simple = NULL;
+static TreeInfo *volume_simple_current = NULL;
+
+static TreeInfo *volumes_loops = NULL;
+static TreeInfo *volume_loops_current = NULL;
+
+static TreeInfo *volumes_music = NULL;
+static TreeInfo *volume_music_current = NULL;
+
+static TreeInfo *level_number = NULL;
+static TreeInfo *level_number_current = NULL;
+
 static struct
 {
   int value;
@@ -243,6 +242,27 @@ static struct
   {    -1,     NULL                            },
 };
 
+static struct
+{
+  int value;
+  char *text;
+} volumes_list[] =
+{
+  {    0,      "0 %"                           },
+  {    10,     "10 %"                          },
+  {    20,     "20 %"                          },
+  {    30,     "30 %"                          },
+  {    40,     "40 %"                          },
+  {    50,     "50 %"                          },
+  {    60,     "60 %"                          },
+  {    70,     "70 %"                          },
+  {    80,     "80 %"                          },
+  {    90,     "90 %"                          },
+  {    100,    "100 %"                         },
+
+  {    -1,     NULL                            },
+};
+
 #define DRAW_MODE(s)           ((s) >= GAME_MODE_MAIN &&               \
                                 (s) <= GAME_MODE_SETUP ? (s) :         \
                                 (s) == GAME_MODE_PSEUDO_TYPENAME ?     \
@@ -254,7 +274,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 :            \
@@ -778,11 +798,13 @@ static void InitializeTitleControls(boolean show_title_initial)
 {
   num_title_screens = 0;
 
-#if 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 */
@@ -883,8 +905,13 @@ static void InitializeMainControls()
 
     if (pos_text != NULL)              /* (x/y may be -1/-1 here) */
     {
+#if 1
+      /* calculate size for non-clickable text -- needed for text alignment */
+      boolean calculate_text_size = (pos_button == NULL && text != NULL);
+#else
       /* calculate width for non-clickable text -- needed for text alignment */
       boolean calculate_text_width = (pos_button == NULL && text != NULL);
+#endif
 
       if (visibleMenuPos(pos_button))
       {
@@ -894,10 +921,17 @@ static void InitializeMainControls()
          pos_text->y = pos_button->y;
       }
 
+#if 1
+      if (pos_text->width == -1 || calculate_text_size)
+       pos_text->width = text_width;
+      if (pos_text->height == -1 || calculate_text_size)
+       pos_text->height = text_height;
+#else
       if (pos_text->width == -1 || calculate_text_width)
        pos_text->width = text_width;
       if (pos_text->height == -1)
        pos_text->height = text_height;
+#endif
     }
 
     if (pos_input != NULL)             /* (x/y may be -1/-1 here) */
@@ -961,7 +995,7 @@ static void DrawCursorAndText_Main_Ext(int nr, boolean active_text,
        int y = mSY + pos->y;
 
        DrawBackgroundForGraphic(x, y, pos->width, pos->height, button_graphic);
-       DrawGraphicThruMaskExt(drawto, x, y, button_graphic, 0);
+       DrawFixedGraphicThruMaskExt(drawto, x, y, button_graphic, 0);
       }
 
       if (visibleTextPos(pos_text) && text != NULL)
@@ -1036,13 +1070,24 @@ static boolean insideTextPosRect(struct TextPosInfo *rect, int x, int y)
   int rect_x = ALIGNED_TEXT_XPOS(rect);
   int rect_y = ALIGNED_TEXT_YPOS(rect);
 
+#if 0
+  printf("::: insideTextPosRect: (%d, %d), (%d, %d) [%d, %d] (%d, %d) => %d\n",
+        x, y, rect_x, rect_y, rect->x, rect->y, rect->width, rect->height,
+        (x >= rect_x && x < rect_x + rect->width &&
+         y >= rect_y && y < rect_y + rect->height));
+#endif
+
   return (x >= rect_x && x < rect_x + rect->width &&
          y >= rect_y && y < rect_y + rect->height);
 }
 
 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);
 
@@ -1058,7 +1103,7 @@ static void drawCursorExt(int xpos, int ypos, boolean active, int graphic)
     graphic = BUTTON_ACTIVE(graphic);
 
   DrawBackgroundForGraphic(x, y, TILEX, TILEY, graphic);
-  DrawGraphicThruMaskExt(drawto, x, y, graphic, 0);
+  DrawFixedGraphicThruMaskExt(drawto, x, y, graphic, 0);
 }
 
 static void initCursor(int ypos, int graphic)
@@ -1130,16 +1175,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)
@@ -1169,52 +1208,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)
@@ -1240,22 +1247,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 */
 }
@@ -1290,18 +1284,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;
-  boolean redraw_all = FALSE;
 
   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();
@@ -1325,13 +1315,6 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
     return;
   }
 
-#if 0
-  FadeOut(redraw_mask);
-
-  /* needed if last screen was the editor screen */
-  UndrawSpecialEditorDoor();
-#endif
-
   /* needed if last screen was the setup screen and fullscreen state changed */
   ToggleFullscreenIfNeeded();
 
@@ -1345,23 +1328,28 @@ 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 (redraw_mask & REDRAW_ALL)
-    redraw_all = TRUE;
+    fade_mask = REDRAW_ALL;
 
 #if 1
+  FadeOut(fade_mask);
+
+  /* needed if last screen was the editor screen */
+  UndrawSpecialEditorDoor();
 #if 0
-  printf("::: FadeOut @ DrawMainMenuExt ...\n");
+  if (fade_mask == REDRAW_FIELD)
+    BackToFront();
 #endif
-  FadeOut(redraw_mask);
-#if 0
-  printf("::: FadeOut @ DrawMainMenuExt done\n");
 #endif
 
-  /* needed if last screen was the editor screen */
-  UndrawSpecialEditorDoor();
+#if 1
+  /* needed if different viewport properties defined for menues */
+  ChangeViewportPropertiesIfNeeded();
 #endif
 
 #if defined(TARGET_SDL)
@@ -1382,15 +1370,12 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
     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)
   {
     // int door_state = GetDoorState();
 
@@ -1400,7 +1385,7 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
   }
 #endif
 
-  ClearWindow();
+  ClearField();
 
   InitializeMainControls();
 
@@ -1425,12 +1410,8 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
   MapTapeButtons();
   MapScreenMenuGadgets(SCREEN_MASK_MAIN);
 
-#if 0
-  DrawMaskedBorder(REDRAW_ALL);
-#endif
-
 #if 1
-  if (redraw_mask == REDRAW_ALL)
+  if (fade_mask == REDRAW_ALL)
   {
     int door_state = GetDoorState();
 
@@ -1440,19 +1421,17 @@ void DrawMainMenuExt(int redraw_mask, boolean do_fading)
   }
 #endif
 
-#if 1
   DrawMaskedBorder(REDRAW_ALL);
-#endif
-
-#if 0
-  if (redraw_all)
-    redraw_mask = REDRAW_ALL;
-#endif
-
-  FadeIn(redraw_mask);
 
+  FadeIn(fade_mask);
   FadeSetEnterMenu();
 
+#if 1
+  /* update screen area with special editor door */
+  redraw_mask |= REDRAW_ALL;
+  BackToFront();
+#endif
+
   SetMouseCursor(CURSOR_DEFAULT);
 
   InitAnimation();
@@ -1460,9 +1439,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()
@@ -1470,7 +1449,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 */
@@ -1503,18 +1482,11 @@ static void gotoTopLevelDir()
 
 void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
 {
-  static unsigned long title_delay = 0;
+  static unsigned int title_delay = 0;
   static int title_screen_nr = 0;
   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;
@@ -1523,14 +1495,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];
@@ -1538,11 +1502,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)
@@ -1550,12 +1509,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;
       }
 
@@ -1605,8 +1558,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
@@ -1633,10 +1584,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
@@ -1656,25 +1603,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);
 
@@ -1707,10 +1635,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) &&
@@ -1735,22 +1659,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;
     }
   }
@@ -1816,13 +1724,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);
@@ -1837,8 +1741,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;
@@ -1858,10 +1760,19 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
 
     for (i = 0; main_controls[i].nr != -1; i++)
     {
+#if 0
+      printf("::: check click (%d, %d) for %d [%d] ...\n",
+            mx - mSX, my - mSY, i, main_controls[i].nr);
+#endif
+
       if (insideMenuPosRect(main_controls[i].pos_button, mx - mSX, my - mSY) ||
          insideTextPosRect(main_controls[i].pos_text,   mx - mSX, my - mSY) ||
          insideTextPosRect(main_controls[i].pos_input,  mx - mSX, my - mSY))
       {
+#if 0
+       printf("::: inside %d\n", i);
+#endif
+
        pos = main_controls[i].nr;
 
        break;
@@ -1881,6 +1792,20 @@ void HandleMainMenu(int mx, int my, int dx, int dy, int button)
   {
     HandleMainMenu_SelectLevel(1, dx < 0 ? -1 : +1);
   }
+  else if (pos == MAIN_CONTROL_FIRST_LEVEL && !button)
+  {
+    HandleMainMenu_SelectLevel(MAX_LEVELS, -1);
+  }
+  else if (pos == MAIN_CONTROL_LAST_LEVEL && !button)
+  {
+    HandleMainMenu_SelectLevel(MAX_LEVELS, +1);
+  }
+  else if (pos == MAIN_CONTROL_LEVEL_NUMBER && !button)
+  {
+    game_status = GAME_MODE_LEVELNR;
+
+    DrawChooseLevelNr();
+  }
   else if (pos >= MAIN_CONTROL_NAME && pos <= MAIN_CONTROL_QUIT)
   {
     if (button)
@@ -1914,11 +1839,11 @@ 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
 
-         DrawChooseLevel();
+         DrawChooseLevelSet();
        }
       }
       else if (pos == MAIN_CONTROL_SCORES)
@@ -1937,6 +1862,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)
@@ -1944,15 +1874,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)
       {
@@ -1979,219 +1905,68 @@ 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)
+/* ========================================================================= */
+/* info screen functions                                                     */
+/* ========================================================================= */
+
+static struct TokenInfo *info_info;
+static int num_info_info;
+
+static void execInfoTitleScreen()
 {
-  static int choice = 5;
-  int x = 0;
-  int y = choice;
+  info_mode = INFO_MODE_TITLE;
 
-  if (button == MB_MENU_INITIALIZE)
-  {
-    drawCursor(choice, TRUE);
+  DrawInfoScreen();
+}
 
-    return;
-  }
+static void execInfoElements()
+{
+  info_mode = INFO_MODE_ELEMENTS;
 
-  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;
-  }
+  DrawInfoScreen();
+}
 
-  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);
+static void execInfoMusic()
+{
+  info_mode = INFO_MODE_MUSIC;
 
-       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;
+  DrawInfoScreen();
+}
 
-         SaveLevelSetup_LastSeries();
-         SaveLevelSetup_SeriesInfo();
+static void execInfoCredits()
+{
+  info_mode = INFO_MODE_CREDITS;
 
-#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                                                     */
-/* ========================================================================= */
-
-static struct TokenInfo *info_info;
-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();
-}
+  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[] =
@@ -2224,7 +1999,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;
 
@@ -2237,11 +2012,11 @@ 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();
 
@@ -2249,7 +2024,7 @@ static void DrawInfoScreen_Main(int redraw_mask, boolean do_fading)
   }
 #endif
 
-  ClearWindow();
+  ClearField();
 
   DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Info Screen");
 
@@ -2279,9 +2054,9 @@ static void DrawInfoScreen_Main(int redraw_mask, boolean do_fading)
   PlayMenuSound();
   PlayMenuMusic();
 
-  DrawMaskedBorder(redraw_mask);
+  DrawMaskedBorder(fade_mask);
 
-  FadeIn(redraw_mask);
+  FadeIn(fade_mask);
 
   InitAnimation();
 }
@@ -2337,7 +2112,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)
@@ -2390,7 +2166,7 @@ void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
 
   FadeOut(REDRAW_FIELD);
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextSCentered(ystart1, FONT_TEXT_1, text_title);
@@ -2422,7 +2198,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:");
@@ -2501,8 +2277,8 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
 
     ClearRectangleOnBackground(drawto, xstart, ystart2 + (i - start) * ystep,
                               TILEX, TILEY);
-    DrawGraphicAnimationExt(drawto, xstart, ystart2 + (i - start) * ystep,
-                           graphic, sync_frame, USE_MASKING);
+    DrawFixedGraphicAnimationExt(drawto, xstart, ystart2 + (i - start) * ystep,
+                                graphic, sync_frame, USE_MASKING);
 
     if (init)
       DrawInfoScreen_HelpText(element, action, direction, i - start);
@@ -2561,7 +2337,7 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
     sy += getFontHeight(font_nr) / 2;
 
   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);
 }
 
@@ -2593,7 +2369,7 @@ void DrawInfoScreen_Elements()
 
 void HandleInfoScreen_Elements(int button)
 {
-  static unsigned long info_delay = 0;
+  static unsigned int info_delay = 0;
   static int num_anims;
   static int num_pages;
   static int page;
@@ -2654,23 +2430,13 @@ void HandleInfoScreen_Elements(int button)
       FadeSetNextScreen();
 #endif
 
-#if 1
     if (button != MB_MENU_INITIALIZE)
       FadeOut(REDRAW_FIELD);
-#else
-    if (button != MB_MENU_INITIALIZE)
-      FadeCrossSaveBackbuffer();
-#endif
 
     DrawInfoScreen_HelpAnim(page * anims_per_page, num_anims, TRUE);
 
-#if 1
     if (button != MB_MENU_INITIALIZE)
       FadeIn(REDRAW_FIELD);
-#else
-    if (button != MB_MENU_INITIALIZE)
-      FadeCross(REDRAW_FIELD);
-#endif
   }
   else
   {
@@ -2690,7 +2456,7 @@ void DrawInfoScreen_Music()
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   LoadMusicInfo();
@@ -2718,7 +2484,7 @@ void HandleInfoScreen_Music(int button)
     {
       FadeSoundsAndMusic();
 
-      ClearWindow();
+      ClearField();
       DrawHeadline();
 
       DrawTextSCentered(ystart1, FONT_TEXT_1,
@@ -2771,15 +2537,10 @@ void HandleInfoScreen_Music(int button)
       FadeSetNextScreen();
 #endif
 
-#if 1
     if (button != MB_MENU_INITIALIZE)
       FadeOut(REDRAW_FIELD);
-#else
-    if (button != MB_MENU_INITIALIZE)
-      FadeCrossSaveBackbuffer();
-#endif
 
-    ClearWindow();
+    ClearField();
     DrawHeadline();
 
     if (list->is_sound)
@@ -2841,13 +2602,8 @@ void HandleInfoScreen_Music(int button)
     DrawTextSCentered(ybottom, FONT_TEXT_4,
                      "Press any key or button for next page");
 
-#if 1
     if (button != MB_MENU_INITIALIZE)
       FadeIn(REDRAW_FIELD);
-#else
-    if (button != MB_MENU_INITIALIZE)
-      FadeCross(REDRAW_FIELD);
-#endif
   }
 
   if (list != NULL && list->is_sound && sound_info[list->music].loop)
@@ -2861,7 +2617,7 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr)
   int ybottom = mSY - SY + SYSIZE - 20;
   int ystep = 30;
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextSCentered(ystart1, FONT_TEXT_1, "Credits:");
@@ -2983,8 +2739,15 @@ static void 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)
   {
@@ -3082,23 +2845,13 @@ void HandleInfoScreen_Credits(int button)
       FadeSetNextScreen();
 #endif
 
-#if 1
     if (button != MB_MENU_INITIALIZE)
       FadeOut(REDRAW_FIELD);
-#else
-    if (button != MB_MENU_INITIALIZE)
-      FadeCrossSaveBackbuffer();
-#endif
 
     DrawInfoScreen_CreditsScreen(screen_nr);
 
-#if 1
     if (button != MB_MENU_INITIALIZE)
       FadeIn(REDRAW_FIELD);
-#else
-    if (button != MB_MENU_INITIALIZE)
-      FadeCross(REDRAW_FIELD);
-#endif
   }
   else
   {
@@ -3119,7 +2872,7 @@ void DrawInfoScreen_Program()
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextSCentered(ystart1, FONT_TEXT_1, "Program Information:");
@@ -3130,6 +2883,18 @@ void DrawInfoScreen_Program()
                    "If you like it, send e-mail to:");
   DrawTextSCentered(ystart2 + 2 * ystep, FONT_TEXT_3,
                    PROGRAM_EMAIL_STRING);
+#if 1
+  DrawTextSCentered(ystart2 + 4 * ystep, FONT_TEXT_2,
+                   "More information and levels:");
+  DrawTextSCentered(ystart2 + 5 * ystep, FONT_TEXT_3,
+                   PROGRAM_WEBSITE_STRING);
+  DrawTextSCentered(ystart2 + 7 * ystep, FONT_TEXT_2,
+                   "If you have created new levels,");
+  DrawTextSCentered(ystart2 + 8 * ystep, FONT_TEXT_2,
+                   "send them to me to include them!");
+  DrawTextSCentered(ystart2 + 9 * ystep, FONT_TEXT_2,
+                   ":-)");
+#else
   DrawTextSCentered(ystart2 + 3 * ystep, FONT_TEXT_2,
                    "or SnailMail to:");
   DrawTextSCentered(ystart2 + 4 * ystep + 0, FONT_TEXT_3,
@@ -3150,6 +2915,7 @@ void DrawInfoScreen_Program()
                    "send them to me to include them!");
   DrawTextSCentered(ystart2 + 11 * ystep, FONT_TEXT_2,
                    ":-)");
+#endif
 
   DrawTextSCentered(ybottom, FONT_TEXT_4,
                    "Press any key or button for info menu");
@@ -3214,7 +2980,7 @@ void DrawInfoScreen_Version()
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
   DrawHeadline();
 
   DrawTextSCentered(ystart1, FONT_TEXT_1, "Version Information:");
@@ -3381,14 +3147,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,
@@ -3432,7 +3198,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);
 
@@ -3451,7 +3217,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 &&
@@ -3462,9 +3228,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()
@@ -3503,29 +3269,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;
@@ -3537,15 +3287,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)
   {
@@ -3553,42 +3294,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;
@@ -3639,7 +3353,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);
@@ -3675,8 +3389,8 @@ static void drawChooseTreeList(int first_entry, int num_page_entries,
   char *title_string = NULL;
   int yoffset_sets = MENU_TITLE1_YPOS;
   int yoffset_setup = 16;
-  int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR ? yoffset_sets :
-                yoffset_setup);
+  int yoffset = (ti->type == TREE_TYPE_LEVEL_DIR ||
+                ti->type == TREE_TYPE_LEVEL_NR ? yoffset_sets : yoffset_setup);
   int last_game_status = game_status;  /* save current game status */
 
   title_string = ti->infotext;
@@ -3744,6 +3458,9 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
   int ypos = MENU_TITLE2_YPOS;
   int font_nr = FONT_TITLE_2;
 
+  if (ti->type == TREE_TYPE_LEVEL_NR)
+    DrawTextFCentered(ypos, font_nr, leveldir_current->name);
+
   if (ti->type != TREE_TYPE_LEVEL_DIR)
     return;
 
@@ -3752,6 +3469,18 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
 
   DrawBackgroundForFont(SX, SY + ypos, SXSIZE, getFontHeight(font_nr), font_nr);
 
+#if 1
+  if (node->parent_link)
+    DrawTextFCentered(ypos, font_nr, "leave \"%s\"",
+                     node->node_parent->name);
+  else if (node->level_group)
+    DrawTextFCentered(ypos, font_nr, "enter \"%s\"",
+                     node->name);
+  else if (ti->type == TREE_TYPE_LEVEL_DIR)
+    DrawTextFCentered(ypos, font_nr, "%3d %s (%s)",
+                     node->levels, (node->levels > 1 ? "levels" : "level"),
+                     node->class_desc);
+#else
   if (node->parent_link)
     DrawTextFCentered(ypos, font_nr, "leave group \"%s\"",
                      node->class_desc);
@@ -3761,6 +3490,7 @@ static void drawChooseTreeInfo(int entry_pos, TreeInfo *ti)
   else if (ti->type == TREE_TYPE_LEVEL_DIR)
     DrawTextFCentered(ypos, font_nr, "%3d levels (%s)",
                      node->levels, node->class_desc);
+#endif
 
   /* let BackToFront() redraw only what is needed */
   redraw_mask = last_redraw_mask | REDRAW_TILES;
@@ -3842,17 +3572,21 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
       else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE ||
               setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY)
        execSetupGraphics();
+      else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE ||
+              setup_mode == SETUP_MODE_CHOOSE_VOLUME_LOOPS ||
+              setup_mode == SETUP_MODE_CHOOSE_VOLUME_MUSIC)
+       execSetupSound();
       else
        execSetupArtwork();
     }
     else
     {
+      if (game_status == GAME_MODE_LEVELNR)
+       level_nr = atoi(level_number_current->identifier);
+
       game_status = GAME_MODE_MAIN;
-#if 1
+
       DrawMainMenuExt(REDRAW_FIELD, FALSE);
-#else
-      DrawMainMenu();
-#endif
     }
 
     return;
@@ -4028,12 +3762,20 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
          else if (setup_mode == SETUP_MODE_CHOOSE_SCREEN_MODE ||
                   setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY)
            execSetupGraphics();
+         else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE ||
+                  setup_mode == SETUP_MODE_CHOOSE_VOLUME_LOOPS ||
+                  setup_mode == SETUP_MODE_CHOOSE_VOLUME_MUSIC)
+           execSetupSound();
          else
            execSetupArtwork();
        }
        else
        {
+         if (game_status == GAME_MODE_LEVELNR)
+           level_nr = atoi(level_number_current->identifier);
+
          game_status = GAME_MODE_MAIN;
+
          DrawMainMenu();
        }
       }
@@ -4041,7 +3783,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
   }
 }
 
-void DrawChooseLevel()
+void DrawChooseLevelSet()
 {
   SetMainBackgroundImage(IMG_BACKGROUND_LEVELS);
 
@@ -4051,9 +3793,80 @@ void DrawChooseLevel()
   PlayMenuMusic();
 }
 
-void HandleChooseLevel(int mx, int my, int dx, int dy, int button)
+void HandleChooseLevelSet(int mx, int my, int dx, int dy, int button)
+{
+  HandleChooseTree(mx, my, dx, dy, button, &leveldir_current);
+
+  DoAnimation();
+}
+
+void DrawChooseLevelNr()
+{
+  int i;
+
+  if (level_number != NULL)
+  {
+    freeTreeInfo(level_number);
+
+    level_number = NULL;
+  }
+
+  for (i = leveldir_current->first_level; i <= leveldir_current->last_level;i++)
+  {
+    TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_LEVEL_NR);
+    char identifier[32], name[32];
+    int value = i;
+
+    /* temporarily load level info to get level name */
+    LoadLevelInfoOnly(i);
+
+    ti->node_top = &level_number;
+    ti->sort_priority = 10000 + value;
+    ti->color = (level.no_valid_file ? FC_BLUE :
+                LevelStats_getSolved(i) ? FC_GREEN :
+                LevelStats_getPlayed(i) ? FC_YELLOW : FC_RED);
+
+    sprintf(identifier, "%d", value);
+    sprintf(name, "%03d: %s", value,
+           (level.no_valid_file ? "(no file)" : level.name));
+
+    setString(&ti->identifier, identifier);
+    setString(&ti->name, name);
+    setString(&ti->name_sorting, name);
+
+    pushTreeInfo(&level_number, ti);
+  }
+
+  /* sort level number values to start with lowest level number */
+  sortTreeInfo(&level_number);
+
+  /* set current level number to current level number */
+  level_number_current =
+    getTreeInfoFromIdentifier(level_number, i_to_a(level_nr));
+
+  /* if that also fails, set current level number to first available level */
+  if (level_number_current == NULL)
+    level_number_current = level_number;
+
+  SetMainBackgroundImage(IMG_BACKGROUND_LEVELNR);
+
+#if 1
+  DrawChooseTree(&level_number_current);
+#else
+  DrawChooseTree(&leveldir_current);
+#endif
+
+  PlayMenuSound();
+  PlayMenuMusic();
+}
+
+void HandleChooseLevelNr(int mx, int my, int dx, int dy, int button)
 {
+#if 1
+  HandleChooseTree(mx, my, dx, dy, button, &level_number_current);
+#else
   HandleChooseTree(mx, my, dx, dy, button, &leveldir_current);
+#endif
 
   DoAnimation();
 }
@@ -4101,7 +3914,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,
@@ -4218,23 +4031,19 @@ static char *game_speed_text;
 static char *graphics_set_name;
 static char *sounds_set_name;
 static char *music_set_name;
+static char *volume_simple_text;
+static char *volume_loops_text;
+static char *volume_music_text;
 
 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;
@@ -4283,35 +4092,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;
@@ -4418,46 +4218,199 @@ static void execSetupGraphics()
 #endif
 
   setup_mode = SETUP_MODE_GRAPHICS;
+
   DrawSetupScreen();
 }
 
 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 execSetupChooseVolumeSimple()
+{
+  setup_mode = SETUP_MODE_CHOOSE_VOLUME_SIMPLE;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseVolumeLoops()
+{
+  setup_mode = SETUP_MODE_CHOOSE_VOLUME_LOOPS;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseVolumeMusic()
+{
+  setup_mode = SETUP_MODE_CHOOSE_VOLUME_MUSIC;
+
   DrawSetupScreen();
 }
 
 static void execSetupSound()
 {
-#if 0
-  FadeSetEnterMenu();
+#if 1
+  if (volumes_simple == NULL)
+  {
+    int i;
+
+    for (i = 0; volumes_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = volumes_list[i].value;
+      char *text = volumes_list[i].text;
+
+      ti->node_top = &volumes_simple;
+      ti->sort_priority = value;
+
+      sprintf(identifier, "%d", value);
+      sprintf(name, "%s", text);
+
+      setString(&ti->identifier, identifier);
+      setString(&ti->name, name);
+      setString(&ti->name_sorting, name);
+      setString(&ti->infotext, "Sound Volume");
+
+      pushTreeInfo(&volumes_simple, ti);
+    }
+
+    /* sort volume values to start with lowest volume value */
+    sortTreeInfo(&volumes_simple);
+
+    /* set current volume value to configured volume value */
+    volume_simple_current =
+      getTreeInfoFromIdentifier(volumes_simple,i_to_a(setup.volume_simple));
+
+    /* if that fails, set current volume to reliable default value */
+    if (volume_simple_current == NULL)
+      volume_simple_current =
+       getTreeInfoFromIdentifier(volumes_simple, i_to_a(100));
+
+    /* if that also fails, set current volume to first available value */
+    if (volume_simple_current == NULL)
+      volume_simple_current = volumes_simple;
+  }
+
+  if (volumes_loops == NULL)
+  {
+    int i;
+
+    for (i = 0; volumes_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = volumes_list[i].value;
+      char *text = volumes_list[i].text;
+
+      ti->node_top = &volumes_loops;
+      ti->sort_priority = value;
+
+      sprintf(identifier, "%d", value);
+      sprintf(name, "%s", text);
+
+      setString(&ti->identifier, identifier);
+      setString(&ti->name, name);
+      setString(&ti->name_sorting, name);
+      setString(&ti->infotext, "Loops Volume");
+
+      pushTreeInfo(&volumes_loops, ti);
+    }
+
+    /* sort volume values to start with lowest volume value */
+    sortTreeInfo(&volumes_loops);
+
+    /* set current volume value to configured volume value */
+    volume_loops_current =
+      getTreeInfoFromIdentifier(volumes_loops,i_to_a(setup.volume_loops));
+
+    /* if that fails, set current volume to reliable default value */
+    if (volume_loops_current == NULL)
+      volume_loops_current =
+       getTreeInfoFromIdentifier(volumes_loops, i_to_a(100));
+
+    /* if that also fails, set current volume to first available value */
+    if (volume_loops_current == NULL)
+      volume_loops_current = volumes_loops;
+  }
+
+  if (volumes_music == NULL)
+  {
+    int i;
+
+    for (i = 0; volumes_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = volumes_list[i].value;
+      char *text = volumes_list[i].text;
+
+      ti->node_top = &volumes_music;
+      ti->sort_priority = value;
+
+      sprintf(identifier, "%d", value);
+      sprintf(name, "%s", text);
+
+      setString(&ti->identifier, identifier);
+      setString(&ti->name, name);
+      setString(&ti->name_sorting, name);
+      setString(&ti->infotext, "Music Volume");
+
+      pushTreeInfo(&volumes_music, ti);
+    }
+
+    /* sort volume values to start with lowest volume value */
+    sortTreeInfo(&volumes_music);
+
+    /* set current volume value to configured volume value */
+    volume_music_current =
+      getTreeInfoFromIdentifier(volumes_music,i_to_a(setup.volume_music));
+
+    /* if that fails, set current volume to reliable default value */
+    if (volume_music_current == NULL)
+      volume_music_current =
+       getTreeInfoFromIdentifier(volumes_music, i_to_a(100));
+
+    /* if that also fails, set current volume to first available value */
+    if (volume_music_current == NULL)
+      volume_music_current = volumes_music;
+  }
+
+  setup.volume_simple = atoi(volume_simple_current->identifier);
+  setup.volume_loops  = atoi(volume_loops_current->identifier);
+  setup.volume_music  = atoi(volume_music_current->identifier);
+
+  /* needed for displaying volume text instead of identifier */
+  volume_simple_text = volume_simple_current->name;
+  volume_loops_text = volume_loops_current->name;
+  volume_music_text = volume_music_current->name;
 #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;
@@ -4473,81 +4426,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()
@@ -4564,8 +4521,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"         },
@@ -4634,7 +4590,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:" },
@@ -4642,6 +4597,8 @@ 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_SWITCH,       &setup.small_game_graphics, "Small Game Graphics:" },
   { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
 
@@ -4654,6 +4611,13 @@ static struct TokenInfo setup_info_sound[] =
   { TYPE_SWITCH,       &setup.sound_loops,     "Sound Effects (Looping):" },
   { TYPE_SWITCH,       &setup.sound_music,     "Music:"                },
   { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseVolumeSimple, "Sound Volume (Normal):" },
+  { TYPE_STRING,       &volume_simple_text,    ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseVolumeLoops, "Sound Volume (Looping):" },
+  { TYPE_STRING,       &volume_loops_text,     ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseVolumeMusic, "Music Volume:"     },
+  { TYPE_STRING,       &volume_music_text,     ""                      },
+  { TYPE_EMPTY,                NULL,                   ""                      },
   { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
 
   { 0,                 NULL,                   NULL                    }
@@ -4669,9 +4633,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:"     },
@@ -4704,6 +4675,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:",     },
@@ -4716,7 +4700,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                    }
 };
@@ -4734,7 +4718,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                    }
 };
@@ -4788,11 +4822,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
@@ -4809,6 +4844,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;
 }
@@ -4822,10 +4860,15 @@ static void drawSetupValue(int pos)
   int startx = mSX + xpos * 32;
   int starty = mSY + ypos * 32;
   int font_nr, font_width;
+#if 0
+  int font_height;
+#endif
   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;
@@ -4835,9 +4878,7 @@ static void drawSetupValue(int pos)
     xpos = MENU_SCREEN_START_XPOS;
 
     if (type & TYPE_QUERY)
-    {
       value_string = "<press key>";
-    }
   }
   else if (type & TYPE_STRING)
   {
@@ -4848,11 +4889,18 @@ 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);
+#if 0
+  font_height = getFontHeight(font_nr);
+#endif
 
   /* downward compatibility correction for Juergen Bonhagen's menu settings */
   if (setup_mode != SETUP_MODE_INPUT)
@@ -4889,8 +4937,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);
 
@@ -4898,12 +4950,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;
@@ -4963,7 +5024,7 @@ static void DrawSetupScreen_Generic()
   FadeOut(REDRAW_FIELD);
 #endif
 
-  ClearWindow();
+  ClearField();
 
   if (setup_mode == SETUP_MODE_MAIN)
   {
@@ -4995,6 +5056,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;
@@ -5005,6 +5071,21 @@ 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);
 
@@ -5016,12 +5097,6 @@ static void DrawSetupScreen_Generic()
 #endif
   {
     void *value_ptr = setup_info[i].value;
-#if 1
-#else
-    int xpos = MENU_SCREEN_START_XPOS;
-    int ypos = MENU_SCREEN_START_YPOS + i;
-    int font_nr;
-#endif
 
     /* set some entries to "unchangeable" according to other variables */
     if ((value_ptr == &setup.sound_simple && !audio.sound_available) ||
@@ -5038,13 +5113,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);
@@ -5091,11 +5160,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;
   }
@@ -5132,7 +5197,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)
@@ -5152,13 +5218,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;
       }
@@ -5188,7 +5249,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);
       }
     }
   }
@@ -5196,15 +5257,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;
@@ -5222,7 +5281,6 @@ void DrawSetupScreen_Input()
 #endif
 #endif
 
-#if 1
 #if 1
   for (i = 0; setup_info[i].type != 0 && i < MAX_MENU_ENTRIES_ON_SCREEN; i++)
 #else
@@ -5238,16 +5296,6 @@ 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();
@@ -5335,8 +5383,8 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active)
 
   ClearRectangleOnBackground(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY,
                             TILEX, TILEY);
-  DrawGraphicThruMaskExt(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY,
-                        PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0);
+  DrawFixedGraphicThruMaskExt(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY,
+                             PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0);
 
   if (setup.input[player_nr].use_joystick)
   {
@@ -5415,11 +5463,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;
   }
@@ -5464,15 +5508,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;
       }
@@ -5552,7 +5591,7 @@ void CustomizeKeyboard(int player_nr)
   FadeSetEnterMenu();
   FadeOut(REDRAW_FIELD);
 
-  ClearWindow();
+  ClearField();
 
   DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Keyboard Input");
 
@@ -5695,13 +5734,13 @@ static boolean CalibrateJoystickMain(int player_nr)
   FadeSetEnterMenu();
   FadeOut(REDRAW_FIELD);
 
-  ClearWindow();
+  ClearField();
 
   for (y = 0; y < 3; y++)
   {
     for (x = 0; x < 3; x++)
     {
-      DrawGraphic(xpos + x - 1, ypos + y - 1, IMG_MENU_CALIBRATE_BLUE, 0);
+      DrawFixedGraphic(xpos + x - 1, ypos + y - 1, IMG_MENU_CALIBRATE_BLUE, 0);
       check[x][y] = FALSE;
     }
   }
@@ -5725,13 +5764,9 @@ static boolean CalibrateJoystickMain(int player_nr)
   new_joystick_xmiddle = joy_x;
   new_joystick_ymiddle = joy_y;
 
-  DrawGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_RED, 0);
+  DrawFixedGraphic(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();
@@ -5801,8 +5836,10 @@ static boolean CalibrateJoystickMain(int player_nr)
 
     if (x != last_x || y != last_y)
     {
-      DrawGraphic(xpos + last_x, ypos + last_y, IMG_MENU_CALIBRATE_YELLOW, 0);
-      DrawGraphic(xpos + x,      ypos + y,      IMG_MENU_CALIBRATE_RED,    0);
+      DrawFixedGraphic(xpos + last_x, ypos + last_y,
+                      IMG_MENU_CALIBRATE_YELLOW, 0);
+      DrawFixedGraphic(xpos + x,      ypos + y,
+                      IMG_MENU_CALIBRATE_RED,    0);
 
       last_x = x;
       last_y = y;
@@ -5874,7 +5911,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! ");
@@ -5910,6 +5947,12 @@ void DrawSetupScreen()
     DrawChooseTree(&artwork.snd_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_MUSIC)
     DrawChooseTree(&artwork.mus_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE)
+    DrawChooseTree(&volume_simple_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_LOOPS)
+    DrawChooseTree(&volume_loops_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_MUSIC)
+    DrawChooseTree(&volume_music_current);
   else
     DrawSetupScreen_Generic();
 
@@ -5939,6 +5982,12 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     HandleChooseTree(mx, my, dx, dy, button, &artwork.snd_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_MUSIC)
     HandleChooseTree(mx, my, dx, dy, button, &artwork.mus_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_SIMPLE)
+    HandleChooseTree(mx, my, dx, dy, button, &volume_simple_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_LOOPS)
+    HandleChooseTree(mx, my, dx, dy, button, &volume_loops_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_VOLUME_MUSIC)
+    HandleChooseTree(mx, my, dx, dy, button, &volume_music_current);
   else
     HandleSetupScreen_Generic(mx, my, dx, dy, button);
 
@@ -6049,13 +6098,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"
   }
@@ -6081,8 +6138,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"
@@ -6092,7 +6154,7 @@ static struct
 static void CreateScreenMenubuttons()
 {
   struct GadgetInfo *gi;
-  unsigned long event_mask;
+  unsigned int event_mask;
   int i;
 
   for (i = 0; i < NUM_SCREEN_MENUBUTTONS; i++)
@@ -6145,9 +6207,15 @@ static void CreateScreenMenubuttons()
 static void CreateScreenScrollbuttons()
 {
   struct GadgetInfo *gi;
-  unsigned long event_mask;
+  unsigned int 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;
@@ -6203,6 +6271,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;
@@ -6213,7 +6287,7 @@ static void CreateScreenScrollbars()
     int gd_x1, gd_x2, gd_y1, gd_y2;
     struct GadgetInfo *gi;
     int items_max, items_visible, item_position;
-    unsigned long event_mask;
+    unsigned int event_mask;
     int num_page_entries = NUM_MENU_ENTRIES_ON_SCREEN;
     int id = scrollbar_info[i].gadget_id;
 
@@ -6394,21 +6468,27 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
 
     case SCREEN_CTRL_ID_SCROLL_UP:
       if (game_status == GAME_MODE_LEVELS)
-       HandleChooseLevel(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
+       HandleChooseLevelSet(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
+      else if (game_status == GAME_MODE_LEVELNR)
+       HandleChooseLevelNr(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_SETUP)
        HandleSetupScreen(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
       break;
 
     case SCREEN_CTRL_ID_SCROLL_DOWN:
       if (game_status == GAME_MODE_LEVELS)
-       HandleChooseLevel(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
+       HandleChooseLevelSet(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
+      else if (game_status == GAME_MODE_LEVELNR)
+       HandleChooseLevelNr(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_SETUP)
        HandleSetupScreen(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
       break;
 
     case SCREEN_CTRL_ID_SCROLL_VERTICAL:
       if (game_status == GAME_MODE_LEVELS)
-       HandleChooseLevel(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
+       HandleChooseLevelSet(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE);
+      else if (game_status == GAME_MODE_LEVELNR)
+       HandleChooseLevelNr(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE);
       else if (game_status == GAME_MODE_SETUP)
        HandleSetupScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
       break;