Fix wrong signal aspects when track built up to rear of tunnel/bridge entrance
This commit is contained in:
@@ -575,12 +575,14 @@ uint8 GetForwardAspectFollowingTrack(TileIndex tile, Trackdir trackdir)
|
|||||||
Owner owner = GetTileOwner(tile);
|
Owner owner = GetTileOwner(tile);
|
||||||
DiagDirection exitdir = TrackdirToExitdir(trackdir);
|
DiagDirection exitdir = TrackdirToExitdir(trackdir);
|
||||||
DiagDirection enterdir = ReverseDiagDir(exitdir);
|
DiagDirection enterdir = ReverseDiagDir(exitdir);
|
||||||
|
bool wormhole = false;
|
||||||
if (IsTileType(tile, MP_TUNNELBRIDGE) && TrackdirEntersTunnelBridge(tile, trackdir)) {
|
if (IsTileType(tile, MP_TUNNELBRIDGE) && TrackdirEntersTunnelBridge(tile, trackdir)) {
|
||||||
TileIndex other = GetOtherTunnelBridgeEnd(tile);
|
TileIndex other = GetOtherTunnelBridgeEnd(tile);
|
||||||
if (IsTunnelBridgeWithSignalSimulation(tile)) {
|
if (IsTunnelBridgeWithSignalSimulation(tile)) {
|
||||||
return GetSignalledTunnelBridgeEntranceForwardAspect(tile, other);
|
return GetSignalledTunnelBridgeEntranceForwardAspect(tile, other);
|
||||||
}
|
}
|
||||||
tile = other;
|
tile = other;
|
||||||
|
wormhole = true;
|
||||||
} else {
|
} else {
|
||||||
tile += TileOffsByDiagDir(exitdir);
|
tile += TileOffsByDiagDir(exitdir);
|
||||||
}
|
}
|
||||||
@@ -646,6 +648,7 @@ uint8 GetForwardAspectFollowingTrack(TileIndex tile, Trackdir trackdir)
|
|||||||
case MP_TUNNELBRIDGE: {
|
case MP_TUNNELBRIDGE: {
|
||||||
if (!IsOneSignalBlock(owner, GetTileOwner(tile))) return 0;
|
if (!IsOneSignalBlock(owner, GetTileOwner(tile))) return 0;
|
||||||
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) 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 = GetTunnelBridgeTrackBits(tile); // trackbits of tile
|
||||||
TrackBits tracks_masked = (TrackBits)(tracks & _enterdir_to_trackbits[enterdir]); // only incidating trackbits
|
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);
|
tile = GetOtherTunnelBridgeEnd(tile);
|
||||||
enterdir = GetTunnelBridgeDirection(tile);
|
enterdir = GetTunnelBridgeDirection(tile);
|
||||||
exitdir = ReverseDiagDir(enterdir);
|
exitdir = ReverseDiagDir(enterdir);
|
||||||
|
wormhole = true;
|
||||||
} else {
|
} else {
|
||||||
exitdir = TrackdirToExitdir(trackdir);
|
exitdir = TrackdirToExitdir(trackdir);
|
||||||
enterdir = ReverseDiagDir(exitdir);
|
enterdir = ReverseDiagDir(exitdir);
|
||||||
tile += TileOffsByDiagDir(exitdir);
|
tile += TileOffsByDiagDir(exitdir);
|
||||||
|
wormhole = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1262,11 +1267,13 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect)
|
|||||||
Owner owner = GetTileOwner(tile);
|
Owner owner = GetTileOwner(tile);
|
||||||
DiagDirection exitdir = TrackdirToExitdir(ReverseTrackdir(trackdir));
|
DiagDirection exitdir = TrackdirToExitdir(ReverseTrackdir(trackdir));
|
||||||
DiagDirection enterdir = ReverseDiagDir(exitdir);
|
DiagDirection enterdir = ReverseDiagDir(exitdir);
|
||||||
|
bool wormhole = false;
|
||||||
if (IsTileType(tile, MP_TUNNELBRIDGE) && TrackdirExitsTunnelBridge(tile, trackdir)) {
|
if (IsTileType(tile, MP_TUNNELBRIDGE) && TrackdirExitsTunnelBridge(tile, trackdir)) {
|
||||||
TileIndex other = GetOtherTunnelBridgeEnd(tile);
|
TileIndex other = GetOtherTunnelBridgeEnd(tile);
|
||||||
if (IsBridge(tile)) RefreshBridgeOnExitAspectChange(other, tile);
|
if (IsBridge(tile)) RefreshBridgeOnExitAspectChange(other, tile);
|
||||||
aspect = std::min<uint>(GetSignalledTunnelBridgeEntranceForwardAspect(other, tile) + 1, _extra_aspects + 1);
|
aspect = std::min<uint>(GetSignalledTunnelBridgeEntranceForwardAspect(other, tile) + 1, _extra_aspects + 1);
|
||||||
tile = other;
|
tile = other;
|
||||||
|
wormhole = true;
|
||||||
} else {
|
} else {
|
||||||
tile += TileOffsByDiagDir(exitdir);
|
tile += TileOffsByDiagDir(exitdir);
|
||||||
}
|
}
|
||||||
@@ -1337,6 +1344,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect)
|
|||||||
case MP_TUNNELBRIDGE: {
|
case MP_TUNNELBRIDGE: {
|
||||||
if (!IsOneSignalBlock(owner, GetTileOwner(tile))) return;
|
if (!IsOneSignalBlock(owner, GetTileOwner(tile))) return;
|
||||||
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) return;
|
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_RAIL) return;
|
||||||
|
if ((enterdir == GetTunnelBridgeDirection(tile)) != wormhole) return;
|
||||||
|
|
||||||
TrackBits tracks = GetTunnelBridgeTrackBits(tile); // trackbits of tile
|
TrackBits tracks = GetTunnelBridgeTrackBits(tile); // trackbits of tile
|
||||||
TrackBits tracks_masked = (TrackBits)(tracks & _enterdir_to_trackbits[enterdir]); // only incidating trackbits
|
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);
|
enterdir = GetTunnelBridgeDirection(other);
|
||||||
exitdir = ReverseDiagDir(enterdir);
|
exitdir = ReverseDiagDir(enterdir);
|
||||||
tile = other;
|
tile = other;
|
||||||
|
wormhole = true;
|
||||||
} else {
|
} else {
|
||||||
if (TrackdirEntersTunnelBridge(tile, ReverseTrackdir(trackdir))) {
|
if (TrackdirEntersTunnelBridge(tile, ReverseTrackdir(trackdir))) {
|
||||||
if (IsTunnelBridgeWithSignalSimulation(tile)) {
|
if (IsTunnelBridgeWithSignalSimulation(tile)) {
|
||||||
@@ -1381,6 +1390,7 @@ void PropagateAspectChange(TileIndex tile, Trackdir trackdir, uint8 aspect)
|
|||||||
exitdir = TrackdirToExitdir(trackdir);
|
exitdir = TrackdirToExitdir(trackdir);
|
||||||
enterdir = ReverseDiagDir(exitdir);
|
enterdir = ReverseDiagDir(exitdir);
|
||||||
tile += TileOffsByDiagDir(exitdir);
|
tile += TileOffsByDiagDir(exitdir);
|
||||||
|
wormhole = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user