PlayerEXP.cs 5.4 KB

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