diff options
author | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-01-26 22:22:12 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <bjorn@lindeijer.nl> | 2024-01-26 22:25:09 +0100 |
commit | d86a1df562e00a6e930683534b9d001f45a951ff (patch) | |
tree | 9a93089f89580e6023f5671d6a2256285b75c590 | |
parent | 5afe88df2538274859a162ffd63ed52118e80c19 (diff) | |
download | mana-d86a1df562e00a6e930683534b9d001f45a951ff.tar.gz mana-d86a1df562e00a6e930683534b9d001f45a951ff.tar.bz2 mana-d86a1df562e00a6e930683534b9d001f45a951ff.tar.xz mana-d86a1df562e00a6e930683534b9d001f45a951ff.zip |
Added fallback for XML data files and support absolute paths
For compatibility with TMW, which has not yet adopted a central
"settings.xml" that includes all the other files.
Also, a "name" attribute with an absolute path is now supported in
addition to the relative "file" attribute, since that is what ManaPlus
supported.
This resolves most of issue #43.
-rw-r--r-- | src/resources/settingsmanager.cpp | 48 |
1 files changed, 34 insertions, 14 deletions
diff --git a/src/resources/settingsmanager.cpp b/src/resources/settingsmanager.cpp index a26fae9d..ad872385 100644 --- a/src/resources/settingsmanager.cpp +++ b/src/resources/settingsmanager.cpp @@ -43,7 +43,7 @@ namespace SettingsManager static std::string mSettingsFile; static std::set<std::string> mIncludedFiles; - static void loadFile(const std::string &filename); + static bool loadFile(const std::string &filename); void load() { @@ -60,7 +60,18 @@ namespace SettingsManager Units::init(); // load stuff from settings - loadFile("settings.xml"); + if (!loadFile("settings.xml")) + { + // fall back to loading certain known files for TMW compatibility + loadFile("paths.xml"); + loadFile("items.xml"); + loadFile("monsters.xml"); + loadFile("npcs.xml"); + loadFile("emotes.xml"); + loadFile("status-effects.xml"); + loadFile("hair.xml"); + loadFile("units.xml"); + } Attributes::checkStatus(); hairDB.checkStatus(); @@ -94,7 +105,7 @@ namespace SettingsManager /** * Loads a settings file. */ - static void loadFile(const std::string &filename) + static bool loadFile(const std::string &filename) { logger->log("Loading game settings from %s", filename.c_str()); @@ -108,10 +119,9 @@ namespace SettingsManager if (!node /*|| !xmlStrEqual(node->name, BAD_CAST "settings") */) { logger->log("Settings Manager: %s is not a valid settings file!", filename.c_str()); - return; + return false; } - // go through every node for_each_xml_child_node(childNode, node) { @@ -121,27 +131,37 @@ namespace SettingsManager if (xmlStrEqual(childNode->name, BAD_CAST "include")) { // include an other file - const std::string includeFile = XML::getProperty(childNode, "file", std::string()); + std::string includeFile = XML::getProperty(childNode, "file", std::string()); - // check if file property was given if (!includeFile.empty()) { // build absolute path path const utils::splittedPath splittedPath = utils::splitFileNameAndPath(filename); - const std::string realIncludeFile = utils::cleanPath( - utils::joinPaths(splittedPath.path, includeFile)); + includeFile = utils::cleanPath(utils::joinPaths(splittedPath.path, includeFile)); + } + else + { + // try to get name property, which has an absolute value + includeFile = XML::getProperty(childNode, "name", std::string()); + } + // check if file property was given + if (!includeFile.empty()) + { // check if we're not entering a loop - if (mIncludedFiles.find(realIncludeFile) != mIncludedFiles.end()) + if (mIncludedFiles.find(includeFile) != mIncludedFiles.end()) { - logger->log("Circular include loop detecting while including %s from %s", includeFile.c_str(), filename.c_str()); + logger->log("Warning: Circular include loop detecting while including %s from %s", includeFile.c_str(), filename.c_str()); } else { - // include that file - loadFile(realIncludeFile); + loadFile(includeFile); } } + else + { + logger->log("Warning: <include> element without 'file' or 'name' attribute in %s", filename.c_str()); + } } else if (xmlStrEqual(childNode->name, BAD_CAST "option")) { @@ -207,6 +227,6 @@ namespace SettingsManager } mIncludedFiles.erase(filename); + return true; } - } |