Displaying form-specific TMs properly; adjusting for passives rework

This commit is contained in:
Wlowscha 2025-02-01 22:54:36 +01:00
parent 7d4e383052
commit b19d223324
No known key found for this signature in database
GPG Key ID: 3C8F1AD330565D04
4 changed files with 42 additions and 14 deletions

View File

@ -1,7 +1,15 @@
import { Abilities } from "#app/enums/abilities"; import { Abilities } from "#app/enums/abilities";
import { Species } from "#app/enums/species"; 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.BULBASAUR]: { 0: Abilities.GRASSY_SURGE },
[Species.CHARMANDER]: { 0: Abilities.BEAST_BOOST }, [Species.CHARMANDER]: { 0: Abilities.BEAST_BOOST },
[Species.SQUIRTLE]: { 0: Abilities.STURDY }, [Species.SQUIRTLE]: { 0: Abilities.STURDY },

View File

@ -68434,7 +68434,7 @@ export const tmSpecies: TmSpecies = {
}; };
interface SpeciesTmMoves { interface SpeciesTmMoves {
[key: integer]: Moves[] [key: integer]: (Moves | [string | Species, Moves])[];
} }
function flipTmSpecies(tmSpecies: TmSpecies): SpeciesTmMoves { function flipTmSpecies(tmSpecies: TmSpecies): SpeciesTmMoves {
@ -68445,11 +68445,27 @@ function flipTmSpecies(tmSpecies: TmSpecies): SpeciesTmMoves {
const speciesList = tmSpecies[move]; const speciesList = tmSpecies[move];
for (const species of speciesList) { for (const species of speciesList) {
const speciesKey = Number(species);
if (!flipped[speciesKey]) { if (Array.isArray(species)) {
flipped[speciesKey] = []; // 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; return flipped;
@ -68457,7 +68473,6 @@ function flipTmSpecies(tmSpecies: TmSpecies): SpeciesTmMoves {
export const speciesTmMoves: SpeciesTmMoves = flipTmSpecies(tmSpecies); export const speciesTmMoves: SpeciesTmMoves = flipTmSpecies(tmSpecies);
interface TmPoolTiers { interface TmPoolTiers {
[key: integer]: ModifierTier [key: integer]: ModifierTier
} }

View File

@ -632,9 +632,12 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
this.eggMoves = speciesEggMoves[this.getStarterSpeciesId(species.speciesId)] ?? []; 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.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 starterData = globalScene.gameData.starterData[this.getStarterSpeciesId(species.speciesId)];
const abilityAttr = starterData.abilityAttr; const abilityAttr = starterData.abilityAttr;
@ -1640,7 +1643,7 @@ export default class PokedexPageUiHandler extends MessageUiHandler {
if (!(passiveAttr & PassiveAttr.UNLOCKED)) { if (!(passiveAttr & PassiveAttr.UNLOCKED)) {
const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)]); const passiveCost = getPassiveCandyCount(speciesStarterCosts[this.getStarterSpeciesId(this.species.speciesId)]);
options.push({ 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: () => { handler: () => {
if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) { if (Overrides.FREE_CANDY_UPGRADE_OVERRIDE || candyCount >= passiveCost) {
starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED; starterData.passiveAttr |= PassiveAttr.UNLOCKED | PassiveAttr.ENABLED;

View File

@ -34,6 +34,7 @@ import { addWindow } from "./ui-theme";
import type { OptionSelectConfig } from "./abstact-option-select-ui-handler"; import type { OptionSelectConfig } from "./abstact-option-select-ui-handler";
import { FilterText, FilterTextRow } from "./filter-text"; import { FilterText, FilterTextRow } from "./filter-text";
import { allAbilities } from "#app/data/ability"; import { allAbilities } from "#app/data/ability";
import type { PassiveAbilities } from "#app/data/balance/passives";
import { starterPassiveAbilities } from "#app/data/balance/passives"; import { starterPassiveAbilities } from "#app/data/balance/passives";
import { allMoves } from "#app/data/move"; import { allMoves } from "#app/data/move";
import { speciesTmMoves } from "#app/data/balance/tms"; 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); const levelMoves = pokemonSpeciesLevelMoves[container.species.speciesId].map(m => allMoves[m[1]].name);
// This always gets egg moves from the starter // This always gets egg moves from the starter
const eggMoves = speciesEggMoves[this.getStarterSpeciesId(container.species.speciesId)]?.map(m => allMoves[m].name) ?? []; 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 selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1);
const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2);
@ -1225,16 +1226,17 @@ export default class PokedexUiHandler extends MessageUiHandler {
// Ability filter // Ability filter
const abilities = [ container.species.ability1, container.species.ability2, container.species.abilityHidden ].map(a => allAbilities[a].name); 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 selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1);
const fitsFormAbility = container.species.forms.some(form => allAbilities[form.ability1].name === selectedAbility1); const fitsFormAbility = container.species.forms.some(form => allAbilities[form.ability1].name === selectedAbility1);
const fitsAbility1 = abilities.includes(selectedAbility1) || fitsFormAbility || selectedAbility1 === this.filterText.defaultText; 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 selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2);
const fitsAbility2 = abilities.includes(selectedAbility2) || fitsFormAbility || selectedAbility2 === this.filterText.defaultText; 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 // If both fields have been set to the same ability, show both ability and passive
const fitsAbilities = (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) || const fitsAbilities = (fitsAbility1 && (fitsPassive2 || selectedAbility2 === this.filterText.defaultText)) ||