// To remove radundant informaion in the clientside internal programmflow // I want to remove these values from mp_settings so i need to readd them here static void add_multiplayer_classification(config& multiplayer, saved_game& state) { multiplayer["mp_scenario"] = state.get_scenario_id(); multiplayer["mp_scenario_name"] = state.get_starting_pos()["name"]; multiplayer["difficulty_define"] = state.classification().difficulty; multiplayer["mp_campaign"] = state.classification().campaign; }
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; }
void start_local_game_commandline(const config& game_config, saved_game& state, const commandline_options& cmdline_opts) { DBG_MP << "starting local MP game from commandline" << std::endl; // The setup is done equivalently to lobby MP games using as much of existing // code as possible. This means that some things are set up that are not // needed in commandline mode, but they are required by the functions called. preferences::set_message_private(false); DBG_MP << "entering create mode" << std::endl; // Set the default parameters state.clear(); // This creates these parameters with default values defined in mp_game_settings.cpp mp_game_settings& parameters = state.mp_settings(); // Hardcoded default values parameters.mp_era = "era_default"; parameters.name = "multiplayer_The_Freelands"; // Default values for which at getter function exists parameters.num_turns = settings::get_turns(""); parameters.village_gold = settings::get_village_gold(""); parameters.village_support = settings::get_village_support(""); parameters.xp_modifier = settings::get_xp_modifier(""); // Do not use map settings if --ignore-map-settings commandline option is set if(cmdline_opts.multiplayer_ignore_map_settings) { DBG_MP << "ignoring map settings" << std::endl; parameters.use_map_settings = false; } else { parameters.use_map_settings = true; } // None of the other parameters need to be set, as their creation values above are good enough for CL mode. // In particular, we do not want to use the preferences values. state.classification().campaign_type = game_classification::CAMPAIGN_TYPE::MULTIPLAYER; // [era] define. if(cmdline_opts.multiplayer_era) { parameters.mp_era = *cmdline_opts.multiplayer_era; } if(const config& cfg_era = game_config.find_child("era", "id", parameters.mp_era)) { state.classification().era_define = cfg_era["define"].str(); } else { std::cerr << "Could not find era '" << parameters.mp_era << "'\n"; return; } // [multiplayer] define. if(cmdline_opts.multiplayer_scenario) { parameters.name = *cmdline_opts.multiplayer_scenario; } if(const config& cfg_multiplayer = game_config.find_child("multiplayer", "id", parameters.name)) { state.classification().scenario_define = cfg_multiplayer["define"].str(); } else { std::cerr << "Could not find [multiplayer] '" << parameters.name << "'\n"; return; } game_config_manager::get()->load_game_config_for_game(state.classification()); state.set_carryover_sides_start( config {"next_scenario", parameters.name} ); state.expand_random_scenario(); state.expand_mp_events(); state.expand_mp_options(); // Should number of turns be determined from scenario data? if(parameters.use_map_settings && state.get_starting_pos()["turns"]) { DBG_MP << "setting turns from scenario data: " << state.get_starting_pos()["turns"] << std::endl; parameters.num_turns = state.get_starting_pos()["turns"]; } DBG_MP << "entering connect mode" << std::endl; statistics::fresh_stats(); { ng::connect_engine_ptr connect_engine(new ng::connect_engine(state, true, nullptr)); // Update the parameters to reflect game start conditions connect_engine->start_game_commandline(cmdline_opts); } if(resources::recorder && cmdline_opts.multiplayer_label) { std::string label = *cmdline_opts.multiplayer_label; resources::recorder->add_log_data("ai_log","ai_label",label); } unsigned int repeat = (cmdline_opts.multiplayer_repeat) ? *cmdline_opts.multiplayer_repeat : 1; for(unsigned int i = 0; i < repeat; i++){ saved_game state_copy(state); campaign_controller controller(state_copy, game_config, game_config_manager::get()->terrain_types()); controller.play_game(); } }