using System;
namespace OpenVIII
{
public class ATBTimer
{
private bool First = true;
public int ATBBarIncrement { get; private set; } = 0;
public float ATBBarPos { get; private set; } = 0;
public bool Done => Percent >= 1f;
public float Percent
{
get
{
float 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)
{
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)
{
if (!Damageable.IsDead)
{
if (!Done)
{
double TotalMilliseconds = Memory.gameTime.ElapsedGameTime.TotalMilliseconds;
ATBBarIncrement = Damageable.BarIncrement(); // 60 ticks per second.
ATBBarPos += checked((float)(ATBBarIncrement * TotalMilliseconds / 60));
// if TotalMilliseconds is 1000 then it'll increment 60 times. So this should be right.
return true;
}
}
else if (ATBBarPos > 0)
{
ATBBarPos = 0;
return true;
}
}
return false;
}
}
}