Example #1
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters3CXD(PKM pkm)
        {
            var chain = EncounterOrigin.GetOriginChain(pkm);

            // Mystery Gifts
            foreach (var z in GetValidGifts(pkm, chain))
            {
                // Don't bother deferring matches.
                var match = z.GetMatchRating(pkm);
                if (match != PartialMatch)
                {
                    yield return(z);
                }
            }

            // Trades
            foreach (var z in GetValidEncounterTrades(pkm, chain))
            {
                // Don't bother deferring matches.
                var match = z.GetMatchRating(pkm);
                if (match != PartialMatch)
                {
                    yield return(z);
                }
            }

            IEncounterable?partial = null;

            // Static Encounter
            foreach (var z in GetValidStaticEncounter(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                if (match == PartialMatch)
                {
                    partial ??= z;
                }
                else
                {
                    yield return(z);
                }
            }

            // Encounter Slots
            foreach (var z in GetValidWildEncounters(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                if (match == PartialMatch)
                {
                    partial ??= z;
                    continue;
                }
                yield return(z);
            }

            if (partial is not null)
            {
                yield return(partial);
            }
        }
Example #2
0
        public static IEnumerable <IEncounterable> GetEncounters(PKM pkm)
        {
            var chain = EncounterOrigin.GetOriginChain(pkm);

            return(pkm.Version switch
            {
                (int)GameVersion.GO => EncounterGenerator7.GetEncountersGO(pkm, chain),
                _ => GetEncountersMainline(pkm, chain)
            });
Example #3
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters(PKM pkm)
        {
            int ctr = 0;

            var chain = EncounterOrigin.GetOriginChain(pkm);

            if (pkm.WasEvent || pkm.WasEventEgg || pkm.WasLink)
            {
                foreach (var z in GetValidGifts(pkm, chain))
                {
                    yield return(z); ++ctr;
                }
                if (ctr != 0)
                {
                    yield break;
                }
            }

            if (pkm.WasBredEgg)
            {
                foreach (var z in GenerateEggs(pkm))
                {
                    yield return(z); ++ctr;
                }
                if (ctr == 0)
                {
                    yield break;
                }
            }

            foreach (var z in GetValidStaticEncounter(pkm, chain))
            {
                yield return(z); ++ctr;
            }
            if (ctr != 0)
            {
                yield break;
            }

            foreach (var z in GetValidWildEncounters(pkm, chain))
            {
                yield return(z); ++ctr;
            }
            if (ctr != 0)
            {
                yield break;
            }

            foreach (var z in GetValidEncounterTrades(pkm, chain))
            {
                yield return(z); ++ctr;
            }
        }
Example #4
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters12(PKM pkm, GameVersion game)
        {
            // Since encounter matching is super weak due to limited stored data in the structure
            // Calculate all 3 at the same time and pick the best result (by species).
            // Favor special event move gifts as Static Encounters when applicable
            var chain = EncounterOrigin.GetOriginChain12(pkm, game);

            var deferred = new List <IEncounterable>();

            foreach (var t in EncounterTradeGenerator.GetValidEncounterTrades(pkm, chain, game))
            {
                // some OTs are longer than the keyboard entry; don't defer these
                if (pkm.Format >= 7 && pkm.OT_Name.Length <= (pkm.Japanese || pkm.Korean ? 5 : 7))
                {
                    deferred.Add(t);
                    continue;
                }
                if (t is EncounterTrade1 t1 && !t1.IsEncounterTrade1Valid(pkm))
                {
                    deferred.Add(t);
                    continue;
                }
                yield return(t);
            }
            foreach (var s in EncounterStaticGenerator.GetValidStaticEncounter(pkm, chain, game))
            {
                yield return(s);
            }
            foreach (var e in EncounterSlotGenerator.GetValidWildEncounters12(pkm, chain, game))
            {
                yield return(e);
            }
            if (game != GameVersion.RBY)
            {
                foreach (var e in EncounterEggGenerator2.GenerateEggs(pkm, chain))
                {
                    yield return(e);
                }
            }

            foreach (var s in GenerateGBEvents(pkm, chain, game))
            {
                yield return(s);
            }

            foreach (var d in deferred)
            {
                yield return(d);
            }
        }
Example #5
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters8(PKM pkm)
        {
            // Static Encounters can collide with wild encounters (close match); don't break if a Static Encounter is yielded.
            int ctr = 0;

            var chain = EncounterOrigin.GetOriginChain(pkm);

            if (pkm.WasEvent || pkm.WasEventEgg)
            {
                foreach (var z in GetValidGifts(pkm, chain))
                {
                    yield return(z); ++ctr;
                }
                if (ctr != 0)
                {
                    yield break;
                }
            }

            if (pkm.WasBredEgg)
            {
                foreach (var z in GenerateEggs(pkm))
                {
                    yield return(z); ++ctr;
                }
                if (ctr == 0)
                {
                    yield break;
                }
            }

            foreach (var z in GetValidStaticEncounter(pkm, chain))
            {
                yield return(z); ++ctr;
            }
            // if (ctr != 0) yield break;
            foreach (var z in GetValidWildEncounters(pkm, chain))
            {
                yield return(z); ++ctr;
            }

            if (ctr != 0)
            {
                yield break;
            }
            foreach (var z in GetValidEncounterTrades(pkm, chain))
            {
                yield return(z); ++ctr;
            }
        }
Example #6
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters12(PKM pkm, GameVersion game)
        {
            // Since encounter matching is super weak due to limited stored data in the structure
            // Calculate all 3 at the same time and pick the best result (by species).
            // Favor special event move gifts as Static Encounters when applicable
            var chain = EncounterOrigin.GetOriginChain12(pkm, game);

            IEncounterable?deferred = null;

            foreach (var t in GetValidEncounterTradesVC(pkm, chain, game))
            {
                // Gen2 trades are strictly matched (OT/Nick), while Gen1 trades allow for deferral (shrug).
                if (t is EncounterTrade1 t1 && t1.GetMatchRating(pkm) != Match)
                {
                    deferred ??= t;
                    continue;
                }
                yield return(t);
            }
            foreach (var s in GetValidStaticEncounter(pkm, chain, game))
            {
                yield return(s);
            }
            foreach (var e in GetValidWildEncounters12(pkm, chain, game))
            {
                yield return(e);
            }
            if (game != GameVersion.RBY)
            {
                foreach (var e in GenerateEggs(pkm, chain))
                {
                    yield return(e);
                }
            }

            foreach (var s in GenerateGBEvents(pkm, chain, game))
            {
                yield return(s);
            }

            if (deferred != null)
            {
                yield return(deferred);
            }
        }
Example #7
0
        public static IEnumerable <IEncounterable> GetEncounters(PKM pkm)
        {
            int ctr = 0;

            var chain = EncounterOrigin.GetOriginChain(pkm);

            IEncounterable?deferred = null;
            IEncounterable?partial  = null;

            if (pkm.WasEvent || pkm.WasEventEgg || pkm.WasLink)
            {
                foreach (var z in GetValidGifts(pkm, chain))
                {
                    var match = z.GetMatchRating(pkm);
                    switch (match)
                    {
                    case Match: yield return(z); break;

                    case Deferred: deferred ??= z; break;

                    case PartialMatch: partial ??= z; break;
                    }
                    ++ctr;
                }

                if (ctr != 0)
                {
                    if (deferred != null)
                    {
                        yield return(deferred);
                    }

                    if (partial != null)
                    {
                        yield return(partial);
                    }

                    yield break;
                }
            }

            if (pkm.WasBredEgg)
            {
                foreach (var z in GenerateEggs(pkm, 6))
                {
                    yield return(z); ++ctr;
                }
                if (ctr == 0)
                {
                    yield break;
                }
            }

            foreach (var z in GetValidStaticEncounter(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                switch (match)
                {
                case Match: yield return(z); ++ctr; break;

                case Deferred: deferred ??= z; break;

                case PartialMatch: partial ??= z; break;
                }
            }
            if (ctr != 0)
            {
                yield break;
            }

            foreach (var z in GetValidWildEncounters(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                switch (match)
                {
                case Match: yield return(z); ++ctr; break;

                case Deferred: deferred ??= z; break;

                case PartialMatch: partial ??= z; break;
                }
            }
            if (ctr != 0)
            {
                yield break;
            }

            foreach (var z in GetValidEncounterTrades(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                switch (match)
                {
                case Match: yield return(z); /*++ctr*/ break;

                case Deferred: deferred ??= z; break;

                case PartialMatch: partial ??= z; break;
                }
            }

            if (deferred != null)
            {
                yield return(deferred);
            }

            if (partial != null)
            {
                yield return(partial);
            }
        }
Example #8
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters3(PKM pkm, LegalInfo info)
        {
            var chain = EncounterOrigin.GetOriginChain(pkm);

            // Mystery Gifts
            foreach (var z in GetValidGifts(pkm, chain))
            {
                // Don't bother deferring matches.
                var match = z.GetMatchRating(pkm);
                if (match != PartialMatch)
                {
                    yield return(z);
                }
            }

            // Trades
            foreach (var z in GetValidEncounterTrades(pkm, chain))
            {
                // Don't bother deferring matches.
                var match = z.GetMatchRating(pkm);
                if (match != PartialMatch)
                {
                    yield return(z);
                }
            }

            IEncounterable?deferred = null;
            IEncounterable?partial  = null;

            // Static Encounter
            // Defer everything if Safari Ball
            bool safari = pkm.Ball == 0x05; // never static encounters

            if (!safari)
            {
                foreach (var z in GetValidStaticEncounter(pkm, chain))
                {
                    var match = z.GetMatchRating(pkm);
                    if (match == PartialMatch)
                    {
                        partial ??= z;
                    }
                    else
                    {
                        yield return(z);
                    }
                }
            }

            // Encounter Slots
            var slots = FrameFinder.GetFrames(info.PIDIV, pkm).ToList();

            foreach (var z in GetValidWildEncounters(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                if (match == PartialMatch)
                {
                    partial ??= z;
                    continue;
                }

                var frame = slots.Find(s => s.IsSlotCompatibile((EncounterSlot3)z, pkm));
                if (frame == null)
                {
                    deferred ??= z;
                    continue;
                }
                yield return(z);
            }

            info.FrameMatches = false;
            if (deferred is EncounterSlot3 x)
            {
                yield return(x);
            }

            if (pkm.Version != (int)GameVersion.CXD) // no eggs in C/XD
            {
                foreach (var z in GenerateEggs(pkm, 3))
                {
                    yield return(z);
                }
            }

            if (partial is EncounterSlot3 y)
            {
                var frame = slots.Find(s => s.IsSlotCompatibile(y, pkm));
                info.FrameMatches = frame != null;
                yield return(y);
            }

            // do static encounters if they were deferred to end, spit out any possible encounters for invalid pkm
            if (!safari)
            {
                yield break;
            }

            partial = null;

            foreach (var z in GetValidStaticEncounter(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                if (match == PartialMatch)
                {
                    partial ??= z;
                }
                else
                {
                    yield return(z);
                }
            }

            if (partial is not null)
            {
                yield return(partial);
            }
        }
Example #9
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters12(PKM pkm, GameVersion game)
        {
            // Since encounter matching is super weak due to limited stored data in the structure
            // Calculate all 3 at the same time and pick the best result (by species).
            // Favor special event move gifts as Static Encounters when applicable
            var chain = EncounterOrigin.GetOriginChain12(pkm, game);

            var deferred = new List <IEncounterable>();

            foreach (var t in EncounterTradeGenerator.GetValidEncounterTrades(pkm, chain, game))
            {
                // some OTs are longer than the keyboard entry; don't defer these
                if (pkm.Format >= 7 && pkm.OT_Name.Length <= (pkm.Japanese || pkm.Korean ? 5 : 7))
                {
                    deferred.Add(t);
                    continue;
                }
                if (t is EncounterTrade1 t1 && !t1.IsEncounterTrade1Valid(pkm))
                {
                    deferred.Add(t);
                    continue;
                }
                yield return(t);
            }
            foreach (var s in EncounterStaticGenerator.GetValidStaticEncounter(pkm, chain, game))
            {
                // Valid stadium and non-stadium encounters, return only non-stadium encounters, they are less restrictive
                switch (s.Version)
                {
                case GameVersion.Stadium:
                case GameVersion.Stadium2:
                    deferred.Add(s);
                    continue;

                case GameVersion.EventsGBGen2:
                    if (!s.EggEncounter && !pkm.HasOriginalMetLocation)
                    {
                        continue;
                    }
                    if (pkm.Japanese)
                    {
                        deferred.Add(s);
                    }
                    continue;

                case GameVersion.C when pkm.Format == 2:     // Crystal specific data needs to be present
                    if (!s.EggEncounter && !pkm.HasOriginalMetLocation)
                    {
                        continue;
                    }
                    if (s.Species == (int)Species.Celebi && ParseSettings.AllowGBCartEra)     // no Celebi, the GameVersion.EventsGBGen2 will pass thru
                    {
                        continue;
                    }
                    break;
                }
                yield return(s);
            }
            foreach (var e in EncounterSlotGenerator.GetValidWildEncounters12(pkm, chain, game))
            {
                yield return(e);
            }
            if (game != GameVersion.RBY)
            {
                foreach (var e in EncounterEggGenerator2.GenerateEggs(pkm, chain))
                {
                    yield return(e);
                }
            }

            foreach (var d in deferred)
            {
                yield return(d);
            }
        }
Example #10
0
        public static IEnumerable <IEncounterable> GetEncounters(PKM pkm)
        {
            int ctr = 0;

            var chain = EncounterOrigin.GetOriginChain(pkm);

            if (pkm.FatefulEncounter)
            {
                foreach (var z in GetValidGifts(pkm, chain))
                {
                    yield return(z); ++ctr;
                }
                if (ctr != 0)
                {
                    yield break;
                }
            }

            if (Locations.IsEggLocationBred5(pkm.Egg_Location))
            {
                foreach (var z in GenerateEggs(pkm, 5))
                {
                    yield return(z); ++ctr;
                }
                if (ctr == 0)
                {
                    yield break;
                }
            }

            IEncounterable?deferred = null;
            IEncounterable?partial  = null;

            foreach (var z in GetValidStaticEncounter(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                switch (match)
                {
                case Match: yield return(z); ++ctr; break;

                case Deferred: deferred ??= z; break;

                case PartialMatch: partial ??= z; break;
                }
            }
            if (ctr != 0)
            {
                yield break;
            }

            foreach (var z in GetValidWildEncounters(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                switch (match)
                {
                case Match: yield return(z); ++ctr; break;

                case Deferred: deferred ??= z; break;

                case PartialMatch: partial ??= z; break;
                }
            }
            if (ctr != 0)
            {
                yield break;
            }

            foreach (var z in GetValidEncounterTrades(pkm, chain))
            {
                var match = z.GetMatchRating(pkm);
                switch (match)
                {
                case Match: yield return(z); /*++ctr*/ break;

                case Deferred: deferred ??= z; break;

                case PartialMatch: partial ??= z; break;
                }
            }

            if (deferred != null)
            {
                yield return(deferred);
            }

            if (partial != null)
            {
                yield return(partial);
            }
        }
Example #11
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters3(PKM pkm, LegalInfo info)
        {
            var chain = EncounterOrigin.GetOriginChain(pkm);

            foreach (var z in GetValidGifts(pkm, chain))
            {
                yield return(z);
            }
            foreach (var z in GetValidEncounterTrades(pkm, chain))
            {
                yield return(z);
            }

            var  deferIncompat = new Queue <IEncounterable>();
            bool safari        = pkm.Ball == 0x05; // never static encounters

            if (!safari)
            {
                foreach (var z in GetValidStaticEncounter(pkm, chain))
                {
                    if (z.Gift && pkm.Ball != 4)
                    {
                        deferIncompat.Enqueue(z);
                    }
                    else
                    {
                        yield return(z);
                    }
                }
            }

            int species      = pkm.Species;
            var deferNoFrame = new Queue <IEncounterable>();
            var deferFrame   = new Queue <IEncounterable>();
            var slots        = FrameFinder.GetFrames(info.PIDIV, pkm).ToList();

            foreach (var z in GetValidWildEncounters34(pkm, chain))
            {
                bool defer = z.IsDeferred3(species, pkm, safari);
                var  frame = slots.Find(s => s.IsSlotCompatibile((EncounterSlot3)z, pkm));
                if (defer)
                {
                    if (frame != null)
                    {
                        deferFrame.Enqueue(z);
                    }
                    else
                    {
                        deferIncompat.Enqueue(z);
                    }
                    continue;
                }
                if (frame == null)
                {
                    deferNoFrame.Enqueue(z);
                    continue;
                }
                yield return(z);
            }
            info.FrameMatches = false;
            foreach (var z in deferNoFrame)
            {
                yield return(z);
            }
            info.FrameMatches = true;
            foreach (var z in deferFrame)
            {
                yield return(z);
            }
            info.FrameMatches = false;

            if (pkm.Version != 15) // no eggs in C/XD
            {
                foreach (var z in GenerateEggs(pkm))
                {
                    yield return(z);
                }
            }

            foreach (var z in deferIncompat)
            {
                yield return(z);
            }
            // do static encounters if they were deferred to end, spit out any possible encounters for invalid pkm
            if (!safari)
            {
                yield break;
            }
            foreach (var z in GetValidStaticEncounter(pkm, chain))
            {
                yield return(z);
            }
        }
Example #12
0
        private static IEnumerable <IEncounterable> GenerateRawEncounters4(PKM pkm, LegalInfo info)
        {
            bool wasEvent = pkm.WasEvent || pkm.WasEventEgg; // egg events?
            var  chain    = EncounterOrigin.GetOriginChain(pkm);

            if (wasEvent)
            {
                int ctr = 0;
                foreach (var z in GetValidGifts(pkm, chain))
                {
                    yield return(z); ++ctr;
                }
                if (ctr != 0)
                {
                    yield break;
                }
            }
            if (pkm.WasBredEgg)
            {
                foreach (var z in GenerateEggs(pkm))
                {
                    yield return(z);
                }
            }
            foreach (var z in GetValidEncounterTrades(pkm, chain))
            {
                yield return(z);
            }

            var  deferIncompat = new Queue <IEncounterable>();
            bool sport         = pkm.Ball == (int)Ball.Sport;  // never static encounters (conflict with non bcc / bcc)
            bool safari        = pkm.Ball == (int)Ball.Safari; // never static encounters
            bool safariSport   = safari || sport;

            if (!safariSport)
            {
                foreach (var z in GetValidStaticEncounter(pkm, chain))
                {
                    if (z.Gift && pkm.Ball != 4)
                    {
                        deferIncompat.Enqueue(z);
                    }
                    else
                    {
                        yield return(z);
                    }
                }
            }

            int species      = pkm.Species;
            var deferNoFrame = new Queue <IEncounterable>();
            var deferFrame   = new Queue <IEncounterable>();
            var slots        = FrameFinder.GetFrames(info.PIDIV, pkm).ToList();

            foreach (var z in GetValidWildEncounters34(pkm, chain))
            {
                bool defer = z.IsDeferred4(species, pkm, safari, sport);
                var  frame = slots.Find(s => s.IsSlotCompatibile((EncounterSlot4)z, pkm));
                if (defer)
                {
                    if (frame != null)
                    {
                        deferFrame.Enqueue(z);
                    }
                    else
                    {
                        deferIncompat.Enqueue(z);
                    }
                    continue;
                }
                if (frame == null)
                {
                    deferNoFrame.Enqueue(z);
                    continue;
                }
                yield return(z);
            }
            info.FrameMatches = false;
            foreach (var z in deferNoFrame)
            {
                yield return(z);
            }
            info.FrameMatches = true;
            foreach (var z in deferFrame)
            {
                yield return(z);
            }
            info.FrameMatches = false;

            foreach (var z in deferIncompat)
            {
                yield return(z);
            }

            // do static encounters if they were deferred to end, spit out any possible encounters for invalid pkm
            if (!safariSport)
            {
                yield break;
            }
            foreach (var z in GetValidStaticEncounter(pkm, chain))
            {
                yield return(z);
            }
        }