private List <Tile> CreateCorridorRoom(BTConnection connection) { Tile tile1 = connection.connectionTileA, tile2 = connection.connectionTileB; List <Tile> corridorRoom = new List <Tile>(); Vector2 pos = new Vector2(tile1.tileX, tile1.tileY); int xDir = 0, yDir = 0; if (tile1.tileX <= tile2.tileX) { xDir = 1; } else { xDir = -1; } while (pos.x != tile2.tileX) { corridorRoom.Add(new Tile((int)pos.x, (int)pos.y)); pos = new Vector2(pos.x + xDir, pos.y); } if (tile1.tileY <= tile2.tileY) { yDir = 1; } else { yDir = -1; } while (pos.y != tile2.tileY) { corridorRoom.Add(new Tile((int)pos.x, (int)pos.y)); pos = new Vector2(pos.x, pos.y + yDir); } return(corridorRoom); }
private BTConnection GetBestConnection(BTRoom room1, BTRoom room2, out int bestDistance) { List <BTConnection> connectionsBetweenRooms = new List <BTConnection>(); bestDistance = -1; foreach (Tile t1 in room1.edgeTiles) { foreach (Tile t2 in room2.edgeTiles) { if (Math.Abs(t1.tileX - t2.tileX) > maxCorridorLengthX || Math.Abs(t1.tileY - t2.tileY) > maxCorridorLengthY) { continue; } int distanceBetweenRooms = (int)(Mathf.Pow(t1.tileX - t2.tileX, 2) + Mathf.Pow(t1.tileY - t2.tileY, 2)); if (bestDistance > distanceBetweenRooms || bestDistance == -1) { bestDistance = distanceBetweenRooms; connectionsBetweenRooms.Clear(); connectionsBetweenRooms.Add(new BTConnection(t1, t2, distanceBetweenRooms)); } else if (bestDistance == distanceBetweenRooms) { connectionsBetweenRooms.Add(new BTConnection(t1, t2, distanceBetweenRooms)); } } } if (bestDistance != -1) { int index = pseudoRandom.Next(0, connectionsBetweenRooms.Count); BTConnection connection = connectionsBetweenRooms[index]; return(connection); } return(null); }
private List <BTRoom> ConnectRooms(BTNode node) { if (node.child1 == null && node.child2 == null) { return(node.area.rooms); } if (node.child1 == null) { List <BTRoom> roomComplex = ConnectRooms(node.child2); node.area.rooms.AddRange(roomComplex); return(node.area.rooms); } if (node.child2 == null) { List <BTRoom> roomComplex = ConnectRooms(node.child1); node.area.rooms.AddRange(roomComplex); return(node.area.rooms); } List <BTRoom> roomComplex1 = ConnectRooms(node.child1); List <BTRoom> roomComplex2 = ConnectRooms(node.child2); node.area.rooms.AddRange(roomComplex1); node.area.rooms.AddRange(roomComplex2); List <BTConnection> connectionsList = new List <BTConnection>(); int bestDistance = -1; foreach (BTRoom room1 in roomComplex1) { BTConnection connectionBetweenRooms = null; foreach (BTRoom room2 in roomComplex2) { int tmpBest; BTConnection tmpConnection = GetBestConnection(room1, room2, out tmpBest); if (tmpBest != -1 && (tmpBest < bestDistance || bestDistance == -1)) { bestDistance = tmpBest; connectionBetweenRooms = tmpConnection; } } if (connectionBetweenRooms != null) { connectionsList.Add(connectionBetweenRooms); } bestDistance = -1; } int depth = GetTreeDepth(node); int connectionsAmount = pseudoRandom.Next(1 + depth / 3, 1 + depth / 2); for (int i = 0; i < connectionsAmount; i++) { if (connectionsList.Count == 0) { break; } int index = pseudoRandom.Next(0, connectionsList.Count); BTConnection connection = connectionsList[index]; List <Tile> corridor = CreateCorridorRoom(connection); node.area.rooms.Add(new BTRoom(corridor)); connectionsList.Remove(connection); } return(node.area.rooms); }