diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/pegasus/pegasus.cpp | 59 | ||||
-rw-r--r-- | engines/pegasus/pegasus.h | 3 |
2 files changed, 56 insertions, 6 deletions
diff --git a/engines/pegasus/pegasus.cpp b/engines/pegasus/pegasus.cpp index 5e7d188d7b..da2f09e6c5 100644 --- a/engines/pegasus/pegasus.cpp +++ b/engines/pegasus/pegasus.cpp @@ -306,7 +306,7 @@ void PegasusEngine::runIntro() { delete video; } -void PegasusEngine::showLoadDialog() { +Common::Error PegasusEngine::showLoadDialog() { GUI::SaveLoadChooser slc(_("Load game:"), _("Load")); slc.setSaveMode(false); @@ -317,10 +317,47 @@ void PegasusEngine::showLoadDialog() { int slot = slc.runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); - if (slot >= 0) - loadGameState(slot); + Common::Error result; + + if (slot >= 0) { + if (loadGameState(slot).getCode() == Common::kNoError) + result = Common::kNoError; + else + result = Common::kUnknownError; + } else { + result = Common::kUserCanceled; + } slc.close(); + + return result; +} + +Common::Error PegasusEngine::showSaveDialog() { + GUI::SaveLoadChooser slc(_("Save game:"), _("Save")); + slc.setSaveMode(true); + + Common::String gameId = ConfMan.get("gameid"); + + const EnginePlugin *plugin = 0; + EngineMan.findGame(gameId, &plugin); + + int slot = slc.runModalWithPluginAndTarget(plugin, ConfMan.getActiveDomainName()); + + Common::Error result; + + if (slot >= 0) { + if (saveGameState(slot, slc.getResultString()).getCode() == Common::kNoError) + result = Common::kNoError; + else + result = Common::kUnknownError; + } else { + result = Common::kUserCanceled; + } + + slc.close(); + + return result; } GUI::Debugger *PegasusEngine::getDebugger() { @@ -640,6 +677,8 @@ bool PegasusEngine::checkGameMenu() { } void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) { + Common::Error result; + switch (command) { case kMenuCmdStartAdventure: GameState.setWalkthroughMode(false); @@ -734,13 +773,23 @@ void PegasusEngine::doGameMenuCommand(const GameMenuCommand command) { resetIntroTimer(); break; case kMenuCmdPauseSave: - error("Save game"); + if (showSaveDialog().getCode() != Common::kUserCanceled) + pauseMenu(false); break; case kMenuCmdPauseContinue: pauseMenu(false); break; case kMenuCmdPauseRestore: - error("Load game"); + makeContinuePoint(); + result = showLoadDialog(); + + if (result.getCode() == Common::kNoError) { + // Successfully loaded, unpause the game + pauseMenu(false); + } else if (result.getCode() != Common::kUserCanceled) { + // Try to get us back to a sane state + loadFromContinuePoint(); + } break; case kMenuCmdPauseQuit: _gfx->doFadeOutSync(); diff --git a/engines/pegasus/pegasus.h b/engines/pegasus/pegasus.h index 86ba267e54..bd8f04b17b 100644 --- a/engines/pegasus/pegasus.h +++ b/engines/pegasus/pegasus.h @@ -236,11 +236,12 @@ private: void loadFromContinuePoint(); Common::ReadStream *_continuePoint; bool _saveAllowed, _loadAllowed; // It's so nice that this was in the original code already :P + Common::Error showLoadDialog(); + Common::Error showSaveDialog(); // Misc. Hotspot _returnHotspot; InputHandler *_savedHandler; - void showLoadDialog(); void showTempScreen(const Common::String &fileName); bool playMovieScaled(Video::SeekableVideoDecoder *video, uint16 x, uint16 y); void throwAwayEverything(); |