public void Fill(EmptyAreaGroup emptyAreaGroup)
        {
            var buildingTypesBySize = BuildingTypesProvider.GetGroupedBySize();

            for (var index = 0; index < buildingTypesBySize.Count; ++index)
            {
                var buildingTypesOfEqualSize = buildingTypesBySize[index];
                var tileAnglesCombinations   = new TileAnglesCombinations(emptyAreaGroup.Tiles);
                while (tileAnglesCombinations.Any())
                {
                    var buildingLocation  = _randomBuildingLocationGenerator.Generate(tileAnglesCombinations, buildingTypesOfEqualSize);
                    var building          = buildingLocation.Instantiate();
                    var placingPointOnMap = _map.GetLocationOf(buildingLocation.Tile);

                    tileAnglesCombinations.RemoveAngleForTile(buildingLocation.Angle, buildingLocation.Tile);

                    _buildingOnMapIfPossibleLocator.TryLocate(building, placingPointOnMap);
                    if (ShallFinishWithCurrentBuildingType(emptyAreaGroup, index))
                    {
                        break;
                    }
                }
            }

            var mapParameters = new MapFillingParametersCalculator().Calculate(_map);
        }
 public AreaWithBuildingFiller(
     IMap map,
     RandomBuildingLocationGenerator randomBuildingLocationGenerator,
     BuildingOnMapIfPossibleLocator buildingOnMapIfPossibleLocator,
     MapFillingParametersCalculator mapFillingParametersCalculator)
 {
     _map = map;
     _randomBuildingLocationGenerator = randomBuildingLocationGenerator;
     _buildingOnMapIfPossibleLocator  = buildingOnMapIfPossibleLocator;
     _mapFillingParametersCalculator  = mapFillingParametersCalculator;
 }