using static PKHeX.Core.RibbonIndex; namespace PKHeX.Core; /// /// Parsing logic for . /// public static class RibbonVerifierCommon8 { public static void Parse(this IRibbonSetCommon8 r, RibbonVerifierArguments args, ref RibbonResultList list) { var evos = args.History; if (r.RibbonTowerMaster && !RibbonRules.IsRibbonValidTowerMaster(evos)) list.Add(TowerMaster); var pk = args.Entity; if (!evos.HasVisitedSWSH) { if (r.RibbonChampionGalar) list.Add(ChampionGalar); if (r.RibbonMasterRank) list.Add(MasterRank); } else { // If it can exist in SW/SH, it can have the ribbon. // If it doesn't have the ribbon and has the memory of having it, then flag it. var enc = args.Encounter; if (!r.RibbonChampionGalar) { const int memChampion = 27; bool hasChampMemory = (enc.Generation == 8 && pk is IMemoryOT { OT_Memory: memChampion }) || (pk.Format == 8 && pk is IMemoryHT { HT_Memory: memChampion }); if (hasChampMemory) list.Add(ChampionGalar); } // Legends cannot compete in Ranked, thus cannot reach Master Rank and obtain the ribbon. // Past gen Pokemon can get the ribbon only if they've been reset. if (r.RibbonMasterRank && !RibbonRules.IsRibbonValidMasterRankSWSH(pk, enc, evos)) list.Add(MasterRank); if (!r.RibbonTowerMaster) { // If the Tower Master ribbon is not present but a memory hint implies it should... // This memory can also be applied in Gen6/7 via defeating the Chatelaines, where legends are disallowed. const int strongest = 30; if (pk is IMemoryOT { OT_Memory: strongest } or IMemoryHT { HT_Memory: strongest }) { if (enc.Generation == 8 || !RibbonRules.IsAllowedBattleFrontier(pk.Species) || pk is IRibbonSetCommon6 { RibbonBattlerSkillful: false }) list.Add(TowerMaster, true); } } } if (r.RibbonTwinklingStar && !RibbonRules.IsRibbonValidTwinklingStar(evos, pk)) list.Add(TwinklingStar); // received when capturing photos with Pokémon in the Photography Studio if (r.RibbonPioneer && !evos.HasVisitedPLA) list.Add(Pioneer); } public static void ParseEgg(this IRibbonSetCommon8 r, ref RibbonResultList list) { if (r.RibbonChampionGalar) list.Add(ChampionGalar); if (r.RibbonTowerMaster) list.Add(TowerMaster); if (r.RibbonMasterRank) list.Add(MasterRank); if (r.RibbonTwinklingStar) list.Add(TwinklingStar); if (r.RibbonPioneer) list.Add(Pioneer); } }