Misc simplifications

Segregate gen4 transfer legality check from encounter detection
reorder EncounterSlot[] match test to be before EncounterStatic. Closes
#1016
Fix manaphy gift handling
This commit is contained in:
Kurt 2017-03-31 18:35:43 -07:00
parent f0fc473a7e
commit a1153f1004
3 changed files with 67 additions and 94 deletions

View file

@ -497,7 +497,7 @@ namespace PKHeX.Core
private CheckResult verifyEncounterEgg()
{
// Check Species
if (Legal.NoHatchFromEgg.Contains(pkm.Species) && !EncounterIsMysteryGift)
if (Legal.NoHatchFromEgg.Contains(pkm.Species) && EncounterMatch == null)
return new CheckResult(Severity.Invalid, V50, CheckIdentifier.Encounter);
switch (pkm.GenNumber)
@ -804,22 +804,19 @@ namespace PKHeX.Core
}
EncounterMatch = null;
if (null != (EncounterMatch = Legal.getValidStaticEncounter(pkm)))
if (null != (EncounterMatch = Legal.getValidIngameTrade(pkm)))
{
G3Result = verifyEncounterStatic();
if (G3Result?.Valid ?? false)
G3Encounter = EncounterMatch;
}
else if (null != (EncounterMatch = Legal.getValidIngameTrade(pkm)))
{
G3Result = verifyEncounterTrade();
if (G3Result?.Valid ?? false)
if ((G3Result = verifyEncounterTrade())?.Valid ?? false)
G3Encounter = EncounterMatch;
}
else if (null != (EncounterMatch = Legal.getValidWildEncounters(pkm)))
{
G3Result = verifyEncounterWild();
if (G3Result?.Valid ?? false)
if ((G3Result = verifyEncounterWild())?.Valid ?? false)
G3Encounter = EncounterMatch;
}
else if (null != (EncounterMatch = Legal.getValidStaticEncounter(pkm)))
{
if ((G3Result = verifyEncounterStatic())?.Valid ?? false)
G3Encounter = EncounterMatch;
}
@ -865,15 +862,6 @@ namespace PKHeX.Core
private CheckResult verifyEncounterG4Transfer()
{
CheckResult Gen4Result = null;
CheckResult InvalidTransferResult = null;
var CrownLocation = -1;
var AllowCrownLocation = pkm.Gen4 && pkm.FatefulEncounter && Legal.CrownBeasts.Contains(pkm.Species);
if (AllowCrownLocation)
CrownLocation = pkm.Species == 251 ? 30010 : 30012; // Celebi : Beast
if (pkm.Met_Location != 30001 && (!AllowCrownLocation || pkm.Met_Location != CrownLocation))
InvalidTransferResult = new CheckResult(Severity.Invalid, AllowCrownLocation ? V351 : V61, CheckIdentifier.Encounter);
bool wasEvent = pkm.WasEvent || pkm.WasEventEgg;
if (wasEvent)
@ -887,7 +875,7 @@ namespace PKHeX.Core
{
var result = verifyEncounterStatic();
if (result != null)
return result.Valid && InvalidTransferResult != null ? InvalidTransferResult : result;
return result;
EncounterMatch = null; // Reset Encounter Object, test for remaining encounters
}
@ -909,13 +897,14 @@ namespace PKHeX.Core
? new CheckResult(Severity.Invalid, V78, CheckIdentifier.Encounter)
: new CheckResult(Severity.Invalid, V80, CheckIdentifier.Encounter);
if (InvalidTransferResult != null)
{
if (Gen4Result.Valid)
return InvalidTransferResult;
// If there is an error in G5 transfer and G4 encounter return both erros
return new CheckResult(Severity.Invalid, Gen4Result.Comment + Environment.NewLine + InvalidTransferResult.Comment, CheckIdentifier.Encounter);
}
// Transfer Legality
var CrownLocation = -1;
var AllowCrownLocation = pkm.Gen4 && pkm.FatefulEncounter && Legal.CrownBeasts.Contains(pkm.Species);
if (AllowCrownLocation)
CrownLocation = pkm.Species == 251 ? 30010 : 30012; // Celebi : Beast
if (pkm.Met_Location != 30001 && (!AllowCrownLocation || pkm.Met_Location != CrownLocation))
AddLine(Severity.Invalid, AllowCrownLocation ? V351 : V61, CheckIdentifier.Encounter);
return Gen4Result;
}
@ -2552,17 +2541,17 @@ namespace PKHeX.Core
// 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 (!baseegg.Contains(moves[m]))
continue;
if (IsGen2Pkm && Gen1MovesLearned.Any() && moves[m] > Legal.MaxMoveID_1)
{
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);
BaseEggMovesLearned.Add(m);
res[m] = new CheckResult(Severity.Invalid, V334, CheckIdentifier.Move);
MixedGen1NonTradebackGen2 = true;
}
else
res[m] = new CheckResult(Severity.Valid, V345, CheckIdentifier.Move);
BaseEggMovesLearned.Add(m);
}
// Check egg moves after all the generations and all the moves, every move that can't be learned in another source should have preference
@ -2602,7 +2591,7 @@ namespace PKHeX.Core
// A pokemon could have normal egg moves and regular egg moves
// Only if all regular egg moves are event egg moves or all event egg moves are regular egg moves
var RegularEggMovesLearned = EggMovesLearned.Union(BaseEggMovesLearned);
var RegularEggMovesLearned = EggMovesLearned.Union(BaseEggMovesLearned).ToList();
if (RegularEggMovesLearned.Any() && EventEggMovesLearned.Any())
{
// Moves that are egg moves or event egg moves but not both
@ -2629,14 +2618,17 @@ namespace PKHeX.Core
// Check if the marked hidden moves that were invalid at the start are now marked as valid, that means
// the hidden move was learned in gen 3 or 4 but was not removed when transfer to 4 or 5
if (KnowDefogWhirlpool)
KnowDefogWhirlpool = moves.Where((m,i) => (m == 250 || m == 432) && (res[i]?.Valid ?? false)).Count() == 2;
{
int invalidCount = moves.Where((m, i) => (m == 250 || m == 432) && (res[i]?.Valid ?? false)).Count();
if (invalidCount == 2) // can't know both at the same time
for (int i = 0; i < 4; i++) // flag both moves
if (moves[i] == 250 || moves[i] == 432)
res[i] = new CheckResult(Severity.Invalid, V338, CheckIdentifier.Move);
}
if (KnowDefogWhirlpool)
foreach (int index in moves.Select((m, i) => i).Where(i => moves[i] == 250 || moves[i] == 432))
res[index] = new CheckResult(Severity.Invalid, V338, CheckIdentifier.Move);
foreach (int hm in HMLearned.Where(l => res[l]?.Valid ?? false))
res[hm] = new CheckResult(Severity.Invalid, string.Format(V339, gen, gen + 1), CheckIdentifier.Move);
for (int i = 0; i < HMLearned.Length; i++)
if (res[i]?.Valid ?? false)
res[i] = new CheckResult(Severity.Invalid, string.Format(V339, gen, gen + 1), CheckIdentifier.Move);
}
// Mark the gen 1 exclusive moves as illegal because the pokemon also have Non tradeback egg moves.
@ -2674,19 +2666,19 @@ namespace PKHeX.Core
if (res[m]?.Valid ?? false)
continue;
if (ShedinjaEvoMoves[gen].Contains(moves[m]))
{
res[m] = new CheckResult(Severity.Valid, native ? V355 : string.Format(V356, gen), CheckIdentifier.Move);
ShedinjaEvoMovesLearned.Add(m);
}
if (!ShedinjaEvoMoves[gen].Contains(moves[m]))
continue;
res[m] = new CheckResult(Severity.Valid, native ? V355 : string.Format(V356, gen), CheckIdentifier.Move);
ShedinjaEvoMovesLearned.Add(m);
}
}
if (ShedinjaEvoMovesLearned.Count() > 1)
{
foreach (int m in ShedinjaEvoMovesLearned)
res[m] = new CheckResult(Severity.Invalid, V357, CheckIdentifier.Move);
}
if (ShedinjaEvoMovesLearned.Count <= 1)
return;
foreach (int m in ShedinjaEvoMovesLearned)
res[m] = new CheckResult(Severity.Invalid, V357, CheckIdentifier.Move);
}
private void verifyPreRelearn()

