diff --git a/doc/minetest.6 b/doc/minetest.6 index d94c12cb6..ff5452029 100644 --- a/doc/minetest.6 +++ b/doc/minetest.6 @@ -83,6 +83,12 @@ Set world path Migrate from current map backend to another. Possible values are sqlite3 and leveldb. Only works when using --server. +.SH ENVIRONMENT VARIABLES + +.TP +MINETEST_SUBGAME_PATH +Colon delimited list of directories to search for subgames. + .SH BUGS Please report all bugs to Perttu Ahola . diff --git a/src/subgame.cpp b/src/subgame.cpp index f2465c93e..e86655bc1 100644 --- a/src/subgame.cpp +++ b/src/subgame.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "filesys.h" #include "settings.h" #include "log.h" +#include "strfnd.h" #ifndef SERVER #include "tile.h" // getImagePath #endif @@ -59,6 +60,17 @@ struct GameFindPath {} }; +Strfnd getSubgamePathEnv() { + std::string sp; + char *subgame_path = getenv("MINETEST_SUBGAME_PATH"); + + if(subgame_path) { + sp = std::string(subgame_path); + } + + return Strfnd(sp); +} + SubgameSpec findSubgame(const std::string &id) { if(id == "") @@ -66,6 +78,17 @@ SubgameSpec findSubgame(const std::string &id) std::string share = porting::path_share; std::string user = porting::path_user; std::vector find_paths; + + Strfnd search_paths = getSubgamePathEnv(); + + while(!search_paths.atend()) { + std::string path = search_paths.next(":"); + find_paths.push_back(GameFindPath( + path + DIR_DELIM + id, false)); + find_paths.push_back(GameFindPath( + path + DIR_DELIM + id + "_game", false)); + } + find_paths.push_back(GameFindPath( user + DIR_DELIM + "games" + DIR_DELIM + id + "_game", true)); find_paths.push_back(GameFindPath( @@ -129,6 +152,13 @@ std::set getAvailableGameIds() std::set gamespaths; gamespaths.insert(porting::path_share + DIR_DELIM + "games"); gamespaths.insert(porting::path_user + DIR_DELIM + "games"); + + Strfnd search_paths = getSubgamePathEnv(); + + while(!search_paths.atend()) { + gamespaths.insert(search_paths.next(":")); + } + for(std::set::const_iterator i = gamespaths.begin(); i != gamespaths.end(); i++){ std::vector dirlist = fs::GetDirListing(*i);