diff --git a/PKHeX.Core/PKM/PK2.cs b/PKHeX.Core/PKM/PK2.cs index cfc062bf9..61fab94fa 100644 --- a/PKHeX.Core/PKM/PK2.cs +++ b/PKHeX.Core/PKM/PK2.cs @@ -12,7 +12,7 @@ public sealed class PK2 : GBPKML, ICaughtData2 public override int SIZE_STORED => Japanese ? PokeCrypto.SIZE_2JLIST : PokeCrypto.SIZE_2ULIST; public override int SIZE_PARTY => SIZE_STORED; - public override bool Korean => !Japanese && OriginalTrainerTrash[0] <= 0xB; + public override bool Korean => !Japanese && StringConverter2KOR.IsHangul(OriginalTrainerTrash); public override EntityContext Context => EntityContext.Gen2; @@ -208,7 +208,7 @@ public PK7 ConvertToPK7() else if (IsNicknamedBank) { pk7.IsNicknamed = true; - pk7.Nickname = Korean ? Nickname : StringConverter12Transporter.GetString(NicknameTrash, Japanese); + pk7.Nickname = StringConverter2KOR.IsHangul(NicknameTrash) ? Nickname : StringConverter12Transporter.GetString(NicknameTrash, Japanese); } // Dizzy Punch cannot be transferred @@ -228,7 +228,7 @@ private string GetTransferTrainerName(int lang) { if (OriginalTrainerTrash[0] == StringConverter1.TradeOTCode) // In-game Trade return StringConverter12Transporter.GetTradeNameGen1(lang); - if (Korean) + if (StringConverter2KOR.IsHangul(OriginalTrainerTrash)) return OriginalTrainerName; return StringConverter12Transporter.GetString(OriginalTrainerTrash, Japanese); } @@ -269,29 +269,15 @@ public SK2 ConvertToSK2() => new(Japanese) }; public override string GetString(ReadOnlySpan data) - { - if (Korean) - return StringConverter2KOR.GetString(data); - return StringConverter2.GetString(data, Language); - } - + => StringConverter2.GetString(data, Language); public override int LoadString(ReadOnlySpan data, Span destBuffer) - { - if (Korean) - return StringConverter2KOR.LoadString(data, destBuffer); - return StringConverter2.LoadString(data, destBuffer, Language); - } - + => StringConverter2.LoadString(data, destBuffer, Language); public override int SetString(Span destBuffer, ReadOnlySpan value, int maxLength, StringConverterOption option) - { - if (Korean) - return StringConverter2KOR.SetString(destBuffer, value, maxLength, option); - return StringConverter2.SetString(destBuffer, value, maxLength, Language, option); - } + => StringConverter2.SetString(destBuffer, value, maxLength, Language, option); public override int GetStringTerminatorIndex(ReadOnlySpan data) - => Korean ? StringConverter2KOR.GetTerminatorIndex(data) : TrashBytesGB.GetTerminatorIndex(data); + => (!Japanese && StringConverter2KOR.IsHangul(data)) ? StringConverter2KOR.GetTerminatorIndex(data) : TrashBytesGB.GetTerminatorIndex(data); public override int GetStringLength(ReadOnlySpan data) - => Korean ? StringConverter2KOR.GetStringLength(data) : TrashBytesGB.GetStringLength(data); + => (!Japanese && StringConverter2KOR.IsHangul(data)) ? StringConverter2KOR.GetStringLength(data) : TrashBytesGB.GetStringLength(data); public override int GetBytesPerChar() => 1; /// diff --git a/PKHeX.Core/PKM/Strings/StringConverter2.cs b/PKHeX.Core/PKM/Strings/StringConverter2.cs index f7d7ed347..067e23989 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter2.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter2.cs @@ -43,6 +43,9 @@ private static bool AllCharsInTable(ReadOnlySpan data, ReadOnlySpan /// Decoded string. public static string GetString(ReadOnlySpan data, int language) { + if (language == (int)LanguageID.Korean || (language != (int)LanguageID.Japanese && StringConverter2KOR.IsHangul(data))) + return StringConverter2KOR.GetString(data); + Span result = stackalloc char[data.Length]; int length = LoadString(data, result, language); return new string(result[..length]); @@ -55,6 +58,9 @@ public static string GetString(ReadOnlySpan data, int language) /// Character count loaded. public static int LoadString(ReadOnlySpan data, Span result, int language) { + if (language == (int)LanguageID.Korean || (language != (int)LanguageID.Japanese && StringConverter2KOR.IsHangul(data))) + return StringConverter2KOR.LoadString(data, result); + if (data.Length == 0) return 0; if (data[0] == TradeOTCode) // In-game Trade @@ -96,6 +102,9 @@ public static int LoadString(ReadOnlySpan data, Span result, int lan public static int SetString(Span destBuffer, ReadOnlySpan value, int maxLength, int language, StringConverterOption option = StringConverterOption.Clear50) { + if (language == (int)LanguageID.Korean || (language != (int)LanguageID.Japanese && StringConverter2KOR.IsHangul(value))) + return StringConverter2KOR.SetString(destBuffer, value, maxLength, option); + ConditionBuffer(destBuffer, option); if (value.Length == 0) return 0; diff --git a/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs b/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs index 5c3cf1fe2..5678831b2 100644 --- a/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs +++ b/PKHeX.Core/PKM/Strings/StringConverter2KOR.cs @@ -13,7 +13,7 @@ public static class StringConverter2KOR public const char LineBreak = StringConverter2.LineBreak; /// - /// Checks if any of the characters inside are from the special Korean codepoint pages. + /// Checks if all of the characters inside are from the special Korean codepoint pages. /// public static bool GetIsKorean(ReadOnlySpan str) { @@ -25,6 +25,16 @@ public static bool GetIsKorean(ReadOnlySpan str) return true; } + /// + /// Checks if the encoded data appears to consist of Korean characters. + /// + public static bool IsHangul(ReadOnlySpan data) => data.Length > 0 && data[0] <= 0xB; + + /// + /// Checks if the string appears to consist of Korean characters. + /// + public static bool IsHangul(ReadOnlySpan str) => str.Length > 0 && str[0] is (>= (char)0xAC00 and <= (char)0xD7AF) or (>= (char)0x3130 and <= (char)0x318F) or ' '; + /// /// Converts Generation 2 Korean encoded data into a string. /// diff --git a/PKHeX.Core/Saves/SAV2.cs b/PKHeX.Core/Saves/SAV2.cs index c5a56146e..f7302a9fa 100644 --- a/PKHeX.Core/Saves/SAV2.cs +++ b/PKHeX.Core/Saves/SAV2.cs @@ -778,25 +778,11 @@ public void UnlockAllDecorations() } public override string GetString(ReadOnlySpan data) - { - if (Korean) - return StringConverter2KOR.GetString(data); - return StringConverter2.GetString(data, Language); - } - + => StringConverter2.GetString(data, Language); public override int LoadString(ReadOnlySpan data, Span text) - { - if (Korean) - return StringConverter2KOR.LoadString(data, text); - return StringConverter2.LoadString(data, text, Language); - } - + => StringConverter2.LoadString(data, text, Language); public override int SetString(Span destBuffer, ReadOnlySpan value, int maxLength, StringConverterOption option) - { - if (Korean) - return StringConverter2KOR.SetString(destBuffer, value, maxLength, option); - return StringConverter2.SetString(destBuffer, value, maxLength, Language, option); - } + => StringConverter2.SetString(destBuffer, value, maxLength, Language, option); public bool IsGBMobileAvailable => Japanese && Version == GameVersion.C; public bool IsGBMobileEnabled => Japanese && Enum.IsDefined(GBMobileCable);