diff options
-rw-r--r-- | bridge_map.c | 20 | ||||
-rw-r--r-- | bridge_map.h | 23 | ||||
-rw-r--r-- | tunnelbridge_cmd.c | 18 |
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); } |