2
0

GF.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. using Microsoft.Xna.Framework;
  2. using OpenVIII.Kernel;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace OpenVIII.IGMData.Pool
  6. {
  7. public class GF : Base<Saves.Data, GFs>
  8. {
  9. #region Properties
  10. public Dictionary<GFs, Characters> JunctionedGFs { get; private set; }
  11. public IEnumerable<GFs> UnlockedGFs { get; private set; }
  12. #endregion Properties
  13. #region Methods
  14. public static GF Create(Rectangle? pos = null, Damageable damageable = null, bool battle = false)
  15. {
  16. var r = new GF
  17. {
  18. Count = 5,
  19. Depth = 3,
  20. CONTAINER = new IGMDataItem.Box
  21. {
  22. Pos = pos ?? new Rectangle(440, 149, 385, 193),
  23. Title = Icons.ID.GF
  24. },
  25. Rows = 4,
  26. DefaultPages = 4,
  27. Battle = battle
  28. };
  29. r.SetDamageable(damageable);
  30. r.Init();
  31. r.Refresh();
  32. r.Update();
  33. return r;
  34. }
  35. public override bool Inputs_CANCEL()
  36. {
  37. if (Battle) Hide();
  38. else
  39. {
  40. base.Inputs_CANCEL();
  41. Menu.Junction.Data[Junction.SectionName.TopMenu_GF_Group].Hide();
  42. Menu.Junction.SetMode(Junction.Mode.TopMenu_Junction);
  43. }
  44. return true;
  45. }
  46. public override bool Inputs_OKAY()
  47. {
  48. if (Battle)
  49. {
  50. base.Inputs_OKAY();
  51. Damageable.SetSummon(Contents[CURSOR_SELECT]);
  52. Hide();
  53. return true;
  54. }
  55. else
  56. {
  57. skipsnd = true;
  58. AV.Sound.Play(31);
  59. base.Inputs_OKAY();
  60. var select = Contents[CURSOR_SELECT];
  61. var characterID = Damageable.GetCharacterData(out var characterData) && JunctionedGFs.ContainsKey(select) ?
  62. JunctionedGFs[select] : characterData?.ID ?? Characters.Blank;
  63. if (characterID == Characters.Blank) return false;
  64. if (characterData != null && characterID == characterData.ID)
  65. {
  66. //Purge everything that you can't have anymore. Because the GF provided for you.
  67. var a = (characterData).UnlockedGFAbilities;
  68. characterData.RemoveJunctionedGF(select);
  69. var b = (characterData).UnlockedGFAbilities;
  70. foreach (var r in a.Except(b).Where(v => !Memory.KernelBin.JunctionAbilities.ContainsKey(v)))
  71. {
  72. if (Memory.KernelBin.CommandAbilities.ContainsKey(r))
  73. {
  74. characterData.Commands.Remove(r);
  75. characterData.Commands.Add(Abilities.None);
  76. }
  77. else if (Memory.KernelBin.EquippableAbilities.ContainsKey(r))
  78. {
  79. characterData.Abilities.Remove(r);
  80. characterData.Abilities.Add(Abilities.None);
  81. }
  82. }
  83. foreach (var r in a.Except(b).Where(v => Memory.KernelBin.JunctionAbilities.ContainsKey(v)))
  84. {
  85. if (Kernel.KernelBin.Stat2Ability.Any(item => item.Value == r))
  86. switch (r)
  87. {
  88. case Abilities.StAtkJ:
  89. characterData.StatJ[Stat.StAtk] = 0;
  90. break;
  91. case Abilities.ElAtkJ:
  92. characterData.StatJ[Stat.ElAtk] = 0;
  93. break;
  94. case Abilities.ElDefJ:
  95. case Abilities.ElDefJ2:
  96. case Abilities.ElDefJ4:
  97. byte count = 0;
  98. if (b.Contains(Abilities.ElDefJ4))
  99. count = 4;
  100. else if (b.Contains(Abilities.ElDefJ2))
  101. count = 2;
  102. else if (b.Contains(Abilities.ElDefJ))
  103. count = 1;
  104. for (; count < 4; count++)
  105. characterData.StatJ[Stat.ElDef1 + count] = 0;
  106. break;
  107. case Abilities.StDefJ:
  108. case Abilities.StDefJ2:
  109. case Abilities.StDefJ4:
  110. count = 0;
  111. if (b.Contains(Abilities.StDefJ4))
  112. count = 4;
  113. else if (b.Contains(Abilities.StDefJ2))
  114. count = 2;
  115. else if (b.Contains(Abilities.StDefJ))
  116. count = 1;
  117. for (; count < 4; count++)
  118. characterData.StatJ[Stat.StDef1 + count] = 0;
  119. break;
  120. case Abilities.Ability3:
  121. case Abilities.Ability4:
  122. count = 2;
  123. if (b.Contains(Abilities.Ability4))
  124. count = 4;
  125. else if (b.Contains(Abilities.Ability3))
  126. count = 3;
  127. for (; count < characterData.Abilities.Count; count++)
  128. characterData.Abilities[count] = Abilities.None;
  129. break;
  130. case Abilities.None:
  131. break;
  132. case Abilities.HPJ:
  133. break;
  134. case Abilities.StrJ:
  135. break;
  136. case Abilities.VitJ:
  137. break;
  138. case Abilities.MagJ:
  139. break;
  140. case Abilities.SprJ:
  141. break;
  142. case Abilities.SpdJ:
  143. break;
  144. case Abilities.EvaJ:
  145. break;
  146. case Abilities.HitJ:
  147. break;
  148. case Abilities.LuckJ:
  149. break;
  150. case Abilities.Magic:
  151. break;
  152. case Abilities.GF:
  153. break;
  154. case Abilities.Draw:
  155. break;
  156. case Abilities.Item:
  157. break;
  158. case Abilities.Empty:
  159. break;
  160. case Abilities.Card:
  161. break;
  162. case Abilities.Doom:
  163. break;
  164. case Abilities.MadRush:
  165. break;
  166. case Abilities.Treatment:
  167. break;
  168. case Abilities.Defend:
  169. break;
  170. case Abilities.Darkside:
  171. break;
  172. case Abilities.Recover:
  173. break;
  174. case Abilities.Absorb:
  175. break;
  176. case Abilities.Revive:
  177. break;
  178. case Abilities.LvDown:
  179. break;
  180. case Abilities.LvUp:
  181. break;
  182. case Abilities.Kamikaze:
  183. break;
  184. case Abilities.Devour:
  185. break;
  186. case Abilities.MiniMog:
  187. break;
  188. case Abilities.HP20:
  189. break;
  190. case Abilities.HP40:
  191. break;
  192. case Abilities.HP80:
  193. break;
  194. case Abilities.Str20:
  195. break;
  196. case Abilities.Str40:
  197. break;
  198. case Abilities.Str60:
  199. break;
  200. case Abilities.Vit20:
  201. break;
  202. case Abilities.Vit40:
  203. break;
  204. case Abilities.Vit60:
  205. break;
  206. case Abilities.Mag20:
  207. break;
  208. case Abilities.Mag40:
  209. break;
  210. case Abilities.Mag60:
  211. break;
  212. case Abilities.Spr20:
  213. break;
  214. case Abilities.Spr40:
  215. break;
  216. case Abilities.Spr60:
  217. break;
  218. case Abilities.Spd20:
  219. break;
  220. case Abilities.Spd40:
  221. break;
  222. case Abilities.Eva30:
  223. break;
  224. case Abilities.Luck50:
  225. break;
  226. case Abilities.Mug:
  227. break;
  228. case Abilities.MedData:
  229. break;
  230. case Abilities.Counter:
  231. break;
  232. case Abilities.ReturnDamage:
  233. break;
  234. case Abilities.Cover:
  235. break;
  236. case Abilities.Initiative:
  237. break;
  238. case Abilities.MoveHPUp:
  239. break;
  240. case Abilities.HPBonus:
  241. break;
  242. case Abilities.StrBonus:
  243. break;
  244. case Abilities.VitBonus:
  245. break;
  246. case Abilities.MagBonus:
  247. break;
  248. case Abilities.SprBonus:
  249. break;
  250. case Abilities.AutoProtect:
  251. break;
  252. case Abilities.AutoShell:
  253. break;
  254. case Abilities.AutoReflect:
  255. break;
  256. case Abilities.AutoHaste:
  257. break;
  258. case Abilities.AutoPotion:
  259. break;
  260. case Abilities.Expend2:
  261. break;
  262. case Abilities.Expend3:
  263. break;
  264. case Abilities.Ribbon:
  265. break;
  266. case Abilities.Alert:
  267. break;
  268. case Abilities.MoveFind:
  269. break;
  270. case Abilities.EncHalf:
  271. break;
  272. case Abilities.EncNone:
  273. break;
  274. case Abilities.RareItem:
  275. break;
  276. case Abilities.SumMag10:
  277. break;
  278. case Abilities.SumMag20:
  279. break;
  280. case Abilities.SumMag30:
  281. break;
  282. case Abilities.SumMag40:
  283. break;
  284. case Abilities.GFHP10:
  285. break;
  286. case Abilities.GFHP20:
  287. break;
  288. case Abilities.GFHP30:
  289. break;
  290. case Abilities.GFHP40:
  291. break;
  292. case Abilities.Boost:
  293. break;
  294. case Abilities.Haggle:
  295. break;
  296. case Abilities.SellHigh:
  297. break;
  298. case Abilities.Familiar:
  299. break;
  300. case Abilities.CallShop:
  301. break;
  302. case Abilities.JunkShop:
  303. break;
  304. case Abilities.ThunderMagRF:
  305. break;
  306. case Abilities.IceMagRF:
  307. break;
  308. case Abilities.FireMagRF:
  309. break;
  310. case Abilities.LifeMagRF:
  311. break;
  312. case Abilities.TimeMagRF:
  313. break;
  314. case Abilities.StatusMagRF:
  315. break;
  316. case Abilities.SuptMagRF:
  317. break;
  318. case Abilities.ForbidMagRF:
  319. break;
  320. case Abilities.RecoveryMedRF:
  321. break;
  322. case Abilities.StatusMedRF:
  323. break;
  324. case Abilities.AmmoRF:
  325. break;
  326. case Abilities.ToolRF:
  327. break;
  328. case Abilities.ForbidMedRF:
  329. break;
  330. case Abilities.GFRecoveryMedRF:
  331. break;
  332. case Abilities.GFAblMedRF:
  333. break;
  334. case Abilities.MidMagRF:
  335. break;
  336. case Abilities.HighMagRF:
  337. break;
  338. case Abilities.MedLvUp:
  339. break;
  340. case Abilities.CardMod:
  341. break;
  342. default:
  343. characterData.StatJ[
  344. Kernel.KernelBin.Stat2Ability.FirstOrDefault(x => x.Value == r).Key] = 0;
  345. break;
  346. }
  347. }
  348. Menu.Junction.Refresh();
  349. return true;
  350. }
  351. }
  352. return false;
  353. }
  354. public override void Refresh()
  355. {
  356. if (Memory.State == null) return;
  357. Source = Memory.State;
  358. JunctionedGFs = Source.JunctionedGFs();
  359. UnlockedGFs = Source.UnlockedGFs;
  360. ((IGMDataItem.Icon)ITEM[Rows, 2]).Data = Battle ? Icons.ID.HP : Icons.ID.Size_16x08_Lv_;
  361. if (Damageable != null)
  362. {
  363. var pos = 0;
  364. var skip = Page * Rows;
  365. if (Damageable.GetCharacterData(out var c))
  366. {
  367. if (Battle)
  368. {
  369. AddGFs(ref pos, ref skip, g => JunctionedGFs.ContainsKey(g) && JunctionedGFs[g] == c.ID && !Source[g].IsDead);
  370. AddGFs(ref pos, ref skip, g => JunctionedGFs.ContainsKey(g) && JunctionedGFs[g] != c.ID && Source[g].IsDead, Font.ColorID.Red, true);
  371. }
  372. else
  373. {
  374. AddGFs(ref pos, ref skip, g => !JunctionedGFs.ContainsKey(g));
  375. AddGFs(ref pos, ref skip, g => JunctionedGFs.ContainsKey(g) && JunctionedGFs[g] == c.ID, Font.ColorID.Grey);
  376. AddGFs(ref pos, ref skip, g => JunctionedGFs.ContainsKey(g) && JunctionedGFs[g] != c.ID, Font.ColorID.Dark_Grey);
  377. UpdateCharacter();
  378. }
  379. }
  380. else if (Damageable.GetEnemy(out var e))
  381. {
  382. var gfs = e.JunctionedGFs;
  383. foreach (var g in gfs)
  384. {
  385. if (!AddGF(ref pos, ref skip, g, Source[g].IsDead ? Font.ColorID.Red : Font.ColorID.White, Source[g].IsDead)) break;
  386. }
  387. }
  388. for (; pos < Rows; pos++)
  389. HideChild(pos);
  390. }
  391. base.Refresh();
  392. UpdateTitle();
  393. }
  394. public override void UpdateTitle()
  395. {
  396. base.UpdateTitle();
  397. if (Pages == 1)
  398. {
  399. ((IGMDataItem.Box)CONTAINER).Title = Icons.ID.GF;
  400. ITEM[Count - 1, 0].Hide();
  401. ITEM[Count - 2, 0].Hide();
  402. }
  403. else
  404. {
  405. ((IGMDataItem.Box)CONTAINER).Title = Icons.ID.GF_PG1 + checked((byte)Page);
  406. ITEM[Count - 1, 0].Show();
  407. ITEM[Count - 2, 0].Show();
  408. }
  409. }
  410. protected override void Init()
  411. {
  412. base.Init();
  413. SIZE[Rows] = SIZE[0];
  414. SIZE[Rows].Y = Y;
  415. ITEM[Rows, 2] = new IGMDataItem.Icon
  416. {
  417. Pos = new Rectangle(SIZE[Rows].X + SIZE[Rows].Width - (Battle ? 50 : 30), SIZE[Rows].Y, 0, 0),
  418. Scale = new Vector2(2.5f)
  419. };
  420. for (var i = 0; i < Rows;)
  421. AddGF(ref i, GFs.Blank);
  422. }
  423. protected override void InitShift(int i, int col, int row)
  424. {
  425. base.InitShift(i, col, row);
  426. SIZE[i].Inflate(-22, -8);
  427. SIZE[i].Offset(0, 12 + (-8 * row));
  428. }
  429. protected override void PAGE_NEXT()
  430. {
  431. do
  432. {
  433. base.PAGE_NEXT();
  434. Refresh();
  435. }
  436. while (!ITEM[0, 0].Enabled && Page != 0);
  437. }
  438. protected override void PAGE_PREV()
  439. {
  440. do
  441. {
  442. base.PAGE_PREV();
  443. Refresh();
  444. }
  445. while (!ITEM[0, 0].Enabled && Page != 0);
  446. }
  447. protected override void SetCursor_select(int value)
  448. {
  449. if (value != GetCursor_select())
  450. {
  451. base.SetCursor_select(value);
  452. UpdateCharacter();
  453. }
  454. }
  455. private void AddGF(ref int pos, GFs g, Font.ColorID color = Font.ColorID.White)
  456. {
  457. Contents[pos] = g;
  458. if (g != GFs.Blank)
  459. {
  460. ((IGMDataItem.Text)ITEM[pos, 0]).Data = Memory.Strings.GetName(g);
  461. ((IGMDataItem.Text)ITEM[pos, 0]).FontColor = color;
  462. ((IGMDataItem.Integer)ITEM[pos, 2]).Data = Battle ? Source.GFs[g].CurrentHP() : Source.GFs[g].Level;
  463. ShowChild(pos, g);
  464. if (Battle) ITEM[pos, 1].Hide();
  465. }
  466. else
  467. {
  468. if (ITEM[pos, 0] == null)
  469. ITEM[pos, 0] = new IGMDataItem.Text { Pos = SIZE[pos], FontColor = color };
  470. if (ITEM[pos, 1] == null)
  471. ITEM[pos, 1] = new IGMDataItem.Icon { Data = Icons.ID.JunctionSYM, Pos = new Rectangle(SIZE[pos].X + SIZE[pos].Width - 100, SIZE[pos].Y, 0, 0) };
  472. if (ITEM[pos, 2] == null)
  473. ITEM[pos, 2] = new IGMDataItem.Integer { Pos = new Rectangle(SIZE[pos].X + SIZE[pos].Width - 50, SIZE[pos].Y, 0, 0), Spaces = 3 };
  474. HideChild(pos);
  475. }
  476. pos++;
  477. }
  478. private bool AddGF(ref int pos, ref int skip, GFs g, Font.ColorID colorID, bool blank)
  479. {
  480. if (pos >= Rows) return false;
  481. if (skip-- <= 0)
  482. {
  483. BLANKS[pos] = blank;
  484. AddGF(ref pos, g, colorID);
  485. }
  486. return true;
  487. }
  488. private void AddGFs(ref int pos, ref int skip, System.Func<GFs, bool> predicate, Font.ColorID colorID = Font.ColorID.White, bool blank = false)
  489. {
  490. foreach (var g in UnlockedGFs.Where(predicate))
  491. {
  492. if (!AddGF(ref pos, ref skip, g, colorID, blank)) break;
  493. }
  494. }
  495. private void HideChild(int pos)
  496. {
  497. BLANKS[pos] = true;
  498. ITEM[pos, 0].Hide();
  499. ITEM[pos, 1].Hide();
  500. ITEM[pos, 2].Hide();
  501. }
  502. private void ShowChild(int pos, GFs g = GFs.Blank)
  503. {
  504. BLANKS[pos] = false;
  505. ITEM[pos, 0].Show();
  506. if (JunctionedGFs?.ContainsKey(g) ?? false)
  507. ITEM[pos, 1].Show();
  508. else
  509. ITEM[pos, 1].Hide();
  510. ITEM[pos, 2].Show();
  511. }
  512. private void UpdateCharacter()
  513. {
  514. if (!Battle && Menu.Junction != null)
  515. {
  516. var g = Contents[CURSOR_SELECT];
  517. var i =
  518. (IGMDataItem.Box)((Junction.IGMData_GF_Group)Menu.Junction.Data[Junction.SectionName.TopMenu_GF_Group]).ITEM[2, 0];
  519. i.Data = JunctionedGFs.Count > 0 && JunctionedGFs.ContainsKey(g) ? Memory.Strings.GetName(JunctionedGFs[g]) : null;
  520. }
  521. }
  522. #endregion Methods
  523. }
  524. }