using System;
using System.Diagnostics;
using Microsoft.Xna.Framework;
using OpenVIII.AV;
using OpenVIII.IGMData.Dialog.Timed;
using OpenVIII.IGMDataItem;
namespace OpenVIII.IGMData
{
public class PlayerExp : 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 var 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);
var r = Create(1, 12, new 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 == null || !Memory.State.Characters || Memory.State.CharactersCount <= 0 ||
Memory.State.PartyData == null) return false;
var c = Memory.State[Memory.State.PartyData[PartyPos]];
base.Update();
if ((Damageable = c) != null)
{
for (var i = 0; i < Count; i++)
{
for (var k = 0; k < 10 && k < Depth; k++)
{
ITEM[i, k]?.Show();
}
}
if (((Integer) ITEM[0, 4]).Data == _exp) return true;
ITEM[0, 11].Hide();
((Text)ITEM[0, 0]).Data = c.Name;
((Integer)ITEM[0, 4]).Data = _exp;
((Integer)ITEM[0, 6]).Data = checked((int)c.Experience);
((Integer)ITEM[0, 8]).Data = c.ExperienceToNextLevel;
var lvl = Damageable.Level;
if (lvl != _lvl && _lvl != 0 && !NoEarnExp)
{
//trigger level up message and sound effect
Sound.Play(0x28);
ITEM[0, 10].Show();
}
((Integer)ITEM[0, 2]).Data = _lvl = lvl;
}
else
{
foreach (var i in ITEM)
{
i?.Hide();
}
}
return true;
}
protected override void Init()
{
base.Init();
Saves.CharacterData c = null;
if (Damageable != null && Damageable.GetCharacterData(out c))
_lvl = Damageable.Level;
if (_ecn == null)
_ecn = Strings.Name.EXP_Acquired + "\n" +
Strings.Name.CurrentEXP + "\n" +
Strings.Name.NextLEVEL;
ITEM[0, 0] = new Text { Pos = new Rectangle(SIZE[0].X, SIZE[0].Y, 0, 0) };
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 };
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 };
ITEM[0, 3] = new Text { Data = _ecn, Pos = new Rectangle(SIZE[0].X + 390, SIZE[0].Y, 0, 0) };
ITEM[0, 4] = new Integer { Data = _exp, Pos = new Rectangle(SIZE[0].X + SIZE[0].Width - 160, SIZE[0].Y, 0, 0), Spaces = 7 };
ITEM[0, 5] = new Icon { Data = Icons.ID.P, Pos = new Rectangle(SIZE[0].X + SIZE[0].Width - 20, SIZE[0].Y, 0, 0) };
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 };
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) };
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 };
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) };
ITEM[0, 10] = Small.Create(Strings.Name.LevelUP_, SIZE[0].X + 190, SIZE[0].Y);
ITEM[0, 11] = Dialog.Small.Create(Strings.Name.Didnt_receive_EXP, 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
}
}