[Scummvm-git-logs] scummvm master -> 3ce1364a0069cc0fa000c21d7ecc77d9599fe120

sev- noreply at scummvm.org
Mon Mar 24 05:58:57 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
3ce1364a00 MACVENTURE: Fix save file loading


Commit: 3ce1364a0069cc0fa000c21d7ecc77d9599fe120
    https://github.com/scummvm/scummvm/commit/3ce1364a0069cc0fa000c21d7ecc77d9599fe120
Author: cmd05 (splendid.snippet670 at slmail.me)
Date: 2025-03-24T13:58:53+08:00

Commit Message:
MACVENTURE: Fix save file loading

Changed paths:
    engines/macventure/detection.cpp
    engines/macventure/metaengine.cpp
    engines/macventure/saveload.cpp


diff --git a/engines/macventure/detection.cpp b/engines/macventure/detection.cpp
index cdd496ec0de..43a6dfe6958 100644
--- a/engines/macventure/detection.cpp
+++ b/engines/macventure/detection.cpp
@@ -80,8 +80,6 @@ static const PlainGameDescriptor macventureGames[] = {
 
 namespace MacVenture {
 
-SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot, bool skipThumbnail = true);
-
 class MacVentureMetaEngineDetection : public AdvancedMetaEngineDetection<ADGameDescription> {
 public:
 	MacVentureMetaEngineDetection() : AdvancedMetaEngineDetection(MacVenture::gameDescriptions, macventureGames) {
diff --git a/engines/macventure/metaengine.cpp b/engines/macventure/metaengine.cpp
index c0b62c69807..aee390c6a3b 100644
--- a/engines/macventure/metaengine.cpp
+++ b/engines/macventure/metaengine.cpp
@@ -37,8 +37,6 @@ const char *MacVentureEngine::getGameFileName() const {
 
 namespace MacVenture {
 
-SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot, bool skipThumbnail = true);
-
 class MacVentureMetaEngine : public AdvancedMetaEngine<ADGameDescription> {
 public:
 	const char *getName() const override {
@@ -48,11 +46,7 @@ public:
 protected:
 	Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
 	bool hasFeature(MetaEngineFeature f) const override;
-	SaveStateList listSaves(const char *target) const override;
 	int getMaximumSaveSlot() const override;
-	bool removeSaveState(const char *target, int slot) const override;
-	SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
-
 };
 
 bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
@@ -64,7 +58,8 @@ bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
 		(f == kSavesSupportThumbnail) ||
 		(f == kSavesSupportCreationDate) ||
 		(f == kSimpleSavesNames) ||
-		(f == kSavesSupportPlayTime);
+		(f == kSavesSupportPlayTime) ||
+		(f == kSavesUseExtendedFormat);
 }
 
 bool MacVentureEngine::hasFeature(EngineFeature f) const {
@@ -74,38 +69,6 @@ bool MacVentureEngine::hasFeature(EngineFeature f) const {
 		(f == kSupportsSavingDuringRuntime);
 }
 
-SaveStateList MacVentureMetaEngine::listSaves(const char *target) const {
-	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
-	Common::StringArray filenames;
-	Common::String pattern = target;
-	pattern += ".###";
-
-	filenames = saveFileMan->listSavefiles(pattern);
-
-	SaveStateList saveList;
-	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
-		int slotNum = atoi(file->c_str() + file->size() - 3);
-		SaveStateDescriptor desc(this, slotNum, Common::U32String());
-		if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) {
-			Common::InSaveFile *in = saveFileMan->openForLoading(*file);
-			if (in) {
-				desc = loadMetaData(in, slotNum);
-				if (desc.getSaveSlot() != slotNum) {
-					// invalid
-					delete in;
-					continue;
-				}
-				saveList.push_back(desc);
-				delete in;
-			}
-		}
-	}
-
-	// Sort saves based on slot number.
-	Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator());
-	return saveList;
-}
-
 int MacVentureMetaEngine::getMaximumSaveSlot() const { return 999; }
 
 Common::Error MacVentureMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *game) const {
@@ -113,34 +76,6 @@ Common::Error MacVentureMetaEngine::createInstance(OSystem *syst, Engine **engin
 	return Common::kNoError;
 }
 
-bool MacVentureMetaEngine::removeSaveState(const char *target, int slot) const {
-	return g_system->getSavefileManager()->removeSavefile(Common::String::format("%s.%03d", target, slot));
-}
-
-
-SaveStateDescriptor MacVentureMetaEngine::querySaveMetaInfos(const char *target, int slot) const {
-	Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
-	SaveStateDescriptor desc;
-	Common::String saveFileName;
-	Common::String pattern = target;
-	pattern += ".###";
-	Common::StringArray filenames = saveFileMan->listSavefiles(pattern);
-	for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
-		int slotNum = atoi(file->c_str() + file->size() - 3);
-		if (slotNum == slot) {
-			saveFileName = *file;
-		}
-	}
-
-	Common::InSaveFile *in = saveFileMan->openForLoading(saveFileName);
-	if (in) {
-		desc = loadMetaData(in, slot, false);
-		delete in;
-		return desc;
-	}
-	return SaveStateDescriptor();
-}
-
 } // End of namespace MacVenture
 
 #if PLUGIN_ENABLED_DYNAMIC(MACVENTURE)
