diff options
author | Jonathan G Rennison <j.g.rennison@gmail.com> | 2020-05-17 22:13:08 +0100 |
---|---|---|
committer | Niels Martin Hansen <nielsm@indvikleren.dk> | 2020-06-28 15:32:53 +0200 |
commit | 7a09413a1aabc934c201c19bcae3ad03d7b801c7 (patch) | |
tree | c41503efca8f6da99b5359b1fe05f7ed6c708c32 /src/saveload | |
parent | 54237b0e98894008168285109634479dddb1bc16 (diff) | |
download | openttd-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.cpp | 2 | ||||
-rw-r--r-- | src/saveload/saveload.h | 1 | ||||
-rw-r--r-- | src/saveload/town_sl.cpp | 27 |
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); + } } } } |