diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionChain.cs b/PKHeX.Core/Legality/Evolutions/EvolutionChain.cs index 72f443f57..4bb97aa93 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionChain.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionChain.cs @@ -45,7 +45,7 @@ public static EvolutionHistory GetEvolutionChainsSearch(PKM pk, EvolutionOrigin private static EvolutionHistory EvolutionChainsSearch(PKM pk, EvolutionOrigin enc, EntityContext context, ushort encSpecies, Span chain) { var history = new EvolutionHistory(); - var length = GetOriginChain(chain, pk, enc, encSpecies, false); + var length = GetOriginChain(chain, pk, enc, encSpecies, enc.IsDiscardRequired(pk.Format)); if (length == 0) return history; chain = chain[..length]; @@ -134,7 +134,7 @@ private static int DevolveFrom(Span result, PKM pk, EvolutionOrigin } if (discard) - group.DiscardForOrigin(result, pk); + group.DiscardForOrigin(result, pk, enc); if (encSpecies != 0) return EvolutionUtil.IndexOf(result, encSpecies) + 1; return GetCount(result); diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup1.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup1.cs index 40117c478..5aa60a3e2 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup1.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup1.cs @@ -8,14 +8,17 @@ public sealed class EvolutionGroup1 : IEvolutionGroup, IEvolutionEnvironment private static readonly EvolutionTree Tree = EvolutionTree.Evolves1; public IEvolutionGroup GetNext(PKM pk, EvolutionOrigin enc) => EvolutionGroup2.Instance; - public IEvolutionGroup? GetPrevious(PKM pk, EvolutionOrigin enc) => !enc.NoDevolveGen1 && pk.Format == 1 && ParseSettings.AllowGen1Tradeback ? EvolutionGroup2.Instance : null; + public IEvolutionGroup? GetPrevious(PKM pk, EvolutionOrigin enc) => pk.Format == 1 && ParseSettings.AllowGen1Tradeback ? EvolutionGroup2.Instance : null; - public void DiscardForOrigin(Span result, PKM pk) + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) { if (!ParseSettings.AllowGen1Tradeback) return; // no other groups were iterated, so no need to discard - EvolutionUtil.Discard(result, PersonalTable.C); + if (enc.Generation == 1) + EvolutionUtil.Discard(result, PersonalTable.RB); + else + EvolutionUtil.Discard(result, PersonalTable.C); } public int Devolve(Span result, PKM pk, EvolutionOrigin enc) diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup2.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup2.cs index 79d36a80d..0b3f6317f 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup2.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup2.cs @@ -11,7 +11,13 @@ public sealed class EvolutionGroup2 : IEvolutionGroup public IEvolutionGroup? GetNext(PKM pk, EvolutionOrigin enc) => pk.Format > Generation ? EvolutionGroup7.Instance : null; public IEvolutionGroup? GetPrevious(PKM pk, EvolutionOrigin enc) => pk.Format != 1 ? EvolutionGroup1.Instance : null; - public void DiscardForOrigin(Span result, PKM pk) => EvolutionUtil.Discard(result, Personal); + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) + { + if (enc.Generation == 1) + EvolutionUtil.Discard(result, PersonalTable.RB); + else + EvolutionUtil.Discard(result, PersonalTable.C); + } public int Devolve(Span result, PKM pk, EvolutionOrigin enc) { diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup3.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup3.cs index 58c6887df..a6745427d 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup3.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup3.cs @@ -11,7 +11,7 @@ public sealed class EvolutionGroup3 : IEvolutionGroup public IEvolutionGroup? GetNext(PKM pk, EvolutionOrigin enc) => pk.Format > Generation ? EvolutionGroup4.Instance : null; public IEvolutionGroup? GetPrevious(PKM pk, EvolutionOrigin enc) => null; - public void DiscardForOrigin(Span result, PKM pk) => EvolutionUtil.Discard(result, Personal); + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal); public int Devolve(Span result, PKM pk, EvolutionOrigin enc) { diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup4.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup4.cs index 1ac8b22eb..c6ca1ff22 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup4.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup4.cs @@ -11,7 +11,7 @@ public sealed class EvolutionGroup4 : IEvolutionGroup public IEvolutionGroup? GetNext(PKM pk, EvolutionOrigin enc) => pk.Format > Generation ? EvolutionGroup5.Instance : null; public IEvolutionGroup? GetPrevious(PKM pk, EvolutionOrigin enc) => enc.Generation == 3 ? EvolutionGroup3.Instance : null; - public void DiscardForOrigin(Span result, PKM pk) => EvolutionUtil.Discard(result, Personal); + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal); public int Devolve(Span result, PKM pk, EvolutionOrigin enc) { diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup5.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup5.cs index fa8f121c7..3d1eef307 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup5.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup5.cs @@ -11,7 +11,7 @@ public sealed class EvolutionGroup5 : IEvolutionGroup public IEvolutionGroup? GetNext(PKM pk, EvolutionOrigin enc) => pk.Format > Generation ? EvolutionGroup6.Instance : null; public IEvolutionGroup? GetPrevious(PKM pk, EvolutionOrigin enc) => enc.Generation < Generation ? EvolutionGroup4.Instance : null; - public void DiscardForOrigin(Span result, PKM pk) => EvolutionUtil.Discard(result, Personal); + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal); public int Devolve(Span result, PKM pk, EvolutionOrigin enc) { diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup6.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup6.cs index b1b513ace..c43f9e9a2 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup6.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup6.cs @@ -11,7 +11,7 @@ public sealed class EvolutionGroup6 : IEvolutionGroup public IEvolutionGroup? GetNext(PKM pk, EvolutionOrigin enc) => pk.Format > Generation ? EvolutionGroup7.Instance : null; public IEvolutionGroup? GetPrevious(PKM pk, EvolutionOrigin enc) => enc.Generation < Generation ? EvolutionGroup5.Instance : null; - public void DiscardForOrigin(Span result, PKM pk) => EvolutionUtil.Discard(result, Personal); + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal); public int Devolve(Span result, PKM pk, EvolutionOrigin enc) { diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup7.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup7.cs index 4f63b5f3f..9fdcbe150 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup7.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup7.cs @@ -19,7 +19,7 @@ public sealed class EvolutionGroup7 : IEvolutionGroup return null; } - public void DiscardForOrigin(Span result, PKM pk) => EvolutionUtil.Discard(result, Personal); + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal); public int Devolve(Span result, PKM pk, EvolutionOrigin enc) { diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup7b.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup7b.cs index 19305b746..a398b27ab 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup7b.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroup7b.cs @@ -11,7 +11,7 @@ public sealed class EvolutionGroup7b : IEvolutionGroup public IEvolutionGroup? GetNext(PKM pk, EvolutionOrigin enc) => pk.Format > Generation ? EvolutionGroupHOME.Instance : null; public IEvolutionGroup? GetPrevious(PKM pk, EvolutionOrigin enc) => null; - public void DiscardForOrigin(Span result, PKM pk) => EvolutionUtil.Discard(result, Personal); + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal); public int Devolve(Span result, PKM pk, EvolutionOrigin enc) { diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroupHOME.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroupHOME.cs index efe44304e..51b156518 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroupHOME.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionGroupHOME.cs @@ -25,7 +25,7 @@ public sealed class EvolutionGroupHOME : IEvolutionGroup return EvolutionGroup7.Instance; } - public void DiscardForOrigin(Span result, PKM pk) + public void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc) { if (pk.SV) Discard(result, PersonalTable.SV); diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionOrigin.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionOrigin.cs index 906b55480..4b5b96d9b 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionOrigin.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/EvolutionOrigin.cs @@ -21,7 +21,7 @@ namespace PKHeX.Core; /// /// Internally used to enforce Gen1 origin encounters NOT jumping to Gen2 to continue devolving. /// - public bool NoDevolveGen1 => Options.HasFlag(OriginOptions.EncounterTemplate); + public bool IsDiscardRequired(int format) => format <= 2 && Options.HasFlag(OriginOptions.ForceDiscard); } [Flags] @@ -29,7 +29,7 @@ public enum OriginOptions : byte { None = 0, SkipChecks = 1 << 0, - CheckVersionWhenNavigating = 1 << 1, + ForceDiscard = 1 << 1, - EncounterTemplate = SkipChecks | CheckVersionWhenNavigating, + EncounterTemplate = SkipChecks | ForceDiscard, } diff --git a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/IEvolutionGroup.cs b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/IEvolutionGroup.cs index 7dd3a33b1..6ff724340 100644 --- a/PKHeX.Core/Legality/Evolutions/EvolutionGroup/IEvolutionGroup.cs +++ b/PKHeX.Core/Legality/Evolutions/EvolutionGroup/IEvolutionGroup.cs @@ -39,7 +39,7 @@ public interface IEvolutionGroup /// /// Discards all entries that do not exist in the group. /// - void DiscardForOrigin(Span result, PKM pk); + void DiscardForOrigin(Span result, PKM pk, EvolutionOrigin enc); } /// diff --git a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup2.cs b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup2.cs index 70fbd318f..86b3dd26d 100644 --- a/PKHeX.Core/Legality/LearnSource/Group/LearnGroup2.cs +++ b/PKHeX.Core/Legality/LearnSource/Group/LearnGroup2.cs @@ -28,7 +28,12 @@ public sealed class LearnGroup2 : ILearnGroup var evos = history.Gen2; for (var i = 0; i < evos.Length; i++) + { + // Disallow Evolution moves if the evo is the last in the list (encounter species). + if (i == evos.Length - 1 && types.HasFlag(MoveSourceType.Evolve)) + types &= ~MoveSourceType.Evolve; Check(result, current, pk, evos[i], i, option, types); + } if (enc is EncounterEgg { Generation: Generation } egg) CheckEncounterMoves(result, current, egg); diff --git a/PKHeX.Core/Legality/LearnSource/Sources/LearnSource1RB.cs b/PKHeX.Core/Legality/LearnSource/Sources/LearnSource1RB.cs index c423c52ee..320bdcc55 100644 --- a/PKHeX.Core/Legality/LearnSource/Sources/LearnSource1RB.cs +++ b/PKHeX.Core/Legality/LearnSource/Sources/LearnSource1RB.cs @@ -45,7 +45,7 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo1 pi, EvoCriteria evo, usho { var learn = Learnsets[evo.Species]; var level = learn.GetLevelLearnMove(move); - if (level != -1 && evo.LevelMin <= level && level <= evo.LevelMax) + if (level != -1 && evo.InsideLevelRange(level)) return new(LevelUp, Game, (byte)level); } diff --git a/PKHeX.Core/Legality/LearnSource/Sources/LearnSource1YW.cs b/PKHeX.Core/Legality/LearnSource/Sources/LearnSource1YW.cs index 18d53d44c..1619b16f2 100644 --- a/PKHeX.Core/Legality/LearnSource/Sources/LearnSource1YW.cs +++ b/PKHeX.Core/Legality/LearnSource/Sources/LearnSource1YW.cs @@ -45,7 +45,7 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo1 pi, EvoCriteria evo, usho { var learn = Learnsets[evo.Species]; var level = learn.GetLevelLearnMove(move); - if (level != -1 && evo.LevelMin <= level && level <= evo.LevelMax) + if (level != -1 && evo.InsideLevelRange(level)) return new(LevelUp, Game, (byte)level); } diff --git a/PKHeX.Core/Legality/LearnSource/Sources/LearnSource2C.cs b/PKHeX.Core/Legality/LearnSource/Sources/LearnSource2C.cs index 7be63db3e..90ee15a1b 100644 --- a/PKHeX.Core/Legality/LearnSource/Sources/LearnSource2C.cs +++ b/PKHeX.Core/Legality/LearnSource/Sources/LearnSource2C.cs @@ -61,7 +61,7 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo2 pi, EvoCriteria evo, usho { var learn = GetLearnset(evo.Species, evo.Form); var level = learn.GetLevelLearnMove(move); - if (level != -1 && evo.LevelMin <= level && level <= evo.LevelMax) + if (level != -1 && evo.InsideLevelRange(level)) return new(LevelUp, Game, (byte)level); } diff --git a/PKHeX.Core/Legality/LearnSource/Sources/LearnSource2GS.cs b/PKHeX.Core/Legality/LearnSource/Sources/LearnSource2GS.cs index e50de885e..64219f177 100644 --- a/PKHeX.Core/Legality/LearnSource/Sources/LearnSource2GS.cs +++ b/PKHeX.Core/Legality/LearnSource/Sources/LearnSource2GS.cs @@ -86,9 +86,9 @@ public MoveLearnInfo GetCanLearn(PKM pk, PersonalInfo2 pi, EvoCriteria evo, usho var level = learn.GetLevelLearnMove(move); if (level != -1) { - if (evo.LevelMin <= level && level <= evo.LevelMax) + if (evo.InsideLevelRange(level)) return new(LevelUp, Game, (byte)level); - if (level == 1) // Evolution + if (level == 1 && types.HasFlag(MoveSourceType.Evolve)) // Evolution return new(Special, Game, (byte)level); } } diff --git a/PKHeX.Core/Legality/MoveSourceType.cs b/PKHeX.Core/Legality/MoveSourceType.cs index df8bd306a..73bdc262b 100644 --- a/PKHeX.Core/Legality/MoveSourceType.cs +++ b/PKHeX.Core/Legality/MoveSourceType.cs @@ -17,11 +17,12 @@ public enum MoveSourceType EnhancedTutor = 1 << 5, SharedEggMove = 1 << 6, TechnicalRecord = 1 << 7, + Evolve = 1 << 8, AllTutors = TypeTutor | SpecialTutor | EnhancedTutor, AllMachines = Machine | TechnicalRecord, - Reminder = LevelUp | RelearnMoves | TechnicalRecord, + Reminder = LevelUp | RelearnMoves | TechnicalRecord | Evolve, Encounter = LevelUp | RelearnMoves, ExternalSources = Reminder | AllMachines | AllTutors, All = ExternalSources | SharedEggMove | RelearnMoves,