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.
This commit is contained in:
Perttu Ahola 2012-04-08 23:15:50 +03:00
parent c59d139eeb
commit 42323014ea
3 changed files with 43 additions and 21 deletions

@ -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"\"";

@ -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;

@ -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();