From 3c574a45f1cb4f28d8f348ece775845702d776c0 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sun, 10 Nov 2024 09:32:33 -0600 Subject: [PATCH] Revise enc1/2 -> pk1/2 nickname set Skip the IsNicknamed evaluation, saving at least 1 string allocation on ctor. Remember the IsNicknamed state when we set false. GUI: provide the selected language rather than recalculate --- .../Templates/Gen1/EncounterGift1.cs | 2 +- .../Templates/Gen1/EncounterSlot1.cs | 2 +- .../Templates/Gen1/EncounterStatic1.cs | 2 +- .../Templates/Gen2/EncounterGift2.cs | 2 +- .../Templates/Gen2/EncounterSlot2.cs | 2 +- .../Templates/Gen2/EncounterStatic2.cs | 3 +- PKHeX.Core/PKM/SK2.cs | 4 +-- PKHeX.Core/PKM/Shared/GBPKM.cs | 35 +++++++++++-------- PKHeX.Core/PKM/Shared/GBPKML.cs | 18 +++++----- .../Controls/PKM Editor/PKMEditor.cs | 13 ++++--- 10 files changed, 44 insertions(+), 39 deletions(-) diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterGift1.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterGift1.cs index 1c4483bb2..bbe5d15e3 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterGift1.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterGift1.cs @@ -109,7 +109,6 @@ public PK1 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) { Species = Species, CurrentLevel = LevelMin, - Nickname = SpeciesName.GetSpeciesNameGeneration(Species, (int)lang, Generation), Type1 = pi.Type1, Type2 = pi.Type2, DV16 = IVs.IsSpecified ? EncounterUtil.GetDV16(IVs) : EncounterUtil.GetRandomDVs(rand), @@ -144,6 +143,7 @@ public PK1 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) _ => EncounterUtil.GetTrainerName(tr, (int)lang), }, }; + pk.SetNotNicknamed((int)lang); pk.SetMoves(Moves); pk.ResetPartyStats(); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterSlot1.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterSlot1.cs index 2bc33d408..2c31ce7cd 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterSlot1.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterSlot1.cs @@ -43,10 +43,10 @@ public PK1 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) OriginalTrainerName = EncounterUtil.GetTrainerName(tr, lang), TID16 = tr.TID16, - Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation), Type1 = pi.Type1, Type2 = pi.Type2, }; + pk.SetNotNicknamed(lang); EncounterUtil.SetEncounterMoves(pk, Version, LevelMin); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterStatic1.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterStatic1.cs index 9b1325f2a..4f4a59f02 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterStatic1.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen1/EncounterStatic1.cs @@ -46,10 +46,10 @@ public PK1 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) OriginalTrainerName = EncounterUtil.GetTrainerName(tr, lang), TID16 = tr.TID16, - Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation), Type1 = pi.Type1, Type2 = pi.Type2, }; + pk.SetNotNicknamed(lang); EncounterUtil.SetEncounterMoves(pk, Version, LevelMin); diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterGift2.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterGift2.cs index a1164f9d3..99819f4bb 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterGift2.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterGift2.cs @@ -100,7 +100,6 @@ public PK2 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) Species = Species, CurrentLevel = CurrentLevel == 0 ? LevelMin : CurrentLevel, OriginalTrainerFriendship = pi.BaseFriendship, - Nickname = SpeciesName.GetSpeciesNameGeneration(Species, (int)lang, Generation), TID16 = Trainer switch { @@ -127,6 +126,7 @@ public PK2 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) _ => EncounterUtil.GetTrainerName(tr, 1), }, }; + pk.SetNotNicknamed((int)lang); if (IsEgg) { diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterSlot2.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterSlot2.cs index da8bdee5b..8864d0ce0 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterSlot2.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterSlot2.cs @@ -94,8 +94,8 @@ public PK2 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) Language = lang, OriginalTrainerName = tr.OT, TID16 = tr.TID16, - Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation), }; + pk.SetNotNicknamed(lang); if (Version == GameVersion.C) { diff --git a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterStatic2.cs b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterStatic2.cs index cbfb17f5e..f1beab085 100644 --- a/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterStatic2.cs +++ b/PKHeX.Core/Legality/Encounters/Templates/Gen2/EncounterStatic2.cs @@ -51,9 +51,8 @@ public PK2 ConvertToPKM(ITrainerInfo tr, EncounterCriteria criteria) OriginalTrainerName = tr.OT, OriginalTrainerFriendship = pi.BaseFriendship, - - Nickname = SpeciesName.GetSpeciesNameGeneration(Species, lang, Generation), }; + pk.SetNotNicknamed(lang); if (IsEgg) { diff --git a/PKHeX.Core/PKM/SK2.cs b/PKHeX.Core/PKM/SK2.cs index 52c8a9ab0..e6e26ff2d 100644 --- a/PKHeX.Core/PKM/SK2.cs +++ b/PKHeX.Core/PKM/SK2.cs @@ -134,10 +134,10 @@ public override string OriginalTrainerName public override bool HasOriginalMetLocation => CaughtData != 0; public override GameVersion Version { get => GameVersion.GSC; set { } } - protected override void GetNonNickname(int language, Span data) + protected override int GetNonNickname(int language, Span data) { var name = SpeciesName.GetSpeciesNameGeneration(Species, language, 2); - StringConverter2.SetString(data, name, data.Length, language, StringConverterOption.Clear50); + return StringConverter2.SetString(data, name, data.Length, language, StringConverterOption.Clear50); } public override void SetNotNicknamed(int language) => GetNonNickname(language, NicknameTrash); diff --git a/PKHeX.Core/PKM/Shared/GBPKM.cs b/PKHeX.Core/PKM/Shared/GBPKM.cs index 59adf765f..289d1ed71 100644 --- a/PKHeX.Core/PKM/Shared/GBPKM.cs +++ b/PKHeX.Core/PKM/Shared/GBPKM.cs @@ -31,8 +31,8 @@ public abstract class GBPKM : PKM public override bool Valid { get => true; set { } } public sealed override void RefreshChecksum() { } - private bool? _isnicknamed; - protected abstract void GetNonNickname(int language, Span data); + private protected bool? _isnicknamed; + protected abstract int GetNonNickname(int language, Span data); public sealed override bool IsNicknamed { @@ -41,11 +41,8 @@ public sealed override bool IsNicknamed if (_isnicknamed is {} actual) return actual; - var current = NicknameTrash; - Span expect = stackalloc byte[current.Length]; var language = GuessedLanguage(); - GetNonNickname(language, expect); - var result = !current.SequenceEqual(expect); + bool result = GetIsNicknamedTrash(language); _isnicknamed = result; return result; } @@ -57,18 +54,26 @@ public sealed override bool IsNicknamed } } - protected bool IsNicknamedBank + private bool GetIsNicknamedTrash(int language) { - get - { - var spName = SpeciesName.GetSpeciesNameGeneration(Species, GuessedLanguage(), Format); - - Span nickname = stackalloc char[TrashCharCountNickname]; - int len = LoadString(NicknameTrash, nickname); - return !nickname[..len].SequenceEqual(spName); - } + // Verify that all trash bytes match the expected nickname. + var current = NicknameTrash; + Span expect = stackalloc byte[current.Length]; + GetNonNickname(language, expect); + return !current.SequenceEqual(expect); } + private bool GetIsNicknamedLength(int language) + { + // Verify that only the displayed nickname bytes match the expected nickname. + var current = NicknameTrash; + Span expect = stackalloc byte[current.Length]; + int length = GetNonNickname(language, expect); + return !current[..length].SequenceEqual(expect[..length]); + } + + protected bool IsNicknamedBank => GetIsNicknamedLength(GuessedLanguage()); + public sealed override int Language { get diff --git a/PKHeX.Core/PKM/Shared/GBPKML.cs b/PKHeX.Core/PKM/Shared/GBPKML.cs index 51e87f0f5..4cd53fc0a 100644 --- a/PKHeX.Core/PKM/Shared/GBPKML.cs +++ b/PKHeX.Core/PKM/Shared/GBPKML.cs @@ -46,17 +46,19 @@ protected GBPKML(byte[] data, bool jp = false) : base(data) NicknameTrash.Fill(StringConverter1.TerminatorCode); } - public override void SetNotNicknamed(int language) => GetNonNickname(language, RawNickname); + public override void SetNotNicknamed(int language) + { + GetNonNickname(language, RawNickname); + _isnicknamed = false; + } - protected override void GetNonNickname(int language, Span data) + protected override int GetNonNickname(int language, Span data) { var name = SpeciesName.GetSpeciesNameGeneration(Species, language, Format); - SetString(data, name, data.Length, StringConverterOption.Clear50); - if (Korean) - return; - - // Decimal point<->period fix - data.Replace(0xF2, 0xE8); + int length = SetString(data, name, data.Length, StringConverterOption.Clear50); + if (!Korean) // Decimal point<->period fix + data.Replace(0xF2, 0xE8); + return length; } public sealed override string Nickname diff --git a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs index a6e5d0059..dcc6e0d57 100644 --- a/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs +++ b/PKHeX.WinForms/Controls/PKM Editor/PKMEditor.cs @@ -1354,25 +1354,24 @@ private void UpdateNickname(object sender, EventArgs e) return; } - string nick; + string nickname; + int language = WinFormsUtil.GetIndex(CB_Language); if (CHK_IsEgg.Checked) { // Get the egg name. - int language = WinFormsUtil.GetIndex(CB_Language); - nick = SpeciesName.GetEggName(language, Entity.Format); + nickname = SpeciesName.GetEggName(language, Entity.Format); } else { // If name is that of another language, don't replace the nickname if (sender != CB_Language && !SpeciesName.IsNicknamedAnyLanguage(species, TB_Nickname.Text, Entity.Format)) return; - int lang = WinFormsUtil.GetIndex(CB_Language); - nick = SpeciesName.GetSpeciesNameGeneration(species, lang, Entity.Format); + nickname = SpeciesName.GetSpeciesNameGeneration(species, language, Entity.Format); } - TB_Nickname.Text = nick; + TB_Nickname.Text = nickname; if (Entity is GBPKM pk) - pk.SetNotNicknamed(); + pk.SetNotNicknamed(language); } private void UpdateNicknameClick(object sender, MouseEventArgs e)