summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPerttu Ahola <celeron55@gmail.com>2012-04-08 23:15:50 +0300
committerPerttu Ahola <celeron55@gmail.com>2012-04-08 23:17:02 +0300
commit42323014eaf359f76b388e75e788486bb0bda280 (patch)
tree46490264492dd1d69fc5b3528f5406d31ae64b08 /src
parentc59d139eebf06680bb4ea019b9a952c20e334154 (diff)
downloadminetest-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.
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp43
-rw-r--r--src/subgame.cpp18
-rw-r--r--src/subgame.h3
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();