Implemented room generation around boss room.

This commit is contained in:
Max 2025-02-07 09:15:40 +01:00
parent fe1c11aeef
commit 2baa78bd90

View file

@ -42,88 +42,99 @@ namespace DungeonGenerator
} }
AddNormalRoomsAroundMonsterRooms(dungeonMap); AddNormalRoomsAroundMonsterRooms(dungeonMap);
AddNormalRoomsAroundBossRoom(dungeonMap);
return dungeonMap; return dungeonMap;
} }
private void AddNormalRoomsAroundBossRoom(DungeonMap dungeon)
{
AddNormalRoomsAroundRoom(dungeon.GetBossRoom(), dungeon);
}
private void AddNormalRoomsAroundMonsterRooms(DungeonMap dungeon) private void AddNormalRoomsAroundMonsterRooms(DungeonMap dungeon)
{ {
HashSet<Point> unoccupiedPoints = dungeon.GetUnoccupiedPoints();
Random random = new Random();
foreach (Room monsterRoom in dungeon.GetMonsterRooms()) foreach (Room monsterRoom in dungeon.GetMonsterRooms())
{ {
var roomPoints = monsterRoom.GetPointsInRoom(); AddNormalRoomsAroundRoom(monsterRoom, dungeon);
int minX = roomPoints.Min(p => p.X); }
int maxX = roomPoints.Max(p => p.X); }
int minY = roomPoints.Min(p => p.Y);
int maxY = roomPoints.Max(p => p.Y);
List<Point> topUnoccupiedPoints = new List<Point>(); private void AddNormalRoomsAroundRoom(Room room, DungeonMap dungeon)
List<Point> bottomUnoccupiedPoints = new List<Point>(); {
List<Point> leftUnoccupiedPoints = new List<Point>(); Random random = new Random();
List<Point> rightUnoccupiedPoints = new List<Point>();
for (int x = minX - SIDE_LENGTH_OF_NORMAL; x <= maxX + SIDE_LENGTH_OF_NORMAL; x++) var roomPoints = room.GetPointsInRoom();
int minX = roomPoints.Min(p => p.X);
int maxX = roomPoints.Max(p => p.X);
int minY = roomPoints.Min(p => p.Y);
int maxY = roomPoints.Max(p => p.Y);
List<Point> topUnoccupiedPoints = new List<Point>();
List<Point> bottomUnoccupiedPoints = new List<Point>();
List<Point> leftUnoccupiedPoints = new List<Point>();
List<Point> rightUnoccupiedPoints = new List<Point>();
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);
if (dungeon.GetUnoccupiedPoints().Contains(point))
{ {
Point point = new Point(x, minY - SIDE_LENGTH_OF_NORMAL); topUnoccupiedPoints.Add(point);
if (dungeon.GetUnoccupiedPoints().Contains(point))
{
topUnoccupiedPoints.Add(point);
}
point = new Point(x, maxY + SIDE_LENGTH_OF_NORMAL);
if (dungeon.GetUnoccupiedPoints().Contains(point))
{
bottomUnoccupiedPoints.Add(point);
}
} }
for (int y = minY - SIDE_LENGTH_OF_NORMAL; y <= maxY + SIDE_LENGTH_OF_NORMAL; y++) point = new Point(x, maxY + SIDE_LENGTH_OF_NORMAL);
if (dungeon.GetUnoccupiedPoints().Contains(point))
{ {
Point point = new Point(minX - SIDE_LENGTH_OF_NORMAL, y); bottomUnoccupiedPoints.Add(point);
if (dungeon.GetUnoccupiedPoints().Contains(point)) }
{ }
leftUnoccupiedPoints.Add(point);
}
point = new Point(maxX + SIDE_LENGTH_OF_NORMAL, y); for (int y = minY - SIDE_LENGTH_OF_NORMAL; y <= maxY + SIDE_LENGTH_OF_NORMAL; y++)
if (dungeon.GetUnoccupiedPoints().Contains(point)) {
{ Point point = new Point(minX - SIDE_LENGTH_OF_NORMAL, y);
rightUnoccupiedPoints.Add(point); if (dungeon.GetUnoccupiedPoints().Contains(point))
} {
leftUnoccupiedPoints.Add(point);
} }
int minNecessaryAvailablePoints = (SIDE_LENGTH_OF_MONSTER + SIDE_LENGTH_OF_NORMAL) / 2; point = new Point(maxX + SIDE_LENGTH_OF_NORMAL, y);
if (dungeon.GetUnoccupiedPoints().Contains(point))
List<RoomSide> availableSides = new List<RoomSide>();
if (topUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Top);}
if (bottomUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Bottom);}
if (leftUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Left);}
if (rightUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Right);}
// Ensure between 3 and 4 rooms are added
int numRoomsToAdd = Math.Min(availableSides.Count, random.Next(3, 5));
// Randomly shuffle and take the required number of sides
foreach (RoomSide side in availableSides.OrderBy(_ => random.Next()).Take(numRoomsToAdd))
{ {
// Select appropriate unoccupied points based on the side rightUnoccupiedPoints.Add(point);
List<Point> unoccupiedPointsOnSide = side switch }
{ }
RoomSide.Top => topUnoccupiedPoints,
RoomSide.Bottom => bottomUnoccupiedPoints,
RoomSide.Left => leftUnoccupiedPoints,
RoomSide.Right => rightUnoccupiedPoints,
_ => new List<Point>()
};
// Create room and add it if valid int minNecessaryAvailablePoints = (SIDE_LENGTH_OF_MONSTER + SIDE_LENGTH_OF_NORMAL) / 2;
Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side, dungeon.GetOccupiedPoints());
if (newRoom != null) List<RoomSide> availableSides = new List<RoomSide>();
{ if (topUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Top);}
monsterRoom.AddAdjacentRoom(newRoom, side); if (bottomUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Bottom);}
dungeon.AddRoom(newRoom); if (leftUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Left);}
} if (rightUnoccupiedPoints.Count >= minNecessaryAvailablePoints){availableSides.Add(RoomSide.Right);}
// Ensure between 3 and 4 rooms are added
int numRoomsToAdd = Math.Min(availableSides.Count, random.Next(3, 5));
// Randomly shuffle and take the required number of sides
foreach (RoomSide side in availableSides.OrderBy(_ => random.Next()).Take(numRoomsToAdd))
{
// Select appropriate unoccupied points based on the side
List<Point> unoccupiedPointsOnSide = side switch
{
RoomSide.Top => topUnoccupiedPoints,
RoomSide.Bottom => bottomUnoccupiedPoints,
RoomSide.Left => leftUnoccupiedPoints,
RoomSide.Right => rightUnoccupiedPoints,
_ => new List<Point>()
};
// Create room and add it if valid
Room newRoom = CreateAdjacentRoom(RoomType.Normal, unoccupiedPointsOnSide, side, dungeon.GetOccupiedPoints());
if (newRoom != null)
{
room.AddAdjacentRoom(newRoom, side);
dungeon.AddRoom(newRoom);
} }
} }
} }