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