ATBTimer.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System;
  2. namespace OpenVIII
  3. {
  4. public class ATBTimer
  5. {
  6. private bool First = true;
  7. public int ATBBarIncrement { get; private set; } = 0;
  8. public float ATBBarPos { get; private set; } = 0;
  9. public bool Done => Percent >= 1f;
  10. public float Percent
  11. {
  12. get
  13. {
  14. float 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)
  27. {
  28. Damageable = damageable;
  29. FirstTurn();
  30. }
  31. }
  32. /// <summary>
  33. /// Start new turn.
  34. /// </summary>
  35. public void NewTurn()
  36. {
  37. if (First)
  38. {
  39. ATBBarPos = Damageable?.ATBBarStart() ?? 0;
  40. First = false;
  41. }
  42. else
  43. ATBBarPos = 0;
  44. }
  45. /// <summary>
  46. /// Start over.
  47. /// </summary>
  48. public void FirstTurn()
  49. {
  50. First = true;
  51. Damageable?.Charging();
  52. NewTurn();
  53. }
  54. /// <summary>
  55. /// Reset to defaultState
  56. /// </summary>
  57. public void Reset() => FirstTurn();
  58. public bool Update()
  59. {
  60. if (Damageable != null)
  61. {
  62. if (!Damageable.IsDead)
  63. {
  64. if (!Done)
  65. {
  66. double TotalMilliseconds = Memory.gameTime.ElapsedGameTime.TotalMilliseconds;
  67. ATBBarIncrement = Damageable.BarIncrement(); // 60 ticks per second.
  68. ATBBarPos += checked((float)(ATBBarIncrement * TotalMilliseconds / 60));
  69. // if TotalMilliseconds is 1000 then it'll increment 60 times. So this should be right.
  70. return true;
  71. }
  72. }
  73. else if (ATBBarPos > 0)
  74. {
  75. ATBBarPos = 0;
  76. return true;
  77. }
  78. }
  79. return false;
  80. }
  81. }
  82. }