M_HandleStaffReplay, M_DrawTimeAttack: Re-support selecting staff replays from the menu

This commit is contained in:
toaster 2023-02-04 11:06:57 +00:00
parent a2fadd2ff4
commit 6dd32deecb
4 changed files with 70 additions and 57 deletions

View file

@ -469,7 +469,6 @@ void Moviemode_option_Onchange(void);
extern menu_t *currentMenu;
extern menu_t *restoreMenu;
extern char dummystaffname[22];
extern consvar_t cv_dummystaff;
extern INT16 itemOn; // menu item skull is on, Hack by Tails 09-18-2002

View file

@ -2240,7 +2240,6 @@ void M_DrawTimeAttack(void)
INT32 w;
patch_t *minimap = NULL;
UINT8 i;
consvar_t *cv;
M_DrawLevelSelectBlock(0, 2, map, true, false);
@ -2303,19 +2302,56 @@ void M_DrawTimeAttack(void)
opty += 10;
// Cvar specific handling
if (currentMenu->menuitems[i].status & IT_CVAR)
{
cv = currentMenu->menuitems[i].itemaction.cvar;
const char *str = NULL;
INT32 optflags = f;
boolean drawarrows = (i == itemOn);
w = V_StringWidth(cv->string, 0);
V_DrawString(leftedge, opty, f, cv->string);
if (i == itemOn)
if ((currentMenu->menuitems[i].status & IT_TYPE) == IT_ARROWS)
{
V_DrawCharacter(leftedge - 10 - (skullAnimCounter/5), opty, '\x1C' | f, false); // left arrow
V_DrawCharacter(leftedge + w + 2+ (skullAnimCounter/5), opty, '\x1D' | f, false); // right arrow
// Currently assumes M_HandleStaffReplay
if (mapheaderinfo[levellist.choosemap]->ghostCount <= 1)
drawarrows = false;
optflags |= V_ALLOWLOWERCASE;
if (mapheaderinfo[levellist.choosemap] == NULL)
str = "Invalid map";
else if (cv_dummystaff.value > mapheaderinfo[levellist.choosemap]->ghostCount)
str = va("%u - Invalid ID", cv_dummystaff.value+1);
else if (mapheaderinfo[levellist.choosemap]->ghostBrief[cv_dummystaff.value] == NULL)
str = va("%u - Invalid brief", cv_dummystaff.value+1);
else
{
const char *th = "th";
if (cv_dummystaff.value+1 == 1)
th = "st";
else if (cv_dummystaff.value+1 == 2)
th = "nd";
else if (cv_dummystaff.value+1 == 3)
th = "rd";
str = va("%u%s - %s",
cv_dummystaff.value+1,
th,
mapheaderinfo[levellist.choosemap]->ghostBrief[cv_dummystaff.value]->name
);
}
}
else if ((currentMenu->menuitems[i].status & IT_TYPE) == IT_CVAR)
{
str = currentMenu->menuitems[i].itemaction.cvar->string;
}
if (str)
{
w = V_StringWidth(str, optflags);
V_DrawString(leftedge+12, opty, optflags, str);
if (drawarrows)
{
V_DrawCharacter(leftedge+12 - 10 - (skullAnimCounter/5), opty, '\x1C' | f, false); // left arrow
V_DrawCharacter(leftedge+12 + w + 2+ (skullAnimCounter/5), opty, '\x1D' | f, false); // right arrow
}
opty += 10;
}
opty += 10;
}
break;

View file

