cleanup of unnecessarily convoluted function call
[rocksndiamonds.git] / src / screens.c
index 41cde998f09bb12e1488f56f0e08cee0735daf3e..1708a0e7235136e294f298de9953ba053aedb9d2 100644 (file)
 #include "api.h"
 
 
-#define DEBUG_JOYSTICKS                0
+#define DEBUG_JOYSTICKS                                0
 
 
 // screens on the info screen
-#define INFO_MODE_MAIN                 0
-#define INFO_MODE_TITLE                        1
-#define INFO_MODE_ELEMENTS             2
-#define INFO_MODE_MUSIC                        3
-#define INFO_MODE_CREDITS              4
-#define INFO_MODE_PROGRAM              5
-#define INFO_MODE_VERSION              6
-#define INFO_MODE_LEVELSET             7
+#define INFO_MODE_MAIN                         0
+#define INFO_MODE_TITLE                                1
+#define INFO_MODE_ELEMENTS                     2
+#define INFO_MODE_MUSIC                                3
+#define INFO_MODE_CREDITS                      4
+#define INFO_MODE_PROGRAM                      5
+#define INFO_MODE_VERSION                      6
+#define INFO_MODE_LEVELSET                     7
 
-#define MAX_INFO_MODES                 8
+#define MAX_INFO_MODES                         8
 
 // screens on the setup screen
 // (must match GFX_SPECIAL_ARG_SETUP_* values as defined in src/main.h)
 // (should also match corresponding entries in src/conf_gfx.c)
-#define SETUP_MODE_MAIN                        0
-#define SETUP_MODE_GAME                        1
-#define SETUP_MODE_ENGINES             2
-#define SETUP_MODE_EDITOR              3
-#define SETUP_MODE_GRAPHICS            4
-#define SETUP_MODE_SOUND               5
-#define SETUP_MODE_ARTWORK             6
-#define SETUP_MODE_INPUT               7
-#define SETUP_MODE_TOUCH               8
-#define SETUP_MODE_SHORTCUTS           9
-#define SETUP_MODE_SHORTCUTS_1         10
-#define SETUP_MODE_SHORTCUTS_2         11
-#define SETUP_MODE_SHORTCUTS_3         12
-#define SETUP_MODE_SHORTCUTS_4         13
-#define SETUP_MODE_SHORTCUTS_5         14
+#define SETUP_MODE_MAIN                                0
+#define SETUP_MODE_GAME                                1
+#define SETUP_MODE_ENGINES                     2
+#define SETUP_MODE_EDITOR                      3
+#define SETUP_MODE_GRAPHICS                    4
+#define SETUP_MODE_SOUND                       5
+#define SETUP_MODE_ARTWORK                     6
+#define SETUP_MODE_INPUT                       7
+#define SETUP_MODE_TOUCH                       8
+#define SETUP_MODE_SHORTCUTS                   9
+#define SETUP_MODE_SHORTCUTS_1                 10
+#define SETUP_MODE_SHORTCUTS_2                 11
+#define SETUP_MODE_SHORTCUTS_3                 12
+#define SETUP_MODE_SHORTCUTS_4                 13
+#define SETUP_MODE_SHORTCUTS_5                 14
+#define SETUP_MODE_SHORTCUTS_6                 15
 
 // sub-screens on the setup screen (generic)
-#define SETUP_MODE_CHOOSE_ARTWORK      15
-#define SETUP_MODE_CHOOSE_OTHER                16
+#define SETUP_MODE_CHOOSE_ARTWORK              16
+#define SETUP_MODE_CHOOSE_OTHER                        17
 
 // sub-screens on the setup screen (specific)
-#define SETUP_MODE_CHOOSE_SCORES_TYPE  17
-#define SETUP_MODE_CHOOSE_GAME_SPEED   18
-#define SETUP_MODE_CHOOSE_SCROLL_DELAY 19
-#define SETUP_MODE_CHOOSE_SNAPSHOT_MODE        20
-#define SETUP_MODE_CHOOSE_WINDOW_SIZE  21
-#define SETUP_MODE_CHOOSE_SCALING_TYPE 22
-#define SETUP_MODE_CHOOSE_RENDERING    23
-#define SETUP_MODE_CHOOSE_VSYNC                24
-#define SETUP_MODE_CHOOSE_GRAPHICS     25
-#define SETUP_MODE_CHOOSE_SOUNDS       26
-#define SETUP_MODE_CHOOSE_MUSIC                27
-#define SETUP_MODE_CHOOSE_VOLUME_SIMPLE        28
-#define SETUP_MODE_CHOOSE_VOLUME_LOOPS 29
-#define SETUP_MODE_CHOOSE_VOLUME_MUSIC 30
-#define SETUP_MODE_CHOOSE_TOUCH_CONTROL        31
-#define SETUP_MODE_CHOOSE_MOVE_DISTANCE        32
-#define SETUP_MODE_CHOOSE_DROP_DISTANCE        33
-#define SETUP_MODE_CHOOSE_TRANSPARENCY 34
-#define SETUP_MODE_CHOOSE_GRID_XSIZE_0 35
-#define SETUP_MODE_CHOOSE_GRID_YSIZE_0 36
-#define SETUP_MODE_CHOOSE_GRID_XSIZE_1 37
-#define SETUP_MODE_CHOOSE_GRID_YSIZE_1 38
-#define SETUP_MODE_CONFIG_VIRT_BUTTONS 39
-
-#define MAX_SETUP_MODES                        40
-
-#define MAX_MENU_MODES                 MAX(MAX_INFO_MODES, MAX_SETUP_MODES)
+#define SETUP_MODE_CHOOSE_SCORES_TYPE          18
+#define SETUP_MODE_CHOOSE_GAME_SPEED           19
+#define SETUP_MODE_CHOOSE_SCROLL_DELAY         20
+#define SETUP_MODE_CHOOSE_SNAPSHOT_MODE                21
+#define SETUP_MODE_CHOOSE_GAME_ENGINE_TYPE     22
+#define SETUP_MODE_CHOOSE_BD_PALETTE_C64       23
+#define SETUP_MODE_CHOOSE_BD_PALETTE_C64DTV    24
+#define SETUP_MODE_CHOOSE_BD_PALETTE_ATARI     25
+#define SETUP_MODE_CHOOSE_BD_COLOR_TYPE                26
+#define SETUP_MODE_CHOOSE_WINDOW_SIZE          27
+#define SETUP_MODE_CHOOSE_SCALING_TYPE         28
+#define SETUP_MODE_CHOOSE_RENDERING            29
+#define SETUP_MODE_CHOOSE_VSYNC                        30
+#define SETUP_MODE_CHOOSE_GRAPHICS             31
+#define SETUP_MODE_CHOOSE_SOUNDS               32
+#define SETUP_MODE_CHOOSE_MUSIC                        33
+#define SETUP_MODE_CHOOSE_VOLUME_SIMPLE                34
+#define SETUP_MODE_CHOOSE_VOLUME_LOOPS         35
+#define SETUP_MODE_CHOOSE_VOLUME_MUSIC         36
+#define SETUP_MODE_CHOOSE_TOUCH_CONTROL                37
+#define SETUP_MODE_CHOOSE_MOVE_DISTANCE                38
+#define SETUP_MODE_CHOOSE_DROP_DISTANCE                39
+#define SETUP_MODE_CHOOSE_TRANSPARENCY         40
+#define SETUP_MODE_CHOOSE_GRID_XSIZE_0         41
+#define SETUP_MODE_CHOOSE_GRID_YSIZE_0         42
+#define SETUP_MODE_CHOOSE_GRID_XSIZE_1         43
+#define SETUP_MODE_CHOOSE_GRID_YSIZE_1         44
+#define SETUP_MODE_CONFIG_VIRT_BUTTONS         45
+
+#define MAX_SETUP_MODES                                46
+
+#define MAX_MENU_MODES                         MAX(MAX_INFO_MODES, MAX_SETUP_MODES)
+
+// info screen titles
+#define STR_INFO_MAIN                          "Info Screen"
+#define STR_INFO_TITLE                         "Title Screen"
+#define STR_INFO_ELEMENTS                      "Game Elements"
+#define STR_INFO_MUSIC                         "Music Info"
+#define STR_INFO_CREDITS                       "Credits"
+#define STR_INFO_PROGRAM                       "Program Info"
+#define STR_INFO_VERSION                       "Version Info"
+#define STR_INFO_LEVELSET                      "Level Set Info"
+#define STR_INFO_EXIT                          "Exit"
 
 // setup screen titles
-#define STR_SETUP_MAIN                 "Setup"
-#define STR_SETUP_GAME                 "Game & Menu"
-#define STR_SETUP_ENGINES              "Game Engines"
-#define STR_SETUP_EDITOR               "Editor"
-#define STR_SETUP_GRAPHICS             "Graphics"
-#define STR_SETUP_SOUND                        "Sound & Music"
-#define STR_SETUP_ARTWORK              "Custom Artwork"
-#define STR_SETUP_INPUT                        "Input Devices"
-#define STR_SETUP_TOUCH                        "Touch Controls"
-#define STR_SETUP_SHORTCUTS            "Key Shortcuts"
-#define STR_SETUP_EXIT                 "Exit"
-#define STR_SETUP_SAVE_AND_EXIT                "Save and Exit"
-
-#define STR_SETUP_CHOOSE_SCORES_TYPE   "Scores Type"
-#define STR_SETUP_CHOOSE_GAME_SPEED    "Game Speed"
-#define STR_SETUP_CHOOSE_SCROLL_DELAY  "Scroll Delay"
-#define STR_SETUP_CHOOSE_SNAPSHOT_MODE "Snapshot Mode"
-#define STR_SETUP_CHOOSE_WINDOW_SIZE   "Window Scaling"
-#define STR_SETUP_CHOOSE_SCALING_TYPE  "Anti-Aliasing"
-#define STR_SETUP_CHOOSE_RENDERING     "Rendering Mode"
-#define STR_SETUP_CHOOSE_VSYNC         "VSync Mode"
-#define STR_SETUP_CHOOSE_VOLUME_SIMPLE "Sound Volume"
-#define STR_SETUP_CHOOSE_VOLUME_LOOPS  "Loops Volume"
-#define STR_SETUP_CHOOSE_VOLUME_MUSIC  "Music Volume"
-#define STR_SETUP_CHOOSE_TOUCH_CONTROL "Control Type"
-#define STR_SETUP_CHOOSE_MOVE_DISTANCE "Move Distance"
-#define STR_SETUP_CHOOSE_DROP_DISTANCE "Drop Distance"
-#define STR_SETUP_CHOOSE_TRANSPARENCY  "Transparency"
-#define STR_SETUP_CHOOSE_GRID_XSIZE_0  "Horiz. Buttons"
-#define STR_SETUP_CHOOSE_GRID_YSIZE_0  "Vert. Buttons"
-#define STR_SETUP_CHOOSE_GRID_XSIZE_1  "Horiz. Buttons"
-#define STR_SETUP_CHOOSE_GRID_YSIZE_1  "Vert. Buttons"
+#define STR_SETUP_MAIN                         "Setup"
+#define STR_SETUP_GAME                         "Game & Menu"
+#define STR_SETUP_ENGINES                      "Game Engines"
+#define STR_SETUP_EDITOR                       "Editor"
+#define STR_SETUP_GRAPHICS                     "Graphics"
+#define STR_SETUP_SOUND                                "Sound & Music"
+#define STR_SETUP_ARTWORK                      "Custom Artwork"
+#define STR_SETUP_INPUT                                "Input Devices"
+#define STR_SETUP_TOUCH                                "Touch Controls"
+#define STR_SETUP_SHORTCUTS                    "Key Shortcuts"
+#define STR_SETUP_EXIT                         "Exit"
+#define STR_SETUP_SAVE_AND_EXIT                        "Save and Exit"
+
+#define STR_SETUP_CHOOSE_SCORES_TYPE           "Scores Type"
+#define STR_SETUP_CHOOSE_GAME_SPEED            "Game Speed"
+#define STR_SETUP_CHOOSE_SCROLL_DELAY          "Scroll Delay"
+#define STR_SETUP_CHOOSE_SNAPSHOT_MODE         "Snapshot Mode"
+#define STR_SETUP_CHOOSE_GAME_ENGINE_TYPE      "Game Engine"
+#define STR_SETUP_CHOOSE_BD_PALETTE_C64                "Palette (C64)"
+#define STR_SETUP_CHOOSE_BD_PALETTE_C64DTV     "Palette (C64DTV)"
+#define STR_SETUP_CHOOSE_BD_PALETTE_ATARI      "Palette (Atari)"
+#define STR_SETUP_CHOOSE_BD_COLOR_TYPE         "Color Type"
+#define STR_SETUP_CHOOSE_WINDOW_SIZE           "Window Scaling"
+#define STR_SETUP_CHOOSE_SCALING_TYPE          "Anti-Aliasing"
+#define STR_SETUP_CHOOSE_RENDERING             "Rendering Mode"
+#define STR_SETUP_CHOOSE_VSYNC                 "VSync Mode"
+#define STR_SETUP_CHOOSE_VOLUME_SIMPLE         "Sound Volume"
+#define STR_SETUP_CHOOSE_VOLUME_LOOPS          "Loops Volume"
+#define STR_SETUP_CHOOSE_VOLUME_MUSIC          "Music Volume"
+#define STR_SETUP_CHOOSE_TOUCH_CONTROL         "Control Type"
+#define STR_SETUP_CHOOSE_MOVE_DISTANCE         "Move Distance"
+#define STR_SETUP_CHOOSE_DROP_DISTANCE         "Drop Distance"
+#define STR_SETUP_CHOOSE_TRANSPARENCY          "Transparency"
+#define STR_SETUP_CHOOSE_GRID_XSIZE_0          "Horiz. Buttons"
+#define STR_SETUP_CHOOSE_GRID_YSIZE_0          "Vert. Buttons"
+#define STR_SETUP_CHOOSE_GRID_XSIZE_1          "Horiz. Buttons"
+#define STR_SETUP_CHOOSE_GRID_YSIZE_1          "Vert. Buttons"
 
 // other screen text constants
-#define STR_CHOOSE_TREE_EDIT           "Edit"
-#define MENU_CHOOSE_TREE_FONT(x)       (FONT_TEXT_1 + (x))
-#define MENU_CHOOSE_TREE_COLOR(ti, a)  TREE_COLOR(ti, a)
+#define STR_CHOOSE_TREE_EDIT                   "Edit"
+#define MENU_CHOOSE_TREE_FONT(x)               (FONT_TEXT_1 + (x))
+#define MENU_CHOOSE_TREE_COLOR(ti, a)          TREE_COLOR(ti, a)
 
-#define TEXT_NEXT_PAGE                 "Press any key or button for next page"
-#define TEXT_INFO_MENU                 "Press any key or button for info menu"
+#define TEXT_MAIN_MENU                         "Press any key or button for main menu"
+#define TEXT_INFO_MENU                         "Press any key or button for info menu"
+#define TEXT_NEXT_PAGE                         "Press any key or button for next page"
+#define TEXT_NEXT_MENU                         (info_screens_from_main ?               \
+                                                TEXT_MAIN_MENU : TEXT_INFO_MENU)
 
 // for input setup functions
-#define SETUPINPUT_SCREEN_POS_START    0
-#define SETUPINPUT_SCREEN_POS_EMPTY1   3
-#define SETUPINPUT_SCREEN_POS_EMPTY2   12
-#define SETUPINPUT_SCREEN_POS_END      13
+#define SETUPINPUT_SCREEN_POS_START            0
+#define SETUPINPUT_SCREEN_POS_EMPTY1           3
+#define SETUPINPUT_SCREEN_POS_EMPTY2           12
+#define SETUPINPUT_SCREEN_POS_END              13
 
-#define MENU_SETUP_FONT_TITLE          FONT_TEXT_1
-#define MENU_SETUP_FONT_TEXT           FONT_TITLE_2
+#define MENU_SETUP_FONT_TITLE                  FONT_TEXT_1
+#define MENU_SETUP_FONT_TEXT                   FONT_TITLE_2
 
-#define MAX_SETUP_TEXT_INPUT_LEN       28
+#define MAX_SETUP_TEXT_INPUT_LEN               28
 
 // for various menu stuff
-#define MENU_SCREEN_START_XPOS         1
-#define MENU_SCREEN_START_YPOS         2
-#define MENU_SCREEN_VALUE_XPOS         (SCR_FIELDX - 3)
-#define MENU_SCREEN_TEXT2_XPOS         (SCR_FIELDX - 2)
-#define MENU_SCREEN_MAX_XPOS           (SCR_FIELDX - 1)
-#define MENU_TITLE1_YPOS               8
-#define MENU_TITLE2_YPOS               46
-#define MENU_INFO_FONT_TITLE           FONT_TEXT_1
-#define MENU_INFO_FONT_HEAD            FONT_TEXT_2
-#define MENU_INFO_FONT_TEXT            FONT_TEXT_3
-#define MENU_INFO_FONT_FOOT            FONT_TEXT_4
-#define MENU_INFO_SPACE_HEAD           (menu.headline2_spacing_info[info_mode])
-#define MENU_SCREEN_INFO_SPACE_LEFT    (menu.left_spacing_info[info_mode])
-#define MENU_SCREEN_INFO_SPACE_RIGHT   (menu.right_spacing_info[info_mode])
-#define MENU_SCREEN_INFO_SPACE_TOP     (menu.top_spacing_info[info_mode])
-#define MENU_SCREEN_INFO_SPACE_BOTTOM  (menu.bottom_spacing_info[info_mode])
-#define MENU_SCREEN_INFO_YSTART1       MENU_SCREEN_INFO_SPACE_TOP
-#define MENU_SCREEN_INFO_YSTART2       (MENU_SCREEN_INFO_YSTART1 +            \
-                                        getMenuTextStep(MENU_INFO_SPACE_HEAD, \
-                                                        MENU_INFO_FONT_TITLE))
-#define MENU_SCREEN_INFO_YSTEP         (TILEY + 4)
-#define MENU_SCREEN_INFO_YBOTTOM       (SYSIZE - MENU_SCREEN_INFO_SPACE_BOTTOM)
-#define MENU_SCREEN_INFO_YSIZE         (MENU_SCREEN_INFO_YBOTTOM -     \
-                                        MENU_SCREEN_INFO_YSTART2 -     \
-                                        TILEY / 2)
-#define MAX_INFO_ELEMENTS_ON_SCREEN    128
-#define STD_INFO_ELEMENTS_ON_SCREEN    (MENU_SCREEN_INFO_YSIZE /       \
-                                        MENU_SCREEN_INFO_YSTEP)
-#define NUM_INFO_ELEMENTS_FROM_CONF    \
-  (menu.list_size_info[GFX_SPECIAL_ARG_INFO_ELEMENTS] > 0 ?            \
-   menu.list_size_info[GFX_SPECIAL_ARG_INFO_ELEMENTS] :                        \
-   MAX_MENU_ENTRIES_ON_SCREEN)
-#define NUM_INFO_ELEMENTS_ON_SCREEN    MIN(MIN(STD_INFO_ELEMENTS_ON_SCREEN, \
-                                                MAX_INFO_ELEMENTS_ON_SCREEN), \
-                                           NUM_INFO_ELEMENTS_FROM_CONF)
-#define MAX_MENU_ENTRIES_ON_SCREEN     (SCR_FIELDY - MENU_SCREEN_START_YPOS)
-#define MAX_MENU_TEXT_LENGTH_BIG       13
-#define MAX_MENU_TEXT_LENGTH_MEDIUM    (MAX_MENU_TEXT_LENGTH_BIG * 2)
+#define MENU_SCREEN_START_XPOS                 1
+#define MENU_SCREEN_START_YPOS                 2
+#define MENU_SCREEN_VALUE_XPOS                 (SCR_FIELDX - 3)
+#define MENU_SCREEN_TEXT2_XPOS                 (SCR_FIELDX - 2)
+#define MENU_SCREEN_MAX_XPOS                   (SCR_FIELDX - 1)
+#define MENU_TITLE1_YPOS                       8
+#define MENU_TITLE2_YPOS                       46
+#define MENU_INFO_FONT_TITLE                   FONT_TEXT_1
+#define MENU_INFO_FONT_HEAD                    FONT_TEXT_2
+#define MENU_INFO_FONT_TEXT                    FONT_TEXT_3
+#define MENU_INFO_FONT_FOOT                    FONT_TEXT_4
+#define MENU_INFO_SPACE_HEAD                   (menu.headline2_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_LEFT            (menu.left_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_MIDDLE          (menu.middle_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_RIGHT           (menu.right_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_TOP             (menu.top_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_BOTTOM          (menu.bottom_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_LINE            (menu.line_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_SPACE_EXTRA           (menu.extra_spacing_info[info_mode])
+#define MENU_SCREEN_INFO_TILE_SIZE_RAW         (menu.tile_size_info[info_mode])
+#define MENU_SCREEN_INFO_TILE_SIZE             (MENU_SCREEN_INFO_TILE_SIZE_RAW > 0 ?           \
+                                                MENU_SCREEN_INFO_TILE_SIZE_RAW : TILEY)
+#define MENU_SCREEN_INFO_ENTRY_SIZE_RAW                (menu.list_entry_size_info[info_mode])
+#define MENU_SCREEN_INFO_ENTRY_SIZE            (MAX(MENU_SCREEN_INFO_ENTRY_SIZE_RAW,           \
+                                                    MENU_SCREEN_INFO_TILE_SIZE))
+#define MENU_SCREEN_INFO_YSTART                        MENU_SCREEN_INFO_SPACE_TOP
+#define MENU_SCREEN_INFO_YSTEP                 (MENU_SCREEN_INFO_ENTRY_SIZE +                  \
+                                                MENU_SCREEN_INFO_SPACE_EXTRA)
+#define MENU_SCREEN_INFO_YBOTTOM               (SYSIZE - MENU_SCREEN_INFO_SPACE_BOTTOM)
+#define MENU_SCREEN_INFO_YSIZE                 (MENU_SCREEN_INFO_YBOTTOM -                     \
+                                                MENU_SCREEN_INFO_YSTART - TILEY / 2)
+#define MAX_INFO_ELEMENTS_IN_ARRAY             128
+#define MAX_INFO_ELEMENTS_ON_SCREEN            (SYSIZE / TILEY)
+#define MAX_INFO_ELEMENTS                      MIN(MAX_INFO_ELEMENTS_IN_ARRAY,                 \
+                                                   MAX_INFO_ELEMENTS_ON_SCREEN)
+#define STD_INFO_ELEMENTS_ON_SCREEN            10
+#define DYN_INFO_ELEMENTS_ON_SCREEN            (MENU_SCREEN_INFO_YSIZE / MENU_SCREEN_INFO_YSTEP)
+#define DEFAULT_INFO_ELEMENTS                  MIN(STD_INFO_ELEMENTS_ON_SCREEN,                \
+                                                   DYN_INFO_ELEMENTS_ON_SCREEN)
+#define NUM_INFO_ELEMENTS_FROM_CONF                                    \
+                               (menu.list_size_info[GFX_SPECIAL_ARG_INFO_ELEMENTS] > 0 ?       \
+                                menu.list_size_info[GFX_SPECIAL_ARG_INFO_ELEMENTS] :           \
+                                DEFAULT_INFO_ELEMENTS)
+#define NUM_INFO_ELEMENTS_ON_SCREEN            MIN(NUM_INFO_ELEMENTS_FROM_CONF, MAX_INFO_ELEMENTS)
+#define MAX_MENU_ENTRIES_ON_SCREEN             (SCR_FIELDY - MENU_SCREEN_START_YPOS)
+#define MAX_MENU_TEXT_LENGTH_BIG               13
+#define MAX_MENU_TEXT_LENGTH_MEDIUM            (MAX_MENU_TEXT_LENGTH_BIG * 2)
 
 // screen gadget identifiers
-#define SCREEN_CTRL_ID_PREV_LEVEL      0
-#define SCREEN_CTRL_ID_NEXT_LEVEL      1
-#define SCREEN_CTRL_ID_PREV_LEVEL2     2
-#define SCREEN_CTRL_ID_NEXT_LEVEL2     3
-#define SCREEN_CTRL_ID_PREV_SCORE      4
-#define SCREEN_CTRL_ID_NEXT_SCORE      5
-#define SCREEN_CTRL_ID_PLAY_TAPE       6
-#define SCREEN_CTRL_ID_FIRST_LEVEL     7
-#define SCREEN_CTRL_ID_LAST_LEVEL      8
-#define SCREEN_CTRL_ID_LEVEL_NUMBER    9
-#define SCREEN_CTRL_ID_PREV_PLAYER     10
-#define SCREEN_CTRL_ID_NEXT_PLAYER     11
-#define SCREEN_CTRL_ID_INSERT_SOLUTION 12
-#define SCREEN_CTRL_ID_PLAY_SOLUTION   13
-#define SCREEN_CTRL_ID_SWITCH_ECS_AGA  14
-#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE 15
-#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE 16
-#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2        17
-#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2        18
-
-#define NUM_SCREEN_MENUBUTTONS         19
-
-#define SCREEN_CTRL_ID_SCROLL_UP       19
-#define SCREEN_CTRL_ID_SCROLL_DOWN     20
-#define SCREEN_CTRL_ID_SCROLL_VERTICAL 21
-#define SCREEN_CTRL_ID_NETWORK_SERVER  22
-
-#define NUM_SCREEN_GADGETS             23
-
-#define NUM_SCREEN_SCROLLBUTTONS       2
-#define NUM_SCREEN_SCROLLBARS          1
-#define NUM_SCREEN_TEXTINPUT           1
-
-#define SCREEN_MASK_MAIN               (1 << 0)
-#define SCREEN_MASK_MAIN_HAS_SOLUTION  (1 << 1)
-#define SCREEN_MASK_INPUT              (1 << 2)
-#define SCREEN_MASK_TOUCH              (1 << 3)
-#define SCREEN_MASK_TOUCH2             (1 << 4)
-#define SCREEN_MASK_SCORES             (1 << 5)
-#define SCREEN_MASK_SCORES_INFO                (1 << 6)
+#define SCREEN_CTRL_ID_PREV_LEVEL              0
+#define SCREEN_CTRL_ID_NEXT_LEVEL              1
+#define SCREEN_CTRL_ID_PREV_LEVEL2             2
+#define SCREEN_CTRL_ID_NEXT_LEVEL2             3
+#define SCREEN_CTRL_ID_PREV_SCORE              4
+#define SCREEN_CTRL_ID_NEXT_SCORE              5
+#define SCREEN_CTRL_ID_PLAY_TAPE               6
+#define SCREEN_CTRL_ID_FIRST_LEVEL             7
+#define SCREEN_CTRL_ID_LAST_LEVEL              8
+#define SCREEN_CTRL_ID_LEVEL_NUMBER            9
+#define SCREEN_CTRL_ID_PREV_PLAYER             10
+#define SCREEN_CTRL_ID_NEXT_PLAYER             11
+#define SCREEN_CTRL_ID_INSERT_SOLUTION         12
+#define SCREEN_CTRL_ID_PLAY_SOLUTION           13
+#define SCREEN_CTRL_ID_LEVELSET_INFO           14
+#define SCREEN_CTRL_ID_SWITCH_ECS_AGA          15
+#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE         16
+#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE         17
+#define SCREEN_CTRL_ID_TOUCH_PREV_PAGE2                18
+#define SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2                19
+
+#define NUM_SCREEN_MENUBUTTONS                 20
+
+#define SCREEN_CTRL_ID_SCROLL_UP               20
+#define SCREEN_CTRL_ID_SCROLL_DOWN             21
+#define SCREEN_CTRL_ID_SCROLL_VERTICAL         22
+#define SCREEN_CTRL_ID_NETWORK_SERVER          23
+
+#define NUM_SCREEN_GADGETS                     24
+
+#define NUM_SCREEN_SCROLLBUTTONS               2
+#define NUM_SCREEN_SCROLLBARS                  1
+#define NUM_SCREEN_TEXTINPUT                   1
+
+#define SCREEN_MASK_MAIN                       (1 << 0)
+#define SCREEN_MASK_MAIN_HAS_SOLUTION          (1 << 1)
+#define SCREEN_MASK_MAIN_HAS_SET_INFO          (1 << 2)
+#define SCREEN_MASK_INPUT                      (1 << 3)
+#define SCREEN_MASK_TOUCH                      (1 << 4)
+#define SCREEN_MASK_TOUCH2                     (1 << 5)
+#define SCREEN_MASK_SCORES                     (1 << 6)
+#define SCREEN_MASK_SCORES_INFO                        (1 << 7)
 
 // graphic position and size values for buttons and scrollbars
