DungeonData rework (#37172)

* DungeonData rework

Back to fields, serializes better, just make new layers dumby.

* wawawewa

* Fix this

* Fixes

* review

* thanks fork

* fix
This commit is contained in:
metalgearsloth
2025-05-18 03:10:30 +10:00
committed by GitHub
parent d72939ba4b
commit 4afccdd5db
57 changed files with 759 additions and 696 deletions

View File

@@ -14,15 +14,8 @@ public sealed partial class DungeonJob
/// <summary>
/// <see cref="PrefabDunGen"/>
/// </summary>
private async Task<Dungeon> GeneratePrefabDunGen(Vector2i position, DungeonData data, PrefabDunGen prefab, HashSet<Vector2i> reservedTiles, Random random)
private async Task<Dungeon> GeneratePrefabDunGen(Vector2i position, PrefabDunGen prefab, HashSet<Vector2i> reservedTiles, Random random)
{
if (!data.Tiles.TryGetValue(DungeonDataKey.FallbackTile, out var tileProto) ||
!data.Whitelists.TryGetValue(DungeonDataKey.Rooms, out var roomWhitelist))
{
LogDataError(typeof(PrefabDunGen));
return Dungeon.Empty;
}
var preset = prefab.Presets[random.Next(prefab.Presets.Count)];
var gen = _prototype.Index(preset);
@@ -50,9 +43,9 @@ public sealed partial class DungeonJob
{
var whitelisted = false;
if (roomWhitelist?.Tags != null)
if (prefab.RoomWhitelist?.Tags != null)
{
foreach (var tag in roomWhitelist.Tags)
foreach (var tag in prefab.RoomWhitelist.Tags)
{
if (proto.Tags.Contains(tag))
{
@@ -164,6 +157,7 @@ public sealed partial class DungeonJob
// Then for overlaps choose either 1x1 / 3x1
// Pick a random tile for it and then expand outwards as relevant (weighted towards middle?)
var fallbackTile = prefab.FallbackTile;
for (var i = 0; i < chosenPacks.Length; i++)
{
@@ -181,29 +175,35 @@ public sealed partial class DungeonJob
Angle roomRotation = Angle.Zero;
Matrix3x2 matty;
// If no room found then try rotated dimensions
if (!roomProtos.TryGetValue(roomDimensions, out var roomProto))
{
roomDimensions = new Vector2i(roomDimensions.Y, roomDimensions.X);
// If nothing at all then no valid rooms, try fallback tile and log it.
if (!roomProtos.TryGetValue(roomDimensions, out roomProto))
{
matty = Matrix3x2.Multiply(packTransform, dungeonTransform);
for (var x = roomSize.Left; x < roomSize.Right; x++)
if (fallbackTile != null)
{
for (var y = roomSize.Bottom; y < roomSize.Top; y++)
matty = Matrix3x2.Multiply(packTransform, dungeonTransform);
for (var x = roomSize.Left; x < roomSize.Right; x++)
{
var index = Vector2.Transform(new Vector2(x, y) + _grid.TileSizeHalfVector - packCenter, matty).Floored();
for (var y = roomSize.Bottom; y < roomSize.Top; y++)
{
var index = Vector2.Transform(new Vector2(x, y) + _grid.TileSizeHalfVector - packCenter, matty).Floored();
if (reservedTiles.Contains(index))
continue;
if (reservedTiles.Contains(index))
continue;
tiles.Add((index, new Tile(_tileDefManager[tileProto].TileId)));
tiles.Add((index, new Tile(_tileDefManager[fallbackTile.Value].TileId)));
}
}
_maps.SetTiles(_gridUid, _grid, tiles);
tiles.Clear();
}
_maps.SetTiles(_gridUid, _grid, tiles);
tiles.Clear();
_sawmill.Error($"Unable to find room variant for {roomDimensions}, leaving empty.");
continue;
}