aboutsummaryrefslogtreecommitdiff
path: root/engines/mohawk/myst_state.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/mohawk/myst_state.cpp')
-rw-r--r--engines/mohawk/myst_state.cpp71
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;