-#define SC_MENUBUTTON_XSIZE            TILEX
-#define SC_MENUBUTTON_YSIZE            TILEY
+#define SC_MENUBUTTON_XSIZE                    TILEX
+#define SC_MENUBUTTON_YSIZE                    TILEY
 
-#define SC_SCROLLBUTTON_XSIZE          TILEX
-#define SC_SCROLLBUTTON_YSIZE          TILEY
+#define SC_SCROLLBUTTON_XSIZE                  TILEX
+#define SC_SCROLLBUTTON_YSIZE                  TILEY
 
-#define SC_SCROLLBAR_XPOS              (SXSIZE - SC_SCROLLBUTTON_XSIZE)
+#define SC_SCROLLBAR_XPOS                      (SXSIZE - SC_SCROLLBUTTON_XSIZE)
 
-#define SC_SCROLL_VERTICAL_XSIZE       SC_SCROLLBUTTON_XSIZE
-#define SC_SCROLL_VERTICAL_YSIZE       ((MAX_MENU_ENTRIES_ON_SCREEN - 2) * \
-                                        SC_SCROLLBUTTON_YSIZE)
+#define SC_SCROLL_VERTICAL_XSIZE               SC_SCROLLBUTTON_XSIZE
+#define SC_SCROLL_VERTICAL_YSIZE               ((MAX_MENU_ENTRIES_ON_SCREEN - 2) * \
+                                                SC_SCROLLBUTTON_YSIZE)
 
-#define SC_SCROLL_UP_XPOS              SC_SCROLLBAR_XPOS
-#define SC_SCROLL_UP_YPOS              (2 * SC_SCROLLBUTTON_YSIZE)
+#define SC_SCROLL_UP_XPOS                      SC_SCROLLBAR_XPOS
+#define SC_SCROLL_UP_YPOS                      (2 * SC_SCROLLBUTTON_YSIZE)
 
-#define SC_SCROLL_VERTICAL_XPOS                SC_SCROLLBAR_XPOS
-#define SC_SCROLL_VERTICAL_YPOS                (SC_SCROLL_UP_YPOS + \
-                                        SC_SCROLLBUTTON_YSIZE)
+#define SC_SCROLL_VERTICAL_XPOS                        SC_SCROLLBAR_XPOS
+#define SC_SCROLL_VERTICAL_YPOS                        (SC_SCROLL_UP_YPOS + \
+                                                SC_SCROLLBUTTON_YSIZE)
 
-#define SC_SCROLL_DOWN_XPOS            SC_SCROLLBAR_XPOS
-#define SC_SCROLL_DOWN_YPOS            (SC_SCROLL_VERTICAL_YPOS + \
-                                        SC_SCROLL_VERTICAL_YSIZE)
+#define SC_SCROLL_DOWN_XPOS                    SC_SCROLLBAR_XPOS
+#define SC_SCROLL_DOWN_YPOS                    (SC_SCROLL_VERTICAL_YPOS + \
+                                                SC_SCROLL_VERTICAL_YSIZE)
 
-#define SC_BORDER_SIZE                 14
+#define SC_BORDER_SIZE                         14
 
 
 // forward declarations of internal functions
@@ -263,6 +299,7 @@ static void ConfigureJoystick(int);
 static void ConfigureVirtualButtons(void);
 static void execSetupGame(void);
 static void execSetupEngines(void);
+static void execSetupEditor(void);
 static void execSetupGraphics(void);
 static void execSetupSound(void);
 static void execSetupTouch(void);
@@ -285,9 +322,8 @@ static void HandleInfoScreen_Main(int, int, int, int, int);
 static void HandleInfoScreen_TitleScreen(int, int, int);
 static void HandleInfoScreen_Elements(int, int, int);
 static void HandleInfoScreen_Music(int, int, int);
-static void HandleInfoScreen_Credits(int, int, int);
-static void HandleInfoScreen_Program(int, int, int);
 static void HandleInfoScreen_Version(int);
+static void HandleInfoScreen_Generic(int, int, int);
 
 static void ModifyGameSpeedIfNeeded(void);
 static void DisableVsyncIfNeeded(void);
@@ -311,6 +347,10 @@ static void DrawHallOfFame_setScoreEntries(void);
 static void HandleHallOfFame_SelectLevel(int, int);
 static char *getHallOfFameRankText(int, int);
 static char *getHallOfFameScoreText(int, int);
+static char *getInfoScreenTitle_Generic(void);
+static int getInfoScreenBackgroundImage_Generic(void);
+static int getInfoScreenBackgroundSound_Generic(void);
+static int getInfoScreenBackgroundMusic_Generic(void);
 
 static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *);
 
@@ -319,6 +359,8 @@ static struct GadgetInfo *screen_gadget[NUM_SCREEN_GADGETS];
 static int info_mode = INFO_MODE_MAIN;
 static int setup_mode = SETUP_MODE_MAIN;
 
+static boolean info_screens_from_main = FALSE;
+
 static TreeInfo *window_sizes = NULL;
 static TreeInfo *window_size_current = NULL;
 
@@ -337,6 +379,21 @@ static TreeInfo *scroll_delay_current = NULL;
 static TreeInfo *snapshot_modes = NULL;
 static TreeInfo *snapshot_mode_current = NULL;
 
+static TreeInfo *game_engine_types = NULL;
+static TreeInfo *game_engine_type_current = NULL;
+
+static TreeInfo *bd_palettes_c64 = NULL;
+static TreeInfo *bd_palette_c64_current = NULL;
+
+static TreeInfo *bd_palettes_c64dtv = NULL;
+static TreeInfo *bd_palette_c64dtv_current = NULL;
+
+static TreeInfo *bd_palettes_atari = NULL;
+static TreeInfo *bd_palette_atari_current = NULL;
+
+static TreeInfo *bd_color_types = NULL;
+static TreeInfo *bd_color_type_current = NULL;
+
 static TreeInfo *scores_types = NULL;
 static TreeInfo *scores_type_current = NULL;
 
@@ -380,280 +437,334 @@ static TreeInfo *score_entry_current = NULL;
 
 static struct ValueTextInfo window_sizes_list[] =
 {
-  {    50,     "50 %"                          },
-  {    80,     "80 %"                          },
-  {    90,     "90 %"                          },
-  {    100,    "100 % (Default)"               },
-  {    110,    "110 %"                         },
-  {    120,    "120 %"                         },
-  {    130,    "130 %"                         },
-  {    140,    "140 %"                         },
-  {    150,    "150 %"                         },
-  {    200,    "200 %"                         },
-  {    250,    "250 %"                         },
-  {    300,    "300 %"                         },
-
-  {    -1,     NULL                            },
+  { 50,                                        "50 %"                          },
+  { 80,                                        "80 %"                          },
+  { 90,                                        "90 %"                          },
+  { 100,                               "100 % (Default)"               },
+  { 110,                               "110 %"                         },
+  { 120,                               "120 %"                         },
+  { 130,                               "130 %"                         },
+  { 140,                               "140 %"                         },
+  { 150,                               "150 %"                         },
+  { 200,                               "200 %"                         },
+  { 250,                               "250 %"                         },
+  { 300,                               "300 %"                         },
+
+  { -1,                                        NULL                            },
 };
 
 static struct StringValueTextInfo scaling_types_list[] =
 {
-  {    SCALING_QUALITY_NEAREST, "Off"          },
-  {    SCALING_QUALITY_LINEAR,  "Linear"       },
-  {    SCALING_QUALITY_BEST,    "Anisotropic"  },
+  { SCALING_QUALITY_NEAREST,            "Off"                          },
+  { SCALING_QUALITY_LINEAR,             "Linear"                       },
+  { SCALING_QUALITY_BEST,               "Anisotropic"                  },
 
-  {    NULL,                    NULL           },
+  { NULL,                               NULL                           },
 };
 
 static struct StringValueTextInfo rendering_modes_list[] =
 {
-  {    STR_SPECIAL_RENDERING_OFF,      "Off (May show artifacts, fast)" },
-  {    STR_SPECIAL_RENDERING_BITMAP,   "Bitmap/Texture mode (slower)"   },
+  { STR_SPECIAL_RENDERING_OFF,         "Off (May show artifacts, fast)"},
+  { STR_SPECIAL_RENDERING_BITMAP,      "Bitmap/Texture mode (slower)"  },
 #if DEBUG
   // this mode may work under certain conditions, but does not work on Windows
-  {    STR_SPECIAL_RENDERING_TARGET,   "Target Texture mode (slower)"   },
+  { STR_SPECIAL_RENDERING_TARGET,      "Target Texture mode (slower)"  },
 #endif
-  {    STR_SPECIAL_RENDERING_DOUBLE,   "Double Texture mode (slower)"   },
+  { STR_SPECIAL_RENDERING_DOUBLE,      "Double Texture mode (slower)"  },
 
-  {    NULL,                            NULL                            },
+  { NULL,                               NULL                           },
 };
 
 static struct StringValueTextInfo vsync_modes_list[] =
 {
-  {    STR_VSYNC_MODE_OFF,             "Off"           },
-  {    STR_VSYNC_MODE_NORMAL,          "Normal"        },
-  {    STR_VSYNC_MODE_ADAPTIVE,        "Adaptive"      },
+  { STR_VSYNC_MODE_OFF,                        "Off"                           },
+  { STR_VSYNC_MODE_NORMAL,             "Normal"                        },
+  { STR_VSYNC_MODE_ADAPTIVE,           "Adaptive"                      },
 
-  {    NULL,                            NULL           },
+  { NULL,                              NULL                            },
 };
 
 static struct StringValueTextInfo scores_types_list[] =
 {
-  {    STR_SCORES_TYPE_LOCAL_ONLY,         "Local scores only"         },
-  {    STR_SCORES_TYPE_SERVER_ONLY,        "Server scores only"        },
-  {    STR_SCORES_TYPE_LOCAL_AND_SERVER,   "Local and server scores"   },
+  { STR_SCORES_TYPE_LOCAL_ONLY,                "Local scores only"             },
+  { STR_SCORES_TYPE_SERVER_ONLY,       "Server scores only"            },
+  { STR_SCORES_TYPE_LOCAL_AND_SERVER,  "Local and server scores"       },
 
-  {    NULL,                           NULL            },
+  { NULL,                              NULL                            },
 };
 
 static struct ValueTextInfo game_speeds_list_normal[] =
 {
-  {    30,     "Very Slow"                     },
-  {    25,     "Slow"                          },
-  {    20,     "Normal"                        },
-  {    15,     "Fast"                          },
-  {    10,     "Very Fast"                     },
+  { 30,                                        "Very Slow"                     },
+  { 25,                                        "Slow"                          },
+  { 20,                                        "Normal"                        },
+  { 15,                                        "Fast"                          },
+  { 10,                                        "Very Fast"                     },
 
-  {    -1,     NULL                            },
+  { -1,                                        NULL                            },
 };
 
 static struct ValueTextInfo game_speeds_list_extended[] =
 {
-  {    1000,   "1 fps (Extremely Slow)"        },
-  {    500,    "2 fps"                         },
-  {    200,    "5 fps"                         },
-  {    100,    "10 fps"                        },
-  {    50,     "20 fps"                        },
-  {    29,     "35 fps (Original Supaplex)"    },
-  {    25,     "40 fps"                        },
-  {    20,     "50 fps (=== Normal Speed ===)" },
-  {    16,     "60 fps (60 Hz VSync Speed)"    },
-  {    14,     "70 fps (Maximum Supaplex)"     },
-  {    10,     "100 fps"                       },
-  {    5,      "200 fps"                       },
-  {    2,      "500 fps"                       },
-  {    1,      "1000 fps (Extremely Fast)"     },
-
-  {    -1,     NULL                            },
+  { 1000,                              "1 fps (Extremely Slow)"        },
+  { 500,                               "2 fps"                         },
+  { 200,                               "5 fps"                         },
+  { 100,                               "10 fps"                        },
+  { 50,                                        "20 fps"                        },
+  { 29,                                        "35 fps (Original Supaplex)"    },
+  { 25,                                        "40 fps"                        },
+  { 20,                                        "50 fps (=== Normal Speed ===)" },
+  { 16,                                        "60 fps (60 Hz VSync Speed)"    },
+  { 14,                                        "70 fps (Maximum Supaplex)"     },
+  { 10,                                        "100 fps"                       },
+  { 5,                                 "200 fps"                       },
+  { 2,                                 "500 fps"                       },
+  { 1,                                 "1000 fps (Extremely Fast)"     },
+
+  { -1,                                        NULL                            },
 };
 
 static struct ValueTextInfo *game_speeds_list;
 
 static struct ValueTextInfo scroll_delays_list[] =
 {
-  {    0,      "0 Tiles (No Scroll Delay)"     },
-  {    1,      "1 Tile"                        },
-  {    2,      "2 Tiles"                       },
-  {    3,      "3 Tiles (Default)"             },
-  {    4,      "4 Tiles"                       },
-  {    5,      "5 Tiles"                       },
-  {    6,      "6 Tiles"                       },
-  {    7,      "7 Tiles"                       },
-  {    8,      "8 Tiles (Maximum Scroll Delay)"},
-
-  {    -1,     NULL                            },
+  { 0,                                 "0 Tiles (No Scroll Delay)"     },
+  { 1,                                 "1 Tile"                        },
+  { 2,                                 "2 Tiles"                       },
+  { 3,                                 "3 Tiles (Default)"             },
+  { 4,                                 "4 Tiles"                       },
+  { 5,                                 "5 Tiles"                       },
+  { 6,                                 "6 Tiles"                       },
+  { 7,                                 "7 Tiles"                       },
+  { 8,                                 "8 Tiles (Maximum Scroll Delay)"},
+
+  { -1,                                        NULL                            },
 };
 
 static struct StringValueTextInfo snapshot_modes_list[] =
 {
-  {    STR_SNAPSHOT_MODE_OFF,                  "Off"           },
-  {    STR_SNAPSHOT_MODE_EVERY_STEP,           "Every Step"    },
-  {    STR_SNAPSHOT_MODE_EVERY_MOVE,           "Every Move"    },
-  {    STR_SNAPSHOT_MODE_EVERY_COLLECT,        "Every Collect" },
+  { STR_SNAPSHOT_MODE_OFF,             "Off"                           },
+  { STR_SNAPSHOT_MODE_EVERY_STEP,      "Every Step"                    },
+  { STR_SNAPSHOT_MODE_EVERY_MOVE,      "Every Move"                    },
+  { STR_SNAPSHOT_MODE_EVERY_COLLECT,   "Every Collect"                 },
+
+  { NULL,                              NULL                            },
+};
+
+static struct ValueTextInfo game_engine_types_list[] =
+{
+  { GAME_ENGINE_TYPE_RND,              "Rocks'n'Diamonds"              },
+  { GAME_ENGINE_TYPE_BD,               "Boulder Dash"                  },
+  { GAME_ENGINE_TYPE_EM,               "Emerald Mine"                  },
+  { GAME_ENGINE_TYPE_SP,               "Supaplex"                      },
+  { GAME_ENGINE_TYPE_MM,               "Mirror Magic"                  },
+
+  { -1,                                        NULL                            }
+};
+
+static struct ValueTextInfo bd_palettes_c64_list[] =
+{
+  { GD_PALETTE_C64_VICE_NEW,           "Vice new"                      },
+  { GD_PALETTE_C64_VICE_OLD,           "Vice old"                      },
+  { GD_PALETTE_C64_VIDE_DEFAULT,       "Vice default"                  },
+  { GD_PALETTE_C64_C64HQ,              "C64HQ"                         },
+  { GD_PALETTE_C64_C64S,               "C64S"                          },
+  { GD_PALETTE_C64_CCS64,              "CCS64"                         },
+  { GD_PALETTE_C64_FRODO,              "Frodo"                         },
+  { GD_PALETTE_C64_GODOT,              "GoDot"                         },
+  { GD_PALETTE_C64_PC64,               "PC64"                          },
+  { GD_PALETTE_C64_RTADASH,            "RTADash"                       },
+
+  { -1,                                        NULL                            },
+};
+
+static struct ValueTextInfo bd_palettes_c64dtv_list[] =
+{
+  { GD_PALETTE_C64DTV_SPIFF,           "Spiff"                         },
+  { GD_PALETTE_C64DTV_MURRAY,          "Murray"                        },
+
+  { -1,                                        NULL                            },
+};
+
+static struct ValueTextInfo bd_palettes_atari_list[] =
+{
+  { GD_PALETTE_ATARI_BUILTIN,          "BuiltIn"                       },
+  { GD_PALETTE_ATARI_BUILTIN_CONTRAST, "BuiltIn contrast"              },
+  { GD_PALETTE_ATARI_DEFAULT,          "Default"                       },
+  { GD_PALETTE_ATARI_JAKUB,            "Jakub"                         },
+  { GD_PALETTE_ATARI_JAKUB_CONTRAST,   "Jakub contrast"                },
+  { GD_PALETTE_ATARI_REAL,             "Real"                          },
+  { GD_PALETTE_ATARI_REAL_CONTRAST,    "Real contrast"                 },
+  { GD_PALETTE_ATARI_XFORMER,          "XFormer"                       },
+
+  { -1,                                        NULL                            },
+};
+
+static struct ValueTextInfo bd_color_types_list[] =
+{
+  { GD_COLOR_TYPE_RGB,                 "RGB colors"                    },
+  { GD_COLOR_TYPE_C64,                 "C64 colors"                    },
+  { GD_COLOR_TYPE_C64DTV,              "C64DTV colors"                 },
+  { GD_COLOR_TYPE_ATARI,               "Atari colors"                  },
 
-  {    NULL,                                   NULL            },
+  { -1,                                        NULL                            },
 };
 
 static struct ValueTextInfo volumes_list[] =
 {
-  {    0,      "0 %"                           },
-  {    1,      "1 %"                           },
-  {    2,      "2 %"                           },
-  {    5,      "5 %"                           },
-  {    10,     "10 %"                          },
-  {    20,     "20 %"                          },
-  {    30,     "30 %"                          },
-  {    40,     "40 %"                          },
-  {    50,     "50 %"                          },
-  {    60,     "60 %"                          },
-  {    70,     "70 %"                          },
-  {    80,     "80 %"                          },
-  {    90,     "90 %"                          },
-  {    100,    "100 %"                         },
-
-  {    -1,     NULL                            },
+  { 0,                                 "0 %"                           },
+  { 1,                                 "1 %"                           },
+  { 2,                                 "2 %"                           },
+  { 5,                                 "5 %"                           },
+  { 10,                                        "10 %"                          },
+  { 20,                                        "20 %"                          },
+  { 30,                                        "30 %"                          },
+  { 40,                                        "40 %"                          },
+  { 50,                                        "50 %"                          },
+  { 60,                                        "60 %"                          },
+  { 70,                                        "70 %"                          },
+  { 80,                                        "80 %"                          },
+  { 90,                                        "90 %"                          },
+  { 100,                               "100 %"                         },
+
+  { -1,                                        NULL                            },
 };
 
 static struct StringValueTextInfo touch_controls_list[] =
 {
-  {    TOUCH_CONTROL_OFF,              "Off"                   },
-  {    TOUCH_CONTROL_VIRTUAL_BUTTONS,  "Virtual Buttons"       },
-  {    TOUCH_CONTROL_WIPE_GESTURES,    "Wipe Gestures"         },
-  {    TOUCH_CONTROL_FOLLOW_FINGER,    "Follow Finger"         },
+  { TOUCH_CONTROL_OFF,                 "Off"                           },
+  { TOUCH_CONTROL_VIRTUAL_BUTTONS,     "Virtual Buttons"               },
+  { TOUCH_CONTROL_WIPE_GESTURES,       "Wipe Gestures"                 },
+  { TOUCH_CONTROL_FOLLOW_FINGER,       "Follow Finger"                 },
 
-  {    NULL,                           NULL                    },
+  { NULL,                              NULL                            },
 };
 
 static struct ValueTextInfo distances_list[] =
 {
-  {    1,      "1 %"                           },
-  {    2,      "2 %"                           },
-  {    3,      "3 %"                           },
-  {    4,      "4 %"                           },
-  {    5,      "5 %"                           },
-  {    10,     "10 %"                          },
-  {    15,     "15 %"                          },
-  {    20,     "20 %"                          },
-  {    25,     "25 %"                          },
-
-  {    -1,     NULL                            },
+  { 1,                                 "1 %"                           },
+  { 2,                                 "2 %"                           },
+  { 3,                                 "3 %"                           },
+  { 4,                                 "4 %"                           },
+  { 5,                                 "5 %"                           },
+  { 10,                                        "10 %"                          },
+  { 15,                                        "15 %"                          },
+  { 20,                                        "20 %"                          },
+  { 25,                                        "25 %"                          },
+
+  { -1,                                        NULL                            },
 };
 
 static struct ValueTextInfo transparencies_list[] =
 {
-  {    0,      "0 % (Opaque)"                  },
-  {    10,     "10 %"                          },
-  {    20,     "20 %"                          },
-  {    30,     "30 %"                          },
-  {    40,     "40 %"                          },
-  {    50,     "50 %"                          },
-  {    60,     "60 %"                          },
-  {    70,     "70 %"                          },
-  {    80,     "80 %"                          },
-  {    90,     "90 %"                          },
-  {    100,    "100 % (Invisible)"             },
-
-  {    -1,     NULL                            },
+  { 0,                                 "0 % (Opaque)"                  },
+  { 10,                                        "10 %"                          },
+  { 20,                                        "20 %"                          },
+  { 30,                                        "30 %"                          },
+  { 40,                                        "40 %"                          },
+  { 50,                                        "50 %"                          },
+  { 60,                                        "60 %"                          },
+  { 70,                                        "70 %"                          },
+  { 80,                                        "80 %"                          },
+  { 90,                                        "90 %"                          },
+  { 100,                               "100 % (Invisible)"             },
+
+  { -1,                                        NULL                            },
 };
 
 static struct ValueTextInfo grid_sizes_list[] =
 {
-  {    3,      "3"                             },
-  {    4,      "4"                             },
-  {    5,      "5"                             },
-  {    6,      "6"                             },
-  {    7,      "7"                             },
-  {    8,      "8"                             },
-  {    9,      "9"                             },
-  {    10,     "10"                            },
-  {    11,     "11"                            },
-  {    12,     "12"                            },
-  {    13,     "13"                            },
-  {    14,     "14"                            },
-  {    15,     "15"                            },
-  {    16,     "16"                            },
-  {    17,     "17"                            },
-  {    18,     "18"                            },
-  {    19,     "19"                            },
-  {    20,     "20"                            },
-  {    21,     "21"                            },
-  {    22,     "22"                            },
-  {    23,     "23"                            },
-  {    24,     "24"                            },
-  {    25,     "25"                            },
-  {    26,     "26"                            },
-  {    27,     "27"                            },
-  {    28,     "28"                            },
-  {    29,     "29"                            },
-  {    30,     "30"                            },
-  {    31,     "31"                            },
-  {    32,     "32"                            },
-
-  {    -1,     NULL                            },
+  { 3,                                 "3"                             },
+  { 4,                                 "4"                             },
+  { 5,                                 "5"                             },
+  { 6,                                 "6"                             },
+  { 7,                                 "7"                             },
+  { 8,                                 "8"                             },
+  { 9,                                 "9"                             },
+  { 10,                                        "10"                            },
+  { 11,                                        "11"                            },
+  { 12,                                        "12"                            },
+  { 13,                                        "13"                            },
+  { 14,                                        "14"                            },
+  { 15,                                        "15"                            },
+  { 16,                                        "16"                            },
+  { 17,                                        "17"                            },
+  { 18,                                        "18"                            },
+  { 19,                                        "19"                            },
+  { 20,                                        "20"                            },
+  { 21,                                        "21"                            },
+  { 22,                                        "22"                            },
+  { 23,                                        "23"                            },
+  { 24,                                        "24"                            },
+  { 25,                                        "25"                            },
+  { 26,                                        "26"                            },
+  { 27,                                        "27"                            },
+  { 28,                                        "28"                            },
+  { 29,                                        "29"                            },
+  { 30,                                        "30"                            },
+  { 31,                                        "31"                            },
+  { 32,                                        "32"                            },
+
+  { -1,                                        NULL                            },
 };
 
 static int align_xoffset = 0;
 static int align_yoffset = 0;
 
-#define DRAW_MODE(s)           ((s) >= GAME_MODE_MAIN &&               \
-                                (s) <= GAME_MODE_SETUP ? (s) :         \
-                                (s) == GAME_MODE_PSEUDO_TYPENAME ?     \
-                                GAME_MODE_MAIN :                       \
-                                (s) == GAME_MODE_PSEUDO_TYPENAMES ?    \
+#define DRAW_MODE(s)           ((s) >= GAME_MODE_MAIN &&                       \
+                                (s) <= GAME_MODE_SETUP ? (s) :                 \
+                                (s) == GAME_MODE_PSEUDO_TYPENAME ?             \
+                                GAME_MODE_MAIN :                               \
+                                (s) == GAME_MODE_PSEUDO_TYPENAMES ?            \
                                 GAME_MODE_NAMES : GAME_MODE_DEFAULT)
 
 // (there are no draw offset definitions needed for INFO_MODE_TITLE)
-#define DRAW_MODE_INFO(i)      ((i) >= INFO_MODE_TITLE &&              \
-                                (i) <= INFO_MODE_LEVELSET ? (i) :      \
+#define DRAW_MODE_INFO(i)      ((i) >= INFO_MODE_TITLE &&                      \
+                                (i) <= INFO_MODE_LEVELSET ? (i) :              \
                                 INFO_MODE_MAIN)
 
-#define DRAW_MODE_SETUP(i)     ((i) >= SETUP_MODE_MAIN &&              \
-                                (i) <= SETUP_MODE_SHORTCUTS_5 ? (i) :  \
-                                (i) >= SETUP_MODE_CHOOSE_GRAPHICS &&   \
-                                (i) <= SETUP_MODE_CHOOSE_MUSIC ?       \
-                                SETUP_MODE_CHOOSE_ARTWORK :            \
+#define DRAW_MODE_SETUP(i)     ((i) >= SETUP_MODE_MAIN &&                      \
+                                (i) <= SETUP_MODE_SHORTCUTS_6 ? (i) :          \
+                                (i) >= SETUP_MODE_CHOOSE_GRAPHICS &&           \
+                                (i) <= SETUP_MODE_CHOOSE_MUSIC ?               \
+                                SETUP_MODE_CHOOSE_ARTWORK :                    \
                                 SETUP_MODE_CHOOSE_OTHER)
 
-#define DRAW_XOFFSET_INFO(i)   (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ?  \
-                                menu.draw_xoffset[GAME_MODE_INFO] :    \
+#define DRAW_XOFFSET_INFO(i)   (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ?          \
+                                menu.draw_xoffset[GAME_MODE_INFO] :            \
                                 menu.draw_xoffset_info[DRAW_MODE_INFO(i)])
-#define DRAW_YOFFSET_INFO(i)   (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ?  \
-                                menu.draw_yoffset[GAME_MODE_INFO] :    \
+#define DRAW_YOFFSET_INFO(i)   (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ?          \
+                                menu.draw_yoffset[GAME_MODE_INFO] :            \
                                 menu.draw_yoffset_info[DRAW_MODE_INFO(i)])
-#define EXTRA_SPACING_INFO(i)  (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ? \
-                                menu.extra_spacing[GAME_MODE_INFO] :   \
+#define EXTRA_SPACING_INFO(i)  (DRAW_MODE_INFO(i) == INFO_MODE_MAIN ?          \
+                                menu.extra_spacing[GAME_MODE_INFO] :           \
                                 menu.extra_spacing_info[DRAW_MODE_INFO(i)])
 
