示例#1
0
        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);
        }
示例#2
0
        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));
        }