Old revision #pktd4qic5 | New revision #pmf3ej2io | ||
---|---|---|---|
6 | */ | 6 | */ |
7 | static bool PeterNGrowingBlocksWaterConnection(TileIndex tile) | 7 | static bool PeterNGrowingBlocksWaterConnection(TileIndex tile) |
8 | { | 8 | { |
9 | if (!IsValidTile(tile)) return false; | 9 | if (!IsValidTile(tile) || !IsCoastTile(tile)) return false; |
10 | if (!IsCoastTile(tile)) return false; | ||
11 | 10 | ||
12 | Slope slope = GetTileSlope(tile); | 11 | Slope slope = GetTileSlope(tile); |
13 | 12 | … | … |
17 | Track track = TrackBitsToTrack(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0))); | 16 | Track track = TrackBitsToTrack(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0))); |
18 | Trackdir trackdir = TrackToTrackdir(track); | 17 | Trackdir trackdir = TrackToTrackdir(track); |
19 | 18 | ||
20 | | 20 | /* Test opposite tile is valid */ |
21 | static const Direction corner_to_direction[] = { DIR_W, DIR_S, DIR_E, DIR_N }; | 20 | static const Direction corner_to_direction[] = { DIR_W, DIR_S, DIR_E, DIR_N }; |
22 | 22 | TileIndex tile_o = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(corner_to_direction[OppositeCorner(GetHighestSlopeCorner(slope))])); | |
23 | /* Test adjacent tiles are valid */ | ||
24 | TileIndex tile_a = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(trackdir))); | ||
25 | if (!IsValidTile(tile_a)) return false; | ||
26 | TileIndex tile_b = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(ReverseTrackdir(trackdir)))); | ||
27 | if (!IsValidTile(tile_b)) return false; | ||
28 | TileIndex tile_o = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(corner_to_direction[OppositeCorner(corner)])); | ||
29 | if (!IsValidTile(tile_o)) return false; | 22 | if (!IsValidTile(tile_o)) return false; |
30 | 23 | ||
31 | /* Test adjacent tiles are traversible. */ | 24 | /* Test adjacent tiles are traversible. */ |
32 | if (TrackStatusToTrackBits(GetTileTrackStatus( | 32 | if (TrackStatusToTrackBits(GetTileTrackStatus(AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(trackdir))), TRANSPORT_WATER, 0)) == TRACK_BIT_NONE) return false; |
33 | if (TrackStatusToTrackBits(GetTileTrackStatus( | 33 | if (TrackStatusToTrackBits(GetTileTrackStatus(AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(ReverseTrackdir(trackdir)))), TRANSPORT_WATER, 0)) == TRACK_BIT_NONE) return false; |
34 | 27 | ||
35 | /* If they are, test opposite tile has connecting track. */ | 28 | /* If they are, test opposite tile has connecting track. */ |
36 | TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile_o, TRANSPORT_WATER, 0)); | 36 | if (HasBit(TrackStatusToTrackBits(GetTileTrackStatus(tile_o, TRANSPORT_WATER, 0)), TrackToOppositeTrack(track))) return false; |
37 | if (HasBit(trackbits, TrackToOppositeTrack(track))) return false; | ||
38 | 30 | ||
39 | /* Over building would block a route, so deny it. */ | 31 | /* Over building would block a route, so deny it. */ |
40 | return true; | 32 | return true; |