void loadgame::load_game( const std::string& filename , const bool show_replay , const bool cancel_orders , const bool select_difficulty , const std::string& difficulty) { filename_ = filename; difficulty_ = difficulty; select_difficulty_ = select_difficulty; if (filename_.empty()){ show_dialog(show_replay, cancel_orders); } else{ show_replay_ = show_replay; cancel_orders_ = cancel_orders; } if (filename_.empty()) throw load_game_cancelled_exception(); if (select_difficulty_) show_difficulty_dialog(); std::string error_log; read_save_file(filename_, load_config_, &error_log); convert_old_saves(load_config_); if(!error_log.empty()) { try { gui2::show_error_message(gui_.video(), _("Warning: The file you have tried to load is corrupt. Loading anyway.\n") + error_log); } catch (utf8::invalid_utf8_exception&) { gui2::show_error_message(gui_.video(), _("Warning: The file you have tried to load is corrupt. Loading anyway.\n") + std::string("(UTF-8 ERROR)")); } } if (!difficulty_.empty()){ load_config_["difficulty"] = difficulty_; } #if 0 gamestate_.classification().campaign_define = load_config_["campaign_define"].str(); gamestate_.classification().campaign_type = lexical_cast_default<game_classification::CAMPAIGN_TYPE> (load_config_["campaign_type"].str(), game_classification::SCENARIO); gamestate_.classification().campaign_xtra_defines = utils::split(load_config_["campaign_extra_defines"]); gamestate_.classification().version = load_config_["version"].str(); gamestate_.classification().difficulty = load_config_["difficulty"].str(); #else // read classification to for loading the game_config config object. gamestate_.classification() = game_classification(load_config_); #endif check_version_compatibility(); }
void wait::join_game(bool observe) { const bool download_res = download_level_data(); if (!download_res) { DBG_MP << "mp wait: could not download level data, quitting..."; set_result(QUIT); return; } else if (level_["started"].to_bool()) { set_result(PLAY); return; } if (first_scenario_) { state_ = saved_game(); state_.classification() = game_classification(level_); if(state_.classification().campaign_type != game_classification::CAMPAIGN_TYPE::MULTIPLAYER) { ERR_MP << "Mp wait recieved a game that is not a multiplayer game\n"; } // Make sure that we have the same config as host, if possible. game_config_manager::get()->load_game_config_for_game(state_.classification()); } // Add the map name to the title. append_to_title(": " + get_scenario()["name"].t_str()); game_config::add_color_info(get_scenario()); if (!observe) { //search for an appropriate vacant slot. If a description is set //(i.e. we're loading from a saved game), then prefer to get the side //with the same description as our login. Otherwise just choose the first //available side. const config *side_choice = NULL; int side_num = -1, nb_sides = 0; BOOST_FOREACH(const config &sd, get_scenario().child_range("side")) { DBG_MP << "*** side " << nb_sides << "***\n" << sd.debug() << "***\n"; if (sd["controller"] == "reserved" && sd["current_player"] == preferences::login()) { side_choice = &sd; side_num = nb_sides; break; } if (sd["controller"] == "human" && sd["player_id"].empty()) { if (!side_choice) { // found the first empty side side_choice = &sd; side_num = nb_sides; } if (sd["current_player"] == preferences::login()) { side_choice = &sd; side_num = nb_sides; break; // found the preferred one } } if (sd["player_id"] == preferences::login()) { //We already own a side in this game. generate_menu(); return; } ++nb_sides; } if (!side_choice) { size_t count = 0; for(config::child_itors its = get_scenario().child_range("side"); its.second != its.first; ++its.first) { ++count; } DBG_MP << "could not find a side, all " << count << " sides were unsuitable\n"; set_result(QUIT); return; } bool allow_changes = (*side_choice)["allow_changes"].to_bool(true); //if the client is allowed to choose their team, instead of having //it set by the server, do that here. if(allow_changes) { events::event_context context; const config &era = level_.child("era"); /** @todo Check whether we have the era. If we don't inform the user. */ if (!era) throw config::error(_("No era information found.")); config::const_child_itors possible_sides = era.child_range("multiplayer_side"); if (possible_sides.first == possible_sides.second) { set_result(QUIT); throw config::error(_("No multiplayer sides found")); } const std::string color = (*side_choice)["color"].str(); std::vector<const config*> era_factions; BOOST_FOREACH(const config &side, possible_sides) { era_factions.push_back(&side); } const bool lock_settings = get_scenario()["force_lock_settings"].to_bool(); const bool use_map_settings = level_.child("multiplayer")["mp_use_map_settings"].to_bool(); const bool saved_game = level_.child("multiplayer")["savegame"].to_bool(); ng::flg_manager flg(era_factions, *side_choice, lock_settings, use_map_settings, saved_game); std::vector<std::string> choices; BOOST_FOREACH(const config *s, flg.choosable_factions()) { const config &side = *s; const std::string &name = side["name"]; const std::string &icon = side["image"]; if (!icon.empty()) { std::string rgb = side["flag_rgb"]; if (rgb.empty()) rgb = "magenta"; choices.push_back(IMAGE_PREFIX + icon + "~RC(" + rgb + ">" + color + ")" + COLUMN_SEPARATOR + name); } else { choices.push_back(name); } } std::vector<gui::preview_pane* > preview_panes; leader_preview_pane leader_selector(video(), flg, color); preview_panes.push_back(&leader_selector); const int faction_choice = gui::show_dialog(video(), NULL, _("Choose your faction:"), _("Starting position: ") + lexical_cast<std::string>(side_num + 1), gui::OK_CANCEL, &choices, &preview_panes); if(faction_choice < 0) { set_result(QUIT); return; } config faction; config& change = faction.add_child("change_faction"); change["change_faction"] = true; change["name"] = preferences::login(); change["faction"] = flg.current_faction()["id"]; change["leader"] = flg.current_leader(); change["gender"] = flg.current_gender(); network::send_data(faction, 0); } }