Level crossings: Clarify adjacent blocked crossing track status handler

Avoid unnecessary adjacent tile checks if crossing is not blocked
pull/400/head
Jonathan G Rennison 2 years ago
parent fcae909839
commit 10b415bf10

@ -2665,14 +2665,15 @@ static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, u
if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) break; if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) break;
trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(axis)); trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(axis));
if (IsCrossingBarred(tile)) red_signals = trackdirbits; if (IsCrossingBarred(tile)) {
if (IsLevelCrossingTile(TileAddByDiagDir(tile, AxisToDiagDir(axis))) && red_signals = trackdirbits;
IsCrossingBarred(TileAddByDiagDir(tile, AxisToDiagDir(axis)))) { auto mask_red_signal_bits_if_crossing_barred = [&](TileIndex t, TrackdirBits mask) {
red_signals &= (TrackdirBits)0x0102; // magic value. I think TRACKBIT_X_SW and TRACKBIT_X_NE should be swapped if (IsLevelCrossingTile(t) && IsCrossingBarred(t)) red_signals &= mask;
} };
if (IsLevelCrossingTile(TileAddByDiagDir(tile, ReverseDiagDir(AxisToDiagDir(axis)))) && /* Check for blocked adjacent crossing to south, keep only southbound red signal trackdirs, allow northbound traffic */
IsCrossingBarred(TileAddByDiagDir(tile, ReverseDiagDir(AxisToDiagDir(axis))))) { mask_red_signal_bits_if_crossing_barred(TileAddByDiagDir(tile, AxisToDiagDir(axis)), TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE);
red_signals &= (TrackdirBits)0x0201; // inverse of above magic value /* Check for blocked adjacent crossing to north, keep only northbound red signal trackdirs, allow southbound traffic */
mask_red_signal_bits_if_crossing_barred(TileAddByDiagDir(tile, ReverseDiagDir(AxisToDiagDir(axis))), TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW);
} }
break; break;
} }

Loading…
Cancel
Save