Fix train crash on bridge/tunnel with signals leaving red signals.
Update signals on far end of bridge/tunnel. If clearing the crash results in a clear bridge/tunnel, set all bridge/tunnel signals green.
This commit is contained in:
@@ -4083,7 +4083,25 @@ static void DeleteLastWagon(Train *v)
|
|||||||
if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile);
|
if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile);
|
||||||
|
|
||||||
/* Update signals */
|
/* Update signals */
|
||||||
if (IsTileType(tile, MP_TUNNELBRIDGE) || IsRailDepotTile(tile)) {
|
if (IsTileType(tile, MP_TUNNELBRIDGE)) {
|
||||||
|
UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, owner);
|
||||||
|
if (IsTunnelBridgeWithSignalSimulation(tile)) {
|
||||||
|
TileIndex end = GetOtherTunnelBridgeEnd(tile);
|
||||||
|
UpdateSignalsOnSegment(end, INVALID_DIAGDIR, owner);
|
||||||
|
bool is_entrance = IsTunnelBridgeSignalSimulationEntrance(tile);
|
||||||
|
TileIndex entrance = is_entrance ? tile : end;
|
||||||
|
if (TunnelBridgeIsFree(tile, end, nullptr).Succeeded()) {
|
||||||
|
if (IsBridge(entrance)) {
|
||||||
|
SetAllBridgeEntranceSimulatedSignalsGreen(entrance);
|
||||||
|
MarkBridgeDirty(entrance, ZOOM_LVL_DRAW_MAP);
|
||||||
|
}
|
||||||
|
if (IsTunnelBridgeSignalSimulationEntrance(entrance) && GetTunnelBridgeSignalState(entrance) == SIGNAL_STATE_RED) {
|
||||||
|
SetTunnelBridgeSignalState(entrance, SIGNAL_STATE_GREEN);
|
||||||
|
MarkTileDirtyByTile(entrance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (IsRailDepotTile(tile)) {
|
||||||
UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, owner);
|
UpdateSignalsOnSegment(tile, INVALID_DIAGDIR, owner);
|
||||||
} else {
|
} else {
|
||||||
SetSignalsOnBothDir(tile, track, owner);
|
SetSignalsOnBothDir(tile, track, owner);
|
||||||
|
Reference in New Issue
Block a user