From 88d41f6721100a7fa84247363fcefebcf187ce87 Mon Sep 17 00:00:00 2001 From: toaster Date: Wed, 14 Dec 2022 20:18:53 +0000 Subject: [PATCH] SECRET_ALTTITLE My final indulgence for this branch. One cvar that swaps a patch --- src/d_netcmd.c | 15 +++++++++++++++ src/d_netcmd.h | 3 ++- src/deh_soc.c | 2 ++ src/f_finale.c | 9 ++++++++- src/k_menudraw.c | 7 +++++++ src/k_menufunc.c | 20 ++++++++++++++++++++ src/m_cond.h | 1 + 7 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 5b76aa16d..6cf24aedb 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -466,6 +466,7 @@ consvar_t cv_autobalance = CVAR_INIT ("autobalance", "Off", CV_SAVE|CV_NETVAR|CV consvar_t cv_teamscramble = CVAR_INIT ("teamscramble", "Off", CV_SAVE|CV_NETVAR|CV_CALL|CV_NOINIT, teamscramble_cons_t, TeamScramble_OnChange); consvar_t cv_scrambleonchange = CVAR_INIT ("scrambleonchange", "Off", CV_SAVE|CV_NETVAR, teamscramble_cons_t, NULL); +consvar_t cv_alttitle = CVAR_INIT ("alttitle", "Off", CV_CALL|CV_NOSHOWHELP|CV_NOINIT|CV_SAVE, CV_OnOff, AltTitle_OnChange); consvar_t cv_itemfinder = CVAR_INIT ("itemfinder", "Off", CV_CALL|CV_NOSHOWHELP, CV_OnOff, ItemFinder_OnChange); // Scoring type options @@ -938,6 +939,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_mindelay); // HUD + CV_RegisterVar(&cv_alttitle); CV_RegisterVar(&cv_itemfinder); CV_RegisterVar(&cv_showinputjoy); @@ -4843,6 +4845,19 @@ FUNCNORETURN static ATTRNORETURN void Command_Quit_f(void) I_Quit(); } +void AltTitle_OnChange(void) +{ + if (!cv_alttitle.value) + return; // it's fine. + + if (!M_SecretUnlocked(SECRET_ALTTITLE, true)) + { + CONS_Printf(M_GetText("You haven't earned this yet.\n")); + CV_StealthSetValue(&cv_itemfinder, 0); + return; + } +} + void ItemFinder_OnChange(void) { if (!cv_itemfinder.value) diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 3f4d00645..eda2d565c 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -123,7 +123,7 @@ extern consvar_t cv_kartdebugnodes, cv_kartdebugcolorize, cv_kartdebugdirector; extern consvar_t cv_spbtest, cv_gptest, cv_reducevfx; extern consvar_t cv_kartdebugwaypoints, cv_kartdebugbotpredict; -extern consvar_t cv_itemfinder; +extern consvar_t cv_alttitle, cv_itemfinder; extern consvar_t cv_inttime, cv_advancemap; extern consvar_t cv_overtime; @@ -267,6 +267,7 @@ boolean IsPlayerAdmin(INT32 playernum); void SetAdminPlayer(INT32 playernum); void ClearAdminPlayers(void); void RemoveAdminPlayer(INT32 playernum); +void AltTitle_OnChange(void); void ItemFinder_OnChange(void); void D_SetPassword(const char *pw); diff --git a/src/deh_soc.c b/src/deh_soc.c index a7726200c..3d9bf9b42 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -2269,6 +2269,8 @@ void readunlockable(MYFILE *f, INT32 num) unlockables[num].type = SECRET_BREAKTHECAPSULES; else if (fastcmp(word2, "SOUNDTEST")) unlockables[num].type = SECRET_SOUNDTEST; + else if (fastcmp(word2, "ALTTITLE")) + unlockables[num].type = SECRET_ALTTITLE; else if (fastcmp(word2, "ITEMFINDER")) unlockables[num].type = SECRET_ITEMFINDER; else diff --git a/src/f_finale.c b/src/f_finale.c index 022524105..e20deae1f 100644 --- a/src/f_finale.c +++ b/src/f_finale.c @@ -1777,7 +1777,14 @@ static void F_CacheTitleScreen(void) break; // idk do we still want this? case TTMODE_RINGRACERS: - kts_bumper = W_CachePatchName("KTSBUMPR1", PU_PATCH_LOWPRIORITY); + if (!M_SecretUnlocked(SECRET_ALTTITLE, true)) + { + CV_StealthSetValue(&cv_alttitle, 0); + } + + kts_bumper = W_CachePatchName( + (cv_alttitle.value ? "KTSJUMPR1" : "KTSBUMPR1"), + PU_PATCH_LOWPRIORITY); kts_eggman = W_CachePatchName("KTSEGG01", PU_PATCH_LOWPRIORITY); kts_tails = W_CachePatchName("KTSTAL01", PU_PATCH_LOWPRIORITY); kts_tails_tails = W_CachePatchName("KTSTAL02", PU_PATCH_LOWPRIORITY); diff --git a/src/k_menudraw.c b/src/k_menudraw.c index 55c358648..a101f9516 100644 --- a/src/k_menudraw.c +++ b/src/k_menudraw.c @@ -4707,6 +4707,13 @@ static void M_DrawChallengePreview(INT32 x, INT32 y) specialmap = hardmapcache; break; } + case SECRET_ALTTITLE: + { + x = 8; + y = BASEVIDHEIGHT-16; + V_DrawGamemodeString(x, y - 32, V_ALLOWLOWERCASE, R_GetTranslationColormap(TC_RAINBOW, SKINCOLOR_PLAGUE, GTC_MENUCACHE), cv_alttitle.string); + V_DrawThinString(x, y, V_ALLOWLOWERCASE|highlightflags, "Press (A) to toggle"); + } default: { break; diff --git a/src/k_menufunc.c b/src/k_menufunc.c index 76fb8b738..f5d483bb8 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -7382,6 +7382,26 @@ boolean M_ChallengesInputs(INT32 ch) } } } + + return true; + } + + if (M_MenuConfirmPressed(pid) + && challengesmenu.currentunlock < MAXUNLOCKABLES + && gamedata->unlocked[challengesmenu.currentunlock]) + { + switch (unlockables[challengesmenu.currentunlock].type) + { + case SECRET_ALTTITLE: + CV_AddValue(&cv_alttitle, 1); + S_StartSound(NULL, sfx_s3kc3s); + M_SetMenuDelay(pid); + break; + default: + break; + } + + return true; } } diff --git a/src/m_cond.h b/src/m_cond.h index 1150b57ef..5c50146f0 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -118,6 +118,7 @@ typedef enum SECRET_TIMEATTACK, // Permit Time attack SECRET_BREAKTHECAPSULES, // Permit SP Capsules SECRET_SOUNDTEST, // Permit Sound Test + SECRET_ALTTITLE, // Permit alternate titlescreen // Assist restrictions SECRET_ITEMFINDER, // Permit locating in-level secrets