]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Make procgen use weighted variants (#24669)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Mon, 29 Jan 2024 02:41:59 +0000 (21:41 -0500)
committerGitHub <noreply@github.com>
Mon, 29 Jan 2024 02:41:59 +0000 (13:41 +1100)
Content.Server/Gateway/Systems/GatewayGeneratorSystem.cs
Content.Server/Procedural/DungeonJob.NoiseDunGen.cs
Content.Server/Procedural/DungeonJob.PostGen.cs
Content.Server/Procedural/DungeonJob.cs
Content.Server/Procedural/DungeonSystem.Rooms.cs
Content.Server/Procedural/DungeonSystem.cs
Content.Shared/Maps/ContentTileDefinition.cs
Content.Shared/Maps/TileSystem.cs
Content.Shared/Parallax/Biomes/SharedBiomeSystem.cs
Content.Shared/Tiles/FloorTileSystem.cs
Resources/Prototypes/Procedural/biome_templates.yml

index 7d6f133e939461e0ad70d700de24b68a9d2ba8ad..c8b30af620c0f4fae695574817c3f19a952a70a3 100644 (file)
@@ -6,6 +6,7 @@ using Content.Server.Procedural;
 using Content.Server.Salvage;
 using Content.Shared.CCVar;
 using Content.Shared.Dataset;
+using Content.Shared.Maps;
 using Content.Shared.Movement.Components;
 using Content.Shared.Parallax.Biomes;
 using Content.Shared.Physics;
@@ -41,6 +42,7 @@ public sealed class GatewayGeneratorSystem : EntitySystem
     [Dependency] private readonly MetaDataSystem _metadata = default!;
     [Dependency] private readonly RestrictedRangeSystem _restricted = default!;
     [Dependency] private readonly SharedMapSystem _maps = default!;
+    [Dependency] private readonly TileSystem _tile = default!;
 
     [ValidatePrototypeId<DatasetPrototype>]
     private const string PlanetNames = "names_borer";
@@ -132,7 +134,7 @@ public sealed class GatewayGeneratorSystem : EntitySystem
         {
             for (var y = -2; y <= 2; y++)
             {
-                tiles.Add((new Vector2i(x, y) + origin, new Tile(tileDef.TileId, variant: random.NextByte(tileDef.Variants))));
+                tiles.Add((new Vector2i(x, y) + origin, new Tile(tileDef.TileId, variant: _tile.PickVariant((ContentTileDefinition) tileDef, random))));
             }
         }
 
index 7393ce72fd717f5e2e9b8bf0ca8d9df88ab99cc5..73c3386ead548dd977e4f3a49fe04dacd130013d 100644 (file)
@@ -84,7 +84,7 @@ public sealed partial class DungeonJob
                     foundNoise = true;
                     noiseFill = true;
                     var tileDef = _tileDefManager[layer.Tile];
-                    var variant = rand.NextByte(tileDef.Variants);
+                    var variant = _tile.PickVariant((ContentTileDefinition) tileDef, rand);
 
                     tiles.Add((node, new Tile(tileDef.TileId, variant: variant)));
                     roomTiles.Add(node);
index 559d5fedb91d6e9a0ac9176a54b1ee1ed3c55008..ffbb9454dcff32482df5a8977f75f5ef2938bb2a 100644 (file)
@@ -3,6 +3,7 @@ using System.Numerics;
 using System.Threading.Tasks;
 using Content.Server.NodeContainer;
 using Content.Shared.Doors.Components;
+using Content.Shared.Maps;
 using Content.Shared.Physics;
 using Content.Shared.Procedural;
 using Content.Shared.Procedural.PostGeneration;
@@ -191,7 +192,7 @@ public sealed partial class DungeonJob
             if (!_anchorable.TileFree(grid, neighbor, DungeonSystem.CollisionLayer, DungeonSystem.CollisionMask))
                 continue;
 
-            tiles.Add((neighbor, _tileDefManager.GetVariantTile(tileDef, random)));
+            tiles.Add((neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)));
         }
 
         foreach (var index in dungeon.CorridorExteriorTiles)
