Avoid unnecessary checks when removing adjacent level crossing tile

This commit is contained in:
Jonathan G Rennison
2023-05-26 00:52:33 +01:00
parent 0b9b080aa6
commit 7615c831aa

View File

@@ -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) { for (TileIndex t = tile + diff; IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) {
occupied |= CheckLevelCrossing(t); occupied |= CheckLevelCrossing(t);
} }
if (!occupied) { if (occupied) {
for (TileIndex t = tile + diff; IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) { /* Mark the immediately adjacent tile dirty */
UpdateLevelCrossingTile(t, false, true, false);
}
} else {
const TileIndex t = tile + diff; const TileIndex t = tile + diff;
if (IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) { if (IsValidTile(t) && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) {
MarkTileDirtyByTile(t, VMDF_NOT_MAP_MODE); 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;
}
}
} }
} }
} }