mirror of
https://github.com/kwsch/PKHeX.git
synced 2026-05-09 04:24:36 -05:00
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:
parent
df287f8fc5
commit
ea751e26b1
|
|
@ -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); } }
|
||||
|
|
|
|||
|
|
@ -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; } }
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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); } }
|
||||
|
|
|
|||
|
|
@ -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); } }
|
||||
|
|
|
|||
|
|
@ -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); } }
|
||||
|
|
|
|||
|
|
@ -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); } }
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 { } }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user