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 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 ownerInstanceId = owner.GetInstanceId(); var token = new Token(ownerInstanceId, () => UseToken(ownerInstanceId)); Tokens.Add(token.InstanceId, token); return token; } public void UseToken(ulong instanceId) { Tokens.Remove(instanceId); } }