using System; namespace Engine.Systems.Tween; public static class TweenExtensions { private static readonly System.Collections.Generic.Dictionary loopDictionary = []; public static ITween Loop(this ITween tween, int count) { if (!loopDictionary.TryAdd(tween, count)) throw new($"Tween already has a loop in progress."); tween.OnCompleted.AddListener(looperDelegate); tween.OnEnded.AddListener(looperEndDelegate); return tween; } private static readonly Core.Event.EventHandler looperEndDelegate = sender => loopDictionary.Remove(sender); private static readonly Core.Event.EventHandler looperDelegate = sender => { int counter = loopDictionary[sender] = loopDictionary[sender] - 1; if (counter <= 0) { loopDictionary.Remove(sender); return; } Tween tweenConcrete = (Tween)sender; tweenConcrete.Reset(); tweenConcrete.State = TweenState.Playing; }; public static ITween LoopInfinitely(this ITween tween) { tween.OnCompleted.AddListener(repeaterDelegate); return tween; } private static readonly Core.Event.EventHandler repeaterDelegate = sender => { Tween tweenConcrete = (Tween)sender; tweenConcrete.Reset(); tweenConcrete.State = TweenState.Playing; }; public static ITween Ease(this ITween tween, IEasing easing) { Tween tweenConcrete = (Tween)tween; tweenConcrete.Easing = easing; return tween; } public static ITween OnStart(this ITween tween, Action callback) { tween.OnStarted.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnPause(this ITween tween, Action callback) { tween.OnPaused.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnResume(this ITween tween, Action callback) { tween.OnResumed.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnCancel(this ITween tween, Action callback) { tween.OnCancelled.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnComplete(this ITween tween, Action callback) { tween.OnCompleted.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnEnd(this ITween tween, Action callback) { tween.OnEnded.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnUpdate(this ITween tween, Action callback) { tween.OnUpdated.AddListener(_ => callback.Invoke()); return tween; } public static ITween OnDeltaUpdate(this ITween tween, Action callback) { tween.OnDeltaUpdated.AddListener((_, arguments) => callback.Invoke(arguments.Delta)); return tween; } }