src/road_cmd.cpp
changeset 9092 383a632de666
parent 9085 093e03dad31f
child 9094 58d1cddf1af6
equal deleted inserted replaced
9091:c1cddeb8511c 9092:383a632de666
  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 	}