Fixed most of the collisions around the monster rooms. It stillhas a pretty good chance of happening.

This commit is contained in:
Max 2025-02-06 16:38:57 +01:00
parent eb7c43a4f1
commit 9ccdba1fdc
2 changed files with 39 additions and 18 deletions

View file

@ -66,13 +66,13 @@ namespace DungeonGenerator
for (int x = minX - SIDE_LENGTH_OF_NORMAL; x <= maxX + SIDE_LENGTH_OF_NORMAL; x++) for (int x = minX - SIDE_LENGTH_OF_NORMAL; x <= maxX + SIDE_LENGTH_OF_NORMAL; x++)
{ {
Point point = new Point(x, minY - SIDE_LENGTH_OF_NORMAL); Point point = new Point(x, minY - SIDE_LENGTH_OF_NORMAL);
if (unoccupiedPoints.Contains(point)) if (dungeon.GetUnoccupiedPoints().Contains(point))
{ {
topUnoccupiedPoints.Add(point); topUnoccupiedPoints.Add(point);
} }
point = new Point(x, maxY + SIDE_LENGTH_OF_NORMAL); point = new Point(x, maxY + SIDE_LENGTH_OF_NORMAL);
if (unoccupiedPoints.Contains(point)) if (dungeon.GetUnoccupiedPoints().Contains(point))
{ {
bottomUnoccupiedPoints.Add(point); bottomUnoccupiedPoints.Add(point);
} }
@ -81,13 +81,13 @@ namespace DungeonGenerator
for (int y = minY - SIDE_LENGTH_OF_NORMAL; y <= maxY + SIDE_LENGTH_OF_NORMAL; y++) for (int y = minY - SIDE_LENGTH_OF_NORMAL; y <= maxY + SIDE_LENGTH_OF_NORMAL; y++)
{ {
Point point = new Point(minX - SIDE_LENGTH_OF_NORMAL, y); Point point = new Point(minX - SIDE_LENGTH_OF_NORMAL, y);
if (unoccupiedPoints.Contains(point)) if (dungeon.GetUnoccupiedPoints().Contains(point))
{ {
leftUnoccupiedPoints.Add(point); leftUnoccupiedPoints.Add(point);
} }
point = new Point(maxX + SIDE_LENGTH_OF_NORMAL, y); point = new Point(maxX + SIDE_LENGTH_OF_NORMAL, y);
if (unoccupiedPoints.Contains(point)) if (dungeon.GetUnoccupiedPoints().Contains(point))
{ {
rightUnoccupiedPoints.Add(point); rightUnoccupiedPoints.Add(point);
} }
@ -105,7 +105,6 @@ namespace DungeonGenerator
int numRoomsToAdd = Math.Min(availableSides.Count, random.Next(3, 5)); int numRoomsToAdd = Math.Min(availableSides.Count, random.Next(3, 5));
// Randomly shuffle and take the required number of sides // Randomly shuffle and take the required number of sides
List<Room> newRooms = new List<Room>();
foreach (RoomSide side in availableSides.OrderBy(_ => random.Next()).Take(numRoomsToAdd)) foreach (RoomSide side in availableSides.OrderBy(_ => random.Next()).Take(numRoomsToAdd))
{ {
// Select appropriate unoccupied points based on the side // Select appropriate unoccupied points based on the side
@ -119,18 +118,17 @@ namespace DungeonGenerator
}; };
// Create room and add it if valid // Create room and add it if valid
Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side); Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side, dungeon.GetOccupiedPoints());
if (newRoom != null) if (newRoom != null)
{ {
monsterRoom.AddAdjacentRoom(newRoom, side); monsterRoom.AddAdjacentRoom(newRoom, side);
newRooms.Add(newRoom); dungeon.AddRoom(newRoom);
} }
} }
dungeon.AddRooms(newRooms);
} }
} }
private Room CreateAdjacentRoom(RoomType type, List<Point> unoccupiedPointsOnSide, RoomSide side) private Room CreateAdjacentRoom(RoomType type, List<Point> unoccupiedPointsOnSide, RoomSide side, HashSet<Point> occupiedPoints)
{ {
int sizeOfNewRoom = GetRoomSizeByType(type); int sizeOfNewRoom = GetRoomSizeByType(type);
Random random = new Random(); Random random = new Random();
@ -158,14 +156,16 @@ namespace DungeonGenerator
Point adjustedPoint = side switch Point adjustedPoint = side switch
{ {
RoomSide.Top => new Point(firstPoint.X, firstPoint.Y), // Move up for top side RoomSide.Top => new Point(firstPoint.X, firstPoint.Y), // Move up for top side
RoomSide.Bottom => new Point(firstPoint.X, firstPoint.Y - 1), // Move down for bottom side RoomSide.Bottom => new Point(firstPoint.X, firstPoint.Y - 1), // Move down for bottom side
RoomSide.Left => new Point(firstPoint.X, firstPoint.Y), // Move left for left side RoomSide.Left => new Point(firstPoint.X, firstPoint.Y), // Move left for left side
RoomSide.Right => new Point(firstPoint.X - 1, firstPoint.Y), // Move right for right side RoomSide.Right => new Point(firstPoint.X - 1, firstPoint.Y), // Move right for right side
_ => firstPoint // Default case (shouldn't happen) _ => firstPoint // Default case (shouldn't happen)
}; };
// If the points are wide enough, store the top-left point for the room if (!potentialPoints.Any(occupiedPoints.Contains))
validPlacements.Add(adjustedPoint); // First point is the top-left point of the room {
validPlacements.Add(adjustedPoint); // First point is the top-left point of the room
}
} }
} }
@ -173,7 +173,9 @@ namespace DungeonGenerator
if (validPlacements.Any()) if (validPlacements.Any())
{ {
Point randomPlacement = validPlacements[random.Next(validPlacements.Count)]; Point randomPlacement = validPlacements[random.Next(validPlacements.Count)];
return new Room(type, sizeOfNewRoom, sizeOfNewRoom, randomPlacement); Room newRoom = new Room(type, sizeOfNewRoom, sizeOfNewRoom, randomPlacement);
return newRoom;
} }
// If no valid placements are found, return null or handle it as necessary // If no valid placements are found, return null or handle it as necessary

