Loading

Paste #ph2ugbbgr

  1. /**
  2.  * Check whether growing on a half-tile coast tile ends up blocking a water connection
  3.  *
  4.  * @param tile The target tile
  5.  * @return true if building here blocks a water connection
  6.  */
  7. static bool GrowingBlocksWaterConnection(TileIndex tile)
  8. {
  9.     if (!IsValidTile(tile) || !IsCoastTile(tile)) return false;
  10.  
  11.     Slope slope = GetTileSlope(tile);
  12.  
  13.     /* Is this a coast tile with one corner raised ? */
  14.     if (IsSlopeWithOneCornerRaised(slope)) {
  15.         Corner corner = GetHighestSlopeCorner(slope);
  16.         static const Direction corner_to_direction[] = { DIR_W, DIR_S, DIR_E, DIR_N };
  17.         TileIndex opposite_tile = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(corner_to_direction[OppositeCorner(corner)]));
  18.  
  19.         if (IsValidTile(opposite_tile)) {
  20.             Track main_track_mask = TrackBitsToTrack(TrackStatusToTrackBits(GetTileTrackStatus(tile, TRANSPORT_WATER, 0)));
  21.             Trackdir main_trackdir = TrackToTrackdir(main_track_mask);
  22.  
  23.             DiagDirection main_dir_1 = TrackdirToExitdir(main_trackdir);
  24.             DiagDirection main_dir_2 = TrackdirToExitdir(ReverseTrackdir(main_trackdir));
  25.  
  26.             TileIndex tile_1 = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(main_dir_1));
  27.             TileIndex tile_2 = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDiagDir(main_dir_2));
  28.  
  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;
  37.  
  38.             /* Is there a connection between tile_1 and tile_2 via tile? */
  39.             if (main_track_1 && main_track_2) {
  40.                 TrackBits oppo_trackbits = TrackStatusToTrackBits(GetTileTrackStatus(opposite_tile, TRANSPORT_WATER, 0));
  41.                 Track oppo_track_mask = TrackToOppositeTrack(main_track_mask);
  42.  
  43.                 /* Is there a track in the opposite_tile that can be used to try an alternative connection? */
  44.                 if (HasTrack(oppo_trackbits, oppo_track_mask)) {
  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.  
  58.                     /* Is there a connection between tile_1 and tile_2 via opposite_tile? */
  59.                     if (oppo_track_1 & (main_track_1 ^ mirror) && oppo_track_2 & (main_track_2 ^ mirror)) {
  60.                         /* There is an alternative connection. Town can grow on tile. */
  61.                         return false;
  62.                     }
  63.                 }
  64.                 /* There is either no track or an incomplete connection via opposite_tile. */
  65.                 return true;
  66.             }
  67.         }
  68.     }
  69.     /* There was no connection via tile, or it was incomplete, or the opposite_tile is outside the map. */
  70.     return false;
  71. }

Version history

Revision # Author Created at
pye2z1acs Anonymous 24 Feb 2019, 22:27:46 UTC Diff
pee8qlkwu Anonymous 24 Feb 2019, 14:39:29 UTC Diff

Comments