PartyItems.cs 7.0 KB

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