1651 |
1651 |
1652 j = p->attr; |
1652 j = p->attr; |
1653 k = 0; |
1653 k = 0; |
1654 |
1654 |
1655 // Build the rail |
1655 // Build the rail |
1656 for (i = 0; i != 6; i++, j >>= 1) { |
1656 FOR_EACH_SET_BIT(i, j) { |
1657 if (j & 1) { |
1657 k = i; |
1658 k = i; |
1658 ret = DoCommand(c, railtype, i, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL); |
1659 ret = DoCommand(c, railtype, i, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL); |
1659 if (CmdFailed(ret)) return CMD_ERROR; |
1660 if (CmdFailed(ret)) return CMD_ERROR; |
1660 total_cost.AddCost(ret); |
1661 total_cost.AddCost(ret); |
|
1662 } |
|
1663 } |
1661 } |
1664 |
1662 |
1665 /* signals too? */ |
1663 /* signals too? */ |
1666 if (j & 3) { |
1664 if (j & 3) { |
1667 // Can't build signals on a road. |
1665 // Can't build signals on a road. |
2852 { |
2850 { |
2853 AiRoadEnum are; |
2851 AiRoadEnum are; |
2854 TileIndex tile; |
2852 TileIndex tile; |
2855 DiagDirection dir = p->ai.cur_dir_a; |
2853 DiagDirection dir = p->ai.cur_dir_a; |
2856 uint32 bits; |
2854 uint32 bits; |
2857 int i; |
|
2858 |
2855 |
2859 are.dest = p->ai.cur_tile_b; |
2856 are.dest = p->ai.cur_tile_b; |
2860 tile = TILE_MASK(p->ai.cur_tile_a + TileOffsByDiagDir(dir)); |
2857 tile = TILE_MASK(p->ai.cur_tile_a + TileOffsByDiagDir(dir)); |
2861 |
2858 |
2862 if (IsRoadStopTile(tile) || IsTileDepotType(tile, TRANSPORT_ROAD)) return false; |
2859 if (IsRoadStopTile(tile) || IsTileDepotType(tile, TRANSPORT_ROAD)) return false; |
2863 bits = GetTileTrackStatus(tile, TRANSPORT_ROAD, ROADTYPES_ROAD) & _ai_road_table_and[dir]; |
2860 bits = GetTileTrackStatus(tile, TRANSPORT_ROAD, ROADTYPES_ROAD) & _ai_road_table_and[dir]; |
2864 if (bits == 0) return false; |
2861 if (bits == 0) return false; |
2865 |
2862 |
2866 are.best_dist = (uint)-1; |
2863 are.best_dist = (uint)-1; |
2867 |
2864 |
2868 for_each_bit(i, bits) { |
2865 uint i; |
|
2866 FOR_EACH_SET_BIT(i, bits) { |
2869 FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, ROADTYPES_ROAD, (DiagDirection)_dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are); |
2867 FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, ROADTYPES_ROAD, (DiagDirection)_dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are); |
2870 } |
2868 } |
2871 |
2869 |
2872 if (DistanceManhattan(tile, are.dest) <= are.best_dist) return false; |
2870 if (DistanceManhattan(tile, are.dest) <= are.best_dist) return false; |
2873 |
2871 |