changeset 3983:e5090f56234b draft

(svn r5171) Get rid of an ungly hack in the load routine, which temporarily turned house and road tiles into void tiles to calculate the closest town
author tron <tron@openttd.org>
date Thu, 08 Jun 2006 18:31:54 +0000
parents a2ac0bbfc380
children e4ab10e99e4f
files openttd.c town_cmd.c town_map.h
diffstat 3 files changed, 37 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/openttd.c
+++ b/openttd.c
@@ -1210,22 +1210,22 @@
 	 *  all about ;) */
 	if (CheckSavegameVersionOldStyle(6, 1)) {
 		BEGIN_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0) {
-			if (IsTileType(tile, MP_HOUSE)) {
-				_m[tile].m4 = _m[tile].m2;
-				//XXX magic
-				SetTileType(tile, MP_VOID);
-				_m[tile].m2 = ClosestTownFromTile(tile,(uint)-1)->index;
-				SetTileType(tile, MP_HOUSE);
-			} else if (IsTileType(tile, MP_STREET)) {
-				//XXX magic
-				_m[tile].m4 |= (_m[tile].m2 << 4);
-				if (IsTileOwner(tile, OWNER_TOWN)) {
-					SetTileType(tile, MP_VOID);
-					_m[tile].m2 = ClosestTownFromTile(tile,(uint)-1)->index;
-					SetTileType(tile, MP_STREET);
-				} else {
-					SetTownIndex(tile, 0);
-				}
+			switch (GetTileType(tile)) {
+				case MP_HOUSE:
+					_m[tile].m4 = _m[tile].m2;
+					SetTownIndex(tile, CalcClosestTownFromTile(tile, (uint)-1)->index);
+					break;
+
+				case MP_STREET:
+					_m[tile].m4 |= (_m[tile].m2 << 4);
+					if (IsTileOwner(tile, OWNER_TOWN)) {
+						SetTownIndex(tile, CalcClosestTownFromTile(tile, (uint)-1)->index);
+					} else {
+						SetTownIndex(tile, 0);
+					}
+					break;
+
+				default: break;
 			}
 		} END_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0);
 	}
--- a/town_cmd.c
+++ b/town_cmd.c
@@ -1739,18 +1739,12 @@
 }
 
 
-Town *ClosestTownFromTile(TileIndex tile, uint threshold)
+Town* CalcClosestTownFromTile(TileIndex tile, uint threshold)
 {
 	Town *t;
 	uint dist, best = threshold;
 	Town *best_town = NULL;
 
-	if (IsTileType(tile, MP_HOUSE) || (
-				IsTileType(tile, MP_STREET) &&
-				(IsLevelCrossing(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile)) == OWNER_TOWN
-			))
-		return GetTownByTile(tile);
-
 	FOR_ALL_TOWNS(t) {
 		if (t->xy != 0) {
 			dist = DistanceManhattan(tile, t->xy);
@@ -1764,6 +1758,20 @@
 	return best_town;
 }
 
+
+Town *ClosestTownFromTile(TileIndex tile, uint threshold)
+{
+	if (IsTileType(tile, MP_HOUSE) || (
+				IsTileType(tile, MP_STREET) &&
+				(IsLevelCrossing(tile) ? GetCrossingRoadOwner(tile) : GetTileOwner(tile)) == OWNER_TOWN
+			)) {
+		return GetTownByTile(tile);
+	} else {
+		return CalcClosestTownFromTile(tile, threshold);
+	}
+}
+
+
 void ChangeTownRating(Town *t, int add, int max)
 {
 	int rating;
--- a/town_map.h
+++ b/town_map.h
@@ -20,14 +20,13 @@
 }
 
 /**
- * Set the town index for a street tile.
+ * Set the town index for a road or house tile.
  * @param tile the tile
  * @param index the index of the town
- * @pre IsTileType(tile, MP_STREET)
  */
 static inline void SetTownIndex(TileIndex t, TownID index)
 {
-	assert(IsTileType(t, MP_STREET));
+	assert(IsTileType(t, MP_STREET) || IsTileType(t, MP_HOUSE));
 	_m[t].m2 = index;
 }
 
@@ -81,6 +80,10 @@
 	return GetTown(GetTownIndex(t));
 }
 
+
+Town* CalcClosestTownFromTile(TileIndex tile, uint threshold);
+
+
 static inline void MakeHouseTile(TileIndex t, TownID tid, byte counter, byte stage, byte type)
 {
 	assert(IsTileType(t, MP_CLEAR));