Infer NumberSelector type in EntityTables (#36568)

* Infer number selector types from context

* forgor
This commit is contained in:
Nemanja
2025-05-14 21:21:54 -04:00
committed by GitHub
parent 338665a3ca
commit 91e441ada1
3 changed files with 65 additions and 10 deletions

View File

@@ -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)!;
}
}

View 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,

View File

@@ -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