summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bridge_map.c20
-rw-r--r--bridge_map.h23
-rw-r--r--tunnelbridge_cmd.c18
3 files changed, 46 insertions, 15 deletions
diff --git a/bridge_map.c b/bridge_map.c
index dbd6ac3f4..cbb955c37 100644
--- a/bridge_map.c
+++ b/bridge_map.c
@@ -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));
diff --git a/bridge_map.h b/bridge_map.h
index 7214425c6..4f4b33d53 100644
--- a/bridge_map.h
+++ b/bridge_map.h
@@ -15,6 +15,12 @@ static inline bool IsBridgeRamp(TileIndex t)
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 DiagDirection GetBridgeRampDirection(TileIndex t)
}
+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 @@ static inline TransportType GetTransportTypeUnderBridge(TileIndex t)
/**
+ * 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);
diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c
index 191343845..6496dfd10 100644
--- a/tunnelbridge_cmd.c
+++ b/tunnelbridge_cmd.c
@@ -846,15 +846,7 @@ int32 DoConvertTunnelBridgeRail(TileIndex tile, uint totype, bool exec)
// 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 @@ static void GetTileDesc_TunnelBridge(TileIndex tile, TileDesc *td)
} 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);
}