diff --git a/PKHeX.Core/PKM/BK4.cs b/PKHeX.Core/PKM/BK4.cs index 24c7d035f..2a3f2c2ce 100644 --- a/PKHeX.Core/PKM/BK4.cs +++ b/PKHeX.Core/PKM/BK4.cs @@ -4,7 +4,10 @@ namespace PKHeX.Core { /// Generation 4 format, exclusively for Pokémon Battle Revolution. - /// Values are stored in Big Endian format rather than Little Endian. Beware. + /// + /// When stored in the save file, these are only shuffled; no xor encryption is performed. + /// Values are stored in Big Endian format rather than Little Endian. Beware. + /// public sealed class BK4 : G4PKM { private static readonly ushort[] Unused = @@ -25,26 +28,26 @@ public sealed class BK4 : G4PKM public override byte[] Data { get; } + public static BK4 ReadUnshuffle(byte[] data) + { + var PID = BigEndian.ToUInt32(data, 0); + uint sv = ((PID & 0x3E000) >> 0xD) % 24; + var Data = PokeCrypto.ShuffleArray(data, sv, PokeCrypto.SIZE_4BLOCK); + var result = new BK4(Data); + result.RefreshChecksum(); + return result; + } + public BK4(byte[] data) { Data = data; - uint sv = ((PID & 0x3E000) >> 0xD) % 24; - Data = PokeCrypto.ShuffleArray(Data, sv, PokeCrypto.SIZE_4BLOCK); - if (Sanity != 0 && Species <= MaxSpeciesID && !ChecksumValid) // We can only hope - RefreshChecksum(); - if (Valid && Sanity == 0) - Sanity = 0x4000; - ResetPartyStats(); - } - - public BK4() - { - Data = new byte[SIZE_PARTY]; Sanity = 0x4000; ResetPartyStats(); } - public override PKM Clone() => new BK4((byte[])Encrypt().Clone()){Identifier = Identifier}; + public BK4() : this(new byte[PokeCrypto.SIZE_4STORED]) { } + + public override PKM Clone() => new BK4((byte[])Data.Clone()){Identifier = Identifier}; public string GetString(int Offset, int Count) => StringConverter4.GetBEString4(Data, Offset, Count); public byte[] SetString(string value, int maxLength) => StringConverter4.SetBEString4(value, maxLength); diff --git a/PKHeX.Core/PKM/Util/PKMConverter.cs b/PKHeX.Core/PKM/Util/PKMConverter.cs index 0cb223d54..ab3b2df68 100644 --- a/PKHeX.Core/PKM/Util/PKMConverter.cs +++ b/PKHeX.Core/PKM/Util/PKMConverter.cs @@ -124,14 +124,9 @@ public static int GetPKMDataFormat(byte[] data) _ => new PK3(data) }; case 4: - var pk = new PK4(data); - if (!pk.Valid || pk.Sanity != 0) - { - var bk = new BK4(data); - if (bk.Valid) - return bk; - } - return pk; + if (BitConverter.ToUInt16(data, 0x06) != 0) + return new BK4(data); + return new PK4(data); case 5: return new PK5(data); case 6: diff --git a/PKHeX.Core/PKM/Util/PokeCrypto.cs b/PKHeX.Core/PKM/Util/PokeCrypto.cs index 908cc5084..02a594b85 100644 --- a/PKHeX.Core/PKM/Util/PokeCrypto.cs +++ b/PKHeX.Core/PKM/Util/PokeCrypto.cs @@ -343,8 +343,6 @@ public static void DecryptIfEncrypted3(ref byte[] pkm) public static void DecryptIfEncrypted45(ref byte[] pkm) { - if (BitConverter.ToUInt16(pkm, 4) != 0) // BK4 - return; if (BitConverter.ToUInt32(pkm, 0x64) != 0) pkm = DecryptArray45(pkm); } diff --git a/PKHeX.Core/Saves/SAV4BR.cs b/PKHeX.Core/Saves/SAV4BR.cs index d885beb5f..cca503517 100644 --- a/PKHeX.Core/Saves/SAV4BR.cs +++ b/PKHeX.Core/Saves/SAV4BR.cs @@ -208,7 +208,7 @@ protected override PKM GetPKM(byte[] data) { if (data.Length != SIZE_STORED) Array.Resize(ref data, SIZE_STORED); - return new BK4(data); + return BK4.ReadUnshuffle(data); } protected override byte[] DecryptPKM(byte[] data) => data;