using Godot; namespace Theriapolis.GodotHost.Scenes.Widgets; /// /// Container for unassigned AbilityToken children. Per /// GODOT_PORTING_GUIDE.md §7.3, accepts only slot→pool drops (returning /// an assigned value to the pool); pool→pool drops are no-ops. The step /// consumes and mutates CharacterDraft.StatPool / /// StatAssign in one call so the inevitable refresh re-creates tokens /// in the right places. /// public partial class AbilityPool : HBoxContainer { [Signal] public delegate void DroppedEventHandler(Godot.Collections.Dictionary payload); public override void _Ready() { AddThemeConstantOverride("separation", 8); MouseFilter = MouseFilterEnum.Stop; CustomMinimumSize = new Vector2(0, 64); } public override bool _CanDropData(Vector2 atPosition, Variant data) { if (data.VariantType != Variant.Type.Dictionary) return false; var d = data.AsGodotDictionary(); if (!d.ContainsKey("kind") || d["kind"].AsString() != "ability_value") return false; // Only slot→pool drops are meaningful; pool→pool is a no-op. return d.ContainsKey("from") && d["from"].AsString() == "slot"; } public override void _DropData(Vector2 atPosition, Variant data) { EmitSignal(SignalName.Dropped, data); } }