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;