Add splitbreed relearn suggest recursion

This commit is contained in:
Kurt 2021-04-10 11:03:21 -07:00
parent 4dea69e068
commit cfcefca14f
2 changed files with 28 additions and 5 deletions

View file

@ -69,11 +69,11 @@ namespace PKHeX.Core
/// <returns><see cref="PKM.RelearnMoves"/> best suited for the current <see cref="PKM"/> data.</returns>
public static IReadOnlyList<int> GetSuggestedRelearnMoves(this LegalityAnalysis legal, IEncounterable? enc = null)
{
var m = legal.GetSuggestedRelearnMovesFromEncounter();
enc ??= legal.EncounterOriginal;
var m = legal.GetSuggestedRelearnMovesFromEncounter(enc);
if (m.Any(z => z != 0))
return m;
enc ??= legal.EncounterMatch;
if (enc is MysteryGift or EncounterEgg)
return m;

View file

@ -129,20 +129,43 @@ namespace PKHeX.Core
/// <summary>
/// Gets the current <see cref="PKM.RelearnMoves"/> array of four moves that might be legal.
/// </summary>
public static IReadOnlyList<int> GetSuggestedRelearnMovesFromEncounter(this LegalityAnalysis analysis)
public static IReadOnlyList<int> GetSuggestedRelearnMovesFromEncounter(this LegalityAnalysis analysis, IEncounterTemplate? enc = null)
{
var info = analysis.Info;
var enc = info.EncounterOriginal;
enc ??= info.EncounterOriginal;
var pkm = analysis.pkm;
if (ShouldNotHaveRelearnMoves(enc, pkm))
return Empty;
if (enc is EncounterEgg or EncounterInvalid {EggEncounter: true})
return enc.GetEggRelearnMoves(info.Moves, pkm);
return enc.GetSuggestedRelearnEgg(info.Moves, pkm);
return enc.GetSuggestedRelearnInternal(pkm);
}
private static IReadOnlyList<int> GetSuggestedRelearnEgg(this IEncounterTemplate enc, IReadOnlyList<CheckMoveResult> parse, PKM pkm)
{
// Split-breed species like Budew & Roselia may be legal for one, and not the other.
// If we're not a split-breed or are already legal, return.
var result = enc.GetEggRelearnMoves(parse, pkm);
var split = Breeding.GetSplitBreedGeneration(enc.Generation);
if (!split.Contains(enc.Species) || enc.Generation <= 2)
return result;
var tmp = pkm.Clone();
tmp.SetRelearnMoves(result);
var la = new LegalityAnalysis(tmp);
if (la.Info.Moves.All(z => z.Valid))
return result;
// Try again with the other split-breed species if possible.
var incense = EncounterEggGenerator.GenerateEggs(tmp).FirstOrDefault();
if (incense is null || incense.Species == enc.Species)
return result;
return incense.GetSuggestedRelearnEgg(parse, tmp);
}
private static IReadOnlyList<int> GetEggRelearnMoves(this IEncounterTemplate enc, IReadOnlyList<CheckMoveResult> parse, PKM pkm)
{
// Extract a list of the moves that should end up in the relearn move list.