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. */ |