move active_mods and mp_era to game_classification

in particular because active_mod is no longer mp specific, but
also for technical reasons
This commit is contained in:
gfgtdf 2020-06-21 16:42:03 +02:00
parent 8f9ab9d13f
commit 0efd35acbc
11 changed files with 35 additions and 31 deletions

View file

@ -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;

View file

@ -49,6 +49,9 @@ public:
std::string era_define; /**< If there is a define the era uses to customize data */
std::vector<std::string> mod_defines; /**< If there are defines the modifications use to customize data */
std::vector<std::string> 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. */

View file

@ -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<std::string>& create_engine::active_mods()
{
return state_.mp_settings().active_mods;
return state_.classification().active_mods;
}
std::vector<create_engine::extras_metadata_ptr> 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();

View file

@ -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<std::string>& mods = params.active_mods;
const std::vector<std::string>& mods = state.classification().active_mods;
std::vector<std::string> mod_versions;
std::vector<std::string> mod_addon_ids;

View file

@ -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;
}

View file

@ -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"}
);

View file

@ -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;

View file

@ -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<std::string> active_mods;
std::map<std::string, std::string> side_users;
int num_turns;

View file

@ -369,13 +369,13 @@ void saved_game::expand_mp_events()
std::vector<modevents_entry> mods;
std::set<std::string> 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<modevents_entry> 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);

View file

@ -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.

View file

@ -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;