diff --git a/src/subgame.cpp b/src/subgame.cpp index 9a8ebe69..00b63bdc 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 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 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 getAvailableGameIds() for(u32 j=0; j