void ConnectRooms(List <CARoom> allRooms) { List <CARoom> roomListA = allRooms; List <CARoom> roomListB = allRooms; foreach (CARoom room1 in roomListA) { if (!room1.checkMaxPassages()) { continue; } List <CAConnection> connectionsList = new List <CAConnection>(); foreach (CARoom room2 in roomListB) { if (room1.connectedRooms.Contains(room2)) { continue; } int bestDistance; CAConnection connectionBetweenRooms = GetBestConnection(room1, room2, false, out bestDistance); if (connectionBetweenRooms != null) { connectionsList.Add(connectionBetweenRooms); } } for (int i = room1.passages; i <= room1.maxPassages; i++) { if (connectionsList.Count == 0) { break; } int index = pseudoRandom.Next(0, connectionsList.Count); CAConnection connection = connectionsList[index]; if (connectionType == ConnectionType.straight) { CreateStraightCorridor(connection.roomA, connection.roomB, connection.connectionTileA, connection.connectionTileB, false); } else { CreateDirectCorridor(connection.roomA, connection.roomB, connection.connectionTileA, connection.connectionTileB, false); } connectionsList.Remove(connection); } } ConnectRoomsToMain(allRooms); }
private void ConnectRoomsToMain(List <CARoom> allRooms) { List <CARoom> roomListA = new List <CARoom>(); List <CARoom> roomListB = new List <CARoom>(); foreach (CARoom room in allRooms) { if (room.isAccessibleFromMainRoom) { roomListB.Add(room); } else { roomListA.Add(room); } } foreach (CARoom room1 in roomListA) { CAConnection connection = null; int bestDistance = -1; foreach (CARoom room2 in roomListB) { int tmp; CAConnection connectionBetweenRooms = GetBestConnection(room1, room2, true, out tmp); if (connectionBetweenRooms != null) { if (tmp < bestDistance || bestDistance == -1) { bestDistance = tmp; connection = connectionBetweenRooms; } } } if (bestDistance != -1) { if (connectionType == ConnectionType.straight) { CreateStraightCorridor(connection.roomA, connection.roomB, connection.connectionTileA, connection.connectionTileB, true); } else { CreateDirectCorridor(connection.roomA, connection.roomB, connection.connectionTileA, connection.connectionTileB, true); } } } }
private CAConnection GetBestConnection(CARoom room1, CARoom room2, bool forceAccessibilityFromMainRoom, out int bestDistance) { List <CAConnection> connectionsBetweenRooms = new List <CAConnection>(); bestDistance = -1; foreach (Tile c1 in room1.edgeTiles) { foreach (Tile c2 in room2.edgeTiles) { if (!forceAccessibilityFromMainRoom && (Math.Abs(c1.tileX - c2.tileX) > maxCorridorLengthX || Math.Abs(c1.tileY - c2.tileY) > maxCorridorLengthY)) { continue; } int distanceBetweenRooms = (int)(Mathf.Pow(c1.tileX - c2.tileX, 2) + Mathf.Pow(c1.tileY - c2.tileY, 2)); if (bestDistance > distanceBetweenRooms || bestDistance == -1) { bestDistance = distanceBetweenRooms; connectionsBetweenRooms.Clear(); connectionsBetweenRooms.Add(new CAConnection(c1, c2, room1, room2, distanceBetweenRooms)); } else if (bestDistance == distanceBetweenRooms) { connectionsBetweenRooms.Add(new CAConnection(c1, c2, room1, room2, distanceBetweenRooms)); } } } if (bestDistance != -1) { int index = pseudoRandom.Next(0, connectionsBetweenRooms.Count); CAConnection connection = connectionsBetweenRooms[index]; return(connection); } return(null); }