diff --git a/src/signal.cpp b/src/signal.cpp index 0419963168..76d44f5840 100644 --- a/src/signal.cpp +++ b/src/signal.cpp @@ -575,12 +575,14 @@ uint8 GetForwardAspectFollowingTrack(TileIndex tile, Trackdir trackdir) Owner owner = GetTileOwner(tile); DiagDirection exitdir = TrackdirToExitdir(trackdir); DiagDirection enterdir = ReverseDiagDir(exitdir); + bool wormhole = false; if (IsTileType(tile, MP_TUNNELBRIDGE) && TrackdirEntersTunnelBridge(tile, trackdir)) { TileIndex other = GetOtherTunnelBridgeEnd(tile); if (IsTunnelBridgeWithSignalSimulation(tile)) { return GetSignalledTunnelBridgeEntranceForwardAspect(tile, other); } tile = other; + wormhole = true; } else { tile += TileOffsByDiagDir(exitdir); } @@ -646,6 +648,7 @@ uint8 GetForwardAspectFollowingTrack(TileIndex tile, Trackdir trackdir) case MP_TUNNELBRIDGE: { if (!IsOneSignalBlock(owner, GetTileOwner(tile))) return 0; if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) return 0; + if ((enterdir == GetTunnelBridgeDirection(tile)) != wormhole) return 0; TrackBits tracks = GetTunnelBridgeTrackBits(tile); // trackbits of tile TrackBits tracks_masked = (TrackBits)(tracks & _enterdir_to_trackbits[enterdir]); // only incidating trackbits @@ -670,10 +673,12 @@ uint8 GetForwardAspectFollowingTrack(TileIndex tile, Trackdir trackdir) tile = GetOtherTunnelBridgeEnd(tile); enterdir = GetTunnelBridgeDirection(tile); exitdir = ReverseDiagDir(enterdir); + wormhole = true; } else { exitdir = TrackdirToExitdir(trackdir); enterdir = ReverseDiagDir(exitdir); tile += TileOffsByDiagDir(exitdir); + wormhole = false; } break; } @@ -1262,11 +1267,13 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect) Owner owner = GetTileOwner(tile); DiagDirection exitdir = TrackdirToExitdir(ReverseTrackdir(trackdir)); DiagDirection enterdir = ReverseDiagDir(exitdir); + bool wormhole = false; if (IsTileType(tile, MP_TUNNELBRIDGE) && TrackdirExitsTunnelBridge(tile, trackdir)) { TileIndex other = GetOtherTunnelBridgeEnd(tile); if (IsBridge(tile)) RefreshBridgeOnExitAspectChange(other, tile); aspect = std::min(GetSignalledTunnelBridgeEntranceForwardAspect(other, tile) + 1, _extra_aspects + 1); tile = other; + wormhole = true; } else { tile += TileOffsByDiagDir(exitdir); } @@ -1337,6 +1344,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect) case MP_TUNNELBRIDGE: { if (!IsOneSignalBlock(owner, GetTileOwner(tile))) return; if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) return; + if ((enterdir == GetTunnelBridgeDirection(tile)) != wormhole) return; TrackBits tracks = GetTunnelBridgeTrackBits(tile); // trackbits of tile TrackBits tracks_masked = (TrackBits)(tracks & _enterdir_to_trackbits[enterdir]); // only incidating trackbits @@ -1367,6 +1375,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect) enterdir = GetTunnelBridgeDirection(other); exitdir = ReverseDiagDir(enterdir); tile = other; + wormhole = true; } else { if (TrackdirEntersTunnelBridge(tile, ReverseTrackdir(trackdir))) { if (IsTunnelBridgeWithSignalSimulation(tile)) { @@ -1381,6 +1390,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect) exitdir = TrackdirToExitdir(trackdir); enterdir = ReverseDiagDir(exitdir); tile += TileOffsByDiagDir(exitdir); + wormhole = false; } break; }