From 151b91f204bd1782e9a354b36be70955f899498c Mon Sep 17 00:00:00 2001 From: toaster Date: Sun, 19 Oct 2025 17:44:34 +0100 Subject: [PATCH] M_GetRecordMode Simplifies a lot of copypasted "modeprefix" evaluations into one simple call. Only G_UpdateRecordReplays is seperate. Resolves two issues: - Guest replay ghosts have been broken for a while and nobody noticed (untracked) - Cannot watch back hivolt replays (#1656) In addition, makes it way easier to add new modeprefixes later. --- src/cvars.cpp | 2 +- src/doomstat.h | 1 + src/g_game.c | 1 + src/menus/play-local-race-time-attack.c | 78 +++++++------------------ src/p_setup.cpp | 21 ++----- 5 files changed, 29 insertions(+), 74 deletions(-) diff --git a/src/cvars.cpp b/src/cvars.cpp index e20014c2c..f2b2a24d5 100644 --- a/src/cvars.cpp +++ b/src/cvars.cpp @@ -1008,7 +1008,7 @@ consvar_t cv_dummyprofilerumble = MenuDummy("dummyprofilerumble", "On").on_off() consvar_t cv_dummyscramble = MenuDummy("dummyscramble", "Random").values({{0, "Random"}, {1, "Points"}}); void CV_SPBAttackChanged(void); -consvar_t cv_dummyspbattack = MenuDummy("dummyspbattack", "Off").on_off().onchange(CV_SPBAttackChanged); +consvar_t cv_dummyspbattack = MenuDummy("dummyspbattack", "Off").on_off().onchange_noinit(CV_SPBAttackChanged); consvar_t cv_dummyspectate = MenuDummy("dummyspectate", "Spectator").values({{0, "Spectator"}, {1, "Playing"}}); diff --git a/src/doomstat.h b/src/doomstat.h index 38f814d00..ac3244647 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -220,6 +220,7 @@ extern boolean imcontinuing; // Temporary flag while continuing #define ATTACKING_LAP (1<<1) #define ATTACKING_SPB (1<<2) extern UINT8 modeattacking; +const char *M_GetRecordMode(void); // menu demo things extern UINT8 numDemos; diff --git a/src/g_game.c b/src/g_game.c index e5a2c376f..ed172b752 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -588,6 +588,7 @@ static void G_UpdateRecordReplays(void) char lastdemo[256], bestdemo[256]; const char *modeprefix = ""; + // See also M_GetRecordMode if (encoremode) { modeprefix = "spb-"; diff --git a/src/menus/play-local-race-time-attack.c b/src/menus/play-local-race-time-attack.c index c581b2c4b..72be74833 100644 --- a/src/menus/play-local-race-time-attack.c +++ b/src/menus/play-local-race-time-attack.c @@ -266,6 +266,23 @@ menu_t PLAY_TAGhostsDef = { NULL }; +// See also G_UpdateRecordReplays +const char *M_GetRecordMode(void) +{ + if (cv_dummyspbattack.value) + { + return "spb-"; + } + + const INT32 skinid = R_SkinAvailableEx(cv_skin[0].string, false); + if (skinid >= 0 && (skins[skinid]->flags & SF_HIVOLT)) + { + return "hivolt-"; + } + + return ""; +} + void CV_SPBAttackChanged(void); void CV_SPBAttackChanged(void) { @@ -275,14 +292,12 @@ void CV_SPBAttackChanged(void) { // see also p_setup.c's P_LoadRecordGhosts char *gpath = Z_StrDup(va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(levellist.choosemap+1))); - const char *modeprefix = ""; + const char *modeprefix = M_GetRecordMode(); UINT8 active; if (!gpath) return; - if (cv_dummyspbattack.value) - modeprefix = "spb-"; active = false; PLAY_TimeAttack[ta_guest].status = IT_DISABLED; @@ -458,20 +473,7 @@ void M_ReplayTimeAttack(INT32 choice) { menudemo_t menudemo = {0}; const char *which = NULL; - const char *modeprefix = ""; - - if (cv_dummyspbattack.value) - { - modeprefix = "spb-"; - } - else - { - const INT32 skinid = R_SkinAvailableEx(cv_skin[0].string, false); - if (skinid >= 0 && (skins[skinid]->flags & SF_HIVOLT)) - { - modeprefix = "hivolt-"; - } - } + const char *modeprefix = M_GetRecordMode(); switch (choice) { @@ -528,20 +530,7 @@ static void M_WriteGuestReplay(INT32 ch) gpath = Z_StrDup(va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(levellist.choosemap+1))); - const char *modeprefix = ""; - - if (cv_dummyspbattack.value) - { - modeprefix = "spb-"; - } - else - { - const INT32 skinid = R_SkinAvailableEx(cv_skin[0].string, false); - if (skinid >= 0 && (skins[skinid]->flags & SF_HIVOLT)) - { - modeprefix = "hivolt-"; - } - } + const char *modeprefix = M_GetRecordMode(); if (TA_GuestReplay_Str != NULL) { @@ -597,20 +586,7 @@ void M_SetGuestReplay(INT32 choice) break; } - const char *modeprefix = ""; - - if (cv_dummyspbattack.value) - { - modeprefix = "spb-"; - } - else - { - const INT32 skinid = R_SkinAvailableEx(cv_skin[0].string, false); - if (skinid >= 0 && (skins[skinid]->flags & SF_HIVOLT)) - { - modeprefix = "hivolt-"; - } - } + const char *modeprefix = M_GetRecordMode(); if (FIL_FileExists(va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s-%sguest.lmp", srb2home, timeattackfolder, G_BuildMapName(levellist.choosemap+1), modeprefix))) { @@ -626,7 +602,7 @@ void M_StartTimeAttack(INT32 choice) { char *gpath; char nameofdemo[256]; - const char *modeprefix = ""; + const char *modeprefix = M_GetRecordMode(); (void)choice; @@ -649,16 +625,6 @@ void M_StartTimeAttack(INT32 choice) { encoremode = true; // guarantees short wipe } - - modeprefix = "spb-"; - } - else - { - const INT32 skinid = R_SkinAvailableEx(cv_skin[0].string, false); - if (skinid >= 0 && (skins[skinid]->flags & SF_HIVOLT)) - { - modeprefix = "hivolt-"; - } } // DON'T SOFTLOCK diff --git a/src/p_setup.cpp b/src/p_setup.cpp index e3f6824c5..cbd25653f 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -7841,24 +7841,11 @@ static void P_LoadRecordGhosts(void) { // see also /menus/play-local-race-time-attack.c's M_PrepareTimeAttack char *gpath; - const char *modeprefix = ""; + const char *modeprefix = M_GetRecordMode(); INT32 i; gpath = Z_StrDup(va("%s" PATHSEP "media" PATHSEP "replay" PATHSEP "%s" PATHSEP "%s", srb2home, timeattackfolder, G_BuildMapName(gamemap))); - if (encoremode) - { - modeprefix = "-spb"; - } - else - { - const INT32 skinid = R_SkinAvailableEx(cv_skin[0].string, false); - if (skinid >= 0 && (skins[skinid]->flags & SF_HIVOLT)) - { - modeprefix = "-hivolt"; - } - } - enum { kTime = 1 << 0, @@ -7883,7 +7870,7 @@ static void P_LoadRecordGhosts(void) auto add_ghosts = [gpath](const srb2::String& base, UINT8 bits) { - auto load = [base](const char* suffix) { P_TryAddExternalGhost(fmt::format("{}-{}.lmp", base, suffix).c_str()); }; + auto load = [base](const char* suffix) { P_TryAddExternalGhost(fmt::format("{}{}.lmp", base, suffix).c_str()); }; if (bits & kTime) load("time-best"); @@ -7901,7 +7888,7 @@ static void P_LoadRecordGhosts(void) if (allGhosts) { for (i = 0; i < numskins; ++i) - add_ghosts(fmt::format("{}-{}{}", gpath, skins[i]->name, modeprefix), allGhosts); + add_ghosts(fmt::format("{}-{}-{}", gpath, skins[i]->name, modeprefix), allGhosts); } if (sameGhosts) @@ -7909,7 +7896,7 @@ static void P_LoadRecordGhosts(void) INT32 skin = R_SkinAvailableEx(cv_skin[0].string, false); if (skin < 0 || !R_SkinUsable(-1, skin, false)) skin = 0; // use default skin - add_ghosts(fmt::format("{}-{}{}", gpath, skins[skin]->name, modeprefix), sameGhosts); + add_ghosts(fmt::format("{}-{}-{}", gpath, skins[skin]->name, modeprefix), sameGhosts); } // Guest ghost