diff options
Diffstat (limited to 'engines/mohawk/myst_state.cpp')
-rw-r--r-- | engines/mohawk/myst_state.cpp | 71 |
1 files changed, 58 insertions, 13 deletions
diff --git a/engines/mohawk/myst_state.cpp b/engines/mohawk/myst_state.cpp index 213a976413..c65ece55d5 100644 --- a/engines/mohawk/myst_state.cpp +++ b/engines/mohawk/myst_state.cpp @@ -41,10 +41,11 @@ MystSaveMetadata::MystSaveMetadata() { saveHour = 0; saveMinute = 0; totalPlayTime = 0; + autoSave = false; } bool MystSaveMetadata::sync(Common::Serializer &s) { - static const Common::Serializer::Version kCurrentVersion = 1; + static const Common::Serializer::Version kCurrentVersion = 2; if (!s.syncVersion(kCurrentVersion)) { return false; @@ -57,10 +58,13 @@ bool MystSaveMetadata::sync(Common::Serializer &s) { s.syncAsByte(saveMinute); s.syncString(saveDescription); s.syncAsUint32LE(totalPlayTime); + s.syncAsByte(autoSave, 2); return true; } +const int MystGameState::kAutoSaveSlot = 0; + MystGameState::MystGameState(MohawkEngine_Myst *vm, Common::SaveFileManager *saveFileMan) : _vm(vm), _saveFileMan(saveFileMan) { // Most of the variables are zero at game start. memset(&_globals, 0, sizeof(_globals)); @@ -78,8 +82,10 @@ MystGameState::MystGameState(MohawkEngine_Myst *vm, Common::SaveFileManager *sav // Unknown _globals.u0 = 2; // Current Age / Stack - Start in Myst - _globals.currentAge = 7; + _globals.currentAge = kMystStart; + _globals.heldPage = kNoPage; _globals.u1 = 1; + _globals.ending = kDniNotVisited; // Library Bookcase Door - Default to Up _myst.libraryBookcaseDoor = 1; @@ -121,13 +127,13 @@ bool MystGameState::load(int slot) { // Set our default cursor _vm->_cursor->showCursor(); - if (_globals.heldPage == 0 || _globals.heldPage > 13) + if (_globals.heldPage == kNoPage) _vm->setMainCursor(kDefaultMystCursor); - else if (_globals.heldPage < 7) + else if (_globals.heldPage < kRedLibraryPage) //A blue page is held _vm->setMainCursor(kBluePageCursor); - else if (_globals.heldPage < 13) + else if (_globals.heldPage < kWhitePage) //A red page is held _vm->setMainCursor(kRedPageCursor); - else // if (globals.heldPage == 13) + else _vm->setMainCursor(kWhitePageCursor); return true; @@ -178,12 +184,12 @@ void MystGameState::loadMetadata(int slot) { delete metadataFile; } -bool MystGameState::save(int slot, const Common::String &desc) { +bool MystGameState::save(int slot, const Common::String &desc, bool autoSave) { if (!saveState(slot)) { return false; } - updateMetadateForSaving(desc); + updateMetadateForSaving(desc, autoSave); return saveMetadata(slot); } @@ -214,7 +220,7 @@ Common::String MystGameState::buildMetadataFilename(int slot) { return Common::String::format("myst-%03d.mym", slot); } -void MystGameState::updateMetadateForSaving(const Common::String &desc) { +void MystGameState::updateMetadateForSaving(const Common::String &desc, bool autoSave) { // Update save creation info TimeDate t; g_system->getTimeAndDate(t); @@ -225,6 +231,7 @@ void MystGameState::updateMetadateForSaving(const Common::String &desc) { _metadata.saveMinute = t.tm_min; _metadata.saveDescription = desc; _metadata.totalPlayTime = _vm->getTotalPlayTime(); + _metadata.autoSave = autoSave; } bool MystGameState::saveMetadata(int slot) { @@ -249,12 +256,43 @@ bool MystGameState::saveMetadata(int slot) { return true; } +bool MystGameState::isAutoSaveAllowed() { + // Open autosave slot and see if it an autosave + // Autosaving will be enabled if it is an autosave or if there is no save in that slot + + Common::String dataFilename = buildSaveFilename(kAutoSaveSlot); + Common::ScopedPtr<Common::InSaveFile> dataFile(g_system->getSavefileManager()->openForLoading(dataFilename)); + if (!dataFile) { // Cannot load non-meta file, enable autosave + return true; + } + + Common::String metaFilename = buildMetadataFilename(kAutoSaveSlot); + Common::ScopedPtr<Common::InSaveFile> metadataFile(g_system->getSavefileManager()->openForLoading(metaFilename)); + if (!metadataFile) { // Can load non-meta file, but not metafile, could be a save from the original, disable autosave + return false; + } + + Common::Serializer m(metadataFile.get(), nullptr); + + // Read the metadata file + Mohawk::MystSaveMetadata metadata; + if (!metadata.sync(m)) { // the save in the autosave slot is corrupted, enable autosave + return true; + } + + return metadata.autoSave; +} + SaveStateDescriptor MystGameState::querySaveMetaInfos(int slot) { // Open the metadata file Common::String filename = buildMetadataFilename(slot); Common::InSaveFile *metadataFile = g_system->getSavefileManager()->openForLoading(filename); + + SaveStateDescriptor desc; + desc.setWriteProtectedFlag(slot == kAutoSaveSlot); + if (!metadataFile) { - return SaveStateDescriptor(); + return desc; } Common::Serializer m(metadataFile, nullptr); @@ -263,16 +301,23 @@ SaveStateDescriptor MystGameState::querySaveMetaInfos(int slot) { Mohawk::MystSaveMetadata metadata; if (!metadata.sync(m)) { delete metadataFile; - return SaveStateDescriptor(); + return desc; } // Set the save description - SaveStateDescriptor desc; desc.setDescription(metadata.saveDescription); desc.setSaveDate(metadata.saveYear, metadata.saveMonth, metadata.saveDay); desc.setSaveTime(metadata.saveHour, metadata.saveMinute); desc.setPlayTime(metadata.totalPlayTime); - desc.setThumbnail(Graphics::loadThumbnail(*metadataFile)); + if (metadata.autoSave) // Allow non-saves to be deleted, but not autosaves + desc.setDeletableFlag(slot != kAutoSaveSlot); + + Graphics::Surface *thumbnail; + if (!Graphics::loadThumbnail(*metadataFile, thumbnail)) { + delete metadataFile; + return desc; + } + desc.setThumbnail(thumbnail); delete metadataFile; |