// Copyright © Gamesmiths Guild. using System; using Gamesmiths.Forge.Core; using Gamesmiths.Forge.Statescript; using Gamesmiths.Forge.Statescript.Properties; using Godot; using ForgeNode = Gamesmiths.Forge.Statescript.Node; namespace Gamesmiths.Forge.Godot.Resources.Statescript.Resolvers; /// /// Resolver resource that binds a node property to an entity's shared variable by name. At runtime the value is read /// from the bag, which is populated from the entity's /// . /// [Tool] [GlobalClass] public partial class SharedVariableResolverResource : StatescriptResolverResource { /// public override string ResolverTypeId => "SharedVariable"; /// /// Gets or sets the resource path of the that defines the variable. /// [Export] public string SharedVariableSetPath { get; set; } = string.Empty; /// /// Gets or sets the name of the shared variable to bind to. /// [Export] public string VariableName { get; set; } = string.Empty; /// /// Gets or sets the expected type of the shared variable. /// [Export] public StatescriptVariableType VariableType { get; set; } = StatescriptVariableType.Int; /// public override void BindInput(Graph graph, ForgeNode runtimeNode, string nodeId, byte index) { if (string.IsNullOrEmpty(VariableName)) { return; } Type clrType = StatescriptVariableTypeConverter.ToSystemType(VariableType); var propertyName = new StringKey($"__shared_{nodeId}_{index}"); graph.VariableDefinitions.DefineProperty( propertyName, new SharedVariableResolver(new StringKey(VariableName), clrType)); runtimeNode.BindInput(index, propertyName); } /// public override void BindOutput(ForgeNode runtimeNode, byte index) { if (string.IsNullOrEmpty(VariableName)) { return; } runtimeNode.BindOutput(index, new StringKey(VariableName), VariableScope.Shared); } /// public override IPropertyResolver BuildResolver(Graph graph) { if (string.IsNullOrEmpty(VariableName)) { return new VariantResolver(default, typeof(int)); } Type clrType = StatescriptVariableTypeConverter.ToSystemType(VariableType); return new SharedVariableResolver(new StringKey(VariableName), clrType); } }