void FogOfWar::revealSightAt()

in featurizers/fogofwar.cpp [54:134]


void FogOfWar::revealSightAt(
    TilesInfo& tt,
    int x,
    int y,
    int range,
    bool in_air,
    int currentFrame) const {
  range /= kXYWalktilesPerBuildtile;
  enum {
    flag_very_high = 0x100,
    flag_middle = 0x200,
    flag_high = 0x400,
  };
  Tile* startTile = tt.tryGetTile(x, y);
  if (!startTile)
    return;
  int height_mask = 0;
  if (!in_air) {
    int bwapi_height = startTile->height;
    int height = bwapi_height & 4 ? 2 : bwapi_height & 2 ? 1 : 0;
    if (height == 2)
      height_mask = flag_very_high;
    else if (height == 1)
      height_mask = flag_very_high | flag_high;
    else
      height_mask = flag_very_high | flag_high | flag_middle;
  }
  const size_t max_width = 11 * 2 + 3;
  std::array<uint8_t, max_width * max_width> vision_propagation;
  uint32_t required_tile_mask = (uint32_t)height_mask << 16 | 1;
  const auto& sight_vals = sight_values.at(range);
  size_t tile_x = (size_t)x / (size_t)kXYWalktilesPerBuildtile;
  size_t tile_y = (size_t)y / (size_t)kXYWalktilesPerBuildtile;
  Tile* base_tile = startTile;
  if (!in_air) {
    size_t index = 0;
    size_t end = sight_vals.min_mask_size;
    for (; index != end; ++index) {
      const auto& cur = sight_vals.maskdat[index];
      vision_propagation[index] = 0xff;
      if (tile_x + cur.x >= tt.mapTileWidth)
        continue;
      if (tile_y + cur.y >= tt.mapTileHeight)
        continue;
      auto& tile = base_tile[cur.relative_tile_index];
      tile.visible = true;
      tile.lastSeen = currentFrame;
      vision_propagation[index] = (uint32_t)(tile.height << 8) << 16;
    }
    end += sight_vals.ext_masked_count;
    for (; index != end; ++index) {
      const auto& cur = sight_vals.maskdat[index];
      vision_propagation[index] = 0xff;
      if (tile_x + cur.x >= tt.mapTileWidth)
        continue;
      if (tile_y + cur.y >= tt.mapTileHeight)
        continue;
      if (vision_propagation[cur.prev] & required_tile_mask) {
        if (cur.prev2 == (size_t)~0 ||
            (vision_propagation[cur.prev2] & required_tile_mask))
          continue;
      }
      auto& tile = base_tile[cur.relative_tile_index];
      tile.visible = true;
      tile.lastSeen = currentFrame;
      vision_propagation[index] = (uint32_t)(tile.height << 8) << 16;
    }
  } else {
    auto* cur = sight_vals.maskdat.data();
    auto* end = cur + sight_vals.ext_masked_count;
    for (; cur != end; ++cur) {
      if (tile_x + cur->x >= tt.mapTileWidth)
        continue;
      if (tile_y + cur->y >= tt.mapTileHeight)
        continue;
      auto& tile = base_tile[cur->relative_tile_index];
      tile.visible = true;
      tile.lastSeen = currentFrame;
    }
  }
}