diff --git a/src/road_cmd.cpp b/src/road_cmd.cpp index 963c4568a7..2b1b246aa0 100644 --- a/src/road_cmd.cpp +++ b/src/road_cmd.cpp @@ -2665,14 +2665,15 @@ static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, u if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) break; trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(axis)); - if (IsCrossingBarred(tile)) red_signals = trackdirbits; - if (IsLevelCrossingTile(TileAddByDiagDir(tile, AxisToDiagDir(axis))) && - IsCrossingBarred(TileAddByDiagDir(tile, AxisToDiagDir(axis)))) { - red_signals &= (TrackdirBits)0x0102; // magic value. I think TRACKBIT_X_SW and TRACKBIT_X_NE should be swapped - } - if (IsLevelCrossingTile(TileAddByDiagDir(tile, ReverseDiagDir(AxisToDiagDir(axis)))) && - IsCrossingBarred(TileAddByDiagDir(tile, ReverseDiagDir(AxisToDiagDir(axis))))) { - red_signals &= (TrackdirBits)0x0201; // inverse of above magic value + if (IsCrossingBarred(tile)) { + red_signals = trackdirbits; + auto mask_red_signal_bits_if_crossing_barred = [&](TileIndex t, TrackdirBits mask) { + if (IsLevelCrossingTile(t) && IsCrossingBarred(t)) red_signals &= mask; + }; + /* Check for blocked adjacent crossing to south, keep only southbound red signal trackdirs, allow northbound traffic */ + mask_red_signal_bits_if_crossing_barred(TileAddByDiagDir(tile, AxisToDiagDir(axis)), TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE); + /* 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; }