From 107acf34d3db7382ec0b5b29ebb846b8f39db4f0 Mon Sep 17 00:00:00 2001 From: toaster Date: Tue, 14 Mar 2023 12:28:52 +0000 Subject: [PATCH] Fix some softlock circumstances caused by the Chao Key system - Nonzero keys pending, but zero pending rounds - Nonzero keys pending, but too many keys already earned --- src/m_cond.c | 9 +++++++-- src/menus/extras-challenges.c | 6 +++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/m_cond.c b/src/m_cond.c index c0d40ed5e..7404bb0ac 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -1569,7 +1569,12 @@ boolean M_UpdateUnlockablesAndExtraEmblems(boolean loud, boolean doall) { response = M_CheckUnlockConditions(NULL); - while ((gamedata->keyspending + gamedata->chaokeys + gamedata->usedkeys) < GDMAX_CHAOKEYS + if (gamedata->pendingkeyrounds == 0 + || ((gamedata->chaokeys + gamedata->usedkeys) >= GDMAX_CHAOKEYS)) + { + gamedata->keyspending = 0; + } + else while ((gamedata->keyspending + gamedata->chaokeys + gamedata->usedkeys) < GDMAX_CHAOKEYS && ((gamedata->pendingkeyrounds + gamedata->pendingkeyroundoffset)/GDCONVERT_ROUNDSTOKEY) > gamedata->keyspending) { gamedata->keyspending++; @@ -1662,7 +1667,7 @@ UINT16 M_GetNextAchievedUnlock(void) return i; } - if (gamedata->keyspending > 0) + if (gamedata->keyspending != 0) { return PENDING_CHAOKEYS; } diff --git a/src/menus/extras-challenges.c b/src/menus/extras-challenges.c index 66093e0c2..05481d8e5 100644 --- a/src/menus/extras-challenges.c +++ b/src/menus/extras-challenges.c @@ -334,13 +334,17 @@ void M_ChallengesTick(void) ; // recreate the slight delay the unlock fades provide else if (gamedata->pendingkeyrounds == 0) { + gamedata->keyspending = 0; + gamedata->pendingkeyroundoffset %= GDCONVERT_ROUNDSTOKEY; + challengesmenu.chaokeyadd = false; challengesmenu.requestnew = true; } else if ((gamedata->chaokeys + gamedata->usedkeys) >= GDMAX_CHAOKEYS) { - gamedata->keyspending = 0; + // The above condition will run on the next tic because of this set gamedata->pendingkeyrounds = 0; + gamedata->pendingkeyroundoffset = 0; } else {