Add Ball/Ability checks & wc6 PID check

Probably am going to move the WC6 fetch logic out
This commit is contained in:
Kaphotics 2016-03-21 08:01:08 -07:00
parent 17109093bd
commit b05b66810c
3 changed files with 58 additions and 4 deletions

View file

@ -8,7 +8,7 @@ namespace PKHeX
private readonly PK6 pk6; private readonly PK6 pk6;
private WC6 MatchedWC6; private WC6 MatchedWC6;
private object EncounterMatch; private object EncounterMatch;
private LegalityCheck ECPID, Nickname, IDs, IVs, EVs, Encounter, Level, Ribbons; private LegalityCheck ECPID, Nickname, IDs, IVs, EVs, Encounter, Level, Ribbons, Ability, Ball;
public bool Valid = true; public bool Valid = true;
public bool SecondaryChecked; public bool SecondaryChecked;
@ -48,6 +48,8 @@ namespace PKHeX
EVs = verifyEVs(); EVs = verifyEVs();
Level = verifyLevel(); Level = verifyLevel();
Ribbons = verifyRibbons(); Ribbons = verifyRibbons();
Ability = verifyAbility();
Ball = verifyBall();
SecondaryChecked = true; SecondaryChecked = true;
} }
private string getLegalityReport() private string getLegalityReport()
@ -55,7 +57,7 @@ namespace PKHeX
if (!pk6.Gen6) if (!pk6.Gen6)
return "Analysis only available for Pokémon that originate from X/Y & OR/AS."; return "Analysis only available for Pokémon that originate from X/Y & OR/AS.";
var chks = new[] { ECPID, Nickname, IVs, EVs, IDs, Encounter, Level, Ribbons }; var chks = new[] { ECPID, Nickname, IVs, EVs, IDs, Encounter, Level, Ribbons, Ability, Ball };
string r = ""; string r = "";
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)

View file

@ -248,7 +248,7 @@ namespace PKHeX
"Premier", "Event", "Birthday", "Special", "Souvenir", "Premier", "Event", "Birthday", "Special", "Souvenir",
"Wishing", "Battle Champ", "Regional Champ", "National Champ", "World Champ" "Wishing", "Battle Champ", "Regional Champ", "National Champ", "World Champ"
}; };
if (MatchedWC6 != null) // Wondercard if (MatchedWC6 != null) // Wonder Card
{ {
bool[] wc6rib = bool[] wc6rib =
{ {
@ -295,6 +295,54 @@ namespace PKHeX
result[1] = "Invalid Ribbons: " + string.Join(", ", invalidRibbons); result[1] = "Invalid Ribbons: " + string.Join(", ", invalidRibbons);
return new LegalityCheck(Severity.Invalid, string.Join(Environment.NewLine, result.Where(s=>!string.IsNullOrEmpty(s)))); return new LegalityCheck(Severity.Invalid, string.Join(Environment.NewLine, result.Where(s=>!string.IsNullOrEmpty(s))));
} }
private LegalityCheck verifyAbility()
{
int index = Legal.PersonalAO[pk6.Species].FormeIndex(pk6.Species, pk6.AltForm);
byte[] abilities = Legal.PersonalAO[index].Abilities;
int abilval = Array.IndexOf(abilities, (byte)pk6.Ability);
if (abilval < 0)
return new LegalityCheck(Severity.Invalid, "Ability is not valid for species/form");
return abilities[pk6.AbilityNumber >> 1] != pk6.Ability
? new LegalityCheck(Severity.Invalid, "Ability does not match ability number.")
: new LegalityCheck(Severity.Valid, "Ability matches ability number.");
}
private LegalityCheck verifyBall()
{
if (MatchedWC6 != null)
return pk6.Ball != MatchedWC6.Pokéball
? new LegalityCheck(Severity.Invalid, "Ball does not match specified Wonder Card Ball.")
: new LegalityCheck(Severity.Valid, "Ball matches Wonder Card.");
if (pk6.WasEgg)
{
if (pk6.Species > 650)
return !Legal.WildPokeballs.Contains(pk6.Ball)
? new LegalityCheck(Severity.Invalid, "Unobtainable ball for Kalos origin.")
: new LegalityCheck(Severity.Valid, "Obtainable ball for Kalos origin.");
if (pk6.Ball == 0x10) // Cherish
return new LegalityCheck(Severity.Invalid, "Cherish Ball on non-event.");
if (pk6.Ball == 5 && pk6.Species > 493) // Gen5
return new LegalityCheck(Severity.Invalid, "Safari Ball on GenV species.");
// Feel free to improve, there's a lot of very minor things to check for some species.
}
if (EncounterMatch == null)
{
// Wild Encounter
return !Legal.WildPokeballs.Contains(pk6.Ball)
? new LegalityCheck(Severity.Invalid, "Unobtainable ball on captured encounter.")
: new LegalityCheck(Severity.Valid, "Obtainable ball on captured encounter.");
}
if (EncounterMatch.GetType() == typeof(EncounterTrade))
return pk6.Ball != 4 // Pokeball
? new LegalityCheck(Severity.Invalid, "Incorrect ball on ingame trade encounter.")
: new LegalityCheck(Severity.Valid, "Correct ball on ingame trade encounter.");
return new LegalityCheck(Severity.Indeterminate, "Unable to verify Ball");
}
private LegalityCheck[] verifyMoves() private LegalityCheck[] verifyMoves()
{ {
int[] Moves = pk6.Moves; int[] Moves = pk6.Moves;
@ -325,7 +373,7 @@ namespace PKHeX
else if (RelearnMoves.Contains(Moves[i])) else if (RelearnMoves.Contains(Moves[i]))
res[i] = new LegalityCheck(Severity.Valid, "Relearn Move."); res[i] = new LegalityCheck(Severity.Valid, "Relearn Move.");
else if (WC6Moves.Contains(Moves[i])) else if (WC6Moves.Contains(Moves[i]))
res[i] = new LegalityCheck(Severity.Valid, "Wondercard Non-Relearn Move."); res[i] = new LegalityCheck(Severity.Valid, "Wonder Card Non-Relearn Move.");
else else
res[i] = new LegalityCheck(Severity.Invalid, "Invalid Move."); res[i] = new LegalityCheck(Severity.Invalid, "Invalid Move.");
} }
@ -367,6 +415,9 @@ namespace PKHeX
IEnumerable<WC6> vwc6 = Legal.getValidWC6s(pk6); IEnumerable<WC6> vwc6 = Legal.getValidWC6s(pk6);
foreach (var wc in vwc6) foreach (var wc in vwc6)
{ {
if (wc.PIDType == 0 && pk6.PID != wc.PID) continue;
if (wc.PIDType == 2 && !pk6.IsShiny) continue;
if (wc.PIDType == 3 && pk6.IsShiny) continue;
int[] moves = wc.RelearnMoves; int[] moves = wc.RelearnMoves;
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
res[i] = moves[i] != Moves[i] res[i] = moves[i] != Moves[i]

View file

@ -410,5 +410,6 @@
}; };
internal static readonly int[] RotomMoves = { 0, 315, 056, 059, 403, 437 }; internal static readonly int[] RotomMoves = { 0, 315, 056, 059, 403, 437 };
internal static readonly int[] PikachuMoves = { 0, 309, 556, 577, 604, 560 }; internal static readonly int[] PikachuMoves = { 0, 309, 556, 577, 604, 560 };
internal static readonly int[] WildPokeballs = { 0x01, 0x02, 0x03, 0x04, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
} }
} }