From 71e1179030aea0271793ddc420a0db67d85c8f6c Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 31 May 2025 14:57:06 +0100 Subject: [PATCH] M_MenuToLevelPreamble: Seriously clean up the process of starting a course from the menu A lot of messy, copypasted boilerplate has been bundled together into a single function. Programmers can now fire up a Match Race, the most basic type of gameplay, from menu code in only four steps (other modes take a little more attention): - **M_MenuToLevelPreamble(UINT8 - splitscreen players #, boolean - false to extend wipe/true for short wipe)** - set restoremenu - D_MapChange(...) - M_ClearMenus(...) Includes the following fixes: - Encore no longer has over-long wipes when started from menu, only standard-length - "Boss Intro" and Encore start-of-round sounds will always play, even if no Title Card is drawn - No long wipe when restarting a Time Attack run - Auto Encore and Auto Gamespeed are no longer accidentially forced if you've manually changed them to Off and Gear 2 before starting netgame --- src/g_game.c | 40 +++++--- src/k_menu.h | 1 + src/menus/play-local-race-time-attack.c | 40 ++++---- src/menus/transient/cup-select.c | 25 +---- src/menus/transient/level-select.c | 120 ++++++++++++------------ src/p_setup.cpp | 2 +- src/st_stuff.c | 2 + 7 files changed, 109 insertions(+), 121 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 8f05f30ab..2ae89c184 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -1245,26 +1245,36 @@ void G_StartTitleCard(void) // prepare status bar ST_startTitleCard(); // <-- always must be called to init some variables - // The title card has been disabled for this map. - // Oh well. - if (demo.simplerewind || !G_IsTitleCardAvailable()) - { - WipeStageTitle = false; + if (demo.simplerewind) return; + + sfxenum_t kstart = 0; + + if (K_CheckBossIntro() == true) + { + kstart = sfx_ssa021; } + else if (encoremode) + { + kstart = sfx_ruby2; + } + + if (kstart) + { + // Play the guaranteed alt sounds + S_StartSound(NULL, kstart); + } + + if (!G_IsTitleCardAvailable()) + return; // start the title card WipeStageTitle = (gamestate == GS_LEVEL); - // play the sound - if (WipeStageTitle) + if (WipeStageTitle && !kstart) { - sfxenum_t kstart = sfx_kstart; - if (K_CheckBossIntro() == true) - kstart = sfx_ssa021; - else if (encoremode == true) - kstart = sfx_ruby2; - S_StartSound(NULL, kstart); + // Play the standard titlecard sound + S_StartSound(NULL, sfx_kstart); } } @@ -5379,7 +5389,7 @@ void G_InitNew(UINT8 pencoremode, INT32 map, boolean resetplayer, boolean skippr S_ResumeAudio(); } - prevencoremode = ((!Playing()) ? false : encoremode); + prevencoremode = encoremode; encoremode = pencoremode; legitimateexit = false; // SRB2Kart @@ -5831,7 +5841,7 @@ boolean G_GetExitGameFlag(void) // Same deal with retrying. void G_SetRetryFlag(void) { - if (retrying == false) + if (retrying == false && grandprixinfo.gp) { grandprixinfo.rank.continuesUsed++; } diff --git a/src/k_menu.h b/src/k_menu.h index 1a4dc3066..fbf8594b8 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -944,6 +944,7 @@ void M_CupSelectTick(void); void M_LevelSelectHandler(INT32 choice); void M_LevelSelectTick(void); +void M_MenuToLevelPreamble(UINT8 ssplayers, boolean nowipe); void M_LevelSelected(INT16 add, boolean menuupdate); boolean M_LevelSelectCupSwitch(boolean next, boolean skipones); diff --git a/src/menus/play-local-race-time-attack.c b/src/menus/play-local-race-time-attack.c index b682cfe07..7ac7343bf 100644 --- a/src/menus/play-local-race-time-attack.c +++ b/src/menus/play-local-race-time-attack.c @@ -614,34 +614,19 @@ void M_StartTimeAttack(INT32 choice) { modeattacking |= ATTACKING_SPB; } + + if (gamestate == GS_MENU) + { + encoremode = true; // guarantees short wipe + } + modeprefix = "spb-"; } // DON'T SOFTLOCK CON_ToggleOff(); - // Still need to reset devmode - cht_debug = 0; - - if (demo.playback) - G_StopDemo(); - - splitscreen = 0; - SplitScreen_OnChange(); - - S_StartSound(NULL, sfx_s3k63); - - paused = false; - - S_StopMusicCredit(); - - // Early fadeout to let the sound finish playing - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - F_WipeEndScreen(); - F_RunWipe(wipe_level_toblack, wipedefs[wipe_level_toblack], false, "FADEMAP0", false, false); - - SV_StartSinglePlayerServer(levellist.newgametype, false); + M_MenuToLevelPreamble(0, (gamestate != GS_MENU || cv_dummyspbattack.value == 1)); gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s", srb2home, timeattackfolder); @@ -659,8 +644,17 @@ void M_StartTimeAttack(INT32 choice) restoreMenu = &PLAY_TimeAttackDef; + D_MapChange( + levellist.choosemap+1, + levellist.newgametype, + (cv_dummyspbattack.value == 1), + true, + 1, + false, + false + ); + M_ClearMenus(true); - D_MapChange(levellist.choosemap+1, levellist.newgametype, (cv_dummyspbattack.value == 1), 1, 1, false, false); G_UpdateTimeStickerMedals(levellist.choosemap, true); } diff --git a/src/menus/transient/cup-select.c b/src/menus/transient/cup-select.c index 8fa830094..f8c5266f3 100644 --- a/src/menus/transient/cup-select.c +++ b/src/menus/transient/cup-select.c @@ -57,26 +57,7 @@ static void M_StartCup(UINT8 entry) entry = UINT8_MAX; } - S_StartSound(NULL, sfx_s3k63); - - paused = false; - - S_StopMusicCredit(); - - // Early fadeout to let the sound finish playing - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - F_WipeEndScreen(); - F_RunWipe(wipe_level_toblack, wipedefs[wipe_level_toblack], false, "FADEMAP0", false, false); - - if (cv_maxconnections.value < ssplayers+1) - CV_SetValue(&cv_maxconnections, ssplayers+1); - - if (splitscreen != ssplayers) - { - splitscreen = ssplayers; - SplitScreen_OnChange(); - } + M_MenuToLevelPreamble(ssplayers, false); if (entry == UINT8_MAX) { @@ -135,10 +116,6 @@ static void M_StartCup(UINT8 entry) } } - paused = false; - - SV_StartSinglePlayerServer(levellist.newgametype, levellist.netgame); - M_ClearMenus(true); restoreMenu = &PLAY_CupSelectDef; diff --git a/src/menus/transient/level-select.c b/src/menus/transient/level-select.c index a0c57ae8c..5745c82b9 100644 --- a/src/menus/transient/level-select.c +++ b/src/menus/transient/level-select.c @@ -657,6 +657,11 @@ void M_LevelSelectInit(INT32 choice) case 0: levellist.levelsearch.grandprix = false; levellist.levelsearch.timeattack = false; + + CV_StealthSet(&cv_kartbot, cv_dummymatchbots.string); + CV_StealthSet(&cv_kartencore, (cv_dummygpencore.value == 1) ? "On" : "Auto"); + CV_StealthSet(&cv_kartspeed, (cv_dummykartspeed.value == KARTSPEED_NORMAL) ? "Auto Gear" : cv_dummykartspeed.string); + break; case 1: levellist.levelsearch.grandprix = false; @@ -689,6 +694,40 @@ void M_LevelSelectInit(INT32 choice) } } +void M_MenuToLevelPreamble(UINT8 ssplayers, boolean nowipe) +{ + cht_debug = 0; + + if (demo.playback) + G_StopDemo(); + + if (cv_maxconnections.value < ssplayers+1) + CV_SetValue(&cv_maxconnections, ssplayers+1); + + if (splitscreen != ssplayers) + { + splitscreen = ssplayers; + SplitScreen_OnChange(); + } + + paused = false; + + S_StopMusicCredit(); + + if (!nowipe) + { + S_StartSound(NULL, sfx_s3k63); + + // Early fadeout to let the sound finish playing + F_WipeStartScreen(); + V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); + F_WipeEndScreen(); + F_RunWipe(wipe_level_toblack, wipedefs[wipe_level_toblack], false, "FADEMAP0", false, false); + } + + SV_StartSinglePlayerServer(levellist.newgametype, levellist.netgame); +} + void M_LevelSelected(INT16 add, boolean menuupdate) { UINT8 i = 0; @@ -733,70 +772,35 @@ void M_LevelSelected(INT16 add, boolean menuupdate) { if (gamestate == GS_MENU) { - UINT8 ssplayers = levellist.levelsearch.tutorial ? 0 : cv_splitplayers.value-1; - - netgame = false; multiplayer = true; - strlcpy(connectedservername, cv_servername.string, MAXSERVERNAME); + M_MenuToLevelPreamble( + (levellist.levelsearch.tutorial + ? 0 + : cv_splitplayers.value-1 + ), + ( + (cv_kartencore.value == 1) + && (gametypes[levellist.newgametype]->rules & GTR_ENCORE) + ) + ); - // Still need to reset devmode - cht_debug = 0; - - if (demo.playback) - G_StopDemo(); - - /*if (levellist.choosemap == 0) - levellist.choosemap = G_RandMap(G_TOLFlag(levellist.newgametype), -1, 0, 0, false, NULL);*/ - - if (cv_maxconnections.value < ssplayers+1) - CV_SetValue(&cv_maxconnections, ssplayers+1); - - if (splitscreen != ssplayers) - { - splitscreen = ssplayers; - SplitScreen_OnChange(); - } - - S_StartSound(NULL, sfx_s3k63); - - paused = false; - - S_StopMusicCredit(); - - // Early fadeout to let the sound finish playing - F_WipeStartScreen(); - V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31); - F_WipeEndScreen(); - F_RunWipe(wipe_level_toblack, wipedefs[wipe_level_toblack], false, "FADEMAP0", false, false); - - SV_StartSinglePlayerServer(levellist.newgametype, levellist.netgame); - - if (!levellist.netgame) - CV_StealthSet(&cv_kartbot, cv_dummymatchbots.string); - - CV_StealthSet(&cv_kartencore, (cv_dummygpencore.value == 1) ? "On" : "Auto"); - CV_StealthSet(&cv_kartspeed, (cv_dummykartspeed.value == KARTSPEED_NORMAL) ? "Auto Gear" : cv_dummykartspeed.string); - - D_MapChange(levellist.choosemap+1, levellist.newgametype, (cv_kartencore.value == 1), 1, 1, false, false); - - if (levellist.netgame == true) - { - restoreMenu = &PLAY_MP_OptSelectDef; - } - else /*if (!M_GameTrulyStarted() || - levellist.levelsearch.tutorial)*/ - { - restoreMenu = currentMenu; - } + restoreMenu = (levellist.netgame) + ? &PLAY_MP_OptSelectDef + : currentMenu; restorelevellist = levellist; } - else - { - // directly do the map change - D_MapChange(levellist.choosemap+1, levellist.newgametype, (cv_kartencore.value == 1), 1, 1, false, false); - } + + D_MapChange( + levellist.choosemap+1, + levellist.newgametype, + (cv_kartencore.value == 1), + true, + 1, + false, + false + ); M_ClearMenus(true); } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 8d8b6e55a..2d11cc8d5 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -8513,7 +8513,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) wipegamestate = gamestate; // Don't fade if reloading the gamestate // Encore mode fade to pink to white // This is handled BEFORE sounds are stopped. - else if (encoremode && !prevencoremode && modeattacking == ATTACKING_NONE && !demo.simplerewind) + else if (encoremode && !prevencoremode && !demo.simplerewind) { if (rendermode != render_none) { diff --git a/src/st_stuff.c b/src/st_stuff.c index e8196e57e..44703e839 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -737,6 +737,8 @@ void ST_startTitleCard(void) lt_ticker = lt_exitticker = lt_lasttic = 0; lt_endtime = 4*TICRATE; // + (10*NEWTICRATERATIO); lt_fade = 0; + + WipeStageTitle = false; } //