mirror of
https://github.com/kwsch/PKHeX.git
synced 2026-08-20 03:44:33 -05:00
More Gen1/2 considerations for tree pruning
Need to prune tree for template according to the correct generation (disallow baby pre-evolutions for Gen1) Also disallow Evolution moves for Gen2 if the evo is the enc species.
This commit is contained in:
@@ -45,7 +45,7 @@ public static EvolutionHistory GetEvolutionChainsSearch(PKM pk, EvolutionOrigin
|
||||
private static EvolutionHistory EvolutionChainsSearch(PKM pk, EvolutionOrigin enc, EntityContext context, ushort encSpecies, Span<EvoCriteria> 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<EvoCriteria> 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);
|
||||
|
||||
@@ -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<EvoCriteria> result, PKM pk)
|
||||
public void DiscardForOrigin(Span<EvoCriteria> 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<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
|
||||
@@ -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<EvoCriteria> result, PKM pk) => EvolutionUtil.Discard(result, Personal);
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
if (enc.Generation == 1)
|
||||
EvolutionUtil.Discard(result, PersonalTable.RB);
|
||||
else
|
||||
EvolutionUtil.Discard(result, PersonalTable.C);
|
||||
}
|
||||
|
||||
public int Devolve(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
|
||||
@@ -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<EvoCriteria> result, PKM pk) => EvolutionUtil.Discard(result, Personal);
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal);
|
||||
|
||||
public int Devolve(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
|
||||
@@ -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<EvoCriteria> result, PKM pk) => EvolutionUtil.Discard(result, Personal);
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal);
|
||||
|
||||
public int Devolve(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
|
||||
@@ -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<EvoCriteria> result, PKM pk) => EvolutionUtil.Discard(result, Personal);
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal);
|
||||
|
||||
public int Devolve(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
|
||||
@@ -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<EvoCriteria> result, PKM pk) => EvolutionUtil.Discard(result, Personal);
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal);
|
||||
|
||||
public int Devolve(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
|
||||
@@ -19,7 +19,7 @@ public sealed class EvolutionGroup7 : IEvolutionGroup
|
||||
return null;
|
||||
}
|
||||
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk) => EvolutionUtil.Discard(result, Personal);
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal);
|
||||
|
||||
public int Devolve(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
|
||||
@@ -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<EvoCriteria> result, PKM pk) => EvolutionUtil.Discard(result, Personal);
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc) => EvolutionUtil.Discard(result, Personal);
|
||||
|
||||
public int Devolve(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
|
||||
@@ -25,7 +25,7 @@ public sealed class EvolutionGroupHOME : IEvolutionGroup
|
||||
return EvolutionGroup7.Instance;
|
||||
}
|
||||
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk)
|
||||
public void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc)
|
||||
{
|
||||
if (pk.SV)
|
||||
Discard(result, PersonalTable.SV);
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace PKHeX.Core;
|
||||
/// <summary>
|
||||
/// Internally used to enforce Gen1 origin encounters NOT jumping to Gen2 to continue devolving.
|
||||
/// </summary>
|
||||
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,
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public interface IEvolutionGroup
|
||||
/// <summary>
|
||||
/// Discards all entries that do not exist in the group.
|
||||
/// </summary>
|
||||
void DiscardForOrigin(Span<EvoCriteria> result, PKM pk);
|
||||
void DiscardForOrigin(Span<EvoCriteria> result, PKM pk, EvolutionOrigin enc);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user