using System; using System.Collections.Generic; using System.Linq; using System.Text; using NUnit.Framework; 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 List _normalRooms = new List(); private Room _bossRoom; private HashSet _unoccupiedPoints = new HashSet(); private HashSet _occupiedPoints = 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.Normal: _normalRooms.Add(room); break; case RoomType.Boss: _bossRoom = room; break; default: return; } AddPointsToOccupied(room.GetPointsInRoom()); } public void AddRooms(List rooms) { if (rooms.Count == 0) return; switch (rooms[0].TypeOfRoom) { case RoomType.Monster: _monsterRooms.AddRange(rooms); break; case RoomType.Entrance: _entranceRooms.AddRange(rooms); break; case RoomType.Normal: _normalRooms.AddRange(rooms); break; default: return; } AddPointsToOccupied(rooms.SelectMany(room => room.GetPointsInRoom()).ToList()); } public List GetMonsterRooms() { return _monsterRooms; } public Room GetBossRoom() { return _bossRoom; } public List GetEntranceRooms() { return _entranceRooms; } public List GetNormalRooms() { return _normalRooms; } public HashSet GetUnoccupiedPoints() { return new HashSet(_unoccupiedPoints); } public HashSet GetOccupiedPoints() { return new HashSet(_occupiedPoints); } public void PrintMap() { List monsterRoomPoints = _monsterRooms.SelectMany(room => room.GetPointsInRoom()).ToList(); List entranceRoomPoints = _entranceRooms.SelectMany(room => room.GetPointsInRoom()).ToList(); List normalRoomPoints = _normalRooms.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++) { Point point = new Point(x, y); if (entranceRoomPoints.Contains(point)) { mapMatrix[x, y] = '*'; } else if (monsterRoomPoints.Contains(point)) { mapMatrix[x, y] = 'X'; } else if (_bossRoom.GetPointsInRoom().Contains(point)) { mapMatrix[x, y] = 'B'; } else if (normalRoomPoints.Contains(point)) { mapMatrix[x, y] = 'N'; } 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()); } private void AddPointsToOccupied(List points) { _occupiedPoints.AddRange(points); _unoccupiedPoints.ExceptWith(points); } private void RemovePointsFromOccupied(List points) { _occupiedPoints.ExceptWith(points); _unoccupiedPoints.AddRange(points); } } }