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 BuildingLocation Generate( TileAnglesCombinations tileAnglesCombinations, BuildingTypesOfEqualSize buildingTypesOfEqualSize) { var randomTile = tileAnglesCombinations.GetRandomTile(); var angle = tileAnglesCombinations.GetRandomAngleForTile(randomTile); var type = buildingTypesOfEqualSize.GetRandomType(); return(new BuildingLocation(type, randomTile, angle)); }