@ -37,8 +37,6 @@ boolean fromlevelselect = false;
menu_t *currentMenu = &MAIN_ProfilesDef;
menu_t *restoreMenu = NULL;
char dummystaffname[22];
INT16 itemOn = 0; // menu item skull is on, Hack by Tails 09-18-2002
INT16 skullAnimCounter = 8; // skull animation counter
struct menutransition_s menutransition; // Menu transition properties
@ -77,7 +75,7 @@ consvar_t cv_tutorialprompt = CVAR_INIT ("tutorialprompt", "On", CV_SAVE, CV_OnO
static CV_PossibleValue_t dummyteam_cons_t[] = {{0, "Spectator"}, {1, "Red"}, {2, "Blue"}, {0, NULL}};
static CV_PossibleValue_t dummyspectate_cons_t[] = {{0, "Spectator"}, {1, "Playing"}, {0, NULL}};
static CV_PossibleValue_t dummyscramble_cons_t[] = {{0, "Random"}, {1, "Points"}, {0, NULL}};
static CV_PossibleValue_t dummystaff_cons_t[] = {{0, "MIN"}, {100, "MAX"}, {0, NULL}};
static CV_PossibleValue_t dummystaff_cons_t[] = {{0, "MIN"}, {MAXSTAFF-1, "MAX"}, {0, NULL}};
static consvar_t cv_dummyteam = CVAR_INIT ("dummyteam", "Spectator", CV_HIDDEN, dummyteam_cons_t, NULL);
//static cv_dummyspectate = CVAR_INITconsvar_t ("dummyspectate", "Spectator", CV_HIDDEN, dummyspectate_cons_t, NULL);
@ -92,39 +90,15 @@ consvar_t cv_dummyspectate = CVAR_INIT ("dummyspectate", "Spectator", CV_HIDDEN,
static void Dummystaff_OnChange(void)
{
#ifdef STAFFGHOSTS
lumpnum_t l;
if (mapheaderinfo[levellist.choosemap] == NULL || mapheaderinfo[levellist.choosemap]->ghostCount <= 0)
return;
dummystaffname[0] = '\0';
if ((l = W_CheckNumForName(va("%sS01",G_BuildMapName(cv_nextmap.value)))) == LUMPERROR)
dummystaff_cons_t[1].value = mapheaderinfo[levellist.choosemap]->ghostCount-1;
if (cv_dummystaff.value > dummystaff_cons_t[1].value)
{
CV_StealthSetValue(&cv_dummystaff, 0);
return;
}
else
{
char *temp = dummystaffname;
UINT8 numstaff = 1;
while (numstaff < 99 && (l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value),numstaff+1))) != LUMPERROR)
numstaff++;
if (cv_dummystaff.value < 1)
CV_StealthSetValue(&cv_dummystaff, numstaff);
else if (cv_dummystaff.value > numstaff)
CV_StealthSetValue(&cv_dummystaff, 1);
if ((l = W_CheckNumForName(va("%sS%02u",G_BuildMapName(cv_nextmap.value), cv_dummystaff.value))) == LUMPERROR)
return; // shouldn't happen but might as well check...
G_UpdateStaffGhostName(l);
while (*temp)
temp++;
sprintf(temp, " - %d", cv_dummystaff.value);
}
#endif //#ifdef STAFFGHOSTS
}
@ -968,19 +942,17 @@ static void M_HandleMenuInput(void)
if (routine && ((currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_ARROWS
|| (currentMenu->menuitems[itemOn].status & IT_TYPE) == IT_CVAR))
{
consvar_t *cv = currentMenu->menuitems[itemOn].itemaction.cvar;
/*consvar_t *cv = currentMenu->menuitems[itemOn].itemaction.cvar;
// Make these CVar options?
if (cv == &cv_chooseskin
|| cv == &cv_dummystaff
/*
|| cv == &cv_nextmap
|| cv == &cv_newgametype
*/
)
{
return;
}
}*/
S_StartSound(NULL, sfx_s3k5b);

View file

@ -56,7 +56,7 @@ menuitem_t PLAY_TAReplay[] =
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
{IT_STRING | IT_CALL, "Replay Last", NULL, NULL, {.routine = M_ReplayTimeAttack}, 0, 0},
{IT_STRING | IT_CALL, "Replay Guest", NULL, NULL, {.routine = M_ReplayTimeAttack}, 0, 0},
{IT_STRING | IT_CALL, "Replay Staff", NULL, NULL, {.routine = M_HandleStaffReplay}, 0, 0},
{IT_STRING | IT_ARROWS, "Replay Staff", NULL, NULL, {.routine = M_HandleStaffReplay}, 0, 0},
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
{IT_STRING | IT_SUBMENU, "Back", NULL, NULL, {.submenu = &PLAY_TimeAttackDef}, 0, 0},
@ -197,8 +197,6 @@ void M_PrepareTimeAttack(INT32 choice)
if (!gpath)
return;
CV_StealthSetValue(&cv_dummystaff, 0);
active = false;
PLAY_TimeAttack[ta_guest].status = IT_DISABLED;
PLAY_TimeAttack[ta_replay].status = IT_DISABLED;
@ -257,16 +255,13 @@ void M_PrepareTimeAttack(INT32 choice)
PLAY_TAReplay[tareplay_staff].status =
PLAY_TAGhosts[taghost_staff].status = IT_DISABLED;
#ifdef STAFFGHOSTS
CV_SetValue(&cv_dummystaff, 1);
if (cv_dummystaff.value)
if (mapheaderinfo[levellist.choosemap]->ghostCount > 0)
{
PLAY_TAReplay[tareplay_staff].status = IT_STRING|IT_KEYHANDLER;
PLAY_TAReplay[tareplay_staff].status = IT_STRING|IT_ARROWS;
PLAY_TAGhosts[taghost_staff].status = IT_STRING|IT_CVAR;
CV_StealthSetValue(&cv_dummystaff, 1);
CV_SetValue(&cv_dummystaff, 0);
active |= 1|4;
}
#endif //#ifdef STAFFGHOSTS
if (active & 1)
PLAY_TimeAttack[ta_replay].status = IT_STRING|IT_SUBMENU;
@ -287,8 +282,19 @@ void M_PrepareTimeAttack(INT32 choice)
void M_HandleStaffReplay(INT32 choice)
{
// @TODO:
(void) choice;
if (choice == 2)
{
restoreMenu = &PLAY_TimeAttackDef;
M_ClearMenus(true);
demo.loadfiles = false;
demo.ignorefiles = true; // Just assume that record attack replays have the files needed
G_DoPlayDemo(va("%s/GHOST_%u", mapheaderinfo[levellist.choosemap]->lumpname, cv_dummystaff.value+1));
return;
}
M_ChangeCvarDirect(choice, &cv_dummystaff);
}
void M_ReplayTimeAttack(INT32 choice)