pkNX/pkNX.WinForms/Controls/StatEditor.cs
Kurt 76b0b62ca3 Refactoring
File scoped namespaces
NET6 for GUI
handle nullable references
add editorconfig (mostly for newline at end of file)
2022-10-01 12:44:47 -07:00

171 lines
5.2 KiB
C#

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using pkNX.Structures;
using Util = pkNX.Randomization.Util;
namespace pkNX.WinForms.Controls;
public partial class StatEditor : UserControl
{
public StatEditor()
{
InitializeComponent();
tb_iv = new[] { TB_HPIV, TB_ATKIV, TB_DEFIV, TB_SPEIV, TB_SPAIV, TB_SPDIV };
tb_ev = new[] { TB_HPEV, TB_ATKEV, TB_DEFEV, TB_SPEEV, TB_SPAEV, TB_SPDEV };
tb_av = new[] { TB_HPAV, TB_ATKAV, TB_DEFAV, TB_SPEAV, TB_SPAAV, TB_SPDAV };
labarray = new[] { Label_ATK, Label_DEF, Label_SPE, Label_SPA, Label_SPD };
}
public void Initialize(string[] types)
{
UpdatingFields = true;
foreach (var t in types.Skip(1))
CB_HPType.Items.Add(t);
UpdatingFields = false;
}
public IPersonalTable? Personal { private get; set; }
public bool UpdatingFields;
public StatPKM PKM { get; set; } = new TrainerPoke7b();
private readonly MaskedTextBox[] tb_iv;
private readonly MaskedTextBox[] tb_ev;
private readonly MaskedTextBox[] tb_av;
private readonly Label[] labarray;
public void UpdateStats()
{
if (UpdatingFields)
return;
UpdatingFields = true;
for (int i = 0; i < 6; i++)
{
if (Util.ToInt32(tb_iv[i].Text) > 31)
tb_iv[i].Text = "31";
if (Util.ToInt32(tb_ev[i].Text) > 255)
tb_ev[i].Text = "255";
if (Util.ToInt32(tb_av[i].Text) > 200)
tb_av[i].Text = "200";
}
UpdatingFields = false;
var pt = Personal;
if (pt == null)
throw new NullReferenceException("Personal table hasn't been initialized.");
var pi = pt.GetFormEntry((ushort)PKM.Species, (byte)PKM.Form);
var stats = PKM.GetStats(pi);
Stat_HP.Text = stats[0].ToString();
Stat_ATK.Text = stats[1].ToString();
Stat_DEF.Text = stats[2].ToString();
Stat_SPA.Text = stats[4].ToString();
Stat_SPD.Text = stats[5].ToString();
Stat_SPE.Text = stats[3].ToString();
TB_IVTotal.Text = tb_iv.Select(z => Util.ToInt32(z.Text)).Sum().ToString();
TB_EVTotal.Text = tb_ev.Select(z => Util.ToInt32(z.Text)).Sum().ToString();
if (PKM is IAwakened s)
TB_AVTotal.Text = s.AwakeningSum().ToString();
var showAV = PKM is IAwakened;
Label_AVs.Visible = TB_AVTotal.Visible = FLP_HPType.Visible = showAV;
foreach (var mtb in tb_av)
mtb.Visible = showAV;
Label_EVs.Visible = TB_EVTotal.Visible = FLP_Dynamax.Visible = !showAV;
foreach (var mtb in tb_ev)
mtb.Visible = !showAV;
// Recolor the Stat Labels based on boosted stats.
RecolorStatLabels();
UpdatingFields = true;
CB_HPType.SelectedIndex = PKM.HiddenPowerType;
UpdatingFields = false;
}
private void RecolorStatLabels()
{
int incr = (PKM.Nature / 5);
int decr = (PKM.Nature % 5);
// Reset Label Colors
foreach (Label label in labarray)
label.ResetForeColor();
// Set Colored StatLabels only if Nature isn't Neutral
if (incr != decr)
{
labarray[incr].ForeColor = Color.Red;
labarray[decr].ForeColor = Color.Blue;
}
}
public void LoadStats(StatPKM pkm)
{
PKM = pkm;
UpdatingFields = true;
for (int i = 0; i < 6; i++)
tb_iv[i].Text = pkm.GetIV(i).ToString("00");
for (int i = 0; i < 6; i++)
tb_ev[i].Text = pkm.GetEV(i).ToString("00");
if (PKM is IAwakened a)
{
for (int i = 0; i < 6; i++)
tb_av[i].Text = a.GetAV(i).ToString("00");
}
CB_HPType.SelectedIndex = PKM.HiddenPowerType;
UpdatingFields = false;
UpdateStats();
}
private void UpdateIV(object sender, EventArgs e)
{
if (UpdatingFields || sender is not MaskedTextBox t)
return;
var index = Array.IndexOf(tb_iv, t);
if (index < 0)
return;
int value = Math.Min(31, Util.ToInt32(t.Text));
PKM.SetIV(index, value);
UpdatingFields = true;
CB_HPType.SelectedIndex = PKM.HiddenPowerType;
UpdatingFields = false;
UpdateStats();
}
private void UpdateEV(object sender, EventArgs e)
{
if (UpdatingFields || sender is not MaskedTextBox t)
return;
var index = Array.IndexOf(tb_ev, t);
if (index < 0)
return;
int value = Math.Min(252, Util.ToInt32(t.Text));
PKM.SetEV(index, value);
UpdateStats();
}
private void UpdateAV(object sender, EventArgs e)
{
if (UpdatingFields || sender is not MaskedTextBox t || PKM is not IAwakened a)
return;
var index = Array.IndexOf(tb_av, t);
if (index < 0)
return;
int value = Math.Min(200, Util.ToInt32(t.Text));
a.SetAV(index, value);
UpdateStats();
}
private void ChangeHPType(object sender, EventArgs e)
{
if (UpdatingFields)
return;
PKM.SetHPIVs(CB_HPType.SelectedIndex);
UpdateStats();
}
}