GunChleoc has proposed merging lp:~widelands-dev/widelands/remove-savegame-compatibility-after-economy-change into lp:widelands.
Commit message: Removed savegame compatibility code Requested reviews: Widelands Developers (widelands-dev) For more details, see: https://code.launchpad.net/~widelands-dev/widelands/remove-savegame-compatibility-after-economy-change/+merge/349390 Since we just broke savegame compatibility, we can get rid of the compatibility code. Old maps should still be loadable. -- Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/remove-savegame-compatibility-after-economy-change into lp:widelands.
=== modified file 'src/economy/expedition_bootstrap.cc' --- src/economy/expedition_bootstrap.cc 2018-04-07 16:59:00 +0000 +++ src/economy/expedition_bootstrap.cc 2018-07-12 05:46:37 +0000 @@ -206,19 +206,11 @@ Warehouse& warehouse, FileRead& fr, Game& game, MapObjectLoader& mol, uint16_t packet_version) { static const uint16_t kCurrentPacketVersion = 7; - assert(queues_.empty()); // Load worker queues std::vector<WorkersQueue*> wqs; try { - if (packet_version <= 6) { - // This code is actually quite broken/inflexible but it should work - // If we are here, use the old loader for build 19 packets - const uint8_t num_workers = fr.unsigned_8(); - WorkersQueue* wq = new WorkersQueue(warehouse, warehouse.owner().tribe().builder(), 1); - wq->load_for_expedition(fr, game, mol, num_workers); - wqs.push_back(wq); - } else if (packet_version >= kCurrentPacketVersion) { + if (packet_version == kCurrentPacketVersion) { uint8_t num_queues = fr.unsigned_8(); for (uint8_t i = 0; i < num_queues; ++i) { WorkersQueue* wq = new WorkersQueue(warehouse, INVALID_INDEX, 0); === modified file 'src/economy/workers_queue.cc' --- src/economy/workers_queue.cc 2018-04-07 16:59:00 +0000 +++ src/economy/workers_queue.cc 2018-07-12 05:46:37 +0000 @@ -176,23 +176,6 @@ return w; } -void WorkersQueue::load_for_expedition(FileRead& fr, - Game& game, - MapObjectLoader& mol, - uint8_t num_workers) { - assert(type_ == wwWORKER); - assert(index_ != INVALID_INDEX); - for (uint8_t i = 0; i < num_workers; ++i) { - if (fr.unsigned_8() == 1) { - request_.reset(new Request(owner_, 0, InputQueue::request_callback, wwWORKER)); - request_->read(fr, game, mol); - } else { - workers_.push_back(&mol.get<Worker>(fr.unsigned_32())); - } - } - // All other values have hopefully be set by the constructor or the caller -} - /** * Read and write */ === modified file 'src/economy/workers_queue.h' --- src/economy/workers_queue.h 2018-04-07 16:59:00 +0000 +++ src/economy/workers_queue.h 2018-07-12 05:46:37 +0000 @@ -70,14 +70,6 @@ */ Worker* extract_worker(); - /** - * Loads the state of this WorkersQueue. - * This method should only be used by ExpeditionBootstrap as compatibility helper when loading - * save games for build 19. - * If we ever drop support for them, remove this method and rework ExpeditionBootstrap::load(). - */ - void load_for_expedition(FileRead&, Game&, MapObjectLoader&, uint8_t); - protected: void read_child(FileRead&, Game&, MapObjectLoader&) override; void write_child(FileWrite&, Game&, MapObjectSaver&) override; === modified file 'src/game_io/game_interactive_player_packet.cc' --- src/game_io/game_interactive_player_packet.cc 2018-04-07 16:59:00 +0000 +++ src/game_io/game_interactive_player_packet.cc 2018-07-12 05:46:37 +0000 @@ -34,17 +34,6 @@ constexpr uint16_t kCurrentPacketVersion = 4; -void load_landmarks_pre_zoom(FileRead* fr, InteractiveBase* ibase) { - size_t no_of_landmarks = fr->unsigned_8(); - for (size_t i = 0; i < no_of_landmarks; ++i) { - uint8_t set = fr->unsigned_8(); - MapView::View view = {Vector2f(fr->signed_32(), fr->signed_32()), 1.f}; - if (set > 0) { - ibase->set_landmark(i, view); - } - } -} - } // namespace void GameInteractivePlayerPacket::read(FileSystem& fs, Game& game, MapObjectLoader*) { @@ -52,7 +41,7 @@ FileRead fr; fr.open(fs, "binary/interactive_player"); uint16_t const packet_version = fr.unsigned_16(); - if (packet_version >= 2 && packet_version <= kCurrentPacketVersion) { + if (packet_version == kCurrentPacketVersion) { PlayerNumber player_number = fr.unsigned_8(); if (!(0 < player_number && player_number <= game.map().get_nrplayers())) { throw GameDataError("Invalid player number: %i.", player_number); @@ -70,15 +59,7 @@ if (player_number > max) throw GameDataError("The game has no players!"); } - Vector2f center_map_pixel = Vector2f::zero(); - if (packet_version <= 3) { - center_map_pixel.x = fr.unsigned_16(); - center_map_pixel.y = fr.unsigned_16(); - } else { - center_map_pixel.x = fr.float_32(); - center_map_pixel.y = fr.float_32(); - } - + Vector2f center_map_pixel(fr.float_32(), fr.float_32()); uint32_t const display_flags = fr.unsigned_32(); if (InteractiveBase* const ibase = game.get_ibase()) { @@ -96,19 +77,15 @@ // Map landmarks if (InteractiveBase* const ibase = game.get_ibase()) { - if (packet_version == 3) { - load_landmarks_pre_zoom(&fr, ibase); - } else if (packet_version >= 4) { - size_t no_of_landmarks = fr.unsigned_8(); - for (size_t i = 0; i < no_of_landmarks; ++i) { - uint8_t set = fr.unsigned_8(); - const float x = fr.float_32(); - const float y = fr.float_32(); - const float zoom = fr.float_32(); - MapView::View view = {Vector2f(x, y), zoom}; - if (set > 0) { - ibase->set_landmark(i, view); - } + size_t no_of_landmarks = fr.unsigned_8(); + for (size_t i = 0; i < no_of_landmarks; ++i) { + uint8_t set = fr.unsigned_8(); + const float x = fr.float_32(); + const float y = fr.float_32(); + const float zoom = fr.float_32(); + MapView::View view = {Vector2f(x, y), zoom}; + if (set > 0) { + ibase->set_landmark(i, view); } } } === modified file 'src/game_io/game_player_ai_persistent_packet.cc' --- src/game_io/game_player_ai_persistent_packet.cc 2018-04-07 16:59:00 +0000 +++ src/game_io/game_player_ai_persistent_packet.cc 2018-07-12 05:46:37 +0000 @@ -28,14 +28,7 @@ namespace Widelands { -// Introduction of genetic algorithm with all structures that are needed for it constexpr uint16_t kCurrentPacketVersion = 5; -// Last version with 150 magic numbers -constexpr uint16_t kOldMagicNumbers = 4; -// First version with genetics -constexpr uint16_t kPacketVersion3 = 3; -// Old Version before using genetics -constexpr uint16_t kPacketVersion2 = 2; void GamePlayerAiPersistentPacket::read(FileSystem& fs, Game& game, MapObjectLoader*) { try { @@ -44,129 +37,84 @@ FileRead fr; fr.open(fs, "binary/player_ai"); uint16_t const packet_version = fr.unsigned_16(); - // TODO(GunChleoc): Savegame compatibility, remove after Build20 - if (packet_version >= kPacketVersion2 && packet_version <= kCurrentPacketVersion) { + if (packet_version == kCurrentPacketVersion) { iterate_players_existing(p, nr_players, game, player) try { // Make sure that all containers are reset properly etc. player->ai_data.initialize(); - - if (packet_version == kPacketVersion2) { - // Packet is not compatible. Consume without using the data. - fr.unsigned_8(); - fr.unsigned_32(); - fr.unsigned_32(); - fr.unsigned_32(); - fr.unsigned_16(); - fr.unsigned_8(); - fr.signed_16(); - fr.unsigned_32(); - fr.unsigned_32(); - fr.signed_16(); - fr.signed_32(); - fr.unsigned_32(); - fr.signed_32(); - fr.unsigned_32(); - fr.unsigned_32(); - // Make the AI initialize itself - player->ai_data.initialized = 0; - } else { - // Contains Genetic algorithm data - player->ai_data.initialized = (fr.unsigned_8() == 1) ? true : false; - player->ai_data.colony_scan_area = fr.unsigned_32(); - player->ai_data.trees_around_cutters = fr.unsigned_32(); - player->ai_data.expedition_start_time = fr.unsigned_32(); - player->ai_data.ships_utilization = fr.unsigned_16(); - player->ai_data.no_more_expeditions = (fr.unsigned_8() == 1) ? true : false; - player->ai_data.last_attacked_player = fr.signed_16(); - player->ai_data.least_military_score = fr.unsigned_32(); - player->ai_data.target_military_score = fr.unsigned_32(); - player->ai_data.ai_productionsites_ratio = fr.unsigned_32(); - player->ai_data.ai_personality_mil_upper_limit = fr.signed_32(); - - // Magic numbers - size_t magic_numbers_size = fr.unsigned_32(); - - // Here we deal with old savegames that contains 150 magic numbers only - if (packet_version <= kOldMagicNumbers) { - // The savegame contains less then expected number of magic numbers - assert(magic_numbers_size < - Widelands::Player::AiPersistentState::kMagicNumbersSize); - assert(player->ai_data.magic_numbers.size() == - Widelands::Player::AiPersistentState::kMagicNumbersSize); - for (size_t i = 0; i < magic_numbers_size; ++i) { - player->ai_data.magic_numbers.at(i) = fr.signed_16(); - } - // Adding '50' to missing possitions - for (size_t i = magic_numbers_size; - i < Widelands::Player::AiPersistentState::kMagicNumbersSize; ++i) { - player->ai_data.magic_numbers.at(i) = 50; - } - } else { - if (magic_numbers_size > - Widelands::Player::AiPersistentState::kMagicNumbersSize) { - throw GameDataError("Too many magic numbers: We have %" PRIuS - " but only %" PRIuS "are allowed", - magic_numbers_size, - Widelands::Player::AiPersistentState::kMagicNumbersSize); - } - assert(player->ai_data.magic_numbers.size() == - Widelands::Player::AiPersistentState::kMagicNumbersSize); - for (size_t i = 0; i < magic_numbers_size; ++i) { - player->ai_data.magic_numbers.at(i) = fr.signed_16(); - } - } - - // Neurons - const size_t neuron_pool_size = fr.unsigned_32(); - if (neuron_pool_size > Widelands::Player::AiPersistentState::kNeuronPoolSize) { - throw GameDataError( - "Too many neurons: We have %" PRIuS " but only %" PRIuS "are allowed", - neuron_pool_size, Widelands::Player::AiPersistentState::kNeuronPoolSize); - } - assert(player->ai_data.neuron_weights.size() == - Widelands::Player::AiPersistentState::kNeuronPoolSize); - for (size_t i = 0; i < neuron_pool_size; ++i) { - player->ai_data.neuron_weights.at(i) = fr.signed_8(); - } - assert(player->ai_data.neuron_functs.size() == - Widelands::Player::AiPersistentState::kNeuronPoolSize); - for (size_t i = 0; i < neuron_pool_size; ++i) { - player->ai_data.neuron_functs.at(i) = fr.signed_8(); - } - - // F-neurons - const size_t f_neuron_pool_size = fr.unsigned_32(); - if (f_neuron_pool_size > Widelands::Player::AiPersistentState::kFNeuronPoolSize) { - throw GameDataError( - "Too many f neurons: We have %" PRIuS " but only %" PRIuS "are allowed", - f_neuron_pool_size, Widelands::Player::AiPersistentState::kFNeuronPoolSize); - } - assert(player->ai_data.f_neurons.size() == - Widelands::Player::AiPersistentState::kFNeuronPoolSize); - for (size_t i = 0; i < f_neuron_pool_size; ++i) { - player->ai_data.f_neurons.at(i) = fr.unsigned_32(); - } - - // Remaining buildings for basic economy - assert(player->ai_data.remaining_basic_buildings.empty()); - - size_t remaining_basic_buildings_size = fr.unsigned_32(); - for (uint16_t i = 0; i < remaining_basic_buildings_size; ++i) { - if (packet_version == kPacketVersion3) { // Old genetics (buildings saved as idx) - player->ai_data.remaining_basic_buildings.emplace( - static_cast<Widelands::DescriptionIndex>(fr.unsigned_32()), - fr.unsigned_32()); - } else { // New genetics (buildings saved as strigs) - const std::string building_string = fr.string(); - const Widelands::DescriptionIndex bld_idx = - player->tribe().building_index(building_string); - player->ai_data.remaining_basic_buildings.emplace(bld_idx, fr.unsigned_32()); - } - } - // Basic sanity check for remaining basic buildings - assert(player->ai_data.remaining_basic_buildings.size() < - player->tribe().buildings().size()); - } + // Contains Genetic algorithm data + player->ai_data.initialized = (fr.unsigned_8() == 1) ? true : false; + player->ai_data.colony_scan_area = fr.unsigned_32(); + player->ai_data.trees_around_cutters = fr.unsigned_32(); + player->ai_data.expedition_start_time = fr.unsigned_32(); + player->ai_data.ships_utilization = fr.unsigned_16(); + player->ai_data.no_more_expeditions = (fr.unsigned_8() == 1) ? true : false; + player->ai_data.last_attacked_player = fr.signed_16(); + player->ai_data.least_military_score = fr.unsigned_32(); + player->ai_data.target_military_score = fr.unsigned_32(); + player->ai_data.ai_productionsites_ratio = fr.unsigned_32(); + player->ai_data.ai_personality_mil_upper_limit = fr.signed_32(); + + // Magic numbers + const size_t magic_numbers_size = fr.unsigned_32(); + if (magic_numbers_size > + Widelands::Player::AiPersistentState::kMagicNumbersSize) { + throw GameDataError("Too many magic numbers: We have %" PRIuS + " but only %" PRIuS "are allowed", + magic_numbers_size, + Widelands::Player::AiPersistentState::kMagicNumbersSize); + } + assert(player->ai_data.magic_numbers.size() == + Widelands::Player::AiPersistentState::kMagicNumbersSize); + for (size_t i = 0; i < magic_numbers_size; ++i) { + player->ai_data.magic_numbers.at(i) = fr.signed_16(); + } + + // Neurons + const size_t neuron_pool_size = fr.unsigned_32(); + if (neuron_pool_size > Widelands::Player::AiPersistentState::kNeuronPoolSize) { + throw GameDataError( + "Too many neurons: We have %" PRIuS " but only %" PRIuS "are allowed", + neuron_pool_size, Widelands::Player::AiPersistentState::kNeuronPoolSize); + } + assert(player->ai_data.neuron_weights.size() == + Widelands::Player::AiPersistentState::kNeuronPoolSize); + for (size_t i = 0; i < neuron_pool_size; ++i) { + player->ai_data.neuron_weights.at(i) = fr.signed_8(); + } + assert(player->ai_data.neuron_functs.size() == + Widelands::Player::AiPersistentState::kNeuronPoolSize); + for (size_t i = 0; i < neuron_pool_size; ++i) { + player->ai_data.neuron_functs.at(i) = fr.signed_8(); + } + + // F-neurons + const size_t f_neuron_pool_size = fr.unsigned_32(); + if (f_neuron_pool_size > Widelands::Player::AiPersistentState::kFNeuronPoolSize) { + throw GameDataError( + "Too many f neurons: We have %" PRIuS " but only %" PRIuS "are allowed", + f_neuron_pool_size, Widelands::Player::AiPersistentState::kFNeuronPoolSize); + } + assert(player->ai_data.f_neurons.size() == + Widelands::Player::AiPersistentState::kFNeuronPoolSize); + for (size_t i = 0; i < f_neuron_pool_size; ++i) { + player->ai_data.f_neurons.at(i) = fr.unsigned_32(); + } + + // Remaining buildings for basic economy + assert(player->ai_data.remaining_basic_buildings.empty()); + + size_t remaining_basic_buildings_size = fr.unsigned_32(); + for (uint16_t i = 0; i < remaining_basic_buildings_size; ++i) { + // Buildings saved as strings + const std::string building_string = fr.string(); + const Widelands::DescriptionIndex bld_idx = + player->tribe().building_index(building_string); + player->ai_data.remaining_basic_buildings.emplace(bld_idx, fr.unsigned_32()); + } + // Basic sanity check for remaining basic buildings + assert(player->ai_data.remaining_basic_buildings.size() < + player->tribe().buildings().size()); + } catch (const WException& e) { throw GameDataError("player %u: %s", p, e.what()); } === modified file 'src/game_io/game_player_info_packet.cc' --- src/game_io/game_player_info_packet.cc 2018-04-28 07:02:42 +0000 +++ src/game_io/game_player_info_packet.cc 2018-07-12 05:46:37 +0000 @@ -37,7 +37,7 @@ FileRead fr; fr.open(fs, "binary/player_info"); uint16_t const packet_version = fr.unsigned_16(); - if (packet_version >= 19 && packet_version <= kCurrentPacketVersion) { + if (packet_version == kCurrentPacketVersion) { uint32_t const max_players = fr.unsigned_16(); for (uint32_t i = 1; i < max_players + 1; ++i) { game.remove_player(i); @@ -60,7 +60,7 @@ player->set_ai(fr.c_string()); player->read_statistics(fr); - player->read_remaining_shipnames(fr, packet_version); + player->read_remaining_shipnames(fr); player->casualties_ = fr.unsigned_32(); player->kills_ = fr.unsigned_32(); @@ -72,17 +72,15 @@ } // Result screen - if (packet_version > 19) { - PlayersManager* manager = game.player_manager(); - const uint8_t no_endstatus = fr.unsigned_8(); - for (uint8_t i = 0; i < no_endstatus; ++i) { - PlayerEndStatus status; - status.player = fr.unsigned_8(); - status.result = static_cast<PlayerEndResult>(fr.unsigned_8()); - status.time = fr.unsigned_32(); - status.info = fr.c_string(); - manager->set_player_end_status(status); - } + PlayersManager* manager = game.player_manager(); + const uint8_t no_endstatus = fr.unsigned_8(); + for (uint8_t i = 0; i < no_endstatus; ++i) { + PlayerEndStatus status; + status.player = fr.unsigned_8(); + status.result = static_cast<PlayerEndResult>(fr.unsigned_8()); + status.time = fr.unsigned_32(); + status.info = fr.c_string(); + manager->set_player_end_status(status); } game.read_statistics(fr); === modified file 'src/logic/map_objects/immovable.cc' --- src/logic/map_objects/immovable.cc 2018-04-07 16:59:00 +0000 +++ src/logic/map_objects/immovable.cc 2018-07-12 05:46:37 +0000 @@ -550,6 +550,7 @@ Immovable& imm = dynamic_cast<Immovable&>(*get_object()); + // Supporting older versions for map loading if (packet_version >= 5) { PlayerNumber pn = fr.unsigned_8(); if (pn && pn <= kMaxPlayers) { === modified file 'src/logic/map_objects/map_object.cc' --- src/logic/map_objects/map_object.cc 2018-04-07 16:59:00 +0000 +++ src/logic/map_objects/map_object.cc 2018-07-12 05:46:37 +0000 @@ -592,6 +592,7 @@ throw wexception("header is %u, expected %u", header, HeaderMapObject); uint8_t const packet_version = fr.unsigned_8(); + // Supporting older versions for map loading if (packet_version < 1 || packet_version > kCurrentPacketVersionMapObject) { throw UnhandledVersionError("MapObject", packet_version, kCurrentPacketVersionMapObject); } === modified file 'src/logic/map_objects/tribes/militarysite.h' --- src/logic/map_objects/tribes/militarysite.h 2018-04-07 16:59:00 +0000 +++ src/logic/map_objects/tribes/militarysite.h 2018-07-12 05:46:37 +0000 @@ -36,7 +36,6 @@ // I assume elsewhere, that enum SoldierPreference fits to uint8_t. enum class SoldierPreference : uint8_t { - kNotSet, // For savegame compatibility only. kRookies, kHeroes, }; === modified file 'src/logic/map_objects/tribes/ship.cc' --- src/logic/map_objects/tribes/ship.cc 2018-05-27 06:02:18 +0000 +++ src/logic/map_objects/tribes/ship.cc 2018-07-12 05:46:37 +0000 @@ -1110,7 +1110,7 @@ ============================== */ -constexpr uint8_t kCurrentPacketVersion = 7; +constexpr uint8_t kCurrentPacketVersion = 8; const Bob::Task* Ship::Loader::get_task(const std::string& name) { if (name == "shipidle" || name == "ship") === modified file 'src/logic/map_objects/tribes/ship.h' --- src/logic/map_objects/tribes/ship.h 2018-07-12 04:41:20 +0000 +++ src/logic/map_objects/tribes/ship.h 2018-07-12 05:46:37 +0000 @@ -35,10 +35,11 @@ class PortDock; // This can't be part of the Ship class because of forward declaration in game.h +// Keep the order of entries for savegame compatibility. enum class IslandExploreDirection { - kCounterClockwise = 0, // This comes first for savegame compatibility (used to be = 0) - kClockwise = 1, - kNotSet + kNotSet, + kCounterClockwise, + kClockwise, }; struct NoteShip { === modified file 'src/logic/map_objects/tribes/soldier.cc' --- src/logic/map_objects/tribes/soldier.cc 2018-04-07 16:59:00 +0000 +++ src/logic/map_objects/tribes/soldier.cc 2018-07-12 05:46:37 +0000 @@ -1574,9 +1574,6 @@ */ constexpr uint8_t kCurrentPacketVersion = 3; -// TODO(TiborB): This is only for map compatibility in regression tests, we should get rid of this -// ASAP -constexpr uint8_t kOldPacketVersion = 2; Soldier::Loader::Loader() : battle_(0) { } @@ -1586,17 +1583,10 @@ try { uint8_t packet_version = fr.unsigned_8(); - if (packet_version == kCurrentPacketVersion || packet_version == kOldPacketVersion) { - + if (packet_version == kCurrentPacketVersion) { Soldier& soldier = get<Soldier>(); soldier.current_health_ = fr.unsigned_32(); - if (packet_version == kCurrentPacketVersion) { - soldier.retreat_health_ = fr.unsigned_32(); - } else { - // not ideal but will be used only for regression tests - soldier.retreat_health_ = 0; - } - + soldier.retreat_health_ = fr.unsigned_32(); soldier.health_level_ = std::min(fr.unsigned_32(), soldier.descr().get_max_health_level()); soldier.attack_level_ = std::min(fr.unsigned_32(), soldier.descr().get_max_attack_level()); soldier.defense_level_ = @@ -1614,7 +1604,6 @@ soldier.combat_walkstart_ = fr.unsigned_32(); soldier.combat_walkend_ = fr.unsigned_32(); } - battle_ = fr.unsigned_32(); } else { throw UnhandledVersionError("Soldier", packet_version, kCurrentPacketVersion); === modified file 'src/logic/map_objects/tribes/worker.cc' --- src/logic/map_objects/tribes/worker.cc 2018-05-05 17:10:37 +0000 +++ src/logic/map_objects/tribes/worker.cc 2018-07-12 05:46:37 +0000 @@ -2959,21 +2959,6 @@ } const Map& map = game.map(); - - if (scouts_worklist.empty()) { - // This routine assumes that scouts_worklist is not empty. There is one exception: - // First call to this routine after loading an old savegame. The least-invasive - // way to acquire old savegame compatibility was to simply ask the scout to go home early, - // under this special situation. Anybody reading this, - // TODO(kxq): Please remove this code block (and compatibility_2017 code from load routine) - // once Build 20 is out. Thanks. - log("Warning: sending scout home. Assuming the game was just started, from savegame, in " - "compatibility mode.\n"); - pop_task(game); - schedule_act(game, 10); - return; - } - bool do_run = static_cast<int32_t>(state.ivar2 - game.get_gametime()) > 0; // do not pop; this function is called many times per run. @@ -3044,12 +3029,7 @@ Bob::Loader::load(fr); try { uint8_t packet_version = fr.unsigned_8(); - // TODO(kxq): Remove the compatibility_2017 code (and similars, dozen lines below) after B20 - // TODO(kxq): Also remove the code fragment from Worker::scout_update with compatibility_2017 - // in comment. - bool compatibility_2017 = 2 == packet_version; - if (packet_version == kCurrentPacketVersion || compatibility_2017) { - + if (packet_version == kCurrentPacketVersion) { Worker& worker = get<Worker>(); location_ = fr.unsigned_32(); carried_ware_ = fr.unsigned_32(); @@ -3059,14 +3039,7 @@ worker.transfer_ = new Transfer(dynamic_cast<Game&>(egbase()), worker); worker.transfer_->read(fr, transfer_); } - unsigned veclen; - // TODO(kxq): Remove compatibility_2017 associated code from here and above, - // after build 20 has been released. - if (compatibility_2017) { - veclen = 0; - } else { - veclen = fr.unsigned_8(); - } + const unsigned veclen = fr.unsigned_8(); for (unsigned q = 0; q < veclen; q++) { if (fr.unsigned_8()) { const PlaceToScout gsw; @@ -3079,7 +3052,6 @@ worker.scouts_worklist.push_back(gtt); } } - } else { throw UnhandledVersionError("Worker", packet_version, kCurrentPacketVersion); } === modified file 'src/logic/player.cc' --- src/logic/player.cc 2018-07-12 04:41:20 +0000 +++ src/logic/player.cc 2018-07-12 05:46:37 +0000 @@ -1337,19 +1337,14 @@ * * \param fr source stream */ -void Player::read_remaining_shipnames(FileRead& fr, uint16_t packet_version) { +void Player::read_remaining_shipnames(FileRead& fr) { // First get rid of default shipnames remaining_shipnames_.clear(); const uint16_t count = fr.unsigned_16(); for (uint16_t i = 0; i < count; ++i) { remaining_shipnames_.insert(fr.string()); } - // TODO(GunChleoc): Savegame compatibility. Remove after Build 20. - if (packet_version >= 21) { - ship_name_counter_ = fr.unsigned_32(); - } else { - ship_name_counter_ = ships_.size(); - } + ship_name_counter_ = fr.unsigned_32(); } /** === modified file 'src/logic/player.h' --- src/logic/player.h 2018-07-12 04:41:20 +0000 +++ src/logic/player.h 2018-07-12 05:46:37 +0000 @@ -581,7 +581,7 @@ void read_statistics(FileRead&); void write_statistics(FileWrite&) const; - void read_remaining_shipnames(FileRead&, uint16_t packet_version); + void read_remaining_shipnames(FileRead&); void write_remaining_shipnames(FileWrite&) const; void sample_statistics(); void ware_produced(DescriptionIndex); === modified file 'src/logic/playercommand.cc' --- src/logic/playercommand.cc 2018-07-12 04:41:20 +0000 +++ src/logic/playercommand.cc 2018-07-12 05:46:37 +0000 @@ -199,7 +199,7 @@ void PlayerCommand::read(FileRead& fr, EditorGameBase& egbase, MapObjectLoader& mol) { try { const uint16_t packet_version = fr.unsigned_16(); - if (packet_version >= 2 && packet_version <= kCurrentPacketVersionPlayerCommand) { + if (packet_version == kCurrentPacketVersionPlayerCommand) { GameLogicCommand::read(fr, egbase, mol); sender_ = fr.unsigned_8(); if (!egbase.get_player(sender_)) @@ -1140,16 +1140,14 @@ void CmdSetInputMaxFill::read(FileRead& fr, EditorGameBase& egbase, MapObjectLoader& mol) { try { const uint16_t packet_version = fr.unsigned_16(); - if (packet_version >= 1 && packet_version <= kCurrentPacketVersionCmdSetInputMaxFill) { + if (packet_version == kCurrentPacketVersionCmdSetInputMaxFill) { PlayerCommand::read(fr, egbase, mol); serial_ = get_object_serial_or_zero<Building>(fr.unsigned_32(), mol); index_ = fr.signed_32(); - if (packet_version > 1) { - if (fr.unsigned_8() == 0) { - type_ = wwWARE; - } else { - type_ = wwWORKER; - } + if (fr.unsigned_8() == 0) { + type_ = wwWARE; + } else { + type_ = wwWORKER; } max_fill_ = fr.unsigned_32(); } else { === modified file 'src/map_io/map_allowed_building_types_packet.cc' --- src/map_io/map_allowed_building_types_packet.cc 2018-04-07 16:59:00 +0000 +++ src/map_io/map_allowed_building_types_packet.cc 2018-07-12 05:46:37 +0000 @@ -85,23 +85,6 @@ } catch (const WException& e) { throw GameDataError("player %u (%s): %s", p, tribe.name().c_str(), e.what()); } - - // Savegame compatibility: If all buildings except for the barracks are allowed, allow - // it too. This will make games playable again except for scenarios that restrict the - // number of buildings and need soldier creation. - // TODO(Notabilis): Remove this when we break save game compatibility anyway - if (!player->is_building_type_allowed(player->tribe().barracks())) { - size_t allowed_buildings = 0; - for (const Widelands::DescriptionIndex& index : player->tribe().buildings()) { - if (player->is_building_type_allowed(index)) { - ++allowed_buildings; - } - } - if (player->tribe().buildings().size() - 1 == allowed_buildings) { - log("WARNING: Enabling barracks for player %u.\n", player->player_number()); - player->allow_building_type(player->tribe().barracks(), true); - } - } } } else { throw UnhandledVersionError( === modified file 'src/map_io/map_buildingdata_packet.cc' --- src/map_io/map_buildingdata_packet.cc 2018-04-07 16:59:00 +0000 +++ src/map_io/map_buildingdata_packet.cc 2018-07-12 05:46:37 +0000 @@ -508,10 +508,6 @@ militarysite.soldier_upgrade_requirements_ = RequireAttribute(TrainingAttribute::kTotal, reqmin, reqmax); militarysite.soldier_preference_ = static_cast<SoldierPreference>(fr.unsigned_8()); - // TODO(GunChleoc): Savegame compatibility, remove kNotSet after Build 20. - if (militarysite.soldier_preference_ == SoldierPreference::kNotSet) { - militarysite.soldier_preference_ = SoldierPreference::kRookies; - } militarysite.next_swap_soldiers_time_ = fr.signed_32(); militarysite.soldier_upgrade_try_ = 0 != fr.unsigned_8() ? true : false; militarysite.doing_upgrade_request_ = 0 != fr.unsigned_8() ? true : false; === modified file 'src/map_io/map_players_view_packet.cc' --- src/map_io/map_players_view_packet.cc 2018-04-28 09:45:36 +0000 +++ src/map_io/map_players_view_packet.cc 2018-07-12 05:46:37 +0000 @@ -37,23 +37,13 @@ #include "logic/map_objects/tribes/tribe_descr.h" #include "logic/map_objects/world/world.h" #include "logic/player.h" - namespace Widelands { -#define PLAYERDIRNAME_TEMPLATE "player/%u" -#define DIRNAME_TEMPLATE PLAYERDIRNAME_TEMPLATE "/view" +#define DIRNAME_TEMPLATE "player/%u/view" constexpr uint8_t kCurrentPacketVersionUnseenTimes = 1; #define UNSEEN_TIMES_FILENAME_TEMPLATE DIRNAME_TEMPLATE "/unseen_times_%u" -constexpr uint8_t kCurrentPacketVersionImmovableKinds = 2; -#define NODE_IMMOVABLE_KINDS_FILENAME_TEMPLATE DIRNAME_TEMPLATE "/node_immovable_kinds_%u" -#define TRIANGLE_IMMOVABLE_KINDS_FILENAME_TEMPLATE DIRNAME_TEMPLATE "/triangle_immovable_kinds_%u" - -constexpr uint8_t kCurrentPacketVersionImmovables = 2; -#define NODE_IMMOVABLES_FILENAME_TEMPLATE DIRNAME_TEMPLATE "/node_immovables_%u" -#define TRIANGLE_IMMOVABLES_FILENAME_TEMPLATE DIRNAME_TEMPLATE "/triangle_immovables_%u" - constexpr uint8_t kCurrentPacketVersionRoads = 2; #define ROADS_FILENAME_TEMPLATE DIRNAME_TEMPLATE "/roads_%u" @@ -109,13 +99,6 @@ // / \ / // bl------br -struct MapObjectData { - MapObjectData() : map_object_descr(nullptr) { - } - const MapObjectDescr* map_object_descr; - ConstructionsiteInformation csi; -}; - namespace { #define OPEN_INPUT_FILE(filetype, file, filename, filename_template, version) \ char(filename)[FILENAME_SIZE]; \ @@ -168,118 +151,8 @@ "MapPlayersViewPacket::read: player %u:" \ "Found %lu trailing bytes in \"%s\"", \ plnum, static_cast<long unsigned int>((file).get_size() - (file).get_pos()), filename); - -// Errors for the Read* functions. -struct TribeImmovableNonexistent : public FileRead::DataError { - explicit TribeImmovableNonexistent(const std::string& Name) - : DataError("immovable type \"%s\" does not seem to be a tribe immovable", Name.c_str()), - name(Name) { - } - - std::string name; -}; -struct WorldImmovableNonexistent : public FileRead::DataError { - explicit WorldImmovableNonexistent(char const* const Name) - : DataError("world does not define immovable type \"%s\"", Name), name(Name) { - } - char const* const name; -}; -struct BuildingNonexistent : public FileRead::DataError { - explicit BuildingNonexistent(char const* const Name) - : DataError("tribes do not define building type \"%s\"", Name), name(Name) { - } - char const* const name; -}; - -// reads an immovable depending on whether it is a tribe or world immovable -const ImmovableDescr& read_immovable_type(StreamRead* fr, const EditorGameBase& egbase) { - uint8_t owner = fr->unsigned_8(); - char const* const name = fr->c_string(); - if (owner == static_cast<uint8_t>(MapObjectDescr::OwnerType::kWorld)) { - DescriptionIndex const index = egbase.world().get_immovable_index(name); - if (index == Widelands::INVALID_INDEX) - throw WorldImmovableNonexistent(name); - return *egbase.world().get_immovable_descr(index); - } else { - assert(owner == static_cast<uint8_t>(MapObjectDescr::OwnerType::kTribe)); - DescriptionIndex const index = egbase.tribes().immovable_index(name); - if (index == Widelands::INVALID_INDEX) - throw TribeImmovableNonexistent(name); - return *egbase.tribes().get_immovable_descr(index); - } -} - -// Reads a c_string and interprets it as the name of an immovable type. -// -// \returns a reference to the building type description. -// -// \throws Building_Nonexistent if there is no building type with that name -const BuildingDescr& read_building_type(StreamRead* fr, const EditorGameBase& egbase) { - char const* const name = fr->c_string(); - DescriptionIndex const index = egbase.tribes().building_index(name); - if (!egbase.tribes().building_exists(index)) { - throw BuildingNonexistent(name); - } - return *egbase.tribes().get_building_descr(index); -} - -// Encode a Immovable_Type into 'wr'. -void write_immovable_type(StreamWrite* wr, const ImmovableDescr& immovable) { - wr->unsigned_8(static_cast<uint8_t>(immovable.owner_type())); - wr->string(immovable.name()); -} - -// Encode a Building_Type into 'wr'. -void write_building_type(StreamWrite* wr, const BuildingDescr& building) { - wr->string(building.name()); -} - } // namespace -inline static MapObjectData read_unseen_immovable(const EditorGameBase& egbase, - uint8_t& immovable_kind, - FileRead& immovables_file, - uint8_t& version) { - MapObjectData m; - try { - switch (immovable_kind) { - case UNSEEN_NONE: // The player sees no immovable. - m.map_object_descr = nullptr; - break; - case UNSEEN_TRIBEORWORLD: // The player sees a tribe or world immovable. - m.map_object_descr = &read_immovable_type(&immovables_file, egbase); - break; - case UNSEEN_FLAG: // The player sees a flag. - m.map_object_descr = &g_flag_descr; - break; - case UNSEEN_BUILDING: // The player sees a building. - m.map_object_descr = &read_building_type(&immovables_file, egbase); - if (version == kCurrentPacketVersionImmovables) { - // Read data from immovables file - if (immovables_file.unsigned_8() == 1) { // the building is a constructionsite - m.csi.becomes = &read_building_type(&immovables_file, egbase); - if (immovables_file.unsigned_8() == 1) { - m.csi.was = &read_building_type(&immovables_file, egbase); - } - m.csi.totaltime = immovables_file.unsigned_32(); - m.csi.completedtime = immovables_file.unsigned_32(); - } - } else { - throw UnhandledVersionError( - "MapPlayersViewPacket", version, kCurrentPacketVersionImmovables); - } - break; - case UNSEEN_PORTDOCK: // The player sees a port dock - m.map_object_descr = &g_portdock_descr; - break; - default: - throw GameDataError("Unknown immovable-kind type %d", immovable_kind); - } - } catch (const WException& e) { - throw GameDataError("unseen immovable: %s", e.what()); - } - return m; -} void MapPlayersViewPacket::read(FileSystem& fs, EditorGameBase& egbase, @@ -431,31 +304,12 @@ } // Read the player's knowledge about all fields - OPEN_INPUT_FILE_NEW_VERSION(FileRead, node_immovable_kinds_file, - node_immovable_kinds_filename, node_immovable_kinds_file_version, - NODE_IMMOVABLE_KINDS_FILENAME_TEMPLATE, - kCurrentPacketVersionImmovableKinds); - - OPEN_INPUT_FILE_NEW_VERSION(FileRead, node_immovables_file, node_immovables_filename, - node_immovables_file_version, NODE_IMMOVABLES_FILENAME_TEMPLATE, - kCurrentPacketVersionImmovables); - OPEN_INPUT_FILE_NEW_VERSION(FileRead, roads_file, roads_filename, road_file_version, ROADS_FILENAME_TEMPLATE, kCurrentPacketVersionRoads); OPEN_INPUT_FILE_NEW_VERSION(FileRead, terrains_file, terrains_filename, terrains_file_version, TERRAINS_FILENAME_TEMPLATE, kCurrentPacketVersionTerrains); - OPEN_INPUT_FILE_NEW_VERSION( - FileRead, triangle_immovable_kinds_file, triangle_immovable_kinds_filename, - triangle_immovable_kinds_file_version, TRIANGLE_IMMOVABLE_KINDS_FILENAME_TEMPLATE, - kCurrentPacketVersionImmovableKinds); - - OPEN_INPUT_FILE_NEW_VERSION(FileRead, triangle_immovables_file, triangle_immovables_filename, - triangle_immovables_file_version, - TRIANGLE_IMMOVABLES_FILENAME_TEMPLATE, - kCurrentPacketVersionImmovables); - OPEN_INPUT_FILE(FileRead, owners_file, owners_filename, OWNERS_FILENAME_TEMPLATE, kCurrentPacketVersionOwners); @@ -550,19 +404,6 @@ static_cast<long unsigned int>(owners_file.get_pos() - 1), f.x, f.y, owner, nr_players); } - uint8_t imm_kind = 0; - if (node_immovable_kinds_file_version == kCurrentPacketVersionImmovableKinds) { - imm_kind = node_immovable_kinds_file.unsigned_8(); - } else { - throw UnhandledVersionError("MapPlayersViewPacket - Node Immovable kinds", - node_immovable_kinds_file_version, - kCurrentPacketVersionImmovableKinds); - } - MapObjectData mod = read_unseen_immovable( - egbase, imm_kind, node_immovables_file, node_immovables_file_version); - f_player_field.map_object_descr = mod.map_object_descr; - f_player_field.constructionsite = mod.csi; - // Read in whether this field had a border the last time it was seen if (border_file_version == kCurrentPacketVersionBorder) { uint8_t borders = border_file.unsigned_8(); @@ -618,22 +459,6 @@ throw UnhandledVersionError("MapPlayersViewPacket - Terrains", terrains_file_version, kCurrentPacketVersionTerrains); } - uint8_t im_kind = 0; - if (triangle_immovable_kinds_file_version == kCurrentPacketVersionImmovableKinds) { - im_kind = triangle_immovable_kinds_file.unsigned_8(); - } else { - throw UnhandledVersionError("MapPlayersViewPacket - Triangle Immovable kinds", - triangle_immovable_kinds_file_version, - kCurrentPacketVersionImmovableKinds); - } - // We read and ignore the immovable information on the D - // triangle. This was done because there were vague plans of - // suporting immovables on the triangles instead as on the - // nodes. - // TODO(sirver): Remove this logic the next time we break - // savegame compatibility. - read_unseen_immovable( - egbase, im_kind, triangle_immovables_file, triangle_immovables_file_version); } if (f_seen | br_seen | r_seen) { // The player currently sees the R triangle. Therefore his @@ -649,20 +474,6 @@ throw UnhandledVersionError("MapPlayersViewPacket - Terrains", terrains_file_version, kCurrentPacketVersionTerrains); } - uint8_t im_kind = 0; - if (triangle_immovable_kinds_file_version == kCurrentPacketVersionImmovableKinds) { - im_kind = triangle_immovable_kinds_file.unsigned_8(); - } else { - throw UnhandledVersionError("MapPlayersViewPacket - Triangle Immovable kinds", - triangle_immovable_kinds_file_version, - kCurrentPacketVersionImmovableKinds); - } - // We read and ignore the immovable information on the D - // triangle. This was done because there were vague plans of - // suporting immovables on the triangles instead as on the - // nodes. - read_unseen_immovable( - egbase, im_kind, triangle_immovables_file, triangle_immovables_file_version); } { // edges @@ -791,23 +602,14 @@ player->hidden_fields_.insert( std::make_pair(hidden_file.unsigned_32(), hidden_file.unsigned_16())); } - } else if (hidden_file_version < 0) { - // TODO(GunChleoc): Savegame compatibility - remove after Build 20 - log("MapPlayersViewPacket - No hidden fields to read for Player %d - probably an old save " - "file\n", - plnum); } else { throw UnhandledVersionError("MapPlayersViewPacket - Hidden fields file", hidden_file_version, kCurrentPacketVersionHidden); } CHECK_TRAILING_BYTES(unseen_times_file, unseen_times_filename); - CHECK_TRAILING_BYTES(node_immovable_kinds_file, node_immovable_kinds_filename); - CHECK_TRAILING_BYTES(node_immovables_file, node_immovables_filename); CHECK_TRAILING_BYTES(roads_file, roads_filename); CHECK_TRAILING_BYTES(terrains_file, terrains_filename); - CHECK_TRAILING_BYTES(triangle_immovable_kinds_file, triangle_immovable_kinds_filename); - CHECK_TRAILING_BYTES(triangle_immovables_file, triangle_immovables_filename); CHECK_TRAILING_BYTES(owners_file, owners_filename); CHECK_TRAILING_BYTES(surveys_file, surveys_filename); CHECK_TRAILING_BYTES(survey_amounts_file, survey_amounts_filename); @@ -817,52 +619,6 @@ } } -inline static void write_unseen_immovable(MapObjectData const* map_object_data, - FileWrite& immovable_kinds_file, - FileWrite& immovables_file) { - MapObjectDescr const* const map_object_descr = map_object_data->map_object_descr; - const ConstructionsiteInformation& csi = map_object_data->csi; - assert(!Road::is_road_descr(map_object_descr)); - uint8_t immovable_kind = 255; - - if (!map_object_descr) - immovable_kind = UNSEEN_NONE; - else if (upcast(ImmovableDescr const, immovable_descr, map_object_descr)) { - immovable_kind = UNSEEN_TRIBEORWORLD; - write_immovable_type(&immovables_file, *immovable_descr); - } else if (map_object_descr->type() == MapObjectType::FLAG) - immovable_kind = UNSEEN_FLAG; - else if (upcast(BuildingDescr const, building_descr, map_object_descr)) { - immovable_kind = UNSEEN_BUILDING; - write_building_type(&immovables_file, *building_descr); - if (!csi.becomes) - immovables_file.unsigned_8(0); - else { - // the building is a constructionsite - immovables_file.unsigned_8(1); - write_building_type(&immovables_file, *csi.becomes); - if (!csi.was) - immovables_file.unsigned_8(0); - else { - // constructionsite is an enhancement, therefor we write down the enhancement - immovables_file.unsigned_8(1); - write_building_type(&immovables_file, *csi.was); - } - immovables_file.unsigned_32(csi.totaltime); - immovables_file.unsigned_32(csi.completedtime); - } - } else if (map_object_descr->type() == MapObjectType::PORTDOCK) - immovable_kind = UNSEEN_PORTDOCK; - else { - // We should never get here.. output some information about the situation. - log("\nwidelands_map_players_view_data_packet.cc::write_unseen_immovable(): "); - log("%s %s (%s) was not expected.\n", typeid(*map_object_descr).name(), - map_object_descr->name().c_str(), map_object_descr->descname().c_str()); - NEVER_HERE(); - } - immovable_kinds_file.unsigned_8(immovable_kind); -} - #define WRITE(file, filename_template, version) \ snprintf(filename, sizeof(filename), filename_template, plnum, version); \ (file).write(fs, filename); @@ -880,12 +636,8 @@ plnum, nr_players, egbase, player) if (const Player::Field* const player_fields = player->fields_) { FileWrite unseen_times_file; - FileWrite node_immovable_kinds_file; - FileWrite node_immovables_file; FileWrite roads_file; FileWrite terrains_file; - FileWrite triangle_immovable_kinds_file; - FileWrite triangle_immovables_file; FileWrite owners_file; FileWrite surveys_file; FileWrite survey_amounts_file; @@ -929,10 +681,6 @@ unseen_times_file.unsigned_32(f_player_field.time_node_last_unseen); assert(f_player_field.owner < 0x20); owners_file.unsigned_8(f_player_field.owner); - MapObjectData mod; - mod.map_object_descr = f_player_field.map_object_descr; - mod.csi = f_player_field.constructionsite; - write_unseen_immovable(&mod, node_immovable_kinds_file, node_immovables_file); // write whether this field had a border the last time it was seen uint8_t borders = 0; @@ -949,20 +697,12 @@ // seen it ((!bl_seen) & (!br_seen) & (f_everseen | bl_everseen | br_everseen)) { terrains_file.unsigned_8(f_player_field.terrains.d); - MapObjectData mod; - mod.map_object_descr = nullptr; - write_unseen_immovable( - &mod, triangle_immovable_kinds_file, triangle_immovables_file); } if // the player does not see the R triangle now but has // seen it ((!br_seen) & (!r_seen) & (f_everseen | br_everseen | r_everseen)) { terrains_file.unsigned_8(f_player_field.terrains.r); - MapObjectData mod; - mod.map_object_descr = nullptr; - write_unseen_immovable( - &mod, triangle_immovable_kinds_file, triangle_immovables_file); } // edges @@ -1007,28 +747,14 @@ char filename[FILENAME_SIZE]; fs.ensure_directory_exists( - (boost::format(PLAYERDIRNAME_TEMPLATE) % static_cast<unsigned int>(plnum)).str()); - fs.ensure_directory_exists( (boost::format(DIRNAME_TEMPLATE) % static_cast<unsigned int>(plnum)).str()); WRITE(unseen_times_file, UNSEEN_TIMES_FILENAME_TEMPLATE, kCurrentPacketVersionUnseenTimes); - WRITE(node_immovable_kinds_file, NODE_IMMOVABLE_KINDS_FILENAME_TEMPLATE, - kCurrentPacketVersionImmovableKinds); - - WRITE( - node_immovables_file, NODE_IMMOVABLES_FILENAME_TEMPLATE, kCurrentPacketVersionImmovables); - WRITE(roads_file, ROADS_FILENAME_TEMPLATE, kCurrentPacketVersionRoads); WRITE(terrains_file, TERRAINS_FILENAME_TEMPLATE, kCurrentPacketVersionTerrains); - WRITE(triangle_immovable_kinds_file, TRIANGLE_IMMOVABLE_KINDS_FILENAME_TEMPLATE, - kCurrentPacketVersionImmovableKinds); - - WRITE(triangle_immovables_file, TRIANGLE_IMMOVABLES_FILENAME_TEMPLATE, - kCurrentPacketVersionImmovables); - WRITE(owners_file, OWNERS_FILENAME_TEMPLATE, kCurrentPacketVersionOwners); WRITE(surveys_file, SURVEYS_FILENAME_TEMPLATE, kCurrentPacketVersionSurveys); === modified file 'src/wui/soldierlist.cc' --- src/wui/soldierlist.cc 2018-04-07 16:59:00 +0000 +++ src/wui/soldierlist.cc 2018-07-12 05:46:37 +0000 @@ -436,8 +436,6 @@ if (upcast(Widelands::MilitarySite, ms, &building_)) { switch (ms->get_soldier_preference()) { case Widelands::SoldierPreference::kRookies: - FALLS_THROUGH; - case Widelands::SoldierPreference::kNotSet: soldier_preference_.set_state(0); break; case Widelands::SoldierPreference::kHeroes: === modified file 'test/maps/lua_testsuite.wmf/binary/mapobjects' Binary files test/maps/lua_testsuite.wmf/binary/mapobjects 2018-04-17 03:17:15 +0000 and test/maps/lua_testsuite.wmf/binary/mapobjects 2018-07-12 05:46:37 +0000 differ
_______________________________________________ Mailing list: https://launchpad.net/~widelands-dev Post to : widelands-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp