summaryrefslogtreecommitdiff
path: root/src/saveload
diff options
context:
space:
mode:
authorPeter Nelson <peter1138@openttd.org>2019-02-03 23:50:50 +0000
committerCharles Pigott <charlespigott@googlemail.com>2019-02-04 20:43:14 +0000
commit64878320ccac0854b0712730e5f9dedcf0bb591d (patch)
treeab44ae11fa03b8a0e5a31175997bc3825bd24c7d /src/saveload
parent0b10678050c82604214136343673a5290f986cdb (diff)
downloadopenttd-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.cpp21
-rw-r--r--src/saveload/saveload.h1
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
};