This commit is contained in:

committed by
GitHub

parent
cd751a598a
commit
a2c0e6aa18
@@ -1790,7 +1790,8 @@ void UpdateLevelCrossing(TileIndex tile, bool sound, bool force_bar)
|
||||
|
||||
/**
|
||||
* Find adjacent level crossing tiles in this multi-track crossing and mark them dirty.
|
||||
* @param The tile which causes the update.
|
||||
* @param tile The tile which causes the update.
|
||||
* @param road_axis The road axis.
|
||||
*/
|
||||
void MarkDirtyAdjacentLevelCrossingTiles(TileIndex tile, Axis road_axis)
|
||||
{
|
||||
@@ -1804,6 +1805,44 @@ void MarkDirtyAdjacentLevelCrossingTiles(TileIndex tile, Axis road_axis)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update adjacent level crossing tiles in this multi-track crossing, due to removal of a level crossing tile.
|
||||
* @param tile The crossing tile which has been or is about to be removed, and which caused the update.
|
||||
* @param road_axis The road axis.
|
||||
*/
|
||||
void UpdateAdjacentLevelCrossingTilesOnLevelCrossingRemoval(TileIndex tile, Axis road_axis)
|
||||
{
|
||||
const DiagDirection dir1 = AxisToDiagDir(road_axis);
|
||||
const DiagDirection dir2 = ReverseDiagDir(dir1);
|
||||
for (DiagDirection dir : { dir1, dir2 }) {
|
||||
const TileIndexDiff diff = TileOffsByDiagDir(dir);
|
||||
bool occupied = false;
|
||||
for (TileIndex t = tile + diff; t < Map::Size() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis; t += diff) {
|
||||
occupied |= CheckLevelCrossing(t);
|
||||
}
|
||||
if (occupied) {
|
||||
/* Mark the immediately adjacent tile dirty */
|
||||
const TileIndex t = tile + diff;
|
||||
if (t < Map::Size() && IsLevelCrossingTile(t) && GetCrossingRoadAxis(t) == road_axis) {
|
||||
MarkTileDirtyByTile(t);
|
||||
}
|
||||
} else {
|
||||
/* Unbar the crossing tiles in this direction as necessary */
|
||||
for (TileIndex t = tile + diff; t < Map::Size() && 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);
|
||||
} else {
|
||||
/* The crossing tile is already unbarred, mark the tile dirty and stop checking */
|
||||
MarkTileDirtyByTile(t);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Bars crossing and plays ding-ding sound if not barred already
|
||||
* @param tile tile with crossing
|
||||
|
Reference in New Issue
Block a user