Mercurial > hg > openttd
changeset 17200:91764ea184ea draft
(svn r21939) -Fix (r16357): the check for valid depot wasn't strict enough
author | smatz <smatz@openttd.org> |
---|---|
date | Wed, 02 Feb 2011 14:50:57 +0000 |
parents | c633004ea052 |
children | f1a1be5504ef |
files | src/depot.cpp src/saveload/oldloader_sl.cpp |
diffstat | 2 files changed, 11 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/depot.cpp +++ b/src/depot.cpp @@ -28,6 +28,11 @@ { if (CleaningPool()) return; + if (!IsDepotTile(this->xy) || GetDepotIndex(this->xy) != this->index) { + /* It can happen there is no depot here anymore (TTO/TTD savegames) */ + return; + } + /* Clear the order backup. */ OrderBackup::Reset(this->xy, false); @@ -40,7 +45,7 @@ /* Delete the depot list */ VehicleType vt; switch (GetTileType(this->xy)) { - default: return; // It can happen there is no depot here anymore (TTO/TTD savegames) + default: NOT_REACHED(); case MP_RAILWAY: vt = VEH_TRAIN; break; case MP_ROAD: vt = VEH_ROAD; break; case MP_WATER: vt = VEH_SHIP; break;
--- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -108,7 +108,7 @@ { const Depot *d; FOR_ALL_DEPOTS_FROM(d, 252) { - if (!IsRoadDepotTile(d->xy) && !IsRailDepotTile(d->xy) && !IsShipDepotTile(d->xy) && !IsHangarTile(d->xy)) { + if (!IsDepotTile(d->xy) || GetDepotIndex(d->xy) != d->index) { /** Workaround for SVXConverter bug, depots 252-255 could be invalid */ delete d; } @@ -670,7 +670,10 @@ if (!LoadChunk(ls, d, depot_chunk)) return false; if (d->xy != 0) { - d->town = Town::Get(RemapTownIndex(_old_town_index)); + /* In some cases, there could be depots referencing invalid town. */ + Town *t = Town::GetIfValid(RemapTownIndex(_old_town_index)); + if (t == NULL) t = Town::GetRandom(); + d->town = t; } else { delete d; }