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;
}
}
}