diff options
Diffstat (limited to 'engines/tucker/detection.cpp')
-rw-r--r-- | engines/tucker/detection.cpp | 75 |
1 files changed, 65 insertions, 10 deletions
diff --git a/engines/tucker/detection.cpp b/engines/tucker/detection.cpp index 2447e15d6b..7d07edabd3 100644 --- a/engines/tucker/detection.cpp +++ b/engines/tucker/detection.cpp @@ -25,8 +25,8 @@ #include "common/savefile.h" #include "common/system.h" #include "common/fs.h" - #include "base/plugins.h" +#include "graphics/thumbnail.h" #include "tucker/tucker.h" @@ -132,6 +132,10 @@ public: case kSupportsListSaves: case kSupportsLoadingDuringStartup: case kSupportsDeleteSave: + case kSavesSupportMetaInfo: + case kSavesSupportThumbnail: + case kSavesSupportCreationDate: + case kSavesSupportPlayTime: return true; default: return false; @@ -162,26 +166,24 @@ public: virtual SaveStateList listSaves(const char *target) const { Common::String pattern = Tucker::generateGameStateFileName(target, 0, true); Common::StringArray filenames = g_system->getSavefileManager()->listSavefiles(pattern); - bool slotsTable[Tucker::kLastSaveSlot + 1]; - memset(slotsTable, 0, sizeof(slotsTable)); + Tucker::TuckerEngine::SavegameHeader header; SaveStateList saveList; + for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { int slot; const char *ext = strrchr(file->c_str(), '.'); if (ext && (slot = atoi(ext + 1)) >= 0 && slot <= Tucker::kLastSaveSlot) { Common::InSaveFile *in = g_system->getSavefileManager()->openForLoading(*file); if (in) { - slotsTable[slot] = true; + if (Tucker::TuckerEngine::readSavegameHeader(in, header, false) == Tucker::TuckerEngine::kSavegameNoError) { + saveList.push_back(SaveStateDescriptor(slot, header.description)); + } + delete in; } } } - for (int slot = 0; slot <= Tucker::kLastSaveSlot; ++slot) { - if (slotsTable[slot]) { - Common::String description = Common::String::format("savegm.%02d", slot); - saveList.push_back(SaveStateDescriptor(slot, description)); - } - } + // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; @@ -195,6 +197,59 @@ public: Common::String filename = Tucker::generateGameStateFileName(target, slot); g_system->getSavefileManager()->removeSavefile(filename); } + + SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const { + Common::String fileName = Common::String::format("%s.%d", target, slot); + Common::InSaveFile *file = g_system->getSavefileManager()->openForLoading(fileName); + + if (!file) { + return SaveStateDescriptor(); + } + + Tucker::TuckerEngine::SavegameHeader header; + Tucker::TuckerEngine::SavegameError savegameError = Tucker::TuckerEngine::readSavegameHeader(file, header, true); + if (savegameError) { + delete file; + return SaveStateDescriptor(); + } + + SaveStateDescriptor desc(slot, header.description); + + if (slot == Tucker::kAutoSaveSlot) { + bool autosaveAllowed = Tucker::TuckerEngine::isAutosaveAllowed(target); + desc.setDeletableFlag(!autosaveAllowed); + desc.setWriteProtectedFlag(autosaveAllowed); + } + + if (header.version >= 2) { + // creation/play time + if (header.saveDate) { + int day = (header.saveDate >> 24) & 0xFF; + int month = (header.saveDate >> 16) & 0xFF; + int year = header.saveDate & 0xFFFF; + desc.setSaveDate(year, month, day); + } + + if (header.saveTime) { + int hour = (header.saveTime >> 16) & 0xFF; + int minutes = (header.saveTime >> 8) & 0xFF; + desc.setSaveTime(hour, minutes); + } + + if (header.playTime) { + desc.setPlayTime(header.playTime * 1000); + } + + // thumbnail + if (header.thumbnail) { + desc.setThumbnail(header.thumbnail); + } + } + + delete file; + return desc; + } + }; #if PLUGIN_ENABLED_DYNAMIC(TUCKER) |