Merge branch 'master' into master

This commit is contained in:
Kurt 2017-03-26 11:08:05 -07:00 committed by GitHub
commit c42355b7bf
6 changed files with 417 additions and 26 deletions

View file

@ -2904,7 +2904,7 @@ namespace PKHeX.WinForms
if (cb == null)
return;
if (cb.Text == "")
if (cb.Text == "" && cb.Items.Count > 0)
{ cb.SelectedIndex = 0; return; }
if (cb.SelectedValue == null)
cb.BackColor = Color.DarkSalmon;

View file

@ -2070,12 +2070,26 @@ namespace PKHeX.Core
Legal.RemoveFutureMoves(pkm, EvoChainsAllGens, ref validLevelMoves, ref validTMHM, ref validTutor);
CheckResult[] res;
int[] Moves = pkm.Moves;
if (pkm.Species == 235) // Smeargle can have any move except a few
if (pkm.IsEgg && pkm.GenNumber < 6)
{
if(EventGiftMatch?.Count > 0)
res = verifyMovesEggPreRelearnEvent(Moves);
else
{
var SpecialMoves = (EncounterMatch as MysteryGift)?.Moves ??
(EncounterMatch as EncounterStatic)?.Moves ??
(EncounterMatch as EncounterTrade)?.Moves ??
null;
var allowinherited = SpecialMoves == null;
res = verifyMovesIsEggPreRelearn(Moves, SpecialMoves ?? new int[0], allowinherited);
}
}
else if (pkm.Species == 235) // Smeargle can have any move except a few
res = parseMovesSketch(Moves);
else if (pkm.WasEgg && pkm.GenNumber < 6)
res = verifyMovesWasEggPreRelearn(Moves, validLevelMoves, validTMHM, validTutor);
else if (EventGiftMatch?.Count > 1) // Multiple possible Mystery Gifts matched, get the best match too
res = parseMovesGetGift(Moves, validLevelMoves, validTMHM, validTutor);
else if (pkm.WasEgg && pkm.GenNumber < 6)
res = verifyMovesEggPreRelearn(Moves, validLevelMoves, validTMHM, validTutor);
else // Everything else
res = parseMovesRegular(Moves, validLevelMoves, validTMHM, validTutor, new int[0], game);
@ -2086,7 +2100,105 @@ namespace PKHeX.Core
return res;
}
private CheckResult[] verifyMovesEggPreRelearn(int[] Moves, List<int>[] validLevelMoves, List<int>[] validTMHM, List<int>[] validTutor)
private GameVersion[] getBaseMovesIsEggGames()
{
GameVersion[] Games = { };
switch (pkm.GenNumber)
{
case 1:
case 2:
Games = new[] { GameVersion.GS, GameVersion.C };
break;
case 3:
switch((GameVersion)pkm.Version)
{
case GameVersion.R:
case GameVersion.S:
Games = new[] { GameVersion.RS};
break;
case GameVersion.E:
Games = new[] { GameVersion.E };
break;
case GameVersion.FR:
case GameVersion.LG:
Games = new[] { GameVersion.FRLG };
break;
}
break;
case 4:
switch ((GameVersion)pkm.Version)
{
case GameVersion.D:
case GameVersion.P:
Games = new[] { GameVersion.DP };
break;
case GameVersion.Pt:
Games = new[] { GameVersion.Pt };
break;
case GameVersion.HG:
case GameVersion.SS:
Games = new[] { GameVersion.HGSS };
break;
}
break;
case 5:
switch ((GameVersion)pkm.Version)
{
case GameVersion.B:
case GameVersion.W:
Games = new[] { GameVersion.BW };
break;
case GameVersion.Pt:
Games = new[] { GameVersion.Pt };
break;
case GameVersion.B2:
case GameVersion.W2:
Games = new[] { GameVersion.B2W2 };
break;
}
break;
}
return Games;
}
private CheckResult[] verifyMovesIsEggPreRelearn(int[] Moves, int[] SpecialMoves, bool allowinherited)
{
CheckResult[] res = new CheckResult[4];
var ValidSpecialMoves = SpecialMoves.Where(m => m > 0);
// Some games can have different egg movepools. Have to check all situations.
GameVersion[] Games = getBaseMovesIsEggGames();
int splitctr = Legal.getSplitBreedGeneration(pkm).Contains(pkm.Species) ? 1 : 0;
foreach (var ver in Games)
{
for (int i = 0; i <= splitctr; i++)
{
var baseEggMoves = Legal.getBaseEggMoves(pkm, i, ver, pkm.GenNumber < 4 ? 5 : 1)?.ToList() ?? new List<int>();
var InheritedLvlMoves = Legal.getBaseEggMoves(pkm, i, ver, 100) ?? new List<int>();
var EggMoves = Legal.getEggMoves(pkm, ver)?.ToList() ?? new List<int>();
var InheritedTutorMoves = (ver == GameVersion.C) ? Legal.getTutorMoves(pkm, pkm.Species, pkm.AltForm, false, 2) : new int[0];
// Only TM Hm moves from the source game of the egg, not any other games from the same generation
var InheritedTMHMMoves = Legal.getTMHM(pkm, pkm.Species, pkm.AltForm, pkm.GenNumber, ver, false);
InheritedLvlMoves = InheritedLvlMoves.Except(baseEggMoves);
if (pkm.Format > 2 || SpecialMoves.Any())
{
// For gen 2 is not possible to difference normal eggs from event eggs
// If there is no special moves assume normal egg
res = verifyPreRelearnEggBase(Moves, baseEggMoves, EggMoves, InheritedLvlMoves, InheritedTMHMMoves, InheritedTutorMoves, ValidSpecialMoves, allowinherited, ver);
if (res.All(r => r.Valid)) // moves is satisfactory
return res;
}
if(pkm.Format == 2)
{
// For gen 2 if does not match special egg check for normal egg too
res = verifyPreRelearnEggBase(Moves, baseEggMoves, EggMoves, InheritedLvlMoves, InheritedTMHMMoves, InheritedTutorMoves, new List<int>(), true, ver);
if (res.All(r => r.Valid)) // moves is satisfactory
return res;
}
}
}
return res;
}
private CheckResult[] verifyMovesWasEggPreRelearn(int[] Moves, List<int>[] validLevelMoves, List<int>[] validTMHM, List<int>[] validTutor)
{
CheckResult[] res = new CheckResult[4];
@ -2098,8 +2210,8 @@ namespace PKHeX.Core
case 2:
Games = new[] { GameVersion.GS, GameVersion.C };
break;
case 3:
Games = new[] { GameVersion.RS, GameVersion.E, GameVersion.FRLG };
case 3: // Generation 3 does not overwrite source game after pokemon hatched
Games = getBaseMovesIsEggGames();
break;
case 4:
Games = new[] { GameVersion.DP, GameVersion.Pt, GameVersion.HGSS };
@ -2108,7 +2220,6 @@ namespace PKHeX.Core
Games = new[] { GameVersion.BW, GameVersion.B2W2 };
break;
}
int splitctr = Legal.SplitBreed.Contains(pkm.Species) ? 1 : 0;
foreach (var ver in Games)
{
@ -2122,6 +2233,22 @@ namespace PKHeX.Core
}
return res;
}
private CheckResult[] verifyMovesEggPreRelearnEvent(int[] Moves)
{
foreach (MysteryGift mg in EventGiftMatch)
{
int[] SpecialMoves = mg.Moves;
CheckResult[] res = verifyMovesIsEggPreRelearn(Moves, SpecialMoves, false);
if (res.Any(r => !r.Valid))
continue;
// Match Found
EncounterMatch = mg;
return res;
}
// no Mystery Gifts matched
return verifyMovesIsEggPreRelearn(Moves, new int[0], false);
}
private CheckResult[] parseMovesSketch(int[] Moves)
{
CheckResult[] res = new CheckResult[4];
@ -2225,8 +2352,6 @@ namespace PKHeX.Core
res[m] = new CheckResult(Severity.Valid, native ? V173 : string.Format(V332, gen), CheckIdentifier.Move);
else if (gen == pkm.GenNumber && special.Contains(moves[m]))
res[m] = new CheckResult(Severity.Valid, V175, CheckIdentifier.Move);
else if (gen == pkm.GenNumber && baseegg.Contains(moves[m]))
res[m] = new CheckResult(Severity.Valid, V177, CheckIdentifier.Move);
if (res[m] == null)
continue;
@ -2236,6 +2361,22 @@ namespace PKHeX.Core
if (gen == generations.Last())
{
// Check base egg moves after all the moves but just before egg moves to different it from normal level up moves
// Also check if the base egg moves is a non tradeback move
for (int m = 0; m < 4; m++)
{
if (baseegg.Contains(moves[m]))
{
if (IsGen2Pkm && Gen1MovesLearned.Any() && moves[m] > Legal.MaxMoveID_1)
{
res[m] = new CheckResult(Severity.Invalid, V334, CheckIdentifier.Move);
MixedGen1NonTradebackGen2 = true;
}
else
res[m] = new CheckResult(Severity.Valid, V345, CheckIdentifier.Move);
}
}
// Check egg moves after all the generations and all the moves, every move that can be learned in another source should have preference
// the moves that can only be learned from egg moves should in the future check if the move combinations can be breed in gens 2 to 5
for (int m = 0; m < 4; m++)
@ -2461,7 +2602,7 @@ namespace PKHeX.Core
}
bool checkAllGames = pkm.WasTradedEgg;
bool splitBreed = Legal.SplitBreed.Contains(pkm.Species);
bool splitBreed = Legal.getSplitBreedGeneration(pkm).Contains(pkm.Species);
int iterate = (checkAllGames ? Games.Length : 1) * (splitBreed ? 2 : 1);
for (int i = 0; i < iterate; i++)
@ -2537,6 +2678,94 @@ namespace PKHeX.Core
return res;
}
/* Similar to verifyRelearnEgg but in pre relearn generation is the moves what should match the expected order
but only if the pokemon is inside an egg */
private CheckResult[] verifyPreRelearnEggBase(int[] Moves, List<int> baseMoves, List<int> eggmoves, IEnumerable<int> lvlmoves, IEnumerable<int> tmhmmoves, IEnumerable<int> tutormoves, IEnumerable<int> specialmoves, bool AllowInherited, GameVersion ver)
{
CheckResult[] res = new CheckResult[4];
// Obtain level1 moves
int baseCt = baseMoves.Count;
if (baseCt > 4) baseCt = 4;
// Obtain Inherited moves
var inherited = Moves.Where(m => m != 0 && (!baseMoves.Contains(m) || specialmoves.Contains(m) || eggmoves.Contains(m) || lvlmoves.Contains(m) || tmhmmoves.Contains(m) || tutormoves.Contains(m))).ToList();
int inheritCt = inherited.Count;
// Get required amount of base moves
int unique = baseMoves.Concat(inherited).Distinct().Count();
int reqBase = inheritCt == 4 || baseCt + inheritCt > 4 ? 4 - inheritCt : baseCt;
if (Moves.Where(m => m != 0).Count() < Math.Min(4, baseMoves.Count))
reqBase = Math.Min(4, unique);
var em = string.Empty;
var moveoffset = 0;
// Check if the required amount of Base Egg Moves are present.
for (int i = moveoffset; i < reqBase; i++)
{
if (baseMoves.Contains(Moves[i]))
res[i] = new CheckResult(Severity.Valid, V179, CheckIdentifier.Move);
else
{
// mark remaining base egg moves missing
for (int z = i; z < reqBase; z++)
res[z] = new CheckResult(Severity.Invalid, V180, CheckIdentifier.Move);
// provide the list of suggested base moves for the last required slot
em = string.Join(", ", baseMoves.Select(m => m >= movelist.Length ? V190 : movelist[m]));
break;
}
}
moveoffset += reqBase;
// Check also if the required amount of Special Egg Moves are present, ir are after base moves
for (int i = moveoffset; i < moveoffset + specialmoves.Count(); i++)
{
if (specialmoves.Contains(Moves[i]))
res[i] = new CheckResult(Severity.Valid, V333, CheckIdentifier.Move);
else
{
// mark remaining special egg moves missing
for (int z = i; z < moveoffset + specialmoves.Count(); z++)
res[z] = new CheckResult(Severity.Invalid, V342, CheckIdentifier.Move);
// provide the list of suggested base moves and specia moves for the last required slot
if (!string.IsNullOrEmpty(em)) em += ",";
else
em = string.Join(", ", baseMoves.Select(m => m >= movelist.Length ? V190 : movelist[m])) + ",";
em += string.Join(", ", specialmoves.Select(m => m >= movelist.Length ? V190 : movelist[m]));
break;
}
}
if(!string.IsNullOrEmpty(em))
res[reqBase > 0 ? reqBase - 1 : 0].Comment = string.Format(Environment.NewLine + V343, em);
// Non-Base moves that can magically appear in the regular movepool
if (pkm.GenNumber >=3 && Legal.LightBall.Contains(pkm.Species))
eggmoves.Add(344);
// Inherited moves appear after the required base moves.
var AllowInheritedSeverity = AllowInherited ? Severity.Valid : Severity.Invalid;
for (int i = reqBase + specialmoves.Count(); i < 4; i++)
{
if (Moves[i] == 0) // empty
res[i] = new CheckResult(Severity.Valid, V167, CheckIdentifier.Move);
else if (eggmoves.Contains(Moves[i])) // inherited egg move
res[i] = new CheckResult(AllowInheritedSeverity, AllowInherited ? V344 : V341, CheckIdentifier.Move);
else if (lvlmoves.Contains(Moves[i])) // inherited lvl moves
res[i] = new CheckResult(AllowInheritedSeverity, AllowInherited ? V345 : V347, CheckIdentifier.Move);
else if (tmhmmoves.Contains(Moves[i])) // inherited TMHM moves
res[i] = new CheckResult(AllowInheritedSeverity, AllowInherited ? V349 : V350, CheckIdentifier.Move);
else if (tutormoves.Contains(Moves[i])) // inherited tutor moves
res[i] = new CheckResult(AllowInheritedSeverity, AllowInherited ? V346 : V348, CheckIdentifier.Move);
else // not inheritable, flag
res[i] = new CheckResult(Severity.Invalid, V340, CheckIdentifier.Move);
}
return res;
}
private void verifyNoEmptyDuplicates(int[] Moves, CheckResult[] res)
{
bool emptySlot = false;

View file

@ -566,12 +566,12 @@ namespace PKHeX.Core
// Moves
internal static void RemoveFutureMoves(PKM pkm, DexLevel[][] evoChains, ref List<int>[] validLevelMoves, ref List<int>[] validTMHM, ref List<int>[] validTutor)
{
var FutureMoves = new List<int>();
FutureMoves.AddRange(validLevelMoves[pkm.Format]);
FutureMoves.AddRange(validTMHM[pkm.Format]);
FutureMoves.AddRange(validTutor[pkm.Format]);
if (pkm.Format >= 3)
{
var FutureMoves = new List<int>();
FutureMoves.AddRange(validLevelMoves[pkm.Format]);
FutureMoves.AddRange(validTMHM[pkm.Format]);
FutureMoves.AddRange(validTutor[pkm.Format]);
if (pkm.VC1)
{
validLevelMoves[1]?.RemoveAll(x => FutureMoves.Contains(x));
@ -608,10 +608,9 @@ namespace PKHeX.Core
else
{
int tradeback = pkm.Format == 2 ? 1 : 2;
var formatmoves = validLevelMoves[pkm.Format].Concat(validTMHM[pkm.Format]).Concat(validTutor[pkm.Format]).ToList();
validLevelMoves[tradeback]?.RemoveAll(x => formatmoves.Contains(x));
validTMHM[tradeback]?.RemoveAll(x => formatmoves.Contains(x));
validTutor[tradeback]?.RemoveAll(x => formatmoves.Contains(x));
validLevelMoves[tradeback]?.RemoveAll(x => FutureMoves.Contains(x));
validTMHM[tradeback]?.RemoveAll(x => FutureMoves.Contains(x));
validTutor[tradeback]?.RemoveAll(x => FutureMoves.Contains(x));
}
}
internal static List<int>[] getValidMovesAllGens(PKM pkm, DexLevel[][] evoChains, bool LVL = true, bool Tutor = true, bool Machine = true, bool MoveReminder = true, bool RemoveTransferHM = true)
@ -1372,6 +1371,25 @@ namespace PKHeX.Core
return null;
}
}
internal static int[] getSplitBreedGeneration(PKM pkm)
{
return getSplitBreedGeneration(pkm.GenNumber);
}
internal static int[] getSplitBreedGeneration(int generation)
{
switch (generation)
{
case 1: return new int[0];
case 2: return new int[0];
case 3: return SplitBreed_3;
case 4: return SplitBreed;
case 5: return SplitBreed;
case 6: return SplitBreed;
case 7: return SplitBreed;
default: return new int[0];
}
}
internal static int getMaxSpeciesOrigin(PKM pkm)
{
if (pkm.Format == 1 || pkm.VC1) // Gen1 VC could not trade with gen 2 yet
@ -1473,7 +1491,7 @@ namespace PKHeX.Core
var curr = getValidPreEvolutions(pkm);
var poss = getValidPreEvolutions(pkm, 100, skipChecks: true);
if (SplitBreed.Contains(getBaseSpecies(pkm, 1)))
if (getSplitBreedGeneration(pkm).Contains(getBaseSpecies(pkm, 1)))
return curr.Count() >= poss.Count() - 1;
return curr.Count() >= poss.Count();
}
@ -1646,7 +1664,7 @@ namespace PKHeX.Core
if (pkm.Species == 700 && generation == 5)
return pkm.CurrentLevel - 1;
if (pkm.Gen3 && pkm.Format > 4 && pkm.Met_Level == pkm.CurrentLevel && FutureEvolutionsGen3_LevelUp.Contains(pkm.Species))
if (pkm.Gen3 && pkm.Format > 4 && pkm.Met_Level == pkm.CurrentLevel && FutureEvolutionsGen3_LevelUpGen4.Contains(pkm.Species))
return pkm.Met_Level - 1;
if (!pkm.HasOriginalMetLocation)
@ -1656,6 +1674,8 @@ namespace PKHeX.Core
}
internal static int getMinLevelEncounter(PKM pkm)
{
if (pkm.Format == 3 && pkm.WasEgg)
return 5;
return pkm.HasOriginalMetLocation ? pkm.Met_Level : getMaxLevelGeneration(pkm);
}
internal static int getMinLevelGeneration(PKM pkm)
@ -2498,7 +2518,120 @@ namespace PKHeX.Core
return new List<int>();
}
}
private static IEnumerable<int> getTutorMoves(PKM pkm, int species, int form, bool specialTutors, int generation)
internal static IEnumerable<int> getTMHM(PKM pkm, int species, int form, int generation, GameVersion Version = GameVersion.Any, bool RemoveTransferHM = true)
{
List<int> moves = new List<int>();
int index;
switch (generation)
{
case 1:
index = PersonalTable.RB.getFormeIndex(species, 0);
if (index == 0)
return moves;
var pi_rb = (PersonalInfoG1)PersonalTable.RB[index];
var pi_y = (PersonalInfoG1)PersonalTable.Y[index];
moves.AddRange(TMHM_RBY.Where((t, m) => pi_rb.TMHM[m]));
moves.AddRange(TMHM_RBY.Where((t, m) => pi_y.TMHM[m]));
break;
case 2:
index = PersonalTable.C.getFormeIndex(species, 0);
if (index == 0)
return moves;
var pi_c = (PersonalInfoG2)PersonalTable.C[index];
moves.AddRange(TMHM_GSC.Where((t, m) => pi_c.TMHM[m]));
if (Version == GameVersion.Any)
goto case 1;
break;
case 3:
index = PersonalTable.E.getFormeIndex(species, 0);
var pi_e = PersonalTable.E[index];
moves.AddRange(TM_3.Where((t, m) => pi_e.TMHM[m]));
if (!RemoveTransferHM || pkm.Format == 3) // HM moves must be removed for 3->4, only give if current format.
moves.AddRange(HM_3.Where((t, m) => pi_e.TMHM[m + 50]));
break;
case 4:
index = PersonalTable.HGSS.getFormeIndex(species, 0);
if (index == 0)
return moves;
var pi_hgss = PersonalTable.HGSS[index];
var pi_dppt = PersonalTable.Pt[index];
moves.AddRange(TM_4.Where((t, m) => pi_hgss.TMHM[m]));
// The combination of both these moves is illegal, it should be checked that the pokemon only learn one
// except if it can learn any of these moves in gen 5 or later
if (Version == GameVersion.Any || Version == GameVersion.DP || Version == GameVersion.D || Version == GameVersion.P || Version == GameVersion.Pt)
{
if (RemoveTransferHM && pkm.Format > 4)
{
if (pi_dppt.TMHM[96])
moves.Add(432); // Defog
}
else
{
moves.AddRange(HM_DPPt.Where((t, m) => pi_dppt.TMHM[m + 92]));
}
}
if (Version == GameVersion.Any || Version == GameVersion.HGSS || Version == GameVersion.HG || Version == GameVersion.SS)
{
if (RemoveTransferHM && pkm.Format > 4)
{
if (pi_hgss.TMHM[96])
moves.Add(432); // Defog
}
else
{
moves.AddRange(HM_HGSS.Where((t, m) => pi_dppt.TMHM[m + 92]));
}
}
break;
case 5:
index = PersonalTable.B2W2.getFormeIndex(species, 0);
if (index == 0)
return moves;
var pi_bw = PersonalTable.B2W2[index];
moves.AddRange(TMHM_BW.Where((t, m) => pi_bw.TMHM[m]));
break;
case 6:
switch (Version)
{
case GameVersion.Any: // Start at the top, hit every table
case GameVersion.X:
case GameVersion.Y:
case GameVersion.XY:
{
index = PersonalTable.XY.getFormeIndex(species, form);
if (index == 0)
return moves;
PersonalInfo pi_xy = PersonalTable.XY[index];
moves.AddRange(TMHM_XY.Where((t, m) => pi_xy.TMHM[m]));
if (Version == GameVersion.Any) // Fall Through
goto case GameVersion.ORAS;
break;
}
case GameVersion.AS:
case GameVersion.OR:
case GameVersion.ORAS:
{
index = PersonalTable.AO.getFormeIndex(species, form);
if (index == 0)
return moves;
PersonalInfo pi_oras = PersonalTable.AO[index];
moves.AddRange(TMHM_AO.Where((t, m) => pi_oras.TMHM[m]));
break;
}
}
break;
case 7:
index = PersonalTable.SM.getFormeIndex(species, form);
PersonalInfo pi_sm = PersonalTable.SM.getFormeEntry(species, form);
moves.AddRange(TMHM_SM.Where((t, m) => pi_sm.TMHM[m]));
break;
}
return moves.Distinct();
}
internal static IEnumerable<int> getTutorMoves(PKM pkm, int species, int form, bool specialTutors, int generation)
{
List<int> moves = new List<int>();
PersonalInfo info;

View file

@ -52,6 +52,10 @@ namespace PKHeX.Core
public static string V331 { get; set; } = "Learned by TM/HM in generation {0}.";
public static string V332 { get; set; } = "Learned by Move Tutor in generation {0}.";
public static string V333 { get; set; } = "Event Egg Move.";
public static string V344 { get; set; } = "Inherited egg move.";
public static string V345 { get; set; } = "Inherited move learned by Level-up.";
public static string V346 { get; set; } = "Inherited tutor move.";
public static string V349 { get; set; } = "Inherited TM/HM move.";
#endregion
@ -325,7 +329,14 @@ namespace PKHeX.Core
public static string V337 {get; set;} = "Event Egg Move. Incompatible with normal egg moves.";
public static string V338 {get; set;} = "Defog and whirpool. One of the two moves should have been removed before transfered to generation 5.";
public static string V339 {get; set;} = "Generation {0} HM. Should have been removed before transfered to generation {1}.";
public static string V340 {get; set;} = "Not an expected egg move.";
public static string V341 {get; set;} = "Egg Move.Not expected in an event egg.";
public static string V342 {get; set;} = "Event egg move missing.";
public static string V343 {get; set;} = "Expected the following Moves: { 0}";
public static string V347 {get; set;} = "Inherited move learned by Level-up.Not expected in an event egg.";
public static string V348 {get; set;} = "Inherited tutor move. Not expected in an event egg.";
public static string V350 {get; set;} = "Inherited TM/HM move. Not expected in an event egg.";
#endregion
}
}
}

