From b3e03e8cf92058d7f561d2bb1455d1e05ab619e8 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 1 Nov 2015 14:05:22 +0000 Subject: [PATCH 1/2] Fix middle of bridge not being redrawn when adding removing signals. --- src/rail_cmd.cpp | 6 ++---- src/tunnelbridge.h | 1 + src/tunnelbridge_cmd.cpp | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index 9d326d0747..fd6c5bd36d 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1090,8 +1090,7 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, } } } - MarkTileDirtyByTile(tile); - MarkTileDirtyByTile(tile_exit); + MarkBridgeOrTunnelDirty(tile); AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile)); YapfNotifyTrackLayoutChange(tile, track); } @@ -1538,8 +1537,7 @@ 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)); YapfNotifyTrackLayoutChange(tile, track); return CommandCost(EXPENSES_CONSTRUCTION, cost); diff --git a/src/tunnelbridge.h b/src/tunnelbridge.h index 0a2c2293d5..03de071e9d 100644 --- a/src/tunnelbridge.h +++ b/src/tunnelbridge.h @@ -16,6 +16,7 @@ void MarkBridgeDirty(TileIndex begin, TileIndex end, DiagDirection direction, uint bridge_height); void MarkBridgeDirty(TileIndex tile); +void MarkBridgeOrTunnelDirty(TileIndex tile); /** * 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 f963222f5a..4dec3f80e0 100644 --- a/src/tunnelbridge_cmd.cpp +++ b/src/tunnelbridge_cmd.cpp @@ -80,6 +80,20 @@ void MarkBridgeDirty(TileIndex tile) MarkBridgeDirty(tile, GetOtherTunnelBridgeEnd(tile), GetTunnelBridgeDirection(tile), GetBridgeHeight(tile)); } +/** + * Mark bridge or tunnel tiles dirty. + * @param tile Bridge head or tunnel entrance. + */ +void MarkBridgeOrTunnelDirty(TileIndex tile) +{ + if (IsBridge(tile)) { + MarkBridgeDirty(tile); + } else { + MarkTileDirtyByTile(tile); + MarkTileDirtyByTile(GetOtherTunnelBridgeEnd(tile)); + } +} + /** Reset the data been eventually changed by the grf loaded. */ void ResetBridges() { From 95a329a4b95846ba6c54819e2007825becbb515d Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Sun, 1 Nov 2015 14:05:50 +0000 Subject: [PATCH 2/2] Fix signals on far side of bridge not being updated when adding/removing signals. --- src/rail_cmd.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/rail_cmd.cpp b/src/rail_cmd.cpp index fd6c5bd36d..e71d732d00 100644 --- a/src/rail_cmd.cpp +++ b/src/rail_cmd.cpp @@ -1092,7 +1092,9 @@ CommandCost CmdBuildSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1, } MarkBridgeOrTunnelDirty(tile); AddSideToSignalBuffer(tile, INVALID_DIAGDIR, GetTileOwner(tile)); + AddSideToSignalBuffer(tile_exit, INVALID_DIAGDIR, GetTileOwner(tile)); YapfNotifyTrackLayoutChange(tile, track); + YapfNotifyTrackLayoutChange(tile_exit, track); } return cost; } @@ -1539,7 +1541,9 @@ CommandCost CmdRemoveSingleSignal(TileIndex tile, DoCommandFlag flags, uint32 p1 _m[end].m2 = 0; 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); }