From 8ed53b63841b2251da856b94dd5f9c9eae7f3dd6 Mon Sep 17 00:00:00 2001 From: Max Date: Wed, 5 Feb 2025 17:42:28 +0100 Subject: [PATCH] Implemented boss room generation and adding to the dungeon. --- .../DungeonGenerator/DungeonGenerator.cs | 37 ++++++++++++++++--- .../Assets/Scripts/DungeonGenerator/Room.cs | 1 + 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs index e959c75..fd41df7 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs @@ -12,11 +12,15 @@ namespace DungeonGenerator { private const int SIDE_LENGTH_OF_MONSTER = 4; private const int SIDE_LENGTH_OF_NORMAL = 2; + private const int WIDTH_OF_BOSS = 10; + private const int HEIGHT_OF_BOSS = 6; - private List _monsterRooms = new List(); private int _xLength = 40; private int _yLength = 28; - private List _entrancePoints; + + private List _monsterRooms = new List(); + private List _entranceRooms; + private Room _bossRoom; public void GenerateDungeon(int length, float monsterRoomRatio) { @@ -24,10 +28,15 @@ namespace DungeonGenerator _yLength = 28; Random random = new Random(); - List entranceRooms = GenerateEntranceRooms(_xLength, _yLength, random.Next(1,4)); - _entrancePoints = entranceRooms.SelectMany(room => room.GetPointsInRoom()).ToList(); + List pointsToExclude = new List(); - EvenDisperser disperser = new EvenDisperser(_xLength, _yLength, _entrancePoints); //TODO calculate L and W from length + _entranceRooms = GenerateEntranceRooms(_xLength, _yLength, random.Next(1,4)); + pointsToExclude.AddRange(_entranceRooms.SelectMany(room => room.GetPointsInRoom()).ToList()); + + _bossRoom = GenerateOnlyBossRoom(_xLength, _yLength, WIDTH_OF_BOSS, HEIGHT_OF_BOSS); + pointsToExclude.AddRange(_bossRoom.GetPointsInRoom()); + + EvenDisperser disperser = new EvenDisperser(_xLength, _yLength, pointsToExclude); //TODO calculate L and W from length int numberOfMonsterRooms = 7; // TODO: Calculate from ratio for (var i = 0; i < numberOfMonsterRooms; i ++) @@ -42,12 +51,13 @@ namespace DungeonGenerator public void PrintMap() { List monsterRoomPoints = _monsterRooms.SelectMany(room => room.GetPointsInRoom()).ToList(); + List entranceRoomPoints = _entranceRooms.SelectMany(room => room.GetPointsInRoom()).ToList(); char[,] mapMatrix = new Char[_xLength, _yLength]; for (int x = 0; x < _xLength; x++) { for (int y = 0; y < _yLength; y++) { - if (_entrancePoints.Contains(new Point(x, y))) + if (entranceRoomPoints.Contains(new Point(x, y))) { mapMatrix[x, y] = '*'; } @@ -55,6 +65,10 @@ namespace DungeonGenerator { mapMatrix[x, y] = 'X'; } + else if (_bossRoom.GetPointsInRoom().Contains(new Point(x, y))) + { + mapMatrix[x, y] = 'B'; + } else { mapMatrix[x, y] = '-'; @@ -79,6 +93,17 @@ namespace DungeonGenerator sb.ToString()); } + private Room GenerateOnlyBossRoom(int xLengthOfDungeon, int yLengthOfDungeon, int width, int heigth) + { + // Place monster room in the middle third + int middleAreaX = xLengthOfDungeon / 3; + int middleAreaY = yLengthOfDungeon / 3; + Random random = new Random(); + int bossX = middleAreaX + random.Next(0, middleAreaX - width); + int bossY = middleAreaY + random.Next(0, middleAreaY - heigth); + return new Room(RoomType.Boss, width, heigth, new Point(bossX, bossY)); + } + private enum Side { Top, diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/Room.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/Room.cs index 69513ae..aeb67b4 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/Room.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/Room.cs @@ -7,6 +7,7 @@ namespace DungeonGenerator Normal, Entrance, Monster, + Boss } public class Room