diff options
author | whiterandrek | 2018-05-25 20:50:02 +0300 |
---|---|---|
committer | Eugene Sandulenko | 2018-06-28 23:51:32 +0200 |
commit | 4f13df48280c5d0a5c3701be557fdf486d2ae70b (patch) | |
tree | 2395651b18df28044288d1c92737ed87082b4b1d /engines | |
parent | d6b1b9396e54f78fb49c6c0b123e9463f91be676 (diff) | |
download | scummvm-rg350-4f13df48280c5d0a5c3701be557fdf486d2ae70b.tar.gz scummvm-rg350-4f13df48280c5d0a5c3701be557fdf486d2ae70b.tar.bz2 scummvm-rg350-4f13df48280c5d0a5c3701be557fdf486d2ae70b.zip |
PINK: add saving/loading of game.
It's bugged, but playable
Diffstat (limited to 'engines')
-rw-r--r-- | engines/pink/detection.cpp | 44 | ||||
-rw-r--r-- | engines/pink/detection_tables.h | 4 | ||||
-rw-r--r-- | engines/pink/pink.cpp | 62 | ||||
-rw-r--r-- | engines/pink/pink.h | 14 |
4 files changed, 112 insertions, 12 deletions
diff --git a/engines/pink/detection.cpp b/engines/pink/detection.cpp index 771db19e8e..619bf5d227 100644 --- a/engines/pink/detection.cpp +++ b/engines/pink/detection.cpp @@ -46,14 +46,50 @@ public: return "Pink Panther Engine (C) Wanderlust Interactive"; } - //virtual bool hasFeature(MetaEngineFeature f) const; - //virtual int getMaximumSaveSlot() const { return 0; } - //virtual SaveStateList listSaves(const char *target) const; - //virtual void removeSaveState(const char *target, int slot) const; + virtual bool hasFeature(MetaEngineFeature f) const; + virtual int getMaximumSaveSlot() const { return 99; } + virtual SaveStateList listSaves(const char *target) const; + virtual void removeSaveState(const char *target, int slot) const; //virtual SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const; virtual bool createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const; }; +bool PinkMetaEngine::hasFeature(MetaEngineFeature f) const { + return + (f == kSupportsListSaves) || + (f == kSupportsDeleteSave) || + (f == kSupportsLoadingDuringStartup) || + (f == kSimpleSavesNames); +} + +SaveStateList PinkMetaEngine::listSaves(const char *target) const { + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + Common::String pattern = Common::String::format("%s.s##", target); + Common::StringArray 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; + desc.setSaveSlot(slotNum); + saveList.push_back(desc); + } + } + } + + // Sort saves based on slot number. + Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); + return saveList; +} + +void PinkMetaEngine::removeSaveState(const char *target, int slot) const { + g_system->getSavefileManager()->removeSavefile(Pink::generateSaveName(slot, target)); +} + bool PinkMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { if (desc) *engine = new Pink::PinkEngine(syst, desc); diff --git a/engines/pink/detection_tables.h b/engines/pink/detection_tables.h index 5a9f27af46..a0062d7070 100644 --- a/engines/pink/detection_tables.h +++ b/engines/pink/detection_tables.h @@ -39,7 +39,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformWindows, - ADGF_UNSTABLE, + ADGF_UNSTABLE | ADGF_DROPPLATFORM, GUIO1(GUIO_NONE) }, { @@ -52,7 +52,7 @@ static const ADGameDescription gameDescriptions[] = { }, Common::EN_ANY, Common::kPlatformWindows, - ADGF_UNSTABLE, + ADGF_UNSTABLE | ADGF_DROPPLATFORM, GUIO1(GUIO_NONE) }, AD_TABLE_END_MARKER diff --git a/engines/pink/pink.cpp b/engines/pink/pink.cpp index 0e5952bbd4..62bb4f4422 100644 --- a/engines/pink/pink.cpp +++ b/engines/pink/pink.cpp @@ -88,7 +88,10 @@ Common::Error PinkEngine::init() { _orb.loadGame(this); - initModule(_modules[0]->getName(), kLoadingNewGame, ""); + if (ConfMan.hasKey("save_slot")) { + loadGameState(ConfMan.getInt("save_slot")); + } + else initModule(_modules[0]->getName(), "", nullptr); return Common::kNoError; } @@ -140,7 +143,7 @@ void PinkEngine::load(Archive &archive) { _modules.deserialize(archive); } -void PinkEngine::initModule(const Common::String &moduleName, bool isLoadingFromSave, const Common::String &pageName) { +void PinkEngine::initModule(const Common::String &moduleName, const Common::String &pageName, Archive *saveFile) { if (_module) { for (uint i = 0; i < _modules.size(); ++i) { if (_module == _modules[i]) { @@ -158,7 +161,9 @@ void PinkEngine::initModule(const Common::String &moduleName, bool isLoadingFrom if (_modules[i]->getName() == moduleName) { loadModule(i); _module = static_cast<Module*>(_modules[i]); - _module->init(isLoadingFromSave, pageName); + if (saveFile) + _module->loadState(*saveFile); + _module->init( saveFile ? kLoadingSave : kLoadingNewGame, pageName); break; } } @@ -167,7 +172,7 @@ void PinkEngine::initModule(const Common::String &moduleName, bool isLoadingFrom void PinkEngine::changeScene(GamePage *page) { setCursor(kLoadingCursor); if (!_nextModule.empty() && _nextModule.compareTo(_module->getName())) { - initModule(_nextModule, kLoadingNewGame, _nextPage); + initModule(_nextModule, _nextPage, nullptr); } else { assert(!_nextPage.empty()); _module->changePage(_nextPage); @@ -241,4 +246,53 @@ void PinkEngine::setCursor(uint cursorIndex) { cursor->getHotspotX(), cursor->getHotspotY(), cursor->getKeyColor()); } +Common::Error PinkEngine::loadGameState(int slot) { + Common::SeekableReadStream *stream = _saveFileMan->openForLoading(generateSaveName(slot, _desc.gameId)); + if (!stream) + return Common::kNoGameDataFoundError; + + Archive archive(stream); + _variables.deserialize(archive); + _nextModule = archive.readString(); + _nextPage = archive.readString(); + initModule(archive.readString(), "", &archive); + + return Common::kNoError; +} + +bool PinkEngine::canLoadGameStateCurrently() { + return true; +} + +Common::Error PinkEngine::saveGameState(int slot, const Common::String &desc) { + Common::WriteStream *stream = _saveFileMan->openForSaving(generateSaveName(slot, _desc.gameId)); + if (!stream) + return Common::kUnknownError; + + Archive archive(stream); + _variables.serialize(archive); + archive.writeString(_nextModule); + archive.writeString(_nextPage); + + archive.writeString(_module->getName()); + _module->saveState(archive); + + delete stream; + + return Common::kNoError; +} + +bool PinkEngine::canSaveGameStateCurrently() { + return true; +} + +bool PinkEngine::hasFeature(Engine::EngineFeature f) const { + return f == kSupportsLoadingDuringRuntime || + f == kSupportsSavingDuringRuntime; +} + +Common::String generateSaveName(int slot, const char *gameId) { + return Common::String::format("%s.s%02d", gameId, slot); +} + } diff --git a/engines/pink/pink.h b/engines/pink/pink.h index 0faf4d5e66..caa5b02ca3 100644 --- a/engines/pink/pink.h +++ b/engines/pink/pink.h @@ -87,8 +87,16 @@ public: virtual Common::Error run(); + virtual bool hasFeature(EngineFeature f) const; + + virtual Common::Error loadGameState(int slot); + virtual bool canLoadGameStateCurrently(); + + virtual Common::Error saveGameState(int slot, const Common::String &desc); + virtual bool canSaveGameStateCurrently(); + void load(Archive &archive); - void initModule(const Common::String &moduleName, bool isLoadingFromSave, const Common::String &pageName); + void initModule(const Common::String &moduleName, const Common::String &pageName, Archive *saveFile); void changeScene(GamePage *page); OrbFile *getOrb() { return &_orb; } @@ -125,11 +133,13 @@ private: Module *_module; Array<NamedObject *> _modules; - Common::StringMap _variables; + StringMap _variables; const ADGameDescription _desc; }; +Common::String generateSaveName(int slot, const char *gameId); + } // End of namespace Pink #endif |