Loading

Paste #pkvoiu2fe

  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 GrowingOnWateredTile(TileIndex tile)
  8. {
  9.     Slope slope = GetTileSlope(tile);
  10.     /* Is this a coast tile with one corner raised ? */
  11.     if (IsSlopeWithOneCornerRaised(slope) && IsCoastTile(tile)) {
  12.         Corner corner = GetHighestSlopeCorner(slope);
  13.         Corner opposite_corner = OppositeCorner(corner);
  14.  
  15.         static const Direction corner_to_direction[] = { DIR_W, DIR_S, DIR_E, DIR_N };
  16.         extern const TileIndexDiffC _tileoffs_by_dir[DIR_END];
  17.         TileIndexDiffC diffc = _tileoffs_by_dir[corner_to_direction[opposite_corner]];
  18.  
  19.         TileIndex opposite_tile = TileAddWrap(tile, diffc.x, diffc.y);
  20.         if (IsValidTile(opposite_tile)) {
  21.             TrackBits opposite_track = CornerToTrackBits(corner);
  22.  
  23.             static const struct { TrackBits next_track_1, next_track_2, next_track_1_90_deg, next_track_2_90_deg; } track_bit_table[] = {
  24.                 /*         t1x,t1y,t2x,t2y,              next_track_1          ,        next_track_2          next_track_1_90_deg, next_track_2_90_deg, opposite_tile */
  25.                 /* CORNER_W  0,  1, -1,  0,  */ { TRACK_BIT_X | TRACK_BIT_RIGHT, TRACK_BIT_Y | TRACK_BIT_RIGHT, TRACK_BIT_3WAY_NE, TRACK_BIT_3WAY_SE }, /* -1,  1 */
  26.                 /* CORNER_S  1,  0,  0,  1,  */ { TRACK_BIT_Y | TRACK_BIT_UPPER, TRACK_BIT_X | TRACK_BIT_UPPER, TRACK_BIT_3WAY_NW, TRACK_BIT_3WAY_NE }, /*  1,  1 */
  27.                 /* CORNER_E  0, -1,  1,  0,  */ { TRACK_BIT_X | TRACK_BIT_LEFT , TRACK_BIT_Y | TRACK_BIT_LEFT , TRACK_BIT_3WAY_SW, TRACK_BIT_3WAY_NW }, /*  1, -1 */
  28.                 /* CORNER_N -1,  0,  0, -1,  */ { TRACK_BIT_Y | TRACK_BIT_LOWER, TRACK_BIT_X | TRACK_BIT_LOWER, TRACK_BIT_3WAY_SE, TRACK_BIT_3WAY_SW }, /* -1, -1 */
  29.             };
  30.  
  31.             TileIndex tile_1 = TileAddWrap(tile, opposite_corner & 1 ? diffc.x : 0, opposite_corner & 1 ? 0 : diffc.y);
  32.             TileIndex tile_2 = TileAddWrap(tile, opposite_corner & 1 ? 0 : diffc.x, opposite_corner & 1 ? diffc.x : 0);
  33.  
  34.             bool forbid_90_deg = _settings_game.pf.forbid_90_deg;
  35.  
  36.             TrackBits track_1 = TrackStatusToTrackBits(GetTileTrackStatus(tile_1, TRANSPORT_WATER, 0));
  37.             TrackBits track_2 = TrackStatusToTrackBits(GetTileTrackStatus(tile_2, TRANSPORT_WATER, 0));
  38.  
  39.             TrackBits next_track_1 = (forbid_90_deg ? track_bit_table[corner].next_track_1 : track_bit_table[corner].next_track_1_90_deg) & track_1;
  40.             TrackBits next_track_2 = (forbid_90_deg ? track_bit_table[corner].next_track_2 : track_bit_table[corner].next_track_2_90_deg) & track_2;
  41.             TrackBits main_track_1 = (forbid_90_deg ? track_bit_table[opposite_corner].next_track_2 : track_bit_table[opposite_corner].next_track_2_90_deg) & track_1;
  42.             TrackBits main_track_2 = (forbid_90_deg ? track_bit_table[opposite_corner].next_track_1 : track_bit_table[opposite_corner].next_track_1_90_deg) & track_2;
  43.  
  44.             /* Is there a connection between tile_1 and tile_2 via tile? */
  45.             if (main_track_1 && main_track_2) {
  46.                 /* Is there an opposite_track that can be used to try an alternative connection? */
  47.                 if (opposite_track & TrackStatusToTrackBits(GetTileTrackStatus(opposite_tile, TRANSPORT_WATER, 0))) {
  48.                     TrackBits mirror = TRACK_BIT_CROSS | (corner & 1 ? TRACK_BIT_HORZ : TRACK_BIT_VERT);
  49.                     /* Is there a connection between tile_1 and tile_2 via opposite_tile? */
  50.                     if (next_track_1 & (main_track_1 ^ mirror) && next_track_2 & (main_track_2 ^ mirror)) {
  51.                         /* There is an alternative connection. Town than grow on tile. */
  52.                         return false;
  53.                     }
  54.                 }
  55.                 /* There is either no opposite_track, or an incomplete connection via opposite_tile. */
  56.                 return true;
  57.             }
  58.         }
  59.     }
  60.     /* There was no connection via tile, or it was incomplete, or the opposite_tile is outside the map. */
  61.     return false;
  62. }

Version history

Revision # Author Created at
p807efevu Anonymous 08 Jan 2019, 20:26:21 UTC Diff

Comments