Old revision #pol6ejtzl | 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 | DiagDirection dir_a = TrackdirToExitdir(trackdir); | 20 | /* Test opposite tile is valid */ |
21 | DiagDirection dir_b = TrackdirToExitdir(ReverseTrackdir(trackdir)); | ||
22 | |||
23 | TileIndex tile_a = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(dir_a)); | ||
24 | TileIndex tile_b = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(dir_b)); | ||
25 | |||
26 | Corner corner = GetHighestSlopeCorner(slope); | ||
27 | 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 }; |
28 | 28 | TileIndex tile_o = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(corner_to_direction[OppositeCorner(GetHighestSlopeCorner(slope))])); | |
29 | /* Test adjacent tiles are valid */ | ||
30 | TileIndex tile_a = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(dir_a)); | ||
31 | if (!IsValidTile(tile_a)) return false; | ||
32 | TileIndex tile_b = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(dir_b)); | ||
33 | if (!IsValidTile(tile_b)) return false; | ||
34 | TileIndex tile_o = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(corner_to_direction[OppositeCorner(corner)])); | ||
35 | if (!IsValidTile(tile_o)) return false; | 22 | if (!IsValidTile(tile_o)) return false; |
36 | 23 | ||
37 | /* Test adjacent tiles are traversible. */ | 24 | /* Test adjacent tiles are traversible. */ |
38 | if (TrackStatusToTrackBits(GetTileTrackStatus( | 38 | if (TrackStatusToTrackBits(GetTileTrackStatus(AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(trackdir))), TRANSPORT_WATER, 0)) == TRACK_BIT_NONE) return false; |
39 | if (TrackStatusToTrackBits(GetTileTrackStatus( | 39 | if (TrackStatusToTrackBits(GetTileTrackStatus(AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(TrackdirToExitdir(ReverseTrackdir(trackdir)))), TRANSPORT_WATER, 0)) == TRACK_BIT_NONE) return false; |
40 | 27 | ||
41 | /* If they are, test opposite tile has connecting track. */ | 28 | /* If they are, test opposite tile has connecting track. */ |
42 | TrackBits trackbits = TrackStatusToTrackBits(GetTileTrackStatus(tile_o, TRANSPORT_WATER, 0)); | 42 | if (HasBit(TrackStatusToTrackBits(GetTileTrackStatus(tile_o, TRANSPORT_WATER, 0)), TrackToOppositeTrack(track))) return false; |
43 | if (HasBit(trackbits, TrackToOppositeTrack(track))) return false; | ||
44 | 30 | ||
45 | /* Over building would block a route, so deny it. */ | 31 | /* Over building would block a route, so deny it. */ |
46 | return true; | 32 | return true; |