-#define DRAW_XOFFSET_SETUP(i)  (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ? \
-                                menu.draw_xoffset[GAME_MODE_SETUP] :   \
+#define DRAW_XOFFSET_SETUP(i)  (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ?        \
+                                menu.draw_xoffset[GAME_MODE_SETUP] :           \
                                 menu.draw_xoffset_setup[DRAW_MODE_SETUP(i)])
-#define DRAW_YOFFSET_SETUP(i)  (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ? \
-                                menu.draw_yoffset[GAME_MODE_SETUP] :   \
+#define DRAW_YOFFSET_SETUP(i)  (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ?        \
+                                menu.draw_yoffset[GAME_MODE_SETUP] :           \
                                 menu.draw_yoffset_setup[DRAW_MODE_SETUP(i)])
-#define EXTRA_SPACING_SETUP(i) (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ? \
-                                menu.extra_spacing[GAME_MODE_SETUP] :  \
+#define EXTRA_SPACING_SETUP(i) (DRAW_MODE_SETUP(i) == SETUP_MODE_MAIN ?        \
+                                menu.extra_spacing[GAME_MODE_SETUP] :          \
                                 menu.extra_spacing_setup[DRAW_MODE_SETUP(i)])
 
 #define EXTRA_SPACING_SCORES(i)        (EXTRA_SPACING_INFO(i))
 
 #define EXTRA_SPACING_SCOREINFO(i) (menu.extra_spacing[GAME_MODE_SCOREINFO])
 
-#define DRAW_XOFFSET(s)                ((s) == GAME_MODE_INFO ?                \
-                                DRAW_XOFFSET_INFO(info_mode) :         \
-                                (s) == GAME_MODE_SETUP ?               \
-                                DRAW_XOFFSET_SETUP(setup_mode) :       \
+#define DRAW_XOFFSET(s)                ((s) == GAME_MODE_INFO  ? DRAW_XOFFSET_INFO(info_mode) :        \
+                                (s) == GAME_MODE_SETUP ? DRAW_XOFFSET_SETUP(setup_mode) :      \
                                 menu.draw_xoffset[DRAW_MODE(s)])
-#define DRAW_YOFFSET(s)                ((s) == GAME_MODE_INFO ?                \
-                                DRAW_YOFFSET_INFO(info_mode) :         \
-                                (s) == GAME_MODE_SETUP ?               \
-                                DRAW_YOFFSET_SETUP(setup_mode) :       \
+
+#define DRAW_YOFFSET(s)                ((s) == GAME_MODE_INFO  ? DRAW_YOFFSET_INFO(info_mode) :        \
+                                (s) == GAME_MODE_SETUP ? DRAW_YOFFSET_SETUP(setup_mode) :      \
                                 menu.draw_yoffset[DRAW_MODE(s)])
-#define EXTRA_SPACING(s)       ((s) == GAME_MODE_INFO ?                \
-                                EXTRA_SPACING_INFO(info_mode) :        \
-                                (s) == GAME_MODE_SETUP ?               \
-                                EXTRA_SPACING_SETUP(setup_mode) :      \
-                                (s) == GAME_MODE_SCORES ?              \
-                                EXTRA_SPACING_SCORES(info_mode) :      \
+
+#define EXTRA_SPACING(s)       ((s) == GAME_MODE_INFO   ? EXTRA_SPACING_INFO(info_mode) :      \
+                                (s) == GAME_MODE_SETUP  ? EXTRA_SPACING_SETUP(setup_mode) :    \
+                                (s) == GAME_MODE_SCORES ? EXTRA_SPACING_SCORES(info_mode) :    \
                                 menu.extra_spacing[DRAW_MODE(s)])
 
 #define mSX                    (SX + DRAW_XOFFSET(game_status))
@@ -666,14 +777,12 @@ static int align_yoffset = 0;
                                    menu.list_size[game_status] :       \
                                    MAX_MENU_ENTRIES_ON_SCREEN)
 
-#define IN_VIS_MENU(x, y)      IN_FIELD(x, y, SCR_FIELDX,              \
-                                        NUM_MENU_ENTRIES_ON_SCREEN)
+#define IN_VIS_MENU(x, y)      IN_FIELD(x, y, SCR_FIELDX, NUM_MENU_ENTRIES_ON_SCREEN)
 
 
 // title display and control definitions
 
-#define MAX_NUM_TITLE_SCREENS  (2 * MAX_NUM_TITLE_IMAGES +             \
-                                2 * MAX_NUM_TITLE_MESSAGES)
+#define MAX_NUM_TITLE_SCREENS  (2 * MAX_NUM_TITLE_IMAGES + 2 * MAX_NUM_TITLE_MESSAGES)
 
 #define NO_DIRECT_LEVEL_SELECT (-1)
 
@@ -692,17 +801,6 @@ struct TitleControlInfo
 struct TitleControlInfo title_controls[MAX_NUM_TITLE_SCREENS];
 
 
-// credits screens definitions
-
-static int num_credits_screens = 0;
-static boolean use_global_credits_screens = FALSE;
-
-
-// program info screens definitions
-
-static int num_program_info_screens = 0;
-
-
 // main menu display and control definitions
 
 #define MAIN_CONTROL_NAME                      0
@@ -930,6 +1028,11 @@ static struct MainControlInfo main_controls[] =
 };
 
 
+static boolean hasLevelSetInfo(void)
+{
+  return (getLevelSetInfoFilename(0) != NULL);
+}
+
 static int getTitleScreenGraphic(int nr, boolean initial)
 {
   return (initial ? IMG_TITLESCREEN_INITIAL_1 : IMG_TITLESCREEN_1) + nr;
@@ -1102,6 +1205,27 @@ static int compareTitleControlInfo(const void *object1, const void *object2)
   return compare_result;
 }
 
+static boolean CheckTitleScreen_BD(int nr, boolean initial)
+{
+  // only show BD style title screen for native BD level sets
+  if (level.game_engine_type != GAME_ENGINE_TYPE_BD)
+    return FALSE;
+
+  // only show BD style title screen for first title screen of a level set
+  if (initial || nr != 0)
+    return FALSE;
+
+  int graphic = getTitleScreenGraphic(nr, initial);
+  Bitmap *bitmap = graphic_info[graphic].bitmap;
+
+  // only show BD style title screen if no other title screen defined
+  if (bitmap != NULL)
+    return FALSE;
+
+  // check if BD style title screen defined
+  return (GetTitleScreenBitmaps_BD() != NULL);
+}
+
 static void InitializeTitleControlsExt_AddTitleInfo(boolean is_image,
                                                    boolean initial,
                                                    int nr, int sort_priority)
@@ -1125,8 +1249,13 @@ static void InitializeTitleControls_CheckTitleInfo(boolean initial)
     int graphic = getTitleScreenGraphic(i, initial);
     Bitmap *bitmap = graphic_info[graphic].bitmap;
     int sort_priority = graphic_info[graphic].sort_priority;
+    boolean has_title_screen = (bitmap != NULL);
 
-    if (bitmap != NULL)
+    // check for optional title screen of native BD style level set
+    if (CheckTitleScreen_BD(i, initial))
+      has_title_screen = TRUE;
+
+    if (has_title_screen)
       InitializeTitleControlsExt_AddTitleInfo(TRUE, initial, i, sort_priority);
   }
 
@@ -1549,22 +1678,64 @@ static void drawChooseTreeEdit(int ypos_raw, boolean active)
   DrawText(sx, sy, STR_CHOOSE_TREE_EDIT, font_nr);
 }
 
-static void DrawHeadline(void)
+static void DrawInfoScreen_Headline(int screen_nr, int num_screens,
+                                   int use_global_screens)
 {
-  DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, main_text_title_1);
-  DrawTextSCentered(MENU_TITLE2_YPOS, FONT_TITLE_2, main_text_title_2);
+  char *info_text_title_1 = getInfoScreenTitle_Generic();
+  char info_text_title_2[MAX_LINE_LEN + 1];
+
+  if (num_screens > 1)
+  {
+    sprintf(info_text_title_2, "Page %d of %d", screen_nr + 1, num_screens);
+  }
+  else
+  {
+    char *text_format = (use_global_screens ? "for %s" : "for \"%s\"");
+    int text_format_len = strlen(text_format) - strlen("%s");
+    int max_text_len = SXSIZE / getFontWidth(FONT_TITLE_2);
+    int max_name_len = max_text_len - text_format_len;
+    char name_cut[max_name_len];
+    char *name_full = (use_global_screens ? getProgramTitleString() :
+                      leveldir_current->name);
+
+    snprintf(name_cut, max_name_len, "%s", name_full);
+    snprintf(info_text_title_2, max_text_len, text_format, name_cut);
+  }
+
+  DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, info_text_title_1);
+  DrawTextSCentered(MENU_TITLE2_YPOS, FONT_TITLE_2, info_text_title_2);
 }
 
 static void DrawTitleScreenImage(int nr, boolean initial)
 {
+  static int frame_counter = 0;
   int graphic = getTitleScreenGraphic(nr, initial);
   Bitmap *bitmap = graphic_info[graphic].bitmap;
+  Bitmap *bitmap_background = NULL;
+  int draw_masked = graphic_info[graphic].draw_masked;
   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;
   int dst_x, dst_y;
 
+  // check for optional title screen of native BD style level set
+  if (CheckTitleScreen_BD(nr, initial))
+  {
+    Bitmap **title_screen_bitmaps = GetTitleScreenBitmaps_BD();
+
+    bitmap            = title_screen_bitmaps[0];
+    bitmap_background = title_screen_bitmaps[1];
+
+    if (bitmap != NULL)
+    {
+      width  = bitmap->width;
+      height = bitmap->height;
+      src_x = 0;
+      src_y = 0;
+    }
+  }
+
   if (bitmap == NULL)
     return;
 
@@ -1591,7 +1762,19 @@ static void DrawTitleScreenImage(int nr, boolean initial)
 
   ClearRectangleOnBackground(drawto, 0, 0, WIN_XSIZE, WIN_YSIZE);
 
-  if (DrawingOnBackground(dst_x, dst_y))
+  boolean draw_masked_final = (DrawingOnBackground(dst_x, dst_y) && draw_masked);
+
+  if (bitmap_background != NULL)
+  {
+    int size = bitmap_background->height - bitmap->height;
+    int offset = frame_counter++ % size;
+
+    BlitBitmap(bitmap_background, drawto, src_x, src_y + offset, width, height, dst_x, dst_y);
+
+    draw_masked_final = TRUE;
+  }
+
+  if (draw_masked_final)
     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);
@@ -1742,6 +1925,18 @@ void DrawMainMenu(void)
   // store valid level series information
   leveldir_last_valid = leveldir_current;
 
+  // store first level of this level set for "level_nr" style animations
+  SetAnimationFirstLevel(leveldir_current->first_level);
+
+  // level_nr may have been set to value over handicap with level editor
+  if (setup.allow_skipping_levels != STATE_TRUE && level_nr > leveldir_current->handicap_level)
+    level_nr = leveldir_current->handicap_level;
+
+  LoadLevel(level_nr);
+  LoadScore(level_nr);
+
+  SaveLevelSetup_SeriesInfo();
+
   // needed if last screen (level choice) changed graphics, sounds or music
   ReloadCustomArtwork(0);
 
@@ -1767,15 +1962,6 @@ void DrawMainMenu(void)
 
   SetDrawtoField(DRAW_TO_BACKBUFFER);
 
-  // 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);
-
-  SaveLevelSetup_SeriesInfo();
-
   // set this after "ChangeViewportPropertiesIfNeeded()" (which may reset it)
   SetDrawDeactivationMask(REDRAW_NONE);
   SetDrawBackgroundMask(REDRAW_FIELD);
@@ -1816,6 +2002,7 @@ void DrawMainMenu(void)
   MapTapeButtons();
   MapScreenMenuGadgets(SCREEN_MASK_MAIN);
   UpdateScreenMenuGadgets(SCREEN_MASK_MAIN_HAS_SOLUTION, hasSolutionTape());
+  UpdateScreenMenuGadgets(SCREEN_MASK_MAIN_HAS_SET_INFO, hasLevelSetInfo());
 
   // copy actual game door content to door double buffer for OpenDoor()
   BlitBitmap(drawto, bitmap_db_door_1, DX, DY, DXSIZE, DYSIZE, 0, 0);
@@ -2033,6 +2220,21 @@ void HandleTitleScreen(int mx, int my, int dx, int dy, int button)
       return_to_main_menu = TRUE;
     }
   }
+  else
+  {
+    tci = &title_controls[title_screen_nr];
+
+    // check for optional title screen of native BD style level set
+    if (tci->is_image && CheckTitleScreen_BD(tci->local_nr, tci->initial))
+    {
+      Bitmap **title_screen_bitmaps = GetTitleScreenBitmaps_BD();
+
+      // if title screen is animated, draw title screen animation
+      if (title_screen_bitmaps[0] != NULL &&
+         title_screen_bitmaps[1] != NULL)
+       DrawTitleScreenImage(tci->local_nr, tci->initial);
+    }
+  }
 
   if (return_to_main_menu)
   {
@@ -2084,11 +2286,14 @@ static void HandleMainMenu_SelectLevel(int step, int direction,
   if (new_level_nr > leveldir_current->last_level)
     new_level_nr = leveldir_current->last_level;
 
-  if (setup.handicap && new_level_nr > leveldir_current->handicap_level)
+  if (setup.allow_skipping_levels != STATE_TRUE && new_level_nr > leveldir_current->handicap_level)
   {
     // skipping levels is only allowed when trying to skip single level
-    if (setup.skip_levels && new_level_nr == old_level_nr + 1 &&
-       Request("Level still unsolved! Skip it anyway?", REQ_ASK))
+    // (also, skipping BD style intermission levels is always possible)
+    if (new_level_nr == old_level_nr + 1 &&
+       (level.bd_intermission ||
+        (setup.allow_skipping_levels == STATE_ASK &&
+         Request("Level still unsolved! Skip it anyway?", REQ_ASK))))
     {
       leveldir_current->handicap_level++;
       SaveLevelSetup_SeriesInfo();
@@ -2411,15 +2616,15 @@ static void execExitInfo(void)
 
 static struct TokenInfo info_info_main[] =
 {
-  { TYPE_ENTER_SCREEN, execInfoTitleScreen,    "Title Screen"          },
-  { TYPE_ENTER_SCREEN, execInfoElements,       "Elements Info"         },
-  { TYPE_ENTER_SCREEN, execInfoMusic,          "Music Info"            },
-  { TYPE_ENTER_SCREEN, execInfoCredits,        "Credits"               },
-  { TYPE_ENTER_SCREEN, execInfoProgram,        "Program Info"          },
-  { TYPE_ENTER_SCREEN, execInfoVersion,        "Version Info"          },
-  { TYPE_ENTER_SCREEN, execInfoLevelSet,       "Level Set Info"        },
+  { TYPE_ENTER_SCREEN, execInfoTitleScreen,    STR_INFO_TITLE          },
+  { TYPE_ENTER_SCREEN, execInfoElements,       STR_INFO_ELEMENTS       },
+  { TYPE_ENTER_SCREEN, execInfoMusic,          STR_INFO_MUSIC          },
+  { TYPE_ENTER_SCREEN, execInfoCredits,        STR_INFO_CREDITS        },
+  { TYPE_ENTER_SCREEN, execInfoProgram,        STR_INFO_PROGRAM        },
+  { TYPE_ENTER_SCREEN, execInfoVersion,        STR_INFO_VERSION        },
+  { TYPE_ENTER_SCREEN, execInfoLevelSet,       STR_INFO_LEVELSET       },
   { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execExitInfo,           "Exit"                  },
+  { TYPE_LEAVE_MENU,   execExitInfo,           STR_INFO_EXIT           },
 
   { 0,                 NULL,                   NULL                    }
 };
@@ -2429,6 +2634,7 @@ static int getMenuTextFont(int type)
   if (type & (TYPE_SWITCH      |
              TYPE_YES_NO       |
              TYPE_YES_NO_AUTO  |
+             TYPE_YES_NO_ASK   |
              TYPE_STRING       |
              TYPE_PLAYER       |
              TYPE_ECS_AGA      |
@@ -2445,6 +2651,78 @@ static struct TokenInfo setup_info_input[];
 
 static struct TokenInfo *menu_info;
 
+static void PlayInfoSound(void)
+{
+  int info_sound = getInfoScreenBackgroundSound_Generic();
+  char *next_sound = getSoundInfoEntryFilename(info_sound);
+
+  if (next_sound != NULL)
+    PlayMenuSoundExt(info_sound);
+  else
+    PlayMenuSound();
+}
+
+static void PlayInfoSoundIfLoop(void)
+{
+  int info_sound = getInfoScreenBackgroundSound_Generic();
+  char *next_sound = getSoundInfoEntryFilename(info_sound);
+
+  if (next_sound != NULL)
+    PlayMenuSoundIfLoopExt(info_sound);
+  else
+    PlayMenuSoundIfLoop();
+}
+
+static void PlayInfoMusic(void)
+{
+  int info_music = getInfoScreenBackgroundMusic_Generic();
+  char *curr_music = getCurrentlyPlayingMusicFilename();
+  char *next_music = getMusicInfoEntryFilename(info_music);
+
+  if (next_music != NULL)
+  {
+    // play music if info screen music differs from current music
+    if (!strEqual(curr_music, next_music))
+      PlayMenuMusicExt(info_music);
+  }
+  else
+  {
+    // only needed if info screen was directly invoked from main menu
+    PlayMenuMusic();
+  }
+}
+
+static void PlayInfoSoundsAndMusic(void)
+{
+  PlayInfoSound();
+  PlayInfoMusic();
+}
+
+static void FadeInfoSounds(void)
+{
+  FadeSounds();
+}
+
+static void FadeInfoMusic(void)
+{
+  int info_music = getInfoScreenBackgroundMusic_Generic();
+  char *curr_music = getCurrentlyPlayingMusicFilename();
+  char *next_music = getMusicInfoEntryFilename(info_music);
+
+  if (next_music != NULL)
+  {
+    // fade music if info screen music differs from current music
+    if (!strEqual(curr_music, next_music))
+      FadeMusic();
+  }
+}
+
+static void FadeInfoSoundsAndMusic(void)
+{
+  FadeInfoSounds();
+  FadeInfoMusic();
+}
+
 static void DrawCursorAndText_Menu_Ext(struct TokenInfo *token_info,
                                       int screen_pos, int menu_info_pos_raw,
                                       boolean active)
@@ -2549,6 +2827,18 @@ static void DrawInfoScreen_Main(void)
   int fade_mask = REDRAW_FIELD;
   int i;
 
+  // (needed after displaying info sub-screens directly from main menu)
+  if (info_screens_from_main)
+  {
+    info_screens_from_main = FALSE;
+
+    SetGameStatus(GAME_MODE_MAIN);
+
+    DrawMainMenu();
+
+    return;
+  }
+
   if (redraw_mask & REDRAW_ALL)
     fade_mask = REDRAW_ALL;
 
@@ -2577,7 +2867,7 @@ static void DrawInfoScreen_Main(void)
 
   OpenDoor(GetDoorState() | DOOR_NO_DELAY | DOOR_FORCE_REDRAW);
 
-  DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Info Screen");
+  DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, STR_INFO_MAIN);
 
   info_info = info_info_main;
 
@@ -2791,6 +3081,7 @@ static void HandleMenuScreen(int mx, int my, int dx, int dy, int button,
       if (menu_info[choice].type & menu_navigation_type ||
          menu_info[choice].type & TYPE_BOOLEAN_STYLE ||
          menu_info[choice].type & TYPE_YES_NO_AUTO ||
+         menu_info[choice].type & TYPE_YES_NO_ASK ||
          menu_info[choice].type & TYPE_PLAYER)
        button = MB_MENU_CHOICE;
     }
@@ -2946,15 +3237,23 @@ static int getMenuTextStep(int spacing_height, int font_nr)
   return getFontHeight(font_nr) + getMenuTextSpacing(spacing_height, font_nr);
 }
 
+static int getHeadlineSpacing(void)
+{
+  // special compatibility handling for "R'n'D jue 2022" game editions
+  int spacing_check = menu.headline1_spacing[GAME_MODE_SCOREINFO];
+  int spacing = (game_status == GAME_MODE_SCOREINFO ?
+                menu.headline1_spacing[GAME_MODE_SCOREINFO] :
+                menu.headline1_spacing_info[info_mode]);
+  int font = MENU_INFO_FONT_TITLE;
+
+  return (spacing_check != -2 ? getMenuTextStep(spacing, font) : 0);
+}
+
 void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
 {
-  int font_title = MENU_INFO_FONT_TITLE;
   int font_error = FONT_TEXT_2;
   int font_foot  = MENU_INFO_FONT_FOOT;
-  int spacing_title = menu.headline1_spacing_info[info_mode];
-  int ystep_title = getMenuTextStep(spacing_title, font_title);
-  int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1;
-  int ystart2 = ystart1 + ystep_title;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO);
@@ -2962,27 +3261,27 @@ void DrawInfoScreen_NotAvailable(char *text_title, char *text_error)
   FadeOut(REDRAW_FIELD);
 
   ClearField();
-  DrawHeadline();
 
-  DrawTextSCentered(ystart1, font_title, text_title);
-  DrawTextSCentered(ystart2, font_error, text_error);
+  DrawInfoScreen_Headline(0, 1, FALSE);
 
-  DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
+  DrawTextSCentered(ystart, font_error, text_error);
+  DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU);
 
   FadeIn(REDRAW_FIELD);
 }
 
 void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
 {
-  static int infoscreen_step[MAX_INFO_ELEMENTS_ON_SCREEN];
-  static int infoscreen_frame[MAX_INFO_ELEMENTS_ON_SCREEN];
-  int font_title = MENU_INFO_FONT_TITLE;
-  int font_foot  = MENU_INFO_FONT_FOOT;
-  int xstart  = mSX + MENU_SCREEN_INFO_SPACE_LEFT;
-  int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1;
-  int ystart2 = mSY + MENU_SCREEN_INFO_YSTART2;
+  static int infoscreen_step[MAX_INFO_ELEMENTS_IN_ARRAY];
+  static int infoscreen_frame[MAX_INFO_ELEMENTS_IN_ARRAY];
+  int font_foot = MENU_INFO_FONT_FOOT;
+  int xstart = mSX + MENU_SCREEN_INFO_SPACE_LEFT;
+  int ystart = mSY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
   int ystep = MENU_SCREEN_INFO_YSTEP;
+  int row_height = MENU_SCREEN_INFO_ENTRY_SIZE;
+  int tilesize = MENU_SCREEN_INFO_TILE_SIZE;
+  int yoffset = (row_height - tilesize) / 2;
   int element, action, direction;
   int graphic;
   int delay;
@@ -2994,10 +3293,6 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
     for (i = 0; i < NUM_INFO_ELEMENTS_ON_SCREEN; i++)
       infoscreen_step[i] = infoscreen_frame[i] = 0;
 
-    ClearField();
-    DrawHeadline();
-
-    DrawTextSCentered(ystart1, font_title, "The Game Elements:");
     DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_PAGE);
 
     FrameCounter = 0;
@@ -3020,7 +3315,10 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
       continue;
     }
 
-    j += infoscreen_step[i - start];
+    int ypos = i - start;
+    int ystart_pos = ystart + ypos * ystep + yoffset;
+
+    j += infoscreen_step[ypos];
 
     element = helpanim_info[j].element;
     action = helpanim_info[j].action;
@@ -3043,39 +3341,38 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
     if (delay == -1)
       delay = 1000000;
 
-    if (infoscreen_frame[i - start] == 0)
+    if (infoscreen_frame[ypos] == 0)
     {
       sync_frame = 0;
-      infoscreen_frame[i - start] = delay - 1;
+      infoscreen_frame[ypos] = delay - 1;
     }
     else
     {
-      sync_frame = delay - infoscreen_frame[i - start];
-      infoscreen_frame[i - start]--;
+      sync_frame = delay - infoscreen_frame[ypos];
+      infoscreen_frame[ypos]--;
     }
 
     if (helpanim_info[j].element == HELPANIM_LIST_NEXT)
     {
-      if (!infoscreen_frame[i - start])
-       infoscreen_step[i - start] = 0;
+      if (!infoscreen_frame[ypos])
+       infoscreen_step[ypos] = 0;
     }
     else
     {
-      if (!infoscreen_frame[i - start])
-       infoscreen_step[i - start]++;
+      if (!infoscreen_frame[ypos])
+       infoscreen_step[ypos]++;
       while (helpanim_info[j].element != HELPANIM_LIST_NEXT)
        j++;
     }
 
     j++;
 
-    ClearRectangleOnBackground(drawto, xstart, ystart2 + (i - start) * ystep,
-                              TILEX, TILEY);
-    DrawFixedGraphicAnimationExt(drawto, xstart, ystart2 + (i - start) * ystep,
-                                graphic, sync_frame, USE_MASKING);
+    ClearRectangleOnBackground(drawto, xstart, ystart_pos, tilesize, tilesize);
+    DrawSizedGraphicAnimationExt(drawto, xstart, ystart_pos,
+                                graphic, sync_frame, tilesize, USE_MASKING);
 
     if (init)
-      DrawInfoScreen_HelpText(element, action, direction, i - start);
+      DrawInfoScreen_HelpText(element, action, direction, ypos);
 
     i++;
   }
@@ -3105,15 +3402,24 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
   int font_nr = FONT_INFO_ELEMENTS;
   int font_width = getFontWidth(font_nr);
   int font_height = getFontHeight(font_nr);
-  int yoffset = (TILEX - 2 * font_height) / 2;
-  int xstart = mSX + MENU_SCREEN_INFO_SPACE_LEFT + TILEX + MINI_TILEX;
-  int ystart = mSY + MENU_SCREEN_INFO_YSTART2 + yoffset;
-  int ystep = TILEY + 4;
+  int line_spacing = MENU_SCREEN_INFO_SPACE_LINE;
+  int left_spacing = MENU_SCREEN_INFO_SPACE_LEFT;
+  int middle_spacing = MENU_SCREEN_INFO_SPACE_MIDDLE;
+  int right_spacing = MENU_SCREEN_INFO_SPACE_RIGHT;
+  int line_height = font_height + line_spacing;
+  int row_height = MENU_SCREEN_INFO_ENTRY_SIZE;
+  int tilesize = MENU_SCREEN_INFO_TILE_SIZE;
+  int xstart = mSX + left_spacing + tilesize + middle_spacing;
+  int ystart = mSY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
+  int ystep = MENU_SCREEN_INFO_YSTEP;
   int pad_left = xstart - SX;
-  int pad_right = MENU_SCREEN_INFO_SPACE_RIGHT;
+  int pad_right = right_spacing;
   int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width;
-  int max_lines_per_text = 2;    
+  int max_lines_per_text = (row_height + line_spacing) / line_height;
   char *text = NULL;
+  boolean autowrap = TRUE;
+  boolean centered = FALSE;
+  boolean parse_comments = FALSE;
 
   if (action != -1 && direction != -1)         // element.action.direction
     text = getHelpText(element, action, direction);
@@ -3130,18 +3436,30 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos)
   if (text == NULL)                            // not found
     text = "No description available";
 
-  if (strlen(text) <= max_chars_per_line)      // only one line of text
-    ystart += getFontHeight(font_nr) / 2;
+  DisableDrawingText();
+
+  // first get number of text lines to calculate offset for centering text
+  int num_lines_printed =
+    DrawTextBuffer(0, 0, text, font_nr,
+                  max_chars_per_line, -1, max_lines_per_text, line_spacing, -1,
+                  autowrap, centered, parse_comments);
+
+  EnableDrawingText();
 
