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