diff --git a/src/game_initialization/connect_engine.cpp b/src/game_initialization/connect_engine.cpp index bdf37ae3951b..7a9599fc87eb 100644 --- a/src/game_initialization/connect_engine.cpp +++ b/src/game_initialization/connect_engine.cpp @@ -879,6 +879,15 @@ side_engine::side_engine(const config& cfg, connect_engine& parent_engine, waiting_to_choose_faction_(allow_changes_), custom_color_() { + // Save default attributes that could be overwirtten by the faction, so that correct faction lists would be + // initialized by flg_manager when the new side config is sent over network. + cfg_.add_child("default_faction", config_of + ("type", cfg_["type"]) + ("gender", cfg_["gender"]) + ("faction", cfg_["faction"]) + ("recruit", cfg_["recruit"]) + ); + // Check if this side should give its control to some other side. const size_t side_cntr_index = cfg_["controller"].to_int(-1) - 1; if (side_cntr_index < parent_.side_engines().size()) { @@ -978,14 +987,6 @@ config side_engine::new_config() const { config res = cfg_; - // Save default "recruit" so that correct faction lists would be - // initialized by flg_manager when the new side config is sent over network. - // In case recruit list was empty, set a flag to indicate that. - res["default_recruit"] = cfg_["recruit"].str(); - if (res["default_recruit"].empty()) { - res["no_recruit"] = true; - } - // If the user is allowed to change type, faction, leader etc, // then import their new values in the config. if (!parent_.params_.saved_game) { diff --git a/src/game_initialization/flg_manager.cpp b/src/game_initialization/flg_manager.cpp index dbebc5fb535d..3e30062d5661 100644 --- a/src/game_initialization/flg_manager.cpp +++ b/src/game_initialization/flg_manager.cpp @@ -331,20 +331,20 @@ void flg_manager::resolve_random(rand_rng::mt_rng & rng, const std::vector find; std::string search_field; - if (const config::attribute_value *f = side_.get("faction")) { + if (const config::attribute_value *f = get_default_faction(side_).get("faction")) { // Choose based on faction. find.push_back(f->str()); search_field = "id"; @@ -623,15 +623,18 @@ void flg_manager::set_current_gender(const std::string& gender) std::vector flg_manager::get_original_recruits(const config& cfg) { - if (cfg["no_recruit"].to_bool()) { - return std::vector(); - } - const config::attribute_value& cfg_default_recruit = cfg["default_recruit"]; - if (!cfg_default_recruit.empty()) { - return utils::split(cfg_default_recruit.str()); + return utils::split(get_default_faction(cfg)["recruit"].str()); +} + +const config& flg_manager::get_default_faction(const config& cfg) +{ + const config& df = cfg.child("default_faction"); + if (df) { + return df; } else { - return utils::split(cfg["recruit"].str()); + return cfg; } } + } // end namespace ng diff --git a/src/game_initialization/flg_manager.hpp b/src/game_initialization/flg_manager.hpp index 7b4af19636bc..f185b4b1a70b 100644 --- a/src/game_initialization/flg_manager.hpp +++ b/src/game_initialization/flg_manager.hpp @@ -132,6 +132,7 @@ class flg_manager std::string default_leader_gender_; const config* default_leader_cfg_; static std::vector get_original_recruits(const config& cfg); + static const config& get_default_faction(const config& cfg); }; } // end namespace ng diff --git a/src/team.cpp b/src/team.cpp index b774f01baa69..c8fa2f1078d3 100644 --- a/src/team.cpp +++ b/src/team.cpp @@ -68,7 +68,7 @@ const boost::container::flat_set team::attributes = boost::assign:: ("countdown_time")("disallow_observers")("faction") ("faction_from_recruit")("faction_name")("gold_lock")("income_lock") ("leader")("random_leader")("team_lock")("terrain_liked") - ("user_description")("default_recruit")("controller_lock")("chose_random") + ("user_description")("controller_lock")("chose_random") ("disallow_shuffle")("description").convert_to_container >(); team::team_info::team_info() : diff --git a/src/tests/test_mp_connect.cpp b/src/tests/test_mp_connect.cpp index 4e7c5d77070c..0cc8f12a55b9 100644 --- a/src/tests/test_mp_connect.cpp +++ b/src/tests/test_mp_connect.cpp @@ -112,6 +112,7 @@ static ng::side_engine* create_side_engine(const config& defaults, { config side_cfg = connect_engine->current_config()->child("side"); side_cfg.remove_attributes("faction"); + side_cfg.clear_children("default_faction"); side_cfg.append(defaults); return new ng::side_engine(side_cfg, *connect_engine, 0);