From 4aa6699e8fb3ef3aa45ea3acb7ccd286ab3410f7 Mon Sep 17 00:00:00 2001 From: Wlowscha <54003515+Wlowscha@users.noreply.github.com> Date: Sat, 16 Aug 2025 21:55:18 +0200 Subject: [PATCH] Hiding shiny star and hidden ability icon, showing correct nature --- src/data/challenge.ts | 2 +- src/system/game-data.ts | 6 ++-- src/ui/starter-select-ui-handler.ts | 46 ++++++++++++++--------------- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/data/challenge.ts b/src/data/challenge.ts index 0b643d4291e..a9d04a87bcd 100644 --- a/src/data/challenge.ts +++ b/src/data/challenge.ts @@ -829,7 +829,7 @@ export class FreshStartChallenge extends Challenge { (1 << (Nature.SERIOUS + 1)) | (1 << (Nature.BASHFUL + 1)) | (1 << (Nature.QUIRKY + 1)); - dexEntry.natureAttr &= neutralNaturesAttr; + dexEntry.natureAttr = neutralNaturesAttr; // Set all ivs to 15 dexEntry.ivs = [15, 15, 15, 15, 15, 15]; diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 16f40b1b907..2cabbb1ad62 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -2110,8 +2110,10 @@ export class GameData { return abilityAttr & AbilityAttr.ABILITY_1 ? 0 : !species.ability2 || abilityAttr & AbilityAttr.ABILITY_2 ? 1 : 2; } - getSpeciesDefaultNature(species: PokemonSpecies): Nature { - const dexEntry = this.dexData[species.speciesId]; + getSpeciesDefaultNature(species: PokemonSpecies, dexEntry?: DexEntry): Nature { + if (isNullOrUndefined(dexEntry)) { + dexEntry = this.dexData[species.speciesId]; + } for (let n = 0; n < 25; n++) { if (dexEntry.natureAttr & (1 << (n + 1))) { return n as Nature; diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 941c02ffe17..a338b4e717a 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -3254,12 +3254,12 @@ export class StarterSelectUiHandler extends MessageUiHandler { onScreenFirstIndex + maxRows * maxColumns - 1, ); - const gameData = globalScene.gameData; - this.starterSelectScrollBar.setScrollCursor(this.scrollCursor); let pokerusCursorIndex = 0; this.filteredStarterContainers.forEach((container, i) => { + const { dexEntry, starterDataEntry } = this.getSpeciesData(container.species.speciesId); + const pos = calcStarterPosition(i, this.scrollCursor); container.setPosition(pos.x, pos.y); if (i < onScreenFirstIndex || i > onScreenLastIndex) { @@ -3295,10 +3295,8 @@ export class StarterSelectUiHandler extends MessageUiHandler { container.label.setVisible(true); const speciesVariants = - speciesId && gameData.dexData[speciesId].caughtAttr & DexAttr.SHINY - ? [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter( - v => !!(gameData.dexData[speciesId].caughtAttr & v), - ) + speciesId && dexEntry.caughtAttr & DexAttr.SHINY + ? [DexAttr.DEFAULT_VARIANT, DexAttr.VARIANT_2, DexAttr.VARIANT_3].filter(v => !!(dexEntry.caughtAttr & v)) : []; for (let v = 0; v < 3; v++) { const hasVariant = speciesVariants.length > v; @@ -3312,15 +3310,11 @@ export class StarterSelectUiHandler extends MessageUiHandler { } } - container.starterPassiveBgs.setVisible(!!gameData.starterData[speciesId].passiveAttr); - container.hiddenAbilityIcon.setVisible( - !!gameData.dexData[speciesId].caughtAttr && !!(gameData.starterData[speciesId].abilityAttr & 4), - ); + container.starterPassiveBgs.setVisible(!!starterDataEntry.passiveAttr); + container.hiddenAbilityIcon.setVisible(!!dexEntry.caughtAttr && !!(starterDataEntry.abilityAttr & 4)); container.classicWinIcon - .setVisible(gameData.starterData[speciesId].classicWinCount > 0) - .setTexture( - gameData.dexData[speciesId].ribbons.has(RibbonData.NUZLOCKE) ? "champion_ribbon_emerald" : "champion_ribbon", - ); + .setVisible(starterDataEntry.classicWinCount > 0) + .setTexture(dexEntry.ribbons.has(RibbonData.NUZLOCKE) ? "champion_ribbon_emerald" : "champion_ribbon"); container.favoriteIcon.setVisible(this.starterPreferences[speciesId]?.favorite ?? false); // 'Candy Icon' mode @@ -3421,14 +3415,19 @@ export class StarterSelectUiHandler extends MessageUiHandler { setSpecies(species: PokemonSpecies | null) { this.speciesStarterDexEntry = null; + this.dexAttrCursor = 0n; + this.abilityCursor = 0; + this.natureCursor = 0; + this.teraCursor = PokemonType.UNKNOWN; + if (species) { const { dexEntry } = this.getSpeciesData(species.speciesId); this.speciesStarterDexEntry = dexEntry; + this.dexAttrCursor = this.getCurrentDexProps(species.speciesId); + this.abilityCursor = globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); + this.natureCursor = globalScene.gameData.getSpeciesDefaultNature(species, dexEntry); + this.teraCursor = species.type1; } - this.dexAttrCursor = species ? this.getCurrentDexProps(species.speciesId) : 0n; - this.abilityCursor = species ? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; - this.natureCursor = species ? globalScene.gameData.getSpeciesDefaultNature(species) : 0; - this.teraCursor = species ? species.type1 : PokemonType.UNKNOWN; if (!species && globalScene.ui.getTooltip().visible) { globalScene.ui.hideTooltip(); @@ -3593,11 +3592,12 @@ export class StarterSelectUiHandler extends MessageUiHandler { teraType: this.starterTeras[starterIndex], }); } else { - const defaultDexAttr = this.getCurrentDexProps(species.speciesId); const defaultAbilityIndex = starterAttributes?.ability ?? globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); // load default nature from stater save data, if set - const defaultNature = starterAttributes?.nature || globalScene.gameData.getSpeciesDefaultNature(species); + const { dexEntry } = this.getSpeciesData(species.speciesId); + const defaultNature = + starterAttributes?.nature || globalScene.gameData.getSpeciesDefaultNature(species, dexEntry); props = globalScene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); if (starterAttributes?.variant && !Number.isNaN(starterAttributes.variant)) { if (props.shiny) { @@ -3711,12 +3711,13 @@ export class StarterSelectUiHandler extends MessageUiHandler { setSpeciesDetails(species: PokemonSpecies, options: SpeciesDetails = {}): void { let { shiny, formIndex, female, variant, abilityIndex, natureIndex, teraType } = options; + const { dexEntry, starterDataEntry } = this.getSpeciesData(species.speciesId); const forSeen: boolean = options.forSeen ?? false; const oldProps = species ? globalScene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; const oldAbilityIndex = this.abilityCursor > -1 ? this.abilityCursor : globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); const oldNatureIndex = - this.natureCursor > -1 ? this.natureCursor : globalScene.gameData.getSpeciesDefaultNature(species); + this.natureCursor > -1 ? this.natureCursor : globalScene.gameData.getSpeciesDefaultNature(species, dexEntry); this.dexAttrCursor = 0n; this.abilityCursor = -1; this.natureCursor = -1; @@ -3786,14 +3787,13 @@ export class StarterSelectUiHandler extends MessageUiHandler { this.speciesStarterMoves = []; if (species) { - const { dexEntry, starterDataEntry } = this.getSpeciesData(species.speciesId); const caughtAttr = dexEntry.caughtAttr || BigInt(0); const abilityAttr = starterDataEntry.abilityAttr; if (!caughtAttr) { const props = globalScene.gameData.getSpeciesDexAttrProps(species, this.getCurrentDexProps(species.speciesId)); const defaultAbilityIndex = globalScene.gameData.getStarterSpeciesDefaultAbilityIndex(species); - const defaultNature = globalScene.gameData.getSpeciesDefaultNature(species); + const defaultNature = globalScene.gameData.getSpeciesDefaultNature(species, dexEntry); if (shiny === undefined || shiny !== props.shiny) { shiny = props.shiny;