From b70e59755f0cb07f4a4cf2d4477c9015cae354f2 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 17 Feb 2024 23:11:58 +0000 Subject: [PATCH] Tie SPB Attack and Encore together - A method to access Encore in Time Attack - so we have SOME Encore singleplayer content on launch - Also available for Versus mode (in Special Attack) - Finally, Encore rematches have a way to access them! - Obviously will not spawn a chasing SPB, it's just a signal for "hard mode" - Relevant gametype + unlock checks have been abstracted into M_EncoreAttackTogglePermitted --- src/g_game.c | 8 +++---- src/k_menu.h | 1 + src/k_menudraw.c | 7 +++--- src/menus/play-local-race-time-attack.c | 31 +++++++++++++++++++++---- src/p_setup.cpp | 4 ++-- 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 787961210..293ed9feb 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -428,7 +428,7 @@ void G_UpdateTimeStickerMedals(UINT16 map, boolean showownrecord) } case ET_MAP: { - if (emblem->flags & ME_SPBATTACK && cv_dummyspbattack.value) + if (emblem->flags & (ME_SPBATTACK|ME_ENCORE) && cv_dummyspbattack.value) break; goto bademblem; } @@ -436,7 +436,7 @@ void G_UpdateTimeStickerMedals(UINT16 map, boolean showownrecord) goto bademblem; } - if (cv_dummyspbattack.value && !(emblem->flags & ME_SPBATTACK)) + if (cv_dummyspbattack.value && !(emblem->flags & (ME_SPBATTACK|ME_ENCORE))) return; if (!gamedata->collected[(emblem-emblemlocations)] && gonnadrawtime) @@ -537,7 +537,7 @@ void G_TickTimeStickerMedals(void) void G_UpdateRecords(void) { UINT8 earnedEmblems; - recordtimes_t *record = (modeattacking & ATTACKING_SPB) ? + recordtimes_t *record = (encoremode == true) ? &mapheaderinfo[gamemap-1]->records.spbattack : &mapheaderinfo[gamemap-1]->records.timeattack; @@ -585,7 +585,7 @@ static void G_UpdateRecordReplays(void) char lastdemo[256], bestdemo[256]; const char *modeprefix = ""; - if (modeattacking & ATTACKING_SPB) + if (encoremode) { modeprefix = "spb-"; } diff --git a/src/k_menu.h b/src/k_menu.h index a623aedb3..4451748fe 100644 --- a/src/k_menu.h +++ b/src/k_menu.h @@ -906,6 +906,7 @@ void M_ReplayTimeAttack(INT32 choice); void M_HandleStaffReplay(INT32 choice); void M_SetGuestReplay(INT32 choice); void M_TimeAttackTick(void); +boolean M_EncoreAttackTogglePermitted(void); boolean M_TimeAttackInputs (INT32 choice); // MP selection diff --git a/src/k_menudraw.c b/src/k_menudraw.c index f7a808c73..3eba56d73 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -3530,19 +3530,20 @@ void M_DrawTimeAttack(void) K_drawKartTimestamp(timerec, 162+t, timeheight+6, 0, 1); // SPB Attack control hint + menu overlay - if (levellist.newgametype == GT_RACE && levellist.levelsearch.timeattack == true && M_SecretUnlocked(SECRET_SPBATTACK, true)) { INT32 buttonx = 162 + t; INT32 buttony = timeheight; - K_drawButtonAnim(buttonx + 35, buttony - 3, V_SNAPTOLEFT, kp_button_r, timeattackmenu.ticker); + if (M_EncoreAttackTogglePermitted()) + { + K_drawButtonAnim(buttonx + 35, buttony - 3, V_SNAPTOLEFT, kp_button_r, timeattackmenu.ticker); + } if ((timeattackmenu.spbflicker == 0 || timeattackmenu.ticker % 2) == (cv_dummyspbattack.value == 1)) { V_DrawMappedPatch(buttonx + 7, buttony - 1, 0, W_CachePatchName("K_SPBATK", PU_CACHE), R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_RED, GTC_MENUCACHE)); } } - } else opty = 80; diff --git a/src/menus/play-local-race-time-attack.c b/src/menus/play-local-race-time-attack.c index 3b5a3469e..c8395c26c 100644 --- a/src/menus/play-local-race-time-attack.c +++ b/src/menus/play-local-race-time-attack.c @@ -22,13 +22,21 @@ void M_TimeAttackTick(void) } } +boolean M_EncoreAttackTogglePermitted(void) +{ + if ((gametypes[levellist.newgametype]->rules & GTR_ENCORE) == 0) //levellist.newgametype != GT_RACE + return false; + + return M_SecretUnlocked(SECRET_SPBATTACK, true); +} + boolean M_TimeAttackInputs(INT32 ch) { const UINT8 pid = 0; const boolean buttonR = M_MenuButtonPressed(pid, MBT_R); (void) ch; - if (buttonR && levellist.newgametype == GT_RACE && M_SecretUnlocked(SECRET_SPBATTACK, true)) + if (buttonR && M_EncoreAttackTogglePermitted()) { CV_AddValue(&cv_dummyspbattack, 1); timeattackmenu.spbflicker = TICRATE/6; @@ -348,7 +356,7 @@ void CV_SPBAttackChanged(void) /*else if (PLAY_TimeAttackDef.lastOn == ta_ghosts) PLAY_TimeAttackDef.lastOn = ta_start;*/ - if ((active & 8) && levellist.newgametype == GT_RACE && M_SecretUnlocked(SECRET_SPBATTACK, true)) + if ((active & 8) && M_EncoreAttackTogglePermitted()) { PLAY_TAReplay[tareplay_header].status = IT_HEADER; PLAY_TAReplay[tareplay_header].text = cv_dummyspbattack.value ? "SPB Attack..." : "Time Attack..."; @@ -381,9 +389,19 @@ void M_PrepareTimeAttack(boolean menuupdate) } } - if (levellist.levelsearch.timeattack == false || levellist.newgametype != GT_RACE || !M_SecretUnlocked(SECRET_SPBATTACK, true)) + if (cv_dummyspbattack.value + && (levellist.levelsearch.timeattack == false || !M_EncoreAttackTogglePermitted())) + { CV_StealthSetValue(&cv_dummyspbattack, 0); + if (!menuupdate) + { + timeattackmenu.spbflicker = TICRATE/6; + S_StartSound(NULL, sfx_s3k92); + S_StopSoundByID(NULL, sfx_s3k9f); + } + } + // Menu options / Time-sticker medals CV_SPBAttackChanged(); } @@ -554,7 +572,10 @@ void M_StartTimeAttack(INT32 choice) if (cv_dummyspbattack.value) { - modeattacking |= ATTACKING_SPB; + if (levellist.newgametype == GT_RACE) + { + modeattacking |= ATTACKING_SPB; + } modeprefix = "spb-"; } @@ -598,7 +619,7 @@ void M_StartTimeAttack(INT32 choice) restoreMenu = &PLAY_TimeAttackDef; M_ClearMenus(true); - D_MapChange(levellist.choosemap+1, levellist.newgametype, (cv_dummygpencore.value == 1), 1, 1, false, false); + D_MapChange(levellist.choosemap+1, levellist.newgametype, (cv_dummyspbattack.value == 1), 1, 1, false, false); G_UpdateTimeStickerMedals(levellist.choosemap, true); } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index bd3ab8ef8..9e9e46998 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -7791,7 +7791,7 @@ static void P_LoadRecordGhosts(void) gpath = Z_StrDup(va("%s" PATHSEP "media" PATHSEP "replay" PATHSEP "%s" PATHSEP "%s", srb2home, timeattackfolder, G_BuildMapName(gamemap))); - if (modeattacking & ATTACKING_SPB) + if (encoremode) modeprefix = "spb-"; enum @@ -8294,7 +8294,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 && !demo.rewinding) + else if (encoremode && !prevencoremode && modeattacking == ATTACKING_NONE && !demo.rewinding) { if (rendermode != render_none) {