Prevent other cases of losing unsaved levels by returning to menu

2.3 already made it so that if you ran the `rollcredits` command during
in-editor playtesting, you wouldn't be returned to the title screen
while losing unsaved level changes. But there are plenty of other ways
to go back to the title screen from in-editor playtesting too. Namely,
gamestate 1015 (the gamestate after completing a level) and 82 (time
trial complete).

So just add the appropriate checks to those gamestates, and add a
catch-all check in Game::quittomenu(). Additionally,
Game::updatecustomlevelstats() should not update custom level stats
during in-editor playtesting (otherwise it would still happen even if
the game didn't bring you back to the title screen).

Editor notes will also be shown if the game prevents you from going to
the title screen.

Also, just to make things clear, I also added a level note for when the
level is completed during in-editor playtesting. This is just to make it
clear in cases where it might not be obvious that the game returned you
to the editor for this reason. E.g. you have a terminal that calls
gamestate(1013) in a level with 0 custom crewmates, but when you
activate it, it looks like the terminal didn't work for some reason and
just brought you back to the editor. But that's just only because you
literally just completed the level.
This commit is contained in:
Misa
2023-05-18 19:58:23 -07:00
parent dea77e98fa
commit 24ef59c65e
13 changed files with 71 additions and 0 deletions

View File

@@ -442,6 +442,12 @@ void Game::clearcustomlevelstats(void)
void Game::updatecustomlevelstats(std::string clevel, int cscore)
{
if (!map.custommodeforreal)
{
/* We are playtesting, don't update level stats */
return;
}
if (clevel.find("levels/") != std::string::npos)
{
clevel = clevel.substr(7);
@@ -1573,6 +1579,14 @@ void Game::updatestate(void)
case 82:
//Time Trial Complete!
obj.removetrigger(82);
#if !defined(NO_CUSTOM_LEVELS) && !defined(NO_EDITOR)
if (map.custommode && !map.custommodeforreal)
{
returntoeditor();
ed.show_note(loc::gettext("Time trial completed"));
break;
}
#endif
if (translator_exploring)
{
translator_exploring_allowtele = true;
@@ -2151,6 +2165,7 @@ void Game::updatestate(void)
else
{
returntoeditor();
ed.show_note(loc::gettext("Level completed"));
}
#endif
}
@@ -7150,8 +7165,28 @@ static void hardreset(void)
script.hardreset();
}
#if !defined(NO_CUSTOM_LEVELS) && !defined(NO_EDITOR)
static void returntoeditor_callback(void)
{
extern Game game;
game.returntoeditor();
ed.show_note(loc::gettext("Level quits to menu"));
}
#endif
void Game::quittomenu(void)
{
#if !defined(NO_CUSTOM_LEVELS) && !defined(NO_EDITOR)
if (map.custommode && !map.custommodeforreal)
{
/* We are playtesting! Go back to the editor
* instead of losing unsaved changes. */
/* This needs to be deferred, otherwise some state would persist. */
DEFER_CALLBACK(returntoeditor_callback);
return;
}
#endif
gamestate = TITLEMODE;
graphics.fademode = FADE_START_FADEIN;
FILESYSTEM_unmountAssets();