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