// static member(s) AIClientApp::AIClientApp(const std::vector<std::string>& args) : m_player_name(""), m_max_aggression(0) { if (args.size() < 2) { std::cerr << "The AI client should not be executed directly! Run freeorion to start the game."; ExitApp(1); } // read command line args m_player_name = args.at(1); if (args.size() >=3) { m_max_aggression = boost::lexical_cast<int>(args.at(2)); } // Force the log file if requested. if (GetOptionsDB().Get<std::string>("log-file").empty()) { const std::string AICLIENT_LOG_FILENAME((GetUserDataDir() / (m_player_name + ".log")).string()); GetOptionsDB().Set("log-file", AICLIENT_LOG_FILENAME); } // Force the log threshold if requested. auto force_log_level = GetOptionsDB().Get<std::string>("log-level"); if (!force_log_level.empty()) OverrideAllLoggersThresholds(to_LogLevel(force_log_level)); InitLoggingSystem(GetOptionsDB().Get<std::string>("log-file"), "AI"); InitLoggingOptionsDBSystem(); InfoLogger() << FreeOrionVersionString(); DebugLogger() << PlayerName() + " ai client initialized."; }
int main(int argc, char* argv[]) { // copy command line arguments to vector std::vector<std::string> args; for (int i = 0; i < argc; ++i) args.push_back(argv[i]); // set options from command line or config.xml, or generate config.xml if (mainConfigOptionsSetup(args) != 0) { std::cerr << "main() failed config." << std::endl; return 1; } #endif #ifdef FREEORION_WIN32 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); } // set options from command line or config.xml, or generate config.xml if (mainConfigOptionsSetup(args) != 0) { std::cerr << "main() failed config." << std::endl; return 1; } #endif #ifndef FREEORION_MACOSX // did the player request help output? if (GetOptionsDB().Get<bool>("help")) { GetOptionsDB().GetUsage(std::cout); return 0; // quit without actually starting game } // did the player request the version output? if (GetOptionsDB().Get<bool>("version")) { std::cout << "FreeOrionCH " << FreeOrionVersionString() << std::endl; return 0; // quit without actually starting game } // set up rendering and run game if (mainSetupAndRun() != 0) { std::cerr << "main() failed to setup or run SDL." << std::endl; return 1; } return 0; }
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 mainSetupAndRun() { try { int colour_depth = GetOptionsDB().Get<int>("color-depth"); bool fullscreen = GetOptionsDB().Get<bool>("fullscreen"); bool fake_mode_change = GetOptionsDB().Get<bool>("fake-mode-change"); std::pair<int, int> width_height = HumanClientApp::GetWindowWidthHeight(); int width(width_height.first), height(width_height.second); std::pair<int, int> left_top = HumanClientApp::GetWindowLeftTop(); int left(left_top.first), top(left_top.second); int fullscreen_monitor_id = GetOptionsDB().Get<int>("fullscreen-monitor-id"); #ifdef FREEORION_WIN32 # ifdef IDI_ICON1 // set window icon to embedded application icon HWND hwnd; window->getCustomAttribute("WINDOW", &hwnd); HINSTANCE hInst = (HINSTANCE)GetModuleHandle(NULL); SetClassLong (hwnd, GCL_HICON, (LONG)LoadIcon (hInst, MAKEINTRESOURCE (IDI_ICON1))); # endif #endif parse::init(); HumanClientApp app(width_height.first, width_height.second, true, "FreeOrion " + FreeOrionVersionString(), left, top, fullscreen, fake_mode_change); if (GetOptionsDB().Get<bool>("quickstart")) { // immediately start the server, establish network connections, and // go into a single player game, using default universe options (a // standard quickstart, without requiring the user to click the // quickstart button). app.NewSinglePlayerGame(true); // acceptable to call before app() } std::string load_filename = GetOptionsDB().Get<std::string>("load"); if (!load_filename.empty()) { // immediately start the server, establish network connections, and // go into a single player game, loading the indicated file // (without requiring the user to click the load button). app.LoadSinglePlayerGame(load_filename); // acceptable to call before app() } // run rendering loop app(); // calls GUI::operator() which calls SDLGUI::Run() which starts rendering loop } catch (const HumanClientApp::CleanQuit&) { // do nothing std::cout << "mainSetupAndRun caught CleanQuit" << std::endl; } catch (const std::invalid_argument& e) { ErrorLogger() << "main() caught exception(std::invalid_argument): " << e.what(); std::cerr << "main() caught exception(std::invalid_arg): " << e.what() << std::endl; } catch (const std::runtime_error& e) { ErrorLogger() << "main() caught exception(std::runtime_error): " << e.what(); std::cerr << "main() caught exception(std::runtime_error): " << e.what() << std::endl; } catch (const boost::io::format_error& e) { ErrorLogger() << "main() caught exception(boost::io::format_error): " << e.what(); std::cerr << "main() caught exception(boost::io::format_error): " << e.what() << std::endl; } catch (const GG::ExceptionBase& e) { ErrorLogger() << "main() caught exception(" << e.type() << "): " << e.what(); std::cerr << "main() caught exception(" << e.type() << "): " << e.what() << std::endl; } catch (const std::exception& e) { ErrorLogger() << "main() caught exception(std::exception): " << e.what(); std::cerr << "main() caught exception(std::exception): " << e.what() << std::endl; } catch (...) { ErrorLogger() << "main() caught unknown exception."; std::cerr << "main() caught unknown exception." << std::endl; } return 0; }
///////////////////////////////// // IntroScreen ///////////////////////////////// IntroScreen::IntroScreen() : GG::Wnd(GG::X0, GG::Y0, GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight(), GG::Flags<GG::WndFlag>()), m_single_player(0), m_quick_start(0), m_multi_player(0), m_load_game(0), m_options(0), m_about(0), m_credits(0), m_exit_game(0), m_credits_wnd(0), m_menu(0), m_splash(0), m_logo(0), m_version(0) { m_menu = new CUIWnd(UserString("INTRO_WINDOW_TITLE"), GG::X1, GG::Y1, MAIN_MENU_WIDTH, MAIN_MENU_HEIGHT, GG::ONTOP | GG::INTERACTIVE); m_splash = new GG::StaticGraphic(GG::X0, GG::Y0, Width(), Height(), ClientUI::GetTexture(ClientUI::ArtDir() / "splash.png"), GG::GRAPHIC_FITGRAPHIC, GG::INTERACTIVE); m_logo = new GG::StaticGraphic(GG::X0, GG::Y0, Width(), Height() / 10, ClientUI::GetTexture(ClientUI::ArtDir() / "logo.png"), GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); m_version = new GG::TextControl(GG::X0, GG::Y0, FreeOrionVersionString(), ClientUI::GetFont(), ClientUI::TextColor()); m_version->MoveTo(GG::Pt(Width() - m_version->Width(), Height() - m_version->Height())); AttachChild(m_splash); m_splash->AttachChild(m_logo); m_splash->AttachChild(m_menu); m_splash->AttachChild(m_version); //size calculation consts and variables const GG::X MIN_BUTTON_WIDTH(160); const GG::Y MIN_BUTTON_HEIGHT(40); const GG::X H_BUTTON_MARGIN(16); //horizontal empty space const GG::Y V_BUTTON_MARGIN(16); //vertical empty space GG::X button_width(0); //width of the buttons GG::Y button_height(0); //height of the buttons const GG::X H_MAINMENU_MARGIN(40); //horizontal empty space const GG::Y V_MAINMENU_MARGIN(40); //vertical empty space GG::X mainmenu_width(0); //width of the mainmenu GG::Y mainmenu_height(0); //height of the mainmenu //calculate necessary button width boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); button_width = std::max(font->TextExtent(UserString("INTRO_BTN_SINGLE_PLAYER")).x, button_width); button_width = std::max(font->TextExtent(UserString("INTRO_BTN_QUICK_START")).x, button_width); button_width = std::max(font->TextExtent(UserString("INTRO_BTN_MULTI_PLAYER")).x, button_width); button_width = std::max(font->TextExtent(UserString("INTRO_BTN_LOAD_GAME")).x, button_width); button_width = std::max(font->TextExtent(UserString("INTRO_BTN_OPTIONS")).x, button_width); button_width = std::max(font->TextExtent(UserString("INTRO_BTN_ABOUT")).x, button_width); button_width = std::max(font->TextExtent(UserString("INTRO_BTN_CREDITS")).x, button_width); button_width = std::max(font->TextExtent(UserString("INTRO_BTN_EXIT")).x, button_width); button_width += H_BUTTON_MARGIN; button_width = std::max(MIN_BUTTON_WIDTH, button_width); //calculate necessary button height button_height = std::max(MIN_BUTTON_HEIGHT, font->Height() + V_BUTTON_MARGIN); //culate window width and height mainmenu_width = button_width + H_MAINMENU_MARGIN; mainmenu_height = 8.75 * button_height + V_MAINMENU_MARGIN; // 8 rows + 0.75 before exit button // position menu window GG::Pt ul(Width() * GetOptionsDB().Get<double>("UI.main-menu.x") - mainmenu_width/2, Height() * GetOptionsDB().Get<double>("UI.main-menu.y") - mainmenu_height/2); GG::Pt lr(Width() * GetOptionsDB().Get<double>("UI.main-menu.x") + mainmenu_width/2, Height() * GetOptionsDB().Get<double>("UI.main-menu.y") + mainmenu_height/2); m_menu->SizeMove(ul, lr); //create buttons GG::Y button_y(12); //relativ buttonlocation GG::X button_x(15); m_single_player = new CUIButton(button_x, button_y, button_width, UserString("INTRO_BTN_SINGLE_PLAYER")); button_y += button_height; m_quick_start = new CUIButton(button_x, button_y, button_width, UserString("INTRO_BTN_QUICK_START")); button_y += button_height; m_multi_player = new CUIButton(button_x, button_y, button_width, UserString("INTRO_BTN_MULTI_PLAYER")); button_y += button_height; m_load_game = new CUIButton(button_x, button_y, button_width, UserString("INTRO_BTN_LOAD_GAME")); button_y += button_height; m_options = new CUIButton(button_x, button_y, button_width, UserString("INTRO_BTN_OPTIONS")); button_y += button_height; m_about = new CUIButton(button_x, button_y, button_width, UserString("INTRO_BTN_ABOUT")); button_y += button_height; m_credits = new CUIButton(button_x, button_y, button_width, UserString("INTRO_BTN_CREDITS")); button_y += 1.75 * button_height; m_exit_game = new CUIButton(button_x, button_y, button_width, UserString("INTRO_BTN_EXIT")); //attach buttons m_menu->AttachChild(m_single_player); m_menu->AttachChild(m_quick_start); m_menu->AttachChild(m_multi_player); m_menu->AttachChild(m_load_game); m_menu->AttachChild(m_options); m_menu->AttachChild(m_about); m_menu->AttachChild(m_credits); m_menu->AttachChild(m_exit_game); //connect signals and slots GG::Connect(m_single_player->ClickedSignal, &IntroScreen::OnSinglePlayer, this); GG::Connect(m_quick_start->ClickedSignal, &IntroScreen::OnQuickStart, this); GG::Connect(m_multi_player->ClickedSignal, &IntroScreen::OnMultiPlayer, this); GG::Connect(m_load_game->ClickedSignal, &IntroScreen::OnLoadGame, this); GG::Connect(m_options->ClickedSignal, &IntroScreen::OnOptions, this); GG::Connect(m_about->ClickedSignal, &IntroScreen::OnAbout, this); GG::Connect(m_credits->ClickedSignal, &IntroScreen::OnCredits, this); GG::Connect(m_exit_game->ClickedSignal, &IntroScreen::OnExitGame, this); }
///////////////////////////////// // IntroScreen ///////////////////////////////// IntroScreen::IntroScreen() : GG::Wnd(GG::X0, GG::Y0, GG::GUI::GetGUI()->AppWidth(), GG::GUI::GetGUI()->AppHeight(), GG::NO_WND_FLAGS), m_single_player(nullptr), m_quick_start(nullptr), m_multi_player(nullptr), m_load_game(nullptr), m_options(nullptr), m_pedia(nullptr), m_about(nullptr), m_website(nullptr), m_credits(nullptr), m_exit_game(nullptr), m_menu(nullptr), m_splash(nullptr), m_logo(nullptr), m_version(nullptr) { m_menu = new CUIWnd(UserString("INTRO_WINDOW_TITLE"), GG::X1, GG::Y1, MAIN_MENU_WIDTH, MAIN_MENU_HEIGHT, GG::ONTOP | GG::INTERACTIVE); m_splash = new GG::StaticGraphic(ClientUI::GetTexture(ClientUI::ArtDir() / "splash.png"), GG::GRAPHIC_FITGRAPHIC, GG::INTERACTIVE); m_logo = new GG::StaticGraphic(ClientUI::GetTexture(ClientUI::ArtDir() / "logo.png"), GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); m_version = new CUILabel(FreeOrionVersionString(), GG::FORMAT_NOWRAP, GG::INTERACTIVE); m_version->MoveTo(GG::Pt(Width() - m_version->Width(), Height() - m_version->Height())); AttachChild(m_splash); m_splash->AttachChild(m_logo); m_splash->AttachChild(m_menu); m_splash->AttachChild(m_version); //create buttons m_single_player = new CUIButton(UserString("INTRO_BTN_SINGLE_PLAYER")); m_quick_start = new CUIButton(UserString("INTRO_BTN_QUICK_START")); m_multi_player = new CUIButton(UserString("INTRO_BTN_MULTI_PLAYER")); m_load_game = new CUIButton(UserString("INTRO_BTN_LOAD_GAME")); m_options = new CUIButton(UserString("INTRO_BTN_OPTIONS")); m_pedia = new CUIButton(UserString("INTRO_BTN_PEDIA")); m_about = new CUIButton(UserString("INTRO_BTN_ABOUT")); m_website = new CUIButton(UserString("INTRO_BTN_WEBSITE")); m_credits = new CUIButton(UserString("INTRO_BTN_CREDITS")); m_exit_game = new CUIButton(UserString("INTRO_BTN_EXIT")); //attach buttons m_menu->AttachChild(m_single_player); m_menu->AttachChild(m_quick_start); m_menu->AttachChild(m_multi_player); m_menu->AttachChild(m_load_game); m_menu->AttachChild(m_options); m_menu->AttachChild(m_pedia); m_menu->AttachChild(m_about); m_menu->AttachChild(m_website); m_menu->AttachChild(m_credits); m_menu->AttachChild(m_exit_game); //connect signals and slots GG::Connect(m_single_player->LeftClickedSignal, &IntroScreen::OnSinglePlayer, this); GG::Connect(m_quick_start->LeftClickedSignal, &IntroScreen::OnQuickStart, this); GG::Connect(m_multi_player->LeftClickedSignal, &IntroScreen::OnMultiPlayer, this); GG::Connect(m_load_game->LeftClickedSignal, &IntroScreen::OnLoadGame, this); GG::Connect(m_options->LeftClickedSignal, &IntroScreen::OnOptions, this); GG::Connect(m_pedia->LeftClickedSignal, &IntroScreen::OnPedia, this); GG::Connect(m_about->LeftClickedSignal, &IntroScreen::OnAbout, this); GG::Connect(m_website->LeftClickedSignal, &IntroScreen::OnWebsite, this); GG::Connect(m_credits->LeftClickedSignal, &IntroScreen::OnCredits, this); GG::Connect(m_exit_game->LeftClickedSignal, &IntroScreen::OnExitGame, this); DoLayout(); }