diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs index fd41df7..9a185c3 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonGenerator.cs @@ -18,79 +18,31 @@ namespace DungeonGenerator private int _xLength = 40; private int _yLength = 28; - private List _monsterRooms = new List(); - private List _entranceRooms; - private Room _bossRoom; - - public void GenerateDungeon(int length, float monsterRoomRatio) + public DungeonMap GenerateDungeon(int length, float monsterRoomRatio) { _xLength = 40; _yLength = 28; Random random = new Random(); - List pointsToExclude = new List(); + DungeonMap dungeonMap = new DungeonMap(_xLength, _yLength); - _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()); + dungeonMap.AddRooms(GenerateEntranceRooms(_xLength, _yLength, random.Next(1,4))); + dungeonMap.AddRoom(GenerateOnlyBossRoom(_xLength, _yLength, WIDTH_OF_BOSS, HEIGHT_OF_BOSS)); - EvenDisperser disperser = new EvenDisperser(_xLength, _yLength, pointsToExclude); //TODO calculate L and W from length + EvenDisperser disperser = new EvenDisperser(_xLength, _yLength, dungeonMap.GetUnoccupiedPoints()); //TODO calculate L and W from length int numberOfMonsterRooms = 7; // TODO: Calculate from ratio for (var i = 0; i < numberOfMonsterRooms; i ++) { - _monsterRooms.Add(disperser.GenerateAndPlaceRoom( + dungeonMap.AddRoom(disperser.GenerateAndPlaceRoom( SIDE_LENGTH_OF_MONSTER, SIDE_LENGTH_OF_MONSTER, RoomType.Monster)); } - } - - 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 (entranceRoomPoints.Contains(new Point(x, y))) - { - mapMatrix[x, y] = '*'; - } - else if (monsterRoomPoints.Contains(new Point(x,y))) - { - mapMatrix[x, y] = 'X'; - } - else if (_bossRoom.GetPointsInRoom().Contains(new Point(x, y))) - { - mapMatrix[x, y] = 'B'; - } - else - { - mapMatrix[x, y] = '-'; - } - } - } + + - StringBuilder sb = new StringBuilder(); - for (int j = 0; j < mapMatrix.GetLength(1); j++) - { - for (int i = 0; i < mapMatrix.GetLength(0); i++) - { - sb.Append(mapMatrix[i, j] + " "); - } - sb.Append(Environment.NewLine); - } - - Debug.Log($"{DateTime.Now}{Environment.NewLine}" + - $"X Length: {_xLength}{Environment.NewLine}" + - $"Y Length: {_yLength}{Environment.NewLine}" + - $"Monster Rooms: {_monsterRooms.Count}{Environment.NewLine}" + - sb.ToString()); + return dungeonMap; } private Room GenerateOnlyBossRoom(int xLengthOfDungeon, int yLengthOfDungeon, int width, int heigth) diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs new file mode 100644 index 0000000..8774671 --- /dev/null +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs @@ -0,0 +1,130 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Unity.VisualScripting; +using UnityEngine; + +namespace DungeonGenerator +{ + public class DungeonMap + { + private int _width; + private int _height; + private List _monsterRooms = new List(); + private List _entranceRooms = new List(); + private Room _bossRoom; + private HashSet _unoccupiedPoints = new HashSet(); + + public DungeonMap(int width, int height) + { + _width = width; + _height = height; + _unoccupiedPoints.AddRange(Enumerable.Range(0, _width) + .SelectMany(x => Enumerable.Range(0, _height) + .Select(y => new Point(x,y)))); + } + + public void AddRoom(Room room) + { + switch (room.TypeOfRoom) + { + case RoomType.Monster: + _monsterRooms.Add(room); + break; + case RoomType.Entrance: + _entranceRooms.Add(room); + break; + case RoomType.Boss: + _bossRoom = room; + break; + default: + return; + } + + _unoccupiedPoints.ExceptWith(room.GetPointsInRoom()); + } + + public void AddRooms(List rooms) + { + switch (rooms[0].TypeOfRoom) + { + case RoomType.Monster: + _monsterRooms.AddRange(rooms); + break; + case RoomType.Entrance: + _entranceRooms.AddRange(rooms); + break; + default: + return; + } + + _unoccupiedPoints.ExceptWith(rooms.SelectMany(room => room.GetPointsInRoom())); + } + + public List GetMonsterRooms() + { + return _monsterRooms; + } + + public Room GetBossRoom() + { + return _bossRoom; + } + + public List GetEntranceRooms() + { + return _entranceRooms; + } + + public HashSet GetUnoccupiedPoints() + { + return new HashSet(_unoccupiedPoints); + } + + public void PrintMap() + { + List monsterRoomPoints = _monsterRooms.SelectMany(room => room.GetPointsInRoom()).ToList(); + List entranceRoomPoints = _entranceRooms.SelectMany(room => room.GetPointsInRoom()).ToList(); + char[,] mapMatrix = new Char[_width, _height]; + for (int x = 0; x < _width; x++) + { + for (int y = 0; y < _height; y++) + { + if (entranceRoomPoints.Contains(new Point(x, y))) + { + mapMatrix[x, y] = '*'; + } + else if (monsterRoomPoints.Contains(new Point(x,y))) + { + mapMatrix[x, y] = 'X'; + } + else if (_bossRoom.GetPointsInRoom().Contains(new Point(x, y))) + { + mapMatrix[x, y] = 'B'; + } + else + { + mapMatrix[x, y] = '-'; + } + } + } + + StringBuilder sb = new StringBuilder(); + for (int j = 0; j < mapMatrix.GetLength(1); j++) + { + for (int i = 0; i < mapMatrix.GetLength(0); i++) + { + sb.Append(mapMatrix[i, j] + " "); + } + sb.Append(Environment.NewLine); + } + + Debug.Log($"{DateTime.Now}{Environment.NewLine}" + + $"X Length: {_width}{Environment.NewLine}" + + $"Y Length: {_height}{Environment.NewLine}" + + $"Monster Rooms: {_monsterRooms.Count}{Environment.NewLine}" + + sb.ToString()); + } + } +} \ No newline at end of file diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs.meta b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs.meta new file mode 100644 index 0000000..7a81d1d --- /dev/null +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/DungeonMap.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: b8c880c12ad649f8a395e6367a9c8838 +timeCreated: 1738774051 \ No newline at end of file diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/EvenDisperser.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/EvenDisperser.cs index ee3c741..cd1b169 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/EvenDisperser.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/EvenDisperser.cs @@ -15,9 +15,9 @@ namespace DungeonGenerator new Point(1000, 1000))}; private HashSet _availablePoints; - public EvenDisperser(int xLength, int yLength, List excludedPoints = null) + public EvenDisperser(int xLength, int yLength, HashSet availablePoints) { - _availablePoints = GenerateAvailablePoints(xLength, yLength, excludedPoints ?? new List()); + _availablePoints = availablePoints; } private HashSet GenerateAvailablePoints(int xLength, int yLength, List excludedPoints) diff --git a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/TestRun.cs b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/TestRun.cs index e5c4afe..54aa38d 100644 --- a/PuzzleGameProject/Assets/Scripts/DungeonGenerator/TestRun.cs +++ b/PuzzleGameProject/Assets/Scripts/DungeonGenerator/TestRun.cs @@ -1,3 +1,4 @@ +using DungeonGenerator; using UnityEngine; public class TestRun : MonoBehaviour @@ -6,8 +7,7 @@ public class TestRun : MonoBehaviour void Start() { DungeonGenerator.DungeonGenerator gen = new DungeonGenerator.DungeonGenerator(); - gen.GenerateDungeon(0 , 0.5f); - gen.PrintMap(); + DungeonMap dungeon = gen.GenerateDungeon(0 , 0.5f); + dungeon.PrintMap(); } - }