@@ -202,7 +203,7 @@ public sealed partial class DungeonJob
             if (!_anchorable.TileFree(grid, index, DungeonSystem.CollisionLayer, DungeonSystem.CollisionMask))
                 continue;
 
-            tiles.Add((index, _tileDefManager.GetVariantTile(tileDef, random)));
+            tiles.Add((index, _tile.GetVariantTile((ContentTileDefinition)tileDef, random)));
         }
 
         grid.SetTiles(tiles);
@@ -478,7 +479,7 @@ public sealed partial class DungeonJob
                     isValid = true;
 
                     // Entrance wew
-                    grid.SetTile(tile, _tileDefManager.GetVariantTile(tileDef, random));
+                    grid.SetTile(tile, _tile.GetVariantTile((ContentTileDefinition) tileDef, random));
                     ClearDoor(dungeon, grid, tile);
                     var gridCoords = grid.GridTileToLocal(tile);
                     // Need to offset the spawn to avoid spawning in the room.
@@ -496,7 +497,7 @@ public sealed partial class DungeonJob
                             continue;
                         }
 
-                        grid.SetTile(nearTile.GridIndices, _tileDefManager.GetVariantTile(tileDef, random));
+                        grid.SetTile(nearTile.GridIndices, _tile.GetVariantTile((ContentTileDefinition) tileDef, random));;
                     }
 
                     break;
@@ -589,7 +590,7 @@ public sealed partial class DungeonJob
                 {
                     var neighbor = tile + dirVec * j;
 
-                    tiles.Add((neighbor, _tileDefManager.GetVariantTile(tileDef, random)));
+                    tiles.Add((neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)));
                     index++;
                     takenTiles.Add(neighbor);
                 }
@@ -690,7 +691,7 @@ public sealed partial class DungeonJob
                 {
                     var tile = validTiles[j];
                     var gridPos = grid.GridTileToLocal(tile);
-                    grid.SetTile(tile, _tileDefManager.GetVariantTile(tileDef, random));
+                    grid.SetTile(tile, _tile.GetVariantTile((ContentTileDefinition) tileDef, random));
 
                     _entManager.SpawnEntities(gridPos, gen.Entities);
                 }
@@ -721,7 +722,7 @@ public sealed partial class DungeonJob
         {
             foreach (var entrance in room.Entrances)
             {
-                setTiles.Add((entrance, _tileDefManager.GetVariantTile(tileDef, random)));
+                setTiles.Add((entrance, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)));
             }
         }
 
@@ -857,7 +858,7 @@ public sealed partial class DungeonJob
 
         foreach (var tile in corridorTiles)
         {
-            setTiles.Add((tile, _tileDefManager.GetVariantTile(tileDef, random)));
+            setTiles.Add((tile, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)));
         }
 
         grid.SetTiles(setTiles);
@@ -902,7 +903,7 @@ public sealed partial class DungeonJob
                     if (!dungeon.RoomExteriorTiles.Contains(neighbor))
                         continue;
 
-                    tiles.Add((neighbor, _tileDefManager.GetVariantTile(tileDef, random)));
+                    tiles.Add((neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random)));
                     spawnPositions.Add(neighbor);
                 }
             }
