public static EggSource34[] Validate(int species, GameVersion version, ReadOnlySpan <int> moves, out bool valid) { var count = moves.IndexOf(0); if (count == 0) { valid = false; // empty moveset return(Array.Empty <EggSource34>()); } if (count == -1) { count = moves.Length; } var learn = GameData.GetLearnsets(version); var table = GameData.GetPersonal(version); var learnset = learn[species]; var pi = table[species]; var egg = Legal.EggMovesRS[species].Moves; var actual = new EggSource34[count]; Span <byte> possible = stackalloc byte[count]; var value = new BreedInfo <EggSource34>(actual, possible, learnset, moves, level); if (species is (int)Species.Pichu && moves[count - 1] is (int)Move.VoltTackle && version == GameVersion.E) { actual[--count] = VoltTackle; } if (count == 0) { valid = VerifyBaseMoves(value); } else { bool inherit = Breeding.GetCanInheritMoves(species); MarkMovesForOrigin(value, egg, count, inherit, pi); valid = RecurseMovesForOrigin(value, count - 1); } if (!valid) { CleanResult(actual, possible); } return(value.Actual); }
private static bool RecurseMovesForOrigin(BreedInfo <EggSource34> info, int start, EggSource34 type = Max - 1) { int i = start; do { var unpeel = type - 1; if (unpeel != 0 && RecurseMovesForOrigin(info, i, unpeel)) { return(true); } var permit = info.Possible[i]; if ((permit & (1 << (int)type)) == 0) { return(false); } info.Actual[i] = type; } while (--i >= 0); return(VerifyBaseMoves(info)); }