summaryrefslogtreecommitdiff
path: root/src/tunnelbridge_cmd.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tunnelbridge_cmd.cpp')
-rw-r--r--src/tunnelbridge_cmd.cpp34
1 files changed, 29 insertions, 5 deletions
diff --git a/src/tunnelbridge_cmd.cpp b/src/tunnelbridge_cmd.cpp
index d4b794633..b3778a932 100644
--- a/src/tunnelbridge_cmd.cpp
+++ b/src/tunnelbridge_cmd.cpp
@@ -52,6 +52,33 @@ TileIndex _build_tunnel_endtile; ///< The end of a tunnel; as hidden return from
/** Z position of the bridge sprites relative to bridge height (downwards) */
static const int BRIDGE_Z_START = 3;
+
+/**
+ * Mark bridge tiles dirty.
+ * Note: The bridge does not need to exist, everything is passed via parameters.
+ * @param begin Start tile.
+ * @param end End tile.
+ * @param direction Direction from \a begin to \a end.
+ * @param bridge_height Bridge height level.
+ */
+void MarkBridgeDirty(TileIndex begin, TileIndex end, DiagDirection direction, uint bridge_height)
+{
+ TileIndexDiff delta = TileOffsByDiagDir(direction);
+ for (TileIndex t = begin; t != end; t += delta) {
+ MarkTileDirtyByTile(t, bridge_height - TileHeight(t));
+ }
+ MarkTileDirtyByTile(end);
+}
+
+/**
+ * Mark bridge tiles dirty.
+ * @param tile Bridge head.
+ */
+void MarkBridgeDirty(TileIndex tile)
+{
+ MarkBridgeDirty(tile, GetOtherTunnelBridgeEnd(tile), GetTunnelBridgeDirection(tile), GetBridgeHeight(tile));
+}
+
/** Reset the data been eventually changed by the grf loaded. */
void ResetBridges()
{
@@ -506,10 +533,7 @@ CommandCost CmdBuildBridge(TileIndex end_tile, DoCommandFlag flags, uint32 p1, u
}
/* Mark all tiles dirty */
- TileIndexDiff delta = (direction == AXIS_X ? TileDiffXY(1, 0) : TileDiffXY(0, 1));
- for (TileIndex tile = tile_start; tile <= tile_end; tile += delta) {
- MarkTileDirtyByTile(tile);
- }
+ MarkBridgeDirty(tile_start, tile_end, AxisToDiagDir(direction), z_start);
DirtyCompanyInfrastructureWindows(owner);
}
@@ -926,7 +950,7 @@ static CommandCost DoClearBridge(TileIndex tile, DoCommandFlag flags)
if (height < minz) SetRoadside(c, ROADSIDE_PAVED);
}
ClearBridgeMiddle(c);
- MarkTileDirtyByTile(c);
+ MarkTileDirtyByTile(c, height - TileHeight(c));
}
if (rail) {