diff --git a/PKHeX.Core/Legality/Tables3.cs b/PKHeX.Core/Legality/Tables3.cs
index b5c19f238..436e18095 100644
--- a/PKHeX.Core/Legality/Tables3.cs
+++ b/PKHeX.Core/Legality/Tables3.cs
@@ -262,5 +262,78 @@ public static partial class Legal
{
196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212,
}));
+
+ ///
+ /// Species ID that can be originated from Colosseum (using only Generation 3 max Species ID values).
+ ///
+ internal static readonly HashSet ValidSpecies_Colo = new HashSet
+ {
+ 025, // Pikachu
+ 153, // Bayleef
+ 154, // Meganium
+ 156, // Quilava
+ 157, // Typhlosion
+ 159, // Croconaw
+ 160, // Feraligatr
+ 162, // Furret
+ 164, // Noctowl
+ 166, // Ledian
+ 168, // Ariados
+ 175, // Togepi
+ 176, // Togetic
+ 179, // Mareep
+ 180, // Flaaffy
+ 185, // Sudowoodo
+ 188, // Skiploom
+ 189, // Jumpluff
+ 190, // Aipom
+ 192, // Sunflora
+ 193, // Yanma
+ 195, // Quagsire
+ 196, // Espeon
+ 197, // Umbreon
+ 198, // Murkrow
+ 200, // Misdreavus
+ 205, // Forretress
+ 206, // Dunsparce
+ 207, // Gligar
+ 210, // Granbull
+ 211, // Qwilfish
+ 212, // Scizor
+ 213, // Shuckle
+ 214, // Heracross
+ 215, // Sneasel
+ 217, // Ursaring
+ 218, // Slugma
+ 219, // Magcargo
+ 221, // Piloswine
+ 223, // Remoraid
+ 225, // Delibird
+ 226, // Mantine
+ 227, // Skarmory
+ 229, // Houndoom
+ 234, // Stantler
+ 235, // Smeargle
+ 237, // Hitmontop
+ 241, // Miltank
+ 243, // Raikou
+ 244, // Entei
+ 245, // Suicune
+ 248, // Tyranitar
+ 250, // Ho-Oh
+ 251, // Celebi
+ 296, // Makuhita
+ 297, // Hariyama
+ 307, // Meditite
+ 308, // Medicham
+ 311, // Plusle
+ 329, // Vibrava
+ 330, // Flygon
+ 333, // Swablu
+ 334, // Altaria
+ 357, // Tropius
+ 359, // Absol
+ 376, // Metagross
+ };
}
}
diff --git a/PKHeX.Core/PKM/PKM.cs b/PKHeX.Core/PKM/PKM.cs
index be2949edf..4159cece7 100644
--- a/PKHeX.Core/PKM/PKM.cs
+++ b/PKHeX.Core/PKM/PKM.cs
@@ -911,7 +911,7 @@ public PKM ConvertToCK3()
if (GetType() == typeof(CK3))
return this;
var pk = new CK3();
- TransferPropertiesWithReflection(this, pk);
+ TransferPropertiesWithReflection(this is XK3 ? ConvertToPK3() : this, pk);
pk.SetStats(GetStats(PersonalTable.RS[pk.Species]));
pk.Stat_Level = pk.CurrentLevel;
return pk;
@@ -927,7 +927,7 @@ public PKM ConvertToXK3()
if (GetType() == typeof(XK3))
return this;
var pk = new XK3();
- TransferPropertiesWithReflection(this, pk);
+ TransferPropertiesWithReflection(this is CK3 ? ConvertToPK3() : this, pk);
pk.SetStats(GetStats(PersonalTable.RS[pk.Species]));
pk.Stat_Level = pk.CurrentLevel;
return pk;
@@ -944,6 +944,11 @@ public PKM ConvertToPK3()
return this;
var pk = new PK3();
TransferPropertiesWithReflection(this, pk);
+
+ // Transferring XK3 to PK3 when it originates from XD sets the fateful encounter (obedience) flag.
+ if (this is XK3 xk3 && xk3.Version == 15 && xk3.IsOriginXD())
+ pk.FatefulEncounter = true;
+
pk.RefreshChecksum();
return pk;
}
@@ -964,10 +969,6 @@ public void TransferPropertiesWithReflection(PKM Source, PKM Destination)
if (prop != null)
ReflectUtil.SetValue(Destination, property, prop);
}
-
- // Transferring XK3 to PK3 when it originates from XD sets the fateful encounter (obedience) flag.
- if (Source is XK3 xk3 && xk3.Version == 15 && new LegalityAnalysis(xk3).Info.WasXD)
- Destination.FatefulEncounter = true;
}
///
diff --git a/PKHeX.Core/PKM/XK3.cs b/PKHeX.Core/PKM/XK3.cs
index 67e352870..64c7a0e5f 100644
--- a/PKHeX.Core/PKM/XK3.cs
+++ b/PKHeX.Core/PKM/XK3.cs
@@ -213,5 +213,56 @@ protected override byte[] Encrypt()
public override int MaxEV => 252;
public override int OTLength => 7;
public override int NickLength => 10;
+
+ public bool IsOriginXD()
+ {
+ if (ShadowID != 0)
+ return true;
+ return IsOriginXD(Species, Met_Level);
+ }
+ public static bool IsOriginXD(int species, int metLevel)
+ {
+ switch (species)
+ {
+ case 296: // Makuhita 30 Colo 18 XD
+ case 297:
+ return metLevel != 30;
+ case 175: // Togepi 20 Colo 25 XD, also 20 as Togetic in Colo
+ case 176:
+ return metLevel != 20;
+ case 179: // Mareep 37 Colo 17 XD
+ case 180: // Flaafy 30 Colo
+ case 181:
+ return metLevel != 37 && metLevel != 30;
+ case 219: // Magcargo 30 Colo 38 XD (Slugma in Colo)
+ return metLevel != 30;
+ case 195: // Quagsire 30 Colo // ** Wooper XD
+ return metLevel != 30;
+ case 334: // Altaria 33 Colo // 36 XD (Swablu in Colo)
+ return metLevel != 33;
+ case 167: // Ledian 40 Colo // 10 Ledyba XD
+ return metLevel != 40;
+ case 207: // Gligar 43 Colo // ** Gligar XD
+ return metLevel != 43;
+ case 221: // Piloswine 43 Colo // 22 Swinub XD
+ return metLevel != 43;
+ case 205: // Forretress 43 Colo // 20 Pineco XD
+ return metLevel != 43;
+ case 168: // Ariados 43 Colo // 14 Spinarak XD
+ return metLevel != 43;
+ case 229: // Houndoom 48 Colo // 17 Houndour XD
+ return metLevel != 48;
+ case 217: // Ursaring 45 Colo // 11 Teddiursa XD
+ return metLevel != 45;
+ case 212: // Scizor 50 Colo // 40 Scyther XD
+ return metLevel != 50;
+ case 196: // Espeon
+ return metLevel != 25;
+ case 197: // Umbreon
+ return metLevel != 26;
+ }
+ // all other cases handled, if not in Colo's table it's from XD.
+ return !Legal.ValidSpecies_Colo.Contains(species);
+ }
}
}