Neg_Utils/Timing/TimeMachine.cs

67 lines
2.3 KiB
C#

using System;
using UnityEngine;
namespace NEG.Utils.Timing
{
public class TimeMachine
{
private double timeInternal;
public TimeMachine()
{
timeInternal = 0;
}
/// <summary>
/// Adds time into the TimeMachine
/// </summary>
/// <param name="time">Amount of time to be added</param>
public void Accumulate(double time) => timeInternal += time;
/// <summary>
/// Retrieves given amount of time from the TimeMachine
/// </summary>
/// <param name="maxTime"></param>
/// <returns>Amount of time retrieved</returns>
public double Retrieve(double maxTime)
{
if(!double.IsFinite(maxTime))
{
double timeRetrieved = timeInternal;
timeInternal = 0;
return timeRetrieved;
}
double timeLeft = timeInternal - maxTime;
timeInternal = Math.Max(timeLeft, 0);
return Math.Min(maxTime + timeLeft, maxTime);
}
/// <summary>
/// Attempts to retrieves given amount of time from the TimeMachine <br/>
/// If there is enough <paramref name="time"/> accumulated in this machine subtracts that amount and returns true, otherwise returns false
/// </summary>
/// <param name="time"></param>
public bool TryRetrieve(double time)
{
if (!(timeInternal >= time))
return false;
timeInternal -= time;
return true;
}
/// <summary>
/// Result is equivalent to calling <see cref="TryRetrieve(double)"/> as many times as possible, but is faster for larger <paramref name="limit"/> values
/// </summary>
/// <param name="interval">Single unit of warp time, must be positive</param>
/// <param name="limit">Maximum amount of warps, must be positive</param>
/// <returns>Amount of warps</returns>
public int RetrieveAll(double interval, int limit = int.MaxValue)
{
int result = Mathf.FloorToInt((float)(timeInternal / interval));
result = Math.Clamp(result, 0, limit);
timeInternal -= result * interval;
return result;
}
}
}