private void checkOtherTowersInArea(PartitionOccupyingTower tower) {
CoordinateStream freedPositions = tower.area.stream().filter((x, y) -> towers[x + y * width] <= 0).freeze();
if (!freedPositions.isEmpty()) {
List<Tuple<Integer, PartitionOccupyingTower>> towersInRange = occupyingTowers.getTowersInRange(tower.position,
tower.radius, currTower -> currTower.playerId != tower.playerId);
Lists.sort(towersInRange, Tuple.getE1Comparator());
for (Tuple<Integer, PartitionOccupyingTower> curr : towersInRange) {
final PartitionOccupyingTower currTower = curr.e2;
final IMapArea currArea = currTower.area;
CoordinateStream area = freedPositions.filter(currArea::contains);
occupyAreaByTower(currTower.playerId, area, currTower.areaBorders);
PartitionsListingBorderVisitor borderVisitor = new PartitionsListingBorderVisitor(this, blockingProvider);
final FreeMapArea groundArea = currTower.groundArea;
ShortPoint2D upperLeftGroundAreaPosition = groundArea.getUpperLeftPosition();
BorderTraversingAlgorithm.traverseBorder(groundArea::contains, upperLeftGroundAreaPosition, borderVisitor, true);
checkMergesAndDividesOnPartitionsList(currTower.playerId,
getPartitionIdAt(upperLeftGroundAreaPosition.x, upperLeftGroundAreaPosition.y), borderVisitor.getPartitionsList());
}
}
}