using Microsoft.Xna.Framework; using System; using System.Diagnostics; namespace OpenVIII.IGMData { public class PlayerEXP : IGMData.Base { #region Fields /// /// EXP Acquired /// Current EXP /// Next LEVEL /// private static FF8String ECN; private int _exp; private byte _lvl; #endregion Fields #region Properties public int EXP { get => _exp; set { if (Damageable != null) { if (_exp == 0 || !Damageable.IsGameOver) { if (value < 0) value = 0; if (_exp != 0 && Damageable.GetCharacterData(out Saves.CharacterData c) && !NoEarnExp) c.Experience += (uint)Math.Abs((MathHelper.Distance(_exp, value))); _exp = value; } else if (Damageable.IsGameOver) ITEM[0, 11].Show(); } } } public bool NoEarnExp { get; internal set; } #endregion Properties #region Methods public static PlayerEXP Create(sbyte partypos, Rectangle? pos = null) { Debug.Assert(partypos >= 0 && partypos <= 2); PlayerEXP r = Create(1, 12, new IGMDataItem.Box { Pos = pos ?? new Rectangle(35, 78 + partypos * 150, 808, 150), Title = Icons.ID.NAME }, 1, 1, partypos: partypos); r._exp = 0; return r; } public override bool Update() { if (Enabled && Memory.State?.Characters != null && Memory.State.Characters.Count>0 && Memory.State.PartyData != null) { if (Memory.State.Characters.TryGetValue(Memory.State.PartyData[PartyPos], out Saves.CharacterData c)) { } base.Update(); if ((Damageable = c) != null) { for (int i = 0; i < Count; i++) { for (int k = 0; k < 10 && k < Depth; k++) { ITEM[i, k]?.Show(); } } if (((IGMDataItem.Integer)ITEM[0, 4]).Data != _exp) { ITEM[0, 11].Hide(); ((IGMDataItem.Text)ITEM[0, 0]).Data = c.Name; ((IGMDataItem.Integer)ITEM[0, 4]).Data = _exp; ((IGMDataItem.Integer)ITEM[0, 6]).Data = checked((int)c.Experience); ((IGMDataItem.Integer)ITEM[0, 8]).Data = c.ExperienceToNextLevel; byte lvl = Damageable.Level; if (lvl != _lvl && _lvl != 0 && !NoEarnExp) { //trigger level up message and sound effect init_debugger_Audio.PlaySound(0x28); ITEM[0, 10].Show(); } ((IGMDataItem.Integer)ITEM[0, 2]).Data = _lvl = lvl; } } else { foreach (Menu_Base i in ITEM) if (i != null) i.Hide(); } return true; } return false; } protected override void Init() { base.Init(); Saves.CharacterData c = null; if (Damageable != null && Damageable.GetCharacterData(out c)) _lvl = Damageable.Level; if (ECN == null) ECN = Memory.Strings.Read(Strings.FileID.KERNEL, 30, 29) + "\n" + Memory.Strings.Read(Strings.FileID.KERNEL, 30, 30) + "\n" + Memory.Strings.Read(Strings.FileID.KERNEL, 30, 31); ITEM[0, 0] = new IGMDataItem.Text { Pos = new Rectangle(SIZE[0].X, SIZE[0].Y, 0, 0) }; 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 }; 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 }; ITEM[0, 3] = new IGMDataItem.Text { Data = ECN, Pos = new Rectangle(SIZE[0].X + 390, SIZE[0].Y, 0, 0) }; 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 }; 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) }; 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 }; 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) }; 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 }; 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) }; ITEM[0, 10] = IGMData.Dialog.Timed.Small.Create(Memory.Strings.Read(Strings.FileID.KERNEL, 30, 32), SIZE[0].X + 190, SIZE[0].Y); ITEM[0, 11] = IGMData.Dialog.Small.Create(Memory.Strings.Read(Strings.FileID.KERNEL, 30, 49), SIZE[0].X + 190, SIZE[0].Y); ITEM[0, 10].Hide(); ITEM[0, 11].Hide(); } protected override void InitShift(int i, int col, int row) { SIZE[i].Inflate(-25, -20); base.InitShift(i, col, row); } #endregion Methods } }