Add hidden ability mismatch check for fixed abils

minor refactoring
remove GameVersion.Pt unreachable code for eggmoves
This commit is contained in:
Kurt 2017-05-08 20:35:06 -07:00
parent cfc99f064f
commit 95eefb45ff

View File

@ -1382,16 +1382,8 @@ private void verifyAbility()
(EncounterMatch as EncounterTrade)?.Ability ??
(EncounterMatch as EncounterLink)?.Ability;
if ((AbilityUnchanged ?? false) && EncounterAbility != null && EncounterAbility != 0 && pkm.AbilityNumber != EncounterAbility)
{
if (pkm.Format >= 6 && abilities[0] != abilities[1] && pkm.AbilityNumber < 4) //Ability Capsule
AddLine(Severity.Valid, V109, CheckIdentifier.Ability);
else if (pkm.Gen3 && EncounterMatch is EncounterTrade && EncounterAbility == 1 << abilval) // Edge case (Static PID?)
AddLine(Severity.Valid, V115, CheckIdentifier.Ability);
else
AddLine(Severity.Invalid, V223, CheckIdentifier.Ability);
return;
}
if (EncounterAbility != null && verifySetAbility(EncounterAbility, AbilityUnchanged, abilities, abilval))
return; // result added via verifySetAbility
switch (pkm.GenNumber)
{
@ -1408,6 +1400,26 @@ private void verifyAbility()
else
AddLine(Severity.Valid, V115, CheckIdentifier.Ability);
}
private bool verifySetAbility(int? EncounterAbility, bool? AbilityUnchanged, int[] abilities, int abilval)
{
if (pkm.AbilityNumber == 4 && EncounterAbility != 4)
{
AddLine(Severity.Invalid, V108, CheckIdentifier.Ability);
return true;
}
if (!(AbilityUnchanged ?? false) || EncounterAbility == 0 || pkm.AbilityNumber == EncounterAbility)
return false;
if (pkm.Format >= 6 && abilities[0] != abilities[1] && pkm.AbilityNumber < 4) // Ability Capsule
AddLine(Severity.Valid, V109, CheckIdentifier.Ability);
else if (pkm.Gen3 && EncounterMatch is EncounterTrade && EncounterAbility == 1 << abilval)
// Edge case (Static PID?)
AddLine(Severity.Valid, V115, CheckIdentifier.Ability);
else
AddLine(Severity.Invalid, V223, CheckIdentifier.Ability);
return true;
}
private bool? verifyAbilityPreCapsule(int[] abilities, int abilval)
{
// CXD pokemon could have any ability without maching PID
@ -1433,13 +1445,12 @@ private void verifyAbility()
private bool? verifyAbilityGen3Transfer(int[] abilities, int abilval, int Species_g3)
{
var abilities_g3 = PersonalTable.E[Species_g3].Abilities.Where(a => a != 0).Distinct().ToArray();
if (abilities_g3.Length == 2)
// For non-GC, it has 2 abilities in gen 3, must match PID
if (abilities_g3.Length == 2) // Excluding Colosseum/XD, a gen3 pkm must match PID if it has 2 unique abilities
return pkm.Version != (int)GameVersion.CXD;
var Species_g45 = Math.Max(EvoChainsAllGens[4].FirstOrDefault()?.Species ?? 0, pkm.Format == 5 ? EvoChainsAllGens[5].FirstOrDefault()?.Species ?? 0 : 0);
if (Species_g45 > Species_g3)
// it have evolved in gen 4 or 5 games, ability must match PID
int Species_g4 = EvoChainsAllGens[4].FirstOrDefault()?.Species ?? 0;
int Species_g5 = pkm.Format == 5 ? EvoChainsAllGens[5].FirstOrDefault()?.Species ?? 0 : 0;
if (Math.Max(Species_g5, Species_g4) > Species_g3) // it has evolved in either gen 4 or gen 5; the ability must match PID
return false;
var Evolutions_g45 = Math.Max(EvoChainsAllGens[4].Length, pkm.Format == 5 ? EvoChainsAllGens[5].Length : 0);
@ -2783,7 +2794,6 @@ private CheckResult[] parseMovesForSmeargle(int[] Moves)
}
private GameVersion[] getBaseMovesIsEggGames()
{
GameVersion[] Games = { };
switch (pkm.GenNumber)
{
case 1:
@ -2823,15 +2833,13 @@ private GameVersion[] getBaseMovesIsEggGames()
case GameVersion.B:
case GameVersion.W:
return new[] { GameVersion.BW };
case GameVersion.Pt:
return new[] { GameVersion.Pt };
case GameVersion.B2:
case GameVersion.W2:
return new[] { GameVersion.B2W2 };
}
break;
}
return Games;
return new GameVersion[] {};
}
private CheckResult[] parseMovesIsEggPreRelearn(int[] Moves, int[] SpecialMoves, bool allowinherited)
{
@ -2919,7 +2927,6 @@ private CheckResult[] parseMovesWasEggPreRelearn(int[] Moves, List<int>[] validL
if (res.All(r => r.Valid)) // moves is satisfactory
return res;
}
return res;
}