From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 15 May 2025 01:21:54 +0000 (-0400) Subject: Infer NumberSelector type in EntityTables (#36568) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=91e441ada1ad370bac21c9673dd65975cebab9f3;p=space-station-14.git Infer NumberSelector type in EntityTables (#36568) * Infer number selector types from context * forgor --- diff --git a/Content.Shared/EntityTable/ValueSelector/NumberSelectorTypeSerializer.cs b/Content.Shared/EntityTable/ValueSelector/NumberSelectorTypeSerializer.cs new file mode 100644 index 0000000000..782a1c126e --- /dev/null +++ b/Content.Shared/EntityTable/ValueSelector/NumberSelectorTypeSerializer.cs @@ -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 +{ + 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? 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)!; + } +} diff --git a/Content.Shared/EntityTable/ValueSelector/RangeNumberSelector.cs b/Content.Shared/EntityTable/ValueSelector/RangeNumberSelector.cs index b84736d1ee..2eca71d400 100644 --- a/Content.Shared/EntityTable/ValueSelector/RangeNumberSelector.cs +++ b/Content.Shared/EntityTable/ValueSelector/RangeNumberSelector.cs @@ -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, diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml index 1de12a1511..a5f002f221 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/Salvage/spawners.yml @@ -236,8 +236,7 @@ - !type:NestedSelector tableId: MaintFluffTable weight: 5 - rolls: !type:RangeNumberSelector - range: 1, 2 + rolls: 1, 2 - type: entity parent: MarkerBase @@ -426,18 +425,16 @@ 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 @@ -525,8 +522,7 @@ children: - id: MobSharkSalvage - id: MobCarpSalvage - amount: !type:ConstantNumberSelector - value: 3 + amount: 3 - type: entity parent: MarkerBase