+ title_string = STR_SETUP_SHORTCUTS;
+ }
+ else if (setup_mode == SETUP_MODE_SHORTCUTS_3)
+ {
+ setup_info = setup_info_shortcuts_3;
+ title_string = STR_SETUP_SHORTCUTS;
+ }
+ else if (setup_mode == SETUP_MODE_SHORTCUTS_4)
+ {
+ setup_info = setup_info_shortcuts_4;
+ title_string = STR_SETUP_SHORTCUTS;
+ }
+ else if (setup_mode == SETUP_MODE_SHORTCUTS_5)
+ {
+ setup_info = setup_info_shortcuts_5;
+ title_string = STR_SETUP_SHORTCUTS;
+ }
+
+ // use modified setup info without setup entries marked as hidden
+ setup_info = getSetupInfoFinal(setup_info);
+
+ DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, title_string);
+
+ // determine maximal number of setup entries that can be displayed on screen
+ num_setup_info = 0;
+ for (i = 0; setup_info[i].type != 0 && i < NUM_MENU_ENTRIES_ON_SCREEN; i++)
+ num_setup_info++;
+
+ // determine maximal number of setup entries available for this setup screen
+ max_setup_info = 0;
+ for (i = 0; setup_info[i].type != 0; i++)
+ max_setup_info++;
+
+ HandleSetupScreen_Generic(0, 0, 0, 0, MB_MENU_INITIALIZE);
+
+ MapScreenGadgets(max_setup_info);
+
+ if (redraw_all)
+ redraw_mask = fade_mask = REDRAW_ALL;
+
+ DrawMaskedBorder(fade_mask);
+
+ FadeIn(fade_mask);
+}
+
+void HandleSetupScreen_Generic(int mx, int my, int dx, int dy, int button)
+{
+ menu_info = setup_info;
+
+ HandleMenuScreen(mx, my, dx, dy, button,
+ setup_mode, num_setup_info, max_setup_info);
+}
+
+static void DrawSetupScreen_Input(void)
+{
+ int i;
+
+ FadeOut(REDRAW_FIELD);
+
+ ClearField();
+
+ setup_info = getSetupInfoFinal(setup_info_input);
+
+ DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, STR_SETUP_INPUT);
+
+ for (i = 0; setup_info[i].type != 0; i++)
+ {
+ if (setup_info[i].type & (TYPE_ENTER_MENU|TYPE_ENTER_LIST))
+ initCursor(i, IMG_MENU_BUTTON_ENTER_MENU);
+ else if (setup_info[i].type & (TYPE_LEAVE_MENU|TYPE_LEAVE_LIST))
+ initCursor(i, IMG_MENU_BUTTON_LEAVE_MENU);
+ else if (setup_info[i].type & ~TYPE_SKIP_ENTRY)
+ initCursor(i, IMG_MENU_BUTTON);
+
+ DrawCursorAndText_Setup(i, -1, FALSE);
+ }
+
+ // create gadgets for setup input menu screen
+ FreeScreenGadgets();
+ CreateScreenGadgets();
+
+ // map gadgets for setup input menu screen
+ MapScreenMenuGadgets(SCREEN_MASK_INPUT);
+
+ HandleSetupScreen_Input(0, 0, 0, 0, MB_MENU_INITIALIZE);
+
+ FadeIn(REDRAW_FIELD);
+}
+
+static void setJoystickDeviceToNr(char *device_name, int device_nr)
+{
+ if (device_name == NULL)
+ return;
+
+ if (device_nr < 0 || device_nr >= MAX_PLAYERS)
+ device_nr = 0;
+
+ if (strlen(device_name) > 1)
+ {
+ char c1 = device_name[strlen(device_name) - 1];
+ char c2 = device_name[strlen(device_name) - 2];
+
+ if (c1 >= '0' && c1 <= '9' && !(c2 >= '0' && c2 <= '9'))
+ device_name[strlen(device_name) - 1] = '0' + (char)(device_nr % 10);
+ }
+ else
+ strncpy(device_name, getDeviceNameFromJoystickNr(device_nr),
+ strlen(device_name));
+}
+
+static void drawPlayerSetupInputInfo(int player_nr, boolean active)
+{
+ int i;
+ static struct SetupKeyboardInfo custom_key;
+ static struct
+ {
+ Key *key;
+ char *text;
+ } custom[] =
+ {
+ { &custom_key.left, "Axis/Pad Left" },
+ { &custom_key.right, "Axis/Pad Right" },
+ { &custom_key.up, "Axis/Pad Up" },
+ { &custom_key.down, "Axis/Pad Down" },
+ { &custom_key.snap, "Button 1/A/X" },
+ { &custom_key.drop, "Button 2/B/Y" }
+ };
+ static char *joystick_name[MAX_PLAYERS] =
+ {
+ "Joystick1",
+ "Joystick2",
+ "Joystick3",
+ "Joystick4"
+ };
+ int font_nr_menu = (active ? FONT_MENU_1_ACTIVE : FONT_MENU_1);
+ int font_nr_info = FONT_MENU_1;
+ int font_nr_name = FONT_VALUE_OLD;
+ int font_nr_on = FONT_VALUE_1;
+ int font_nr_off = FONT_VALUE_OLD;
+ int pos = 4;
+
+ if (SCR_FIELDX < SCR_FIELDX_DEFAULT)
+ {
+ font_nr_info = FONT_MENU_2;
+ font_nr_on = FONT_VALUE_NARROW;
+ font_nr_off = FONT_VALUE_OLD_NARROW;
+ }
+
+ custom_key = setup.input[player_nr].key;
+
+ DrawText(mSX + 11 * 32, mSY + 2 * 32, int2str(player_nr + 1, 1),
+ FONT_INPUT_1_ACTIVE);
+
+ ClearRectangleOnBackground(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY,
+ TILEX, TILEY);
+ DrawFixedGraphicThruMaskExt(drawto, mSX + 8 * TILEX, mSY + 2 * TILEY,
+ PLAYER_NR_GFX(IMG_PLAYER_1, player_nr), 0);
+
+ if (setup.input[player_nr].use_joystick)
+ {
+ char *device_name = setup.input[player_nr].joy.device_name;
+ int joystick_nr = getJoystickNrFromDeviceName(device_name);
+ boolean joystick_active = CheckJoystickOpened(joystick_nr);
+ char *text = joystick_name[joystick_nr];
+ int font_nr = (joystick_active ? font_nr_on : font_nr_off);
+
+ DrawText(mSX + 8 * 32, mSY + 3 * 32, text, font_nr);
+ DrawText(mSX + 32, mSY + 4 * 32, "Configure", font_nr_menu);
+ }
+ else
+ {
+ DrawText(mSX + 8 * 32, mSY + 3 * 32, "Keyboard ", font_nr_on);
+ DrawText(mSX + 1 * 32, mSY + 4 * 32, "Customize", font_nr_menu);
+ }
+
+ if (SCR_FIELDY >= SCR_FIELDY_DEFAULT)
+ DrawText(mSX + 32, mSY + 5 * 32, "Actual Settings:", font_nr_info);
+ else
+ pos = 3;
+
+ drawCursorXY(1, pos + 0, IMG_MENU_BUTTON_LEFT);
+ drawCursorXY(1, pos + 1, IMG_MENU_BUTTON_RIGHT);
+ drawCursorXY(1, pos + 2, IMG_MENU_BUTTON_UP);
+ drawCursorXY(1, pos + 3, IMG_MENU_BUTTON_DOWN);
+
+ DrawText(mSX + 2 * 32, mSY + (pos + 2) * 32, ":", font_nr_name);
+ DrawText(mSX + 2 * 32, mSY + (pos + 3) * 32, ":", font_nr_name);
+ DrawText(mSX + 2 * 32, mSY + (pos + 4) * 32, ":", font_nr_name);
+ DrawText(mSX + 2 * 32, mSY + (pos + 5) * 32, ":", font_nr_name);
+ DrawText(mSX + 1 * 32, mSY + (pos + 6) * 32, "Snap Field:", font_nr_name);
+ DrawText(mSX + 1 * 32, mSY + (pos + 8) * 32, "Drop Element:", font_nr_name);
+
+ for (i = 0; i < 6; i++)
+ {
+ int ypos = (pos + 2) + i + (i > 3 ? i - 3 : 0);
+
+ DrawText(mSX + 3 * 32, mSY + ypos * 32,
+ " ", font_nr_on);
+ DrawText(mSX + 3 * 32, mSY + ypos * 32,
+ (setup.input[player_nr].use_joystick ?
+ custom[i].text :
+ getKeyNameFromKey(*custom[i].key)), font_nr_on);
+ }
+}
+
+static int input_player_nr = 0;
+
+static void HandleSetupScreen_Input_Player(int step, int direction)
+{
+ int old_player_nr = input_player_nr;
+ int new_player_nr;
+
+ new_player_nr = old_player_nr + step * direction;
+ if (new_player_nr < 0)
+ new_player_nr = 0;
+ if (new_player_nr > MAX_PLAYERS - 1)
+ new_player_nr = MAX_PLAYERS - 1;
+
+ if (new_player_nr != old_player_nr)
+ {
+ input_player_nr = new_player_nr;
+
+ drawPlayerSetupInputInfo(input_player_nr, FALSE);
+ }
+}
+
+void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button)
+{
+ static int choice = 0;
+ int x = 0;
+ int y = choice;
+ int pos_start = SETUPINPUT_SCREEN_POS_START;
+ int pos_empty1 = SETUPINPUT_SCREEN_POS_EMPTY1;
+ int pos_empty2 = SETUPINPUT_SCREEN_POS_EMPTY2;
+ int pos_end = SETUPINPUT_SCREEN_POS_END;
+
+ if (SCR_FIELDY < SCR_FIELDY_DEFAULT)
+ {
+ int i;
+
+ for (i = 0; setup_info_input[i].type != 0; i++)
+ {
+ // adjust menu structure according to skipped setup entries
+ if (setup_info_input[i].type == TYPE_SKIPPABLE)
+ {
+ pos_empty2--;
+ pos_end--;
+ }
+ }
+ }
+
+ if (button == MB_MENU_INITIALIZE)
+ {
+ // input setup menu may have changed size due to graphics configuration
+ if (choice >= pos_empty1)
+ choice = pos_end;
+
+ drawPlayerSetupInputInfo(input_player_nr, (choice == 2));
+
+ DrawCursorAndText_Setup(choice, -1, TRUE);
+
+ return;
+ }
+ else if (button == MB_MENU_LEAVE)
+ {
+ setup_mode = SETUP_MODE_MAIN;
+ DrawSetupScreen();
+ InitJoysticks();
+
+ return;
+ }
+
+ if (mx || my) // mouse input
+ {
+ x = (mx - mSX) / 32;
+ y = (my - mSY) / 32 - MENU_SCREEN_START_YPOS;
+ }
+ else if (dx || dy) // keyboard input
+ {
+ if (dx && choice == 0)
+ x = (dx < 0 ? 10 : 12);
+ else if ((dx && choice == 1) ||
+ (dx == -1 && choice == pos_end))
+ button = MB_MENU_CHOICE;
+ else if (dy)
+ y = choice + dy;
+
+ if (y >= pos_empty1 && y <= pos_empty2)
+ y = (dy > 0 ? pos_empty2 + 1 : pos_empty1 - 1);
+ }
+
+ if (y == 0 && dx != 0 && button)
+ {
+ HandleSetupScreen_Input_Player(1, dx < 0 ? -1 : +1);
+ }
+ else if (IN_VIS_FIELD(x, y) && // (does not use "IN_VIS_MENU()" yet)
+ y >= pos_start && y <= pos_end &&
+ !(y >= pos_empty1 && y <= pos_empty2))
+ {
+ if (button)
+ {
+ if (y != choice)
+ {
+ DrawCursorAndText_Setup(choice, -1, FALSE);
+ DrawCursorAndText_Setup(y, -1, TRUE);
+
+ drawPlayerSetupInputInfo(input_player_nr, (y == 2));
+
+ choice = y;
+ }
+ }
+ else
+ {
+ if (y == 1)
+ {
+ char *device_name = setup.input[input_player_nr].joy.device_name;
+
+ if (!setup.input[input_player_nr].use_joystick)
+ {
+ int new_device_nr = (dx >= 0 ? 0 : MAX_PLAYERS - 1);
+
+ setJoystickDeviceToNr(device_name, new_device_nr);
+ setup.input[input_player_nr].use_joystick = TRUE;
+ }
+ else
+ {
+ int device_nr = getJoystickNrFromDeviceName(device_name);
+ int new_device_nr = device_nr + (dx >= 0 ? +1 : -1);
+
+ if (new_device_nr < 0 || new_device_nr >= MAX_PLAYERS)
+ setup.input[input_player_nr].use_joystick = FALSE;
+ else
+ setJoystickDeviceToNr(device_name, new_device_nr);
+ }
+
+ drawPlayerSetupInputInfo(input_player_nr, FALSE);
+ }
+ else if (y == 2)
+ {
+ if (setup.input[input_player_nr].use_joystick)
+ ConfigureJoystick(input_player_nr);
+ else
+ CustomizeKeyboard(input_player_nr);
+ }
+ else if (y == pos_end)
+ {
+ InitJoysticks();
+
+ FadeSetLeaveMenu();
+
+ setup_mode = SETUP_MODE_MAIN;
+ DrawSetupScreen();
+ }
+ }