game_info::ADDON_REQ game_info::check_addon_version_compatibility(const config& local_item, const config& game) { if(!local_item.has_attribute("addon_id") || !local_item.has_attribute("addon_version")) { return SATISFIED; } if(const config& game_req = game.find_child("addon", "id", local_item["addon_id"])) { required_addon r = {local_item["addon_id"].str(), SATISFIED, ""}; // Local version const version_info local_ver(local_item["addon_version"].str()); version_info local_min_ver(local_item.has_attribute("addon_min_version") ? local_item["addon_min_version"] : local_item["addon_version"]); // If the UMC didn't specify last compatible version, assume no backwards compatibility. // Also apply some sanity checking regarding min version; if the min ver doens't make sense, ignore it. local_min_ver = std::min(local_min_ver, local_ver); // Remote version const version_info remote_ver(game_req["version"].str()); version_info remote_min_ver(game_req.has_attribute("min_version") ? game_req["min_version"] : game_req["version"]); remote_min_ver = std::min(remote_min_ver, remote_ver); // Check if the host is too out of date to play. if(local_min_ver > remote_ver) { r.outcome = CANNOT_SATISFY; // TODO: Figure out how to ask the add-on manager for the user-friendly name of this add-on. r.message = vgettext("The host's version of <i>$addon</i> is incompatible. They have version <b>$host_ver</b> while you have version <b>$local_ver</b>.", { {"addon", r.addon_id}, {"host_ver", remote_ver.str()}, {"local_ver", local_ver.str()} }); required_addons.push_back(r); return r.outcome; } // Check if our version is too out of date to play. if(remote_min_ver > local_ver) { r.outcome = NEED_DOWNLOAD; // TODO: Figure out how to ask the add-on manager for the user-friendly name of this add-on. r.message = vgettext("Your version of <i>$addon</i> is incompatible. You have version <b>$local_ver</b> while the host has version <b>$host_ver</b>.", { {"addon", r.addon_id}, {"host_ver", remote_ver.str()}, {"local_ver", local_ver.str()} }); required_addons.push_back(r); return r.outcome; } } return SATISFIED; }
void loadgame::check_version_compatibility() { if (gamestate_.classification().version == game_config::version) { return; } const version_info save_version = gamestate_.classification().version; const version_info &wesnoth_version = game_config::wesnoth_version; // If the version isn't good, it probably isn't a compatible stable one, // and the following comparisons would throw. if (!save_version.good()) { const std::string message = _("The save has corrupt version information ($version_number|) and cannot be loaded."); utils::string_map symbols; symbols["version_number"] = gamestate_.classification().version; gui2::show_error_message(gui_.video(), utils::interpolate_variables_into_string(message, &symbols)); throw load_game_cancelled_exception(); } // Even minor version numbers indicate stable releases which are // compatible with each other. if (wesnoth_version.minor_version() % 2 == 0 && wesnoth_version.major_version() == save_version.major_version() && wesnoth_version.minor_version() == save_version.minor_version()) { return; } // Do not load if too old. If either the savegame or the current // game has the version 'test', load. This 'test' version is never // supposed to occur, except when Soliton is testing MP servers. if (save_version < game_config::min_savegame_version && save_version != game_config::test_version && wesnoth_version != game_config::test_version) { const std::string message = _("This save is from an old, unsupported version ($version_number|) and cannot be loaded."); utils::string_map symbols; symbols["version_number"] = save_version.str(); gui2::show_error_message(gui_.video(), utils::interpolate_variables_into_string(message, &symbols)); throw load_game_cancelled_exception(); } int res = gui2::twindow::OK; if(preferences::confirm_load_save_from_different_version()) { const std::string message = _("This save is from a different version of the game ($version_number|). Do you wish to try to load it?"); utils::string_map symbols; symbols["version_number"] = save_version.str(); res = gui2::show_message(gui_.video(), _("Load Game"), utils::interpolate_variables_into_string(message, &symbols), gui2::tmessage::yes_no_buttons); } if(res == gui2::twindow::CANCEL) { throw load_game_cancelled_exception(); } }
bool loadgame::check_version_compatibility(const version_info & save_version, CVideo & video) { if (save_version == game_config::version) { return true; } const version_info &wesnoth_version = game_config::wesnoth_version; // Even minor version numbers indicate stable releases which are // compatible with each other. if (wesnoth_version.minor_version() % 2 == 0 && wesnoth_version.major_version() == save_version.major_version() && wesnoth_version.minor_version() == save_version.minor_version()) { return true; } // Do not load if too old. If either the savegame or the current // game has the version 'test', load. This 'test' version is never // supposed to occur, except when Soliton is testing MP servers. if (save_version < game_config::min_savegame_version && save_version != game_config::test_version && wesnoth_version != game_config::test_version) { const std::string message = _("This save is from an old, unsupported version ($version_number|) and cannot be loaded."); utils::string_map symbols; symbols["version_number"] = save_version.str(); gui2::show_error_message(video, utils::interpolate_variables_into_string(message, &symbols)); return false; } if(preferences::confirm_load_save_from_different_version()) { const std::string message = _("This save is from a different version of the game ($version_number|). Do you wish to try to load it?"); utils::string_map symbols; symbols["version_number"] = save_version.str(); const int res = gui2::show_message(video, _("Load Game"), utils::interpolate_variables_into_string(message, &symbols), gui2::tmessage::yes_no_buttons); return res == gui2::twindow::OK; } return true; }