Fix Gen1 party+clear

Closes #4410

Also fix trash bytes persistence (only overwrite nickname with default if it visually differs from what is present in the textbox).
Add trash edits to Gen3 HoF
This commit is contained in:
Kurt 2025-01-03 21:33:22 -06:00
parent 674a778bf9
commit 520c849287
3 changed files with 41 additions and 8 deletions

View File

@ -70,7 +70,7 @@ public sealed class HallFame3PKM(Memory<byte> Raw, bool Japanese) : ISpeciesForm
public ushort SID16 { get => ReadUInt16LittleEndian(Data[2..]); set => WriteUInt16LittleEndian(Data[2..], value); }
public uint PID { get => ReadUInt32LittleEndian(Data[4..]); set => WriteUInt32LittleEndian(Data[4..], value); }
private ushort SpecLevel { get => ReadUInt16LittleEndian(Data[8..]); set => WriteUInt16LittleEndian(Data[8..], (ushort)value); }
private Span<byte> NicknameTrash => Data.Slice(10, 10);
public Span<byte> NicknameTrash => Data.Slice(10, 10);
public string Nickname
{

View File

@ -171,7 +171,9 @@ private void SaveEntity(HallOfFameEntity1 pk)
pk.Species = species;
pk.Level = (byte)NUD_Level.Value;
pk.Nickname = TB_Nickname.Text;
if (pk.Nickname != TB_Nickname.Text) // preserve trash
pk.Nickname = TB_Nickname.Text;
}
private void UpdateNickname(object sender, EventArgs e)
@ -186,8 +188,9 @@ private void UpdateNickname(object sender, EventArgs e)
bool isNone = species is 0 or > (int)Species.Mew;
var pk = Fame.GetEntity(Team, Slot);
var name = isNone ? string.Empty : SpeciesName.GetSpeciesNameGeneration(species, SAV.Language, 1);
pk.Nickname = name;
TB_Nickname.Text = name;
if (pk.Nickname != name) // preserve trash
pk.Nickname = name;
}
TB_Nickname.ReadOnly = !CHK_Nicknamed.Checked;
}
@ -203,16 +206,18 @@ private void ClickNickname(object sender, MouseEventArgs e)
var team = LB_DataEntry.SelectedIndex;
var member = (int)NUP_PartyIndex.Value - 1;
var data = Fame.GetEntity(team, member);
data.Nickname = tb.Text;
var pk = Fame.GetEntity(team, member);
if (tb.Text != pk.Nickname) // preserve trash
pk.Nickname = tb.Text;
var nicktrash = data.NicknameTrash;
var nicktrash = pk.NicknameTrash;
var d = new TrashEditor(tb, nicktrash, SAV, SAV.Generation, SAV.Context);
d.ShowDialog();
tb.Text = d.FinalString;
d.FinalBytes.CopyTo(nicktrash);
TB_Nickname.Text = data.Nickname;
if (tb.Text != pk.Nickname) // preserve trash
tb.Text = pk.Nickname;
}
private void B_Delete_Click(object sender, EventArgs e)
@ -236,10 +241,12 @@ private void B_ClearSlot_Click(object sender, EventArgs e)
private void B_SetParty_Click(object sender, EventArgs e)
{
LoadingFields = true;
var count = Fame.RegisterParty(SAV, SAV.HallOfFameCount);
ResetListBox();
NUD_Clears.Value = SAV.HallOfFameCount = count;
Team = -1;
LoadingFields = false;
var index = count - 1;
ResetListBox(index);
@ -278,6 +285,7 @@ private void TB_Nickname_TextChanged(object sender, EventArgs e)
private void B_ClearAll_Click(object sender, EventArgs e)
{
Fame.Clear();
NUD_Clears.Value = 0;
SaveAndClose(entity: false);
}
}

View File

@ -36,6 +36,7 @@ public SAV_HallOfFame3(SAV3 sav)
TB_TID.TextChanged += (_, _) => ValidateIDs();
TB_SID.TextChanged += (_, _) => ValidateIDs();
TB_PID.TextChanged += (_, _) => ValidateIDs();
TB_Nickname.Click += ClickNickname;
CB_Species.SelectedValueChanged += (_, _) => UpdateSprite();
NUD_Members.ValueChanged += (_, _) =>
{
@ -85,7 +86,8 @@ private void UpdatePKM(HallFame3PKM pk)
pk.TID16 = Convert.ToUInt16(TB_TID.Text);
pk.SID16 = Convert.ToUInt16(TB_SID.Text);
pk.PID = Util.GetHexValue(TB_PID.Text);
pk.Nickname = TB_Nickname.Text;
if (pk.Nickname != TB_Nickname.Text) // preserve trash
pk.Nickname = TB_Nickname.Text;
pk.Level = (int)NUD_Level.Value;
pk.Species = (ushort)WinFormsUtil.GetIndex(CB_Species);
}
@ -135,4 +137,27 @@ private void UpdateSprite()
}
private void B_Clear_Click(object sender, EventArgs e) => ClearFields();
private void ClickNickname(object? sender, EventArgs e)
{
if (sender is not TextBox tb)
return;
// Special Character Form
if (ModifierKeys != Keys.Control)
return;
var pk = Fame[LB_Entries.SelectedIndex].Team[(int)NUD_Members.Value];
if (tb.Text != pk.Nickname) // preserve trash
pk.Nickname = tb.Text;
var nicktrash = pk.NicknameTrash;
var d = new TrashEditor(tb, nicktrash, SAV, SAV.Generation, SAV.Context);
d.ShowDialog();
tb.Text = d.FinalString;
d.FinalBytes.CopyTo(nicktrash);
if (tb.Text != pk.Nickname) // preserve trash
tb.Text = pk.Nickname;
}
}