From 34525210210627ee61c13357ecd8fec06735c9d6 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:23:53 +1100 Subject: [PATCH] Fix exped dungeons (#23654) mapBounds was null after one of my last changes. I changed the transform so it's just passed in directly as I don't think there was an easy way around it. I checked magnet + roomfills still work. --- .../Procedural/DungeonJob.NoiseDunGen.cs | 2 +- .../Procedural/DungeonJob.PrefabDunGen.cs | 29 +++++++-- .../Procedural/DungeonSystem.Rooms.cs | 61 +++++++++++-------- Content.Server/Procedural/DungeonSystem.cs | 1 - .../Salvage/SalvageSystem.Magnet.cs | 4 ++ 5 files changed, 64 insertions(+), 33 deletions(-) diff --git a/Content.Server/Procedural/DungeonJob.NoiseDunGen.cs b/Content.Server/Procedural/DungeonJob.NoiseDunGen.cs index f8af0deff7..7393ce72fd 100644 --- a/Content.Server/Procedural/DungeonJob.NoiseDunGen.cs +++ b/Content.Server/Procedural/DungeonJob.NoiseDunGen.cs @@ -66,7 +66,7 @@ public sealed partial class DungeonJob visited.Add(seedTile); frontier.Enqueue(seedTile); area = area.UnionTile(seedTile); - Box2i roomArea = new Box2i(seedTile, seedTile + Vector2i.One); + var roomArea = new Box2i(seedTile, seedTile + Vector2i.One); // Time to floodfill again while (frontier.TryDequeue(out var node) && tileCount < tileCap) diff --git a/Content.Server/Procedural/DungeonJob.PrefabDunGen.cs b/Content.Server/Procedural/DungeonJob.PrefabDunGen.cs index 9314a784e8..230c21c56e 100644 --- a/Content.Server/Procedural/DungeonJob.PrefabDunGen.cs +++ b/Content.Server/Procedural/DungeonJob.PrefabDunGen.cs @@ -159,7 +159,6 @@ public sealed partial class DungeonJob { var pack = chosenPacks[i]!; var packTransform = packTransforms[i]; - var packRotation = packRotations[i]; // Actual spawn cud here. // Pickout the room pack template to get the room dimensions we need. @@ -199,14 +198,25 @@ public sealed partial class DungeonJob _sawmill.Debug($"Using rotated variant for room"); } + var room = roomProto[random.Next(roomProto.Count)]; + + if (roomDimensions.X == roomDimensions.Y) + { + // Give it a random rotation + roomRotation = random.Next(4) * Math.PI / 2; + } + else if (random.Next(2) == 1) + { + roomRotation += Math.PI; + } + var roomTransform = Matrix3.CreateTransform(roomSize.Center - packCenter, roomRotation); Matrix3.Multiply(roomTransform, packTransform, out matty); Matrix3.Multiply(matty, dungeonTransform, out var dungeonMatty); // The expensive bit yippy. - var room = roomProto[random.Next(roomProto.Count)]; - _dungeon.SpawnRoom(gridUid, grid, matty, room, random, rotation: true); + _dungeon.SpawnRoom(gridUid, grid, dungeonMatty, room); var roomCenter = (room.Offset + room.Size / 2f) * grid.TileSize; var roomTiles = new HashSet(room.Size.X * room.Size.Y); @@ -230,9 +240,18 @@ public sealed partial class DungeonJob var center = Vector2.Zero; - foreach (var tile in roomTiles) + for (var x = 0; x < room.Size.X; x++) { - center += tile + grid.TileSizeHalfVector; + for (var y = 0; y < room.Size.Y; y++) + { + var roomTile = new Vector2i(x + room.Offset.X, y + room.Offset.Y); + var tilePos = dungeonMatty.Transform(roomTile + tileOffset); + var tileIndex = tilePos.Floored(); + roomTiles.Add(tileIndex); + + mapBounds = mapBounds?.Union(tileIndex) ?? new Box2i(tileIndex, tileIndex); + center += tilePos + grid.TileSizeHalfVector; + } } center /= roomTiles.Count; diff --git a/Content.Server/Procedural/DungeonSystem.Rooms.cs b/Content.Server/Procedural/DungeonSystem.Rooms.cs index c7445e9e71..d299048f51 100644 --- a/Content.Server/Procedural/DungeonSystem.Rooms.cs +++ b/Content.Server/Procedural/DungeonSystem.Rooms.cs @@ -67,46 +67,55 @@ public sealed partial class DungeonSystem bool rotation = false) { var originTransform = Matrix3.CreateTranslation(origin); - SpawnRoom(gridUid, grid, originTransform, room, random, clearExisting, rotation); + var roomRotation = Angle.Zero; + + if (rotation) + { + roomRotation = GetRoomRotation(room, random); + } + + var roomTransform = Matrix3.CreateTransform((Vector2) room.Size / 2f, roomRotation); + Matrix3.Multiply(roomTransform, originTransform, out var finalTransform); + + SpawnRoom(gridUid, grid, finalTransform, room, clearExisting); + } + + public Angle GetRoomRotation(DungeonRoomPrototype room, Random random) + { + var roomRotation = Angle.Zero; + + if (room.Size.X == room.Size.Y) + { + // Give it a random rotation + roomRotation = random.Next(4) * Math.PI / 2; + } + else if (random.Next(2) == 1) + { + roomRotation += Math.PI; + } + + return roomRotation; } public void SpawnRoom( EntityUid gridUid, MapGridComponent grid, - Matrix3 transform, + Matrix3 roomTransform, DungeonRoomPrototype room, - Random random, - bool clearExisting = false, - bool rotation = false) + bool clearExisting = false) { // Ensure the underlying template exists. var roomMap = GetOrCreateTemplate(room); var templateMapUid = _mapManager.GetMapEntityId(roomMap); var templateGrid = Comp(templateMapUid); - var roomRotation = Angle.Zero; var roomDimensions = room.Size; - if (rotation) - { - if (roomDimensions.X == roomDimensions.Y) - { - // Give it a random rotation - roomRotation = random.Next(4) * Math.PI / 2; - } - else if (random.Next(2) == 1) - { - roomRotation += Math.PI; - } - } - - var roomTransform = Matrix3.CreateTransform((Vector2) room.Size / 2f, roomRotation); - Matrix3.Multiply(roomTransform, transform, out var finalTransform); - var finalRoomRotation = finalTransform.Rotation(); + var finalRoomRotation = roomTransform.Rotation(); // go BRRNNTTT on existing stuff if (clearExisting) { - var gridBounds = new Box2(transform.Transform(Vector2.Zero), transform.Transform(room.Size)); + var gridBounds = new Box2(roomTransform.Transform(Vector2.Zero), roomTransform.Transform(room.Size)); _entitySet.Clear(); // Polygon skin moment gridBounds = gridBounds.Enlarged(-0.05f); @@ -138,7 +147,7 @@ public sealed partial class DungeonSystem var indices = new Vector2i(x + room.Offset.X, y + room.Offset.Y); var tileRef = _maps.GetTileRef(templateMapUid, templateGrid, indices); - var tilePos = finalTransform.Transform(indices + tileOffset); + var tilePos = roomTransform.Transform(indices + tileOffset); var rounded = tilePos.Floored(); _tiles.Add((rounded, tileRef.Tile)); } @@ -154,7 +163,7 @@ public sealed partial class DungeonSystem foreach (var templateEnt in _lookup.GetEntitiesIntersecting(templateMapUid, bounds, LookupFlags.Uncontained)) { var templateXform = _xformQuery.GetComponent(templateEnt); - var childPos = finalTransform.Transform(templateXform.LocalPosition - roomCenter); + var childPos = roomTransform.Transform(templateXform.LocalPosition - roomCenter); var childRot = templateXform.LocalRotation + finalRoomRotation; var protoId = _metaQuery.GetComponent(templateEnt).EntityPrototype?.ID; @@ -182,7 +191,7 @@ public sealed partial class DungeonSystem // Offset by 0.5 because decals are offset from bot-left corner // So we convert it to center of tile then convert it back again after transform. // Do these shenanigans because 32x32 decals assume as they are centered on bottom-left of tiles. - var position = finalTransform.Transform(decal.Coordinates + Vector2Helpers.Half - roomCenter); + var position = roomTransform.Transform(decal.Coordinates + Vector2Helpers.Half - roomCenter); position -= Vector2Helpers.Half; // Umm uhh I love decals so uhhhh idk what to do about this diff --git a/Content.Server/Procedural/DungeonSystem.cs b/Content.Server/Procedural/DungeonSystem.cs index 2352aa5120..bdd194caa4 100644 --- a/Content.Server/Procedural/DungeonSystem.cs +++ b/Content.Server/Procedural/DungeonSystem.cs @@ -35,7 +35,6 @@ public sealed partial class DungeonSystem : SharedDungeonSystem [Dependency] private readonly SharedMapSystem _maps = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - private HashSet _entSet = new(); private readonly List<(Vector2i, Tile)> _tiles = new(); private EntityQuery _metaQuery; diff --git a/Content.Server/Salvage/SalvageSystem.Magnet.cs b/Content.Server/Salvage/SalvageSystem.Magnet.cs index b6c188b614..bc7a6801e3 100644 --- a/Content.Server/Salvage/SalvageSystem.Magnet.cs +++ b/Content.Server/Salvage/SalvageSystem.Magnet.cs @@ -390,7 +390,11 @@ public sealed partial class SalvageSystem // This doesn't stop it from spawning on top of random things in space // Might be better like this, ghosts could stop it before if (_mapManager.FindGridsIntersecting(finalCoords.MapId, box2Rot).Any()) + { + // Bump it further and further just in case. + minActualDistance += 4f; continue; + } coords = finalCoords; return true; -- 2.51.2