PlayerEXP.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using Microsoft.Xna.Framework;
  2. using System;
  3. using System.Diagnostics;
  4. namespace OpenVIII.IGMData
  5. {
  6. public class PlayerEXP : IGMData.Base
  7. {
  8. #region Fields
  9. /// <summary>
  10. /// <para>EXP Acquired</para>
  11. /// <para>Current EXP</para>
  12. /// <para>Next LEVEL</para>
  13. /// </summary>
  14. private static FF8String ECN;
  15. private int _exp;
  16. private byte _lvl;
  17. #endregion Fields
  18. #region Properties
  19. public int EXP
  20. {
  21. get => _exp; set
  22. {
  23. if (Damageable != null)
  24. {
  25. if (_exp == 0 || !Damageable.IsGameOver)
  26. {
  27. if (value < 0) value = 0;
  28. if (_exp != 0 && Damageable.GetCharacterData(out Saves.CharacterData c) && !NoEarnExp)
  29. c.Experience += (uint)Math.Abs((MathHelper.Distance(_exp, value)));
  30. _exp = value;
  31. }
  32. else if (Damageable.IsGameOver)
  33. ITEM[0, 11].Show();
  34. }
  35. }
  36. }
  37. public bool NoEarnExp { get; internal set; }
  38. #endregion Properties
  39. #region Methods
  40. public static PlayerEXP Create(sbyte partypos, Rectangle? pos = null)
  41. {
  42. Debug.Assert(partypos >= 0 && partypos <= 2);
  43. PlayerEXP r = Create<PlayerEXP>(1, 12, new IGMDataItem.Box { Pos = pos ?? new Rectangle(35, 78 + partypos * 150, 808, 150), Title = Icons.ID.NAME }, 1, 1, partypos: partypos);
  44. r._exp = 0;
  45. return r;
  46. }
  47. public override bool Update()
  48. {
  49. if (Enabled && Memory.State?.Characters != null && Memory.State.Characters.Count>0 && Memory.State.PartyData != null)
  50. {
  51. if (Memory.State.Characters.TryGetValue(Memory.State.PartyData[PartyPos], out Saves.CharacterData c))
  52. { }
  53. base.Update();
  54. if ((Damageable = c) != null)
  55. {
  56. for (int i = 0; i < Count; i++)
  57. {
  58. for (int k = 0; k < 10 && k < Depth; k++)
  59. {
  60. ITEM[i, k]?.Show();
  61. }
  62. }
  63. if (((IGMDataItem.Integer)ITEM[0, 4]).Data != _exp)
  64. {
  65. ITEM[0, 11].Hide();
  66. ((IGMDataItem.Text)ITEM[0, 0]).Data = c.Name;
  67. ((IGMDataItem.Integer)ITEM[0, 4]).Data = _exp;
  68. ((IGMDataItem.Integer)ITEM[0, 6]).Data = checked((int)c.Experience);
  69. ((IGMDataItem.Integer)ITEM[0, 8]).Data = c.ExperienceToNextLevel;
  70. byte lvl = Damageable.Level;
  71. if (lvl != _lvl && _lvl != 0 && !NoEarnExp)
  72. {
  73. //trigger level up message and sound effect
  74. init_debugger_Audio.PlaySound(0x28);
  75. ITEM[0, 10].Show();
  76. }
  77. ((IGMDataItem.Integer)ITEM[0, 2]).Data = _lvl = lvl;
  78. }
  79. }
  80. else
  81. {
  82. foreach (Menu_Base i in ITEM)
  83. if (i != null)
  84. i.Hide();
  85. }
  86. return true;
  87. }
  88. return false;
  89. }
  90. protected override void Init()
  91. {
  92. base.Init();
  93. Saves.CharacterData c = null;
  94. if (Damageable != null && Damageable.GetCharacterData(out c))
  95. _lvl = Damageable.Level;
  96. if (ECN == null)
  97. ECN = Memory.Strings.Read(Strings.FileID.KERNEL, 30, 29) + "\n" +
  98. Memory.Strings.Read(Strings.FileID.KERNEL, 30, 30) + "\n" +
  99. Memory.Strings.Read(Strings.FileID.KERNEL, 30, 31);
  100. ITEM[0, 0] = new IGMDataItem.Text { Pos = new Rectangle(SIZE[0].X, SIZE[0].Y, 0, 0) };
  101. ITEM[0, 1] = new IGMDataItem.Icon { Data = Icons.ID.Size_16x16_Lv_, Pos = new Rectangle(SIZE[0].X, SIZE[0].Y + 34, 0, 0), Palette = 13 };
  102. ITEM[0, 2] = new IGMDataItem.Integer { Data = _lvl, Pos = new Rectangle(SIZE[0].X + 50, SIZE[0].Y + 38, 0, 0), Spaces = 4, NumType = Icons.NumType.sysFntBig };
  103. ITEM[0, 3] = new IGMDataItem.Text { Data = ECN, Pos = new Rectangle(SIZE[0].X + 390, SIZE[0].Y, 0, 0) };
  104. ITEM[0, 4] = new IGMDataItem.Integer { Data = _exp, Pos = new Rectangle(SIZE[0].X + SIZE[0].Width - 160, SIZE[0].Y, 0, 0), Spaces = 7 };
  105. ITEM[0, 5] = new IGMDataItem.Icon { Data = Icons.ID.P, Pos = new Rectangle(SIZE[0].X + SIZE[0].Width - 20, SIZE[0].Y, 0, 0) };
  106. ITEM[0, 6] = new IGMDataItem.Integer { Data = checked((int)(c?.Experience ?? 0)), Pos = new Rectangle(SIZE[0].X + SIZE[0].Width - 160, (int)(SIZE[0].Y + TextScale.Y * 12), 0, 0), Spaces = 7 };
  107. ITEM[0, 7] = new IGMDataItem.Icon { Data = Icons.ID.P, Pos = new Rectangle(SIZE[0].X + SIZE[0].Width - 20, (int)(SIZE[0].Y + TextScale.Y * 12), 0, 0) };
  108. ITEM[0, 8] = new IGMDataItem.Integer { Data = c?.ExperienceToNextLevel ?? 0, Pos = new Rectangle(SIZE[0].X + SIZE[0].Width - 160, (int)(SIZE[0].Y + TextScale.Y * 12 * 2), 0, 0), Spaces = 7 };
  109. ITEM[0, 9] = new IGMDataItem.Icon { Data = Icons.ID.P, Pos = new Rectangle(SIZE[0].X + SIZE[0].Width - 20, (int)(SIZE[0].Y + TextScale.Y * 12 * 2), 0, 0) };
  110. ITEM[0, 10] = IGMData.Dialog.Timed.Small.Create(Memory.Strings.Read(Strings.FileID.KERNEL, 30, 32), SIZE[0].X + 190, SIZE[0].Y);
  111. ITEM[0, 11] = IGMData.Dialog.Small.Create(Memory.Strings.Read(Strings.FileID.KERNEL, 30, 49), SIZE[0].X + 190, SIZE[0].Y);
  112. ITEM[0, 10].Hide();
  113. ITEM[0, 11].Hide();
  114. }
  115. protected override void InitShift(int i, int col, int row)
  116. {
  117. SIZE[i].Inflate(-25, -20);
  118. base.InitShift(i, col, row);
  119. }
  120. #endregion Methods
  121. }
  122. }