public WallsSpecification CreateWallsSpecification(FloorSpecification floorSpecification) { _outsideWallWidgets = GetComponents <WallGenerationWidget>().ToList(); var wallsSpecification = new WallsSpecification(new Vector2Int(floorSpecification.FloorPresenceArray.GetLength(0), floorSpecification.FloorPresenceArray.GetLength(1))); _outsideWallWidgets.ForEach(c => c.AddWalls(wallsSpecification, floorSpecification)); return(wallsSpecification); }
public PropsSpecification GeneratePropsSpecification(FloorSpecification floorSpecification) { _propGenerators = GetComponents <PropGenerationWidget>().ToList(); var specification = new PropsSpecification(floorSpecification.Size); _propGenerators.ForEach(c => c.AddProps(specification, floorSpecification)); return(specification); }
public override void AddWalls(WallsSpecification spec, FloorSpecification floorSpecification) { var width = floorSpecification.FloorPresenceArray.GetLength(0); var height = floorSpecification.FloorPresenceArray.GetLength(1); for (var y = 0; y < height; y++) { for (int x = 0; x < width; x++) { if (floorSpecification.FloorPresenceArray[x, y]) { spec.AddWallDirection(new Vector2Int(x, y), WallDirection.Left, false); break; } } } for (var y = 0; y < height; y++) { for (int x = width - 1; x >= 0; x--) { if (floorSpecification.FloorPresenceArray[x, y]) { spec.AddWallDirection(new Vector2Int(x, y), WallDirection.Right, false); break; } } } for (int x = 0; x < width; x++) { for (var y = 0; y < height; y++) { if (floorSpecification.FloorPresenceArray[x, y]) { spec.AddWallDirection(new Vector2Int(x, y), WallDirection.Down, false); break; } } } for (int x = 0; x < width; x++) { for (var y = height - 1; y >= 0; y--) { if (floorSpecification.FloorPresenceArray[x, y]) { spec.AddWallDirection(new Vector2Int(x, y), WallDirection.Up, false); break; } } } }
public static void Main() { Console.WriteLine($"Specification Demo\n\n\n"); House house = HouseSpecification.Initialize() .WithAddress("5th Av, New York") .WithFloor(FloorSpecification.Initialize() .WithTiles(12)) .WithWalls(WallsSpecification.Initialize() .WithWindows(12)) .WithRoof(RoofSpecification.Initialize() .HasRoofTiles(12) .HasColor("Red")) .Validate() .Build(); Console.WriteLine($"We just built an house! {house.ToString()}"); }
private void ClearOutBlackHoleArea(FloorSpecification floorSpecification, WallsSpecification wallsSpecification, PropsSpecification propsSpecification) { var size = floorSpecification.Size; var center = size / 2; for (int x = 0; x < size.x; x++) { for (int y = 0; y < size.y; y++) { var distanceToCenter = Vector2.Distance(new Vector2(x, y), center); if (distanceToCenter < _blackHoleAreaSize) { floorSpecification.FloorPresenceArray[x, y] = true; wallsSpecification.EmptyWalls(new Vector2Int(x, y)); propsSpecification.SetDefinition(new Vector2Int(x, y), null); } } } }
public void InstantiateFloor(FloorSpecification floorSpecification, Vector2Int floorSize) { DestroyCurrentFloor(); var centerOffset = floorSize / 2; for (int x = 0; x < floorSize.x; x++) { for (int y = 0; y < floorSize.y; y++) { if (floorSpecification.FloorPresenceArray[x, y]) { var position = new Vector3(x, 0, y) - new Vector3(centerOffset.x, 0, centerOffset.y); var cell = GameObject.Instantiate(_floorCellPrefab, position, Quaternion.identity, _floorParent); cell.transform.localPosition = position; cell.name = $"Cell {x}-{y}"; } } } }
private void TryAddingWall(Vector2Int coords, WallDirection direction, WallsSpecification wallsSpecification, FloorSpecification floorSpecification) { Vector2Int additionalCoordOffset; switch (direction) { case WallDirection.Up: additionalCoordOffset = new Vector2Int(0, 1); break; case WallDirection.Down: additionalCoordOffset = new Vector2Int(0, -1); break; case WallDirection.Left: additionalCoordOffset = new Vector2Int(-1, 0); break; case WallDirection.Right: additionalCoordOffset = new Vector2Int(1, 0); break; default: throw new ArgumentOutOfRangeException(nameof(direction), direction, null); } var offsetedCoords = coords + additionalCoordOffset; if (floorSpecification.FloorPresenceArray[coords.x, coords.y] || ( offsetedCoords.x >= 0 && offsetedCoords.y >= 0 && offsetedCoords.x < floorSpecification.Size.x && offsetedCoords.y < floorSpecification.Size.y && floorSpecification.FloorPresenceArray[offsetedCoords.x, offsetedCoords.y] )) { wallsSpecification.AddWallDirection(coords, direction, true); } }
public override void AddProps(PropsSpecification propsSpecification, FloorSpecification floorSpecification) { var propsCount = Mathf.RoundToInt(floorSpecification.Size.x * floorSpecification.Size.y * _propsDensity); for (int i = 0; i < propsCount; i++) { var coords = new Vector2Int(_random.RandomInt(floorSpecification.Size.x), _random.RandomInt(floorSpecification.Size.y)); var angle = _random.RandomElement(new List <float>() { 0, 90, 180, 270 }); var propPrefab = _random.RandomElement(_possibleProps); if (floorSpecification.FloorPresenceArray[coords.x, coords.y]) { propsSpecification.SetDefinition(coords, new PropInstanceDefinition() { Angle = angle, Prefab = propPrefab }); } } }
public override void AddProps(PropsSpecification propsSpecification, FloorSpecification floorSpecification) { var propsGroupsCount = Mathf.RoundToInt(floorSpecification.Size.x * floorSpecification.Size.y * _propsGroupsDensity); for (int i = 0; i < propsGroupsCount; i++) { var coords = new Vector2Int(_random.RandomInt(floorSpecification.Size.x), _random.RandomInt(floorSpecification.Size.y)); var groupRadius = Mathf.CeilToInt(_random.RandomFloat(_groupRadiusRange.x, _groupRadiusRange.y)); var countInGroup = _random.RandomFloat(_propsDensityPerGroupRange.x, _propsDensityPerGroupRange.y) * (groupRadius + 1) * (groupRadius + 1); for (int j = 0; j < countInGroup; j++) { var thisPropCoords = coords + new Vector2Int(_random.RandomInt(-groupRadius, groupRadius), _random.RandomInt(-groupRadius, groupRadius)); if (thisPropCoords.x >= 0 && thisPropCoords.y >= 0 && thisPropCoords.x < floorSpecification.Size.x && thisPropCoords.y < floorSpecification.Size.y) { var angle = _random.RandomFloat(0, 360); var propPrefab = _random.RandomElement(_possibleProps); var offsetFromCenter = new Vector2(_random.RandomFloat(-0.5f, 0.5f), _random.RandomFloat(-0.5f, 0.5f)); if (floorSpecification.FloorPresenceArray[thisPropCoords.x, thisPropCoords.y]) { propsSpecification.SetDefinition(thisPropCoords, new PropInstanceDefinition() { Angle = angle, Prefab = propPrefab, OffsetFromCenter = offsetFromCenter }); } } } } }
public override void AddWalls(WallsSpecification specification, FloorSpecification floorSpecification) { var size = floorSpecification.Size; var start = ClampCoords(floorSpecification.Size, new Vector2Int(Mathf.RoundToInt(_startPoint.x * size.x), Mathf.RoundToInt(_startPoint.y * size.y))); var end = ClampCoords(floorSpecification.Size, new Vector2Int(Mathf.RoundToInt(_endPoint.x * size.x), Mathf.RoundToInt(_endPoint.y * size.y))); var points = GetPointsOnLine(start.x, start.y, end.x, end.y).ToList(); for (int i = 0; i < points.Count - 1; i++) { var p1 = points[i]; var p2 = points[i + 1]; if (p1.x == p2.x) { //do nothing } else if (p1.x == p2.x) { TryAddingWall(new Vector2Int(p1.x, p1.y), WallDirection.Up, specification, floorSpecification); } else if (p1.x - 1 == p2.x) { if (p1.y <= p2.y) { TryAddingWall(new Vector2Int(p1.x, p1.y), WallDirection.Up, specification, floorSpecification); } else { TryAddingWall(new Vector2Int(p1.x, p1.y - 1), WallDirection.Up, specification, floorSpecification); } } else if (p1.x + 1 == p2.x) { if (p1.y <= p2.y) { TryAddingWall(new Vector2Int(p1.x + 1, p1.y), WallDirection.Up, specification, floorSpecification); } else { TryAddingWall(new Vector2Int(p1.x, p1.y - 1), WallDirection.Up, specification, floorSpecification); } } else { MyAssert.Fail($"x delta is too big {p1} {p2}"); } if (p1.y == p2.y) { //do nothing } else if (p1.y + 1 == p2.y) { TryAddingWall(new Vector2Int(p1.x, p1.y), WallDirection.Right, specification, floorSpecification); } else if (p1.y - 1 == p2.y) { TryAddingWall(new Vector2Int(p1.x, p1.y), WallDirection.Right, specification, floorSpecification); } else { MyAssert.Fail($"y delta is too big {p1} {p2}"); } } }
public abstract void AddWalls(WallsSpecification specification, FloorSpecification floorSpecification);
public abstract void AddProps(PropsSpecification specification, FloorSpecification floorSpecification);