From f10da84389aafc99cb8d7f62610a55fe96cc4237 Mon Sep 17 00:00:00 2001 From: Matthew Mc Gregor Date: Tue, 21 May 2024 21:00:39 +0200 Subject: [PATCH] add ability scanner --- src/locales/en/battle.ts | 4 +++- src/locales/en/modifier-type.ts | 1 + src/modifier/modifier-type.ts | 2 ++ src/modifier/modifier.ts | 22 +++++++++++++++++++ src/phases.ts | 33 ++++++++++++++++++++++++++++- src/ui/battle-message-ui-handler.ts | 13 ++++++++++++ 6 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/locales/en/battle.ts b/src/locales/en/battle.ts index a6ed2fabc64..143544aa826 100644 --- a/src/locales/en/battle.ts +++ b/src/locales/en/battle.ts @@ -52,5 +52,7 @@ export const battle: SimpleTranslationEntries = { "notDisabled": "{{pokemonName}}'s {{moveName}} is disabled\nno more!", "skipItemQuestion": "Are you sure you want to skip taking an item?", "eggHatching": "Oh?", - "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?" + "ivScannerUseQuestion": "Use IV Scanner on {{pokemonName}}?", + "abilityScannerUseQuestion": "Use Ability Scanner on {{pokemonName}}?", + "abilityPrompt": "{{pokemonName}}'s ability is {{abilityName}}.", } as const; \ No newline at end of file diff --git a/src/locales/en/modifier-type.ts b/src/locales/en/modifier-type.ts index 31d4abbce29..ce89298dbf1 100644 --- a/src/locales/en/modifier-type.ts +++ b/src/locales/en/modifier-type.ts @@ -215,6 +215,7 @@ export const modifierType: ModifierTypeTranslationEntries = { "ABILITY_CHARM": { name: "Ability Charm", description: "Dramatically increases the chance of a wild Pokémon having a Hidden Ability" }, "IV_SCANNER": { name: "IV Scanner", description: "Allows scanning the IVs of wild Pokémon. 2 IVs are revealed per stack. The best IVs are shown first" }, + "ABILITY_SCANNER": { name: "Ability Scanner", description: "Allows scanning the Abilities of wild Pokémon." }, "DNA_SPLICERS": { name: "DNA Splicers" }, diff --git a/src/modifier/modifier-type.ts b/src/modifier/modifier-type.ts index 278de2f18e8..d92550efe23 100644 --- a/src/modifier/modifier-type.ts +++ b/src/modifier/modifier-type.ts @@ -1152,6 +1152,7 @@ export const modifierTypes = { ABILITY_CHARM: () => new ModifierType(`modifierType:ModifierType.ABILITY_CHARM`, 'ability_charm', (type, _args) => new Modifiers.HiddenAbilityRateBoosterModifier(type)), IV_SCANNER: () => new ModifierType(`modifierType:ModifierType.IV_SCANNER`, 'scanner', (type, _args) => new Modifiers.IvScannerModifier(type)), + ABILITY_SCANNER: () => new ModifierType(`modifierType:ModifierType.ABILITY_SCANNER`, 'ability_scanner', (type, _args) => new Modifiers.AbilityScannerModifier(type)), DNA_SPLICERS: () => new FusePokemonModifierType(`modifierType:ModifierType.DNA_SPLICERS`, 'dna_splicers'), @@ -1278,6 +1279,7 @@ const modifierPool: ModifierPool = { new WeightedModifierType(modifierTypes.RARER_CANDY, 4), new WeightedModifierType(modifierTypes.GOLDEN_PUNCH, 2), new WeightedModifierType(modifierTypes.IV_SCANNER, 4), + new WeightedModifierType(modifierTypes.ABILITY_SCANNER, 4), new WeightedModifierType(modifierTypes.EXP_CHARM, 8), new WeightedModifierType(modifierTypes.EXP_SHARE, 12), new WeightedModifierType(modifierTypes.EXP_BALANCE, 4), diff --git a/src/modifier/modifier.ts b/src/modifier/modifier.ts index 75f54296a20..51081f0eb9a 100644 --- a/src/modifier/modifier.ts +++ b/src/modifier/modifier.ts @@ -1942,6 +1942,28 @@ export class IvScannerModifier extends PersistentModifier { } } +export class AbilityScannerModifier extends PersistentModifier { + constructor(type: ModifierType, stackCount?: integer) { + super(type, stackCount); + } + + match(modifier: Modifier): boolean { + return modifier instanceof AbilityScannerModifier; + } + + clone(): AbilityScannerModifier { + return new AbilityScannerModifier(this.type, this.stackCount); + } + + apply(args: any[]): boolean { + return true; + } + + getMaxStackCount(scene: BattleScene): integer { + return 3; + } +} + export class ExtraModifierModifier extends PersistentModifier { constructor(type: ModifierType, stackCount?: integer) { super(type, stackCount); diff --git a/src/phases.ts b/src/phases.ts index b861c82f0e8..d7126b99712 100644 --- a/src/phases.ts +++ b/src/phases.ts @@ -6,7 +6,7 @@ import { allMoves, applyMoveAttrs, BypassSleepAttr, ChargeAttr, applyFilteredMov import { Mode } from './ui/ui'; import { Command } from "./ui/command-ui-handler"; import { Stat } from "./data/pokemon-stat"; -import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier } from "./modifier/modifier"; +import { BerryModifier, ContactHeldItemTransferChanceModifier, EnemyAttackStatusEffectChanceModifier, EnemyPersistentModifier, EnemyStatusEffectHealChanceModifier, EnemyTurnHealModifier, ExpBalanceModifier, ExpBoosterModifier, ExpShareModifier, ExtraModifierModifier, FlinchChanceModifier, FusePokemonModifier, HealingBoosterModifier, HitHealModifier, LapsingPersistentModifier, MapModifier, Modifier, MultipleParticipantExpBonusModifier, PersistentModifier, PokemonExpBoosterModifier, PokemonHeldItemModifier, PokemonInstantReviveModifier, SwitchEffectTransferModifier, TempBattleStatBoosterModifier, TurnHealModifier, TurnHeldItemTransferModifier, MoneyMultiplierModifier, MoneyInterestModifier, IvScannerModifier, LapsingPokemonHeldItemModifier, PokemonMultiHitModifier, PokemonMoveAccuracyBoosterModifier, overrideModifiers, overrideHeldItems, BypassSpeedChanceModifier, AbilityScannerModifier } from "./modifier/modifier"; import PartyUiHandler, { PartyOption, PartyUiMode } from "./ui/party-ui-handler"; import { doPokeballBounceAnim, getPokeballAtlasKey, getPokeballCatchMultiplier, getPokeballTintColor, PokeballType } from "./data/pokeball"; import { CommonAnim, CommonBattleAnim, MoveAnim, initMoveAnim, loadMoveAnimAssets } from "./data/battle-anims"; @@ -935,6 +935,9 @@ export class EncounterPhase extends BattlePhase { const ivScannerModifier = this.scene.findModifier(m => m instanceof IvScannerModifier); if (ivScannerModifier) enemyField.map(p => this.scene.pushPhase(new ScanIvsPhase(this.scene, p.getBattlerIndex(), Math.min(ivScannerModifier.getStackCount() * 2, 6)))); + const abilityScannerModifier = this.scene.findModifier(m => m instanceof AbilityScannerModifier); + if (abilityScannerModifier) + enemyField.map(p => this.scene.pushPhase(new ScanAbilityPhase(this.scene, p.getBattlerIndex(), Math.min(abilityScannerModifier.getStackCount() * 2, 6)))); } if (!this.loaded) { @@ -4862,6 +4865,34 @@ export class ScanIvsPhase extends PokemonPhase { } } +export class ScanAbilityPhase extends PokemonPhase { + + constructor(scene: BattleScene, battlerIndex: BattlerIndex, shownIvs: integer) { + super(scene, battlerIndex); + } + + start() { + super.start(); + + const pokemon = this.getPokemon(); + + this.scene.ui.showText(i18next.t('battle:abilityScannerUseQuestion', { pokemonName: pokemon.name }), null, () => { + this.scene.ui.setMode(Mode.CONFIRM, () => { + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.clearText(); + new CommonBattleAnim(CommonAnim.LOCK_ON, pokemon, pokemon).play(this.scene, () => { + this.scene.ui.getMessageHandler().promptAbility(pokemon.id, pokemon.getAbility().name).then(() => this.end()); + }); + }, () => { + this.scene.ui.setMode(Mode.MESSAGE); + this.scene.ui.clearText(); + this.end(); + }); + }); + } +} + + export class TrainerMessageTestPhase extends BattlePhase { private trainerTypes: TrainerType[]; diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index b7dccef52b5..812b6e028e3 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -225,6 +225,19 @@ export default class BattleMessageUiHandler extends MessageUiHandler { }); } + promptAbility(pokemonId: integer, abilityName: string): Promise { + return new Promise(resolve => { + this.scene.executeWithSeedOffset(() => { + this.showText(i18next.t('battle:abilityPrompt', {abilityName: abilityName, pokemonName: this.scene.getPokemonById(pokemonId).name})); + + this.awaitingActionInput = true; + this.onActionInput = () => { + resolve(); + }; + }, pokemonId); + }); + } + getIvDescriptor(value: integer, typeIv: integer, pokemonId: integer): string { const starterSpecies = this.scene.getPokemonById(pokemonId).species.getRootSpeciesId(true); const starterIvs: number[] = this.scene.gameData.dexData[starterSpecies].ivs;