From 0167dc7052a9a3abdae068bbdcc33e1696f36a92 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Mon, 30 Dec 2024 12:53:05 +0100 Subject: [PATCH] Filtering moves and abilities correctly --- src/data/balance/tms.ts | 24 +++++++++++++++++++++++ src/ui/filter-text.ts | 1 - src/ui/pokedex-scan-ui-handler.ts | 20 +++++++++++-------- src/ui/pokedex-ui-handler.ts | 32 ++++++++++++++++++++++++++++--- 4 files changed, 65 insertions(+), 12 deletions(-) diff --git a/src/data/balance/tms.ts b/src/data/balance/tms.ts index da900768987..e5ecfa6c9df 100644 --- a/src/data/balance/tms.ts +++ b/src/data/balance/tms.ts @@ -68433,6 +68433,30 @@ export const tmSpecies: TmSpecies = { ], }; +interface SpeciesTmMoves { + [key: number]: Array +} + +function flipTmSpecies(tmSpecies: TmSpecies): SpeciesTmMoves { + const flipped: SpeciesTmMoves = {}; + + for (const move in tmSpecies) { + const speciesList = tmSpecies[move]; // Convert the move key back to a number + + for (const species of speciesList) { + if (!flipped[species]) { + flipped[species] = []; + } + flipped[species].push(move); + } + } + + return flipped; +} + +export const speciesTmMoves: SpeciesTmMoves = flipTmSpecies(tmSpecies); + + interface TmPoolTiers { [key: integer]: ModifierTier } diff --git a/src/ui/filter-text.ts b/src/ui/filter-text.ts index 7d9f3ec05b5..3e4d62cc82a 100644 --- a/src/ui/filter-text.ts +++ b/src/ui/filter-text.ts @@ -278,7 +278,6 @@ export class FilterText extends Phaser.GameObjects.Container { } getValue(row: number): string { - console.log("Getting value", this.selections[row].getWrappedText()[0]); return this.selections[row].getWrappedText()[0]; } diff --git a/src/ui/pokedex-scan-ui-handler.ts b/src/ui/pokedex-scan-ui-handler.ts index 0f6627c335d..435891ae88b 100644 --- a/src/ui/pokedex-scan-ui-handler.ts +++ b/src/ui/pokedex-scan-ui-handler.ts @@ -6,12 +6,16 @@ import { OptionSelectItem } from "./abstact-option-select-ui-handler"; import { isNullOrUndefined } from "#app/utils"; import { Mode } from "./ui"; import { FilterTextRow } from "./filter-text"; +import { allAbilities } from "#app/data/ability"; +import { allMoves } from "#app/data/move"; export default class PokedexScanUiHandler extends FormModalUiHandler { keys: string[]; reducedKeys: string[]; parallelKeys: string[]; + moveKeys: string[]; + abilityKeys: string[]; constructor(scene, mode) { super(scene, mode); @@ -39,6 +43,10 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { const keysInArrays = flattenKeys(i18next.getDataByLanguage(String(i18next.resolvedLanguage))).filter((t) => t.length > 0); // Array of arrays const keys = keysInArrays.flat(Infinity).map(String); // One array of string + + this.moveKeys = allMoves.map(a => a.name); + this.abilityKeys = allAbilities.map(a => a.name); + this.keys = keys; } @@ -77,22 +85,18 @@ export default class PokedexScanUiHandler extends FormModalUiHandler { switch (row) { case FilterTextRow.NAME: { const startString = "pokemon:"; - const endString = ""; - this.reducedKeys = this.keys.filter(str => str.startsWith(startString) && str.endsWith(endString)); + // TODO: nameKeys + this.reducedKeys = this.keys.filter(str => str.startsWith(startString)); break; } case FilterTextRow.MOVE_1: case FilterTextRow.MOVE_2: { - const startString = "move:"; - const endString = ".name"; - this.reducedKeys = this.keys.filter(str => str.startsWith(startString) && str.endsWith(endString)); + this.reducedKeys = this.moveKeys; break; } case FilterTextRow.ABILITY_1: case FilterTextRow.ABILITY_2: { - const startString = "ability:"; - const endString = ".name"; - this.reducedKeys = this.keys.filter(str => str.startsWith(startString) && str.endsWith(endString)); + this.reducedKeys = this.abilityKeys; break; } default: { diff --git a/src/ui/pokedex-ui-handler.ts b/src/ui/pokedex-ui-handler.ts index ab65b887611..ddc63d1b54b 100644 --- a/src/ui/pokedex-ui-handler.ts +++ b/src/ui/pokedex-ui-handler.ts @@ -37,6 +37,10 @@ import { addWindow, WindowVariant } from "./ui-theme"; import * as Utils from "../utils"; import { OptionSelectConfig } from "./abstact-option-select-ui-handler"; import { FilterText, FilterTextRow } from "./filter-text"; +import { allAbilities } from "#app/data/ability"; +import { starterPassiveAbilities } from "#app/data/balance/passives"; +import { allMoves } from "#app/data/move"; +import { speciesTmMoves } from "#app/data/balance/tms"; export interface Starter { @@ -1358,8 +1362,30 @@ export default class PokedexUiHandler extends MessageUiHandler { const isStarterProgressable = speciesEggMoves.hasOwnProperty(container.species.speciesId); // Name filter - console.log(container.species.name); - const fitsName = [ container.species.name, this.filterText.defaultText ].includes(this.filterText.getValue(FilterTextRow.NAME)); + const selectedName = this.filterText.getValue(FilterTextRow.NAME); + const fitsName = container.species.name === selectedName || selectedName === this.filterText.defaultText; + + // Move filter + const levelMoves = pokemonSpeciesLevelMoves[container.species.speciesId].map(m => allMoves[m[1]].name); + const eggMoves = speciesEggMoves[container.species.speciesId]?.map(m => allMoves[m].name) ?? []; + const tmMoves = speciesTmMoves[container.species.speciesId]?.map(m => allMoves[m].name) ?? []; + const selectedMove1 = this.filterText.getValue(FilterTextRow.MOVE_1); + const selectedMove2 = this.filterText.getValue(FilterTextRow.MOVE_2); + + const fitsMove1 = levelMoves.includes(selectedMove1) || eggMoves.includes(selectedMove1) || tmMoves.includes(selectedMove1) || selectedMove1 === this.filterText.defaultText; + const fitsMove2 = levelMoves.includes(selectedMove2) || eggMoves.includes(selectedMove2) || tmMoves.includes(selectedMove2) || selectedMove2 === this.filterText.defaultText; + + // Ability filter + // allAbilities already contains the localized names of the abilities + const abilities = [ container.species.ability1, container.species.ability2, container.species.abilityHidden ].map(a => allAbilities[a].name); + // console.log(abilities); + const selectedAbility1 = this.filterText.getValue(FilterTextRow.ABILITY_1); + const fitsAbility1 = abilities.includes(selectedAbility1) || selectedAbility1 === this.filterText.defaultText; + + const passive = starterPassiveAbilities[container.species.speciesId] ?? 0; + const selectedAbility2 = this.filterText.getValue(FilterTextRow.ABILITY_2); + const fitsAbility2 = allAbilities[passive].name === selectedAbility2 || selectedAbility2 === this.filterText.defaultText; + // Gen filter const fitsGen = this.filterBar.getVals(DropDownColumn.GEN).includes(container.species.generation); @@ -1482,7 +1508,7 @@ export default class PokedexUiHandler extends MessageUiHandler { } }); - if (fitsName && fitsGen && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { + if (fitsName && fitsAbility1 && fitsAbility2 && fitsMove1 && fitsMove2 && fitsGen && fitsType && fitsCaught && fitsPassive && fitsCostReduction && fitsFavorite && fitsWin && fitsHA && fitsEgg && fitsPokerus) { this.filteredStarterContainers.push(container); } });