Selphie_Slots.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. using Microsoft.Xna.Framework;
  2. using System.Collections.Generic;
  3. namespace OpenVIII.IGMData
  4. {
  5. public class Selphie_Slots : Base
  6. {
  7. #region Fields
  8. private Kernel_bin.Magic_Data _magicData;
  9. #endregion Fields
  10. #region Properties
  11. public int Casts { get => Number.Data; private set => Number.Data = value; }
  12. public Kernel_bin.Magic_Data MagicData
  13. {
  14. get => _magicData; private set
  15. {
  16. _magicData = value;
  17. Name = value.Name;
  18. }
  19. }
  20. public FF8String Name { get => Spell.Data; private set => Spell.Data = value; }
  21. private IGMDataItem.Text Cast { get => (IGMDataItem.Text)ITEM[6, 0]; set => ITEM[6, 0] = value; }
  22. private IGMDataItem.Text Do_Over { get => (IGMDataItem.Text)ITEM[3, 0]; set => ITEM[3, 0] = value; }
  23. private IGMDataItem.Integer Number { get => (IGMDataItem.Integer)ITEM[1, 0]; set => ITEM[1, 0] = value; }
  24. private IGMDataItem.Text Spell { get => (IGMDataItem.Text)ITEM[0, 0]; set => ITEM[0, 0] = value; }
  25. private Kernel_bin.Slot Spell_Data
  26. {
  27. get
  28. {
  29. IReadOnlyList<Kernel_bin.Slot> spells = Spells;
  30. return spells[Memory.Random.Next(spells.Count)];
  31. }
  32. }
  33. /// <summary>
  34. /// List of Spells
  35. /// </summary>
  36. private IReadOnlyList<Kernel_bin.Slot> Spells => Kernel_bin.Selphielimitbreaksets[SpellSet.SlotID].Slots;
  37. /// <summary>
  38. /// Spell set
  39. /// </summary>
  40. private Kernel_bin.Slot_array SpellSet => Kernel_bin.Slotarray[MathHelper.Clamp(TombolaLevel * 12 + TombolaLevel, 0, Kernel_bin.Slotarray.Count-1)];
  41. private Target.Group TargetGroup { get => (Target.Group)ITEM[8, 0]; set => ITEM[8, 0] = value; }
  42. private IGMDataItem.Text Times { get => (IGMDataItem.Text)ITEM[2, 0]; set => ITEM[2, 0] = value; }
  43. /// <summary>
  44. /// Selphie's TombolaLevel
  45. /// </summary>
  46. private short TombolaLevel => Damageable != null && Damageable.GetCharacterData(out Saves.CharacterData c) ? checked((short)(Damageable.Level / 10 + c.CurrentCrisisLevel + Memory.Random.Next(5) - 1)) : (short)0;
  47. /// <summary>
  48. /// Selphie's TombolaLevel
  49. /// </summary>
  50. private byte TombolaMod
  51. {
  52. get
  53. {
  54. byte rnd = checked((byte)Memory.Random.Next(256));
  55. if (rnd >= 249) return 4;
  56. else if (rnd >= 209) return 3;
  57. else if (rnd >= 159) return 2;
  58. else if (rnd >= 39) return 1;
  59. else return 0;
  60. }
  61. }
  62. #endregion Properties
  63. #region Methods
  64. public override bool Inputs_CANCEL()
  65. {
  66. base.Inputs_OKAY();
  67. Refresh();
  68. return true;
  69. }
  70. public override bool Inputs_OKAY()
  71. {
  72. switch (CURSOR_SELECT)
  73. {
  74. case 3:
  75. Inputs_CANCEL();
  76. break;
  77. case 6:
  78. base.Inputs_OKAY();
  79. if (MagicData != null)
  80. {
  81. // will probably need an extra method to make sure positive spells cast only on party members.
  82. // and negative spells only hit the enemies.
  83. //Single targets are random but if cursor is on enemy it will only hit an enemy.
  84. // and if it's on a party member it'll only hit a party member.
  85. TargetGroup?.SelectTargetWindows(MagicData, Casts, new Target.Random { Single = true, PositiveMatters = true });
  86. // show target window so target selection code works.
  87. TargetGroup?.ShowTargetWindows();
  88. // Execute the spells.
  89. // This should hide the targetwindow as turn ends.
  90. TargetGroup?.Execute();
  91. Hide();
  92. }
  93. else
  94. Inputs_CANCEL();
  95. break;
  96. }
  97. return true;
  98. }
  99. public override void Refresh()
  100. {
  101. Kernel_bin.Slot spell_data = Spell_Data;
  102. MagicData = spell_data.Magic_Data;
  103. Casts = spell_data.Casts;
  104. SetCursor_select(3);
  105. base.Refresh();
  106. }
  107. protected override void Init()
  108. {
  109. Table_Options |= Table_Options.FillRows;
  110. base.Init();
  111. // 0,1,2
  112. // 3,4,5
  113. // 6,7,8
  114. BLANKS.SetAll(true);
  115. Spell = new IGMDataItem.Text { Pos = SIZE[0] };
  116. Number = new IGMDataItem.Integer { Pos = SIZE[1], Spaces = 3, NumType = Icons.NumType.sysFntBig };
  117. Times = new IGMDataItem.Text { Data = Memory.Strings[Strings.FileID.KERNEL][30, 65], Pos = SIZE[2] };
  118. Do_Over = new IGMDataItem.Text { Data = Memory.Strings[Strings.FileID.KERNEL][30, 67], Pos = SIZE[3] };
  119. BLANKS[3] = false;
  120. Cast = new IGMDataItem.Text { Data = Memory.Strings[Strings.FileID.KERNEL][30, 66], Pos = SIZE[6] };
  121. BLANKS[6] = false;
  122. TargetGroup = Target.Group.Create(Damageable);
  123. TargetGroup.Hide();
  124. Cursor_Status |= Cursor_Status.Enabled;
  125. }
  126. protected override void InitShift(int i, int col, int row)
  127. {
  128. base.InitShift(i, col, row);
  129. SIZE[i].Inflate(-22, -12);
  130. if (row == 0) SIZE[i].Offset(0, 8);
  131. if (col == 1) SIZE[i].Offset(8, 0);
  132. if (col == 2) SIZE[i].Offset(-16, 0);
  133. if (row > 0) SIZE[i].Offset(20, 0);
  134. }
  135. static public Selphie_Slots Create(Rectangle pos, Damageable damageable = null, bool battle =true) => Create<Selphie_Slots>(9, 1, new IGMDataItem.Box { Pos = pos, Title = Icons.ID.SPECIAL }, 3, 3,damageable,battle: battle);
  136. #endregion Methods
  137. }
  138. }