MCPcopy Create free account
hub / github.com/OpenTTD/OpenTTD / GetTileTrackStatus_Road

Function GetTileTrackStatus_Road

src/road_cmd.cpp:2137–2199  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2135};
2136
2137static 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 }

Callers

nothing calls this directly

Calls 15

IsLevelCrossingFunction · 0.85
TrackBitsToTrackdirBitsFunction · 0.85
GetCrossingRailBitsFunction · 0.85
HasTileRoadTypeFunction · 0.85
GetRoadTileTypeFunction · 0.85
GetRoadBitsFunction · 0.85
DiagDirToRoadBitsFunction · 0.85
HasRoadWorksFunction · 0.85
GetCrossingRoadAxisFunction · 0.85
DiagDirToAxisFunction · 0.85
AxisToTrackBitsFunction · 0.85

Tested by

no test coverage detected