+ { TYPE_ENTER_LIST, execSetupChooseVsyncMode, "Vertical Sync (VSync):" },
+ { TYPE_STRING, &vsync_mode_text, "" },
+ { 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 }
+};
+
+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 }
+};
+
+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 }
+};
+
+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 }
+};
+
+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" },
+
+ { 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 }
+};
+
+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 }
+};
+
+static struct TokenInfo *setup_info_touch_virtual_buttons[] =
+{
+ setup_info_touch_virtual_buttons_0,
+ setup_info_touch_virtual_buttons_1
+};
+
+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 }
+};
+
+static struct TokenInfo setup_info_shortcuts[] =
+{
+ { TYPE_ENTER_MENU, execSetupShortcuts1, "Various Keys" },
+ { TYPE_ENTER_MENU, execSetupShortcuts2, "Player Focus" },
+ { TYPE_ENTER_MENU, execSetupShortcuts3, "Tape Buttons" },
+ { TYPE_ENTER_MENU, execSetupShortcuts4, "Sound & Music" },
+ { TYPE_ENTER_MENU, execSetupShortcuts5, "TAS Snap Keys" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execSetupMain, "Back" },
+
+ { 0, NULL, NULL }
+};
+
+static struct TokenInfo setup_info_shortcuts_1[] =
+{
+ { TYPE_KEYTEXT, NULL, "Quick Save Game to Tape:", },
+ { TYPE_KEY, &setup.shortcut.save_game, "" },
+ { TYPE_KEYTEXT, NULL, "Quick Load Game from Tape:", },
+ { TYPE_KEY, &setup.shortcut.load_game, "" },
+ { 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 }
+};
+
+static struct TokenInfo setup_info_shortcuts_3[] =
+{
+ { TYPE_KEYTEXT, NULL, "Eject Tape:", },
+ { TYPE_KEY, &setup.shortcut.tape_eject, "" },
+ { TYPE_KEYTEXT, NULL, "Warp / Single Step:", },
+ { TYPE_KEY, &setup.shortcut.tape_extra, "" },
+ { TYPE_KEYTEXT, NULL, "Stop Tape:", },
+ { TYPE_KEY, &setup.shortcut.tape_stop, "" },
+ { TYPE_KEYTEXT, NULL, "Pause / Unpause Tape:",},
+ { TYPE_KEY, &setup.shortcut.tape_pause, "" },
+ { TYPE_KEYTEXT, NULL, "Record Tape:", },
+ { TYPE_KEY, &setup.shortcut.tape_record, "" },
+ { TYPE_KEYTEXT, NULL, "Play Tape:", },
+ { TYPE_KEY, &setup.shortcut.tape_play, "" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" },
+
+ { 0, NULL, NULL }
+};
+
+static struct TokenInfo setup_info_shortcuts_4[] =
+{
+ { TYPE_KEYTEXT, NULL, "Toggle Sound Effects (Normal):", },
+ { TYPE_KEY, &setup.shortcut.sound_simple, "" },
+ { TYPE_KEYTEXT, NULL, "Toggle Sound Effects (Looping):", },
+ { TYPE_KEY, &setup.shortcut.sound_loops, "" },
+ { TYPE_KEYTEXT, NULL, "Toggle Music:", },
+ { TYPE_KEY, &setup.shortcut.sound_music, "" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" },
+
+ { 0, NULL, NULL }
+};
+
+static struct TokenInfo setup_info_shortcuts_5[] =
+{
+ { TYPE_KEYTEXT, NULL, "Snap Left:", },
+ { TYPE_KEY, &setup.shortcut.snap_left, "" },
+ { TYPE_KEYTEXT, NULL, "Snap Right:", },
+ { TYPE_KEY, &setup.shortcut.snap_right, "" },
+ { TYPE_KEYTEXT, NULL, "Snap Up:", },
+ { TYPE_KEY, &setup.shortcut.snap_up, "" },
+ { TYPE_KEYTEXT, NULL, "Snap Down:", },
+ { TYPE_KEY, &setup.shortcut.snap_down, "" },
+ { TYPE_EMPTY, NULL, "" },
+ { TYPE_LEAVE_MENU, execSetupShortcuts, "Back" },
+
+ { 0, NULL, NULL }
+};
+
+static Key getSetupKey(void)
+{
+ Key key = KSYM_UNDEFINED;
+ boolean got_key_event = FALSE;
+
+ while (!got_key_event)
+ {
+ Event event;
+
+ if (NextValidEvent(&event))
+ {
+ switch (event.type)
+ {
+ case EVENT_KEYPRESS:
+ {
+ key = GetEventKey((KeyEvent *)&event, TRUE);
+
+ // press 'Escape' or 'Enter' to keep the existing key binding
+ if (key == KSYM_Escape || key == KSYM_Return)
+ key = KSYM_UNDEFINED; // keep old value
+
+ got_key_event = TRUE;
+ }
+ break;
+
+ case EVENT_KEYRELEASE:
+ key_joystick_mapping = 0;
+ break;
+
+ default:
+ HandleOtherEvents(&event);
+ break;
+ }
+ }
+
+ BackToFront();
+ }
+
+ return key;
+}
+
+static int getSetupValueFont(int type, void *value)
+{
+ if (type & TYPE_GHOSTED)
+ return FONT_OPTION_OFF;
+ else if (type & TYPE_KEY)
+ return (type & TYPE_QUERY ? FONT_INPUT_1_ACTIVE : FONT_VALUE_1);
+ else if (type & TYPE_STRING)
+ return FONT_VALUE_2;
+ else if (type & TYPE_ECS_AGA)
+ return FONT_VALUE_1;
+ else if (type & TYPE_BOOLEAN_STYLE)
+ return (*(boolean *)value ? FONT_OPTION_ON : FONT_OPTION_OFF);
+ else if (type & TYPE_YES_NO_AUTO)
+ return (*(int *)value == AUTO ? FONT_OPTION_ON :
+ *(int *)value == FALSE ? FONT_OPTION_OFF : FONT_OPTION_ON);
+ else if (type & TYPE_PLAYER)
+ return FONT_VALUE_1;
+ else
+ return FONT_VALUE_1;
+}
+
+static int getSetupValueFontNarrow(int type, int font_nr)
+{
+ return (font_nr == FONT_VALUE_1 ? FONT_VALUE_NARROW :
+ font_nr == FONT_OPTION_ON ? FONT_OPTION_ON_NARROW :
+ font_nr == FONT_OPTION_OFF ? FONT_OPTION_OFF_NARROW :
+ font_nr);
+}
+
+static void drawSetupValue(int screen_pos, int setup_info_pos_raw)
+{
+ int si_pos = (setup_info_pos_raw < 0 ? screen_pos : 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 font_draw_xoffset_old = -1;
+ int xoffset = (scrollbar_needed ? -1 : 0);
+ 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;
+ int starty = mSY + ypos * 32;
+ int type = si->type;
+ void *value = si->value;
+ char *value_string = getSetupValue(type, value);
+ 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;
+
+ if (type & TYPE_KEY)
+ {
+ xpos = MENU_SCREEN_START_XPOS;
+
+ if (type & TYPE_QUERY)
+ value_string = "<press key>";
+ }
+ else if (type & TYPE_STRING)
+ {
+ int max_value_len = (SXSIZE - 2 * TILEX) / font_width_default;
+
+ xpos = MENU_SCREEN_START_XPOS;
+
+ 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;