-  DrawTextBuffer(xstart, ystart + ypos * ystep, text, font_nr,
-                max_chars_per_line, -1, max_lines_per_text, 0, -1,
-                TRUE, FALSE, FALSE);
+  int size_lines_printed = num_lines_printed * line_height - line_spacing;
+  int yoffset = (row_height - size_lines_printed) / 2;
+
+  DrawTextBuffer(xstart, ystart + ypos * ystep + yoffset, text, font_nr,
+                max_chars_per_line, -1, max_lines_per_text, line_spacing, -1,
+                autowrap, centered, parse_comments);
 }
 
 static void DrawInfoScreen_TitleScreen(void)
 {
   SetGameStatus(GAME_MODE_TITLE);
 
+  UnmapAllGadgets();
+
   DrawTitleScreen();
 }
 
@@ -3154,6 +3472,9 @@ static void DrawInfoScreen_Elements(void)
 {
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_ELEMENTS);
 
+  UnmapAllGadgets();
+  FadeInfoSoundsAndMusic();
+
   FadeOut(REDRAW_FIELD);
 
   LoadHelpAnimInfo();
@@ -3161,6 +3482,8 @@ static void DrawInfoScreen_Elements(void)
 
   HandleInfoScreen_Elements(0, 0, MB_MENU_INITIALIZE);
 
+  PlayInfoSoundsAndMusic();
+
   FadeIn(REDRAW_FIELD);
 }
 
@@ -3216,7 +3539,7 @@ void HandleInfoScreen_Elements(int dx, int dy, int button)
 
     if (page < 0 || page >= num_pages)
     {
-      FadeMenuSoundsAndMusic();
+      FadeInfoSoundsAndMusic();
 
       info_mode = INFO_MODE_MAIN;
       DrawInfoScreen();
@@ -3230,6 +3553,9 @@ void HandleInfoScreen_Elements(int dx, int dy, int button)
     if (button != MB_MENU_INITIALIZE)
       FadeOut(REDRAW_FIELD);
 
+    ClearField();
+
+    DrawInfoScreen_Headline(page, num_pages, TRUE);
     DrawInfoScreen_HelpAnim(page * anims_per_page, num_anims, TRUE);
 
     if (button != MB_MENU_INITIALIZE)
@@ -3241,7 +3567,7 @@ void HandleInfoScreen_Elements(int dx, int dy, int button)
       if (page < num_pages)
        DrawInfoScreen_HelpAnim(page * anims_per_page, num_anims, FALSE);
 
-    PlayMenuSoundIfLoop();
+    PlayInfoSoundIfLoop();
   }
 }
 
@@ -3249,10 +3575,13 @@ static void DrawInfoScreen_Music(void)
 {
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_MUSIC);
 
+  UnmapAllGadgets();
+
   FadeOut(REDRAW_FIELD);
 
   ClearField();
-  DrawHeadline();
+
+  DrawInfoScreen_Headline(0, 1, TRUE);
 
   LoadMusicInfo();
 
@@ -3264,19 +3593,30 @@ static void DrawInfoScreen_Music(void)
 void HandleInfoScreen_Music(int dx, int dy, int button)
 {
   static struct MusicFileInfo *list = NULL;
+  static int num_screens = 0;
+  static int screen_nr = 0;
   int font_title = MENU_INFO_FONT_TITLE;
   int font_head  = MENU_INFO_FONT_HEAD;
   int font_text  = MENU_INFO_FONT_TEXT;
   int font_foot  = MENU_INFO_FONT_FOOT;
-  int spacing_title = menu.headline1_spacing_info[info_mode];
-  int spacing_head  = menu.headline2_spacing_info[info_mode];
-  int ystep_title = getMenuTextStep(spacing_title, font_title);
-  int ystep_head  = getMenuTextStep(spacing_head,  font_head);
-  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+  int spacing_head = menu.headline2_spacing_info[info_mode];
+  int ystep_head = getMenuTextStep(spacing_head,  font_head);
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART;
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   if (button == MB_MENU_INITIALIZE)
   {
+    struct MusicFileInfo *list_ptr = music_file_info;
+
+    num_screens = 0;
+    screen_nr = 0;
+
+    while (list_ptr != NULL)
+    {
+      list_ptr = list_ptr->next;
+      num_screens++;
+    }
+
     list = music_file_info;
 
     if (list == NULL)
@@ -3284,10 +3624,11 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
       FadeMenuSoundsAndMusic();
 
       ClearField();
-      DrawHeadline();
+
+      DrawInfoScreen_Headline(0, 1, TRUE);
 
       DrawTextSCentered(ystart, font_title, "No music info for this level set.");
-      DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
+      DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU);
 
       return;
     }
@@ -3311,7 +3652,10 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
       PlaySound(SND_MENU_ITEM_SELECTING);
 
       if (list != NULL)
+      {
        list = (dx < 0 ? list->prev : list->next);
+       screen_nr += (dx < 0 ? -1 : +1);
+      }
     }
 
     if (list == NULL)
@@ -3333,7 +3677,8 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
       FadeOut(REDRAW_FIELD);
 
     ClearField();
-    DrawHeadline();
+
+    DrawInfoScreen_Headline(screen_nr, num_screens, TRUE);
 
     if (list->is_sound)
     {
@@ -3343,8 +3688,6 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
        PlaySoundLoop(sound);
       else
        PlaySound(sound);
-
-      DrawTextSCentered(ystart, font_title, "The Game Background Sounds:");
     }
     else
     {
@@ -3354,19 +3697,16 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
        PlayMusicLoop(music);
       else
        PlayMusic(music);
-
-      DrawTextSCentered(ystart, font_title, "The Game Background Music:");
     }
 
-    ystart += ystep_title;
-
     if (!strEqual(list->title, UNKNOWN_NAME))
     {
       if (!strEqual(list->title_header, UNKNOWN_NAME))
-      {
        DrawTextSCentered(ystart, font_head, list->title_header);
-       ystart += ystep_head;
-      }
+      else
+       DrawTextSCentered(ystart, font_head, "Track");
+
+      ystart += ystep_head;
 
       DrawTextFCentered(ystart, font_text, "\"%s\"", list->title);
       ystart += ystep_head;
@@ -3411,6 +3751,51 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
       ystart += ystep_head;
     }
 
+    if (!strEqual(list->played, UNKNOWN_NAME))
+    {
+      if (!strEqual(list->played_header, UNKNOWN_NAME))
+       DrawTextSCentered(ystart, font_head, list->played_header);
+      else
+       DrawTextSCentered(ystart, font_head, "played in");
+
+      ystart += ystep_head;
+
+      DrawTextFCentered(ystart, font_text, "%s", list->played);
+      ystart += ystep_head;
+    }
+    else if (!list->is_sound)
+    {
+      int music_level_nr = -1;
+      int i;
+
+      // check if this music is configured for a certain level
+      for (i = leveldir_current->first_level;
+          i <= leveldir_current->last_level; i++)
+      {
+       // (special case: "list->music" may be negative for unconfigured music)
+       if (levelset.music[i] != MUS_UNDEFINED &&
+           levelset.music[i] == list->music)
+       {
+         music_level_nr = i;
+
+         break;
+       }
+      }
+
+      if (music_level_nr != -1)
+      {
+       if (!strEqual(list->played_header, UNKNOWN_NAME))
+         DrawTextSCentered(ystart, font_head, list->played_header);
+       else
+         DrawTextSCentered(ystart, font_head, "played in");
+
+       ystart += ystep_head;
+
+       DrawTextFCentered(ystart, font_text, "level %03d", music_level_nr);
+       ystart += ystep_head;
+      }
+    }
+
     DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_PAGE);
 
     if (button != MB_MENU_INITIALIZE)
@@ -3421,303 +3806,49 @@ void HandleInfoScreen_Music(int dx, int dy, int button)
     PlaySoundLoop(list->music);
 }
 
-static void DrawInfoScreen_CreditsScreen(int screen_nr)
+static void DrawInfoScreen_Version(void)
 {
-  int font_title = MENU_INFO_FONT_TITLE;
-  int font_text  = MENU_INFO_FONT_TEXT;
-  int font_foot  = MENU_INFO_FONT_FOOT;
-  int spacing_title = menu.headline1_spacing_info[info_mode];
-  int spacing_line  = menu.line_spacing_info[info_mode];
-  int ystep_title = getMenuTextStep(spacing_title, font_title);
-  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+  int font_head = MENU_INFO_FONT_HEAD;
+  int font_text = MENU_INFO_FONT_TEXT;
+  int font_foot = MENU_INFO_FONT_FOOT;
+  int spacing_head = menu.headline2_spacing_info[info_mode];
+  int spacing_para = menu.paragraph_spacing_info[info_mode];
+  int spacing_line = menu.line_spacing_info[info_mode];
+  int xstep = getFontWidth(font_text);
+  int ystep_head = getMenuTextStep(spacing_head,  font_head);
+  int ystep_para = getMenuTextStep(spacing_para,  font_text);
+  int ystep_line = getMenuTextStep(spacing_line,  font_text);
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
+  int xstart1 = mSX - SX + 2 * xstep;
+  int xstart2 = mSX - SX + 18 * xstep;
+  int xstart3 = mSX - SX + 28 * xstep;
+  SDL_version sdl_version_compiled;
+  const SDL_version *sdl_version_linked;
+  int driver_name_len = 10;
+  SDL_version sdl_version_linked_ext;
+  const char *driver_name = NULL;
 
-  ClearField();
-  DrawHeadline();
-
-  DrawTextSCentered(ystart, font_title, "Credits:");
-
-  char *filename = getCreditsFilename(screen_nr, use_global_credits_screens);
-  int width = SXSIZE;
-  int height = MENU_SCREEN_INFO_YBOTTOM - MENU_SCREEN_INFO_YSTART1;
-  int chars = width / getFontWidth(font_text);
-  int lines = height / getFontHeight(font_text);
-  int padx = (width - chars * getFontWidth(font_text)) / 2;
-  int line_spacing = getMenuTextSpacing(spacing_line, font_text);
-  boolean autowrap = FALSE;
-  boolean centered = TRUE;
-  boolean parse_comments = TRUE;
-
-  DrawTextFile(mSX + padx, mSY + MENU_SCREEN_INFO_YSTART1 + ystep_title,
-              filename, font_text, chars, -1, lines, line_spacing, -1,
-              autowrap, centered, parse_comments);
-
-  boolean last_screen = (screen_nr == num_credits_screens - 1);
-  char *text_foot = (last_screen ? TEXT_INFO_MENU : TEXT_NEXT_PAGE);
-
-  DrawTextSCentered(ybottom, font_foot, text_foot);
-}
-
-static void DrawInfoScreen_Credits(void)
-{
-  SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_CREDITS);
+  SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_VERSION);
 
-  FadeMenuSoundsAndMusic();
+  UnmapAllGadgets();
+  FadeInfoSoundsAndMusic();
 
   FadeOut(REDRAW_FIELD);
 
-  HandleInfoScreen_Credits(0, 0, MB_MENU_INITIALIZE);
+  ClearField();
 
-  FadeIn(REDRAW_FIELD);
-}
+  DrawInfoScreen_Headline(0, 1, TRUE);
 
-void HandleInfoScreen_Credits(int dx, int dy, int button)
-{
-  static int screen_nr = 0;
+  DrawTextF(xstart1, ystart, font_head, "Name");
+  DrawTextF(xstart2, ystart, font_text, getProgramTitleString());
+  ystart += ystep_line;
 
-  if (button == MB_MENU_INITIALIZE)
+  if (!strEqual(getProgramVersionString(), getProgramRealVersionString()))
   {
-    int i;
-
-    // determine number of (global or level set specific) credits screens
-    for (i = 0; i < 2; i++)
-    {
-      num_credits_screens = 0;
-      use_global_credits_screens = i;
-
-      while (getCreditsFilename(num_credits_screens,
-                               use_global_credits_screens) != NULL)
-       num_credits_screens++;
-
-      if (num_credits_screens > 0)
-       break;
-    }
-
-    if (num_credits_screens == 0)
-    {
-      int font_title = MENU_INFO_FONT_TITLE;
-      int font_foot  = MENU_INFO_FONT_FOOT;
-      int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
-      int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
-
-      ClearField();
-      DrawHeadline();
-
-      DrawTextSCentered(ystart, font_title, "No credits for this level set.");
-      DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
-
-      return;
-    }
-
-    screen_nr = 0;
-
-    DrawInfoScreen_CreditsScreen(screen_nr);
-  }
-  else if (button == MB_MENU_LEAVE)
-  {
-    PlaySound(SND_MENU_ITEM_SELECTING);
-
-    info_mode = INFO_MODE_MAIN;
-    DrawInfoScreen();
-
-    return;
-  }
-  else if (button == MB_MENU_CHOICE || dx)
-  {
-    PlaySound(SND_MENU_ITEM_SELECTING);
-
-    screen_nr += (dx < 0 ? -1 : +1);
-
-    if (screen_nr < 0 || screen_nr >= num_credits_screens)
-    {
-      FadeMenuSoundsAndMusic();
-
-      info_mode = INFO_MODE_MAIN;
-      DrawInfoScreen();
-
-      return;
-    }
-
-    FadeSetNextScreen();
-
-    FadeOut(REDRAW_FIELD);
-
-    DrawInfoScreen_CreditsScreen(screen_nr);
-
-    FadeIn(REDRAW_FIELD);
-  }
-  else
-  {
-    PlayMenuSoundIfLoop();
-  }
-}
-
-static void DrawInfoScreen_ProgramScreen(int screen_nr)
-{
-  int font_title = MENU_INFO_FONT_TITLE;
-  int font_text  = MENU_INFO_FONT_TEXT;
-  int font_foot  = MENU_INFO_FONT_FOOT;
-  int spacing_title = menu.headline1_spacing_info[info_mode];
-  int spacing_line  = menu.line_spacing_info[info_mode];
-  int ystep_title = getMenuTextStep(spacing_title, font_title);
-  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
-  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
-
-  ClearField();
-  DrawHeadline();
-
-  DrawTextSCentered(ystart, font_title, "Program Information:");
-
-  char *filename = getProgramInfoFilename(screen_nr);
-  int width = SXSIZE;
-  int height = MENU_SCREEN_INFO_YBOTTOM - MENU_SCREEN_INFO_YSTART1;
-  int chars = width / getFontWidth(font_text);
-  int lines = height / getFontHeight(font_text);
-  int padx = (width - chars * getFontWidth(font_text)) / 2;
-  int line_spacing = getMenuTextSpacing(spacing_line, font_text);
-  boolean autowrap = FALSE;
-  boolean centered = TRUE;
-  boolean parse_comments = TRUE;
-
-  DrawTextFile(mSX + padx, mSY + MENU_SCREEN_INFO_YSTART1 + ystep_title,
-              filename, font_text, chars, -1, lines, line_spacing, -1,
-              autowrap, centered, parse_comments);
-
-  boolean last_screen = (screen_nr == num_program_info_screens - 1);
-  char *text_foot = (last_screen ? TEXT_INFO_MENU : TEXT_NEXT_PAGE);
-
-  DrawTextSCentered(ybottom, font_foot, text_foot);
-}
-
-static void DrawInfoScreen_Program(void)
-{
-  SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_PROGRAM);
-
-  FadeMenuSoundsAndMusic();
-
-  FadeOut(REDRAW_FIELD);
-
-  HandleInfoScreen_Program(0, 0, MB_MENU_INITIALIZE);
-
-  FadeIn(REDRAW_FIELD);
-}
-
-void HandleInfoScreen_Program(int dx, int dy, int button)
-{
-  static int screen_nr = 0;
-
-  if (button == MB_MENU_INITIALIZE)
-  {
-    // determine number of program info screens
-    num_program_info_screens = 0;
-
-    while (getProgramInfoFilename(num_program_info_screens) != NULL)
-      num_program_info_screens++;
-
-    if (num_program_info_screens == 0)
-    {
-      int font_title = MENU_INFO_FONT_TITLE;
-      int font_foot  = MENU_INFO_FONT_FOOT;
-      int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
-      int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
-
-      ClearField();
-      DrawHeadline();
-
-      DrawTextSCentered(ystart, font_title, "No program info available.");
-      DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
-
-      return;
-    }
-
-    screen_nr = 0;
-
-    DrawInfoScreen_ProgramScreen(screen_nr);
-  }
-  else if (button == MB_MENU_LEAVE)
-  {
-    PlaySound(SND_MENU_ITEM_SELECTING);
-
-    info_mode = INFO_MODE_MAIN;
-    DrawInfoScreen();
-
-    return;
-  }
-  else if (button == MB_MENU_CHOICE || dx)
-  {
-    PlaySound(SND_MENU_ITEM_SELECTING);
-
-    screen_nr += (dx < 0 ? -1 : +1);
-
-    if (screen_nr < 0 || screen_nr >= num_program_info_screens)
-    {
-      FadeMenuSoundsAndMusic();
-
-      info_mode = INFO_MODE_MAIN;
-      DrawInfoScreen();
-
-      return;
-    }
-
-    FadeSetNextScreen();
-
-    FadeOut(REDRAW_FIELD);
-
-    DrawInfoScreen_ProgramScreen(screen_nr);
-
-    FadeIn(REDRAW_FIELD);
-  }
-  else
-  {
-    PlayMenuSoundIfLoop();
-  }
-}
-
-static void DrawInfoScreen_Version(void)
-{
-  int font_title = MENU_INFO_FONT_TITLE;
-  int font_head  = MENU_INFO_FONT_HEAD;
-  int font_text  = MENU_INFO_FONT_TEXT;
-  int font_foot  = MENU_INFO_FONT_FOOT;
-  int spacing_title = menu.headline1_spacing_info[info_mode];
-  int spacing_head  = menu.headline2_spacing_info[info_mode];
-  int spacing_para  = menu.paragraph_spacing_info[info_mode];
-  int spacing_line  = menu.line_spacing_info[info_mode];
-  int xstep = getFontWidth(font_text);
-  int ystep_title = getMenuTextStep(spacing_title, font_title);
-  int ystep_head  = getMenuTextStep(spacing_head,  font_head);
-  int ystep_para  = getMenuTextStep(spacing_para,  font_text);
-  int ystep_line  = getMenuTextStep(spacing_line,  font_text);
-  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
-  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
-  int xstart1 = mSX - SX + 2 * xstep;
-  int xstart2 = mSX - SX + 18 * xstep;
-  int xstart3 = mSX - SX + 28 * xstep;
-  SDL_version sdl_version_compiled;
-  const SDL_version *sdl_version_linked;
-  int driver_name_len = 10;
-  SDL_version sdl_version_linked_ext;
-  const char *driver_name = NULL;
-
-  SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_VERSION);
-
-  FadeOut(REDRAW_FIELD);
-
-  ClearField();
-  DrawHeadline();
-
-  DrawTextSCentered(ystart, font_title, "Version Information:");
-  ystart += ystep_title;
-
-  DrawTextF(xstart1, ystart, font_head, "Name");
-  DrawTextF(xstart2, ystart, font_text, getProgramTitleString());
-  ystart += ystep_line;
-
-  if (!strEqual(getProgramVersionString(), getProgramRealVersionString()))
-  {
-    DrawTextF(xstart1, ystart, font_head, "Version (fake)");
-    DrawTextF(xstart2, ystart, font_text, getProgramVersionString());
-    ystart += ystep_line;
+    DrawTextF(xstart1, ystart, font_head, "Version (fake)");
+    DrawTextF(xstart2, ystart, font_text, getProgramVersionString());
+    ystart += ystep_line;
 
     DrawTextF(xstart1, ystart, font_head, "Version (real)");
     DrawTextF(xstart2, ystart, font_text, getProgramRealVersionString());
@@ -3838,7 +3969,9 @@ static void DrawInfoScreen_Version(void)
   DrawTextF(xstart2, ystart, font_text, "%s", setup.system.sdl_audiodriver);
   DrawTextF(xstart3, ystart, font_text, "%s", driver_name);
 
-  DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
+  DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU);
+
+  PlayInfoSoundsAndMusic();
 
   FadeIn(REDRAW_FIELD);
 }
@@ -3869,91 +4002,253 @@ void HandleInfoScreen_Version(int button)
   }
 }
 
-static void DrawInfoScreen_LevelSet(void)
+static char *getInfoScreenTitle_Generic(void)
+{
+  return (info_mode == INFO_MODE_MAIN     ? STR_INFO_MAIN     :
+         info_mode == INFO_MODE_TITLE    ? STR_INFO_TITLE    :
+         info_mode == INFO_MODE_ELEMENTS ? STR_INFO_ELEMENTS :
+         info_mode == INFO_MODE_MUSIC    ? STR_INFO_MUSIC    :
+         info_mode == INFO_MODE_CREDITS  ? STR_INFO_CREDITS  :
+         info_mode == INFO_MODE_PROGRAM  ? STR_INFO_PROGRAM  :
+         info_mode == INFO_MODE_VERSION  ? STR_INFO_VERSION  :
+         info_mode == INFO_MODE_LEVELSET ? STR_INFO_LEVELSET :
+         "");
+}
+
+static int getInfoScreenBackgroundImage_Generic(void)
+{
+  return (info_mode == INFO_MODE_ELEMENTS ? IMG_BACKGROUND_INFO_ELEMENTS :
+         info_mode == INFO_MODE_MUSIC    ? IMG_BACKGROUND_INFO_MUSIC    :
+         info_mode == INFO_MODE_CREDITS  ? IMG_BACKGROUND_INFO_CREDITS  :
+         info_mode == INFO_MODE_PROGRAM  ? IMG_BACKGROUND_INFO_PROGRAM  :
+         info_mode == INFO_MODE_VERSION  ? IMG_BACKGROUND_INFO_VERSION  :
+         info_mode == INFO_MODE_LEVELSET ? IMG_BACKGROUND_INFO_LEVELSET :
+         IMG_BACKGROUND_INFO);
+}
+
+static int getInfoScreenBackgroundSound_Generic(void)
+{
+  return (info_mode == INFO_MODE_ELEMENTS ? SND_BACKGROUND_INFO_ELEMENTS :
+         info_mode == INFO_MODE_CREDITS  ? SND_BACKGROUND_INFO_CREDITS  :
+         info_mode == INFO_MODE_PROGRAM  ? SND_BACKGROUND_INFO_PROGRAM  :
+         info_mode == INFO_MODE_VERSION  ? SND_BACKGROUND_INFO_VERSION  :
+         info_mode == INFO_MODE_LEVELSET ? SND_BACKGROUND_INFO_LEVELSET :
+         SND_BACKGROUND_INFO);
+}
+
+static int getInfoScreenBackgroundMusic_Generic(void)
+{
+  return (info_mode == INFO_MODE_ELEMENTS ? MUS_BACKGROUND_INFO_ELEMENTS :
+         info_mode == INFO_MODE_CREDITS  ? MUS_BACKGROUND_INFO_CREDITS  :
+         info_mode == INFO_MODE_PROGRAM  ? MUS_BACKGROUND_INFO_PROGRAM  :
+         info_mode == INFO_MODE_VERSION  ? MUS_BACKGROUND_INFO_VERSION  :
+         info_mode == INFO_MODE_LEVELSET ? MUS_BACKGROUND_INFO_LEVELSET :
+         MUS_BACKGROUND_INFO);
+}
+
+static char *getInfoScreenFilename_Generic(int nr, boolean global)
+{
+  return (info_mode == INFO_MODE_CREDITS  ? getCreditsFilename(nr, global) :
+         info_mode == INFO_MODE_PROGRAM  ? getProgramInfoFilename(nr)     :
+         info_mode == INFO_MODE_LEVELSET ? getLevelSetInfoFilename(nr)    :
+         NULL);
+}
+
+static void DrawInfoScreen_GenericScreen(int screen_nr, int num_screens,
+                                        int use_global_screens)
 {
-  struct TitleMessageInfo *tmi = &readme;
-  char *filename = getLevelSetInfoFilename();
-  char *title = "Level Set Information:";
+  char *filename = getInfoScreenFilename_Generic(screen_nr, use_global_screens);
+  int font_text = MENU_INFO_FONT_TEXT;
   int font_foot = MENU_INFO_FONT_FOOT;
-  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART1;
+  int spacing_line = menu.line_spacing_info[info_mode];
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
-  if (filename == NULL)
+  ClearField();
+
+  DrawInfoScreen_Headline(screen_nr, num_screens, use_global_screens);
+
+  if (info_mode == INFO_MODE_CREDITS ||
+      info_mode == INFO_MODE_PROGRAM)
   {
-    DrawInfoScreen_NotAvailable(title, "No information for this level set.");
+    int width = SXSIZE;
+    int height = MENU_SCREEN_INFO_YBOTTOM - MENU_SCREEN_INFO_YSTART;
+    int chars = width / getFontWidth(font_text);
+    int lines = height / getFontHeight(font_text);
+    int padx = (width - chars * getFontWidth(font_text)) / 2;
+    int line_spacing = getMenuTextSpacing(spacing_line, font_text);
+    int xstart = mSX + padx;
+    int ystart = mSY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
+    boolean autowrap = FALSE;
+    boolean centered = TRUE;
+    boolean parse_comments = TRUE;
 
-    return;
+    DrawTextFile(xstart, ystart,
+                filename, font_text, chars, -1, lines, line_spacing, -1,
+                autowrap, centered, parse_comments);
   }
+  else if (info_mode == INFO_MODE_LEVELSET)
+  {
+    struct TitleMessageInfo *tmi = &readme;
 
-  SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_LEVELSET);
+    // if x position set to "-1", automatically determine by playfield width
+    if (tmi->x == -1)
+      tmi->x = SXSIZE / 2;
 
-  FadeOut(REDRAW_FIELD);
+    // if y position set to "-1", use static default value
+    if (tmi->y == -1)
+      tmi->y = MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
 
-  ClearField();
-  DrawHeadline();
+    // if width set to "-1", automatically determine by playfield width
+    if (tmi->width == -1)
+      tmi->width = SXSIZE - 2 * TILEX;
 
-  DrawTextSCentered(ystart, FONT_TEXT_1, title);
+    // if height set to "-1", automatically determine by playfield height
+    if (tmi->height == -1)
+      tmi->height = MENU_SCREEN_INFO_YBOTTOM - tmi->y - 10;
 
-  // if x position set to "-1", automatically determine by playfield width
-  if (tmi->x == -1)
-    tmi->x = SXSIZE / 2;
+    // if chars set to "-1", automatically determine by text and font width
+    if (tmi->chars == -1)
+      tmi->chars = tmi->width / getFontWidth(tmi->font);
+    else
+      tmi->width = tmi->chars * getFontWidth(tmi->font);
 
-  // if y position set to "-1", use static default value
-  if (tmi->y == -1)
-    tmi->y = 150;
+    // if lines set to "-1", automatically determine by text and font height
+    if (tmi->lines == -1)
+      tmi->lines = tmi->height / getFontHeight(tmi->font);
+    else
+      tmi->height = tmi->lines * getFontHeight(tmi->font);
 
-  // if width set to "-1", automatically determine by playfield width
-  if (tmi->width == -1)
-    tmi->width = SXSIZE - 2 * TILEX;
+    DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi),
+                filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1,
+                tmi->autowrap, tmi->centered, tmi->parse_comments);
+  }
 
-  // if height set to "-1", automatically determine by playfield height
-  if (tmi->height == -1)
-    tmi->height = MENU_SCREEN_INFO_YBOTTOM - tmi->y - 10;
+  boolean last_screen = (screen_nr == num_screens - 1);
+  char *text_foot = (last_screen ? TEXT_NEXT_MENU : TEXT_NEXT_PAGE);
 
-  // if chars set to "-1", automatically determine by text and font width
-  if (tmi->chars == -1)
-    tmi->chars = tmi->width / getFontWidth(tmi->font);
-  else
-    tmi->width = tmi->chars * getFontWidth(tmi->font);
+  DrawTextSCentered(ybottom, font_foot, text_foot);
+}
 
