(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
authortron
Thu, 08 Jun 2006 18:31:54 +0000
changeset 3983 0f815283e04b
parent 3982 c4f238dfc2f1
child 3984 812dac315975
(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
openttd.c
town_cmd.c
town_map.h
--- a/openttd.c	Thu Jun 08 17:36:06 2006 +0000
+++ b/openttd.c	Thu Jun 08 18:31:54 2006 +0000
@@ -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	Thu Jun 08 17:36:06 2006 +0000
+++ b/town_cmd.c	Thu Jun 08 18:31:54 2006 +0000
@@ -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	Thu Jun 08 17:36:06 2006 +0000
+++ b/town_map.h	Thu Jun 08 18:31:54 2006 +0000
@@ -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));