Loading

Revision differences

Old revision #pee8qlkwuNew 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 */  
7static bool GrowingBlocksWaterConnection(TileIndex tile)  7static 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    Slope slope = GetTileSlope(tile);  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        TrackBits main_trackbits_mask_1 = DiagdirReachesTracks(main_dir_1);  23        const TrackBits main_trackbits_mask_1 = DiagdirReachesTracks(main_dir_1);
24        TrackBits main_trackbits_mask_2 = DiagdirReachesTracks(main_dir_2);  24        const TrackBits main_trackbits_mask_2 = DiagdirReachesTracks(main_dir_2);
25        TrackBits oppo_trackbits_mask_1 = DiagdirReachesTracks(oppo_dir_1);  25        const TrackBits oppo_trackbits_mask_1 = DiagdirReachesTracks(oppo_dir_1);
26        TrackBits oppo_trackbits_mask_2 = DiagdirReachesTracks(oppo_dir_2);  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        TileIndex opposite_tile = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(corner_to_direction[OppositeCorner(corner)]));  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            TileIndex tile_1 = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(main_dir_1));  40            const TileIndex tile_1 = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(main_dir_1));
41            TileIndex tile_2 = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(main_dir_2));  41            const TileIndex tile_2 = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(main_dir_2));
42  35  
43            TrackBits track_1 = TrackStatusToTrackBits(GetTileTrackStatus(tile_1, TRANSPORT_WATER, 0));  43            const TrackBits track_1 = TrackStatusToTrackBits(GetTileTrackStatus(tile_1, TRANSPORT_WATER, 0));
44            TrackBits track_2 = TrackStatusToTrackBits(GetTileTrackStatus(tile_2, TRANSPORT_WATER, 0));  44            const TrackBits track_2 = TrackStatusToTrackBits(GetTileTrackStatus(tile_2, TRANSPORT_WATER, 0));
45  38  
46            TrackBits main_track_1 = main_trackbits_mask_1 & track_1;  46            const TrackBits main_track_1 = main_trackbits_mask_1 & track_1;
47            TrackBits main_track_2 = main_trackbits_mask_2 & track_2;  47            const TrackBits main_track_2 = main_trackbits_mask_2 & track_2;
48            TrackBits oppo_track_1 = oppo_trackbits_mask_1 & track_1;  48            const TrackBits oppo_track_1 = oppo_trackbits_mask_1 & track_1;
49            TrackBits oppo_track_2 = oppo_trackbits_mask_2 & track_2;  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                TrackBits oppo_trackbits = TrackStatusToTrackBits(GetTileTrackStatus(opposite_tile, TRANSPORT_WATER, 0));  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                    TrackBits mirror = TRACK_BIT_CROSS | (corner & 1 ? TRACK_BIT_HORZ : TRACK_BIT_VERT);  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. */