diff options
author | Peter Nelson <peter1138@openttd.org> | 2019-02-03 23:50:50 +0000 |
---|---|---|
committer | Charles Pigott <charlespigott@googlemail.com> | 2019-02-04 20:43:14 +0000 |
commit | 64878320ccac0854b0712730e5f9dedcf0bb591d (patch) | |
tree | ab44ae11fa03b8a0e5a31175997bc3825bd24c7d /src/saveload | |
parent | 0b10678050c82604214136343673a5290f986cdb (diff) | |
download | openttd-64878320ccac0854b0712730e5f9dedcf0bb591d.tar.xz |
Fix #6803: CargoMonitorID bit packing updated to handle 64 cargo types.
This requires a saveload bump to change the bitpacking on loading older saves.
Diffstat (limited to 'src/saveload')
-rw-r--r-- | src/saveload/cargomonitor_sl.cpp | 21 | ||||
-rw-r--r-- | src/saveload/saveload.h | 1 |
2 files changed, 22 insertions, 0 deletions
diff --git a/src/saveload/cargomonitor_sl.cpp b/src/saveload/cargomonitor_sl.cpp index 98ad95f09..9a313970f 100644 --- a/src/saveload/cargomonitor_sl.cpp +++ b/src/saveload/cargomonitor_sl.cpp @@ -29,6 +29,21 @@ static const SaveLoad _cargomonitor_pair_desc[] = { SLE_END() }; +static CargoMonitorID FixupCargoMonitor(CargoMonitorID number) +{ + /* Between SLV_EXTEND_CARGOTYPES and SLV_FIX_CARGO_MONITOR, the + * CargoMonitorID structure had insufficient packing for more + * than 32 cargo types. Here we have to shuffle bits to account + * for the change. + * Company moved from bits 24-31 to 25-28. + * Cargo type increased from bits 19-23 to 19-24. + */ + SB(number, 25, 4, GB(number, 24, 4)); + SB(number, 29, 3, 0); + ClrBit(number, 24); + return number; +} + /** Save the #_cargo_deliveries monitoring map. */ static void SaveDelivery() { @@ -52,12 +67,15 @@ static void SaveDelivery() static void LoadDelivery() { TempStorage storage; + bool fix = IsSavegameVersionBefore(SLV_FIX_CARGO_MONITOR); ClearCargoDeliveryMonitoring(); for (;;) { if (SlIterateArray() < 0) break; SlObject(&storage, _cargomonitor_pair_desc); + if (fix) storage.number = FixupCargoMonitor(storage.number); + std::pair<CargoMonitorID, uint32> p(storage.number, storage.amount); _cargo_deliveries.insert(p); } @@ -87,12 +105,15 @@ static void SavePickup() static void LoadPickup() { TempStorage storage; + bool fix = IsSavegameVersionBefore(SLV_FIX_CARGO_MONITOR); ClearCargoPickupMonitoring(); for (;;) { if (SlIterateArray() < 0) break; SlObject(&storage, _cargomonitor_pair_desc); + if (fix) storage.number = FixupCargoMonitor(storage.number); + std::pair<CargoMonitorID, uint32> p(storage.number, storage.amount); _cargo_pickups.insert(p); } diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h index 5c84abc21..e5e2e1fa2 100644 --- a/src/saveload/saveload.h +++ b/src/saveload/saveload.h @@ -290,6 +290,7 @@ enum SaveLoadVersion : uint16 { SLV_GROUP_LIVERIES, ///< 205 PR#7108 Livery storage change and group liveries. SLV_SHIPS_STOP_IN_LOCKS, ///< 206 PR#7150 Ship/lock movement changes. + SLV_FIX_CARGO_MONITOR, ///< 207 PR#7175 Cargo monitor data packing fix to support 64 cargotypes. SL_MAX_VERSION, ///< Highest possible saveload version }; |