IGMData_TargetPool.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using Microsoft.Xna.Framework;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics.CodeAnalysis;
  5. namespace OpenVIII
  6. {
  7. public partial class IGMItems
  8. {
  9. #region Classes
  10. /// <summary>
  11. /// </summary>
  12. /// <remarks>
  13. /// Using Faces.ID because it contains characters and gfs. Can cast to Characters or subtract
  14. /// 16 and cast to GFs
  15. /// </remarks>
  16. private class TargetPool : IGMData.Pool.Base<Saves.Data, Faces.ID>
  17. {
  18. #region Fields
  19. private bool _eventSet;
  20. private bool _forceRefresh;
  21. #endregion Fields
  22. #region Properties
  23. private bool All => (Item.ItemTarget & (ItemTarget.All | ItemTarget.All2)) != 0;
  24. private ItemInMenu Item { get; set; }
  25. private static bool IsMe => IGMItems.GetMode().Equals(Mode.UseItemOnTarget);
  26. #endregion Properties
  27. #region Methods
  28. [SuppressMessage("ReSharper", "MemberHidesStaticFromOuterClass")]
  29. public static TargetPool Create()
  30. {
  31. var r = Create<TargetPool>(9, 3, new IGMDataItem.Box { Pos = new Rectangle(420, 150, 420, 360), Title = Icons.ID.TARGET }, 9, 1);
  32. r.Cursor_Status &= ~Cursor_Status.Enabled;
  33. return r;
  34. }
  35. public override void Draw()
  36. {
  37. if (All && IsMe)
  38. Cursor_Status &= ~Cursor_Status.Enabled;
  39. base.Draw();
  40. if (!All || !IsMe) return;
  41. // if all draw blinking pointers on everyone.
  42. byte i = 0;
  43. foreach (var c in CURSOR)
  44. {
  45. if (!BLANKS[i] && ITEM[i, 0] != null && ITEM[i, 0].Enabled && c != Point.Zero)
  46. DrawPointer(c, blink: true);
  47. i++;
  48. }
  49. Cursor_Status |= Cursor_Status.Enabled;
  50. }
  51. public override bool Inputs()
  52. {
  53. // if ((Item.Target & (Item_In_Menu._Target.All|Item_In_Menu._Target.All2)) == 0)
  54. Cursor_Status |= Cursor_Status.Enabled;
  55. return base.Inputs();
  56. }
  57. public override bool Inputs_CANCEL()
  58. {
  59. base.Inputs_CANCEL();
  60. IGMItems.SetMode(Mode.SelectItem);
  61. return true;
  62. }
  63. public override bool Inputs_OKAY()
  64. {
  65. var ret = false;
  66. if (All)
  67. ret = Item.Use(Faces.ID.Blank);
  68. else if (!BLANKS[CURSOR_SELECT])
  69. ret = Item.Use(Contents[CURSOR_SELECT]);
  70. if (ret)
  71. {
  72. base.Inputs_OKAY();
  73. Fill();
  74. IGMItems.Refresh(true);
  75. return true;
  76. }
  77. return false;
  78. }
  79. public override void ModeChangeEvent(object sender, Enum e)
  80. {
  81. if (!IsMe)
  82. Cursor_Status &= ~Cursor_Status.Enabled;
  83. else
  84. IGMItems.TargetChangeHandler?.Invoke(this, Contents[CURSOR_SELECT]);
  85. }
  86. public override void Refresh()
  87. {
  88. if (!_eventSet && IGMItems != null)
  89. {
  90. IGMItems.ModeChangeHandler += ModeChangeEvent;
  91. IGMItems.ChoiceChangeHandler += ChoiceChangeEvent;
  92. IGMItems.ItemPool.ItemChangeHandler += ItemTypeChangeEvent;
  93. _eventSet = true;
  94. }
  95. ////List won't populate unless theres a valid item set.
  96. //if (Item.Type == Item_In_Menu._Type.None && Memory.State.Items != null)
  97. // Item = Memory.MItems[Memory.State.Items.FirstOrDefault(m => m.ID > 0 && m.QTY > 0).ID];
  98. else
  99. Fill();
  100. _forceRefresh = true;
  101. base.Refresh();
  102. }
  103. public override void ResetPages()
  104. {
  105. }
  106. protected override void Init()
  107. {
  108. base.Init();
  109. for (var i = 0; i < Rows; i++)
  110. {
  111. ITEM[i, 0] = new IGMDataItem.Text { Pos = SIZE[i] };
  112. ITEM[i, 0].Hide();
  113. ITEM[i, 1] = new IGMDataItem.Icon { Data = Icons.ID.HP2, Pos = new Rectangle(SIZE[i].X + SIZE[i].Width - (20 * 7), SIZE[i].Y, 0, 0), Palette = 13 };
  114. ITEM[i, 1].Hide();
  115. ITEM[i, 2] = new IGMDataItem.Integer { Pos = new Rectangle(SIZE[i].X + SIZE[i].Width - (20 * 4), SIZE[i].Y, 0, 0), Spaces = 4 };
  116. ITEM[i, 2].Hide();
  117. }
  118. }
  119. protected override void InitShift(int i, int col, int row)
  120. {
  121. base.InitShift(i, col, row);
  122. SIZE[i].Inflate(-18, -20);
  123. SIZE[i].Y -= 3 * row;
  124. //SIZE[i].X += 2;
  125. SIZE[i].Height = (int)(12 * TextScale.Y);
  126. }
  127. protected override void PAGE_NEXT()
  128. {
  129. if (Pages <= 1) return;
  130. base.PAGE_NEXT();
  131. Fill();
  132. base.Refresh();
  133. }
  134. protected override void PAGE_PREV()
  135. {
  136. if (Pages <= 1) return;
  137. base.PAGE_PREV();
  138. Fill();
  139. base.Refresh();
  140. }
  141. protected override void SetCursor_select(int value)
  142. {
  143. if (value.Equals(GetCursor_select())) return;
  144. base.SetCursor_select(value);
  145. IGMItems.TargetChangeHandler?.Invoke(this, Contents[CURSOR_SELECT]);
  146. }
  147. private static void ChoiceChangeEvent(object sender, KeyValuePair<byte, FF8String> e)
  148. {
  149. }
  150. private void Fill()
  151. {
  152. Faces.ID id = 0;
  153. var skip = Page * Rows;
  154. for (var i = 0; i < Rows; i++)
  155. {
  156. while (!Enum.IsDefined(typeof(Faces.ID), id)
  157. || !((Item.TestCharacter(ref id, out _)) || (Item.TestGF(ref id, out _)))
  158. || skip-- > 0)
  159. if ((byte)++id > 32)
  160. {
  161. for (; i < Rows; i++)
  162. {
  163. ITEM[i, 0].Hide();
  164. ITEM[i, 1].Hide();
  165. ITEM[i, 2].Hide();
  166. BLANKS[i] = true;
  167. Contents[i] = Faces.ID.Blank;
  168. }
  169. //Pages = Page + 1;
  170. return;
  171. }
  172. ((IGMDataItem.Text)ITEM[i, 0]).Data = Memory.Strings.GetName(id);
  173. ITEM[i, 0].Show();
  174. var hp = Memory.State[id]?.CurrentHP() ?? -1;
  175. BLANKS[i] = false;
  176. Contents[i] = id;
  177. if (hp > -1)
  178. {
  179. ((IGMDataItem.Integer)ITEM[i, 2]).Data = hp;
  180. ITEM[i, 1].Show();
  181. ITEM[i, 2].Show();
  182. }
  183. else
  184. {
  185. ITEM[i, 1].Hide();
  186. ITEM[i, 2].Hide();
  187. }
  188. id++;
  189. }
  190. //Pages = Page + 2;
  191. }
  192. private void ItemTypeChangeEvent(object sender, KeyValuePair<ItemInMenu, FF8String> e)
  193. {
  194. CURSOR_SELECT = 0;
  195. if (Item.Equals(e.Key) && Page <= 0) return;
  196. Page = 0;
  197. var sameTargets = Item.ItemTarget != e.Key.ItemTarget || Item.ItemType != e.Key.ItemType;
  198. if (!sameTargets)
  199. {
  200. sameTargets = (Item.ItemType == ItemType.GFLearn && Item.Learn != e.Key.Learn);
  201. sameTargets = sameTargets || (Item.ItemType == ItemType.BlueMagic && Item.LearnedBlueMagic != e.Key.LearnedBlueMagic);
  202. }
  203. Item = e.Key;
  204. if (!sameTargets && !_forceRefresh) return;
  205. Fill();
  206. base.Refresh();
  207. _forceRefresh = false;
  208. }
  209. #endregion Methods
  210. }
  211. #endregion Classes
  212. }
  213. }