X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Fscreens.c;h=533cf4c4ce2cb84338297ff56d9de7ec122911a5;hb=5f29516b5acf64df0acb0efeb20f64c2945fc74b;hp=cba644acee1ddf34ae62c3ee0a7db278148e4b22;hpb=f74f172cb8a4285a02038cf845d4e49cf74b6b8d;p=rocksndiamonds.git diff --git a/src/screens.c b/src/screens.c index cba644ac..533cf4c4 100644 --- a/src/screens.c +++ b/src/screens.c @@ -1721,6 +1721,9 @@ void DrawMainMenu(void) return; } + // reset flag to continue playing next level from hall of fame + scores.continue_playing = FALSE; + // leveldir_current may be invalid (level group, parent link, node copy) leveldir_current = getValidLevelSeries(leveldir_current, leveldir_last_valid); @@ -4336,14 +4339,22 @@ 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.was_just_playing = (game_status == GAME_MODE_SCORES && - game_status_last_screen == GAME_MODE_PLAYING); + scores.continue_on_return = (game_status == GAME_MODE_SCORES && + game_status_last_screen == GAME_MODE_PLAYING); if (CheckFadeAll()) fade_mask = REDRAW_ALL; @@ -4354,7 +4365,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 +4813,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.was_just_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.was_just_playing) + // any mouse click or cursor key stops leaving scores by "Return" key + if ((mx || my || dx || dy) && scores.continue_on_return) { - scores.was_just_playing = FALSE; + scores.continue_on_return = FALSE; level_nr = scores.last_level_nr; LoadLevel(level_nr); } @@ -4893,15 +4908,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 +5001,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 +5020,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 +5111,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.was_just_playing && - !network_playing) + if (scores.continue_playing && scores.continue_on_return) { - StartGameActions(network.enabled, setup.autorecord, - level.random_seed); + StartPlayingFromHallOfFame(); + return; } - else if (!scores.was_just_playing) + else if (!scores.continue_on_return) { SetGameStatus(GAME_MODE_SCOREINFO); @@ -5298,6 +5314,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) } @@ -7375,7 +7394,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 +7407,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:" }, @@ -8609,11 +8630,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 +8761,12 @@ static boolean ConfigureJoystickMapButtonsAndAxes(SDL_Joystick *joystick) screen_initialized = TRUE; + unsigned int event_frame_delay = 0; + unsigned int event_frame_delay_value = GAME_FRAME_DELAY; + + // reset frame delay counter directly after updating screen + ResetDelayCounter(&event_frame_delay); + while (NextValidEvent(&event)) { switch (event.type) @@ -9724,6 +9746,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));