namespace Encompass { internal class TimeManager { private TimeDilationData timeDilationData = new TimeDilationData { factor = 1 }; private bool newTimeDilationData = false; private TimeDilationData nextFrameTimeDilationData = new TimeDilationData { factor = 1 }; private double Linear(double t, double b, double c, double d) { return c * t / d + b; } private int minPriority = int.MaxValue; public double TimeDilationFactor { get { return timeDilationData.Factor; } } public bool TimeDilationActive { get => TimeDilationFactor != 1; } public void Update(double dt) { if (newTimeDilationData) { timeDilationData = nextFrameTimeDilationData; } timeDilationData.elapsedTime += dt; newTimeDilationData = false; minPriority = int.MaxValue; } public void ActivateTimeDilation(double factor, double easeInTime, double activeTime, double easeOutTime, int priority) { ActivateTimeDilation(factor, easeInTime, Linear, activeTime, easeOutTime, Linear, priority); } public void ActivateTimeDilation(double factor, double easeInTime, System.Func easeInFunction, double activeTime, double easeOutTime, int priority) { ActivateTimeDilation(factor, easeInTime, easeInFunction, activeTime, easeOutTime, Linear, priority); } public void ActivateTimeDilation(double factor, double easeInTime, double activeTime, double easeOutTime, System.Func easeOutFunction, int priority) { ActivateTimeDilation(factor, easeInTime, Linear, activeTime, easeOutTime, easeOutFunction, priority); } public void ActivateTimeDilation(double factor, double easeInTime, System.Func easeInFunction, double activeTime, double easeOutTime, System.Func easeOutFunction, int priority) { if (priority <= minPriority) { newTimeDilationData = true; nextFrameTimeDilationData = new TimeDilationData { elapsedTime = 0, easeInTime = easeInTime, easeInFunction = easeInFunction, activeTime = activeTime, easeOutTime = easeOutTime, easeOutFunction = easeOutFunction, factor = factor }; } } } }