diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/subgame.cpp | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/subgame.cpp b/src/subgame.cpp index 9a8ebe69f..00b63bdcf 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 "utility_string.h" std::string getGameName(const std::string &game_path) { @@ -35,20 +36,43 @@ std::string getGameName(const std::string &game_path) return conf.get("name"); } +struct GameFindPath +{ + std::string path; + bool user_specific; + GameFindPath(const std::string &path, bool user_specific): + path(path), + user_specific(user_specific) + {} +}; + SubgameSpec findSubgame(const std::string &id) { if(id == "") return SubgameSpec(); std::string share = porting::path_share; std::string user = porting::path_user; + std::vector<GameFindPath> find_paths; + find_paths.push_back(GameFindPath( + user + DIR_DELIM + "games" + DIR_DELIM + id, true)); + find_paths.push_back(GameFindPath( + user + DIR_DELIM + "games" + DIR_DELIM + id + "_game", true)); + find_paths.push_back(GameFindPath( + share + DIR_DELIM + "games" + DIR_DELIM + id, false)); + find_paths.push_back(GameFindPath( + share + DIR_DELIM + "games" + DIR_DELIM + id + "_game", false)); // Find game directory - std::string game_path = user + DIR_DELIM + "games" + DIR_DELIM + id; + std::string game_path; bool user_game = true; // Game is in user's directory - if(!fs::PathExists(game_path)){ - game_path = share + DIR_DELIM + "games" + DIR_DELIM + id; - user_game = false; + for(u32 i=0; i<find_paths.size(); i++){ + const std::string &try_path = find_paths[i].path; + if(fs::PathExists(try_path)){ + game_path = try_path; + user_game = find_paths[i].user_specific; + break; + } } - if(!fs::PathExists(game_path)) + if(game_path == "") return SubgameSpec(); // Find mod directories std::set<std::string> mods_paths; @@ -57,7 +81,6 @@ SubgameSpec findSubgame(const std::string &id) mods_paths.insert(share + DIR_DELIM + "mods" + DIR_DELIM + id); if(user != share || user_game) mods_paths.insert(user + DIR_DELIM + "mods" + DIR_DELIM + id); - // TODO: Read proper name from game_path/game.conf std::string game_name = getGameName(game_path); if(game_name == "") game_name = id; @@ -76,7 +99,12 @@ std::set<std::string> getAvailableGameIds() for(u32 j=0; j<dirlist.size(); j++){ if(!dirlist[j].dir) continue; - gameids.insert(dirlist[j].name); + const char *ends[] = {"_game", NULL}; + std::string shorter = removeStringEnd(dirlist[j].name, ends); + if(shorter != "") + gameids.insert(shorter); + else + gameids.insert(dirlist[j].name); } } return gameids; |