int main(int argc, char* argv[]) { InitDirs(argv[0]); std::vector<std::string> args; for (int i = 0; i < argc; ++i) args.push_back(argv[i]); #else int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) { // copy UTF-16 command line arguments to UTF-8 vector std::vector<std::string> args; for (int i = 0; i < argc; ++i) { std::wstring argi16(argv[i]); std::string argi8; utf8::utf16to8(argi16.begin(), argi16.end(), std::back_inserter(argi8)); args.push_back(argi8); } InitDirs((args.empty() ? "" : *args.begin())); #endif try { GetOptionsDB().SetFromCommandLine(args); parse::init(); AIClientApp g_app(args); Logger().debugStream() << "AIClientApp and logging initialized. Running app."; g_app(); } catch (const std::invalid_argument& e) { Logger().errorStream() << "main() caught exception(std::invalid_arg): " << e.what(); std::cerr << "main() caught exception(std::invalid_arg): " << e.what() << std::endl; return 1; } catch (const std::runtime_error& e) { Logger().errorStream() << "main() caught exception(std::runtime_error): " << e.what(); std::cerr << "main() caught exception(std::runtime_error): " << e.what() << std::endl; return 1; } catch (const std::exception& e) { Logger().errorStream() << "main() caught exception(std::exception): " << e.what(); std::cerr << "main() caught exception(std::exception): " << e.what() << std::endl; return 1; } catch (...) { Logger().errorStream() << "main() caught unknown exception."; std::cerr << "main() caught unknown exception." << std::endl; return 1; } return 0; }
const fs::path GetRootDataDir() { if (!g_initialized) InitDirs(""); char* dir_name = br_find_data_dir("/usr/local/share"); fs::path p(dir_name); std::free(dir_name); p /= "freeorion"; // if the path does not exist, we fall back to the working directory if (!exists(p)) { return fs::initial_path(); } else { return p; } }
const fs::path GetBinDir() { if (!g_initialized) InitDirs(""); return bin_dir; }
const fs::path GetPythonHome() { if (!g_initialized) InitDirs(""); return s_python_home; }
const fs::path GetRootDataDir() { if (!g_initialized) InitDirs(""); return s_root_data_dir; }
const fs::path GetUserDir() { if (!g_initialized) InitDirs(""); return s_user_dir; }
int mainConfigOptionsSetup(const std::vector<std::string>& args) { InitDirs((args.empty() ? "" : *args.begin())); // read and process command-line arguments, if any try { // add entries in options DB that have no other obvious place GetOptionsDB().AddFlag('h', "help", UserStringNop("OPTIONS_DB_HELP"), false); GetOptionsDB().AddFlag('g', "generate-config-xml", UserStringNop("OPTIONS_DB_GENERATE_CONFIG_XML"), false); GetOptionsDB().AddFlag('f', "fullscreen", UserStringNop("OPTIONS_DB_FULLSCREEN"), STORE_FULLSCREEN_FLAG); GetOptionsDB().Add("reset-fullscreen-size", UserStringNop("OPTIONS_DB_RESET_FSSIZE"), true); GetOptionsDB().Add<bool>("fake-mode-change", UserStringNop("OPTIONS_DB_FAKE_MODE_CHANGE"), FAKE_MODE_CHANGE_FLAG); GetOptionsDB().Add<int>("fullscreen-monitor-id", UserStringNop("OPTIONS_DB_FULLSCREEN_MONITOR_ID"), 0, RangedValidator<int>(0, 5)); GetOptionsDB().AddFlag('q', "quickstart", UserStringNop("OPTIONS_DB_QUICKSTART"), false); GetOptionsDB().AddFlag("auto-quit", UserStringNop("OPTIONS_DB_AUTO_QUIT"), false); GetOptionsDB().Add<int>("auto-advance-n-turns", UserStringNop("OPTIONS_DB_AUTO_N_TURNS"), 0, RangedValidator<int>(0, 400), false); GetOptionsDB().Add<std::string>("load", UserStringNop("OPTIONS_DB_LOAD"), "", Validator<std::string>(), false); GetOptionsDB().Add("UI.sound.music-enabled", UserStringNop("OPTIONS_DB_MUSIC_ON"), true); GetOptionsDB().Add("UI.sound.enabled", UserStringNop("OPTIONS_DB_SOUND_ON"), true); GetOptionsDB().Add<std::string>("version-string", UserStringNop("OPTIONS_DB_VERSION_STRING"), FreeOrionVersionString(), Validator<std::string>(), true); GetOptionsDB().AddFlag('r', "render-simple", UserStringNop("OPTIONS_DB_RENDER_SIMPLE"), false); // Add the keyboard shortcuts Hotkey::AddOptions(GetOptionsDB()); // read config.xml and set options entries from it, if present { XMLDoc doc; try { boost::filesystem::ifstream ifs(GetConfigPath()); if (ifs) { doc.ReadDoc(ifs); // reject config files from out-of-date version if (doc.root_node.ContainsChild("version-string") && doc.root_node.Child("version-string").Text() == FreeOrionVersionString()) { GetOptionsDB().SetFromXML(doc); } } } catch (const std::exception&) { std::cerr << UserString("UNABLE_TO_READ_CONFIG_XML") << std::endl; } } // override previously-saved and default options with command line parameters and flags GetOptionsDB().SetFromCommandLine(args); // Handle the case where the resource-dir does not exist anymore // gracefully by resetting it to the standard path into the // application bundle. This may happen if a previous installed // version of FreeOrion was residing in a different directory. if (!boost::filesystem::exists(GetResourceDir()) || !boost::filesystem::exists(GetResourceDir() / "credits.xml") || !boost::filesystem::exists(GetResourceDir() / "data" / "art" / "misc" / "missing.png")) { DebugLogger() << "Resources directory from config.xml missing or does not contain expected files. Resetting to default."; GetOptionsDB().Set<std::string>("resource-dir", ""); // double-check that resetting actually fixed things... if (!boost::filesystem::exists(GetResourceDir()) || !boost::filesystem::exists(GetResourceDir() / "credits.xml") || !boost::filesystem::exists(GetResourceDir() / "data" / "art" / "misc" / "missing.png")) { DebugLogger() << "Default Resources directory missing or does not contain expected files. Cannot start game."; throw std::runtime_error("Unable to load game resources at default location: " + PathString(GetResourceDir()) + " : Install may be broken."); } } // did the player request generation of config.xml, saving the default (or current) options to disk? if (GetOptionsDB().Get<bool>("generate-config-xml")) { try { GetOptionsDB().Commit(); } catch (const std::exception&) { std::cerr << UserString("UNABLE_TO_WRITE_CONFIG_XML") << std::endl; } } if (GetOptionsDB().Get<bool>("render-simple")) { GetOptionsDB().Set<bool>("UI.galaxy-gas-background",false); GetOptionsDB().Set<bool>("UI.galaxy-starfields", false); GetOptionsDB().Set<bool>("show-fps", true); } } catch (const std::invalid_argument& e) { std::cerr << "main() caught exception(std::invalid_argument): " << e.what() << std::endl; boost::this_thread::sleep(boost::posix_time::seconds(3)); return 1; } catch (const std::runtime_error& e) { std::cerr << "main() caught exception(std::runtime_error): " << e.what() << std::endl; boost::this_thread::sleep(boost::posix_time::seconds(3)); return 1; } catch (const std::exception& e) { std::cerr << "main() caught exception(std::exception): " << e.what() << std::endl; boost::this_thread::sleep(boost::posix_time::seconds(3)); return 1; } catch (...) { std::cerr << "main() caught unknown exception." << std::endl; return 1; } return 0; }
int main(int argc, char* argv[]) { InitDirs(argv[0]); std::vector<std::string> args; for (int i = 0; i < argc; ++i) args.push_back(argv[i]); #else int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) { // copy UTF-16 command line arguments to UTF-8 vector std::vector<std::string> args; for (int i = 0; i < argc; ++i) { std::wstring argi16(argv[i]); std::string argi8; utf8::utf16to8(argi16.begin(), argi16.end(), std::back_inserter(argi8)); args.push_back(argi8); } InitDirs((args.empty() ? "" : *args.begin())); #endif try { GetOptionsDB().AddFlag('h', "help", "Print this help message."); // read config.xml and set options entries from it, if present XMLDoc doc; { boost::filesystem::ifstream ifs(GetConfigPath()); if (ifs) { doc.ReadDoc(ifs); GetOptionsDB().SetFromXML(doc); } } GetOptionsDB().SetFromCommandLine(args); if (GetOptionsDB().Get<bool>("help")) { GetOptionsDB().GetUsage(std::cerr); return 0; } parse::init(); ServerApp g_app; g_app(); // Calls ServerApp::Run() to run app (intialization and main process loop) } catch (const std::invalid_argument& e) { Logger().errorStream() << "main() caught exception(std::invalid_arg): " << e.what(); std::cerr << "main() caught exception(std::invalid_arg): " << e.what() << std::endl; return 1; } catch (const std::runtime_error& e) { Logger().errorStream() << "main() caught exception(std::runtime_error): " << e.what(); std::cerr << "main() caught exception(std::runtime_error): " << e.what() << std::endl; return 1; } catch (const std::exception& e) { Logger().errorStream() << "main() caught exception(std::exception): " << e.what(); std::cerr << "main() caught exception(std::exception): " << e.what() << std::endl; return 1; } catch (...) { Logger().errorStream() << "main() caught unknown exception."; std::cerr << "main() caught unknown exception." << std::endl; return 1; } return 0; }