Add support for directly starting a world by name from command line

This commit is contained in:
sapier 2014-05-20 19:04:57 +02:00
parent 04fbf47744
commit 99f565e8f2

@ -829,7 +829,7 @@ int main(int argc, char *argv[])
/* /*
Low-level initialization Low-level initialization
*/ */
// Quiet mode, print errors only // Quiet mode, print errors only
if (cmd_args.getFlag("quiet")) { if (cmd_args.getFlag("quiet")) {
log_remove_output(&main_stderr_log_out); log_remove_output(&main_stderr_log_out);
@ -1027,7 +1027,7 @@ int main(int argc, char *argv[])
commanded_world.substr(commanded_world.size() - worldmt.size()) commanded_world.substr(commanded_world.size() - worldmt.size())
== worldmt) { == worldmt) {
dstream << _("Supplied world.mt file - stripping it off.") << std::endl; dstream << _("Supplied world.mt file - stripping it off.") << std::endl;
commanded_world = commanded_world.substr(0, commanded_world = commanded_world.substr(0,
commanded_world.size() - worldmt.size()); commanded_world.size() - worldmt.size());
} }
} }
@ -1208,7 +1208,7 @@ int main(int argc, char *argv[])
if (cmd_args.exists("migrate")) { if (cmd_args.exists("migrate")) {
std::string migrate_to = cmd_args.get("migrate"); std::string migrate_to = cmd_args.get("migrate");
Settings world_mt; Settings world_mt;
bool success = world_mt.readConfigFile((world_path + DIR_DELIM bool success = world_mt.readConfigFile((world_path + DIR_DELIM
+ "world.mt").c_str()); + "world.mt").c_str());
if (!success) { if (!success) {
errorstream << "Cannot read world.mt" << std::endl; errorstream << "Cannot read world.mt" << std::endl;
@ -1237,7 +1237,7 @@ int main(int argc, char *argv[])
new_db = new Database_Redis(&(ServerMap&)server.getMap(), world_path); new_db = new Database_Redis(&(ServerMap&)server.getMap(), world_path);
#endif #endif
else { else {
errorstream << "Migration to " << migrate_to errorstream << "Migration to " << migrate_to
<< " is not supported" << std::endl; << " is not supported" << std::endl;
return 1; return 1;
} }
@ -1429,16 +1429,16 @@ int main(int argc, char *argv[])
ELL_ERROR, ELL_ERROR,
ELL_WARNING, ELL_WARNING,
ELL_INFORMATION, ELL_INFORMATION,
#if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8) #if (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 8)
ELL_INFORMATION ELL_INFORMATION
#else #else
ELL_DEBUG ELL_DEBUG
#endif #endif
}; };
ILogger* irr_logger = device->getLogger(); ILogger* irr_logger = device->getLogger();
irr_logger->setLogLevel(irr_log_level[loglevel]); irr_logger->setLogLevel(irr_log_level[loglevel]);
porting::initIrrlicht(device); porting::initIrrlicht(device);
/* /*
@ -1633,15 +1633,14 @@ int main(int argc, char *argv[])
std::vector<WorldSpec> worldspecs = getAvailableWorlds(); std::vector<WorldSpec> worldspecs = getAvailableWorlds();
// If a world was commanded, append and select it // If a world was commanded, append and select it
if (commanded_world != "") { if(commanded_world != "") {
worldspec.gameid = getWorldGameId(commanded_world, true);
std::string gameid = getWorldGameId(commanded_world, true); worldspec.name = _("[--world parameter]");
std::string name = _("[--world parameter]"); if(worldspec.gameid == "") {
if (gameid == "") { worldspec.gameid = g_settings->get("default_game");
gameid = g_settings->get("default_game"); worldspec.name += " [new]";
name += " [new]";
} }
//TODO find within worldspecs and set config worldspec.path = commanded_world;
} }
if (skip_main_menu == false) { if (skip_main_menu == false) {
@ -1695,11 +1694,6 @@ int main(int argc, char *argv[])
// Save settings // Save settings
g_settings->set("name", playername); g_settings->set("name", playername);
if ((menudata.selected_world >= 0) &&
(menudata.selected_world < (int)worldspecs.size()))
g_settings->set("selected_world_path",
worldspecs[menudata.selected_world].path);
// Break out of menu-game loop to shut down cleanly // Break out of menu-game loop to shut down cleanly
if (device->run() == false || kill == true) if (device->run() == false || kill == true)
break; break;
@ -1724,22 +1718,35 @@ int main(int argc, char *argv[])
ServerList::insert(server); ServerList::insert(server);
} }
// Set world path to selected one if ((!skip_main_menu) &&
if ((menudata.selected_world >= 0) && (menudata.selected_world >= 0) &&
(menudata.selected_world < (int)worldspecs.size())) { (menudata.selected_world < (int)worldspecs.size())) {
g_settings->set("selected_world_path",
worldspecs[menudata.selected_world].path);
worldspec = worldspecs[menudata.selected_world]; worldspec = worldspecs[menudata.selected_world];
infostream<<"Selected world: "<<worldspec.name
<<" ["<<worldspec.path<<"]"<<std::endl;
} }
infostream <<"Selected world: " << worldspec.name
<< " ["<<worldspec.path<<"]" <<std::endl;
// If local game // If local game
if (current_address == "") { if (current_address == "") {
if (menudata.selected_world == -1) { if (worldspec.path == "") {
error_message = wgettext("No world selected and no address " error_message = wgettext("No world selected and no address "
"provided. Nothing to do."); "provided. Nothing to do.");
errorstream << wide_to_narrow(error_message) << std::endl; errorstream << wide_to_narrow(error_message) << std::endl;
continue; continue;
} }
if (!fs::PathExists(worldspec.path)) {
error_message = wgettext("Provided world path doesn't exist: ")
+ narrow_to_wide(worldspec.path);
errorstream << wide_to_narrow(error_message) << std::endl;
continue;
}
// Load gamespec for required game // Load gamespec for required game
gamespec = findWorldSubgame(worldspec.path); gamespec = findWorldSubgame(worldspec.path);
if (!gamespec.isValid() && !commanded_gamespec.isValid()) { if (!gamespec.isValid() && !commanded_gamespec.isValid()) {