summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmatz <smatz@openttd.org>2011-02-02 14:50:57 +0000
committersmatz <smatz@openttd.org>2011-02-02 14:50:57 +0000
commitb15719bbd216966661ed66d8a54c17b27d77f391 (patch)
tree7d7d3232a5df0d61c0e896d259137f718a36a545
parent0ebc548a89a9966bc6ccae2731bf4d187efbe0b5 (diff)
downloadopenttd-b15719bbd216966661ed66d8a54c17b27d77f391.tar.xz
(svn r21939) -Fix (r16357): the check for valid depot wasn't strict enough
-rw-r--r--src/depot.cpp7
-rw-r--r--src/saveload/oldloader_sl.cpp7
2 files changed, 11 insertions, 3 deletions
diff --git a/src/depot.cpp b/src/depot.cpp
index a1893c8ef..b666ca879 100644
--- a/src/depot.cpp
+++ b/src/depot.cpp
@@ -28,6 +28,11 @@ Depot::~Depot()
{
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 @@ Depot::~Depot()
/* 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;
diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp
index d177e7207..db2ea4dca 100644
--- a/src/saveload/oldloader_sl.cpp
+++ b/src/saveload/oldloader_sl.cpp
@@ -108,7 +108,7 @@ static void FixTTDDepots()
{
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 @@ static bool LoadOldDepot(LoadgameState *ls, int num)
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;
}