diff --git a/src/data/balance/passives.ts b/src/data/balance/passives.ts index 60b50c7909c..dd2d46d3176 100644 --- a/src/data/balance/passives.ts +++ b/src/data/balance/passives.ts @@ -1,7 +1,15 @@ import { Abilities } from "#app/enums/abilities"; import { Species } from "#app/enums/species"; -export const starterPassiveAbilities = { +export interface PassiveAbilities { + [key: integer]: Abilities +} + +export interface StarterPassiveAbilities { + [key: integer]: PassiveAbilities +} + +export const starterPassiveAbilities: StarterPassiveAbilities = { [Species.BULBASAUR]: { 0: Abilities.GRASSY_SURGE }, [Species.CHARMANDER]: { 0: Abilities.BEAST_BOOST }, [Species.SQUIRTLE]: { 0: Abilities.STURDY }, diff --git a/src/data/balance/tms.ts b/src/data/balance/tms.ts index 12e402af4ed..709410daf2b 100644 --- a/src/data/balance/tms.ts +++ b/src/data/balance/tms.ts @@ -68434,7 +68434,7 @@ export const tmSpecies: TmSpecies = { }; interface SpeciesTmMoves { - [key: integer]: Moves[] + [key: integer]: (Moves | [string | Species, Moves])[]; } function flipTmSpecies(tmSpecies: TmSpecies): SpeciesTmMoves { @@ -68445,11 +68445,27 @@ function flipTmSpecies(tmSpecies: TmSpecies): SpeciesTmMoves { const speciesList = tmSpecies[move]; for (const species of speciesList) { - const speciesKey = Number(species); - if (!flipped[speciesKey]) { - flipped[speciesKey] = []; + + if (Array.isArray(species)) { + // Extract base species and all associated forms + const [ baseSpecies, ...forms ] = species; + const speciesKey = Number(baseSpecies); + + if (!flipped[speciesKey]) { + flipped[speciesKey] = []; + } + + for (const form of forms) { + flipped[speciesKey].push([ form, moveKey ]); + } + + } else { + const speciesKey = Number(species); + if (!flipped[speciesKey]) { + flipped[speciesKey] = []; + } + flipped[speciesKey].push(moveKey); } - flipped[speciesKey].push(moveKey); } } return flipped; @@ -68457,7 +68473,6 @@ function flipTmSpecies(tmSpecies: TmSpecies): SpeciesTmMoves { export const speciesTmMoves: SpeciesTmMoves = flipTmSpecies(tmSpecies); - interface TmPoolTiers { [key: integer]: ModifierTier } diff --git a/src/ui/pokedex-page-ui-handler.ts b/src/ui/pokedex-page-ui-handler.ts index 0d9c03cf742..88fd1a2e4d4 100644 --- a/src/ui/pokedex-page-ui-handler.ts +++ b/src/ui/pokedex-page-ui-handler.ts @@ -632,9 +632,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler { this.eggMoves = speciesEggMoves[this.getStarterSpeciesId(species.speciesId)] ?? []; this.hasEggMoves = Array.from({ length: 4 }, (_, em) => (globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)].eggMoves & (1 << em)) !== 0); - this.tmMoves = (speciesTmMoves[species.speciesId] ?? []).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1); + const formKey = this.species?.forms.length > 0 ? this.species.forms[this.formIndex].formKey : ""; + this.tmMoves = speciesTmMoves[species.speciesId]?.filter(m => Array.isArray(m) ? (m[0] === formKey ? true : false ) : true) + .map(m => Array.isArray(m) ? m[1] : m).sort((a, b) => allMoves[a].name > allMoves[b].name ? 1 : -1) ?? []; - this.passive = starterPassiveAbilities[this.getStarterSpeciesId(species.speciesId)]; + const passives = starterPassiveAbilities[this.getStarterSpeciesId(species.speciesId)]; + this.passive = (this.formIndex in passives) ? passives[formIndex] : passives[0]; const starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)]; const abilityAttr = starterData.abilityAttr; @@ -1640,7 +1643,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler { if (!(passiveAttr & PassiveAttr.UNLOCKED)) { const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)]); options.push({ - label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[starterPassiveAbilities[this.getStarterSpeciesId(this.species.speciesId)]].name})`, + label: `x${passiveCost} ${i18next.t("pokedexUiHandler:unlockPassive")} (${allAbilities[this.passive].name})`, handler: () => { if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index c2e3731cf0c..874e86cc618 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -34,6 +34,7 @@ import { addWindow } from "./ui-theme"; import type { OptionSelectConfig } from "./abstact-option-select-ui-handler"; import { FilterText, FilterTextRow } from "./filter-text"; import { allAbilities } from "#app/data/ability"; +import type { PassiveAbilities } from "#app/data/balance/passives"; import { starterPassiveAbilities } from "#app/data/balance/passives"; import { allMoves } from "#app/data/move"; import { speciesTmMoves } from "#app/data/balance/tms"; @@ -1192,7 +1193,7 @@ export default class PokedexUiHandler extends MessageUiHandler { const levelMoves = pokemonSpeciesLevelMoves[container.species.speciesId].map(m => allMoves[m[1]].name); // This always gets egg moves from the starter const eggMoves = speciesEggMoves[this.getStarterSpeciesId(container.species.speciesId)]?.map(m => allMoves[m].name) ?? []; - const tmMoves = speciesTmMoves[container.species.speciesId]?.map(m => allMoves[m].name) ?? []; + const tmMoves = speciesTmMoves[this.getStarterSpeciesId(container.species.speciesId)]?.map(m => allMoves[Array.isArray(m) ? m[1] : m].name) ?? []; const selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1); const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); @@ -1225,16 +1226,17 @@ export default class PokedexUiHandler extends MessageUiHandler { // Ability filter const abilities = [ container.species.ability1, container.species.ability2, container.species.abilityHidden ].map(a => allAbilities[a].name); - const passive = starterPassiveAbilities[this.getStarterSpeciesId(container.species.speciesId)] ?? 0; + console.log(container.species.name, this.getStarterSpeciesId(container.species.speciesId)); + const passives = starterPassiveAbilities[this.getStarterSpeciesId(container.species.speciesId)] ?? {} as PassiveAbilities; const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); const fitsFormAbility = container.species.forms.some(form => allAbilities[form.ability1].name === selectedAbility1); const fitsAbility1 = abilities.includes(selectedAbility1) || fitsFormAbility || selectedAbility1 === this.filterText.defaultText; - const fitsPassive1 = allAbilities[passive].name === selectedAbility1; + const fitsPassive1 = Object.values(passives).some(p => p.name === selectedAbility1); const selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2); const fitsAbility2 = abilities.includes(selectedAbility2) || fitsFormAbility || selectedAbility2 === this.filterText.defaultText; - const fitsPassive2 = allAbilities[passive].name === selectedAbility2; + const fitsPassive2 = Object.values(passives).some(p => p.name === selectedAbility2); // If both fields have been set to the same ability, show both ability and passive const fitsAbilities = (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) ||