From 76307aaa4ba707c5cf82049685cee080a5bfb0fb Mon Sep 17 00:00:00 2001 From: Kurt Date: Mon, 3 Aug 2026 17:06:12 -0500 Subject: [PATCH] BDSP: Condense voiceless array saves 0.4KB lol no functional change update terminology; might not be explicitly "footprint" type, more "footprint man's evaluated type" https://bulbapedia.bulbagarden.net/wiki/Footprint#Footprint_Ribbon --- .../Legality/Verifiers/Ribbons/RibbonRules.cs | 87 ++++++------------- 1 file changed, 25 insertions(+), 62 deletions(-) diff --git a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs index aaf8eeaa6..907e02060 100644 --- a/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs +++ b/PKHeX.Core/Legality/Verifiers/Ribbons/RibbonRules.cs @@ -76,8 +76,8 @@ public static bool IsRibbonValidFootprint(PKM pk, EvolutionHistory evos) // Gen8-BDSP: Variable by species Footprint if (evos.HasVisitedBDSP) { - if (IsAnyWithoutFootprint8b(evos.Gen8b)) - return true; // no footprint + if (IsVoiceless(evos.Gen8b)) + return true; // no voice, any level. if (IsWellTraveled30(pk)) return true; // traveled well } @@ -230,76 +230,39 @@ public static bool IsRibbonValidTwinklingStar(EvolutionHistory evos, PKM pk) } /// - /// Checks if any of the species it existed as in BD/SP lacked footprints. + /// Checks if any of the species it existed as in BD/SP was "voiceless". /// - private static bool IsAnyWithoutFootprint8b(EvoCriteria[] evos) + private static bool IsVoiceless(ReadOnlySpan evos) { - var arr = HasFootprintBDSP; foreach (var evo in evos) { - var species = evo.Species; - if (species >= arr.Length) - continue; - if (!arr[species]) + if (IsVoiceless(evo.Species)) return true; } return false; } - // Derived from ROM data: true for all Footprint types besides 5 (5 = no feet). - // If true, requires gaining 30 levels to obtain ribbon. If false, can obtain ribbon at any level. - private static ReadOnlySpan HasFootprintBDSP => + private static bool IsVoiceless(ushort species) + { + var arr = VoicelessBDSP; + int index = species >> 3; + if (index >= arr.Length) + return false; + int bit = species & 7; + return (arr[index] & (1 << bit)) != 0; + } + + // If true, can obtain the Footprint ribbon at any level ("voiceless"). If false, requires gaining 30 levels to obtain ribbon. + // Derived from ROM data: false for all Footprint types besides `5`. + // Metapod, Kakuna, Paras, Parasect, Venomoth, Magnemite, Magneton, Staryu, Starmie, Porygon, Kabuto, Xatu, Unown, Pineco, Forretress, + // Remoraid, Porygon2, Pupitar, Silcoon, Cascoon, Seedot, Nincada, Nosepass, Lunatone, Solrock, Baltoy, Claydol, Lileep, Cradily, + // Anorith, Shelgon, Beldum, Metang, Regirock, Regice, Registeel, Bronzor, Bronzong, Magnezone, Porygon-Z, Probopass, Regigigas + private static ReadOnlySpan VoicelessBDSP => [ - true, true, true, true, true, true, true, true, true, true, - true, false, true, true, false, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, false, false, true, false, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, false, false, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - false, false, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, false, true, true, - false, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, false, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, false, true, true, false, false, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, false, true, true, true, true, true, true, - true, true, true, false, true, true, true, true, true, true, - true, true, true, true, true, true, true, false, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, false, true, false, true, - true, true, true, false, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - false, true, true, true, true, true, true, true, true, false, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, false, false, true, - true, true, true, false, false, false, false, false, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, false, true, false, false, true, false, false, false, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, false, false, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, false, true, true, true, true, true, true, true, - true, true, true, true, false, true, false, true, true, true, - true, true, true, true, true, true, false, true, true, true, - true, true, true, true, + 0x00, 0x48, 0x00, 0x00, 0x00, 0xC0, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x32, 0x00, 0x80, 0x00, 0x02, 0x80, 0x00, + 0x00, 0x14, 0x02, 0x00, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00, 0x86, 0x0F, 0x00, 0x00, 0xD0, 0x0E, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x40, 0x00, 0x14, 0x40, ]; ///