Support placing a minetest game inside $world/game to allow creating proper adventure...
authorPerttu Ahola <celeron55@gmail.com>
Sun, 8 Apr 2012 20:15:50 +0000 (23:15 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Sun, 8 Apr 2012 20:17:02 +0000 (23:17 +0300)
Pro-tip: You can open a world in minetest by opening the world.mt file using minetest.

src/main.cpp
src/subgame.cpp
src/subgame.h

index 8ec4c26321023e9dede1bb4178e5a5f0b30061ab..c1ed70fafc2886adbd58fd2273cfe259307d858a 100644 (file)
@@ -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"\"";
index 243bdc04805cfeeeb84d1e3e332c9ad4072e4418..eafa1ec709c46272606381aab99499262c762725 100644 (file)
@@ -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;
index 49e526d76b9f2ab616ff12e6b6f1e2e7d25bec49..dd888ea0036ffc858ff2c34609731a32c248dd7a 100644 (file)
@@ -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();