mirror of
https://github.com/kwsch/PKHeX
synced 2024-12-23 19:03:11 +00:00
3c232505e5
In this pull request I've changed a ton of method signatures to reflect the more-narrow types of Species, Move# and Form; additionally, I've narrowed other large collections that stored lists of species / permitted values, and reworked them to be more performant with the latest API spaghetti that PKHeX provides. Roamer met locations, usually in a range of [max-min]<64, can be quickly checked using a bitflag operation on a UInt64. Other collections (like "Is this from Colosseum or XD") were eliminated -- shadow state is not transferred COLO<->XD, so having a Shadow ID or matching the met location from a gift/wild encounter is a sufficient check for "originated in XD".
58 lines
2.1 KiB
C#
58 lines
2.1 KiB
C#
using System;
|
|
|
|
using static PKHeX.Core.Legal;
|
|
|
|
namespace PKHeX.Core;
|
|
|
|
/// <summary>
|
|
/// Logic to create an <see cref="EvolutionHistory"/>.
|
|
/// </summary>
|
|
internal static class EvolutionChain
|
|
{
|
|
public static EvolutionHistory GetEvolutionChainsAllGens(PKM pk, IEncounterTemplate enc)
|
|
{
|
|
var origin = new EvolutionOrigin(enc.Species, (byte)enc.Version, (byte)enc.Generation, enc.LevelMin, (byte)pk.CurrentLevel);
|
|
if (!pk.IsEgg && enc is not EncounterInvalid)
|
|
return GetEvolutionChainsSearch(pk, origin);
|
|
|
|
var history = new EvolutionHistory();
|
|
var group = EvolutionGroupUtil.GetCurrentGroup(pk);
|
|
var chain = group.GetInitialChain(pk, origin, pk.Species, pk.Form);
|
|
history.Set(pk.Context, chain);
|
|
return history;
|
|
}
|
|
|
|
public static EvolutionHistory GetEvolutionChainsSearch(PKM pk, EvolutionOrigin enc)
|
|
{
|
|
var group = EvolutionGroupUtil.GetCurrentGroup(pk);
|
|
ReadOnlySpan<EvoCriteria> chain = group.GetInitialChain(pk, enc, pk.Species, pk.Form);
|
|
|
|
var history = new EvolutionHistory();
|
|
while (true)
|
|
{
|
|
var any = group.Append(pk, history, ref chain, enc);
|
|
if (!any)
|
|
break;
|
|
var previous = group.GetPrevious(pk, enc);
|
|
if (previous is null)
|
|
break;
|
|
group = previous;
|
|
}
|
|
return history;
|
|
}
|
|
|
|
public static EvoCriteria[] GetValidPreEvolutions(PKM pk, int maxspeciesorigin = -1, int maxLevel = -1, int minLevel = 1, bool skipChecks = false)
|
|
{
|
|
if (maxLevel < 0)
|
|
maxLevel = pk.CurrentLevel;
|
|
|
|
if (maxspeciesorigin == -1 && ParseSettings.AllowGen1Tradeback && pk.Format <= 2 && pk.Generation == 1)
|
|
maxspeciesorigin = MaxSpeciesID_2;
|
|
|
|
var context = pk.Context;
|
|
if (context < EntityContext.Gen2)
|
|
context = EntityContext.Gen2;
|
|
var et = EvolutionTree.GetEvolutionTree(context);
|
|
return et.GetValidPreEvolutions(pk, levelMax: (byte)maxLevel, maxSpeciesOrigin: maxspeciesorigin, skipChecks: skipChecks, levelMin: (byte)minLevel);
|
|
}
|
|
}
|