private LegalityCheck[] verifyRelearn() { LegalityCheck[] res = new LegalityCheck[4]; MatchedWC6 = null; // Reset int[] Moves = pk6.RelearnMoves; if (!pk6.Gen6) { goto noRelearn; } if (pk6.WasLink) { int[] moves = Legal.getLinkMoves(pk6); for (int i = 0; i < 4; i++) { res[i] = moves[i] != Moves[i] ? new LegalityCheck(Severity.Invalid, $"Expected ID:{moves[i]}.") : new LegalityCheck(); } return(res); } if (pk6.WasEvent || pk6.WasEventEgg) { // Get WC6's that match IEnumerable <WC6> vwc6 = Legal.getValidWC6s(pk6); foreach (var wc in vwc6) { int[] moves = wc.RelearnMoves; for (int i = 0; i < 4; i++) { res[i] = moves[i] != Moves[i] ? new LegalityCheck(Severity.Invalid, $"Expected ID:{moves[i]}.") : new LegalityCheck(Severity.Valid, $"Matched WC #{wc.CardID.ToString("0000")}"); } if (res.All(r => r.Valid)) { MatchedWC6 = wc; return(res); } } goto noRelearn; // No WC match } if (pk6.WasEgg) { const int games = 2; bool checkAllGames = pk6.WasTradedEgg; bool splitBreed = Legal.SplitBreed.Contains(pk6.Species); int iterate = (checkAllGames ? games : 1) * (splitBreed ? 2 : 1); for (int i = 0; i < iterate; i++) { int gameSource = !checkAllGames ? -1 : i % iterate / (splitBreed ? 2 : 1); int skipOption = splitBreed && iterate / 2 <= i ? 1 : 0; // Obtain level1 moves List <int> baseMoves = new List <int>(Legal.getBaseEggMoves(pk6, skipOption, gameSource)); int baseCt = baseMoves.Count; if (baseCt > 4) { baseCt = 4; } // Obtain Nonstandard moves var relearnMoves = Legal.getValidRelearn(pk6, skipOption).ToArray(); var relearn = pk6.RelearnMoves.Where(move => move != 0 && (!baseMoves.Contains(move) || relearnMoves.Contains(move)) ).ToArray(); int relearnCt = relearn.Length; // Get Move Window List <int> window = new List <int>(baseMoves); window.AddRange(relearn); int[] moves = window.Skip(baseCt + relearnCt - 4).Take(4).ToArray(); Array.Resize(ref moves, 4); int req; if (relearnCt == 4) { req = 0; } else if (baseCt + relearnCt > 4) { req = 4 - relearnCt; } else { req = baseCt; } // Movepool finalized! Check validity. int[] rl = pk6.RelearnMoves; string em = string.Join(", ", baseMoves); // Base Egg Move for (int j = 0; j < req; j++) { res[j] = !baseMoves.Contains(rl[j]) ? new LegalityCheck(Severity.Invalid, $"Base egg move missing; expected one of: {em}.") : new LegalityCheck(Severity.Valid, "Base egg move."); } // Non-Base if (Legal.LightBall.Contains(pk6.Species)) { relearnMoves = relearnMoves.Concat(new[] { 344 }).ToArray(); } for (int j = req; j < 4; j++) { res[j] = !relearnMoves.Contains(rl[j]) ? new LegalityCheck(Severity.Invalid, "Not an expected relearn move.") : new LegalityCheck(Severity.Valid, "Relearn move."); } if (res.All(r => r.Valid)) { break; } } return(res); } if (Moves[0] != 0) // DexNav only? { // Check DexNav if (!Legal.getDexNavValid(pk6)) { goto noRelearn; } res[0] = !Legal.getValidRelearn(pk6, 0).Contains(Moves[0]) ? new LegalityCheck(Severity.Invalid, "Not an expected DexNav move.") : new LegalityCheck(); for (int i = 1; i < 4; i++) { res[i] = Moves[i] != 0 ? new LegalityCheck(Severity.Invalid, "Expected no Relearn Move in slot.") : new LegalityCheck(); } return(res); } // Should have no relearn moves. noRelearn: for (int i = 0; i < 4; i++) { res[i] = Moves[i] != 0 ? new LegalityCheck(Severity.Invalid, "Expected no Relearn Moves.") : new LegalityCheck(); } return(res); }
private LegalityCheck verifyEncounter() { if (!pk6.Gen6) { return new LegalityCheck { Judgement = Severity.NotImplemented } } ; if (pk6.WasLink) { // Should NOT be Fateful, and should be in Database return(pk6.FatefulEncounter || Legal.getLinkMoves(pk6).Length == 0 ? new LegalityCheck(Severity.Invalid, "Not a valid Link gift.") : new LegalityCheck(Severity.Valid, "Valid Link gift.")); } if (pk6.WasEvent || pk6.WasEventEgg) { return(MatchedWC6 != null // Matched in RelearnMoves check. ? new LegalityCheck(Severity.Valid, $"Matches #{MatchedWC6.CardID.ToString("0000")} ({MatchedWC6.CardTitle})") : new LegalityCheck(Severity.Invalid, "Not a valid Wonder Card gift.")); } if (pk6.WasEgg) { // Check Hatch Locations if (pk6.Met_Level != 1) { return(new LegalityCheck(Severity.Invalid, "Invalid met level, expected 1.")); } if (pk6.IsEgg) { return(pk6.Met_Location == 0 ? new LegalityCheck(Severity.Valid, "Valid un-hatched egg.") : new LegalityCheck(Severity.Invalid, "Invalid location for un-hatched egg (expected ID:0)")); } if (pk6.XY) { return(Legal.ValidMet_XY.Contains(pk6.Met_Location) ? new LegalityCheck(Severity.Valid, "Valid X/Y hatched egg.") : new LegalityCheck(Severity.Invalid, "Invalid X/Y location for hatched egg.")); } if (pk6.AO) { return(Legal.ValidMet_AO.Contains(pk6.Met_Location) ? new LegalityCheck(Severity.Valid, "Valid OR/AS hatched egg.") : new LegalityCheck(Severity.Invalid, "Invalid OR/AS location for hatched egg.")); } return(new LegalityCheck(Severity.Invalid, "Invalid location for hatched egg.")); } EncounterStatic z = Legal.getStaticEncounter(pk6); if (z != null) { return(new LegalityCheck(Severity.Valid, "Valid gift/static encounter.")); } if (Legal.getIsFossil(pk6)) { return(pk6.AbilityNumber != 4 ? new LegalityCheck(Severity.Valid, "Valid revived fossil.") : new LegalityCheck(Severity.Invalid, "Hidden ability on revived fossil.")); } int FriendSafari = Legal.getFriendSafariValid(pk6); if (FriendSafari > 0) { if (pk6.Species == 670 || pk6.Species == 671) // Floette { if (pk6.AltForm % 2 != 0) // 0/2/4 { return(new LegalityCheck(Severity.Invalid, "Friend Safari: Not valid color.")); } else if (pk6.Species == 710 || pk6.Species == 711) // Pumpkaboo { if (pk6.AltForm != 1) // Average { return(new LegalityCheck(Severity.Invalid, "Friend Safari: Not average sized.")); } else if (pk6.Species == 586) // Sawsbuck { if (pk6.AltForm != 0) { return(new LegalityCheck(Severity.Invalid, "Friend Safari: Not Spring form.")); } } } } return(new LegalityCheck(Severity.Valid, "Valid friend safari encounter.")); } if (Legal.getDexNavValid(pk6)) { return(new LegalityCheck(Severity.Valid, "Valid (DexNav) encounter at location.")); } if (Legal.getWildEncounterValid(pk6)) { return(pk6.AbilityNumber != 4 ? new LegalityCheck(Severity.Valid, "Valid encounter at location.") : new LegalityCheck(Severity.Invalid, "Hidden ability on valid encounter.")); } EncounterTrade t = Legal.getIngameTrade(pk6); if (t != null) { EncounterMatch = t; // Check in individual methods return(new LegalityCheck(Severity.Valid, "Valid ingame trade.")); } return(new LegalityCheck(Severity.Invalid, "Not a valid encounter.")); }