From eb7c43a4f15ea9dd872a83f01e367855b4b898b4 Mon Sep 17 00:00:00 2001 From: Max Date: Thu, 6 Feb 2025 15:02:21 +0100 Subject: [PATCH] Implemented bi-directional linking between rooms --- .../DungeonGenerator/DungeonGenerator.cs | 9 +-- .../Assets/Scripts/DungeonGenerator/Room.cs | 68 ++++++++----------- 2 files changed, 30 insertions(+), 47 deletions(-) diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs index 3da0ab8..f39023c 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs @@ -46,14 +46,6 @@ namespace DungeonGenerator return dungeonMap; } - enum RoomSide - { - Top, - Bottom, - Left, - Right - } - private void AddNormalRoomsAroundMonsterRooms(DungeonMap dungeon) { HashSet unoccupiedPoints = dungeon.GetUnoccupiedPoints(); @@ -130,6 +122,7 @@ namespace DungeonGenerator Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side); if (newRoom != null) { + monsterRoom.AddAdjacentRoom(newRoom, side); newRooms.Add(newRoom); } } diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/Room.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/Room.cs index 18719a8..b988324 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/Room.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/Room.cs @@ -1,9 +1,17 @@ +using System; using System.Collections.Generic; using NUnit.Framework; using Unity.VisualScripting; namespace DungeonGenerator { + public enum RoomSide + { + Top, + Bottom, + Left, + Right + } public enum RoomType { Normal, @@ -22,10 +30,7 @@ namespace DungeonGenerator PositionOfTopLeft = positionOfTopLeft; } - private List _topAdjacentRooms = new List(); - private List _bottomAdjacentRooms = new List(); - private List _leftAdjacentRooms = new List(); - private List _rightAdjacentRooms = new List(); + private readonly Dictionary> _adjacentRooms = new(); public RoomType TypeOfRoom { get; set; } public int Height { get; set; } @@ -58,44 +63,29 @@ namespace DungeonGenerator return new Point(PositionOfTopLeft.X + Width / 2, PositionOfTopLeft.Y + Height / 2); } - public void AddTopAdjacentRoom(Room room) + public void AddAdjacentRoom(Room room, RoomSide side) { - _topAdjacentRooms.Add(room); + if (!_adjacentRooms.ContainsKey(side)) + { + _adjacentRooms[side] = new List(); + } + + // Prevent duplicates + if (!_adjacentRooms[side].Contains(room)) + { + _adjacentRooms[side].Add(room); + room.AddAdjacentRoom(this, GetOppositeSide(side)); // Ensure bidirectional linkage + } } - public List GetTopAdjaceRooms() + // Helper method to get the opposite side + private RoomSide GetOppositeSide(RoomSide side) => side switch { - return _topAdjacentRooms; - } - - public void AddBottomAdjacentRoom(Room room) - { - _bottomAdjacentRooms.Add(room); - } - - public List GetBottomAdjaceRooms() - { - return _bottomAdjacentRooms; - } - - public void AddLeftAdjacentRoom(Room room) - { - _leftAdjacentRooms.Add(room); - } - - public List GetLeftAdjaceRooms() - { - return _leftAdjacentRooms; - } - - public void AddRightAdjacentRoom(Room room) - { - _rightAdjacentRooms.Add(room); - } - - public List GetRightAdjaceRooms() - { - return _rightAdjacentRooms; - } + RoomSide.Top => RoomSide.Bottom, + RoomSide.Bottom => RoomSide.Top, + RoomSide.Left => RoomSide.Right, + RoomSide.Right => RoomSide.Left, + _ => throw new ArgumentException("Invalid RoomSide", nameof(side)) + }; } } \ No newline at end of file