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
This commit is contained in:
toaster 2023-03-14 12:28:52 +00:00
parent 5b48c52b65
commit 107acf34d3
2 changed files with 12 additions and 3 deletions

View file

@ -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;
}

View file

@ -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
{