summaryrefslogtreecommitdiff
path: root/src/saveload
diff options
context:
space:
mode:
authorJonathan G Rennison <j.g.rennison@gmail.com>2020-05-17 22:13:08 +0100
committerNiels Martin Hansen <nielsm@indvikleren.dk>2020-06-28 15:32:53 +0200
commit7a09413a1aabc934c201c19bcae3ad03d7b801c7 (patch)
treec41503efca8f6da99b5359b1fe05f7ed6c708c32 /src/saveload
parent54237b0e98894008168285109634479dddb1bc16 (diff)
downloadopenttd-7a09413a1aabc934c201c19bcae3ad03d7b801c7.tar.xz
Fix: Incorrect save/load array size of Town::cargo_accepted
In 11ab3c4e the number of cargo types was changed from 32 to 64. The save/load of Town::cargo_accepted was not updated, such that only half of the data structure is saved/loaded in savegame versions 199 to 218. Discard and regenerate data from all savegame versions prior to 219.
Diffstat (limited to 'src/saveload')
-rw-r--r--src/saveload/afterload.cpp2
-rw-r--r--src/saveload/saveload.h1
-rw-r--r--src/saveload/town_sl.cpp27
3 files changed, 19 insertions, 11 deletions
diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp
index cc2a671a2..e9c1cdb90 100644
--- a/src/saveload/afterload.cpp
+++ b/src/saveload/afterload.cpp
@@ -2830,7 +2830,7 @@ bool AfterLoadGame()
* which is done by StartupEngines(). */
if (gcf_res != GLC_ALL_GOOD) StartupEngines();
- if (IsSavegameVersionBefore(SLV_166)) {
+ if (IsSavegameVersionBefore(SLV_FIX_TOWN_ACCEPTANCE)) {
/* Update cargo acceptance map of towns. */
for (TileIndex t = 0; t < map_size; t++) {
if (!IsTileType(t, MP_HOUSE)) continue;
diff --git a/src/saveload/saveload.h b/src/saveload/saveload.h
index 26462cdaa..dcf8a41d8 100644
--- a/src/saveload/saveload.h
+++ b/src/saveload/saveload.h
@@ -302,6 +302,7 @@ enum SaveLoadVersion : uint16 {
SLV_MULTITILE_DOCKS, ///< 216 PR#7380 Multiple docks per station.
SLV_TRADING_AGE, ///< 217 PR#7780 Configurable company trading age.
SLV_ENDING_YEAR, ///< 218 PR#7747 v1.10 Configurable ending year.
+ SLV_FIX_TOWN_ACCEPTANCE, ///< 219 PR#8157 Fix Town::cargo_accepted savegame format.
SL_MAX_VERSION, ///< Highest possible saveload version
};
diff --git a/src/saveload/town_sl.cpp b/src/saveload/town_sl.cpp
index cbf7205d0..7e41ef6cc 100644
--- a/src/saveload/town_sl.cpp
+++ b/src/saveload/town_sl.cpp
@@ -256,7 +256,7 @@ static void RealSave_Town(Town *t)
SlObject(&t->cargo_accepted, GetTileMatrixDesc());
if (t->cargo_accepted.area.w != 0) {
uint arr_len = t->cargo_accepted.area.w / AcceptanceMatrix::GRID * t->cargo_accepted.area.h / AcceptanceMatrix::GRID;
- SlArray(t->cargo_accepted.data, arr_len, SLE_UINT32);
+ SlArray(t->cargo_accepted.data, arr_len, SLE_UINT64);
}
}
@@ -288,16 +288,23 @@ static void Load_TOWN()
SlErrorCorrupt("Invalid town name generator");
}
- if (IsSavegameVersionBefore(SLV_166)) continue;
+ if (!IsSavegameVersionBefore(SLV_FIX_TOWN_ACCEPTANCE)) {
+ SlObject(&t->cargo_accepted, GetTileMatrixDesc());
+ if (t->cargo_accepted.area.w != 0) {
+ uint arr_len = t->cargo_accepted.area.w / AcceptanceMatrix::GRID * t->cargo_accepted.area.h / AcceptanceMatrix::GRID;
+ t->cargo_accepted.data = MallocT<CargoTypes>(arr_len);
+ SlArray(t->cargo_accepted.data, arr_len, SLE_UINT64);
- SlObject(&t->cargo_accepted, GetTileMatrixDesc());
- if (t->cargo_accepted.area.w != 0) {
- uint arr_len = t->cargo_accepted.area.w / AcceptanceMatrix::GRID * t->cargo_accepted.area.h / AcceptanceMatrix::GRID;
- t->cargo_accepted.data = MallocT<CargoTypes>(arr_len);
- SlArray(t->cargo_accepted.data, arr_len, SLE_UINT32);
-
- /* Rebuild total cargo acceptance. */
- UpdateTownCargoTotal(t);
+ /* Rebuild total cargo acceptance. */
+ UpdateTownCargoTotal(t);
+ }
+ } else if (!IsSavegameVersionBefore(SLV_166)) {
+ AcceptanceMatrix cargo_accepted;
+ SlObject(&cargo_accepted, GetTileMatrixDesc());
+ if (cargo_accepted.area.w != 0) {
+ uint arr_len = cargo_accepted.area.w / AcceptanceMatrix::GRID * cargo_accepted.area.h / AcceptanceMatrix::GRID;
+ SlSkipBytes(4 * arr_len);
+ }
}
}
}