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:
Jonathan G Rennison
2016-12-18 18:09:48 +00:00
parent 09188e30f9
commit 66751457ad

View File

@@ -4083,7 +4083,25 @@ static void DeleteLastWagon(Train *v)
if (IsLevelCrossingTile(tile)) UpdateLevelCrossing(tile);
/* 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);
} else {
SetSignalsOnBothDir(tile, track, owner);