diff options
author | Le Philousophe | 2019-10-20 17:40:36 +0200 |
---|---|---|
committer | Le Philousophe | 2019-11-16 20:42:50 +0100 |
commit | 8254524d9ed8c33cb1a5c22a65c281372fac4c69 (patch) | |
tree | e6523c4df37a481ba7080b862434ed47b0b1a132 /engines/cryomni3d/versailles | |
parent | 3906d716daf3c634d84b8eff6ede31367516fb3f (diff) | |
download | scummvm-rg350-8254524d9ed8c33cb1a5c22a65c281372fac4c69.tar.gz scummvm-rg350-8254524d9ed8c33cb1a5c22a65c281372fac4c69.tar.bz2 scummvm-rg350-8254524d9ed8c33cb1a5c22a65c281372fac4c69.zip |
CRYOMNI3D: Rewrite path handling to be more agnostic to installation
That simplifies fallback detection too
Diffstat (limited to 'engines/cryomni3d/versailles')
-rw-r--r-- | engines/cryomni3d/versailles/engine.cpp | 85 | ||||
-rw-r--r-- | engines/cryomni3d/versailles/engine.h | 2 | ||||
-rw-r--r-- | engines/cryomni3d/versailles/saveload.cpp | 18 |
3 files changed, 15 insertions, 90 deletions
diff --git a/engines/cryomni3d/versailles/engine.cpp b/engines/cryomni3d/versailles/engine.cpp index ea0d2a8702..e8f7728359 100644 --- a/engines/cryomni3d/versailles/engine.cpp +++ b/engines/cryomni3d/versailles/engine.cpp @@ -74,54 +74,16 @@ bool CryOmni3DEngine_Versailles::hasFeature(EngineFeature f) const { || (f == kSupportsLoadingDuringRuntime); } +void CryOmni3DEngine_Versailles::initializePath(const Common::FSNode &gamePath) { + // All files are named uniquely so just add the main directory with a large enough depth and in flat mode + // That should do it + SearchMan.setIgnoreClashes(true); + SearchMan.addDirectory(gamePath.getPath(), gamePath, 0, 5, true); +} + Common::Error CryOmni3DEngine_Versailles::run() { CryOmni3DEngine::run(); - const Common::FSNode gameDataDir(ConfMan.get("path")); - SearchMan.addSubDirectoryMatching(gameDataDir, "sc_trans", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "menu", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "basedoc/fonds", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "fonts", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "spr8col", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "spr8col/bmpok", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "wam", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "objets", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "gto", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "dial/flc_dial", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "dial/voix", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "textes", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "music", 1); - SearchMan.addSubDirectoryMatching(gameDataDir, "sound", 1); - - // Sometimes files are taken from other levels - // Original game has a logic based on the first character of the file name. - // We can't do this here so we put in lower priority all the levels as a fallback - - // Create a first SearchSet in which we will add all others to group everything - Common::SearchSet *fallbackFiles = new Common::SearchSet(); - - for (uint lvl = 1; lvl <= 7; lvl++) { - Common::SearchSet *fallbackFilesAnimacti = new Common::SearchSet(); - Common::SearchSet *fallbackFilesWarp = new Common::SearchSet(); - Common::SearchSet *fallbackFilesImgFix = new Common::SearchSet(); - - fallbackFilesAnimacti->addSubDirectoryMatching(gameDataDir, Common::String::format( - "animacti/level%d", lvl), 2); - fallbackFilesWarp->addSubDirectoryMatching(gameDataDir, Common::String::format( - "warp/level%d/cyclo", lvl), 2); - fallbackFilesWarp->addSubDirectoryMatching(gameDataDir, Common::String::format( - "warp/level%d/hnm", lvl), 2); - fallbackFilesImgFix->addSubDirectoryMatching(gameDataDir, Common::String::format( - "img_fix/level%d", lvl), 2); - - fallbackFiles->add(Common::String::format("__fallbackFiles_animacti_%d", lvl), - fallbackFilesAnimacti); - fallbackFiles->add(Common::String::format("__fallbackFiles_warp_%d", lvl), fallbackFilesWarp); - fallbackFiles->add(Common::String::format("__fallbackFiles_img_fix_%d", lvl), fallbackFilesImgFix); - } - - SearchMan.add("__fallbackFiles", fallbackFiles); - // First thing, load all data that was originally in the executable // We don't need anything prepared for that loadStaticData(); @@ -744,37 +706,8 @@ void CryOmni3DEngine_Versailles::changeLevel(int level) { } void CryOmni3DEngine_Versailles::initNewLevel(int level) { - // SearchMan can't add several times the same basename - // We create several SearchSet with different names that we add to SearchMan instead - - SearchMan.remove("__levelFiles_animacti"); - SearchMan.remove("__levelFiles_warp"); - SearchMan.remove("__levelFiles_img_fix"); - - const Common::FSNode gameDataDir(ConfMan.get("path")); - if (level >= 1 && level <= 7) { - // Add current level directories to the search set to be looked up first - // If a file is not found in the current level, find it with the fallback - - Common::SearchSet *levelFilesAnimacti = new Common::SearchSet(); - Common::SearchSet *levelFilesWarp = new Common::SearchSet(); - Common::SearchSet *levelFilesImgFix = new Common::SearchSet(); - - levelFilesAnimacti->addSubDirectoryMatching(gameDataDir, Common::String::format( - "animacti/level%d", level), 1); - levelFilesWarp->addSubDirectoryMatching(gameDataDir, Common::String::format( - "warp/level%d/cyclo", level), 1); - levelFilesWarp->addSubDirectoryMatching(gameDataDir, Common::String::format( - "warp/level%d/hnm", level), 1); - levelFilesImgFix->addSubDirectoryMatching(gameDataDir, Common::String::format( - "img_fix/level%d", level), 1); - - SearchMan.add("__levelFiles_animacti", levelFilesAnimacti); - SearchMan.add("__levelFiles_warp", levelFilesWarp); - SearchMan.add("__levelFiles_img_fix", levelFilesImgFix); - } else if (level == 8 && _isVisiting) { - // In visit mode, we take files from all levels so we use the fallback mechanism - } else { + if (level < 1 || level > 8 || + (level == 8 && !_isVisiting)) { error("Invalid level %d", level); } diff --git a/engines/cryomni3d/versailles/engine.h b/engines/cryomni3d/versailles/engine.h index 95747ced42..d3cc4c644b 100644 --- a/engines/cryomni3d/versailles/engine.h +++ b/engines/cryomni3d/versailles/engine.h @@ -228,6 +228,8 @@ public: CryOmni3DEngine_Versailles(OSystem *syst, const CryOmni3DGameDescription *gamedesc); virtual ~CryOmni3DEngine_Versailles(); + virtual void initializePath(const Common::FSNode &gamePath) override; + bool hasFeature(EngineFeature f) const override; virtual Common::Error loadGameState(int slot) override; virtual Common::Error saveGameState(int slot, const Common::String &desc) override; diff --git a/engines/cryomni3d/versailles/saveload.cpp b/engines/cryomni3d/versailles/saveload.cpp index 813dc7669d..521bebe226 100644 --- a/engines/cryomni3d/versailles/saveload.cpp +++ b/engines/cryomni3d/versailles/saveload.cpp @@ -46,11 +46,7 @@ Common::String CryOmni3DEngine_Versailles::getSaveFileName(bool visit, uint save } bool CryOmni3DEngine_Versailles::canVisit() const { - // Build a custom SearchSet - const Common::FSNode gameDataDir(ConfMan.get("path")); - Common::SearchSet visitsSearchSet; - visitsSearchSet.addSubDirectoryMatching(gameDataDir, "savegame/visite", 1); - return visitsSearchSet.hasFile("game0001.sav"); + return Common::File::exists("game0001.sav"); } void CryOmni3DEngine_Versailles::getSavesList(bool visit, Common::StringArray &saveNames) { @@ -69,12 +65,9 @@ void CryOmni3DEngine_Versailles::getSavesList(bool visit, Common::StringArray &s if (visit) { // Add bootstrap visit - const Common::FSNode gameDataDir(ConfMan.get("path")); - Common::SearchSet visitsSearchSet; - visitsSearchSet.addSubDirectoryMatching(gameDataDir, "savegame/visite", 1); - if (visitsSearchSet.hasFile("game0001.sav")) { + if (Common::File::exists("game0001.sav")) { Common::File visitFile; - if (!visitFile.open("game0001.sav", visitsSearchSet)) { + if (!visitFile.open("game0001.sav")) { error("Can't load visit file"); } visitFile.read(saveName, kSaveDescriptionLen); @@ -201,11 +194,8 @@ bool CryOmni3DEngine_Versailles::loadGame(bool visit, uint saveNum) { if (visit && saveNum == 1) { // Load bootstrap visit - const Common::FSNode gameDataDir(ConfMan.get("path")); - Common::SearchSet visitsSearchSet; - visitsSearchSet.addSubDirectoryMatching(gameDataDir, "savegame/visite", 1); Common::File *visitFile = new Common::File(); - if (!visitFile->open("game0001.sav", visitsSearchSet)) { + if (!visitFile->open("game0001.sav")) { delete visitFile; error("Can't load visit file"); } |