/** * Can the AI config in the given company slot be edited? * @param slot The slot to query. * @return True if and only if the given AI Config slot can e edited. */ static bool IsEditable(CompanyID slot) { if (_game_mode != GM_NORMAL) { return slot > 0 && slot <= GetGameSettings().difficulty.max_no_competitors; } if (Company::IsValidID(slot) || slot < 0) return false; int max_slot = GetGameSettings().difficulty.max_no_competitors; for (CompanyID cid = COMPANY_FIRST; cid < (CompanyID)max_slot && cid < MAX_COMPANIES; cid++) { if (Company::IsValidHumanID(cid)) max_slot++; } return slot < max_slot; }
/** * Some data on this window has become invalid. * @param data Information about the changed data. * @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details. */ virtual void OnInvalidateData(int data = 0, bool gui_scope = true) { if (!IsEditable(this->selected_slot)) { this->selected_slot = INVALID_COMPANY; } if (!gui_scope) return; this->SetWidgetDisabledState(AIC_WIDGET_DECREASE, GetGameSettings().difficulty.max_no_competitors == 0); this->SetWidgetDisabledState(AIC_WIDGET_INCREASE, GetGameSettings().difficulty.max_no_competitors == MAX_COMPANIES - 1); this->SetWidgetDisabledState(AIC_WIDGET_CHANGE, this->selected_slot == INVALID_COMPANY); this->SetWidgetDisabledState(AIC_WIDGET_CONFIGURE, this->selected_slot == INVALID_COMPANY); this->SetWidgetDisabledState(AIC_WIDGET_MOVE_UP, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot - 1))); this->SetWidgetDisabledState(AIC_WIDGET_MOVE_DOWN, this->selected_slot == INVALID_COMPANY || !IsEditable((CompanyID)(this->selected_slot + 1))); }
virtual void SetStringParameters(int widget) const { switch (widget) { case AIC_WIDGET_NUMBER: SetDParam(0, GetGameSettings().difficulty.max_no_competitors); break; } }
int ScriptConfig::GetSetting(const char *name) const { /* Return default values if the difficulty is not set to Custom */ if (GetGameSettings().difficulty.diff_level != 3) { return this->info->GetSettingDefaultValue(name); } SettingValueList::const_iterator it = this->settings.find(name); if (it == this->settings.end()) return this->info->GetSettingDefaultValue(name); return (*it).second; }
int AIInfo::GetSettingDefaultValue(const char *name) const { for (AIConfigItemList::const_iterator it = this->config_list.begin(); it != this->config_list.end(); it++) { if (strcmp((*it).name, name) != 0) continue; /* The default value depends on the difficulty level */ switch (GetGameSettings().difficulty.diff_level) { case 0: return (*it).easy_value; case 1: return (*it).medium_value; case 2: return (*it).hard_value; case 3: return (*it).custom_value; default: NOT_REACHED(); } } /* There is no such setting */ return -1; }
YAML::Node LootState::GetDefaultSettings() const { YAML::Node root; root["language"] = "en"; root["game"] = "auto"; root["lastGame"] = "auto"; root["enableDebugLogging"] = false; root["updateMasterlist"] = true; // Add base game definitions, and Nehrim. GetGameSettings(root); GameSettings settings(GameSettings::tes4, "Nehrim"); root["games"].push_back(settings.SetDetails("Nehrim - At Fate's Edge", "Nehrim.esm", settings.RepoURL(), settings.RepoBranch(), "", "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Nehrim - At Fate's Edge_is1\\InstallLocation")); return root; }
virtual void OnClick(Point pt, int widget, int click_count) { switch (widget) { case AIC_WIDGET_DECREASE: case AIC_WIDGET_INCREASE: { int new_value; if (widget == AIC_WIDGET_DECREASE) { new_value = max(0, GetGameSettings().difficulty.max_no_competitors - 1); } else { new_value = min(MAX_COMPANIES - 1, GetGameSettings().difficulty.max_no_competitors + 1); } IConsoleSetSetting("difficulty.max_no_competitors", new_value); this->InvalidateData(); break; } case AIC_WIDGET_LIST: { // Select a slot this->selected_slot = (CompanyID)this->vscroll->GetScrolledRowFromWidget(pt.y, this, widget, 0, this->line_height); this->InvalidateData(); if (click_count > 1 && this->selected_slot != INVALID_COMPANY) ShowAIListWindow((CompanyID)this->selected_slot); break; } case AIC_WIDGET_MOVE_UP: if (IsEditable(this->selected_slot) && IsEditable((CompanyID)(this->selected_slot - 1))) { Swap(GetGameSettings().ai_config[this->selected_slot], GetGameSettings().ai_config[this->selected_slot - 1]); this->selected_slot--; this->vscroll->ScrollTowards(this->selected_slot); this->InvalidateData(); } break; case AIC_WIDGET_MOVE_DOWN: if (IsEditable(this->selected_slot) && IsEditable((CompanyID)(this->selected_slot + 1))) { Swap(GetGameSettings().ai_config[this->selected_slot], GetGameSettings().ai_config[this->selected_slot + 1]); this->selected_slot++; this->vscroll->ScrollTowards(this->selected_slot); this->InvalidateData(); } break; case AIC_WIDGET_CHANGE: // choose other AI ShowAIListWindow((CompanyID)this->selected_slot); break; case AIC_WIDGET_CONFIGURE: // change the settings for an AI ShowAISettingsWindow((CompanyID)this->selected_slot); break; case AIC_WIDGET_CLOSE: delete this; break; case AIC_WIDGET_CONTENT_DOWNLOAD: if (!_network_available) { ShowErrorMessage(STR_NETWORK_ERROR_NOTAVAILABLE, INVALID_STRING_ID, WL_ERROR); } else { #if defined(ENABLE_NETWORK) ShowNetworkContentListWindow(NULL, CONTENT_TYPE_AI); #endif } break; } }
void LootState::Init(const std::string& cmdLineGame) { // Do some preliminary locale / UTF-8 support setup here, in case the settings file reading requires it. //Boost.Locale initialisation: Specify location of language dictionaries. boost::locale::generator gen; gen.add_messages_path(g_path_l10n.string()); gen.add_messages_domain("loot"); //Boost.Locale initialisation: Generate and imbue locales. locale::global(gen(Language(Language::english).Locale() + ".UTF-8")); boost::filesystem::path::imbue(locale()); // Check if the LOOT local app data folder exists, and create it if not. if (!fs::exists(g_path_local)) { BOOST_LOG_TRIVIAL(info) << "Local app data LOOT folder doesn't exist, creating it."; try { fs::create_directory(g_path_local); } catch (exception& e) { _initErrors.push_back((format(translate("Error: Could not create LOOT settings file. %1%")) % e.what()).str()); } } if (fs::exists(g_path_settings)) { try { loot::ifstream in(g_path_settings); _settings = YAML::Load(in); in.close(); } catch (exception& e) { _initErrors.push_back((format(translate("Error: Settings parsing failed. %1%")) % e.what()).str()); } } // Check if the settings are valid (or if they don't exist). if (!AreSettingsValid()) { _settings = GetDefaultSettings(); } //Set up logging. boost::log::add_file_log( boost::log::keywords::file_name = g_path_log.string().c_str(), boost::log::keywords::auto_flush = true, boost::log::keywords::format = ( boost::log::expressions::stream << "[" << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%H:%M:%S") << "]" << " [" << boost::log::trivial::severity << "]: " << boost::log::expressions::smessage ) ); boost::log::add_common_attributes(); bool enableDebugLogging = false; if (_settings["enableDebugLogging"]) { enableDebugLogging = _settings["enableDebugLogging"].as<bool>(); } if (enableDebugLogging) boost::log::core::get()->set_logging_enabled(true); else boost::log::core::get()->set_logging_enabled(false); // Log some useful info. BOOST_LOG_TRIVIAL(info) << "LOOT Version: " << g_version_major << "." << g_version_minor << "." << g_version_patch; BOOST_LOG_TRIVIAL(info) << "LOOT Build Revision: " << g_build_revision; #ifdef _WIN32 // Check if LOOT is being run through Mod Organiser. bool runFromMO = GetModuleHandle(ToWinWide("hook.dll").c_str()) != NULL; if (runFromMO) { BOOST_LOG_TRIVIAL(info) << "LOOT is being run through Mod Organiser."; } #endif // The CEF debug log is appended to, not overwritten, so it gets really long. // Delete the current CEF debug log. fs::remove(g_path_local / "CEFDebugLog.txt"); // Now that settings have been loaded, set the locale again to handle translations. if (_settings["language"] && _settings["language"].as<string>() != Language(Language::english).Locale()) { BOOST_LOG_TRIVIAL(debug) << "Initialising language settings."; loot::Language lang(_settings["language"].as<string>()); BOOST_LOG_TRIVIAL(debug) << "Selected language: " << lang.Name(); //Boost.Locale initialisation: Generate and imbue locales. locale::global(gen(lang.Locale() + ".UTF-8")); boost::filesystem::path::imbue(locale()); } // Detect games & select startup game //----------------------------------- //Detect installed games. BOOST_LOG_TRIVIAL(debug) << "Detecting installed games."; try { _games = ToGames(GetGameSettings(_settings)); } catch (YAML::Exception& e) { BOOST_LOG_TRIVIAL(error) << "Games' settings parsing failed. " << e.what(); _initErrors.push_back((format(translate("Error: Games' settings parsing failed. %1%")) % e.what()).str()); // Now redo, but with no games settings, so only the hardcoded defaults get loaded. It means the user can // at least still then edit them. _games = ToGames(GetGameSettings(YAML::Node())); } try { BOOST_LOG_TRIVIAL(debug) << "Selecting game."; SelectGame(cmdLineGame); BOOST_LOG_TRIVIAL(debug) << "Initialising game-specific settings."; _currentGame->Init(true); // Update game path in settings object. _settings["games"] = ToGameSettings(_games); } catch (loot::error &e) { if (e.code() == loot::error::no_game_detected) { _initErrors.push_back(e.what()); } else { BOOST_LOG_TRIVIAL(error) << "Game-specific settings could not be initialised. " << e.what(); _initErrors.push_back((format(translate("Error: Game-specific settings could not be initialised. %1%")) % e.what()).str()); } } BOOST_LOG_TRIVIAL(debug) << "Game selected is " << _currentGame->Name(); }