using System; using System.Collections.Generic; using System.Linq; using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; namespace Movementtests.managers; [GlobalClass, Meta(typeof(IAutoNode))] public partial class TokenManager : Node { public override void _Notification(int what) => this.Notify(what); public record struct Token(ulong InstanceId, Action OnUse); private Dictionary Tokens { get; set; } = []; public int TokenCount => Tokens.Count; private List RequestQueue { get; set; } = []; public int MaxTokens { get; set;} public void Initialize(int maxTokens) { MaxTokens = maxTokens; } public Token? RequestToken(Node owner) { if (Tokens.ContainsKey(owner.GetInstanceId())) return null; // Already has a token GD.Print(TokenCount); if (RequestQueue.Contains(owner.GetInstanceId())) return null; // Already in queue RequestQueue.Add(owner.GetInstanceId()); if (TokenCount >= MaxTokens) return null; // Max tokens reached if (RequestQueue.First() != owner.GetInstanceId()) return null; // Next in line is not the requester RequestQueue.RemoveAt(0); var token = new Token(owner.GetInstanceId(), () => UseToken(owner.GetInstanceId())); Tokens.Add(token.InstanceId, token); return token; } public void UseToken(ulong instanceId) { Tokens.Remove(instanceId); } }