From 9ccdba1fdc014397fbb5a5e90bc06e4e09a7b54f Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 6 Feb 2025 16:38:57 +0100 Subject: [PATCH] Fixed most of the collisions around the monster rooms. It stillhas a pretty good chance of happening. --- .../DungeonGenerator/DungeonGenerator.cs | 32 ++++++++++--------- .../Scripts/DungeonGenerator/DungeonMap.cs | 25 +++++++++++++-- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs index f39023c..aa9ba20 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs @@ -66,13 +66,13 @@ namespace DungeonGenerator 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 (unoccupiedPoints.Contains(point)) + if (dungeon.GetUnoccupiedPoints().Contains(point)) { topUnoccupiedPoints.Add(point); } point = new Point(x, maxY + SIDE_LENGTH_OF_NORMAL); - if (unoccupiedPoints.Contains(point)) + if (dungeon.GetUnoccupiedPoints().Contains(point)) { bottomUnoccupiedPoints.Add(point); } @@ -81,13 +81,13 @@ namespace DungeonGenerator 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 (unoccupiedPoints.Contains(point)) + if (dungeon.GetUnoccupiedPoints().Contains(point)) { leftUnoccupiedPoints.Add(point); } point = new Point(maxX + SIDE_LENGTH_OF_NORMAL, y); - if (unoccupiedPoints.Contains(point)) + if (dungeon.GetUnoccupiedPoints().Contains(point)) { rightUnoccupiedPoints.Add(point); } @@ -105,7 +105,6 @@ namespace DungeonGenerator int numRoomsToAdd = Math.Min(availableSides.Count, random.Next(3, 5)); // Randomly shuffle and take the required number of sides - List newRooms = new List(); foreach (RoomSide side in availableSides.OrderBy(_ => random.Next()).Take(numRoomsToAdd)) { // Select appropriate unoccupied points based on the side @@ -119,18 +118,17 @@ namespace DungeonGenerator }; // Create room and add it if valid - Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side); + Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side, dungeon.GetOccupiedPoints()); if (newRoom != null) { monsterRoom.AddAdjacentRoom(newRoom, side); - newRooms.Add(newRoom); + dungeon.AddRoom(newRoom); } } - dungeon.AddRooms(newRooms); } } - private Room CreateAdjacentRoom(RoomType type, List unoccupiedPointsOnSide, RoomSide side) + private Room CreateAdjacentRoom(RoomType type, List unoccupiedPointsOnSide, RoomSide side, HashSet occupiedPoints) { int sizeOfNewRoom = GetRoomSizeByType(type); Random random = new Random(); @@ -158,14 +156,16 @@ namespace DungeonGenerator Point adjustedPoint = side switch { RoomSide.Top => new Point(firstPoint.X, firstPoint.Y), // Move up for top side - RoomSide.Bottom => new Point(firstPoint.X, firstPoint.Y - 1), // Move down for bottom side + RoomSide.Bottom => new Point(firstPoint.X, firstPoint.Y - 1), // Move down for bottom side RoomSide.Left => new Point(firstPoint.X, firstPoint.Y), // Move left for left side - RoomSide.Right => new Point(firstPoint.X - 1, firstPoint.Y), // Move right for right side + RoomSide.Right => new Point(firstPoint.X - 1, firstPoint.Y), // Move right for right side _ => firstPoint // Default case (shouldn't happen) }; - - // If the points are wide enough, store the top-left point for the room - validPlacements.Add(adjustedPoint); // First point is the top-left point of the room + + if (!potentialPoints.Any(occupiedPoints.Contains)) + { + validPlacements.Add(adjustedPoint); // First point is the top-left point of the room + } } } @@ -173,7 +173,9 @@ namespace DungeonGenerator if (validPlacements.Any()) { Point randomPlacement = validPlacements[random.Next(validPlacements.Count)]; - return new Room(type, sizeOfNewRoom, sizeOfNewRoom, randomPlacement); + Room newRoom = new Room(type, sizeOfNewRoom, sizeOfNewRoom, randomPlacement); + + return newRoom; } // If no valid placements are found, return null or handle it as necessary diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs index 6a9080f..1288d67 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using NUnit.Framework; using Unity.VisualScripting; using UnityEngine; @@ -16,6 +17,7 @@ namespace DungeonGenerator private List _normalRooms = new List(); private Room _bossRoom; private HashSet _unoccupiedPoints = new HashSet(); + private HashSet _occupiedPoints = new HashSet(); public DungeonMap(int width, int height) { @@ -45,8 +47,8 @@ namespace DungeonGenerator default: return; } - - _unoccupiedPoints.ExceptWith(room.GetPointsInRoom()); + + AddPointsToOccupied(room.GetPointsInRoom()); } public void AddRooms(List rooms) @@ -68,7 +70,7 @@ namespace DungeonGenerator return; } - _unoccupiedPoints.ExceptWith(rooms.SelectMany(room => room.GetPointsInRoom())); + AddPointsToOccupied(rooms.SelectMany(room => room.GetPointsInRoom()).ToList()); } public List GetMonsterRooms() @@ -95,6 +97,11 @@ namespace DungeonGenerator { return new HashSet(_unoccupiedPoints); } + + public HashSet GetOccupiedPoints() + { + return new HashSet(_occupiedPoints); + } public void PrintMap() { @@ -146,5 +153,17 @@ namespace DungeonGenerator $"Monster Rooms: {_monsterRooms.Count}{Environment.NewLine}" + sb.ToString()); } + + private void AddPointsToOccupied(List points) + { + _occupiedPoints.AddRange(points); + _unoccupiedPoints.ExceptWith(points); + } + + private void RemovePointsFromOccupied(List points) + { + _occupiedPoints.ExceptWith(points); + _unoccupiedPoints.AddRange(points); + } } } \ No newline at end of file