View file

@ -10,7 +10,14 @@ namespace PKHeX.Core
internal const int MaxItemID_3 = 374;
internal const int MaxAbilityID_3 = 77;
internal const int MaxBallID_3 = 0xC;
public static readonly int[] SplitBreed_3 =
{
// Incense
183, 184, // Marill
202, // Wobbuffet
};
#region RS
internal static readonly ushort[] Pouch_Items_RS = {
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 63, 64, 65, 66, 67, 68, 69, 70, 71, 73, 74, 75, 76, 77, 78, 79, 80, 81, 83, 84, 85, 86, 93, 94, 95, 96, 97, 98, 103, 104, 106, 107, 108, 109, 110, 111, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 254, 255, 256, 257, 258
@ -89,7 +96,7 @@ namespace PKHeX.Core
407,424,429,430,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,700
};
internal static readonly int[] FutureEvolutionsGen3_LevelUp =
internal static readonly int[] FutureEvolutionsGen3_LevelUpGen4 =
{
424, 461, 462, 463, 465, 469, 470, 471, 472, 473, 476
};

View file

@ -23,6 +23,10 @@ V177 = Learned by Level-up.
V330 = Learned by Level-up in generation {0}.
V332 = Learned by Move Tutor in generation {0}.
V333 = Event Egg Move.
V344 = Inherited egg move.
V345 = Inherited move learned by Level-up.
V346 = Inherited tutor move.
V349 = Inherited TM/HM move.
V203 = Genderless Pokémon should not have a gender.
V201 = Encryption Constant is not set.
V204 = Held item is unreleased.
@ -259,4 +263,11 @@ V335 = Generation 1 exclusive move. Incompatible with Non-tradeback egg moves.
V336 = Egg Move. Incompatible with event egg moves.
V337 = Event Egg Move. Incompatible with normal egg moves.
V338 = Defog and whirpool. One of the two moves should have been removed before transfered to generation 5.
V339 = Generation {0} HM. Should have been removed before transfered to generation {1}.
V339 = Generation {0} HM. Should have been removed before transfered to generation {1}.
V340 = Not an expected egg move.
V341 = Inherited Egg Move. Not expected in an event egg.
V342 = Event egg move missing.
V343 = Expected the following Moves: {0}
V347 = Inherited move learned by Level-up. Not expected in an event egg.
V348 = Inherited tutor move. Not expected in an event egg.
V350 = Inherited TM/HM move. Not expected in an event egg.