diff --git a/engines/macventure/saveload.cpp b/engines/macventure/saveload.cpp
index d1e9aff34a5..7fad4d71be9 100644
--- a/engines/macventure/saveload.cpp
+++ b/engines/macventure/saveload.cpp
@@ -37,130 +37,43 @@
 
 namespace MacVenture {
 
-#define MACVENTURE_SAVE_HEADER MKTAG('M', 'V', 'S', 'S') // (M)ac(V)enture (S)cummVM (S)ave (0x4d565353, uint32)
-#define MACVENTURE_SAVE_VERSION 1 //1 BYTE
-#define MACVENTURE_DESC_LENGTH 4 //4 BYTE for the metadata length
-
-SaveStateDescriptor loadMetaData(Common::SeekableReadStream *s, int slot, bool skipThumbnail) {
-	// Metadata is stored at the end of the file
-	// |THUMBNAIL						|
-	// |								|
-	// |DESCSIZE| DESCRIPTION			|
-	// |HEADER			|VERSION|DESCLEN|
-	s->seek(-(5 + MACVENTURE_DESC_LENGTH), SEEK_END);
-	uint32 sig = s->readUint32BE();
-	byte version = s->readByte();
-
-	SaveStateDescriptor desc;	// init to an invalid save slot
-
-	if (sig != MACVENTURE_SAVE_HEADER || version > MACVENTURE_SAVE_VERSION)
-		return desc;
-
-	// Save is valid, set its slot number
-	desc.setSaveSlot(slot);
-
-	// Depends on MACVENTURE_DESC_LENGTH
-	uint32 metaSize = s->readUint32BE();
-	s->seek(-((int32)(5 + MACVENTURE_DESC_LENGTH + metaSize)), SEEK_END);
-
-	// Load the thumbnail
-	Graphics::Surface *thumbnail;
-	if (!Graphics::loadThumbnail(*s, thumbnail, skipThumbnail)) {
-		return desc;
-	}
-	desc.setThumbnail(thumbnail);
-
-	// Load the description
-	Common::String name;
-	uint32 descSize = s->readUint32BE();
-	for (uint32 i = 0; i < descSize; ++i) {
-		name += s->readByte();
-	}
-	desc.setDescription(name);
-
-	// Load date
-	uint32 saveDate = s->readUint32LE();
-	int day = (saveDate >> 24) & 0xFF;
-	int month = (saveDate >> 16) & 0xFF;
-	int year = saveDate & 0xFFFF;
-	desc.setSaveDate(year, month, day);
-
-	uint16 saveTime = s->readUint16LE();
-	int hour = (saveTime >> 8) & 0xFF;
-	int minutes = saveTime & 0xFF;
-	desc.setSaveTime(hour, minutes);
+Common::Error MacVentureEngine::loadGameState(int slot) {
+	Common::Error res = Common::kReadingFailed;
+	saveAutosaveIfEnabled();
 
-	// Load playtime
-	uint32 playTime = s->readUint32LE();
-	desc.setPlayTime(playTime * 1000);
+	Common::InSaveFile *saveFile = _saveFileMan->openForLoading(getSaveStateName(slot));
 
-	return desc;
-}
+	if (!saveFile)
+		return res;
 
-uint saveCurrentDate(Common::OutSaveFile *file) {
-	TimeDate curTime;
-	g_system->getTimeAndDate(curTime);
-
-	uint32 saveDate = ((curTime.tm_mday & 0xFF) << 24) | (((curTime.tm_mon + 1) & 0xFF) << 16) | ((curTime.tm_year + 1900) & 0xFFFF);
-	uint16 saveTime = ((curTime.tm_hour & 0xFF) << 8) | ((curTime.tm_min) & 0xFF);
+	_world->loadGameFrom(saveFile);
+	reset();
 
-	file->writeUint32LE(saveDate);
-	file->writeUint16LE(saveTime);
+	ExtendedSavegameHeader header;
+	if (MetaEngine::readSavegameHeader(saveFile, &header))
+		setTotalPlayTime(header.playtime);
 
-	// Return the number of bytes occupied
-	return 6;
-}
+	res = Common::kNoError;
 
-uint savePlayTime(Common::OutSaveFile *file) {
-	uint32 playTime = g_engine->getTotalPlayTime() / 1000;
-	file->writeUint32LE(playTime);
-	// Return the number of bytes occupied
-	return 4;
+	delete saveFile;
+	return res;
 }
 
-void writeMetaData(Common::OutSaveFile *file, Common::String desc) {
-
-	// Write thumbnail
-	uint thumbSize = file->pos();
-	Graphics::saveThumbnail(*file);
-	thumbSize = file->pos() - thumbSize;
-
-	// Write description
-	file->writeUint32BE(desc.size());
-	file->writeString(desc);
-
-	uint dateSize = saveCurrentDate(file);
-	uint playTimeSize = savePlayTime(file);
+Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
+	Common::String saveFileName = getSaveStateName(slot);
+	Common::OutSaveFile *saveFile = getSaveFileManager()->openForSaving(saveFileName);
 
-	file->writeUint32BE(MACVENTURE_SAVE_HEADER);
-	file->writeByte(MACVENTURE_SAVE_VERSION);
-	file->writeUint32BE(4 + desc.size() + dateSize + playTimeSize + thumbSize);
-}
+	if (!saveFile)
+		return Common::kWritingFailed;
 
-Common::Error MacVentureEngine::loadGameState(int slot) {
-	Common::String saveFileName = getSaveStateName(slot);
-	Common::InSaveFile *file;
-	if (!(file = Common::MacResManager::openFileOrDataFork(Common::Path(saveFileName)))) {
-		error("ENGINE: Missing savegame file %s", saveFileName.c_str());
-	}
-	_world->loadGameFrom(file);
-	reset();
-	return Common::kNoError;
-}
+	_world->saveGameInto(saveFile);
+	getMetaEngine()->appendExtendedSave(saveFile, getTotalPlayTime(), desc, isAutosave);
 
-Common::Error MacVentureEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
-	Common::String saveFileName = getSaveStateName(slot);
-	Common::SaveFileManager *manager = getSaveFileManager();
-	// HACK Get a real name!
-	Common::OutSaveFile *file = manager->openForSaving(saveFileName);
-	_world->saveGameInto(file);
-	writeMetaData(file, desc);
-
-	file->finalize();
-	if (file->err()) {
+	saveFile->finalize();
+	if (saveFile->err())
 		warning("Could not save '%s' correctly.", saveFileName.c_str());
-	}
-	delete file;
+
+	delete saveFile;
 	return Common::kNoError;
 }
 




More information about the Scummvm-git-logs mailing list