From 2f8df43db882f8c2d89dba3777b8ff099132921b Mon Sep 17 00:00:00 2001 From: Flashfyre Date: Sun, 18 Feb 2024 22:21:57 -0500 Subject: [PATCH] Fix some bugs and add seen Pokemon to starter screen --- src/battle-phases.ts | 6 +- src/battle-scene.ts | 2 +- src/data/type.ts | 2 +- src/form-change-phase.ts | 6 +- src/modifier/modifier.ts | 5 +- src/system/game-data.ts | 2 +- src/system/game-stats.ts | 4 ++ src/ui/game-stats-ui-handler.ts | 2 + src/ui/starter-select-ui-handler.ts | 88 +++++++++++++++++++---------- src/ui/stats-container.ts | 1 - 10 files changed, 80 insertions(+), 38 deletions(-) diff --git a/src/battle-phases.ts b/src/battle-phases.ts index 3a7336a9e..6fc91924c 100644 --- a/src/battle-phases.ts +++ b/src/battle-phases.ts @@ -3191,7 +3191,11 @@ export class PokemonHealPhase extends CommonAnimPhase { this.scene.applyModifiers(HealingBoosterModifier, this.player, hpRestoreMultiplier); const healAmount = new Utils.NumberHolder(this.hpHealed * hpRestoreMultiplier.value); healAmount.value = pokemon.heal(healAmount.value); - this.scene.validateAchvs(HealAchv, healAmount); + if (pokemon.isPlayer()) { + this.scene.validateAchvs(HealAchv, healAmount); + if (healAmount.value > this.scene.gameData.gameStats.highestHeal) + this.scene.gameData.gameStats.highestHeal = healAmount.value; + } pokemon.updateInfo().then(() => super.end()); } else if (this.showFullHpMessage) this.message = getPokemonMessage(pokemon, `'s\nHP is full!`); diff --git a/src/battle-scene.ts b/src/battle-scene.ts index 64ecc2aee..db3ded91f 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -1058,7 +1058,7 @@ export default class BattleScene extends Phaser.Scene { addPokemonSprite(pokemon: Pokemon, x: number, y: number, texture: string | Phaser.Textures.Texture, frame?: string | number, hasShadow: boolean = false, ignoreOverride: boolean = false): Phaser.GameObjects.Sprite { const ret = this.addFieldSprite(x, y, texture, frame); - this.initPokemonSprite(ret, pokemon); + this.initPokemonSprite(ret, pokemon, hasShadow, ignoreOverride); return ret; } diff --git a/src/data/type.ts b/src/data/type.ts index 9fb2c9c1b..fa2b41673 100644 --- a/src/data/type.ts +++ b/src/data/type.ts @@ -68,10 +68,10 @@ export function getTypeDamageMultiplier(attackType: integer, defType: integer): case Type.ELECTRIC: case Type.ICE: case Type.DRAGON: - case Type.DARK: return 1; case Type.ROCK: case Type.BUG: + case Type.DARK: return 0.5; default: return 0; diff --git a/src/form-change-phase.ts b/src/form-change-phase.ts index a44cdd6cb..6f555af7d 100644 --- a/src/form-change-phase.ts +++ b/src/form-change-phase.ts @@ -116,11 +116,13 @@ export class FormChangePhase extends EvolutionPhase { this.scene.time.delayedCall(250, () => { this.pokemon.cry(); this.scene.time.delayedCall(1250, () => { - const isMega = this.formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1; let playEvolutionFanfare = false; - if (isMega) { + if (this.formChange.formKey.indexOf(SpeciesFormKey.MEGA) > -1) { this.scene.validateAchv(achvs.MEGA_EVOLVE); playEvolutionFanfare = true; + } else if (this.formChange.formKey.indexOf(SpeciesFormKey.GIGANTAMAX) > -1 || this.formChange.formKey.indexOf(SpeciesFormKey.ETERNAMAX) > -1) { + this.scene.validateAchv(achvs.GIGANTAMAX); + playEvolutionFanfare = true; } const delay = playEvolutionFanfare ? 4000 : 1750; diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 0d8b81b43..1ef1ed5b5 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -14,7 +14,7 @@ import * as Utils from "../utils"; import { TempBattleStat } from '../data/temp-battle-stat'; import { BerryType, getBerryEffectFunc, getBerryPredicate } from '../data/berry'; import { StatusEffect, getStatusEffectDescriptor } from '../data/status-effect'; -import { MoneyAchv } from '../system/achv'; +import { MoneyAchv, achvs } from '../system/achv'; import { VoucherType } from '../system/voucher'; import { PreventBerryUseAbAttr, applyAbAttrs } from '../data/ability'; import { FormChangeItem, SpeciesFormChangeItemTrigger } from '../data/pokemon-forms'; @@ -564,6 +564,9 @@ export class TerastallizeModifier extends LapsingPokemonHeldItemModifier { apply(args: any[]): boolean { const pokemon = args[0] as Pokemon; + pokemon.scene.validateAchv(achvs.TERASTALLIZE); + if (this.teraType === Type.STELLAR) + pokemon.scene.validateAchv(achvs.STELLAR_TERASTALLIZE); pokemon.updateSpritePipelineData(); return true; } diff --git a/src/system/game-data.ts b/src/system/game-data.ts index 14dae535e..c65ef9831 100644 --- a/src/system/game-data.ts +++ b/src/system/game-data.ts @@ -860,7 +860,7 @@ export class GameData { } while (pokemonPrevolutions.hasOwnProperty(speciesId) && (speciesId = pokemonPrevolutions[speciesId])); } - getSpeciesDefaultDexAttr(species: PokemonSpecies): bigint { + getSpeciesDefaultDexAttr(species: PokemonSpecies, forSeen: boolean = false): bigint { let ret = 0n; const dexEntry = this.dexData[species.speciesId]; const attr = dexEntry.caughtAttr; diff --git a/src/system/game-stats.ts b/src/system/game-stats.ts index 8f5ea646d..068c6595e 100644 --- a/src/system/game-stats.ts +++ b/src/system/game-stats.ts @@ -10,6 +10,8 @@ export class GameStats { public highestEndlessWave: integer; public highestLevel: integer; public highestMoney: integer; + public highestDamage: integer; + public highestHeal: integer; public pokemonSeen: integer; public pokemonDefeated: integer; public pokemonCaught: integer; @@ -40,6 +42,8 @@ export class GameStats { this.highestEndlessWave = source?.highestEndlessWave || 0; this.highestLevel = source?.highestLevel || 0; this.highestMoney = source?.highestMoney || 0; + this.highestDamage = source?.highestDamage || 0; + this.highestHeal = source?.highestHeal || 0; this.pokemonSeen = source?.pokemonSeen || 0; this.pokemonDefeated = source?.pokemonDefeated || 0; this.pokemonCaught = source?.pokemonCaught || 0; diff --git a/src/ui/game-stats-ui-handler.ts b/src/ui/game-stats-ui-handler.ts index 3f233c8c9..497a94632 100644 --- a/src/ui/game-stats-ui-handler.ts +++ b/src/ui/game-stats-ui-handler.ts @@ -75,6 +75,8 @@ const displayStats: DisplayStats = { endlessSessionsPlayed: 'Runs (Endless)?', highestEndlessWave: 'Highest Wave (Endless)?', highestMoney: 'Highest Money', + highestDamage: 'Highest Damage', + highestHeal: 'Highest HP Healed', pokemonSeen: 'Pokémon Encountered', pokemonDefeated: 'Pokémon Defeated', pokemonCaught: 'Pokémon Caught', diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index f5f5fb79e..a690caed5 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -18,7 +18,6 @@ import { Nature, getNatureName } from "../data/nature"; import BBCodeText from "phaser3-rex-plugins/plugins/bbcodetext"; import { pokemonFormChanges } from "../data/pokemon-forms"; import { Tutorial, handleTutorial } from "../tutorial"; -import PokemonSpriteSparkleHandler from "../sprite/pokemon-sprite-sparkle-handler"; export type StarterSelectCallback = (starters: Starter[]) => void; @@ -40,6 +39,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonGrowthRateLabelText: Phaser.GameObjects.Text; private pokemonGrowthRateText: Phaser.GameObjects.Text; private pokemonGenderText: Phaser.GameObjects.Text; + private pokemonUncaughtText: Phaser.GameObjects.Text; private pokemonAbilityLabelText: Phaser.GameObjects.Text; private pokemonAbilityText: Phaser.GameObjects.Text; private pokemonNatureLabelText: Phaser.GameObjects.Text; @@ -140,6 +140,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonGenderText.setOrigin(0, 0); this.starterSelectContainer.add(this.pokemonGenderText); + this.pokemonUncaughtText = addTextObject(this.scene, 6, 126, 'Uncaught', TextStyle.SUMMARY, { fontSize: '56px' }); + this.pokemonUncaughtText.setOrigin(0, 0); + this.starterSelectContainer.add(this.pokemonUncaughtText); + this.pokemonAbilityLabelText = addTextObject(this.scene, 6, 126, 'Ability:', TextStyle.SUMMARY, { fontSize: '56px' }); this.pokemonAbilityLabelText.setOrigin(0, 0); this.pokemonAbilityLabelText.setVisible(false); @@ -244,7 +248,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { icon.setScale(0.5); icon.setOrigin(0, 0); icon.setFrame(species.getIconId(defaultProps.female, defaultProps.formIndex, defaultProps.shiny)); - icon.setTintFill(0); + icon.setTint(0); this.starterSelectGenIconContainers[g].add(icon); this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE); s++; @@ -356,6 +360,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const icon = this.starterSelectGenIconContainers[g].getAt(s) as Phaser.GameObjects.Sprite; if (dexEntry.caughtAttr) icon.clearTint(); + else if (dexEntry.seenAttr) + icon.setTint(0x808080); }); } @@ -762,56 +768,78 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.lastSpecies = species; - if (species && this.speciesStarterDexEntry?.caughtAttr) { + if (species && (this.speciesStarterDexEntry?.seenAttr || this.speciesStarterDexEntry?.caughtAttr)) { this.pokemonNumberText.setText(Utils.padInt(species.speciesId, 4)); this.pokemonNameText.setText(species.name); - this.pokemonGrowthRateText.setText(Utils.toReadableString(GrowthRate[species.growthRate])); - this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate)); - this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true)); - this.pokemonGrowthRateLabelText.setVisible(true); - this.pokemonAbilityLabelText.setVisible(true); - this.pokemonNatureLabelText.setVisible(true); - this.pokemonCaughtCountLabelText.setVisible(true); - this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry.caughtCount}/${this.speciesStarterDexEntry.hatchedCount} (${this.speciesStarterDexEntry.caughtCount + this.speciesStarterDexEntry.hatchedCount})`); - this.pokemonCaughtCountText.setVisible(true); - this.iconAnimHandler.addOrUpdate(this.starterSelectGenIconContainers[species.generation - 1].getAt(this.genSpecies[species.generation - 1].indexOf(species)) as Phaser.GameObjects.Sprite, PokemonIconAnimMode.PASSIVE); - let starterIndex = -1; + if (this.speciesStarterDexEntry?.caughtAttr) { + this.pokemonGrowthRateText.setText(Utils.toReadableString(GrowthRate[species.growthRate])); + this.pokemonGrowthRateText.setColor(getGrowthRateColor(species.growthRate)); + this.pokemonGrowthRateText.setShadowColor(getGrowthRateColor(species.growthRate, true)); + this.pokemonGrowthRateLabelText.setVisible(true); + this.pokemonUncaughtText.setVisible(false); + this.pokemonAbilityLabelText.setVisible(true); + this.pokemonNatureLabelText.setVisible(true); + this.pokemonCaughtCountLabelText.setVisible(true); + this.pokemonCaughtCountText.setText(`${this.speciesStarterDexEntry.caughtCount}/${this.speciesStarterDexEntry.hatchedCount} (${this.speciesStarterDexEntry.caughtCount + this.speciesStarterDexEntry.hatchedCount})`); + this.pokemonCaughtCountText.setVisible(true); + this.iconAnimHandler.addOrUpdate(this.starterSelectGenIconContainers[species.generation - 1].getAt(this.genSpecies[species.generation - 1].indexOf(species)) as Phaser.GameObjects.Sprite, PokemonIconAnimMode.PASSIVE); - this.starterGens.every((g, i) => { - const starterSpecies = this.genSpecies[g][this.starterCursors[i]]; - if (starterSpecies.speciesId === species.speciesId) { - starterIndex = i; - return false; + let starterIndex = -1; + + this.starterGens.every((g, i) => { + const starterSpecies = this.genSpecies[g][this.starterCursors[i]]; + if (starterSpecies.speciesId === species.speciesId) { + starterIndex = i; + return false; + } + return true; + }); + + if (starterIndex > -1) { + const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.starterAttr[starterIndex]); + this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.abilityIndex, this.starterNatures[starterIndex]); + } else { + const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species); + const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); + const props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); + + this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.abilityIndex, defaultNature); } - return true; - }); - - if (starterIndex > -1) { - const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.starterAttr[starterIndex]); - this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.abilityIndex, this.starterNatures[starterIndex]); + this.pokemonSprite.clearTint(); } else { - const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species); + this.pokemonGrowthRateText.setText(''); + this.pokemonGrowthRateLabelText.setVisible(false); + this.pokemonUncaughtText.setVisible(true); + this.pokemonAbilityLabelText.setVisible(false); + this.pokemonNatureLabelText.setVisible(false); + this.pokemonCaughtCountLabelText.setVisible(false); + this.pokemonCaughtCountText.setVisible(false); + + const defaultDexAttr = this.scene.gameData.getSpeciesDefaultDexAttr(species, true); const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); const props = this.scene.gameData.getSpeciesDexAttrProps(species, defaultDexAttr); - this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.abilityIndex, defaultNature); + this.setSpeciesDetails(species, props.shiny, props.formIndex, props.female, props.abilityIndex, defaultNature, true); + this.pokemonSprite.setTint(0x808080); } } else { this.pokemonNumberText.setText(Utils.padInt(0, 4)); this.pokemonNameText.setText(species ? '???' : ''); this.pokemonGrowthRateText.setText(''); this.pokemonGrowthRateLabelText.setVisible(false); + this.pokemonUncaughtText.setVisible(!!species); this.pokemonAbilityLabelText.setVisible(false); this.pokemonNatureLabelText.setVisible(false); this.pokemonCaughtCountLabelText.setVisible(false); this.pokemonCaughtCountText.setVisible(false); this.setSpeciesDetails(species, false, 0, false, 0, 0); + this.pokemonSprite.clearTint(); } } - setSpeciesDetails(species: PokemonSpecies, shiny: boolean, formIndex: integer, female: boolean, abilityIndex: integer, natureIndex: integer): void { + setSpeciesDetails(species: PokemonSpecies, shiny: boolean, formIndex: integer, female: boolean, abilityIndex: integer, natureIndex: integer, forSeen: boolean = false): void { const oldProps = species ? this.scene.gameData.getSpeciesDexAttrProps(species, this.dexAttrCursor) : null; this.dexAttrCursor = 0n; @@ -836,7 +864,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { if (species) { const dexEntry = this.scene.gameData.dexData[species.speciesId]; if (!dexEntry.caughtAttr) { - const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species)); + const props = this.scene.gameData.getSpeciesDexAttrProps(species, this.scene.gameData.getSpeciesDefaultDexAttr(species, forSeen)); const defaultNature = this.scene.gameData.getSpeciesDefaultNature(species); if (shiny === undefined || shiny !== props.shiny) shiny = props.shiny; @@ -850,7 +878,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { natureIndex = defaultNature; } - if (this.speciesStarterDexEntry?.caughtAttr) { + if (forSeen ? this.speciesStarterDexEntry?.seenAttr : this.speciesStarterDexEntry?.caughtAttr) { let starterIndex = -1; this.starterGens.every((g, i) => { diff --git a/src/ui/stats-container.ts b/src/ui/stats-container.ts index e89284f0c..ae3776636 100644 --- a/src/ui/stats-container.ts +++ b/src/ui/stats-container.ts @@ -2,7 +2,6 @@ import BBCodeText from "phaser3-rex-plugins/plugins/gameobjects/tagtext/bbcodete import BattleScene from "../battle-scene"; import { Stat, getStatName } from "../data/pokemon-stat"; import { TextStyle, addBBCodeTextObject, addTextObject, getTextColor } from "./text"; -import { Gender, getGenderColor } from "../data/gender"; const ivChartSize = 24; const ivChartStatCoordMultipliers = [ [ 0, 1 ], [ 0.825, 0.5 ], [ 0.825, -0.5 ], [ 0, -1 ], [ -0.825, -0.5 ], [ -0.825, 0.5 ] ];