using System; using System.Collections.Generic; using System.Linq; using System.Text; using Newtonsoft.Json; namespace DungeonMapGenerator { public class DungeonMap { [JsonProperty("Width")] public int Width; [JsonProperty("Height")] public int Height; [JsonProperty("MonsterRooms")] private List _monsterRooms = new List(); [JsonProperty("EntranceRooms")] private List _entranceRooms = new List(); [JsonProperty("NormalRooms")] private List _normalRooms = new List(); [JsonProperty("BossRoom")] private Room _bossRoom; private HashSet _unoccupiedPoints = new HashSet(); private HashSet _occupiedPoints = new HashSet(); public DungeonMap(){ } public DungeonMap(int width, int height) { this.Width = width; Height = height; _unoccupiedPoints.AddRange(Enumerable.Range(0, this.Width) .SelectMany(x => Enumerable.Range(0, Height) .Select(y => new Point(x,y)))); } public Dictionary GetPointRoomIdMapping() { var pointRoomMap = new Dictionary(); foreach (var room in GetAllRooms()) { foreach (var point in room.GetPointsInRoom()) { pointRoomMap[point] = room.Id; } } return pointRoomMap; } public List GetAllRooms() { List allRooms = new List(); allRooms.AddRange(_monsterRooms); allRooms.AddRange(_normalRooms); allRooms.AddRange(_entranceRooms); allRooms.Add(_bossRoom); return allRooms; } 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 string GetMapAsString() { 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); } return $"{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); } // Node rooms are the rooms placed around each monster room and the boss room. public List GetNodeRooms() { List nodeRooms = new List(); nodeRooms.AddRange(_monsterRooms.SelectMany(room => room.GetAdjacentRooms())); nodeRooms.AddRange(_bossRoom.GetAdjacentRooms()); return nodeRooms; } public Dictionary> GetNodesWithSides() { Dictionary> nodesWithSides = new Dictionary>(); foreach (Room room in _monsterRooms) { foreach (var kvp in room.GetAdjacentRoomsDict()) { if (!nodesWithSides.ContainsKey(kvp.Key)) { nodesWithSides[kvp.Key] = new List(kvp.Value); } else { nodesWithSides[kvp.Key].AddRange(kvp.Value); } } } return nodesWithSides; } } }