BattleMenu.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. using Microsoft.Xna.Framework;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. namespace OpenVIII
  7. {
  8. /// <summary>
  9. /// Character BattleMenu
  10. /// </summary>
  11. public partial class BattleMenu : Menu
  12. {
  13. #region Destructors
  14. ~BattleMenu()
  15. {
  16. if (Damageable != null)
  17. Damageable.BattleModeChangeEventHandler -= ModeChangeEvent;
  18. }
  19. #endregion Destructors
  20. #region Enums
  21. public enum SectionName : byte
  22. {
  23. Commands,
  24. HP,
  25. Renzokeken,
  26. Shot
  27. }
  28. #endregion Enums
  29. #region Properties
  30. public sbyte CrisisLevel => ((IGMData.Commands)Data[SectionName.Commands]).CrisisLevel;
  31. public IGMData.Limit.Renzokeken Renzokeken
  32. {
  33. get
  34. {
  35. if (Data.TryGetValue(SectionName.Renzokeken, out Menu_Base val))
  36. return (IGMData.Limit.Renzokeken)val;
  37. return null;
  38. }
  39. }
  40. public IGMData.Limit.Shot Shot
  41. {
  42. get
  43. {
  44. if (Data.TryGetValue(SectionName.Shot, out Menu_Base val))
  45. return (IGMData.Limit.Shot)val;
  46. return null;
  47. }
  48. }
  49. #endregion Properties
  50. //private Mode _mode = Mode.Waiting;
  51. #region Methods
  52. //public BattleMenu(Damageable damageable) : base(damageable)
  53. //{
  54. //}
  55. public static BattleMenu Create(Damageable damageable) => Create<BattleMenu>(damageable);
  56. public void DrawData(SectionName v)
  57. {
  58. if (!skipdata && Enabled)
  59. foreach (KeyValuePair<Enum, Menu_Base> i in Data.Where(a => a.Key.Equals(v)))
  60. i.Value.Draw();
  61. }
  62. public override Enum GetMode() => Damageable.GetBattleMode();
  63. public override bool Inputs()
  64. {
  65. if (Data[SectionName.Renzokeken].Enabled)
  66. return Data[SectionName.Renzokeken].Inputs();
  67. else if (Data[SectionName.Shot].Enabled)
  68. return Data[SectionName.Shot].Inputs();
  69. return Data[SectionName.Commands].Inputs();
  70. }
  71. public override void ModeChangeEvent(object sender, Enum e)
  72. {
  73. switch (e)
  74. {
  75. case Damageable.BattleMode.EndTurn:
  76. Reset();
  77. Refresh();
  78. break;
  79. }
  80. }
  81. public override void Refresh(Damageable damageable)
  82. {
  83. if (Damageable != damageable)
  84. {
  85. if (Damageable != null)
  86. Damageable.BattleModeChangeEventHandler -= ModeChangeEvent;
  87. base.Refresh(damageable);
  88. if (Damageable != null)
  89. {
  90. Damageable.BattleModeChangeEventHandler += ModeChangeEvent;
  91. SetMode(Damageable.BattleMode.ATB_Charging);
  92. }
  93. }
  94. else base.Refresh(Damageable);
  95. }
  96. public override void Reset() => base.Reset();
  97. //public override bool SetMode(Enum mode) => Damageable.SetBattleMode(mode);
  98. protected override void Init()
  99. {
  100. NoInputOnUpdate = true;
  101. Size = new Vector2 { X = 880, Y = 636 };
  102. base.Init();
  103. InitAsync();
  104. }
  105. private void InitAsync()
  106. {
  107. //IGMData.NamesHPATB.ThreadUnsafeOperations(); //seems to work fine in init thread.
  108. //Memory.MainThreadOnlyActions.Enqueue(IGMData.Renzokeken.ThreadUnsafeOperations); //only works in main thread.
  109. Memory.MainThreadOnlyActions.Enqueue(() => Data.TryAdd(SectionName.Renzokeken, IGMData.Limit.Renzokeken.Create(new Rectangle(0, 500, (int)Size.X, 124))));
  110. int width = 100, height = 100;
  111. Memory.MainThreadOnlyActions.Enqueue(() => Data.TryAdd(SectionName.Shot, IGMData.Limit.Shot.Create(new Rectangle((int)Size.X - width, (int)Size.Y - 20 - height - 20, width, height))));
  112. List<Task> tasks = new List<Task>
  113. {
  114. Task.Run(() => Data.TryAdd(SectionName.Commands, IGMData.Commands.Create(new Rectangle(50, (int)(Size.Y - 204), 210, 192), Damageable, true))),
  115. Task.Run(() => Data.TryAdd(SectionName.HP, IGMData.NamesHPATB.Create(new Rectangle((int)(Size.X - 389), 507, 389, 126), Damageable))),
  116. };
  117. //Some code that cannot be threaded on init.
  118. //Data.TryAdd(SectionName.HP, IGMData.NamesHPATB.Create(new Rectangle((int)(Size.X - 389), 507, 389, 126), Damageable));
  119. //Data.TryAdd(SectionName.Renzokeken, IGMData.Renzokeken.Create(new Rectangle(0, 500, (int)Size.X, 124)));
  120. if (!Task.WaitAll(tasks.ToArray(), 10000))
  121. throw new TimeoutException("Task took too long!");
  122. //Data[SectionName.Commands].Hide();
  123. //var t = Task.WhenAll(tasks);
  124. //try
  125. //{
  126. // await t;
  127. //}
  128. //catch { }
  129. //if (t.Status == TaskStatus.RanToCompletion)
  130. // Console.WriteLine("All attempts succeeded.");
  131. //else if (t.Status == TaskStatus.Faulted)
  132. // Console.WriteLine(t.Exception);
  133. }
  134. #endregion Methods
  135. }
  136. }