| Old revision #pee8qlkwu | New revision #pye2z1acs | ||
|---|---|---|---|
| 4 | * @param tile The target tile | 4 | * @param tile The target tile |
| 5 | * @return true if building here blocks a water connection | 5 | * @return true if building here blocks a water connection |
| 6 | */ | 6 | */ |
| 7 | static bool GrowingBlocksWaterConnection( | 7 | static bool GrowingBlocksWaterConnection(const TileIndex tile) |
| 8 | { | 8 | { |
| 9 | if (!IsValidTile(tile) || !IsCoastTile(tile)) return false; | 9 | if (!IsValidTile(tile) || !IsCoastTile(tile)) return false; |
| 10 | 10 | ||
| 11 | | 11 | const Slope slope = GetTileSlope(tile); |
| 12 | /* Is this a coast tile with one corner raised ? */ | 12 | /* Is this a coast tile with one corner raised ? */ |
| 13 | if (IsSlopeWithOneCornerRaised(slope)) { | 13 | if (IsSlopeWithOneCornerRaised(slope)) { |
| 14 | const Track main_track_mask = TrackBitsToTrack(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0))); | 14 | const Track main_track_mask = TrackBitsToTrack(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0))); | … | … |
| 20 | const DiagDirection oppo_dir_1 = TrackdirToExitdir(oppo_trackdir); | 20 | const DiagDirection oppo_dir_1 = TrackdirToExitdir(oppo_trackdir); |
| 21 | const DiagDirection oppo_dir_2 = TrackdirToExitdir(ReverseTrackdir(oppo_trackdir)); | 21 | const DiagDirection oppo_dir_2 = TrackdirToExitdir(ReverseTrackdir(oppo_trackdir)); |
| 22 | 22 | ||
| 23 | | 23 | const TrackBits main_trackbits_mask_1 = DiagdirReachesTracks(main_dir_1); |
| 24 | | 24 | const TrackBits main_trackbits_mask_2 = DiagdirReachesTracks(main_dir_2); |
| 25 | | 25 | const TrackBits oppo_trackbits_mask_1 = DiagdirReachesTracks(oppo_dir_1); |
| 26 | | 26 | const TrackBits oppo_trackbits_mask_2 = DiagdirReachesTracks(oppo_dir_2); |
| 27 | 27 | ||
| 28 | if (_settings_game.pf.forbid_90_deg) { | 28 | const Corner corner = GetHighestSlopeCorner(slope); |
| 29 | main_trackbits_mask_1 &= ~TrackCrossesTracks(main_track_mask); | ||
| 30 | main_trackbits_mask_2 &= ~TrackCrossesTracks(main_track_mask); | ||
| 31 | oppo_trackbits_mask_1 &= ~TrackCrossesTracks(oppo_track_mask); | ||
| 32 | oppo_trackbits_mask_2 &= ~TrackCrossesTracks(oppo_track_mask); | ||
| 33 | } | ||
| 34 | |||
| 35 | Corner corner = GetHighestSlopeCorner(slope); | ||
| 36 | static const Direction corner_to_direction[] = { DIR_W, DIR_S, DIR_E, DIR_N }; | 29 | static const Direction corner_to_direction[] = { DIR_W, DIR_S, DIR_E, DIR_N }; |
| 37 | | 37 | const TileIndex opposite_tile = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(corner_to_direction[OppositeCorner(corner)])); |
| 38 | 31 | ||
| 39 | if (IsValidTile(opposite_tile)) { | 32 | if (IsValidTile(opposite_tile)) { |
| 40 | | 40 | const TileIndex tile_1 = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(main_dir_1)); |
| 41 | | 41 | const TileIndex tile_2 = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(main_dir_2)); |
| 42 | 35 | ||
| 43 | | 43 | const TrackBits track_1 = TrackStatusToTrackBits(GetTileTrackStatus(tile_1, TRANSPORT_WATER, 0)); |
| 44 | | 44 | const TrackBits track_2 = TrackStatusToTrackBits(GetTileTrackStatus(tile_2, TRANSPORT_WATER, 0)); |
| 45 | 38 | ||
| 46 | | 46 | const TrackBits main_track_1 = main_trackbits_mask_1 & track_1; |
| 47 | | 47 | const TrackBits main_track_2 = main_trackbits_mask_2 & track_2; |
| 48 | | 48 | const TrackBits oppo_track_1 = oppo_trackbits_mask_1 & track_1; |
| 49 | | 49 | const TrackBits oppo_track_2 = oppo_trackbits_mask_2 & track_2; |
| 50 | 43 | ||
| 51 | /* Is there a connection between tile_1 and tile_2 via tile? */ | 44 | /* Is there a connection between tile_1 and tile_2 via tile? */ |
| 52 | if (main_track_1 && main_track_2) { | 45 | if (main_track_1 && main_track_2) { |
| 53 | | 53 | const TrackBits oppo_trackbits = TrackStatusToTrackBits(GetTileTrackStatus(opposite_tile, TRANSPORT_WATER, 0)); |
| 54 | /* Is there a track in the opposite_tile that can be used to try an alternative connection? */ | 47 | /* Is there a track in the opposite_tile that can be used to try an alternative connection? */ |
| 55 | if (HasTrack(oppo_trackbits, oppo_track_mask)) { | 48 | if (HasTrack(oppo_trackbits, oppo_track_mask)) { |
| 56 | | 56 | const TrackBits mirror = TRACK_BIT_CROSS | (corner & 1 ? TRACK_BIT_HORZ : TRACK_BIT_VERT); |
| 57 | /* Is there a connection between tile_1 and tile_2 via opposite_tile? */ | 50 | /* Is there a connection between tile_1 and tile_2 via opposite_tile? */ |
| 58 | if (oppo_track_1 & (main_track_1 ^ mirror) && oppo_track_2 & (main_track_2 ^ mirror)) { | 51 | if (oppo_track_1 & (main_track_1 ^ mirror) && oppo_track_2 & (main_track_2 ^ mirror)) { |
| 59 | /* There is an alternative connection. Town can grow on tile. */ | 52 | /* There is an alternative connection. Town can grow on tile. */ |