Skip to content

Commit

Permalink
ENGINES: Fix getSavegameFile for almost all engines
Browse files Browse the repository at this point in the history
Use kSimpleSavesNames correctly, add where needed, remove where needed.

Trac #12977
  • Loading branch information
orgads committed Nov 10, 2021
1 parent f4c904d commit f6d6aae
Show file tree
Hide file tree
Showing 37 changed files with 163 additions and 62 deletions.
1 change: 0 additions & 1 deletion engines/adl/metaengine.cpp
Expand Up @@ -102,7 +102,6 @@ bool AdlMetaEngine::hasFeature(MetaEngineFeature f) const {
case kSavesSupportThumbnail:
case kSavesSupportCreationDate:
case kSavesSupportPlayTime:
case kSimpleSavesNames:
return true;
default:
return false;
Expand Down
20 changes: 14 additions & 6 deletions engines/buried/metaengine.cpp
Expand Up @@ -75,15 +75,23 @@ Common::Language BuriedEngine::getLanguage() const {

class BuriedMetaEngine : public AdvancedMetaEngine {
public:
const char *getName() const {
const char *getName() const override {
return "buried";
}

virtual bool hasFeature(MetaEngineFeature f) const;
virtual Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const;
virtual SaveStateList listSaves(const char *target) const;
virtual int getMaximumSaveSlot() const { return 999; }
virtual void removeSaveState(const char *target, int slot) const;
virtual bool hasFeature(MetaEngineFeature f) const override;
virtual Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
virtual SaveStateList listSaves(const char *target) const override;
virtual int getMaximumSaveSlot() const override { return 999; }
virtual void removeSaveState(const char *target, int slot) const override;
Common::String getSavegameFile(int saveGameIdx, const char *target) const override {
if (!target)
target = getEngineId();
if (saveGameIdx == kSavegameFilePattern)
return Common::String::format("buried-*.sav");
else
return Common::String::format("buried-%s.sav", target);
}
};

bool BuriedMetaEngine::hasFeature(MetaEngineFeature f) const {
Expand Down
3 changes: 1 addition & 2 deletions engines/cryomni3d/metaengine.cpp
Expand Up @@ -93,8 +93,7 @@ bool CryOmni3DMetaEngine::hasFeature(MetaEngineFeature f) const {
return
(f == kSupportsListSaves)
|| (f == kSupportsLoadingDuringStartup)
|| (f == kSupportsDeleteSave)
|| (f == kSimpleSavesNames);
|| (f == kSupportsDeleteSave);
}

SaveStateList CryOmni3DMetaEngine::listSaves(const char *target) const {
Expand Down
1 change: 1 addition & 0 deletions engines/dm/metaengine.cpp
Expand Up @@ -53,6 +53,7 @@ class DMMetaEngine : public AdvancedMetaEngine {
(f == kSupportsLoadingDuringStartup) ||
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportMetaInfo) ||
(f == kSimpleSavesNames) ||
(f == kSavesSupportCreationDate);
}

Expand Down
3 changes: 2 additions & 1 deletion engines/dragons/metaengine.cpp
Expand Up @@ -53,6 +53,7 @@ bool DragonsMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSupportsLoadingDuringStartup) ||
(f == kSavesSupportMetaInfo) ||
(f == kSavesSupportThumbnail) ||
(f == kSimpleSavesNames) ||
(f == kSavesSupportCreationDate);
}

Expand All @@ -69,7 +70,7 @@ SaveStateList DragonsMetaEngine::listSaves(const char *target) const {
Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
Dragons::SaveHeader header;
Common::String pattern = target;
pattern += ".???";
pattern += ".###";
Common::StringArray filenames;
filenames = saveFileMan->listSavefiles(pattern.c_str());
SaveStateList saveList;
Expand Down
6 changes: 6 additions & 0 deletions engines/dreamweb/metaengine.cpp
Expand Up @@ -43,6 +43,12 @@ class DreamWebMetaEngine : public AdvancedMetaEngine {
int getMaximumSaveSlot() const override;
void removeSaveState(const char *target, int slot) const override;
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
Common::String getSavegameFile(int saveGameIdx, const char *target) const override {
if (saveGameIdx == kSavegameFilePattern)
return Common::String::format("DREAMWEB.D##");
else
return Common::String::format("DREAMWEB.D%02d", saveGameIdx);
}
};

bool DreamWebMetaEngine::hasFeature(MetaEngineFeature f) const {
Expand Down
1 change: 1 addition & 0 deletions engines/groovie/metaengine.cpp
Expand Up @@ -61,6 +61,7 @@ bool GroovieMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSupportsListSaves) ||
(f == kSupportsLoadingDuringStartup) ||
(f == kSupportsDeleteSave) ||
(f == kSimpleSavesNames) ||
(f == kSavesSupportMetaInfo);
}

Expand Down
1 change: 1 addition & 0 deletions engines/hadesch/metaengine.cpp
Expand Up @@ -38,6 +38,7 @@ class HadeschMetaEngine : public AdvancedMetaEngine {
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportCreationDate) ||
(f == kSavesSupportPlayTime) ||
(f == kSimpleSavesNames) ||
(f == kSavesUseExtendedFormat);
}

Expand Down
1 change: 1 addition & 0 deletions engines/hdb/metaengine.cpp
Expand Up @@ -86,6 +86,7 @@ bool HDBMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSupportsDeleteSave) ||
(f == kSavesSupportMetaInfo) ||
(f == kSavesSupportThumbnail) ||
(f == kSimpleSavesNames) ||
(f == kSavesSupportPlayTime);
}

