config initial_level_config(saved_game& state) { const mp_game_settings& params = state.mp_settings(); //Also impliers state.expand_scenario() //We need to call this before expand_mp_events/options oterwise they might be overwritten state.expand_random_scenario(); state.expand_mp_events(); state.expand_mp_options(); config& scenario = state.get_starting_pos(); if(!state.mp_settings().saved_game) { state.set_random_seed(); if (params.random_start_time) { if (!tod_manager::is_start_ToD(scenario["random_start_time"])) { scenario["random_start_time"] = true; } } else { scenario["random_start_time"] = false; } scenario["experience_modifier"] = params.xp_modifier; } if (scenario["objectives"].empty()) { scenario["objectives"] = "<big>" + t_string(N_("Victory:"), "wesnoth") + "</big>\n<span foreground=\"#00ff00\">• " + t_string(N_("Defeat enemy leader(s)"), "wesnoth") + "</span>"; } config level = state.to_config(); add_multiplayer_classification(level.child_or_add("multiplayer"), state); std::string era = params.mp_era; //[multiplayer] mp_era= should be persistent over saves. //[era], [modification]s are toplevel tags here, they are not part of the saved_game and only used during mp_connect/mp_wait // Initialize the list of sides available for the current era. // We also need this no not get a segfault in mp_connect for ai configuration const config &era_cfg = game_config_manager::get()->game_config().find_child("era", "id", era); if (!era_cfg) { if (!params.saved_game) { utils::string_map i18n_symbols; i18n_symbols["era"] = era; throw config::error(vgettext("Cannot find era $era", i18n_symbols)); } // FIXME: @todo We should tell user about missing era but still load game WRN_CF << "Missing era in MP load game " << era << std::endl; //Otherwise we get an error when qwhen we try to add ai algirithms in moultiplayer_connect level.add_child("era"); } else { /*config& cfg = */level.add_child("era", era_cfg); const config& custom_side = game_config_manager::get()-> game_config().find_child("multiplayer_side", "id", "Custom"); level.child("era").add_child_at("multiplayer_side", custom_side, 0); } // Add modifications, needed for ai aglorithms which are applied in mp_connect const std::vector<std::string>& mods = params.active_mods; for (unsigned i = 0; i < mods.size(); i++) { /*config& cfg = */level.add_child("modification", game_config_manager::get()-> game_config().find_child("modification", "id", mods[i])); } // This will force connecting clients to be using the same version number as us. level["version"] = game_config::version; return level; }
config initial_level_config(saved_game& state) { const mp_game_settings& params = state.mp_settings(); state.set_defaults(); // Also impliers state.expand_scenario() // We need to call this before expand_mp_events/options otherwise they might be overwritten. state.expand_random_scenario(); state.expand_mp_events(); state.expand_mp_options(); if(!state.valid()) { throw config::error("Failed to load the scenario"); } config& scenario = state.get_starting_point(); if(state.mp_settings().saved_game == mp_game_settings::SAVED_GAME_MODE::NONE) { state.set_random_seed(); } if(scenario["objectives"].empty()) { // Generic victory objectives. std::ostringstream ss; ss << "<big>"; ss << t_string(N_("Victory:"), "wesnoth") << "</big>\n"; ss << "<span color='#00ff00'>" << font::unicode_bullet << " "; ss << t_string(N_("Defeat enemy leader(s)"), "wesnoth") << "</span>"; scenario["objectives"] = ss.str(); } config level = state.to_config(); add_multiplayer_classification(level.child_or_add("multiplayer"), state); // [multiplayer] mp_era= should be persistent over saves. std::string era = params.mp_era; /** * [era] and [modification]s are toplevel tags here. * They are not part of the saved_game and are only used during mp_staging/mp_join_game. * * @todo: see if all the comments ai algorithms are still up-to-date and relevant. * * -- vultraz, 2017-11-24 */ const config& game_config = game_config_manager::get()->game_config(); const config& era_cfg = game_config.find_child("era", "id", era); if(!era_cfg) { if(params.saved_game == mp_game_settings::SAVED_GAME_MODE::NONE) { throw config::error(VGETTEXT("Cannot find era $era", {{"era", era}})); } // FIXME: @todo We should tell user about missing era but still load game... WRN_CF << "Missing era in MP load game " << era << std::endl; // Otherwise we get an error when when we try to add ai algorithms in mp_staging. level.add_child("era"); } else { level.add_child("era", era_cfg); // Initialize the list of sides available for the current era. // We also need this so not to get a segfault in mp_staging for ai configuration. const config& custom_side = game_config.find_child("multiplayer_side", "id", "Custom"); level.child("era").add_child_at("multiplayer_side", custom_side, 0); } // Add modifications, needed for ai algorithms which are applied in mp_staging. const std::vector<std::string>& mods = params.active_mods; for(unsigned i = 0; i < mods.size(); ++i) { if(const config& mod_cfg = game_config.find_child("modification", "id", mods[i])) { level.add_child("modification", mod_cfg); } } // This will force connecting clients to be using the same version number as us. level["version"] = game_config::wesnoth_version.str(); return level; }