-  // if lines set to "-1", automatically determine by text and font height
-  if (tmi->lines == -1)
-    tmi->lines = tmi->height / getFontHeight(tmi->font);
-  else
-    tmi->height = tmi->lines * getFontHeight(tmi->font);
+static void DrawInfoScreen_Generic(void)
+{
+  SetMainBackgroundImageIfDefined(getInfoScreenBackgroundImage_Generic());
 
-  DrawTextFile(mSX + ALIGNED_TEXT_XPOS(tmi), mSY + ALIGNED_TEXT_YPOS(tmi),
-              filename, tmi->font, tmi->chars, -1, tmi->lines, 0, -1,
-              tmi->autowrap, tmi->centered, tmi->parse_comments);
+  UnmapAllGadgets();
+  FadeInfoSoundsAndMusic();
+
+  FadeOut(REDRAW_FIELD);
+
+  HandleInfoScreen_Generic(0, 0, MB_MENU_INITIALIZE);
 
-  DrawTextSCentered(ybottom, font_foot, TEXT_INFO_MENU);
+  PlayInfoSoundsAndMusic();
 
   FadeIn(REDRAW_FIELD);
 }
 
-static void HandleInfoScreen_LevelSet(int button)
+void HandleInfoScreen_Generic(int dx, int dy, int button)
 {
-  if (button == MB_MENU_LEAVE)
+  static char *text_no_info = "";
+  static int num_screens = 0;
+  static int screen_nr = 0;
+  static boolean use_global_screens = FALSE;
+
+  if (button == MB_MENU_INITIALIZE)
+  {
+    num_screens = 0;
+    screen_nr = 0;
+
+    if (info_mode == INFO_MODE_CREDITS)
+    {
+      int i;
+
+      for (i = 0; i < 2; i++)
+      {
+       use_global_screens = i;         // check for "FALSE", then "TRUE"
+
+       // determine number of (global or level set specific) credits screens
+       while (getCreditsFilename(num_screens, use_global_screens) != NULL)
+         num_screens++;
+
+       if (num_screens > 0)
+         break;
+      }
+
+      text_no_info = "No credits available.";
+    }
+    else if (info_mode == INFO_MODE_PROGRAM)
+    {
+      use_global_screens = TRUE;
+
+      // determine number of program info screens
+      while (getProgramInfoFilename(num_screens) != NULL)
+       num_screens++;
+
+      text_no_info = "No program info available.";
+    }
+    else if (info_mode == INFO_MODE_LEVELSET)
+    {
+      use_global_screens = FALSE;
+
+      // determine number of levelset info screens
+      while (getLevelSetInfoFilename(num_screens) != NULL)
+       num_screens++;
+
+      text_no_info = "No level set info available.";
+    }
+
+    if (num_screens == 0)
+    {
+      int font_title = MENU_INFO_FONT_TITLE;
+      int font_foot  = MENU_INFO_FONT_FOOT;
+      int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART;
+      int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
+
+      ClearField();
+
+      DrawInfoScreen_Headline(screen_nr, num_screens, use_global_screens);
+
+      DrawTextSCentered(ystart, font_title, text_no_info);
+      DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU);
+
+      return;
+    }
+
+    DrawInfoScreen_GenericScreen(screen_nr, num_screens, use_global_screens);
+  }
+  else if (button == MB_MENU_LEAVE)
   {
     PlaySound(SND_MENU_ITEM_SELECTING);
 
     info_mode = INFO_MODE_MAIN;
     DrawInfoScreen();
-
-    return;
   }
-  else if (button == MB_MENU_CHOICE)
+  else if (button == MB_MENU_CHOICE || dx)
   {
     PlaySound(SND_MENU_ITEM_SELECTING);
 
-    FadeMenuSoundsAndMusic();
+    screen_nr += (dx < 0 ? -1 : +1);
 
-    info_mode = INFO_MODE_MAIN;
-    DrawInfoScreen();
+    if (screen_nr < 0 || screen_nr >= num_screens)
+    {
+      FadeInfoSoundsAndMusic();
+
+      info_mode = INFO_MODE_MAIN;
+      DrawInfoScreen();
+    }
+    else
+    {
+      FadeSetNextScreen();
+
+      FadeOut(REDRAW_FIELD);
+
+      DrawInfoScreen_GenericScreen(screen_nr, num_screens, use_global_screens);
+
+      FadeIn(REDRAW_FIELD);
+    }
   }
   else
   {
-    PlayMenuSoundIfLoop();
+    PlayInfoSoundIfLoop();
   }
 }
 
@@ -3966,20 +4261,52 @@ static void DrawInfoScreen(void)
   else if (info_mode == INFO_MODE_MUSIC)
     DrawInfoScreen_Music();
   else if (info_mode == INFO_MODE_CREDITS)
-    DrawInfoScreen_Credits();
+    DrawInfoScreen_Generic();
   else if (info_mode == INFO_MODE_PROGRAM)
-    DrawInfoScreen_Program();
+    DrawInfoScreen_Generic();
   else if (info_mode == INFO_MODE_VERSION)
     DrawInfoScreen_Version();
   else if (info_mode == INFO_MODE_LEVELSET)
-    DrawInfoScreen_LevelSet();
+    DrawInfoScreen_Generic();
   else
     DrawInfoScreen_Main();
+}
 
-  if (info_mode != INFO_MODE_MAIN &&
-      info_mode != INFO_MODE_TITLE &&
-      info_mode != INFO_MODE_MUSIC)
-    PlayMenuSoundsAndMusic();
+void DrawInfoScreen_FromMainMenu(int nr)
+{
+  int fade_mask = REDRAW_FIELD;
+
+  if (nr < INFO_MODE_MAIN || nr >= MAX_INFO_MODES)
+    return;
+
+  CloseDoor(DOOR_CLOSE_2);
+
+  SetGameStatus(GAME_MODE_INFO);
+
+  info_mode = nr;
+  info_screens_from_main = TRUE;
+
+  if (redraw_mask & REDRAW_ALL)
+    fade_mask = REDRAW_ALL;
+
+  if (CheckFadeAll())
+    fade_mask = REDRAW_ALL;
+
+  UnmapAllGadgets();
+  FadeMenuSoundsAndMusic();
+
+  FadeSetEnterScreen();
+
+  FadeOut(fade_mask);
+
+  FadeSkipNextFadeOut();
+
+  // needed if different viewport properties defined for info screen
+  ChangeViewportPropertiesIfNeeded();
+
+  SetMainBackgroundImage(IMG_BACKGROUND_INFO);
+
+  DrawInfoScreen();
 }
 
 void HandleInfoScreen(int mx, int my, int dx, int dy, int button)
@@ -3991,13 +4318,13 @@ void HandleInfoScreen(int mx, int my, int dx, int dy, int button)
   else if (info_mode == INFO_MODE_MUSIC)
     HandleInfoScreen_Music(dx, dy, button);
   else if (info_mode == INFO_MODE_CREDITS)
-    HandleInfoScreen_Credits(dx, dy, button);
+    HandleInfoScreen_Generic(dx, dy, button);
   else if (info_mode == INFO_MODE_PROGRAM)
-    HandleInfoScreen_Program(dx, dy, button);
+    HandleInfoScreen_Generic(dx, dy, button);
   else if (info_mode == INFO_MODE_VERSION)
     HandleInfoScreen_Version(button);
   else if (info_mode == INFO_MODE_LEVELSET)
-    HandleInfoScreen_LevelSet(button);
+    HandleInfoScreen_Generic(dx, dy, button);
   else
     HandleInfoScreen_Main(mx, my, dx, dy, button);
 }
@@ -4483,6 +4810,10 @@ static void drawChooseTreeText(TreeInfo *ti, int y, boolean active)
     char *pos_text = getHallOfFameRankText(pos, 3);
     int i;
 
+    // highlight all high score entries of the current player
+    if (strEqual(scores.entry[pos].name, setup.player_name))
+      font_nr2 = FONT_TEXT_2_ACTIVE;
+
     DrawText(startx1, starty, pos_text, font_nr1);
 
     for (i = 0; i < num_dots; i++)
@@ -4614,35 +4945,6 @@ static void drawChooseTreeScreen(TreeInfo *ti)
     MapScreenTreeGadgets(ti);
 }
 
-static void drawChooseTreeScreen_Scores_NotAvailable(void)
-{
-  // dirty workaround to use spacing definitions from info screen
-  info_mode = INFO_MODE_TITLE;
-
-  char *text_info = "HighScores of Level %d";
-  char *text_title = "Score information:";
-  char *text_error = "No scores for this level.";
-  char *text_foot = "Press any key or button for main menu";
-  int font_info = FONT_TITLE_2;
-  int font_title = FONT_INITIAL_3;
-  int font_error = FONT_INITIAL_4;
-  int font_foot  = FONT_INITIAL_2;
-  int spacing_title = menu.headline1_spacing_info[INFO_MODE_TITLE];
-  int ystep_title = getMenuTextStep(spacing_title, font_title);
-  int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1;
-  int ystart2 = ystart1 + ystep_title;
-  int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
-  int ystart0 = MENU_TITLE2_YPOS;
-
-  drawChooseTreeHeadExt(TREE_TYPE_SCORE_ENTRY, INFOTEXT_SCORE_ENTRY);
-  DrawTextFCentered(ystart0, font_info, text_info, scores.last_level_nr);
-
-  DrawTextSCentered(ystart1, font_title, text_title);
-  DrawTextSCentered(ystart2, font_error, text_error);
-
-  DrawTextSCentered(ybottom, font_foot, text_foot);
-}
-
 static TreeInfo *setHallOfFameActiveEntry(TreeInfo **ti_ptr)
 {
   int score_pos = scores.last_added;
@@ -4684,46 +4986,22 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
   int num_entries = numTreeInfoInGroup(ti);
   int num_page_entries = MIN(num_entries, NUM_MENU_ENTRIES_ON_SCREEN);
   boolean position_set_by_scrollbar = (dx == 999);
-  boolean button_action = (button == MB_MENU_LEAVE || button == MB_MENU_CHOICE);
-  boolean button_is_valid = (mx >= 0 && my >= 0);
-  boolean button_screen_clicked = (button_action && button_is_valid);
 
   if (game_status == GAME_MODE_SCORES)
   {
-    if (server_scores.updated)
-    {
-      // reload scores, using updated server score cache file
-      LoadLocalAndServerScore(scores.last_level_nr, FALSE);
-
-      server_scores.updated = FALSE;
-
-      DrawHallOfFame_setScoreEntries();
-
-      if (score_entries != NULL)
-      {
-       ti = setHallOfFameActiveEntry(ti_ptr);
-
-       if (button != MB_MENU_INITIALIZE)
-         drawChooseTreeScreen(ti);
-      }
-    }
-
-    if (score_entries == NULL)
+    if (server_scores.updated)
     {
-      if (button == MB_MENU_INITIALIZE)
-      {
-       drawChooseTreeScreen_Scores_NotAvailable();
-      }
-      else if (button_screen_clicked)
-      {
-       PlaySound(SND_MENU_ITEM_SELECTING);
+      // reload scores, using updated server score cache file
+      LoadLocalAndServerScore(scores.last_level_nr, FALSE);
+
+      server_scores.updated = FALSE;
 
-       SetGameStatus(GAME_MODE_MAIN);
+      DrawHallOfFame_setScoreEntries();
 
-       DrawMainMenu();
-      }
+      ti = setHallOfFameActiveEntry(ti_ptr);
 
-      return;
+      if (button != MB_MENU_INITIALIZE)
+       drawChooseTreeScreen(ti);
     }
   }
 
@@ -4781,6 +5059,12 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
          setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY ||
          setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE)
        execSetupGame();
+      else if (setup_mode == SETUP_MODE_CHOOSE_GAME_ENGINE_TYPE ||
+              setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64 ||
+              setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64DTV ||
+              setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_ATARI ||
+              setup_mode == SETUP_MODE_CHOOSE_BD_COLOR_TYPE)
+       execSetupEngines();
       else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE ||
               setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE ||
               setup_mode == SETUP_MODE_CHOOSE_RENDERING ||
@@ -4899,6 +5183,14 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
 
     return;
   }
+  else if (game_status == GAME_MODE_NAMES && dx == 1)
+  {
+    SetGameStatus(GAME_MODE_PSEUDO_TYPENAMES);
+
+    DrawTypeName();
+
+    return;
+  }
   else if (dx == 1)
   {
     TreeInfo *node_first, *node_cursor;
@@ -4969,6 +5261,12 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
              setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY ||
              setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE)
            execSetupGame();
+         else if (setup_mode == SETUP_MODE_CHOOSE_GAME_ENGINE_TYPE ||
+                  setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64 ||
+                  setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64DTV ||
+                  setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_ATARI ||
+                  setup_mode == SETUP_MODE_CHOOSE_BD_COLOR_TYPE)
+           execSetupEngines();
          else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE ||
                   setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE ||
                   setup_mode == SETUP_MODE_CHOOSE_RENDERING ||
@@ -5046,6 +5344,12 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
              setup_mode == SETUP_MODE_CHOOSE_SCROLL_DELAY ||
              setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE)
            execSetupGame();
+         else if (setup_mode == SETUP_MODE_CHOOSE_GAME_ENGINE_TYPE ||
+                  setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64 ||
+                  setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64DTV ||
+                  setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_ATARI ||
+                  setup_mode == SETUP_MODE_CHOOSE_BD_COLOR_TYPE)
+           execSetupEngines();
          else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE ||
                   setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE ||
                   setup_mode == SETUP_MODE_CHOOSE_RENDERING ||
@@ -5079,6 +5383,9 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
          {
            // store level set if chosen from "last played level set" menu
            StoreLastPlayedLevels(leveldir_current);
+
+           // store if level set chosen from "last played level set" menu
+           SaveLevelSetup_LastSeries();
          }
          else if (game_status == GAME_MODE_NAMES)
          {
@@ -5323,8 +5630,6 @@ static void DrawHallOfFame_setScoreEntries(void)
 
   if (score_entries != NULL && scores.continue_playing)
     setString(&score_entries->node_group->name, BACKLINK_TEXT_NEXT);
-
-  // ("score_entries" and "score_entry_current" may be NULL here)
 }
 
 void DrawHallOfFame(int nr)
@@ -5415,7 +5720,7 @@ static void HandleHallOfFame_SelectLevel(int step, int direction)
   if (new_level_nr > leveldir_current->last_level)
     new_level_nr = leveldir_current->last_level;
 
-  if (setup.handicap && new_level_nr > leveldir_current->handicap_level)
+  if (setup.allow_skipping_levels != STATE_TRUE && new_level_nr > leveldir_current->handicap_level)
     new_level_nr = leveldir_current->handicap_level;
 
   if (new_level_nr != old_level_nr)
@@ -5462,19 +5767,18 @@ static void DrawScoreInfo_Content(int entry_nr)
   struct ScoreEntry *entry = &scores.entry[entry_nr];
   char *pos_text = getHallOfFameRankText(entry_nr, 0);
   char *tape_date = getHallOfFameTapeDateText(entry);
-  int font_title = MENU_INFO_FONT_TITLE;
-  int font_head  = MENU_INFO_FONT_HEAD;
-  int font_text  = MENU_INFO_FONT_TEXT;
-  int font_foot  = MENU_INFO_FONT_FOOT;
-  int spacing_title = menu.headline1_spacing[GAME_MODE_SCOREINFO];
-  int spacing_para  = menu.paragraph_spacing[GAME_MODE_SCOREINFO];
-  int spacing_line  = menu.line_spacing[GAME_MODE_SCOREINFO];
+  int font_head = MENU_INFO_FONT_HEAD;
+  int font_text = MENU_INFO_FONT_TEXT;
+  int font_foot = MENU_INFO_FONT_FOOT;
+  int spacing_para = menu.paragraph_spacing[GAME_MODE_SCOREINFO];
+  int spacing_line = menu.line_spacing[GAME_MODE_SCOREINFO];
+  int spacing_left = menu.left_spacing[GAME_MODE_SCOREINFO];
+  int spacing_top  = menu.top_spacing[GAME_MODE_SCOREINFO];
   int xstep = getFontWidth(font_text);
-  int ystep_title = getMenuTextStep(spacing_title, font_title);
-  int ystep_para  = getMenuTextStep(spacing_para,  font_text);
-  int ystep_line  = getMenuTextStep(spacing_line,  font_text);
-  int xstart  = mSX - SX + menu.left_spacing[GAME_MODE_SCOREINFO];
-  int ystart  = mSY - SY + menu.top_spacing[GAME_MODE_SCOREINFO];
+  int ystep_para = getMenuTextStep(spacing_para,  font_text);
+  int ystep_line = getMenuTextStep(spacing_line,  font_text);
+  int xstart  = mSX - SX + spacing_left;
+  int ystart  = mSY - SY + spacing_top + getHeadlineSpacing();
   int ybottom = mSY - SY + SYSIZE - menu.bottom_spacing[GAME_MODE_SCOREINFO];
   int xstart1 = xstart + xstep;
   int xstart2 = xstart + xstep * 12;
@@ -5485,7 +5789,7 @@ static void DrawScoreInfo_Content(int entry_nr)
   boolean play_visible = !strEqual(tape_date, UNKNOWN_NAME);
   int font_width = getFontWidth(font_text);
   int font_height = getFontHeight(font_text);
-  int tape_date_width  = getTextWidth(tape_date, font_text);
+  int tape_date_width = getTextWidth(tape_date, font_text);
   int pad_left = xstart2;
   int pad_right = menu.right_spacing[GAME_MODE_SCOREINFO];
   int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width;
@@ -5497,19 +5801,9 @@ static void DrawScoreInfo_Content(int entry_nr)
   // redraw level selection buttons (which have just been erased)
   RedrawScreenMenuGadgets(SCREEN_MASK_SCORES);
 
-  if (score_entries == NULL)
-  {
-    drawChooseTreeScreen_Scores_NotAvailable();
-
-    return;
-  }
-
   drawChooseTreeHead(score_entries);
   drawChooseTreeInfo(score_entries);
 
-  DrawTextSCentered(ystart, font_title, "Score Information:");
-  ystart += ystep_title;
-
   DrawTextF(xstart1, ystart, font_head, "Level Set");
   lines = DrawTextBufferS(xstart2, ystart, leveldir_current->name, font_text,
                          max_chars_per_line, -1, max_lines_per_text, 0, -1,
@@ -5701,6 +5995,11 @@ static char *rendering_mode_text;
 static char *vsync_mode_text;
 static char *scroll_delay_text;
 static char *snapshot_mode_text;
+static char *game_engine_type_text;
+static char *bd_palette_c64_text;
+static char *bd_palette_c64dtv_text;
+static char *bd_palette_atari_text;
+static char *bd_color_type_text;
 static char *game_speed_text;
 static char *scores_type_text;
 static char *network_server_text;
@@ -5838,26 +6137,294 @@ static void execSetupGame_setGameSpeeds(boolean update_value)
       game_speeds_normal = game_speeds;
   }
 
-  setup.game_frame_delay = atoi(game_speed_current->identifier);
+  setup.game_frame_delay = atoi(game_speed_current->identifier);
+
+  // needed for displaying game speed text instead of identifier
+  game_speed_text = game_speed_current->name;
+}
+
+static void execSetupGame_setScrollDelays(void)
+{
+  if (scroll_delays == NULL)
+  {
+    int i;
+
+    for (i = 0; scroll_delays_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = scroll_delays_list[i].value;
+      char *text = scroll_delays_list[i].text;
+
+      ti->node_top = &scroll_delays;
+      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, STR_SETUP_CHOOSE_SCROLL_DELAY);
+
+      pushTreeInfo(&scroll_delays, ti);
+    }
+
+    // sort scroll delay values to start with lowest scroll delay value
+    sortTreeInfo(&scroll_delays);
+
+    // set current scroll delay value to configured scroll delay value
+    scroll_delay_current =
+      getTreeInfoFromIdentifier(scroll_delays, i_to_a(setup.scroll_delay_value));
+
+    // if that fails, set current scroll delay to reliable default value
+    if (scroll_delay_current == NULL)
+      scroll_delay_current =
+       getTreeInfoFromIdentifier(scroll_delays, i_to_a(STD_SCROLL_DELAY));
+
+    // if that also fails, set current scroll delay to first available value
+    if (scroll_delay_current == NULL)
+      scroll_delay_current = scroll_delays;
+  }
+
+  setup.scroll_delay_value = atoi(scroll_delay_current->identifier);
+
+  // needed for displaying scroll delay text instead of identifier
+  scroll_delay_text = scroll_delay_current->name;
+}
+
+static void execSetupGame_setSnapshotModes(void)
+{
+  if (snapshot_modes == NULL)
+  {
+    int i;
+
+    for (i = 0; snapshot_modes_list[i].value != NULL; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      char *value = snapshot_modes_list[i].value;
+      char *text = snapshot_modes_list[i].text;
+
+      ti->node_top = &snapshot_modes;
+      ti->sort_priority = i;
+
+      sprintf(identifier, "%s", value);
+      sprintf(name, "%s", text);
+
+      setString(&ti->identifier, identifier);
+      setString(&ti->name, name);
+      setString(&ti->name_sorting, name);
+      setString(&ti->infotext, STR_SETUP_CHOOSE_SNAPSHOT_MODE);
+
+      pushTreeInfo(&snapshot_modes, ti);
+    }
+
+    // sort snapshot mode values to start with lowest snapshot mode value
+    sortTreeInfo(&snapshot_modes);
+
+    // set current snapshot mode value to configured snapshot mode value
+    snapshot_mode_current =
+      getTreeInfoFromIdentifier(snapshot_modes, setup.engine_snapshot_mode);
+
+    // if that fails, set current snapshot mode to reliable default value
+    if (snapshot_mode_current == NULL)
+      snapshot_mode_current =
+       getTreeInfoFromIdentifier(snapshot_modes, STR_SNAPSHOT_MODE_DEFAULT);
+
+    // if that also fails, set current snapshot mode to first available value
+    if (snapshot_mode_current == NULL)
+      snapshot_mode_current = snapshot_modes;
+  }
+
+  setup.engine_snapshot_mode = snapshot_mode_current->identifier;
+
+  // needed for displaying snapshot mode text instead of identifier
+  snapshot_mode_text = snapshot_mode_current->name;
+}
+
+static void execSetupGame_setNetworkServerText(void)
+{
+  if (strEqual(setup.network_server_hostname, STR_NETWORK_AUTO_DETECT))
+  {
+    strcpy(network_server_hostname, STR_NETWORK_AUTO_DETECT_SETUP);
+  }
+  else
+  {
+    strncpy(network_server_hostname, setup.network_server_hostname,
+           MAX_SETUP_TEXT_INPUT_LEN);
+    network_server_hostname[MAX_SETUP_TEXT_INPUT_LEN] = '\0';
+  }
+
+  // needed for displaying network server text instead of identifier
+  network_server_text = network_server_hostname;
+}
+
+static void execSetupGame(void)
+{
+  boolean check_vsync_mode = (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED);
+
+  execSetupGame_setGameSpeeds(FALSE);
+  execSetupGame_setScoresType();
+  execSetupGame_setScrollDelays();
+  execSetupGame_setSnapshotModes();
+
+  execSetupGame_setNetworkServerText();
+
+  if (!setup.provide_uploading_tapes)
+    setHideSetupEntry(execOfferUploadTapes);
+
+  setup_mode = SETUP_MODE_GAME;
+
+  DrawSetupScreen();
+
+  // check if vsync needs to be disabled for this game speed to work
+  if (check_vsync_mode)
+    DisableVsyncIfNeeded();
+}
+
+static void execSetupChooseScoresType(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_SCORES_TYPE;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseGameSpeed(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_GAME_SPEED;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseScrollDelay(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_SCROLL_DELAY;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseSnapshotMode(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_SNAPSHOT_MODE;
+
+  DrawSetupScreen();
+}
+
+static void execSetupEngines_setGameEngineType(void)
+{
+  if (game_engine_types == NULL)
+  {
+    int i;
+
+    for (i = 0; game_engine_types_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = game_engine_types_list[i].value;
+      char *text = game_engine_types_list[i].text;
+
+      ti->node_top = &game_engine_types;
+      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, STR_SETUP_CHOOSE_GAME_ENGINE_TYPE);
+
+      pushTreeInfo(&game_engine_types, ti);
+    }
+
+    // sort game engine type values to start with lowest game engine type value
+    sortTreeInfo(&game_engine_types);
+
+    // set current game engine type value to configured game engine type value
+    game_engine_type_current =
+      getTreeInfoFromIdentifier(game_engine_types, i_to_a(setup.default_game_engine_type));
+
+    // if that fails, set current game engine type to reliable default value
+    if (game_engine_type_current == NULL)
+      game_engine_type_current =
+       getTreeInfoFromIdentifier(game_engine_types, i_to_a(GAME_ENGINE_TYPE_RND));
+
+    // if that also fails, set current game engine type to first available value
+    if (game_engine_type_current == NULL)
+      game_engine_type_current = game_engine_types;
+  }
+
+  setup.default_game_engine_type = atoi(game_engine_type_current->identifier);
+
+  // needed for displaying game engine type text instead of identifier
+  game_engine_type_text = game_engine_type_current->name;
+}
+
+static void execSetupEngines_setPalettesC64(void)
+{
+  if (bd_palettes_c64 == NULL)
+  {
+    int i;
+
+    for (i = 0; bd_palettes_c64_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = bd_palettes_c64_list[i].value;
+      char *text = bd_palettes_c64_list[i].text;
+
+      ti->node_top = &bd_palettes_c64;
+      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, STR_SETUP_CHOOSE_BD_PALETTE_C64);
+
+      pushTreeInfo(&bd_palettes_c64, ti);
+    }
+
+    // sort palette values to start with lowest palette value
+    sortTreeInfo(&bd_palettes_c64);
+
+    // set current palette value to configured palette value
+    bd_palette_c64_current =
+      getTreeInfoFromIdentifier(bd_palettes_c64, i_to_a(setup.bd_palette_c64));
+
+    // if that fails, set current palette to reliable default value
+    if (bd_palette_c64_current == NULL)
+      bd_palette_c64_current =
+       getTreeInfoFromIdentifier(bd_palettes_c64, i_to_a(GD_DEFAULT_PALETTE_C64));
+
+    // if that also fails, set current palette to first available value
+    if (bd_palette_c64_current == NULL)
+      bd_palette_c64_current = bd_palettes_c64;
+  }
+
+  setup.bd_palette_c64 = atoi(bd_palette_c64_current->identifier);
 
-  // needed for displaying game speed text instead of identifier
-  game_speed_text = game_speed_current->name;
+  // needed for displaying palette text instead of identifier
+  bd_palette_c64_text = bd_palette_c64_current->name;
 }
 
-static void execSetupGame_setScrollDelays(void)
+static void execSetupEngines_setPalettesC64DTV(void)
 {
-  if (scroll_delays == NULL)
+  if (bd_palettes_c64dtv == NULL)
   {
     int i;
 
-    for (i = 0; scroll_delays_list[i].value != -1; i++)
+    for (i = 0; bd_palettes_c64dtv_list[i].value != -1; i++)
     {
       TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
       char identifier[32], name[32];
-      int value = scroll_delays_list[i].value;
-      char *text = scroll_delays_list[i].text;
+      int value = bd_palettes_c64dtv_list[i].value;
+      char *text = bd_palettes_c64dtv_list[i].text;
 
-      ti->node_top = &scroll_delays;
+      ti->node_top = &bd_palettes_c64dtv;
       ti->sort_priority = value;
 
       sprintf(identifier, "%d", value);
@@ -5866,155 +6433,178 @@ static void execSetupGame_setScrollDelays(void)
       setString(&ti->identifier, identifier);
       setString(&ti->name, name);
       setString(&ti->name_sorting, name);
-      setString(&ti->infotext, STR_SETUP_CHOOSE_SCROLL_DELAY);
+      setString(&ti->infotext, STR_SETUP_CHOOSE_BD_PALETTE_C64DTV);
 
-      pushTreeInfo(&scroll_delays, ti);
+      pushTreeInfo(&bd_palettes_c64dtv, ti);
     }
 
-    // sort scroll delay values to start with lowest scroll delay value
-    sortTreeInfo(&scroll_delays);
+    // sort palette values to start with lowest palette value
+    sortTreeInfo(&bd_palettes_c64dtv);
 
-    // set current scroll delay value to configured scroll delay value
-    scroll_delay_current =
-      getTreeInfoFromIdentifier(scroll_delays,i_to_a(setup.scroll_delay_value));
+    // set current palette value to configured palette value
+    bd_palette_c64dtv_current =
+      getTreeInfoFromIdentifier(bd_palettes_c64dtv, i_to_a(setup.bd_palette_c64dtv));
 
-    // if that fails, set current scroll delay to reliable default value
-    if (scroll_delay_current == NULL)
-      scroll_delay_current =
-       getTreeInfoFromIdentifier(scroll_delays, i_to_a(STD_SCROLL_DELAY));
+    // if that fails, set current palette to reliable default value
+    if (bd_palette_c64dtv_current == NULL)
+      bd_palette_c64dtv_current =
+       getTreeInfoFromIdentifier(bd_palettes_c64dtv, i_to_a(GD_DEFAULT_PALETTE_C64DTV));
 
-    // if that also fails, set current scroll delay to first available value
-    if (scroll_delay_current == NULL)
-      scroll_delay_current = scroll_delays;
+    // if that also fails, set current palette to first available value
+    if (bd_palette_c64dtv_current == NULL)
+      bd_palette_c64dtv_current = bd_palettes_c64dtv;
   }
 
-  setup.scroll_delay_value = atoi(scroll_delay_current->identifier);
+  setup.bd_palette_c64dtv = atoi(bd_palette_c64dtv_current->identifier);
 
-  // needed for displaying scroll delay text instead of identifier
-  scroll_delay_text = scroll_delay_current->name;
+  // needed for displaying palette text instead of identifier
+  bd_palette_c64dtv_text = bd_palette_c64dtv_current->name;
 }
 
-static void execSetupGame_setSnapshotModes(void)
+static void execSetupEngines_setPalettesAtari(void)
 {
-  if (snapshot_modes == NULL)
+  if (bd_palettes_atari == NULL)
   {
     int i;
 
-    for (i = 0; snapshot_modes_list[i].value != NULL; i++)
+    for (i = 0; bd_palettes_atari_list[i].value != -1; i++)
     {
       TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
       char identifier[32], name[32];
-      char *value = snapshot_modes_list[i].value;
-      char *text = snapshot_modes_list[i].text;
+      int value = bd_palettes_atari_list[i].value;
+      char *text = bd_palettes_atari_list[i].text;
 
-      ti->node_top = &snapshot_modes;
-      ti->sort_priority = i;
+      ti->node_top = &bd_palettes_atari;
+      ti->sort_priority = value;
 
-      sprintf(identifier, "%s", 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, STR_SETUP_CHOOSE_SNAPSHOT_MODE);
+      setString(&ti->infotext, STR_SETUP_CHOOSE_BD_PALETTE_ATARI);
 
-      pushTreeInfo(&snapshot_modes, ti);
+      pushTreeInfo(&bd_palettes_atari, ti);
     }
 
-    // sort snapshot mode values to start with lowest snapshot mode value
-    sortTreeInfo(&snapshot_modes);
+    // sort palette values to start with lowest palette value
+    sortTreeInfo(&bd_palettes_atari);
 
-    // set current snapshot mode value to configured snapshot mode value
-    snapshot_mode_current =
-      getTreeInfoFromIdentifier(snapshot_modes, setup.engine_snapshot_mode);
+    // set current palette value to configured palette value
+    bd_palette_atari_current =
+      getTreeInfoFromIdentifier(bd_palettes_atari, i_to_a(setup.bd_palette_atari));
 
-    // if that fails, set current snapshot mode to reliable default value
-    if (snapshot_mode_current == NULL)
-      snapshot_mode_current =
-       getTreeInfoFromIdentifier(snapshot_modes, STR_SNAPSHOT_MODE_DEFAULT);
+    // if that fails, set current palette to reliable default value
+    if (bd_palette_atari_current == NULL)
+      bd_palette_atari_current =
+       getTreeInfoFromIdentifier(bd_palettes_atari, i_to_a(GD_DEFAULT_PALETTE_ATARI));
 
-    // if that also fails, set current snapshot mode to first available value
-    if (snapshot_mode_current == NULL)
-      snapshot_mode_current = snapshot_modes;
+    // if that also fails, set current palette to first available value
+    if (bd_palette_atari_current == NULL)
+      bd_palette_atari_current = bd_palettes_atari;
   }
 
-  setup.engine_snapshot_mode = snapshot_mode_current->identifier;
+  setup.bd_palette_atari = atoi(bd_palette_atari_current->identifier);
 
-  // needed for displaying snapshot mode text instead of identifier
-  snapshot_mode_text = snapshot_mode_current->name;
+  // needed for displaying palette text instead of identifier
+  bd_palette_atari_text = bd_palette_atari_current->name;
 }
 
-static void execSetupGame_setNetworkServerText(void)
+static void execSetupEngines_setColorType(void)
 {
-  if (strEqual(setup.network_server_hostname, STR_NETWORK_AUTO_DETECT))
-  {
-    strcpy(network_server_hostname, STR_NETWORK_AUTO_DETECT_SETUP);
-  }
-  else
+  if (bd_color_types == NULL)
   {
-    strncpy(network_server_hostname, setup.network_server_hostname,
-           MAX_SETUP_TEXT_INPUT_LEN);
-    network_server_hostname[MAX_SETUP_TEXT_INPUT_LEN] = '\0';
-  }
+    int i;
 
-  // needed for displaying network server text instead of identifier
-  network_server_text = network_server_hostname;
-}
+    for (i = 0; bd_color_types_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = bd_color_types_list[i].value;
+      char *text = bd_color_types_list[i].text;
 
-static void execSetupGame(void)
-{
-  boolean check_vsync_mode = (setup_mode == SETUP_MODE_CHOOSE_GAME_SPEED);
+      ti->node_top = &bd_color_types;
+      ti->sort_priority = value;
 
-  execSetupGame_setGameSpeeds(FALSE);
-  execSetupGame_setScoresType();
-  execSetupGame_setScrollDelays();
-  execSetupGame_setSnapshotModes();
+      sprintf(identifier, "%d", value);
+      sprintf(name, "%s", text);
 
-  execSetupGame_setNetworkServerText();
+      setString(&ti->identifier, identifier);
+      setString(&ti->name, name);
+      setString(&ti->name_sorting, name);
+      setString(&ti->infotext, STR_SETUP_CHOOSE_BD_COLOR_TYPE);
 
-  if (!setup.provide_uploading_tapes)
-    setHideSetupEntry(execOfferUploadTapes);
+      pushTreeInfo(&bd_color_types, ti);
+    }
 
-  setup_mode = SETUP_MODE_GAME;
+    // sort color type values to start with lowest color type value
+    sortTreeInfo(&bd_color_types);
 
-  DrawSetupScreen();
+    // set current color type value to configured color type value
+    bd_color_type_current =
+      getTreeInfoFromIdentifier(bd_color_types, i_to_a(setup.bd_default_color_type));
 
-  // check if vsync needs to be disabled for this game speed to work
-  if (check_vsync_mode)
-    DisableVsyncIfNeeded();
+    // if that fails, set current color type to reliable default value
+    if (bd_color_type_current == NULL)
+      bd_color_type_current =
+       getTreeInfoFromIdentifier(bd_color_types, i_to_a(GD_DEFAULT_COLOR_TYPE));
+
+    // if that also fails, set current color type to first available value
+    if (bd_color_type_current == NULL)
+      bd_color_type_current = bd_color_types;
+  }
+
+  setup.bd_default_color_type = atoi(bd_color_type_current->identifier);
+
+  // needed for displaying color type text instead of identifier
+  bd_color_type_text = bd_color_type_current->name;
 }
 
-static void execSetupChooseScoresType(void)
+static void execSetupEngines(void)
 {
-  setup_mode = SETUP_MODE_CHOOSE_SCORES_TYPE;
+  setup_mode = SETUP_MODE_ENGINES;
+
+  execSetupEngines_setGameEngineType();
+  execSetupEngines_setPalettesC64();
+  execSetupEngines_setPalettesC64DTV();
+  execSetupEngines_setPalettesAtari();
+  execSetupEngines_setColorType();
 
   DrawSetupScreen();
 }
 
-static void execSetupChooseGameSpeed(void)
+static void execSetupChooseGameEngineType(void)
 {
-  setup_mode = SETUP_MODE_CHOOSE_GAME_SPEED;
+  setup_mode = SETUP_MODE_CHOOSE_GAME_ENGINE_TYPE;
 
   DrawSetupScreen();
 }
 
-static void execSetupChooseScrollDelay(void)
+static void execSetupChoosePaletteC64(void)
 {
-  setup_mode = SETUP_MODE_CHOOSE_SCROLL_DELAY;
+  setup_mode = SETUP_MODE_CHOOSE_BD_PALETTE_C64;
 
   DrawSetupScreen();
 }
 
-static void execSetupChooseSnapshotMode(void)
+static void execSetupChoosePaletteC64DTV(void)
 {
-  setup_mode = SETUP_MODE_CHOOSE_SNAPSHOT_MODE;
+  setup_mode = SETUP_MODE_CHOOSE_BD_PALETTE_C64DTV;
 
   DrawSetupScreen();
 }
 
-static void execSetupEngines(void)
+static void execSetupChoosePaletteAtari(void)
 {
-  setup_mode = SETUP_MODE_ENGINES;
+  setup_mode = SETUP_MODE_CHOOSE_BD_PALETTE_ATARI;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseColorType(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_BD_COLOR_TYPE;
 
   DrawSetupScreen();
 }
@@ -6436,7 +7026,7 @@ static void execSetupSound(void)
 
     // set current volume value to configured volume value
     volume_simple_current =
-      getTreeInfoFromIdentifier(volumes_simple,i_to_a(setup.volume_simple));
+      getTreeInfoFromIdentifier(volumes_simple, i_to_a(setup.volume_simple));
 
     // if that fails, set current volume to reliable default value
     if (volume_simple_current == NULL)
@@ -6504,7 +7094,7 @@ static void execSetupSound(void)
 
     // set current volume value to configured volume value
     volume_loops_current =
-      getTreeInfoFromIdentifier(volumes_loops,i_to_a(setup.volume_loops));
+      getTreeInfoFromIdentifier(volumes_loops, i_to_a(setup.volume_loops));
 
     // if that fails, set current volume to reliable default value
     if (volume_loops_current == NULL)
@@ -6572,7 +7162,7 @@ static void execSetupSound(void)
 
     // set current volume value to configured volume value
     volume_music_current =
-      getTreeInfoFromIdentifier(volumes_music,i_to_a(setup.volume_music));
+      getTreeInfoFromIdentifier(volumes_music, i_to_a(setup.volume_music));
 
     // if that fails, set current volume to reliable default value
     if (volume_music_current == NULL)
@@ -7039,6 +7629,13 @@ static void execSetupShortcuts5(void)
   DrawSetupScreen();
 }
 
+static void execSetupShortcuts6(void)
+{
+  setup_mode = SETUP_MODE_SHORTCUTS_6;
+
+  DrawSetupScreen();
+}
+
 static void execExitSetup(void)
 {
   SetGameStatus(GAME_MODE_MAIN);
@@ -7138,7 +7735,12 @@ static void ToggleUseApiServerIfNeeded(void)
   runtime.use_api_server = setup.use_api_server;
 
   if (runtime.use_api_server)
+  {
+    if (setup.has_remaining_tapes)
+      setup.ask_for_uploading_tapes = TRUE;
+
     CheckApiServerTasks();
+  }
 }
 
 static void ModifyGameSpeedIfNeeded(void)
@@ -7188,94 +7790,119 @@ static struct
   void *related_value;
 } hide_related_entry_list[] =
 {
-  { &setup.scores_in_highscore_list,   execSetupChooseScoresType       },
-  { &setup.scores_in_highscore_list,   &scores_type_text               },
+  { &setup.network_server_hostname,            execGadgetNetworkServer         },
+  { &setup.network_server_hostname,            &network_server_text            },
+
+  { &setup.scores_in_highscore_list,           execSetupChooseScoresType       },
+  { &setup.scores_in_highscore_list,           &scores_type_text               },
+
+  { &setup.game_frame_delay,                   execSetupChooseGameSpeed        },
+  { &setup.game_frame_delay,                   &game_speed_text                },
+
+  { &setup.scroll_delay_value,                 execSetupChooseScrollDelay      },
+  { &setup.scroll_delay_value,                 &scroll_delay_text              },
+
+  { &setup.engine_snapshot_mode,               execSetupChooseSnapshotMode     },
+  { &setup.engine_snapshot_mode,               &snapshot_mode_text             },
+
+  { &setup.default_game_engine_type,           execSetupChooseGameEngineType   },
+  { &setup.default_game_engine_type,           &game_engine_type_text          },
+
+  { &setup.bd_palette_c64,                     execSetupChoosePaletteC64       },
+  { &setup.bd_palette_c64,                     &bd_palette_c64_text            },
+
+  { &setup.bd_palette_c64dtv,                  execSetupChoosePaletteC64DTV    },
+  { &setup.bd_palette_c64dtv,                  &bd_palette_c64dtv_text         },
 
-  { &setup.game_frame_delay,           execSetupChooseGameSpeed        },
-  { &setup.game_frame_delay,           &game_speed_text                },
+  { &setup.bd_palette_atari,                   execSetupChoosePaletteAtari     },
+  { &setup.bd_palette_atari,                   &bd_palette_atari_text          },
 
-  { &setup.scroll_delay_value,         execSetupChooseScrollDelay      },
-  { &setup.scroll_delay_value,         &scroll_delay_text              },
+  { &setup.bd_default_color_type,              execSetupChooseColorType        },
+  { &setup.bd_default_color_type,              &bd_color_type_text             },
 
-  { &setup.engine_snapshot_mode,       execSetupChooseSnapshotMode     },
-  { &setup.engine_snapshot_mode,       &snapshot_mode_text             },
+  { &setup.window_scaling_percent,             execSetupChooseWindowSize       },
+  { &setup.window_scaling_percent,             &window_size_text               },
 
-  { &setup.window_scaling_percent,     execSetupChooseWindowSize       },
-  { &setup.window_scaling_percent,     &window_size_text               },
+  { &setup.window_scaling_quality,             execSetupChooseScalingType      },
+  { &setup.window_scaling_quality,             &scaling_type_text              },
 
-  { &setup.window_scaling_quality,     execSetupChooseScalingType      },
-  { &setup.window_scaling_quality,     &scaling_type_text              },
+  { &setup.screen_rendering_mode,              execSetupChooseRenderingMode    },
+  { &setup.screen_rendering_mode,              &rendering_mode_text            },
 
-  { &setup.screen_rendering_mode,      execSetupChooseRenderingMode    },
-  { &setup.screen_rendering_mode,      &rendering_mode_text            },
+  { &setup.vsync_mode,                         execSetupChooseVsyncMode        },
+  { &setup.vsync_mode,                         &vsync_mode_text                },
 
-  { &setup.vsync_mode,                 execSetupChooseVsyncMode        },
-  { &setup.vsync_mode,                 &vsync_mode_text                },
+  { &setup.graphics_set,                       execSetupChooseGraphics         },
+  { &setup.graphics_set,                       &graphics_set_name              },
 
-  { &setup.graphics_set,               execSetupChooseGraphics         },
-  { &setup.graphics_set,               &graphics_set_name              },
+  { &setup.sounds_set,                         execSetupChooseSounds           },
+  { &setup.sounds_set,                         &sounds_set_name                },
 
-  { &setup.sounds_set,                 execSetupChooseSounds           },
-  { &setup.sounds_set,                 &sounds_set_name                },
+  { &setup.music_set,                          execSetupChooseMusic            },
+  { &setup.music_set,                          &music_set_name                 },
 
-  { &setup.music_set,                  execSetupChooseMusic            },
-  { &setup.music_set,                  &music_set_name                 },
+  { &setup.volume_simple,                      execSetupChooseVolumeSimple     },
+  { &setup.volume_simple,                      &volume_simple_text             },
 
-  { &setup.volume_simple,              execSetupChooseVolumeSimple     },
-  { &setup.volume_simple,              &volume_simple_text             },
+  { &setup.volume_loops,                       execSetupChooseVolumeLoops      },
+  { &setup.volume_loops,                       &volume_loops_text              },
 
-  { &setup.volume_loops,               execSetupChooseVolumeLoops      },
-  { &setup.volume_loops,               &volume_loops_text              },
+  { &setup.volume_music,                       execSetupChooseVolumeMusic      },
+  { &setup.volume_music,                       &volume_music_text              },
 
-  { &setup.volume_music,               execSetupChooseVolumeMusic      },
-  { &setup.volume_music,               &volume_music_text              },
+  { &setup.touch.control_type,                 execSetupChooseTouchControls    },
+  { &setup.touch.control_type,                 &touch_controls_text            },
 
-  { &setup.touch.control_type,         execSetupChooseTouchControls    },
-  { &setup.touch.control_type,         &touch_controls_text            },
+  { &setup.touch.move_distance,                        execSetupChooseMoveDistance     },
+  { &setup.touch.move_distance,                        &move_distance_text             },
 
-  { &setup.touch.move_distance,                execSetupChooseMoveDistance     },
-  { &setup.touch.move_distance,                &move_distance_text             },
+  { &setup.touch.drop_distance,                        execSetupChooseDropDistance     },
+  { &setup.touch.drop_distance,                        &drop_distance_text             },
 
-  { &setup.touch.drop_distance,                execSetupChooseDropDistance     },
-  { &setup.touch.drop_distance,                &drop_distance_text             },
+  { &setup.touch.transparency,                 execSetupChooseTransparency     },
+  { &setup.touch.transparency,                 &transparency_text              },
 
-  { &setup.touch.transparency,         execSetupChooseTransparency     },
-  { &setup.touch.transparency,         &transparency_text              },
+  { &setup.touch.grid_xsize[0],                        execSetupChooseGridXSize_0      },
+  { &setup.touch.grid_xsize[0],                        &grid_size_text[0][0]           },
 
-  { &setup.touch.grid_xsize[0],                execSetupChooseGridXSize_0      },
-  { &setup.touch.grid_xsize[0],                &grid_size_text[0][0]           },
+  { &setup.touch.grid_ysize[0],                        execSetupChooseGridYSize_0      },
+  { &setup.touch.grid_ysize[0],                        &grid_size_text[0][1]           },
 
-  { &setup.touch.grid_ysize[0],                execSetupChooseGridYSize_0      },
-  { &setup.touch.grid_ysize[0],                &grid_size_text[0][1]           },
+  { &setup.touch.grid_xsize[1],                        execSetupChooseGridXSize_1      },
+  { &setup.touch.grid_xsize[1],                        &grid_size_text[1][0]           },
 
-  { &setup.touch.grid_xsize[1],                execSetupChooseGridXSize_1      },
-  { &setup.touch.grid_xsize[1],                &grid_size_text[1][0]           },
+  { &setup.touch.grid_ysize[1],                        execSetupChooseGridYSize_1      },
+  { &setup.touch.grid_ysize[1],                        &grid_size_text[1][1]           },
 
-  { &setup.touch.grid_ysize[1],                execSetupChooseGridYSize_1      },
-  { &setup.touch.grid_ysize[1],                &grid_size_text[1][1]           },
+  { &setup.internal.menu_game,                 execSetupGame                   },
+  { &setup.internal.menu_engines,              execSetupEngines                },
+  { &setup.internal.menu_editor,               execSetupEditor                 },
+  { &setup.internal.menu_graphics,             execSetupGraphics               },
+  { &setup.internal.menu_sound,                        execSetupSound                  },
+  { &setup.internal.menu_artwork,              execSetupArtwork                },
+  { &setup.internal.menu_input,                        execSetupInput                  },
+  { &setup.internal.menu_touch,                        execSetupTouch                  },
+  { &setup.internal.menu_shortcuts,            execSetupShortcuts              },
+  { &setup.internal.menu_exit,                 execExitSetup                   },
+  { &setup.internal.menu_save_and_exit,                execSaveAndExitSetup            },
 
-  { &setup.internal.menu_game,         execSetupGame                   },
-  { &setup.internal.menu_engines,      execSetupEngines                },
-  { &setup.internal.menu_editor,       execSetupEditor                 },
-  { &setup.internal.menu_graphics,     execSetupGraphics               },
-  { &setup.internal.menu_sound,                execSetupSound                  },
-  { &setup.internal.menu_artwork,      execSetupArtwork                },
-  { &setup.internal.menu_input,                execSetupInput                  },
-  { &setup.internal.menu_touch,                execSetupTouch                  },
-  { &setup.internal.menu_shortcuts,    execSetupShortcuts              },
-  { &setup.internal.menu_exit,         execExitSetup                   },
-  { &setup.internal.menu_save_and_exit,        execSaveAndExitSetup            },
+  { &setup.internal.menu_shortcuts_various,    execSetupShortcuts1             },
+  { &setup.internal.menu_shortcuts_focus,      execSetupShortcuts2             },
+  { &setup.internal.menu_shortcuts_tape,       execSetupShortcuts3             },
+  { &setup.internal.menu_shortcuts_sound,      execSetupShortcuts4             },
+  { &setup.internal.menu_shortcuts_snap,       execSetupShortcuts5             },
+  { &setup.internal.menu_shortcuts_speed,      execSetupShortcuts6             },
 
-  { &setup.internal.info_title,                execInfoTitleScreen             },
-  { &setup.internal.info_elements,     execInfoElements                },
-  { &setup.internal.info_music,                execInfoMusic                   },
-  { &setup.internal.info_credits,      execInfoCredits                 },
-  { &setup.internal.info_program,      execInfoProgram                 },
-  { &setup.internal.info_version,      execInfoVersion                 },
-  { &setup.internal.info_levelset,     execInfoLevelSet                },
-  { &setup.internal.info_exit,         execExitInfo                    },
+  { &setup.internal.info_title,                        execInfoTitleScreen             },
+  { &setup.internal.info_elements,             execInfoElements                },
+  { &setup.internal.info_music,                        execInfoMusic                   },
+  { &setup.internal.info_credits,              execInfoCredits                 },
+  { &setup.internal.info_program,              execInfoProgram                 },
+  { &setup.internal.info_version,              execInfoVersion                 },
+  { &setup.internal.info_levelset,             execInfoLevelSet                },
+  { &setup.internal.info_exit,                 execExitInfo                    },
 
-  { NULL,                              NULL                            }
+  { NULL,                                      NULL                            }
 };
 
 void setHideRelatedSetupEntries(void)
