diff --git a/PKHeX.Core/PKM/PA8.cs b/PKHeX.Core/PKM/PA8.cs
index 56215339e..87635a920 100644
--- a/PKHeX.Core/PKM/PA8.cs
+++ b/PKHeX.Core/PKM/PA8.cs
@@ -79,7 +79,7 @@ public override byte CurrentFriendship
public override bool IsUntraded => Data[0xB8] == 0 && Data[0xB8 + 1] == 0 && Format == Generation; // immediately terminated HandlingTrainerName data (\0)
// Complex Generated Attributes
- public override int Characteristic => EntityCharacteristic.GetCharacteristic(EncryptionConstant, IV32);
+ public override int Characteristic => EntityCharacteristic.GetCharacteristicInit0(EncryptionConstant, IV32);
// Methods
protected override byte[] Encrypt()
diff --git a/PKHeX.Core/PKM/PK5.cs b/PKHeX.Core/PKM/PK5.cs
index dc15a63f4..d880a1966 100644
--- a/PKHeX.Core/PKM/PK5.cs
+++ b/PKHeX.Core/PKM/PK5.cs
@@ -289,7 +289,7 @@ public override string Nickname
// Generated Attributes
public override uint PSV => ((PID >> 16) ^ (PID & 0xFFFF)) >> 3;
public override uint TSV => (uint)(TID16 ^ SID16) >> 3;
- public override int Characteristic => EntityCharacteristic.GetCharacteristic(PID, IV32);
+ public override int Characteristic => EntityCharacteristic.GetCharacteristicInit0(PID, IV32);
// Maximums
public override ushort MaxMoveID => Legal.MaxMoveID_5;
diff --git a/PKHeX.Core/PKM/PK9.cs b/PKHeX.Core/PKM/PK9.cs
index fc9396a53..89134acf6 100644
--- a/PKHeX.Core/PKM/PK9.cs
+++ b/PKHeX.Core/PKM/PK9.cs
@@ -74,7 +74,7 @@ public override byte CurrentFriendship
public bool IsUnhatchedEgg => Version == 0 && IsEgg;
// Complex Generated Attributes
- public override int Characteristic => EntityCharacteristic.GetCharacteristic(EncryptionConstant, IV32);
+ public override int Characteristic => EntityCharacteristic.GetCharacteristicInit0(EncryptionConstant, IV32);
// Methods
protected override byte[] Encrypt()
diff --git a/PKHeX.Core/PKM/Shared/G6PKM.cs b/PKHeX.Core/PKM/Shared/G6PKM.cs
index f5dbafac1..0a8478a0c 100644
--- a/PKHeX.Core/PKM/Shared/G6PKM.cs
+++ b/PKHeX.Core/PKM/Shared/G6PKM.cs
@@ -45,7 +45,7 @@ public byte OppositeFriendship
// Complex Generated Attributes
public abstract uint IV32 { get; set; }
- public override int Characteristic => EntityCharacteristic.GetCharacteristic(EncryptionConstant, IV32);
+ public override int Characteristic => EntityCharacteristic.GetCharacteristicInit0(EncryptionConstant, IV32);
// Methods
protected sealed override byte[] Encrypt()
diff --git a/PKHeX.Core/PKM/Shared/G8PKM.cs b/PKHeX.Core/PKM/Shared/G8PKM.cs
index 15f05e9b8..14f18d0a9 100644
--- a/PKHeX.Core/PKM/Shared/G8PKM.cs
+++ b/PKHeX.Core/PKM/Shared/G8PKM.cs
@@ -55,7 +55,7 @@ public override byte CurrentFriendship
public override bool IsUntraded => Data[0xA8] == 0 && Data[0xA8 + 1] == 0 && Format == Generation; // immediately terminated HandlingTrainerName data (\0)
// Complex Generated Attributes
- public override int Characteristic => EntityCharacteristic.GetCharacteristic(EncryptionConstant, IV32);
+ public override int Characteristic => EntityCharacteristic.GetCharacteristicInit0(EncryptionConstant, IV32);
// Methods
protected override byte[] Encrypt()
diff --git a/PKHeX.Core/PKM/Util/EntityCharacteristic.cs b/PKHeX.Core/PKM/Util/EntityCharacteristic.cs
index 45ee88ab7..4d367486f 100644
--- a/PKHeX.Core/PKM/Util/EntityCharacteristic.cs
+++ b/PKHeX.Core/PKM/Util/EntityCharacteristic.cs
@@ -28,6 +28,15 @@ public static int GetCharacteristic(uint ec, uint iv32)
return GetCharacteristic(maxStatIndex, maxStatValue);
}
+ ///
+ ///
+ /// Generations 5-9(+?) initialize the "best" characteristic index to 0 (HP).
+ /// In the event that all IVs are 0, the characteristic index is also 0, regardless of EC % 6.
+ /// The original implementation in Gen4 has the "correct" behavior, being based on EC % 6; as does HOME on mobile.
+ /// Only formats that display the all-zero-IV characteristic as always-"HP" reference this method.
+ ///
+ public static int GetCharacteristicInit0(uint ec, uint iv32) => iv32 == 0 ? 0 : GetCharacteristic(ec, iv32);
+
///
/// Gets the characteristic index of the given unpacked IVs.
///