Expand Down
1 change: 1 addition & 0 deletions engines/illusions/metaengine.cpp
Expand Up @@ -67,6 +67,7 @@ bool IllusionsMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSupportsLoadingDuringStartup) ||
(f == kSavesSupportMetaInfo) ||
(f == kSavesSupportThumbnail) ||
(f == kSimpleSavesNames) ||
(f == kSavesSupportCreationDate);
}

Expand Down
1 change: 1 addition & 0 deletions engines/kingdom/metaengine.cpp
Expand Up @@ -60,6 +60,7 @@ bool KingdomMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSupportsDeleteSave) ||
(f == kSavesSupportMetaInfo) ||
(f == kSavesSupportThumbnail) ||
(f == kSimpleSavesNames) ||
(f == kSavesSupportCreationDate);
}

Expand Down
3 changes: 2 additions & 1 deletion engines/kyra/metaengine.cpp
Expand Up @@ -182,7 +182,8 @@ void KyraMetaEngine::removeSaveState(const char *target, int slot) const {
// In Kyra games slot 0 can't be deleted, it's for restarting the game(s).
// An exception makes Lands of Lore here, it does not have any way to restart the
// game except via its main menu.
if (slot == 0 && !ConfMan.getDomain(target)->getVal("gameid").equalsIgnoreCase("lol") && !ConfMan.getDomain(target)->getVal("gameid").equalsIgnoreCase("eob") && !ConfMan.getDomain(target)->getVal("gameid").equalsIgnoreCase("eob2"))
const Common::String gameId = ConfMan.getDomain(target)->getVal("gameid");
if (slot == 0 && !gameId.equalsIgnoreCase("lol") && !gameId.equalsIgnoreCase("eob") && !gameId.equalsIgnoreCase("eob2"))
return;

Common::String filename = Kyra::KyraEngine_v1::getSavegameFilename(target, slot);
Expand Down
1 change: 1 addition & 0 deletions engines/lure/metaengine.cpp
Expand Up @@ -69,6 +69,7 @@ bool LureMetaEngine::hasFeature(MetaEngineFeature f) const {
return
(f == kSupportsListSaves) ||
(f == kSupportsLoadingDuringStartup) ||
(f == kSimpleSavesNames) ||
(f == kSupportsDeleteSave);
}

Expand Down
1 change: 1 addition & 0 deletions engines/macventure/metaengine.cpp
Expand Up @@ -64,6 +64,7 @@ bool MacVentureMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSavesSupportMetaInfo) ||
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportCreationDate) ||
(f == kSimpleSavesNames) ||
(f == kSavesSupportPlayTime);
}

