Combine.cs 8.2 KB

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