]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix exped dungeons (#23654)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sun, 7 Jan 2024 03:23:53 +0000 (14:23 +1100)
committerGitHub <noreply@github.com>
Sun, 7 Jan 2024 03:23:53 +0000 (14:23 +1100)
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.

Content.Server/Procedural/DungeonJob.NoiseDunGen.cs
Content.Server/Procedural/DungeonJob.PrefabDunGen.cs
Content.Server/Procedural/DungeonSystem.Rooms.cs
Content.Server/Procedural/DungeonSystem.cs
Content.Server/Salvage/SalvageSystem.Magnet.cs

index f8af0deff7d4bd9776e13497fdd9f4561e89fddb..7393ce72fd717f5e2e9b8bf0ca8d9df88ab99cc5 100644 (file)
@@ -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)
index 9314a784e828294f12d44bd120e25a1a2976418d..230c21c56e5cc70354d2f5b25fcae98ab367dc07 100644 (file)
@@ -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<Vector2i>(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;
index c7445e9e7185c31acc393c5b61d51ec468486129..d299048f516b337435b10d2b5b35162fc4ec1fcf 100644 (file)
@@ -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<MapGridComponent>(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
index 2352aa5120471e69be514bda89ee02ba7f0fd75f..bdd194caa4884821b716084cc5445dbf5d24d273 100644 (file)
@@ -35,7 +35,6 @@ public sealed partial class DungeonSystem : SharedDungeonSystem
     [Dependency] private readonly SharedMapSystem _maps = default!;
     [Dependency] private readonly SharedTransformSystem _transform = default!;
 
-    private HashSet<EntityUid> _entSet = new();
     private readonly List<(Vector2i, Tile)> _tiles = new();
 
     private EntityQuery<MetaDataComponent> _metaQuery;
index b6c188b614bdbf904d7c0bbc4f8b8afb84d81cc5..bc7a6801e3e9bb168b6545dbe7adad7fdde8752a 100644 (file)
@@ -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;