Gen2: Adjust Korean string detection logic (#4800)

This commit is contained in:
abcboy101 2026-05-04 22:25:28 -04:00 committed by GitHub
parent c7d6357133
commit b2bcb1db0c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 31 additions and 40 deletions

View File

@ -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<byte> data)
{
if (Korean)
return StringConverter2KOR.GetString(data);
return StringConverter2.GetString(data, Language);
}
=> StringConverter2.GetString(data, Language);
public override int LoadString(ReadOnlySpan<byte> data, Span<char> destBuffer)
{
if (Korean)
return StringConverter2KOR.LoadString(data, destBuffer);
return StringConverter2.LoadString(data, destBuffer, Language);
}
=> StringConverter2.LoadString(data, destBuffer, Language);
public override int SetString(Span<byte> destBuffer, ReadOnlySpan<char> 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<byte> data)
=> Korean ? StringConverter2KOR.GetTerminatorIndex(data) : TrashBytesGB.GetTerminatorIndex(data);
=> (!Japanese && StringConverter2KOR.IsHangul(data)) ? StringConverter2KOR.GetTerminatorIndex(data) : TrashBytesGB.GetTerminatorIndex(data);
public override int GetStringLength(ReadOnlySpan<byte> data)
=> Korean ? StringConverter2KOR.GetStringLength(data) : TrashBytesGB.GetStringLength(data);
=> (!Japanese && StringConverter2KOR.IsHangul(data)) ? StringConverter2KOR.GetStringLength(data) : TrashBytesGB.GetStringLength(data);
public override int GetBytesPerChar() => 1;
/// <summary>

View File

@ -43,6 +43,9 @@ private static bool AllCharsInTable(ReadOnlySpan<byte> data, ReadOnlySpan<char>
/// <returns>Decoded string.</returns>
public static string GetString(ReadOnlySpan<byte> data, int language)
{
if (language == (int)LanguageID.Korean || (language != (int)LanguageID.Japanese && StringConverter2KOR.IsHangul(data)))
return StringConverter2KOR.GetString(data);
Span<char> 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<byte> data, int language)
/// <returns>Character count loaded.</returns>
public static int LoadString(ReadOnlySpan<byte> data, Span<char> 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<byte> data, Span<char> result, int lan
public static int SetString(Span<byte> destBuffer, ReadOnlySpan<char> 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;

View File

@ -13,7 +13,7 @@ public static class StringConverter2KOR
public const char LineBreak = StringConverter2.LineBreak;
/// <summary>
/// Checks if any of the characters inside <see cref="str"/> are from the special Korean codepoint pages.
/// Checks if all of the characters inside <see cref="str"/> are from the special Korean codepoint pages.
/// </summary>
public static bool GetIsKorean(ReadOnlySpan<char> str)
{
@ -25,6 +25,16 @@ public static bool GetIsKorean(ReadOnlySpan<char> str)
return true;
}
/// <summary>
/// Checks if the encoded data appears to consist of Korean characters.
/// </summary>
public static bool IsHangul(ReadOnlySpan<byte> data) => data.Length > 0 && data[0] <= 0xB;
/// <summary>
/// Checks if the string appears to consist of Korean characters.
/// </summary>
public static bool IsHangul(ReadOnlySpan<char> str) => str.Length > 0 && str[0] is (>= (char)0xAC00 and <= (char)0xD7AF) or (>= (char)0x3130 and <= (char)0x318F) or ' ';
/// <summary>
/// Converts Generation 2 Korean encoded data into a string.
/// </summary>

View File

@ -778,25 +778,11 @@ public void UnlockAllDecorations()
}
public override string GetString(ReadOnlySpan<byte> data)
{
if (Korean)
return StringConverter2KOR.GetString(data);
return StringConverter2.GetString(data, Language);
}
=> StringConverter2.GetString(data, Language);
public override int LoadString(ReadOnlySpan<byte> data, Span<char> text)
{
if (Korean)
return StringConverter2KOR.LoadString(data, text);
return StringConverter2.LoadString(data, text, Language);
}
=> StringConverter2.LoadString(data, text, Language);
public override int SetString(Span<byte> destBuffer, ReadOnlySpan<char> 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);