@@ -1013,7 +1014,7 @@ public sealed partial class DungeonJob
                     for (var x = -width + 1; x < width; x++)
                     {
                         var weh = tile + neighborDir.ToIntVec() * x;
-                        grid.SetTile(weh, _tileDefManager.GetVariantTile(tileDef, random));
+                        grid.SetTile(weh, _tile.GetVariantTile((ContentTileDefinition) tileDef, random));
 
                         var coords = grid.GridTileToLocal(weh);
                         _entManager.SpawnEntities(coords, gen.Entities);
@@ -1131,7 +1132,7 @@ public sealed partial class DungeonJob
                         continue;
 
                     width--;
-                    grid.SetTile(node, _tileDefManager.GetVariantTile(tileDef, random));
+                    grid.SetTile(node, _tile.GetVariantTile((ContentTileDefinition) tileDef, random));
 
                     if (gen.EdgeEntities != null && nodeDistances.Count - i <= 2)
                     {
@@ -1217,7 +1218,7 @@ public sealed partial class DungeonJob
             if (!random.Prob(gen.Prob) || !checkedTiles.Add(neighbor))
                 continue;
 
-            grid.SetTile(neighbor, _tileDefManager.GetVariantTile(tileDef, random));
+            grid.SetTile(neighbor, _tile.GetVariantTile((ContentTileDefinition) tileDef, random));
             var gridPos = grid.GridTileToLocal(neighbor);
             var protoNames = EntitySpawnCollection.GetSpawns(gen.Spawns, random);
 
index 55c4474d31b0ba6dfbe0eb21e2348dd83b212380..c8a69808d31777fece6310f1895631d54c3fe462 100644 (file)
@@ -4,6 +4,7 @@ using Content.Server.Construction;
 using Robust.Shared.CPUJob.JobQueues;
 using Content.Server.Decals;
 using Content.Shared.Construction.EntitySystems;
+using Content.Shared.Maps;
 using Content.Shared.Procedural;
 using Content.Shared.Procedural.DungeonGenerators;
 using Content.Shared.Procedural.PostGeneration;
@@ -27,6 +28,7 @@ public sealed partial class DungeonJob : Job<Dungeon>
     private readonly DecalSystem _decals;
     private readonly DungeonSystem _dungeon;
     private readonly EntityLookupSystem _lookup;
+    private readonly TileSystem _tile;
     private readonly SharedMapSystem _maps;
     private readonly SharedTransformSystem _transform;
     private EntityQuery<TagComponent> _tagQuery;
@@ -51,6 +53,7 @@ public sealed partial class DungeonJob : Job<Dungeon>
         DecalSystem decals,
         DungeonSystem dungeon,
         EntityLookupSystem lookup,
+        TileSystem tile,
         SharedTransformSystem transform,
         DungeonConfigPrototype gen,
         MapGridComponent grid,
@@ -69,6 +72,7 @@ public sealed partial class DungeonJob : Job<Dungeon>
         _decals = decals;
         _dungeon = dungeon;
         _lookup = lookup;
+        _tile = tile;
         _maps = _entManager.System<SharedMapSystem>();
         _transform = transform;
         _tagQuery = _entManager.GetEntityQuery<TagComponent>();
index d299048f516b337435b10d2b5b35162fc4ec1fcf..03bcc2b4b13de9852f45c2ff33d5975fc24d841e 100644 (file)
@@ -1,5 +1,6 @@
 using System.Numerics;
 using Content.Shared.Decals;
+using Content.Shared.Maps;
 using Content.Shared.Procedural;
 using Content.Shared.Random.Helpers;
 using Content.Shared.Whitelist;
@@ -230,7 +231,7 @@ public sealed partial class DungeonSystem
                 // but place 1 nanometre off grid and fail the add.
                 if (!_maps.TryGetTileRef(gridUid, grid, tilePos, out var tileRef) || tileRef.Tile.IsEmpty)
                 {
-                    _maps.SetTile(gridUid, grid, tilePos, _tileDefManager.GetVariantTile(FallbackTileId, _random));
+                    _maps.SetTile(gridUid, grid, tilePos, _tile.GetVariantTile((ContentTileDefinition) _tileDefManager[FallbackTileId], _random.GetRandom()));
                 }
 
                 var result = _decals.TryAddDecal(
index bdd194caa4884821b716084cc5445dbf5d24d273..069508bcbbba4c79afc55a36d3a6e5e1999565fc 100644 (file)
@@ -31,6 +31,7 @@ public sealed partial class DungeonSystem : SharedDungeonSystem
     [Dependency] private readonly AnchorableSystem _anchorable = default!;
     [Dependency] private readonly DecalSystem _decals = default!;
     [Dependency] private readonly EntityLookupSystem _lookup = default!;
+    [Dependency] private readonly TileSystem _tile = default!;
     [Dependency] private readonly MapLoaderSystem _loader = default!;
     [Dependency] private readonly SharedMapSystem _maps = default!;
     [Dependency] private readonly SharedTransformSystem _transform = default!;
@@ -198,6 +199,7 @@ public sealed partial class DungeonSystem : SharedDungeonSystem
             _decals,
             this,
             _lookup,
+            _tile,
             _transform,
             gen,
             grid,
@@ -229,6 +231,7 @@ public sealed partial class DungeonSystem : SharedDungeonSystem
             _decals,
             this,
             _lookup,
+            _tile,
             _transform,
             gen,
             grid,
index 40f337b129820dae3adc4a61b02258b61d5f5515..65887358024352cb827b945787ac3c3e0c4640c0 100644 (file)
@@ -67,7 +67,7 @@ namespace Content.Shared.Maps
         /// <summary>
         /// This controls what variants the `variantize` command is allowed to use.
         /// </summary>
-        [DataField("placementVariants")] public float[] PlacementVariants { get; set; } = new [] { 1f };
+        [DataField("placementVariants")] public float[] PlacementVariants { get; set; } = { 1f };
 
         [DataField("thermalConductivity")] public float ThermalConductivity = 0.04f;
 
index 51a5d4b85ab5cac17838b92d9f379fbd03965daf..d87b3ca50d542abcf232a0ca86ed6d55c61da760 100644 (file)
@@ -25,12 +25,29 @@ public sealed class TileSystem : EntitySystem
     ///     Returns a weighted pick of a tile variant.
     /// </summary>
     public byte PickVariant(ContentTileDefinition tile)
+    {
+        return PickVariant(tile, _robustRandom.GetRandom());
+    }
+
+    /// <summary>
+    ///     Returns a weighted pick of a tile variant.
+    /// </summary>
+    public byte PickVariant(ContentTileDefinition tile, int seed)
+    {
+        var rand = new System.Random(seed);
+        return PickVariant(tile, rand);
+    }
+
+    /// <summary>
+    ///     Returns a weighted pick of a tile variant.
+    /// </summary>
+    public byte PickVariant(ContentTileDefinition tile, System.Random random)
     {
         var variants = tile.PlacementVariants;
 
         var sum = variants.Sum();
         var accumulated = 0f;
-        var rand = _robustRandom.NextFloat() * sum;
+        var rand = random.NextFloat() * sum;
 
         for (byte i = 0; i < variants.Length; ++i)
         {
@@ -44,6 +61,23 @@ public sealed class TileSystem : EntitySystem
         throw new InvalidOperationException($"Invalid weighted variantize tile pick for {tile.ID}!");
     }
 
+    /// <summary>
+    ///     Returns a tile with a weighted random variant.
+    /// </summary>
+    public Tile GetVariantTile(ContentTileDefinition tile, System.Random random)
+    {
+        return new Tile(tile.TileId, variant: PickVariant(tile, random));
+    }
+
+    /// <summary>
+    ///     Returns a tile with a weighted random variant.
+    /// </summary>
+    public Tile GetVariantTile(ContentTileDefinition tile, int seed)
+    {
+        var rand = new System.Random(seed);
+        return new Tile(tile.TileId, variant: PickVariant(tile, rand));
+    }
+
     public bool PryTile(Vector2i indices, EntityUid gridId)
     {
         var grid = Comp<MapGridComponent>(gridId);
index db590135f09ee3bc46530c9799308551fc8ea03e..b14baba98173b49d2a805775fe76f748568c777c 100644 (file)
@@ -16,6 +16,7 @@ public abstract class SharedBiomeSystem : EntitySystem
     [Dependency] protected readonly IPrototypeManager ProtoManager = default!;
     [Dependency] private readonly ISerializationManager _serManager = default!;
     [Dependency] protected readonly ITileDefinitionManager TileDefManager = default!;
+    [Dependency] private readonly TileSystem _tile = default!;
 
     protected const byte ChunkSize = 8;
 
@@ -158,13 +159,8 @@ public abstract class SharedBiomeSystem : EntitySystem
         // Pick a variant tile if they're available as well
         if (variantCount > 1)
         {
-            var variantValue = (noise.GetNoise(indices.X * 8, indices.Y * 8, variantCount) + 1f) / 2f;
-            variant = (byte) Pick(variantCount, variantValue);
-
-            if (variants != null)
-            {
-                variant = variants[variant];
-            }
+            var variantValue = (noise.GetNoise(indices.X * 8, indices.Y * 8, variantCount) + 1f) * 100;
+            variant = _tile.PickVariant(tileDef, (int) variantValue);
         }
 
         tile = new Tile(tileDef.TileId, 0, variant);
index 21e21fa9e9bc4cd530c39225293be5ca6fb4b591..04aa100cd1d4b62fe48b2c0749c1261862918188 100644 (file)
@@ -35,6 +35,7 @@ public sealed class FloorTileSystem : EntitySystem
     [Dependency] private readonly SharedPopupSystem _popup = default!;
     [Dependency] private readonly SharedStackSystem _stackSystem = default!;
     [Dependency] private readonly SharedTransformSystem _transform = default!;
+    [Dependency] private readonly TileSystem _tile = default!;
     [Dependency] private readonly SharedPhysicsSystem _physics = default!;
 
     private static readonly Vector2 CheckRange = new(1f, 1f);
@@ -175,8 +176,8 @@ public sealed class FloorTileSystem : EntitySystem
     {
         _adminLogger.Add(LogType.Tile, LogImpact.Low, $"{ToPrettyString(user):actor} placed tile {_tileDefinitionManager[tileId].Name} at {ToPrettyString(gridUid)} {location}");
 
-        // TODO: Proper predicted RNG.
-        var variant = (byte) (_timing.CurTick.Value % ((ContentTileDefinition) _tileDefinitionManager[tileId]).Variants);
+        var random = new System.Random((int) _timing.CurTick.Value);
+        var variant = _tile.PickVariant((ContentTileDefinition) _tileDefinitionManager[tileId], random);
         mapGrid.SetTile(location.Offset(new Vector2(offset, offset)), new Tile(tileId, 0, variant));
 
         _audio.PlayPredicted(placeSound, location, user);
index 997ae33aa55517afa716688b7312941060a89180..88979316443e17ede1e33dd2fd46ee5f2591a03f 100644 (file)
     # Fill layer
     - !type:BiomeTileLayer
       threshold: -1
-      variants:
-        - 0
-      tile: FloorAsteroidSand
-    - !type:BiomeTileLayer
-      threshold: 0.80
-      noise:
-        seed: 1
-        noiseType: OpenSimplex2
-        frequency: 2
       tile: FloorAsteroidSand
 
 # Grass
     # Fill basalt
     - !type:BiomeTileLayer
       threshold: -1
-      variants:
-        - 0
       tile: FloorBasalt
 
 # Snow
     # Fill chromite
     - !type:BiomeTileLayer
       threshold: -1
-      variants:
-        - 0
-      tile: FloorChromite
-    - !type:BiomeTileLayer
-      threshold: 0.25
-      noise:
-        seed: 1
-        noiseType: OpenSimplex2
-        frequency: 2
       tile: FloorChromite
 
 # Caves
     - !type:BiomeTileLayer
       threshold: -1.0
       tile: FloorAsteroidSand
-      variants:
-      - 0
-    - !type:BiomeTileLayer
-      threshold: 0.5
-      noise:
-        seed: 1
-        noiseType: OpenSimplex2
-        frequency: 2
-      tile: FloorAsteroidSand
 
 # Asteroid
 - type: biomeTemplate
     - !type:BiomeTileLayer
       threshold: -1.0
       tile: FloorAsteroidSand
-      variants:
-        - 0
-    - !type:BiomeTileLayer
-      threshold: 0.5
-      noise:
-        seed: 1
-        noiseType: OpenSimplex2
-        frequency: 2
-      tile: FloorAsteroidSand