PartyItems.cs 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. using Microsoft.Xna.Framework;
  2. using OpenVIII.Encoding.Tags;
  3. using System.Collections.Concurrent;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. namespace OpenVIII.IGMData
  7. {
  8. public class PartyItems : IGMData.Base
  9. {
  10. #region Fields
  11. private readonly FF8String DialogSelectedItem;
  12. private readonly FF8String str_NotFound;
  13. private readonly FF8String str_Over100;
  14. private readonly FF8String str_Recieved;
  15. private ConcurrentQueue<KeyValuePair<Cards.ID, byte>> _cards;
  16. private Saves.Item _item;
  17. private KeyValuePair<Cards.ID, byte> card;
  18. #endregion Fields
  19. #region Constructors
  20. public PartyItems() : base()
  21. {
  22. str_NotFound = Memory.Strings.Read(Strings.FileID.KERNEL, 30, 28);
  23. str_Over100 = Memory.Strings.Read(Strings.FileID.KERNEL, 30, 24);
  24. str_Recieved = Memory.Strings.Read(Strings.FileID.KERNEL, 30, 6);
  25. DialogSelectedItem = new byte[] { (byte)FF8TextTagCode.Dialog, (byte)FF8TextTagDialog.SelectedItem };
  26. }
  27. #endregion Constructors
  28. #region Properties
  29. public Saves.Item Item { get => _item; private set => _item = value; }
  30. public ConcurrentQueue<Saves.Item> Items { get; private set; }
  31. #endregion Properties
  32. #region Methods
  33. public static PartyItems Create(Rectangle pos) => Create<PartyItems>(1, 7, new IGMDataItem.Empty { Pos = pos }, 1, 1);
  34. public void Earn()
  35. {
  36. skipsnd = true;
  37. init_debugger_Audio.PlaySound(17);
  38. }
  39. public override bool Inputs_CANCEL() => false;
  40. public override bool Inputs_OKAY()
  41. {
  42. if (ITEM[0, 5].Enabled || ITEM[0, 6].Enabled)
  43. {
  44. if (Items != null && Items.Count > 0 || _cards != null && _cards.Count > 0)
  45. {
  46. Refresh();
  47. base.Inputs_OKAY();
  48. return true;
  49. }
  50. }
  51. else if (Items != null && Items.Count > 0)
  52. {
  53. if (Items.TryDequeue(out Saves.Item item) && Memory.State.Items.FirstOrDefault(x=>x.ID == item.ID).QTY < Memory.State.EarnItem(item).QTY)
  54. {
  55. ITEM?[0, 6]?.Show();
  56. Earn();
  57. }
  58. else
  59. {
  60. ITEM?[0, 5]?.Show();
  61. Earn();
  62. }
  63. base.Inputs_OKAY();
  64. return true;
  65. }
  66. else if (_cards != null && _cards.Count > 0)
  67. {
  68. if (_cards.TryDequeue(out KeyValuePair<Cards.ID, byte> card) && Memory.State.EarnItem(card))
  69. {
  70. ITEM?[0, 6]?.Show();
  71. Earn();
  72. }
  73. else
  74. {
  75. ITEM?[0, 5]?.Show();
  76. Earn();
  77. }
  78. base.Inputs_OKAY();
  79. return true;
  80. }
  81. return false;
  82. }
  83. public override void Refresh()
  84. {
  85. base.Refresh();
  86. if (Items != null && Items.TryPeek(out _item))
  87. {
  88. ((IGMDataItem.Box)ITEM[0, 1]).Data = Item.DATA?.Name;
  89. ((IGMDataItem.Box)ITEM[0, 2]).Data = $"{Item.QTY}";
  90. ((IGMDataItem.Box)ITEM[0, 3]).Data = Item.DATA?.Description;
  91. ((IGMData.Dialog.Small)ITEM[0, 5]).Data = str_Over100.Clone().Replace(DialogSelectedItem, Item.DATA?.Name);
  92. ((IGMData.Dialog.Small)ITEM[0, 5]).Data = str_Over100.Clone().Replace(DialogSelectedItem, Item.DATA?.Name);
  93. ITEM[0, 1].Show();
  94. ITEM[0, 2].Show();
  95. ITEM[0, 3].Show();
  96. ITEM[0, 4].Hide();
  97. ITEM[0, 5].Hide();
  98. ITEM[0, 6].Hide();
  99. }
  100. else
  101. if (_cards != null && _cards.TryPeek(out card))
  102. {
  103. FF8StringReference name = Memory.Strings.Read(Strings.FileID.MNGRP, 110, (int)card.Key);
  104. int pos = 0;
  105. for (; pos < name.Length; pos++)
  106. if (name.Value[pos] == 2) break;
  107. ((IGMDataItem.Box)ITEM[0, 1]).Data = new FF8String(name.Value.Take(pos - 1).ToArray());
  108. //TODO grab card name from start of string
  109. ((IGMDataItem.Box)ITEM[0, 2]).Data = $"{card.Value}";
  110. ((IGMDataItem.Box)ITEM[0, 3]).Data = "";
  111. ((IGMData.Dialog.Small)ITEM[0, 5]).Data = str_Over100.Clone().Replace(DialogSelectedItem, Item.DATA?.Name);
  112. ((IGMData.Dialog.Small)ITEM[0, 5]).Data = str_Over100.Clone().Replace(DialogSelectedItem, Item.DATA?.Name);
  113. ITEM[0, 1].Show();
  114. ITEM[0, 2].Show();
  115. ITEM[0, 3].Hide();
  116. ITEM[0, 4].Hide();
  117. ITEM[0, 5].Hide();
  118. ITEM[0, 6].Hide();
  119. }
  120. else
  121. {
  122. ITEM?[0, 1]?.Hide();
  123. ITEM?[0, 2]?.Hide();
  124. ITEM?[0, 3]?.Hide();
  125. ITEM?[0, 4]?.Show();
  126. ITEM?[0, 5]?.Hide();
  127. ITEM?[0, 6]?.Hide();
  128. }
  129. }
  130. public void SetItems(ConcurrentDictionary<Cards.ID, byte> cards)
  131. {
  132. if (cards.Count > 0)
  133. {
  134. _cards = new ConcurrentQueue<KeyValuePair<Cards.ID, byte>>();
  135. foreach (KeyValuePair<Cards.ID, byte> e in cards)
  136. _cards.Enqueue(e);
  137. }
  138. else _cards = null;
  139. }
  140. public void SetItems(ConcurrentDictionary<byte, byte> items)
  141. {
  142. if (items.Count > 0)
  143. {
  144. Items = new ConcurrentQueue<Saves.Item>();
  145. foreach (KeyValuePair<byte, byte> e in items)
  146. Items.Enqueue(new Saves.Item(e));
  147. }
  148. else Items = null;
  149. }
  150. protected override void Init()
  151. {
  152. base.Init();
  153. Hide();
  154. ITEM[0, 0] = new IGMDataItem.Box { Data = Memory.Strings.Read(Strings.FileID.KERNEL, 30, 21), Pos = new Rectangle(SIZE[0].X, SIZE[0].Y, SIZE[0].Width, 78), Title = Icons.ID.INFO, Options = Box_Options.Middle };
  155. ITEM[0, 1] = new IGMDataItem.Box { Pos = new Rectangle(SIZE[0].X + 140, SIZE[0].Y + 189, 475, 78), Title = Icons.ID.ITEM, Options = Box_Options.Middle }; // item name
  156. ITEM[0, 2] = new IGMDataItem.Box { Pos = new Rectangle(SIZE[0].X + 615, SIZE[0].Y + 189, 125, 78), Title = Icons.ID.NUM_, Options = Box_Options.Middle | Box_Options.Center }; // item count
  157. ITEM[0, 3] = new IGMDataItem.Box { Pos = new Rectangle(SIZE[0].X, SIZE[0].Y + 444, SIZE[0].Width, 78), Title = Icons.ID.HELP, Options = Box_Options.Middle }; // item description
  158. ITEM[0, 4] = IGMData.Dialog.Small.Create(null, SIZE[0].X + 232, SIZE[0].Y + 315, Icons.ID.NOTICE, Box_Options.Center | Box_Options.Middle, SIZE[0]); // Couldn't find any items
  159. ITEM[0, 5] = IGMData.Dialog.Small.Create(null, SIZE[0].X + 230, SIZE[0].Y + 291, Icons.ID.NOTICE, Box_Options.Center, SIZE[0]); // over 100 discarded
  160. ITEM[0, 6] = IGMData.Dialog.Small.Create(null, SIZE[0].X + 232, SIZE[0].Y + 315, Icons.ID.NOTICE, Box_Options.Center, SIZE[0]); // Recieved item
  161. Cursor_Status |= (Cursor_Status.Hidden | (Cursor_Status.Enabled | Cursor_Status.Static));
  162. }
  163. #endregion Methods
  164. }
  165. }