Expand Down
11 changes: 7 additions & 4 deletions engines/metaengine.cpp
Expand Up @@ -38,14 +38,16 @@
#include "graphics/thumbnail.h"

Common::String MetaEngine::getSavegameFile(int saveGameIdx, const char *target) const {
if (!target)
target = getEngineId();
if (saveGameIdx == kSavegameFilePattern) {
// Pattern requested
const char *pattern = hasFeature(kSavesUseExtendedFormat) ? "%s.###" : "%s.s##";
return Common::String::format(pattern, target == nullptr ? getEngineId() : target);
const char *pattern = hasFeature(kSimpleSavesNames) ? "%s.###" : "%s.s##";
return Common::String::format(pattern, target);
} else {
// Specific filename requested
const char *pattern = hasFeature(kSavesUseExtendedFormat) ? "%s.%03d" : "%s.s%02d";
return Common::String::format(pattern, target == nullptr ? getEngineId() : target, saveGameIdx);
const char *pattern = hasFeature(kSimpleSavesNames) ? "%s.%03d" : "%s.s%02d";
return Common::String::format(pattern, target, saveGameIdx);
}
}

Expand Down Expand Up @@ -165,6 +167,7 @@ bool MetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSavesSupportCreationDate) ||
(f == kSavesSupportPlayTime) ||
(f == kSupportsLoadingDuringStartup) ||
(f == kSimpleSavesNames) ||
(f == kSavesUseExtendedFormat);
}

Expand Down
3 changes: 3 additions & 0 deletions engines/metaengine.h
Expand Up @@ -485,6 +485,9 @@ class MetaEngine : public PluginObject {
* of detecting saves and slot numbers, this should be
* unavailable. In that case Save/Load dialog for the engine's
* games is locked during cloud saves sync.
*
* NOTE: This flag is used by cloud code, but also in
* MetaEngine::getSavegameFile(), for common save names.
*/
kSimpleSavesNames,

Expand Down
18 changes: 18 additions & 0 deletions engines/mohawk/metaengine.cpp
Expand Up @@ -142,6 +142,24 @@ class MohawkMetaEngine : public AdvancedMetaEngine {

void registerDefaultSettings(const Common::String &target) const override;
GUI::OptionsContainerWidget *buildEngineOptionsWidgetDynamic(GUI::GuiObject *boss, const Common::String &name, const Common::String &target) const override;
Common::String getSavegameFile(int saveGameIdx, const char *target) const override {
if (!target)
target = getEngineId();
Common::String gameId = ConfMan.get("gameid", target);
const char *suffix;
// Saved games are only supported in Myst/Riven currently.
if (gameId == "myst")
suffix = "mys";
else if (gameId == "riven")
suffix = "rvn";
else
return MetaEngine::getSavegameFile(saveGameIdx, target);

if (saveGameIdx == kSavegameFilePattern)
return Common::String::format("%s-###.%s", gameId.c_str(), suffix);
else
return Common::String::format("%s-%03d.%s", gameId.c_str(), saveGameIdx, suffix);
}
};

bool MohawkMetaEngine::hasFeature(MetaEngineFeature f) const {
Expand Down
8 changes: 8 additions & 0 deletions engines/mortevielle/metaengine.cpp
Expand Up @@ -51,6 +51,14 @@ class MortevielleMetaEngine : public AdvancedMetaEngine {
int getMaximumSaveSlot() const override;
SaveStateList listSaves(const char *target) const override;
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;
Common::String getSavegameFile(int saveGameIdx, const char *target) const override {
if (!target)
target = getEngineId();
if (saveGameIdx == kSavegameFilePattern)
return Common::String::format("%s.###", target); // There is also sav0.mor for slot 0
else
return Mortevielle::MortevielleEngine::generateSaveFilename(target, saveGameIdx);
}
};

Common::Error MortevielleMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
Expand Down
2 changes: 2 additions & 0 deletions engines/myst3/metaengine.cpp
Expand Up @@ -132,6 +132,8 @@ class Myst3MetaEngine : public AdvancedMetaEngine {
}

Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;

// TODO: Add getSavegameFile()
};

Common::Error Myst3MetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const {
Expand Down
1 change: 1 addition & 0 deletions engines/nancy/metaengine.cpp
Expand Up @@ -58,6 +58,7 @@ bool NancyMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportCreationDate) ||
(f == kSavesSupportPlayTime) ||
(f == kSimpleSavesNames) ||
(f == kSavesUseExtendedFormat);
}

