Combine.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. using System.Linq;
  2. using Microsoft.Xna.Framework;
  3. using OpenVIII.IGMDataItem;
  4. using OpenVIII.Kernel;
  5. namespace OpenVIII.IGMData.Pool
  6. {
  7. public class Combine : Base<Damageable, Combine.KernelItem>
  8. {
  9. #region Properties
  10. protected Target.Group Target_Group { get => ((Target.Group)ITEM[Count - 3, 0]); private set => ITEM[Count - 3, 0] = value; }
  11. #endregion Properties
  12. #region Methods
  13. public static Combine Create(Rectangle pos, Damageable damageable = null, bool battle = false, int count = 2)
  14. {
  15. var r = Create<Combine>(count + 1, 1, new Box { Pos = pos, Title = Icons.ID.SPECIAL }, count, 1, damageable, battle: battle);
  16. if (battle)
  17. r.Target_Group = Target.Group.Create(r.Damageable);
  18. return r;
  19. }
  20. public override bool Inputs()
  21. {
  22. var ret = false;
  23. if (InputITEM(Target_Group, ref ret))
  24. { }
  25. else
  26. {
  27. Cursor_Status |= Cursor_Status.Enabled;
  28. return base.Inputs();
  29. }
  30. return ret;
  31. }
  32. public override bool Inputs_CANCEL()
  33. {
  34. base.Inputs_CANCEL();
  35. Hide();
  36. return true;
  37. }
  38. public override bool Inputs_OKAY()
  39. {
  40. base.Inputs_OKAY();
  41. var item = Contents[CURSOR_SELECT];
  42. if (!BLANKS[CURSOR_SELECT])
  43. {
  44. Target_Group?.SelectTargetWindows(item);
  45. Target_Group?.ShowTargetWindows();
  46. }
  47. return true;
  48. }
  49. public override void Refresh()
  50. {
  51. var i = 0;
  52. var skip = Page * Rows;
  53. bool AddAngelo(KernelItem item)
  54. {
  55. if (i >= Rows) return false;
  56. if (skip-- <= 0)
  57. {
  58. ((Text)ITEM[i, 0]).Data = item.Name;
  59. Contents[i] = item;
  60. BLANKS[i] = false;
  61. ITEM[i, 0].Show();
  62. i++;
  63. }
  64. return true;
  65. }
  66. if (Memory.KernelBin.RinoaLimitBreaksPart1 != null)
  67. foreach (var lb in Memory.KernelBin.RinoaLimitBreaksPart1)
  68. if (!AddAngelo(new KernelItem
  69. {
  70. rinoa_Limit_Breaks_Part_1 = lb,
  71. rinoa_Limit_Breaks_Part_2 = lb.Angelo == Angelo.Angel_Wing ?
  72. Memory.KernelBin.RinoaLimitBreaksPart2.First(x => x.Angelo == lb.Angelo) : null
  73. })) break;
  74. if (Memory.KernelBin.RinoaLimitBreaksPart2 != null)
  75. foreach (var lb in Memory.KernelBin.RinoaLimitBreaksPart2)
  76. if (lb.Angelo != Angelo.Angel_Wing && !AddAngelo(
  77. new KernelItem { rinoa_Limit_Breaks_Part_2 = lb })) break;
  78. var non_Junctionable_GFs_Attacks_Datas =
  79. Memory.KernelBin.NonJunctionableGFsAttacksData?.Where(x => !x.Angelo.Equals(Angelo.None));
  80. if (non_Junctionable_GFs_Attacks_Datas != null)
  81. foreach (var lb in non_Junctionable_GFs_Attacks_Datas)
  82. if (!AddAngelo(
  83. new KernelItem { non_Junctionable_GFs_Attacks_Data = lb })) break;
  84. DefaultPages = ((Memory.KernelBin.RinoaLimitBreaksPart1?.Count ?? 0) +
  85. (Memory.KernelBin.RinoaLimitBreaksPart2?.Count ?? 0) +
  86. (non_Junctionable_GFs_Attacks_Datas?.Count() ?? 1) - 1) / Rows;
  87. for (; i < Rows; i++)
  88. {
  89. BLANKS[i] = true;
  90. ITEM[i, 0].Hide();
  91. }
  92. UpdateTitle();
  93. base.Refresh();
  94. }
  95. public override void Reset()
  96. {
  97. Hide();
  98. base.Reset();
  99. }
  100. protected override void Init()
  101. {
  102. base.Init();
  103. for (var i = 0; i < Rows; i++)
  104. {
  105. ITEM[i, 0] = new Text
  106. {
  107. Pos = SIZE[i]
  108. };
  109. ITEM[i, 0].Hide();
  110. }
  111. }
  112. protected override void InitShift(int i, int col, int row)
  113. {
  114. base.InitShift(i, col, row);
  115. SIZE[i].Inflate(-22, -8);
  116. SIZE[i].Offset(0, 12 + (-8 * row));
  117. SIZE[i].Height = (int)(12 * TextScale.Y);
  118. }
  119. protected override void PAGE_NEXT()
  120. {
  121. base.PAGE_NEXT();
  122. Refresh();
  123. }
  124. protected override void PAGE_PREV()
  125. {
  126. base.PAGE_PREV();
  127. Refresh();
  128. }
  129. public override void UpdateTitle()
  130. {
  131. base.UpdateTitle();
  132. if (Pages == 1)
  133. {
  134. ((Box)CONTAINER).Title = Icons.ID.SPECIAL;
  135. }
  136. else
  137. switch (Page)
  138. {
  139. case 0:
  140. ((Box)CONTAINER).Title = Icons.ID.SPECIAL_PG1;
  141. break;
  142. case 1:
  143. ((Box)CONTAINER).Title = Icons.ID.SPECIAL_PG2;
  144. break;
  145. case 2:
  146. ((Box)CONTAINER).Title = Icons.ID.SPECIAL_PG3;
  147. break;
  148. case 3:
  149. ((Box)CONTAINER).Title = Icons.ID.SPECIAL_PG4;
  150. break;
  151. default:
  152. ((Box)CONTAINER).Title = Icons.ID.SPECIAL;
  153. break;
  154. }
  155. }
  156. #endregion Methods
  157. #region Structs
  158. public struct KernelItem
  159. {
  160. #region Fields
  161. public NonJunctionableGFsAttacksData non_Junctionable_GFs_Attacks_Data;
  162. public RinoaLimitBreaksPart1 rinoa_Limit_Breaks_Part_1;
  163. public RinoaLimitBreaksPart2 rinoa_Limit_Breaks_Part_2;
  164. #endregion Fields
  165. #region Properties
  166. public int ID
  167. {
  168. get
  169. {
  170. if (rinoa_Limit_Breaks_Part_1 != null)
  171. return rinoa_Limit_Breaks_Part_1.RinoaLimitID;
  172. if (rinoa_Limit_Breaks_Part_2 != null)
  173. return rinoa_Limit_Breaks_Part_2.RinoaLimit2ID;
  174. if (non_Junctionable_GFs_Attacks_Data != null)
  175. return non_Junctionable_GFs_Attacks_Data.NonGFID;
  176. return 0;
  177. }
  178. }
  179. public FF8String Name
  180. {
  181. get
  182. {
  183. FF8String replace(FF8String str)
  184. {
  185. return str.Clone().Replace(new FF8String(new byte[] { 3, 64 }), Memory.State.AngeloName);
  186. }
  187. if (rinoa_Limit_Breaks_Part_1 != null)
  188. return replace(rinoa_Limit_Breaks_Part_1.Name);
  189. if (rinoa_Limit_Breaks_Part_2 != null)
  190. return replace(rinoa_Limit_Breaks_Part_2.Name);
  191. if (non_Junctionable_GFs_Attacks_Data != null)
  192. return replace(non_Junctionable_GFs_Attacks_Data.Name);
  193. return null;
  194. }
  195. }
  196. public Kernel.Target Target
  197. {
  198. get
  199. {
  200. Kernel.Target r = 0;
  201. if (rinoa_Limit_Breaks_Part_1 != null)
  202. r |= rinoa_Limit_Breaks_Part_1.Target;
  203. if (rinoa_Limit_Breaks_Part_2 != null)
  204. r |= rinoa_Limit_Breaks_Part_2.Target;
  205. // there is no target from njGFs so must be set in battle scripts.
  206. // setting a base default for those.
  207. if (non_Junctionable_GFs_Attacks_Data != null)
  208. r |= Kernel.Target.Enemy |
  209. Kernel.Target.Ally |
  210. Kernel.Target.SingleTarget;
  211. //non_Junctionable_GFs_Attacks_Data.Target;
  212. return r;
  213. }
  214. }
  215. #endregion Properties
  216. }
  217. #endregion Structs
  218. }
  219. }