View file

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using NUnit.Framework;
using Unity.VisualScripting; using Unity.VisualScripting;
using UnityEngine; using UnityEngine;
@ -16,6 +17,7 @@ namespace DungeonGenerator
private List<Room> _normalRooms = new List<Room>(); private List<Room> _normalRooms = new List<Room>();
private Room _bossRoom; private Room _bossRoom;
private HashSet<Point> _unoccupiedPoints = new HashSet<Point>(); private HashSet<Point> _unoccupiedPoints = new HashSet<Point>();
private HashSet<Point> _occupiedPoints = new HashSet<Point>();
public DungeonMap(int width, int height) public DungeonMap(int width, int height)
{ {
@ -46,7 +48,7 @@ namespace DungeonGenerator
return; return;
} }
_unoccupiedPoints.ExceptWith(room.GetPointsInRoom()); AddPointsToOccupied(room.GetPointsInRoom());
} }
public void AddRooms(List<Room> rooms) public void AddRooms(List<Room> rooms)
@ -68,7 +70,7 @@ namespace DungeonGenerator
return; return;
} }
_unoccupiedPoints.ExceptWith(rooms.SelectMany(room => room.GetPointsInRoom())); AddPointsToOccupied(rooms.SelectMany(room => room.GetPointsInRoom()).ToList());
} }
public List<Room> GetMonsterRooms() public List<Room> GetMonsterRooms()
@ -96,6 +98,11 @@ namespace DungeonGenerator
return new HashSet<Point>(_unoccupiedPoints); return new HashSet<Point>(_unoccupiedPoints);
} }
public HashSet<Point> GetOccupiedPoints()
{
return new HashSet<Point>(_occupiedPoints);
}
public void PrintMap() public void PrintMap()
{ {
List<Point> monsterRoomPoints = _monsterRooms.SelectMany(room => room.GetPointsInRoom()).ToList(); List<Point> monsterRoomPoints = _monsterRooms.SelectMany(room => room.GetPointsInRoom()).ToList();
@ -146,5 +153,17 @@ namespace DungeonGenerator
$"Monster Rooms: {_monsterRooms.Count}{Environment.NewLine}" + $"Monster Rooms: {_monsterRooms.Count}{Environment.NewLine}" +
sb.ToString()); sb.ToString());
} }
private void AddPointsToOccupied(List<Point> points)
{
_occupiedPoints.AddRange(points);
_unoccupiedPoints.ExceptWith(points);
}
private void RemovePointsFromOccupied(List<Point> points)
{
_occupiedPoints.ExceptWith(points);
_unoccupiedPoints.AddRange(points);
}
} }
} }