diff options
-rw-r--r-- | engines/tinsel/detection.cpp | 23 | ||||
-rw-r--r-- | engines/tinsel/saveload.cpp | 21 |
2 files changed, 29 insertions, 15 deletions
diff --git a/engines/tinsel/detection.cpp b/engines/tinsel/detection.cpp index 5d10fa1e1d..8b51320a27 100644 --- a/engines/tinsel/detection.cpp +++ b/engines/tinsel/detection.cpp @@ -113,6 +113,7 @@ bool TinselMetaEngine::hasFeature(MetaEngineFeature f) const { (f == kSupportsDeleteSave) || (f == kSimpleSavesNames) || (f == kSavesSupportMetaInfo) || + (f == kSavesSupportPlayTime) || (f == kSavesSupportCreationDate); } @@ -134,16 +135,7 @@ bool Tinsel::TinselEngine::hasFeature(EngineFeature f) const { SaveStateDescriptor TinselMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::String fileName; - if (slot < 0) - return SaveStateDescriptor(); - else if (slot < 10) - fileName = Common::String::format("%s.00%d", target, slot); - else if (slot < 100) - fileName = Common::String::format("%s.0%d", target, slot); - else if (slot < 1000) - fileName = Common::String::format("%s.%d", target, slot); - else - warning("Too many slots!"); + fileName = Common::String::format("%s.%03u", target, slot); Common::InSaveFile *file = g_system->getSavefileManager()->openForLoading(fileName); @@ -153,7 +145,7 @@ SaveStateDescriptor TinselMetaEngine::querySaveMetaInfos(const char *target, int file->readUint32LE(); // skip id file->readUint32LE(); // skip size - file->readUint32LE(); // skip version + uint32 ver = file->readUint32LE(); char saveDesc[Tinsel::SG_DESC_LEN]; file->read(saveDesc, sizeof(saveDesc)); @@ -165,9 +157,16 @@ SaveStateDescriptor TinselMetaEngine::querySaveMetaInfos(const char *target, int int8 tm_mday = file->readSByte(); int8 tm_hour = file->readSByte(); int8 tm_min = file->readSByte(); - + file->readSByte(); // skip secs + desc.setSaveDate(1900+tm_year, tm_mon, tm_mday); desc.setSaveTime(tm_hour, tm_min); + + if (ver >= 3) { + uint32 playTime = file->readUint32LE(); // playTime in seconds + desc.setPlayTime(playTime); + } + delete file; return desc; } diff --git a/engines/tinsel/saveload.cpp b/engines/tinsel/saveload.cpp index 3c7dec7606..21f8a4f1d8 100644 --- a/engines/tinsel/saveload.cpp +++ b/engines/tinsel/saveload.cpp @@ -55,7 +55,7 @@ namespace Tinsel { * only saves/loads those which are valid for the version of the savegame * which is being loaded/saved currently. */ -#define CURRENT_VER 2 +#define CURRENT_VER 3 //----------------- GLOBAL GLOBAL DATA -------------------- @@ -86,6 +86,7 @@ struct SaveGameHeader { uint32 ver; char desc[SG_DESC_LEN]; TimeDate dateTime; + uint32 playTime; bool scnFlag; byte language; uint16 numInterpreters; // Savegame version 2 or later only @@ -94,7 +95,7 @@ struct SaveGameHeader { enum { DW1_SAVEGAME_ID = 0x44575399, // = 'DWSc' = "DiscWorld 1 ScummVM" DW2_SAVEGAME_ID = 0x44573253, // = 'DW2S' = "DiscWorld 2 ScummVM" - SAVEGAME_HEADER_SIZE = 4 + 4 + 4 + SG_DESC_LEN + 7 + 1 + 1 + 2 + SAVEGAME_HEADER_SIZE = 4 + 4 + 4 + SG_DESC_LEN + 7 + 4 + 1 + 1 + 2 }; #define SAVEGAME_ID (TinselV2 ? (uint32)DW2_SAVEGAME_ID : (uint32)DW1_SAVEGAME_ID) @@ -152,6 +153,11 @@ static bool syncSaveGameHeader(Common::Serializer &s, SaveGameHeader &hdr) { syncTime(s, hdr.dateTime); + if (hdr.ver >= 3) + s.syncAsUint32LE(hdr.playTime); + else + hdr.playTime = 0; + int tmp = hdr.size - s.bytesSynced(); // NOTE: We can't use SAVEGAME_ID here when attempting to remove a saved game from the launcher, @@ -184,7 +190,10 @@ static bool syncSaveGameHeader(Common::Serializer &s, SaveGameHeader &hdr) { hdr.numInterpreters = NUM_INTERPRET; s.syncAsUint16LE(hdr.numInterpreters); } else { - hdr.numInterpreters = (TinselV2 ? 70 : 64) - 20; + if(_vm) // See comment above about bug #3387551 + hdr.numInterpreters = (TinselV2 ? 70 : 64) - 20; + else + hdr.numInterpreters = 50; // This value doesn't matter since the saved game is being deleted. } // Skip over any extra bytes @@ -495,6 +504,11 @@ static bool DoRestore() { return false; } + if (hdr.ver >= 3) + _vm->setTotalPlayTime(hdr.playTime); + else + _vm->setTotalPlayTime(0); + // Load in the data. For older savegame versions, we potentially need to load the data twice, once // for pre 1.5 savegames, and if that fails, a second time for 1.5 savegames int numInterpreters = hdr.numInterpreters; @@ -589,6 +603,7 @@ static void DoSave() { memset(hdr.desc, 0, SG_DESC_LEN); Common::strlcpy(hdr.desc, g_SaveSceneDesc, SG_DESC_LEN); g_system->getTimeAndDate(hdr.dateTime); + hdr.playTime = _vm->getTotalPlayTime(); hdr.scnFlag = _vm->getFeatures() & GF_SCNFILES; hdr.language = _vm->_config->_language; |