]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Infer NumberSelector type in EntityTables (#36568)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Thu, 15 May 2025 01:21:54 +0000 (21:21 -0400)
committerGitHub <noreply@github.com>
Thu, 15 May 2025 01:21:54 +0000 (11:21 +1000)
* Infer number selector types from context

* forgor

Content.Shared/EntityTable/ValueSelector/NumberSelectorTypeSerializer.cs [new file with mode: 0644]
Content.Shared/EntityTable/ValueSelector/RangeNumberSelector.cs
Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml

diff --git a/Content.Shared/EntityTable/ValueSelector/NumberSelectorTypeSerializer.cs b/Content.Shared/EntityTable/ValueSelector/NumberSelectorTypeSerializer.cs
new file mode 100644 (file)
index 0000000..782a1c1
--- /dev/null
@@ -0,0 +1,54 @@
+using System.Globalization;
+using Robust.Shared.Serialization;
+using Robust.Shared.Serialization.Manager;
+using Robust.Shared.Serialization.Markdown.Validation;
+using Robust.Shared.Serialization.Markdown.Value;
+using Robust.Shared.Serialization.TypeSerializers.Interfaces;
+using Robust.Shared.Utility;
+
+namespace Content.Shared.EntityTable.ValueSelector;
+
+[TypeSerializer]
+public sealed class NumberSelectorTypeSerializer :
+    ITypeReader<NumberSelector, ValueDataNode>
+{
+    public ValidationNode Validate(ISerializationManager serializationManager,
+        ValueDataNode node,
+        IDependencyCollection dependencies,
+        ISerializationContext? context = null)
+    {
+        // ConstantNumberSelector validation
+        if (int.TryParse(node.Value, out _))
+            return new ValidatedValueNode(node);
+
+        // RangeNumberSelector validation
+        if (VectorSerializerUtility.TryParseArgs(node.Value, 2, out _))
+        {
+            return new ValidatedValueNode(node);
+        }
+
+        return new ErrorNode(node, "Custom validation not supported! Please specify the type manually!");
+    }
+
+    public NumberSelector Read(ISerializationManager serializationManager,
+        ValueDataNode node,
+        IDependencyCollection dependencies,
+        SerializationHookContext hookCtx,
+        ISerializationContext? context = null,
+        ISerializationManager.InstantiationDelegate<NumberSelector>? instanceProvider = null)
+    {
+        var type = typeof(NumberSelector);
+
+        if (int.TryParse(node.Value, out var result))
+            return new ConstantNumberSelector(result);
+
+        if (VectorSerializerUtility.TryParseArgs(node.Value, 2, out var args))
+        {
+            var x = int.Parse(args[0], CultureInfo.InvariantCulture);
+            var y = int.Parse(args[1], CultureInfo.InvariantCulture);
+            return new RangeNumberSelector(new Vector2i(x, y));
+        }
+
+        return (NumberSelector) serializationManager.Read(type, node, context)!;
+    }
+}
index b84736d1ee933007dfc4d5f3755f1f628d4ac878..2eca71d4009d06e39334c19d092d72272c4c9a80 100644 (file)
@@ -8,6 +8,11 @@ public sealed partial class RangeNumberSelector : NumberSelector
     [DataField]
     public Vector2i Range = new(1, 1);
 
+    public RangeNumberSelector(Vector2i range)
+    {
+        Range = range;
+    }
+
     public override int Get(System.Random rand)
     {
         // rand.Next() is inclusive on the first number and exclusive on the second number,
index 1de12a1511305cf34fddca810f4d4bdc4d9afa4c..a5f002f221bc6cd69358d1135eb197a280414ddf 100644 (file)
     - !type:NestedSelector
       tableId: MaintFluffTable
       weight: 5
-      rolls: !type:RangeNumberSelector
-        range: 1, 2
+      rolls: 1, 2
 
 - type: entity
   parent: MarkerBase
         children:
         - id: MobSharkSalvage
         - id: MobCarpSalvage
-          amount: !type:ConstantNumberSelector
-            value: 2
+          amount: 2
         - !type:NestedSelector
-          rolls: !type:RangeNumberSelector
-            range: 1, 3
+          rolls: 1, 3
           tableId: SalvageTreasureSpawnerValuable
         - !type:NestedSelector
-          rolls: !type:RangeNumberSelector
-            range: 7, 10
+          rolls: 7, 10
           tableId: TreasureCoinPileRare
       #- id: MobHivebot (solo hivebot spawn)
 
+
 - type: entity
   parent: MarkerBase
   id: SalvageSpawnerMobMagnet
       children:
       - id: MobSharkSalvage
       - id: MobCarpSalvage
-        amount: !type:ConstantNumberSelector
-          value: 3
+        amount: 3
 
 - type: entity
   parent: MarkerBase