changeset 8596 | c3404405f3f5 |
parent 8589 | e0294479574f |
child 8598 | ddd1f342b0da |
8595:718ce3c308fb | 8596:c3404405f3f5 |
---|---|
1312 |
1312 |
1313 static const byte _road_trackbits[16] = { |
1313 static const byte _road_trackbits[16] = { |
1314 0x0, 0x0, 0x0, 0x10, 0x0, 0x2, 0x8, 0x1A, 0x0, 0x4, 0x1, 0x15, 0x20, 0x26, 0x29, 0x3F, |
1314 0x0, 0x0, 0x0, 0x10, 0x0, 0x2, 0x8, 0x1A, 0x0, 0x4, 0x1, 0x15, 0x20, 0x26, 0x29, 0x3F, |
1315 }; |
1315 }; |
1316 |
1316 |
1317 static uint32 GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode) |
1317 static uint32 GetTileTrackStatus_Road(TileIndex tile, TransportType mode, uint sub_mode, DiagDirection side) |
1318 { |
1318 { |
1319 |
1319 |
1320 switch (mode) { |
1320 switch (mode) { |
1321 case TRANSPORT_RAIL: |
1321 case TRANSPORT_RAIL: |
1322 if (!IsLevelCrossing(tile)) return 0; |
1322 if (!IsLevelCrossing(tile)) return 0; |
1324 |
1324 |
1325 case TRANSPORT_ROAD: |
1325 case TRANSPORT_ROAD: |
1326 if ((GetRoadTypes(tile) & sub_mode) == 0) return 0; |
1326 if ((GetRoadTypes(tile) & sub_mode) == 0) return 0; |
1327 switch (GetRoadTileType(tile)) { |
1327 switch (GetRoadTileType(tile)) { |
1328 case ROAD_TILE_NORMAL: { |
1328 case ROAD_TILE_NORMAL: { |
1329 const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 }; |
|
1329 RoadType rt = (RoadType)FindFirstBit(sub_mode); |
1330 RoadType rt = (RoadType)FindFirstBit(sub_mode); |
1330 const uint drd_to_multiplier[DRD_END] = { 0x101, 0x100, 0x1, 0x0 }; |
1331 RoadBits bits = GetRoadBits(tile, rt); |
1332 |
|
1333 /* no roadbit at this side of tile, return 0 */ |
|
1334 if (side != INVALID_DIAGDIR && DiagDirToRoadBits(side) & bits == 0) return 0; |
|
1335 |
|
1331 uint multiplier = drd_to_multiplier[rt == ROADTYPE_TRAM ? DRD_NONE : GetDisallowedRoadDirections(tile)]; |
1336 uint multiplier = drd_to_multiplier[rt == ROADTYPE_TRAM ? DRD_NONE : GetDisallowedRoadDirections(tile)]; |
1332 return HasRoadWorks(tile) ? 0 : _road_trackbits[GetRoadBits(tile, rt)] * multiplier; |
1337 return HasRoadWorks(tile) ? 0 : _road_trackbits[bits] * multiplier; |
1333 } |
1338 } |
1334 |
1339 |
1335 case ROAD_TILE_CROSSING: { |
1340 case ROAD_TILE_CROSSING: { |
1336 uint32 r = AxisToTrackBits(GetCrossingRoadAxis(tile)) * 0x101; |
1341 Axis axis = GetCrossingRoadAxis(tile); |
1337 |
1342 |
1343 if (side != INVALID_DIAGDIR && axis != DiagDirToAxis(side)) return 0; |
|
1344 |
|
1345 uint32 r = AxisToTrackBits(axis) * 0x101; |
|
1338 if (IsCrossingBarred(tile)) r *= 0x10001; |
1346 if (IsCrossingBarred(tile)) r *= 0x10001; |
1339 return r; |
1347 return r; |
1340 } |
1348 } |
1341 |
1349 |
1342 default: |
1350 default: |
1343 case ROAD_TILE_DEPOT: |
1351 case ROAD_TILE_DEPOT: { |
1344 return AxisToTrackBits(DiagDirToAxis(GetRoadDepotDirection(tile))) * 0x101; |
1352 DiagDirection dir = GetRoadDepotDirection(tile); |
1353 |
|
1354 if (side != INVALID_DIAGDIR && side != dir) return 0; |
|
1355 |
|
1356 return AxisToTrackBits(DiagDirToAxis(dir)) * 0x101; |
|
1357 } |
|
1345 } |
1358 } |
1346 break; |
1359 break; |
1347 |
1360 |
1348 default: break; |
1361 default: break; |
1349 } |
1362 } |