diff --git a/PKHeX.Core/PKM/CK3.cs b/PKHeX.Core/PKM/CK3.cs index 45afc3dfe..83e3dbcee 100644 --- a/PKHeX.Core/PKM/CK3.cs +++ b/PKHeX.Core/PKM/CK3.cs @@ -25,10 +25,10 @@ public CK3(byte[] decryptedData = null, string ident = null) if (Data.Length != SIZE_PARTY) Array.Resize(ref Data, SIZE_PARTY); } - public override PKM Clone() { return new CK3(Data); } + public override PKM Clone() => new CK3(Data); - public override string GetString(int Offset, int Count) => StringConverter.GetBEString3(Data, Offset, Count); - public override byte[] SetString(string value, int maxLength) => StringConverter.SetBEString3(value, maxLength); + private string GetString(int Offset, int Count) => StringConverter.GetBEString3(Data, Offset, Count); + private byte[] SetString(string value, int maxLength) => StringConverter.SetBEString3(value, maxLength); // Trash Bytes public override byte[] Nickname_Trash { get => GetData(0x2E, 20); set { if (value?.Length == 20) value.CopyTo(Data, 0x2E); } } diff --git a/PKHeX.Core/PKM/PK1.cs b/PKHeX.Core/PKM/PK1.cs index 7bcca8bb9..86995c902 100644 --- a/PKHeX.Core/PKM/PK1.cs +++ b/PKHeX.Core/PKM/PK1.cs @@ -22,8 +22,8 @@ public class PK1 : PKM internal const int STRLEN_U = 11; private int StringLength => Japanese ? STRLEN_J : STRLEN_U; - public override string GetString(int Offset, int Count) => StringConverter.GetString1(Data, Offset, Count, Japanese); - public override byte[] SetString(string value, int maxLength) => StringConverter.SetString1(value, maxLength, Japanese); + private string GetString(int Offset, int Count) => StringConverter.GetString1(Data, Offset, Count, Japanese); + private byte[] SetString(string value, int maxLength) => StringConverter.SetString1(value, maxLength, Japanese); // Trash Bytes public override byte[] Nickname_Trash { get => nick; set { if (value?.Length == nick.Length) nick = value; } } diff --git a/PKHeX.Core/PKM/PK2.cs b/PKHeX.Core/PKM/PK2.cs index 023468354..3be3c1f00 100644 --- a/PKHeX.Core/PKM/PK2.cs +++ b/PKHeX.Core/PKM/PK2.cs @@ -23,14 +23,14 @@ public class PK2 : PKM private int StringLength => Japanese ? STRLEN_J : STRLEN_U; public override bool Korean => !Japanese && otname[0] <= 0xB; - public override string GetString(int Offset, int Count) + private string GetString(int Offset, int Count) { if (Korean) return StringConverter.GetString2KOR(Data, Offset, Count); return StringConverter.GetString1(Data, Offset, Count, Japanese); } - public override byte[] SetString(string value, int maxLength) + private byte[] SetString(string value, int maxLength) { if (Korean) return StringConverter.SetString2KOR(value, maxLength); diff --git a/PKHeX.Core/PKM/PK3.cs b/PKHeX.Core/PKM/PK3.cs index 737d8d36b..83b38cf02 100644 --- a/PKHeX.Core/PKM/PK3.cs +++ b/PKHeX.Core/PKM/PK3.cs @@ -21,10 +21,10 @@ public PK3(byte[] decryptedData = null, string ident = null) if (Data.Length != SIZE_PARTY) Array.Resize(ref Data, SIZE_PARTY); } - public override PKM Clone() { return new PK3(Data); } + public override PKM Clone() => new PK3(Data); - public override string GetString(int Offset, int Count) => StringConverter.GetString3(Data, Offset, Count, Japanese); - public override byte[] SetString(string value, int maxLength) => StringConverter.SetString3(value, maxLength, Japanese); + private string GetString(int Offset, int Count) => StringConverter.GetString3(Data, Offset, Count, Japanese); + private byte[] SetString(string value, int maxLength) => StringConverter.SetString3(value, maxLength, Japanese); // Trash Bytes public override byte[] Nickname_Trash { get => GetData(0x08, 10); set { if (value?.Length == 10) value.CopyTo(Data, 0x08); } } diff --git a/PKHeX.Core/PKM/PK4.cs b/PKHeX.Core/PKM/PK4.cs index 5f85b0057..736556734 100644 --- a/PKHeX.Core/PKM/PK4.cs +++ b/PKHeX.Core/PKM/PK4.cs @@ -22,10 +22,10 @@ public PK4(byte[] decryptedData = null, string ident = null) if (Data.Length != SIZE_PARTY) Array.Resize(ref Data, SIZE_PARTY); } - public override PKM Clone() { return new PK4(Data); } + public override PKM Clone() => new PK4(Data); - public override string GetString(int Offset, int Count) => StringConverter.GetString4(Data, Offset, Count); - public override byte[] SetString(string value, int maxLength) => StringConverter.SetString4(value, maxLength); + private string GetString(int Offset, int Count) => StringConverter.GetString4(Data, Offset, Count); + private byte[] SetString(string value, int maxLength) => StringConverter.SetString4(value, maxLength); // Trash Bytes public override byte[] Nickname_Trash { get => GetData(0x48, 22); set { if (value?.Length == 22) value.CopyTo(Data, 0x48); } } diff --git a/PKHeX.Core/PKM/PK5.cs b/PKHeX.Core/PKM/PK5.cs index face551bb..56d4b2250 100644 --- a/PKHeX.Core/PKM/PK5.cs +++ b/PKHeX.Core/PKM/PK5.cs @@ -22,10 +22,10 @@ public PK5(byte[] decryptedData = null, string ident = null) if (Data.Length != SIZE_PARTY) Array.Resize(ref Data, SIZE_PARTY); } - public override PKM Clone() { return new PK5(Data); } + public override PKM Clone() => new PK5(Data); - public override string GetString(int Offset, int Count) => StringConverter.GetString5(Data, Offset, Count); - public override byte[] SetString(string value, int maxLength) => StringConverter.SetString5(value, maxLength); + private string GetString(int Offset, int Count) => StringConverter.GetString5(Data, Offset, Count); + private byte[] SetString(string value, int maxLength) => StringConverter.SetString5(value, maxLength); // Trash Bytes public override byte[] Nickname_Trash { get => GetData(0x48, 22); set { if (value?.Length == 22) value.CopyTo(Data, 0x48); } } diff --git a/PKHeX.Core/PKM/PK6.cs b/PKHeX.Core/PKM/PK6.cs index f1abd9658..949cdc666 100644 --- a/PKHeX.Core/PKM/PK6.cs +++ b/PKHeX.Core/PKM/PK6.cs @@ -23,10 +23,10 @@ public PK6(byte[] decryptedData = null, string ident = null) if (Data.Length != SIZE_PARTY) Array.Resize(ref Data, SIZE_PARTY); } - public override PKM Clone() { return new PK6(Data); } + public override PKM Clone() => new PK6(Data); - public override string GetString(int Offset, int Count) => StringConverter.GetString6(Data, Offset, Count); - public override byte[] SetString(string value, int maxLength) => StringConverter.SetString6(value, maxLength); + private string GetString(int Offset, int Count) => StringConverter.GetString6(Data, Offset, Count); + private byte[] SetString(string value, int maxLength) => StringConverter.SetString6(value, maxLength); // Trash Bytes public override byte[] Nickname_Trash { get => GetData(0x40, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x40); } } diff --git a/PKHeX.Core/PKM/PK7.cs b/PKHeX.Core/PKM/PK7.cs index 21609e7e9..2941ae2b5 100644 --- a/PKHeX.Core/PKM/PK7.cs +++ b/PKHeX.Core/PKM/PK7.cs @@ -24,10 +24,10 @@ public PK7(byte[] decryptedData = null, string ident = null) if (Data.Length != SIZE_PARTY) Array.Resize(ref Data, SIZE_PARTY); } - public override PKM Clone() { return new PK7(Data); } + public override PKM Clone() => new PK7(Data); - public override string GetString(int Offset, int Count) => StringConverter.GetString7(Data, Offset, Count); - public override byte[] SetString(string value, int maxLength) => StringConverter.SetString7(value, maxLength, Language); + private string GetString(int Offset, int Count) => StringConverter.GetString7(Data, Offset, Count); + private byte[] SetString(string value, int maxLength, bool chinese = false) => StringConverter.SetString7(value, maxLength, Language, chinese: chinese); // Trash Bytes public override byte[] Nickname_Trash { get => GetData(0x40, 24); set { if (value?.Length == 24) value.CopyTo(Data, 0x40); } } @@ -218,7 +218,7 @@ public override uint PID public uint FormDuration { get => BitConverter.ToUInt32(Data, 0x3C); set => BitConverter.GetBytes(value).CopyTo(Data, 0x3C); } #endregion #region Block B - public override string Nickname { get => GetString(0x40, 24); set => SetString(value, 12).CopyTo(Data, 0x40); } + public override string Nickname { get => GetString(0x40, 24); set => SetString(value, 12, !IsNicknamed && Chinese).CopyTo(Data, 0x40); } public override int Move1 { get => BitConverter.ToUInt16(Data, 0x5A); diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs index 8b34ac73f..719c2ed53 100644 --- a/PKHeX.Core/PKM/PKM.cs +++ b/PKHeX.Core/PKM/PKM.cs @@ -23,9 +23,6 @@ public abstract class PKM public virtual byte[] DecryptedBoxData => Write().Take(SIZE_STORED).ToArray(); public virtual bool Valid { get => ChecksumValid && Sanity == 0; set { if (!value) return; Sanity = 0; RefreshChecksum(); } } - public abstract string GetString(int Offset, int Length); - public abstract byte[] SetString(string value, int maxLength); - // Trash Bytes public abstract byte[] Nickname_Trash { get; set; } public abstract byte[] OT_Trash { get; set; } @@ -144,6 +141,7 @@ private byte[] Write() public abstract int OT_Friendship { get; set; } public virtual bool Japanese => Language == 1; public virtual bool Korean => Language == 8; + public virtual bool Chinese => Language == 9 || Language == 10; // Future Properties public virtual int Met_Year { get => 0; set { } } diff --git a/PKHeX.Core/PKM/StringConverter.cs b/PKHeX.Core/PKM/StringConverter.cs index a24946575..b4c5d1aaa 100644 --- a/PKHeX.Core/PKM/StringConverter.cs +++ b/PKHeX.Core/PKM/StringConverter.cs @@ -452,11 +452,13 @@ public static string GetString7(byte[] data, int offset, int count) /// Pad to given length /// Pad with value /// Encoded data. - public static byte[] SetString7(string value, int maxLength, int language, int padTo = 0, ushort padWith = 0) + public static byte[] SetString7(string value, int maxLength, int language, int padTo = 0, ushort padWith = 0, bool chinese = false) { + if (chinese) + value = ConvertString2BinG7_zh(value, language); if (value.Length > maxLength) value = value.Substring(0, 12); // Hard cap - string temp = ConvertString2BinG7_zh(UnSanitizeString(value, 7), language == 10) + string temp = UnSanitizeString(value, 7) .PadRight(value.Length + 1, '\0') // Null Terminator .PadRight(padTo, (char)padWith); return Encoding.Unicode.GetBytes(temp); @@ -484,10 +486,11 @@ public static string GetG1Char(byte key, bool jp) /// Unicode string. /// Pkm language is Traditional Chinese. /// In-game chinese string. - private static string ConvertString2BinG7_zh(string inputstr, bool cht = false) + private static string ConvertString2BinG7_zh(string inputstr, int lang) { var str = new StringBuilder(); + bool cht = lang == 10; // A string cannot contain a mix of CHS and CHT characters. bool IsCHT = inputstr.Any(chr => Gen7_CHT.Contains(chr) && !Gen7_CHS.Contains(chr)); IsCHT |= cht && !inputstr.Any(chr => Gen7_CHT.Contains(chr) ^ Gen7_CHS.Contains(chr)); // CHS and CHT have the same display name diff --git a/PKHeX.Core/Saves/SAV7.cs b/PKHeX.Core/Saves/SAV7.cs index 4a8cbe703..66e8d06aa 100644 --- a/PKHeX.Core/Saves/SAV7.cs +++ b/PKHeX.Core/Saves/SAV7.cs @@ -1307,7 +1307,7 @@ public override byte[] SetString(string value, int maxLength, int PadToSize = 0, { if (PadToSize == 0) PadToSize = maxLength + 1; - return StringConverter.SetString7(value, maxLength, PadToSize, PadWith); + return StringConverter.SetString7(value, maxLength, Language, PadToSize, PadWith); } } }