From 51f1e939e885151a5aa12c6c4d3ff80c7050fa39 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Mon, 15 Jan 2024 19:22:51 +0100 Subject: [PATCH] Change: be more resilient against missing towns in old loader --- src/saveload/oldloader_sl.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index 0ad2087d4c..2d8e20021c 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -495,6 +495,14 @@ static void ClearOldMap3(TileIndex t) tile.m4() = 0; } +static Town *RemapTown(TileIndex fallback) +{ + /* In some cases depots, industries and stations could refer to a missing town. */ + Town *t = Town::GetIfValid(RemapTownIndex(_old_town_index)); + if (t == nullptr) t = CalcClosestTownFromTile(fallback); + return t; +} + static void ReadTTDPatchFlags() { if (_read_ttdpatch_flags) return; @@ -674,10 +682,7 @@ static bool LoadOldDepot(LoadgameState *ls, int num) if (!LoadChunk(ls, d, depot_chunk)) return false; if (d->xy != 0) { - /* In some cases, there could be depots referencing invalid town. */ - Town *t = Town::GetIfValid(RemapTownIndex(_old_town_index)); - if (t == nullptr) t = Town::GetRandom(); - d->town = t; + d->town = RemapTown(d->xy); } else { delete d; } @@ -767,7 +772,7 @@ static bool LoadOldStation(LoadgameState *ls, int num) if (!LoadChunk(ls, st, station_chunk)) return false; if (st->xy != 0) { - st->town = Town::Get(RemapTownIndex(_old_town_index)); + st->town = RemapTown(st->xy); if (_savegame_type == SGT_TTO) { if (IsInsideBS(_old_string_id, 0x180F, 32)) { @@ -843,7 +848,7 @@ static bool LoadOldIndustry(LoadgameState *ls, int num) if (!LoadChunk(ls, i, industry_chunk)) return false; if (i->location.tile != 0) { - i->town = Town::Get(RemapTownIndex(_old_town_index)); + i->town = RemapTown(i->location.tile); if (_savegame_type == SGT_TTO) { if (i->type > 0x06) i->type++; // Printing Works were added