diff --git a/engines/dialogs.cpp b/engines/dialogs.cpp index 89c07ad24c4..1a077e5bf7d 100644 --- a/engines/dialogs.cpp +++ b/engines/dialogs.cpp @@ -246,14 +246,10 @@ void MainMenuDialog::load() { int slot = _loadDialog->runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); - if (slot >= 0) { - // FIXME: For now we just ignore the return - // value, which is quite bad since it could - // be a fatal loading error, which renders - // the engine unusable. - _engine->loadGameState(slot); + _engine->setGameToLoadSlot(slot); + + if (slot >= 0) close(); - } } enum { diff --git a/engines/engine.cpp b/engines/engine.cpp index dde5064dc42..b952f065add 100644 --- a/engines/engine.cpp +++ b/engines/engine.cpp @@ -96,6 +96,7 @@ Engine::Engine(OSystem *syst) _targetName(ConfMan.getActiveDomainName()), _pauseLevel(0), _pauseStartTime(0), + _saveSlotToLoad(-1), _engineStartTime(_system->getMillis()), _mainMenuDialog(NULL) { @@ -396,7 +397,22 @@ void Engine::pauseEngineIntern(bool pause) { void Engine::openMainMenuDialog() { if (!_mainMenuDialog) _mainMenuDialog = new MainMenuDialog(this); + + setGameToLoadSlot(-1); + runDialog(*_mainMenuDialog); + + // Load savegame after main menu execution + // (not from inside the menu loop to avoid + // mouse cursor glitches and simliar bugs, + // e.g. #2822778). + // FIXME: For now we just ignore the return + // value, which is quite bad since it could + // be a fatal loading error, which renders + // the engine unusable. + if (_saveSlotToLoad > 0) + loadGameState(_saveSlotToLoad); + syncSoundSettings(); } @@ -437,6 +453,10 @@ int Engine::runDialog(GUI::Dialog &dialog) { return result; } +void Engine::setGameToLoadSlot(int slot) { + _saveSlotToLoad = slot; +} + void Engine::syncSoundSettings() { // Sync the engine with the config manager int soundVolumeMusic = ConfMan.getInt("music_volume"); diff --git a/engines/engine.h b/engines/engine.h index 06b7f7deddb..2796df5c4f2 100644 --- a/engines/engine.h +++ b/engines/engine.h @@ -82,6 +82,13 @@ private: */ int32 _engineStartTime; + /** + * Save slot selected via global main menu. + * This slot will be loaded after main menu execution (not from inside + * the menu loop, to avoid bugs like #2822778). + */ + int _saveSlotToLoad; + public: @@ -185,6 +192,15 @@ public: */ virtual Common::Error loadGameState(int slot); + /** + * Sets the game slot for a savegame to be loaded after global + * main menu execution. This is to avoid loading a savegame from + * inside the menu loop which causes bugs like #2822778. + * + * @param slot the slot from which a savestate should be loaded. + */ + void setGameToLoadSlot(int slot); + /** * Indicates whether a game state can be loaded. */