IGMData_Values.cs 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using Microsoft.Xna.Framework;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. namespace OpenVIII
  6. {
  7. public partial class Junction
  8. {
  9. #region Classes
  10. private abstract class IGMData_Values : IGMData.Base
  11. {
  12. #region Fields
  13. protected Saves.CharacterData prevSetting;
  14. private bool eventAdded = false;
  15. #endregion Fields
  16. #region Events
  17. public static event EventHandler<Font.ColorID> ColorChangeEventListener;
  18. #endregion Events
  19. #region Methods
  20. public static T Create<T>(int count, int depth, Menu_Base container = null, int? cols = null, int? rows = null) where T : IGMData_Values, new() =>
  21. IGMData.Base.Create<T>(count, depth, container, cols, rows);
  22. public override void Refresh()
  23. {
  24. //prevSetting = prevSetting;
  25. if (!eventAdded)
  26. {
  27. IGMData_Mag_ST_A_D_Slots.PrevSettingUpdateEventListener += PrevSettingEvent;
  28. eventAdded = true;
  29. }
  30. base.Refresh();
  31. }
  32. protected void FillData<T>(Dictionary<T, byte> oldtotal, Dictionary<T, byte> total, Enum[] availableFlagsarray, Icons.ID starticon, sbyte offset = 0, byte palette = 2, Icons.ID[] skip = null) where T : Enum
  33. {
  34. var _nag = 0;
  35. var _pos = 0;
  36. var endoffset = (sbyte)(offset > 0 ? offset : 0);
  37. for (sbyte pos = 0; pos < Count - endoffset; pos++)
  38. {
  39. if (skip != null && skip.Contains(starticon + pos))
  40. {
  41. offset -= 1;
  42. pos += 1;
  43. endoffset -= 1;
  44. }
  45. ITEM[pos + offset, 0] = new IGMDataItem.Icon { Data = starticon + pos, Pos = new Rectangle(SIZE[pos + offset].X, SIZE[pos + offset].Y, 0, 0), Palette = palette };
  46. ITEM[pos + offset, 1] = total[(T)availableFlagsarray[pos + 1]] > 100 ? new IGMDataItem.Icon { Data = Icons.ID.Star, Pos = new Rectangle(SIZE[pos + offset].X + 45, SIZE[pos + offset].Y, 0, 0), Palette = 4 } : null;
  47. ITEM[pos + offset, 2] = null;
  48. ITEM[pos + offset, 3] = new IGMDataItem.Integer
  49. {
  50. Data =
  51. total[(T)availableFlagsarray[pos + 1]] > 100 ?
  52. total[(T)availableFlagsarray[pos + 1]] - 100 :
  53. total[(T)availableFlagsarray[pos + 1]],
  54. Pos = new Rectangle(SIZE[pos + offset].X + SIZE[pos + offset].Width - 80, SIZE[pos + offset].Y, 0, 0),
  55. Palette = 17,
  56. NumType = Icons.NumType.SysFntBig,
  57. Spaces = 3
  58. };
  59. ITEM[pos + offset, 4] = new IGMDataItem.Text() { Data = "%", Pos = new Rectangle(SIZE[pos + offset].X + SIZE[pos + offset].Width - 20, SIZE[pos + offset].Y, 0, 0) };
  60. if (oldtotal != null)
  61. {
  62. if (oldtotal[(T)availableFlagsarray[pos + 1]] > total[(T)availableFlagsarray[pos + 1]])
  63. {
  64. ((IGMDataItem.Icon)ITEM[pos + offset, 0]).Palette = 5;
  65. ((IGMDataItem.Icon)ITEM[pos + offset, 0]).Faded_Palette = 5;
  66. ITEM[pos + offset, 2] = new IGMDataItem.Icon { Data = Icons.ID.Arrow_Down, Pos = new Rectangle(SIZE[pos + offset].X + SIZE[pos + offset].Width - 105, SIZE[pos + offset].Y, 0, 0), Palette = 16 };
  67. ((IGMDataItem.Integer)ITEM[pos + offset, 3]).FontColor = Font.ColorID.Red;
  68. ((IGMDataItem.Text)ITEM[pos + offset, 4]).FontColor = Font.ColorID.Red;
  69. if (++_nag > _pos)
  70. ColorChangeEventListener?.Invoke(this, Font.ColorID.Red);
  71. }
  72. else if (oldtotal[(T)availableFlagsarray[pos + 1]] < total[(T)availableFlagsarray[pos + 1]])
  73. {
  74. ((IGMDataItem.Icon)ITEM[pos + offset, 0]).Palette = 6;
  75. ((IGMDataItem.Icon)ITEM[pos + offset, 0]).Faded_Palette = 6;
  76. ITEM[pos + offset, 2] = new IGMDataItem.Icon { Data = Icons.ID.Arrow_Up, Pos = new Rectangle(SIZE[pos + offset].X + SIZE[pos + offset].Width - 105, SIZE[pos + offset].Y, 0, 0), Palette = 17 };
  77. ((IGMDataItem.Integer)ITEM[pos + offset, 3]).FontColor = Font.ColorID.Yellow;
  78. ((IGMDataItem.Text)ITEM[pos + offset, 4]).FontColor = Font.ColorID.Yellow;
  79. if (_nag <= ++_pos)
  80. ColorChangeEventListener?.Invoke(this, Font.ColorID.Yellow);
  81. }
  82. }
  83. }
  84. }
  85. protected Dictionary<T, byte> getTotal<T>(out Enum[] availableFlagsarray, byte max, Kernel.Stat stat, params byte[] spells) where T : Enum
  86. {
  87. const int maxspellcount = 100;
  88. var total = new Dictionary<T, byte>(8);
  89. var availableFlags = Enum.GetValues(typeof(T)).Cast<Enum>();
  90. foreach (var flag in availableFlags.Where(d => !total.ContainsKey((T)d)))
  91. total.Add((T)flag, 0);
  92. for (var i = 0; i < spells.Length; i++)
  93. {
  94. Enum flags = null;
  95. var spell = spells[i];
  96. var magic_Data = Memory.KernelBin.MagicData[spell];
  97. switch (stat)
  98. {
  99. case Kernel.Stat.ElAtk:
  100. flags = magic_Data.ElAtk;
  101. break;
  102. case Kernel.Stat.ElDef1:
  103. case Kernel.Stat.ElDef2:
  104. case Kernel.Stat.ElDef3:
  105. case Kernel.Stat.ElDef4:
  106. flags = magic_Data.ElDef;
  107. break;
  108. case Kernel.Stat.StAtk:
  109. flags = magic_Data.StAtk;
  110. break;
  111. case Kernel.Stat.StDef1:
  112. case Kernel.Stat.StDef2:
  113. case Kernel.Stat.StDef3:
  114. case Kernel.Stat.StDef4:
  115. flags = magic_Data.StDef;
  116. break;
  117. }
  118. if (flags != null && Damageable.GetCharacterData(out var c))
  119. foreach (var flag in availableFlags.Where(flags.HasFlag))
  120. {
  121. if (c.Magics.TryGetByKey(spell, out var count) && magic_Data.JVal.TryGetValue(stat, out var value))
  122. {
  123. var t = total[(T)flag] + (value * count / maxspellcount);
  124. total[(T)flag] = (byte)MathHelper.Clamp(t, 0, max);
  125. }
  126. }
  127. else
  128. throw new Exception($"Unknown stat, {stat}");
  129. }
  130. availableFlagsarray = availableFlags.ToArray();
  131. return total;
  132. }
  133. protected void PrevSettingEvent(object sender, Saves.CharacterData e) =>
  134. //shadowcopy
  135. prevSetting = e;
  136. #endregion Methods
  137. }
  138. #endregion Classes
  139. }
  140. }