1
0
mirror of https://github.com/TerryCavanagh/VVVVVV.git synced 2024-06-26 06:28:30 +02:00

Defer hardreset to end of frame in quittomenu

This fixes a bug where the wrong music can play on the title screen, as
reported by AllyTally on Discord.

The bug can be triggered by triggering a room transition right as
game.quittomenu() is called (which is easiest to achieve by placing the
player on an oscillating/"out of bounds" room border in a custom level
so they go back and forth between two rooms every frame, and triggering
gamestate 1013, which starts a fadeout to menu if all custom crewmates
are rescued).

When this happens, game.quittomenu() calls script.hardreset(), but the
rest of the frame still executes, even though we set game.gamestate to
TITLEMODE too (because game.quittomenu() was called by
game.updatestate() which was called by gamelogic(), and game.gamestate
is only checked at the start of the frame). This ends up triggering a
room transition, and since map.custommode is guaranteed to now be off
(because of script.hardreset()), the main game music area code kicks in,
and plays something that isn't Presenting VVVVVV.

The bug here is that we're resetting too early when we still have the
rest of an in-game frame to execute. So, instead, we should only reset
at the end of the frame, and this can be achieved with a defer callback.
This commit is contained in:
Misa 2023-05-18 19:11:04 -07:00
parent 474cdc092e
commit dea77e98fa

View File

@ -7145,6 +7145,11 @@ bool Game::save_exists(void)
return telesummary != "" || quicksummary != "";
}
static void hardreset(void)
{
script.hardreset();
}
void Game::quittomenu(void)
{
gamestate = TITLEMODE;
@ -7204,7 +7209,9 @@ void Game::quittomenu(void)
{
createmenu(Menu::mainmenu);
}
script.hardreset();
/* We might not be at the end of the frame yet.
* If we hardreset() now, some state might still persist. */
DEFER_CALLBACK(hardreset);
}
void Game::returntolab(void)