Esempio n. 1
0
        private static IEnumerable <RibbonResult> GetInvalidRibbons6Any(PKM pkm, IRibbonSetCommon6 s6, int gen)
        {
            foreach (var p in GetInvalidRibbons6Memory(pkm, s6, gen))
            {
                yield return(p);
            }

            bool untraded = pkm.IsUntraded;
            var  iter     = untraded ? GetInvalidRibbons6Untraded(pkm, s6) : GetInvalidRibbons6Traded(pkm, s6);

            foreach (var p in iter)
            {
                yield return(p);
            }

            bool allContest = s6.RibbonBitsContest().All(z => z);

            if (allContest ^ s6.RibbonContestStar && !(untraded && pkm.XY)) // if not already checked
            {
                yield return(new RibbonResult(nameof(s6.RibbonContestStar), s6.RibbonContestStar));
            }

            const int mem_Chatelaine = 30;
            bool      hasChampMemory = pkm.HT_Memory == mem_Chatelaine || pkm.OT_Memory == mem_Chatelaine;

            if (!hasChampMemory || s6.RibbonBattlerSkillful || s6.RibbonBattlerExpert)
            {
                yield break;
            }

            var result = new RibbonResult(nameof(s6.RibbonBattlerSkillful), false);

            result.Combine(new RibbonResult(nameof(s6.RibbonBattlerExpert)));
            yield return(result);
        }
Esempio n. 2
0
        private static IEnumerable <RibbonResult> GetInvalidRibbons6Traded(PKM pkm, IRibbonSetCommon6 s6)
        {
            if (s6.RibbonTraining)
            {
                const int req   = 12; // only first 12
                int       count = pkm.SuperTrainingMedalCount(req);
                if (count < req)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonTraining)));
                }
            }

            const int mem_Champion   = 27;
            bool      hasChampMemory = pkm.HT_Memory == mem_Champion || pkm.OT_Memory == mem_Champion;

            if (!hasChampMemory || s6.RibbonChampionKalos || s6.RibbonChampionG6Hoenn)
            {
                yield break;
            }

            var result = new RibbonResult(nameof(s6.RibbonChampionKalos), false);

            result.Combine(new RibbonResult(nameof(s6.RibbonChampionG6Hoenn)));
            yield return(result);
        }
Esempio n. 3
0
        private static IEnumerable <RibbonResult> GetInvalidRibbons6Memory(PKM pkm, IRibbonSetCommon6 s6, int gen)
        {
            int contest = 0;
            int battle  = 0;

            switch (gen)
            {
            case 3:
                contest = IsAllowedInContest4(pkm.Species) ? 40 : 20;
                battle  = IsAllowedBattleFrontier(pkm.Species) ? 8 : 0;
                break;

            case 4:
                contest = IsAllowedInContest4(pkm.Species) ? 20 : 0;
                battle  = IsAllowedBattleFrontier(pkm.Species) ? 6 : 0;
                break;
            }
            if (s6.RibbonCountMemoryContest > contest)
            {
                yield return(new RibbonResult(nameof(s6.RibbonCountMemoryContest)));
            }
            if (s6.RibbonCountMemoryBattle > battle)
            {
                yield return(new RibbonResult(nameof(s6.RibbonCountMemoryBattle)));
            }
        }
Esempio n. 4
0
        private static IEnumerable <RibbonResult> GetInvalidRibbons6Any(PKM pkm, IRibbonSetCommon6 s6, int gen)
        {
            foreach (var p in GetInvalidRibbons6Memory(pkm, s6, gen))
            {
                yield return(p);
            }

            bool untraded = pkm.IsUntraded;
            var  iter     = untraded ? GetInvalidRibbons6Untraded(pkm, s6) : GetInvalidRibbons6Traded(pkm, s6);

            foreach (var p in iter)
            {
                yield return(p);
            }

            var  contest    = s6.RibbonBitsContest();
            bool allContest = contest.All(z => z);

            if (allContest ^ s6.RibbonContestStar && !(untraded && pkm.XY)) // if not already checked
            {
                yield return(new RibbonResult(nameof(s6.RibbonContestStar), s6.RibbonContestStar));
            }

            // Each contest victory requires a contest participation; each participation gives 20 OT affection (not current trainer).
            var affect     = pkm.OT_Affection;
            var contMemory = s6.RibbonNamesContest();
            int contCount  = 0;
            var present    = contMemory.Where((_, i) => contest[i] && affect < 20 * ++contCount);

            foreach (var rib in present)
            {
                yield return(new RibbonResult(rib));
            }

            const int mem_Chatelaine = 30;
            bool      hasChampMemory = pkm.HT_Memory == mem_Chatelaine || pkm.OT_Memory == mem_Chatelaine;

            if (!IsAllowedBattleFrontier(pkm.Species))
            {
                if (hasChampMemory || s6.RibbonBattlerSkillful) // having memory and not ribbon is too rare, just flag here.
                {
                    yield return(new RibbonResult(nameof(s6.RibbonBattlerSkillful)));
                }
                if (s6.RibbonBattlerExpert)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonBattlerExpert)));
                }
                yield break;
            }
            if (!hasChampMemory || s6.RibbonBattlerSkillful || s6.RibbonBattlerExpert)
            {
                yield break;
            }

            var result = new RibbonResult(nameof(s6.RibbonBattlerSkillful), false);

            result.Combine(new RibbonResult(nameof(s6.RibbonBattlerExpert)));
            yield return(result);
        }
