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++)
|
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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
@ -45,8 +47,8 @@ namespace DungeonGenerator
|
||||||
default:
|
default:
|
||||||
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()
|
||||||
|
|
@ -95,6 +97,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()
|
||||||
{
|
{
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue