X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=3dd571fe857cb912493d9dc0105a0a559103d2fe;hb=6cf6b75d5b9c84476a121cfd2ff11a0351ecba47;hp=cfe42f04ce1965c310b2e62bb06d7b472ebd5348;hpb=e357ec2b5e90659499a8f5bd23c5dce6d0769826;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index cfe42f04..3dd571fe 100644 --- a/src/screens.c +++ b/src/screens.c @@ -110,9 +110,9 @@ /* for input setup functions */ #define SETUPINPUT_SCREEN_POS_START 0 -#define SETUPINPUT_SCREEN_POS_END (SCR_FIELDY - 4) -#define SETUPINPUT_SCREEN_POS_EMPTY1 (SETUPINPUT_SCREEN_POS_START + 3) -#define SETUPINPUT_SCREEN_POS_EMPTY2 (SETUPINPUT_SCREEN_POS_END - 1) +#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 @@ -129,13 +129,16 @@ #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_XSTART 16 -#define MENU_SCREEN_INFO_YSTART1 100 +#define MENU_SCREEN_INFO_SPACE_LEFT (menu.left_spacing_info[info_mode]) +#define MENU_SCREEN_INFO_SPACE_RIGHT (menu.right_spacing_info[info_mode]) +#define MENU_SCREEN_INFO_SPACE_TOP (menu.top_spacing_info[info_mode]) +#define MENU_SCREEN_INFO_SPACE_BOTTOM (menu.bottom_spacing_info[info_mode]) +#define MENU_SCREEN_INFO_YSTART1 MENU_SCREEN_INFO_SPACE_TOP #define MENU_SCREEN_INFO_YSTART2 (MENU_SCREEN_INFO_YSTART1 + \ getMenuTextStep(MENU_INFO_SPACE_HEAD, \ MENU_INFO_FONT_TITLE)) #define MENU_SCREEN_INFO_YSTEP (TILEY + 4) -#define MENU_SCREEN_INFO_YBOTTOM (SYSIZE - 20) +#define MENU_SCREEN_INFO_YBOTTOM (SYSIZE - MENU_SCREEN_INFO_SPACE_BOTTOM) #define MENU_SCREEN_INFO_YSIZE (MENU_SCREEN_INFO_YBOTTOM - \ MENU_SCREEN_INFO_YSTART2 - \ TILEY / 2) @@ -204,6 +207,7 @@ static void HandleSetupScreen_Generic(int, int, int, int, int); static void HandleSetupScreen_Input(int, int, int, int, int); static void CustomizeKeyboard(int); static void ConfigureJoystick(int); +static void ConfigureVirtualButtons(); static void execSetupGame(void); static void execSetupGraphics(void); static void execSetupSound(void); @@ -1330,9 +1334,8 @@ static void drawChooseTreeCursor(int ypos, boolean active) void DrawHeadline() { - DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, getProgramTitleString()); - DrawTextSCentered(MENU_TITLE2_YPOS, FONT_TITLE_2, - setup.internal.program_copyright); + DrawTextSCentered(MENU_TITLE1_YPOS, FONT_TITLE_1, main_text_title_1); + DrawTextSCentered(MENU_TITLE2_YPOS, FONT_TITLE_2, main_text_title_2); } void DrawTitleScreenImage(int nr, boolean initial) @@ -2143,7 +2146,7 @@ static void DrawCursorAndText_Menu_Ext(struct TokenInfo *token_info, int ypos = MENU_SCREEN_START_YPOS + screen_pos; int font_nr = getMenuTextFont(ti->type); - if (token_info == setup_info_input) + if (setup_mode == SETUP_MODE_INPUT) font_nr = FONT_MENU_1; if (active) @@ -2601,9 +2604,9 @@ void DrawInfoScreen_NotAvailable(char *text_title, char *text_error) int font_foot = MENU_INFO_FONT_FOOT; int spacing_title = menu.headline1_spacing_info[info_mode]; int ystep_title = getMenuTextStep(spacing_title, font_title); - int ystart1 = mSY - SY + 100; + int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1; int ystart2 = ystart1 + ystep_title; - int ybottom = mSY - SY + SYSIZE - 20; + int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM; SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO); @@ -2627,7 +2630,7 @@ void DrawInfoScreen_HelpAnim(int start, int max_anims, boolean init) static int infoscreen_frame[MAX_INFO_ELEMENTS_ON_SCREEN]; int font_title = MENU_INFO_FONT_TITLE; int font_foot = MENU_INFO_FONT_FOOT; - int xstart = mSX + MENU_SCREEN_INFO_XSTART; + int xstart = mSX + MENU_SCREEN_INFO_SPACE_LEFT; int ystart1 = mSY - SY + MENU_SCREEN_INFO_YSTART1; int ystart2 = mSY + MENU_SCREEN_INFO_YSTART2; int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM; @@ -2757,11 +2760,12 @@ void DrawInfoScreen_HelpText(int element, int action, int direction, int ypos) int font_width = getFontWidth(font_nr); int font_height = getFontHeight(font_nr); int yoffset = (TILEX - 2 * font_height) / 2; - int xstart = mSX + MINI_TILEX + TILEX + MINI_TILEX; + int xstart = mSX + MENU_SCREEN_INFO_SPACE_LEFT + TILEX + MINI_TILEX; int ystart = mSY + MENU_SCREEN_INFO_YSTART2 + yoffset; int ystep = TILEY + 4; - int pad_x = xstart - SX; - int max_chars_per_line = (SXSIZE - pad_x - MINI_TILEX) / font_width; + int pad_left = xstart - SX; + int pad_right = MENU_SCREEN_INFO_SPACE_RIGHT; + int max_chars_per_line = (SXSIZE - pad_left - pad_right) / font_width; int max_lines_per_text = 2; char *text = NULL; @@ -2920,8 +2924,8 @@ void HandleInfoScreen_Music(int button) int spacing_head = menu.headline2_spacing_info[info_mode]; int ystep_title = getMenuTextStep(spacing_title, font_title); int ystep_head = getMenuTextStep(spacing_head, font_head); - int ystart = mSY - SY + 100; - int ybottom = mSY - SY + SYSIZE - 20; + int ystart = mSY - SY + MENU_SCREEN_INFO_YSTART1; + int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM; if (button == MB_MENU_INITIALIZE) { @@ -3082,8 +3086,8 @@ static void DrawInfoScreen_CreditsScreen(int screen_nr) 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 + 100; - int ybottom = mSY - SY + SYSIZE - 20; + int ystart = mSY - SY + MENU_SCREEN_INFO_YSTART1; + int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM; ClearField(); DrawHeadline(); @@ -3383,8 +3387,8 @@ void DrawInfoScreen_Program() 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 + 100; - int ybottom = mSY - SY + SYSIZE - 20; + int ystart = mSY - SY + MENU_SCREEN_INFO_YSTART1; + int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM; SetMainBackgroundImageIfDefined(IMG_BACKGROUND_INFO_PROGRAM); @@ -3469,8 +3473,8 @@ void DrawInfoScreen_Version() 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 + 100; - int ybottom = mSY - SY + SYSIZE - 20; + int ystart = mSY - SY + MENU_SCREEN_INFO_YSTART1; + int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM; int xstart1 = mSX - SX + 2 * xstep; int xstart2 = mSX - SX + 18 * xstep; int xstart3 = mSX - SX + 28 * xstep; @@ -3656,8 +3660,8 @@ void DrawInfoScreen_LevelSet() struct TitleMessageInfo *tmi = &readme; char *filename = getLevelSetInfoFilename(); char *title = "Level Set Information:"; - int ystart = mSY - SY + 100; - int ybottom = mSY - SY + SYSIZE - 20; + int ystart = mSY - SY + MENU_SCREEN_INFO_YSTART1; + int ybottom = mSY - SY + MENU_SCREEN_INFO_YBOTTOM; if (filename == NULL) { @@ -3689,7 +3693,7 @@ void DrawInfoScreen_LevelSet() /* if height set to "-1", automatically determine by playfield height */ if (tmi->height == -1) - tmi->height = SYSIZE - 20 - tmi->y - 10; + tmi->height = MENU_SCREEN_INFO_YBOTTOM - tmi->y - 10; /* if chars set to "-1", automatically determine by text and font width */ if (tmi->chars == -1) @@ -4971,7 +4975,6 @@ static void execSetupGraphics() #endif } -#if defined(TARGET_SDL2) && !defined(PLATFORM_ANDROID) static void execSetupChooseWindowSize() { setup_mode = SETUP_MODE_CHOOSE_WINDOW_SIZE; @@ -4992,7 +4995,6 @@ static void execSetupChooseRenderingMode() DrawSetupScreen(); } -#endif static void execSetupChooseVolumeSimple() { @@ -5256,6 +5258,13 @@ static void execSetupChooseDropDistance() DrawSetupScreen(); } +static void execSetupConfigureVirtualButtons() +{ + ConfigureVirtualButtons(); + + DrawSetupScreen(); +} + static void execSetupTouch() { if (touch_controls == NULL) @@ -5509,6 +5518,69 @@ static void execSaveAndExitSetup() execExitSetup(); } +static struct +{ + void *value; + void *related_value; +} hide_related_entry_list[] = +{ + { &setup.game_frame_delay, execSetupChooseGameSpeed }, + { &setup.game_frame_delay, &game_speed_text }, + + { &setup.scroll_delay_value, execSetupChooseScrollDelay }, + { &setup.scroll_delay_value, &scroll_delay_text }, + + { &setup.engine_snapshot_mode, execSetupChooseSnapshotMode }, + { &setup.engine_snapshot_mode, &snapshot_mode_text }, + + { &setup.window_scaling_percent, execSetupChooseWindowSize }, + { &setup.window_scaling_percent, &window_size_text }, + + { &setup.window_scaling_quality, execSetupChooseScalingType }, + { &setup.window_scaling_quality, &scaling_type_text }, + + { &setup.screen_rendering_mode, execSetupChooseRenderingMode }, + { &setup.screen_rendering_mode, &rendering_mode_text }, + + { &setup.graphics_set, execSetupChooseGraphics }, + { &setup.graphics_set, &graphics_set_name }, + + { &setup.sounds_set, execSetupChooseSounds }, + { &setup.sounds_set, &sounds_set_name }, + + { &setup.music_set, execSetupChooseMusic }, + { &setup.music_set, &music_set_name }, + + { &setup.volume_simple, execSetupChooseVolumeSimple }, + { &setup.volume_simple, &volume_simple_text }, + + { &setup.volume_loops, execSetupChooseVolumeLoops }, + { &setup.volume_loops, &volume_loops_text }, + + { &setup.volume_music, execSetupChooseVolumeMusic }, + { &setup.volume_music, &volume_music_text }, + + { &setup.touch.control_type, execSetupChooseTouchControls }, + { &setup.touch.control_type, &touch_controls_text }, + + { &setup.touch.move_distance, execSetupChooseMoveDistance }, + { &setup.touch.move_distance, &move_distance_text }, + + { &setup.touch.drop_distance, execSetupChooseDropDistance }, + { &setup.touch.drop_distance, &drop_distance_text }, + + { NULL, NULL } +}; + +void setHideRelatedSetupEntries() +{ + int i; + + for (i = 0; hide_related_entry_list[i].value != NULL; i++) + if (hideSetupEntry(hide_related_entry_list[i].value)) + setHideSetupEntry(hide_related_entry_list[i].related_value); +} + static struct TokenInfo setup_info_main[] = { { TYPE_ENTER_MENU, execSetupGame, STR_SETUP_GAME }, @@ -5654,6 +5726,7 @@ 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, "" }, @@ -5662,8 +5735,7 @@ static struct TokenInfo setup_info_input[] = { 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 } @@ -5679,6 +5751,18 @@ static struct TokenInfo setup_info_touch[] = { 0, NULL, NULL } }; +static struct TokenInfo setup_info_touch_virtual_buttons[] = +{ + { TYPE_ENTER_LIST, execSetupChooseTouchControls, "Touch Control Type:" }, + { TYPE_STRING, &touch_controls_text, "" }, + { 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_wipe_gestures[] = { { TYPE_ENTER_LIST, execSetupChooseTouchControls, "Touch Control Type:" }, @@ -6017,7 +6101,7 @@ static void changeSetupValue(int screen_pos, int setup_info_pos_raw, int dx) static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *setup_info_orig) { - static struct TokenInfo *setup_info_hide = NULL; + static struct TokenInfo *setup_info_final = NULL; int list_size = 0; int list_pos = 0; int i; @@ -6026,15 +6110,25 @@ static struct TokenInfo *getSetupInfoFinal(struct TokenInfo *setup_info_orig) while (setup_info_orig[list_size++].type != 0); /* free, allocate and clear memory for target list */ - checked_free(setup_info_hide); - setup_info_hide = checked_calloc(list_size * sizeof(struct TokenInfo)); + checked_free(setup_info_final); + setup_info_final = checked_calloc(list_size * sizeof(struct TokenInfo)); /* copy setup info list without setup entries marked as hidden */ for (i = 0; setup_info_orig[i].type != 0; i++) - if (!hideSetupEntry(setup_info_orig[i].value)) - setup_info_hide[list_pos++] = setup_info_orig[i]; + { + /* skip setup entries configured to be hidden */ + if (hideSetupEntry(setup_info_orig[i].value)) + continue; - return setup_info_hide; + /* skip skippable setup entries if screen is lower than usual */ + if (SCR_FIELDY < SCR_FIELDY_DEFAULT && + setup_info_orig[i].type == TYPE_SKIPPABLE) + continue; + + setup_info_final[list_pos++] = setup_info_orig[i]; + } + + return setup_info_final; } static void DrawSetupScreen_Generic() @@ -6102,7 +6196,9 @@ static void DrawSetupScreen_Generic() setup_info = setup_info_touch; title_string = STR_SETUP_TOUCH; - if (strEqual(setup.touch.control_type, TOUCH_CONTROL_WIPE_GESTURES)) + if (strEqual(setup.touch.control_type, TOUCH_CONTROL_VIRTUAL_BUTTONS)) + setup_info = setup_info_touch_virtual_buttons; + else if (strEqual(setup.touch.control_type, TOUCH_CONTROL_WIPE_GESTURES)) setup_info = setup_info_touch_wipe_gestures; } else if (setup_mode == SETUP_MODE_SHORTCUTS) @@ -6179,11 +6275,11 @@ void DrawSetupScreen_Input() ClearField(); - setup_info = setup_info_input; + 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 < MAX_MENU_ENTRIES_ON_SCREEN; i++) + 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); @@ -6252,7 +6348,19 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active) "Joystick3", "Joystick4" }; - int text_font_nr = (active ? FONT_MENU_1_ACTIVE : FONT_MENU_1); + 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; @@ -6270,41 +6378,44 @@ static void drawPlayerSetupInputInfo(int player_nr, boolean active) int joystick_nr = getJoystickNrFromDeviceName(device_name); boolean joystick_active = CheckJoystickOpened(joystick_nr); char *text = joystick_name[joystick_nr]; - int font_nr = (joystick_active ? FONT_VALUE_1 : FONT_VALUE_OLD); + 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", text_font_nr); + DrawText(mSX + 32, mSY + 4 * 32, "Configure", font_nr_menu); } else { - DrawText(mSX + 8 * 32, mSY + 3 * 32, "Keyboard ", FONT_VALUE_1); - DrawText(mSX + 1 * 32, mSY + 4 * 32, "Customize", text_font_nr); + DrawText(mSX + 8 * 32, mSY + 3 * 32, "Keyboard ", font_nr_on); + DrawText(mSX + 1 * 32, mSY + 4 * 32, "Customize", font_nr_menu); } - DrawText(mSX + 32, mSY + 5 * 32, "Actual Settings:", FONT_MENU_1); + if (SCR_FIELDY >= SCR_FIELDY_DEFAULT) + DrawText(mSX + 32, mSY + 5 * 32, "Actual Settings:", font_nr_info); + else + pos = 3; - drawCursorXY(1, 4, IMG_MENU_BUTTON_LEFT); - drawCursorXY(1, 5, IMG_MENU_BUTTON_RIGHT); - drawCursorXY(1, 6, IMG_MENU_BUTTON_UP); - drawCursorXY(1, 7, IMG_MENU_BUTTON_DOWN); + 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 + 6 * 32, ":", FONT_VALUE_OLD); - DrawText(mSX + 2 * 32, mSY + 7 * 32, ":", FONT_VALUE_OLD); - DrawText(mSX + 2 * 32, mSY + 8 * 32, ":", FONT_VALUE_OLD); - DrawText(mSX + 2 * 32, mSY + 9 * 32, ":", FONT_VALUE_OLD); - DrawText(mSX + 1 * 32, mSY + 10 * 32, "Snap Field:", FONT_VALUE_OLD); - DrawText(mSX + 1 * 32, mSY + 12 * 32, "Drop Element:", FONT_VALUE_OLD); + 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 = 6 + i + (i > 3 ? i-3 : 0); + int ypos = (pos + 2) + i + (i > 3 ? i - 3 : 0); DrawText(mSX + 3 * 32, mSY + ypos * 32, - " ", FONT_VALUE_1); + " ", font_nr_on); DrawText(mSX + 3 * 32, mSY + ypos * 32, (setup.input[player_nr].use_joystick ? custom[i].text : - getKeyNameFromKey(*custom[i].key)), FONT_VALUE_1); + getKeyNameFromKey(*custom[i].key)), font_nr_on); } } @@ -6339,8 +6450,27 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button) 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); @@ -6441,7 +6571,7 @@ void HandleSetupScreen_Input(int mx, int my, int dx, int dy, int button) } } -void CustomizeKeyboard(int player_nr) +static boolean CustomizeKeyboardMain(int player_nr) { int i; int step_nr; @@ -6460,6 +6590,15 @@ void CustomizeKeyboard(int player_nr) { &custom_key.snap, "Snap Field" }, { &custom_key.drop, "Drop Element" } }; + int font_nr_old = FONT_VALUE_OLD; + int font_nr_new = FONT_VALUE_1; + boolean success = FALSE; + + if (SCR_FIELDX < SCR_FIELDX_DEFAULT) + { + font_nr_old = FONT_VALUE_OLD_NARROW; + font_nr_new = FONT_VALUE_NARROW; + } /* read existing key bindings from player setup */ custom_key = setup.input[player_nr].key; @@ -6477,7 +6616,7 @@ void CustomizeKeyboard(int player_nr) DrawText(mSX, mSY + (2 + 2 * step_nr + 1) * 32, "Key:", FONT_INPUT_1_ACTIVE); DrawText(mSX + 4 * 32, mSY + (2 + 2 * step_nr + 1) * 32, - getKeyNameFromKey(*customize_step[step_nr].key), FONT_VALUE_OLD); + getKeyNameFromKey(*customize_step[step_nr].key), font_nr_old); FadeIn(REDRAW_FIELD); @@ -6493,18 +6632,15 @@ void CustomizeKeyboard(int player_nr) { Key key = GetEventKey((KeyEvent *)&event, FALSE); - if (key == KSYM_Escape || (key == KSYM_Return && step_nr == 6)) + /* press 'Escape' to abort and keep the old key bindings */ + if (key == KSYM_Escape) { - if (key == KSYM_Escape) - FadeSkipNextFadeIn(); + FadeSkipNextFadeIn(); finished = TRUE; - break; - } - /* all keys configured -- wait for "Escape" or "Return" key */ - if (step_nr == 6) break; + } /* press 'Enter' to keep the existing key binding */ if (key == KSYM_Return) @@ -6520,9 +6656,9 @@ void CustomizeKeyboard(int player_nr) /* got new key binding */ *customize_step[step_nr].key = key; DrawText(mSX + 4 * 32, mSY + (2 + 2 * step_nr + 1) * 32, - " ", FONT_VALUE_1); + " ", font_nr_new); DrawText(mSX + 4 * 32, mSY + (2 + 2 * step_nr + 1) * 32, - getKeyNameFromKey(key), FONT_VALUE_1); + getKeyNameFromKey(key), font_nr_new); step_nr++; /* un-highlight last query */ @@ -6531,11 +6667,12 @@ void CustomizeKeyboard(int player_nr) DrawText(mSX, mSY + (2 + 2 * (step_nr - 1) + 1) * 32, "Key:", FONT_MENU_1); - /* press 'Enter' to leave */ + /* all keys configured */ if (step_nr == 6) { - DrawText(mSX + 16, mSY + 15 * 32 + 16, - "Press Enter", FONT_TITLE_1); + finished = TRUE; + success = TRUE; + break; } @@ -6546,7 +6683,7 @@ void CustomizeKeyboard(int player_nr) "Key:", FONT_INPUT_1_ACTIVE); DrawText(mSX + 4 * 32, mSY + (2 + 2 * step_nr + 1) * 32, getKeyNameFromKey(*customize_step[step_nr].key), - FONT_VALUE_OLD); + font_nr_old); } break; @@ -6563,8 +6700,38 @@ void CustomizeKeyboard(int player_nr) BackToFront(); } - /* write new key bindings back to player setup */ - setup.input[player_nr].key = custom_key; + /* write new key bindings back to player setup, if successfully finished */ + if (success) + setup.input[player_nr].key = custom_key; + + return success; +} + +void CustomizeKeyboard(int player_nr) +{ + boolean success = CustomizeKeyboardMain(player_nr); + + if (success) + { + int font_nr = FONT_TITLE_1; + int font_height = getFontHeight(font_nr); + int ypos1 = SYSIZE / 2 - font_height * 2; + int ypos2 = SYSIZE / 2 - font_height * 1; + unsigned int wait_frame_delay = 0; + unsigned int wait_frame_delay_value = 2000; + + ResetDelayCounter(&wait_frame_delay); + + ClearField(); + + DrawTextSCentered(ypos1, font_nr, "Keyboard"); + DrawTextSCentered(ypos2, font_nr, "configured!"); + + while (!DelayReached(&wait_frame_delay, wait_frame_delay_value)) + BackToFront(); + + ClearEventQueue(); + } DrawSetupScreen_Input(); } @@ -6753,6 +6920,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) controller->width, controller->height, controller_x, controller_y); + SDL_SetSurfaceBlendMode(marker->surface_masked, SDL_BLENDMODE_BLEND); SDL_SetSurfaceAlphaMod(marker->surface_masked, alpha); BlitBitmapMasked(marker, drawto, 0, 0, @@ -6857,6 +7025,8 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) /* leave screen */ success = FALSE; done = TRUE; + + break; } /* undo this step */ @@ -6976,11 +7146,14 @@ void ConfigureJoystick(int player_nr) if (state != JOYSTICK_NOT_CONFIGURED) { boolean success = (state == JOYSTICK_CONFIGURED); - char *message = (success ? " IS CONFIGURED! " : " NOT AVAILABLE! "); + char message1[MAX_OUTPUT_LINESIZE + 1]; + char *message2 = (success ? "configured!" : "not available!"); char *device_name = setup.input[player_nr].joy.device_name; int nr = getJoystickNrFromDeviceName(device_name) + 1; - int xpos = mSX - SX; - int ypos = mSY - SY; + int font_nr = FONT_TITLE_1; + int font_height = getFontHeight(font_nr); + int ypos1 = SYSIZE / 2 - font_height * 2; + int ypos2 = SYSIZE / 2 - font_height * 1; unsigned int wait_frame_delay = 0; unsigned int wait_frame_delay_value = 2000; @@ -6988,8 +7161,10 @@ void ConfigureJoystick(int player_nr) ClearField(); - DrawTextF(xpos + 16, ypos + 6 * 32, FONT_TITLE_1, " JOYSTICK %d ", nr); - DrawTextF(xpos + 16, ypos + 7 * 32, FONT_TITLE_1, message); + sprintf(message1, "Joystick %d", nr); + + DrawTextSCentered(ypos1, font_nr, message1); + DrawTextSCentered(ypos2, font_nr, message2); while (!DelayReached(&wait_frame_delay, wait_frame_delay_value)) BackToFront(); @@ -7000,6 +7175,239 @@ void ConfigureJoystick(int player_nr) DrawSetupScreen_Input(); } +boolean ConfigureVirtualButtonsMain() +{ + static char *customize_step_text[] = + { + "Move Left", + "Move Right", + "Move Up", + "Move Down", + "Snap Field", + "Drop Element" + }; + char grid_button[] = + { + CHAR_GRID_BUTTON_LEFT, + CHAR_GRID_BUTTON_RIGHT, + CHAR_GRID_BUTTON_UP, + CHAR_GRID_BUTTON_DOWN, + CHAR_GRID_BUTTON_SNAP, + CHAR_GRID_BUTTON_DROP + }; + int font_nr = FONT_INPUT_1_ACTIVE; + int font_height = getFontHeight(font_nr); + int ypos1 = SYSIZE / 2 - font_height * 2; + int ypos2 = SYSIZE / 2 - font_height * 1; + boolean success = FALSE; + boolean finished = FALSE; + int step_nr = 0; + char grid_button_draw = CHAR_GRID_BUTTON_NONE; + char grid_button_old[MAX_GRID_XSIZE][MAX_GRID_YSIZE]; + char grid_button_tmp[MAX_GRID_XSIZE][MAX_GRID_YSIZE]; + boolean set_grid_button = FALSE; + int nr = GRID_ACTIVE_NR(); + int x, y; + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + grid_button_old[x][y] = grid_button_tmp[x][y] = overlay.grid_button[x][y]; + + overlay.grid_button_highlight = grid_button[step_nr]; + + FadeSetEnterMenu(); + FadeOut(REDRAW_FIELD); + + ClearField(); + + DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Virtual Buttons"); + DrawTextSCentered(ypos1, font_nr, "Select tiles to"); + DrawTextSCentered(ypos2, font_nr, customize_step_text[step_nr]); + + FadeIn(REDRAW_FIELD); + + SetOverlayShowGrid(TRUE); + + while (!finished) + { + Event event; + + while (NextValidEvent(&event)) + { + switch (event.type) + { + case EVENT_KEYPRESS: + { + Key key = GetEventKey((KeyEvent *)&event, FALSE); + + /* press 'Escape' to abort and keep the old key bindings */ + if (key == KSYM_Escape) + { + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + overlay.grid_button[x][y] = grid_button_old[x][y]; + + FadeSkipNextFadeIn(); + + finished = TRUE; + + break; + } + + /* press 'Enter' to keep the existing key binding */ + if (key == KSYM_Return || + key == KSYM_Menu || + key == KSYM_space) + { + step_nr++; + } + else if (key == KSYM_BackSpace || + key == KSYM_Back) + { + if (step_nr == 0) + { + FadeSkipNextFadeIn(); + + finished = TRUE; + + break; + } + + step_nr--; + } + else + { + break; + } + + /* all virtual buttons configured */ + if (step_nr == 6) + { + finished = TRUE; + success = TRUE; + + break; + } + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + grid_button_tmp[x][y] = overlay.grid_button[x][y]; + + overlay.grid_button_highlight = grid_button[step_nr]; + + /* query next virtual button */ + + ClearField(); + + DrawTextSCentered(mSY - SY + 16, FONT_TITLE_1, "Virtual Buttons"); + DrawTextSCentered(ypos1, font_nr, "Select tiles to"); + DrawTextSCentered(ypos2, font_nr, customize_step_text[step_nr]); + } + break; + + case EVENT_KEYRELEASE: + key_joystick_mapping = 0; + break; + + case EVENT_BUTTONPRESS: + case EVENT_BUTTONRELEASE: + { + ButtonEvent *button = (ButtonEvent *)&event; + + button->x += video.screen_xoffset; + button->y += video.screen_yoffset; + + x = button->x * overlay.grid_xsize / video.screen_width; + y = button->y * overlay.grid_ysize / video.screen_height; + + if (button->type == EVENT_BUTTONPRESS) + { + button_status = button->button; + + grid_button_draw = + (overlay.grid_button[x][y] != grid_button[step_nr] ? + grid_button[step_nr] : CHAR_GRID_BUTTON_NONE); + + set_grid_button = TRUE; + } + else + { + button_status = MB_RELEASED; + } + } + break; + + case EVENT_MOTIONNOTIFY: + { + MotionEvent *motion = (MotionEvent *)&event; + + motion->x += video.screen_xoffset; + motion->y += video.screen_yoffset; + + x = motion->x * overlay.grid_xsize / video.screen_width; + y = motion->y * overlay.grid_ysize / video.screen_height; + + set_grid_button = TRUE; + } + break; + + default: + HandleOtherEvents(&event); + break; + } + + if (set_grid_button) + { + overlay.grid_button[x][y] = + (grid_button_draw != CHAR_GRID_BUTTON_NONE ? grid_button_draw : + grid_button_tmp[x][y] == grid_button[step_nr] ? CHAR_GRID_BUTTON_NONE : + grid_button_tmp[x][y]); + + set_grid_button = FALSE; + } + } + + BackToFront(); + } + + for (x = 0; x < MAX_GRID_XSIZE; x++) + for (y = 0; y < MAX_GRID_YSIZE; y++) + overlay.grid_button_all[nr][x][y] = overlay.grid_button[x][y]; + + overlay.grid_button_highlight = CHAR_GRID_BUTTON_NONE; + + SetOverlayShowGrid(FALSE); + + return success; +} + +void ConfigureVirtualButtons() +{ + boolean success = ConfigureVirtualButtonsMain(); + + if (success) + { + int font_nr = FONT_TITLE_1; + int font_height = getFontHeight(font_nr); + int ypos1 = SYSIZE / 2 - font_height * 2; + int ypos2 = SYSIZE / 2 - font_height * 1; + unsigned int wait_frame_delay = 0; + unsigned int wait_frame_delay_value = 2000; + + ResetDelayCounter(&wait_frame_delay); + + ClearField(); + + DrawTextSCentered(ypos1, font_nr, "Virtual buttons"); + DrawTextSCentered(ypos2, font_nr, "configured!"); + + while (!DelayReached(&wait_frame_delay, wait_frame_delay_value)) + BackToFront(); + + ClearEventQueue(); + } +} + void DrawSetupScreen() { if (setup_mode == SETUP_MODE_INPUT) @@ -7092,6 +7500,9 @@ void HandleSetupScreen(int mx, int my, int dx, int dy, int button) void HandleGameActions() { + if (game.restart_game_message != NULL) + RequestRestartGame(game.restart_game_message); + if (game_status != GAME_MODE_PLAYING) return;