using System;
namespace OpenVIII
{
public class ATBTimer
{
private bool _first = true;
public int ATBBarIncrement { get; private set; }
public float ATBBarPos { get; private set; }
public bool Done => Percent >= 1f;
public float Percent
{
get
{
var percent = Math.Abs(ATBBarPos / _damageable.ATBBarSize);
return percent > 1f ? 1f : percent;
}
}
private Damageable _damageable;
public ATBTimer(Damageable damageable) => Refresh(damageable);
///
/// Refresh damageable and start new turn. if Damageable is changed.
///
/// Character,GF,Enemy
public void Refresh(Damageable damageable)
{
if (damageable == _damageable) return;
_damageable = damageable;
FirstTurn();
}
///
/// Start new turn.
///
public void NewTurn()
{
if (_first)
{
ATBBarPos = _damageable?.ATBBarStart() ?? 0;
_first = false;
}
else
ATBBarPos = 0;
}
///
/// Start over.
///
public void FirstTurn()
{
_first = true;
_damageable?.Charging();
NewTurn();
}
///
/// Reset to defaultState
///
public void Reset() => FirstTurn();
public bool Update()
{
if (_damageable == null || Done)
{
return false;
}
if (_damageable.IsDead && ATBBarPos > 0)
{
ATBBarPos = 0;
return true;
}
var totalMilliseconds = Memory.ElapsedGameTime.TotalMilliseconds;
ATBBarIncrement = _damageable.BarIncrement(); // 60 ticks per second.
ATBBarPos += (float)(ATBBarIncrement * totalMilliseconds / 60);
// if TotalMilliseconds is 1000 then it'll increment 60 times. So this should be right.
return true;
}
}
}