Fixed most of the collisions around the monster rooms. It stillhas a pretty good chance of happening.
This commit is contained in:
parent
eb7c43a4f1
commit
9ccdba1fdc
2 changed files with 39 additions and 18 deletions
|
|
@ -66,13 +66,13 @@ namespace DungeonGenerator
|
|||
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 (unoccupiedPoints.Contains(point))
|
||||
if (dungeon.GetUnoccupiedPoints().Contains(point))
|
||||
{
|
||||
topUnoccupiedPoints.Add(point);
|
||||
}
|
||||
|
||||
point = new Point(x, maxY + SIDE_LENGTH_OF_NORMAL);
|
||||
if (unoccupiedPoints.Contains(point))
|
||||
if (dungeon.GetUnoccupiedPoints().Contains(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++)
|
||||
{
|
||||
Point point = new Point(minX - SIDE_LENGTH_OF_NORMAL, y);
|
||||
if (unoccupiedPoints.Contains(point))
|
||||
if (dungeon.GetUnoccupiedPoints().Contains(point))
|
||||
{
|
||||
leftUnoccupiedPoints.Add(point);
|
||||
}
|
||||
|
||||
point = new Point(maxX + SIDE_LENGTH_OF_NORMAL, y);
|
||||
if (unoccupiedPoints.Contains(point))
|
||||
if (dungeon.GetUnoccupiedPoints().Contains(point))
|
||||
{
|
||||
rightUnoccupiedPoints.Add(point);
|
||||
}
|
||||
|
|
@ -105,7 +105,6 @@ namespace DungeonGenerator
|
|||
int numRoomsToAdd = Math.Min(availableSides.Count, random.Next(3, 5));
|
||||
|
||||
// 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))
|
||||
{
|
||||
// Select appropriate unoccupied points based on the side
|
||||
|
|
@ -119,18 +118,17 @@ namespace DungeonGenerator
|
|||
};
|
||||
|
||||
// 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)
|
||||
{
|
||||
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);
|
||||
Random random = new Random();
|
||||
|
|
@ -164,16 +162,20 @@ namespace DungeonGenerator
|
|||
_ => 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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If there are valid placements, select a random one and create the room
|
||||
if (validPlacements.Any())
|
||||
{
|
||||
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
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ using System;
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using NUnit.Framework;
|
||||
using Unity.VisualScripting;
|
||||
using UnityEngine;
|
||||
|
||||
|
|
@ -16,6 +17,7 @@ namespace DungeonGenerator
|
|||
private List<Room> _normalRooms = new List<Room>();
|
||||
private Room _bossRoom;
|
||||
private HashSet<Point> _unoccupiedPoints = new HashSet<Point>();
|
||||
private HashSet<Point> _occupiedPoints = new HashSet<Point>();
|
||||
|
||||
public DungeonMap(int width, int height)
|
||||
{
|
||||
|
|
@ -46,7 +48,7 @@ namespace DungeonGenerator
|
|||
return;
|
||||
}
|
||||
|
||||
_unoccupiedPoints.ExceptWith(room.GetPointsInRoom());
|
||||
AddPointsToOccupied(room.GetPointsInRoom());
|
||||
}
|
||||
|
||||
public void AddRooms(List<Room> rooms)
|
||||
|
|
@ -68,7 +70,7 @@ namespace DungeonGenerator
|
|||
return;
|
||||
}
|
||||
|
||||
_unoccupiedPoints.ExceptWith(rooms.SelectMany(room => room.GetPointsInRoom()));
|
||||
AddPointsToOccupied(rooms.SelectMany(room => room.GetPointsInRoom()).ToList());
|
||||
}
|
||||
|
||||
public List<Room> GetMonsterRooms()
|
||||
|
|
@ -96,6 +98,11 @@ namespace DungeonGenerator
|
|||
return new HashSet<Point>(_unoccupiedPoints);
|
||||
}
|
||||
|
||||
public HashSet<Point> GetOccupiedPoints()
|
||||
{
|
||||
return new HashSet<Point>(_occupiedPoints);
|
||||
}
|
||||
|
||||
public void PrintMap()
|
||||
{
|
||||
List<Point> monsterRoomPoints = _monsterRooms.SelectMany(room => room.GetPointsInRoom()).ToList();
|
||||
|
|
@ -146,5 +153,17 @@ namespace DungeonGenerator
|
|||
$"Monster Rooms: {_monsterRooms.Count}{Environment.NewLine}" +
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue