X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=b7ad82d4d4fcd2e8bbf7827b577d95001912a677;hb=9e5b242142cda73a8b1ae8ae52aa927999b5481d;hp=e2308b4d4e455a345f36f9442b7f92f88cb1bf8d;hpb=44307678912a3b7b5a3222b4929976b8e229546b;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index e2308b4d..b7ad82d4 100644 --- a/src/screens.c +++ b/src/screens.c @@ -1729,6 +1729,11 @@ void DrawMainMenu(void) if (leveldir_current != leveldir_last_valid) { + // level setup config may have been loaded to "last played" tree node copy, + // but "leveldir_current" now points to the "original" level set tree node, + // in which case "handicap_level" may still default to the first level + LoadLevelSetup_SeriesInfo(); + UpdateLastPlayedLevels_TreeInfo(); levelset_has_changed = TRUE; @@ -1872,7 +1877,7 @@ static unsigned int getAutoDelayCounter(struct TitleFadingInfo *fi) static boolean TitleAutoDelayReached(unsigned int *counter_var, struct TitleFadingInfo *fi) { - return DelayReachedExt(counter_var, fi->auto_delay, getAutoDelayCounter(fi)); + return DelayReachedExt2(counter_var, fi->auto_delay, getAutoDelayCounter(fi)); } static void ResetTitleAutoDelay(unsigned int *counter_var, @@ -3161,13 +3166,15 @@ static void DrawInfoScreen_Elements(void) void HandleInfoScreen_Elements(int dx, int dy, int button) { - static unsigned int info_delay = 0; + static DelayCounter info_delay = { 0 }; static int num_anims; static int num_pages; static int page; int anims_per_page = NUM_INFO_ELEMENTS_ON_SCREEN; int i; + info_delay.value = GameFrameDelay; + if (button == MB_MENU_INITIALIZE) { boolean new_element = TRUE; @@ -3230,7 +3237,7 @@ void HandleInfoScreen_Elements(int dx, int dy, int button) } else { - if (DelayReached(&info_delay, GameFrameDelay)) + if (DelayReached(&info_delay)) if (page < num_pages) DrawInfoScreen_HelpAnim(page * anims_per_page, num_anims, FALSE); @@ -4339,12 +4346,23 @@ static int getAlignYOffsetFromTreeInfo(TreeInfo *ti) return align_yoffset; } +static void StartPlayingFromHallOfFame(void) +{ + level_nr = scores.next_level_nr; + LoadLevel(level_nr); + + StartGameActions(network.enabled, setup.autorecord, level.random_seed); +} + static void DrawChooseTree(TreeInfo **ti_ptr) { int fade_mask = REDRAW_FIELD; boolean restart_music = (game_status != game_status_last_screen && game_status_last_screen != GAME_MODE_SCOREINFO); + scores.continue_on_return = (game_status == GAME_MODE_SCORES && + game_status_last_screen == GAME_MODE_PLAYING); + if (CheckFadeAll()) fade_mask = REDRAW_ALL; @@ -4354,7 +4372,11 @@ static void DrawChooseTree(TreeInfo **ti_ptr) { execSetupArtwork(); } - else // GAME_MODE_LEVELS + else if (game_status == GAME_MODE_SCORES && scores.continue_playing) + { + StartPlayingFromHallOfFame(); + } + else { SetGameStatus(GAME_MODE_MAIN); @@ -4798,18 +4820,18 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } #if defined(PLATFORM_ANDROID) - // touching the screen anywhere continues playing the next level - if ((mx || my) && scores.continue_playing) + // directly continue when touching the screen after playing + if ((mx || my) && scores.continue_on_return) { + // ignore touch events until released mx = my = 0; - button = MB_MENU_CHOICE; } #endif - // any mouse click or direction input stops playing the next level - if ((mx || my || dx || dy) && scores.continue_playing) + // any mouse click or cursor key stops leaving scores by "Return" key + if ((mx || my || dx || dy) && scores.continue_on_return) { - scores.continue_playing = FALSE; + scores.continue_on_return = FALSE; level_nr = scores.last_level_nr; LoadLevel(level_nr); } @@ -4893,15 +4915,17 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, node_cursor->cl_first = ti->cl_first; node_cursor->cl_cursor = ti->cl_cursor; + *ti_ptr = node_cursor->node_group; DrawChooseTree(ti_ptr); return; } } - else if (dx == -1 && ti->node_parent) + else if ((dx == -1 || button == MB_MENU_CONTINUE) && ti->node_parent) { - FadeSetLeaveMenu(); + if (game_status != GAME_MODE_SCORES) + FadeSetLeaveMenu(); PlaySound(SND_MENU_ITEM_SELECTING); @@ -4984,6 +5008,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, node_cursor->cl_first = ti->cl_first; node_cursor->cl_cursor = ti->cl_cursor; + *ti_ptr = node_cursor->node_group; DrawChooseTree(ti_ptr); } @@ -5002,6 +5027,7 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, node_cursor->cl_first = ti->cl_first; node_cursor->cl_cursor = ti->cl_cursor; + *ti_ptr = node_cursor; if (ti->type == TREE_TYPE_LEVEL_DIR) @@ -5092,16 +5118,13 @@ static void HandleChooseTree(int mx, int my, int dx, int dy, int button, } else if (game_status == GAME_MODE_SCORES) { - if (setup.auto_play_next_level && setup.increment_levels && - scores.last_level_nr < leveldir_current->last_level && - scores.continue_playing && - !network_playing) + if (scores.continue_playing && scores.continue_on_return) { - StartGameActions(network.enabled, setup.autorecord, - level.random_seed); + StartPlayingFromHallOfFame(); + return; } - else if (!scores.continue_playing) + else if (!scores.continue_on_return) { SetGameStatus(GAME_MODE_SCOREINFO); @@ -5298,6 +5321,9 @@ static void DrawHallOfFame_setScoreEntries(void) if (score_entry_current == NULL) score_entry_current = getFirstValidTreeInfoEntry(score_entries); + 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) } @@ -7112,7 +7138,12 @@ static void ToggleUseApiServerIfNeeded(void) runtime.use_api_server = setup.use_api_server; if (runtime.use_api_server) + { + if (setup.has_remaining_tapes) + setup.ask_for_uploading_tapes = TRUE; + CheckApiServerTasks(); + } } static void ModifyGameSpeedIfNeeded(void) @@ -7375,7 +7406,7 @@ static struct TokenInfo setup_info_editor[] = static struct TokenInfo setup_info_graphics[] = { -#if !defined(PLATFORM_ANDROID) +#if !defined(PLATFORM_ANDROID) && !defined(PLATFORM_EMSCRIPTEN) { TYPE_SWITCH, &setup.fullscreen, "Fullscreen:" }, { TYPE_ENTER_LIST, execSetupChooseWindowSize, "Window Scaling:" }, { TYPE_STRING, &window_size_text, "" }, @@ -7388,8 +7419,10 @@ static struct TokenInfo setup_info_graphics[] = { 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, "" }, +#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:" }, @@ -7649,7 +7682,7 @@ static Key getSetupKey(void) { case EVENT_KEYPRESS: { - key = GetEventKey((KeyEvent *)&event, TRUE); + key = GetEventKey((KeyEvent *)&event); // press 'Escape' or 'Enter' to keep the existing key binding if (key == KSYM_Escape || key == KSYM_Return) @@ -8435,14 +8468,18 @@ static boolean CustomizeKeyboardMain(int player_nr) while (!finished) { Event event; + DelayCounter event_frame_delay = { GAME_FRAME_DELAY }; - if (NextValidEvent(&event)) + // reset frame delay counter directly after updating screen + ResetDelayCounter(&event_frame_delay); + + while (NextValidEvent(&event)) { switch (event.type) { case EVENT_KEYPRESS: { - Key key = GetEventKey((KeyEvent *)&event, FALSE); + Key key = GetEventKey((KeyEvent *)&event); // press 'Escape' to abort and keep the old key bindings if (key == KSYM_Escape) @@ -8507,6 +8544,10 @@ static boolean CustomizeKeyboardMain(int player_nr) HandleOtherEvents(&event); break; } + + // do not handle events for longer than standard frame delay period + if (DelayReached(&event_frame_delay)) + break; } BackToFront(); @@ -8529,8 +8570,7 @@ void CustomizeKeyboard(int player_nr) 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; + DelayCounter wait_frame_delay = { 2000 }; ResetDelayCounter(&wait_frame_delay); @@ -8539,7 +8579,7 @@ void CustomizeKeyboard(int player_nr) DrawTextSCentered(ypos1, font_nr, "Keyboard"); DrawTextSCentered(ypos2, font_nr, "configured!"); - while (!DelayReached(&wait_frame_delay, wait_frame_delay_value)) + while (!DelayReached(&wait_frame_delay)) BackToFront(); ClearEventQueue(); @@ -8609,11 +8649,6 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) { 282, 210, MARKER_AXIS_Y, "righty", }, }; - unsigned int event_frame_delay = 0; - unsigned int event_frame_delay_value = GAME_FRAME_DELAY; - - ResetDelayCounter(&event_frame_delay); - if (!bitmaps_initialized) { controller = LoadCustomImage("joystick/controller.png"); @@ -8745,6 +8780,11 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) screen_initialized = TRUE; + DelayCounter event_frame_delay = { GAME_FRAME_DELAY }; + + // reset frame delay counter directly after updating screen + ResetDelayCounter(&event_frame_delay); + while (NextValidEvent(&event)) { switch (event.type) @@ -8878,7 +8918,7 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) } // do not handle events for longer than standard frame delay period - if (DelayReached(&event_frame_delay, event_frame_delay_value)) + if (DelayReached(&event_frame_delay)) break; } } @@ -8962,8 +9002,7 @@ void ConfigureJoystick(int player_nr) 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; + DelayCounter wait_frame_delay = { 2000 }; ResetDelayCounter(&wait_frame_delay); @@ -8974,7 +9013,7 @@ void ConfigureJoystick(int player_nr) DrawTextSCentered(ypos1, font_nr, message1); DrawTextSCentered(ypos2, font_nr, message2); - while (!DelayReached(&wait_frame_delay, wait_frame_delay_value)) + while (!DelayReached(&wait_frame_delay)) BackToFront(); ClearEventQueue(); @@ -9091,7 +9130,7 @@ static boolean ConfigureVirtualButtonsMain(void) case EVENT_KEYPRESS: { - Key key = GetEventKey((KeyEvent *)&event, FALSE); + Key key = GetEventKey((KeyEvent *)&event); action = (key == KSYM_Escape ? ACTION_ESCAPE : key == KSYM_BackSpace || @@ -9292,8 +9331,7 @@ void ConfigureVirtualButtons(void) 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; + DelayCounter wait_frame_delay = { 2000 }; ResetDelayCounter(&wait_frame_delay); @@ -9302,7 +9340,7 @@ void ConfigureVirtualButtons(void) DrawTextSCentered(ypos1, font_nr, "Virtual buttons"); DrawTextSCentered(ypos2, font_nr, "configured!"); - while (!DelayReached(&wait_frame_delay, wait_frame_delay_value)) + while (!DelayReached(&wait_frame_delay)) BackToFront(); ClearEventQueue(); @@ -9724,6 +9762,10 @@ static void CreateScreenMenubuttons(void) int type = GD_TYPE_NORMAL_BUTTON; boolean checked = FALSE; + // do not use touch buttons if overlay touch buttons are disabled + if (is_touch_button && !setup.touch.overlay_buttons) + continue; + event_mask = menubutton_info[i].event_mask; x = (is_touch_button ? pos->x : mSX + GDI_ACTIVE_POS(pos->x)); @@ -10445,6 +10487,9 @@ static boolean OfferUploadTapes(void) "Upload all your tapes to the high score server now?", REQ_ASK)) return FALSE; + // when uploading tapes, make sure that high score server is enabled + runtime.use_api_server = setup.use_api_server = TRUE; + int num_tapes_uploaded = UploadTapes(); char message[100];