Convert chinese string only if species name

Resolves charmap duplications in the chinese char tables:
多边兽Z (Porygon-Z)
属性:空 (Type Null)
谜拟Q (Mimikyu)
卡璞・鸣鸣 (Tapu-Koko)

Games cannot have a nickname/OT in chinese as of current date... I
assume this will be fixed down the road
This commit is contained in:
Kurt 2017-10-03 18:15:15 -07:00
parent df287f8fc5
commit ea751e26b1
11 changed files with 31 additions and 30 deletions

View File

@ -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); } }

View File

@ -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; } }

View File

@ -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);

View File

@ -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); } }

View File

@ -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); } }

View File

@ -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); } }

View File

@ -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); } }

View File

@ -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);

View File

@ -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 { } }

View File

@ -452,11 +452,13 @@ public static string GetString7(byte[] data, int offset, int count)
/// <param name="padTo">Pad to given length</param>
/// <param name="padWith">Pad with value</param>
/// <returns>Encoded data.</returns>
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)
/// <param name="inputstr">Unicode string.</param>
/// <param name="cht">Pkm language is Traditional Chinese.</param>
/// <returns>In-game chinese string.</returns>
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

View File

@ -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);
}
}
}