[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