using System;
using UnityEngine;
public delegate void SimpleTimerTick();
public class SimpleTimer
{
bool hasTime = false;
float t;
private int tSeconds;
public float TimeLeft { get { return t; } }
public bool Active = false;
public SimpleTimerTick OnFinish = null;
public Action<int> OnSecondsChanged = null;
float timeScale = 1;
public float TimeScale { get { return timeScale; } set { timeScale = value; } }
public bool IgnoreFirstUpdate = true;
private float duration;
protected bool loop = false;
private EnterFrameManager efm;
public SimpleTimer()
{
efm = GameObject.FindObjectOfType<EnterFrameManager>();
}
public SimpleTimer(float time, SimpleTimerTick callback, bool loop = false)
{
Start(time, callback, loop);
}
public void Start(float time, SimpleTimerTick callback, bool loop = false)
{
hasTime = true;
this.loop = loop;
OnFinish = callback;
this.duration = time;
this.t = time;
SetTSeconds();
efm.Add(this, delegate (float t) { Update(t); });
Active = true;
IgnoreFirstUpdate = true;
}
private void SetTSeconds()
{
int oldTSeconds = tSeconds;
this.tSeconds = Math.Max(0, (int)Math.Ceiling(t));
if (oldTSeconds != tSeconds && this.OnSecondsChanged != null)
{
OnSecondsChanged(tSeconds);
}
}
public void Stop()
{
if (!Active) return;
efm.Remove(this);
Active = false;
OnFinish = null;
}
private int pauseCount = 0;
public bool Paused { get { return pauseCount > 0; } }
public void Pause()
{
if (!Active) return;
pauseCount++;
if (pauseCount == 1)
{
efm.Remove(this);
}
}
public void Resume()
{
if (pauseCount == 0 || !hasTime) return;
pauseCount--;
if (pauseCount == 0)
{
efm.Add(this, delegate (float t) { Update(t); });
}
}
public void SetTime(float t)
{
this.t = t;
SetTSeconds();
}
public void AddTime(float a)
{
this.t += a;
SetTSeconds();
}
public void Update(float timeElapsed)
{
if (IgnoreFirstUpdate)
{
IgnoreFirstUpdate = false;
return;
}
if (!Active) return;
if (Paused) return;
t -= (timeElapsed * timeScale);
SetTSeconds();
if (t <= 0)
{
float actualTime = duration - t;
if (loop)
{
t += duration;
SetTSeconds();
}
else
{
t = 0;
SetTSeconds();
Active = false;
efm.Remove(this);
}
if (OnFinish != null) OnFinish();
}
}
}