From 7615c831aa27b9288ddee5e2ad228c8b2cb8a69f Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 26 May 2023 00:52:33 +0100 Subject: [PATCH] Avoid unnecessary checks when removing adjacent level crossing tile --- src/train_cmd.cpp | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 8c01653cc7..299231ffb4 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2748,15 +2748,25 @@ void UpdateAdjacentLevelCrossingTilesOnRemove(TileIndex tile, Axis road_axis) for (TileIndex t = tile + diff; IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) { occupied |= CheckLevelCrossing(t); } - if (!occupied) { - for (TileIndex t = tile + diff; IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) { - UpdateLevelCrossingTile(t, false, true, false); - } - } else { + if (occupied) { + /* Mark the immediately adjacent tile dirty */ const TileIndex t = tile + diff; if (IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) { MarkTileDirtyByTile(t, VMDF_NOT_MAP_MODE); } + } else { + /* Unbar the crossing tiles in this direction as necessary */ + for (TileIndex t = tile + diff; IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) { + if (IsCrossingBarred(t)) { + /* The crossing tile is barred, unbar it and continue to check the next tile */ + SetCrossingBarred(t, false); + MarkTileDirtyByTile(t, VMDF_NOT_MAP_MODE); + } else { + /* The crossing tile is already unbarred, mark the tile dirty and stop checking */ + MarkTileDirtyByTile(t, VMDF_NOT_MAP_MODE); + break; + } + } } } }