| 2135 | }; |
| 2136 | |
| 2137 | static TrackStatus GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side) |
| 2138 | { |
| 2139 | TrackdirBits trackdirbits = TRACKDIR_BIT_NONE; |
| 2140 | TrackdirBits red_signals = TRACKDIR_BIT_NONE; // crossing barred |
| 2141 | switch (mode) { |
| 2142 | case TRANSPORT_RAIL: |
| 2143 | if (IsLevelCrossing(tile)) trackdirbits = TrackBitsToTrackdirBits(GetCrossingRailBits(tile)); |
| 2144 | break; |
| 2145 | |
| 2146 | case TRANSPORT_ROAD: { |
| 2147 | RoadTramType rtt = (RoadTramType)sub_mode; |
| 2148 | if (!HasTileRoadType(tile, rtt)) break; |
| 2149 | switch (GetRoadTileType(tile)) { |
| 2150 | case RoadTileType::Normal: { |
| 2151 | const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 }; |
| 2152 | RoadBits bits = GetRoadBits(tile, rtt); |
| 2153 | |
| 2154 | /* no roadbit at this side of tile, return 0 */ |
| 2155 | if (side != INVALID_DIAGDIR && (DiagDirToRoadBits(side) & bits) == 0) break; |
| 2156 | |
| 2157 | uint multiplier = drd_to_multiplier[(rtt == RTT_TRAM) ? DRD_NONE : GetDisallowedRoadDirections(tile)]; |
| 2158 | if (!HasRoadWorks(tile)) trackdirbits = (TrackdirBits)(_road_trackbits[bits] * multiplier); |
| 2159 | break; |
| 2160 | } |
| 2161 | |
| 2162 | case RoadTileType::Crossing: { |
| 2163 | Axis axis = GetCrossingRoadAxis(tile); |
| 2164 | |
| 2165 | if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) break; |
| 2166 | |
| 2167 | trackdirbits = TrackBitsToTrackdirBits(AxisToTrackBits(axis)); |
| 2168 | if (IsCrossingBarred(tile)) { |
| 2169 | red_signals = trackdirbits; |
| 2170 | if (TrainOnCrossing(tile)) break; |
| 2171 | |
| 2172 | auto mask_red_signal_bits_if_crossing_barred = [&](TileIndex t, TrackdirBits mask) { |
| 2173 | if (IsLevelCrossingTile(t) && IsCrossingBarred(t)) red_signals &= mask; |
| 2174 | }; |
| 2175 | /* Check for blocked adjacent crossing to south, keep only southbound red signal trackdirs, allow northbound traffic */ |
| 2176 | mask_red_signal_bits_if_crossing_barred(TileAddByDiagDir(tile, AxisToDiagDir(axis)), TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE); |
| 2177 | /* Check for blocked adjacent crossing to north, keep only northbound red signal trackdirs, allow southbound traffic */ |
| 2178 | mask_red_signal_bits_if_crossing_barred(TileAddByDiagDir(tile, ReverseDiagDir(AxisToDiagDir(axis))), TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW); |
| 2179 | } |
| 2180 | break; |
| 2181 | } |
| 2182 | |
| 2183 | default: |
| 2184 | case RoadTileType::Depot: { |
| 2185 | DiagDirection dir = GetRoadDepotDirection(tile); |
| 2186 | |
| 2187 | if (side != INVALID_DIAGDIR && side != dir) break; |
| 2188 | |
| 2189 | trackdirbits = TrackBitsToTrackdirBits(DiagDirToDiagTrackBits(dir)); |
| 2190 | break; |
| 2191 | } |
| 2192 | } |
| 2193 | break; |
| 2194 | } |
nothing calls this directly
no test coverage detected