diff options
Diffstat (limited to 'src/mods.cpp')
-rw-r--r-- | src/mods.cpp | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/src/mods.cpp b/src/mods.cpp index ac2d9b17d..6a7ab79aa 100644 --- a/src/mods.cpp +++ b/src/mods.cpp @@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "log.h" #include "subgame.h" #include "settings.h" +#include "strfnd.h" std::map<std::string, ModSpec> getModsInPath(std::string path) { @@ -188,11 +189,58 @@ void ModConfiguration::addMods(std::vector<ModSpec> new_mods) } } +// If failed, returned modspec has name=="" +static ModSpec findCommonMod(const std::string &modname) +{ + // Try to find in {$user,$share}/games/common/$modname + std::vector<std::string> find_paths; + find_paths.push_back(porting::path_user + DIR_DELIM + "games" + + DIR_DELIM + "common" + DIR_DELIM + "mods" + DIR_DELIM + modname); + find_paths.push_back(porting::path_share + DIR_DELIM + "games" + + DIR_DELIM + "common" + DIR_DELIM + "mods" + DIR_DELIM + modname); + for(u32 i=0; i<find_paths.size(); i++){ + const std::string &try_path = find_paths[i]; + if(fs::PathExists(try_path)) + return ModSpec(modname, try_path); + } + // Failed to find mod + return ModSpec(); +} + ModConfiguration::ModConfiguration(std::string worldpath) { + SubgameSpec gamespec = findWorldSubgame(worldpath); + + // Add common mods without dependency handling + std::vector<std::string> inexistent_common_mods; + Settings gameconf; + if(getGameConfig(gamespec.path, gameconf)){ + if(gameconf.exists("common_mods")){ + Strfnd f(gameconf.get("common_mods")); + while(!f.atend()){ + std::string modname = trim(f.next(",")); + if(modname.empty()) + continue; + ModSpec spec = findCommonMod(modname); + if(spec.name.empty()) + inexistent_common_mods.push_back(modname); + else + m_sorted_mods.push_back(spec); + } + } + } + if(!inexistent_common_mods.empty()){ + std::string s = "Required common mods "; + for(u32 i=0; i<inexistent_common_mods.size(); i++){ + if(i != 0) s += ", "; + s += std::string("\"") + inexistent_common_mods[i] + "\""; + } + s += " could not be found."; + throw ModError(s); + } + // Add all world mods and all game mods addModsInPath(worldpath + DIR_DELIM + "worldmods"); - SubgameSpec gamespec = findWorldSubgame(worldpath); addModsInPath(gamespec.gamemods_path); // check world.mt file for mods explicitely declared to be @@ -217,6 +265,6 @@ ModConfiguration::ModConfiguration(std::string worldpath) } for(std::set<std::string>::const_iterator i = gamespec.addon_mods_paths.begin(); - i != gamespec.addon_mods_paths.end(); ++i) + i != gamespec.addon_mods_paths.end(); ++i) addModsInPathFiltered((*i),exclude_mod_names); } |