diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index f6e514d1e8..ce59e3758d 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1091,10 +1091,11 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, } } } - MarkTileDirtyByTile(tile); - MarkTileDirtyByTile(tile_exit); + MarkBridgeOrTunnelDirty(tile); AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile)); + AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile)); YapfNotifyTrackLayoutChange(tile, track); + YapfNotifyTrackLayoutChange(tile_exit, track); } return cost; } @@ -1545,10 +1546,11 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1 ClrBitTunnelBridgeSignal(end); _m[tile].m2 = 0; _m[end].m2 = 0; - MarkTileDirtyByTile(tile); - MarkTileDirtyByTile(end); + MarkBridgeOrTunnelDirty(tile); AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile)); + AddSideToSignalBuffer(end, INVALID_DIAGDIR, GetTileOwner(tile)); YapfNotifyTrackLayoutChange(tile, track); + YapfNotifyTrackLayoutChange(end, track); return CommandCost(EXPENSES_CONSTRUCTION, cost); } diff --git a/src/tunnelbridge.h b/src/tunnelbridge.h index fbeb298688..9d5a4188b7 100644 --- a/src/tunnelbridge.h +++ b/src/tunnelbridge.h @@ -16,6 +16,7 @@ void MarkBridgeDirty(TileIndex begin, TileIndex end, DiagDirection direction, uint bridge_height, const ZoomLevel mark_dirty_if_zoomlevel_is_below = ZOOM_LVL_END); void MarkBridgeDirty(TileIndex tile, const ZoomLevel mark_dirty_if_zoomlevel_is_below = ZOOM_LVL_END); +void MarkBridgeOrTunnelDirty(TileIndex tile, const ZoomLevel mark_dirty_if_zoomlevel_is_below = ZOOM_LVL_END); /** * Calculates the length of a tunnel or a bridge (without end tiles) diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp index e94711fb4a..322769e102 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -80,6 +80,20 @@ void MarkBridgeDirty(TileIndex tile, const ZoomLevel mark_dirty_if_zoomlevel_is_ MarkBridgeDirty(tile, GetOtherTunnelBridgeEnd(tile), GetTunnelBridgeDirection(tile), GetBridgeHeight(tile), mark_dirty_if_zoomlevel_is_below); } +/** + * Mark bridge or tunnel tiles dirty. + * @param tile Bridge head or tunnel entrance. + */ +void MarkBridgeOrTunnelDirty(TileIndex tile, const ZoomLevel mark_dirty_if_zoomlevel_is_below) +{ + if (IsBridge(tile)) { + MarkBridgeDirty(tile, mark_dirty_if_zoomlevel_is_below); + } else { + MarkTileDirtyByTile(tile, mark_dirty_if_zoomlevel_is_below); + MarkTileDirtyByTile(GetOtherTunnelBridgeEnd(tile), mark_dirty_if_zoomlevel_is_below); + } +} + /** Reset the data been eventually changed by the grf loaded. */ void ResetBridges() {