From 71a3c2fcd13051dbaed45c69107a6e6b4a94cfe8 Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Tue, 13 Mar 2012 01:32:21 +0200
Subject: Allow directly supplying world as a parameter, including world.mt

---
 src/main.cpp   | 25 +++++++++++++++++++++----
 src/settings.h | 10 ++++++++++
 2 files changed, 31 insertions(+), 4 deletions(-)

(limited to 'src')

diff --git a/src/main.cpp b/src/main.cpp
index 4ce73f633..e01e59a33 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -806,7 +806,7 @@ int main(int argc, char *argv[])
 	
 	bool ret = cmd_args.parseCommandLine(argc, argv, allowed_options);
 
-	if(ret == false || cmd_args.getFlag("help"))
+	if(ret == false || cmd_args.getFlag("help") || cmd_args.exists("nonopt1"))
 	{
 		dstream<<"Allowed options:"<<std::endl;
 		for(core::map<std::string, ValueSpec>::Iterator
@@ -979,9 +979,23 @@ int main(int argc, char *argv[])
 		commanded_world = cmd_args.get("world");
 	else if(cmd_args.exists("map-dir"))
 		commanded_world = cmd_args.get("map-dir");
+	else if(cmd_args.exists("nonopt0"))
+		commanded_world = cmd_args.get("nonopt0");
 	else if(g_settings->exists("map-dir"))
 		commanded_world = g_settings->get("map-dir");
 	
+	// Strip world.mt from commanded_world
+	{
+		std::string worldmt = "world.mt";
+		if(commanded_world.size() > worldmt.size() &&
+				commanded_world.substr(commanded_world.size()-worldmt.size())
+				== worldmt){
+			dstream<<"Supplied world.mt file - stripping it off."<<std::endl;
+			commanded_world = commanded_world.substr(
+					0, commanded_world.size()-worldmt.size());
+		}
+	}
+	
 	// Gamespec
 	SubgameSpec commanded_gamespec;
 	if(cmd_args.exists("gameid")){
@@ -1065,7 +1079,9 @@ int main(int argc, char *argv[])
 	*/
 	
 	std::string address = g_settings->get("address");
-	if(cmd_args.exists("address"))
+	if(commanded_world != "")
+		address = "";
+	else if(cmd_args.exists("address"))
 		address = cmd_args.get("address");
 	else if(cmd_args.exists("world"))
 		address = "";
@@ -1294,9 +1310,10 @@ int main(int argc, char *argv[])
 					std::string gameid = getWorldGameId(commanded_world, true);
 					if(gameid == "")
 						gameid = g_settings->get("default_game");
-					WorldSpec spec(commanded_world, "--world", gameid);
+					WorldSpec spec(commanded_world, "[--world parameter]",
+							gameid);
 					worldspecs.push_back(spec);
-					menudata.selected_world = menudata.worlds.size()-1;
+					menudata.selected_world = worldspecs.size()-1;
 				}
 				// Copy worldspecs to menu
 				menudata.worlds = worldspecs;
diff --git a/src/settings.h b/src/settings.h
index 0b828e2a5..b95fbd184 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -330,6 +330,7 @@ public:
 	bool parseCommandLine(int argc, char *argv[],
 			core::map<std::string, ValueSpec> &allowed_options)
 	{
+		int nonopt_index = 0;
 		int i=1;
 		for(;;)
 		{
@@ -338,6 +339,15 @@ public:
 			std::string argname = argv[i];
 			if(argname.substr(0, 2) != "--")
 			{
+				// If option doesn't start with -, read it in as nonoptX
+				if(argname[0] != '-'){
+					std::string name = "nonopt";
+					name += itos(nonopt_index);
+					set(name, argname);
+					nonopt_index++;
+					i++;
+					continue;
+				}
 				errorstream<<"Invalid command-line parameter \""
 						<<argname<<"\": --<option> expected."<<std::endl;
 				return false;
-- 
cgit v1.2.3