コード例 #1
0
ファイル: PIDIVTests.cs プロジェクト: trainboy2019/PKHeX
        public void PIDIVEncounterSlotTest()
        {
            // Modest Method 1
            var pk = new PK3 {
                PID = 0x6937DA48, IVs = new[] { 31, 31, 31, 31, 31, 31 }
            };
            var pidiv = MethodFinder.Analyze(pk);

            Assert.AreEqual(PIDType.Method_1, pidiv?.Type, "Unable to match PID to Method 1 spread");

            // Test for Method J
            {
                // Pearl
                pk.Version = (int)GameVersion.P;
                var       results       = FrameFinder.GetFrames(pidiv, pk);
                const int failSyncCount = 1;
                const int noSyncCount   = 2;
                const int SyncCount     = 37;
                var       r2            = results.ToArray();
                var       failSync      = r2.Where(z => z.Lead == LeadRequired.SynchronizeFail);
                var       noSync        = r2.Where(z => z.Lead == LeadRequired.None);
                var       sync          = r2.Where(z => z.Lead == LeadRequired.Synchronize);

                Assert.AreEqual(failSync.Count(), failSyncCount, "Failed Sync count mismatch.");
                Assert.AreEqual(sync.Count(), SyncCount, "Sync count mismatch.");
                Assert.AreEqual(noSync.Count(), noSyncCount, "Non-Sync count mismatch.");

                var type  = SlotType.Grass;
                var slots = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 9 };
                Assert.IsTrue(slots.All(s => r2.Any(z => z.GetSlot(type) == s)), "Required slots not present.");
                var slotsForType = r2.Where(z => !z.LevelSlotModified).Select(z => z.GetSlot(type)).Distinct().OrderBy(z => z);
                Assert.IsTrue(slotsForType.SequenceEqual(slots), "Unexpected slots present.");
            }
            // Test for Method H and K
            {
                // Sapphire
                // pk.Version = (int)GameVersion.S;
                // var results = FrameFinder.GetFrames(pidiv, pk);
            }
        }
コード例 #2
0
        public void PIDIVEncounterSlotTest()
        {
            // Modest Method 1
            var pk = new PK3 {
                PID = 0x6937DA48, IVs = new[] { 31, 31, 31, 31, 31, 31 }
            };
            var pidiv = MethodFinder.Analyze(pk);

            Assert.Equal(PIDType.Method_1, pidiv?.Type);

            // Test for Method J
            {
                // Pearl
                pk.Version = (int)GameVersion.P;
                var results = FrameFinder.GetFrames(pidiv, pk).ToArray();

                var failSync = results.Where(z => z.Lead == LeadRequired.SynchronizeFail);
                var noSync   = results.Where(z => z.Lead == LeadRequired.None);
                var sync     = results.Where(z => z.Lead == LeadRequired.Synchronize);

                failSync.Should().HaveCount(1);
                sync.Should().HaveCount(37);
                noSync.Should().HaveCount(2);

                const SlotType type  = SlotType.Grass;
                var            slots = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 9 };
                Assert.True(slots.All(s => results.Any(z => z.GetSlot(type) == s)), "Required slots not present.");
                var slotsForType = results.Where(z => !z.LevelSlotModified).Select(z => z.GetSlot(type)).Distinct().OrderBy(z => z);
                Assert.True(slotsForType.SequenceEqual(slots), "Unexpected slots present.");
            }
            // Test for Method H and K
            {
                // Sapphire
                // pk.Version = (int)GameVersion.S;
                // var results = FrameFinder.GetFrames(pidiv, pk);
            }
        }
コード例 #3
0
        private static bool CheckIsOverlap(ScanSide side, LogUtil logUtil, Bitmap bitmap)
        {
            logUtil.Log("Starting detect overlap");
            if (side == ScanSide.Right)
            {
                logUtil.Log("Starting right");
                var chartInfo = FrameFinder.CheckIfInChat(bitmap);
                logUtil.Log("Detect chat mode end");
                if (chartInfo == FrameFinder.ChatInfo.Partial ||
                    chartInfo == FrameFinder.ChatInfo.Full)
                {
                    logUtil.Log("Overlap detected");
                    return(true);
                }

                var hasFrame = FrameFinder.CheckIfInRightFrame(bitmap);
                logUtil.Log("Detect right frame end");
                if (hasFrame)
                {
                    logUtil.Log("Overlap detected");
                    return(true);
                }
            }
            else
            {
                logUtil.Log("Starting left");
                var hasFrame = FrameFinder.CheckIfInLeftFrame(bitmap);
                logUtil.Log("Detect left frame end");
                if (hasFrame)
                {
                    logUtil.Log("Overlap detected");
                    return(true);
                }
            }
            return(false);
        }
コード例 #4
0
    private static IEnumerable <IEncounterable> GenerateRawEncounters3(PKM pk, LegalInfo info)
    {
        var chain = EncounterOrigin.GetOriginChain(pk);
        var game  = (GameVersion)pk.Version;

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

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

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

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

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

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

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

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

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

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

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

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

        partial = null;

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

        if (partial is not null)
        {
            yield return(partial);
        }
    }