Implemented adding rooms to entrance rooms that didn't have an adjacent non entrance room.

This commit is contained in:
Max 2025-02-20 10:11:45 +01:00
parent 0d8fe18849
commit 807656b112
7 changed files with 51 additions and 35 deletions

View file

@ -13,8 +13,8 @@ class Program
var generator = new DungeonGenerator(); var generator = new DungeonGenerator();
// Call the method you want to run // Call the method you want to run
int width = 30; int width = 100;
int height = 20; int height = 50;
DungeonMap map = generator.GenerateDungeon(width, height, 5); DungeonMap map = generator.GenerateDungeon(width, height, 5);
DungeonLockPopulator.PopulateLocksOfDungeon(map); DungeonLockPopulator.PopulateLocksOfDungeon(map);
DungeonMapSerializer.SerializeToFile(map, SAVED_DUNGEONS_PATH, $"{DUNGEON_NAME} {width}x{height}" ); DungeonMapSerializer.SerializeToFile(map, SAVED_DUNGEONS_PATH, $"{DUNGEON_NAME} {width}x{height}" );

View file

@ -42,57 +42,65 @@ namespace DungeonMapGenerator
AddNormalRoomsAroundBossRoom(dungeonMap); AddNormalRoomsAroundBossRoom(dungeonMap);
AddConnectionRooms(dungeonMap); AddConnectionRooms(dungeonMap);
ConnectAllAdjacentRooms(dungeonMap); ConnectAllAdjacentRooms(dungeonMap);
AddAdjacentRoomsToEntranceRooms(dungeonMap);
return dungeonMap; return dungeonMap;
} }
private void AddAdjacentRoomsToEntranceRooms(DungeonMap dungeon)
{
List<Room> entranceRooms = dungeon.GetEntranceRooms();
List<Room> roomsToAddRoomsTowards = dungeon.GetNodeRooms();
List<Room> obstructions = dungeon.GetRootRooms();
foreach (Room entranceRoom in entranceRooms)
{
if (entranceRoom.GetAdjacentRooms().All(adjacent => adjacent.TypeOfRoom == RoomType.Entrance))
{
Room closestRoom = null;
foreach (RoomSide side in Enum.GetValues(typeof(RoomSide)))
{
Room closestRoomOnSide = FindClosestSeenConnection(entranceRoom, side, roomsToAddRoomsTowards, obstructions);
if (closestRoomOnSide != null)
{
closestRoom = closestRoomOnSide;
break;
}
}
if (closestRoom != null)
{
dungeon.AddRooms(PlaceRoomsOrganicallyTowardRoom(
entranceRoom,
closestRoom,
RoomType.Normal,
dungeon.GetOccupiedPoints(),
dungeon.GetUnoccupiedPoints()));
}
}
}
}
private void ConnectAllAdjacentRooms(DungeonMap dungeon) private void ConnectAllAdjacentRooms(DungeonMap dungeon)
{ {
Dictionary<Point, Room> pointRoomMapping = dungeon.GetPointRoomIdMapping(); Dictionary<Point, Room> pointRoomMapping = dungeon.GetPointRoomIdMapping();
foreach (var room in dungeon.GetAllRooms()) foreach (var room in dungeon.GetEntranceRooms())
{ {
foreach ((Point p, RoomSide side) in room.GetAdjacentPoints()) foreach ((Point p, RoomSide side) in room.GetAdjacentPoints())
{ {
if (pointRoomMapping.ContainsKey(p)) if (pointRoomMapping.TryGetValue(p, out var value))
{ {
room.AddAdjacentRoom(pointRoomMapping[p]); room.AddAdjacentRoom(value);
} }
} }
} }
} }
private List<Point> GetAdjacentPoints(Room room)
{
var adjacentPoints = new List<Point>();
int x = room.PositionOfTopLeft.X;
int y = room.PositionOfTopLeft.Y;
int width = room.Width;
int height = room.Height;
// Add points to the left and right of the room
for (int i = 0; i < height; i++)
{
adjacentPoints.Add(new Point(x - 1, y + i)); // Left side
adjacentPoints.Add(new Point(x + width, y + i)); // Right side
}
// Add points above and below the room
for (int i = 0; i < width; i++)
{
adjacentPoints.Add(new Point(x + i, y - 1)); // Top side
adjacentPoints.Add(new Point(x + i, y + height)); // Bottom side
}
return adjacentPoints;
}
private void AddConnectionRooms(DungeonMap dungeon) private void AddConnectionRooms(DungeonMap dungeon)
{ {
// For each room adjacent to a monster and boos room connect it with the closest thing (entrance room, or monster adjacent room) // For each room adjacent to a monster and boos room connect it with the closest thing (entrance room, or monster adjacent room)
// unless there is something already going there. // unless there is something already going there.
List<Room> rootRooms = new List<Room>(dungeon.GetMonsterRooms()); List<Room> rootRooms = dungeon.GetRootRooms();
rootRooms.Add(dungeon.GetBossRoom());
// Create list of connection rooms // Create list of connection rooms
Dictionary<RoomSide, List<Room>> nodeRoomAndSideItIsOn = dungeon.GetNodesWithSides(); Dictionary<RoomSide, List<Room>> nodeRoomAndSideItIsOn = dungeon.GetNodesWithSides();

View file

@ -221,6 +221,14 @@ namespace DungeonMapGenerator
return nodeRooms; return nodeRooms;
} }
public List<Room> GetRootRooms()
{
List<Room> rootRooms = new List<Room>();
rootRooms.AddRange(_monsterRooms);
rootRooms.Add(_bossRoom);
return rootRooms;
}
public Dictionary<RoomSide, List<Room>> GetNodesWithSides() public Dictionary<RoomSide, List<Room>> GetNodesWithSides()
{ {
Dictionary<RoomSide, List<Room>> nodesWithSides = new Dictionary<RoomSide, List<Room>>(); Dictionary<RoomSide, List<Room>> nodesWithSides = new Dictionary<RoomSide, List<Room>>();