cleanup of unnecessarily convoluted function call
[rocksndiamonds.git] / src / screens.c
index 2c312d4ce7c2b57a8be88ea044b3e163f8431112..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"
+#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_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)
+#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_YSTART                MENU_SCREEN_INFO_SPACE_TOP
-#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_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 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)
+                               (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_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)
+#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
@@ -281,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);
@@ -329,6 +348,9 @@ 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 *);
 
@@ -357,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;
 
@@ -400,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))
@@ -686,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)
 
@@ -1116,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)
@@ -1139,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);
   }
 
@@ -1576,8 +1691,9 @@ static void DrawInfoScreen_Headline(int screen_nr, int 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 - strlen(text_format) - strlen("%s");
+    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);
@@ -1592,14 +1708,34 @@ static void DrawInfoScreen_Headline(int screen_nr, int num_screens,
 
 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;
 
@@ -1626,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);
@@ -1777,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);
 
@@ -1802,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);
@@ -2069,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)
   {
@@ -2120,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();
@@ -2465,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      |
@@ -2481,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)
@@ -2839,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;
     }
@@ -2994,11 +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_error = FONT_TEXT_2;
   int font_foot  = MENU_INFO_FONT_FOOT;
-  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART;
+  int ystart  = mSY - SY + MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
   int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM;
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO);
@@ -3021,9 +3276,12 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init)
   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;
+  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;
@@ -3057,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;
@@ -3080,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, ystart + (i - start) * ystep,
-                              TILEX, TILEY);
-    DrawFixedGraphicAnimationExt(drawto, xstart, ystart + (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++;
   }
@@ -3142,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_YSTART + 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);
@@ -3167,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);
 
-  DrawTextBuffer(xstart, ystart + ypos * ystep, text, font_nr,
-                max_chars_per_line, -1, max_lines_per_text, 0, -1,
-                TRUE, FALSE, FALSE);
+  EnableDrawingText();
+
+  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();
 }
 
@@ -3191,6 +3472,9 @@ static void DrawInfoScreen_Elements(void)
 {
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_ELEMENTS);
 
+  UnmapAllGadgets();
+  FadeInfoSoundsAndMusic();
+
   FadeOut(REDRAW_FIELD);
 
   LoadHelpAnimInfo();
@@ -3198,6 +3482,8 @@ static void DrawInfoScreen_Elements(void)
 
   HandleInfoScreen_Elements(0, 0, MB_MENU_INITIALIZE);
 
+  PlayInfoSoundsAndMusic();
+
   FadeIn(REDRAW_FIELD);
 }
 
@@ -3253,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();
@@ -3281,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();
   }
 }
 
@@ -3289,6 +3575,8 @@ static void DrawInfoScreen_Music(void)
 {
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_MUSIC);
 
+  UnmapAllGadgets();
+
   FadeOut(REDRAW_FIELD);
 
   ClearField();
@@ -3463,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)
@@ -3485,7 +3818,7 @@ static void DrawInfoScreen_Version(void)
   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;
+  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;
@@ -3498,6 +3831,9 @@ static void DrawInfoScreen_Version(void)
 
   SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_VERSION);
 
+  UnmapAllGadgets();
+  FadeInfoSoundsAndMusic();
+
   FadeOut(REDRAW_FIELD);
 
   ClearField();
@@ -3635,6 +3971,8 @@ static void DrawInfoScreen_Version(void)
 
   DrawTextSCentered(ybottom, font_foot, TEXT_NEXT_MENU);
 
+  PlayInfoSoundsAndMusic();
+
   FadeIn(REDRAW_FIELD);
 }
 
@@ -3677,14 +4015,37 @@ static char *getInfoScreenTitle_Generic(void)
          "");
 }
 
-static int getInfoScreenBackground_Generic(void)
+static int getInfoScreenBackgroundImage_Generic(void)
 {
-  return (info_mode == INFO_MODE_CREDITS  ? IMG_BACKGROUND_INFO_CREDITS  :
+  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) :
@@ -3715,11 +4076,13 @@ static void DrawInfoScreen_GenericScreen(int screen_nr, int num_screens,
     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;
 
-    DrawTextFile(mSX + padx, mSY + MENU_SCREEN_INFO_YSTART,
+    DrawTextFile(xstart, ystart,
                 filename, font_text, chars, -1, lines, line_spacing, -1,
                 autowrap, centered, parse_comments);
   }
@@ -3733,7 +4096,7 @@ static void DrawInfoScreen_GenericScreen(int screen_nr, int num_screens,
 
     // if y position set to "-1", use static default value
     if (tmi->y == -1)
-      tmi->y = MENU_SCREEN_INFO_YSTART;
+      tmi->y = MENU_SCREEN_INFO_YSTART + getHeadlineSpacing();
 
     // if width set to "-1", automatically determine by playfield width
     if (tmi->width == -1)
@@ -3768,14 +4131,17 @@ static void DrawInfoScreen_GenericScreen(int screen_nr, int num_screens,
 
 static void DrawInfoScreen_Generic(void)
 {
-  SetMainBackgroundImageIfDefined(getInfoScreenBackground_Generic());
+  SetMainBackgroundImageIfDefined(getInfoScreenBackgroundImage_Generic());
 
-  FadeMenuSoundsAndMusic();
+  UnmapAllGadgets();
+  FadeInfoSoundsAndMusic();
 
   FadeOut(REDRAW_FIELD);
 
   HandleInfoScreen_Generic(0, 0, MB_MENU_INITIALIZE);
 
+  PlayInfoSoundsAndMusic();
+
   FadeIn(REDRAW_FIELD);
 }
 
@@ -3864,7 +4230,7 @@ void HandleInfoScreen_Generic(int dx, int dy, int button)
 
     if (screen_nr < 0 || screen_nr >= num_screens)
     {
-      FadeMenuSoundsAndMusic();
+      FadeInfoSoundsAndMusic();
 
       info_mode = INFO_MODE_MAIN;
       DrawInfoScreen();
@@ -3882,7 +4248,7 @@ void HandleInfoScreen_Generic(int dx, int dy, int button)
   }
   else
   {
-    PlayMenuSoundIfLoop();
+    PlayInfoSoundIfLoop();
   }
 }
 
@@ -3904,11 +4270,6 @@ static void DrawInfoScreen(void)
     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)
@@ -4449,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++)
@@ -4580,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 = TEXT_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_YSTART;
-  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;
@@ -4650,9 +4986,6 @@ 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)
   {
@@ -4665,31 +4998,10 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button,
 
       DrawHallOfFame_setScoreEntries();
 
-      if (score_entries != NULL)
-      {
-       ti = setHallOfFameActiveEntry(ti_ptr);
-
-       if (button != MB_MENU_INITIALIZE)
-         drawChooseTreeScreen(ti);
-      }
-    }
-
-    if (score_entries == NULL)
-    {
-      if (button == MB_MENU_INITIALIZE)
-      {
-       drawChooseTreeScreen_Scores_NotAvailable();
-      }
-      else if (button_screen_clicked)
-      {
-       PlaySound(SND_MENU_ITEM_SELECTING);
-
-       SetGameStatus(GAME_MODE_MAIN);
-
-       DrawMainMenu();
-      }
+      ti = setHallOfFameActiveEntry(ti_ptr);
 
-      return;
+      if (button != MB_MENU_INITIALIZE)
+       drawChooseTreeScreen(ti);
     }
   }
 
@@ -4747,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 ||
@@ -4865,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;
@@ -4935,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 ||
@@ -5012,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 ||
@@ -5045,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)
          {
@@ -5289,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)
@@ -5381,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)
@@ -5428,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;
@@ -5451,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;
@@ -5463,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,
@@ -5667,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;
@@ -5842,7 +6175,7 @@ static void execSetupGame_setScrollDelays(void)
 
     // set current scroll delay value to configured scroll delay value
     scroll_delay_current =
-      getTreeInfoFromIdentifier(scroll_delays,i_to_a(setup.scroll_delay_value));
+      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)
@@ -5978,40 +6311,331 @@ static void execSetupChooseSnapshotMode(void)
   DrawSetupScreen();
 }
 
-static void execSetupEngines(void)
-{
-  setup_mode = SETUP_MODE_ENGINES;
-
-  DrawSetupScreen();
-}
-
-static void execSetupEditor(void)
-{
-  setup_mode = SETUP_MODE_EDITOR;
-
-  DrawSetupScreen();
-}
-
-static void execSetupGraphics_setWindowSizes(boolean update_list)
+static void execSetupEngines_setGameEngineType(void)
 {
-  if (window_sizes != NULL && update_list)
-  {
-    freeTreeInfo(window_sizes);
-
-    window_sizes = NULL;
-  }
-
-  if (window_sizes == NULL)
+  if (game_engine_types == NULL)
   {
-    boolean current_window_size_found = FALSE;
     int i;
 
-    for (i = 0; window_sizes_list[i].value != -1; 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 = window_sizes_list[i].value;
-      char *text = window_sizes_list[i].text;
+      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 palette text instead of identifier
+  bd_palette_c64_text = bd_palette_c64_current->name;
+}
+
+static void execSetupEngines_setPalettesC64DTV(void)
+{
+  if (bd_palettes_c64dtv == NULL)
+  {
+    int 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 = bd_palettes_c64dtv_list[i].value;
+      char *text = bd_palettes_c64dtv_list[i].text;
+
+      ti->node_top = &bd_palettes_c64dtv;
+      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_C64DTV);
+
+      pushTreeInfo(&bd_palettes_c64dtv, ti);
+    }
+
+    // sort palette values to start with lowest palette value
+    sortTreeInfo(&bd_palettes_c64dtv);
+
+    // 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 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 palette to first available value
+    if (bd_palette_c64dtv_current == NULL)
+      bd_palette_c64dtv_current = bd_palettes_c64dtv;
+  }
+
+  setup.bd_palette_c64dtv = atoi(bd_palette_c64dtv_current->identifier);
+
+  // needed for displaying palette text instead of identifier
+  bd_palette_c64dtv_text = bd_palette_c64dtv_current->name;
+}
+
+static void execSetupEngines_setPalettesAtari(void)
+{
+  if (bd_palettes_atari == NULL)
+  {
+    int i;
+
+    for (i = 0; bd_palettes_atari_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = bd_palettes_atari_list[i].value;
+      char *text = bd_palettes_atari_list[i].text;
+
+      ti->node_top = &bd_palettes_atari;
+      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_ATARI);
+
+      pushTreeInfo(&bd_palettes_atari, ti);
+    }
+
+    // sort palette values to start with lowest palette value
+    sortTreeInfo(&bd_palettes_atari);
+
+    // 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 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 palette to first available value
+    if (bd_palette_atari_current == NULL)
+      bd_palette_atari_current = bd_palettes_atari;
+  }
+
+  setup.bd_palette_atari = atoi(bd_palette_atari_current->identifier);
+
+  // needed for displaying palette text instead of identifier
+  bd_palette_atari_text = bd_palette_atari_current->name;
+}
+
+static void execSetupEngines_setColorType(void)
+{
+  if (bd_color_types == NULL)
+  {
+    int i;
+
+    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;
+
+      ti->node_top = &bd_color_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_BD_COLOR_TYPE);
+
+      pushTreeInfo(&bd_color_types, ti);
+    }
+
+    // sort color type values to start with lowest color type value
+    sortTreeInfo(&bd_color_types);
+
+    // 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));
+
+    // 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 execSetupEngines(void)
+{
+  setup_mode = SETUP_MODE_ENGINES;
+
+  execSetupEngines_setGameEngineType();
+  execSetupEngines_setPalettesC64();
+  execSetupEngines_setPalettesC64DTV();
+  execSetupEngines_setPalettesAtari();
+  execSetupEngines_setColorType();
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseGameEngineType(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_GAME_ENGINE_TYPE;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChoosePaletteC64(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_BD_PALETTE_C64;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChoosePaletteC64DTV(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_BD_PALETTE_C64DTV;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChoosePaletteAtari(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_BD_PALETTE_ATARI;
+
+  DrawSetupScreen();
+}
+
+static void execSetupChooseColorType(void)
+{
+  setup_mode = SETUP_MODE_CHOOSE_BD_COLOR_TYPE;
+
+  DrawSetupScreen();
+}
+
+static void execSetupEditor(void)
+{
+  setup_mode = SETUP_MODE_EDITOR;
+
+  DrawSetupScreen();
+}
+
+static void execSetupGraphics_setWindowSizes(boolean update_list)
+{
+  if (window_sizes != NULL && update_list)
+  {
+    freeTreeInfo(window_sizes);
+
+    window_sizes = NULL;
+  }
+
+  if (window_sizes == NULL)
+  {
+    boolean current_window_size_found = FALSE;
+    int i;
+
+    for (i = 0; window_sizes_list[i].value != -1; i++)
+    {
+      TreeInfo *ti = newTreeInfo_setDefaults(TREE_TYPE_UNDEFINED);
+      char identifier[32], name[32];
+      int value = window_sizes_list[i].value;
+      char *text = window_sizes_list[i].text;
 
       ti->node_top = &window_sizes;
       ti->sort_priority = value;
@@ -6402,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)
@@ -6470,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)
@@ -6538,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)
@@ -7005,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);
@@ -7159,103 +7790,119 @@ static struct
   void *related_value;
 } hide_related_entry_list[] =
 {
-  { &setup.network_server_hostname,    execGadgetNetworkServer         },
-  { &setup.network_server_hostname,    &network_server_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.scores_in_highscore_list,   execSetupChooseScoresType       },
-  { &setup.scores_in_highscore_list,   &scores_type_text               },
+  { &setup.scroll_delay_value,                 execSetupChooseScrollDelay      },
+  { &setup.scroll_delay_value,                 &scroll_delay_text              },
 
-  { &setup.game_frame_delay,           execSetupChooseGameSpeed        },
-  { &setup.game_frame_delay,           &game_speed_text                },
+  { &setup.engine_snapshot_mode,               execSetupChooseSnapshotMode     },
+  { &setup.engine_snapshot_mode,               &snapshot_mode_text             },
 
-  { &setup.scroll_delay_value,         execSetupChooseScrollDelay      },
-  { &setup.scroll_delay_value,         &scroll_delay_text              },
+  { &setup.default_game_engine_type,           execSetupChooseGameEngineType   },
+  { &setup.default_game_engine_type,           &game_engine_type_text          },
 
-  { &setup.engine_snapshot_mode,       execSetupChooseSnapshotMode     },
-  { &setup.engine_snapshot_mode,       &snapshot_mode_text             },
+  { &setup.bd_palette_c64,                     execSetupChoosePaletteC64       },
+  { &setup.bd_palette_c64,                     &bd_palette_c64_text            },
 
-  { &setup.window_scaling_percent,     execSetupChooseWindowSize       },
-  { &setup.window_scaling_percent,     &window_size_text               },
+  { &setup.bd_palette_c64dtv,                  execSetupChoosePaletteC64DTV    },
+  { &setup.bd_palette_c64dtv,                  &bd_palette_c64dtv_text         },
 
-  { &setup.window_scaling_quality,     execSetupChooseScalingType      },
-  { &setup.window_scaling_quality,     &scaling_type_text              },
+  { &setup.bd_palette_atari,                   execSetupChoosePaletteAtari     },
+  { &setup.bd_palette_atari,                   &bd_palette_atari_text          },
 
-  { &setup.screen_rendering_mode,      execSetupChooseRenderingMode    },
-  { &setup.screen_rendering_mode,      &rendering_mode_text            },
+  { &setup.bd_default_color_type,              execSetupChooseColorType        },
+  { &setup.bd_default_color_type,              &bd_color_type_text             },
 
-  { &setup.vsync_mode,                 execSetupChooseVsyncMode        },
-  { &setup.vsync_mode,                 &vsync_mode_text                },
+  { &setup.window_scaling_percent,             execSetupChooseWindowSize       },
+  { &setup.window_scaling_percent,             &window_size_text               },
 
-  { &setup.graphics_set,               execSetupChooseGraphics         },
-  { &setup.graphics_set,               &graphics_set_name              },
+  { &setup.window_scaling_quality,             execSetupChooseScalingType      },
+  { &setup.window_scaling_quality,             &scaling_type_text              },
 
-  { &setup.sounds_set,                 execSetupChooseSounds           },
-  { &setup.sounds_set,                 &sounds_set_name                },
+  { &setup.screen_rendering_mode,              execSetupChooseRenderingMode    },
+  { &setup.screen_rendering_mode,              &rendering_mode_text            },
 
-  { &setup.music_set,                  execSetupChooseMusic            },
-  { &setup.music_set,                  &music_set_name                 },
+  { &setup.vsync_mode,                         execSetupChooseVsyncMode        },
+  { &setup.vsync_mode,                         &vsync_mode_text                },
 
-  { &setup.volume_simple,              execSetupChooseVolumeSimple     },
-  { &setup.volume_simple,              &volume_simple_text             },
+  { &setup.graphics_set,                       execSetupChooseGraphics         },
+  { &setup.graphics_set,                       &graphics_set_name              },
 
-  { &setup.volume_loops,               execSetupChooseVolumeLoops      },
-  { &setup.volume_loops,               &volume_loops_text              },
+  { &setup.sounds_set,                         execSetupChooseSounds           },
+  { &setup.sounds_set,                         &sounds_set_name                },
 
-  { &setup.volume_music,               execSetupChooseVolumeMusic      },
-  { &setup.volume_music,               &volume_music_text              },
+  { &setup.music_set,                          execSetupChooseMusic            },
+  { &setup.music_set,                          &music_set_name                 },
 
-  { &setup.touch.control_type,         execSetupChooseTouchControls    },
-  { &setup.touch.control_type,         &touch_controls_text            },
+  { &setup.volume_simple,                      execSetupChooseVolumeSimple     },
+  { &setup.volume_simple,                      &volume_simple_text             },
 
-  { &setup.touch.move_distance,                execSetupChooseMoveDistance     },
-  { &setup.touch.move_distance,                &move_distance_text             },
+  { &setup.volume_loops,                       execSetupChooseVolumeLoops      },
+  { &setup.volume_loops,                       &volume_loops_text              },
 
-  { &setup.touch.drop_distance,                execSetupChooseDropDistance     },
-  { &setup.touch.drop_distance,                &drop_distance_text             },
+  { &setup.volume_music,                       execSetupChooseVolumeMusic      },
+  { &setup.volume_music,                       &volume_music_text              },
 
-  { &setup.touch.transparency,         execSetupChooseTransparency     },
-  { &setup.touch.transparency,         &transparency_text              },
+  { &setup.touch.control_type,                 execSetupChooseTouchControls    },
+  { &setup.touch.control_type,                 &touch_controls_text            },
 
-  { &setup.touch.grid_xsize[0],                execSetupChooseGridXSize_0      },
-  { &setup.touch.grid_xsize[0],                &grid_size_text[0][0]           },
+  { &setup.touch.move_distance,                        execSetupChooseMoveDistance     },
+  { &setup.touch.move_distance,                        &move_distance_text             },
 
-  { &setup.touch.grid_ysize[0],                execSetupChooseGridYSize_0      },
-  { &setup.touch.grid_ysize[0],                &grid_size_text[0][1]           },
+  { &setup.touch.drop_distance,                        execSetupChooseDropDistance     },
+  { &setup.touch.drop_distance,                        &drop_distance_text             },
 
-  { &setup.touch.grid_xsize[1],                execSetupChooseGridXSize_1      },
-  { &setup.touch.grid_xsize[1],                &grid_size_text[1][0]           },
+  { &setup.touch.transparency,                 execSetupChooseTransparency     },
+  { &setup.touch.transparency,                 &transparency_text              },
 
-  { &setup.touch.grid_ysize[1],                execSetupChooseGridYSize_1      },
-  { &setup.touch.grid_ysize[1],                &grid_size_text[1][1]           },
+  { &setup.touch.grid_xsize[0],                        execSetupChooseGridXSize_0      },
+  { &setup.touch.grid_xsize[0],                        &grid_size_text[0][0]           },
 
-  { &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.touch.grid_ysize[0],                        execSetupChooseGridYSize_0      },
+  { &setup.touch.grid_ysize[0],                        &grid_size_text[0][1]           },
 
-  { &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.touch.grid_xsize[1],                        execSetupChooseGridXSize_1      },
+  { &setup.touch.grid_xsize[1],                        &grid_size_text[1][0]           },
 
-  { &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.touch.grid_ysize[1],                        execSetupChooseGridYSize_1      },
+  { &setup.touch.grid_ysize[1],                        &grid_size_text[1][1]           },
 
-  { NULL,                              NULL                            }
+  { &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                    },
+
+  { NULL,                                      NULL                            }
 };
 
 void setHideRelatedSetupEntries(void)
@@ -7269,255 +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 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:" },
+  { 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[] =
@@ -7528,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)
@@ -7697,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
@@ -7719,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;
@@ -7733,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;
@@ -7754,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;
@@ -7768,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)
@@ -7829,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)
@@ -7867,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)
   {
@@ -7902,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();
@@ -8052,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);
@@ -9338,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)
@@ -9422,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)
@@ -9464,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;
@@ -9488,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;
@@ -9499,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,
@@ -9507,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,
@@ -9515,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,
@@ -9523,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,
@@ -9531,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,
@@ -9539,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,
@@ -9547,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,
@@ -9555,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,
@@ -9563,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,
@@ -9571,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,
@@ -9579,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,
@@ -9587,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,
@@ -9595,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,
@@ -9603,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,
@@ -9611,7 +10311,8 @@ static struct
     FALSE, "play solution tape"
   },
   {
-    IMG_MENU_BUTTON_LEVELSET_INFO, IMG_MENU_BUTTON_LEVELSET_INFO_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,
@@ -9619,15 +10320,15 @@ static struct
     FALSE, "show level set info"
   },
   {
-    IMG_MENU_BUTTON_SWITCH_ECS_AGA, IMG_MENU_BUTTON_SWITCH_ECS_AGA_ACTIVE,
+    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,
@@ -9635,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,
@@ -9643,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,
@@ -9651,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,
@@ -9737,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;
@@ -9760,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)
     {
@@ -9785,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)
@@ -9844,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,
@@ -10131,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;
 
@@ -10265,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:
@@ -10340,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]);
 }