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
This commit is contained in:
Kurt
2026-08-03 17:06:12 -05:00
parent 31b4e0a6d8
commit 76307aaa4b

View File

@@ -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)
}
/// <summary>
/// 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".
/// </summary>
private static bool IsAnyWithoutFootprint8b(EvoCriteria[] evos)
private static bool IsVoiceless(ReadOnlySpan<EvoCriteria> 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<bool> 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<byte> 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,
];
/// <summary>