From 2baa78bd90c02044597fe588987ab50d562af51d Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 7 Feb 2025 09:15:40 +0100 Subject: [PATCH] Implemented room generation around boss room. --- .../DungeonGenerator/DungeonGenerator.cs | 139 ++++++++++-------- 1 file changed, 75 insertions(+), 64 deletions(-) diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs index aa9ba20..21927d0 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs @@ -42,88 +42,99 @@ namespace DungeonGenerator } AddNormalRoomsAroundMonsterRooms(dungeonMap); + AddNormalRoomsAroundBossRoom(dungeonMap); return dungeonMap; } + private void AddNormalRoomsAroundBossRoom(DungeonMap dungeon) + { + AddNormalRoomsAroundRoom(dungeon.GetBossRoom(), dungeon); + } + private void AddNormalRoomsAroundMonsterRooms(DungeonMap dungeon) { - HashSet unoccupiedPoints = dungeon.GetUnoccupiedPoints(); - Random random = new Random(); foreach (Room monsterRoom in dungeon.GetMonsterRooms()) { - var roomPoints = monsterRoom.GetPointsInRoom(); - int minX = roomPoints.Min(p => p.X); - int maxX = roomPoints.Max(p => p.X); - int minY = roomPoints.Min(p => p.Y); - int maxY = roomPoints.Max(p => p.Y); - - List topUnoccupiedPoints = new List(); - List bottomUnoccupiedPoints = new List(); - List leftUnoccupiedPoints = new List(); - List rightUnoccupiedPoints = new List(); + AddNormalRoomsAroundRoom(monsterRoom, dungeon); + } + } - for (int x = minX - SIDE_LENGTH_OF_NORMAL; x <= maxX + SIDE_LENGTH_OF_NORMAL; x++) + private void AddNormalRoomsAroundRoom(Room room, DungeonMap dungeon) + { + Random random = new Random(); + + var roomPoints = room.GetPointsInRoom(); + int minX = roomPoints.Min(p => p.X); + int maxX = roomPoints.Max(p => p.X); + int minY = roomPoints.Min(p => p.Y); + int maxY = roomPoints.Max(p => p.Y); + + List topUnoccupiedPoints = new List(); + List bottomUnoccupiedPoints = new List(); + List leftUnoccupiedPoints = new List(); + List rightUnoccupiedPoints = new List(); + + for (int x = minX - SIDE_LENGTH_OF_NORMAL; x <= maxX + SIDE_LENGTH_OF_NORMAL; x++) + { + Point point = new Point(x, minY - SIDE_LENGTH_OF_NORMAL); + if (dungeon.GetUnoccupiedPoints().Contains(point)) { - Point point = new Point(x, minY - SIDE_LENGTH_OF_NORMAL); - if (dungeon.GetUnoccupiedPoints().Contains(point)) - { - topUnoccupiedPoints.Add(point); - } - - point = new Point(x, maxY + SIDE_LENGTH_OF_NORMAL); - if (dungeon.GetUnoccupiedPoints().Contains(point)) - { - bottomUnoccupiedPoints.Add(point); - } + topUnoccupiedPoints.Add(point); } - for (int y = minY - SIDE_LENGTH_OF_NORMAL; y <= maxY + SIDE_LENGTH_OF_NORMAL; y++) + point = new Point(x, maxY + SIDE_LENGTH_OF_NORMAL); + if (dungeon.GetUnoccupiedPoints().Contains(point)) { - Point point = new Point(minX - SIDE_LENGTH_OF_NORMAL, y); - if (dungeon.GetUnoccupiedPoints().Contains(point)) - { - leftUnoccupiedPoints.Add(point); - } + bottomUnoccupiedPoints.Add(point); + } + } - point = new Point(maxX + SIDE_LENGTH_OF_NORMAL, y); - if (dungeon.GetUnoccupiedPoints().Contains(point)) - { - rightUnoccupiedPoints.Add(point); - } + for (int y = minY - SIDE_LENGTH_OF_NORMAL; y <= maxY + SIDE_LENGTH_OF_NORMAL; y++) + { + Point point = new Point(minX - SIDE_LENGTH_OF_NORMAL, y); + if (dungeon.GetUnoccupiedPoints().Contains(point)) + { + leftUnoccupiedPoints.Add(point); } - int minNecessaryAvailablePoints = (SIDE_LENGTH_OF_MONSTER + SIDE_LENGTH_OF_NORMAL) / 2; - - List availableSides = new List(); - if (topUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Top);} - if (bottomUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Bottom);} - if (leftUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Left);} - if (rightUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Right);} - - // Ensure between 3 and 4 rooms are added - int numRoomsToAdd = Math.Min(availableSides.Count, random.Next(3, 5)); - - // Randomly shuffle and take the required number of sides - foreach (RoomSide side in availableSides.OrderBy(_ => random.Next()).Take(numRoomsToAdd)) + point = new Point(maxX + SIDE_LENGTH_OF_NORMAL, y); + if (dungeon.GetUnoccupiedPoints().Contains(point)) { - // Select appropriate unoccupied points based on the side - List unoccupiedPointsOnSide = side switch - { - RoomSide.Top => topUnoccupiedPoints, - RoomSide.Bottom => bottomUnoccupiedPoints, - RoomSide.Left => leftUnoccupiedPoints, - RoomSide.Right => rightUnoccupiedPoints, - _ => new List() - }; + rightUnoccupiedPoints.Add(point); + } + } - // Create room and add it if valid - Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side, dungeon.GetOccupiedPoints()); - if (newRoom != null) - { - monsterRoom.AddAdjacentRoom(newRoom, side); - dungeon.AddRoom(newRoom); - } + int minNecessaryAvailablePoints = (SIDE_LENGTH_OF_MONSTER + SIDE_LENGTH_OF_NORMAL) / 2; + + List availableSides = new List(); + if (topUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Top);} + if (bottomUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Bottom);} + if (leftUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Left);} + if (rightUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Right);} + + // Ensure between 3 and 4 rooms are added + int numRoomsToAdd = Math.Min(availableSides.Count, random.Next(3, 5)); + + // Randomly shuffle and take the required number of sides + foreach (RoomSide side in availableSides.OrderBy(_ => random.Next()).Take(numRoomsToAdd)) + { + // Select appropriate unoccupied points based on the side + List unoccupiedPointsOnSide = side switch + { + RoomSide.Top => topUnoccupiedPoints, + RoomSide.Bottom => bottomUnoccupiedPoints, + RoomSide.Left => leftUnoccupiedPoints, + RoomSide.Right => rightUnoccupiedPoints, + _ => new List() + }; + + // Create room and add it if valid + Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side, dungeon.GetOccupiedPoints()); + if (newRoom != null) + { + room.AddAdjacentRoom(newRoom, side); + dungeon.AddRoom(newRoom); } } }