Esempio n. 5
0
 internal static bool[] RibbonBitsContest(this IRibbonSetCommon6 set)
 {
     return(new[]
     {
         set.RibbonMasterCoolness,
         set.RibbonMasterBeauty,
         set.RibbonMasterCuteness,
         set.RibbonMasterCleverness,
         set.RibbonMasterToughness,
     });
 }
Esempio n. 6
0
 internal static void CopyRibbonSetCommon6(this IRibbonSetCommon6 set, IRibbonSetCommon6 dest)
 {
     dest.RibbonChampionKalos      = set.RibbonChampionKalos;
     dest.RibbonChampionG6Hoenn    = set.RibbonChampionG6Hoenn;
     dest.RibbonBestFriends        = set.RibbonBestFriends;
     dest.RibbonTraining           = set.RibbonTraining;
     dest.RibbonBattlerSkillful    = set.RibbonBattlerSkillful;
     dest.RibbonBattlerExpert      = set.RibbonBattlerExpert;
     dest.RibbonContestStar        = set.RibbonContestStar;
     dest.RibbonMasterCoolness     = set.RibbonMasterCoolness;
     dest.RibbonMasterBeauty       = set.RibbonMasterBeauty;
     dest.RibbonMasterCuteness     = set.RibbonMasterCuteness;
     dest.RibbonMasterCleverness   = set.RibbonMasterCleverness;
     dest.RibbonMasterToughness    = set.RibbonMasterToughness;
     dest.RibbonCountMemoryContest = set.RibbonCountMemoryContest;
     dest.RibbonCountMemoryBattle  = set.RibbonCountMemoryBattle;
 }
Esempio n. 7
0
        private static void InvertDeadlockContest(IRibbonSetCommon6 c6, LegalityAnalysis la, bool desiredState)
        {
            // RibbonContestStar depends on having all contest ribbons, and having RibbonContestStar requires all.
            // Since the above logic sets individual ribbons, we must try setting this deadlock pair manually.
            if (c6.RibbonMasterToughness == desiredState || c6.RibbonContestStar == desiredState)
            {
                return;
            }

            la.ResetParse();
            c6.RibbonMasterToughness = c6.RibbonContestStar = desiredState;
            bool result = UpdateIsValid(la);

            if (!result)
            {
                c6.RibbonMasterToughness = c6.RibbonContestStar = !desiredState;
            }
        }
Esempio n. 8
0
        internal static bool[] RibbonBits(this IRibbonSetCommon6 set)
        {
            return(new[]
            {
                set.RibbonChampionKalos,
                set.RibbonChampionG6Hoenn,
                //set.RibbonBestFriends,
                set.RibbonTraining,
                set.RibbonBattlerSkillful,
                set.RibbonBattlerExpert,

                set.RibbonContestStar,
                set.RibbonMasterCoolness,
                set.RibbonMasterBeauty,
                set.RibbonMasterCuteness,
                set.RibbonMasterCleverness,
                set.RibbonMasterToughness,
            });
        }
Esempio n. 9
0
        private static IEnumerable <RibbonResult> GetInvalidRibbons6Untraded(PKM pkm, IRibbonSetCommon6 s6)
        {
            if (pkm.XY)
            {
                if (s6.RibbonChampionG6Hoenn)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonChampionG6Hoenn)));
                }

                if (s6.RibbonContestStar)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonContestStar)));
                }
                if (s6.RibbonMasterCoolness)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonMasterCoolness)));
                }
                if (s6.RibbonMasterBeauty)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonMasterBeauty)));
                }
                if (s6.RibbonMasterCuteness)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonMasterCuteness)));
                }
                if (s6.RibbonMasterCleverness)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonMasterCleverness)));
                }
                if (s6.RibbonMasterToughness)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonMasterToughness)));
                }
            }
            else if (pkm.AO)
            {
                if (s6.RibbonChampionKalos)
                {
                    yield return(new RibbonResult(nameof(s6.RibbonChampionKalos)));
                }
            }
        }
Esempio n. 10
0
 internal static string[] RibbonNamesContest(this IRibbonSetCommon6 _) => RibbonSetNamesCommon6Contest;
Esempio n. 11
0
 internal static string[] RibbonNamesBool(this IRibbonSetCommon6 _) => RibbonSetNamesCommon6Bool;