Expand Down
13 changes: 9 additions & 4 deletions engines/ngi/metaengine.cpp
Expand Up @@ -69,6 +69,13 @@ class NGIMetaEngine : public AdvancedMetaEngine {
SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const override;

Common::Error createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const override;
Common::String getSavegameFile(int saveGameIdx, const char *target) const override {
const Common::String prefix("fullpipe");
if (saveGameIdx == kSavegameFilePattern)
return prefix + ".s##";
else
return prefix + Common::String::format(".s%02d", saveGameIdx);
}
};

bool NGIMetaEngine::hasFeature(MetaEngineFeature f) const {
Expand All @@ -79,8 +86,7 @@ bool NGIMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportCreationDate) ||
(f == kSavesSupportPlayTime) ||
(f == kSupportsLoadingDuringStartup) ||
(f == kSimpleSavesNames);
(f == kSupportsLoadingDuringStartup);
}

bool NGI::NGIEngine::hasFeature(EngineFeature f) const {
Expand All @@ -93,9 +99,8 @@ bool NGI::NGIEngine::hasFeature(EngineFeature f) const {
SaveStateList NGIMetaEngine::listSaves(const char *target) const {
Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();
Common::StringArray filenames;
Common::String pattern("fullpipe.s##");

filenames = saveFileMan->listSavefiles(pattern);
filenames = saveFileMan->listSavefiles(getSavegameFilePattern(target));

SaveStateList saveList;
for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
Expand Down
18 changes: 12 additions & 6 deletions engines/parallaction/metaengine.cpp
Expand Up @@ -57,11 +57,21 @@ class ParallactionMetaEngine : public AdvancedMetaEngine {
SaveStateList listSaves(const char *target) const override;
int getMaximumSaveSlot() const override;
void removeSaveState(const char *target, int slot) const override;
Common::String getSavegameFile(int saveGameIdx, const char *target) const override {
if (!target)
target = getEngineId();
const Common::String prefix = ConfMan.getDomain(target)->getVal("gameid");
if (saveGameIdx == kSavegameFilePattern)
return prefix + ".###";
else
return prefix + Common::String::format(".%03d", saveGameIdx);
}
};

bool ParallactionMetaEngine::hasFeature(MetaEngineFeature f) const {
return
(f == kSupportsListSaves) ||
(f == kSimpleSavesNames) ||
(f == kSupportsDeleteSave);
}

Expand Down Expand Up @@ -152,8 +162,7 @@ Common::KeymapArray ParallactionMetaEngine::initKeymaps(const char *target) cons
SaveStateList ParallactionMetaEngine::listSaves(const char *target) const {
Common::SaveFileManager *saveFileMan = g_system->getSavefileManager();

Common::String pattern(ConfMan.getDomain(target)->getVal("gameid") + ".0##");
Common::StringArray filenames = saveFileMan->listSavefiles(pattern);
Common::StringArray filenames = saveFileMan->listSavefiles(getSavegameFilePattern(target));

SaveStateList saveList;
for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) {
Expand All @@ -178,10 +187,7 @@ SaveStateList ParallactionMetaEngine::listSaves(const char *target) const {
int ParallactionMetaEngine::getMaximumSaveSlot() const { return 99; }

void ParallactionMetaEngine::removeSaveState(const char *target, int slot) const {
Common::String filename = ConfMan.getDomain(target)->getVal("gameid");
filename += Common::String::format(".0%02d", slot);

g_system->getSavefileManager()->removeSavefile(filename);
g_system->getSavefileManager()->removeSavefile(getSavegameFile(slot, target));
}

#if PLUGIN_ENABLED_DYNAMIC(PARALLACTION)
Expand Down
12 changes: 12 additions & 0 deletions engines/pegasus/metaengine.cpp
Expand Up @@ -78,6 +78,18 @@ class PegasusMetaEngine : public AdvancedMetaEngine {
int getMaximumSaveSlot() const override { return 999; }
void removeSaveState(const char *target, int slot) const override;
Common::KeymapArray initKeymaps(const char *target) const override;
Common::String getSavegameFile(int saveGameIdx, const char *target) const override {
if (saveGameIdx == kSavegameFilePattern)
return Common::String::format("pegasus-*.sav");
Common::StringArray fileNames = Pegasus::PegasusEngine::listSaveFiles();
if (saveGameIdx < fileNames.size())
return fileNames[saveGameIdx];
if (fileNames.empty())
return Common::String("pegasus-1.sav");
Common::String name = fileNames.back();
name.insertString("_last", name.size() - 4);
return name;
}
};

bool PegasusMetaEngine::hasFeature(MetaEngineFeature f) const {
Expand Down
12 changes: 10 additions & 2 deletions engines/pegasus/pegasus.cpp
Expand Up @@ -702,8 +702,15 @@ void PegasusEngine::writeContinueStream(Common::WriteStream *stream) {
}

Common::StringArray PegasusEngine::listSaveFiles() {
const Common::String autoSaveName("pegasus-AutoSave.sav");
Common::StringArray fileNames = g_system->getSavefileManager()->listSavefiles("pegasus-*.sav");
// Autosave must be at slot 0, so remove it, then prepend (even if it doesn't exist,
// it will be prepended)
Common::StringArray::iterator it = Common::find(fileNames.begin(), fileNames.end(), autoSaveName);
if (it != fileNames.end())
fileNames.erase(it);
Common::sort(fileNames.begin(), fileNames.end());
fileNames.insert_at(0, autoSaveName);
return fileNames;
}

Expand Down Expand Up @@ -733,10 +740,11 @@ static bool isValidSaveFileName(const Common::String &desc) {
}

Common::Error PegasusEngine::saveGameState(int slot, const Common::String &desc, bool isAutosave) {
if (!isValidSaveFileName(desc))
Common::String saveName = isAutosave ? Common::String("AutoSave") : desc;
if (!isValidSaveFileName(saveName))
return Common::Error(Common::kCreatingFileFailed, _("Invalid file name for saving"));

Common::String output = Common::String::format("pegasus-%s.sav", desc.c_str());
Common::String output = Common::String::format("pegasus-%s.sav", saveName.c_str());
Common::OutSaveFile *saveFile = _saveFileMan->openForSaving(output, false);
if (!saveFile)
return Common::kUnknownError;
Expand Down
3 changes: 1 addition & 2 deletions engines/pink/metaengine.cpp
Expand Up @@ -58,8 +58,7 @@ bool PinkMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportCreationDate) ||
(f == kSavesSupportPlayTime) ||
(f == kSupportsLoadingDuringStartup) ||
(f == kSimpleSavesNames);
(f == kSupportsLoadingDuringStartup);
}

SaveStateList PinkMetaEngine::listSaves(const char *target) const {
Expand Down
3 changes: 1 addition & 2 deletions engines/saga/metaengine.cpp
Expand Up @@ -94,8 +94,7 @@ bool SagaMetaEngine::hasFeature(MetaEngineFeature f) const {
(f == kSavesSupportMetaInfo) ||
(f == kSavesSupportThumbnail) ||
(f == kSavesSupportCreationDate) ||
(f == kSavesSupportPlayTime) ||
(f == kSimpleSavesNames);
(f == kSavesSupportPlayTime);
}

bool Saga::SagaEngine::hasFeature(EngineFeature f) const {
Expand Down

0 comments on commit f6d6aae

Please sign in to comment.