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