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"}}); consvar_t cv_dummyscramble = MenuDummy("dummyscramble", "Random").values({{0, "Random"}, {1, "Points"}});
void CV_SPBAttackChanged(void); 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"}}); 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_LAP (1<<1)
#define ATTACKING_SPB (1<<2) #define ATTACKING_SPB (1<<2)
extern UINT8 modeattacking; extern UINT8 modeattacking;
const char *M_GetRecordMode(void);
// menu demo things // menu demo things
extern UINT8 numDemos; extern UINT8 numDemos;

View file

@ -588,6 +588,7 @@ static void G_UpdateRecordReplays(void)
char lastdemo[256], bestdemo[256]; char lastdemo[256], bestdemo[256];
const char *modeprefix = ""; const char *modeprefix = "";
// See also M_GetRecordMode
if (encoremode) if (encoremode)
{ {
modeprefix = "spb-"; modeprefix = "spb-";

View file

@ -266,6 +266,23 @@ menu_t PLAY_TAGhostsDef = {
NULL 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);
void CV_SPBAttackChanged(void) void CV_SPBAttackChanged(void)
{ {
@ -275,14 +292,12 @@ void CV_SPBAttackChanged(void)
{ {
// see also p_setup.c's P_LoadRecordGhosts // 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))); 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; UINT8 active;
if (!gpath) if (!gpath)
return; return;
if (cv_dummyspbattack.value)
modeprefix = "spb-";
active = false; active = false;
PLAY_TimeAttack[ta_guest].status = IT_DISABLED; PLAY_TimeAttack[ta_guest].status = IT_DISABLED;
@ -458,20 +473,7 @@ void M_ReplayTimeAttack(INT32 choice)
{ {
menudemo_t menudemo = {0}; menudemo_t menudemo = {0};
const char *which = NULL; const char *which = NULL;
const char *modeprefix = ""; const char *modeprefix = M_GetRecordMode();
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-";
}
}
switch (choice) 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))); 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();
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-";
}
}
if (TA_GuestReplay_Str != NULL) if (TA_GuestReplay_Str != NULL)
{ {
@ -597,20 +586,7 @@ void M_SetGuestReplay(INT32 choice)
break; break;
} }
const char *modeprefix = ""; const char *modeprefix = M_GetRecordMode();
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-";
}
}
if (FIL_FileExists(va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s-%sguest.lmp", srb2home, timeattackfolder, G_BuildMapName(levellist.choosemap+1), modeprefix))) 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 *gpath;
char nameofdemo[256]; char nameofdemo[256];
const char *modeprefix = ""; const char *modeprefix = M_GetRecordMode();
(void)choice; (void)choice;
@ -649,16 +625,6 @@ void M_StartTimeAttack(INT32 choice)
{ {
encoremode = true; // guarantees short wipe 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 // 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 // see also /menus/play-local-race-time-attack.c's M_PrepareTimeAttack
char *gpath; char *gpath;
const char *modeprefix = ""; const char *modeprefix = M_GetRecordMode();
INT32 i; INT32 i;
gpath = Z_StrDup(va("%s" PATHSEP "media" PATHSEP "replay" PATHSEP "%s" PATHSEP "%s", srb2home, timeattackfolder, G_BuildMapName(gamemap))); 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 enum
{ {
kTime = 1 << 0, kTime = 1 << 0,
@ -7883,7 +7870,7 @@ static void P_LoadRecordGhosts(void)
auto add_ghosts = [gpath](const srb2::String& base, UINT8 bits) 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) if (bits & kTime)
load("time-best"); load("time-best");
@ -7901,7 +7888,7 @@ static void P_LoadRecordGhosts(void)
if (allGhosts) if (allGhosts)
{ {
for (i = 0; i < numskins; ++i) 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) if (sameGhosts)
@ -7909,7 +7896,7 @@ static void P_LoadRecordGhosts(void)
INT32 skin = R_SkinAvailableEx(cv_skin[0].string, false); INT32 skin = R_SkinAvailableEx(cv_skin[0].string, false);
if (skin < 0 || !R_SkinUsable(-1, skin, false)) if (skin < 0 || !R_SkinUsable(-1, skin, false))
skin = 0; // use default skin 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 // Guest ghost