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.
This commit is contained in:
Jonathan G Rennison
2020-05-17 22:13:08 +01:00
committed by Niels Martin Hansen
parent 54237b0e98
commit 7a09413a1a
3 changed files with 19 additions and 11 deletions

View File

@@ -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);
}
}
}
}