View file

@ -718,28 +718,23 @@ namespace PKHeX.Core
lvl = pkm.CurrentLevel;
if (pkm.Species != 292 || lvl < 20)
return r;
// If nincada evolves into Ninjask an learn in the evolution a move from ninjask learnset pool
// Shedinja would appear with that move learned. Only one move above level 20 allowed, only in generations 3 and 4
switch(generation)
switch (generation)
{
case 0:
case 3:
{
if(pkm.InhabitedGeneration(3))
// Ninjask have the same learnset in every gen 3 games
r[3] = LevelUpE[291].getMoves(20, lvl).ToList();
case 0: // Default (both)
case 3: // Ninjask have the same learnset in every gen 3 games
if (pkm.InhabitedGeneration(3))
r[3] = LevelUpE[291].getMoves(20, lvl).ToList();
if (generation == 0)
goto case 4;
break;
}
case 4:
{
if (pkm.InhabitedGeneration(4))
// Ninjask have the same learnset in every gen 4 games
r[4] = LevelUpPt[291].getMoves(20, lvl).ToList();
break;
}
if (generation == 0)
goto case 4;
break;
case 4: // Ninjask have the same learnset in every gen 4 games
if (pkm.InhabitedGeneration(4))
r[4] = LevelUpPt[291].getMoves(20, lvl).ToList();
break;
}
return r;
}

View file

@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@ -21,24 +20,11 @@ namespace PKHeX.Core
return Moves;
}
public int[] getMoves(int minlevel,int maxlevel)
public int[] getMoves(int minLevel, int maxLevel)
{
if (minlevel <= 1)
return getMoves(maxlevel);
int i = 0;
int skipmoves = 0;
for (; i < Levels.Length; i++)
if (Levels[i] == minlevel)
{
skipmoves = Math.Min(0, i - 1);
continue;
}
if (maxlevel >= 100)
return Moves.Skip(skipmoves).ToArray();
for (; i < Levels.Length; i++)
if (Levels[i] > maxlevel)
return Moves.Take(i).Skip(skipmoves).ToArray();
return Moves.Skip(skipmoves).ToArray();
return Moves
.SkipWhile((m, i) => Levels[i] < minLevel)
.TakeWhile((m, i) => Levels[i] <= maxLevel).ToArray();
}
}