2023-03-10 16:41:22 +11:00
|
|
|
namespace Content.Shared.Procedural;
|
|
|
|
|
|
2024-07-03 22:23:11 +10:00
|
|
|
/// <summary>
|
|
|
|
|
/// Procedurally generated dungeon data.
|
|
|
|
|
/// </summary>
|
2023-03-10 16:41:22 +11:00
|
|
|
public sealed class Dungeon
|
|
|
|
|
{
|
2024-07-03 22:23:11 +10:00
|
|
|
public static Dungeon Empty = new Dungeon();
|
|
|
|
|
|
|
|
|
|
private List<DungeonRoom> _rooms;
|
|
|
|
|
private HashSet<Vector2i> _allTiles = new();
|
|
|
|
|
|
|
|
|
|
public IReadOnlyList<DungeonRoom> Rooms => _rooms;
|
2023-06-27 19:17:42 +10:00
|
|
|
|
2023-04-20 10:43:13 +10:00
|
|
|
/// <summary>
|
2023-06-27 19:17:42 +10:00
|
|
|
/// Hashset of the tiles across all rooms.
|
2023-04-20 10:43:13 +10:00
|
|
|
/// </summary>
|
2023-06-27 19:17:42 +10:00
|
|
|
public readonly HashSet<Vector2i> RoomTiles = new();
|
2023-04-20 10:43:13 +10:00
|
|
|
|
2023-06-27 19:17:42 +10:00
|
|
|
public readonly HashSet<Vector2i> RoomExteriorTiles = new();
|
2023-04-20 10:43:13 +10:00
|
|
|
|
2023-06-27 19:17:42 +10:00
|
|
|
public readonly HashSet<Vector2i> CorridorTiles = new();
|
2023-03-10 16:41:22 +11:00
|
|
|
|
2023-06-27 19:17:42 +10:00
|
|
|
public readonly HashSet<Vector2i> CorridorExteriorTiles = new();
|
2024-01-04 14:25:32 +11:00
|
|
|
|
2024-03-23 21:37:18 -06:00
|
|
|
public readonly HashSet<Vector2i> Entrances = new();
|
|
|
|
|
|
2024-07-03 22:23:11 +10:00
|
|
|
public IReadOnlySet<Vector2i> AllTiles => _allTiles;
|
|
|
|
|
|
|
|
|
|
public Dungeon() : this(new List<DungeonRoom>())
|
2024-01-04 14:25:32 +11:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Dungeon(List<DungeonRoom> rooms)
|
|
|
|
|
{
|
2024-07-03 22:23:11 +10:00
|
|
|
// This reftype is mine now.
|
|
|
|
|
_rooms = rooms;
|
|
|
|
|
|
|
|
|
|
foreach (var room in _rooms)
|
|
|
|
|
{
|
|
|
|
|
InternalAddRoom(room);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RefreshAllTiles();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RefreshAllTiles()
|
|
|
|
|
{
|
|
|
|
|
_allTiles.Clear();
|
|
|
|
|
_allTiles.UnionWith(RoomTiles);
|
|
|
|
|
_allTiles.UnionWith(RoomExteriorTiles);
|
|
|
|
|
_allTiles.UnionWith(CorridorTiles);
|
|
|
|
|
_allTiles.UnionWith(CorridorExteriorTiles);
|
|
|
|
|
_allTiles.UnionWith(Entrances);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Rebuild()
|
|
|
|
|
{
|
|
|
|
|
_allTiles.Clear();
|
|
|
|
|
|
|
|
|
|
RoomTiles.Clear();
|
|
|
|
|
RoomExteriorTiles.Clear();
|
|
|
|
|
Entrances.Clear();
|
2024-03-23 21:37:18 -06:00
|
|
|
|
2024-07-03 22:23:11 +10:00
|
|
|
foreach (var room in _rooms)
|
2024-03-23 21:37:18 -06:00
|
|
|
{
|
2024-07-03 22:23:11 +10:00
|
|
|
InternalAddRoom(room, false);
|
2024-03-23 21:37:18 -06:00
|
|
|
}
|
2024-07-03 22:23:11 +10:00
|
|
|
|
|
|
|
|
RefreshAllTiles();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void AddRoom(DungeonRoom room)
|
|
|
|
|
{
|
|
|
|
|
_rooms.Add(room);
|
|
|
|
|
InternalAddRoom(room);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void InternalAddRoom(DungeonRoom room, bool refreshAll = true)
|
|
|
|
|
{
|
|
|
|
|
Entrances.UnionWith(room.Entrances);
|
|
|
|
|
RoomTiles.UnionWith(room.Tiles);
|
|
|
|
|
RoomExteriorTiles.UnionWith(room.Exterior);
|
|
|
|
|
|
|
|
|
|
if (refreshAll)
|
|
|
|
|
RefreshAllTiles();
|
2024-01-04 14:25:32 +11:00
|
|
|
}
|
2023-03-10 16:41:22 +11:00
|
|
|
}
|