HumanClientApp::HumanClientApp(int width, int height, bool calculate_fps, const std::string& name, int x, int y, bool fullscreen, bool fake_mode_change) : ClientApp(), SDLGUI(width, height, calculate_fps, name, x, y, fullscreen, fake_mode_change), m_fsm(0), m_single_player_game(true), m_game_started(false), m_connected(false), m_auto_turns(0), m_have_window_focus(true) { #ifdef ENABLE_CRASH_BACKTRACE signal(SIGSEGV, SigHandler); #endif #ifdef FREEORION_MACOSX SDL_SetHint(SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK, "1"); #endif m_fsm = new HumanClientFSM(*this); const std::string HUMAN_CLIENT_LOG_FILENAME((GetUserDir() / "freeorion.log").string()); InitLogger(HUMAN_CLIENT_LOG_FILENAME, "Client"); try { DebugLogger() << "GL Version String: " << GetGLVersionString(); } catch (...) { ErrorLogger() << "Unable to get GL Version String?"; } LogDependencyVersions(); boost::shared_ptr<GG::StyleFactory> style(new CUIStyle()); SetStyleFactory(style); SetMinDragTime(0); m_ui = boost::shared_ptr<ClientUI>(new ClientUI()); if ((GetOptionsDB().Get<bool>("UI.sound.music-enabled"))) Sound::GetSound().PlayMusic(GetOptionsDB().Get<std::string>("UI.sound.bg-music"), -1); Sound::GetSound().SetMusicVolume(GetOptionsDB().Get<int>("UI.sound.music-volume")); Sound::GetSound().SetUISoundsVolume(GetOptionsDB().Get<int>("UI.sound.volume")); EnableFPS(); UpdateFPSLimit(); GG::Connect(GetOptionsDB().OptionChangedSignal("show-fps"), &HumanClientApp::UpdateFPSLimit, this); boost::shared_ptr<GG::BrowseInfoWnd> default_browse_info_wnd( new GG::TextBoxBrowseInfoWnd(GG::X(400), ClientUI::GetFont(), GG::Clr(0, 0, 0, 200), ClientUI::WndOuterBorderColor(), ClientUI::TextColor(), GG::FORMAT_LEFT | GG::FORMAT_WORDBREAK, 1)); GG::Wnd::SetDefaultBrowseInfoWnd(default_browse_info_wnd); boost::shared_ptr<GG::Texture> cursor_texture = m_ui->GetTexture(ClientUI::ArtDir() / "cursors" / "default_cursor.png"); SetCursor(boost::shared_ptr<GG::TextureCursor>(new GG::TextureCursor(cursor_texture, GG::Pt(GG::X(6), GG::Y(3))))); RenderCursor(true); EnableKeyPressRepeat(GetOptionsDB().Get<int>("UI.keypress-repeat-delay"), GetOptionsDB().Get<int>("UI.keypress-repeat-interval")); EnableMouseButtonDownRepeat(GetOptionsDB().Get<int>("UI.mouse-click-repeat-delay"), GetOptionsDB().Get<int>("UI.mouse-click-repeat-interval")); GG::Connect(WindowResizedSignal, &HumanClientApp::HandleWindowResize, this); GG::Connect(FocusChangedSignal, &HumanClientApp::HandleFocusChange, this); GG::Connect(WindowMovedSignal, &HumanClientApp::HandleWindowMove, this); /* TODO: Wire these signals if theyare needed GG::Connect(WindowClosingSignal, &HumanClientApp::HandleWindowClosing, this); GG::Connect(WindowClosedSignal, &HumanClientApp::HandleWindowClose, this); */ SetStringtableDependentOptionDefaults(); SetGLVersionDependentOptionDefaults(); this->SetMouseLRSwapped(GetOptionsDB().Get<bool>("UI.swap-mouse-lr")); std::map<std::string, std::map<int, int> > named_key_maps; parse::keymaps(GetResourceDir() / "keymaps.txt", named_key_maps); if (GetOptionsDB().Get<bool>("verbose-logging")) { DebugLogger() << "Keymaps:"; for (std::map<std::string, std::map<int, int> >::const_iterator km_it = named_key_maps.begin(); km_it != named_key_maps.end(); ++km_it) { DebugLogger() << "Keymap name = \"" << km_it->first << "\""; const std::map<int, int>& key_map = km_it->second; for (std::map<int, int>::const_iterator keys_it = key_map.begin(); keys_it != key_map.end(); ++keys_it) DebugLogger() << " " << char(keys_it->first) << " : " << char(keys_it->second); } } std::map<std::string, std::map<int, int> >::const_iterator km_it = named_key_maps.find("TEST"); if (km_it != named_key_maps.end()) { const std::map<int, int> int_key_map = km_it->second; std::map<GG::Key, GG::Key> key_map; for (std::map<int, int>::const_iterator key_int_it = int_key_map.begin(); key_int_it != int_key_map.end(); ++key_int_it) { key_map[GG::Key(key_int_it->first)] = GG::Key(key_int_it->second); } this->SetKeyMap(key_map); } ConnectKeyboardAcceleratorSignals(); InitAutoTurns(GetOptionsDB().Get<int>("auto-advance-n-turns")); if (fake_mode_change && !FramebuffersAvailable()) { ErrorLogger() << "Requested fake mode changes, but the framebuffer opengl extension is not available. Ignoring."; } m_fsm->initiate(); }
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; }
bool monster_fleet_plans(std::vector<MonsterFleetPlan*>& monster_fleet_plans_) { boost::filesystem::path path = GetResourceDir() / "scripting/monster_fleets.inf"; return detail::parse_file<rules, std::vector<MonsterFleetPlan*> >(path, monster_fleet_plans_); }
bool keymaps(NamedKeymaps& nkm) { boost::filesystem::path path = GetResourceDir() / "scripting/keymaps.inf"; return detail::parse_file<rules, NamedKeymaps>(path, nkm); }
std::string GetAIDir() { return (GetResourceDir() / GetOptionsDB().Get<std::string>("ai-path")).string(); }