using System.Collections.Generic; using System.Linq; namespace Encompass { internal class TimeManager { private readonly List timeDilationDatas = new List(32); private double Linear(double t, double b, double c, double d) { return (c * t / d) + b; } public double TimeDilationFactor { get { return timeDilationDatas.Count == 0 ? 1 : timeDilationDatas.Select(data => data.Factor).Average(); } } public bool TimeDilationActive { get => timeDilationDatas.Count != 0; } public void Update(double dt) { for (var i = timeDilationDatas.Count - 1; i >= 0; i--) { var data = timeDilationDatas[i]; data.elapsedTime += dt; if (data.elapsedTime > data.easeInTime + data.activeTime + data.easeOutTime) { timeDilationDatas.RemoveAt(i); } else { timeDilationDatas[i] = data; } } } public void ActivateTimeDilation(double factor, double easeInTime, double activeTime, double easeOutTime) { ActivateTimeDilation(factor, easeInTime, Linear, activeTime, easeOutTime, Linear); } public void ActivateTimeDilation(double factor, double easeInTime, System.Func easeInFunction, double activeTime, double easeOutTime) { ActivateTimeDilation(factor, easeInTime, easeInFunction, activeTime, easeOutTime, Linear); } public void ActivateTimeDilation(double factor, double easeInTime, double activeTime, double easeOutTime, System.Func easeOutFunction) { ActivateTimeDilation(factor, easeInTime, Linear, activeTime, easeOutTime, easeOutFunction); } public void ActivateTimeDilation(double factor, double easeInTime, System.Func easeInFunction, double activeTime, double easeOutTime, System.Func easeOutFunction) { timeDilationDatas.Add(new TimeDilationData { elapsedTime = 0, easeInTime = easeInTime, easeInFunction = easeInFunction, activeTime = activeTime, easeOutTime = easeOutTime, easeOutFunction = easeOutFunction, factor = factor }); } } }