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:
Kurt
2023-09-04 20:10:40 -07:00
parent 45216dfa1b
commit 7fcde8a447
18 changed files with 38 additions and 23 deletions

View File

@@ -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);

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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,
}

View File

@@ -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>

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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,