aboutsummaryrefslogtreecommitdiff
path: root/engines/cryomni3d/versailles
diff options
context:
space:
mode:
authorLe Philousophe2019-10-20 17:40:36 +0200
committerLe Philousophe2019-11-16 20:42:50 +0100
commit8254524d9ed8c33cb1a5c22a65c281372fac4c69 (patch)
treee6523c4df37a481ba7080b862434ed47b0b1a132 /engines/cryomni3d/versailles
parent3906d716daf3c634d84b8eff6ede31367516fb3f (diff)
downloadscummvm-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.cpp85
-rw-r--r--engines/cryomni3d/versailles/engine.h2
-rw-r--r--engines/cryomni3d/versailles/saveload.cpp18
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");
}