From ec33376fa3355a840cd6ddb31687382e5251b1fa Mon Sep 17 00:00:00 2001 From: tron Date: Thu, 16 Mar 2006 05:28:15 +0000 Subject: [PATCH] (svn r3898) Add functions to find a bridge end starting at a middle tile --- bridge_map.c | 20 ++++++++++++++++++++ bridge_map.h | 23 +++++++++++++++++++++++ tunnelbridge_cmd.c | 18 +++--------------- 3 files changed, 46 insertions(+), 15 deletions(-) diff --git a/bridge_map.c b/bridge_map.c index dbd6ac3f4f..cbb955c377 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 7214425c6c..4f4b33d53c 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; @@ -45,6 +57,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 */ diff --git a/tunnelbridge_cmd.c b/tunnelbridge_cmd.c index 191343845f..6496dfd101 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); }