diff options
-rw-r--r-- | engines/hdb/detection.cpp | 57 | ||||
-rw-r--r-- | engines/hdb/saveload.cpp | 2 |
2 files changed, 55 insertions, 4 deletions
diff --git a/engines/hdb/detection.cpp b/engines/hdb/detection.cpp index b8bf22e1c8..e236a6c60f 100644 --- a/engines/hdb/detection.cpp +++ b/engines/hdb/detection.cpp @@ -108,21 +108,72 @@ public: virtual bool hasFeature(MetaEngineFeature f) const; virtual int getMaximumSaveSlot() const; + virtual SaveStateList listSaves(const char *target) const; virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; }; bool HDBMetaEngine::hasFeature(MetaEngineFeature f) const { return - (f == kSupportsLoadingDuringStartup); + (f == kSupportsLoadingDuringStartup) || + (f == kSupportsLoadingDuringStartup) || + (f == kSupportsListSaves) || + (f == kSavesSupportMetaInfo) || + (f == kSavesSupportThumbnail) || + (f == kSavesSupportPlayTime); } bool HDB::HDBGame::hasFeature(Engine::EngineFeature f) const { - warning("FIXME: quitGame() exits the application, instead of RTL"); - return (f == kSupportsRTL); + return (f == kSupportsRTL) || + (f == kSupportsLoadingDuringRuntime) || + (f == kSupportsSavingDuringRuntime); } int HDBMetaEngine::getMaximumSaveSlot() const { return 9; } +SaveStateList HDBMetaEngine::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) { + // Obtain the last 2 digits of the filename, since they correspond to the save slot + int slotNum = atoi(file->c_str() + file->size() - 2); + + if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { + Common::ScopedPtr<Common::InSaveFile> in(saveFileMan->openForLoading(*file)); + if (in) { + SaveStateDescriptor desc; + char mapName[32]; + Graphics::Surface *thumbnail; + + if (!Graphics::loadThumbnail(*in, thumbnail)) { + warning("Error loading thumbnail for %s", file->c_str()); + } + desc.setThumbnail(thumbnail); + + uint32 timeSeconds = in->readUint32LE();; + in->read(mapName, 32); + + warning("mapName: %s playtime: %d", mapName, timeSeconds); + + desc.setSaveSlot(slotNum); + desc.setPlayTime(timeSeconds * 1000); + desc.setDescription(mapName); + + saveList.push_back(desc); + } + } + } + + // Sort saves based on slot number. + Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); + return saveList; +} + bool HDBMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { if (desc) { *engine = new HDB::HDBGame(syst, desc); diff --git a/engines/hdb/saveload.cpp b/engines/hdb/saveload.cpp index 2735a3a8e5..1163d56113 100644 --- a/engines/hdb/saveload.cpp +++ b/engines/hdb/saveload.cpp @@ -153,7 +153,7 @@ void HDBGame::loadGame(Common::InSaveFile *in) { debug(1, "HDBGame::loadGame: start at %u", in->pos()); // Load Map Name and Time - _timeSeconds = in->readUint32LE();; + _timeSeconds = in->readUint32LE(); _timePlayed = 0; in->read(_inMapName, 32); |