(svn r3898) Add functions to find a bridge end starting at a middle tile
authortron
Thu, 16 Mar 2006 05:28:15 +0000
changeset 3225 655763f3861c
parent 3224 fd70771e0d6e
child 3226 6e2613e33234
(svn r3898) Add functions to find a bridge end starting at a middle tile
bridge_map.c
bridge_map.h
tunnelbridge_cmd.c
--- a/bridge_map.c	Thu Mar 16 00:32:25 2006 +0000
+++ b/bridge_map.c	Thu Mar 16 05:28:15 2006 +0000
@@ -5,6 +5,26 @@
 #include "bridge_map.h"
 
 
+TileIndex GetBridgeEnd(TileIndex tile, DiagDirection dir)
+{
+	TileIndexDiff delta = TileOffsByDir(dir);
+
+	assert(DiagDirToAxis(dir) == GetBridgeAxis(tile));
+
+	do {
+		tile += delta;
+	} while (!IsBridgeRamp(tile));
+
+	return tile;
+}
+
+
+TileIndex GetSouthernBridgeEnd(TileIndex t)
+{
+	return GetBridgeEnd(t, AxisToDiagDir(GetBridgeAxis(t)));
+}
+
+
 TileIndex GetOtherBridgeEnd(TileIndex tile)
 {
 	TileIndexDiff delta = TileOffsByDir(GetBridgeRampDirection(tile));
--- a/bridge_map.h	Thu Mar 16 00:32:25 2006 +0000
+++ b/bridge_map.h	Thu Mar 16 05:28:15 2006 +0000
@@ -15,6 +15,12 @@
 	return !HASBIT(_m[t].m5, 6);
 }
 
+static inline bool IsBridgeMiddle(TileIndex t)
+{
+	return HASBIT(_m[t].m5, 6);
+}
+
+
 
 /**
  * Get the direction pointing onto the bridge
@@ -28,6 +34,12 @@
 }
 
 
+static inline Axis GetBridgeAxis(TileIndex t)
+{
+	return (Axis)GB(_m[t].m5, 0, 1);
+}
+
+
 static inline bool IsClearUnderBridge(TileIndex t)
 {
 	return GB(_m[t].m5, 3, 3) == 0;
@@ -46,6 +58,17 @@
 
 
 /**
+ * Finds the end of a bridge in the specified direction starting at a middle tile
+ */
+TileIndex GetBridgeEnd(TileIndex, DiagDirection);
+
+/**
+ * Finds the southern end of a bridge starting at a middle tile
+ */
+TileIndex GetSouthernBridgeEnd(TileIndex t);
+
+
+/**
  * Starting at one bridge end finds the other bridge end
  */
 TileIndex GetOtherBridgeEnd(TileIndex);
--- a/tunnelbridge_cmd.c	Thu Mar 16 00:32:25 2006 +0000
+++ b/tunnelbridge_cmd.c	Thu Mar 16 05:28:15 2006 +0000
@@ -846,15 +846,7 @@
 // fast routine for getting the height of a middle bridge tile. 'tile' MUST be a middle bridge tile.
 static uint GetBridgeHeight(const TileInfo *ti)
 {
-	TileIndexDiff delta;
-	TileIndex tile = ti->tile;
-
-	// find the end tile of the bridge.
-	delta = GB(_m[tile].m5, 0, 1) ? TileDiffXY(0, 1) : TileDiffXY(1, 0);
-	do {
-		assert((_m[tile].m5 & 0xC0) == 0xC0);	// bridge and middle part
-		tile += delta;
-	} while (_m[tile].m5 & 0x40);	// while bridge middle parts
+	TileIndex tile = GetSouthernBridgeEnd(ti->tile);
 
 	/* Return the height there (the height of the NORTH CORNER)
 	 * If the end of the bridge is on a tileh 7 (all raised, except north corner),
@@ -1240,12 +1232,8 @@
 	} else {
 		td->str = _bridge_tile_str[GB(_m[tile].m5, 1, 2) << 4 | GB(_m[tile].m2, 4, 4)];
 
-		/* scan to the end of the bridge, that's where the owner is stored */
-		if (_m[tile].m5 & 0x40) {
-			TileIndexDiff delta = GB(_m[tile].m5, 0, 1) ? TileDiffXY(0, -1) : TileDiffXY(-1, 0);
-
-			do tile += delta; while (_m[tile].m5 & 0x40);
-		}
+		// the owner is stored at the end of the bridge
+		if (IsBridgeMiddle(tile)) tile = GetSouthernBridgeEnd(tile);
 	}
 	td->owner = GetTileOwner(tile);
 }