From 163fadbd6271dfbb7a8ec243e8f211bf5debd20c Mon Sep 17 00:00:00 2001 From: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Date: Sun, 25 Aug 2024 17:25:40 +0200 Subject: [PATCH] [Bug] Prevent being able to start with a hidden ability that's not unlocked for some Pokemon (#3663) * prevent being able to start with a hidden ability that's not unlocked for some Pokemon * fix starter ui for pokemon with a single ability and only ability 2 unlocked --- src/ui/starter-select-ui-handler.ts | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 250f097c2fc..99191bbcd15 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1795,15 +1795,17 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (this.canCycleAbility) { const abilityCount = this.lastSpecies.getAbilityCount(); const abilityAttr = this.scene.gameData.starterData[this.lastSpecies.speciesId].abilityAttr; + const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; let newAbilityIndex = this.abilityCursor; do { newAbilityIndex = (newAbilityIndex + 1) % abilityCount; - if (!newAbilityIndex) { - if (abilityAttr & AbilityAttr.ABILITY_1) { + if (newAbilityIndex === 0) { + if (hasAbility1) { break; } } else if (newAbilityIndex === 1) { - if (this.lastSpecies.ability1 === this.lastSpecies.ability2) { + // If ability 1 and 2 are the same and ability 1 is unlocked, skip over ability 2 + if (this.lastSpecies.ability1 === this.lastSpecies.ability2 && hasAbility1) { newAbilityIndex = (newAbilityIndex + 1) % abilityCount; } break; @@ -3045,7 +3047,20 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.canCycleShiny = isVariantCaught || isVariant2Caught || isVariant3Caught; this.canCycleGender = isMaleCaught && isFemaleCaught; - this.canCycleAbility = [ abilityAttr & AbilityAttr.ABILITY_1, (abilityAttr & AbilityAttr.ABILITY_2) && species.ability2, abilityAttr & AbilityAttr.ABILITY_HIDDEN ].filter(a => a).length > 1; + const hasAbility1 = abilityAttr & AbilityAttr.ABILITY_1; + let hasAbility2 = abilityAttr & AbilityAttr.ABILITY_2; + const hasHiddenAbility = abilityAttr & AbilityAttr.ABILITY_HIDDEN; + + /* + * Check for Pokemon with a single ability (at some point it was possible to catch them with their ability 2 attribute) + * This prevents cycling between ability 1 and 2 if they are both unlocked and the same + * but we still need to account for the possibility ability 1 was never unlocked and fallback on ability 2 in this case + */ + if (hasAbility1 && hasAbility2 && species.ability1 === species.ability2) { + hasAbility2 = 0; + } + + this.canCycleAbility = [ hasAbility1, hasAbility2, hasHiddenAbility ].filter(a => a).length > 1; this.canCycleForm = species.forms.filter(f => f.isStarterSelectable || !pokemonFormChanges[species.speciesId]?.find(fc => fc.formKey)) .map((_, f) => dexEntry.caughtAttr & this.scene.gameData.getFormAttr(f)).filter(f => f).length > 1; this.canCycleNature = this.scene.gameData.getNaturesForAttr(dexEntry.natureAttr).length > 1;