Game Config Manager: code formatting

This commit is contained in:
Charles Dang 2020-12-18 23:55:41 +11:00
parent 68e2d13275
commit 8da8d3ee55

View File

@ -11,6 +11,7 @@
See the COPYING file for more details. See the COPYING file for more details.
*/ */
#include "game_config_manager.hpp" #include "game_config_manager.hpp"
#include "about.hpp" #include "about.hpp"
@ -19,45 +20,43 @@
#include "cursor.hpp" #include "cursor.hpp"
#include "events.hpp" #include "events.hpp"
#include "formatter.hpp" #include "formatter.hpp"
#include "game_config.hpp"
#include "gettext.hpp"
#include "game_classification.hpp" #include "game_classification.hpp"
#include "game_config.hpp"
#include "game_version.hpp"
#include "gettext.hpp"
#include "gui/dialogs/loading_screen.hpp" #include "gui/dialogs/loading_screen.hpp"
#include "gui/dialogs/wml_error.hpp" #include "gui/dialogs/wml_error.hpp"
#include "hotkey/hotkey_item.hpp"
#include "hotkey/hotkey_command.hpp" #include "hotkey/hotkey_command.hpp"
#include "hotkey/hotkey_item.hpp"
#include "language.hpp" #include "language.hpp"
#include "log.hpp" #include "log.hpp"
#include "picture.hpp"
#include "preferences/general.hpp" #include "preferences/general.hpp"
#include "scripting/game_lua_kernel.hpp" #include "scripting/game_lua_kernel.hpp"
#include "serialization/schema_validator.hpp"
#include "sound.hpp"
#include "terrain/builder.hpp" #include "terrain/builder.hpp"
#include "terrain/type_data.hpp" #include "terrain/type_data.hpp"
#include "units/types.hpp"
#include "game_version.hpp"
#include "theme.hpp" #include "theme.hpp"
#include "picture.hpp" #include "units/types.hpp"
#include "sound.hpp"
#include "serialization/schema_validator.hpp"
static lg::log_domain log_config("config"); static lg::log_domain log_config("config");
#define ERR_CONFIG LOG_STREAM(err, log_config) #define ERR_CONFIG LOG_STREAM(err, log_config)
#define WRN_CONFIG LOG_STREAM(warn, log_config) #define WRN_CONFIG LOG_STREAM(warn, log_config)
#define LOG_CONFIG LOG_STREAM(info, log_config) #define LOG_CONFIG LOG_STREAM(info, log_config)
static game_config_manager * singleton; static game_config_manager* singleton;
game_config_manager::game_config_manager( game_config_manager::game_config_manager(const commandline_options& cmdline_opts, const bool jump_to_editor)
const commandline_options& cmdline_opts, : cmdline_opts_(cmdline_opts)
const bool jump_to_editor) : , jump_to_editor_(jump_to_editor)
cmdline_opts_(cmdline_opts), , game_config_()
jump_to_editor_(jump_to_editor), , game_config_view_()
game_config_(), , addon_cfgs_()
game_config_view_(), , active_addons_()
addon_cfgs_(), , old_defines_map_()
active_addons_(), , paths_manager_()
old_defines_map_(), , cache_(game_config::config_cache::instance())
paths_manager_(),
cache_(game_config::config_cache::instance())
{ {
assert(!singleton); assert(!singleton);
singleton = this; singleton = this;
@ -67,6 +66,7 @@ game_config_manager::game_config_manager(
if(cmdline_opts_.nocache || cmdline_opts_.any_validation_option()) { if(cmdline_opts_.nocache || cmdline_opts_.any_validation_option()) {
cache_.set_use_cache(false); cache_.set_use_cache(false);
} }
if(cmdline_opts_.validcache) { if(cmdline_opts_.validcache) {
cache_.set_force_valid_cache(true); cache_.set_force_valid_cache(true);
} }
@ -78,7 +78,8 @@ game_config_manager::~game_config_manager()
singleton = nullptr; singleton = nullptr;
} }
game_config_manager * game_config_manager::get() { game_config_manager* game_config_manager::get()
{
return singleton; return singleton;
} }
@ -95,7 +96,6 @@ bool game_config_manager::init_game_config(FORCE_RELOAD_CONFIG force_reload)
game_config::reset_color_info(); game_config::reset_color_info();
load_game_config_with_loadscreen(force_reload); load_game_config_with_loadscreen(force_reload);
game_config::load_config(game_config().child("game_config")); game_config::load_config(game_config().child("game_config"));
@ -114,62 +114,67 @@ bool game_config_manager::init_game_config(FORCE_RELOAD_CONFIG force_reload)
return true; return true;
} }
namespace { namespace
{
/// returns true if every define in special is also defined in general /// returns true if every define in special is also defined in general
bool map_includes(const preproc_map& general, const preproc_map& special) bool map_includes(const preproc_map& general, const preproc_map& special)
{ {
for (const preproc_map::value_type& pair : special) for(const preproc_map::value_type& pair : special) {
{
preproc_map::const_iterator it = general.find(pair.first); preproc_map::const_iterator it = general.find(pair.first);
if (it == general.end() || it->second != pair.second) { if(it == general.end() || it->second != pair.second) {
return false; return false;
} }
} }
return true; return true;
} }
} // end anonymous namespace } // end anonymous namespace
void game_config_manager::load_game_config_with_loadscreen(FORCE_RELOAD_CONFIG force_reload, void game_config_manager::load_game_config_with_loadscreen(
game_classification const*, FORCE_RELOAD_CONFIG force_reload, game_classification const*, utils::optional<std::set<std::string>> active_addons)
utils::optional<std::set<std::string>> active_addons)
{ {
if (!lg::info().dont_log(log_config)) { if(!lg::info().dont_log(log_config)) {
auto out = formatter(); auto out = formatter();
out << "load_game_config: defines:"; out << "load_game_config: defines:";
for(const auto& pair : cache_.get_preproc_map()) { for(const auto& pair : cache_.get_preproc_map()) {
out << pair.first << ","; out << pair.first << ",";
} }
out << "\n add_ons:"; out << "\n add_ons:";
if(active_addons) { if(active_addons) {
for(const auto& str : *active_addons) { for(const auto& str : *active_addons) {
out << str << ","; out << str << ",";
} }
} } else {
else {
out << "\n Everything:"; out << "\n Everything:";
} }
out << "\n"; out << "\n";
FORCE_LOG_TO(lg::info(), log_config) << out.str(); FORCE_LOG_TO(lg::info(), log_config) << out.str();
} }
game_config::scoped_preproc_define debug_mode("DEBUG_MODE", game_config::scoped_preproc_define debug_mode("DEBUG_MODE",
game_config::debug || game_config::mp_debug); game_config::debug || game_config::mp_debug);
bool reload_everything = true; bool reload_everything = true;
// Game_config already holds requested config in memory. // Game_config already holds requested config in memory.
if (!game_config_.empty()) { if(!game_config_.empty()) {
if ((force_reload == NO_FORCE_RELOAD) && old_defines_map_ == cache_.get_preproc_map()) { if((force_reload == NO_FORCE_RELOAD) && old_defines_map_ == cache_.get_preproc_map()) {
reload_everything = false; reload_everything = false;
} }
if ((force_reload == NO_INCLUDE_RELOAD) && map_includes(old_defines_map_, cache_.get_preproc_map())) {
if((force_reload == NO_INCLUDE_RELOAD) && map_includes(old_defines_map_, cache_.get_preproc_map())) {
reload_everything = false; reload_everything = false;
} }
if(!reload_everything && active_addons == active_addons_) { if(!reload_everything && active_addons == active_addons_) {
LOG_CONFIG << "load_game_config aborting\n"; LOG_CONFIG << "load_game_config aborting\n";
return; return;
} }
} }
active_addons_ = active_addons; active_addons_ = active_addons;
LOG_CONFIG << "load_game_config: everything:" << reload_everything << "\n"; LOG_CONFIG << "load_game_config: everything:" << reload_everything << "\n";
@ -203,8 +208,8 @@ void game_config_manager::load_game_config(bool reload_everything)
// Start transaction so macros are shared. // Start transaction so macros are shared.
game_config::config_cache_transaction main_transaction; game_config::config_cache_transaction main_transaction;
config cores_cfg;
// Load mainline cores definition file. // Load mainline cores definition file.
config cores_cfg;
cache_.get_config(game_config::path + "/data/cores.cfg", cores_cfg); cache_.get_config(game_config::path + "/data/cores.cfg", cores_cfg);
// Append the $user_campaign_dir/*/cores.cfg files to the cores. // Append the $user_campaign_dir/*/cores.cfg files to the cores.
@ -212,12 +217,13 @@ void game_config_manager::load_game_config(bool reload_everything)
{ {
const std::string user_campaign_dir = filesystem::get_addons_dir(); const std::string user_campaign_dir = filesystem::get_addons_dir();
std::vector<std::string> user_files; std::vector<std::string> user_files;
filesystem::get_files_in_dir(user_campaign_dir, &user_files, &user_dirs, filesystem::get_files_in_dir(
filesystem::name_mode::ENTIRE_FILE_PATH); user_campaign_dir, &user_files, &user_dirs, filesystem::name_mode::ENTIRE_FILE_PATH);
} }
for (const std::string& umc : user_dirs) {
for(const std::string& umc : user_dirs) {
const std::string cores_file = umc + "/cores.cfg"; const std::string cores_file = umc + "/cores.cfg";
if (filesystem::file_exists(cores_file)) { if(filesystem::file_exists(cores_file)) {
config cores; config cores;
cache_.get_config(cores_file, cores); cache_.get_config(cores_file, cores);
cores_cfg.append(cores); cores_cfg.append(cores);
@ -228,10 +234,10 @@ void game_config_manager::load_game_config(bool reload_everything)
config valid_cores; config valid_cores;
bool current_core_valid = false; bool current_core_valid = false;
std::string wml_tree_root; std::string wml_tree_root;
for (const config& core : cores_cfg.child_range("core")) {
for(const config& core : cores_cfg.child_range("core")) {
const std::string& id = core["id"]; const std::string& id = core["id"];
if (id.empty()) { if(id.empty()) {
events::call_in_main_thread([&]() { events::call_in_main_thread([&]() {
gui2::dialogs::wml_error::display( gui2::dialogs::wml_error::display(
_("Error validating data core."), _("Error validating data core."),
@ -240,7 +246,8 @@ void game_config_manager::load_game_config(bool reload_everything)
}); });
continue; continue;
} }
if (*&valid_cores.find_child("core", "id", id)) {
if(*&valid_cores.find_child("core", "id", id)) {
events::call_in_main_thread([&]() { events::call_in_main_thread([&]() {
gui2::dialogs::wml_error::display( gui2::dialogs::wml_error::display(
_("Error validating data core."), _("Error validating data core."),
@ -252,7 +259,7 @@ void game_config_manager::load_game_config(bool reload_everything)
} }
const std::string& path = core["path"]; const std::string& path = core["path"];
if (!filesystem::file_exists(filesystem::get_wml_location(path))) { if(!filesystem::file_exists(filesystem::get_wml_location(path))) {
events::call_in_main_thread([&]() { events::call_in_main_thread([&]() {
gui2::dialogs::wml_error::display( gui2::dialogs::wml_error::display(
_("Error validating data core."), _("Error validating data core."),
@ -264,10 +271,10 @@ void game_config_manager::load_game_config(bool reload_everything)
continue; continue;
} }
if (id == "default" && !current_core_valid) { if(id == "default" && !current_core_valid) {
wml_tree_root = path; wml_tree_root = path;
} }
if (id == preferences::core_id()) { if(id == preferences::core_id()) {
current_core_valid = true; current_core_valid = true;
wml_tree_root = path; wml_tree_root = path;
} }
@ -275,7 +282,7 @@ void game_config_manager::load_game_config(bool reload_everything)
valid_cores.add_child("core", core); // append(core); valid_cores.add_child("core", core); // append(core);
} }
if (!current_core_valid) { if(!current_core_valid) {
events::call_in_main_thread([&]() { events::call_in_main_thread([&]() {
gui2::dialogs::wml_error::display( gui2::dialogs::wml_error::display(
_("Error loading core data."), _("Error loading core data."),
@ -287,7 +294,7 @@ void game_config_manager::load_game_config(bool reload_everything)
} }
// check if we have a valid default core which should always be the case. // check if we have a valid default core which should always be the case.
if (wml_tree_root.empty()) { if(wml_tree_root.empty()) {
events::call_in_main_thread([&]() { events::call_in_main_thread([&]() {
gui2::dialogs::wml_error::display( gui2::dialogs::wml_error::display(
_("Error loading core data."), _("Error loading core data."),
@ -303,27 +310,26 @@ void game_config_manager::load_game_config(bool reload_everything)
validator.reset(new schema_validation::schema_validator(filesystem::get_wml_location("schema/game_config.cfg"))); validator.reset(new schema_validation::schema_validator(filesystem::get_wml_location("schema/game_config.cfg")));
validator->set_create_exceptions(false); // Don't crash if there's an error, just go ahead anyway validator->set_create_exceptions(false); // Don't crash if there's an error, just go ahead anyway
} }
cache_.get_config(filesystem::get_wml_location(wml_tree_root), game_config_, validator.get()); cache_.get_config(filesystem::get_wml_location(wml_tree_root), game_config_, validator.get());
game_config_.append(valid_cores); game_config_.append(valid_cores);
main_transaction.lock(); main_transaction.lock();
if(!game_config::no_addons && !cmdline_opts_.noaddons) {
if (!game_config::no_addons && !cmdline_opts_.noaddons) {
load_addons_cfg(); load_addons_cfg();
} }
} }
if(active_addons_) { if(active_addons_) {
set_enabled_addon(*active_addons_); set_enabled_addon(*active_addons_);
} } else {
else {
set_enabled_addon_all(); set_enabled_addon_all();
} }
// Extract the Lua scripts at toplevel. // Extract the Lua scripts at toplevel.
game_lua_kernel::extract_preload_scripts(game_config()); game_lua_kernel::extract_preload_scripts(game_config());
set_unit_data(); set_unit_data();
terrain_builder::set_terrain_rules_cfg(game_config()); terrain_builder::set_terrain_rules_cfg(game_config());
tdata_ = std::make_shared<terrain_type_data>(game_config()); tdata_ = std::make_shared<terrain_type_data>(game_config());
@ -332,14 +338,13 @@ void game_config_manager::load_game_config(bool reload_everything)
set_multiplayer_hashes(); set_multiplayer_hashes();
game_config::add_color_info(game_config()); game_config::add_color_info(game_config());
} catch(const game::error& e) { } catch(const game::error& e) {
ERR_CONFIG << "Error loading game configuration files\n" << e.message << '\n'; ERR_CONFIG << "Error loading game configuration files\n" << e.message << '\n';
// Try reloading without add-ons // Try reloading without add-ons
if (!game_config::no_addons) { if(!game_config::no_addons) {
game_config::no_addons = true; game_config::no_addons = true;
events::call_in_main_thread([&]() { events::call_in_main_thread([&]() {
gui2::dialogs::wml_error::display( gui2::dialogs::wml_error::display(
@ -347,7 +352,7 @@ void game_config_manager::load_game_config(bool reload_everything)
e.message); e.message);
}); });
load_game_config(reload_everything); load_game_config(reload_everything);
} else if (preferences::core_id() != "default") { } else if(preferences::core_id() != "default") {
events::call_in_main_thread([&]() { events::call_in_main_thread([&]() {
gui2::dialogs::wml_error::display( gui2::dialogs::wml_error::display(
_("Error loading custom game configuration files. The game will fallback to the default core files."), _("Error loading custom game configuration files. The game will fallback to the default core files."),
@ -381,8 +386,7 @@ void game_config_manager::load_addons_cfg()
std::vector<std::string> user_dirs; std::vector<std::string> user_dirs;
std::vector<std::string> user_files; std::vector<std::string> user_files;
filesystem::get_files_in_dir(user_campaign_dir, &user_files, &user_dirs, filesystem::get_files_in_dir(user_campaign_dir, &user_files, &user_dirs, filesystem::name_mode::ENTIRE_FILE_PATH);
filesystem::name_mode::ENTIRE_FILE_PATH);
// Warn player about addons using the no-longer-supported single-file format. // Warn player about addons using the no-longer-supported single-file format.
for(const std::string& file : user_files) { for(const std::string& file : user_files) {
@ -470,10 +474,11 @@ void game_config_manager::load_addons_cfg()
try { try {
std::unique_ptr<schema_validation::schema_validator> validator; std::unique_ptr<schema_validation::schema_validator> validator;
if( cmdline_opts_.validate_addon && *cmdline_opts_.validate_addon == addon_id) { if(cmdline_opts_.validate_addon && *cmdline_opts_.validate_addon == addon_id) {
validator.reset(new schema_validation::schema_validator(filesystem::get_wml_location("schema/game_config.cfg"))); validator.reset(new schema_validation::schema_validator(filesystem::get_wml_location("schema/game_config.cfg")));
validator->set_create_exceptions(false); // Don't crash if there's an error, just go ahead anyway validator->set_create_exceptions(false); // Don't crash if there's an error, just go ahead anyway
} }
// Load this addon from the cache to a config. // Load this addon from the cache to a config.
config umc_cfg; config umc_cfg;
cache_.get_config(main_cfg, umc_cfg, validator.get()); cache_.get_config(main_cfg, umc_cfg, validator.get());
@ -497,11 +502,11 @@ void game_config_manager::load_addons_cfg()
cfg["addon_version"] = addon_version.str(); cfg["addon_version"] = addon_version.str();
} }
} }
config advancefroms; config advancefroms;
for(auto& units : umc_cfg.child_range("units")) { for(auto& units : umc_cfg.child_range("units")) {
for(auto& unit_type : units.child_range("unit_type")) { for(auto& unit_type : units.child_range("unit_type")) {
for(const auto& advancefrom : units.child_range("advancefrom")) { for(const auto& advancefrom : units.child_range("advancefrom")) {
config modify_unit_type { config modify_unit_type {
"type", unit_type["id"], "type", unit_type["id"],
"add_advancement", advancefrom["unit"], "add_advancement", advancefrom["unit"],
@ -519,10 +524,25 @@ void game_config_manager::load_addons_cfg()
unit_type.remove_children("advancefrom", [](const config&){return true;}); unit_type.remove_children("advancefrom", [](const config&){return true;});
} }
} }
//hardcoded list of 1.14 advancement macros, just used for the werro mesage below.
std::set<std::string> deprecated_defeines = {"ENABLE_PARAGON", "DISABLE_GRAND_MARSHAL", "ENABLE_ARMAGEDDON_DRAKE", "ENABLE_DWARVISH_ARCANISTER", "ENABLE_DWARVISH_RUNESMITH ", "ENABLE_WOLF_ADVANCEMENT", "ENABLE_NIGHTBLADE", "ENABLE_TROLL_SHAMAN", "ENABLE_ANCIENT_LICH", "ENABLE_DEATH_KNIGHT", "ENABLE_WOSE_SHAMAN"}; // hardcoded list of 1.14 advancement macros, just used for the werro mesage below.
std::set<std::string> deprecated_defeines = {
"ENABLE_PARAGON",
"DISABLE_GRAND_MARSHAL",
"ENABLE_ARMAGEDDON_DRAKE",
"ENABLE_DWARVISH_ARCANISTER",
"ENABLE_DWARVISH_RUNESMITH ",
"ENABLE_WOLF_ADVANCEMENT",
"ENABLE_NIGHTBLADE",
"ENABLE_TROLL_SHAMAN",
"ENABLE_ANCIENT_LICH",
"ENABLE_DEATH_KNIGHT",
"ENABLE_WOSE_SHAMAN"
};
for(auto& campaign : umc_cfg.child_range("campaign")) { for(auto& campaign : umc_cfg.child_range("campaign")) {
campaign.append_children(std::move(advancefroms)); campaign.append_children(std::move(advancefroms));
for(auto str : utils::split(campaign["extra_defines"])) { for(auto str : utils::split(campaign["extra_defines"])) {
if(deprecated_defeines.count(str) > 0) { if(deprecated_defeines.count(str) > 0) {
//TODO: we could try to implement a compatabiltiy path by //TODO: we could try to implement a compatabiltiy path by
@ -540,6 +560,7 @@ void game_config_manager::load_addons_cfg()
} }
} }
} }
static const std::set<std::string> entry_tags { static const std::set<std::string> entry_tags {
"era", "era",
"modification", "modification",
@ -548,9 +569,11 @@ void game_config_manager::load_addons_cfg()
"scenario", "scenario",
"campaign" "campaign"
}; };
for (const std::string& tagname : entry_tags) {
for(const std::string& tagname : entry_tags) {
game_config_.append_children_by_move(umc_cfg, tagname); game_config_.append_children_by_move(umc_cfg, tagname);
} }
addon_cfgs_[addon_id] = std::move(umc_cfg); addon_cfgs_[addon_id] = std::move(umc_cfg);
} catch(const config::error& err) { } catch(const config::error& err) {
ERR_CONFIG << "error reading usermade add-on '" << main_cfg << "'" << std::endl; ERR_CONFIG << "error reading usermade add-on '" << main_cfg << "'" << std::endl;
@ -601,7 +624,7 @@ void game_config_manager::load_addons_cfg()
void game_config_manager::set_multiplayer_hashes() void game_config_manager::set_multiplayer_hashes()
{ {
config& hashes = game_config_.add_child("multiplayer_hashes"); config& hashes = game_config_.add_child("multiplayer_hashes");
for (const config &ch : game_config().child_range("multiplayer")) { for(const config& ch : game_config().child_range("multiplayer")) {
hashes[ch["id"].str()] = ch.hash(); hashes[ch["id"].str()] = ch.hash();
} }
} }
@ -634,8 +657,7 @@ void game_config_manager::load_game_config_for_editor()
} }
void game_config_manager::load_game_config_for_game( void game_config_manager::load_game_config_for_game(
const game_classification& classification const game_classification& classification, const std::string& scenario_id)
, const std::string& scenario_id)
{ {
game_config::scoped_preproc_define difficulty(classification.difficulty, game_config::scoped_preproc_define difficulty(classification.difficulty,
!classification.difficulty.empty()); !classification.difficulty.empty());
@ -677,7 +699,6 @@ void game_config_manager::load_game_config_for_game(
} }
load_game_config_with_loadscreen(NO_FORCE_RELOAD); load_game_config_with_loadscreen(NO_FORCE_RELOAD);
throw; throw;
} }
@ -693,14 +714,15 @@ void game_config_manager::load_game_config_for_create(bool is_mp, bool is_test)
game_config::scoped_preproc_define multiplayer("MULTIPLAYER", is_mp); game_config::scoped_preproc_define multiplayer("MULTIPLAYER", is_mp);
game_config::scoped_preproc_define test("TEST", is_test); game_config::scoped_preproc_define test("TEST", is_test);
game_config::scoped_preproc_define mptest("MP_TEST", cmdline_opts_.mptest && is_mp); game_config::scoped_preproc_define mptest("MP_TEST", cmdline_opts_.mptest && is_mp);
///During an mp game the default difficuly define is also defined so better already load it now if we alreeady must reload config cache. /// During an mp game the default difficuly define is also defined so better already load it now if we alreeady must
game_config::scoped_preproc_define normal(DEFAULT_DIFFICULTY, !map_includes(old_defines_map_, cache_.get_preproc_map())); /// reload config cache.
game_config::scoped_preproc_define normal(
DEFAULT_DIFFICULTY, !map_includes(old_defines_map_, cache_.get_preproc_map()));
typedef std::unique_ptr<game_config::scoped_preproc_define> define; typedef std::unique_ptr<game_config::scoped_preproc_define> define;
try{ try {
load_game_config_with_loadscreen(NO_INCLUDE_RELOAD); load_game_config_with_loadscreen(NO_INCLUDE_RELOAD);
} } catch(const game::error&) {
catch(const game::error&) {
cache_.clear_defines(); cache_.clear_defines();
std::deque<define> previous_defines; std::deque<define> previous_defines;
@ -709,15 +731,16 @@ void game_config_manager::load_game_config_for_create(bool is_mp, bool is_test)
} }
load_game_config_with_loadscreen(NO_FORCE_RELOAD); load_game_config_with_loadscreen(NO_FORCE_RELOAD);
throw; throw;
} }
} }
void game_config_manager::set_enabled_addon(std::set<std::string> addon_ids) void game_config_manager::set_enabled_addon(std::set<std::string> addon_ids)
{ {
auto& vec = game_config_view_.data(); auto& vec = game_config_view_.data();
vec.clear(); vec.clear();
vec.push_back(game_config_); vec.push_back(game_config_);
for(const std::string& id : addon_ids) { for(const std::string& id : addon_ids) {
auto it = addon_cfgs_.find(id); auto it = addon_cfgs_.find(id);
if(it != addon_cfgs_.end()) { if(it != addon_cfgs_.end()) {
@ -725,13 +748,14 @@ void game_config_manager::set_enabled_addon(std::set<std::string> addon_ids)
} }
} }
} }
void game_config_manager::set_enabled_addon_all() void game_config_manager::set_enabled_addon_all()
{ {
auto& vec = game_config_view_.data(); auto& vec = game_config_view_.data();
vec.clear(); vec.clear();
vec.push_back(game_config_); vec.push_back(game_config_);
for(const auto& pair : addon_cfgs_) {
for(const auto& pair : addon_cfgs_) {
vec.push_back(pair.second); vec.push_back(pair.second);
} }
} }