diff --git a/src/game_classification.cpp b/src/game_classification.cpp index 02dc0829c73..805c5aa73df 100644 --- a/src/game_classification.cpp +++ b/src/game_classification.cpp @@ -38,6 +38,8 @@ game_classification::game_classification(const config& cfg) , scenario_define(cfg["scenario_define"]) , era_define(cfg["era_define"]) , mod_defines(utils::split(cfg["mod_defines"])) + , active_mods(utils::split(cfg["active_mods"])) + , era_id(cfg["era_id"]) , campaign(cfg["campaign"]) , campaign_name(cfg["campaign_name"]) , abbrev(cfg["abbrev"]) @@ -61,6 +63,8 @@ config game_classification::to_config() const cfg["scenario_define"] = scenario_define; cfg["era_define"] = era_define; cfg["mod_defines"] = utils::join(mod_defines); + cfg["active_mods"] = utils::join(active_mods); + cfg["era_id"] = era_id; cfg["campaign"] = campaign; cfg["campaign_name"] = campaign_name; cfg["abbrev"] = abbrev; diff --git a/src/game_classification.hpp b/src/game_classification.hpp index d50951d1b83..cf20548057a 100644 --- a/src/game_classification.hpp +++ b/src/game_classification.hpp @@ -49,6 +49,9 @@ public: std::string era_define; /**< If there is a define the era uses to customize data */ std::vector mod_defines; /**< If there are defines the modifications use to customize data */ + std::vector active_mods; + std::string era_id; + std::string campaign; /**< The id of the campaign being played */ std::string campaign_name; /**< The name of the campaign being played. */ diff --git a/src/game_initialization/create_engine.cpp b/src/game_initialization/create_engine.cpp index e09453d1cc6..5881238e92b 100644 --- a/src/game_initialization/create_engine.cpp +++ b/src/game_initialization/create_engine.cpp @@ -282,11 +282,11 @@ create_engine::create_engine(saved_game& state) for(const std::string& str : preferences::modifications(state_.classification().campaign_type == game_classification::CAMPAIGN_TYPE::MULTIPLAYER)) { if(game_config_.find_child("modification", "id", str)) { - state_.mp_settings().active_mods.push_back(str); + state_.classification().active_mods.push_back(str); } } - dependency_manager_->try_modifications(state_.mp_settings().active_mods, true); + dependency_manager_->try_modifications(state_.classification().active_mods, true); reset_level_filters(); } @@ -371,8 +371,9 @@ void create_engine::prepare_for_new_level() void create_engine::prepare_for_era_and_mods() { - state_.classification().era_define = game_config_.find_child("era", "id", get_parameters().mp_era)["define"].str(); - for(const std::string& mod_id : get_parameters().active_mods) { + get_parameters(); + state_.classification().era_define = game_config_.find_child("era", "id", state_.classification().era_id)["define"].str(); + for(const std::string& mod_id : state_.classification().active_mods) { state_.classification().mod_defines.push_back(game_config_.find_child("modification", "id", mod_id)["define"].str()); } } @@ -550,7 +551,7 @@ bool create_engine::toggle_mod(int index, bool force) bool is_active = dependency_manager_->is_modification_active(index); dependency_manager_->try_modification_by_index(index, !is_active, force); - state_.mp_settings().active_mods = dependency_manager_->get_modifications(); + state_.classification().active_mods = dependency_manager_->get_modifications(); return !is_active; } @@ -602,12 +603,12 @@ int create_engine::find_extra_by_id(const MP_EXTRA extra_type, const std::string void create_engine::init_active_mods() { - state_.mp_settings().active_mods = dependency_manager_->get_modifications(); + state_.classification().active_mods = dependency_manager_->get_modifications(); } std::vector& create_engine::active_mods() { - return state_.mp_settings().active_mods; + return state_.classification().active_mods; } std::vector create_engine::active_mods_data() @@ -633,7 +634,7 @@ const mp_game_settings& create_engine::get_parameters() DBG_MP << "getting parameter values" << std::endl; int era_index = current_level().allow_era_choice() ? current_era_index_ : 0; - state_.mp_settings().mp_era = eras_[era_index]->id; + state_.classification().era_id = eras_[era_index]->id; state_.mp_settings().mp_era_name = eras_[era_index]->name; return state_.mp_settings(); diff --git a/src/game_initialization/mp_game_utils.cpp b/src/game_initialization/mp_game_utils.cpp index b07ba09839d..bf36cdba4b8 100644 --- a/src/game_initialization/mp_game_utils.cpp +++ b/src/game_initialization/mp_game_utils.cpp @@ -45,6 +45,9 @@ static void add_multiplayer_classification(config& multiplayer, saved_game& stat multiplayer["difficulty_define"] = state.classification().difficulty; multiplayer["mp_campaign"] = state.classification().campaign; multiplayer["mp_campaign_name"] = state.classification().campaign_name; + multiplayer["mp_era"] = state.classification().era_id; + multiplayer["active_mods"] = utils::join(state.classification().active_mods, ","); + } config initial_level_config(saved_game& state) @@ -84,7 +87,7 @@ config initial_level_config(saved_game& state) level.child("multiplayer")["mp_scenario_addon_version"] = state.to_config().child("scenario")["addon_version"].str(); // [multiplayer] mp_era= should be persistent over saves. - std::string era = params.mp_era; + std::string era = state.classification().era_id; /** * [era] and [modification]s are toplevel tags here. @@ -121,7 +124,7 @@ config initial_level_config(saved_game& state) } // Add modifications, needed for ai algorithms which are applied in mp_staging. - const std::vector& mods = params.active_mods; + const std::vector& mods = state.classification().active_mods; std::vector mod_versions; std::vector mod_addon_ids; diff --git a/src/game_initialization/multiplayer.cpp b/src/game_initialization/multiplayer.cpp index b94ced52c4f..3756ad405b3 100644 --- a/src/game_initialization/multiplayer.cpp +++ b/src/game_initialization/multiplayer.cpp @@ -705,7 +705,7 @@ void start_local_game_commandline(const config& game_config, saved_game& state, mp_game_settings& parameters = state.mp_settings(); // Hardcoded default values - parameters.mp_era = "era_default"; + state.classification().era_id = "era_default"; parameters.name = "multiplayer_The_Freelands"; // Default values for which at getter function exists @@ -729,13 +729,13 @@ void start_local_game_commandline(const config& game_config, saved_game& state, // [era] define. if(cmdline_opts.multiplayer_era) { - parameters.mp_era = *cmdline_opts.multiplayer_era; + state.classification().era_id = *cmdline_opts.multiplayer_era; } - if(const config& cfg_era = game_config.find_child("era", "id", parameters.mp_era)) { + if(const config& cfg_era = game_config.find_child("era", "id", state.classification().era_id)) { state.classification().era_define = cfg_era["define"].str(); } else { - std::cerr << "Could not find era '" << parameters.mp_era << "'\n"; + std::cerr << "Could not find era '" << state.classification().era_id << "'\n"; return; } diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index 2868c23692f..427c4236d58 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -440,8 +440,8 @@ void game_launcher::set_test(const std::string& id) state_.clear(); state_.classification().campaign_type = game_classification::CAMPAIGN_TYPE::TEST; state_.classification().campaign_define = "TEST"; + state_.classification().era_id = "era_default"; - state_.mp_settings().mp_era = "era_default"; state_.set_carryover_sides_start( config {"next_scenario", id} @@ -738,7 +738,8 @@ void game_launcher::set_tutorial() state_.classification().campaign_type = game_classification::CAMPAIGN_TYPE::TUTORIAL; state_.classification().campaign_define = "TUTORIAL"; state_.classification().campaign = "Tutorial"; - state_.mp_settings().mp_era = "era_default"; + state_.classification().era_id = "era_default"; + state_.set_carryover_sides_start( config {"next_scenario", "tutorial"} ); diff --git a/src/mp_game_settings.cpp b/src/mp_game_settings.cpp index fac6cd922fd..3c2a6ba1e24 100644 --- a/src/mp_game_settings.cpp +++ b/src/mp_game_settings.cpp @@ -32,12 +32,10 @@ mp_game_settings::mp_game_settings() : name(), password(), hash(), - mp_era(), mp_era_name(), mp_scenario(), mp_scenario_name(), mp_campaign(), - active_mods(), side_users(), num_turns(0), village_gold(0), @@ -66,12 +64,10 @@ mp_game_settings::mp_game_settings(const config& cfg) : name(cfg["scenario"].str()) , password() , hash(cfg["hash"].str()) - , mp_era(cfg["mp_era"].str()) , mp_era_name(cfg["mp_era_name"].str()) , mp_scenario(cfg["mp_scenario"].str()) , mp_scenario_name(cfg["mp_scenario_name"].str()) , mp_campaign(cfg["mp_campaign"].str()) - , active_mods(utils::split(cfg["active_mods"], ',')) , side_users(utils::map_split(cfg["side_users"])) , num_turns(cfg["mp_num_turns"]) , village_gold(cfg["mp_village_gold"]) @@ -108,12 +104,10 @@ config mp_game_settings::to_config() const cfg["scenario"] = name; cfg["hash"] = hash; - cfg["mp_era"] = mp_era; cfg["mp_era_name"] = mp_era_name; cfg["mp_scenario"] = mp_scenario; cfg["mp_scenario_name"] = mp_scenario_name; cfg["mp_campaign"] = mp_campaign; - cfg["active_mods"] = utils::join(active_mods, ","); cfg["side_users"] = utils::join_map(side_users); cfg["experience_modifier"] = xp_modifier; cfg["mp_countdown"] = mp_countdown; diff --git a/src/mp_game_settings.hpp b/src/mp_game_settings.hpp index fb0acfbe485..75a74dbe5a9 100644 --- a/src/mp_game_settings.hpp +++ b/src/mp_game_settings.hpp @@ -35,12 +35,10 @@ struct mp_game_settings std::string name; std::string password; std::string hash; - std::string mp_era; std::string mp_era_name; std::string mp_scenario; std::string mp_scenario_name; std::string mp_campaign; - std::vector active_mods; std::map side_users; int num_turns; diff --git a/src/saved_game.cpp b/src/saved_game.cpp index dfd644997b5..325a48488d8 100644 --- a/src/saved_game.cpp +++ b/src/saved_game.cpp @@ -369,13 +369,13 @@ void saved_game::expand_mp_events() std::vector mods; std::set loaded_resources; - std::transform(mp_settings_.active_mods.begin(), mp_settings_.active_mods.end(), std::back_inserter(mods), + std::transform(classification_.active_mods.begin(), classification_.active_mods.end(), std::back_inserter(mods), [](const std::string& id) { return modevents_entry("modification", id); } ); // We don't want the error message below if there is no era (= if this is a sp game). - if(!mp_settings_.mp_era .empty()) { - mods.emplace_back("era", mp_settings_.mp_era); + if(!classification_.era_id .empty()) { + mods.emplace_back("era", classification_.era_id); } if(!classification_.campaign.empty()) { @@ -407,11 +407,11 @@ void saved_game::expand_mp_options() if(starting_point_type_ == STARTING_POINT_SCENARIO && !has_carryover_expanded_) { std::vector mods; - std::transform(mp_settings_.active_mods.begin(), mp_settings_.active_mods.end(), std::back_inserter(mods), + std::transform(classification_.active_mods.begin(), classification_.active_mods.end(), std::back_inserter(mods), [](const std::string& id) { return modevents_entry("modification", id); } ); - mods.emplace_back("era", mp_settings_.mp_era); + mods.emplace_back("era", classification_.era_id); mods.emplace_back("multiplayer", get_scenario_id()); mods.emplace_back("campaign", classification().campaign); diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 31334ae7033..2a33c2643d8 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -1385,7 +1385,7 @@ int game_lua_kernel::impl_game_config_get(lua_State *L) return_string_attrib("campaign_type", classification.campaign_type.to_string()); if(classification.campaign_type==game_classification::CAMPAIGN_TYPE::MULTIPLAYER) { return_cfgref_attrib("mp_settings", mp_settings.to_config()); - return_cfgref_attrib("era", game_config_manager::get()->game_config().find_child("era","id",mp_settings.mp_era)); + return_cfgref_attrib("era", game_config_manager::get()->game_config().find_child("era","id",classification.era_id)); //^ finds the era with name matching mp_era, and creates a lua reference from the config of that era. //This code for SigurdFD, not the cleanest implementation but seems to work just fine. diff --git a/src/tests/test_mp_connect.cpp b/src/tests/test_mp_connect.cpp index e3226759699..dd06ad3a70b 100644 --- a/src/tests/test_mp_connect.cpp +++ b/src/tests/test_mp_connect.cpp @@ -59,9 +59,9 @@ struct mp_connect_fixture { state.reset(new saved_game()); state->classification().campaign_type = game_classification::CAMPAIGN_TYPE::MULTIPLAYER; + state->classification().era_id = "era_default"; config_manager->load_game_config_for_game(state->classification()); - state->mp_settings().mp_era = "era_default"; state->mp_settings().name = "multiplayer_The_Freelands"; state->mp_settings().use_map_settings = true; state->mp_settings().saved_game = mp_game_settings::SAVED_GAME_MODE::NONE;