private bool CanPlaceBuilding(IslandBuilding building, Vector2Int coord)
 {
     //TODO: sea level
     return(building.TryPlace(coord).All(x =>
                                         //Tiles exists
                                         surface.PointMap.ContainsKey(x) &&
                                         //No other structure overlapping
                                         (structureMap.ContainsKey(x) == false)
                                         ));
 }
    private void CreateBuildingObject(IslandBuilding prefab, NavigablePoint point)
    {
        var building = Instantiate(prefab);

        building.transform.SetParent(transform);

        building.transform.localScale = building.transform.localScale * surface.CubeSize;

        building.transform.position = new Vector3(point.Position.x, Mathf.Max(surface.seaLevel, point.Position.y), point.Position.z);

        building.Place(point.GridPosition);
    }
    private void PopulateBuildings(List <IslandPath> paths)
    {
        int buildingCount = (int)(Random.value * maxBuildingPerIteration);

        for (int j = 0; j < buildingCount; j++)
        {
            IslandBuilding        b = buildingPrefabs.Random();
            List <NavigablePoint> possiblePoints = PathAdjacentTiles(paths).Random(possibleBuildingSitesFactor);

            foreach (var pp in possiblePoints)
            {
                if (CanPlaceBuilding(b, pp.GridPosition))
                {
                    CreateBuildingObject(b, pp);
                }
            }
        }
    }