ATBTimer.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System;
  2. namespace OpenVIII
  3. {
  4. public class ATBTimer
  5. {
  6. private bool _first = true;
  7. public int ATBBarIncrement { get; private set; }
  8. public float ATBBarPos { get; private set; }
  9. public bool Done => Percent >= 1f;
  10. public float Percent
  11. {
  12. get
  13. {
  14. var percent = Math.Abs(ATBBarPos / _damageable.ATBBarSize);
  15. return percent > 1f ? 1f : percent;
  16. }
  17. }
  18. private Damageable _damageable;
  19. public ATBTimer(Damageable damageable) => Refresh(damageable);
  20. /// <summary>
  21. /// Refresh damageable and start new turn. if Damageable is changed.
  22. /// </summary>
  23. /// <param name="damageable">Character,GF,Enemy</param>
  24. public void Refresh(Damageable damageable)
  25. {
  26. if (damageable == _damageable) return;
  27. _damageable = damageable;
  28. FirstTurn();
  29. }
  30. /// <summary>
  31. /// Start new turn.
  32. /// </summary>
  33. public void NewTurn()
  34. {
  35. if (_first)
  36. {
  37. ATBBarPos = _damageable?.ATBBarStart() ?? 0;
  38. _first = false;
  39. }
  40. else
  41. ATBBarPos = 0;
  42. }
  43. /// <summary>
  44. /// Start over.
  45. /// </summary>
  46. public void FirstTurn()
  47. {
  48. _first = true;
  49. _damageable?.Charging();
  50. NewTurn();
  51. }
  52. /// <summary>
  53. /// Reset to defaultState
  54. /// </summary>
  55. public void Reset() => FirstTurn();
  56. public bool Update()
  57. {
  58. if (_damageable == null || Done)
  59. {
  60. return false;
  61. }
  62. if (_damageable.IsDead && ATBBarPos > 0)
  63. {
  64. ATBBarPos = 0;
  65. return true;
  66. }
  67. var totalMilliseconds = Memory.ElapsedGameTime.TotalMilliseconds;
  68. ATBBarIncrement = _damageable.BarIncrement(); // 60 ticks per second.
  69. ATBBarPos += (float)(ATBBarIncrement * totalMilliseconds / 60);
  70. // if TotalMilliseconds is 1000 then it'll increment 60 times. So this should be right.
  71. return true;
  72. }
  73. }
  74. }