diff options
author | Perttu Ahola <celeron55@gmail.com> | 2012-04-08 23:15:50 +0300 |
---|---|---|
committer | Perttu Ahola <celeron55@gmail.com> | 2012-04-08 23:17:02 +0300 |
commit | 42323014eaf359f76b388e75e788486bb0bda280 (patch) | |
tree | 46490264492dd1d69fc5b3528f5406d31ae64b08 | |
parent | c59d139eebf06680bb4ea019b9a952c20e334154 (diff) | |
download | minetest-42323014eaf359f76b388e75e788486bb0bda280.tar.gz minetest-42323014eaf359f76b388e75e788486bb0bda280.tar.bz2 minetest-42323014eaf359f76b388e75e788486bb0bda280.zip |
Support placing a minetest game inside $world/game to allow creating proper adventure maps
Pro-tip: You can open a world in minetest by opening the world.mt file using minetest.
-rw-r--r-- | src/main.cpp | 43 | ||||
-rw-r--r-- | src/subgame.cpp | 18 | ||||
-rw-r--r-- | src/subgame.h | 3 |
3 files changed, 43 insertions, 21 deletions
diff --git a/src/main.cpp b/src/main.cpp index 8ec4c2632..c1ed70faf 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1135,43 +1135,44 @@ int main(int argc, char *argv[]) } verbosestream<<"Using world path ["<<world_path<<"]"<<std::endl; - // We need a gameid. - std::string gameid; - verbosestream<<"Determining gameid"<<std::endl; + // We need a gamespec. + SubgameSpec gamespec; + verbosestream<<"Determining gameid/gamespec"<<std::endl; // If world doesn't exist if(!getWorldExists(world_path)) { // Try to take gamespec from command line if(commanded_gamespec.isValid()){ - gameid = commanded_gamespec.id; - infostream<<"Using commanded gameid ["<<gameid<<"]"<<std::endl; + gamespec = commanded_gamespec; + infostream<<"Using commanded gameid ["<<gamespec.id<<"]"<<std::endl; } // Otherwise we will be using "minetest" else{ - gameid = g_settings->get("default_game"); - infostream<<"Using default gameid ["<<gameid<<"]"<<std::endl; + gamespec = findSubgame(g_settings->get("default_game")); + infostream<<"Using default gameid ["<<gamespec.id<<"]"<<std::endl; } } - // If world exists + // World exists else { - // Otherwise read from the world std::string world_gameid = getWorldGameId(world_path, is_legacy_world); - gameid = world_gameid; - if(commanded_gamespec.isValid() && - commanded_gamespec.id != world_gameid){ - gameid = commanded_gamespec.id; - errorstream<<"WARNING: Using commanded gameid ["<<gameid<<"]" - <<" instead of world gameid ["<<world_gameid - <<"]"<<std::endl; + // If commanded to use a gameid, do so + if(commanded_gamespec.isValid()){ + gamespec = commanded_gamespec; + if(commanded_gamespec.id != world_gameid){ + errorstream<<"WARNING: Using commanded gameid [" + <<gamespec.id<<"]"<<" instead of world gameid [" + <<world_gameid<<"]"<<std::endl; + } } else{ - infostream<<"Using world gameid ["<<gameid<<"]"<<std::endl; + // If world contains an embedded game, use it; + // Otherwise find world from local system. + gamespec = findWorldSubgame(world_path); + infostream<<"Using world gameid ["<<gamespec.id<<"]"<<std::endl; } } - verbosestream<<"Finding subgame ["<<gameid<<"]"<<std::endl; - SubgameSpec gamespec = findSubgame(gameid); if(!gamespec.isValid()){ - errorstream<<"Subgame ["<<gameid<<"] could not be found." + errorstream<<"Subgame ["<<gamespec.id<<"] could not be found." <<std::endl; return 1; } @@ -1602,7 +1603,7 @@ int main(int argc, char *argv[]) continue; } // Load gamespec for required game - gamespec = findSubgame(worldspec.gameid); + gamespec = findWorldSubgame(worldspec.path); if(!gamespec.isValid() && !commanded_gamespec.isValid()){ error_message = L"Could not find or load game \"" + narrow_to_wide(worldspec.gameid) + L"\""; diff --git a/src/subgame.cpp b/src/subgame.cpp index 243bdc048..eafa1ec70 100644 --- a/src/subgame.cpp +++ b/src/subgame.cpp @@ -87,6 +87,24 @@ SubgameSpec findSubgame(const std::string &id) return SubgameSpec(id, game_path, mods_paths, game_name); } +SubgameSpec findWorldSubgame(const std::string &world_path) +{ + std::string world_gameid = getWorldGameId(world_path, true); + // See if world contains an embedded game; if so, use it. + std::string world_gamepath = world_path + DIR_DELIM + "game"; + if(fs::PathExists(world_gamepath)){ + SubgameSpec gamespec; + gamespec.id = world_gameid; + gamespec.path = world_gamepath; + gamespec.mods_paths.insert(world_gamepath + DIR_DELIM + "mods"); + gamespec.name = getGameName(world_gamepath); + if(gamespec.name == "") + gamespec.name = "unknown"; + return gamespec; + } + return findSubgame(world_gameid); +} + std::set<std::string> getAvailableGameIds() { std::set<std::string> gameids; diff --git a/src/subgame.h b/src/subgame.h index 49e526d76..dd888ea00 100644 --- a/src/subgame.h +++ b/src/subgame.h @@ -47,7 +47,10 @@ struct SubgameSpec } }; +std::string getGameName(const std::string &game_path); + SubgameSpec findSubgame(const std::string &id); +SubgameSpec findWorldSubgame(const std::string &world_path); std::set<std::string> getAvailableGameIds(); std::vector<SubgameSpec> getAvailableGames(); |