diff options
Diffstat (limited to 'engines/sky/detection.cpp')
-rw-r--r-- | engines/sky/detection.cpp | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/engines/sky/detection.cpp b/engines/sky/detection.cpp index 6d3f204228..d40885730d 100644 --- a/engines/sky/detection.cpp +++ b/engines/sky/detection.cpp @@ -75,6 +75,7 @@ public: virtual SaveStateList listSaves(const char *target) const; virtual int getMaximumSaveSlot() const; + virtual void removeSaveState(const char *target, int slot) const; }; const char *SkyMetaEngine::getName() const { @@ -88,7 +89,8 @@ const char *SkyMetaEngine::getCopyright() const { bool SkyMetaEngine::hasFeature(MetaEngineFeature f) const { return (f == kSupportsListSaves) || - (f == kSupportsLoadingDuringStartup); + (f == kSupportsLoadingDuringStartup) || + (f == kSupportsDeleteSave); } bool Sky::SkyEngine::hasFeature(EngineFeature f) const { @@ -220,6 +222,53 @@ SaveStateList SkyMetaEngine::listSaves(const char *target) const { int SkyMetaEngine::getMaximumSaveSlot() const { return MAX_SAVE_GAMES; } +void SkyMetaEngine::removeSaveState(const char *target, int slot) const { + if (slot == 0) // do not delete the auto save + return; + + Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); + char fName[20]; + sprintf(fName,"SKY-VM.%03d", slot - 1); + g_system->getSavefileManager()->removeSavefile(fName); + + // Load current save game descriptions + Common::StringList savenames; + savenames.resize(MAX_SAVE_GAMES+1); + Common::InSaveFile *inf; + inf = saveFileMan->openForLoading("SKY-VM.SAV"); + if (inf != NULL) { + char *tmpBuf = new char[MAX_SAVE_GAMES * MAX_TEXT_LEN]; + char *tmpPtr = tmpBuf; + inf->read(tmpBuf, MAX_SAVE_GAMES * MAX_TEXT_LEN); + for (int i = 0; i < MAX_SAVE_GAMES; ++i) { + savenames[i] = tmpPtr; + tmpPtr += savenames[i].size() + 1; + } + delete inf; + delete[] tmpBuf; + } + + // Update the save game description at the given slot + savenames[slot - 1] = ""; + + // Save the updated descriptions + Common::OutSaveFile *outf; + + outf = saveFileMan->openForSaving("SKY-VM.SAV"); + bool ioFailed = true; + if (outf) { + for (uint16 cnt = 0; cnt < MAX_SAVE_GAMES; cnt++) { + outf->write(savenames[cnt].c_str(), savenames[cnt].size() + 1); + } + outf->finalize(); + if (!outf->ioFailed()) + ioFailed = false; + delete outf; + } + if (ioFailed) + warning("Unable to store Savegame names to file SKY-VM.SAV. (%s)", saveFileMan->popErrorDesc().c_str()); +} + #if PLUGIN_ENABLED_DYNAMIC(SKY) REGISTER_PLUGIN_DYNAMIC(SKY, PLUGIN_TYPE_ENGINE, SkyMetaEngine); #else |