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.
This commit is contained in:
toaster 2025-10-19 17:44:34 +01:00
parent 19600c2589
commit 151b91f204
5 changed files with 29 additions and 74 deletions

View file

@ -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"}});

View file

@ -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;

View file

@ -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-";

View file

@ -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

View file

@ -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