Search for subgames using $MINETEST_SUBGAME_PATH.

master
David Thompson 2014-09-06 13:21:46 -04:00 committed by sfan5
parent d221917170
commit fd5eaae2ba
2 changed files with 36 additions and 0 deletions

View File

@ -83,6 +83,12 @@ Set world path
Migrate from current map backend to another. Possible values are sqlite3 Migrate from current map backend to another. Possible values are sqlite3
and leveldb. Only works when using --server. 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 .SH BUGS
Please report all bugs to Perttu Ahola <celeron55@gmail.com>. Please report all bugs to Perttu Ahola <celeron55@gmail.com>.

View File

@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "filesys.h" #include "filesys.h"
#include "settings.h" #include "settings.h"
#include "log.h" #include "log.h"
#include "strfnd.h"
#ifndef SERVER #ifndef SERVER
#include "tile.h" // getImagePath #include "tile.h" // getImagePath
#endif #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) SubgameSpec findSubgame(const std::string &id)
{ {
if(id == "") if(id == "")
@ -66,6 +78,17 @@ SubgameSpec findSubgame(const std::string &id)
std::string share = porting::path_share; std::string share = porting::path_share;
std::string user = porting::path_user; std::string user = porting::path_user;
std::vector<GameFindPath> find_paths; std::vector<GameFindPath> 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( find_paths.push_back(GameFindPath(
user + DIR_DELIM + "games" + DIR_DELIM + id + "_game", true)); user + DIR_DELIM + "games" + DIR_DELIM + id + "_game", true));
find_paths.push_back(GameFindPath( find_paths.push_back(GameFindPath(
@ -129,6 +152,13 @@ std::set<std::string> getAvailableGameIds()
std::set<std::string> gamespaths; std::set<std::string> gamespaths;
gamespaths.insert(porting::path_share + DIR_DELIM + "games"); gamespaths.insert(porting::path_share + DIR_DELIM + "games");
gamespaths.insert(porting::path_user + 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<std::string>::const_iterator i = gamespaths.begin(); for(std::set<std::string>::const_iterator i = gamespaths.begin();
i != gamespaths.end(); i++){ i != gamespaths.end(); i++){
std::vector<fs::DirListNode> dirlist = fs::GetDirListing(*i); std::vector<fs::DirListNode> dirlist = fs::GetDirListing(*i);