@@ -7289,254 +7916,286 @@ void setHideRelatedSetupEntries(void)
 
 static struct TokenInfo setup_info_main[] =
 {
-  { TYPE_ENTER_MENU,   execSetupGame,          STR_SETUP_GAME          },
-  { TYPE_ENTER_MENU,   execSetupEngines,       STR_SETUP_ENGINES       },
-  { TYPE_ENTER_MENU,   execSetupEditor,        STR_SETUP_EDITOR        },
-  { TYPE_ENTER_MENU,   execSetupGraphics,      STR_SETUP_GRAPHICS      },
-  { TYPE_ENTER_MENU,   execSetupSound,         STR_SETUP_SOUND         },
-  { TYPE_ENTER_MENU,   execSetupArtwork,       STR_SETUP_ARTWORK       },
-  { TYPE_ENTER_MENU,   execSetupInput,         STR_SETUP_INPUT         },
-  { TYPE_ENTER_MENU,   execSetupTouch,         STR_SETUP_TOUCH         },
-  { TYPE_ENTER_MENU,   execSetupShortcuts,     STR_SETUP_SHORTCUTS     },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execExitSetup,          STR_SETUP_EXIT          },
-  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,   STR_SETUP_SAVE_AND_EXIT },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_ENTER_MENU,   execSetupGame,                  STR_SETUP_GAME                  },
+  { TYPE_ENTER_MENU,   execSetupEngines,               STR_SETUP_ENGINES               },
+  { TYPE_ENTER_MENU,   execSetupEditor,                STR_SETUP_EDITOR                },
+  { TYPE_ENTER_MENU,   execSetupGraphics,              STR_SETUP_GRAPHICS              },
+  { TYPE_ENTER_MENU,   execSetupSound,                 STR_SETUP_SOUND                 },
+  { TYPE_ENTER_MENU,   execSetupArtwork,               STR_SETUP_ARTWORK               },
+  { TYPE_ENTER_MENU,   execSetupInput,                 STR_SETUP_INPUT                 },
+  { TYPE_ENTER_MENU,   execSetupTouch,                 STR_SETUP_TOUCH                 },
+  { TYPE_ENTER_MENU,   execSetupShortcuts,             STR_SETUP_SHORTCUTS             },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execExitSetup,                  STR_SETUP_EXIT                  },
+  { TYPE_LEAVE_MENU,   execSaveAndExitSetup,           STR_SETUP_SAVE_AND_EXIT         },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_game[] =
 {
-  { TYPE_SWITCH,       &setup.team_mode,       "Team-Mode (Multi-Player):" },
-  { TYPE_SWITCH,       &setup.network_mode,    "Network Multi-Player Mode:" },
-  { TYPE_PLAYER,       &setup.network_player_nr,"Preferred Network Player:" },
-  { TYPE_TEXT_INPUT,   execGadgetNetworkServer, "Network Server Hostname:" },
-  { TYPE_STRING,       &network_server_text,   ""                      },
-  { TYPE_SWITCH,       &setup.use_api_server,  "Use Highscore Server:" },
-  { TYPE_ENTER_LIST,   execSetupChooseScoresType,"Scores in Highscore List:" },
-  { TYPE_STRING,       &scores_type_text,      ""                      },
-  { TYPE_ENTER_LIST,   execOfferUploadTapes,   "Upload Tapes to Server" },
-  { TYPE_SWITCH,       &setup.multiple_users,  "Multiple Users/Teams:" },
-  { TYPE_YES_NO,       &setup.input_on_focus,  "Only Move Focussed Player:" },
-  { TYPE_SWITCH,       &setup.time_limit,      "Time Limit:"           },
-  { TYPE_SWITCH,       &setup.handicap,        "Force Solving Levels:" },
-  { TYPE_SWITCH,       &setup.skip_levels,     "Allow Skipping Levels:" },
-  { TYPE_SWITCH,       &setup.increment_levels,"Increment Solved Levels:" },
-  { TYPE_SWITCH,       &setup.auto_play_next_level,"Auto-play Next Level:" },
-  { TYPE_SWITCH,       &setup.count_score_after_game,"Count Score After Game:" },
-  { TYPE_SWITCH,       &setup.show_scores_after_game,"Show Scores After Game:" },
-  { TYPE_YES_NO,       &setup.ask_on_game_over, "Ask on Game Over:"    },
-  { TYPE_YES_NO,       &setup.ask_on_quit_game, "Ask on Quit Game:"    },
-  { TYPE_YES_NO,       &setup.ask_on_quit_program, "Ask on Quit Program:" },
-  { TYPE_SWITCH,       &setup.autorecord,      "Auto-Record Tapes:"    },
-  { TYPE_SWITCH,       &setup.auto_pause_on_start, "Start Game in Pause Mode:" },
-  { TYPE_ENTER_LIST,   execSetupChooseGameSpeed, "Game Speed:"         },
-  { TYPE_STRING,       &game_speed_text,       ""                      },
-  { TYPE_SWITCH,       &setup.game_speed_extended, "Game Speed Extended List:" },
+  { TYPE_SWITCH,       &setup.team_mode,               "Team-Mode (Multi-Player):"     },
+  { TYPE_SWITCH,       &setup.network_mode,            "Network Multi-Player Mode:"    },
+  { TYPE_PLAYER,       &setup.network_player_nr,       "Preferred Network Player:"     },
+  { TYPE_TEXT_INPUT,   execGadgetNetworkServer,        "Network Server Hostname:"      },
+  { TYPE_STRING,       &network_server_text,           ""                              },
+  { TYPE_SWITCH,       &setup.use_api_server,          "Use Highscore Server:"         },
+  { TYPE_ENTER_LIST,   execSetupChooseScoresType,      "Scores in Highscore List:"     },
+  { TYPE_STRING,       &scores_type_text,              ""                              },
+  { TYPE_ENTER_LIST,   execOfferUploadTapes,           "Upload Tapes to Server"        },
+  { TYPE_SWITCH,       &setup.multiple_users,          "Multiple Users/Teams:"         },
+  { TYPE_YES_NO,       &setup.input_on_focus,          "Only Move Focussed Player:"    },
+  { TYPE_SWITCH,       &setup.time_limit,              "Time Limit:"                   },
 #if 1
-  { TYPE_ENTER_LIST,   execSetupChooseScrollDelay, "Scroll Delay:"     },
-  { TYPE_STRING,       &scroll_delay_text,     ""                      },
+  { TYPE_YES_NO_ASK,   &setup.allow_skipping_levels,   "Allow Skipping Levels:"        },
+#else
+  { TYPE_SWITCH,       &setup.handicap,                "Force Solving Levels:"         },
+  { TYPE_SWITCH,       &setup.skip_levels,             "Allow Skipping Levels:"        },
 #endif
-  { TYPE_ENTER_LIST, execSetupChooseSnapshotMode,"Game Engine Snapshot Mode:" },
-  { TYPE_STRING,       &snapshot_mode_text,    ""                      },
-  { TYPE_SWITCH,       &setup.show_load_save_buttons,"Show Load/Save Buttons:" },
-  { TYPE_SWITCH,       &setup.show_undo_redo_buttons,"Show Undo/Redo Buttons:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_SWITCH,       &setup.increment_levels,        "Increment Solved Levels:"      },
+  { TYPE_SWITCH,       &setup.auto_play_next_level,    "Auto-play Next Level:"         },
+  { TYPE_SWITCH,       &setup.count_score_after_game,  "Count Score After Game:"       },
+  { TYPE_SWITCH,       &setup.show_scores_after_game,  "Show Scores After Game:"       },
+  { TYPE_YES_NO,       &setup.ask_on_game_over,        "Ask on Game Over:"             },
+  { TYPE_YES_NO,       &setup.ask_on_quit_game,        "Ask on Quit Game:"             },
+  { TYPE_YES_NO,       &setup.ask_on_quit_program,     "Ask on Quit Program:"          },
+  { TYPE_SWITCH,       &setup.autorecord,              "Auto-Record When Playing:"     },
+  { TYPE_SWITCH,       &setup.autorecord_after_replay, "Auto-Record After Replay:"     },
+  { TYPE_SWITCH,       &setup.auto_pause_on_start,     "Start Game in Pause Mode:"     },
+  { TYPE_ENTER_LIST,   execSetupChooseGameSpeed,       "Game Speed:"                   },
+  { TYPE_STRING,       &game_speed_text,               ""                              },
+  { TYPE_SWITCH,       &setup.game_speed_extended,     "Game Speed Extended List:"     },
+#if 1
+  { TYPE_ENTER_LIST,   execSetupChooseScrollDelay,     "Scroll Delay:"                 },
+  { TYPE_STRING,       &scroll_delay_text,             ""                              },
+#endif
+  { TYPE_ENTER_LIST,   execSetupChooseSnapshotMode,    "Game Engine Snapshot Mode:"    },
+  { TYPE_STRING,       &snapshot_mode_text,            ""                              },
+  { TYPE_SWITCH,       &setup.show_load_save_buttons,  "Show Load/Save Buttons:"       },
+  { TYPE_SWITCH,       &setup.show_undo_redo_buttons,  "Show Undo/Redo Buttons:"       },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_engines[] =
 {
-  { TYPE_HEADLINE,     NULL,                   "Emerald Mine"          },
-  { TYPE_SWITCH,       &setup.forced_scroll_delay, "Scroll Delay:"     },
-  { TYPE_ECS_AGA,      &setup.prefer_aga_graphics, "Amiga Graphics Chipset:" },
-  { TYPE_SWITCH,       &setup.prefer_lowpass_sounds,"Low-Pass Filter Sounds:" },
-  { TYPE_SWITCH,       &setup.prefer_extra_panel_items,"Show Dynamite and Keys:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_HEADLINE,     NULL,                   "Supaplex"              },
-  { TYPE_SWITCH,       &setup.sp_show_border_elements, "Border Elements:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_ENTER_LIST,   &execSetupChooseGameEngineType, "Default Game Engine:"          },
+  { TYPE_STRING,       &game_engine_type_text,         ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_ECS_AGA,      &setup.prefer_aga_graphics,     "Game Graphics Style:"          },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_HEADLINE,     NULL,                           "Boulder Dash"                  },
+  { TYPE_SWITCH,       &setup.bd_skip_uncovering,      "Skip (un)covering screen:"     },
+  { TYPE_SWITCH,       &setup.bd_skip_hatching,        "Skip hatching player:"         },
+  { TYPE_SWITCH,       &setup.bd_scroll_delay,         "Scroll Delay:"                 },
+  { TYPE_YES_NO_AUTO,  &setup.bd_smooth_movements,     "Smooth Element Movement:"      },
+  { TYPE_YES_NO_AUTO,  &setup.bd_pushing_graphics,     "Player Pushing Graphics:"      },
+  { TYPE_YES_NO_AUTO,  &setup.bd_up_down_graphics,     "Player Up/Down Graphics:"      },
+  { TYPE_YES_NO_AUTO,  &setup.bd_falling_sounds,       "Double Falling Sounds:"        },
+  { TYPE_SWITCH,       &setup.bd_show_invisible_outbox,"Show invisible outbox:"        },
+  { TYPE_ENTER_LIST,   &execSetupChoosePaletteC64,     "Color Palette (C64):"          },
+  { TYPE_STRING,       &bd_palette_c64_text,           ""                              },
+  { TYPE_ENTER_LIST,   &execSetupChoosePaletteC64DTV,  "Color Palette (C64DTV):"       },
+  { TYPE_STRING,       &bd_palette_c64dtv_text,        ""                              },
+  { TYPE_ENTER_LIST,   &execSetupChoosePaletteAtari,   "Color Palette (Atari):"        },
+  { TYPE_STRING,       &bd_palette_atari_text,         ""                              },
+  { TYPE_ENTER_LIST,   &execSetupChooseColorType,      "Preferred Color Type:"         },
+  { TYPE_STRING,       &bd_color_type_text,            ""                              },
+  { TYPE_SWITCH,       &setup.bd_random_colors,        "Random Colors:"                },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_HEADLINE,     NULL,                           "Emerald Mine"                  },
+  { TYPE_SWITCH,       &setup.forced_scroll_delay,     "Scroll Delay:"                 },
+  { TYPE_SWITCH,       &setup.prefer_lowpass_sounds,   "Low-Pass Filter Sounds:"       },
+  { TYPE_SWITCH,       &setup.prefer_extra_panel_items,"Show Dynamite and Keys:"       },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_HEADLINE,     NULL,                           "Supaplex"                      },
+  { TYPE_SWITCH,       &setup.sp_show_border_elements, "Border Elements:"              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_editor[] =
 {
 #if 0
-  { TYPE_SWITCH,       &setup.editor.el_boulderdash,   "Boulder Dash:" },
-  { TYPE_SWITCH,       &setup.editor.el_emerald_mine,  "Emerald Mine:" },
-  { TYPE_SWITCH, &setup.editor.el_emerald_mine_club,   "Emerald Mine Club:" },
-  { TYPE_SWITCH,       &setup.editor.el_more,          "Rocks'n'Diamonds:" },
-  { TYPE_SWITCH,       &setup.editor.el_sokoban,       "Sokoban:"      },
-  { TYPE_SWITCH,       &setup.editor.el_supaplex,      "Supaplex:"     },
-  { TYPE_SWITCH,       &setup.editor.el_diamond_caves, "Diamond Caves II:" },
-  { TYPE_SWITCH,       &setup.editor.el_dx_boulderdash,"DX-Boulderdash:" },
-  { TYPE_SWITCH,       &setup.editor.el_chars,         "Text Characters:" },
-  { TYPE_SWITCH, &setup.editor.el_steel_chars, "Text Characters (Steel):" },
+  { TYPE_SWITCH,       &setup.editor.el_boulderdash,   "Boulder Dash:"                 },
+  { TYPE_SWITCH,       &setup.editor.el_boulderdash_native, "Boulder Dash Native:"     },
+  { TYPE_SWITCH,       &setup.editor.el_emerald_mine,  "Emerald Mine:"                 },
+  { TYPE_SWITCH,       &setup.editor.el_emerald_mine_club, "Emerald Mine Club:"        },
+  { TYPE_SWITCH,       &setup.editor.el_more,          "Rocks'n'Diamonds:"             },
+  { TYPE_SWITCH,       &setup.editor.el_sokoban,       "Sokoban:"                      },
+  { TYPE_SWITCH,       &setup.editor.el_supaplex,      "Supaplex:"                     },
+  { TYPE_SWITCH,       &setup.editor.el_diamond_caves, "Diamond Caves II:"             },
+  { TYPE_SWITCH,       &setup.editor.el_dx_boulderdash,"DX-Boulderdash:"               },
+  { TYPE_SWITCH,       &setup.editor.el_chars,         "Text Characters:"              },
+  { TYPE_SWITCH,       &setup.editor.el_steel_chars,   "Text Characters (Steel):"      },
 #endif
-  { TYPE_SWITCH,       &setup.editor.el_classic,  "Classic Elements:" },
-  { TYPE_SWITCH,       &setup.editor.el_custom,  "Custom & Group Elements:" },
+  { TYPE_SWITCH,       &setup.editor.el_classic,       "Classic Elements:"             },
+  { TYPE_SWITCH,       &setup.editor.el_custom,        "Custom & Group Elements:"      },
 #if 0
-  { TYPE_SWITCH,       &setup.editor.el_headlines,     "Headlines:"    },
+  { TYPE_SWITCH,       &setup.editor.el_headlines,     "Headlines:"                    },
 #endif
-  { TYPE_SWITCH, &setup.editor.el_user_defined, "User defined element list:" },
-  { TYPE_SWITCH,       &setup.editor.el_dynamic,  "Dynamic level elements:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_SWITCH,       &setup.editor.el_user_defined,  "User defined element list:"    },
+  { TYPE_SWITCH,       &setup.editor.el_dynamic,       "Dynamic level elements:"       },
+  { TYPE_EMPTY,                NULL,                           ""                              },
 #if 0
-  { TYPE_SWITCH,       &setup.editor.el_by_game,   "Show elements by game:" },
-  { TYPE_SWITCH,       &setup.editor.el_by_type,   "Show elements by type:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
+  { TYPE_SWITCH,       &setup.editor.el_by_game,       "Show elements by game:"        },
+  { TYPE_SWITCH,       &setup.editor.el_by_type,       "Show elements by type:"        },
+  { TYPE_EMPTY,                NULL,                           ""                              },
 #endif
-  { TYPE_SWITCH, &setup.editor.show_element_token,     "Show element token:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_SWITCH, &setup.editor.show_read_only_warning, "Show read-only warning:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_SWITCH,       &setup.editor.show_element_token, "Show element token:"         },
+  { TYPE_SWITCH,       &setup.editor.fast_game_start,  "Fast game start:"              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_SWITCH,       &setup.editor.show_read_only_warning, "Show read-only warning:" },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_graphics[] =
 {
 #if !defined(PLATFORM_ANDROID) && !defined(PLATFORM_EMSCRIPTEN)
-  { TYPE_SWITCH,       &setup.fullscreen,      "Fullscreen:"           },
-  { TYPE_ENTER_LIST,   execSetupChooseWindowSize, "Window Scaling:"    },
-  { TYPE_STRING,       &window_size_text,      ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseScalingType, "Anti-Aliasing:"    },
-  { TYPE_STRING,       &scaling_type_text,     ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseRenderingMode, "Special Rendering:" },
-  { TYPE_STRING,       &rendering_mode_text,   ""                      },
+  { TYPE_SWITCH,       &setup.fullscreen,              "Fullscreen:"                   },
+  { TYPE_ENTER_LIST,   execSetupChooseWindowSize,      "Window Scaling:"               },
+  { TYPE_STRING,       &window_size_text,              ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseScalingType,     "Anti-Aliasing:"                },
+  { TYPE_STRING,       &scaling_type_text,             ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseRenderingMode,   "Special Rendering:"            },
+  { TYPE_STRING,       &rendering_mode_text,           ""                              },
 #endif
 #if 0
-  { TYPE_ENTER_LIST,   execSetupChooseScrollDelay, "Scroll Delay:"     },
-  { TYPE_STRING,       &scroll_delay_text,     ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseScrollDelay,     "Scroll Delay:"                 },
+  { TYPE_STRING,       &scroll_delay_text,             ""                              },
 #endif
 #if !defined(PLATFORM_EMSCRIPTEN)
-  { TYPE_ENTER_LIST,   execSetupChooseVsyncMode, "Vertical Sync (VSync):" },
-  { TYPE_STRING,       &vsync_mode_text,       ""                      },
+  { TYPE_ENTER_LIST,   execSetupChooseVsyncMode,       "Vertical Sync (VSync):"        },
+  { TYPE_STRING,       &vsync_mode_text,               ""                              },
 #endif
-  { TYPE_SWITCH,       &setup.fade_screens,    "Fade Screens:"         },
-  { TYPE_SWITCH,       &setup.quick_switch,    "Quick Player Focus Switch:" },
-  { TYPE_SWITCH,       &setup.quick_doors,     "Quick Menu Doors:"     },
-  { TYPE_SWITCH,       &setup.show_titlescreen,"Show Title Screens:"   },
-  { TYPE_SWITCH,       &setup.toons,           "Show Menu Animations:" },
-  { TYPE_SWITCH,       &setup.small_game_graphics, "Small Game Graphics:" },
-  { TYPE_YES_NO_AUTO,  &setup.debug.xsn_mode,  debug_xsn_mode          },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_SWITCH,       &setup.fade_screens,            "Fade Screens:"                 },
+  { TYPE_SWITCH,       &setup.quick_switch,            "Quick Player Focus Switch:"    },
+  { TYPE_SWITCH,       &setup.quick_doors,             "Quick Menu Doors:"             },
+  { TYPE_SWITCH,       &setup.show_titlescreen,        "Show Title Screens:"           },
+  { TYPE_SWITCH,       &setup.toons,                   "Show Toons:"                   },
+  { TYPE_SWITCH,       &setup.small_game_graphics,     "Small Game Graphics:"          },
+  { TYPE_YES_NO_AUTO,  &setup.debug.xsn_mode,          debug_xsn_mode                  },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_sound[] =
 {
-  { TYPE_SWITCH,       &setup.sound_simple,    "Sound Effects (Normal):"  },
-  { 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                    }
+  { TYPE_SWITCH,       &setup.sound_simple,            "Sound Effects (Normal):"       },
+  { 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_SWITCH,       &setup.audio_sample_rate_44100, "44100 Hz audio mixing:"        },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_artwork[] =
 {
-  { TYPE_ENTER_LIST,   execSetupChooseGraphics,"Custom Graphics:"      },
-  { TYPE_STRING,       &graphics_set_name,     ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseSounds,  "Custom Sounds:"        },
-  { TYPE_STRING,       &sounds_set_name,       ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseMusic,   "Custom Music:"         },
-  { TYPE_STRING,       &music_set_name,        ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { 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:"   },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_ENTER_LIST,   execSetupChooseGraphics,        "Custom Graphics:"              },
+  { TYPE_STRING,       &graphics_set_name,             ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseSounds,          "Custom Sounds:"                },
+  { TYPE_STRING,       &sounds_set_name,               ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseMusic,           "Custom Music:"                 },
+  { TYPE_STRING,       &music_set_name,                ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { 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:"         },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_input[] =
 {
-  { TYPE_SWITCH,       NULL,                   "Player:"               },
-  { TYPE_SWITCH,       NULL,                   "Device:"               },
-  { TYPE_SWITCH,       NULL,                   ""                      },
-  { TYPE_SKIPPABLE,    NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_SKIPPABLE,    NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_SWITCH,       NULL,                           "Player:"                       },
+  { TYPE_SWITCH,       NULL,                           "Device:"                       },
+  { TYPE_SWITCH,       NULL,                           ""                              },
+  { TYPE_SKIPPABLE,    NULL,                           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_SKIPPABLE,    NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_touch[] =
 {
-  { TYPE_ENTER_LIST,   execSetupChooseTouchControls, "Touch Control Type:" },
-  { TYPE_STRING,       &touch_controls_text,   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
+  { TYPE_ENTER_LIST,   execSetupChooseTouchControls,   "Touch Control Type:"           },
+  { TYPE_STRING,       &touch_controls_text,           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
 
-  { 0,                 NULL,                   NULL                    }
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_touch_virtual_buttons_0[] =
 {
-  { TYPE_ENTER_LIST,   execSetupChooseTouchControls, "Touch Control Type:" },
-  { TYPE_STRING,       &touch_controls_text,   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseGridXSize_0, "Horizontal Buttons (Landscape):"   },
-  { TYPE_STRING,       &grid_size_text[0][0],  ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseGridYSize_0, "Vertical Buttons (Landscape):"     },
-  { TYPE_STRING,       &grid_size_text[0][1],  ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseTransparency, "Button Transparency:" },
-  { TYPE_STRING,       &transparency_text,     ""                      },
-  { TYPE_SWITCH,       &setup.touch.draw_outlined, "Draw Buttons Outlined:" },
-  { TYPE_SWITCH,       &setup.touch.draw_pressed, "Highlight Pressed Buttons:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_ENTER_LIST,   execSetupConfigureVirtualButtons, "Configure Virtual Buttons" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_ENTER_LIST,   execSetupChooseTouchControls,   "Touch Control Type:"           },
+  { TYPE_STRING,       &touch_controls_text,           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseGridXSize_0,     "Horizontal Buttons (Landscape):" },
+  { TYPE_STRING,       &grid_size_text[0][0],          ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseGridYSize_0,     "Vertical Buttons (Landscape):" },
+  { TYPE_STRING,       &grid_size_text[0][1],          ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseTransparency,    "Button Transparency:"          },
+  { TYPE_STRING,       &transparency_text,             ""                              },
+  { TYPE_SWITCH,       &setup.touch.draw_outlined,     "Draw Buttons Outlined:"        },
+  { TYPE_SWITCH,       &setup.touch.draw_pressed,      "Highlight Pressed Buttons:"    },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_ENTER_LIST,   execSetupConfigureVirtualButtons, "Configure Virtual Buttons"   },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_touch_virtual_buttons_1[] =
 {
-  { TYPE_ENTER_LIST,   execSetupChooseTouchControls, "Touch Control Type:" },
-  { TYPE_STRING,       &touch_controls_text,   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseGridXSize_1, "Horizontal Buttons (Portrait):"    },
-  { TYPE_STRING,       &grid_size_text[1][0],  ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseGridYSize_1, "Vertical Buttons (Portrait):"      },
-  { TYPE_STRING,       &grid_size_text[1][1],  ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseTransparency, "Button Transparency:" },
-  { TYPE_STRING,       &transparency_text,     ""                      },
-  { TYPE_SWITCH,       &setup.touch.draw_outlined, "Draw Buttons Outlined:" },
-  { TYPE_SWITCH,       &setup.touch.draw_pressed, "Highlight Pressed Buttons:" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_ENTER_LIST,   execSetupConfigureVirtualButtons, "Configure Virtual Buttons" },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_ENTER_LIST,   execSetupChooseTouchControls,   "Touch Control Type:"           },
+  { TYPE_STRING,       &touch_controls_text,           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseGridXSize_1,     "Horizontal Buttons (Portrait):" },
+  { TYPE_STRING,       &grid_size_text[1][0],          ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseGridYSize_1,     "Vertical Buttons (Portrait):"  },
+  { TYPE_STRING,       &grid_size_text[1][1],          ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseTransparency,    "Button Transparency:"          },
+  { TYPE_STRING,       &transparency_text,             ""                              },
+  { TYPE_SWITCH,       &setup.touch.draw_outlined,     "Draw Buttons Outlined:"        },
+  { TYPE_SWITCH,       &setup.touch.draw_pressed,      "Highlight Pressed Buttons:"    },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_ENTER_LIST,   execSetupConfigureVirtualButtons, "Configure Virtual Buttons"   },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo *setup_info_touch_virtual_buttons[] =
@@ -7547,119 +8206,132 @@ static struct TokenInfo *setup_info_touch_virtual_buttons[] =
 
 static struct TokenInfo setup_info_touch_wipe_gestures[] =
 {
-  { TYPE_ENTER_LIST,   execSetupChooseTouchControls, "Touch Control Type:" },
-  { TYPE_STRING,       &touch_controls_text,   ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseMoveDistance, "Move Trigger Distance:" },
-  { TYPE_STRING,       &move_distance_text,    ""                      },
-  { TYPE_ENTER_LIST,   execSetupChooseDropDistance, "Drop Trigger Distance:" },
-  { TYPE_STRING,       &drop_distance_text,    ""                      },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupMain,          "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_ENTER_LIST,   execSetupChooseTouchControls,   "Touch Control Type:"           },
+  { TYPE_STRING,       &touch_controls_text,           ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseMoveDistance,    "Move Trigger Distance:"        },
+  { TYPE_STRING,       &move_distance_text,            ""                              },
+  { TYPE_ENTER_LIST,   execSetupChooseDropDistance,    "Drop Trigger Distance:"        },
+  { TYPE_STRING,       &drop_distance_text,            ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
+
+  { 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"                  },
+  { 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_ENTER_MENU,   execSetupShortcuts6,            "Speed Keys"                    },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupMain,                  "Back"                          },
 
-  { 0,                 NULL,                   NULL                    }
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_shortcuts_1[] =
 {
-  { TYPE_KEYTEXT,      NULL,           "Quick Save Game to Tape:",     },
-  { TYPE_KEY,          &setup.shortcut.save_game, ""                   },
-  { TYPE_KEYTEXT,      NULL,           "Quick Load Game from Tape:",   },
-  { TYPE_KEY,          &setup.shortcut.load_game, ""                   },
-  { TYPE_KEYTEXT,      NULL,           "Restart Game:",                },
-  { TYPE_KEY,          &setup.shortcut.restart_game, ""                },
-  { TYPE_KEYTEXT,      NULL,           "Replay & Pause Before End:",   },
-  { TYPE_KEY,          &setup.shortcut.pause_before_end, ""            },
-  { TYPE_KEYTEXT,      NULL,           "Start Game & Toggle Pause:",   },
-  { TYPE_KEY,          &setup.shortcut.toggle_pause, ""                },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { 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,   execSetupShortcuts,     "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_KEYTEXT,      NULL,                           "Quick Save Game to Tape:"      },
+  { TYPE_KEY,          &setup.shortcut.save_game,      ""                              },
+  { TYPE_KEYTEXT,      NULL,                           "Quick Load Game from Tape:"    },
+  { TYPE_KEY,          &setup.shortcut.load_game,      ""                              },
+  { TYPE_KEYTEXT,      NULL,                           "Restart Game:"                 },
+  { TYPE_KEY,          &setup.shortcut.restart_game,   ""                              },
+  { TYPE_KEYTEXT,      NULL,                           "Replay & Pause Before End:"    },
+  { TYPE_KEY,          &setup.shortcut.pause_before_end, ""                            },
+  { TYPE_KEYTEXT,      NULL,                           "Start Game & Toggle Pause:"    },
+  { TYPE_KEY,          &setup.shortcut.toggle_pause,   ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { 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,   execSetupShortcuts,             "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static struct TokenInfo setup_info_shortcuts_2[] =
 {
-  { TYPE_KEYTEXT,      NULL,           "Set Focus to Player 1:",       },
-  { TYPE_KEY,          &setup.shortcut.focus_player[0], ""             },
-  { TYPE_KEYTEXT,      NULL,           "Set Focus to Player 2:",       },
-  { TYPE_KEY,          &setup.shortcut.focus_player[1], ""             },
-  { TYPE_KEYTEXT,      NULL,           "Set Focus to Player 3:",       },
-  { TYPE_KEY,          &setup.shortcut.focus_player[2], ""             },
-  { TYPE_KEYTEXT,      NULL,           "Set Focus to Player 4:",       },
-  { TYPE_KEY,          &setup.shortcut.focus_player[3], ""             },
-  { TYPE_KEYTEXT,      NULL,           "Set Focus to All Players:",    },
-  { TYPE_KEY,          &setup.shortcut.focus_player_all, ""            },
-  { TYPE_EMPTY,                NULL,                   ""                      },
-  { TYPE_LEAVE_MENU,   execSetupShortcuts,     "Back"                  },
-
-  { 0,                 NULL,                   NULL                    }
+  { TYPE_KEYTEXT,      NULL,                           "Set Focus to Player 1:"        },
+  { TYPE_KEY,          &setup.shortcut.focus_player[0], ""                             },
+  { TYPE_KEYTEXT,      NULL,                           "Set Focus to Player 2:"        },
+  { TYPE_KEY,          &setup.shortcut.focus_player[1], ""                             },
+  { TYPE_KEYTEXT,      NULL,                           "Set Focus to Player 3:"        },
+  { TYPE_KEY,          &setup.shortcut.focus_player[2], ""                             },
+  { TYPE_KEYTEXT,      NULL,                           "Set Focus to Player 4:"        },
+  { TYPE_KEY,          &setup.shortcut.focus_player[3], ""                             },
+  { TYPE_KEYTEXT,      NULL,                           "Set Focus to All Players:"     },
+  { TYPE_KEY,          &setup.shortcut.focus_player_all, ""                            },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { 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                    }
+  { 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"                  },
+  { 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                    }
+  { 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"                  },
+  { 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                            }
+};
 
-  { 0,                 NULL,                   NULL                    }
+static struct TokenInfo setup_info_shortcuts_6[] =
+{
+  { TYPE_KEYTEXT,      NULL,                           "Fast Playing Speed:"           },
+  { TYPE_KEY,          &setup.shortcut.speed_fast,     ""                              },
+  { TYPE_KEYTEXT,      NULL,                           "Slow Playing Speed:"           },
+  { TYPE_KEY,          &setup.shortcut.speed_slow,     ""                              },
+  { TYPE_EMPTY,                NULL,                           ""                              },
+  { TYPE_LEAVE_MENU,   execSetupShortcuts,             "Back"                          },
+
+  { 0,                 NULL,                           NULL                            }
 };
 
 static Key getSetupKey(void)
@@ -7677,7 +8349,7 @@ static Key getSetupKey(void)
       {
         case EVENT_KEYPRESS:
          {
-           key = GetEventKey((KeyEvent *)&event, TRUE);
+           key = GetEventKey((KeyEvent *)&event);
 
            // press 'Escape' or 'Enter' to keep the existing key binding
            if (key == KSYM_Escape || key == KSYM_Return)
@@ -7716,8 +8388,11 @@ static int getSetupValueFont(int type, void *value)
   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);
+    return (*(int *)value == STATE_AUTO  ? FONT_OPTION_ON :
+           *(int *)value == STATE_FALSE ? FONT_OPTION_OFF : FONT_OPTION_ON);
+  else if (type & TYPE_YES_NO_ASK)
+    return (*(int *)value == STATE_ASK   ? FONT_OPTION_ON :
+           *(int *)value == STATE_FALSE ? FONT_OPTION_OFF : FONT_OPTION_ON);
   else if (type & TYPE_PLAYER)
     return FONT_VALUE_1;
   else
@@ -7738,10 +8413,11 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw)
   struct TokenInfo *si = &setup_info[si_pos];
   boolean font_draw_xoffset_modified = FALSE;
   boolean scrollbar_needed = (num_setup_info < max_setup_info);
+  int mx_scrollbar = screen_gadget[SCREEN_CTRL_ID_SCROLL_VERTICAL]->x;
+  int mx_right_border = (scrollbar_needed ? mx_scrollbar : SX + SXSIZE);
   int font_draw_xoffset_old = -1;
-  int xoffset = (scrollbar_needed ? -1 : 0);
+  int xoffset = (scrollbar_needed ? 0 : 1);
   int menu_screen_value_xpos = MENU_SCREEN_VALUE_XPOS + xoffset;
-  int menu_screen_max_xpos = MENU_SCREEN_MAX_XPOS + xoffset;
   int xpos = menu_screen_value_xpos;
   int ypos = MENU_SCREEN_START_YPOS + screen_pos;
   int startx = mSX + xpos * 32;
@@ -7752,7 +8428,6 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw)
   int font_nr_default = getSetupValueFont(type, value);
   int font_width_default = getFontWidth(font_nr_default);
   int font_nr = font_nr_default;
-  int i;
 
   if (value_string == NULL)
     return;
@@ -7773,10 +8448,6 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw)
     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;
-  }
   else if (type & TYPE_PLAYER)
   {
     int displayed_player_nr = *(int *)value + 1;
@@ -7787,28 +8458,9 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw)
   startx = mSX + xpos * 32;
   starty = mSY + ypos * 32;
 
-  // special check if right-side setup values moved left due to scrollbar
-  if (scrollbar_needed && xpos > MENU_SCREEN_START_XPOS)
-  {
-    int max_menu_text_length = 26;     // maximum text length for classic menu
-    int font_xoffset = getFontDrawOffsetX(font_nr);
-    int text_startx = mSX + MENU_SCREEN_START_XPOS * 32;
-    int text_font_nr = getMenuTextFont(FONT_MENU_2);
-    int text_font_xoffset = getFontDrawOffsetX(text_font_nr);
-    int text_width = max_menu_text_length * getFontWidth(text_font_nr);
-
-    if (startx + font_xoffset < text_startx + text_width + text_font_xoffset)
-    {
-      // when using narrow font, left-shifting text "auto" not needed
-      if (type & TYPE_YES_NO_AUTO)
-       xpos += 1;
-
-      xpos += 1;
-      startx = mSX + xpos * 32;
-
-      font_nr = getSetupValueFontNarrow(type, font_nr);
-    }
-  }
+  // always use narrow font for setup values on right screen side
+  if (xpos > MENU_SCREEN_START_XPOS)
+    font_nr = getSetupValueFontNarrow(type, font_nr);
 
   // downward compatibility correction for Juergen Bonhagen's menu settings
   if (setup_mode != SETUP_MODE_INPUT)
@@ -7848,9 +8500,7 @@ static void drawSetupValue(int screen_pos, int setup_info_pos_raw)
     }
   }
 
-  for (i = 0; i <= menu_screen_max_xpos - xpos; i++)
-    DrawText(startx + i * font_width_default, starty, " ", font_nr_default);
-
+  DrawBackground(startx, starty, mx_right_border - startx, getFontHeight(font_nr));
   DrawText(startx, starty, value_string, font_nr);
 
   if (type & TYPE_PLAYER)
@@ -7886,10 +8536,19 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx)
   {
     *(int *)si->value =
       (dx == -1 ?
-       (*(int *)si->value == AUTO ? TRUE :
-       *(int *)si->value == TRUE ? FALSE : AUTO) :
-       (*(int *)si->value == TRUE ? AUTO :
-       *(int *)si->value == AUTO ? FALSE : TRUE));
+       (*(int *)si->value == STATE_AUTO ? STATE_TRUE :
+       *(int *)si->value == STATE_TRUE ? STATE_FALSE : STATE_AUTO) :
+       (*(int *)si->value == STATE_TRUE ? STATE_AUTO :
+       *(int *)si->value == STATE_AUTO ? STATE_FALSE : STATE_TRUE));
+  }
+  else if (si->type & TYPE_YES_NO_ASK)
+  {
+    *(int *)si->value =
+      (dx == -1 ?
+       (*(int *)si->value == STATE_ASK  ? STATE_TRUE :
+       *(int *)si->value == STATE_TRUE ? STATE_FALSE : STATE_ASK) :
+       (*(int *)si->value == STATE_TRUE ? STATE_ASK :
+       *(int *)si->value == STATE_ASK  ? STATE_FALSE : STATE_TRUE));
   }
   else if (si->type & TYPE_KEY)
   {
@@ -7921,6 +8580,10 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx)
   if (si->value == &setup.fullscreen)
     ToggleFullscreenIfNeeded();
 
+  // audio sample rate may have changed at this point
+  if (si->value == &setup.audio_sample_rate_44100)
+    ToggleAudioSampleRateIfNeeded();
+
   // network mode may have changed at this point
   if (si->value == &setup.network_mode)
     ToggleNetworkModeIfNeeded();
@@ -8071,6 +8734,11 @@ static void DrawSetupScreen_Generic(void)
     setup_info = setup_info_shortcuts_5;
     title_string = STR_SETUP_SHORTCUTS;
   }
+  else if (setup_mode == SETUP_MODE_SHORTCUTS_6)
+  {
+    setup_info = setup_info_shortcuts_6;
+    title_string = STR_SETUP_SHORTCUTS;
+  }
 
   // use modified setup info without setup entries marked as hidden
   setup_info = getSetupInfoFinal(setup_info);
@@ -8474,7 +9142,7 @@ static boolean CustomizeKeyboardMain(int player_nr)
       {
         case EVENT_KEYPRESS:
          {
-           Key key = GetEventKey((KeyEvent *)&event, FALSE);
+           Key key = GetEventKey((KeyEvent *)&event);
 
            // press 'Escape' to abort and keep the old key bindings
            if (key == KSYM_Escape)
@@ -9125,7 +9793,7 @@ static boolean ConfigureVirtualButtonsMain(void)
 
         case EVENT_KEYPRESS:
          {
-           Key key = GetEventKey((KeyEvent *)&event, FALSE);
+           Key key = GetEventKey((KeyEvent *)&event);
 
            action = (key == KSYM_Escape ?      ACTION_ESCAPE :
                      key == KSYM_BackSpace ||
@@ -9357,6 +10025,16 @@ void DrawSetupScreen(void)
     DrawChooseTree(&scroll_delay_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE)
     DrawChooseTree(&snapshot_mode_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GAME_ENGINE_TYPE)
+    DrawChooseTree(&game_engine_type_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64)
+    DrawChooseTree(&bd_palette_c64_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64DTV)
+    DrawChooseTree(&bd_palette_c64dtv_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_ATARI)
+    DrawChooseTree(&bd_palette_atari_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_BD_COLOR_TYPE)
+    DrawChooseTree(&bd_color_type_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE)
     DrawChooseTree(&window_size_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE)
@@ -9441,6 +10119,16 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
     HandleChooseTree(mx, my, dx, dy, button, &scroll_delay_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_SNAPSHOT_MODE)
     HandleChooseTree(mx, my, dx, dy, button, &snapshot_mode_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_GAME_ENGINE_TYPE)
+    HandleChooseTree(mx, my, dx, dy, button, &game_engine_type_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64)
+    HandleChooseTree(mx, my, dx, dy, button, &bd_palette_c64_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_C64DTV)
+    HandleChooseTree(mx, my, dx, dy, button, &bd_palette_c64dtv_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_BD_PALETTE_ATARI)
+    HandleChooseTree(mx, my, dx, dy, button, &bd_palette_atari_current);
+  else if (setup_mode == SETUP_MODE_CHOOSE_BD_COLOR_TYPE)
+    HandleChooseTree(mx, my, dx, dy, button, &bd_color_type_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_WINDOW_SIZE)
     HandleChooseTree(mx, my, dx, dy, button, &window_size_current);
   else if (setup_mode == SETUP_MODE_CHOOSE_SCALING_TYPE)
@@ -9483,15 +10171,8 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button)
 
 void HandleGameActions(void)
 {
-  if (setup.ask_on_game_over)
-    CheckGameOver();
-
-  if (game.restart_game_message != NULL)
-  {
-    RequestRestartGame(game.restart_game_message);
-
+  if (CheckRestartGame())
     return;
-  }
 
   if (game_status != GAME_MODE_PLAYING)
     return;
@@ -9507,7 +10188,7 @@ void HandleGameActions(void)
 
 static struct
 {
-  int gfx_unpressed, gfx_pressed;
+  int gfx_unpressed, gfx_pressed, gfx_active;
   struct MenuPosInfo *pos;
   boolean *check_value;
   int gadget_id;
@@ -9518,7 +10199,7 @@ static struct
 } menubutton_info[NUM_SCREEN_MENUBUTTONS] =
 {
   {
-    IMG_MENU_BUTTON_PREV_LEVEL, IMG_MENU_BUTTON_PREV_LEVEL_ACTIVE,
+    IMG_MENU_BUTTON_PREV_LEVEL, IMG_MENU_BUTTON_PREV_LEVEL_ACTIVE, -1,
     &menu.main.button.prev_level, NULL,
     SCREEN_CTRL_ID_PREV_LEVEL,
     SCREEN_MASK_MAIN,
@@ -9526,7 +10207,7 @@ static struct
     FALSE, "previous level"
   },
   {
-    IMG_MENU_BUTTON_NEXT_LEVEL, IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE,
+    IMG_MENU_BUTTON_NEXT_LEVEL, IMG_MENU_BUTTON_NEXT_LEVEL_ACTIVE, -1,
     &menu.main.button.next_level, NULL,
     SCREEN_CTRL_ID_NEXT_LEVEL,
     SCREEN_MASK_MAIN,
@@ -9534,7 +10215,7 @@ static struct
     FALSE, "next level"
   },
   {
-    IMG_MENU_BUTTON_PREV_LEVEL2, IMG_MENU_BUTTON_PREV_LEVEL2_ACTIVE,
+    IMG_MENU_BUTTON_PREV_LEVEL2, IMG_MENU_BUTTON_PREV_LEVEL2_ACTIVE, -1,
     &menu.scores.button.prev_level, NULL,
     SCREEN_CTRL_ID_PREV_LEVEL2,
     SCREEN_MASK_SCORES | SCREEN_MASK_SCORES_INFO,
@@ -9542,7 +10223,7 @@ static struct
     FALSE, "previous level"
   },
   {
-    IMG_MENU_BUTTON_NEXT_LEVEL2, IMG_MENU_BUTTON_NEXT_LEVEL2_ACTIVE,
+    IMG_MENU_BUTTON_NEXT_LEVEL2, IMG_MENU_BUTTON_NEXT_LEVEL2_ACTIVE, -1,
     &menu.scores.button.next_level, NULL,
     SCREEN_CTRL_ID_NEXT_LEVEL2,
     SCREEN_MASK_SCORES | SCREEN_MASK_SCORES_INFO,
@@ -9550,7 +10231,7 @@ static struct
     FALSE, "next level"
   },
   {
-    IMG_MENU_BUTTON_PREV_SCORE, IMG_MENU_BUTTON_PREV_SCORE_ACTIVE,
+    IMG_MENU_BUTTON_PREV_SCORE, IMG_MENU_BUTTON_PREV_SCORE_ACTIVE, -1,
     &menu.scores.button.prev_score, NULL,
     SCREEN_CTRL_ID_PREV_SCORE,
     SCREEN_MASK_SCORES_INFO,
@@ -9558,7 +10239,7 @@ static struct
     FALSE, "previous score"
   },
   {
-    IMG_MENU_BUTTON_NEXT_SCORE, IMG_MENU_BUTTON_NEXT_SCORE_ACTIVE,
+    IMG_MENU_BUTTON_NEXT_SCORE, IMG_MENU_BUTTON_NEXT_SCORE_ACTIVE, -1,
     &menu.scores.button.next_score, NULL,
     SCREEN_CTRL_ID_NEXT_SCORE,
     SCREEN_MASK_SCORES_INFO,
@@ -9566,7 +10247,7 @@ static struct
     FALSE, "next score"
   },
   {
-    IMG_MENU_BUTTON_PLAY_TAPE, IMG_MENU_BUTTON_PLAY_TAPE,
+    IMG_MENU_BUTTON_PLAY_TAPE, IMG_MENU_BUTTON_PLAY_TAPE, -1,
     &menu.scores.button.play_tape, NULL,
     SCREEN_CTRL_ID_PLAY_TAPE,
     SCREEN_MASK_SCORES_INFO,
@@ -9574,7 +10255,7 @@ static struct
     FALSE, "play tape"
   },
   {
-    IMG_MENU_BUTTON_FIRST_LEVEL, IMG_MENU_BUTTON_FIRST_LEVEL_ACTIVE,
+    IMG_MENU_BUTTON_FIRST_LEVEL, IMG_MENU_BUTTON_FIRST_LEVEL_ACTIVE, -1,
     &menu.main.button.first_level, NULL,
     SCREEN_CTRL_ID_FIRST_LEVEL,
     SCREEN_MASK_MAIN,
@@ -9582,7 +10263,7 @@ static struct
     FALSE, "first level"
   },
   {
-    IMG_MENU_BUTTON_LAST_LEVEL, IMG_MENU_BUTTON_LAST_LEVEL_ACTIVE,
+    IMG_MENU_BUTTON_LAST_LEVEL, IMG_MENU_BUTTON_LAST_LEVEL_ACTIVE, -1,
     &menu.main.button.last_level, NULL,
     SCREEN_CTRL_ID_LAST_LEVEL,
     SCREEN_MASK_MAIN,
@@ -9590,7 +10271,7 @@ static struct
     FALSE, "last level"
   },
   {
-    IMG_MENU_BUTTON_LEVEL_NUMBER, IMG_MENU_BUTTON_LEVEL_NUMBER_ACTIVE,
+    IMG_MENU_BUTTON_LEVEL_NUMBER, IMG_MENU_BUTTON_LEVEL_NUMBER_ACTIVE, -1,
     &menu.main.button.level_number, NULL,
     SCREEN_CTRL_ID_LEVEL_NUMBER,
     SCREEN_MASK_MAIN,
@@ -9598,7 +10279,7 @@ static struct
     FALSE, "level number"
   },
   {
-    IMG_MENU_BUTTON_LEFT, IMG_MENU_BUTTON_LEFT_ACTIVE,
+    IMG_MENU_BUTTON_LEFT, IMG_MENU_BUTTON_LEFT_ACTIVE, -1,
     &menu.setup.button.prev_player, NULL,
     SCREEN_CTRL_ID_PREV_PLAYER,
     SCREEN_MASK_INPUT,
@@ -9606,7 +10287,7 @@ static struct
     FALSE, "previous player"
   },
   {
-    IMG_MENU_BUTTON_RIGHT, IMG_MENU_BUTTON_RIGHT_ACTIVE,
+    IMG_MENU_BUTTON_RIGHT, IMG_MENU_BUTTON_RIGHT_ACTIVE, -1,
     &menu.setup.button.next_player, NULL,
     SCREEN_CTRL_ID_NEXT_PLAYER,
     SCREEN_MASK_INPUT,
@@ -9614,7 +10295,7 @@ static struct
     FALSE, "next player"
   },
   {
-    IMG_MENU_BUTTON_INSERT_SOLUTION, IMG_MENU_BUTTON_INSERT_SOLUTION_ACTIVE,
+    IMG_MENU_BUTTON_INSERT_SOLUTION, IMG_MENU_BUTTON_INSERT_SOLUTION_ACTIVE, -1,
     &menu.main.button.insert_solution, NULL,
     SCREEN_CTRL_ID_INSERT_SOLUTION,
     SCREEN_MASK_MAIN_HAS_SOLUTION,
@@ -9622,7 +10303,7 @@ static struct
     FALSE, "insert solution tape"
   },
   {
-    IMG_MENU_BUTTON_PLAY_SOLUTION, IMG_MENU_BUTTON_PLAY_SOLUTION_ACTIVE,
+    IMG_MENU_BUTTON_PLAY_SOLUTION, IMG_MENU_BUTTON_PLAY_SOLUTION_ACTIVE, -1,
     &menu.main.button.play_solution, NULL,
     SCREEN_CTRL_ID_PLAY_SOLUTION,
     SCREEN_MASK_MAIN_HAS_SOLUTION,
@@ -9630,15 +10311,24 @@ static struct
     FALSE, "play solution tape"
   },
   {
-    IMG_MENU_BUTTON_SWITCH_ECS_AGA, IMG_MENU_BUTTON_SWITCH_ECS_AGA_ACTIVE,
+    IMG_MENU_BUTTON_LEVELSET_INFO, IMG_MENU_BUTTON_LEVELSET_INFO_PRESSED,
+    IMG_MENU_BUTTON_LEVELSET_INFO_ACTIVE,
+    &menu.main.button.levelset_info, NULL,
+    SCREEN_CTRL_ID_LEVELSET_INFO,
+    SCREEN_MASK_MAIN_HAS_SET_INFO,
+    GD_EVENT_RELEASED,
+    FALSE, "show level set info"
+  },
+  {
+    IMG_MENU_BUTTON_SWITCH_ECS_AGA, IMG_MENU_BUTTON_SWITCH_ECS_AGA_ACTIVE, -1,
     &menu.main.button.switch_ecs_aga, &setup.prefer_aga_graphics,
     SCREEN_CTRL_ID_SWITCH_ECS_AGA,
     SCREEN_MASK_MAIN,
     GD_EVENT_RELEASED | GD_EVENT_OFF_BORDERS,
-    FALSE, "switch ECS/AGA chipset"
+    FALSE, "switch old/new graphics"
   },
   {
-    IMG_MENU_BUTTON_TOUCH_BACK, IMG_MENU_BUTTON_TOUCH_BACK,
+    IMG_MENU_BUTTON_TOUCH_BACK, IMG_MENU_BUTTON_TOUCH_BACK, -1,
     &menu.setup.button.touch_back, NULL,
     SCREEN_CTRL_ID_TOUCH_PREV_PAGE,
     SCREEN_MASK_TOUCH,
@@ -9646,7 +10336,7 @@ static struct
     TRUE, "previous page"
   },
   {
-    IMG_MENU_BUTTON_TOUCH_NEXT, IMG_MENU_BUTTON_TOUCH_NEXT,
+    IMG_MENU_BUTTON_TOUCH_NEXT, IMG_MENU_BUTTON_TOUCH_NEXT, -1,
     &menu.setup.button.touch_next, NULL,
     SCREEN_CTRL_ID_TOUCH_NEXT_PAGE,
     SCREEN_MASK_TOUCH,
@@ -9654,7 +10344,7 @@ static struct
     TRUE, "next page"
   },
   {
-    IMG_MENU_BUTTON_TOUCH_BACK2, IMG_MENU_BUTTON_TOUCH_BACK2,
+    IMG_MENU_BUTTON_TOUCH_BACK2, IMG_MENU_BUTTON_TOUCH_BACK2, -1,
     &menu.setup.button.touch_back2, NULL,
     SCREEN_CTRL_ID_TOUCH_PREV_PAGE2,
     SCREEN_MASK_TOUCH2,
@@ -9662,7 +10352,7 @@ static struct
     TRUE, "previous page"
   },
   {
-    IMG_MENU_BUTTON_TOUCH_NEXT2, IMG_MENU_BUTTON_TOUCH_NEXT2,
+    IMG_MENU_BUTTON_TOUCH_NEXT2, IMG_MENU_BUTTON_TOUCH_NEXT2, -1,
     &menu.setup.button.touch_next2, NULL,
     SCREEN_CTRL_ID_TOUCH_NEXT_PAGE2,
     SCREEN_MASK_TOUCH2,
@@ -9748,8 +10438,11 @@ static void CreateScreenMenubuttons(void)
     boolean is_score_button = (screen_mask & SCREEN_MASK_SCORES_INFO);
     boolean has_gfx_pressed = (menubutton_info[i].gfx_pressed ==
                                menubutton_info[i].gfx_unpressed);
+    boolean has_gfx_active = (menubutton_info[i].gfx_active != -1);
     Bitmap *gd_bitmap_unpressed, *gd_bitmap_pressed;
+    Bitmap *gd_bitmap_unpressed_alt, *gd_bitmap_pressed_alt;
     int gfx_unpressed, gfx_pressed;
+    int gfx_unpressed_alt, gfx_pressed_alt;
     int x, y, width, height;
     int gd_x1, gd_x2, gd_y1, gd_y2;
     int gd_x1a, gd_x2a, gd_y1a, gd_y2a;
@@ -9771,16 +10464,33 @@ static void CreateScreenMenubuttons(void)
 
     gfx_unpressed = menubutton_info[i].gfx_unpressed;
     gfx_pressed   = menubutton_info[i].gfx_pressed;
+    gfx_unpressed_alt = gfx_unpressed;
+    gfx_pressed_alt   = gfx_pressed;
+
+    if (has_gfx_active)
+    {
+      gfx_unpressed_alt = menubutton_info[i].gfx_active;
+
+      type = GD_TYPE_CHECK_BUTTON_2;
+
+      if (menubutton_info[i].check_value != NULL)
+       checked = *menubutton_info[i].check_value;
+    }
+
     gd_bitmap_unpressed = graphic_info[gfx_unpressed].bitmap;
     gd_bitmap_pressed   = graphic_info[gfx_pressed].bitmap;
+    gd_bitmap_unpressed_alt = graphic_info[gfx_unpressed_alt].bitmap;
+    gd_bitmap_pressed_alt   = graphic_info[gfx_pressed_alt].bitmap;
+
     gd_x1 = graphic_info[gfx_unpressed].src_x;
     gd_y1 = graphic_info[gfx_unpressed].src_y;
     gd_x2 = graphic_info[gfx_pressed].src_x;
     gd_y2 = graphic_info[gfx_pressed].src_y;
-    gd_x1a = gd_x1;
-    gd_y1a = gd_y1;
-    gd_x2a = gd_x2;
-    gd_y2a = gd_y2;
+
+    gd_x1a = graphic_info[gfx_unpressed_alt].src_x;
+    gd_y1a = graphic_info[gfx_unpressed_alt].src_y;
+    gd_x2a = graphic_info[gfx_pressed_alt].src_x;
+    gd_y2a = graphic_info[gfx_pressed_alt].src_y;
 
     if (has_gfx_pressed)
     {
@@ -9796,7 +10506,9 @@ static void CreateScreenMenubuttons(void)
       gd_y2a += graphic_info[gfx_pressed].active_yoffset;
 
       type = GD_TYPE_CHECK_BUTTON;
-      checked = *menubutton_info[i].check_value;
+
+      if (menubutton_info[i].check_value != NULL)
+       checked = *menubutton_info[i].check_value;
     }
 
     if (is_score_button)
@@ -9821,6 +10533,27 @@ static void CreateScreenMenubuttons(void)
             id == SCREEN_CTRL_ID_NEXT_LEVEL2 ? mSY + MENU_TITLE1_YPOS : 0);
     }
 
+    if (id == SCREEN_CTRL_ID_LEVELSET_INFO)
+    {
+      if (pos->x == -1 && pos->y == -1)
+      {
+       // use "SX" here to place button (ignore draw offsets)
+       x = SX + SXSIZE - 2 * TILESIZE;
+       y = SY + SYSIZE - 2 * TILESIZE;
+
+       // special compatibility handling for "BD2K3" graphics set
+       if (strPrefix(leveldir_current->identifier, "BD2K3"))
+         x = SX + TILESIZE + MINI_TILESIZE;
+
+       // special compatibility handling for "jue0" graphics set
+       if (strPrefix(artwork.gfx_current_identifier, "jue0"))
+       {
+         x = SX + SXSIZE - 4 * TILESIZE;
+         y = SY + SYSIZE - 3 * TILESIZE;
+       }
+      }
+    }
+
     gi = CreateGadget(GDI_CUSTOM_ID, id,
                      GDI_CUSTOM_TYPE_ID, i,
                      GDI_IMAGE_ID, gfx_unpressed,
@@ -9834,8 +10567,8 @@ static void CreateScreenMenubuttons(void)
                      GDI_CHECKED, checked,
                      GDI_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1, gd_y1,
                      GDI_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2, gd_y2,
-                      GDI_ALT_DESIGN_UNPRESSED, gd_bitmap_unpressed, gd_x1a, gd_y1a,
-                      GDI_ALT_DESIGN_PRESSED, gd_bitmap_pressed, gd_x2a, gd_y2a,
+                      GDI_ALT_DESIGN_UNPRESSED, gd_bitmap_unpressed_alt, gd_x1a, gd_y1a,
+                      GDI_ALT_DESIGN_PRESSED, gd_bitmap_pressed_alt, gd_x2a, gd_y2a,
                      GDI_DIRECT_DRAW, FALSE,
                      GDI_OVERLAY_TOUCH_BUTTON, is_touch_button,
                      GDI_EVENT_MASK, event_mask,
@@ -10121,7 +10854,7 @@ static void MapScreenGadgets(int num_entries)
     MapGadget(screen_gadget[scrollbar_info[i].gadget_id]);
 }
 
-static void UnmapScreenGadgets()
+static void UnmapScreenGadgets(void)
 {
   int i;
 
@@ -10237,6 +10970,10 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
       PlaySolutionTape();
       break;
 
+    case SCREEN_CTRL_ID_LEVELSET_INFO:
+      DrawInfoScreen_FromMainMenu(INFO_MODE_LEVELSET);
+      break;
+
     case SCREEN_CTRL_ID_SWITCH_ECS_AGA:
       setup.prefer_aga_graphics = !setup.prefer_aga_graphics;
       DrawMainMenu();
@@ -10251,47 +10988,47 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
 
     case SCREEN_CTRL_ID_SCROLL_UP:
       if (game_status == GAME_MODE_NAMES)
-       HandleChoosePlayerName(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
+       HandleChoosePlayerName(0, 0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_LEVELS)
-       HandleChooseLevelSet(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);
+       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);
+       HandleSetupScreen(0, 0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_INFO)
-       HandleInfoScreen(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
+       HandleInfoScreen(0, 0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_SCORES)
-       HandleHallOfFame(0,0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
+       HandleHallOfFame(0, 0, 0, -1 * SCROLL_LINE, MB_MENU_MARK);
       break;
 
     case SCREEN_CTRL_ID_SCROLL_DOWN:
       if (game_status == GAME_MODE_NAMES)
-       HandleChoosePlayerName(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
+       HandleChoosePlayerName(0, 0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_LEVELS)
-       HandleChooseLevelSet(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);
+       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);
+       HandleSetupScreen(0, 0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_INFO)
-       HandleInfoScreen(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
+       HandleInfoScreen(0, 0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
       else if (game_status == GAME_MODE_SCORES)
-       HandleHallOfFame(0,0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
+       HandleHallOfFame(0, 0, 0, +1 * SCROLL_LINE, MB_MENU_MARK);
       break;
 
     case SCREEN_CTRL_ID_SCROLL_VERTICAL:
       if (game_status == GAME_MODE_NAMES)
-       HandleChoosePlayerName(0,0,999,gi->event.item_position,MB_MENU_INITIALIZE);
+       HandleChoosePlayerName(0, 0, 999, gi->event.item_position, MB_MENU_INITIALIZE);
       else if (game_status == GAME_MODE_LEVELS)
-       HandleChooseLevelSet(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);
+       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);
+       HandleSetupScreen(0, 0, 999, gi->event.item_position, MB_MENU_INITIALIZE);
       else if (game_status == GAME_MODE_INFO)
-       HandleInfoScreen(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
+       HandleInfoScreen(0, 0, 999, gi->event.item_position, MB_MENU_INITIALIZE);
       else if (game_status == GAME_MODE_SCORES)
-       HandleHallOfFame(0,0, 999,gi->event.item_position,MB_MENU_INITIALIZE);
+       HandleHallOfFame(0, 0, 999, gi->event.item_position, MB_MENU_INITIALIZE);
       break;
 
     case SCREEN_CTRL_ID_NETWORK_SERVER:
@@ -10326,7 +11063,7 @@ static void HandleScreenGadgets(struct GadgetInfo *gi)
 
 void HandleScreenGadgetKeys(Key key)
 {
-  if (key == setup.shortcut.tape_play)
+  if (key == setup.shortcut.tape_play || key == KSYM_Return)
     HandleScreenGadgets(screen_gadget[SCREEN_CTRL_ID_PLAY_TAPE]);
 }
 
@@ -10482,6 +11219,9 @@ static boolean OfferUploadTapes(void)
               "Upload all your tapes to the high score server now?", REQ_ASK))
     return FALSE;
 
+  // when uploading tapes, make sure that high score server is enabled
+  runtime.use_api_server = setup.use_api_server = TRUE;
+
   int num_tapes_uploaded = UploadTapes();
   char message[100];