Implemented room generation around boss room.
This commit is contained in:
parent
fe1c11aeef
commit
2baa78bd90
1 changed files with 75 additions and 64 deletions
|
|
@ -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>();
|
|
||||||
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++)
|
private void AddNormalRoomsAroundRoom(Room room, DungeonMap dungeon)
|
||||||
|
{
|
||||||
|
Random random = new Random();
|
||||||
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue