From ce085c3f66ca88e9d57c236f120094313528adf1 Mon Sep 17 00:00:00 2001 From: toaster Date: Fri, 17 Nov 2023 16:54:33 +0000 Subject: [PATCH] failedtutorialchallenge -> enteredtutorialchallenge Track ENTERING the challenge, instead of when you fail it Allows for system-level ironclad prevention against multiple tutorial challenge runs on the same gamedata --- src/g_game.c | 17 ++++++++++------- src/m_cond.c | 2 +- src/m_cond.h | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index bed354997..4c34f1c49 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -4207,7 +4207,8 @@ static void G_DoCompleted(void) if (tutorialchallenge == TUTORIALSKIP_INPROGRESS) { if ( - players[consoleplayer].position != 1 + !legitimateexit + || players[consoleplayer].position != 1 || !players[consoleplayer].exiting || (players[consoleplayer].pflags & PF_NOCONTEST) ) @@ -4216,8 +4217,6 @@ static void G_DoCompleted(void) tutorialchallenge = TUTORIALSKIP_FAILED; G_SetGametype(GT_TUTORIAL); nextmapoverride = prevmap+1; - - gamedata->failedtutorialchallenge = true; } else { @@ -4312,6 +4311,7 @@ void G_NextLevel(void) if ( gametype == GT_TUTORIAL && nextmap == NEXTMAP_TUTORIALCHALLENGE + && !(gamedata && gamedata->enteredtutorialchallenge) ) { nextmap = G_MapNumber(tutorialchallengemap); @@ -4323,6 +4323,9 @@ void G_NextLevel(void) { tutorialchallenge = TUTORIALSKIP_INPROGRESS; G_SetGametype(G_GuessGametypeByTOL(mapheaderinfo[nextmap]->typeoflevel)); + + gamedata->enteredtutorialchallenge = true; + // A gamedata save will happen on successful level enter } } @@ -4529,7 +4532,7 @@ typedef enum GDEVER_KEYTUTORIAL = 1<<4, GDEVER_KEYMAJORSKIP = 1<<5, GDEVER_TUTORIALSKIP = 1<<6, - GDEVER_FAILEDTUTSKIP = 1<<7, + GDEVER_ENTERTUTSKIP = 1<<7, } gdeverdone_t; static const char *G_GameDataFolder(void) @@ -4670,7 +4673,7 @@ void G_LoadGameData(void) gamedata->chaokeytutorial = !!(everflags & GDEVER_KEYTUTORIAL); gamedata->majorkeyskipattempted = !!(everflags & GDEVER_KEYMAJORSKIP); gamedata->finishedtutorialchallenge = !!(everflags & GDEVER_TUTORIALSKIP); - gamedata->failedtutorialchallenge = !!(everflags & GDEVER_FAILEDTUTSKIP); + gamedata->enteredtutorialchallenge = !!(everflags & GDEVER_ENTERTUTSKIP); } else { @@ -5364,8 +5367,8 @@ void G_SaveGameData(void) everflags |= GDEVER_KEYMAJORSKIP; if (gamedata->finishedtutorialchallenge) everflags |= GDEVER_TUTORIALSKIP; - if (gamedata->failedtutorialchallenge) - everflags |= GDEVER_FAILEDTUTSKIP; + if (gamedata->enteredtutorialchallenge) + everflags |= GDEVER_ENTERTUTSKIP; WRITEUINT32(save.p, everflags); // 4 } diff --git a/src/m_cond.c b/src/m_cond.c index 23f8a6506..f1ae5068e 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -661,8 +661,8 @@ void M_ClearStats(void) gamedata->evercrashed = false; gamedata->chaokeytutorial = false; gamedata->majorkeyskipattempted = false; + gamedata->enteredtutorialchallenge = false; gamedata->finishedtutorialchallenge = false; - gamedata->failedtutorialchallenge = false; gamedata->musicstate = GDMUSIC_NONE; gamedata->importprofilewins = false; diff --git a/src/m_cond.h b/src/m_cond.h index b8de598d0..2b20bb769 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -364,8 +364,8 @@ struct gamedata_t boolean evercrashed; boolean chaokeytutorial; boolean majorkeyskipattempted; + boolean enteredtutorialchallenge; boolean finishedtutorialchallenge; - boolean failedtutorialchallenge; gdmusic_t musicstate; // BACKWARDS COMPAT ASSIST