From b7ee14cadb1e5675f7e36565aec1fe39e55ccc34 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Mon, 6 Jan 2014 14:47:39 +0300 Subject: add ability to inlude config parts from subdirs for items, monsters, npcs. --- src/defaults.cpp | 3 +++ src/resources/beingcommon.cpp | 20 ++++++++++++++++++++ src/resources/beingcommon.h | 4 ++++ src/resources/db/itemdb.cpp | 6 ++++++ src/resources/db/monsterdb.cpp | 7 +++++++ src/resources/db/npcdb.cpp | 7 +++++++ src/utils/files.cpp | 11 +++++++++++ src/utils/files.h | 3 +++ 8 files changed, 61 insertions(+) diff --git a/src/defaults.cpp b/src/defaults.cpp index 98195d214..5e55ff98b 100644 --- a/src/defaults.cpp +++ b/src/defaults.cpp @@ -490,12 +490,15 @@ DefaultsData* getPathsDefaults() AddDEF("soundsFile", "sounds.xml"); AddDEF("itemsFile", "items.xml"); AddDEF("itemsPatchFile", "items_patch.xml"); + AddDEF("itemsPatchDir", "items.d"); AddDEF("avatarsFile", "avatars.xml"); AddDEF("npcsFile", "npcs.xml"); AddDEF("npcsPatchFile", "npcs_patch.xml"); + AddDEF("npcsPatchDir", "npcs.d"); AddDEF("petsFile", "pets.xml"); AddDEF("monstersFile", "monsters.xml"); AddDEF("monstersPatchFile", "monsters_patch.xml"); + AddDEF("monstersPatchDir", "monsters.d"); AddDEF("mapsRemapFile", "maps/remap.xml"); AddDEF("mapsFile", "maps.xml"); AddDEF("deadMessagesFile", "deadmessages.xml"); diff --git a/src/resources/beingcommon.cpp b/src/resources/beingcommon.cpp index 174a6edfd..5647d01e3 100644 --- a/src/resources/beingcommon.cpp +++ b/src/resources/beingcommon.cpp @@ -20,8 +20,14 @@ #include "resources/beingcommon.h" +#include "utils/files.h" +#include "utils/physfstools.h" +#include "utils/stringutils.h" + #include "resources/beinginfo.h" +#include + #include "debug.h" void BeingCommon::readBasicAttributes(BeingInfo *const info, XmlNodePtr node, @@ -42,3 +48,17 @@ void BeingCommon::readBasicAttributes(BeingInfo *const info, XmlNodePtr node, info->setHpBarOffsetX(XML::getProperty(node, "hpBarOffsetX", 0)); info->setHpBarOffsetY(XML::getProperty(node, "hpBarOffsetY", 0)); } + +void BeingCommon::getIncludeFiles(const std::string &dir, StringVect &list) +{ + const std::string path = dir + PhysFs::getDirSeparator(); + StringVect tempList; + Files::getFilesWithDir(path, tempList); + FOR_EACH (StringVectCIter, it, tempList) + { + const std::string &str = *it; + if (findLast(str, ".xml")) + list.push_back(str); + } + std::sort(list.begin(), list.end()); +} diff --git a/src/resources/beingcommon.h b/src/resources/beingcommon.h index 54c9fc35d..6bf481db4 100644 --- a/src/resources/beingcommon.h +++ b/src/resources/beingcommon.h @@ -23,6 +23,8 @@ #include "utils/xml.h" +#include "utils/stringvector.h" + #include "localconsts.h" class BeingInfo; @@ -31,6 +33,8 @@ namespace BeingCommon { void readBasicAttributes(BeingInfo *const info, XmlNodePtr node, const std::string &hoverCursor); + + void getIncludeFiles(const std::string &dir, StringVect &list); } #endif // RESOURCES_BEINGCOMMON_H diff --git a/src/resources/db/itemdb.cpp b/src/resources/db/itemdb.cpp index 81feaea47..4c47658e6 100644 --- a/src/resources/db/itemdb.cpp +++ b/src/resources/db/itemdb.cpp @@ -25,6 +25,7 @@ #include "configuration.h" #include "logger.h" +#include "resources/beingcommon.h" #include "resources/iteminfo.h" #include "utils/dtor.h" @@ -211,6 +212,11 @@ void ItemDB::load() mUnknown->addTag(mTags["All"]); loadXmlFile(paths.getStringValue("itemsFile"), tagNum); loadXmlFile(paths.getStringValue("itemsPatchFile"), tagNum); + + StringVect list; + BeingCommon::getIncludeFiles(paths.getStringValue("itemsPatchDir"), list); + FOR_EACH (StringVectCIter, it, list) + loadXmlFile(*it, tagNum); } void ItemDB::loadXmlFile(const std::string &fileName, int &tagNum) diff --git a/src/resources/db/monsterdb.cpp b/src/resources/db/monsterdb.cpp index f04743507..d5e36f443 100644 --- a/src/resources/db/monsterdb.cpp +++ b/src/resources/db/monsterdb.cpp @@ -50,6 +50,13 @@ void MonsterDB::load() logger->log1("Initializing monster database..."); loadXmlFile(paths.getStringValue("monstersFile")); loadXmlFile(paths.getStringValue("monstersPatchFile")); + + StringVect list; + BeingCommon::getIncludeFiles(paths.getStringValue( + "monstersPatchDir"), list); + FOR_EACH (StringVectCIter, it, list) + loadXmlFile(*it); + mLoaded = true; } diff --git a/src/resources/db/npcdb.cpp b/src/resources/db/npcdb.cpp index 7c983160c..c8b29c9da 100644 --- a/src/resources/db/npcdb.cpp +++ b/src/resources/db/npcdb.cpp @@ -49,6 +49,13 @@ void NPCDB::load() loadXmlFile(paths.getStringValue("npcsFile")); loadXmlFile(paths.getStringValue("npcsPatchFile")); + + StringVect list; + BeingCommon::getIncludeFiles(paths.getStringValue( + "npcsPatchDir"), list); + FOR_EACH (StringVectCIter, it, list) + loadXmlFile(*it); + mLoaded = true; } diff --git a/src/utils/files.cpp b/src/utils/files.cpp index 72a4b2cb5..9abf13593 100644 --- a/src/utils/files.cpp +++ b/src/utils/files.cpp @@ -207,3 +207,14 @@ void Files::getFiles(const std::string &path, StringVect &list) } PhysFs::freeList(fonts); } + +void Files::getFilesWithDir(const std::string &path, StringVect &list) +{ + char **fonts = PhysFs::enumerateFiles(path.c_str()); + for (char **i = fonts; *i; i++) + { + if (!PhysFs::isDirectory((path + *i).c_str())) + list.push_back(path + *i); + } + PhysFs::freeList(fonts); +} diff --git a/src/utils/files.h b/src/utils/files.h index b7b5bbc31..9363f96da 100644 --- a/src/utils/files.h +++ b/src/utils/files.h @@ -56,6 +56,9 @@ namespace Files const std::string &restrict pTo); void getFiles(const std::string &path, StringVect &list); + + void getFilesWithDir(const std::string &restrict path, + StringVect &restrict list); } // namespace Files #endif // UTILS_FILES_H -- cgit v1.2.3-70-g09d2