mirror of
https://github.com/kwsch/PKHeX
synced 2024-11-26 22:10:21 +00:00
Merge branch 'master' into master
This commit is contained in:
commit
c42355b7bf
6 changed files with 417 additions and 26 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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.
|
Loading…
Reference in a new issue