forked from Mirrorlandia_minetest/minetest
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:
parent
c59d139eeb
commit
42323014ea
43
src/main.cpp
43
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"\"";
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user