diff options
Diffstat (limited to 'engines/mohawk/riven.cpp')
-rw-r--r-- | engines/mohawk/riven.cpp | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/engines/mohawk/riven.cpp b/engines/mohawk/riven.cpp index 0bf4024057..8139c1a92f 100644 --- a/engines/mohawk/riven.cpp +++ b/engines/mohawk/riven.cpp @@ -71,6 +71,7 @@ MohawkEngine_Riven::MohawkEngine_Riven(OSystem *syst, const MohawkGameDescriptio _optionsDialog = nullptr; _card = nullptr; _inventory = nullptr; + _lastSaveTime = 0; DebugMan.addDebugChannel(kRivenDebugScript, "Script", "Track Script Execution"); DebugMan.addDebugChannel(kRivenDebugPatches, "Patches", "Track Script Patching"); @@ -240,6 +241,12 @@ void MohawkEngine_Riven::doFrame() { loadGameStateAndDisplayError(_optionsDialog->getLoadSlot()); if (_optionsDialog->getSaveSlot() >= 0) saveGameStateAndDisplayError(_optionsDialog->getSaveSlot(), _optionsDialog->getSaveDescription()); + + if (hasGameEnded()) { + // Attempt to autosave before exiting + tryAutoSaving(); + } + _gfx->setTransitionMode((RivenTransitionMode) _vars["transitionmode"]); _card->initializeZipMode(); break; @@ -281,6 +288,11 @@ void MohawkEngine_Riven::doFrame() { break; } break; + case Common::EVENT_QUIT: + case Common::EVENT_RTL: + // Attempt to autosave before exiting + tryAutoSaving(); + break; default: break; } @@ -294,6 +306,10 @@ void MohawkEngine_Riven::doFrame() { _scriptMan->runQueuedScripts(); } + if (shouldPerformAutoSave(_lastSaveTime)) { + tryAutoSaving(); + } + _inventory->onFrame(); // Update the screen once per frame @@ -575,7 +591,7 @@ void MohawkEngine_Riven::loadGameStateAndDisplayError(int slot) { } Common::Error MohawkEngine_Riven::saveGameState(int slot, const Common::String &desc) { - return _saveLoad->saveGame(slot, desc); + return _saveLoad->saveGame(slot, desc, false); } void MohawkEngine_Riven::saveGameStateAndDisplayError(int slot, const Common::String &desc) { @@ -589,6 +605,23 @@ void MohawkEngine_Riven::saveGameStateAndDisplayError(int slot, const Common::St } } +void MohawkEngine_Riven::tryAutoSaving() { + if (!canSaveGameStateCurrently()) { + return; // Can't save right now, try again on the next frame + } + + _lastSaveTime = _system->getMillis(); + + if (!_saveLoad->isAutoSaveAllowed()) { + return; // Can't autosave ever, try again after the next autosave delay + } + + Common::Error saveError = _saveLoad->saveGame(RivenSaveLoad::kAutoSaveSlot, "Autosave", true); + if (saveError.getCode() != Common::kNoError) + warning("Attempt to autosave has failed."); +} + + void MohawkEngine_Riven::addZipVisitedCard(uint16 cardId, uint16 cardNameId) { Common::String cardName = getStack()->getName(kCardNames, cardNameId); if (cardName.empty()) |