From 68b956cbe6d0ce3da0d55c7a6a86cdb8dca045b3 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Sun, 8 Sep 2024 20:48:09 -0700 Subject: [PATCH 01/30] [Bug] Fix incorrect defensive properties on Terastallized Pokemon (#4070) * Fix incorrect defensive properties on Terastallized Pokemon * Add tests to `effectiveness.test.ts` * Suppress errors from Tera achievement validation --- src/field/pokemon.ts | 5 +++- src/test/moves/effectiveness.test.ts | 39 +++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 863b0f41d2c..6d29e30254a 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1049,6 +1049,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { const teraType = this.getTeraType(); if (teraType !== Type.UNKNOWN) { types.push(teraType); + if (forDefend) { + return types; + } } } @@ -1368,7 +1371,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { : 1); applyMoveAttrs(VariableMoveTypeMultiplierAttr, source, this, move, typeMultiplier); - if (this.getTypes().find(t => move.isTypeImmune(source, this, t))) { + if (this.getTypes(true, true).find(t => move.isTypeImmune(source, this, t))) { typeMultiplier.value = 0; } diff --git a/src/test/moves/effectiveness.test.ts b/src/test/moves/effectiveness.test.ts index af44586b69d..d1903c79844 100644 --- a/src/test/moves/effectiveness.test.ts +++ b/src/test/moves/effectiveness.test.ts @@ -1,23 +1,32 @@ import { allMoves } from "#app/data/move"; import { getPokemonSpecies } from "#app/data/pokemon-species"; import { TrainerSlot } from "#app/data/trainer-config"; +import { Type } from "#app/data/type"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import * as Messages from "#app/messages"; +import { TerastallizeModifier } from "#app/modifier/modifier"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, describe, expect, it, vi } from "vitest"; function testMoveEffectiveness(game: GameManager, move: Moves, targetSpecies: Species, - expected: number, targetAbility: Abilities = Abilities.BALL_FETCH): void { + expected: number, targetAbility: Abilities = Abilities.BALL_FETCH, teraType?: Type): void { // Suppress getPokemonNameWithAffix because it calls on a null battle spec vi.spyOn(Messages, "getPokemonNameWithAffix").mockReturnValue(""); game.override.enemyAbility(targetAbility); + + if (teraType !== undefined) { + game.override.enemyHeldItems([{ name:"TERA_SHARD", type: teraType }]); + } + const user = game.scene.addPlayerPokemon(getPokemonSpecies(Species.SNORLAX), 5); const target = game.scene.addEnemyPokemon(getPokemonSpecies(targetSpecies), 5, TrainerSlot.NONE); expect(target.getMoveEffectiveness(user, allMoves[move])).toBe(expected); + user.destroy(); + target.destroy(); } describe("Moves - Type Effectiveness", () => { @@ -29,6 +38,8 @@ describe("Moves - Type Effectiveness", () => { type: Phaser.HEADLESS, }); game = new GameManager(phaserGame); + TerastallizeModifier.prototype.apply = (args) => true; + game.override.ability(Abilities.BALL_FETCH); }); @@ -67,4 +78,30 @@ describe("Moves - Type Effectiveness", () => { it("Electric-type attacks are negated by Volt Absorb", () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.GYARADOS, 0, Abilities.VOLT_ABSORB) ); + + it("Electric-type attacks are super-effective against Tera-Water Pokemon", + () => testMoveEffectiveness(game, Moves.THUNDERBOLT, Species.EXCADRILL, 2, Abilities.BALL_FETCH, Type.WATER) + ); + + it("Powder moves have no effect on Grass-type Pokemon", + () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.AMOONGUSS, 0) + ); + + it("Powder moves have no effect on Tera-Grass Pokemon", + () => testMoveEffectiveness(game, Moves.SLEEP_POWDER, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.GRASS) + ); + + it("Prankster-boosted status moves have no effect on Dark-type Pokemon", + () => { + game.override.ability(Abilities.PRANKSTER); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.MIGHTYENA, 0); + } + ); + + it("Prankster-boosted status moves have no effect on Tera-Dark Pokemon", + () => { + game.override.ability(Abilities.PRANKSTER); + testMoveEffectiveness(game, Moves.BABY_DOLL_EYES, Species.SNORLAX, 0, Abilities.BALL_FETCH, Type.DARK); + } + ); }); From 06f98f6737ba959f2894c1dc48fbdac7e3ecf5ed Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Mon, 9 Sep 2024 11:50:47 +0800 Subject: [PATCH 02/30] [Bug] Fix console error from undefined stockpilingTag (#4118) --- src/data/move.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/move.ts b/src/data/move.ts index 19014c0eb30..e6e7f574671 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -3472,7 +3472,7 @@ export class SpitUpPowerAttr extends VariablePowerAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const stockpilingTag = user.getTag(StockpilingTag); - if (stockpilingTag !== null && stockpilingTag.stockpiledCount > 0) { + if (stockpilingTag && stockpilingTag.stockpiledCount > 0) { const power = args[0] as Utils.IntegerHolder; power.value = this.multiplier * stockpilingTag.stockpiledCount; return true; @@ -3490,7 +3490,7 @@ export class SwallowHealAttr extends HealAttr { apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { const stockpilingTag = user.getTag(StockpilingTag); - if (stockpilingTag !== null && stockpilingTag?.stockpiledCount > 0) { + if (stockpilingTag && stockpilingTag.stockpiledCount > 0) { const stockpiled = stockpilingTag.stockpiledCount; let healRatio: number; From 39b6a725175aa41b250719945dbf709768813daa Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Sun, 8 Sep 2024 22:10:47 -0700 Subject: [PATCH 03/30] [Bug] Fix #762: All Pokemon become invisible when capturing then switching with your only pokemon that was not fainted (#4025) * fix #762 by using slotIndex to add to party for now the new pokemon was ALWAYS just pushed to the party array. Now it's put into the slot that was also previously selected as the mon to release * add docs for `Pokemon.addToParty()` * add simple tests for addToParty * update `isBetween` docs. Remove `.js` imports --- src/constants.ts | 1 + src/field/pokemon.ts | 19 +++++++++++++--- src/phases/attempt-capture-phase.ts | 6 ++--- src/test/field/pokemon.test.ts | 35 +++++++++++++++++++++++++++++ src/utils.ts | 11 +++++++++ 5 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 src/constants.ts diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 00000000000..a2f7e47b996 --- /dev/null +++ b/src/constants.ts @@ -0,0 +1 @@ +export const PLAYER_PARTY_MAX_SIZE = 6; diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 6d29e30254a..e2f238e29af 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -58,6 +58,7 @@ import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { SwitchSummonPhase } from "#app/phases/switch-summon-phase"; import { ToggleDoublePositionPhase } from "#app/phases/toggle-double-position-phase"; import { Challenges } from "#enums/challenges"; +import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; export enum FieldPosition { CENTER, @@ -4465,17 +4466,29 @@ export class EnemyPokemon extends Pokemon { return BattlerIndex.ENEMY + this.getFieldIndex(); } - addToParty(pokeballType: PokeballType) { + /** + * Add a new pokemon to the player's party (at `slotIndex` if set). + * @param pokeballType the type of pokeball the pokemon was caught with + * @param slotIndex an optional index to place the pokemon in the party + * @returns the pokemon that was added or null if the pokemon could not be added + */ + addToParty(pokeballType: PokeballType, slotIndex: number = -1) { const party = this.scene.getParty(); let ret: PlayerPokemon | null = null; - if (party.length < 6) { + if (party.length < PLAYER_PARTY_MAX_SIZE) { this.pokeball = pokeballType; this.metLevel = this.level; this.metBiome = this.scene.arena.biomeType; this.metSpecies = this.species.speciesId; const newPokemon = this.scene.addPlayerPokemon(this.species, this.level, this.abilityIndex, this.formIndex, this.gender, this.shiny, this.variant, this.ivs, this.nature, this); - party.push(newPokemon); + + if (Utils.isBetween(slotIndex, 0, PLAYER_PARTY_MAX_SIZE - 1)) { + party.splice(slotIndex, 0, newPokemon); + } else { + party.push(newPokemon); + } + ret = newPokemon; this.scene.triggerPokemonFormChange(newPokemon, SpeciesFormChangeActiveTrigger, true); } diff --git a/src/phases/attempt-capture-phase.ts b/src/phases/attempt-capture-phase.ts index 55a82affaf6..cf9ce997bfd 100644 --- a/src/phases/attempt-capture-phase.ts +++ b/src/phases/attempt-capture-phase.ts @@ -221,8 +221,8 @@ export class AttemptCapturePhase extends PokemonPhase { this.scene.clearEnemyHeldItemModifiers(); this.scene.field.remove(pokemon, true); }; - const addToParty = () => { - const newPokemon = pokemon.addToParty(this.pokeballType); + const addToParty = (slotIndex?: number) => { + const newPokemon = pokemon.addToParty(this.pokeballType, slotIndex); const modifiers = this.scene.findModifiers(m => m instanceof PokemonHeldItemModifier, false); if (this.scene.getParty().filter(p => p.isShiny()).length === 6) { this.scene.validateAchv(achvs.SHINY_PARTY); @@ -253,7 +253,7 @@ export class AttemptCapturePhase extends PokemonPhase { this.scene.ui.setMode(Mode.PARTY, PartyUiMode.RELEASE, this.fieldIndex, (slotIndex: integer, _option: PartyOption) => { this.scene.ui.setMode(Mode.MESSAGE).then(() => { if (slotIndex < 6) { - addToParty(); + addToParty(slotIndex); } else { promptRelease(); } diff --git a/src/test/field/pokemon.test.ts b/src/test/field/pokemon.test.ts index d597cd5219c..f7c1cf8bc3d 100644 --- a/src/test/field/pokemon.test.ts +++ b/src/test/field/pokemon.test.ts @@ -1,6 +1,8 @@ import { Species } from "#app/enums/species"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import GameManager from "../utils/gameManager"; +import { PokeballType } from "#app/enums/pokeball"; +import BattleScene from "#app/battle-scene"; describe("Spec - Pokemon", () => { let phaserGame: Phaser.Game; @@ -28,4 +30,37 @@ describe("Spec - Pokemon", () => { expect(pkm.trySetStatus(undefined)).toBe(true); }); + + describe("Add To Party", () => { + let scene: BattleScene; + + beforeEach(async () => { + game.override.enemySpecies(Species.ZUBAT); + await game.classicMode.runToSummon([Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA, Species.ABRA]); // 5 Abra, only 1 slot left + scene = game.scene; + }); + + it("should append a new pokemon by default", async () => { + const zubat = scene.getEnemyPokemon()!; + zubat.addToParty(PokeballType.LUXURY_BALL); + + const party = scene.getParty(); + expect(party).toHaveLength(6); + party.forEach((pkm, index) =>{ + expect(pkm.species.speciesId).toBe(index === 5 ? Species.ZUBAT : Species.ABRA); + }); + }); + + it("should put a new pokemon into the passed slotIndex", async () => { + const slotIndex = 1; + const zubat = scene.getEnemyPokemon()!; + zubat.addToParty(PokeballType.LUXURY_BALL, slotIndex); + + const party = scene.getParty(); + expect(party).toHaveLength(6); + party.forEach((pkm, index) =>{ + expect(pkm.species.speciesId).toBe(index === slotIndex ? Species.ZUBAT : Species.ABRA); + }); + }); + }); }); diff --git a/src/utils.ts b/src/utils.ts index 592981c7643..7decf9bb4c0 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -609,3 +609,14 @@ export function toDmgValue(value: number, minValue: number = 1) { export function getLocalizedSpriteKey(baseKey: string) { return `${baseKey}${verifyLang(i18next.resolvedLanguage) ? `_${i18next.resolvedLanguage}` : ""}`; } + +/** + * Check if a number is **inclusive** between two numbers + * @param num the number to check + * @param min the minimum value (included) + * @param max the maximum value (included) + * @returns true if number is **inclusive** between min and max + */ +export function isBetween(num: number, min: number, max: number): boolean { + return num >= min && num <= max; +} From c710f85fd3bb133a814207fecc6bbd0f04d0ce62 Mon Sep 17 00:00:00 2001 From: innerthunder <168692175+innerthunder@users.noreply.github.com> Date: Sun, 8 Sep 2024 23:19:59 -0700 Subject: [PATCH 04/30] Fix `Pokemon.isTrapped` only checking enemy Pokemon for trapping abilities (#4124) --- src/field/pokemon.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index e2f238e29af..a1305b6b1b2 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -1324,9 +1324,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } const trappedByAbility = new Utils.BooleanHolder(false); + const opposingField = this.isPlayer() ? this.scene.getEnemyField() : this.scene.getPlayerField(); - this.scene.getEnemyField()!.forEach(enemyPokemon => - applyCheckTrappedAbAttrs(CheckTrappedAbAttr, enemyPokemon, trappedByAbility, this, trappedAbMessages, simulated) + opposingField.forEach(opponent => + applyCheckTrappedAbAttrs(CheckTrappedAbAttr, opponent, trappedByAbility, this, trappedAbMessages, simulated) ); return (trappedByAbility.value || !!this.getTag(TrappedTag)); From f5bf766ff7ed0314e98b6d12e6a238848407e0e1 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Mon, 9 Sep 2024 15:42:53 +0800 Subject: [PATCH 05/30] [Move] Fully implement Tar Shot (#4043) --- src/data/battler-tags.ts | 33 ++++++++ src/data/move.ts | 2 +- src/enums/battler-tag-type.ts | 1 + src/field/pokemon.ts | 10 ++- src/locales/en/battler-tags.json | 3 +- src/test/moves/tar_shot.test.ts | 133 +++++++++++++++++++++++++++++++ 6 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 src/test/moves/tar_shot.test.ts diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index ddb85600c18..c26412c776f 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -1984,7 +1984,38 @@ export class ExposedTag extends BattlerTag { } } +/** + * Tag that doubles the type effectiveness of Fire-type moves. + * @extends BattlerTag + */ +export class TarShotTag extends BattlerTag { + constructor() { + super(BattlerTagType.TAR_SHOT, BattlerTagLapseType.CUSTOM, 0); + } + /** + * If the Pokemon is terastallized, the tag cannot be added. + * @param {Pokemon} pokemon the {@linkcode Pokemon} to which the tag is added + * @returns whether the tag is applied + */ + override canAdd(pokemon: Pokemon): boolean { + return !pokemon.isTerastallized(); + } + + override onAdd(pokemon: Pokemon): void { + pokemon.scene.queueMessage(i18next.t("battlerTags:tarShotOnAdd", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) })); + } +} + +/** + * Retrieves a {@linkcode BattlerTag} based on the provided tag type, turn count, source move, and source ID. + * + * @param {BattlerTagType} tagType the type of the {@linkcode BattlerTagType}. + * @param turnCount the turn count. + * @param {Moves} sourceMove the source {@linkcode Moves}. + * @param sourceId the source ID. + * @returns {BattlerTag} the corresponding {@linkcode BattlerTag} object. + */ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, sourceMove: Moves, sourceId: number): BattlerTag { switch (tagType) { case BattlerTagType.RECHARGING: @@ -2125,6 +2156,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source case BattlerTagType.GULP_MISSILE_ARROKUDA: case BattlerTagType.GULP_MISSILE_PIKACHU: return new GulpMissileTag(tagType, sourceMove); + case BattlerTagType.TAR_SHOT: + return new TarShotTag(); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/move.ts b/src/data/move.ts index e6e7f574671..21b859b22ac 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -8644,7 +8644,7 @@ export function initMoves() { .condition((user, target, move) => user.getTag(TrappedTag)?.sourceMove !== Moves.NO_RETREAT), // fails if the user is currently trapped by No Retreat new StatusMove(Moves.TAR_SHOT, Type.ROCK, 100, 15, -1, 0, 8) .attr(StatStageChangeAttr, [ Stat.SPD ], -1) - .partial(), + .attr(AddBattlerTagAttr, BattlerTagType.TAR_SHOT, false), new StatusMove(Moves.MAGIC_POWDER, Type.PSYCHIC, 100, 20, -1, 0, 8) .attr(ChangeTypeAttr, Type.PSYCHIC) .powderMove(), diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index a2bcf9e4c0e..0878bd00cd5 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -73,4 +73,5 @@ export enum BattlerTagType { SHELL_TRAP = "SHELL_TRAP", DRAGON_CHEER = "DRAGON_CHEER", NO_RETREAT = "NO_RETREAT", + TAR_SHOT = "TAR_SHOT", } diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index a1305b6b1b2..01d728d6de0 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -17,7 +17,7 @@ import { initMoveAnim, loadMoveAnimAssets } from "../data/battle-anims"; import { Status, StatusEffect, getRandomStatus } from "../data/status-effect"; import { pokemonEvolutions, pokemonPrevolutions, SpeciesFormEvolution, SpeciesEvolutionCondition, FusionSpeciesFormEvolution } from "../data/pokemon-evolutions"; import { reverseCompatibleTms, tmSpecies, tmPoolTiers } from "../data/tms"; -import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag } from "../data/battler-tags"; +import { BattlerTag, BattlerTagLapseType, EncoreTag, GroundedTag, HighestStatBoostTag, TypeImmuneTag, getBattlerTag, SemiInvulnerableTag, TypeBoostTag, MoveRestrictionBattlerTag, ExposedTag, DragonCheerTag, CritBoostTag, TrappedTag, TarShotTag } from "../data/battler-tags"; import { WeatherType } from "../data/weather"; import { ArenaTagSide, NoCritTag, WeakenMoveScreenTag } from "../data/arena-tag"; import { Ability, AbAttr, StatMultiplierAbAttr, BlockCritAbAttr, BonusCritAbAttr, BypassBurnDamageReductionAbAttr, FieldPriorityMoveImmunityAbAttr, IgnoreOpponentStatStagesAbAttr, MoveImmunityAbAttr, PreDefendFullHpEndureAbAttr, ReceivedMoveDamageMultiplierAbAttr, ReduceStatusEffectDurationAbAttr, StabBoostAbAttr, StatusEffectImmunityAbAttr, TypeImmunityAbAttr, WeightMultiplierAbAttr, allAbilities, applyAbAttrs, applyStatMultiplierAbAttrs, applyPreApplyBattlerTagAbAttrs, applyPreAttackAbAttrs, applyPreDefendAbAttrs, applyPreSetStatusAbAttrs, UnsuppressableAbilityAbAttr, SuppressFieldAbilitiesAbAttr, NoFusionAbilityAbAttr, MultCritAbAttr, IgnoreTypeImmunityAbAttr, DamageBoostAbAttr, IgnoreTypeStatusEffectImmunityAbAttr, ConditionalCritAbAttr, applyFieldStatMultiplierAbAttrs, FieldMultiplyStatAbAttr, AddSecondStrikeAbAttr, UserFieldStatusEffectImmunityAbAttr, UserFieldBattlerTagImmunityAbAttr, BattlerTagImmunityAbAttr, MoveTypeChangeAbAttr, FullHpResistTypeAbAttr, applyCheckTrappedAbAttrs, CheckTrappedAbAttr } from "../data/ability"; @@ -1353,7 +1353,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { /** * Calculates the effectiveness of a move against the Pokémon. - * + * This includes modifiers from move and ability attributes. * @param source {@linkcode Pokemon} The attacking Pokémon. * @param move {@linkcode Move} The move being used by the attacking Pokémon. * @param ignoreAbility Whether to ignore abilities that might affect type effectiveness or immunity (defaults to `false`). @@ -1377,6 +1377,10 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { typeMultiplier.value = 0; } + if (this.getTag(TarShotTag) && (this.getMoveType(move) === Type.FIRE)) { + typeMultiplier.value *= 2; + } + const cancelledHolder = cancelled ?? new Utils.BooleanHolder(false); if (!ignoreAbility) { applyPreDefendAbAttrs(TypeImmunityAbAttr, this, source, move, cancelledHolder, simulated, typeMultiplier); @@ -1408,7 +1412,7 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { } /** - * Calculates the type effectiveness multiplier for an attack type + * Calculates the move's type effectiveness multiplier based on the target's type/s. * @param moveType {@linkcode Type} the type of the move being used * @param source {@linkcode Pokemon} the Pokemon using the move * @param ignoreStrongWinds whether or not this ignores strong winds (anticipation, forewarn, stealth rocks) diff --git a/src/locales/en/battler-tags.json b/src/locales/en/battler-tags.json index 222aee4087c..5c351fc6961 100644 --- a/src/locales/en/battler-tags.json +++ b/src/locales/en/battler-tags.json @@ -69,5 +69,6 @@ "cursedLapse": "{{pokemonNameWithAffix}} is afflicted by the Curse!", "stockpilingOnAdd": "{{pokemonNameWithAffix}} stockpiled {{stockpiledCount}}!", "disabledOnAdd": "{{pokemonNameWithAffix}}'s {{moveName}}\nwas disabled!", - "disabledLapse": "{{pokemonNameWithAffix}}'s {{moveName}}\nis no longer disabled." + "disabledLapse": "{{pokemonNameWithAffix}}'s {{moveName}}\nis no longer disabled.", + "tarShotOnAdd": "{{pokemonNameWithAffix}} became weaker to fire!" } diff --git a/src/test/moves/tar_shot.test.ts b/src/test/moves/tar_shot.test.ts new file mode 100644 index 00000000000..15667122a37 --- /dev/null +++ b/src/test/moves/tar_shot.test.ts @@ -0,0 +1,133 @@ +import { BattlerIndex } from "#app/battle"; +import { Type } from "#app/data/type"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Moves - Tar Shot", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 20 * 1000; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY) + .enemySpecies(Species.TANGELA) + .enemyLevel(1000) + .moveset([Moves.TAR_SHOT, Moves.FIRE_PUNCH]) + .disableCrits(); + }); + + it("lowers the target's Speed stat by one stage and doubles the effectiveness of Fire-type moves used on the target", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); + + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.TAR_SHOT); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getStatStage(Stat.SPD)).toBe(-1); + + await game.toNextTurn(); + + game.move.select(Moves.FIRE_PUNCH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); + }, TIMEOUT); + + it("will not double the effectiveness of Fire-type moves used on a target that is already under the effect of Tar Shot (but may still lower its Speed)", async () => { + await game.classicMode.startBattle([Species.PIKACHU]); + + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.TAR_SHOT); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getStatStage(Stat.SPD)).toBe(-1); + + await game.toNextTurn(); + + game.move.select(Moves.TAR_SHOT); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getStatStage(Stat.SPD)).toBe(-2); + + await game.toNextTurn(); + + game.move.select(Moves.FIRE_PUNCH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); + }, TIMEOUT); + + it("does not double the effectiveness of Fire-type moves against a Pokémon that is Terastallized", async () => { + game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]).enemySpecies(Species.SPRIGATITO); + await game.classicMode.startBattle([Species.PIKACHU]); + + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.TAR_SHOT); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getStatStage(Stat.SPD)).toBe(-1); + + await game.toNextTurn(); + + game.move.select(Moves.FIRE_PUNCH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(2); + }, TIMEOUT); + + it("doubles the effectiveness of Fire-type moves against a Pokémon that is already under the effects of Tar Shot before it Terastallized", async () => { + game.override.enemySpecies(Species.SPRIGATITO); + await game.classicMode.startBattle([Species.PIKACHU]); + + const enemy = game.scene.getEnemyPokemon()!; + + vi.spyOn(enemy, "getMoveEffectiveness"); + + game.move.select(Moves.TAR_SHOT); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.getStatStage(Stat.SPD)).toBe(-1); + + await game.toNextTurn(); + + game.override.enemyHeldItems([{ name: "TERA_SHARD", type: Type.GRASS }]); + + game.move.select(Moves.FIRE_PUNCH); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(enemy.getMoveEffectiveness).toHaveReturnedWith(4); + }, TIMEOUT); +}); From 26eb63cf67ce77fa62072033397d3f22dcf6e42b Mon Sep 17 00:00:00 2001 From: Mumble <171087428+frutescens@users.noreply.github.com> Date: Mon, 9 Sep 2024 09:11:46 -0700 Subject: [PATCH 06/30] [Refactor] Cleaning up Learn move phase (#3672) * Learn Move Phase rewrite * Typedocs * messages with confirm do not need an extra button press no more * Added Documentation * This does not work * so sad * Some updates * Eslint issues + clean up * Additions to handle learning during evolution + test fixes * some more checks * Update src/overrides.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/test/phases/learn-move-phase.test.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Added new function and updated tests * Fixed bracketing and added parameter types * Added Sketch to the conditional * Added some fixes. Weird stuff going on. * Whoops * async implementation done * Update src/phases/learn-move-phase.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Made showText=> summary a promise * adapt learn-move-phase to `async-await` * await add --------- Co-authored-by: frutescens Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/phases/learn-move-phase.ts | 198 +++++++++++++--------- src/test/phases/learn-move-phase.test.ts | 47 +++++ src/test/utils/helpers/overridesHelper.ts | 11 ++ src/test/utils/phaseInterceptor.ts | 2 + src/ui/ui.ts | 6 + 5 files changed, 186 insertions(+), 78 deletions(-) create mode 100644 src/test/phases/learn-move-phase.test.ts diff --git a/src/phases/learn-move-phase.ts b/src/phases/learn-move-phase.ts index 049fc6951b6..fad7eac9b68 100644 --- a/src/phases/learn-move-phase.ts +++ b/src/phases/learn-move-phase.ts @@ -1,6 +1,6 @@ import BattleScene from "#app/battle-scene"; import { initMoveAnim, loadMoveAnimAssets } from "#app/data/battle-anims"; -import { allMoves } from "#app/data/move"; +import Move, { allMoves } from "#app/data/move"; import { SpeciesFormChangeMoveLearnedTrigger } from "#app/data/pokemon-forms"; import { Moves } from "#app/enums/moves"; import { getPokemonNameWithAffix } from "#app/messages"; @@ -9,14 +9,15 @@ import { SummaryUiMode } from "#app/ui/summary-ui-handler"; import { Mode } from "#app/ui/ui"; import i18next from "i18next"; import { PlayerPartyMemberPokemonPhase } from "./player-party-member-pokemon-phase"; +import Pokemon from "#app/field/pokemon"; export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { private moveId: Moves; + private messageMode: Mode; private fromTM: boolean; constructor(scene: BattleScene, partyMemberIndex: integer, moveId: Moves, fromTM?: boolean) { super(scene, partyMemberIndex); - this.moveId = moveId; this.fromTM = fromTM ?? false; } @@ -26,87 +27,128 @@ export class LearnMovePhase extends PlayerPartyMemberPokemonPhase { const pokemon = this.getPokemon(); const move = allMoves[this.moveId]; + const currentMoveset = pokemon.getMoveset(); - const existingMoveIndex = pokemon.getMoveset().findIndex(m => m?.moveId === move.id); - - if (existingMoveIndex > -1) { + // The game first checks if the Pokemon already has the move and ends the phase if it does. + const hasMoveAlready = currentMoveset.some(m => m?.moveId === move.id) && this.moveId !== Moves.SKETCH; + if (hasMoveAlready) { return this.end(); } - const emptyMoveIndex = pokemon.getMoveset().length < 4 - ? pokemon.getMoveset().length - : pokemon.getMoveset().findIndex(m => m === null); - - const messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler - ? Mode.EVOLUTION_SCENE - : Mode.MESSAGE; - - if (emptyMoveIndex > -1) { - pokemon.setMove(emptyMoveIndex, this.moveId); - if (this.fromTM) { - pokemon.usedTMs.push(this.moveId); - } - initMoveAnim(this.scene, this.moveId).then(() => { - loadMoveAnimAssets(this.scene, [this.moveId], true) - .then(() => { - this.scene.ui.setMode(messageMode).then(() => { - // Sound loaded into game as is - this.scene.playSound("level_up_fanfare"); - this.scene.ui.showText(i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => { - this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); - this.end(); - }, messageMode === Mode.EVOLUTION_SCENE ? 1000 : null, true); - }); - }); - }); + this.messageMode = this.scene.ui.getHandler() instanceof EvolutionSceneHandler ? Mode.EVOLUTION_SCENE : Mode.MESSAGE; + this.scene.ui.setMode(this.messageMode); + // If the Pokemon has less than 4 moves, the new move is added to the largest empty moveset index + // If it has 4 moves, the phase then checks if the player wants to replace the move itself. + if (currentMoveset.length < 4) { + this.learnMove(currentMoveset.length, move, pokemon); } else { - this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }), null, () => { - const noHandler = () => { - this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), null, () => { - this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { - this.scene.ui.setMode(messageMode); - this.scene.ui.showText(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), null, () => this.end(), null, true); - }, () => { - this.scene.ui.setMode(messageMode); - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); - this.end(); - }); - }); - }); - }; - this.scene.ui.setModeWithoutClear(Mode.CONFIRM, () => { - this.scene.ui.setMode(messageMode); - this.scene.ui.showText(i18next.t("battle:learnMoveForgetQuestion"), null, () => { - this.scene.ui.setModeWithoutClear(Mode.SUMMARY, this.getPokemon(), SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => { - if (moveIndex === 4) { - noHandler(); - return; - } - this.scene.ui.setMode(messageMode).then(() => { - this.scene.ui.showText(i18next.t("battle:countdownPoof"), null, () => { - this.scene.ui.showText(i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() }), null, () => { // TODO: is the bang correct? - this.scene.ui.showText(i18next.t("battle:learnMoveAnd"), null, () => { - if (this.fromTM) { - pokemon.usedTMs.push(this.moveId); - } - pokemon.setMove(moveIndex, Moves.NONE); - this.scene.unshiftPhase(new LearnMovePhase(this.scene, this.partyMemberIndex, this.moveId)); - this.end(); - }, null, true); - }, null, true); - }, null, true); - }); - }); - }, null, true); - }, noHandler); - }); - }, null, true); - }, null, true); - }); + this.replaceMoveCheck(move, pokemon); } } + + /** + * This displays a chain of messages (listed below) and asks if the user wishes to forget a move. + * + * > [Pokemon] wants to learn the move [MoveName] + * > However, [Pokemon] already knows four moves. + * > Should a move be forgotten and replaced with [MoveName]? --> `Mode.CONFIRM` -> Yes: Go to `this.forgetMoveProcess()`, No: Go to `this.rejectMoveAndEnd()` + * @param move The Move to be learned + * @param Pokemon The Pokemon learning the move + */ + async replaceMoveCheck(move: Move, pokemon: Pokemon) { + const learnMovePrompt = i18next.t("battle:learnMovePrompt", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }); + const moveLimitReached = i18next.t("battle:learnMoveLimitReached", { pokemonName: getPokemonNameWithAffix(pokemon) }); + const shouldReplaceQ = i18next.t("battle:learnMoveReplaceQuestion", { moveName: move.name }); + const preQText = [learnMovePrompt, moveLimitReached].join("$"); + await this.scene.ui.showTextPromise(preQText); + await this.scene.ui.showTextPromise(shouldReplaceQ, undefined, false); + await this.scene.ui.setModeWithoutClear(Mode.CONFIRM, + () => this.forgetMoveProcess(move, pokemon), // Yes + () => { // No + this.scene.ui.setMode(this.messageMode); + this.rejectMoveAndEnd(move, pokemon); + } + ); + } + + /** + * This facilitates the process in which an old move is chosen to be forgotten. + * + * > Which move should be forgotten? + * + * The game then goes `Mode.SUMMARY` to select a move to be forgotten. + * If a player does not select a move or chooses the new move (`moveIndex === 4`), the game goes to `this.rejectMoveAndEnd()`. + * If an old move is selected, the function then passes the `moveIndex` to `this.learnMove()` + * @param move The Move to be learned + * @param Pokemon The Pokemon learning the move + */ + async forgetMoveProcess(move: Move, pokemon: Pokemon) { + this.scene.ui.setMode(this.messageMode); + await this.scene.ui.showTextPromise(i18next.t("battle:learnMoveForgetQuestion"), undefined, true); + await this.scene.ui.setModeWithoutClear(Mode.SUMMARY, pokemon, SummaryUiMode.LEARN_MOVE, move, (moveIndex: integer) => { + if (moveIndex === 4) { + this.scene.ui.setMode(this.messageMode).then(() => this.rejectMoveAndEnd(move, pokemon)); + return; + } + const forgetSuccessText = i18next.t("battle:learnMoveForgetSuccess", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: pokemon.moveset[moveIndex]!.getName() }); + const fullText = [i18next.t("battle:countdownPoof"), forgetSuccessText, i18next.t("battle:learnMoveAnd")].join("$"); + this.scene.ui.setMode(this.messageMode).then(() => this.learnMove(moveIndex, move, pokemon, fullText)); + }); + } + + /** + * This asks the player if they wish to end the current move learning process. + * + * > Stop trying to teach [MoveName]? --> `Mode.CONFIRM` --> Yes: > [Pokemon] did not learn the move [MoveName], No: `this.replaceMoveCheck()` + * + * If the player wishes to not teach the Pokemon the move, it displays a message and ends the phase. + * If the player reconsiders, it repeats the process for a Pokemon with a full moveset once again. + * @param move The Move to be learned + * @param Pokemon The Pokemon learning the move + */ + async rejectMoveAndEnd(move: Move, pokemon: Pokemon) { + await this.scene.ui.showTextPromise(i18next.t("battle:learnMoveStopTeaching", { moveName: move.name }), undefined, false); + this.scene.ui.setModeWithoutClear(Mode.CONFIRM, + () => { + this.scene.ui.setMode(this.messageMode); + this.scene.ui.showTextPromise(i18next.t("battle:learnMoveNotLearned", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }), undefined, true).then(() => this.end()); + }, + () => { + this.scene.ui.setMode(this.messageMode); + this.replaceMoveCheck(move, pokemon); + } + ); + } + + /** + * This teaches the Pokemon the new move and ends the phase. + * When a Pokemon forgets a move and learns a new one, its 'Learn Move' message is significantly longer. + * + * Pokemon with a `moveset.length < 4` + * > [Pokemon] learned [MoveName] + * + * Pokemon with a `moveset.length > 4` + * > 1... 2... and 3... and Poof! + * > [Pokemon] forgot how to use [MoveName] + * > And... + * > [Pokemon] learned [MoveName]! + * @param move The Move to be learned + * @param Pokemon The Pokemon learning the move + */ + async learnMove(index: number, move: Move, pokemon: Pokemon, textMessage?: string) { + if (this.fromTM) { + pokemon.usedTMs.push(this.moveId); + } + pokemon.setMove(index, this.moveId); + initMoveAnim(this.scene, this.moveId).then(() => { + loadMoveAnimAssets(this.scene, [this.moveId], true); + this.scene.playSound("level_up_fanfare"); // Sound loaded into game as is + }); + this.scene.ui.setMode(this.messageMode); + const learnMoveText = i18next.t("battle:learnMove", { pokemonName: getPokemonNameWithAffix(pokemon), moveName: move.name }); + textMessage = textMessage ? textMessage+"$"+learnMoveText : learnMoveText; + await this.scene.ui.showTextPromise(textMessage, this.messageMode === Mode.EVOLUTION_SCENE ? 1000 : undefined, true); + this.scene.triggerPokemonFormChange(pokemon, SpeciesFormChangeMoveLearnedTrigger, true); + this.end(); + } } diff --git a/src/test/phases/learn-move-phase.test.ts b/src/test/phases/learn-move-phase.test.ts new file mode 100644 index 00000000000..60cdbee8570 --- /dev/null +++ b/src/test/phases/learn-move-phase.test.ts @@ -0,0 +1,47 @@ +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import Phaser from "phaser"; +import GameManager from "#test/utils/gameManager"; +import { Species } from "#enums/species"; +import { Moves } from "#enums/moves"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; + +describe("Learn Move Phase", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override.xpMultiplier(50); + }); + + it("If Pokemon has less than 4 moves, its newest move will be added to the lowest empty index", async () => { + game.override.moveset([Moves.SPLASH]); + await game.startBattle([Species.BULBASAUR]); + const pokemon = game.scene.getPlayerPokemon()!; + const newMovePos = pokemon?.getMoveset().length; + game.move.select(Moves.SPLASH); + await game.doKillOpponents(); + await game.phaseInterceptor.to(LearnMovePhase); + const levelMove = pokemon.getLevelMoves(5)[0]; + const levelReq = levelMove[0]; + const levelMoveId = levelMove[1]; + expect(pokemon.level).toBeGreaterThanOrEqual(levelReq); + expect(pokemon?.getMoveset()[newMovePos]?.moveId).toBe(levelMoveId); + }); + + /** + * Future Tests: + * If a Pokemon has four moves, the user can specify an old move to be forgotten and a new move will take its place. + * If a Pokemon has four moves, the user can reject the new move, keeping the moveset the same. + */ +}); diff --git a/src/test/utils/helpers/overridesHelper.ts b/src/test/utils/helpers/overridesHelper.ts index a42ef84b496..3eeeecbc5f8 100644 --- a/src/test/utils/helpers/overridesHelper.ts +++ b/src/test/utils/helpers/overridesHelper.ts @@ -48,6 +48,17 @@ export class OverridesHelper extends GameManagerHelper { return this; } + /** + * Override the XP Multiplier + * @param value the XP multiplier to set + * @returns `this` + */ + xpMultiplier(value: number): this { + vi.spyOn(Overrides, "XP_MULTIPLIER_OVERRIDE", "get").mockReturnValue(value); + this.log(`XP Multiplier set to ${value}!`); + return this; + } + /** * Override the player (pokemon) starting held items * @param items the items to hold diff --git a/src/test/utils/phaseInterceptor.ts b/src/test/utils/phaseInterceptor.ts index 2eb5324a2aa..a89d1788be9 100644 --- a/src/test/utils/phaseInterceptor.ts +++ b/src/test/utils/phaseInterceptor.ts @@ -12,6 +12,7 @@ import { EndEvolutionPhase } from "#app/phases/end-evolution-phase"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { EvolutionPhase } from "#app/phases/evolution-phase"; import { FaintPhase } from "#app/phases/faint-phase"; +import { LearnMovePhase } from "#app/phases/learn-move-phase"; import { LevelCapPhase } from "#app/phases/level-cap-phase"; import { LoginPhase } from "#app/phases/login-phase"; import { MessagePhase } from "#app/phases/message-phase"; @@ -89,6 +90,7 @@ export default class PhaseInterceptor { [NextEncounterPhase, this.startPhase], [NewBattlePhase, this.startPhase], [VictoryPhase, this.startPhase], + [LearnMovePhase, this.startPhase], [MoveEndPhase, this.startPhase], [StatStageChangePhase, this.startPhase], [ShinySparklePhase, this.startPhase], diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 6c988b43043..a9bcbbf0cb5 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -289,6 +289,12 @@ export default class UI extends Phaser.GameObjects.Container { return handler.processInput(button); } + showTextPromise(text: string, callbackDelay: number = 0, prompt: boolean = true, promptDelay?: integer | null): Promise { + return new Promise(resolve => { + this.showText(text ?? "", null, () => resolve(), callbackDelay, prompt, promptDelay); + }); + } + showText(text: string, delay?: integer | null, callback?: Function | null, callbackDelay?: integer | null, prompt?: boolean | null, promptDelay?: integer | null): void { if (prompt && text.indexOf("$") > -1) { const messagePages = text.split(/\$/g).map(m => m.trim()); From e84fe8c24e75bf7d0af92f08ed55dab1df8770f9 Mon Sep 17 00:00:00 2001 From: Chapybara-jp Date: Mon, 9 Sep 2024 18:50:30 +0200 Subject: [PATCH 07/30] [Localisation] [JA] Translated/updated spacing in several files, fixed Ice Face bug (#4129) * Update ability-trigger.json * Update ability.json * Update arena-flyout.json * Update arena-tag.json * Update battle.json * Update fight-ui-handler.json * Update berry.json * Update menu.json * Update party-ui-handler.json * Update starter-select-ui-handler.json * Update tutorial.json * Update move.json * Update battle.json * Update arena-flyout.json * Update arena-flyout.json * Update arena-tag.json * Update party-ui-handler.json * Update settings.json --- src/locales/ja/ability-trigger.json | 4 +- src/locales/ja/ability.json | 620 +++--- src/locales/ja/arena-flyout.json | 3 +- src/locales/ja/arena-tag.json | 10 +- src/locales/ja/battle.json | 5 +- src/locales/ja/berry.json | 22 +- src/locales/ja/fight-ui-handler.json | 2 +- src/locales/ja/menu.json | 6 +- src/locales/ja/move.json | 1872 ++++++++--------- src/locales/ja/party-ui-handler.json | 41 +- src/locales/ja/settings.json | 2 +- src/locales/ja/starter-select-ui-handler.json | 2 +- src/locales/ja/tutorial.json | 18 +- 13 files changed, 1327 insertions(+), 1280 deletions(-) diff --git a/src/locales/ja/ability-trigger.json b/src/locales/ja/ability-trigger.json index 1b30e52c490..26d27701aef 100644 --- a/src/locales/ja/ability-trigger.json +++ b/src/locales/ja/ability-trigger.json @@ -2,11 +2,11 @@ "blockRecoilDamage": "{{pokemonName}}は {{abilityName}}で 反動ダメージを 受けない!", "badDreams": "{{pokemonName}}は ナイトメアに うなされている!", "costar": "{{pokemonName}}は {{allyName}}の\n能力変化を コピーした!", - "iceFaceAvoidedDamage": "{{pokemonName}}は\n{{abilityName}}で ダメージを 受けない!", + "iceFaceAvoidedDamage": "{{pokemonNameWithAffix}}は\n{{abilityName}}で ダメージを 受けない!", "perishBody": "{{pokemonName}}の {{abilityName}}で\nおたがいは 3ターン後に ほろびいてしまう!", "poisonHeal": "{{pokemonName}}は {{abilityName}}で 回復した!", "trace": "{{pokemonName}}は 相手の {{targetName}}の\n{{abilityName}}を トレースした!", - "windPowerCharged": "{{pokemonName}}は\n{{moveName}}を 受けて じゅうでんした!", + "windPowerCharged": "{{pokemonNameWithAffix}}は\n{{moveName}}を 受けて じゅうでんした!", "quickDraw": "{{pokemonName}}は クイックドロウで\n行動が はやくなった!", "disguiseAvoidedDamage": "{{pokemonNameWithAffix}}の\nばけのかわが はがれた!", "blockItemTheft": "{{pokemonNameWithAffix}}の {{abilityName}}で\n道具を うばわれない!", diff --git a/src/locales/ja/ability.json b/src/locales/ja/ability.json index bfbf5d3a3c8..c44eeb06234 100644 --- a/src/locales/ja/ability.json +++ b/src/locales/ja/ability.json @@ -1,1071 +1,1071 @@ { "stench": { "name": "あくしゅう", - "description": "臭い においを 放つことによって 攻撃した ときに 相手を ひるませることが ある。" + "description": "臭い においを 放つことによって 攻撃した ときに 相手を ひるませることが ある。" }, "drizzle": { "name": "あめふらし", - "description": "登場 したときに 天気を 雨に する。" + "description": "登場 したときに 天気を 雨に する。" }, "speedBoost": { "name": "かそく", - "description": "毎ターン 素早さが 上がる。" + "description": "毎ターン 素早さが 上がる。" }, "battleArmor": { "name": "カブトアーマー", - "description": "硬い 甲羅に 守られて 相手の 攻撃が 急所に 当たらない。" + "description": "硬い 甲羅に 守られて 相手の 攻撃が 急所に 当たらない。" }, "sturdy": { "name": "がんじょう", - "description": "相手の 技を 受けても 一撃で 倒されることが ない。 一撃必殺技も 効かない。" + "description": "相手の 技を 受けても 一撃で 倒されることが ない。 一撃必殺技も 効かない。" }, "damp": { "name": "しめりけ", - "description": "あたりを 湿らせることに よって じばく などの 爆発する 技を だれも 使えなくなる。" + "description": "あたりを 湿らせることに よって じばく などの 爆発する 技を だれも 使えなくなる。" }, "limber": { "name": "じゅうなん", - "description": "柔軟な 体によって まひ状態に ならない。" + "description": "柔軟な 体によって まひ状態に ならない。" }, "sandVeil": { "name": "すながくれ", - "description": "砂あらしの とき 回避率が 上がる。" + "description": "砂あらしの とき 回避率が 上がる。" }, "static": { "name": "せいでんき", - "description": "静電気を 体に まとい 触った 相手を まひさせる ことがある。" + "description": "静電気を 体に まとい 触った 相手を まひさせる ことがある。" }, "voltAbsorb": { "name": "ちくでん", - "description": "でんきタイプの 技を 受けると ダメージを 受けずに 回復する。" + "description": "でんきタイプの 技を 受けると ダメージを 受けずに 回復する。" }, "waterAbsorb": { "name": "ちょすい", - "description": "みずタイプの 技を 受けると ダメージを 受けずに 回復する。" + "description": "みずタイプの 技を 受けると ダメージを 受けずに 回復する。" }, "oblivious": { "name": "どんかん", - "description": "鈍感なので メロメロや ちょうはつ状態に ならない。" + "description": "鈍感なので メロメロや ちょうはつ状態に ならない。" }, "cloudNine": { "name": "ノーてんき", - "description": "あらゆる 天気の 影響が なくなって しまう。" + "description": "あらゆる 天気の 影響が なくなって しまう。" }, "compoundEyes": { "name": "ふくがん", - "description": "複眼を 持っているため 技の 命中率が 上がる。" + "description": "複眼を 持っているため 技の 命中率が 上がる。" }, "insomnia": { "name": "ふみん", - "description": "眠れない 体質 なので ねむり状態に ならない。" + "description": "眠れない 体質 なので ねむり状態に ならない。" }, "colorChange": { "name": "へんしょく", - "description": "相手から 受けた 技の タイプに 自分の タイプが 変化 する。" + "description": "相手から 受けた 技の タイプに 自分の タイプが 変化 する。" }, "immunity": { "name": "めんえき", - "description": "体内に 免疫を 持っているため どく状態に ならない。" + "description": "体内に 免疫を 持っているため どく状態に ならない。" }, "flashFire": { "name": "もらいび", - "description": "ほのおタイプの 技を 受けると 炎を もらい 自分が 出す ほのおタイプの 技が 強くなる。" + "description": "ほのおタイプの 技を 受けると 炎を もらい 自分が 出す ほのおタイプの 技が 強くなる。" }, "shieldDust": { "name": "りんぷん", - "description": "りんぷんに 守られて 技の 追加効果を 受けなくなる。" + "description": "りんぷんに 守られて 技の 追加効果を 受けなくなる。" }, "ownTempo": { "name": "マイペース", - "description": "マイペースなので こんらん状態に ならない。" + "description": "マイペースなので こんらん状態に ならない。" }, "suctionCups": { "name": "きゅうばん", - "description": "吸盤で 地面に 張り付き ポケモンを 入れ替えさせる 技や 道具が 効かなくなる。" + "description": "吸盤で 地面に 張り付き ポケモンを 入れ替えさせる 技や 道具が 効かなくなる。" }, "intimidate": { "name": "いかく", - "description": "登場 したとき 威嚇して 相手を 萎縮させ 相手の 攻撃を 下げて しまう。" + "description": "登場 したとき 威嚇して 相手を 萎縮させ 相手の 攻撃を 下げて しまう。" }, "shadowTag": { "name": "かげふみ", - "description": "相手の 影を 踏み 逃げたり 交代 できなくする。" + "description": "相手の 影を 踏み 逃げたり 交代 できなくする。" }, "roughSkin": { "name": "さめはだ", - "description": "攻撃を 受けたとき 自分に 触れた 相手を ざらざらの 肌で キズつける。" + "description": "攻撃を 受けたとき 自分に 触れた 相手を ざらざらの 肌で キズつける。" }, "wonderGuard": { "name": "ふしぎなまもり", - "description": "効果バツグンの 技しか 当たらない 不思議な 力。" + "description": "効果バツグンの 技しか 当たらない 不思議な 力。" }, "levitate": { "name": "ふゆう", - "description": "地面から 浮くことによって じめんタイプの 技を 受けない。" + "description": "地面から 浮くことによって じめんタイプの 技を 受けない。" }, "effectSpore": { "name": "ほうし", - "description": "攻撃で 自分に 触れた 相手を どくや まひや ねむり状態に する ことがある。" + "description": "攻撃で 自分に 触れた 相手を どくや まひや ねむり状態に する ことがある。" }, "synchronize": { "name": "シンクロ", - "description": "自分が なってしまった どくや まひや やけどを 相手に うつす。" + "description": "自分が なってしまった どくや まひや やけどを 相手に うつす。" }, "clearBody": { "name": "クリアボディ", - "description": "相手の 技や 特性で 能力を 下げられない。" + "description": "相手の 技や 特性で 能力を 下げられない。" }, "naturalCure": { "name": "しぜんかいふく", - "description": "手持ちに ひっこむと 状態異常が 治る。" + "description": "手持ちに ひっこむと 状態異常が 治る。" }, "lightningRod": { "name": "ひらいしん", - "description": "でんきタイプの 技を 自分に 寄せつけ ダメージを 受けずに 特攻が 上がる。" + "description": "でんきタイプの 技を 自分に 寄せつけ ダメージを 受けずに 特攻が 上がる。" }, "sereneGrace": { "name": "てんのめぐみ", - "description": "天の恵みの おかげで 技の 追加効果が でやすい。" + "description": "天の恵みの おかげで 技の 追加効果が でやすい。" }, "swiftSwim": { "name": "すいすい", - "description": "天気が 雨のとき 素早さが 上がる。" + "description": "天気が 雨のとき 素早さが 上がる。" }, "chlorophyll": { "name": "ようりょくそ", - "description": "天気が 晴れのとき 素早さが 上がる。" + "description": "天気が 晴れのとき 素早さが 上がる。" }, "illuminate": { "name": "はっこう", - "description": "あたりを 明るくすることで 命中率を 下げられない。" + "description": "あたりを 明るくすることで 命中率を 下げられない。" }, "trace": { "name": "トレース", - "description": "登場 したとき 相手の 特性を トレースして 同じ 特性に なる。" + "description": "登場 したとき 相手の 特性を トレースして 同じ 特性に なる。" }, "hugePower": { "name": "ちからもち", - "description": "物理攻撃の 威力が 2倍になる。" + "description": "物理攻撃の 威力が 2倍になる。" }, "poisonPoint": { "name": "どくのトゲ", - "description": "自分に 触った 相手を どく状態に することがある。" + "description": "自分に 触った 相手を どく状態に することがある。" }, "innerFocus": { "name": "せいしんりょく", - "description": "鍛えられた 精神に よって 相手の 攻撃に ひるまない。" + "description": "鍛えられた 精神に よって 相手の 攻撃に ひるまない。" }, "magmaArmor": { "name": "マグマのよろい", - "description": "熱い マグマを 身にまとい こおり状態に ならない。" + "description": "熱い マグマを 身にまとい こおり状態に ならない。" }, "waterVeil": { "name": "みずのベール", - "description": "水のベールを 身にまとい やけど状態に ならない。" + "description": "水のベールを 身にまとい やけど状態に ならない。" }, "magnetPull": { "name": "じりょく", - "description": "はがねタイプの ポケモンを 磁力で 引きつけて 逃げられなくする。" + "description": "はがねタイプの ポケモンを 磁力で 引きつけて 逃げられなくする。" }, "soundproof": { "name": "ぼうおん", - "description": "音を 遮断 することに よって 音の 攻撃を 受けない。" + "description": "音を 遮断 することに よって 音の 攻撃を 受けない。" }, "rainDish": { "name": "あめうけざら", - "description": "天気が 雨のとき 少しずつ HPを 回復する。" + "description": "天気が 雨のとき 少しずつ HPを 回復する。" }, "sandStream": { "name": "すなおこし", - "description": "登場 したとき 天気を 砂あらしにする。" + "description": "登場 したとき 天気を 砂あらしにする。" }, "pressure": { "name": "プレッシャー", - "description": "プレッシャーを あたえて 相手の 使う 技の PPを 多く 減らす。" + "description": "プレッシャーを あたえて 相手の 使う 技の PPを 多く 減らす。" }, "thickFat": { "name": "あついしぼう", - "description": "厚い 脂肪で 守られているので ほのおタイプと こおりタイプの 技の ダメージを 半減させる。" + "description": "厚い 脂肪で 守られているので ほのおタイプと こおりタイプの 技の ダメージを 半減させる。" }, "earlyBird": { "name": "はやおき", - "description": "ねむり状態に なっても 2倍の 早さで 目覚める ことが できる。" + "description": "ねむり状態に なっても 2倍の 早さで 目覚める ことが できる。" }, "flameBody": { "name": "ほのおのからだ", - "description": "自分に 触った 相手を やけど状態に する ことがある。" + "description": "自分に 触った 相手を やけど状態に する ことがある。" }, "runAway": { "name": "にげあし", - "description": "野生の ポケモンから 必ず 逃げられる。" + "description": "野生の ポケモンから 必ず 逃げられる。" }, "keenEye": { "name": "するどいめ", - "description": "鋭い 目の おかげで 命中率を 下げられない。" + "description": "鋭い 目の おかげで 命中率を 下げられない。" }, "hyperCutter": { "name": "かいりきバサミ", - "description": "力自慢の ハサミを 持っているので 相手に 攻撃を 下げられない。" + "description": "力自慢の ハサミを 持っているので 相手に 攻撃を 下げられない。" }, "pickup": { "name": "ものひろい", - "description": "戦闘が 終わったとき 相手の 持った 道具を 一つ 拾ってくることが ある。" + "description": "戦闘が 終わったとき 相手の 持った 道具を 一つ 拾ってくることが ある。" }, "truant": { "name": "なまけ", - "description": "技を 出すと 次の ターンは 休んでしまう。" + "description": "技を 出すと 次の ターンは 休んでしまう。" }, "hustle": { "name": "はりきり", - "description": "自分の 攻撃が 高くなるが 命中率が 下がる。" + "description": "自分の 攻撃が 高くなるが 命中率が 下がる。" }, "cuteCharm": { "name": "メロメロボディ", - "description": "自分に 触った 相手を メロメロに することが ある。" + "description": "自分に 触った 相手を メロメロに することが ある。" }, "plus": { "name": "プラス", - "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。" + "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。" }, "minus": { "name": "マイナス", - "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。" + "description": "プラスか マイナスの 特性を 持つ ポケモンが 仲間に いると 自分の 特攻が 上がる。" }, "forecast": { "name": "てんきや", - "description": "天気の 影響を 受けて みずタイプ ほのおタイプ こおりタイプの どれかに 変化する。" + "description": "天気の 影響を 受けて みずタイプ ほのおタイプ こおりタイプの どれかに 変化する。" }, "stickyHold": { "name": "ねんちゃく", - "description": "粘着質の 体に 道具が くっついているため 相手に 道具を 奪われない。" + "description": "粘着質の 体に 道具が くっついているため 相手に 道具を 奪われない。" }, "shedSkin": { "name": "だっぴ", - "description": "体の 皮を 脱ぎ捨てることで 状態異常を 治すことが ある。" + "description": "体の 皮を 脱ぎ捨てることで 状態異常を 治すことが ある。" }, "guts": { "name": "こんじょう", - "description": "状態異常に なると 根性を だして 攻撃が 上がる。" + "description": "状態異常に なると 根性を だして 攻撃が 上がる。" }, "marvelScale": { "name": "ふしぎなうろこ", - "description": "状態異常に なると 不思議なウロコが 反応して 防御が 上がる。" + "description": "状態異常に なると 不思議なウロコが 反応して 防御が 上がる。" }, "liquidOoze": { "name": "ヘドロえき", - "description": "ヘドロ液を 吸い取った 相手は 強烈な 悪臭で ダメージを 受けて HPを 減らす。" + "description": "ヘドロ液を 吸い取った 相手は 強烈な 悪臭で ダメージを 受けて HPを 減らす。" }, "overgrow": { "name": "しんりょく", - "description": "HPが 減ったとき くさタイプの 技の 威力が 上がる。" + "description": "HPが 減ったとき くさタイプの 技の 威力が 上がる。" }, "blaze": { "name": "もうか", - "description": "HPが 減ったとき ほのおタイプの 技の 威力が 上がる。" + "description": "HPが 減ったとき ほのおタイプの 技の 威力が 上がる。" }, "torrent": { "name": "げきりゅう", - "description": "HPが 減ったとき みずタイプの 技の 威力が 上がる。" + "description": "HPが 減ったとき みずタイプの 技の 威力が 上がる。" }, "swarm": { "name": "むしのしらせ", - "description": "HPが 減ったとき むしタイプの 技の 威力が 上がる。" + "description": "HPが 減ったとき むしタイプの 技の 威力が 上がる。" }, "rockHead": { "name": "いしあたま", - "description": "反動を 受ける 技を 出しても HPが 減らない。" + "description": "反動を 受ける 技を 出しても HPが 減らない。" }, "drought": { "name": "ひでり", - "description": "登場 したときに 天気を 晴れに する。" + "description": "登場 したときに 天気を 晴れに する。" }, "arenaTrap": { "name": "ありじごく", - "description": "戦闘で 相手を 逃げられなくする。" + "description": "戦闘で 相手を 逃げられなくする。" }, "vitalSpirit": { "name": "やるき", - "description": "やる気を だすことに よって ねむり状態に ならない。" + "description": "やる気を だすことに よって ねむり状態に ならない。" }, "whiteSmoke": { "name": "しろいけむり", - "description": "白い煙に 守られて 相手に 能力を 下げられない。" + "description": "白い煙に 守られて 相手に 能力を 下げられない。" }, "purePower": { "name": "ヨガパワー", - "description": "ヨガの 力で 物理攻撃の 威力が 2倍に なる。" + "description": "ヨガの 力で 物理攻撃の 威力が 2倍に なる。" }, "shellArmor": { "name": "シェルアーマー", - "description": "硬い 殻に 守られ 相手の 攻撃が 急所に 当たらない。" + "description": "硬い 殻に 守られ 相手の 攻撃が 急所に 当たらない。" }, "airLock": { "name": "エアロック", - "description": "あらゆる 天気の 影響が なくなって しまう。" + "description": "あらゆる 天気の 影響が なくなって しまう。" }, "tangledFeet": { "name": "ちどりあし", - "description": "こんらん状態の ときは 回避率が アップする。" + "description": "こんらん状態の ときは 回避率が アップする。" }, "motorDrive": { "name": "でんきエンジン", - "description": "でんきタイプの 技を 受けると ダメージを 受けずに 素早さが 上がる。" + "description": "でんきタイプの 技を 受けると ダメージを 受けずに 素早さが 上がる。" }, "rivalry": { "name": "とうそうしん", - "description": "性別が 同じだと 闘争心を 燃やして 強くなる。 性別が 違うと 弱くなる。" + "description": "性別が 同じだと 闘争心を 燃やして 強くなる。 性別が 違うと 弱くなる。" }, "steadfast": { "name": "ふくつのこころ", - "description": "ひるむ たびに 不屈の心を 燃やして 素早さが 上がる。" + "description": "ひるむ たびに 不屈の心を 燃やして 素早さが 上がる。" }, "snowCloak": { "name": "ゆきがくれ", - "description": "天気が ゆきのとき 回避率が 上がる。" + "description": "天気が ゆきのとき 回避率が 上がる。" }, "gluttony": { "name": "くいしんぼう", - "description": "HPが 少なくなったら 食べる きのみを HP 半分の 時に 食べてしまう。" + "description": "HPが 少なくなったら 食べる きのみを HP 半分の 時に 食べてしまう。" }, "angerPoint": { "name": "いかりのつぼ", - "description": "急所に 攻撃が 当たると 怒りくるって 攻撃力が 最大に なる。" + "description": "急所に 攻撃が 当たると 怒りくるって 攻撃力が 最大に なる。" }, "unburden": { "name": "かるわざ", - "description": "持っていた 道具が なくなると 素早さが 上がる。" + "description": "持っていた 道具が なくなると 素早さが 上がる。" }, "heatproof": { "name": "たいねつ", - "description": "耐熱の 体に よって ほのおタイプの 技の 威力を 半減させる。" + "description": "耐熱の 体に よって ほのおタイプの 技の 威力を 半減させる。" }, "simple": { "name": "たんじゅん", - "description": "能力 変化が いつもの 2倍に なる。" + "description": "能力 変化が いつもの 2倍に なる。" }, "drySkin": { "name": "かんそうはだ", - "description": "天気が 雨の時や みずタイプの 技で HPが 回復し はれの時や ほのおタイプの 技で 減ってしまう。" + "description": "天気が 雨の時や みずタイプの 技で HPが 回復し はれの時や ほのおタイプの 技で 減ってしまう。" }, "download": { "name": "ダウンロード", - "description": "相手の 防御と 特防を くらべて 低い ほうの 能力に あわせて 自分の 攻撃か 特攻を 上げる。" + "description": "相手の 防御と 特防を くらべて 低い ほうの 能力に あわせて 自分の 攻撃か 特攻を 上げる。" }, "ironFist": { "name": "てつのこぶし", - "description": "パンチを 使う 技の 威力が 上がる。" + "description": "パンチを 使う 技の 威力が 上がる。" }, "poisonHeal": { "name": "ポイズンヒール", - "description": "どく状態に なると HPが 減らずに 増えていく。" + "description": "どく状態に なると HPが 減らずに 増えていく。" }, "adaptability": { "name": "てきおうりょく", - "description": "自分と おなじ タイプの 技の 威力が 上がる。" + "description": "自分と おなじ タイプの 技の 威力が 上がる。" }, "skillLink": { "name": "スキルリンク", - "description": "連続技を 使うと いつも 最高回数 出すことが できる。" + "description": "連続技を 使うと いつも 最高回数 出すことが できる。" }, "hydration": { "name": "うるおいボディ", - "description": "天気が 雨のとき 状態異常が 治る。" + "description": "天気が 雨のとき 状態異常が 治る。" }, "solarPower": { "name": "サンパワー", - "description": "天気が 晴れると 特攻が 上がるが 毎ターン HPが 減る。" + "description": "天気が 晴れると 特攻が 上がるが 毎ターン HPが 減る。" }, "quickFeet": { "name": "はやあし", - "description": "状態異常に なると 素早さが 上がる。" + "description": "状態異常に なると 素早さが 上がる。" }, "normalize": { "name": "ノーマルスキン", - "description": "どんな タイプの 技でも すべて ノーマルタイプに なる。 威力が 少し 上がる。" + "description": "どんな タイプの 技でも すべて ノーマルタイプに なる。 威力が 少し 上がる。" }, "sniper": { "name": "スナイパー", - "description": "攻撃を 急所に 当てると 威力が さらに 上がる。" + "description": "攻撃を 急所に 当てると 威力が さらに 上がる。" }, "magicGuard": { "name": "マジックガード", - "description": "攻撃 以外では ダメージを 受けない。" + "description": "攻撃 以外では ダメージを 受けない。" }, "noGuard": { "name": "ノーガード", - "description": "ノーガード戦法に よって お互いの 出す 技が かならず 当たる ようになる。" + "description": "ノーガード戦法に よって お互いの 出す 技が かならず 当たる ようになる。" }, "stall": { "name": "あとだし", - "description": "技を 出す 順番が かならず 最後に なる。" + "description": "技を 出す 順番が かならず 最後に なる。" }, "technician": { "name": "テクニシャン", - "description": "威力が 低い 技の 威力を 高くして 攻撃できる。" + "description": "威力が 低い 技の 威力を 高くして 攻撃できる。" }, "leafGuard": { "name": "リーフガード", - "description": "天気が 晴れのときは 状態異常に ならない。" + "description": "天気が 晴れのときは 状態異常に ならない。" }, "klutz": { "name": "ぶきよう", - "description": "持っている 道具を 使うことが できない。" + "description": "持っている 道具を 使うことが できない。" }, "moldBreaker": { "name": "かたやぶり", - "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" + "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" }, "superLuck": { "name": "きょううん", - "description": "強運を 持っているため 相手の 急所に 攻撃が 当たりやすい。" + "description": "強運を 持っているため 相手の 急所に 攻撃が 当たりやすい。" }, "aftermath": { "name": "ゆうばく", - "description": "ひんしに なったとき 触った 相手に ダメージを あたえる。" + "description": "ひんしに なったとき 触った 相手に ダメージを あたえる。" }, "anticipation": { "name": "きけんよち", - "description": "相手の 持つ 危険な 技を 察知する ことができる。" + "description": "相手の 持つ 危険な 技を 察知する ことができる。" }, "forewarn": { "name": "よちむ", - "description": "登場 したとき 相手の 持つ 技を ひとつだけ 読み取る。" + "description": "登場 したとき 相手の 持つ 技を ひとつだけ 読み取る。" }, "unaware": { "name": "てんねん", - "description": "相手の 能力の 変化を 無視して 攻撃が できる。" + "description": "相手の 能力の 変化を 無視して 攻撃が できる。" }, "tintedLens": { "name": "いろめがね", - "description": "効果が いまひとつの 技を 通常の 威力で 出すことが できる。" + "description": "効果が いまひとつの 技を 通常の 威力で 出すことが できる。" }, "filter": { "name": "フィルター", - "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" + "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" }, "slowStart": { "name": "スロースタート", - "description": "5ターンの あいだ 攻撃と 素早さが 半分に なる。" + "description": "5ターンの あいだ 攻撃と 素早さが 半分に なる。" }, "scrappy": { "name": "きもったま", - "description": "ゴーストタイプの ポケモンに ノーマルタイプと かくとうタイプの 技を 当てることが できる。" + "description": "ゴーストタイプの ポケモンに ノーマルタイプと かくとうタイプの 技を 当てることが できる。" }, "stormDrain": { "name": "よびみず", - "description": "みずタイプの 技を 自分に よせつけ ダメージは 受けずに 特攻が 上がる。" + "description": "みずタイプの 技を 自分に よせつけ ダメージは 受けずに 特攻が 上がる。" }, "iceBody": { "name": "アイスボディ", - "description": "天気が ゆきのとき HPを 少しずつ 回復 する。" + "description": "天気が ゆきのとき HPを 少しずつ 回復 する。" }, "solidRock": { "name": "ハードロック", - "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" + "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" }, "snowWarning": { "name": "ゆきふらし", - "description": "登場 したときに 天気を ゆきに する。" + "description": "登場 したときに 天気を ゆきに する。" }, "honeyGather": { "name": "みつあつめ", - "description": "戦闘が 終わったとき あまいミツを 拾う。そのあまいミツが 売られて お金を もらう。" + "description": "戦闘が 終わったとき あまいミツを 拾う。そのあまいミツが 売られて お金を もらう。" }, "frisk": { "name": "おみとおし", - "description": "登場 したとき 相手の 持ち物を 見通すことが できる。" + "description": "登場 したとき 相手の 持ち物を 見通すことが できる。" }, "reckless": { "name": "すてみ", - "description": "反動で ダメージを 受ける 技の 威力が 上がる。" + "description": "反動で ダメージを 受ける 技の 威力が 上がる。" }, "multitype": { "name": "マルチタイプ", - "description": "持っている プレートや Zクリスタルの タイプによって 自分の タイプが 変わる。" + "description": "持っている プレートや Zクリスタルの タイプによって 自分の タイプが 変わる。" }, "flowerGift": { "name": "フラワーギフト", - "description": "天気が 晴れのとき 自分と 味方の 攻撃と 特防の 能力が 上がる。" + "description": "天気が 晴れのとき 自分と 味方の 攻撃と 特防の 能力が 上がる。" }, "badDreams": { "name": "ナイトメア", - "description": "ねむり状態の 相手に ダメージを あたえる。" + "description": "ねむり状態の 相手に ダメージを あたえる。" }, "pickpocket": { "name": "わるいてぐせ", - "description": "触られた 相手の 道具を 盗んで しまう。" + "description": "触られた 相手の 道具を 盗んで しまう。" }, "sheerForce": { "name": "ちからずく", - "description": "技の 追加効果は なくなるが そのぶん 高い 威力で 技を 出すことが できる。" + "description": "技の 追加効果は なくなるが そのぶん 高い 威力で 技を 出すことが できる。" }, "contrary": { "name": "あまのじゃく", - "description": "能力の 変化が 逆転して 上がるときに 下がり 下がるときに 上がる。" + "description": "能力の 変化が 逆転して 上がるときに 下がり 下がるときに 上がる。" }, "unnerve": { "name": "きんちょうかん", - "description": "相手を 緊張させて きのみを 食べられなく させる。" + "description": "相手を 緊張させて きのみを 食べられなく させる。" }, "defiant": { "name": "まけんき", - "description": "能力を 下げられると 攻撃が ぐーんと 上がる。" + "description": "能力を 下げられると 攻撃が ぐーんと 上がる。" }, "defeatist": { "name": "よわき", - "description": "HPが 半分に なると 弱気に なって 攻撃と 特攻が 半減する。" + "description": "HPが 半分に なると 弱気に なって 攻撃と 特攻が 半減する。" }, "cursedBody": { "name": "のろわれボディ", - "description": "攻撃を 受けると 相手の 技を かなしばり状態に することが ある。" + "description": "攻撃を 受けると 相手の 技を かなしばり状態に することが ある。" }, "healer": { "name": "いやしのこころ", - "description": "状態異常の 味方を たまに 治してあげる。" + "description": "状態異常の 味方を たまに 治してあげる。" }, "friendGuard": { "name": "フレンドガード", - "description": "味方の ダメージを 減らすことが できる。" + "description": "味方の ダメージを 減らすことが できる。" }, "weakArmor": { "name": "くだけるよろい", - "description": "物理技で ダメージを 受けると 防御が 下がり 素早さが ぐーんと 上がる。" + "description": "物理技で ダメージを 受けると 防御が 下がり 素早さが ぐーんと 上がる。" }, "heavyMetal": { "name": "ヘヴィメタル", - "description": "自分の 重さが 2倍に なる。" + "description": "自分の 重さが 2倍に なる。" }, "lightMetal": { "name": "ライトメタル", - "description": "自分の 重さが 半分に なる。" + "description": "自分の 重さが 半分に なる。" }, "multiscale": { "name": "マルチスケイル", - "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。" + "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。" }, "toxicBoost": { "name": "どくぼうそう", - "description": "どく状態に なったとき 物理技の 威力が 上がる。" + "description": "どく状態に なったとき 物理技の 威力が 上がる。" }, "flareBoost": { "name": "ねつぼうそう", - "description": "やけど状態に なったとき 特殊技の 威力が 上がる。" + "description": "やけど状態に なったとき 特殊技の 威力が 上がる。" }, "harvest": { "name": "しゅうかく", - "description": "使った きのみを 何回も 作りだす。" + "description": "使った きのみを 何回も 作りだす。" }, "telepathy": { "name": "テレパシー", - "description": "味方の 攻撃を 読み取って 技を 回避する。" + "description": "味方の 攻撃を 読み取って 技を 回避する。" }, "moody": { "name": "ムラっけ", - "description": "毎ターン 能力の どれかが ぐーんと 上がって どれかが 下がる。" + "description": "毎ターン 能力の どれかが ぐーんと 上がって どれかが 下がる。" }, "overcoat": { "name": "ぼうじん", - "description": "すなあらしや あられなどの ダメージを 受けない。 粉の 技を 受けない。" + "description": "すなあらしや あられなどの ダメージを 受けない。 粉の 技を 受けない。" }, "poisonTouch": { "name": "どくしゅ", - "description": "触る だけで 相手を どく 状態に することがある。" + "description": "触る だけで 相手を どく 状態に することがある。" }, "regenerator": { "name": "さいせいりょく", - "description": "手持ちに 引っ込むと HPが 少し 回復する。" + "description": "手持ちに 引っ込むと HPが 少し 回復する。" }, "bigPecks": { "name": "はとむね", - "description": "防御を 下げる 効果を 受けない。" + "description": "防御を 下げる 効果を 受けない。" }, "sandRush": { "name": "すなかき", - "description": "天気が すなあらし のとき 素早さが 上がる。" + "description": "天気が すなあらし のとき 素早さが 上がる。" }, "wonderSkin": { "name": "ミラクルスキン", - "description": "変化技を 受けにくい 体に なっている。" + "description": "変化技を 受けにくい 体に なっている。" }, "analytic": { "name": "アナライズ", - "description": "いちばん 最後に 技を 出すと 技の 威力が 上がる。" + "description": "いちばん 最後に 技を 出すと 技の 威力が 上がる。" }, "illusion": { "name": "イリュージョン", - "description": "手持ちの いちばん うしろに いる ポケモンに なりきって 登場して 相手を 化かす。" + "description": "手持ちの いちばん うしろに いる ポケモンに なりきって 登場して 相手を 化かす。" }, "imposter": { "name": "かわりもの", - "description": "目の前の ポケモンに 変身 してしまう。" + "description": "目の前の ポケモンに 変身 してしまう。" }, "infiltrator": { "name": "すりぬけ", - "description": "相手の 壁や 身代わりを すりぬけて 攻撃 できる" + "description": "相手の 壁や 身代わりを すりぬけて 攻撃 できる" }, "mummy": { "name": "ミイラ", - "description": "相手に 触られると 相手を ミイラに してしまう。" + "description": "相手に 触られると 相手を ミイラに してしまう。" }, "moxie": { "name": "じしんかじょう", - "description": "相手を 倒すと 自信が ついて 攻撃が 上がる。" + "description": "相手を 倒すと 自信が ついて 攻撃が 上がる。" }, "justified": { "name": "せいぎのこころ", - "description": "あくタイプの 攻撃を 受けると 正義感で 攻撃が 上がる。" + "description": "あくタイプの 攻撃を 受けると 正義感で 攻撃が 上がる。" }, "rattled": { "name": "びびり", - "description": "あく ゴースト むしタイプの 攻撃を 受けたり いかくを されると びびって 素早さが 上がる。" + "description": "あく ゴースト むしタイプの 攻撃を 受けたり いかくを されると びびって 素早さが 上がる。" }, "magicBounce": { "name": "マジックミラー", - "description": "相手に だされた 変化技を 受けずに そのまま 返す ことが できる。" + "description": "相手に だされた 変化技を 受けずに そのまま 返す ことが できる。" }, "sapSipper": { "name": "そうしょく", - "description": "くさタイプの 技を 受けると ダメージを 受けずに 攻撃が 上がる。" + "description": "くさタイプの 技を 受けると ダメージを 受けずに 攻撃が 上がる。" }, "prankster": { "name": "いたずらごころ", - "description": "変化技を 先制で 出すことが できる。" + "description": "変化技を 先制で 出すことが できる。" }, "sandForce": { "name": "すなのちから", - "description": "天気が すなあらしの とき いわタイプと じめんタイプと はがねタイプの 威力が 上がる。" + "description": "天気が すなあらしの とき いわタイプと じめんタイプと はがねタイプの 威力が 上がる。" }, "ironBarbs": { "name": "てつのトゲ", - "description": "自分に 触った 相手に 鉄のトゲで ダメージを あたえる。" + "description": "自分に 触った 相手に 鉄のトゲで ダメージを あたえる。" }, "zenMode": { "name": "ダルマモード", - "description": "HPが 半分 以下に なると 姿が 変化する。" + "description": "HPが 半分 以下に なると 姿が 変化する。" }, "victoryStar": { "name": "しょうりのほし", - "description": "自分や 味方の 命中率が 上がる。" + "description": "自分や 味方の 命中率が 上がる。" }, "turboblaze": { "name": "ターボブレイズ", - "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" + "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" }, "teravolt": { "name": "テラボルテージ", - "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" + "description": "相手の 特性に ジャマされる ことなく 相手に 技を 出すことが できる。" }, "aromaVeil": { "name": "アロマベール", - "description": "自分と 味方への メンタル 攻撃を 防ぐことが できる。" + "description": "自分と 味方への メンタル 攻撃を 防ぐことが できる。" }, "flowerVeil": { "name": "フラワーベール", - "description": "味方の 草ポケモンは 能力が 下がらず 状態異常にも ならない。" + "description": "味方の 草ポケモンは 能力が 下がらず 状態異常にも ならない。" }, "cheekPouch": { "name": "ほおぶくろ", - "description": "どんな きのみでも 食べると HPも 回復する。" + "description": "どんな きのみでも 食べると HPも 回復する。" }, "protean": { "name": "へんげんじざい", - "description": "自分が 出す 技と 同じ タイプに 変化する。" + "description": "自分が 出す 技と 同じ タイプに 変化する。" }, "furCoat": { "name": "ファーコート", - "description": "相手から 受ける 物理技の ダメージが 半分に なる。" + "description": "相手から 受ける 物理技の ダメージが 半分に なる。" }, "magician": { "name": "マジシャン", - "description": "技を 当てた 相手の 道具を 奪ってしまう。" + "description": "技を 当てた 相手の 道具を 奪ってしまう。" }, "bulletproof": { "name": "ぼうだん", - "description": "相手の 弾や 爆弾などの 技を 防ぐことが できる。" + "description": "相手の 弾や 爆弾などの 技を 防ぐことが できる。" }, "competitive": { "name": "かちき", - "description": "能力を 下げられると 特攻が ぐーんと 上がる。" + "description": "能力を 下げられると 特攻が ぐーんと 上がる。" }, "strongJaw": { "name": "がんじょうあご", - "description": "あごが 頑丈で 噛む 技の 威力が 高くなる。" + "description": "あごが 頑丈で 噛む 技の 威力が 高くなる。" }, "refrigerate": { "name": "フリーズスキン", - "description": "ノーマルタイプの 技が こおりタイプに なる。 威力が 少し 上がる。" + "description": "ノーマルタイプの 技が こおりタイプに なる。 威力が 少し 上がる。" }, "sweetVeil": { "name": "スイートベール", - "description": "味方の ポケモンは 眠らなくなる。" + "description": "味方の ポケモンは 眠らなくなる。" }, "stanceChange": { "name": "バトルスイッチ", - "description": "攻撃技を 出すと ブレードフォルムに 技 キングシールドを 出すと シールドフォルムに 変化する。" + "description": "攻撃技を 出すと ブレードフォルムに 技 キングシールドを 出すと シールドフォルムに 変化する。" }, "galeWings": { "name": "はやてのつばさ", - "description": "HPが 満タン だと ひこうタイプの 技を 先制で 出すことが できる。" + "description": "HPが 満タン だと ひこうタイプの 技を 先制で 出すことが できる。" }, "megaLauncher": { "name": "メガランチャー", - "description": "波動の 技の 威力が 高くなる。" + "description": "波動の 技の 威力が 高くなる。" }, "grassPelt": { "name": "くさのけがわ", - "description": "グラスフィールドのとき 防御が 上がる。" + "description": "グラスフィールドのとき 防御が 上がる。" }, "symbiosis": { "name": "きょうせい", - "description": "味方が 道具を 使うと 自分の 持っている 道具を 味方に 渡す。" + "description": "味方が 道具を 使うと 自分の 持っている 道具を 味方に 渡す。" }, "toughClaws": { "name": "かたいツメ", - "description": "相手に 接触する 技の 威力が 高くなる。" + "description": "相手に 接触する 技の 威力が 高くなる。" }, "pixilate": { "name": "フェアリースキン", - "description": "ノーマルタイプの 技が フェアリータイプになる。 威力が 少し 上がる。" + "description": "ノーマルタイプの 技が フェアリータイプになる。 威力が 少し 上がる。" }, "gooey": { "name": "ぬめぬめ", - "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。" + "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。" }, "aerilate": { "name": "スカイスキン", - "description": "ノーマルタイプの 技が ひこうタイプになる。 威力が 少し 上がる。" + "description": "ノーマルタイプの 技が ひこうタイプになる。 威力が 少し 上がる。" }, "parentalBond": { "name": "おやこあい", - "description": "親子 2匹で 2回 攻撃することが できる。" + "description": "親子 2匹で 2回 攻撃することが できる。" }, "darkAura": { "name": "ダークオーラ", - "description": "全員の あくタイプの 技が 強くなる。" + "description": "全員の あくタイプの 技が 強くなる。" }, "fairyAura": { "name": "フェアリーオーラ", - "description": "全員の フェアリータイプの 技が 強くなる。" + "description": "全員の フェアリータイプの 技が 強くなる。" }, "auraBreak": { "name": "オーラブレイク", - "description": "オーラの 効果を 逆転させて 威力を 下げる。" + "description": "オーラの 効果を 逆転させて 威力を 下げる。" }, "primordialSea": { "name": "はじまりのうみ", - "description": "ほのおタイプの 攻撃を 受けない 天気にする。" + "description": "ほのおタイプの 攻撃を 受けない 天気にする。" }, "desolateLand": { "name": "おわりのだいち", - "description": "みずタイプの 攻撃を 受けない 天気にする。" + "description": "みずタイプの 攻撃を 受けない 天気にする。" }, "deltaStream": { "name": "デルタストリーム", - "description": "ひこうタイプの 弱点が なくなる 天気にする。" + "description": "ひこうタイプの 弱点が なくなる 天気にする。" }, "stamina": { "name": "じきゅうりょく", - "description": "攻撃を 受けると 防御が 上がる。" + "description": "攻撃を 受けると 防御が 上がる。" }, "wimpOut": { "name": "にげごし", - "description": "HPが 半分に なると あわてて 逃げ出して 手持ちに 引っ込んで しまう。" + "description": "HPが 半分に なると あわてて 逃げ出して 手持ちに 引っ込んで しまう。" }, "emergencyExit": { "name": "ききかいひ", - "description": "HPが 半分に なると 危険を 回避するため 手持ちに 引っ込んで しまう。" + "description": "HPが 半分に なると 危険を 回避するため 手持ちに 引っ込んで しまう。" }, "waterCompaction": { "name": "みずがため", - "description": "みずタイプの 技を 受けると 防御が ぐーんと 上がる。" + "description": "みずタイプの 技を 受けると 防御が ぐーんと 上がる。" }, "merciless": { "name": "ひとでなし", - "description": "どく状態の 相手を 攻撃すると かならず 急所に 当たる。" + "description": "どく状態の 相手を 攻撃すると かならず 急所に 当たる。" }, "shieldsDown": { "name": "リミットシールド", - "description": "HPが 半分に なると 殻が 壊れて 攻撃的に なる。" + "description": "HPが 半分に なると 殻が 壊れて 攻撃的に なる。" }, "stakeout": { "name": "はりこみ", - "description": "交代で 出てきた 相手に 2倍の ダメージで 攻撃 できる。" + "description": "交代で 出てきた 相手に 2倍の ダメージで 攻撃 できる。" }, "waterBubble": { "name": "すいほう", - "description": "自分に 対する ほのおタイプの 技の 威力を 下げる。 やけど しない。" + "description": "自分に 対する ほのおタイプの 技の 威力を 下げる。 やけど しない。" }, "steelworker": { "name": "はがねつかい", - "description": "はがねタイプの 技の 威力が 上がる。" + "description": "はがねタイプの 技の 威力が 上がる。" }, "berserk": { "name": "ぎゃくじょう", - "description": "相手の 攻撃で HPが 半分に なると 特攻が 上がる。" + "description": "相手の 攻撃で HPが 半分に なると 特攻が 上がる。" }, "slushRush": { "name": "ゆきかき", - "description": "天気が ゆき のとき 素早さが 上がる。" + "description": "天気が ゆき のとき 素早さが 上がる。" }, "longReach": { "name": "えんかく", - "description": "すべての 技を 相手に 接触 しないで 出すことが できる。" + "description": "すべての 技を 相手に 接触 しないで 出すことが できる。" }, "liquidVoice": { "name": "うるおいボイス", - "description": "すべての 音技が みずタイプに なる。" + "description": "すべての 音技が みずタイプに なる。" }, "triage": { "name": "ヒーリングシフト", - "description": "回復技を 先制で 出すことが できる。" + "description": "回復技を 先制で 出すことが できる。" }, "galvanize": { "name": "エレキスキン", - "description": "ノーマルタイプの 技が でんきタイプになる。 威力が 少し 上がる。" + "description": "ノーマルタイプの 技が でんきタイプになる。 威力が 少し 上がる。" }, "surgeSurfer": { "name": "サーフテール", - "description": "エレキフィールド のとき 素早さが 2倍に なる。" + "description": "エレキフィールド のとき 素早さが 2倍に なる。" }, "schooling": { "name": "ぎょぐん", - "description": "HPが 多いときは 群れて 強くなる。 HPの 残りが 少なくなると 群れは 散り散りに なってしまう。" + "description": "HPが 多いときは 群れて 強くなる。 HPの 残りが 少なくなると 群れは 散り散りに なってしまう。" }, "disguise": { "name": "ばけのかわ", - "description": "体を 被う 化けの皮で 1回 攻撃を 防ぐことが できる。" + "description": "体を 被う 化けの皮で 1回 攻撃を 防ぐことが できる。" }, "battleBond": { "name": "きずなへんげ", - "description": "相手を 倒すと トレーナーとの キズナが 深まり サトシゲッコウガに 変化する。みずしゅりけんが 強くなる。" + "description": "相手を 倒すと トレーナーとの キズナが 深まり サトシゲッコウガに 変化する。みずしゅりけんが 強くなる。" }, "powerConstruct": { "name": "スワームチェンジ", - "description": "HPが 半分に なると セルたちが 応援に 駆けつけ パーフェクトフォルムに 姿を 変える。" + "description": "HPが 半分に なると セルたちが 応援に 駆けつけ パーフェクトフォルムに 姿を 変える。" }, "corrosion": { "name": "ふしょく", - "description": "はがねタイプや どくタイプも どく状態に することが できる。" + "description": "はがねタイプや どくタイプも どく状態に することが できる。" }, "comatose": { "name": "ぜったいねむり", - "description": "つねに 夢うつつの 状態で 絶対に 目覚めない。 眠ったまま 攻撃が できる。" + "description": "つねに 夢うつつの 状態で 絶対に 目覚めない。 眠ったまま 攻撃が できる。" }, "queenlyMajesty": { "name": "じょおうのいげん", - "description": "相手に 威圧感を あたえ こちらに むかって 先制技を 出せない ようにする。" + "description": "相手に 威圧感を あたえ こちらに むかって 先制技を 出せない ようにする。" }, "innardsOut": { "name": "とびだすなかみ", - "description": "相手に 倒されたとき HPの 残りの ぶんだけ 相手に ダメージを あたえる。" + "description": "相手に 倒されたとき HPの 残りの ぶんだけ 相手に ダメージを あたえる。" }, "dancer": { "name": "おどりこ", - "description": "だれかが 踊り技を 使うと 自分も それに 続いて 踊り技を 出すことが できる。" + "description": "だれかが 踊り技を 使うと 自分も それに 続いて 踊り技を 出すことが できる。" }, "battery": { "name": "バッテリー", - "description": "味方の 特殊技の 威力を 上げる。" + "description": "味方の 特殊技の 威力を 上げる。" }, "fluffy": { "name": "もふもふ", - "description": "相手から 受けた 接触する 技の ダメージを 半減するが ほのおタイプの 技の ダメージは 2倍になる。" + "description": "相手から 受けた 接触する 技の ダメージを 半減するが ほのおタイプの 技の ダメージは 2倍になる。" }, "dazzling": { "name": "ビビッドボディ", - "description": "相手を びっくり させて こちらに むかって 先制技を 出せない ようにする。" + "description": "相手を びっくり させて こちらに むかって 先制技を 出せない ようにする。" }, "soulHeart": { "name": "ソウルハート", - "description": "ポケモンが ひんしに なるたびに 特攻が 上がる。" + "description": "ポケモンが ひんしに なるたびに 特攻が 上がる。" }, "tanglingHair": { "name": "カーリーヘアー", - "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。" + "description": "攻撃で 自分に 触れた 相手の 素早さを 下げる。" }, "receiver": { "name": "レシーバー", - "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。" + "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。" }, "powerOfAlchemy": { "name": "かがくのちから", - "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。" + "description": "倒された 味方の 特性を 受け継いで 同じ 特性に なる。" }, "beastBoost": { "name": "ビーストブースト", - "description": "相手を 倒したとき 自分の いちばん 高い 能力が 上がる。" + "description": "相手を 倒したとき 自分の いちばん 高い 能力が 上がる。" }, "rksSystem": { "name": "ARシステム", - "description": "持っている メモリで 自分の タイプが 変わる。" + "description": "持っている メモリで 自分の タイプが 変わる。" }, "electricSurge": { "name": "エレキメイカー", - "description": "登場 したときに エレキフィールドを はりめぐらせる。" + "description": "登場 したときに エレキフィールドを はりめぐらせる。" }, "psychicSurge": { "name": "サイコメイカー", - "description": "登場 したときに サイコフィールドを はりめぐらせる。" + "description": "登場 したときに サイコフィールドを はりめぐらせる。" }, "mistySurge": { "name": "ミストメイカー", - "description": "登場 したときに ミストフィールドを はりめぐらせる。" + "description": "登場 したときに ミストフィールドを はりめぐらせる。" }, "grassySurge": { "name": "グラスメイカー", - "description": "登場 したときに グラスフィールドを はりめぐらせる。" + "description": "登場 したときに グラスフィールドを はりめぐらせる。" }, "fullMetalBody": { "name": "メタルプロテクト", - "description": "相手の 技や 特性で 能力を 下げられない。" + "description": "相手の 技や 特性で 能力を 下げられない。" }, "shadowShield": { "name": "ファントムガード", - "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。" + "description": "HPが 満タンの ときに 受ける ダメージが 少なくなる。" }, "prismArmor": { "name": "プリズムアーマー", - "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" + "description": "効果バツグンに なってしまう 攻撃の 威力を 弱める ことが できる。" }, "neuroforce": { "name": "ブレインフォース", - "description": "効果バツグンの 攻撃で 威力が さらに 上がる。" + "description": "効果バツグンの 攻撃で 威力が さらに 上がる。" }, "intrepidSword": { "name": "ふとうのけん", - "description": "登場 したときに 攻撃が 上がる。" + "description": "登場 したときに 攻撃が 上がる。" }, "dauntlessShield": { "name": "ふくつのたて", - "description": "登場 したときに 防御が 上がる。" + "description": "登場 したときに 防御が 上がる。" }, "libero": { "name": "リベロ", - "description": "自分が 出す 技と 同じ タイプに 変化する。" + "description": "自分が 出す 技と 同じ タイプに 変化する。" }, "ballFetch": { "name": "たまひろい", - "description": "1回目に 投げて 失敗 した モンスターボールを 拾ってくる。" + "description": "1回目に 投げて 失敗 した モンスターボールを 拾ってくる。" }, "cottonDown": { "name": "わたげ", - "description": "攻撃を 受けると わたげを ばらまいて 自分以外の ポケモン すべての 素早さを 下げる。" + "description": "攻撃を 受けると わたげを ばらまいて 自分以外の ポケモン すべての 素早さを 下げる。" }, "propellerTail": { "name": "スクリューおびれ", - "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。" + "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。" }, "mirrorArmor": { "name": "ミラーアーマー", - "description": "自分が 受けた 能力 ダウンの 効果 だけを 跳ね返す。" + "description": "自分が 受けた 能力 ダウンの 効果 だけを 跳ね返す。" }, "gulpMissile": { "name": "うのミサイル", - "description": "なみのりか ダイビングを すると 獲物を くわえてくる。 ダメージを 受けると 獲物を 吐きだして 攻撃。" + "description": "なみのりか ダイビングを すると 獲物を くわえてくる。 ダメージを 受けると 獲物を 吐きだして 攻撃。" }, "stalwart": { "name": "すじがねいり", - "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。" + "description": "相手の 技を 引き受ける 特性や 技の 影響を 無視 できる。" }, "steamEngine": { "name": "じょうききかん", - "description": "みずタイプ ほのおタイプの 技を 受けると 素早さが ぐぐーんと 上がる。" + "description": "みずタイプ ほのおタイプの 技を 受けると 素早さが ぐぐーんと 上がる。" }, "punkRock": { "name": "パンクロック", - "description": "音技の 威力が 上がる。 受けた 音技の ダメージは 半分に なる。" + "description": "音技の 威力が 上がる。 受けた 音技の ダメージは 半分に なる。" }, "sandSpit": { "name": "すなはき", - "description": "攻撃を 受けると 砂あらしを 起こす。" + "description": "攻撃を 受けると 砂あらしを 起こす。" }, "iceScales": { "name": "こおりのりんぷん", - "description": "こおりのりんぷんに 守られて 特殊攻撃で 受ける ダメージが 半減 する。" + "description": "こおりのりんぷんに 守られて 特殊攻撃で 受ける ダメージが 半減 する。" }, "ripen": { "name": "じゅくせい", - "description": "熟成 させることで きのみの 効果が 倍に なる。" + "description": "熟成 させることで きのみの 効果が 倍に なる。" }, "iceFace": { "name": "アイスフェイス", - "description": "物理攻撃は 頭の 氷が みがわりに なるが 姿も 変わる。 氷は あられが 降ると 元に戻る。" + "description": "物理攻撃は 頭の 氷が みがわりに なるが 姿も 変わる。 氷は あられが 降ると 元に戻る。" }, "powerSpot": { "name": "パワースポット", - "description": "隣に いるだけで 技の 威力が 上がる。" + "description": "隣に いるだけで 技の 威力が 上がる。" }, "mimicry": { "name": "ぎたい", - "description": "フィールドの 状態に あわせて ポケモンの タイプが 変わる。" + "description": "フィールドの 状態に あわせて ポケモンの タイプが 変わる。" }, "screenCleaner": { "name": "バリアフリー", - "description": "登場 したときに 敵と 味方の ひかりのかべ リフレクター オーロラベールの 効果が 消える。" + "description": "登場 したときに 敵と 味方の ひかりのかべ リフレクター オーロラベールの 効果が 消える。" }, "steelySpirit": { "name": "はがねのせいしん", - "description": "味方の はがねタイプの 攻撃の 威力が 上がる。" + "description": "味方の はがねタイプの 攻撃の 威力が 上がる。" }, "perishBody": { "name": "ほろびのボディ", - "description": "接触する 技を 受けると お互い 3ターン たつと ひんしになる。 交代すると 効果は なくなる。" + "description": "接触する 技を 受けると お互い 3ターン たつと ひんしになる。 交代すると 効果は なくなる。" }, "wanderingSpirit": { "name": "さまようたましい", - "description": "接触する 技で 攻撃 してきた ポケモンと 特性を 入れ替える。" + "description": "接触する 技で 攻撃 してきた ポケモンと 特性を 入れ替える。" }, "gorillaTactics": { "name": "ごりむちゅう", - "description": "攻撃は 上がるが 最初に 選んだ 技しか 出せなくなる。" + "description": "攻撃は 上がるが 最初に 選んだ 技しか 出せなくなる。" }, "neutralizingGas": { "name": "かがくへんかガス", - "description": "かがくへんかガスの ポケモンが 場にいると すべての ポケモンの 特性の 効果が 消えたり 発動 しなくなる。" + "description": "かがくへんかガスの ポケモンが 場にいると すべての ポケモンの 特性の 効果が 消えたり 発動 しなくなる。" }, "pastelVeil": { "name": "パステルベール", - "description": "自分も 味方も どくの 状態異常を 受けなくなる。" + "description": "自分も 味方も どくの 状態異常を 受けなくなる。" }, "hungerSwitch": { "name": "はらぺこスイッチ", - "description": "ターンの 終わりに まんぷくもよう はらぺこもよう まんぷくもよう……と 交互に 姿を 変える。" + "description": "ターンの 終わりに まんぷくもよう はらぺこもよう まんぷくもよう……と 交互に 姿を 変える。" }, "quickDraw": { "name": "クイックドロウ", - "description": "相手より 先に 行動できることが ある。" + "description": "相手より 先に 行動できることが ある。" }, "unseenFist": { "name": "ふかしのこぶし", - "description": "相手に 接触する 技なら 守りの 効果を 無視して 攻撃することが できる。" + "description": "相手に 接触する 技なら 守りの 効果を 無視して 攻撃することが できる。" }, "curiousMedicine": { "name": "きみょうなくすり", - "description": "登場 したときに 貝がらから 薬を 振りまいて 味方の 能力変化を 元に戻す。" + "description": "登場 したときに 貝がらから 薬を 振りまいて 味方の 能力変化を 元に戻す。" }, "transistor": { "name": "トランジスタ", - "description": "でんきタイプの 技の 威力が 上がる。" + "description": "でんきタイプの 技の 威力が 上がる。" }, "dragonsMaw": { "name": "りゅうのあぎと", - "description": "ドラゴンタイプの 技の 威力が 上がる。" + "description": "ドラゴンタイプの 技の 威力が 上がる。" }, "chillingNeigh": { "name": "しろのいななき", - "description": "相手を 倒すと 冷たい 声で いなないて 攻撃が 上がる。" + "description": "相手を 倒すと 冷たい 声で いなないて 攻撃が 上がる。" }, "grimNeigh": { "name": "くろのいななき", - "description": "相手を 倒すと 恐ろしい 声で いなないて 特攻が 上がる。" + "description": "相手を 倒すと 恐ろしい 声で いなないて 特攻が 上がる。" }, "asOneGlastrier": { "name": "じんばいったい", - "description": "バドレックスの きんちょうかんと ブリザポスの しろのいななきの 二つの 特性を あわせ持つ。" + "description": "バドレックスの きんちょうかんと ブリザポスの しろのいななきの 二つの 特性を あわせ持つ。" }, "asOneSpectrier": { "name": "じんばいったい", - "description": "バドレックスの きんちょうかんと レイスポスの くろのいななきの 二つの 特性を あわせ持つ。" + "description": "バドレックスの きんちょうかんと レイスポスの くろのいななきの 二つの 特性を あわせ持つ。" }, "lingeringAroma": { "name": "とれないにおい", @@ -1073,170 +1073,170 @@ }, "seedSower": { "name": "こぼれダネ", - "description": "攻撃を 受けると グラスフィールドに する。" + "description": "攻撃を 受けると グラスフィールドに する。" }, "thermalExchange": { "name": "ねつこうかん", - "description": "ほのおタイプの 技を 受けると 攻撃が 上がる。 やけど状態に ならない。" + "description": "ほのおタイプの 技を 受けると 攻撃が 上がる。 やけど状態に ならない。" }, "angerShell": { "name": "いかりのこうら", - "description": "相手の攻撃で HPが 半分に なると 怒りで 防御と 特防が 下がるが 攻撃 特攻 素早さが 上がる。" + "description": "相手の攻撃で HPが 半分に なると 怒りで 防御と 特防が 下がるが 攻撃 特攻 素早さが 上がる。" }, "purifyingSalt": { "name": "きよめのしお", - "description": "清らかな塩で 状態異常に ならない。 ゴーストタイプの 技の ダメージを 半減させる。" + "description": "清らかな塩で 状態異常に ならない。 ゴーストタイプの 技の ダメージを 半減させる。" }, "wellBakedBody": { "name": "こんがりボディ", - "description": "ほのおタイプの 技を 受けると ダメージを 受けずに 防御が ぐーんと 上がる。" + "description": "ほのおタイプの 技を 受けると ダメージを 受けずに 防御が ぐーんと 上がる。" }, "windRider": { "name": "かぜのり", - "description": "おいかぜが 吹いたり 風技を 受けると ダメージを 受けずに 攻撃が 上がる。" + "description": "おいかぜが 吹いたり 風技を 受けると ダメージを 受けずに 攻撃が 上がる。" }, "guardDog": { "name": "ばんけん", - "description": "いかく されると 攻撃が 上がる。 ポケモンを 入れ替えさせる 技や 道具が 効かない。" + "description": "いかく されると 攻撃が 上がる。 ポケモンを 入れ替えさせる 技や 道具が 効かない。" }, "rockyPayload": { "name": "いわはこび", - "description": "いわタイプの 技の 威力が 上がる。" + "description": "いわタイプの 技の 威力が 上がる。" }, "windPower": { "name": "ふうりょくでんき", - "description": "風技を 受けると じゅうでん 状態に なる。" + "description": "風技を 受けると じゅうでん 状態に なる。" }, "zeroToHero": { "name": "マイティチェンジ", - "description": "手持ちに ひっこむと マイティフォルムに 変化する。" + "description": "手持ちに ひっこむと マイティフォルムに 変化する。" }, "commander": { "name": "しれいとう", - "description": "登場したとき 味方に ヘイラッシャが いると 口の中に 入って そこから 指令を だす。" + "description": "登場したとき 味方に ヘイラッシャが いると 口の中に 入って そこから 指令を だす。" }, "electromorphosis": { "name": "でんきにかえる", - "description": "ダメージを 受けると じゅうでん 状態に なる。" + "description": "ダメージを 受けると じゅうでん 状態に なる。" }, "protosynthesis": { "name": "こだいかっせい", - "description": "ブーストエナジーを 持たせるか 天気が 晴れのとき いちばん 高い能力が 上がる。" + "description": "ブーストエナジーを 持たせるか 天気が 晴れのとき いちばん 高い能力が 上がる。" }, "quarkDrive": { "name": "クォークチャージ", - "description": "ブーストエナジーを 持たせるか エレキフィールドのとき いちばん 高い能力が 上がる。" + "description": "ブーストエナジーを 持たせるか エレキフィールドのとき いちばん 高い能力が 上がる。" }, "goodAsGold": { "name": "おうごんのからだ", - "description": "酸化せず 丈夫な 黄金の体は 相手からの 変化技を 受けない。" + "description": "酸化せず 丈夫な 黄金の体は 相手からの 変化技を 受けない。" }, "vesselOfRuin": { "name": "わざわいのうつわ", - "description": "災厄を 呼ぶ 器の力で 自分以外の 特攻が 弱くなる。" + "description": "災厄を 呼ぶ 器の力で 自分以外の 特攻が 弱くなる。" }, "swordOfRuin": { "name": "わざわいのつるぎ", - "description": "災厄を 呼ぶ 剣の力で 自分以外の 防御が 弱くなる。" + "description": "災厄を 呼ぶ 剣の力で 自分以外の 防御が 弱くなる。" }, "tabletsOfRuin": { "name": "わざわいのおふだ", - "description": "災厄を 呼ぶ 木札の力で 自分以外の 攻撃が 弱くなる。" + "description": "災厄を 呼ぶ 木札の力で 自分以外の 攻撃が 弱くなる。" }, "beadsOfRuin": { "name": "わざわいのたま", - "description": "災厄を 呼ぶ 勾玉の力で 自分以外の 特防が 弱くなる。" + "description": "災厄を 呼ぶ 勾玉の力で 自分以外の 特防が 弱くなる。" }, "orichalcumPulse": { "name": "ひひいろのこどう", - "description": "登場したとき 天気を 晴れにする。 日差しが 強いと 古代の 鼓動により 攻撃が 高まる。" + "description": "登場したとき 天気を 晴れにする。 日差しが 強いと 古代の 鼓動により 攻撃が 高まる。" }, "hadronEngine": { "name": "ハドロンエンジン", - "description": "登場したとき エレキフィールドを はる。 エレキフィールドだと 未来の 機関により 特攻が 高まる。" + "description": "登場したとき エレキフィールドを はる。 エレキフィールドだと 未来の 機関により 特攻が 高まる。" }, "opportunist": { "name": "びんじょう", - "description": "相手の 能力が 上がったとき 自分も 便乗して 同じように 能力を 上げる。" + "description": "相手の 能力が 上がったとき 自分も 便乗して 同じように 能力を 上げる。" }, "cudChew": { "name": "はんすう", - "description": "きのみを 食べると 次のターンの 終わりに 胃から 出して もう1回だけ 食べる。" + "description": "きのみを 食べると 次のターンの 終わりに 胃から 出して もう1回だけ 食べる。" }, "sharpness": { "name": "きれあじ", - "description": "相手を 切る技の 威力が 上がる。" + "description": "相手を 切る技の 威力が 上がる。" }, "supremeOverlord": { "name": "そうだいしょう", - "description": "登場したとき 今まで 倒された 味方の 数が 多いほど 少しずつ 攻撃と 特攻が 上がる。" + "description": "登場したとき 今まで 倒された 味方の 数が 多いほど 少しずつ 攻撃と 特攻が 上がる。" }, "costar": { "name": "きょうえん", - "description": "登場 したときに 味方の 能力変化を コピーする。" + "description": "登場 したときに 味方の 能力変化を コピーする。" }, "toxicDebris": { "name": "どくげしょう", - "description": "物理技で ダメージを 受けると 相手の 足下に どくびしが ちらばる。" + "description": "物理技で ダメージを 受けると 相手の 足下に どくびしが ちらばる。" }, "armorTail": { "name": "テイルアーマー", - "description": "頭を包む 謎のしっぽが こちらに むかって 先制技を 出せない ようにする。" + "description": "頭を包む 謎のしっぽが こちらに むかって 先制技を 出せない ようにする。" }, "earthEater": { "name": "どしょく", - "description": "じめんタイプの 技を 受けると ダメージを 受けずに 回復する。" + "description": "じめんタイプの 技を 受けると ダメージを 受けずに 回復する。" }, "myceliumMight": { "name": "きんしのちから", - "description": "変化技を 出すとき 必ず 行動が 遅くなるが 相手の 特性に ジャマされない。" + "description": "変化技を 出すとき 必ず 行動が 遅くなるが 相手の 特性に ジャマされない。" }, "mindsEye": { "name": "しんがん", - "description": "ノーマル かくとうタイプの技を ゴーストタイプに 当てることが できる。 相手の 回避率の 変化を 無視し 命中率も 下げられない。" + "description": "ノーマル かくとうタイプの技を ゴーストタイプに 当てることが できる。 相手の 回避率の 変化を 無視し 命中率も 下げられない。" }, "supersweetSyrup": { "name": "かんろなミツ", - "description": "最初に 登場 したとき 甘ったるい 蜜の香りを ふりまいて 相手の 回避率を 下げる。" + "description": "最初に 登場 したとき 甘ったるい 蜜の香りを ふりまいて 相手の 回避率を 下げる。" }, "hospitality": { "name": "おもてなし", - "description": "登場したとき 味方を もてなして HPを 少しだけ 回復してあげる。" + "description": "登場したとき 味方を もてなして HPを 少しだけ 回復してあげる。" }, "toxicChain": { "name": "どくのくさり", - "description": "毒素を ふくんだ 鎖の力で 技を 当てた 相手を 猛毒の状態に することが ある。" + "description": "毒素を ふくんだ 鎖の力で 技を 当てた 相手を 猛毒の状態に することが ある。" }, "embodyAspectTeal": { "name": "おもかげやどし", - "description": "思い出を 心に 宿すことで みどりのめんを かがやかせ 自分の 素早さを 上げる。" + "description": "思い出を 心に 宿すことで みどりのめんを かがやかせ 自分の 素早さを 上げる。" }, "embodyAspectWellspring": { "name": "おもかげやどし", - "description": "思い出を 心に 宿すことで いどのめんを かがやかせ 自分の 特防を 上げる。" + "description": "思い出を 心に 宿すことで いどのめんを かがやかせ 自分の 特防を 上げる。" }, "embodyAspectHearthflame": { "name": "おもかげやどし", - "description": "思い出を 心に 宿すことで かまどのめんを かがやかせ 自分の 攻撃を 上げる。" + "description": "思い出を 心に 宿すことで かまどのめんを かがやかせ 自分の 攻撃を 上げる。" }, "embodyAspectCornerstone": { "name": "おもかげやどし", - "description": "思い出を 心に 宿すことで いしずえのめんを かがやかせ 自分の 防御を 上げる。" + "description": "思い出を 心に 宿すことで いしずえのめんを かがやかせ 自分の 防御を 上げる。" }, "teraShift": { "name": "テラスチェンジ", - "description": "登場したとき 周囲の エネルギーを 吸収し テラスタルフォルムに 変化する。" + "description": "登場したとき 周囲の エネルギーを 吸収し テラスタルフォルムに 変化する。" }, "teraShell": { "name": "テラスシェル", - "description": "全タイプの力を 秘めた甲羅は HPが 満タンの ときに 受ける ダメージを すべて 今ひとつに する。" + "description": "全タイプの力を 秘めた甲羅は HPが 満タンの ときに 受ける ダメージを すべて 今ひとつに する。" }, "teraformZero": { "name": "ゼロフォーミング", - "description": "テラパゴスが ステラフォルムに なったとき 秘められた力で 天気と フィールドの 影響を すべて ゼロにする。" + "description": "テラパゴスが ステラフォルムに なったとき 秘められた力で 天気と フィールドの 影響を すべて ゼロにする。" }, "poisonPuppeteer": { "name": "どくくぐつ", - "description": "モモワロウの 技によって どく状態に なった 相手は こんらん状態にも なってしまう。" + "description": "モモワロウの 技によって どく状態に なった 相手は こんらん状態にも なってしまう。" } -} \ No newline at end of file +} diff --git a/src/locales/ja/arena-flyout.json b/src/locales/ja/arena-flyout.json index fa29b4567c5..8585b8e8fb4 100644 --- a/src/locales/ja/arena-flyout.json +++ b/src/locales/ja/arena-flyout.json @@ -39,5 +39,6 @@ "matBlock": "たたみがえし", "craftyShield": "トリックガード", "tailwind": "おいかぜ", - "happyHour": "ハッピータイム" + "happyHour": "ハッピータイム", + "safeguard": "しんぴなまもり" } diff --git a/src/locales/ja/arena-tag.json b/src/locales/ja/arena-tag.json index 56be30d8d55..a81942338fd 100644 --- a/src/locales/ja/arena-tag.json +++ b/src/locales/ja/arena-tag.json @@ -47,5 +47,11 @@ "tailwindOnRemovePlayer": "味方の 追い風が 止んだ!", "tailwindOnRemoveEnemy": "相手の 追い風が 止んだ!", "happyHourOnAdd": "みんなが ハッピーな気分に\n包まれた!", - "happyHourOnRemove": "みんなの 気分が 元に戻った" -} \ No newline at end of file + "happyHourOnRemove": "みんなの 気分が 元に戻った", + "safeguardOnAdd": "場の全体は 神秘のベールに 包まれた!", + "safeguardOnAddPlayer": "味方は 神秘のベールに 包まれた!", + "safeguardOnAddEnemy": "相手は 神秘のベールに 包まれた!", + "safeguardOnRemove": "場の全体を 包んでいた\n神秘のベールが なくなった!", + "safeguardOnRemovePlayer": "味方を 包んでいた\n神秘のベールが なくなった!", + "safeguardOnRemoveEnemy": "相手を 包んでいた\n神秘のベールが なくなった!" +} diff --git a/src/locales/ja/battle.json b/src/locales/ja/battle.json index 636d17f23d6..1fe24068cdf 100644 --- a/src/locales/ja/battle.json +++ b/src/locales/ja/battle.json @@ -4,7 +4,7 @@ "trainerAppearedDouble": "{{trainerName}}が\n勝負を しかけてきた!", "trainerSendOut": "{{trainerName}}は\n{{pokemonName}}を 繰り出した!", "singleWildAppeared": "あっ! 野生の {{pokemonName}}が 飛び出してきた!", - "multiWildAppeared": "あっ! 野生の {{pokemonName1}}と\n{{pokemonName2}}が 飛び出してきた!", + "multiWildAppeared": "あっ! 野生の {{pokemonName1}}と\n{{pokemonName2}}が 飛び出してきた!", "playerComeBack": "{{pokemonName}}! 戻れ!", "trainerComeBack": "{{trainerName}}は\n{{pokemonName}}を 引っ込めた!", "playerGo": "ゆけっ! {{pokemonName}}!", @@ -51,7 +51,7 @@ "noPokeballStrong": "相手の ポケモンが 強すぎて 捕まえられない!\nまずは 弱めよう!", "noEscapeForce": "見えない 力の せいで\n逃げることが できない!", "noEscapeTrainer": "ダメだ! 勝負の最中に\n相手に 背中を 見せられない!", - "noEscapePokemon": "{{pokemonName}}の {{moveName}}で {{escapeVerb}}!", + "noEscapePokemon": "{{pokemonName}}の {{moveName}}で\n{{escapeVerb}}!", "runAwaySuccess": " うまく 逃げ切れた!", "runAwayCannotEscape": "逃げることが できない!", "escapeVerbSwitch": "入れ替えることが できない", @@ -62,6 +62,7 @@ "skipItemQuestion": "本当に アイテムを 取らずに 進みますか?", "itemStackFull": "{{fullItemName}}の スタックが いっぱいです。\n代わりに {{itemName}}を 取得します。", "eggHatching": "おや?", + "eggSkipPrompt": "タマゴは ふかします!\nタマゴまとめに 飛ばしますか?", "ivScannerUseQuestion": "{{pokemonName}}を\n個体値スキャナーで 操作しますか?", "wildPokemonWithAffix": "野生の {{pokemonName}}", "foePokemonWithAffix": "相手の {{pokemonName}}", diff --git a/src/locales/ja/berry.json b/src/locales/ja/berry.json index 73d13d5e8f0..1d1e01296d1 100644 --- a/src/locales/ja/berry.json +++ b/src/locales/ja/berry.json @@ -1,46 +1,46 @@ { "SITRUS": { "name": "オボンのみ", - "effect": "持たせると HPが 50%以下になるとき HPを 25% 回復する" + "effect": "持たせると HPが 50%以下に なるとき HPを 25% 回復する" }, "LUM": { "name": "ラムのみ", - "effect": "持たせると 状態異常や 混乱になるとき 回復する\n" + "effect": "持たせると 状態異常や 混乱に なるとき 回復する" }, "ENIGMA": { "name": "ナゾのみ", - "effect": "持たせると 効果バツグンの 技を 受けたとき HPを 25%回復する" + "effect": "持たせると 効果バツグンの 技を 受けたとき HPを 25%回復する" }, "LIECHI": { "name": "チイラのみ", - "effect": "持たせると HPが 25%以下に なるとき 攻撃が あがる" + "effect": "持たせると HPが 25%以下に なるとき 攻撃が あがる" }, "GANLON": { "name": "リュガのみ", - "effect": "持たせると HPが 25%以下に なるとき 防御が あがる\n" + "effect": "持たせると HPが 25%以下に なるとき 防御が あがる" }, "PETAYA": { "name": "ヤタピのみ", - "effect": "持たせると HPが 25%以下に なるとき 特攻が あがる\n" + "effect": "持たせると HPが 25%以下に なるとき 特攻が あがる" }, "APICOT": { "name": "ズアのみ", - "effect": "持たせると HPが 25%以下に なるとき 特防が あがる\n" + "effect": "持たせると HPが 25%以下に なるとき 特防が あがる" }, "SALAC": { "name": "カムラのみ", - "effect": "持たせると HPが 25%以下に なるとき 素早さが あがる" + "effect": "持たせると HPが 25%以下に なるとき 素早さが あがる" }, "LANSAT": { "name": "サンのみ", - "effect": "持たせると HPが 25%以下に なるとき 攻撃が 急所に 当たりやすくなる" + "effect": "持たせると HPが 25%以下に なるとき 攻撃が 急所に 当たりやすくなる" }, "STARF": { "name": "スターのみ", - "effect": "持たせると HPが 25%以下に なるとき どれか 1つの 能力が ぐーんと あがる" + "effect": "持たせると HPが 25%以下に なるとき どれか 1つの 能力が ぐーんと あがる" }, "LEPPA": { "name": "ヒメリのみ", - "effect": "持たせると PPが 0になる 技のPPを 10回復する" + "effect": "持たせると PPが0になる 技の PPを 10回復する" } } diff --git a/src/locales/ja/fight-ui-handler.json b/src/locales/ja/fight-ui-handler.json index 41ec140c2ca..c0c725ccaf3 100644 --- a/src/locales/ja/fight-ui-handler.json +++ b/src/locales/ja/fight-ui-handler.json @@ -2,6 +2,6 @@ "pp": "PP", "power": "威力", "accuracy": "命中", - "abilityFlyInText": " {{pokemonName}}の\n{{passive}}:{{abilityName}}", + "abilityFlyInText": " {{pokemonName}}の\n{{passive}} {{abilityName}}", "passive": "パッシブ " } diff --git a/src/locales/ja/menu.json b/src/locales/ja/menu.json index 3630f7590ba..f0914a7941c 100644 --- a/src/locales/ja/menu.json +++ b/src/locales/ja/menu.json @@ -22,7 +22,7 @@ "unmatchingPassword": "入力したパスワードが 一致しません", "passwordNotMatchingConfirmPassword": "パスワードは パスワード確認と 一致する 必要があります", "confirmPassword": "パスワード確認", - "registrationAgeWarning": "登録では 13歳以上 であることを 確認します。", + "registrationAgeWarning": "登録では 13歳以上 であることを 確認します。", "backToLogin": "ログインへ", "failedToLoadSaveData": "セーブデータの 読み込みは 不可能でした。ページを 再読み込み してください。\n長い間に続く 場合は 管理者に 連絡してください。", "sessionSuccess": "セッションが 正常に 読み込まれました。", @@ -46,10 +46,10 @@ "yes": "はい", "no": "いいえ", "disclaimer": "免責", - "disclaimerDescription": "このゲームは 未完成作品です。\nセーブデータの 損失を含める ゲーム性に関する 問題が 起きる可能性が あります。\nなお、ゲームは 予告なく変更される 可能性もあり、さらに更新され、完成されるとも 限りません。", + "disclaimerDescription": "このゲームは 未完成作品です。\nセーブデータの 損失を含める ゲーム性に関する 問題が 起きる可能性が あります。\nなお、ゲームは 予告なく変更される 可能性もあり、\nさらに更新され、完成されるとも 限りません。", "choosePokemon": "ポケモンを選ぶ", "renamePokemon": "ニックネームを変える", - "rename": "変える", + "rename": "名前を変える", "nickname": "ニックネーム", "errorServerDown": "おや!\nサーバーとの 接続中に 問題が 発生しました。\nゲームは 自動的に 再接続されます から\nウィンドウは 開いたままに しておいても よろしいです。", "noSaves": "何の セーブファイルも ありません!", diff --git a/src/locales/ja/move.json b/src/locales/ja/move.json index fbeb2132d23..2e602407902 100644 --- a/src/locales/ja/move.json +++ b/src/locales/ja/move.json @@ -1,2491 +1,2491 @@ { "pound": { "name": "はたく", - "effect": "長い しっぽや 手などを 使って 相手を はたいて 攻撃する。" + "effect": "長い しっぽや 手などを 使って 相手を はたいて 攻撃する。" }, "karateChop": { "name": "からてチョップ", - "effect": "鋭い チョップで 相手を たたいて 攻撃する。 急所に 当たりやすい。" + "effect": "鋭い チョップで 相手を たたいて 攻撃する。 急所に 当たりやすい。" }, "doubleSlap": { "name": "おうふくビンタ", - "effect": "おうふく ビンタで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "おうふく ビンタで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。" }, "cometPunch": { "name": "れんぞくパンチ", - "effect": "どとうの パンチで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "どとうの パンチで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。" }, "megaPunch": { "name": "メガトンパンチ", - "effect": "力を こめた パンチで 相手を 攻撃する。" + "effect": "力を こめた パンチで 相手を 攻撃する。" }, "payDay": { "name": "ネコにこばん", - "effect": "相手の 体に 小判を 投げつけて 攻撃する。 戦闘の あとで お金が もらえる。" + "effect": "相手の 体に 小判を 投げつけて 攻撃する。 戦闘の あとで お金が もらえる。" }, "firePunch": { "name": "ほのおのパンチ", - "effect": "炎を こめた パンチで 相手を 攻撃する。 やけど状態に することが ある。" + "effect": "炎を こめた パンチで 相手を 攻撃する。 やけど状態に することが ある。" }, "icePunch": { "name": "れいとうパンチ", - "effect": "冷気を こめた パンチで 相手を 攻撃する。 こおり状態に することが ある。" + "effect": "冷気を こめた パンチで 相手を 攻撃する。 こおり状態に することが ある。" }, "thunderPunch": { "name": "かみなりパンチ", - "effect": "電撃を こめた パンチで 相手を 攻撃する。 まひ状態に することが ある。" + "effect": "電撃を こめた パンチで 相手を 攻撃する。 まひ状態に することが ある。" }, "scratch": { "name": "ひっかく", - "effect": "硬く とがった 鋭い ツメで 相手を ひっかいて 攻撃する。" + "effect": "硬く とがった 鋭い ツメで 相手を ひっかいて 攻撃する。" }, "viseGrip": { "name": "はさむ", - "effect": "相手を 両側から はさんで ダメージを あたえる。" + "effect": "相手を 両側から はさんで ダメージを あたえる。" }, "guillotine": { "name": "ハサミギロチン", - "effect": "大きな ハサミで 相手を 切り裂いて 攻撃する。 当たれば 一撃で ひんしに する。" + "effect": "大きな ハサミで 相手を 切り裂いて 攻撃する。 当たれば 一撃で ひんしに する。" }, "razorWind": { "name": "かまいたち", - "effect": "風の 刃を つくり 2ターン目に 相手を 攻撃する。 急所に 当たりやすい。" + "effect": "風の 刃を つくり 2ターン目に 相手を 攻撃する。 急所に 当たりやすい。" }, "swordsDance": { "name": "つるぎのまい", - "effect": "戦いの舞を 激しく おどって 気合を 高める。 自分の 攻撃を ぐーんと あげる。" + "effect": "戦いの舞を 激しく おどって 気合を 高める。 自分の 攻撃を ぐーんと あげる。" }, "cut": { "name": "いあいぎり", - "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。" + "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。" }, "gust": { "name": "かぜおこし", - "effect": "翼で おこした 激しい 風を 相手に ぶつけて 攻撃する。" + "effect": "翼で おこした 激しい 風を 相手に ぶつけて 攻撃する。" }, "wingAttack": { "name": "つばさでうつ", - "effect": "大きく ひろげた りっぱな 翼を 相手に ぶつけて 攻撃する。" + "effect": "大きく ひろげた りっぱな 翼を 相手に ぶつけて 攻撃する。" }, "whirlwind": { "name": "ふきとばし", - "effect": "相手を 吹きとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" + "effect": "相手を 吹きとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" }, "fly": { "name": "そらをとぶ", - "effect": "1ターン目で 空へ 飛び 2ターン目に 相手を 攻撃する。" + "effect": "1ターン目で 空へ 飛び 2ターン目に 相手を 攻撃する。" }, "bind": { "name": "しめつける", - "effect": "長い 体や つるなどを 使い 4ー5ターンの 間 相手を 締めつけて 攻撃する。" + "effect": "長い 体や つるなどを 使い 4ー5ターンの 間 相手を 締めつけて 攻撃する。" }, "slam": { "name": "たたきつける", - "effect": "長い しっぽや つるなどを 使い 相手を たたきつけて 攻撃する。" + "effect": "長い しっぽや つるなどを 使い 相手を たたきつけて 攻撃する。" }, "vineWhip": { "name": "つるのムチ", - "effect": "ムチのように しなる 細長い つるで 相手を たたきつけて 攻撃する。" + "effect": "ムチのように しなる 細長い つるで 相手を たたきつけて 攻撃する。" }, "stomp": { "name": "ふみつけ", - "effect": "大きな 足で 相手を 踏みつけて 攻撃する。 相手を ひるませることが ある。" + "effect": "大きな 足で 相手を 踏みつけて 攻撃する。 相手を ひるませることが ある。" }, "doubleKick": { "name": "にどげり", - "effect": "2本の 足で 相手を けとばして 攻撃する。 2回連続で ダメージを 与える。" + "effect": "2本の 足で 相手を けとばして 攻撃する。 2回連続で ダメージを 与える。" }, "megaKick": { "name": "メガトンキック", - "effect": "ものすごい 力を こめた キックで 相手を けとばして 攻撃する。" + "effect": "ものすごい 力を こめた キックで 相手を けとばして 攻撃する。" }, "jumpKick": { "name": "とびげり", - "effect": "高い ジャンプからの キックで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。" + "effect": "高い ジャンプからの キックで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。" }, "rollingKick": { "name": "まわしげり", - "effect": "体を 素早く 回転させながら けとばして 攻撃する。 相手を ひるませる ことが ある。" + "effect": "体を 素早く 回転させながら けとばして 攻撃する。 相手を ひるませる ことが ある。" }, "sandAttack": { "name": "すなかけ", - "effect": "相手の 顔に 砂を かけて 命中率を さげる。" + "effect": "相手の 顔に 砂を かけて 命中率を さげる。" }, "headbutt": { "name": "ずつき", - "effect": "頭を 突きだして まっすぐ つっこんで 攻撃する。 相手を ひるませることが ある。" + "effect": "頭を 突きだして まっすぐ つっこんで 攻撃する。 相手を ひるませることが ある。" }, "hornAttack": { "name": "つのでつく", - "effect": "鋭く とがった つので 相手を 攻撃する。" + "effect": "鋭く とがった つので 相手を 攻撃する。" }, "furyAttack": { "name": "みだれづき", - "effect": "つのや くちばしで 相手を つついて 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "つのや くちばしで 相手を つついて 攻撃する。 2ー5回の 間 連続で だす。" }, "hornDrill": { "name": "つのドリル", - "effect": "回転する つのを 相手に 突き刺して 攻撃する。 当たれば 一撃で ひんしに する。" + "effect": "回転する つのを 相手に 突き刺して 攻撃する。 当たれば 一撃で ひんしに する。" }, "tackle": { "name": "たいあたり", - "effect": "相手に むかって 全身で ぶつかっていき 攻撃する。" + "effect": "相手に むかって 全身で ぶつかっていき 攻撃する。" }, "bodySlam": { "name": "のしかかり", - "effect": "全身で 相手に のしかかり 攻撃する。 まひ状態に することが ある。" + "effect": "全身で 相手に のしかかり 攻撃する。 まひ状態に することが ある。" }, "wrap": { "name": "まきつく", - "effect": "長い 体や つるなどを 使って 4ー5ターンの 間 相手に まきついて 攻撃する。" + "effect": "長い 体や つるなどを 使って 4ー5ターンの 間 相手に まきついて 攻撃する。" }, "takeDown": { "name": "とっしん", - "effect": "すごい 勢いで 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。" + "effect": "すごい 勢いで 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。" }, "thrash": { "name": "あばれる", - "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。" + "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。" }, "doubleEdge": { "name": "すてみタックル", - "effect": "命を 懸けて 相手に 突進して 攻撃する。 自分も かなり ダメージを 受ける。" + "effect": "命を 懸けて 相手に 突進して 攻撃する。 自分も かなり ダメージを 受ける。" }, "tailWhip": { "name": "しっぽをふる", - "effect": "しっぽを 左右に かわいく ふって 油断を 誘う。 相手の 防御を さげる。" + "effect": "しっぽを 左右に かわいく ふって 油断を 誘う。 相手の 防御を さげる。" }, "poisonSting": { "name": "どくばり", - "effect": "毒の ある ハリを 相手に 突き刺して 攻撃する。 毒状態に することが ある。" + "effect": "毒の ある ハリを 相手に 突き刺して 攻撃する。 毒状態に することが ある。" }, "twineedle": { "name": "ダブルニードル", - "effect": "2本の ハリを 相手に 突き刺し 2回連続で ダメージ。 毒状態に することが ある。" + "effect": "2本の ハリを 相手に 突き刺し 2回連続で ダメージ。 毒状態に することが ある。" }, "pinMissile": { "name": "ミサイルばり", - "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" }, "leer": { "name": "にらみつける", - "effect": "鋭い 目つきで おびえさせて 相手の 防御を さげる。" + "effect": "鋭い 目つきで おびえさせて 相手の 防御を さげる。" }, "bite": { "name": "かみつく", - "effect": "鋭く とがった 歯で かみついて 攻撃する。 相手を ひるませることが ある。" + "effect": "鋭く とがった 歯で かみついて 攻撃する。 相手を ひるませることが ある。" }, "growl": { "name": "なきごえ", - "effect": "かわいい なきごえを 聞かせて 気を ひき 油断を させて 相手の 攻撃を さげる。" + "effect": "かわいい なきごえを 聞かせて 気を ひき 油断を させて 相手の 攻撃を さげる。" }, "roar": { "name": "ほえる", - "effect": "相手を 逃がして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" + "effect": "相手を 逃がして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" }, "sing": { "name": "うたう", - "effect": "心地好い きれいな 歌声を 聞かせて 相手を 眠り状態に する。" + "effect": "心地好い きれいな 歌声を 聞かせて 相手を 眠り状態に する。" }, "supersonic": { "name": "ちょうおんぱ", - "effect": "特殊な 音波を 体から 発して 相手を 混乱させる。" + "effect": "特殊な 音波を 体から 発して 相手を 混乱させる。" }, "sonicBoom": { "name": "ソニックブーム", - "effect": "衝撃波を 相手に ぶつけて 攻撃する。 20の ダメージを 決まって 与える。" + "effect": "衝撃波を 相手に ぶつけて 攻撃する。 20の ダメージを 決まって 与える。" }, "disable": { "name": "かなしばり", - "effect": "相手の 動きを とめて 直前に だしていた 技を 4ターンの 間 使えなくする。" + "effect": "相手の 動きを とめて 直前に だしていた 技を 4ターンの 間 使えなくする。" }, "acid": { "name": "ようかいえき", - "effect": "強い 酸を 相手に かけて 攻撃する。 相手の 特防を さげることが ある。" + "effect": "強い 酸を 相手に かけて 攻撃する。 相手の 特防を さげることが ある。" }, "ember": { "name": "ひのこ", - "effect": "小さな 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。" + "effect": "小さな 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。" }, "flamethrower": { "name": "かえんほうしゃ", - "effect": "激しい 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。" + "effect": "激しい 炎を 相手に 発射して 攻撃する。 やけど状態に することが ある。" }, "mist": { "name": "しろいきり", - "effect": "白い霧で 体を おおう。 5ターンの 間 相手に 能力を さげられなく なる。" + "effect": "白い霧で 体を おおう。 5ターンの 間 相手に 能力を さげられなく なる。" }, "waterGun": { "name": "みずでっぽう", - "effect": "水を 勢いよく 相手に 発射して 攻撃する。" + "effect": "水を 勢いよく 相手に 発射して 攻撃する。" }, "hydroPump": { "name": "ハイドロポンプ", - "effect": "大量の 水を 激しい 勢いで 相手に 発射して 攻撃する。" + "effect": "大量の 水を 激しい 勢いで 相手に 発射して 攻撃する。" }, "surf": { "name": "なみのり", - "effect": "大きな 波で 自分の 周りに いるものを 攻撃する。" + "effect": "大きな 波で 自分の 周りに いるものを 攻撃する。" }, "iceBeam": { "name": "れいとうビーム", - "effect": "凍える ビームを 相手に 発射して 攻撃する。 こおり状態に することが ある。" + "effect": "凍える ビームを 相手に 発射して 攻撃する。 こおり状態に することが ある。" }, "blizzard": { "name": "ふぶき", - "effect": "激しい 吹雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。" + "effect": "激しい 吹雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。" }, "psybeam": { "name": "サイケこうせん", - "effect": "不思議な 光線を 相手に 発射して 攻撃する。 混乱させることが ある。" + "effect": "不思議な 光線を 相手に 発射して 攻撃する。 混乱させることが ある。" }, "bubbleBeam": { "name": "バブルこうせん", - "effect": "泡を 勢いよく 相手に 発射して 攻撃する。 素早さを さげる ことが ある。" + "effect": "泡を 勢いよく 相手に 発射して 攻撃する。 素早さを さげる ことが ある。" }, "auroraBeam": { "name": "オーロラビーム", - "effect": "にじいろの ビームを 相手に 発射して 攻撃する。 攻撃を さげる ことが ある。" + "effect": "にじいろの ビームを 相手に 発射して 攻撃する。 攻撃を さげる ことが ある。" }, "hyperBeam": { "name": "はかいこうせん", - "effect": "強い 光線を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" + "effect": "強い 光線を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" }, "peck": { "name": "つつく", - "effect": "鋭く とがった くちばしや つので 相手を 突いて 攻撃する。" + "effect": "鋭く とがった くちばしや つので 相手を 突いて 攻撃する。" }, "drillPeck": { "name": "ドリルくちばし", - "effect": "回転しながら とがった くちばしを 相手に 突き刺して 攻撃する。" + "effect": "回転しながら とがった くちばしを 相手に 突き刺して 攻撃する。" }, "submission": { "name": "じごくぐるま", - "effect": "地面に 自分ごと 相手を 投げつけて 攻撃する。 自分も 少し ダメージを 受ける。" + "effect": "地面に 自分ごと 相手を 投げつけて 攻撃する。 自分も 少し ダメージを 受ける。" }, "lowKick": { "name": "けたぐり", - "effect": "足を 強く けり 相手を 転ばせて 攻撃する。 相手が 重いほど 威力が あがる。" + "effect": "足を 強く けり 相手を 転ばせて 攻撃する。 相手が 重いほど 威力が あがる。" }, "counter": { "name": "カウンター", - "effect": "相手から 受けた 物理攻撃の ダメージを 2倍に して 同じ 相手に 返す。" + "effect": "相手から 受けた 物理攻撃の ダメージを 2倍に して 同じ 相手に 返す。" }, "seismicToss": { "name": "ちきゅうなげ", - "effect": "引力を 使い 投げとばす。 自分の レベルと 同じ ダメージを 相手に 与える。" + "effect": "引力を 使い 投げとばす。 自分の レベルと 同じ ダメージを 相手に 与える。" }, "strength": { "name": "かいりき", - "effect": "こん身の 力で 相手を なぐりつけて 攻撃する。" + "effect": "こん身の 力で 相手を なぐりつけて 攻撃する。" }, "absorb": { "name": "すいとる", - "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" + "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" }, "megaDrain": { "name": "メガドレイン", - "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" + "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" }, "leechSeed": { "name": "やどりぎのタネ", - "effect": "植えつけた 相手の HPを 毎ターン 少しだけ 吸い取り 自分の HPを 回復する。" + "effect": "植えつけた 相手の HPを 毎ターン 少しだけ 吸い取り 自分の HPを 回復する。" }, "growth": { "name": "せいちょう", - "effect": "体を 一気に 大きく 生長させて 攻撃と 特攻を あげる。" + "effect": "体を 一気に 大きく 生長させて 攻撃と 特攻を あげる。" }, "razorLeaf": { "name": "はっぱカッター", - "effect": "はっぱを とばして 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" + "effect": "はっぱを とばして 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" }, "solarBeam": { "name": "ソーラービーム", - "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に 光の 束を 発射して 攻撃する。" + "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に 光の 束を 発射して 攻撃する。" }, "poisonPowder": { "name": "どくのこな", - "effect": "毒の ある 粉を たくさん ふりまいて 相手を 毒状態に する。" + "effect": "毒の ある 粉を たくさん ふりまいて 相手を 毒状態に する。" }, "stunSpore": { "name": "しびれごな", - "effect": "しびれる 粉を たくさん ふりまいて 相手を まひ状態に する。" + "effect": "しびれる 粉を たくさん ふりまいて 相手を まひ状態に する。" }, "sleepPowder": { "name": "ねむりごな", - "effect": "眠くなる 粉を たくさん ふりまいて 相手を 眠り状態に する。" + "effect": "眠くなる 粉を たくさん ふりまいて 相手を 眠り状態に する。" }, "petalDance": { "name": "はなびらのまい", - "effect": "2ー3ターンの 間 花を まきちらして 相手を 攻撃する。 まきちらした あとは 混乱する。" + "effect": "2ー3ターンの 間 花を まきちらして 相手を 攻撃する。 まきちらした あとは 混乱する。" }, "stringShot": { "name": "いとをはく", - "effect": "口から 吹きだした 糸を まきつけて 相手の 素早さを がくっと さげる。" + "effect": "口から 吹きだした 糸を まきつけて 相手の 素早さを がくっと さげる。" }, "dragonRage": { "name": "りゅうのいかり", - "effect": "怒りの 衝撃波を 相手に ぶつけて 攻撃する。 40の ダメージを 決まって 与える。" + "effect": "怒りの 衝撃波を 相手に ぶつけて 攻撃する。 40の ダメージを 決まって 与える。" }, "fireSpin": { "name": "ほのおのうず", - "effect": "激しく 渦をまく 炎の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + "effect": "激しく 渦をまく 炎の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" }, "thunderShock": { "name": "でんきショック", - "effect": "電気の 刺激を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。" + "effect": "電気の 刺激を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。" }, "thunderbolt": { "name": "10まんボルト", - "effect": "強い 電撃を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。" + "effect": "強い 電撃を 相手に 浴びせて 攻撃する。 まひ状態に することが ある。" }, "thunderWave": { "name": "でんじは", - "effect": "弱い 電撃を 浴びせることで 相手を まひ状態に する。" + "effect": "弱い 電撃を 浴びせることで 相手を まひ状態に する。" }, "thunder": { "name": "かみなり", - "effect": "激しい 雷を 相手に 落として 攻撃する。 まひ状態に することが ある。" + "effect": "激しい 雷を 相手に 落として 攻撃する。 まひ状態に することが ある。" }, "rockThrow": { "name": "いわおとし", - "effect": "小さな 岩を 持ちあげて 相手に 投げつけて 攻撃する。" + "effect": "小さな 岩を 持ちあげて 相手に 投げつけて 攻撃する。" }, "earthquake": { "name": "じしん", - "effect": "地震の 衝撃で 自分の 周りに いるものを 攻撃する。" + "effect": "地震の 衝撃で 自分の 周りに いるものを 攻撃する。" }, "fissure": { "name": "じわれ", - "effect": "地割れの 裂け目に 相手を 落として 攻撃する。 当たれば 一撃で ひんしに する。" + "effect": "地割れの 裂け目に 相手を 落として 攻撃する。 当たれば 一撃で ひんしに する。" }, "dig": { "name": "あなをほる", - "effect": "1ターン目に 潜り 2ターン目で 相手を 攻撃する。" + "effect": "1ターン目に 潜り 2ターン目で 相手を 攻撃する。" }, "toxic": { "name": "どくどく", - "effect": "相手を 猛毒の 状態に する。 ターンが すすむほど 毒の ダメージが 増えていく。" + "effect": "相手を 猛毒の 状態に する。 ターンが すすむほど 毒の ダメージが 増えていく。" }, "confusion": { "name": "ねんりき", - "effect": "弱い 念力を 相手に 送って 攻撃する。 相手を 混乱させることが ある。" + "effect": "弱い 念力を 相手に 送って 攻撃する。 相手を 混乱させることが ある。" }, "psychic": { "name": "サイコキネシス", - "effect": "強い 念力を 相手に 送って 攻撃する。 相手の 特防を さげることが ある。" + "effect": "強い 念力を 相手に 送って 攻撃する。 相手の 特防を さげることが ある。" }, "hypnosis": { "name": "さいみんじゅつ", - "effect": "眠気を 誘う 暗示を かけて 相手を 眠り状態に する。" + "effect": "眠気を 誘う 暗示を かけて 相手を 眠り状態に する。" }, "meditate": { "name": "ヨガのポーズ", - "effect": "眠っている 力を 体の 奥から ひきだして 自分の 攻撃を あげる。" + "effect": "眠っている 力を 体の 奥から ひきだして 自分の 攻撃を あげる。" }, "agility": { "name": "こうそくいどう", - "effect": "力を ぬいて 体を 軽くして 高速で 動く。 自分の 素早さを ぐーんと あげる。" + "effect": "力を ぬいて 体を 軽くして 高速で 動く。 自分の 素早さを ぐーんと あげる。" }, "quickAttack": { "name": "でんこうせっか", - "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。" + "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。" }, "rage": { "name": "いかり", - "effect": "技を だしたときに 攻撃を 受けると 怒りの 力で 攻撃が あがる。" + "effect": "技を だしたときに 攻撃を 受けると 怒りの 力で 攻撃が あがる。" }, "teleport": { "name": "テレポート", - "effect": "ひかえの ポケモンが いるときに 使うと 入れ替わる。 野生の ポケモンは 逃げてしまう。" + "effect": "ひかえの ポケモンが いるときに 使うと 入れ替わる。 野生の ポケモンは 逃げてしまう。" }, "nightShade": { "name": "ナイトヘッド", - "effect": "恐ろしい 幻を みせて 自分の レベルと 同じだけの ダメージを 相手に 与える。" + "effect": "恐ろしい 幻を みせて 自分の レベルと 同じだけの ダメージを 相手に 与える。" }, "mimic": { "name": "ものまね", - "effect": "相手が 最後に 使った 技を 戦闘の あいだ 自分の 技に することが できる。" + "effect": "相手が 最後に 使った 技を 戦闘の あいだ 自分の 技に することが できる。" }, "screech": { "name": "いやなおと", - "effect": "おもわず 耳を ふさぎたくなる いやなおとを だして 相手の 防御を がくっと さげる。" + "effect": "おもわず 耳を ふさぎたくなる いやなおとを だして 相手の 防御を がくっと さげる。" }, "doubleTeam": { "name": "かげぶんしん", - "effect": "素早い 動きで 分身を つくり 相手を まどわせて 回避率を あげる。" + "effect": "素早い 動きで 分身を つくり 相手を まどわせて 回避率を あげる。" }, "recover": { "name": "じこさいせい", - "effect": "細胞を 再生させて 自分の 最大HPの 半分の HPを 回復する。" + "effect": "細胞を 再生させて 自分の 最大HPの 半分の HPを 回復する。" }, "harden": { "name": "かたくなる", - "effect": "全身に 力を こめて 体を 硬くして 自分の 防御を あげる。" + "effect": "全身に 力を こめて 体を 硬くして 自分の 防御を あげる。" }, "minimize": { "name": "ちいさくなる", - "effect": "体を ちぢめて 小さく みせて 自分の 回避率を ぐーんと あげる。" + "effect": "体を ちぢめて 小さく みせて 自分の 回避率を ぐーんと あげる。" }, "smokescreen": { "name": "えんまく", - "effect": "煙や 墨などを 吹きかけて 相手の 命中率を さげる。" + "effect": "煙や 墨などを 吹きかけて 相手の 命中率を さげる。" }, "confuseRay": { "name": "あやしいひかり", - "effect": "怪しい 光を 相手に みせて まどわせる。 相手を 混乱させる。" + "effect": "怪しい 光を 相手に みせて まどわせる。 相手を 混乱させる。" }, "withdraw": { "name": "からにこもる", - "effect": "殻に 潜りこんで 身を守り 自分の 防御を あげる。" + "effect": "殻に 潜りこんで 身を守り 自分の 防御を あげる。" }, "defenseCurl": { "name": "まるくなる", - "effect": "体を まるめて ちぢこまり 自分の 防御を あげる。" + "effect": "体を まるめて ちぢこまり 自分の 防御を あげる。" }, "barrier": { "name": "バリアー", - "effect": "頑丈な 壁を つくって 自分の 防御を ぐーんと あげる。" + "effect": "頑丈な 壁を つくって 自分の 防御を ぐーんと あげる。" }, "lightScreen": { "name": "ひかりのかべ", - "effect": "5ターンの 間 不思議な かべで 相手から 受ける 特殊攻撃の ダメージを 弱める。" + "effect": "5ターンの 間 不思議な かべで 相手から 受ける 特殊攻撃の ダメージを 弱める。" }, "haze": { "name": "くろいきり", - "effect": "黒い霧を だして 戦闘に でている ポケモン 全員の 能力変化を もとに もどす。" + "effect": "黒い霧を だして 戦闘に でている ポケモン 全員の 能力変化を もとに もどす。" }, "reflect": { "name": "リフレクター", - "effect": "5ターンの 間 不思議な かべで 相手から 受ける 物理攻撃の ダメージを 弱める。" + "effect": "5ターンの 間 不思議な かべで 相手から 受ける 物理攻撃の ダメージを 弱める。" }, "focusEnergy": { "name": "きあいだめ", - "effect": "深く 息を 吸い 気合を こめる。 自分の 攻撃が 急所に 当たりやすくなる。" + "effect": "深く 息を 吸い 気合を こめる。 自分の 攻撃が 急所に 当たりやすくなる。" }, "bide": { "name": "がまん", - "effect": "2ターンの 間 攻撃に たえて 受けた ダメージを 2倍にして 相手に 返す。" + "effect": "2ターンの 間 攻撃に たえて 受けた ダメージを 2倍にして 相手に 返す。" }, "metronome": { "name": "ゆびをふる", - "effect": "指をふり 自分の 脳を 刺激して すべての 技の なかから どれか 1つを くりだす。" + "effect": "指をふり 自分の 脳を 刺激して すべての 技の なかから どれか 1つを くりだす。" }, "mirrorMove": { "name": "オウムがえし", - "effect": "相手の 使った 技を まねして 自分も 同じ技を 使う。" + "effect": "相手の 使った 技を まねして 自分も 同じ技を 使う。" }, "selfDestruct": { "name": "じばく", - "effect": "爆発を おこして 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。" + "effect": "爆発を おこして 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。" }, "eggBomb": { "name": "タマゴばくだん", - "effect": "大きな タマゴを 力いっぱい 相手に 投げつけて 攻撃する。" + "effect": "大きな タマゴを 力いっぱい 相手に 投げつけて 攻撃する。" }, "lick": { "name": "したでなめる", - "effect": "長い 舌で 相手を なめまわして 攻撃する。 まひ状態に することが ある。" + "effect": "長い 舌で 相手を なめまわして 攻撃する。 まひ状態に することが ある。" }, "smog": { "name": "スモッグ", - "effect": "汚れた ガスを 相手に 吹きつけて 攻撃する。 毒状態に することが ある。" + "effect": "汚れた ガスを 相手に 吹きつけて 攻撃する。 毒状態に することが ある。" }, "sludge": { "name": "ヘドロこうげき", - "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。" + "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。" }, "boneClub": { "name": "ホネこんぼう", - "effect": "手に 持った ホネで 相手を なぐりつけて 攻撃する。 相手を ひるませることが ある。" + "effect": "手に 持った ホネで 相手を なぐりつけて 攻撃する。 相手を ひるませることが ある。" }, "fireBlast": { "name": "だいもんじ", - "effect": "大の字の 炎で 相手を 焼きつくす。 やけど状態に することが ある。" + "effect": "大の字の 炎で 相手を 焼きつくす。 やけど状態に することが ある。" }, "waterfall": { "name": "たきのぼり", - "effect": "すごい 勢いで 相手に つっこむ。 相手を ひるませることが ある。" + "effect": "すごい 勢いで 相手に つっこむ。 相手を ひるませることが ある。" }, "clamp": { "name": "からではさむ", - "effect": "とても 頑丈な ぶあつい 殻に 4ー5ターンの 間 相手を はさんで 攻撃する。" + "effect": "とても 頑丈な ぶあつい 殻に 4ー5ターンの 間 相手を はさんで 攻撃する。" }, "swift": { "name": "スピードスター", - "effect": "星型の 光を 発射して 相手を 攻撃する。 攻撃は 必ず 命中する。" + "effect": "星型の 光を 発射して 相手を 攻撃する。 攻撃は 必ず 命中する。" }, "skullBash": { "name": "ロケットずつき", - "effect": "1ターン目に 頭を ひっこめて 防御を あげる。 2ターン目に 相手を 攻撃する。" + "effect": "1ターン目に 頭を ひっこめて 防御を あげる。 2ターン目に 相手を 攻撃する。" }, "spikeCannon": { "name": "とげキャノン", - "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "鋭い ハリを 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" }, "constrict": { "name": "からみつく", - "effect": "触手や ツタなどを からみつけて 攻撃する。相手の 素早さを さげることが ある。" + "effect": "触手や ツタなどを からみつけて 攻撃する。相手の 素早さを さげることが ある。" }, "amnesia": { "name": "ドわすれ", - "effect": "頭を からにして 一瞬 なにかを 忘れることで 自分の 特防を ぐーんと あげる。" + "effect": "頭を からにして 一瞬 なにかを 忘れることで 自分の 特防を ぐーんと あげる。" }, "kinesis": { "name": "スプーンまげ", - "effect": "スプーンを まげて 注意を ひき 相手の 命中率を さげる。" + "effect": "スプーンを まげて 注意を ひき 相手の 命中率を さげる。" }, "softBoiled": { "name": "タマゴうみ", - "effect": "最大HPの 半分 自分の HPを 回復する。" + "effect": "最大HPの 半分 自分の HPを 回復する。" }, "highJumpKick": { "name": "とびひざげり", - "effect": "ジャンプからの ひざげりで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。" + "effect": "ジャンプからの ひざげりで 相手を 攻撃する。 はずすと 自分が ダメージを 受ける。" }, "glare": { "name": "へびにらみ", - "effect": "おなかの 模様で おびえさせて 相手を まひの 状態に する。" + "effect": "おなかの 模様で おびえさせて 相手を まひの 状態に する。" }, "dreamEater": { "name": "ゆめくい", - "effect": "寝ている 相手の 夢を 食べて 攻撃する。 ダメージの 半分の HPを 回復する。" + "effect": "寝ている 相手の 夢を 食べて 攻撃する。 ダメージの 半分の HPを 回復する。" }, "poisonGas": { "name": "どくガス", - "effect": "毒ガスを 相手の 顔に 吹きかけて 毒の 状態に する。" + "effect": "毒ガスを 相手の 顔に 吹きかけて 毒の 状態に する。" }, "barrage": { "name": "たまなげ", - "effect": "まるい ものを 相手に 投げつけて 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "まるい ものを 相手に 投げつけて 攻撃する。 2ー5回の 間 連続で だす。" }, "leechLife": { "name": "きゅうけつ", - "effect": "血を 吸い取って 相手を 攻撃する。 与えた ダメージの 半分の HPを 回復できる。" + "effect": "血を 吸い取って 相手を 攻撃する。 与えた ダメージの 半分の HPを 回復できる。" }, "lovelyKiss": { "name": "あくまのキッス", - "effect": "恐ろしい 顔で キスを せまる。 相手を 眠り状態に する。" + "effect": "恐ろしい 顔で キスを せまる。 相手を 眠り状態に する。" }, "skyAttack": { "name": "ゴッドバード", - "effect": "2ターン目に 相手を 攻撃する。 たまに ひるませる。 急所にも 当たりやすい。" + "effect": "2ターン目に 相手を 攻撃する。 たまに ひるませる。 急所にも 当たりやすい。" }, "transform": { "name": "へんしん", - "effect": "相手の ポケモンに 変身することで 相手と まったく 同じ 技が 使える。" + "effect": "相手の ポケモンに 変身することで 相手と まったく 同じ 技が 使える。" }, "bubble": { "name": "あわ", - "effect": "無数の 泡を 相手に 吹きかけて 攻撃する。 相手の 素早さを さげることが ある。" + "effect": "無数の 泡を 相手に 吹きかけて 攻撃する。 相手の 素早さを さげることが ある。" }, "dizzyPunch": { "name": "ピヨピヨパンチ", - "effect": "リズミカルに パンチを くりだして 相手を 攻撃する。 混乱させることが ある。" + "effect": "リズミカルに パンチを くりだして 相手を 攻撃する。 混乱させることが ある。" }, "spore": { "name": "キノコのほうし", - "effect": "催眠効果の ある 胞子を パラパラと ふりまき 相手を 眠り状態に する。" + "effect": "催眠効果の ある 胞子を パラパラと ふりまき 相手を 眠り状態に する。" }, "flash": { "name": "フラッシュ", - "effect": "まぶしい 光で 相手の 命中率を さげる。" + "effect": "まぶしい 光で 相手の 命中率を さげる。" }, "psywave": { "name": "サイコウェーブ", - "effect": "不思議な 念波を 相手に 発射して 攻撃する。 使うたびに ダメージが 変わる。" + "effect": "不思議な 念波を 相手に 発射して 攻撃する。 使うたびに ダメージが 変わる。" }, "splash": { "name": "はねる", - "effect": "攻撃もせずに ピョン ピョンと 跳ねるだけで なにも おこらない……。" + "effect": "攻撃もせずに ピョン ピョンと 跳ねるだけで なにも おこらない……。" }, "acidArmor": { "name": "とける", - "effect": "細胞の 変化で 液状に なり 自分の 防御を ぐーんと あげる。" + "effect": "細胞の 変化で 液状に なり 自分の 防御を ぐーんと あげる。" }, "crabhammer": { "name": "クラブハンマー", - "effect": "大きな ハサミを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。" + "effect": "大きな ハサミを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。" }, "explosion": { "name": "だいばくはつ", - "effect": "大きな 爆発で 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。" + "effect": "大きな 爆発で 自分の 周りに いるものを 攻撃する。 使ったあとに ひんしに なる。" }, "furySwipes": { "name": "みだれひっかき", - "effect": "ツメや カマなどで 相手を ひっかいて 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "ツメや カマなどで 相手を ひっかいて 攻撃する。 2ー5回の 間 連続で だす。" }, "bonemerang": { "name": "ホネブーメラン", - "effect": "手に 持った ホネを 相手に 投げつけ 行きと 帰りの 2回連続で ダメージを 与える。" + "effect": "手に 持った ホネを 相手に 投げつけ 行きと 帰りの 2回連続で ダメージを 与える。" }, "rest": { "name": "ねむる", - "effect": "2ターンの 間 眠り続ける。 自分の HPと 状態異常を すべて 回復する。" + "effect": "2ターンの 間 眠り続ける。 自分の HPと 状態異常を すべて 回復する。" }, "rockSlide": { "name": "いわなだれ", - "effect": "大きな 岩を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。" + "effect": "大きな 岩を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。" }, "hyperFang": { "name": "ひっさつまえば", - "effect": "鋭い 前歯で 強く かみついて 攻撃する。 相手を ひるませることが ある。" + "effect": "鋭い 前歯で 強く かみついて 攻撃する。 相手を ひるませることが ある。" }, "sharpen": { "name": "かくばる", - "effect": "体の かどを 増やして カクカクに なることで 自分の 攻撃を あげる。" + "effect": "体の かどを 増やして カクカクに なることで 自分の 攻撃を あげる。" }, "conversion": { "name": "テクスチャー", - "effect": "自分の タイプを おぼえている 技で 一番 上の 技と 同じ タイプに する。" + "effect": "自分の タイプを おぼえている 技で 一番 上の 技と 同じ タイプに する。" }, "triAttack": { "name": "トライアタック", - "effect": "3つの 光線で 攻撃する。 まひか やけどか こおり状態の どれかに することが ある。" + "effect": "3つの 光線で 攻撃する。 まひか やけどか こおり状態の どれかに することが ある。" }, "superFang": { "name": "いかりのまえば", - "effect": "鋭い 前歯で 激しく かみついて 攻撃する。 相手の HPは 半分に なる。" + "effect": "鋭い 前歯で 激しく かみついて 攻撃する。 相手の HPは 半分に なる。" }, "slash": { "name": "きりさく", - "effect": "ツメや カマなどで 相手を 切り裂いて 攻撃する。 急所に 当たりやすい。" + "effect": "ツメや カマなどで 相手を 切り裂いて 攻撃する。 急所に 当たりやすい。" }, "substitute": { "name": "みがわり", - "effect": "自分の HPを 少し 削って 分身を だす。 分身は 自分の 身代わりに なる。" + "effect": "自分の HPを 少し 削って 分身を だす。 分身は 自分の 身代わりに なる。" }, "struggle": { "name": "わるあがき", - "effect": "自分の PPが なくなると あがいて 相手を 攻撃する。 自分も 少し ダメージを 受ける。" + "effect": "自分の PPが なくなると あがいて 相手を 攻撃する。 自分も 少し ダメージを 受ける。" }, "sketch": { "name": "スケッチ", - "effect": "相手が 使った 技を 自分の ものに する。 1回 使うと スケッチは 消える。" + "effect": "相手が 使った 技を 自分の ものに する。 1回 使うと スケッチは 消える。" }, "tripleKick": { "name": "トリプルキック", - "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。" + "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。" }, "thief": { "name": "どろぼう", - "effect": "攻撃と 同時に 道具を 盗もうとする。 盗む 可能性は 30%。" + "effect": "攻撃と 同時に 道具を 盗もうとする。 盗む 可能性は 30%。" }, "spiderWeb": { "name": "クモのす", - "effect": "ネバネバした 細い 糸を グルグルと からませて 相手を 戦闘から 逃げられなくする。" + "effect": "ネバネバした 細い 糸を グルグルと からませて 相手を 戦闘から 逃げられなくする。" }, "mindReader": { "name": "こころのめ", - "effect": "相手の 動きを 心で 感じて 次の 攻撃が 必ず 相手に 当たるように する。" + "effect": "相手の 動きを 心で 感じて 次の 攻撃が 必ず 相手に 当たるように する。" }, "nightmare": { "name": "あくむ", - "effect": "眠り状態の 相手に 悪夢を みせて 毎ターン 少しずつ HPを 減らしていく。" + "effect": "眠り状態の 相手に 悪夢を みせて 毎ターン 少しずつ HPを 減らしていく。" }, "flameWheel": { "name": "かえんぐるま", - "effect": "炎を まとい 相手に 突進して 攻撃する。 やけど状態に することが ある。" + "effect": "炎を まとい 相手に 突進して 攻撃する。 やけど状態に することが ある。" }, "snore": { "name": "いびき", - "effect": "自分が 寝ているときに 雑音を だして 攻撃する。 相手を ひるませることが ある。" + "effect": "自分が 寝ているときに 雑音を だして 攻撃する。 相手を ひるませることが ある。" }, "curse": { "name": "のろい", - "effect": "使う ポケモンが ゴーストタイプと それ以外 とでは 効果が 変わる。" + "effect": "使う ポケモンが ゴーストタイプと それ以外 とでは 効果が 変わる。" }, "flail": { "name": "じたばた", - "effect": "じたばた 暴れて 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。" + "effect": "じたばた 暴れて 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。" }, "conversion2": { "name": "テクスチャー2", - "effect": "相手が 最後に 使った技に 抵抗できる ように 自分の タイプを 変化させる。" + "effect": "相手が 最後に 使った技に 抵抗できる ように 自分の タイプを 変化させる。" }, "aeroblast": { "name": "エアロブラスト", - "effect": "空気の 渦を 発射して 攻撃する。 急所に 当たりやすい。" + "effect": "空気の 渦を 発射して 攻撃する。 急所に 当たりやすい。" }, "cottonSpore": { "name": "わたほうし", - "effect": "綿のような フワフワの 胞子を まとわり つかせて 相手の 素早さを がくっと さげる。" + "effect": "綿のような フワフワの 胞子を まとわり つかせて 相手の 素早さを がくっと さげる。" }, "reversal": { "name": "きしかいせい", - "effect": "力を ふりしぼり 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。" + "effect": "力を ふりしぼり 攻撃する。 自分の HPが 少ないほど 技の 威力は あがる。" }, "spite": { "name": "うらみ", - "effect": "相手が 最後に 使った技に 恨みを 抱いて その技の PPを 4だけ 減らす。" + "effect": "相手が 最後に 使った技に 恨みを 抱いて その技の PPを 4だけ 減らす。" }, "powderSnow": { "name": "こなゆき", - "effect": "冷たい 粉雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。" + "effect": "冷たい 粉雪を 相手に 吹きつけて 攻撃する。 こおり状態に することが ある。" }, "protect": { "name": "まもる", - "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" + "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" }, "machPunch": { "name": "マッハパンチ", - "effect": "目にも 留まらぬ ものすごい 速さで パンチを くりだす。 必ず 先制攻撃 できる。" + "effect": "目にも 留まらぬ ものすごい 速さで パンチを くりだす。 必ず 先制攻撃 できる。" }, "scaryFace": { "name": "こわいかお", - "effect": "恐ろしい 顔で にらみ おびえさせて 相手の 素早さを がくっと さげる。" + "effect": "恐ろしい 顔で にらみ おびえさせて 相手の 素早さを がくっと さげる。" }, "feintAttack": { "name": "だましうち", - "effect": "さりげなく 相手に ちかづき 油断した すきを みて なぐりつける。 攻撃は 必ず 命中する。" + "effect": "さりげなく 相手に ちかづき 油断した すきを みて なぐりつける。 攻撃は 必ず 命中する。" }, "sweetKiss": { "name": "てんしのキッス", - "effect": "天使のように かわいく キスして 相手を 混乱させる。" + "effect": "天使のように かわいく キスして 相手を 混乱させる。" }, "bellyDrum": { "name": "はらだいこ", - "effect": "自分の HPを 最大HPの 半分 減らして 自分の 攻撃を 最大に あげる。" + "effect": "自分の HPを 最大HPの 半分 減らして 自分の 攻撃を 最大に あげる。" }, "sludgeBomb": { "name": "ヘドロばくだん", - "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。" + "effect": "汚い ヘドロを 相手に 投げつけて 攻撃する。 毒状態に することが ある。" }, "mudSlap": { "name": "どろかけ", - "effect": "相手の 顔などに 泥を 投げつけて 攻撃する。 命中率を さげる。" + "effect": "相手の 顔などに 泥を 投げつけて 攻撃する。 命中率を さげる。" }, "octazooka": { "name": "オクタンほう", - "effect": "相手の 顔などに 墨を 吹きかけて 攻撃する。 命中率を さげることが ある。" + "effect": "相手の 顔などに 墨を 吹きかけて 攻撃する。 命中率を さげることが ある。" }, "spikes": { "name": "まきびし", - "effect": "相手の 足下に まきびしを しかける。交代で でてきた 相手の ポケモンに ダメージを 与える。" + "effect": "相手の 足下に まきびしを しかける。交代で でてきた 相手の ポケモンに ダメージを 与える。" }, "zapCannon": { "name": "でんじほう", - "effect": "大砲の ような 電気を 発射して 攻撃する。 相手を まひの 状態に する。" + "effect": "大砲の ような 電気を 発射して 攻撃する。 相手を まひの 状態に する。" }, "foresight": { "name": "みやぶる", - "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" + "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" }, "destinyBond": { "name": "みちづれ", - "effect": "技のあと 相手の 攻撃で ひんしに なると 攻撃 相手も ひんしにする。 連続して 出すと 失敗する。" + "effect": "技のあと 相手の 攻撃で ひんしに なると 攻撃 相手も ひんしにする。 連続して 出すと 失敗する。" }, "perishSong": { "name": "ほろびのうた", - "effect": "歌を 聴いた ポケモンは 3ターン たつと ひんしに なる。 交代すると 効果は なくなる。" + "effect": "歌を 聴いた ポケモンは 3ターン たつと ひんしに なる。 交代すると 効果は なくなる。" }, "icyWind": { "name": "こごえるかぜ", - "effect": "凍てつく 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。" + "effect": "凍てつく 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。" }, "detect": { "name": "みきり", - "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" + "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" }, "boneRush": { "name": "ボーンラッシュ", - "effect": "硬い ホネで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "硬い ホネで 相手を なぐりつけて 攻撃する。 2ー5回の 間 連続で だす。" }, "lockOn": { "name": "ロックオン", - "effect": "照準を しっかり あわせて 次の 攻撃が 必ず 相手に 当たるように する。" + "effect": "照準を しっかり あわせて 次の 攻撃が 必ず 相手に 当たるように する。" }, "outrage": { "name": "げきりん", - "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。" + "effect": "2ー3ターンの 間 暴れまくって 相手を 攻撃する。 暴れたあとは 混乱する。" }, "sandstorm": { "name": "すなあらし", - "effect": "5ターンの 間 砂あらしで いわ じめん はがねタイプ 以外に ダメージ。 いわタイプの 特防が あがる。" + "effect": "5ターンの 間 砂あらしで いわ じめん はがねタイプ 以外に ダメージ。 いわタイプの 特防が あがる。" }, "gigaDrain": { "name": "ギガドレイン", - "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" + "effect": "養分を 吸い取り 攻撃する。 相手に 与えた ダメージの 半分の HPを 回復できる。" }, "endure": { "name": "こらえる", - "effect": "攻撃を 受けても HPを 必ず 1だけ 残せる。 連続で だすと 失敗しやすい。" + "effect": "攻撃を 受けても HPを 必ず 1だけ 残せる。 連続で だすと 失敗しやすい。" }, "charm": { "name": "あまえる", - "effect": "かわいく みつめて 油断を 誘い 相手の 攻撃を がくっと さげる。" + "effect": "かわいく みつめて 油断を 誘い 相手の 攻撃を がくっと さげる。" }, "rollout": { "name": "ころがる", - "effect": "5ターンの 間 転がり続けて 攻撃する。 技が 当たるたびに 威力が あがる。" + "effect": "5ターンの 間 転がり続けて 攻撃する。 技が 当たるたびに 威力が あがる。" }, "falseSwipe": { "name": "みねうち", - "effect": "相手の HPが 必ず 1だけ 残るように 手加減して 攻撃する。" + "effect": "相手の HPが 必ず 1だけ 残るように 手加減して 攻撃する。" }, "swagger": { "name": "いばる", - "effect": "相手を 怒らせて 混乱させる。 怒りで 相手の 攻撃は ぐーんと あがってしまう。" + "effect": "相手を 怒らせて 混乱させる。 怒りで 相手の 攻撃は ぐーんと あがってしまう。" }, "milkDrink": { "name": "ミルクのみ", - "effect": "最大HPの 半分 自分の HPを 回復する。" + "effect": "最大HPの 半分 自分の HPを 回復する。" }, "spark": { "name": "スパーク", - "effect": "電気を まとい 相手に 突進して 攻撃する。 まひ状態に することが ある。" + "effect": "電気を まとい 相手に 突進して 攻撃する。 まひ状態に することが ある。" }, "furyCutter": { "name": "れんぞくぎり", - "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。 連続で 当てると 威力が あがる。" + "effect": "カマや ツメなどで 相手を 切りつけて 攻撃する。 連続で 当てると 威力が あがる。" }, "steelWing": { "name": "はがねのつばさ", - "effect": "硬い 翼を 相手に たたきつけて 攻撃する。 自分の 防御が あがることが ある。" + "effect": "硬い 翼を 相手に たたきつけて 攻撃する。 自分の 防御が あがることが ある。" }, "meanLook": { "name": "くろいまなざし", - "effect": "吸いこまれるような 黒い まなざしで じっと みつめて 相手を 戦闘から 逃げられなくする。" + "effect": "吸いこまれるような 黒い まなざしで じっと みつめて 相手を 戦闘から 逃げられなくする。" }, "attract": { "name": "メロメロ", - "effect": "♂なら♀を ♀なら♂を 誘惑して メロメロに する。 相手は 技が だしにくくなる。" + "effect": "♂なら♀を ♀なら♂を 誘惑して メロメロに する。 相手は 技が だしにくくなる。" }, "sleepTalk": { "name": "ねごと", - "effect": "自分が おぼえている 技の うち どれか 1つを くりだす。 自分が 寝ているときだけ 使える。" + "effect": "自分が おぼえている 技の うち どれか 1つを くりだす。 自分が 寝ているときだけ 使える。" }, "healBell": { "name": "いやしのすず", - "effect": "心地好い 鈴の 音色を 聞かせて 味方 全員の 状態異常を 回復 する。" + "effect": "心地好い 鈴の 音色を 聞かせて 味方 全員の 状態異常を 回復 する。" }, "return": { "name": "おんがえし", - "effect": "トレーナーの ために 全力で 相手を 攻撃する。 なついているほど 威力は あがる。" + "effect": "トレーナーの ために 全力で 相手を 攻撃する。 なついているほど 威力は あがる。" }, "present": { "name": "プレゼント", - "effect": "わなを しかけた 箱を 相手に わたして 攻撃する。HPが 回復して しまうことも ある。" + "effect": "わなを しかけた 箱を 相手に わたして 攻撃する。HPが 回復して しまうことも ある。" }, "frustration": { "name": "やつあたり", - "effect": "不満を はらすため 全力で 相手を 攻撃する。 なついていないほど 威力は あがる。" + "effect": "不満を はらすため 全力で 相手を 攻撃する。 なついていないほど 威力は あがる。" }, "safeguard": { "name": "しんぴのまもり", - "effect": "5ターンの 間 不思議な 力に 守られて 状態異常に ならなくなる。" + "effect": "5ターンの 間 不思議な 力に 守られて 状態異常に ならなくなる。" }, "painSplit": { "name": "いたみわけ", - "effect": "自分の HPと 相手の HPを あわせて それを 自分と 相手で なかよく わける。" + "effect": "自分の HPと 相手の HPを あわせて それを 自分と 相手で なかよく わける。" }, "sacredFire": { "name": "せいなるほのお", - "effect": "神秘の 炎で 相手を 焼きつくして 攻撃する。 やけど状態に することが ある。" + "effect": "神秘の 炎で 相手を 焼きつくして 攻撃する。 やけど状態に することが ある。" }, "magnitude": { "name": "マグニチュード", - "effect": "地面を 揺らして 自分の 周りに いるものを 攻撃する。 技の 威力は いろいろ 変わる。" + "effect": "地面を 揺らして 自分の 周りに いるものを 攻撃する。 技の 威力は いろいろ 変わる。" }, "dynamicPunch": { "name": "ばくれつパンチ", - "effect": "こん身の 力で パンチを くりだして 攻撃する。 相手を 必ず 混乱させる。" + "effect": "こん身の 力で パンチを くりだして 攻撃する。 相手を 必ず 混乱させる。" }, "megahorn": { "name": "メガホーン", - "effect": "硬くて りっぱな つので おもいっきり 相手を 突き刺して 攻撃する。" + "effect": "硬くて りっぱな つので おもいっきり 相手を 突き刺して 攻撃する。" }, "dragonBreath": { "name": "りゅうのいぶき", - "effect": "ものすごい 息を 相手に 吹きつけて 攻撃する。 まひ状態に することが ある。" + "effect": "ものすごい 息を 相手に 吹きつけて 攻撃する。 まひ状態に することが ある。" }, "batonPass": { "name": "バトンタッチ", - "effect": "控えの ポケモンと 入れ替わる。 能力変化は 替わった ポケモンが そのまま 受けつぐ。" + "effect": "控えの ポケモンと 入れ替わる。 能力変化は 替わった ポケモンが そのまま 受けつぐ。" }, "encore": { "name": "アンコール", - "effect": "相手に アンコールした 技を 3回 続けて 出させる。" + "effect": "相手に アンコールした 技を 3回 続けて 出させる。" }, "pursuit": { "name": "おいうち", - "effect": "相手 ポケモンが 入れ替わるときに 技を だしていると 倍の 威力で 攻撃できる。" + "effect": "相手 ポケモンが 入れ替わるときに 技を だしていると 倍の 威力で 攻撃できる。" }, "rapidSpin": { "name": "こうそくスピン", - "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。自分の 素早さも あがる。" + "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。自分の 素早さも あがる。" }, "sweetScent": { "name": "あまいかおり", - "effect": "香りで 相手の 回避率を がくっと さげる。" + "effect": "香りで 相手の 回避率を がくっと さげる。" }, "ironTail": { "name": "アイアンテール", - "effect": "硬い しっぽで 相手を たたきつけて 攻撃する。 相手の 防御を さげることが ある。" + "effect": "硬い しっぽで 相手を たたきつけて 攻撃する。 相手の 防御を さげることが ある。" }, "metalClaw": { "name": "メタルクロー", - "effect": "鋼鉄の ツメで 相手を 切り裂いて 攻撃する。 自分の 攻撃が あがることが ある。" + "effect": "鋼鉄の ツメで 相手を 切り裂いて 攻撃する。 自分の 攻撃が あがることが ある。" }, "vitalThrow": { "name": "あてみなげ", - "effect": "相手より あとに 攻撃する。 そのかわり 自分の 攻撃は 必ず 命中する。" + "effect": "相手より あとに 攻撃する。 そのかわり 自分の 攻撃は 必ず 命中する。" }, "morningSun": { "name": "あさのひざし", - "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" + "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" }, "synthesis": { "name": "こうごうせい", - "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" + "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" }, "moonlight": { "name": "つきのひかり", - "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" + "effect": "自分の HPを 回復する。 天気に よって 回復の 量が 変化する。" }, "hiddenPower": { "name": "めざめるパワー", - "effect": "技を 使った ポケモンに よって 技の タイプが 変わる。" + "effect": "技を 使った ポケモンに よって 技の タイプが 変わる。" }, "crossChop": { "name": "クロスチョップ", - "effect": "両手チョップを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。" + "effect": "両手チョップを 相手に たたきつけて 攻撃する。 急所に 当たりやすい。" }, "twister": { "name": "たつまき", - "effect": "竜巻を おこして 相手を まきこみ 攻撃する。 相手を ひるませることが ある。" + "effect": "竜巻を おこして 相手を まきこみ 攻撃する。 相手を ひるませることが ある。" }, "rainDance": { "name": "あまごい", - "effect": "5ターンの 間 雨を 降らせて みずタイプの 威力を あげる。 ほのおタイプの 威力は さがる。" + "effect": "5ターンの 間 雨を 降らせて みずタイプの 威力を あげる。 ほのおタイプの 威力は さがる。" }, "sunnyDay": { "name": "にほんばれ", - "effect": "5ターンの 間 日差しを 強くして ほのおタイプの 威力を あげる。 みずタイプの 威力は さがる。" + "effect": "5ターンの 間 日差しを 強くして ほのおタイプの 威力を あげる。 みずタイプの 威力は さがる。" }, "crunch": { "name": "かみくだく", - "effect": "鋭い 歯で 相手を かみくだいて 攻撃する。 相手の 防御を さげることが ある。" + "effect": "鋭い 歯で 相手を かみくだいて 攻撃する。 相手の 防御を さげることが ある。" }, "mirrorCoat": { "name": "ミラーコート", - "effect": "相手から 受けた 特殊攻撃の ダメージを 2倍に して その相手に 返す。" + "effect": "相手から 受けた 特殊攻撃の ダメージを 2倍に して その相手に 返す。" }, "psychUp": { "name": "じこあんじ", - "effect": "自分に 暗示を かけることで 能力変化の 状態を 相手と 同じにする。" + "effect": "自分に 暗示を かけることで 能力変化の 状態を 相手と 同じにする。" }, "extremeSpeed": { "name": "しんそく", - "effect": "目にも 留まらぬ ものすごい 速さで 相手に 突進して 攻撃する。 必ず 先制攻撃 できる。" + "effect": "目にも 留まらぬ ものすごい 速さで 相手に 突進して 攻撃する。 必ず 先制攻撃 できる。" }, "ancientPower": { "name": "げんしのちから", - "effect": "原始の 力で 攻撃する。 自分の すべての 能力が あがることが ある。" + "effect": "原始の 力で 攻撃する。 自分の すべての 能力が あがることが ある。" }, "shadowBall": { "name": "シャドーボール", - "effect": "黒い影の 塊を 投げつけて 攻撃する。 相手の 特防を さげることが ある。" + "effect": "黒い影の 塊を 投げつけて 攻撃する。 相手の 特防を さげることが ある。" }, "futureSight": { "name": "みらいよち", - "effect": "技を 使った 2ターン後に 相手に 念力の 塊を 送って 攻撃する。" + "effect": "技を 使った 2ターン後に 相手に 念力の 塊を 送って 攻撃する。" }, "rockSmash": { "name": "いわくだき", - "effect": "パンチで 攻撃する。相手の 防御を さげる ことが ある。" + "effect": "パンチで 攻撃する。相手の 防御を さげる ことが ある。" }, "whirlpool": { "name": "うずしお", - "effect": "激しく 渦をまく 水の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + "effect": "激しく 渦をまく 水の中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" }, "beatUp": { "name": "ふくろだたき", - "effect": "味方 全員で 攻撃する。 仲間の ポケモンが 多いほど 技の 攻撃回数が 増える。" + "effect": "味方 全員で 攻撃する。 仲間の ポケモンが 多いほど 技の 攻撃回数が 増える。" }, "fakeOut": { "name": "ねこだまし", - "effect": "先制攻撃で 相手を ひるませる。 戦闘に でたら すぐに ださないと 成功しない。" + "effect": "先制攻撃で 相手を ひるませる。 戦闘に でたら すぐに ださないと 成功しない。" }, "uproar": { "name": "さわぐ", - "effect": "3ターンの 間 騒いで 相手を 攻撃する。 そのあいだは だれも 眠れなくなる。" + "effect": "3ターンの 間 騒いで 相手を 攻撃する。 そのあいだは だれも 眠れなくなる。" }, "stockpile": { "name": "たくわえる", - "effect": "力を 蓄えて 自分の 防御と 特防を あげる。 最大 3回まで 蓄えられる。" + "effect": "力を 蓄えて 自分の 防御と 特防を あげる。 最大 3回まで 蓄えられる。" }, "spitUp": { "name": "はきだす", - "effect": "蓄えた 力を 相手に ぶつけて 攻撃する。 蓄えているほど 威力が あがる。" + "effect": "蓄えた 力を 相手に ぶつけて 攻撃する。 蓄えているほど 威力が あがる。" }, "swallow": { "name": "のみこむ", - "effect": "蓄えた 力を のみこんで 自分の HPを 回復する。 蓄えているほど 回復する。" + "effect": "蓄えた 力を のみこんで 自分の HPを 回復する。 蓄えているほど 回復する。" }, "heatWave": { "name": "ねっぷう", - "effect": "熱い 息を 相手に 吹きつけて 攻撃する。 やけど状態に することが ある。" + "effect": "熱い 息を 相手に 吹きつけて 攻撃する。 やけど状態に することが ある。" }, "hail": { "name": "あられ", - "effect": "5ターンの 間 あられを 降らして こおりタイプで ない ポケモン 全員に ダメージを 与える。" + "effect": "5ターンの 間 あられを 降らして こおりタイプで ない ポケモン 全員に ダメージを 与える。" }, "torment": { "name": "いちゃもん", - "effect": "相手に いちゃもんを つけて 同じ 技を 2回連続で だせなくする。" + "effect": "相手に いちゃもんを つけて 同じ 技を 2回連続で だせなくする。" }, "flatter": { "name": "おだてる", - "effect": "相手を おだてて 混乱させる。 同時に 相手の 特攻も あげてしまう。" + "effect": "相手を おだてて 混乱させる。 同時に 相手の 特攻も あげてしまう。" }, "willOWisp": { "name": "おにび", - "effect": "不気味で 怪しい 炎を 放って 相手を やけどの 状態に する。" + "effect": "不気味で 怪しい 炎を 放って 相手を やけどの 状態に する。" }, "memento": { "name": "おきみやげ", - "effect": "自分は ひんしに なるが そのかわりに 相手の 攻撃と 特攻を がくっと さげる。" + "effect": "自分は ひんしに なるが そのかわりに 相手の 攻撃と 特攻を がくっと さげる。" }, "facade": { "name": "からげんき", - "effect": "自分が 毒 まひ やけど 状態のとき 相手に くりだすと 技の 威力が 2倍に なる。" + "effect": "自分が 毒 まひ やけど 状態のとき 相手に くりだすと 技の 威力が 2倍に なる。" }, "focusPunch": { "name": "きあいパンチ", - "effect": "精神を 高めて パンチを くりだす。 技を だすまでに 攻撃を 受けると 失敗する。" + "effect": "精神を 高めて パンチを くりだす。 技を だすまでに 攻撃を 受けると 失敗する。" }, "smellingSalts": { "name": "きつけ", - "effect": "まひ状態の 相手には 威力が 2倍に なるが かわりに 相手の まひが 治る。" + "effect": "まひ状態の 相手には 威力が 2倍に なるが かわりに 相手の まひが 治る。" }, "followMe": { "name": "このゆびとまれ", - "effect": "自分に 注目させて 相手からの 攻撃を すべて 自分に むけさせる。" + "effect": "自分に 注目させて 相手からの 攻撃を すべて 自分に むけさせる。" }, "naturePower": { "name": "しぜんのちから", - "effect": "自然の 力で 攻撃する。 使う 場所で でてくる 技が 変化する。" + "effect": "自然の 力で 攻撃する。 使う 場所で でてくる 技が 変化する。" }, "charge": { "name": "じゅうでん", - "effect": "次の ターンに だす でんきタイプの 技の 威力を あげる。 自分の 特防も あがる。" + "effect": "次の ターンに だす でんきタイプの 技の 威力を あげる。 自分の 特防も あがる。" }, "taunt": { "name": "ちょうはつ", - "effect": "相手を 怒らせる。 3ターンの 間 相手は ダメージを 与える 技しか だせなくなる。" + "effect": "相手を 怒らせる。 3ターンの 間 相手は ダメージを 与える 技しか だせなくなる。" }, "helpingHand": { "name": "てだすけ", - "effect": "仲間を 助ける。 てだすけ された ポケモンの 技の 威力は いつもより 大きくなる。" + "effect": "仲間を 助ける。 てだすけ された ポケモンの 技の 威力は いつもより 大きくなる。" }, "trick": { "name": "トリック", - "effect": "相手の すきを ついて 自分と 相手の 持ち物を 交換する。" + "effect": "相手の すきを ついて 自分と 相手の 持ち物を 交換する。" }, "rolePlay": { "name": "なりきり", - "effect": "相手に なりきって 自分も 相手と 同じ 特性に 変化する。" + "effect": "相手に なりきって 自分も 相手と 同じ 特性に 変化する。" }, "wish": { "name": "ねがいごと", - "effect": "次の ターンに 自分 もしくは 入れ替わった ポケモンの HPを 最大HPの 半分 回復する。" + "effect": "次の ターンに 自分 もしくは 入れ替わった ポケモンの HPを 最大HPの 半分 回復する。" }, "assist": { "name": "ねこのて", - "effect": "大急ぎで 味方の 助けを かりて 味方の ポケモンが おぼえている 技を どれか 1つ 使う。" + "effect": "大急ぎで 味方の 助けを かりて 味方の ポケモンが おぼえている 技を どれか 1つ 使う。" }, "ingrain": { "name": "ねをはる", - "effect": "大地に 根を 張り 毎ターン 自分の HPを 回復する。 根を 張っているので 入れ替えられない。" + "effect": "大地に 根を 張り 毎ターン 自分の HPを 回復する。 根を 張っているので 入れ替えられない。" }, "superpower": { "name": "ばかぢから", - "effect": "すごい 力を 発揮して 相手を 攻撃する。自分の 攻撃と 防御が さがる。" + "effect": "すごい 力を 発揮して 相手を 攻撃する。自分の 攻撃と 防御が さがる。" }, "magicCoat": { "name": "マジックコート", - "effect": "状態異常に なる 技や やどりぎのタネ などを だされたとき 相手に 跳ね返す。" + "effect": "状態異常に なる 技や やどりぎのタネ などを だされたとき 相手に 跳ね返す。" }, "recycle": { "name": "リサイクル", - "effect": "戦闘中に 使って なくなった 自分の 持ち物を 再生させて 使えるように する。" + "effect": "戦闘中に 使って なくなった 自分の 持ち物を 再生させて 使えるように する。" }, "revenge": { "name": "リベンジ", - "effect": "相手から 技を 受けていると その相手に 対して 与える ダメージが 2倍に なる。" + "effect": "相手から 技を 受けていると その相手に 対して 与える ダメージが 2倍に なる。" }, "brickBreak": { "name": "かわらわり", - "effect": "手刀を 勢いよく 振りおろして 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。" + "effect": "手刀を 勢いよく 振りおろして 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。" }, "yawn": { "name": "あくび", - "effect": "大きな あくびで 眠気を 誘う。 次の ターンに 相手を 眠り状態に する。" + "effect": "大きな あくびで 眠気を 誘う。 次の ターンに 相手を 眠り状態に する。" }, "knockOff": { "name": "はたきおとす", - "effect": "相手の 持ち物を はたき 落として 戦闘が 終わるまで 使えなくする。 物を持つ 相手には ダメージが増す。" + "effect": "相手の 持ち物を はたき 落として 戦闘が 終わるまで 使えなくする。 物を持つ 相手には ダメージが増す。" }, "endeavor": { "name": "がむしゃら", - "effect": "相手の HPが 自分の HPと 同じくらいに なるように ダメージを 与える。" + "effect": "相手の HPが 自分の HPと 同じくらいに なるように ダメージを 与える。" }, "eruption": { "name": "ふんか", - "effect": "怒りを 爆発させて 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" + "effect": "怒りを 爆発させて 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" }, "skillSwap": { "name": "スキルスワップ", - "effect": "超能力で 自分の 特性と 相手の 特性を 入れ替える。" + "effect": "超能力で 自分の 特性と 相手の 特性を 入れ替える。" }, "imprison": { "name": "ふういん", - "effect": "相手が 自分と 同じ 技を おぼえていたら 相手だけ その技を 使えなくする。" + "effect": "相手が 自分と 同じ 技を おぼえていたら 相手だけ その技を 使えなくする。" }, "refresh": { "name": "リフレッシュ", - "effect": "体を やすめて 自分が おっている 毒 まひ やけどの 状態異常を 治す。" + "effect": "体を やすめて 自分が おっている 毒 まひ やけどの 状態異常を 治す。" }, "grudge": { "name": "おんねん", - "effect": "相手の 技で ひんしに されたとき おんねんを かけて その技の PPを 0に する。" + "effect": "相手の 技で ひんしに されたとき おんねんを かけて その技の PPを 0に する。" }, "snatch": { "name": "よこどり", - "effect": "相手が 使おうと した 回復技や 能力変化の 技を うばって 自分に 使う。" + "effect": "相手が 使おうと した 回復技や 能力変化の 技を うばって 自分に 使う。" }, "secretPower": { "name": "ひみつのちから", - "effect": "使う場所で 追加効果が 変化する 攻撃。" + "effect": "使う場所で 追加効果が 変化する 攻撃。" }, "dive": { "name": "ダイビング", - "effect": "1ターン目で 潜り 2ターン目に 浮きあがって 攻撃する。" + "effect": "1ターン目で 潜り 2ターン目に 浮きあがって 攻撃する。" }, "armThrust": { "name": "つっぱり", - "effect": "ひらいた 両手で 相手を つっぱって 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "ひらいた 両手で 相手を つっぱって 攻撃する。 2ー5回の 間 連続で だす。" }, "camouflage": { "name": "ほごしょく", - "effect": "水辺や 草むら どうくつなど いる 場所に あわせて 自分の タイプを 変える。" + "effect": "水辺や 草むら どうくつなど いる 場所に あわせて 自分の タイプを 変える。" }, "tailGlow": { "name": "ほたるび", - "effect": "点滅する 光を 眺めて 自分の 精神を 統一し 特攻を ぐぐーんと あげる。" + "effect": "点滅する 光を 眺めて 自分の 精神を 統一し 特攻を ぐぐーんと あげる。" }, "lusterPurge": { "name": "ラスターパージ", - "effect": "まばゆい 光を 解放して 攻撃する。 相手の 特防を さげることが ある。" + "effect": "まばゆい 光を 解放して 攻撃する。 相手の 特防を さげることが ある。" }, "mistBall": { "name": "ミストボール", - "effect": "霧状の 羽毛で 包みこみ 攻撃する。 相手の 特攻を さげることが ある。" + "effect": "霧状の 羽毛で 包みこみ 攻撃する。 相手の 特攻を さげることが ある。" }, "featherDance": { "name": "フェザーダンス", - "effect": "羽毛を ふりまいて 相手の 体に からませる。 相手の 攻撃を がくっと さげる。" + "effect": "羽毛を ふりまいて 相手の 体に からませる。 相手の 攻撃を がくっと さげる。" }, "teeterDance": { "name": "フラフラダンス", - "effect": "フラフラと ダンスを おどって 自分の 周りに いるものを 混乱状態に させる。" + "effect": "フラフラと ダンスを おどって 自分の 周りに いるものを 混乱状態に させる。" }, "blazeKick": { "name": "ブレイズキック", - "effect": "攻撃した 相手を やけど状態に することが ある。 急所にも 当たりやすい。" + "effect": "攻撃した 相手を やけど状態に することが ある。 急所にも 当たりやすい。" }, "mudSport": { "name": "どろあそび", - "effect": "あたりを 泥まみれにする。 5ターンの 間 でんきタイプの 技を 弱める。" + "effect": "あたりを 泥まみれにする。 5ターンの 間 でんきタイプの 技を 弱める。" }, "iceBall": { "name": "アイスボール", - "effect": "5ターンの 間 相手を 攻撃する。 技が 当たるたび 威力が あがる。" + "effect": "5ターンの 間 相手を 攻撃する。 技が 当たるたび 威力が あがる。" }, "needleArm": { "name": "ニードルアーム", - "effect": "トゲの 腕を 激しく ふるって 攻撃する。 相手を ひるませることが ある。" + "effect": "トゲの 腕を 激しく ふるって 攻撃する。 相手を ひるませることが ある。" }, "slackOff": { "name": "なまける", - "effect": "怠けて やすむ。 自分の HPを 最大HPの 半分 回復する。" + "effect": "怠けて やすむ。 自分の HPを 最大HPの 半分 回復する。" }, "hyperVoice": { "name": "ハイパーボイス", - "effect": "うるさく 響く 大きな 振動を 相手に 与えて 攻撃する。" + "effect": "うるさく 響く 大きな 振動を 相手に 与えて 攻撃する。" }, "poisonFang": { "name": "どくどくのキバ", - "effect": "毒の ある キバで 相手に かみついて 攻撃する。 猛毒を おわせる ことが ある。" + "effect": "毒の ある キバで 相手に かみついて 攻撃する。 猛毒を おわせる ことが ある。" }, "crushClaw": { "name": "ブレイククロー", - "effect": "硬く 鋭い ツメで 切り裂いて 攻撃する。 相手の 防御を さげることが ある。" + "effect": "硬く 鋭い ツメで 切り裂いて 攻撃する。 相手の 防御を さげることが ある。" }, "blastBurn": { "name": "ブラストバーン", - "effect": "爆発の 炎で 相手を 焼きつくして 攻撃する。 次の ターンは 動けなくなる。" + "effect": "爆発の 炎で 相手を 焼きつくして 攻撃する。 次の ターンは 動けなくなる。" }, "hydroCannon": { "name": "ハイドロカノン", - "effect": "水の 大砲を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" + "effect": "水の 大砲を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" }, "meteorMash": { "name": "コメットパンチ", - "effect": "すい星の ごとく パンチを くりだして 相手を 攻撃する。 自分の 攻撃が あがることが ある。" + "effect": "すい星の ごとく パンチを くりだして 相手を 攻撃する。 自分の 攻撃が あがることが ある。" }, "astonish": { "name": "おどろかす", - "effect": "大きな 声などで 不意に 驚かして 攻撃する。 相手を ひるませることが ある。" + "effect": "大きな 声などで 不意に 驚かして 攻撃する。 相手を ひるませることが ある。" }, "weatherBall": { "name": "ウェザーボール", - "effect": "使ったときの 天気に よって 技の タイプと 威力が 変わる。" + "effect": "使ったときの 天気に よって 技の タイプと 威力が 変わる。" }, "aromatherapy": { "name": "アロマセラピー", - "effect": "心地好い やすらぐ 香りを かがせて 味方全員の 状態異常を 回復する。" + "effect": "心地好い やすらぐ 香りを かがせて 味方全員の 状態異常を 回復する。" }, "fakeTears": { "name": "うそなき", - "effect": "ないた ふりをして 涙を 流す。 こまらせる ことで 相手の 特防を がくっと さげる。" + "effect": "ないた ふりをして 涙を 流す。 こまらせる ことで 相手の 特防を がくっと さげる。" }, "airCutter": { "name": "エアカッター", - "effect": "鋭い 風で 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" + "effect": "鋭い 風で 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" }, "overheat": { "name": "オーバーヒート", - "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。" + "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。" }, "odorSleuth": { "name": "かぎわける", - "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" + "effect": "ゴーストタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" }, "rockTomb": { "name": "がんせきふうじ", - "effect": "岩石を 投げつけて 攻撃する。 相手の 動きを 封じることで 素早さを さげる。" + "effect": "岩石を 投げつけて 攻撃する。 相手の 動きを 封じることで 素早さを さげる。" }, "silverWind": { "name": "ぎんいろのかぜ", - "effect": "風に りんぷんを のせて 相手を 攻撃する。自分の すべての 能力が あがることが ある。" + "effect": "風に りんぷんを のせて 相手を 攻撃する。自分の すべての 能力が あがることが ある。" }, "metalSound": { "name": "きんぞくおん", - "effect": "金属を こすって でるような いやな 音を 聞かせる。 相手の 特防を がくっと さげる。" + "effect": "金属を こすって でるような いやな 音を 聞かせる。 相手の 特防を がくっと さげる。" }, "grassWhistle": { "name": "くさぶえ", - "effect": "心地好い 笛の 音色を 聞かせて 相手を 眠りの 状態に する。" + "effect": "心地好い 笛の 音色を 聞かせて 相手を 眠りの 状態に する。" }, "tickle": { "name": "くすぐる", - "effect": "体を くすぐり 笑わせる ことで 相手の 攻撃と 防御を さげる。" + "effect": "体を くすぐり 笑わせる ことで 相手の 攻撃と 防御を さげる。" }, "cosmicPower": { "name": "コスモパワー", - "effect": "宇宙から 神秘の 力を とりこむ ことで 自分の 防御と 特防を あげる。" + "effect": "宇宙から 神秘の 力を とりこむ ことで 自分の 防御と 特防を あげる。" }, "waterSpout": { "name": "しおふき", - "effect": "潮を 吹きつけて 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" + "effect": "潮を 吹きつけて 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" }, "signalBeam": { "name": "シグナルビーム", - "effect": "不思議な 光を 発射して 攻撃する。 相手を 混乱させることが ある。" + "effect": "不思議な 光を 発射して 攻撃する。 相手を 混乱させることが ある。" }, "shadowPunch": { "name": "シャドーパンチ", - "effect": "影に まぎれて パンチを くりだす。 攻撃は 必ず 命中する。" + "effect": "影に まぎれて パンチを くりだす。 攻撃は 必ず 命中する。" }, "extrasensory": { "name": "じんつうりき", - "effect": "みえない 不思議な 力を 送って 攻撃する。 相手を ひるませることが ある。" + "effect": "みえない 不思議な 力を 送って 攻撃する。 相手を ひるませることが ある。" }, "skyUppercut": { "name": "スカイアッパー", - "effect": "空に むかうような 高い アッパーで 相手を 突きあげて 攻撃する。" + "effect": "空に むかうような 高い アッパーで 相手を 突きあげて 攻撃する。" }, "sandTomb": { "name": "すなじごく", - "effect": "激しく 吹きあれる 砂あらしの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + "effect": "激しく 吹きあれる 砂あらしの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" }, "sheerCold": { "name": "ぜったいれいど", - "effect": "相手を 一撃で 瀕死に する。 こおりタイプ 以外の ポケモンが 使うと 当たりにくい。" + "effect": "相手を 一撃で 瀕死に する。 こおりタイプ 以外の ポケモンが 使うと 当たりにくい。" }, "muddyWater": { "name": "だくりゅう", - "effect": "濁った 水を 相手に 発射して 攻撃する。 命中率を さげることが ある。" + "effect": "濁った 水を 相手に 発射して 攻撃する。 命中率を さげることが ある。" }, "bulletSeed": { "name": "タネマシンガン", - "effect": "タネを 勢いよく 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "タネを 勢いよく 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" }, "aerialAce": { "name": "つばめがえし", - "effect": "素早い 動きで 相手を ほんろうして 切りつける。 攻撃は 必ず 命中する。" + "effect": "素早い 動きで 相手を ほんろうして 切りつける。 攻撃は 必ず 命中する。" }, "icicleSpear": { "name": "つららばり", - "effect": "鋭い 氷柱を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "鋭い 氷柱を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" }, "ironDefense": { "name": "てっぺき", - "effect": "皮膚を 鉄のように 硬くする ことで 自分の 防御を ぐーんと あげる。" + "effect": "皮膚を 鉄のように 硬くする ことで 自分の 防御を ぐーんと あげる。" }, "block": { "name": "とおせんぼう", - "effect": "両手を ひろげて たちはだかり 相手の 逃げ道を ふさいで 逃げられなくする。" + "effect": "両手を ひろげて たちはだかり 相手の 逃げ道を ふさいで 逃げられなくする。" }, "howl": { "name": "とおぼえ", - "effect": "大声で ほえて 気合を 高め 自分と 味方の 攻撃を あげる。" + "effect": "大声で ほえて 気合を 高め 自分と 味方の 攻撃を あげる。" }, "dragonClaw": { "name": "ドラゴンクロー", - "effect": "鋭く とがった 巨大な ツメで 相手を 切り裂いて 攻撃する。" + "effect": "鋭く とがった 巨大な ツメで 相手を 切り裂いて 攻撃する。" }, "frenzyPlant": { "name": "ハードプラント", - "effect": "大きな 樹木で 相手を たたきつけて 攻撃する。 次の ターンは 動けなくなる。" + "effect": "大きな 樹木で 相手を たたきつけて 攻撃する。 次の ターンは 動けなくなる。" }, "bulkUp": { "name": "ビルドアップ", - "effect": "体に 力を こめて 筋肉を ぶあつく することで 自分の 攻撃と 防御を あげる。" + "effect": "体に 力を こめて 筋肉を ぶあつく することで 自分の 攻撃と 防御を あげる。" }, "bounce": { "name": "とびはねる", - "effect": "空高く 飛び跳ねて 2ターン目に 相手を 攻撃する。 まひ状態に することが ある。" + "effect": "空高く 飛び跳ねて 2ターン目に 相手を 攻撃する。 まひ状態に することが ある。" }, "mudShot": { "name": "マッドショット", - "effect": "泥の 塊を 相手に 投げつけて 攻撃する。 同時に 相手の 素早さを さげる。" + "effect": "泥の 塊を 相手に 投げつけて 攻撃する。 同時に 相手の 素早さを さげる。" }, "poisonTail": { "name": "ポイズンテール", - "effect": "しっぽで たたく。 毒状態に することが あり 急所にも 当たりやすい。" + "effect": "しっぽで たたく。 毒状態に することが あり 急所にも 当たりやすい。" }, "covet": { "name": "ほしがる", - "effect": "かわいく あまえながら 相手に ちかづき 持っている 道具を うばおうとする。 うばう 可能性は 30%。" + "effect": "かわいく あまえながら 相手に ちかづき 持っている 道具を うばおうとする。 うばう 可能性は 30%。" }, "voltTackle": { "name": "ボルテッカー", - "effect": "電気を まとって 突進する。 自分も かなり ダメージを 受ける。 まひ状態に することが ある。" + "effect": "電気を まとって 突進する。 自分も かなり ダメージを 受ける。 まひ状態に することが ある。" }, "magicalLeaf": { "name": "マジカルリーフ", - "effect": "相手を 追跡する 不思議な はっぱを まきちらす。 攻撃は 必ず 命中する。" + "effect": "相手を 追跡する 不思議な はっぱを まきちらす。 攻撃は 必ず 命中する。" }, "waterSport": { "name": "みずあそび", - "effect": "あたりを 水で びしょびしょにする。 5ターンの 間 ほのおタイプの 技を 弱める。" + "effect": "あたりを 水で びしょびしょにする。 5ターンの 間 ほのおタイプの 技を 弱める。" }, "calmMind": { "name": "めいそう", - "effect": "静かに 精神を 統一し 心を 鎮めることで 自分の 特攻と 特防を あげる。" + "effect": "静かに 精神を 統一し 心を 鎮めることで 自分の 特攻と 特防を あげる。" }, "leafBlade": { "name": "リーフブレード", - "effect": "はっぱを 剣のように あやつり 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" + "effect": "はっぱを 剣のように あやつり 相手を 切りつけて 攻撃する。 急所に 当たりやすい。" }, "dragonDance": { "name": "りゅうのまい", - "effect": "神秘的で 力強い 舞を 激しく おどる。 自分の 攻撃と 素早さを あげる。" + "effect": "神秘的で 力強い 舞を 激しく おどる。 自分の 攻撃と 素早さを あげる。" }, "rockBlast": { "name": "ロックブラスト", - "effect": "硬い 岩石を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "硬い 岩石を 相手に 発射して 攻撃する。 2ー5回の 間 連続で だす。" }, "shockWave": { "name": "でんげきは", - "effect": "電撃を 素早く 相手に 浴びせる。 攻撃は 必ず 命中する。" + "effect": "電撃を 素早く 相手に 浴びせる。 攻撃は 必ず 命中する。" }, "waterPulse": { "name": "みずのはどう", - "effect": "水の 振動を 相手に 与えて 攻撃する。 相手を 混乱させることが ある。" + "effect": "水の 振動を 相手に 与えて 攻撃する。 相手を 混乱させることが ある。" }, "doomDesire": { "name": "はめつのねがい", - "effect": "技を 使った 2ターン後に 無数の 光の 束で 相手を 攻撃する。" + "effect": "技を 使った 2ターン後に 無数の 光の 束で 相手を 攻撃する。" }, "psychoBoost": { "name": "サイコブースト", - "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。" + "effect": "フルパワーで 相手を 攻撃する。 使うと 反動で 自分の 特攻が がくっと さがる。" }, "roost": { "name": "はねやすめ", - "effect": "地面に 降りて 体を やすめる。 最大HPの 半分の HPを 回復する。" + "effect": "地面に 降りて 体を やすめる。 最大HPの 半分の HPを 回復する。" }, "gravity": { "name": "じゅうりょく", - "effect": "5ターンの間 ふゆうや ひこうタイプに じめんタイプの 技が 当たるようになる。 空中に 飛ぶ 技も 使えない。" + "effect": "5ターンの間 ふゆうや ひこうタイプに じめんタイプの 技が 当たるようになる。 空中に 飛ぶ 技も 使えない。" }, "miracleEye": { "name": "ミラクルアイ", - "effect": "あくタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" + "effect": "あくタイプに 効果がない 技や 回避率の 高い 相手に 攻撃が 当たるように なる。" }, "wakeUpSlap": { "name": "めざましビンタ", - "effect": "眠り状態の 相手に 大きな ダメージを 与える。 かわりに 相手は 眠りから さめる。" + "effect": "眠り状態の 相手に 大きな ダメージを 与える。 かわりに 相手は 眠りから さめる。" }, "hammerArm": { "name": "アームハンマー", - "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。" + "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。" }, "gyroBall": { "name": "ジャイロボール", - "effect": "体を 高速に 回転させて 体当たりする。相手より 素早さが 低いほど 強い。" + "effect": "体を 高速に 回転させて 体当たりする。相手より 素早さが 低いほど 強い。" }, "healingWish": { "name": "いやしのねがい", - "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの 状態異常と HPを 回復する。" + "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの 状態異常と HPを 回復する。" }, "brine": { "name": "しおみず", - "effect": "相手が HPの 半分くらい きずを おっていると 技の 威力が 2倍に なる。" + "effect": "相手が HPの 半分くらい きずを おっていると 技の 威力が 2倍に なる。" }, "naturalGift": { "name": "しぜんのめぐみ", - "effect": "きのみから 力を もらい 攻撃する。持たせた きのみで 技の タイプと 威力が 変わる。" + "effect": "きのみから 力を もらい 攻撃する。持たせた きのみで 技の タイプと 威力が 変わる。" }, "feint": { "name": "フェイント", - "effect": "まもるや みきり などを している 相手に 攻撃が できる。 守りの 効果を 解除させる。" + "effect": "まもるや みきり などを している 相手に 攻撃が できる。 守りの 効果を 解除させる。" }, "pluck": { "name": "ついばむ", - "effect": "くちばしで 攻撃。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。" + "effect": "くちばしで 攻撃。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。" }, "tailwind": { "name": "おいかぜ", - "effect": "激しく 吹きあれる 風の渦を つくり 4ターンの 間 味方 全員の 素早さを あげる。" + "effect": "激しく 吹きあれる 風の渦を つくり 4ターンの 間 味方 全員の 素早さを あげる。" }, "acupressure": { "name": "つぼをつく", - "effect": "つぼおしで 体を 活性化させる。 能力の どれか 1つを ぐーんと あげる。" + "effect": "つぼおしで 体を 活性化させる。 能力の どれか 1つを ぐーんと あげる。" }, "metalBurst": { "name": "メタルバースト", - "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。" + "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。" }, "uTurn": { "name": "とんぼがえり", - "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" + "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" }, "closeCombat": { "name": "インファイト", - "effect": "守りを 捨てて 相手の ふところに 突撃する。 自分の 防御と 特防が さがる。" + "effect": "守りを 捨てて 相手の ふところに 突撃する。 自分の 防御と 特防が さがる。" }, "payback": { "name": "しっぺがえし", - "effect": "ためこんで 攻撃する。 相手より あとに 攻撃できると 技の 威力は 2倍に なる。" + "effect": "ためこんで 攻撃する。 相手より あとに 攻撃できると 技の 威力は 2倍に なる。" }, "assurance": { "name": "ダメおし", - "effect": "そのターンに 相手が すでに ダメージを 受けていたら 技の 威力は 2倍に なる。" + "effect": "そのターンに 相手が すでに ダメージを 受けていたら 技の 威力は 2倍に なる。" }, "embargo": { "name": "さしおさえ", - "effect": "持たせた 道具を 5ターンの 間 使えなくする。 トレーナーも その ポケモンには 道具を 使えない。" + "effect": "持たせた 道具を 5ターンの 間 使えなくする。 トレーナーも その ポケモンには 道具を 使えない。" }, "fling": { "name": "なげつける", - "effect": "持たせた 道具を 素早く 投げつけて 攻撃する。 道具で 威力と 効果が 変わる。" + "effect": "持たせた 道具を 素早く 投げつけて 攻撃する。 道具で 威力と 効果が 変わる。" }, "psychoShift": { "name": "サイコシフト", - "effect": "超能力で 暗示を かけて 自分の 受けている 状態異常を 相手に うつす。" + "effect": "超能力で 暗示を かけて 自分の 受けている 状態異常を 相手に うつす。" }, "trumpCard": { "name": "きりふだ", - "effect": "きりふだの 残り PPが 少なければ 少ないほど 技の 威力が あがる。" + "effect": "きりふだの 残り PPが 少なければ 少ないほど 技の 威力が あがる。" }, "healBlock": { "name": "かいふくふうじ", - "effect": "5ターンの 間 技や 特性や 持っている 道具によって HPを 回復 できなくする。" + "effect": "5ターンの 間 技や 特性や 持っている 道具によって HPを 回復 できなくする。" }, "wringOut": { "name": "しぼりとる", - "effect": "強く 締めあげて 攻撃を する。 相手の HPが 残っているほど 威力は あがる。" + "effect": "強く 締めあげて 攻撃を する。 相手の HPが 残っているほど 威力は あがる。" }, "powerTrick": { "name": "パワートリック", - "effect": "超能力で 自分の 攻撃と 防御の 力を 交換する。" + "effect": "超能力で 自分の 攻撃と 防御の 力を 交換する。" }, "gastroAcid": { "name": "いえき", - "effect": "胃液を 相手の 体に 吐きつける。 ついた 胃液は 相手の 特性の 効果を 消す。" + "effect": "胃液を 相手の 体に 吐きつける。 ついた 胃液は 相手の 特性の 効果を 消す。" }, "luckyChant": { "name": "おまじない", - "effect": "天に むかって おいのりを ささげ 5ターンの 間 相手の 攻撃を 急所に 当たらなくする。" + "effect": "天に むかって おいのりを ささげ 5ターンの 間 相手の 攻撃を 急所に 当たらなくする。" }, "meFirst": { "name": "さきどり", - "effect": "威力を あげて 相手が だそうとする 技を 先にだす。 先に だせないと 失敗する。" + "effect": "威力を あげて 相手が だそうとする 技を 先にだす。 先に だせないと 失敗する。" }, "copycat": { "name": "まねっこ", - "effect": "直前に でた 技を まねして 同じ 技を だす。 技が でていないと 失敗する。" + "effect": "直前に でた 技を まねして 同じ 技を だす。 技が でていないと 失敗する。" }, "powerSwap": { "name": "パワースワップ", - "effect": "超能力で 自分と 相手の 攻撃と 特攻の 能力変化を 入れ替える。" + "effect": "超能力で 自分と 相手の 攻撃と 特攻の 能力変化を 入れ替える。" }, "guardSwap": { "name": "ガードスワップ", - "effect": "超能力で 自分と 相手の 防御と 特防の 能力変化を 入れ替える。" + "effect": "超能力で 自分と 相手の 防御と 特防の 能力変化を 入れ替える。" }, "punishment": { "name": "おしおき", - "effect": "能力変化で 相手が パワーアップ しているほど 技の 威力が あがる。" + "effect": "能力変化で 相手が パワーアップ しているほど 技の 威力が あがる。" }, "lastResort": { "name": "とっておき", - "effect": "戦闘中に おぼえている 技を すべて 使うと はじめて だせる とっておきの 技。" + "effect": "戦闘中に おぼえている 技を すべて 使うと はじめて だせる とっておきの 技。" }, "worrySeed": { "name": "なやみのタネ", - "effect": "心を なやませる タネを 植えつける。 相手を 眠れなくして 特性を ふみんに する。" + "effect": "心を なやませる タネを 植えつける。 相手を 眠れなくして 特性を ふみんに する。" }, "suckerPunch": { "name": "ふいうち", - "effect": "相手より 先に 攻撃 できる。 相手が だす技が 攻撃技でないと 失敗する。" + "effect": "相手より 先に 攻撃 できる。 相手が だす技が 攻撃技でないと 失敗する。" }, "toxicSpikes": { "name": "どくびし", - "effect": "相手の 足下に どくびしを しかける。 交代で でてきた 相手の ポケモンに 毒を おわせる。" + "effect": "相手の 足下に どくびしを しかける。 交代で でてきた 相手の ポケモンに 毒を おわせる。" }, "heartSwap": { "name": "ハートスワップ", - "effect": "超能力で 自分と 相手に かかっている 能力変化を 入れ替える。" + "effect": "超能力で 自分と 相手に かかっている 能力変化を 入れ替える。" }, "aquaRing": { "name": "アクアリング", - "effect": "自分の 体の 周りを 水で つくった ベールで おおう。 毎ターン HPを 回復する。" + "effect": "自分の 体の 周りを 水で つくった ベールで おおう。 毎ターン HPを 回復する。" }, "magnetRise": { "name": "でんじふゆう", - "effect": "電気で つくった 磁力の 力で 宙に 浮かぶ。 5ターンの 間 浮遊できる。" + "effect": "電気で つくった 磁力の 力で 宙に 浮かぶ。 5ターンの 間 浮遊できる。" }, "flareBlitz": { "name": "フレアドライブ", - "effect": "炎を まとって 突進する。 自分も かなり ダメージを 受ける。 やけど状態に することが ある。" + "effect": "炎を まとって 突進する。 自分も かなり ダメージを 受ける。 やけど状態に することが ある。" }, "forcePalm": { "name": "はっけい", - "effect": "相手の 体に 衝撃波を 当てて 攻撃する。 まひ状態に することが ある。" + "effect": "相手の 体に 衝撃波を 当てて 攻撃する。 まひ状態に することが ある。" }, "auraSphere": { "name": "はどうだん", - "effect": "体の 奥から 波導の 力を 相手に うち放つ。 攻撃は 必ず 命中する。" + "effect": "体の 奥から 波導の 力を 相手に うち放つ。 攻撃は 必ず 命中する。" }, "rockPolish": { "name": "ロックカット", - "effect": "自分の 体を 磨いて 空気の 抵抗を 少なくする。素早さを ぐーんと あげることが できる。" + "effect": "自分の 体を 磨いて 空気の 抵抗を 少なくする。素早さを ぐーんと あげることが できる。" }, "poisonJab": { "name": "どくづき", - "effect": "毒に そまった 触手や 腕で 相手を 突き刺す。 毒状態に することが ある。" + "effect": "毒に そまった 触手や 腕で 相手を 突き刺す。 毒状態に することが ある。" }, "darkPulse": { "name": "あくのはどう", - "effect": "体から 悪意に みちた 恐ろしい オーラを 発する。 相手を ひるませることが ある。" + "effect": "体から 悪意に みちた 恐ろしい オーラを 発する。 相手を ひるませることが ある。" }, "nightSlash": { "name": "つじぎり", - "effect": "一瞬の すきを ついて 相手を 切りはらう。 急所に 当たりやすい。" + "effect": "一瞬の すきを ついて 相手を 切りはらう。 急所に 当たりやすい。" }, "aquaTail": { "name": "アクアテール", - "effect": "激しく あれくるう 荒波の ように 大きな しっぽを ふって 相手を 攻撃する。" + "effect": "激しく あれくるう 荒波の ように 大きな しっぽを ふって 相手を 攻撃する。" }, "seedBomb": { "name": "タネばくだん", - "effect": "硬い 殻を もつ 大きな タネを 上から たたきつけて 相手を 攻撃する。" + "effect": "硬い 殻を もつ 大きな タネを 上から たたきつけて 相手を 攻撃する。" }, "airSlash": { "name": "エアスラッシュ", - "effect": "空をも 切り裂く 空気の 刃で 攻撃する。 相手を ひるませることが ある。" + "effect": "空をも 切り裂く 空気の 刃で 攻撃する。 相手を ひるませることが ある。" }, "xScissor": { "name": "シザークロス", - "effect": "カマや ツメを ハサミのように 交差させながら 相手を 切り裂く。" + "effect": "カマや ツメを ハサミのように 交差させながら 相手を 切り裂く。" }, "bugBuzz": { "name": "むしのさざめき", - "effect": "振動で 音波を おこして 攻撃する。相手の 特防を さげることが ある。" + "effect": "振動で 音波を おこして 攻撃する。相手の 特防を さげることが ある。" }, "dragonPulse": { "name": "りゅうのはどう", - "effect": "大きな 口から 衝撃波を まきおこして 相手を 攻撃する。" + "effect": "大きな 口から 衝撃波を まきおこして 相手を 攻撃する。" }, "dragonRush": { "name": "ドラゴンダイブ", - "effect": "すさまじい 殺気で 威圧しながら 体当たりする。 相手を ひるませることが ある。" + "effect": "すさまじい 殺気で 威圧しながら 体当たりする。 相手を ひるませることが ある。" }, "powerGem": { "name": "パワージェム", - "effect": "宝石のように きらめく 光を 発射して 相手を 攻撃する。" + "effect": "宝石のように きらめく 光を 発射して 相手を 攻撃する。" }, "drainPunch": { "name": "ドレインパンチ", - "effect": "こぶしから 相手の 力を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。" + "effect": "こぶしから 相手の 力を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。" }, "vacuumWave": { "name": "しんくうは", - "effect": "こぶしを ふって 真空の 波を まきおこす。 必ず 先制攻撃できる。" + "effect": "こぶしを ふって 真空の 波を まきおこす。 必ず 先制攻撃できる。" }, "focusBlast": { "name": "きあいだま", - "effect": "気合を 高めて ありったけの 力を 放出する。 相手の 特防を さげることが ある。" + "effect": "気合を 高めて ありったけの 力を 放出する。 相手の 特防を さげることが ある。" }, "energyBall": { "name": "エナジーボール", - "effect": "自然から 集めた 命の力を 発射する。 相手の 特防を さげることがある。" + "effect": "自然から 集めた 命の力を 発射する。 相手の 特防を さげることがある。" }, "braveBird": { "name": "ブレイブバード", - "effect": "はねを おりたたみ 低空飛行で 突撃する。 自分も かなり ダメージを 受ける。" + "effect": "はねを おりたたみ 低空飛行で 突撃する。 自分も かなり ダメージを 受ける。" }, "earthPower": { "name": "だいちのちから", - "effect": "相手の 足下へ 大地の力を 放出する。相手の 特防を さげることが ある。" + "effect": "相手の 足下へ 大地の力を 放出する。相手の 特防を さげることが ある。" }, "switcheroo": { "name": "すりかえ", - "effect": "目にも とまらぬ 速さで 自分と 相手の 持ち物を 交換する。" + "effect": "目にも とまらぬ 速さで 自分と 相手の 持ち物を 交換する。" }, "gigaImpact": { "name": "ギガインパクト", - "effect": "持てる 力を すべて 使って 相手に 突撃する。 次の ターンは 動けなくなる。" + "effect": "持てる 力を すべて 使って 相手に 突撃する。 次の ターンは 動けなくなる。" }, "nastyPlot": { "name": "わるだくみ", - "effect": "悪いことを 考えて 頭を 活性化させる。 自分の 特攻を ぐーんと あげる。" + "effect": "悪いことを 考えて 頭を 活性化させる。 自分の 特攻を ぐーんと あげる。" }, "bulletPunch": { "name": "バレットパンチ", - "effect": "弾丸の ような 速くて 硬い パンチを 相手に くりだす。 必ず 先制攻撃 できる。" + "effect": "弾丸の ような 速くて 硬い パンチを 相手に くりだす。 必ず 先制攻撃 できる。" }, "avalanche": { "name": "ゆきなだれ", - "effect": "相手から 技を 受けていると その 相手に 対して 技の 威力が 2倍に なる。" + "effect": "相手から 技を 受けていると その 相手に 対して 技の 威力が 2倍に なる。" }, "iceShard": { "name": "こおりのつぶて", - "effect": "氷の塊を 一瞬で つくり 相手に 素早く 放つ。 必ず 先制攻撃 できる。" + "effect": "氷の塊を 一瞬で つくり 相手に 素早く 放つ。 必ず 先制攻撃 できる。" }, "shadowClaw": { "name": "シャドークロー", - "effect": "影から つくった 鋭い ツメで 相手を 切り裂く。 急所に 当たりやすい。" + "effect": "影から つくった 鋭い ツメで 相手を 切り裂く。 急所に 当たりやすい。" }, "thunderFang": { "name": "かみなりのキバ", - "effect": "電気を ためた キバで かみつく。 相手を ひるませたり まひ状態に することが ある。" + "effect": "電気を ためた キバで かみつく。 相手を ひるませたり まひ状態に することが ある。" }, "iceFang": { "name": "こおりのキバ", - "effect": "冷気を ひめた キバで かみつく。 相手を ひるませたり こおり状態に することが ある。" + "effect": "冷気を ひめた キバで かみつく。 相手を ひるませたり こおり状態に することが ある。" }, "fireFang": { "name": "ほのおのキバ", - "effect": "炎を まとった キバで かみつく。 相手を ひるませたり やけど状態に することが ある。" + "effect": "炎を まとった キバで かみつく。 相手を ひるませたり やけど状態に することが ある。" }, "shadowSneak": { "name": "かげうち", - "effect": "影を のばして 相手の 背後から 攻撃する。 必ず 先制攻撃 できる。" + "effect": "影を のばして 相手の 背後から 攻撃する。 必ず 先制攻撃 できる。" }, "mudBomb": { "name": "どろばくだん", - "effect": "硬い 泥の 弾を 相手に 発射して 攻撃する。 命中率を さげることが ある。" + "effect": "硬い 泥の 弾を 相手に 発射して 攻撃する。 命中率を さげることが ある。" }, "psychoCut": { "name": "サイコカッター", - "effect": "実体化させた 心の 刃で 相手を 切り裂く。 急所に 当たりやすい。" + "effect": "実体化させた 心の 刃で 相手を 切り裂く。 急所に 当たりやすい。" }, "zenHeadbutt": { "name": "しねんのずつき", - "effect": "思念の 力を 額に 集めて 攻撃する。 相手を ひるませることが ある。" + "effect": "思念の 力を 額に 集めて 攻撃する。 相手を ひるませることが ある。" }, "mirrorShot": { "name": "ミラーショット", - "effect": "磨きあげられた 体から せん光の 力を 相手に 放つ。 命中率を さげることが ある。" + "effect": "磨きあげられた 体から せん光の 力を 相手に 放つ。 命中率を さげることが ある。" }, "flashCannon": { "name": "ラスターカノン", - "effect": "体の 光を 一点に 集めて 力を 放つ。 相手の 特防を さげることが ある。" + "effect": "体の 光を 一点に 集めて 力を 放つ。 相手の 特防を さげることが ある。" }, "rockClimb": { "name": "ロッククライム", - "effect": "すごい 勢いで 相手に つっこみ 攻撃する。 相手を 混乱させることが ある。" + "effect": "すごい 勢いで 相手に つっこみ 攻撃する。 相手を 混乱させることが ある。" }, "defog": { "name": "きりばらい", - "effect": "強い風で 相手の リフレクターや ひかりのかべ などを はらいのける。 回避率も さげる。" + "effect": "強い風で 相手の リフレクターや ひかりのかべ などを はらいのける。 回避率も さげる。" }, "trickRoom": { "name": "トリックルーム", - "effect": "まか不思議な 空間を つくる。 5ターンの 間 遅い ポケモンから 行動できる。" + "effect": "まか不思議な 空間を つくる。 5ターンの 間 遅い ポケモンから 行動できる。" }, "dracoMeteor": { "name": "りゅうせいぐん", - "effect": "天空から 隕石を 相手に 落とす。使うと 反動で 自分の 特攻が がくっと さがる。" + "effect": "天空から 隕石を 相手に 落とす。使うと 反動で 自分の 特攻が がくっと さがる。" }, "discharge": { "name": "ほうでん", - "effect": "まばゆい 電撃で 自分の 周りに いるものを 攻撃する。 まひ状態に することが ある。" + "effect": "まばゆい 電撃で 自分の 周りに いるものを 攻撃する。 まひ状態に することが ある。" }, "lavaPlume": { "name": "ふんえん", - "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。" + "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。" }, "leafStorm": { "name": "リーフストーム", - "effect": "とがった はっぱで 相手に あらしを おこす。使うと 反動で 自分の 特攻が がくっと さがる。" + "effect": "とがった はっぱで 相手に あらしを おこす。使うと 反動で 自分の 特攻が がくっと さがる。" }, "powerWhip": { "name": "パワーウィップ", - "effect": "ツタや 触手を 激しく ふるって 相手を たたきつけ 攻撃する。" + "effect": "ツタや 触手を 激しく ふるって 相手を たたきつけ 攻撃する。" }, "rockWrecker": { "name": "がんせきほう", - "effect": "巨大な 岩を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" + "effect": "巨大な 岩を 相手に 発射して 攻撃する。 次の ターンは 動けなくなる。" }, "crossPoison": { "name": "クロスポイズン", - "effect": "毒の 刃で 相手を 切り裂く。 毒状態に することが あり 急所にも 当たりやすい。" + "effect": "毒の 刃で 相手を 切り裂く。 毒状態に することが あり 急所にも 当たりやすい。" }, "gunkShot": { "name": "ダストシュート", - "effect": "汚い ゴミを 相手に ぶつけて 攻撃する。 毒状態に することが ある。" + "effect": "汚い ゴミを 相手に ぶつけて 攻撃する。 毒状態に することが ある。" }, "ironHead": { "name": "アイアンヘッド", - "effect": "鋼の ような 硬い 頭で 攻撃する。 相手を ひるませることが ある。" + "effect": "鋼の ような 硬い 頭で 攻撃する。 相手を ひるませることが ある。" }, "magnetBomb": { "name": "マグネットボム", - "effect": "相手に 吸いつく 鋼の 爆弾を 発射する。 攻撃は 必ず 命中 する。" + "effect": "相手に 吸いつく 鋼の 爆弾を 発射する。 攻撃は 必ず 命中 する。" }, "stoneEdge": { "name": "ストーンエッジ", - "effect": "とがった 岩を 相手に 突き刺して 攻撃する。 急所に 当たりやすい。" + "effect": "とがった 岩を 相手に 突き刺して 攻撃する。 急所に 当たりやすい。" }, "captivate": { "name": "ゆうわく", - "effect": "♂なら♀を ♀なら♂を 誘惑して 相手の 特攻を がくっと さげる。" + "effect": "♂なら♀を ♀なら♂を 誘惑して 相手の 特攻を がくっと さげる。" }, "stealthRock": { "name": "ステルスロック", - "effect": "相手の 周りに 無数の 岩を 浮かべて 交代で でてきた 相手の ポケモンに ダメージを 与える。" + "effect": "相手の 周りに 無数の 岩を 浮かべて 交代で でてきた 相手の ポケモンに ダメージを 与える。" }, "grassKnot": { "name": "くさむすび", - "effect": "草を からませて 相手を 転ばせる。相手が 重いほど 威力が あがる。" + "effect": "草を からませて 相手を 転ばせる。相手が 重いほど 威力が あがる。" }, "chatter": { "name": "おしゃべり", - "effect": "とても うるさい おしゃべりの 音波で 相手を 攻撃する。 相手を 混乱させる。" + "effect": "とても うるさい おしゃべりの 音波で 相手を 攻撃する。 相手を 混乱させる。" }, "judgment": { "name": "さばきのつぶて", - "effect": "無数の 光弾を 相手に 放出する。 自分の 持つ プレートに より タイプが 変わる。" + "effect": "無数の 光弾を 相手に 放出する。 自分の 持つ プレートに より タイプが 変わる。" }, "bugBite": { "name": "むしくい", - "effect": "かみついて 攻撃する。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。" + "effect": "かみついて 攻撃する。 相手が きのみを 持っているとき 食べて きのみの 効果を 受けられる。" }, "chargeBeam": { "name": "チャージビーム", - "effect": "電撃の 束を 相手に 発射する。電気を ためて 自分の 特攻を あげることが ある。" + "effect": "電撃の 束を 相手に 発射する。電気を ためて 自分の 特攻を あげることが ある。" }, "woodHammer": { "name": "ウッドハンマー", - "effect": "硬い 胴体を 相手に たたきつけて 攻撃する。 自分も かなり ダメージを 受ける。" + "effect": "硬い 胴体を 相手に たたきつけて 攻撃する。 自分も かなり ダメージを 受ける。" }, "aquaJet": { "name": "アクアジェット", - "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。" + "effect": "目にも 留まらぬ ものすごい 速さで 相手に つっこむ。 必ず 先制攻撃 できる。" }, "attackOrder": { "name": "こうげきしれい", - "effect": "しもべを 呼びだして 相手に むかって 攻撃させる。 急所に 当たりやすい。" + "effect": "しもべを 呼びだして 相手に むかって 攻撃させる。 急所に 当たりやすい。" }, "defendOrder": { "name": "ぼうぎょしれい", - "effect": "しもべを 呼びだして 自分の 体に おおい つかせる。防御と 特防を あげることが できる。" + "effect": "しもべを 呼びだして 自分の 体に おおい つかせる。防御と 特防を あげることが できる。" }, "healOrder": { "name": "かいふくしれい", - "effect": "しもべを 呼びだして きずを 治す。 最大HPの 半分 自分の HPを 回復する。" + "effect": "しもべを 呼びだして きずを 治す。 最大HPの 半分 自分の HPを 回復する。" }, "headSmash": { "name": "もろはのずつき", - "effect": "命を 懸けて こん身の 力で 相手に ずつきを する。 自分も ものすごい ダメージを 受ける。" + "effect": "命を 懸けて こん身の 力で 相手に ずつきを する。 自分も ものすごい ダメージを 受ける。" }, "doubleHit": { "name": "ダブルアタック", - "effect": "しっぽなどを 使い 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。" + "effect": "しっぽなどを 使い 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。" }, "roarOfTime": { "name": "ときのほうこう", - "effect": "時間が ゆがむほどの 力を うちだして 相手を 攻撃する。 次の ターンは 動けなくなる。" + "effect": "時間が ゆがむほどの 力を うちだして 相手を 攻撃する。 次の ターンは 動けなくなる。" }, "spacialRend": { "name": "あくうせつだん", - "effect": "周りの 空間ごと 相手を 引き裂き ダメージを 与える。 急所に 当たりやすい。" + "effect": "周りの 空間ごと 相手を 引き裂き ダメージを 与える。 急所に 当たりやすい。" }, "lunarDance": { "name": "みかづきのまい", - "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの すべての 状態を 回復する。" + "effect": "自分は ひんしに なるが 控えから でてくる ポケモンの すべての 状態を 回復する。" }, "crushGrip": { "name": "にぎりつぶす", - "effect": "すさまじい 力で 相手を にぎりつぶす。 相手の HPが 残っているほど 威力が あがる。" + "effect": "すさまじい 力で 相手を にぎりつぶす。 相手の HPが 残っているほど 威力が あがる。" }, "magmaStorm": { "name": "マグマストーム", - "effect": "激しく 燃えたぎる 炎の なかに 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + "effect": "激しく 燃えたぎる 炎の なかに 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" }, "darkVoid": { "name": "ダークホール", - "effect": "暗黒の 世界に ひきずり 落として 相手を 眠り状態に する。" + "effect": "暗黒の 世界に ひきずり 落として 相手を 眠り状態に する。" }, "seedFlare": { "name": "シードフレア", - "effect": "体の 中から 衝撃波を 発生させる。相手の 特防を がくっと さげることが ある。" + "effect": "体の 中から 衝撃波を 発生させる。相手の 特防を がくっと さげることが ある。" }, "ominousWind": { "name": "あやしいかぜ", - "effect": "みのけも よだつ 突風で 相手を 攻撃する。自分の すべての 能力が あがることが ある。" + "effect": "みのけも よだつ 突風で 相手を 攻撃する。自分の すべての 能力が あがることが ある。" }, "shadowForce": { "name": "シャドーダイブ", - "effect": "1ターン目で 姿を 消して 2ターン目に 相手を 攻撃する。 守っていても 攻撃は 当たる。" + "effect": "1ターン目で 姿を 消して 2ターン目に 相手を 攻撃する。 守っていても 攻撃は 当たる。" }, "honeClaws": { "name": "つめとぎ", - "effect": "ツメを 磨いて 鋭く する。 自分の 攻撃と 命中率を あげる。" + "effect": "ツメを 磨いて 鋭く する。 自分の 攻撃と 命中率を あげる。" }, "wideGuard": { "name": "ワイドガード", - "effect": "味方全員に 当たる 攻撃を 1ターンの 間 防ぐ。" + "effect": "味方全員に 当たる 攻撃を 1ターンの 間 防ぐ。" }, "guardSplit": { "name": "ガードシェア", - "effect": "超能力で 自分と 相手の 防御と 特防を たして 半分に わける。" + "effect": "超能力で 自分と 相手の 防御と 特防を たして 半分に わける。" }, "powerSplit": { "name": "パワーシェア", - "effect": "超能力で 自分と 相手の 攻撃と 特攻を たして 半分に わける。" + "effect": "超能力で 自分と 相手の 攻撃と 特攻を たして 半分に わける。" }, "wonderRoom": { "name": "ワンダールーム", - "effect": "まか不思議な 空間を つくる。 5ターンのあいだ すべてのポケモンの 防御と 特防が 入れ替わる。" + "effect": "まか不思議な 空間を つくる。 5ターンのあいだ すべてのポケモンの 防御と 特防が 入れ替わる。" }, "psyshock": { "name": "サイコショック", - "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。" + "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。" }, "venoshock": { "name": "ベノムショック", - "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手には 威力が 2倍に なる。" + "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手には 威力が 2倍に なる。" }, "autotomize": { "name": "ボディパージ", - "effect": "体の ムダな 部分を 削る。 自分の 素早さを ぐーんと あげて 体重も 軽くなる。" + "effect": "体の ムダな 部分を 削る。 自分の 素早さを ぐーんと あげて 体重も 軽くなる。" }, "ragePowder": { "name": "いかりのこな", - "effect": "イライラさせる 粉を 自分に ふりかけて 注意を ひく。 相手の 攻撃を すべて 自分に むける。" + "effect": "イライラさせる 粉を 自分に ふりかけて 注意を ひく。 相手の 攻撃を すべて 自分に むける。" }, "telekinesis": { "name": "テレキネシス", - "effect": "超能力で 相手を 浮かせる。 3ターンの 間 攻撃が 相手に 当たりやすく なる。" + "effect": "超能力で 相手を 浮かせる。 3ターンの 間 攻撃が 相手に 当たりやすく なる。" }, "magicRoom": { "name": "マジックルーム", - "effect": "まか不思議な 空間を つくる。 5ターンの間 すべてのポケモンの 道具の 効果が なくなる。" + "effect": "まか不思議な 空間を つくる。 5ターンの間 すべてのポケモンの 道具の 効果が なくなる。" }, "smackDown": { "name": "うちおとす", - "effect": "石や 弾を 投げて 飛んでいる 相手を 攻撃する。 相手は うち落とされて 地面に 落ちる。" + "effect": "石や 弾を 投げて 飛んでいる 相手を 攻撃する。 相手は うち落とされて 地面に 落ちる。" }, "stormThrow": { "name": "やまあらし", - "effect": "強烈な 一撃を 相手に くりだす。攻撃は 必ず 急所に 当たる。" + "effect": "強烈な 一撃を 相手に くりだす。攻撃は 必ず 急所に 当たる。" }, "flameBurst": { "name": "はじけるほのお", - "effect": "当たると はじける 炎で 相手を 攻撃する。はじけた 炎は 隣の 相手にも ふりかかる。" + "effect": "当たると はじける 炎で 相手を 攻撃する。はじけた 炎は 隣の 相手にも ふりかかる。" }, "sludgeWave": { "name": "ヘドロウェーブ", - "effect": "ヘドロの 波で 自分の 周りに いるものを 攻撃する。 毒状態に することが ある。" + "effect": "ヘドロの 波で 自分の 周りに いるものを 攻撃する。 毒状態に することが ある。" }, "quiverDance": { "name": "ちょうのまい", - "effect": "神秘的で 美しい 舞を 軽やかに おどる。 自分の 特攻と 特防と 素早さを あげる。" + "effect": "神秘的で 美しい 舞を 軽やかに おどる。 自分の 特攻と 特防と 素早さを あげる。" }, "heavySlam": { "name": "ヘビーボンバー", - "effect": "重たい 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。" + "effect": "重たい 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。" }, "synchronoise": { "name": "シンクロノイズ", - "effect": "不思議な 電波で 周りに いる 自分と 同じ タイプの ポケモンに ダメージを 与える。" + "effect": "不思議な 電波で 周りに いる 自分と 同じ タイプの ポケモンに ダメージを 与える。" }, "electroBall": { "name": "エレキボール", - "effect": "電気の 塊を 相手に ぶつける。相手より 素早さが 速いほど 威力が あがる。" + "effect": "電気の 塊を 相手に ぶつける。相手より 素早さが 速いほど 威力が あがる。" }, "soak": { "name": "みずびたし", - "effect": "たくさんの 水を 浴びせかけて 相手を みずタイプに する。" + "effect": "たくさんの 水を 浴びせかけて 相手を みずタイプに する。" }, "flameCharge": { "name": "ニトロチャージ", - "effect": "炎を まとい 相手を 攻撃する。 力を ためて 自分の 素早さを あげる。" + "effect": "炎を まとい 相手を 攻撃する。 力を ためて 自分の 素早さを あげる。" }, "coil": { "name": "とぐろをまく", - "effect": "とぐろを まいて 集中する。 自分の 攻撃と 防御と 命中率を あげる。" + "effect": "とぐろを まいて 集中する。 自分の 攻撃と 防御と 命中率を あげる。" }, "lowSweep": { "name": "ローキック", - "effect": "素早い 動きで 相手の 足を ねらって 攻撃する。 相手の 素早さを さげる。" + "effect": "素早い 動きで 相手の 足を ねらって 攻撃する。 相手の 素早さを さげる。" }, "acidSpray": { "name": "アシッドボム", - "effect": "相手を とかす 液体を 吐きだして 攻撃する。 相手の 特防を がくっと さげる。" + "effect": "相手を とかす 液体を 吐きだして 攻撃する。 相手の 特防を がくっと さげる。" }, "foulPlay": { "name": "イカサマ", - "effect": "相手の 力を 利用する。 戦っている 相手の 攻撃が 高いほど ダメージが あがる。" + "effect": "相手の 力を 利用する。 戦っている 相手の 攻撃が 高いほど ダメージが あがる。" }, "simpleBeam": { "name": "シンプルビーム", - "effect": "なぞの 念波を 相手に 送る。 念波を 受けとった 相手は 特性が たんじゅんに なる。" + "effect": "なぞの 念波を 相手に 送る。 念波を 受けとった 相手は 特性が たんじゅんに なる。" }, "entrainment": { "name": "なかまづくり", - "effect": "不思議な リズムで おどる。 動きを まねさせて 自分と 相手の 特性を 同じに する。" + "effect": "不思議な リズムで おどる。 動きを まねさせて 自分と 相手の 特性を 同じに する。" }, "afterYou": { "name": "おさきにどうぞ", - "effect": "相手の 行動を サポートして 自分の 行動の あとに 続けて 動けるように する。" + "effect": "相手の 行動を サポートして 自分の 行動の あとに 続けて 動けるように する。" }, "round": { "name": "りんしょう", - "effect": "歌で 相手を 攻撃する。 みんなで 輪唱すると 続けて だすことが でき 威力も あがる。" + "effect": "歌で 相手を 攻撃する。 みんなで 輪唱すると 続けて だすことが でき 威力も あがる。" }, "echoedVoice": { "name": "エコーボイス", - "effect": "響く 声で 相手を 攻撃する。 毎ターン だれかが 技を 使い続けると 威力が あがる。" + "effect": "響く 声で 相手を 攻撃する。 毎ターン だれかが 技を 使い続けると 威力が あがる。" }, "chipAway": { "name": "なしくずし", - "effect": "すきを みて 堅実に 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。" + "effect": "すきを みて 堅実に 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。" }, "clearSmog": { "name": "クリアスモッグ", - "effect": "特殊な 泥の 塊を 相手に 投げつけて 攻撃する。 能力変化を もとに もどす。" + "effect": "特殊な 泥の 塊を 相手に 投げつけて 攻撃する。 能力変化を もとに もどす。" }, "storedPower": { "name": "アシストパワー", - "effect": "蓄積された パワーで 相手を 攻撃する。自分の 能力が あがっているほど 威力が あがる。" + "effect": "蓄積された パワーで 相手を 攻撃する。自分の 能力が あがっているほど 威力が あがる。" }, "quickGuard": { "name": "ファストガード", - "effect": "自分と 味方を 相手の 先制攻撃から 守る。" + "effect": "自分と 味方を 相手の 先制攻撃から 守る。" }, "allySwitch": { "name": "サイドチェンジ", - "effect": "不思議な 力で テレポートして 自分と 味方の 居場所を 入れ替える。" + "effect": "不思議な 力で テレポートして 自分と 味方の 居場所を 入れ替える。" }, "scald": { "name": "ねっとう", - "effect": "熱く 煮えたぎる 水を 相手に 発射して 攻撃する。 やけど状態に することが ある。" + "effect": "熱く 煮えたぎる 水を 相手に 発射して 攻撃する。 やけど状態に することが ある。" }, "shellSmash": { "name": "からをやぶる", - "effect": "殻を やぶって 自分の 防御 特防を さげるが 攻撃 特攻 素早さを ぐーんと あげる。" + "effect": "殻を やぶって 自分の 防御 特防を さげるが 攻撃 特攻 素早さを ぐーんと あげる。" }, "healPulse": { "name": "いやしのはどう", - "effect": "いやしのはどうを とばして 最大HPの 半分 相手の HPを 回復する。" + "effect": "いやしのはどうを とばして 最大HPの 半分 相手の HPを 回復する。" }, "hex": { "name": "たたりめ", - "effect": "たたみかける ように 攻撃する。 状態異常の 相手に 大きな ダメージを 与える。" + "effect": "たたみかける ように 攻撃する。 状態異常の 相手に 大きな ダメージを 与える。" }, "skyDrop": { "name": "フリーフォール", - "effect": "1ターン目で 相手を 空へ 連れさり 2ターン目に 落として 攻撃する。 連れさられた 相手は 動けない。" + "effect": "1ターン目で 相手を 空へ 連れさり 2ターン目に 落として 攻撃する。 連れさられた 相手は 動けない。" }, "shiftGear": { "name": "ギアチェンジ", - "effect": "歯車を 回して 自分の 攻撃を あげる だけでなく 素早さも ぐーんと あげる。" + "effect": "歯車を 回して 自分の 攻撃を あげる だけでなく 素早さも ぐーんと あげる。" }, "circleThrow": { "name": "ともえなげ", - "effect": "相手を 投げとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" + "effect": "相手を 投げとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" }, "incinerate": { "name": "やきつくす", - "effect": "炎で 相手を 攻撃する。 相手が きのみなどを 持っているとき 燃やして 使えなくする。" + "effect": "炎で 相手を 攻撃する。 相手が きのみなどを 持っているとき 燃やして 使えなくする。" }, "quash": { "name": "さきおくり", - "effect": "相手を おさえつけて 行動の 順番を 最後に する。" + "effect": "相手を おさえつけて 行動の 順番を 最後に する。" }, "acrobatics": { "name": "アクロバット", - "effect": "軽やかに 相手を 攻撃する。 自分が 道具を 持っていないとき 大きな ダメージを 与える。" + "effect": "軽やかに 相手を 攻撃する。 自分が 道具を 持っていないとき 大きな ダメージを 与える。" }, "reflectType": { "name": "ミラータイプ", - "effect": "相手の タイプを 反射して 自分も 同じ タイプに なる。" + "effect": "相手の タイプを 反射して 自分も 同じ タイプに なる。" }, "retaliate": { "name": "かたきうち", - "effect": "倒れた 味方の かたきを 討つ。 前の ターンに 味方が 倒されていると 威力が あがる。" + "effect": "倒れた 味方の かたきを 討つ。 前の ターンに 味方が 倒されていると 威力が あがる。" }, "finalGambit": { "name": "いのちがけ", - "effect": "命懸けで 相手を 攻撃する。 自分は ひんしに なるが 相手に HP分の ダメージを 与える。" + "effect": "命懸けで 相手を 攻撃する。 自分は ひんしに なるが 相手に HP分の ダメージを 与える。" }, "bestow": { "name": "ギフトパス", - "effect": "相手が 道具を 持っていないとき 自分が 持っている 道具を 相手に わたす。" + "effect": "相手が 道具を 持っていないとき 自分が 持っている 道具を 相手に わたす。" }, "inferno": { "name": "れんごく", - "effect": "激しい 炎で 相手を 包みこみ 攻撃する。 やけど状態に する。" + "effect": "激しい 炎で 相手を 包みこみ 攻撃する。 やけど状態に する。" }, "waterPledge": { "name": "みずのちかい", - "effect": "水の柱で 攻撃する。 ほのおと 組みあわせると 威力が あがって 空に にじが かかる。" + "effect": "水の柱で 攻撃する。 ほのおと 組みあわせると 威力が あがって 空に にじが かかる。" }, "firePledge": { "name": "ほのおのちかい", - "effect": "炎の柱で 攻撃する。 くさと 組みあわせると 威力が あがって 周りが 火の海に なる。" + "effect": "炎の柱で 攻撃する。 くさと 組みあわせると 威力が あがって 周りが 火の海に なる。" }, "grassPledge": { "name": "くさのちかい", - "effect": "草の柱で 攻撃する。 みずと 組みあわせると 威力が あがって あたりが 湿原に なる。" + "effect": "草の柱で 攻撃する。 みずと 組みあわせると 威力が あがって あたりが 湿原に なる。" }, "voltSwitch": { "name": "ボルトチェンジ", - "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" + "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" }, "struggleBug": { "name": "むしのていこう", - "effect": "抵抗して 相手を 攻撃する。 相手の 特攻を さげる。" + "effect": "抵抗して 相手を 攻撃する。 相手の 特攻を さげる。" }, "bulldoze": { "name": "じならし", - "effect": "地面を 踏みならして 自分の 周りに いるものを 攻撃する。 相手の 素早さを さげる。" + "effect": "地面を 踏みならして 自分の 周りに いるものを 攻撃する。 相手の 素早さを さげる。" }, "frostBreath": { "name": "こおりのいぶき", - "effect": "冷たい 息を 相手に 吹きつけて 攻撃する。 必ず 急所に 当たる。" + "effect": "冷たい 息を 相手に 吹きつけて 攻撃する。 必ず 急所に 当たる。" }, "dragonTail": { "name": "ドラゴンテール", - "effect": "相手を はじきとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" + "effect": "相手を はじきとばして 控えの ポケモンを ひきずりだす。 野生の 場合は 戦闘が 終わる。" }, "workUp": { "name": "ふるいたてる", - "effect": "自分を 奮いたてて 攻撃と 特攻を あげる。" + "effect": "自分を 奮いたてて 攻撃と 特攻を あげる。" }, "electroweb": { "name": "エレキネット", - "effect": "電気の ネットで 相手を 捕まえて 攻撃する。 相手の 素早さを さげる。" + "effect": "電気の ネットで 相手を 捕まえて 攻撃する。 相手の 素早さを さげる。" }, "wildCharge": { "name": "ワイルドボルト", - "effect": "電気を まとって 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。" + "effect": "電気を まとって 相手に ぶつかって 攻撃する。 自分も 少し ダメージを 受ける。" }, "drillRun": { "name": "ドリルライナー", - "effect": "ドリルのように 体を 回転しながら 相手に 体当たりする。 急所に 当たりやすい。" + "effect": "ドリルのように 体を 回転しながら 相手に 体当たりする。 急所に 当たりやすい。" }, "dualChop": { "name": "ダブルチョップ", - "effect": "体の 硬い部分で 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。" + "effect": "体の 硬い部分で 相手を たたいて 攻撃する。 2回連続で ダメージを 与える。" }, "heartStamp": { "name": "ハートスタンプ", - "effect": "かわいい しぐさで 油断させて 強烈な 一撃を 浴びせる。 相手を ひるませることが ある。" + "effect": "かわいい しぐさで 油断させて 強烈な 一撃を 浴びせる。 相手を ひるませることが ある。" }, "hornLeech": { "name": "ウッドホーン", - "effect": "つのを 突き刺して 相手の 養分を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。" + "effect": "つのを 突き刺して 相手の 養分を 吸い取る。 与えた ダメージの 半分の HPを 回復できる。" }, "sacredSword": { "name": "せいなるつるぎ", - "effect": "長い つので 切りつけ 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。" + "effect": "長い つので 切りつけ 攻撃する。 相手の 能力変化に 関係なく ダメージを 与える。" }, "razorShell": { "name": "シェルブレード", - "effect": "鋭い 貝殻で 切りつけて 攻撃する。 相手の 防御を さげることが ある。" + "effect": "鋭い 貝殻で 切りつけて 攻撃する。 相手の 防御を さげることが ある。" }, "heatCrash": { "name": "ヒートスタンプ", - "effect": "燃える 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。" + "effect": "燃える 体で 相手に ぶつかって 攻撃する。 自分が 相手より 重いほど 威力が あがる。" }, "leafTornado": { "name": "グラスミキサー", - "effect": "鋭い はっぱで 相手を 包みこんで 攻撃する。 命中率を さげることが ある。" + "effect": "鋭い はっぱで 相手を 包みこんで 攻撃する。 命中率を さげることが ある。" }, "steamroller": { "name": "ハードローラー", - "effect": "まるめた 体で 回転して 相手を おしつぶす。 相手を ひるませることが ある。" + "effect": "まるめた 体で 回転して 相手を おしつぶす。 相手を ひるませることが ある。" }, "cottonGuard": { "name": "コットンガード", - "effect": "フワフワの 綿毛で 自分の 体を 包みこんで 守る。 防御を ぐぐーんと あげる。" + "effect": "フワフワの 綿毛で 自分の 体を 包みこんで 守る。 防御を ぐぐーんと あげる。" }, "nightDaze": { "name": "ナイトバースト", - "effect": "暗黒の 衝撃波を とばして 相手を 攻撃する。 命中率を さげることが ある。" + "effect": "暗黒の 衝撃波を とばして 相手を 攻撃する。 命中率を さげることが ある。" }, "psystrike": { "name": "サイコブレイク", - "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。" + "effect": "不思議な 念波を 実体化して 相手を 攻撃する。 物理的な ダメージを 与える。" }, "tailSlap": { "name": "スイープビンタ", - "effect": "硬い しっぽで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。" + "effect": "硬い しっぽで 相手を たたいて 攻撃する。 2ー5回の 間 連続で だす。" }, "hurricane": { "name": "ぼうふう", - "effect": "強烈な 風で 相手を 包みこんで 攻撃する。 相手を 混乱させることが ある。" + "effect": "強烈な 風で 相手を 包みこんで 攻撃する。 相手を 混乱させることが ある。" }, "headCharge": { "name": "アフロブレイク", - "effect": "すごい アフロの 頭で 相手に 突進して 攻撃する。 自分も 少し ダメージを 受ける。" + "effect": "すごい アフロの 頭で 相手に 突進して 攻撃する。 自分も 少し ダメージを 受ける。" }, "gearGrind": { "name": "ギアソーサー", - "effect": "鋼鉄の ギアを 相手に 投げつけて 攻撃する。 2回連続で ダメージを 与える。" + "effect": "鋼鉄の ギアを 相手に 投げつけて 攻撃する。 2回連続で ダメージを 与える。" }, "searingShot": { "name": "かえんだん", - "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。" + "effect": "真っ赤な 炎で 自分の 周りに いるものを 攻撃する。 やけど状態に することが ある。" }, "technoBlast": { "name": "テクノバスター", - "effect": "光弾を 相手に 放出する。 自分の 持つ カセットにより タイプが 変わる。" + "effect": "光弾を 相手に 放出する。 自分の 持つ カセットにより タイプが 変わる。" }, "relicSong": { "name": "いにしえのうた", - "effect": "いにしえのうたを 相手に 聞かせて 心に うったえて 攻撃する。 眠り状態に することが ある。" + "effect": "いにしえのうたを 相手に 聞かせて 心に うったえて 攻撃する。 眠り状態に することが ある。" }, "secretSword": { "name": "しんぴのつるぎ", - "effect": "長い つので 切りつけ 攻撃する。 つのが まとった 不思議な 力は 物理的な ダメージを 与える。" + "effect": "長い つので 切りつけ 攻撃する。 つのが まとった 不思議な 力は 物理的な ダメージを 与える。" }, "glaciate": { "name": "こごえるせかい", - "effect": "凍えるような 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。" + "effect": "凍えるような 冷気を 相手に 吹きつけて 攻撃する。 相手の 素早さを さげる。" }, "boltStrike": { "name": "らいげき", - "effect": "ぼうだいな 電気を 身に まとって 相手に 突進して 攻撃する。 まひ状態に することが ある。" + "effect": "ぼうだいな 電気を 身に まとって 相手に 突進して 攻撃する。 まひ状態に することが ある。" }, "blueFlare": { "name": "あおいほのお", - "effect": "美しくも 激しい 青い炎で 相手を 包みこんで 攻撃する。 やけど状態に することが ある。" + "effect": "美しくも 激しい 青い炎で 相手を 包みこんで 攻撃する。 やけど状態に することが ある。" }, "fieryDance": { "name": "ほのおのまい", - "effect": "炎を まとい はばたいて 相手を 攻撃する。自分の 特攻が あがることが ある。" + "effect": "炎を まとい はばたいて 相手を 攻撃する。自分の 特攻が あがることが ある。" }, "freezeShock": { "name": "フリーズボルト", - "effect": "電気を まとった 氷の 塊で 2ターン目に 相手を たたきつける。 まひ状態に することが ある。" + "effect": "電気を まとった 氷の 塊で 2ターン目に 相手を たたきつける。 まひ状態に することが ある。" }, "iceBurn": { "name": "コールドフレア", - "effect": "すべてを 凍らせる 激しい 冷気で 2ターン目に 相手を 包みこむ。 やけど状態に することが ある。" + "effect": "すべてを 凍らせる 激しい 冷気で 2ターン目に 相手を 包みこむ。 やけど状態に することが ある。" }, "snarl": { "name": "バークアウト", - "effect": "まくしたてる ように 怒鳴りつけて 相手の 特攻を さげる。" + "effect": "まくしたてる ように 怒鳴りつけて 相手の 特攻を さげる。" }, "icicleCrash": { "name": "つららおとし", - "effect": "大きな 氷柱を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。" + "effect": "大きな 氷柱を 激しく ぶつけて 攻撃する。 相手を ひるませることが ある。" }, "vCreate": { "name": "Vジェネレート", - "effect": "灼熱の 炎を 額から 発生させて 捨て身の 体当たり。 防御 特防 素早さが さがる。" + "effect": "灼熱の 炎を 額から 発生させて 捨て身の 体当たり。 防御 特防 素早さが さがる。" }, "fusionFlare": { "name": "クロスフレイム", - "effect": "巨大な 炎を たたきつける。 巨大な 雷の 影響を受け 技の 威力が あがる。" + "effect": "巨大な 炎を たたきつける。 巨大な 雷の 影響を受け 技の 威力が あがる。" }, "fusionBolt": { "name": "クロスサンダー", - "effect": "巨大な 雷を たたきつける。 巨大な 炎の 影響を受け 技の 威力が あがる。" + "effect": "巨大な 雷を たたきつける。 巨大な 炎の 影響を受け 技の 威力が あがる。" }, "flyingPress": { "name": "フライングプレス", - "effect": "空中から 相手に ダイブする。 この技は かくとうタイプと 同時に ひこうタイプでも ある。" + "effect": "空中から 相手に ダイブする。 この技は かくとうタイプと 同時に ひこうタイプでも ある。" }, "matBlock": { "name": "たたみがえし", - "effect": "かえした タタミを 盾にして 自分や 味方への 技の ダメージを 防ぐ。 変化技は 防ぐことが できない。" + "effect": "かえした タタミを 盾にして 自分や 味方への 技の ダメージを 防ぐ。 変化技は 防ぐことが できない。" }, "belch": { "name": "ゲップ", - "effect": "相手に 向かって ゲップを 浴びせて ダメージを 与える。 きのみを 食べないと だせない。" + "effect": "相手に 向かって ゲップを 浴びせて ダメージを 与える。 きのみを 食べないと だせない。" }, "rototiller": { "name": "たがやす", - "effect": "地面を 耕して 草木が 育ちやすいようにする。 くさタイプの 攻撃と 特攻が あがる。" + "effect": "地面を 耕して 草木が 育ちやすいようにする。 くさタイプの 攻撃と 特攻が あがる。" }, "stickyWeb": { "name": "ねばねばネット", - "effect": "相手の 周りに ねばねばした ネットを はりめぐらせ 交代で でてきた 相手の 素早さを さげる。" + "effect": "相手の 周りに ねばねばした ネットを はりめぐらせ 交代で でてきた 相手の 素早さを さげる。" }, "fellStinger": { "name": "とどめばり", - "effect": "この 技を 使って 相手を 倒すと 攻撃が ぐぐーんと あがる。" + "effect": "この 技を 使って 相手を 倒すと 攻撃が ぐぐーんと あがる。" }, "phantomForce": { "name": "ゴーストダイブ", - "effect": "1ターンめで どこかに 消えて 2ターンめに 相手を 攻撃する。 守りを 無視して 攻撃できる。" + "effect": "1ターンめで どこかに 消えて 2ターンめに 相手を 攻撃する。 守りを 無視して 攻撃できる。" }, "trickOrTreat": { "name": "ハロウィン", - "effect": "相手を ハロウィンに 誘う。 相手の タイプに ゴーストタイプが 追加される。" + "effect": "相手を ハロウィンに 誘う。 相手の タイプに ゴーストタイプが 追加される。" }, "nobleRoar": { "name": "おたけび", - "effect": "おたけびを あげて 相手を 威嚇し 相手の 攻撃と 特攻を さげる。" + "effect": "おたけびを あげて 相手を 威嚇し 相手の 攻撃と 特攻を さげる。" }, "ionDeluge": { "name": "プラズマシャワー", - "effect": "電気を 帯びた 粒子を 拡散し ノーマルタイプの 技を でんきタイプに してしまう。" + "effect": "電気を 帯びた 粒子を 拡散し ノーマルタイプの 技を でんきタイプに してしまう。" }, "parabolicCharge": { "name": "パラボラチャージ", - "effect": "周りにいる ポケモン 全員に ダメージ。 与えた ダメージの 半分を 自分が 回復する。" + "effect": "周りにいる ポケモン 全員に ダメージ。 与えた ダメージの 半分を 自分が 回復する。" }, "forestsCurse": { "name": "もりののろい", - "effect": "相手に 森ののろいを かける。 のろいを かけられた 相手は タイプに くさタイプが 追加される。" + "effect": "相手に 森ののろいを かける。 のろいを かけられた 相手は タイプに くさタイプが 追加される。" }, "petalBlizzard": { "name": "はなふぶき", - "effect": "激しい 花吹雪を 起こし 周りに いるものに 攻撃して ダメージを 与える。" + "effect": "激しい 花吹雪を 起こし 周りに いるものに 攻撃して ダメージを 与える。" }, "freezeDry": { "name": "フリーズドライ", - "effect": "相手を 急激に 冷やして こおり 状態に することが ある。 みずタイプにも 効果バツグンになる。" + "effect": "相手を 急激に 冷やして こおり 状態に することが ある。 みずタイプにも 効果バツグンになる。" }, "disarmingVoice": { "name": "チャームボイス", - "effect": "魅惑の 鳴き声を だして 相手に 精神的な ダメージを 与える。 攻撃は 必ず 命中 する。" + "effect": "魅惑の 鳴き声を だして 相手に 精神的な ダメージを 与える。 攻撃は 必ず 命中 する。" }, "partingShot": { "name": "すてゼリフ", - "effect": "すてゼリフで 相手を いかくし 攻撃と 特攻を さげたのち 控えの ポケモンと 入れ替わる。" + "effect": "すてゼリフで 相手を いかくし 攻撃と 特攻を さげたのち 控えの ポケモンと 入れ替わる。" }, "topsyTurvy": { "name": "ひっくりかえす", - "effect": "相手に かかっている すべての 能力変化を ひっくり返して 逆にする。" + "effect": "相手に かかっている すべての 能力変化を ひっくり返して 逆にする。" }, "drainingKiss": { "name": "ドレインキッス", - "effect": "キッスによって 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。" + "effect": "キッスによって 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。" }, "craftyShield": { "name": "トリックガード", - "effect": "不思議な 力を 使って 味方への 変化技を 防ぐ。 ダメージ技は 受けてしまう。" + "effect": "不思議な 力を 使って 味方への 変化技を 防ぐ。 ダメージ技は 受けてしまう。" }, "flowerShield": { "name": "フラワーガード", - "effect": "不思議な 力を 使って 場にいる くさタイプの ポケモン 全員の 防御を あげる。" + "effect": "不思議な 力を 使って 場にいる くさタイプの ポケモン 全員の 防御を あげる。" }, "grassyTerrain": { "name": "グラスフィールド", - "effect": "5ターンの 間 グラスフィールドにする。 地面にいると 毎ターン 回復する。 くさタイプの 威力が あがる。" + "effect": "5ターンの 間 グラスフィールドにする。 地面にいると 毎ターン 回復する。 くさタイプの 威力が あがる。" }, "mistyTerrain": { "name": "ミストフィールド", - "effect": "5ターンの 間 地面にいると 状態異常に ならず ドラゴン技の ダメージも 半分になる。" + "effect": "5ターンの 間 地面にいると 状態異常に ならず ドラゴン技の ダメージも 半分になる。" }, "electrify": { "name": "そうでん", - "effect": "相手が 技を だす前に そうでん すると そのターン 相手の 技は でんきタイプになる。" + "effect": "相手が 技を だす前に そうでん すると そのターン 相手の 技は でんきタイプになる。" }, "playRough": { "name": "じゃれつく", - "effect": "相手に じゃれついて 攻撃する。 相手の 攻撃を さげる ことがある。" + "effect": "相手に じゃれついて 攻撃する。 相手の 攻撃を さげる ことがある。" }, "fairyWind": { "name": "ようせいのかぜ", - "effect": "ようせいのかぜを 起こし 相手に 吹きつけて 攻撃する。" + "effect": "ようせいのかぜを 起こし 相手に 吹きつけて 攻撃する。" }, "moonblast": { "name": "ムーンフォース", - "effect": "月の パワーを かりて 相手を 攻撃する。 相手の 特攻を さげる ことがある。" + "effect": "月の パワーを かりて 相手を 攻撃する。 相手の 特攻を さげる ことがある。" }, "boomburst": { "name": "ばくおんぱ", - "effect": "すさまじい 爆音の 破壊力に よって 周りに いるものを 攻撃する。" + "effect": "すさまじい 爆音の 破壊力に よって 周りに いるものを 攻撃する。" }, "fairyLock": { "name": "フェアリーロック", - "effect": "ロックを かけることによって 次のターン すべての ポケモンを 逃げられなくする。" + "effect": "ロックを かけることによって 次のターン すべての ポケモンを 逃げられなくする。" }, "kingsShield": { "name": "キングシールド", - "effect": "相手の 攻撃を 防ぐと 同時に 防御態勢になる。 触れた 相手の 攻撃を さげる。" + "effect": "相手の 攻撃を 防ぐと 同時に 防御態勢になる。 触れた 相手の 攻撃を さげる。" }, "playNice": { "name": "なかよくする", - "effect": "相手と なかよくなって 戦う 気力を 失わせ 相手の 攻撃を さげる。" + "effect": "相手と なかよくなって 戦う 気力を 失わせ 相手の 攻撃を さげる。" }, "confide": { "name": "ないしょばなし", - "effect": "ないしょばなしを することで 相手の 集中力を 失わせ 相手の 特攻を さげる。" + "effect": "ないしょばなしを することで 相手の 集中力を 失わせ 相手の 特攻を さげる。" }, "diamondStorm": { "name": "ダイヤストーム", - "effect": "ダイヤの 嵐を 巻き起こし ダメージを 与える。 自分の 防御を ぐーんと あげることが ある。" + "effect": "ダイヤの 嵐を 巻き起こし ダメージを 与える。 自分の 防御を ぐーんと あげることが ある。" }, "steamEruption": { "name": "スチームバースト", - "effect": "ものすごく 熱い 蒸気を 相手に 浴びせる。 相手は やけどする ことがある。" + "effect": "ものすごく 熱い 蒸気を 相手に 浴びせる。 相手は やけどする ことがある。" }, "hyperspaceHole": { "name": "いじげんホール", - "effect": "異次元ホールで 突然 相手の 真横に 現れ 攻撃する。 まもるや みきり なども 無視 できる。" + "effect": "異次元ホールで 突然 相手の 真横に 現れ 攻撃する。 まもるや みきり なども 無視 できる。" }, "waterShuriken": { "name": "みずしゅりけん", - "effect": "粘液で できた 手裏剣を 2ー5回の 間 連続で だす。 必ず 先制攻撃 できる。" + "effect": "粘液で できた 手裏剣を 2ー5回の 間 連続で だす。 必ず 先制攻撃 できる。" }, "mysticalFire": { "name": "マジカルフレイム", - "effect": "口から 吐きだす 特別 熱い 炎で 攻撃する。 相手の 特攻を さげる。" + "effect": "口から 吐きだす 特別 熱い 炎で 攻撃する。 相手の 特攻を さげる。" }, "spikyShield": { "name": "ニードルガード", - "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手の 体力を 削って しまう。" + "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手の 体力を 削って しまう。" }, "aromaticMist": { "name": "アロマミスト", - "effect": "不思議な アロマの 香りによって 味方の 特防を あげる。" + "effect": "不思議な アロマの 香りによって 味方の 特防を あげる。" }, "eerieImpulse": { "name": "かいでんぱ", - "effect": "体から かいでんぱを 放ち 相手に 浴びせる ことによって 特攻を がくっと さげる。" + "effect": "体から かいでんぱを 放ち 相手に 浴びせる ことによって 特攻を がくっと さげる。" }, "venomDrench": { "name": "ベノムトラップ", - "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手は 攻撃 特攻 素早さが さがる。" + "effect": "特殊な 毒液を 浴びせかける。 毒状態の 相手は 攻撃 特攻 素早さが さがる。" }, "powder": { "name": "ふんじん", - "effect": "ふんじんを 浴びせた 相手が ほのお技を 使うと 爆発して ダメージを 与える。" + "effect": "ふんじんを 浴びせた 相手が ほのお技を 使うと 爆発して ダメージを 与える。" }, "geomancy": { "name": "ジオコントロール", - "effect": "1ターン目で エネルギーを 吸収し 2ターン目に 特攻 特防 素早さを ぐーんと あげる。" + "effect": "1ターン目で エネルギーを 吸収し 2ターン目に 特攻 特防 素早さを ぐーんと あげる。" }, "magneticFlux": { "name": "じばそうさ", - "effect": "磁場を 操作 することによって 特性 プラスと マイナスの 防御 特防が あがる。" + "effect": "磁場を 操作 することによって 特性 プラスと マイナスの 防御 特防が あがる。" }, "happyHour": { "name": "ハッピータイム", - "effect": "ハッピータイムの 技を 使うと 戦闘の あとで もらえる お金が 倍になる。" + "effect": "ハッピータイムの 技を 使うと 戦闘の あとで もらえる お金が 倍になる。" }, "electricTerrain": { "name": "エレキフィールド", - "effect": "5ターンの 間 エレキフィールドにする。 地面にいる ポケモンは 眠らない。 でんきタイプの 威力が あがる。" + "effect": "5ターンの 間 エレキフィールドにする。 地面にいる ポケモンは 眠らない。 でんきタイプの 威力が あがる。" }, "dazzlingGleam": { "name": "マジカルシャイン", - "effect": "強力な 光を 放ち 相手に ダメージを 与える。" + "effect": "強力な 光を 放ち 相手に ダメージを 与える。" }, "celebrate": { "name": "おいわい", - "effect": "ポケモンが とっても ハッピーな あなたのことを お祝い してくれる。" + "effect": "ポケモンが とっても ハッピーな あなたのことを お祝い してくれる。" }, "holdHands": { "name": "てをつなぐ", - "effect": "味方の ポケモン 同士が 手をつなぐ。 とっても 幸せな 気持ちに なれる。" + "effect": "味方の ポケモン 同士が 手をつなぐ。 とっても 幸せな 気持ちに なれる。" }, "babyDollEyes": { "name": "つぶらなひとみ", - "effect": "つぶらなひとみで 相手を みつめて 攻撃を さげる。 必ず 先制攻撃 できる。" + "effect": "つぶらなひとみで 相手を みつめて 攻撃を さげる。 必ず 先制攻撃 できる。" }, "nuzzle": { "name": "ほっぺすりすり", - "effect": "電気を 帯びた ほっぺを すりつけて 攻撃。 相手を まひ状態に する。" + "effect": "電気を 帯びた ほっぺを すりつけて 攻撃。 相手を まひ状態に する。" }, "holdBack": { "name": "てかげん", - "effect": "手加減 した 攻撃で 相手の HPを 必ず 1だけ 残す。" + "effect": "手加減 した 攻撃で 相手の HPを 必ず 1だけ 残す。" }, "infestation": { "name": "まとわりつく", - "effect": "4ー5ターンの 間 相手に まとわりついて 攻撃する。 そのあいだ 相手は 逃げられない。" + "effect": "4ー5ターンの 間 相手に まとわりついて 攻撃する。 そのあいだ 相手は 逃げられない。" }, "powerUpPunch": { "name": "グロウパンチ", - "effect": "繰り返し 打つことで だんだん こぶしが 固くなる。 相手に 当てると 攻撃が あがる。" + "effect": "繰り返し 打つことで だんだん こぶしが 固くなる。 相手に 当てると 攻撃が あがる。" }, "oblivionWing": { "name": "デスウイング", - "effect": "ねらいを 定めた 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。" + "effect": "ねらいを 定めた 相手から HPを 吸い取る。 与えた ダメージの 半分以上 HPを 回復する。" }, "thousandArrows": { "name": "サウザンアロー", - "effect": "浮いている ポケモンにも 当たる。 浮いていた 相手は 撃ち落とされて 地面に 落ちる。" + "effect": "浮いている ポケモンにも 当たる。 浮いていた 相手は 撃ち落とされて 地面に 落ちる。" }, "thousandWaves": { "name": "サウザンウェーブ", - "effect": "地をはう 波によって 攻撃。 波に 巻き込まれた 相手は 戦闘から 逃げられなくなる。" + "effect": "地をはう 波によって 攻撃。 波に 巻き込まれた 相手は 戦闘から 逃げられなくなる。" }, "landsWrath": { "name": "グランドフォース", - "effect": "大地の パワーを 集め 力を 相手に 集中させて ダメージを 与える。" + "effect": "大地の パワーを 集め 力を 相手に 集中させて ダメージを 与える。" }, "lightOfRuin": { "name": "はめつのひかり", - "effect": "永遠の花 の パワーを かりて 強力な 光線を 撃ちだす。 自分も かなりの ダメージを 受ける。" + "effect": "永遠の花 の パワーを かりて 強力な 光線を 撃ちだす。 自分も かなりの ダメージを 受ける。" }, "originPulse": { "name": "こんげんのはどう", - "effect": "青白く 輝く 無数の 光線で 相手を 攻撃する。" + "effect": "青白く 輝く 無数の 光線で 相手を 攻撃する。" }, "precipiceBlades": { "name": "だんがいのつるぎ", - "effect": "大地の 力を 刃に 変えて 相手を 攻撃する。" + "effect": "大地の 力を 刃に 変えて 相手を 攻撃する。" }, "dragonAscent": { "name": "ガリョウテンセイ", - "effect": "大空から 急速落下 して 相手を 攻撃する。 自分の 防御と 特防が さがる。" + "effect": "大空から 急速落下 して 相手を 攻撃する。 自分の 防御と 特防が さがる。" }, "hyperspaceFury": { "name": "いじげんラッシュ", - "effect": "たくさんの 腕で まもるや みきり などを 無視した 連続攻撃。 自分の 防御が さがる。" + "effect": "たくさんの 腕で まもるや みきり などを 無視した 連続攻撃。 自分の 防御が さがる。" }, "breakneckBlitzPhysical": { "name": "ウルトラダッシュアタック", - "effect": "Zパワーで 勢いを つけて 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 勢いを つけて 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" }, "breakneckBlitzSpecial": { "name": "ウルトラダッシュアタック", @@ -2493,7 +2493,7 @@ }, "allOutPummelingPhysical": { "name": "ぜんりょくむそうげきれつけん", - "effect": "Zパワーで 作った エネルギーの 弾を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 作った エネルギーの 弾を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" }, "allOutPummelingSpecial": { "name": "ぜんりょくむそうげきれつけん", @@ -2501,7 +2501,7 @@ }, "supersonicSkystrikePhysical": { "name": "ファイナルダイブクラッシュ", - "effect": "Zパワーで 勢いよく 飛びあがり 相手に 向かって 全力で 落下。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 勢いよく 飛びあがり 相手に 向かって 全力で 落下。 元になった 技で 威力が 変わる。" }, "supersonicSkystrikeSpecial": { "name": "ファイナルダイブクラッシュ", @@ -2509,7 +2509,7 @@ }, "acidDownpourPhysical": { "name": "アシッドポイズンデリート", - "effect": "Zパワーで 毒の 沼を 湧きあがらせ 全力で 相手を 沈める。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 毒の 沼を 湧きあがらせ 全力で 相手を 沈める。 元になった 技で 威力が 変わる。" }, "acidDownpourSpecial": { "name": "アシッドポイズンデリート", @@ -2517,7 +2517,7 @@ }, "tectonicRagePhysical": { "name": "ライジングランドオーバー", - "effect": "Zパワーで 地面の 奥深くに 潜り 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 地面の 奥深くに 潜り 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" }, "tectonicRageSpecial": { "name": "ライジングランドオーバー", @@ -2525,7 +2525,7 @@ }, "continentalCrushPhysical": { "name": "ワールズエンドフォール", - "effect": "Zパワーで 大きな 岩山を 呼びだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 大きな 岩山を 呼びだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" }, "continentalCrushSpecial": { "name": "ワールズエンドフォール", @@ -2533,7 +2533,7 @@ }, "savageSpinOutPhysical": { "name": "ぜったいほしょくかいてんざん", - "effect": "Zパワーで 吐きだした 糸が 全力で 相手を 縛りつける。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 吐きだした 糸が 全力で 相手を 縛りつける。 元になった 技で 威力が 変わる。" }, "savageSpinOutSpecial": { "name": "ぜったいほしょくかいてんざん", @@ -2541,7 +2541,7 @@ }, "neverEndingNightmarePhysical": { "name": "むげんあんやへのいざない", - "effect": "Zパワーで 呼びよせた 強い 怨念が 全力で 相手に 降りかかる。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 呼びよせた 強い 怨念が 全力で 相手に 降りかかる。 元になった 技で 威力が 変わる。" }, "neverEndingNightmareSpecial": { "name": "むげんあんやへのいざない", @@ -2549,7 +2549,7 @@ }, "corkscrewCrashPhysical": { "name": "ちょうぜつらせんれんげき", - "effect": "Zパワーで 高速回転を おこない 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 高速回転を おこない 全力で 相手に ぶつかる。 元になった 技で 威力が 変わる。" }, "corkscrewCrashSpecial": { "name": "ちょうぜつらせんれんげき", @@ -2557,7 +2557,7 @@ }, "infernoOverdrivePhysical": { "name": "ダイナミックフルフレイム", - "effect": "Zパワーで 燃えさかる 炎を 吐きだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 燃えさかる 炎を 吐きだし 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" }, "infernoOverdriveSpecial": { "name": "ダイナミックフルフレイム", @@ -2565,7 +2565,7 @@ }, "hydroVortexPhysical": { "name": "スーパーアクアトルネード", - "effect": "Zパワーで 大きな 渦潮を 作り 全力で 相手を 飲みこむ。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 大きな 渦潮を 作り 全力で 相手を 飲みこむ。 元になった 技で 威力が 変わる。" }, "hydroVortexSpecial": { "name": "スーパーアクアトルネード", @@ -2573,7 +2573,7 @@ }, "bloomDoomPhysical": { "name": "ブルームシャインエクストラ", - "effect": "Zパワーで 草花の エネルギーを 借り 全力で 相手を 攻撃する。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 草花の エネルギーを 借り 全力で 相手を 攻撃する。 元になった 技で 威力が 変わる。" }, "bloomDoomSpecial": { "name": "ブルームシャインエクストラ", @@ -2581,7 +2581,7 @@ }, "gigavoltHavocPhysical": { "name": "スパーキングギガボルト", - "effect": "Zパワーで 溜めた 強い 電気を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 溜めた 強い 電気を 全力で 相手に ぶつける。 元になった 技で 威力が 変わる。" }, "gigavoltHavocSpecial": { "name": "スパーキングギガボルト", @@ -2589,7 +2589,7 @@ }, "shatteredPsychePhysical": { "name": "マキシマムサイブレイカー", - "effect": "Zパワーで 相手を 操り 全力で 痛い 思いを させる。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 相手を 操り 全力で 痛い 思いを させる。 元になった 技で 威力が 変わる。" }, "shatteredPsycheSpecial": { "name": "マキシマムサイブレイカー", @@ -2597,7 +2597,7 @@ }, "subzeroSlammerPhysical": { "name": "レイジングジオフリーズ", - "effect": "Zパワーで 気温を 急激に 下げ 全力で 相手を 凍らせる。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 気温を 急激に 下げ 全力で 相手を 凍らせる。 元になった 技で 威力が 変わる。" }, "subzeroSlammerSpecial": { "name": "レイジングジオフリーズ", @@ -2605,7 +2605,7 @@ }, "devastatingDrakePhysical": { "name": "アルティメットドラゴンバーン", - "effect": "Zパワーで オーラを 実体化し 全力で 相手に 襲いかかる。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで オーラを 実体化し 全力で 相手に 襲いかかる。 元になった 技で 威力が 変わる。" }, "devastatingDrakeSpecial": { "name": "アルティメットドラゴンバーン", @@ -2613,7 +2613,7 @@ }, "blackHoleEclipsePhysical": { "name": "ブラックホールイクリプス", - "effect": "Zパワーで 悪の エネルギーを 集め 全力で 相手を 吸いよせる。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 悪の エネルギーを 集め 全力で 相手を 吸いよせる。 元になった 技で 威力が 変わる。" }, "blackHoleEclipseSpecial": { "name": "ブラックホールイクリプス", @@ -2621,7 +2621,7 @@ }, "twinkleTacklePhysical": { "name": "ラブリースターインパクト", - "effect": "Zパワーで 魅惑の 空間を 作り 全力で 相手を もてあそぶ。 元になった 技で 威力が 変わる。" + "effect": "Zパワーで 魅惑の 空間を 作り 全力で 相手を もてあそぶ。 元になった 技で 威力が 変わる。" }, "twinkleTackleSpecial": { "name": "ラブリースターインパクト", @@ -2629,1182 +2629,1182 @@ }, "catastropika": { "name": "ひっさつのピカチュート", - "effect": "Zパワーで 最大 電力を 身に まとったピカチュウが 全力で 相手に 飛び掛る。" + "effect": "Zパワーで 最大 電力を 身に まとったピカチュウが 全力で 相手に 飛び掛る。" }, "shoreUp": { "name": "すなあつめ", - "effect": "最大HPの 半分 自分の HPを 回復する。 すなあらしの時は 多く 回復。" + "effect": "最大HPの 半分 自分の HPを 回復する。 すなあらしの時は 多く 回復。" }, "firstImpression": { "name": "であいがしら", - "effect": "威力が 高い 技 だが 戦闘に 出たら すぐに 出さないと 成功 しない。" + "effect": "威力が 高い 技 だが 戦闘に 出たら すぐに 出さないと 成功 しない。" }, "banefulBunker": { "name": "トーチカ", - "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手に 毒を 与えてしまう。" + "effect": "相手の 攻撃を 防ぐと 同時に 触れた 相手に 毒を 与えてしまう。" }, "spiritShackle": { "name": "かげぬい", - "effect": "攻撃と 同時に 相手の 影を 縫い付けて 逃げられなくする。" + "effect": "攻撃と 同時に 相手の 影を 縫い付けて 逃げられなくする。" }, "darkestLariat": { "name": "DDラリアット", - "effect": "両腕を 回し 相手に 当てる。 相手の 能力変化に 関係なく ダメージを 与える。" + "effect": "両腕を 回し 相手に 当てる。 相手の 能力変化に 関係なく ダメージを 与える。" }, "sparklingAria": { "name": "うたかたのアリア", - "effect": "歌うことによって たくさんの バルーンを 放出する。 技を 受けると やけどが 治る。" + "effect": "歌うことによって たくさんの バルーンを 放出する。 技を 受けると やけどが 治る。" }, "iceHammer": { "name": "アイスハンマー", - "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。" + "effect": "強くて 重い こぶしを ふるって ダメージを 与える。 自分の 素早さが さがる。" }, "floralHealing": { "name": "フラワーヒール", - "effect": "最大HPの 半分 相手の HPを 回復する。 グラスフィールドの時 効果が あがる。" + "effect": "最大HPの 半分 相手の HPを 回復する。 グラスフィールドの時 効果が あがる。" }, "highHorsepower": { "name": "10まんばりき", - "effect": "全身を 使って 相手に 猛アタックする。" + "effect": "全身を 使って 相手に 猛アタックする。" }, "strengthSap": { "name": "ちからをすいとる", - "effect": "相手の 攻撃力と 同じだけ 自分の HPを 回復する。 そして 相手の 攻撃を さげる。" + "effect": "相手の 攻撃力と 同じだけ 自分の HPを 回復する。 そして 相手の 攻撃を さげる。" }, "solarBlade": { "name": "ソーラーブレード", - "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に その 力を 剣に 込めて 攻撃する。" + "effect": "1ターン目に 光を いっぱいに 集め 2ターン目に その 力を 剣に 込めて 攻撃する。" }, "leafage": { "name": "このは", - "effect": "はっぱを 相手に 当てて 攻撃する。" + "effect": "はっぱを 相手に 当てて 攻撃する。" }, "spotlight": { "name": "スポットライト", - "effect": "ポケモンに スポットライトを 当て そのターンに そのポケモンしか 狙えない ようにする。" + "effect": "ポケモンに スポットライトを 当て そのターンに そのポケモンしか 狙えない ようにする。" }, "toxicThread": { "name": "どくのいと", - "effect": "毒の 混じった 糸を 吹き付ける。 相手を 毒にして 素早さを さげる。" + "effect": "毒の 混じった 糸を 吹き付ける。 相手を 毒にして 素早さを さげる。" }, "laserFocus": { "name": "とぎすます", - "effect": "精神を 集中して 次の 攻撃を 必ず 急所に 当てる。" + "effect": "精神を 集中して 次の 攻撃を 必ず 急所に 当てる。" }, "gearUp": { "name": "アシストギア", - "effect": "ギアを 入れる ことによって 特性 プラスと マイナスの 攻撃と 特攻が あがる。" + "effect": "ギアを 入れる ことによって 特性 プラスと マイナスの 攻撃と 特攻が あがる。" }, "throatChop": { "name": "じごくづき", - "effect": "この 技を 受けた 相手は 地獄の 苦しみから 2ターンの間 音の 技を 出すことが できなくなる。" + "effect": "この 技を 受けた 相手は 地獄の 苦しみから 2ターンの間 音の 技を 出すことが できなくなる。" }, "pollenPuff": { "name": "かふんだんご", - "effect": "敵には 爆発する だんごを 使って 攻撃。 味方には 回復する だんごを 与える。" + "effect": "敵には 爆発する だんごを 使って 攻撃。 味方には 回復する だんごを 与える。" }, "anchorShot": { "name": "アンカーショット", - "effect": "アンカーを 相手に からませて 攻撃する。 相手は 逃げることが できなくなる。" + "effect": "アンカーを 相手に からませて 攻撃する。 相手は 逃げることが できなくなる。" }, "psychicTerrain": { "name": "サイコフィールド", - "effect": "5ターンの間 地面にいると 先制技を 受けない。 エスパータイプの 威力が あがる。" + "effect": "5ターンの間 地面にいると 先制技を 受けない。 エスパータイプの 威力が あがる。" }, "lunge": { "name": "とびかかる", - "effect": "全力で 相手に 飛びかかって 攻撃。 相手の 攻撃を さげる。" + "effect": "全力で 相手に 飛びかかって 攻撃。 相手の 攻撃を さげる。" }, "fireLash": { "name": "ほのおのムチ", - "effect": "焼けたムチで 相手を 打ちつける。 攻撃を 受けた 相手は 防御が さがる。" + "effect": "焼けたムチで 相手を 打ちつける。 攻撃を 受けた 相手は 防御が さがる。" }, "powerTrip": { "name": "つけあがる", - "effect": "自分の 強さを 鼻高々に 攻撃する。自分の 能力が あがって いるほど 威力が あがる。" + "effect": "自分の 強さを 鼻高々に 攻撃する。自分の 能力が あがって いるほど 威力が あがる。" }, "burnUp": { "name": "もえつきる", - "effect": "全身の ほのおを すべて 燃やして 大ダメージを 与える。 自分の ほのおタイプが なくなる。" + "effect": "全身の ほのおを すべて 燃やして 大ダメージを 与える。 自分の ほのおタイプが なくなる。" }, "speedSwap": { "name": "スピードスワップ", - "effect": "相手の 素早さと 自分の 素早さを 入れ替えてしまう。" + "effect": "相手の 素早さと 自分の 素早さを 入れ替えてしまう。" }, "smartStrike": { "name": "スマートホーン", - "effect": "とがった つので 相手を 突き刺して 攻撃する。 攻撃は 必ず 命中する。" + "effect": "とがった つので 相手を 突き刺して 攻撃する。 攻撃は 必ず 命中する。" }, "purify": { "name": "じょうか", - "effect": "相手の 状態異常を 治す。 治すと 自分は HPを 回復 することが できる。" + "effect": "相手の 状態異常を 治す。 治すと 自分は HPを 回復 することが できる。" }, "revelationDance": { "name": "めざめるダンス", - "effect": "全力で 踊って 攻撃する。 この 技の タイプは 自分の タイプと 同じになる。" + "effect": "全力で 踊って 攻撃する。 この 技の タイプは 自分の タイプと 同じになる。" }, "coreEnforcer": { "name": "コアパニッシャー", - "effect": "ダメージを 与えた 相手が すでに 行動を 終えていたら 相手の 特性を 消してしまう。" + "effect": "ダメージを 与えた 相手が すでに 行動を 終えていたら 相手の 特性を 消してしまう。" }, "tropKick": { "name": "トロピカルキック", - "effect": "南国 由来の 熱い キックを 相手に 浴びせる。 相手の 攻撃を さげる。" + "effect": "南国 由来の 熱い キックを 相手に 浴びせる。 相手の 攻撃を さげる。" }, "instruct": { "name": "さいはい", - "effect": "相手が 出した 技を 指示して もう一度 出させることが できる。" + "effect": "相手が 出した 技を 指示して もう一度 出させることが できる。" }, "beakBlast": { "name": "くちばしキャノン", - "effect": "最初に クチバシを 加熱してから 攻撃を くりだす。 加熱中に さわると やけどする。" + "effect": "最初に クチバシを 加熱してから 攻撃を くりだす。 加熱中に さわると やけどする。" }, "clangingScales": { "name": "スケイルノイズ", - "effect": "全身の うろこを こすり 大きな 音を 出して 攻撃する。 攻撃後 自分の 防御が さがる。" + "effect": "全身の うろこを こすり 大きな 音を 出して 攻撃する。 攻撃後 自分の 防御が さがる。" }, "dragonHammer": { "name": "ドラゴンハンマー", - "effect": "体を ハンマーのように 使って 相手に 襲いかかり ダメージを 与える。" + "effect": "体を ハンマーのように 使って 相手に 襲いかかり ダメージを 与える。" }, "brutalSwing": { "name": "ぶんまわす", - "effect": "自分の 体を ぶんまわして 相手に ダメージを 与える。" + "effect": "自分の 体を ぶんまわして 相手に ダメージを 与える。" }, "auroraVeil": { "name": "オーロラベール", - "effect": "5ターンの 間 物理と 特殊の ダメージを 弱める。 ゆきの 時しか 出すことが できない。" + "effect": "5ターンの 間 物理と 特殊の ダメージを 弱める。 ゆきの 時しか 出すことが できない。" }, "sinisterArrowRaid": { "name": "シャドーアローズストライク", - "effect": "Zパワーで 無数の 矢を 作りだした ジュナイパーが 全力で 相手を 射抜く 攻撃。" + "effect": "Zパワーで 無数の 矢を 作りだした ジュナイパーが 全力で 相手を 射抜く 攻撃。" }, "maliciousMoonsault": { "name": "ハイパーダーククラッシャー", - "effect": "Zパワーで タフな 肉体を 得た ガオガエンが 全力で 相手に ぶつかって 攻撃する。" + "effect": "Zパワーで タフな 肉体を 得た ガオガエンが 全力で 相手に ぶつかって 攻撃する。" }, "oceanicOperetta": { "name": "わだつみのシンフォニア", - "effect": "Zパワーで 大量の 水を 呼んだ アシレーヌが 全力で 相手を 攻撃する。" + "effect": "Zパワーで 大量の 水を 呼んだ アシレーヌが 全力で 相手を 攻撃する。" }, "guardianOfAlola": { "name": "ガーディアン・デ・アローラ", - "effect": "Zパワーで アローラの 力を 得た とちがみポケモン 全力の 攻撃。 相手の 残りHPを たくさん 減らす。" + "effect": "Zパワーで アローラの 力を 得た とちがみポケモン 全力の 攻撃。 相手の 残りHPを たくさん 減らす。" }, "soulStealing7StarStrike": { "name": "しちせいだっこんたい", - "effect": "Zパワーを 得た マーシャドーが パンチと キックの 連続技を 全力で 相手に 叩き込む。" + "effect": "Zパワーを 得た マーシャドーが パンチと キックの 連続技を 全力で 相手に 叩き込む。" }, "stokedSparksurfer": { "name": "ライトニングサーフライド", - "effect": "Zパワーを 得た アローラ地方の ライチュウが 全力で 攻撃する。 相手を まひ 状態に する。" + "effect": "Zパワーを 得た アローラ地方の ライチュウが 全力で 攻撃する。 相手を まひ 状態に する。" }, "pulverizingPancake": { - "name": "ほんきをだす こうげき", - "effect": "Zパワーで 本気を 出した カビゴンが 巨体を 躍動させて 全力で 相手に 襲いかかる。" + "name": "ほんきをだす こうげき", + "effect": "Zパワーで 本気を 出した カビゴンが 巨体を 躍動させて 全力で 相手に 襲いかかる。" }, "extremeEvoboost": { "name": "ナインエボルブースト", - "effect": "Zパワーを 得た イーブイが 進化した 仲間たちの 力を 借りて 能力を ぐーんと 上げる。" + "effect": "Zパワーを 得た イーブイが 進化した 仲間たちの 力を 借りて 能力を ぐーんと 上げる。" }, "genesisSupernova": { "name": "オリジンズスーパーノヴァ", - "effect": "Zパワーを 得た ミュウが 全力で 相手を 攻撃する。 足元が サイコフィールドになる。" + "effect": "Zパワーを 得た ミュウが 全力で 相手を 攻撃する。 足元が サイコフィールドになる。" }, "shellTrap": { "name": "トラップシェル", - "effect": "こうらの トラップを しかける。 相手が 物理技を 出すと 爆発して ダメージを 与える。" + "effect": "こうらの トラップを しかける。 相手が 物理技を 出すと 爆発して ダメージを 与える。" }, "fleurCannon": { "name": "フルールカノン", - "effect": "強力な ビームを 放ったあと 自分の 特攻が がくっと さがる。" + "effect": "強力な ビームを 放ったあと 自分の 特攻が がくっと さがる。" }, "psychicFangs": { "name": "サイコファング", - "effect": "サイコパワーで かみついて 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。" + "effect": "サイコパワーで かみついて 相手を 攻撃する。 ひかりのかべや リフレクター なども 破壊できる。" }, "stompingTantrum": { "name": "じだんだ", - "effect": "悔しさを バネにして 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。" + "effect": "悔しさを バネにして 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。" }, "shadowBone": { "name": "シャドーボーン", - "effect": "魂の 宿った ホネで 相手を なぐりつけて 攻撃する。 相手の 防御を さげる ことがある。" + "effect": "魂の 宿った ホネで 相手を なぐりつけて 攻撃する。 相手の 防御を さげる ことがある。" }, "accelerock": { "name": "アクセルロック", - "effect": "素早い スピードで 相手に ぶつかって 攻撃する。 必ず 先制攻撃 できる。" + "effect": "素早い スピードで 相手に ぶつかって 攻撃する。 必ず 先制攻撃 できる。" }, "liquidation": { "name": "アクアブレイク", - "effect": "水の 力で 相手に ぶつかって 攻撃する。 相手の 防御を さげる ことがある。" + "effect": "水の 力で 相手に ぶつかって 攻撃する。 相手の 防御を さげる ことがある。" }, "prismaticLaser": { "name": "プリズムレーザー", - "effect": "プリズムの 力で 強力な 光線を 発射する。 次の ターンは 動けなくなる。" + "effect": "プリズムの 力で 強力な 光線を 発射する。 次の ターンは 動けなくなる。" }, "spectralThief": { "name": "シャドースチール", - "effect": "相手の 影に 潜り込み 相手の 能力アップを 奪って 攻撃する。" + "effect": "相手の 影に 潜り込み 相手の 能力アップを 奪って 攻撃する。" }, "sunsteelStrike": { "name": "メテオドライブ", - "effect": "流星の ような 勢いで 突進する。 相手の 特性を 無視して 攻撃 することが できる。" + "effect": "流星の ような 勢いで 突進する。 相手の 特性を 無視して 攻撃 することが できる。" }, "moongeistBeam": { "name": "シャドーレイ", - "effect": "怪しい 光線を 放って 攻撃する。相手の 特性を 無視して 攻撃 することが できる。" + "effect": "怪しい 光線を 放って 攻撃する。相手の 特性を 無視して 攻撃 することが できる。" }, "tearfulLook": { "name": "なみだめ", - "effect": "なみだめに なって 相手の 戦力を 喪失させる。 相手の 攻撃と 特攻が さがる。" + "effect": "なみだめに なって 相手の 戦力を 喪失させる。 相手の 攻撃と 特攻が さがる。" }, "zingZap": { "name": "びりびりちくちく", - "effect": "相手に ぶつかって 強力な 電気を浴びせ びりびりちくちく させる。 相手を ひるませる ことが ある。" + "effect": "相手に ぶつかって 強力な 電気を浴びせ びりびりちくちく させる。 相手を ひるませる ことが ある。" }, "naturesMadness": { "name": "しぜんのいかり", - "effect": "自然の 怒りを 相手に ぶつける。 相手の HPは 半分に なる。" + "effect": "自然の 怒りを 相手に ぶつける。 相手の HPは 半分に なる。" }, "multiAttack": { "name": "マルチアタック", - "effect": "高い エネルギーを まといつつ 相手に ぶつかって 攻撃する。 メモリに より タイプが 変わる。" + "effect": "高い エネルギーを まといつつ 相手に ぶつかって 攻撃する。 メモリに より タイプが 変わる。" }, "tenMillionVoltThunderbolt": { "name": "1000まんボルト", - "effect": "帽子を かぶった ピカチュウが Zパワーで パワーアップした 電撃を 放つ。 急所に 当たりやすい。" + "effect": "帽子を かぶった ピカチュウが Zパワーで パワーアップした 電撃を 放つ。 急所に 当たりやすい。" }, "mindBlown": { "name": "ビックリヘッド", - "effect": "自分の 頭を 爆発 させて 周りの すべてを 攻撃する。 自分も ダメージを 受けてしまう。" + "effect": "自分の 頭を 爆発 させて 周りの すべてを 攻撃する。 自分も ダメージを 受けてしまう。" }, "plasmaFists": { "name": "プラズマフィスト", - "effect": "電気を まとった こぶしで 攻撃。 ノーマルタイプの 技を でんきタイプに してしまう。" + "effect": "電気を まとった こぶしで 攻撃。 ノーマルタイプの 技を でんきタイプに してしまう。" }, "photonGeyser": { "name": "フォトンゲイザー", - "effect": "光の 柱で 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。" + "effect": "光の 柱で 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。" }, "lightThatBurnsTheSky": { "name": "てんこがすめつぼうのひかり", - "effect": "ネクロズマが 相手の 特性の 効果を 無視して 攻撃と 特攻の 高い方で ダメージを 与える。" + "effect": "ネクロズマが 相手の 特性の 効果を 無視して 攻撃と 特攻の 高い方で ダメージを 与える。" }, "searingSunrazeSmash": { "name": "サンシャインスマッシャー", - "effect": "Zパワーを 得た ソルガレオが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。" + "effect": "Zパワーを 得た ソルガレオが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。" }, "menacingMoonrazeMaelstrom": { "name": "ムーンライトブラスター", - "effect": "Zパワーを 得た ルナアーラが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。" + "effect": "Zパワーを 得た ルナアーラが 全力で 攻撃する。 相手の 特性の 効果を 無視できる。" }, "letsSnuggleForever": { "name": "ぽかぼかフレンドタイム", - "effect": "Zパワーを 得た ミミッキュが 全力で ぽかぽか 攻撃。" + "effect": "Zパワーを 得た ミミッキュが 全力で ぽかぽか 攻撃。" }, "splinteredStormshards": { "name": "ラジアルエッジストーム", - "effect": "Zパワーを 得た ルガルガンが 全力で 攻撃する。 追加で フィールド状態を 打ち消す。" + "effect": "Zパワーを 得た ルガルガンが 全力で 攻撃する。 追加で フィールド状態を 打ち消す。" }, "clangorousSoulblaze": { "name": "ブレイジングソウルビート", - "effect": "Zパワーを 得た ジャラランガが 全力で 相手を 攻撃する。 追加で 自分の 能力が 上がる。" + "effect": "Zパワーを 得た ジャラランガが 全力で 相手を 攻撃する。 追加で 自分の 能力が 上がる。" }, "zippyZap": { "name": "ばちばちアクセル", - "effect": "猛スピードの 電撃 アタック。 必ず 先制攻撃 できて 急所に あたる。" + "effect": "猛スピードの 電撃 アタック。 必ず 先制攻撃 できて 急所に あたる。" }, "splishySplash": { "name": "ざぶざぶサーフ", - "effect": "大きな 波に 電気を あびせ 相手に ぶつけて 攻撃する。 まひ状態に することが ある。" + "effect": "大きな 波に 電気を あびせ 相手に ぶつけて 攻撃する。 まひ状態に することが ある。" }, "floatyFall": { "name": "ふわふわフォール", - "effect": "ふんわりと 浮かび あがり 一気に 急降下して 攻撃。 相手を ひるませることが ある。" + "effect": "ふんわりと 浮かび あがり 一気に 急降下して 攻撃。 相手を ひるませることが ある。" }, "pikaPapow": { "name": "ピカピカサンダー", - "effect": "トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 電撃。 必ず 命中する。" + "effect": "トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 電撃。 必ず 命中する。" }, "bouncyBubble": { "name": "いきいきバブル", - "effect": "水のかたまりを ぶつけて 攻撃。 水を 吸いとり ダメージの 半分の HPを 回復する。" + "effect": "水のかたまりを ぶつけて 攻撃。 水を 吸いとり ダメージの 半分の HPを 回復する。" }, "buzzyBuzz": { "name": "びりびりエレキ", - "effect": "電気を 飛ばし 相手に あびせて 攻撃する。 相手を まひ状態に する。" + "effect": "電気を 飛ばし 相手に あびせて 攻撃する。 相手を まひ状態に する。" }, "sizzlySlide": { "name": "めらめらバーン", - "effect": "炎を まとった 体で 勢いよく 相手に ぶつかる。 相手を やけど状態に する。" + "effect": "炎を まとった 体で 勢いよく 相手に ぶつかる。 相手を やけど状態に する。" }, "glitzyGlow": { "name": "どばどばオーラ", - "effect": "念力を これでもかと あびせる。 相手の 特殊攻撃を 弱める 不思議な かべを つくりだす。" + "effect": "念力を これでもかと あびせる。 相手の 特殊攻撃を 弱める 不思議な かべを つくりだす。" }, "baddyBad": { "name": "わるわるゾーン", - "effect": "わるさを アピールして 攻撃。 相手の 物理攻撃を 弱める 不思議な かべを つくりだす。" + "effect": "わるさを アピールして 攻撃。 相手の 物理攻撃を 弱める 不思議な かべを つくりだす。" }, "sappySeed": { "name": "すくすくボンバー", - "effect": "巨大な ツルを 生やし タネを 撒きちらかして 攻撃する。 タネは 毎ターン 相手の HPを 吸いとる。" + "effect": "巨大な ツルを 生やし タネを 撒きちらかして 攻撃する。 タネは 毎ターン 相手の HPを 吸いとる。" }, "freezyFrost": { "name": "こちこちフロスト", - "effect": "冷たく 凍った くろいきりの 結晶で 攻撃。 全員の 能力変化を もとに もどす。" + "effect": "冷たく 凍った くろいきりの 結晶で 攻撃。 全員の 能力変化を もとに もどす。" }, "sparklySwirl": { "name": "きらきらストーム", - "effect": "むせかえる ような 香りの 竜巻で 相手を つつんで 攻撃。 味方の 状態異常を 回復する。" + "effect": "むせかえる ような 香りの 竜巻で 相手を つつんで 攻撃。 味方の 状態異常を 回復する。" }, "veeveeVolley": { "name": "ブイブイブレイク", - "effect": "イーブイの トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 体当たり。 必ず 命中する。" + "effect": "イーブイの トレーナーへの 大好きな 気持ちが 強いほど 威力が あがる 体当たり。 必ず 命中する。" }, "doubleIronBash": { "name": "ダブルパンツァー", - "effect": "胸の ナットを 軸に 回転して 2回 続けて うでを たたきつける。 相手を ひるませる ことが ある。" + "effect": "胸の ナットを 軸に 回転して 2回 続けて うでを たたきつける。 相手を ひるませる ことが ある。" }, "maxGuard": { "name": "ダイウォール", - "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" + "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。" }, "dynamaxCannon": { "name": "ダイマックスほう", - "effect": "コアから ビームを 放つ。相手の レベルが 過度に 上がっている 場合は 与える ダメージが 最大 2倍に 増える。" + "effect": "コアから ビームを 放つ。相手の レベルが 過度に 上がっている 場合は 与える ダメージが 最大 2倍に 増える。" }, "snipeShot": { "name": "ねらいうち", - "effect": "相手の 技を 引き受ける 特性や 技の 影響を 無視して 選んだ 相手を 攻撃 できる。" + "effect": "相手の 技を 引き受ける 特性や 技の 影響を 無視して 選んだ 相手を 攻撃 できる。" }, "jawLock": { "name": "くらいつく", - "effect": "お互い ひんしに なるまで 交代が できなくなる。 どちらかの ポケモンが いなくなると 効果は消える。" + "effect": "お互い ひんしに なるまで 交代が できなくなる。 どちらかの ポケモンが いなくなると 効果は消える。" }, "stuffCheeks": { "name": "ほおばる", - "effect": "持っている きのみを 食べて 防御を ぐーんと あげる。" + "effect": "持っている きのみを 食べて 防御を ぐーんと あげる。" }, "noRetreat": { "name": "はいすいのじん", - "effect": "自分の すべての 能力が 上がるが 交代 したり 逃げることが できなくなる。" + "effect": "自分の すべての 能力が 上がるが 交代 したり 逃げることが できなくなる。" }, "tarShot": { "name": "タールショット", - "effect": "ねばねばの タールを 浴びせて 相手の 素早さを 下げる。 相手は ほのおが 弱点に なる。" + "effect": "ねばねばの タールを 浴びせて 相手の 素早さを 下げる。 相手は ほのおが 弱点に なる。" }, "magicPowder": { "name": "まほうのこな", - "effect": "まほうのこなを 浴びせて 相手を エスパータイプに 変化させる。" + "effect": "まほうのこなを 浴びせて 相手を エスパータイプに 変化させる。" }, "dragonDarts": { "name": "ドラゴンアロー", - "effect": "ドラメシヤで 2回 攻撃。 相手が 2匹 いるときは それぞれに 1回ずつ 攻撃する。" + "effect": "ドラメシヤで 2回 攻撃。 相手が 2匹 いるときは それぞれに 1回ずつ 攻撃する。" }, "teatime": { "name": "おちゃかい", - "effect": "おちゃかいを ひらいて 場にいる ポケモンが それぞれ 持っている きのみを 食べる。" + "effect": "おちゃかいを ひらいて 場にいる ポケモンが それぞれ 持っている きのみを 食べる。" }, "octolock": { "name": "たこがため", - "effect": "相手を 逃げられなくする。 かためられた 相手は 毎ターン 防御と 特防が 下がる。" + "effect": "相手を 逃げられなくする。 かためられた 相手は 毎ターン 防御と 特防が 下がる。" }, "boltBeak": { "name": "でんげきくちばし", - "effect": "電気を まとった くちばしで 刺す。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。" + "effect": "電気を まとった くちばしで 刺す。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。" }, "fishiousRend": { "name": "エラがみ", - "effect": "かたい エラで かみつく。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。" + "effect": "かたい エラで かみつく。 相手より 先に 攻撃できると 技の 威力は 2倍に なる。" }, "courtChange": { "name": "コートチェンジ", - "effect": "不思議な 力で お互いの 場の 効果を 入れ替える。" + "effect": "不思議な 力で お互いの 場の 効果を 入れ替える。" }, "maxFlare": { "name": "ダイバーン", - "effect": "ダイマックスした ポケモンが 繰りだす ほのおタイプの 攻撃。 5ターンの 間 日差しを 強くする。" + "effect": "ダイマックスした ポケモンが 繰りだす ほのおタイプの 攻撃。 5ターンの 間 日差しを 強くする。" }, "maxFlutterby": { "name": "ダイワーム", - "effect": "ダイマックスした ポケモンが 繰りだす むしタイプの 攻撃。 相手の 特攻を 下げる。" + "effect": "ダイマックスした ポケモンが 繰りだす むしタイプの 攻撃。 相手の 特攻を 下げる。" }, "maxLightning": { "name": "ダイサンダー", - "effect": "ダイマックスした ポケモンが 繰りだす でんきタイプの 攻撃。 5ターンの 間 エレキフィールドにする。" + "effect": "ダイマックスした ポケモンが 繰りだす でんきタイプの 攻撃。 5ターンの 間 エレキフィールドにする。" }, "maxStrike": { "name": "ダイアタック", - "effect": "ダイマックスした ポケモンが 繰りだす ノーマルタイプの 攻撃。 相手の 素早さを 下げる。" + "effect": "ダイマックスした ポケモンが 繰りだす ノーマルタイプの 攻撃。 相手の 素早さを 下げる。" }, "maxKnuckle": { "name": "ダイナックル", - "effect": "ダイマックスした ポケモンが 繰りだす かくとうタイプの 攻撃。 味方の 攻撃を 上げる。" + "effect": "ダイマックスした ポケモンが 繰りだす かくとうタイプの 攻撃。 味方の 攻撃を 上げる。" }, "maxPhantasm": { "name": "ダイホロウ", - "effect": "ダイマックスした ポケモンが 繰りだす ゴーストタイプの 攻撃。 相手の 防御を 下げる。" + "effect": "ダイマックスした ポケモンが 繰りだす ゴーストタイプの 攻撃。 相手の 防御を 下げる。" }, "maxHailstorm": { "name": "ダイアイス", - "effect": "ダイマックスした ポケモンが 繰りだす こおりタイプの 攻撃。 5ターンの 間 あられを 降らす。" + "effect": "ダイマックスした ポケモンが 繰りだす こおりタイプの 攻撃。 5ターンの 間 あられを 降らす。" }, "maxOoze": { "name": "ダイアシッド", - "effect": "ダイマックスした ポケモンが 繰りだす どくタイプの 攻撃。 味方の 特攻を 上げる。" + "effect": "ダイマックスした ポケモンが 繰りだす どくタイプの 攻撃。 味方の 特攻を 上げる。" }, "maxGeyser": { "name": "ダイストリーム", - "effect": "ダイマックスした ポケモンが 繰りだす みずタイプの 攻撃。 5ターンの 間 雨を 降らせる。" + "effect": "ダイマックスした ポケモンが 繰りだす みずタイプの 攻撃。 5ターンの 間 雨を 降らせる。" }, "maxAirstream": { "name": "ダイジェット", - "effect": "ダイマックスした ポケモンが 繰りだす ひこうタイプの 攻撃。 味方の 素早さを 上げる。" + "effect": "ダイマックスした ポケモンが 繰りだす ひこうタイプの 攻撃。 味方の 素早さを 上げる。" }, "maxStarfall": { "name": "ダイフェアリー", - "effect": "ダイマックスした ポケモンが 繰りだす フェアリータイプの 攻撃。 5ターンの 間 ミストフィールドにする。" + "effect": "ダイマックスした ポケモンが 繰りだす フェアリータイプの 攻撃。 5ターンの 間 ミストフィールドにする。" }, "maxWyrmwind": { "name": "ダイドラグーン", - "effect": "ダイマックスした ポケモンが 繰りだす ドラゴンタイプの 攻撃。 相手の 攻撃を 下げる。" + "effect": "ダイマックスした ポケモンが 繰りだす ドラゴンタイプの 攻撃。 相手の 攻撃を 下げる。" }, "maxMindstorm": { "name": "ダイサイコ", - "effect": "ダイマックスした ポケモンが 繰りだす エスパータイプの 攻撃。 5ターンの 間 サイコフィールドにする。" + "effect": "ダイマックスした ポケモンが 繰りだす エスパータイプの 攻撃。 5ターンの 間 サイコフィールドにする。" }, "maxRockfall": { "name": "ダイロック", - "effect": "ダイマックスした ポケモンが 繰りだす いわタイプの 攻撃。 5ターンの 間 砂あらしにする。" + "effect": "ダイマックスした ポケモンが 繰りだす いわタイプの 攻撃。 5ターンの 間 砂あらしにする。" }, "maxQuake": { "name": "ダイアース", - "effect": "ダイマックスした ポケモンが 繰りだす じめんタイプの 攻撃。 味方の 特防を 上げる。" + "effect": "ダイマックスした ポケモンが 繰りだす じめんタイプの 攻撃。 味方の 特防を 上げる。" }, "maxDarkness": { "name": "ダイアーク", - "effect": "ダイマックスした ポケモンが 繰りだす あくタイプの 攻撃。 相手の 特防を 下げる。" + "effect": "ダイマックスした ポケモンが 繰りだす あくタイプの 攻撃。 相手の 特防を 下げる。" }, "maxOvergrowth": { "name": "ダイソウゲン", - "effect": "ダイマックスした ポケモンが 繰りだす くさタイプの 攻撃。 5ターンの 間 グラスフィールドにする。" + "effect": "ダイマックスした ポケモンが 繰りだす くさタイプの 攻撃。 5ターンの 間 グラスフィールドにする。" }, "maxSteelspike": { "name": "ダイスチル", - "effect": "ダイマックスした ポケモンが 繰りだす はがねタイプの 攻撃。 味方の 防御を 上げる。" + "effect": "ダイマックスした ポケモンが 繰りだす はがねタイプの 攻撃。 味方の 防御を 上げる。" }, "clangorousSoul": { "name": "ソウルビート", - "effect": "自分の HPを 少し 削って すべての 能力を 上げる。" + "effect": "自分の HPを 少し 削って すべての 能力を 上げる。" }, "bodyPress": { "name": "ボディプレス", - "effect": "体を ぶつけて 攻撃。 防御が 高いほど 与える ダメージが 増える。" + "effect": "体を ぶつけて 攻撃。 防御が 高いほど 与える ダメージが 増える。" }, "decorate": { "name": "デコレーション", - "effect": "かざりつけを することで 相手の 攻撃と 特攻を ぐーんと 上げる。" + "effect": "かざりつけを することで 相手の 攻撃と 特攻を ぐーんと 上げる。" }, "drumBeating": { "name": "ドラムアタック", - "effect": "ドラムの 根っこを ドラミングで コントロールして こうげき することで 相手の 素早さを 下げる。" + "effect": "ドラムの 根っこを ドラミングで コントロールして こうげき することで 相手の 素早さを 下げる。" }, "snapTrap": { "name": "トラバサミ", - "effect": "トラバサミで 捕らえて 4-5ターンの 間 相手を はさんで 攻撃する。" + "effect": "トラバサミで 捕らえて 4-5ターンの 間 相手を はさんで 攻撃する。" }, "pyroBall": { "name": "かえんボール", - "effect": "小石を 燃やした 炎の ボールで 相手を 攻撃する。 やけど 状態に することが ある。" + "effect": "小石を 燃やした 炎の ボールで 相手を 攻撃する。 やけど 状態に することが ある。" }, "behemothBlade": { "name": "きょじゅうざん", - "effect": "全身で 強大な剣を 振りかざし 勢いよく 切りかかって 攻撃する。" + "effect": "全身で 強大な剣を 振りかざし 勢いよく 切りかかって 攻撃する。" }, "behemothBash": { "name": "きょじゅうだん", - "effect": "全身を 強固な盾へと 変化させ 勢いよく ぶつかって 攻撃する。" + "effect": "全身を 強固な盾へと 変化させ 勢いよく ぶつかって 攻撃する。" }, "auraWheel": { "name": "オーラぐるま", - "effect": "ほほぶくろに 溜めた エネルギーで 攻撃し 自分の 素早さを あげる。 モルペコの 姿で タイプが 変わる。" + "effect": "ほほぶくろに 溜めた エネルギーで 攻撃し 自分の 素早さを あげる。 モルペコの 姿で タイプが 変わる。" }, "breakingSwipe": { "name": "ワイドブレイカー", - "effect": "きょうじんな しっぽを 激しく ふりはらって 相手を 攻撃する。 相手の 攻撃を 下げる。" + "effect": "きょうじんな しっぽを 激しく ふりはらって 相手を 攻撃する。 相手の 攻撃を 下げる。" }, "branchPoke": { "name": "えだづき", - "effect": "するどく とがった 枝で 相手を 突いて 攻撃する。" + "effect": "するどく とがった 枝で 相手を 突いて 攻撃する。" }, "overdrive": { "name": "オーバードライブ", - "effect": "ギターや ベースを かきならして 激しく 響く 大きな 振動を 相手に 与えて 攻撃する。" + "effect": "ギターや ベースを かきならして 激しく 響く 大きな 振動を 相手に 与えて 攻撃する。" }, "appleAcid": { "name": "りんごさん", - "effect": "すっぱい りんごから つくりだした 酸性の 液体で 攻撃。 相手の 特防を 下げる。" + "effect": "すっぱい りんごから つくりだした 酸性の 液体で 攻撃。 相手の 特防を 下げる。" }, "gravApple": { "name": "Gのちから", - "effect": "高いところから りんごを 落として ダメージを 与える。 相手の 防御を 下げる。" + "effect": "高いところから りんごを 落として ダメージを 与える。 相手の 防御を 下げる。" }, "spiritBreak": { "name": "ソウルクラッシュ", - "effect": "食らうと くじけるほどの 勢いで 攻撃。 相手の 特攻を 下げる。" + "effect": "食らうと くじけるほどの 勢いで 攻撃。 相手の 特攻を 下げる。" }, "strangeSteam": { "name": "ワンダースチーム", - "effect": "煙を 噴出して 相手を 攻撃。 混乱 させることが ある。" + "effect": "煙を 噴出して 相手を 攻撃。 混乱 させることが ある。" }, "lifeDew": { "name": "いのちのしずく", - "effect": "不思議な 水を ふりまいて 自分と 場にいる 味方の HPを 回復する。" + "effect": "不思議な 水を ふりまいて 自分と 場にいる 味方の HPを 回復する。" }, "obstruct": { "name": "ブロッキング", - "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。 触れると 防御が がくっと 下がる。" + "effect": "相手の 攻撃を まったく 受けない。 連続で だすと 失敗しやすい。 触れると 防御が がくっと 下がる。" }, "falseSurrender": { "name": "どげざつき", - "effect": "頭を 下げる ふりを しながら 振りみだした 髪の毛を 突き刺す。 攻撃は 必ず 命中する。" + "effect": "頭を 下げる ふりを しながら 振りみだした 髪の毛を 突き刺す。 攻撃は 必ず 命中する。" }, "meteorAssault": { "name": "スターアサルト", - "effect": "太い クキを ふりまわして 攻撃。 ただし 自分も よろめいてしまうため 次の ターンは 動けなくなる。" + "effect": "太い クキを ふりまわして 攻撃。 ただし 自分も よろめいてしまうため 次の ターンは 動けなくなる。" }, "eternabeam": { "name": "ムゲンダイビーム", - "effect": "本来の 姿と なった ムゲンダイナ 最大の 攻撃。 次の ターンは 動けなくなる。" + "effect": "本来の 姿と なった ムゲンダイナ 最大の 攻撃。 次の ターンは 動けなくなる。" }, "steelBeam": { "name": "てっていこうせん", - "effect": "全身から 集めた はがねを ビームとして 激しく 撃ちだす。 自分も ダメージを 受けてしまう。" + "effect": "全身から 集めた はがねを ビームとして 激しく 撃ちだす。 自分も ダメージを 受けてしまう。" }, "expandingForce": { "name": "ワイドフォース", - "effect": "サイコパワーで 相手を 攻撃する。 サイコフィールドの時 威力が あがり すべての 相手に ダメージを 与える。" + "effect": "サイコパワーで 相手を 攻撃する。 サイコフィールドの時 威力が あがり すべての 相手に ダメージを 与える。" }, "steelRoller": { "name": "アイアンローラー", - "effect": "フィールドを 破壊しながら 攻撃。 なんらかの フィールド状態に 変わっていないと 技は 失敗する。" + "effect": "フィールドを 破壊しながら 攻撃。 なんらかの フィールド状態に 変わっていないと 技は 失敗する。" }, "scaleShot": { "name": "スケイルショット", - "effect": "ウロコを 撃ちだして 攻撃する。 2ー5回の 間 連続で だす。 素早さが あがるが 防御が さがる。" + "effect": "ウロコを 撃ちだして 攻撃する。 2ー5回の 間 連続で だす。 素早さが あがるが 防御が さがる。" }, "meteorBeam": { "name": "メテオビーム", - "effect": "1ターン目に 宇宙の 力を 集めることで 特攻が あがり 2ターン目に 相手を 攻撃する。" + "effect": "1ターン目に 宇宙の 力を 集めることで 特攻が あがり 2ターン目に 相手を 攻撃する。" }, "shellSideArm": { "name": "シェルアームズ", - "effect": "物理か 特殊か より多く ダメージを 与えられる 能力で 攻撃する。 毒状態に することが ある。" + "effect": "物理か 特殊か より多く ダメージを 与えられる 能力で 攻撃する。 毒状態に することが ある。" }, "mistyExplosion": { "name": "ミストバースト", - "effect": "自分の 周りに いる すべてを 攻撃するが 使うと 瀕死になる。 ミストフィールドで 威力が あがる。" + "effect": "自分の 周りに いる すべてを 攻撃するが 使うと 瀕死になる。 ミストフィールドで 威力が あがる。" }, "grassyGlide": { "name": "グラススライダー", - "effect": "地面を 滑るように 相手を 攻撃。 グラスフィールドの時 必ず 先制攻撃 できる。" + "effect": "地面を 滑るように 相手を 攻撃。 グラスフィールドの時 必ず 先制攻撃 できる。" }, "risingVoltage": { "name": "ライジングボルト", - "effect": "地面から 立ちのぼる 電撃で 攻撃。 相手が エレキフィールドに いる時 技の 威力が 2倍に なる。" + "effect": "地面から 立ちのぼる 電撃で 攻撃。 相手が エレキフィールドに いる時 技の 威力が 2倍に なる。" }, "terrainPulse": { "name": "だいちのはどう", - "effect": "フィールドの力を 借りて 攻撃。 使った時の フィールドの状態に よって 技の タイプと 威力が 変わる。" + "effect": "フィールドの力を 借りて 攻撃。 使った時の フィールドの状態に よって 技の タイプと 威力が 変わる。" }, "skitterSmack": { "name": "はいよるいちげき", - "effect": "背後から はいより 攻撃する。 相手の 特攻を さげる。" + "effect": "背後から はいより 攻撃する。 相手の 特攻を さげる。" }, "burningJealousy": { "name": "しっとのほのお", - "effect": "しっとの エネルギーで 相手を 攻撃。 そのターン 能力が あがった ポケモンを やけどの 状態に する。" + "effect": "しっとの エネルギーで 相手を 攻撃。 そのターン 能力が あがった ポケモンを やけどの 状態に する。" }, "lashOut": { "name": "うっぷんばらし", - "effect": "相手への いらだちを ぶつけて 攻撃。 そのターンに 能力を さげられていると 技の 威力が 2倍に なる。" + "effect": "相手への いらだちを ぶつけて 攻撃。 そのターンに 能力を さげられていると 技の 威力が 2倍に なる。" }, "poltergeist": { "name": "ポルターガイスト", - "effect": "相手の 持ち物を あやつって 攻撃。 相手が 道具を 持っていない 場合は 失敗する。" + "effect": "相手の 持ち物を あやつって 攻撃。 相手が 道具を 持っていない 場合は 失敗する。" }, "corrosiveGas": { "name": "ふしょくガス", - "effect": "強い 酸性の ガスで 周りに いるものを 包みこみ 持っている 道具を 溶かしてしまう。" + "effect": "強い 酸性の ガスで 周りに いるものを 包みこみ 持っている 道具を 溶かしてしまう。" }, "coaching": { "name": "コーチング", - "effect": "的確な 指導を おこなうことで 味方 全員の 攻撃と 防御を 上げる。" + "effect": "的確な 指導を おこなうことで 味方 全員の 攻撃と 防御を 上げる。" }, "flipTurn": { "name": "クイックターン", - "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" + "effect": "攻撃したあと ものすごい スピードで もどってきて 控えの ポケモンと 入れ替わる。" }, "tripleAxel": { "name": "トリプルアクセル", - "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。" + "effect": "3回連続で キックを くりだして 攻撃する。 技が 当たるたびに 威力は あがる。" }, "dualWingbeat": { "name": "ダブルウイング", - "effect": "翼を 相手に ぶつけて 攻撃する。 2回連続で ダメージを 与える。" + "effect": "翼を 相手に ぶつけて 攻撃する。 2回連続で ダメージを 与える。" }, "scorchingSands": { "name": "ねっさのだいち", - "effect": "熱く 焼けた 砂を 相手に ぶつけて 攻撃する。 やけど状態に することが ある。" + "effect": "熱く 焼けた 砂を 相手に ぶつけて 攻撃する。 やけど状態に することが ある。" }, "jungleHealing": { "name": "ジャングルヒール", - "effect": "ジャングルと 一体化して 自分と 場にいる 味方の HPと 状態を 回復する。" + "effect": "ジャングルと 一体化して 自分と 場にいる 味方の HPと 状態を 回復する。" }, "wickedBlow": { "name": "あんこくきょうだ", - "effect": "あくの型を 極めし 強烈な 一撃。 必ず 急所に 当たる。" + "effect": "あくの型を 極めし 強烈な 一撃。 必ず 急所に 当たる。" }, "surgingStrikes": { "name": "すいりゅうれんだ", - "effect": "みずの型を 極めし 流れるような 3回の 連撃。 必ず 急所に 当たる。" + "effect": "みずの型を 極めし 流れるような 3回の 連撃。 必ず 急所に 当たる。" }, "thunderCage": { "name": "サンダープリズン", - "effect": "ほとばしる 電気の おりの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" + "effect": "ほとばしる 電気の おりの 中に 4ー5ターンの 間 相手を 閉じこめて 攻撃する。" }, "dragonEnergy": { "name": "ドラゴンエナジー", - "effect": "生命力を パワーに 変え 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" + "effect": "生命力を パワーに 変え 相手を 攻撃する。 自分の HPが 少ないほど 技の 威力は さがる。" }, "freezingGlare": { "name": "いてつくしせん", - "effect": "両目から サイコパワーを 撃ちだして 攻撃する。 こおり状態に することが ある。" + "effect": "両目から サイコパワーを 撃ちだして 攻撃する。 こおり状態に することが ある。" }, "fieryWrath": { "name": "もえあがるいかり", - "effect": "怒りを 炎の ような オーラに 変えて 攻撃する。 相手を ひるませることが ある。" + "effect": "怒りを 炎の ような オーラに 変えて 攻撃する。 相手を ひるませることが ある。" }, "thunderousKick": { "name": "らいめいげり", - "effect": "雷の ような 動きで 相手を 翻弄しながら キックする。 相手の 防御を さげる。" + "effect": "雷の ような 動きで 相手を 翻弄しながら キックする。 相手の 防御を さげる。" }, "glacialLance": { "name": "ブリザードランス", - "effect": "吹雪を まとった 氷の 槍を 相手に 投げつけて 攻撃する。" + "effect": "吹雪を まとった 氷の 槍を 相手に 投げつけて 攻撃する。" }, "astralBarrage": { "name": "アストラルビット", - "effect": "たくさんの 小さな 霊体を 相手に ぶつけて 攻撃する。" + "effect": "たくさんの 小さな 霊体を 相手に ぶつけて 攻撃する。" }, "eerieSpell": { "name": "ぶきみなじゅもん", - "effect": "強力な サイコパワーで 攻撃。 相手が 最後に 使った技の PPを 3だけ 減らす。" + "effect": "強力な サイコパワーで 攻撃。 相手が 最後に 使った技の PPを 3だけ 減らす。" }, "direClaw": { "name": "フェイタルクロー", - "effect": "破滅的なツメで 攻撃する。 相手を どく まひ ねむりの いずれかの状態に することも ある。" + "effect": "破滅的なツメで 攻撃する。 相手を どく まひ ねむりの いずれかの状態に することも ある。" }, "psyshieldBash": { "name": "バリアーラッシュ", - "effect": "思念のエネルギーを まといながら 相手に ぶつかっていく。 自分の 防御を あげる。" + "effect": "思念のエネルギーを まといながら 相手に ぶつかっていく。 自分の 防御を あげる。" }, "powerShift": { "name": "パワーシフト", - "effect": "自分の 攻撃と防御を 入れ替える。" + "effect": "自分の 攻撃と防御を 入れ替える。" }, "stoneAxe": { "name": "がんせきアックス", - "effect": "岩の斧で 攻撃する。 ばらまかれた 岩の破片が 相手の 周りに 浮かぶ。" + "effect": "岩の斧で 攻撃する。 ばらまかれた 岩の破片が 相手の 周りに 浮かぶ。" }, "springtideStorm": { "name": "はるのあらし", - "effect": "愛憎 入りまじった 強烈な風で 相手を 包みこんで 攻撃する。 相手の 攻撃を さげることが ある。" + "effect": "愛憎 入りまじった 強烈な風で 相手を 包みこんで 攻撃する。 相手の 攻撃を さげることが ある。" }, "mysticalPower": { "name": "しんぴのちから", - "effect": "不思議な力を 放出して 攻撃する。 自分の 特攻が あがる。" + "effect": "不思議な力を 放出して 攻撃する。 自分の 特攻が あがる。" }, "ragingFury": { "name": "だいふんげき", - "effect": "2-3ターンの 間 炎を 放ちながら 暴れまわる。 暴れたあとは 混乱する。" + "effect": "2-3ターンの 間 炎を 放ちながら 暴れまわる。 暴れたあとは 混乱する。" }, "waveCrash": { "name": "ウェーブタックル", - "effect": "水を まといつつ 全身で 相手に ぶつかるが 自分も かなりの ダメージ を受ける。" + "effect": "水を まといつつ 全身で 相手に ぶつかるが 自分も かなりの ダメージ を受ける。" }, "chloroblast": { "name": "クロロブラスト", - "effect": "自身の 葉緑素を 集約し 放出して 攻撃する。 自分も ダメージを 受けてしまう。" + "effect": "自身の 葉緑素を 集約し 放出して 攻撃する。 自分も ダメージを 受けてしまう。" }, "mountainGale": { "name": "ひょうざんおろし", - "effect": "氷山のような 大きな 氷塊を ぶつけて 攻撃する。 相手を ひるませることが ある。" + "effect": "氷山のような 大きな 氷塊を ぶつけて 攻撃する。 相手を ひるませることが ある。" }, "victoryDance": { "name": "しょうりのまい", - "effect": "勝利を 呼びこむ 舞を 激しく 踊って 自分の 攻撃と 防御と 素早さを あげる。" + "effect": "勝利を 呼びこむ 舞を 激しく 踊って 自分の 攻撃と 防御と 素早さを あげる。" }, "headlongRush": { "name": "ぶちかまし", - "effect": "全身全霊の たいあたりを くらわせる。 自分の 防御と 特防が さがる。" + "effect": "全身全霊の たいあたりを くらわせる。 自分の 防御と 特防が さがる。" }, "barbBarrage": { "name": "どくばりセンボン", - "effect": "無数の毒針で 相手を 毒状態に することもある。 相手が 毒状態だと 威力は 2倍になる。" + "effect": "無数の毒針で 相手を 毒状態に することもある。 相手が 毒状態だと 威力は 2倍になる。" }, "esperWing": { "name": "オーラウイング", - "effect": "オーラで 強化した翼で 切り裂く。 急所に 当たりやすい。 自分の 素早さを あげる。" + "effect": "オーラで 強化した翼で 切り裂く。 急所に 当たりやすい。 自分の 素早さを あげる。" }, "bitterMalice": { "name": "うらみつらみ", - "effect": "背筋が 凍るような 怨念で 攻撃して 相手の 攻撃を さげる。" + "effect": "背筋が 凍るような 怨念で 攻撃して 相手の 攻撃を さげる。" }, "shelter": { "name": "たてこもる", - "effect": "皮膚を 鉄の盾のように 硬くすることで 自分の 防御を ぐーんと あげる。" + "effect": "皮膚を 鉄の盾のように 硬くすることで 自分の 防御を ぐーんと あげる。" }, "tripleArrows": { "name": "3ぼんのや", - "effect": "足技のあと 3本の矢を 同時に放つ。 相手の 防御を さげたり ひるませることが ある。 急所に 当たりやすい。" + "effect": "足技のあと 3本の矢を 同時に放つ。 相手の 防御を さげたり ひるませることが ある。 急所に 当たりやすい。" }, "infernalParade": { "name": "ひゃっきやこう", - "effect": "無数の火の玉で 攻撃して やけど状態に することが ある。 相手が 状態異常だと 威力は 2倍。" + "effect": "無数の火の玉で 攻撃して やけど状態に することが ある。 相手が 状態異常だと 威力は 2倍。" }, "ceaselessEdge": { "name": "ひけん・ちえなみ", - "effect": "貝殻の剣で 攻撃する。 ばらまかれた 貝殻の破片は 相手の 足下に まきびし となって 散らばる。" + "effect": "貝殻の剣で 攻撃する。 ばらまかれた 貝殻の破片は 相手の 足下に まきびし となって 散らばる。" }, "bleakwindStorm": { "name": "こがらしあらし", - "effect": "身も心も 震える 冷たく 激しい風で 攻撃する。 相手の 素早さを さげることが ある。" + "effect": "身も心も 震える 冷たく 激しい風で 攻撃する。 相手の 素早さを さげることが ある。" }, "wildboltStorm": { "name": "かみなりあらし", - "effect": "嵐を 起こし 雷雲を 呼びよせ 雷と風で 激しく 攻撃をする。 相手を まひ状態に することもある。" + "effect": "嵐を 起こし 雷雲を 呼びよせ 雷と風で 激しく 攻撃をする。 相手を まひ状態に することもある。" }, "sandsearStorm": { "name": "ねっさのあらし", - "effect": "熱く焼けた砂と 強烈な風で 包みこんで 攻撃する。 相手を やけど状態に することがある。" + "effect": "熱く焼けた砂と 強烈な風で 包みこんで 攻撃する。 相手を やけど状態に することがある。" }, "lunarBlessing": { "name": "みかづきのいのり", - "effect": "みかづきに いのりを ささげて 自分と 場にいる 味方の HPと 状態を 回復する。" + "effect": "みかづきに いのりを ささげて 自分と 場にいる 味方の HPと 状態を 回復する。" }, "takeHeart": { "name": "ブレイブチャージ", - "effect": "心を 奮わせて 自分の 状態異常を 治し さらには 特攻と 特防を あげる。" + "effect": "心を 奮わせて 自分の 状態異常を 治し さらには 特攻と 特防を あげる。" }, "gMaxWildfire": { "name": "キョダイゴクエン", - "effect": "キョダイマックスした リザードンが 繰りだす ほのおタイプの 攻撃。 4ターンの 間 ダメージを 与える。" + "effect": "キョダイマックスした リザードンが 繰りだす ほのおタイプの 攻撃。 4ターンの 間 ダメージを 与える。" }, "gMaxBefuddle": { "name": "キョダイコワク", - "effect": "キョダイマックスした バタフリーが 繰り出す むしタイプの 攻撃。 毒・まひ・眠りの どれかに する。" + "effect": "キョダイマックスした バタフリーが 繰り出す むしタイプの 攻撃。 毒・まひ・眠りの どれかに する。" }, "gMaxVoltCrash": { "name": "キョダイバンライ", - "effect": "キョダイマックスした ピカチュウが 繰りだす でんきタイプの 攻撃。 相手を まひ状態に する。" + "effect": "キョダイマックスした ピカチュウが 繰りだす でんきタイプの 攻撃。 相手を まひ状態に する。" }, "gMaxGoldRush": { "name": "キョダイコバン", - "effect": "キョダイマックスした ニャースが 繰り出す ノーマルタイプの 攻撃。 相手を 混乱させ お金も もらえる。" + "effect": "キョダイマックスした ニャースが 繰り出す ノーマルタイプの 攻撃。 相手を 混乱させ お金も もらえる。" }, "gMaxChiStrike": { "name": "キョダイシンゲキ", - "effect": "キョダイマックスした カイリキーが 繰りだす かくとうタイプの 攻撃。 急所に 当たりやすく なる。" + "effect": "キョダイマックスした カイリキーが 繰りだす かくとうタイプの 攻撃。 急所に 当たりやすく なる。" }, "gMaxTerror": { "name": "キョダイゲンエイ", - "effect": "キョダイマックスした ゲンガーが 繰りだす ゴーストタイプの 攻撃。 影を 踏み 交代 できなくする。" + "effect": "キョダイマックスした ゲンガーが 繰りだす ゴーストタイプの 攻撃。 影を 踏み 交代 できなくする。" }, "gMaxResonance": { "name": "キョダイセンリツ", - "effect": "キョダイマックスした ラプラスが 繰りだす こおりタイプの 攻撃。 5ターンの 間 ダメージを 弱める。" + "effect": "キョダイマックスした ラプラスが 繰りだす こおりタイプの 攻撃。 5ターンの 間 ダメージを 弱める。" }, "gMaxCuddle": { "name": "キョダイホーヨー", - "effect": "キョダイマックスした イーブイが 繰りだす ノーマルタイプの 攻撃。 相手を メロメロに する。" + "effect": "キョダイマックスした イーブイが 繰りだす ノーマルタイプの 攻撃。 相手を メロメロに する。" }, "gMaxReplenish": { "name": "キョダイサイセイ", - "effect": "キョダイマックスした カビゴンが 繰りだす ノーマルタイプの 攻撃。 食べた きのみを 再生する。" + "effect": "キョダイマックスした カビゴンが 繰りだす ノーマルタイプの 攻撃。 食べた きのみを 再生する。" }, "gMaxMalodor": { "name": "キョダイシュウキ", - "effect": "キョダイマックスした ダストダスが 繰りだす どくタイプの 攻撃。 相手を 毒 状態に する。" + "effect": "キョダイマックスした ダストダスが 繰りだす どくタイプの 攻撃。 相手を 毒 状態に する。" }, "gMaxStonesurge": { "name": "キョダイガンジン", - "effect": "キョダイマックスした カジリガメが 繰りだす みずタイプの 攻撃。 鋭い 無数の 岩を ばらまく。" + "effect": "キョダイマックスした カジリガメが 繰りだす みずタイプの 攻撃。 鋭い 無数の 岩を ばらまく。" }, "gMaxWindRage": { "name": "キョダイフウゲキ", - "effect": "キョダイマックスした アーマーガアが 繰りだす ひこうタイプの 攻撃。 リフレクターや ひかりのかべを 消し去る。" + "effect": "キョダイマックスした アーマーガアが 繰りだす ひこうタイプの 攻撃。 リフレクターや ひかりのかべを 消し去る。" }, "gMaxStunShock": { "name": "キョダイカンデン", - "effect": "キョダイマックスした ストリンダーが 繰り出す でんきタイプの 攻撃。 相手を 毒 か まひ どちらかにする。" + "effect": "キョダイマックスした ストリンダーが 繰り出す でんきタイプの 攻撃。 相手を 毒 か まひ どちらかにする。" }, "gMaxFinale": { "name": "キョダイダンエン", - "effect": "キョダイマックスした マホイップが 繰りだす フェアリータイプの 攻撃。 味方の HPを 回復する。" + "effect": "キョダイマックスした マホイップが 繰りだす フェアリータイプの 攻撃。 味方の HPを 回復する。" }, "gMaxDepletion": { "name": "キョダイゲンスイ", - "effect": "キョダイマックスした ジュラルドンが 繰りだす ドラゴンタイプの 攻撃。 最後に 使われた わざPPを 減らす。" + "effect": "キョダイマックスした ジュラルドンが 繰りだす ドラゴンタイプの 攻撃。 最後に 使われた わざPPを 減らす。" }, "gMaxGravitas": { "name": "キョダイテンドウ", - "effect": "キョダイマックスした イオルブが 繰りだす エスパータイプの 攻撃。 5ターンの 間 重力が 変わる。" + "effect": "キョダイマックスした イオルブが 繰りだす エスパータイプの 攻撃。 5ターンの 間 重力が 変わる。" }, "gMaxVolcalith": { "name": "キョダイフンセキ", - "effect": "キョダイマックスした セキタンザンが 繰りだす いわタイプの 攻撃。 4ターンの 間 ダメージを 与える。" + "effect": "キョダイマックスした セキタンザンが 繰りだす いわタイプの 攻撃。 4ターンの 間 ダメージを 与える。" }, "gMaxSandblast": { "name": "キョダイサジン", - "effect": "キョダイマックスした サダイジャが 繰りだす じめんタイプの 攻撃。 4-5ターンの間 砂が 吹き荒れる。" + "effect": "キョダイマックスした サダイジャが 繰りだす じめんタイプの 攻撃。 4-5ターンの間 砂が 吹き荒れる。" }, "gMaxSnooze": { "name": "キョダイスイマ", - "effect": "キョダイマックスした オーロンゲが 繰りだす あくタイプの 攻撃。 大きな あくびで 眠気を 誘う。" + "effect": "キョダイマックスした オーロンゲが 繰りだす あくタイプの 攻撃。 大きな あくびで 眠気を 誘う。" }, "gMaxTartness": { "name": "キョダイサンゲキ", - "effect": "キョダイマックスした アップリューが 繰りだす くさタイプの 攻撃。 相手の 回避率を 下げる。" + "effect": "キョダイマックスした アップリューが 繰りだす くさタイプの 攻撃。 相手の 回避率を 下げる。" }, "gMaxSweetness": { "name": "キョダイカンロ", - "effect": "キョダイマックスした タルップルが 繰りだす くさタイプの 攻撃。 味方の 状態異常を 回復する。" + "effect": "キョダイマックスした タルップルが 繰りだす くさタイプの 攻撃。 味方の 状態異常を 回復する。" }, "gMaxSmite": { "name": "キョダイテンバツ", - "effect": "キョダイマックスした ブリムオンが 繰りだす フェアリータイプの 攻撃。 相手を 混乱させる。" + "effect": "キョダイマックスした ブリムオンが 繰りだす フェアリータイプの 攻撃。 相手を 混乱させる。" }, "gMaxSteelsurge": { "name": "キョダイコウジン", - "effect": "キョダイマックスした ダイオウドウが 繰りだす タイプの 攻撃。 鋭い 無数の とげを ばらまく。" + "effect": "キョダイマックスした ダイオウドウが 繰りだす タイプの 攻撃。 鋭い 無数の とげを ばらまく。" }, "gMaxMeltdown": { "name": "キョダイユウゲキ", - "effect": "キョダイマックスした メルメタルが 繰りだす はがねタイプの 攻撃。 同じ 技を 連続で 出せなくする。" + "effect": "キョダイマックスした メルメタルが 繰りだす はがねタイプの 攻撃。 同じ 技を 連続で 出せなくする。" }, "gMaxFoamBurst": { "name": "キョダイホウマツ", - "effect": "キョダイマックスした キングラーが 繰りだす みずタイプの 攻撃。 相手の 素早さを がくっと さげる。" + "effect": "キョダイマックスした キングラーが 繰りだす みずタイプの 攻撃。 相手の 素早さを がくっと さげる。" }, "gMaxCentiferno": { "name": "キョダイヒャッカ", - "effect": "キョダイマックスした マルヤクデが 繰りだす ほのおタイプの 攻撃。 4-5ターンの間 炎に 閉じこめる。" + "effect": "キョダイマックスした マルヤクデが 繰りだす ほのおタイプの 攻撃。 4-5ターンの間 炎に 閉じこめる。" }, "gMaxVineLash": { "name": "キョダイベンタツ", - "effect": "キョダイマックスした フシギバナが 繰りだす くさタイプの 攻撃。 4ターンの 間 ダメージを 与える。" + "effect": "キョダイマックスした フシギバナが 繰りだす くさタイプの 攻撃。 4ターンの 間 ダメージを 与える。" }, "gMaxCannonade": { "name": "キョダイホウゲキ", - "effect": "キョダイマックスした カメックスが 繰りだす みずタイプの 攻撃。 4ターンの 間 ダメージを 与える。" + "effect": "キョダイマックスした カメックスが 繰りだす みずタイプの 攻撃。 4ターンの 間 ダメージを 与える。" }, "gMaxDrumSolo": { "name": "キョダイコランダ", - "effect": "キョダイマックスした ゴリランダーが 繰りだす くさタイプの 攻撃。 相手の 特性に ジャマされない。" + "effect": "キョダイマックスした ゴリランダーが 繰りだす くさタイプの 攻撃。 相手の 特性に ジャマされない。" }, "gMaxFireball": { "name": "キョダイカキュウ", - "effect": "キョダイマックスした エースバーンが 繰りだす ほのおタイプの 攻撃。 相手の 特性に ジャマされない。" + "effect": "キョダイマックスした エースバーンが 繰りだす ほのおタイプの 攻撃。 相手の 特性に ジャマされない。" }, "gMaxHydrosnipe": { "name": "キョダイソゲキ", - "effect": "キョダイマックスした インテレオンが 繰りだす みずタイプの 攻撃。 相手の 特性に ジャマされない。" + "effect": "キョダイマックスした インテレオンが 繰りだす みずタイプの 攻撃。 相手の 特性に ジャマされない。" }, "gMaxOneBlow": { "name": "キョダイイチゲキ", - "effect": "キョダイマックスした ウーラオスが 繰りだす あくタイプの 攻撃。 ダイウォールを 無視できる 一撃。" + "effect": "キョダイマックスした ウーラオスが 繰りだす あくタイプの 攻撃。 ダイウォールを 無視できる 一撃。" }, "gMaxRapidFlow": { "name": "キョダイレンゲキ", - "effect": "キョダイマックスした ウーラオスが 繰りだす みずタイプの 攻撃。 ダイウォールを 無視できる 連撃。" + "effect": "キョダイマックスした ウーラオスが 繰りだす みずタイプの 攻撃。 ダイウォールを 無視できる 連撃。" }, "teraBlast": { "name": "テラバースト", - "effect": "テラスタルだと テラスタイプの エネルギーを 放出して 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。" + "effect": "テラスタルだと テラスタイプの エネルギーを 放出して 攻撃する。 攻撃と 特攻を 比べて 高いほうで ダメージを 与える。" }, "silkTrap": { "name": "スレッドトラップ", - "effect": "糸の罠を はりめぐらせる。 相手の 攻撃を 防ぐと 同時に 触れた 相手の 素早さを さげる。" + "effect": "糸の罠を はりめぐらせる。 相手の 攻撃を 防ぐと 同時に 触れた 相手の 素早さを さげる。" }, "axeKick": { "name": "かかとおとし", - "effect": "蹴りあげた かかとを 落として 攻撃する。 相手を 混乱させることが ある。 はずすと 自分が ダメージを 受ける。" + "effect": "蹴りあげた かかとを 落として 攻撃する。 相手を 混乱させることが ある。 はずすと 自分が ダメージを 受ける。" }, "lastRespects": { "name": "おはかまいり", - "effect": "仲間の 無念を 晴らすため 攻撃する。 倒された 味方のポケモンが 多いほど 技の 威力が 増える。" + "effect": "仲間の 無念を 晴らすため 攻撃する。 倒された 味方のポケモンが 多いほど 技の 威力が 増える。" }, "luminaCrash": { "name": "ルミナコリジョン", - "effect": "精神にも 作用する 奇妙な光を 放って 攻撃する。 相手の 特防を がくっと さげる。" + "effect": "精神にも 作用する 奇妙な光を 放って 攻撃する。 相手の 特防を がくっと さげる。" }, "orderUp": { "name": "いっちょうあがり", - "effect": "いなせな 身のこなしで 攻撃。 口の中に シャリタツが いると そのすがたによって 能力が あがる。" + "effect": "いなせな 身のこなしで 攻撃。 口の中に シャリタツが いると そのすがたによって 能力が あがる。" }, "jetPunch": { "name": "ジェットパンチ", - "effect": "激流を こぶしに まとって 目にも 留まらぬ パンチを くりだす。 必ず 先制攻撃 できる。" + "effect": "激流を こぶしに まとって 目にも 留まらぬ パンチを くりだす。 必ず 先制攻撃 できる。" }, "spicyExtract": { "name": "ハバネロエキス", - "effect": "とんでもなく 辛いエキスを 出す。 相手の 攻撃が ぐーんと あがり 防御が がくっと さがる。" + "effect": "とんでもなく 辛いエキスを 出す。 相手の 攻撃が ぐーんと あがり 防御が がくっと さがる。" }, "spinOut": { "name": "ホイールスピン", - "effect": "足に 負荷を かけることにより 激しく 回転して ダメージを 与える。 自分の 素早さが がくっと さがる。" + "effect": "足に 負荷を かけることにより 激しく 回転して ダメージを 与える。 自分の 素早さが がくっと さがる。" }, "populationBomb": { "name": "ネズミざん", - "effect": "仲間たちが わらわらと 集まって コンビネーションで 攻撃を 与えていく。 1-10回の 間 連続で あたる。" + "effect": "仲間たちが わらわらと 集まって コンビネーションで 攻撃を 与えていく。 1-10回の 間 連続で あたる。" }, "iceSpinner": { "name": "アイススピナー", - "effect": "足に 薄い氷を まとい クルクルと 回りながら ぶつかる。 回転の 動きによって フィールドを 壊す。" + "effect": "足に 薄い氷を まとい クルクルと 回りながら ぶつかる。 回転の 動きによって フィールドを 壊す。" }, "glaiveRush": { "name": "きょけんとつげき", - "effect": "体を 投げだす 無謀な突撃。 技のあと 相手からの 攻撃は 必ず 命中し ダメージが 2倍に なってしまう。" + "effect": "体を 投げだす 無謀な突撃。 技のあと 相手からの 攻撃は 必ず 命中し ダメージが 2倍に なってしまう。" }, "revivalBlessing": { "name": "さいきのいのり", - "effect": "慈愛の心で いのることにより 控えにいる ひんしの ポケモンを HPを 半分の状態で 復活させる。" + "effect": "慈愛の心で いのることにより 控えにいる ひんしの ポケモンを HPを 半分の状態で 復活させる。" }, "saltCure": { "name": "しおづけ", - "effect": "相手を しおづけ状態に して 毎ターン ダメージを 与える。 はがね みずタイプは より 苦しむ。" + "effect": "相手を しおづけ状態に して 毎ターン ダメージを 与える。 はがね みずタイプは より 苦しむ。" }, "tripleDive": { "name": "トリプルダイブ", - "effect": "息のあった 飛びこみを することで 相手に 水しぶきを あてる。 3回連続で ダメージを 与える。" + "effect": "息のあった 飛びこみを することで 相手に 水しぶきを あてる。 3回連続で ダメージを 与える。" }, "mortalSpin": { "name": "キラースピン", - "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。 相手を 毒状態に する。" + "effect": "回転して 相手を 攻撃する。 しめつける まきつく やどりぎのタネ など 吹きとばす。 相手を 毒状態に する。" }, "doodle": { "name": "うつしえ", - "effect": "相手の本質を とらえて うつしだし 自分と 味方を 相手と 同じ 特性に 変化させる。" + "effect": "相手の本質を とらえて うつしだし 自分と 味方を 相手と 同じ 特性に 変化させる。" }, "filletAway": { "name": "みをけずる", - "effect": "自分の HPを けずって 自分の 攻撃と 特攻と 素早さを ぐーんと あげる。" + "effect": "自分の HPを けずって 自分の 攻撃と 特攻と 素早さを ぐーんと あげる。" }, "kowtowCleave": { "name": "ドゲザン", - "effect": "土下座して 相手を 油断させておいて 切りかかる。 攻撃は 必ず 命中する。" + "effect": "土下座して 相手を 油断させておいて 切りかかる。 攻撃は 必ず 命中する。" }, "flowerTrick": { "name": "トリックフラワー", - "effect": "細工がある 花たばを 相手に 投げて 攻撃する。 必ず 命中して 急所にも 当たる。" + "effect": "細工がある 花たばを 相手に 投げて 攻撃する。 必ず 命中して 急所にも 当たる。" }, "torchSong": { "name": "フレアソング", - "effect": "燃えたぎる 火炎を 歌うように 吹きつけて 相手を 焦がす。 自分の 特攻を あげる。" + "effect": "燃えたぎる 火炎を 歌うように 吹きつけて 相手を 焦がす。 自分の 特攻を あげる。" }, "aquaStep": { "name": "アクアステップ", - "effect": "水もしたたる かろやかな 足どりで 相手を 翻弄し ダメージを 与える。 自分の 素早さを あげる。" + "effect": "水もしたたる かろやかな 足どりで 相手を 翻弄し ダメージを 与える。 自分の 素早さを あげる。" }, "ragingBull": { "name": "レイジングブル", - "effect": "怒り狂う あばれうしの 猛烈な タックル。 フォルムで 技のタイプが 変わり ひかりのかべや リフレクターなども 破壊できる。" + "effect": "怒り狂う あばれうしの 猛烈な タックル。 フォルムで 技のタイプが 変わり ひかりのかべや リフレクターなども 破壊できる。" }, "makeItRain": { "name": "ゴールドラッシュ", - "effect": "大量のコインを ぶちまけて 攻撃。 自分の 特攻が さがる。 戦闘の あとで お金も もらえる。" + "effect": "大量のコインを ぶちまけて 攻撃。 自分の 特攻が さがる。 戦闘の あとで お金も もらえる。" }, "psyblade": { "name": "サイコブレイド", - "effect": "実体のない刃で 相手を 切り裂く。 エレキフィールドに いるとき 技の威力が 1.5倍に なる。" + "effect": "実体のない刃で 相手を 切り裂く。 エレキフィールドに いるとき 技の威力が 1.5倍に なる。" }, "hydroSteam": { "name": "ハイドロスチーム", - "effect": "煮えたぎる水を 勢いよく 浴びせる。 日差しが 強いとき 技の威力が さがるどころか 1.5倍になる。" + "effect": "煮えたぎる水を 勢いよく 浴びせる。 日差しが 強いとき 技の威力が さがるどころか 1.5倍になる。" }, "ruination": { "name": "カタストロフィ", - "effect": "破滅的な 災厄を 巻き起こし 相手の HPを 半分に する。" + "effect": "破滅的な 災厄を 巻き起こし 相手の HPを 半分に する。" }, "collisionCourse": { "name": "アクセルブレイク", - "effect": "変形しながら 荒々しく 落下し いにしえの 大爆発を 引き起こす。 弱点をつくと さらに 威力が 増す。" + "effect": "変形しながら 荒々しく 落下し いにしえの 大爆発を 引き起こす。 弱点をつくと さらに 威力が 増す。" }, "electroDrift": { "name": "イナズマドライブ", - "effect": "変形しながら 超高速で 走行し 未知なる 電撃が 相手を つらぬく。 弱点をつくと さらに 威力が 増す。" + "effect": "変形しながら 超高速で 走行し 未知なる 電撃が 相手を つらぬく。 弱点をつくと さらに 威力が 増す。" }, "shedTail": { "name": "しっぽきり", - "effect": "自分の HPを 削って 分身を だしたあと もどってきて 控えの ポケモンと 入れ替わる。" + "effect": "自分の HPを 削って 分身を だしたあと もどってきて 控えの ポケモンと 入れ替わる。" }, "chillyReception": { "name": "さむいギャグ", - "effect": "場を 凍らせる ギャグを 言い残し 控えの ポケモンと 入れ替わる。 5ターンの 間 ゆきを 降らす。" + "effect": "場を 凍らせる ギャグを 言い残し 控えの ポケモンと 入れ替わる。 5ターンの 間 ゆきを 降らす。" }, "tidyUp": { "name": "おかたづけ", - "effect": "まきびし ステルスロック ねばねばネット どくびし みがわりを すべて かたづける。 自分の 攻撃と 素早さが あがる。" + "effect": "まきびし ステルスロック ねばねばネット どくびし みがわりを すべて かたづける。 自分の 攻撃と 素早さが あがる。" }, "snowscape": { "name": "ゆきげしき", - "effect": "5ターンの 間 ゆきを 降らせる。 こおりタイプの 防御が あがる。" + "effect": "5ターンの 間 ゆきを 降らせる。 こおりタイプの 防御が あがる。" }, "pounce": { "name": "とびつく", - "effect": "相手に 飛びついて 攻撃する。 相手の 素早さを さげる。" + "effect": "相手に 飛びついて 攻撃する。 相手の 素早さを さげる。" }, "trailblaze": { "name": "くさわけ", - "effect": "草むらから 飛びだすように 攻撃する。 軽快な 足どりに よって 自分の 素早さを あげる。" + "effect": "草むらから 飛びだすように 攻撃する。 軽快な 足どりに よって 自分の 素早さを あげる。" }, "chillingWater": { "name": "ひやみず", - "effect": "相手の 元気を 失わせるくらい 冷たい水を 浴びせて 攻撃する。 相手の 攻撃を さげる。" + "effect": "相手の 元気を 失わせるくらい 冷たい水を 浴びせて 攻撃する。 相手の 攻撃を さげる。" }, "hyperDrill": { "name": "ハイパードリル", - "effect": "とがった 体の部位を 急速に 回転させ つらぬく。 まもるや みきり なども 無視 できる。" + "effect": "とがった 体の部位を 急速に 回転させ つらぬく。 まもるや みきり なども 無視 できる。" }, "twinBeam": { "name": "ツインビーム", - "effect": "両目から 不可思議な 光線を 発射して 攻撃する。 2回連続で ダメージを 与える。" + "effect": "両目から 不可思議な 光線を 発射して 攻撃する。 2回連続で ダメージを 与える。" }, "rageFist": { "name": "ふんどのこぶし", - "effect": "怒りを エネルギーに 変えて 攻撃。 受けた 攻撃の 回数が 多いほど 技の 威力が あがる。" + "effect": "怒りを エネルギーに 変えて 攻撃。 受けた 攻撃の 回数が 多いほど 技の 威力が あがる。" }, "armorCannon": { "name": "アーマーキャノン", - "effect": "みずからの ヨロイを 燃えたぎる 弾として 撃ち出して 攻撃する。 自分の 防御と 特防が さがる。" + "effect": "みずからの ヨロイを 燃えたぎる 弾として 撃ち出して 攻撃する。 自分の 防御と 特防が さがる。" }, "bitterBlade": { "name": "むねんのつるぎ", - "effect": "この世への 未練を 剣先に こめて 切りつける。 与えた ダメージの 半分の HPを 回復できる。" + "effect": "この世への 未練を 剣先に こめて 切りつける。 与えた ダメージの 半分の HPを 回復できる。" }, "doubleShock": { "name": "でんこうそうげき", - "effect": "全身の でんきを すべて 放って 大ダメージを 与える。 自分の でんきタイプが なくなる。" + "effect": "全身の でんきを すべて 放って 大ダメージを 与える。 自分の でんきタイプが なくなる。" }, "gigatonHammer": { "name": "デカハンマー", - "effect": "大きな ハンマーを 体ごと ぶんまわして 攻撃する。 この技は 2回連続で だせない。" + "effect": "大きな ハンマーを 体ごと ぶんまわして 攻撃する。 この技は 2回連続で だせない。" }, "comeuppance": { "name": "ほうふく", - "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。" + "effect": "技を だす前に 最後に 受けた 技の ダメージを 大きくして だした 相手に 返す。" }, "aquaCutter": { "name": "アクアカッター", - "effect": "加圧された 水を 刃のように 噴射して 相手を 切り裂く。 急所に 当たりやすい。" + "effect": "加圧された 水を 刃のように 噴射して 相手を 切り裂く。 急所に 当たりやすい。" }, "blazingTorque": { "name": "バーンアクセル", - "effect": "メラメラの エンジンを 吹かして 相手に ぶつかる。やけど状態に することが ある。" + "effect": "メラメラの エンジンを 吹かして 相手に ぶつかる。やけど状態に することが ある。" }, "wickedTorque": { "name": "ダークアクセル", - "effect": "悪意で エンジンを 吹かして 相手に ぶつかる。眠り状態に することが ある。" + "effect": "悪意で エンジンを 吹かして 相手に ぶつかる。眠り状態に することが ある。" }, "noxiousTorque": { "name": "ポイズンアクセル", - "effect": "有毒な エンジンを 吹かして 相手に ぶつかる。毒状態に することが ある。" + "effect": "有毒な エンジンを 吹かして 相手に ぶつかる。毒状態に することが ある。" }, "combatTorque": { "name": "ファイトアクセル", - "effect": "力いっぱい エンジンを 吹かして 相手に ぶつかる。まひ状態に することが ある。" + "effect": "力いっぱい エンジンを 吹かして 相手に ぶつかる。まひ状態に することが ある。" }, "magicalTorque": { "name": "マジカルアクセル", - "effect": "幻想的な エンジンを 吹かして 相手に ぶつかる。混乱させることが ある。" + "effect": "幻想的な エンジンを 吹かして 相手に ぶつかる。混乱させることが ある。" }, "bloodMoon": { "name": "ブラッドムーン", - "effect": "血のように 赤い満月から ありったけの 気迫を 撃ちだす。 この技は 2回連続で だせない。" + "effect": "血のように 赤い満月から ありったけの 気迫を 撃ちだす。 この技は 2回連続で だせない。" }, "matchaGotcha": { "name": "シャカシャカほう", - "effect": "かきまぜた お茶の 大砲は 与えた ダメージの 半分を 回復して やけど状態に することも ある。" + "effect": "かきまぜた お茶の 大砲は 与えた ダメージの 半分を 回復して やけど状態に することも ある。" }, "syrupBomb": { "name": "みずあめボム", - "effect": "ねっとりした みずあめを 爆発させ 相手を あめまみれ 状態にして 3ターンの間 素早さを さげ続ける。" + "effect": "ねっとりした みずあめを 爆発させ 相手を あめまみれ 状態にして 3ターンの間 素早さを さげ続ける。" }, "ivyCudgel": { "name": "ツタこんぼう", - "effect": "ツタを まきつけた こん棒で なぐる。 かぶっている お面で タイプが 変わる。 急所に 当たりやすい。" + "effect": "ツタを まきつけた こん棒で なぐる。 かぶっている お面で タイプが 変わる。 急所に 当たりやすい。" }, "electroShot": { "name": "エレクトロビーム", - "effect": "1ターン目に 電気を 集めて 特攻が あがり 2ターン目に 高圧の 電気を 発射する。 天気が 雨のときは すぐに 発射できる。" + "effect": "1ターン目に 電気を 集めて 特攻が あがり 2ターン目に 高圧の 電気を 発射する。 天気が 雨のときは すぐに 発射できる。" }, "teraStarstorm": { "name": "テラクラスター", - "effect": "結晶の力を 照射し 敵を 排除する。 テラパゴスが ステラフォルムで 放つと すべての 相手に ダメージを 与える。" + "effect": "結晶の力を 照射し 敵を 排除する。 テラパゴスが ステラフォルムで 放つと すべての 相手に ダメージを 与える。" }, "fickleBeam": { "name": "きまぐレーザー", - "effect": "光線を 発射して 攻撃する。 ときどき ほかの首も 協力して レーザーを 放ち 威力が 2倍に なる。" + "effect": "光線を 発射して 攻撃する。 ときどき ほかの首も 協力して レーザーを 放ち 威力が 2倍に なる。" }, "burningBulwark": { "name": "かえんのまもり", - "effect": "相手の 攻撃を 超高熱の 体毛で 防ぎ 同時に 触れた 相手に やけどを 与えてしまう。" + "effect": "相手の 攻撃を 超高熱の 体毛で 防ぎ 同時に 触れた 相手に やけどを 与えてしまう。" }, "thunderclap": { "name": "じんらい", - "effect": "相手より 先に 電撃を 浴びせる。 相手が だす技が 攻撃技でないと 失敗する。" + "effect": "相手より 先に 電撃を 浴びせる。 相手が だす技が 攻撃技でないと 失敗する。" }, "mightyCleave": { "name": "パワフルエッジ", - "effect": "頭部に 蓄積した 光で 切断する。 守りを 無視して 攻撃できる。" + "effect": "頭部に 蓄積した 光で 切断する。 守りを 無視して 攻撃できる。" }, "tachyonCutter": { "name": "タキオンカッター", - "effect": "粒子の刃を たて続けに 発射して 2回連続で ダメージを 与える。 攻撃は 必ず 命中する。" + "effect": "粒子の刃を たて続けに 発射して 2回連続で ダメージを 与える。 攻撃は 必ず 命中する。" }, "hardPress": { "name": "ハードプレス", - "effect": "腕やハサミで 相手を 圧迫する。 相手の HPが 残っているほど 威力が あがる。" + "effect": "腕やハサミで 相手を 圧迫する。 相手の HPが 残っているほど 威力が あがる。" }, "dragonCheer": { "name": "ドラゴンエール", - "effect": "竜の鼓舞で 士気を 上げて 味方の技が 急所に 当たりやすくなる。 ドラゴンタイプだと より 鼓舞される。" + "effect": "竜の鼓舞で 士気を 上げて 味方の技が 急所に 当たりやすくなる。 ドラゴンタイプだと より 鼓舞される。" }, "alluringVoice": { "name": "みわくのボイス", - "effect": "天使のような 歌声で 相手を 攻撃。 そのターン 能力が あがった ポケモンを 混乱の 状態に する。" + "effect": "天使のような 歌声で 相手を 攻撃。 そのターン 能力が あがった ポケモンを 混乱の 状態に する。" }, "temperFlare": { "name": "やけっぱち", - "effect": "自棄になった 勢いで 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。" + "effect": "自棄になった 勢いで 攻撃する。 前の ターンに 技を 外していると 威力が 倍に なる。" }, "supercellSlam": { "name": "サンダーダイブ", - "effect": "体を 帯電させ て相手に のしかかる。 はずすと 自分が ダメージを 受ける。" + "effect": "体を 帯電させ て相手に のしかかる。 はずすと 自分が ダメージを 受ける。" }, "psychicNoise": { "name": "サイコノイズ", - "effect": "不快な音波を 相手に 浴びせて 攻撃。 2ターンの間 技や 特性や 持っている 道具によって HPを 回復できなくなる。" + "effect": "不快な音波を 相手に 浴びせて 攻撃。 2ターンの間 技や 特性や 持っている 道具によって HPを 回復できなくなる。" }, "upperHand": { "name": "はやてがえし", - "effect": "動きに 反応して 掌底を 打ちこみ 相手を ひるませる。 相手が だす技が 先制攻撃でないと 失敗する。" + "effect": "動きに 反応して 掌底を 打ちこみ 相手を ひるませる。 相手が だす技が 先制攻撃でないと 失敗する。" }, "malignantChain": { "name": "じゃどくのくさり", - "effect": "毒でできた鎖を 相手に 巻きつけ 毒素を 流しこんで 蝕む。 猛毒の 状態に することが ある。" + "effect": "毒でできた鎖を 相手に 巻きつけ 毒素を 流しこんで 蝕む。 猛毒の 状態に することが ある。" } -} \ No newline at end of file +} diff --git a/src/locales/ja/party-ui-handler.json b/src/locales/ja/party-ui-handler.json index b112653c544..096d8d5bcba 100644 --- a/src/locales/ja/party-ui-handler.json +++ b/src/locales/ja/party-ui-handler.json @@ -4,5 +4,44 @@ "CANCEL": "やめる", "RELEASE": "逃がす", "APPLY": "使う", - "TEACH": "教える" + "TEACH": "教える", + "SPLICE": "吸収合体", + "UNSPLICE": "合体を分離", + "ACTIVATE": "有効にする", + "DEACTIVATE": "無効にする", + "TRANSFER": "アイテムを移動", + "ALL": "全部", + "PASS_BATON": "バトンタッチ", + "UNPAUSE_EVOLUTION": "進化を有効にする", + "REVIVE": "復活する", + "RENAME": "名前を変える", + "choosePokemon": "ポケモンを 選んで ください。", + "doWhatWithThisPokemon": "このポケモンを どうする?", + "noEnergy": "{{pokemonName}}は 戦うための\n元気が 残っていません!", + "hasEnergy": "{{pokemonName}}は まだまだ 元気だ!", + "cantBeUsed": "{{pokemonName}}は このチャレンジで\n使えられません!", + "tooManyItems": "{{pokemonName}}は このアイテムが\nこれ以上 持ちきれない!", + "anyEffect": "使っても 効果がないよ", + "unpausedEvolutions": "{{pokemonName}}は また 進化できる。", + "unspliceConfirmation": "本当に {{pokemonName}}を {{fusionName}}から\n分離しますか? {{fusionName}}は なくなる。", + "wasReverted": "{{fusionName}}は {{pokemonName}}に 回帰した。", + "releaseConfirmation": "本当に {{pokemonName}}を 逃がしますか?", + "releaseInBattle": "戦闘中の ポケモンを\n逃がすことは できません!", + "selectAMove": "技を 選んでください。", + "changeQuantity": "移動する アイテムを 選んでください。\n< と > で 数量が 変えられる。", + "selectAnotherPokemonToSplice": "もう一つの ポケモンを 選んで 合体する。", + "cancel": "キャンセル", + "able": "可能", + "notAble": "不可能", + "learned": "覚えている", + "goodbye": "グッバイ {{pokemonName}}!", + "byebye": "ばいばい {{pokemonName}}!", + "farewell": "さようなら {{pokemonName}}!", + "soLong": "じゃあね {{pokemonName}}!", + "thisIsWhereWePart": "これでお別れだね {{pokemonName}}!", + "illMissYou": "恋しく思うよ {{pokemonName}}!", + "illNeverForgetYou": "一生忘れない {{pokemonName}}!", + "untilWeMeetAgain": "また出会える日まで、{{pokemonName}}!", + "sayonara": "さらば {{pokemonName}}!", + "smellYaLater": "そんじゃ あばよ {{pokemonName}}!" } diff --git a/src/locales/ja/settings.json b/src/locales/ja/settings.json index 55d39ee70a4..afb2f94a047 100644 --- a/src/locales/ja/settings.json +++ b/src/locales/ja/settings.json @@ -20,7 +20,7 @@ "normal": "普通", "fast": "早い", "faster": "とても早い", - "skip": "スキップ", + "skip": "飛ばす", "levelUpNotifications": "レベルアップ時のみ", "on": "オン", "off": "オフ", diff --git a/src/locales/ja/starter-select-ui-handler.json b/src/locales/ja/starter-select-ui-handler.json index cab5c500df6..cefc5322385 100644 --- a/src/locales/ja/starter-select-ui-handler.json +++ b/src/locales/ja/starter-select-ui-handler.json @@ -23,7 +23,7 @@ "manageNature": "性格を変える", "addToFavorites": "お気に入りにする", "removeFromFavorites": "お気に入りから除く", - "useCandies": "飴を使う", + "useCandies": "アメを使う", "selectNature": "性格を選んでください。", "selectMoveSwapOut": "入れ替えたい技を選んでください。", "selectMoveSwapWith": "他の技と交換してください。", diff --git a/src/locales/ja/tutorial.json b/src/locales/ja/tutorial.json index 21b1b4856c8..99019b03f7f 100644 --- a/src/locales/ja/tutorial.json +++ b/src/locales/ja/tutorial.json @@ -1,10 +1,10 @@ { - "intro": "PokéRogueへようこそ!ログライク要素が\n加わったバトル中心のポケモンファンゲームです。\n$このゲームは収益を上げず、Pokémonおよび使用される\n著作権資産に対する所有権を主張しません。\n$ゲームはまだ作業中ですが、完全にプレイすることができます。\nバグ報告はディスコードコミュニティをご利用ください。\n$ゲームが遅い場合は、ブラウザ設定で「ハードウェア\nアクセラレーション」がオンになっていることを確認してください", - "accessMenu": "メニューにアクセスするには、入力待ちの間にMキーまたはEscを押してください。\nメニューには設定やさまざまな機能が含まれています。", - "menu": "このメニューから設定にアクセスできます。\n$設定ではゲームスピード、ウィンドウスタイル、\nおよびその他のオプションを変更できます。\n$ここにはさまざまな他の機能もありますので、\nぜひ確認してみてください!", - "starterSelect": "この画面でZキーやSpaceを押してポケモンを選択できます。\n選んだポケモンは自分の最初のパーティーになります。\n$最大6匹のパーティーで始めることができますが\nポケモンによってポイントがあり、合計10を超えてはなりません。\n$捕まえたりふかさせたりすることで\n選択できる性別、特性、フォルムなどの幅を広げることができます。\n$個体値も徐々に累積して高くなるので、\n同じポケモンをたくさん捕まえてみてください!", - "pokerus": "毎日ランダムでスターターの\n3種類に紫色の枠が表示されます。\n$登録されたスターターの中にあれば、\nパーティに追加してつよさを確認してみましょう!", - "statChange": "ポケモンは交代しない限り、\n次のバトルでも能力変化が維持されます。\n$その代わりに、トレーナーバトルや新しいバイオームに\n入る直前に自動的にリセットされます。\n$CキーまたはShiftキーを押し続けると、\n現在のポケモンの能力変化を確認できます。\n$Vキーを押すと、\n相手が使用した技も確認できます。\n$ただし、今のバトルで相手ポケモンがすでに\n使った技のみが表示されます。", - "selectItem": "バトルが終わるたびに、\nランダムなアイテム3つの中から1つを選んで獲得します。\n$種類は消耗品、ポケモンの持ち物、\n永続的なパッシブアイテムなど様々です。\n$ほとんどの消耗しない道具は\n効果が累積されます。\n$進化用など一部のアイテムは\n使用できる場合にのみ登場します。\n$持ち物を渡す機能を使用して\nポケモン同士で道具を持たせることもできます。\n$持ち物があれば、アイテム選択画面の\n右下に渡す機能が表示されます。\n$お金で消耗品を購入することもでき、\nウェーブが進むにつれて購入可能な種類が増えます。\n$アイテムを選択すると次のウェーブに進むため、\nまず消耗品の購入を行ってください。", - "eggGacha": "この画面でポケモンのたまごクーポンを\nガチャができます。\n$卵は戦闘を繰り返すうちにふかします。\n珍しいほどもっと長くかかります。\n$ふかさせたポケモンはパーティーに追加されず、\nスターティングに登録されます。\n$卵からふかしたポケモンは一般的に\n野生で捕まえたポケモンよりも高い個体値を持ちます。\n$一部のポケモンは卵からしか手に入りません。\n$各ガチャマシンがそれぞれ異なるボーナスを持っているため、\n好きな方を使ってみてください!," -} \ No newline at end of file + "intro": "PokéRogueへ ようこそ! ローグライク要素が\n加わった バトル中心の ポケモンファンゲームです。\n$このゲームは 収益を上げず、Pokémonおよび 使用される\n著作権資産に 対する所有権を 主張しません。\n$ゲームは まだ開発中ですが、完全に プレイすることが できます。\nバグ報告は ディスコードコミュニティを ご利用ください。\n$ゲームが 遅い場合は、ブラウザ設定で「ハードウェア\nアクセラレーション」が オンになっている ことを 確認してください。", + "accessMenu": "メニューを開くには 入力待ちの間に Mキー/Escを 押してください。\nメニューには 設定や 様々な機能が 含まれています。", + "menu": "このメニューから 設定が 開けます。\n$設定では、ゲームの速さや ウィンドウタイプなどの オプションを 変更できます。\n$ここには 様々な機能が ありますので、\nぜひ 確認してみてください!", + "starterSelect": "この画面では Zキー/空白キーを押して ポケモンが 選択できます。\n選んだポケモンは 最初の手持ちに なります。\n$各ポケモンは ポイントが ある。最大6つを 選べますが\nポケモンのポイントが 合計10を超えては いけません。\n$ポケモンを 捕まえたり タマゴからふかしたり することで\n選択できる 性別、特性、フォルムなどの 幅を広げられます。\n$個体値も 徐々に 累積して 高くなるので、\n同じポケモンを たくさん 捕まえて みてください!", + "pokerus": "毎日、無作為に スターターの\n3種類には 紫色の枠が 表示されます。\n$登録された スターターの 中に いれば、\n手持ちに加えて 強さを 確認してみましょう!", + "statChange": "ポケモンを 入れ替えない限り、\n次のバトルでも 能力変化は なくなりません。\n$その代わりに、トレーナーバトルや 新しいバイオームに\n入る直前に 自動的に 能力変化は 元に戻ります。\n$Cキー/Shiftキーを 押し続けると、\n場にいるポケモンの 能力変化を 確認できます。\n$Vキーを押すと、\n相手が出した技も 確認できます。\n$ただし、現在のバトルでの 相手ポケモンが\nすでに使った 技のみが 表示されます。", + "selectItem": "バトルが 終わるたびには、「ショップ」という\n画面で 3つのご褒美から 1つが選べます。\n$種類は 消耗品、ポケモンの持ち物や道具、\n永続的な パッシブアイテムなど 様々です。\n$ほとんどの 消耗しない 道具は\n効果が 累積されます。\n$例えば 進化アイテムなどの ご褒美は\n使用できる 場合にのみ 登場します。\n$持ち物や道具が\n手持ちポケモン間に 移動できる\n$持ち物や道具が あれば、ショップ画面の\n右下に「アイテム移行」が 表示されます。\n$ショップ画面で お金で 消耗品を 買えます。\nラウンドが 進むにつれて 買えるアイテムが 増えます。\n$ご褒美を 選択すると 次のラウンドに\n進むから、まず 消耗品を 買ってください。", + "eggGacha": "この画面では、「タマゴクーポン」で\nポケモンのタマゴを 取得できます。\n$タマゴは ラウンドが進めるうちに ふかします。\nタマゴのふかは レア度によって 時間が かかります。\n$ふかしたポケモンは 手持ちに 加えられず、\nスターターに 登録されます。\n$ふかしたポケモンは 一般的に\n野生ポケモンよりも 高い個体値があります。\n$あるポケモンは タマゴからしか 手に入りません。\n$各ガチャマシンは 個性的なボーナスが あるますから、\n好きな方から 引いてみてください!," +} From a88b9899398a595d1c31ed808e605c84c36d3c50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Ricardo?= Date: Mon, 9 Sep 2024 13:50:47 -0300 Subject: [PATCH 08/30] [Localization] [pt_BR] Updated some translations (#4131) --- src/locales/pt_BR/ability-trigger.json | 1 + src/locales/pt_BR/battle.json | 4 +++- src/locales/pt_BR/battler-tags.json | 4 +++- src/locales/pt_BR/challenges.json | 3 ++- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/locales/pt_BR/ability-trigger.json b/src/locales/pt_BR/ability-trigger.json index f6a11267f9d..cd47fd8e3dc 100644 --- a/src/locales/pt_BR/ability-trigger.json +++ b/src/locales/pt_BR/ability-trigger.json @@ -12,6 +12,7 @@ "blockItemTheft": "{{abilityName}} de {{pokemonNameWithAffix}}\nprevine o roubo de itens!", "typeImmunityHeal": "{{abilityName}} de {{pokemonNameWithAffix}}\nrestaurou um pouco de PS!", "nonSuperEffectiveImmunity": "{{pokemonNameWithAffix}} evitou dano\ncom {{abilityName}}!", + "fullHpResistType": "{{pokemonNameWithAffix}} fez seu casco brilhar!\nEstá distorcendo o confronte de tipos!", "moveImmunity": "Isso não afeta {{pokemonNameWithAffix}}!", "reverseDrain": "{{pokemonNameWithAffix}} absorveu a gosma líquida!", "postDefendTypeChange": "{{abilityName}} de {{pokemonNameWithAffix}}\ntransformou-o no tipo {{typeName}}!", diff --git a/src/locales/pt_BR/battle.json b/src/locales/pt_BR/battle.json index 2b20e0062ea..08eeb99e0cd 100644 --- a/src/locales/pt_BR/battle.json +++ b/src/locales/pt_BR/battle.json @@ -44,6 +44,7 @@ "moveNotImplemented": "{{moveName}} ainda não foi implementado e não pode ser usado.", "moveNoPP": "Não há mais PP\npara esse movimento!", "moveDisabled": "Não se pode usar {{moveName}} porque foi desabilitado!", + "disableInterruptedMove": "{{moveName}} de {{pokemonNameWithAffix}}\nestá desabilitado!", "noPokeballForce": "Uma força misteriosa\nte impede de usar Poké Bolas.", "noPokeballTrainer": "Não se pode capturar\nPokémon dos outros!", "noPokeballMulti": "Não se pode lançar Poké Bolas\nquando há mais de um Pokémon!", @@ -61,6 +62,7 @@ "skipItemQuestion": "Tem certeza de que não quer escolher um item?", "itemStackFull": "O estoque de {{fullItemName}} está cheio.\nVocê receberá {{itemName}} no lugar.", "eggHatching": "Opa?", + "eggSkipPrompt": "Pular para súmario de ovos?", "ivScannerUseQuestion": "Quer usar o Scanner de IVs em {{pokemonName}}?", "wildPokemonWithAffix": "{{pokemonName}} selvagem", "foePokemonWithAffix": "{{pokemonName}} adversário", @@ -89,7 +91,7 @@ "statSeverelyFell_other": "{{stats}} de {{pokemonNameWithAffix}} diminuíram severamente!", "statWontGoAnyLower_one": "{{stats}} de {{pokemonNameWithAffix}} não vai mais diminuir!", "statWontGoAnyLower_other": "{{stats}} de {{pokemonNameWithAffix}} não vão mais diminuir!", - "transformedIntoType": "{{pokemonName}} transformed\ninto the {{type}} type!", + "transformedIntoType": "{{pokemonName}} se transformou\nno tipo {{type}}!", "ppReduced": "O PP do movimento {{moveName}} de\n{{targetName}} foi reduzido em {{reduction}}!", "retryBattle": "Você gostaria de tentar novamente desde o início da batalha?", "unlockedSomething": "{{unlockedThing}}\nfoi desbloqueado.", diff --git a/src/locales/pt_BR/battler-tags.json b/src/locales/pt_BR/battler-tags.json index e0f6538404b..9c0f4732013 100644 --- a/src/locales/pt_BR/battler-tags.json +++ b/src/locales/pt_BR/battler-tags.json @@ -67,5 +67,7 @@ "saltCuredLapse": "{{pokemonNameWithAffix}} foi ferido pelo {{moveName}}!", "cursedOnAdd": "{{pokemonNameWithAffix}} cortou seus PS pela metade e amaldiçoou {{pokemonName}}!", "cursedLapse": "{{pokemonNameWithAffix}} foi ferido pelo Curse!", - "stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!" + "stockpilingOnAdd": "{{pokemonNameWithAffix}} estocou {{stockpiledCount}}!", + "disabledOnAdd": "{{moveName}} de {{pokemonNameWithAffix}}\nfoi desabilitado!", + "disabledLapse": "{{moveName}} de {{pokemonNameWithAffix}}\nnão está mais desabilitado." } diff --git a/src/locales/pt_BR/challenges.json b/src/locales/pt_BR/challenges.json index 8402ad106b6..9dc613651a6 100644 --- a/src/locales/pt_BR/challenges.json +++ b/src/locales/pt_BR/challenges.json @@ -1,6 +1,7 @@ { "title": "Desafios", "illegalEvolution": "{{pokemon}} não pode ser escolhido\nnesse desafio!", + "noneSelected": "Nada Selecionado", "singleGeneration": { "name": "Geração Única", "desc": "Você só pode user Pokémon da {{gen}} geração.", @@ -33,4 +34,4 @@ "value.0": "Desligado", "value.1": "Ligado" } -} +} \ No newline at end of file From 3c05237b2e7b0995f6d8554a55ddf7a499ae4085 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 10 Sep 2024 00:52:20 +0800 Subject: [PATCH 09/30] [Move] Fully implement Throat Chop (#4115) * fully implement throat chop * add linkcode in docs * address comments * update test --- src/data/battler-tags.ts | 51 +++++++++++++++++++++++++-- src/data/move.ts | 2 +- src/enums/battler-tag-type.ts | 1 + src/locales/en/battle.json | 2 ++ src/test/moves/throat_chop.test.ts | 55 ++++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 src/test/moves/throat_chop.test.ts diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index c26412c776f..71385facb23 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -107,8 +107,8 @@ export interface TerrainBattlerTag { * to select restricted moves. */ export abstract class MoveRestrictionBattlerTag extends BattlerTag { - constructor(tagType: BattlerTagType, turnCount: integer, sourceMove?: Moves, sourceId?: integer) { - super(tagType, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], turnCount, sourceMove, sourceId); + constructor(tagType: BattlerTagType, lapseType: BattlerTagLapseType | BattlerTagLapseType[], turnCount: integer, sourceMove?: Moves, sourceId?: integer) { + super(tagType, lapseType, turnCount, sourceMove, sourceId); } /** @override */ @@ -158,6 +158,49 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { abstract interruptedText(pokemon: Pokemon, move: Moves): string; } +/** + * Tag representing the "Throat Chop" effect. Pokemon with this tag cannot use sound-based moves. + * @see {@link https://bulbapedia.bulbagarden.net/wiki/Throat_Chop_(move) | Throat Chop} + * @extends MoveRestrictionBattlerTag + */ +export class ThroatChoppedTag extends MoveRestrictionBattlerTag { + constructor() { + super(BattlerTagType.THROAT_CHOPPED, [ BattlerTagLapseType.TURN_END, BattlerTagLapseType.PRE_MOVE ], 2, Moves.THROAT_CHOP); + } + + /** + * Checks if a {@linkcode Moves | move} is restricted by Throat Chop. + * @override + * @param {Moves} move the {@linkcode Moves | move} to check for sound-based restriction + * @returns true if the move is sound-based + */ + override isMoveRestricted(move: Moves): boolean { + return allMoves[move].hasFlag(MoveFlags.SOUND_BASED); + } + + /** + * Shows a message when the player attempts to select a move that is restricted by Throat Chop. + * @override + * @param {Pokemon} pokemon the {@linkcode Pokemon} that is attempting to select the restricted move + * @param {Moves} move the {@linkcode Moves | move} that is being restricted + * @returns the message to display when the player attempts to select the restricted move + */ + override selectionDeniedText(pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:moveCannotBeSelected", { moveName: allMoves[move].name }); + } + + /** + * Shows a message when a move is interrupted by Throat Chop. + * @override + * @param {Pokemon} pokemon the interrupted {@linkcode Pokemon} + * @param {Moves} move the {@linkcode Moves | move} that was interrupted + * @returns the message to display when the move is interrupted + */ + override interruptedText(pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:throatChopInterruptedMove", { pokemonName: getPokemonNameWithAffix(pokemon) }); + } +} + /** * Tag representing the "disabling" effect performed by {@linkcode Moves.DISABLE} and {@linkcode Abilities.CURSED_BODY}. * When the tag is added, the last-used move of the tag holder is set as the disabled move. @@ -167,7 +210,7 @@ export class DisabledTag extends MoveRestrictionBattlerTag { private moveId: Moves = Moves.NONE; constructor(sourceId: number) { - super(BattlerTagType.DISABLED, 4, Moves.DISABLE, sourceId); + super(BattlerTagType.DISABLED, [ BattlerTagLapseType.PRE_MOVE, BattlerTagLapseType.TURN_END ], 4, Moves.DISABLE, sourceId); } /** @override */ @@ -2158,6 +2201,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new GulpMissileTag(tagType, sourceMove); case BattlerTagType.TAR_SHOT: return new TarShotTag(); + case BattlerTagType.THROAT_CHOPPED: + return new ThroatChoppedTag(); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/data/move.ts b/src/data/move.ts index 21b859b22ac..6ab134c1708 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -8404,7 +8404,7 @@ export function initMoves() { .target(MoveTarget.USER_AND_ALLIES) .condition((user, target, move) => !![ user, user.getAlly() ].filter(p => p?.isActive()).find(p => !![ Abilities.PLUS, Abilities.MINUS].find(a => p.hasAbility(a, false)))), new AttackMove(Moves.THROAT_CHOP, Type.DARK, MoveCategory.PHYSICAL, 80, 100, 15, 100, 0, 7) - .partial(), + .attr(AddBattlerTagAttr, BattlerTagType.THROAT_CHOPPED), new AttackMove(Moves.POLLEN_PUFF, Type.BUG, MoveCategory.SPECIAL, 90, 100, 15, -1, 0, 7) .attr(StatusCategoryOnAllyAttr) .attr(HealOnAllyAttr, 0.5, true, false) diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 0878bd00cd5..7d559f32cb3 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -73,5 +73,6 @@ export enum BattlerTagType { SHELL_TRAP = "SHELL_TRAP", DRAGON_CHEER = "DRAGON_CHEER", NO_RETREAT = "NO_RETREAT", + THROAT_CHOPPED = "THROAT_CHOPPED", TAR_SHOT = "TAR_SHOT", } diff --git a/src/locales/en/battle.json b/src/locales/en/battle.json index 120ac749acb..0aabaacd99c 100644 --- a/src/locales/en/battle.json +++ b/src/locales/en/battle.json @@ -44,7 +44,9 @@ "moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.", "moveNoPP": "There's no PP left for\nthis move!", "moveDisabled": "{{moveName}} is disabled!", + "moveCannotBeSelected": "{{moveName}} cannot be selected!", "disableInterruptedMove": "{{pokemonNameWithAffix}}'s {{moveName}}\nis disabled!", + "throatChopInterruptedMove": "The effects of Throat Chop prevent\n{{pokemonName}} from using certain moves!", "noPokeballForce": "An unseen force\nprevents using Poké Balls.", "noPokeballTrainer": "You can't catch\nanother trainer's Pokémon!", "noPokeballMulti": "You can only throw a Poké Ball\nwhen there is one Pokémon remaining!", diff --git a/src/test/moves/throat_chop.test.ts b/src/test/moves/throat_chop.test.ts new file mode 100644 index 00000000000..151aec58b38 --- /dev/null +++ b/src/test/moves/throat_chop.test.ts @@ -0,0 +1,55 @@ +import { BattlerIndex } from "#app/battle"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; + +describe("Moves - Throat Chop", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 20 * 1000; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset(Array(4).fill(Moves.GROWL)) + .battleType("single") + .ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Array(4).fill(Moves.THROAT_CHOP)) + .enemySpecies(Species.MAGIKARP); + }); + + it("prevents the target from using sound-based moves for two turns", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + game.move.select(Moves.GROWL); + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + // First turn, move is interrupted + await game.phaseInterceptor.to("TurnEndPhase"); + expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(0); + + // Second turn, struggle if no valid moves + await game.toNextTurn(); + + game.move.select(Moves.GROWL); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(game.scene.getEnemyPokemon()!.isFullHp()).toBe(false); + }, TIMEOUT); +}); From 3d01e905dfb8ce245a70688170303d137f1312fc Mon Sep 17 00:00:00 2001 From: Lugiad Date: Mon, 9 Sep 2024 18:53:22 +0200 Subject: [PATCH 10/30] [Localization][UI/UX] Clean up of unused localized images (#4110) * Delete public/images/ui/legacy/summary_moves_effect_de.png * Delete public/images/ui/legacy/summary_moves_effect_es.png * Delete public/images/ui/legacy/summary_moves_effect_fr.png * Delete public/images/ui/legacy/summary_moves_effect_it.png * Delete public/images/ui/legacy/summary_moves_effect_pt-BR.png * Delete public/images/ui/legacy/summary_moves_effect_zh-CN.png --- .../images/ui/legacy/summary_moves_effect_de.png | Bin 799 -> 0 bytes .../images/ui/legacy/summary_moves_effect_es.png | Bin 807 -> 0 bytes .../images/ui/legacy/summary_moves_effect_fr.png | Bin 1787 -> 0 bytes .../images/ui/legacy/summary_moves_effect_it.png | Bin 799 -> 0 bytes .../ui/legacy/summary_moves_effect_pt-BR.png | Bin 800 -> 0 bytes .../ui/legacy/summary_moves_effect_zh-CN.png | Bin 799 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/images/ui/legacy/summary_moves_effect_de.png delete mode 100644 public/images/ui/legacy/summary_moves_effect_es.png delete mode 100644 public/images/ui/legacy/summary_moves_effect_fr.png delete mode 100644 public/images/ui/legacy/summary_moves_effect_it.png delete mode 100644 public/images/ui/legacy/summary_moves_effect_pt-BR.png delete mode 100644 public/images/ui/legacy/summary_moves_effect_zh-CN.png diff --git a/public/images/ui/legacy/summary_moves_effect_de.png b/public/images/ui/legacy/summary_moves_effect_de.png deleted file mode 100644 index 8d6ef024cf3bda09f70455b9400db5a1e2bb7b40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^DL`z;!3-o{Y5ILWn z&^SMJqNNA3qeQFy;zca3M?{pwqFuCE0|mW17jdwubUp~(vD>h7LhRwZrrxCq+7T5d zajm^uw~1|QQmAOSaVtXeR>zwEIZT{REbMJRD~#V8er988kGx#;`qzO?pZ#)_7M(qJ zHk((UC39)3pUK^l;)_2jnpQpj+$Xj5-nUgc|IBAiKE009bk>KCnZ=(Dc^`7l{yFDS z?86B&FHSy`e#o{jCg6wTOSg&fqRVUfR-BnIxuch>y=7|&tF&lNnv8cvfW@3GIVbtg zh*_?zh}}3?kQ>jn&XaXZy7nLb?%#b{ z;5yebi(?T-oxcBFVgKXq+SyVs^wmsV7yP^V`QGjYiPHPF+q{2$;`6@#h2J>!-fpV@ zD$r){a$hU^A#=vfhR>@vrM)?DRBem>vl933OQU8shH%~Udpi5sg12l<+(++u{ho8j z*=g6TU2S`7U-)@{OPX449`^0qbIJYoO7;`>7Hy92JzW8e6s-WC5LXWeiy(&o*$m%X zIKD6Cc)wTR{XL2I|Ns9l&Q8wudfzkU`PzH;zW)bC9>Y?>+2?>1UrCT(Fi-&kFt{GL za{?&CS>O>_%)r1c48n{Iv*t(u1wVVbIEF;HzrA^zugO4w<-)D*rs@Cx$KFicC7?Sy zN|Qgu-)Xf+n$y#jJEmJt^v-|r!LCIjc$Z&Z$`84h>~a}Vo|?x5_B`LSDCnfasbo6~ zSt;*r?p^cu>)!H8iL`TTd2X2=sV@bQWO%VG-2^3 zp+=dhQ#qcjSmUDLo~p`ZsiiH5Mak8jUVJyd{dgTVVez9$%-a@Kgs;`sdb$2TH{
mdKI;Vst09W^QA^-pY diff --git a/public/images/ui/legacy/summary_moves_effect_es.png b/public/images/ui/legacy/summary_moves_effect_es.png deleted file mode 100644 index a48f90cc8f6fabe76b4964b4a9004ba92852df9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 807 zcmeAS@N?(olHy`uVBq!ia0vp^DL`z;!3-o{Y5ILWn z&^SMJqNNA3qeQFy;zca3M?{pwqFuCE0|mW17jdwubUp~(vD>h7LhRwZrrxCq+7T5d zajm^uw~1|QQmAOSaVtXeR>zwEIZT{REbMJRD~#V8er988kGx#;`qzO?pZ#)_7M(qJ zHk((UC39)3pUK^l;)_2jnpQpj+$Xj5-nUgc|IBAiKE009bk>KCnZ=(Dc^`7l{yFDS z?86B&FHSy`e#o{jCg6wTOSg&fqRVUfR-BnIxuch>y=7|&tF&lNnv8cvfW@3GIVbtg zh*_?zh}}3?kQ>jn&XaXZy7nLb?%#b{ z;5yebi(?T-oxcBFVgKXq+SyVs^wmsV7yP^V`QGjYiPHPF+q{2$;`6@#h2J>!-fpV@ zD$r){a$hU^A#=vfhR>@vrM)?DRBem>vl933OQU8shH%~Udpi5sg12l<+(++u{ho8j z*=g6TU2S`7U-)@{OPX449`^0qbIJYoO7;`>7Hy92JzW8e6s-WC5LXWeiy(&o*$m%X zIKD6Cc)wTR{XL2I|Ns9l&Q8wudfzkU`PzH;zW)bC9>Y?>+2?>1UrCT(Fi-&kFt{GL za{?&CS>O>_%)r1c48n{Iv*t(u1%G?GIEF;Hznytgs9Ax>RnvQQ?7#oz*_XUCWM?gm zs3|B)6DpWl?e>N9?qS)E%NY+o*tJLmTj|GiyxeRVp-@E(I_+MWBXMIj!Wo;vz`l0Fe=*x4W>I+=q+ zhUK)B>AC&B{Y^5W)81?lJ-R!~S@C4WvHt=E?>K*D-wEEcNMs=}7#KWV{an^LB{Ts5 DAgUg%e zd4KQk`SU){bFU}j15J(F8VQ1Eibg_7yvq3Paomr8uXn~vc-dqo2l|Oq^XNNiA)km>|7 z8imfHs$(=k_M`1?M0@U*7=O|K<1Jtl5#>Vs@%qo#d0}f5bQ_^Hk^2t7Cj+M$(!vQ)$AV@AI0fh;jF4^^mHCdP6#te!;{GPCF(sB7DI7{Dox#cDP- z^hH%`CQK_lj>D*CWka-?n$RJWgeDp@Bp4pYZg$ww=wi@-z(Pg}q5S%VCDvUggF*7C zVMUWs!R)Mq!w|4wfZ|!+O|u@F^Q3rucRrEz>|}Y7Wh>Aal9lwtMo>-=J=`5oTsShY zz+J(zB&Ly}0vxWQf(&GIEklvDB#J?lM+P>Gy>r#;qrqUpKxrk9HwL1(AVQ^-&jnHYNiD=2}VN!3g^bDD6%Mfz1^%wkZ8^Y0L^o5f%XEoj~2RJf`S`Yh!I$b(Rb^fw%Y`HY z$!?GUCE1k$WvZ%H?m0OX+Cmm$(toL$3d}@ls{jnxm%)j=TSYQ;VfY!lrRziUGaF^0 zf~y+^WsZs#&lxP?bL&ISmTH3%YIr&tcntpj*z-9&La#pFPJf&I#`0zx7OQJ-tKVwRf#>*Vip)3x`Xe z7&9{;ez!7Pcw~0w_L;LMuTuwyzt3ED{CMo!1@BwEmv{Yf^NH5glgiZ1rejOY(!t(8 zyWSiu9XN7dd*^4y`A>=PlP|p3@J!eAjg`mSRvsQtwY6T_vp2MV0JgsJ=xliNe^FeU zZohR&`eFB1ho?Ip@K0ZT|G>UIC(f_NBs=wz-mPoBhRzhU1}A{reC71-*(( A`Tzg` diff --git a/public/images/ui/legacy/summary_moves_effect_it.png b/public/images/ui/legacy/summary_moves_effect_it.png deleted file mode 100644 index 8d6ef024cf3bda09f70455b9400db5a1e2bb7b40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^DL`z;!3-o{Y5ILWn z&^SMJqNNA3qeQFy;zca3M?{pwqFuCE0|mW17jdwubUp~(vD>h7LhRwZrrxCq+7T5d zajm^uw~1|QQmAOSaVtXeR>zwEIZT{REbMJRD~#V8er988kGx#;`qzO?pZ#)_7M(qJ zHk((UC39)3pUK^l;)_2jnpQpj+$Xj5-nUgc|IBAiKE009bk>KCnZ=(Dc^`7l{yFDS z?86B&FHSy`e#o{jCg6wTOSg&fqRVUfR-BnIxuch>y=7|&tF&lNnv8cvfW@3GIVbtg zh*_?zh}}3?kQ>jn&XaXZy7nLb?%#b{ z;5yebi(?T-oxcBFVgKXq+SyVs^wmsV7yP^V`QGjYiPHPF+q{2$;`6@#h2J>!-fpV@ zD$r){a$hU^A#=vfhR>@vrM)?DRBem>vl933OQU8shH%~Udpi5sg12l<+(++u{ho8j z*=g6TU2S`7U-)@{OPX449`^0qbIJYoO7;`>7Hy92JzW8e6s-WC5LXWeiy(&o*$m%X zIKD6Cc)wTR{XL2I|Ns9l&Q8wudfzkU`PzH;zW)bC9>Y?>+2?>1UrCT(Fi-&kFt{GL za{?&CS>O>_%)r1c48n{Iv*t(u1wVVbIEF;HzrA^zugO4w<-)D*rs@Cx$KFicC7?Sy zN|Qgu-)Xf+n$y#jJEmJt^v-|r!LCIjc$Z&Z$`84h>~a}Vo|?x5_B`LSDCnfasbo6~ zSt;*r?p^cu>)!H8iL`TTd2X2=sV@bQWO%VG-2^3 zp+=dhQ#qcjSmUDLo~p`ZsiiH5Mak8jUVJyd{dgTVVez9$%-a@Kgs;`sdb$2TH{
mdKI;Vst09W^QA^-pY diff --git a/public/images/ui/legacy/summary_moves_effect_pt-BR.png b/public/images/ui/legacy/summary_moves_effect_pt-BR.png deleted file mode 100644 index f5a0c2ea736e57910270f605be6950e87388e089..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 800 zcmeAS@N?(olHy`uVBq!ia0vp^DL`z;!3-o{Y5ILWn z&^SMJqNNA3qeQFy;zca3M?{pwqFuCE0|mW17jdwubUp~(vD>h7LhRwZrrxCq+7T5d zajm^uw~1|QQmAOSaVtXeR>zwEIZT{REbMJRD~#V8er988kGx#;`qzO?pZ#)_7M(qJ zHk((UC39)3pUK^l;)_2jnpQpj+$Xj5-nUgc|IBAiKE009bk>KCnZ=(Dc^`7l{yFDS z?86B&FHSy`e#o{jCg6wTOSg&fqRVUfR-BnIxuch>y=7|&tF&lNnv8cvfW@3GIVbtg zh*_?zh}}3?kQ>jn&XaXZy7nLb?%#b{ z;5yebi(?T-oxcBFVgKXq+SyVs^wmsV7yP^V`QGjYiPHPF+q{2$;`6@#h2J>!-fpV@ zD$r){a$hU^A#=vfhR>@vrM)?DRBem>vl933OQU8shH%~Udpi5sg12l<+(++u{ho8j z*=g6TU2S`7U-)@{OPX449`^0qbIJYoO7;`>7Hy92JzW8e6s-WC5LXWeiy(&o*$m%X zIKD6Cc)wTR{XL2I|Ns9l&Q8wudfzkU`PzH;zW)bC9>Y?>+2?>1UrCT(Fi-&kFt{GL za{?&CS>O>_%)r1c48n{Iv*t(u1;2Q@IEF;HzrA^zugO4wCE$(g!PEc$ue)o+?DBfq zwA0KtCvON~;*kp9yhZ=#eR7oBq;o`~>HE2-dlm(G>YtkI z?$>^7(*58^$ICZwo0J)Cr*>#((C;$Q^mB8Wn z&^SMJqNNA3qeQFy;zca3M?{pwqFuCE0|mW17jdwubUp~(vD>h7LhRwZrrxCq+7T5d zajm^uw~1|QQmAOSaVtXeR>zwEIZT{REbMJRD~#V8er988kGx#;`qzO?pZ#)_7M(qJ zHk((UC39)3pUK^l;)_2jnpQpj+$Xj5-nUgc|IBAiKE009bk>KCnZ=(Dc^`7l{yFDS z?86B&FHSy`e#o{jCg6wTOSg&fqRVUfR-BnIxuch>y=7|&tF&lNnv8cvfW@3GIVbtg zh*_?zh}}3?kQ>jn&XaXZy7nLb?%#b{ z;5yebi(?T-oxcBFVgKXq+SyVs^wmsV7yP^V`QGjYiPHPF+q{2$;`6@#h2J>!-fpV@ zD$r){a$hU^A#=vfhR>@vrM)?DRBem>vl933OQU8shH%~Udpi5sg12l<+(++u{ho8j z*=g6TU2S`7U-)@{OPX449`^0qbIJYoO7;`>7Hy92JzW8e6s-WC5LXWeiy(&o*$m%X zIKD6Cc)wTR{XL2I|Ns9l&Q8wudfzkU`PzH;zW)bC9>Y?>+2?>1UrCT(Fi-&kFt{GL za{?&CS>O>_%)r1c48n{Iv*t(u1wVVbIEF;HzrA^zugO4w<-)D*rs@Cx$KFicC7?Sy zN|Qgu-)Xf+n$y#jJEmJt^v-|r!LCIjc$Z&Z$`84h>~a}Vo|?x5_B`LSDCnfasbo6~ zSt;*r?p^cu>)!H8iL`TTd2X2=sV@bQWO%VG-2^3 zp+=dhQ#qcjSmUDLo~p`ZsiiH5Mak8jUVJyd{dgTVVez9$%-a@Kgs;`sdb$2TH{
mdKI;Vst09W^QA^-pY From 89b33466a9b6e6dbf3169bbc490c411291e23485 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 9 Sep 2024 09:53:45 -0700 Subject: [PATCH 11/30] [Test] Fix Safeguard test that relied on a now-fixed bug (#4098) --- src/test/moves/safeguard.test.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/test/moves/safeguard.test.ts b/src/test/moves/safeguard.test.ts index 94a7aa6031e..8068c475539 100644 --- a/src/test/moves/safeguard.test.ts +++ b/src/test/moves/safeguard.test.ts @@ -38,7 +38,7 @@ describe("Moves - Safeguard", () => { }); it("protects from damaging moves with additional effects", async () => { - await game.startBattle(); + await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; game.move.select(Moves.NUZZLE); @@ -49,7 +49,7 @@ describe("Moves - Safeguard", () => { }, TIMEOUT); it("protects from status moves", async () => { - await game.startBattle(); + await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPORE); @@ -61,7 +61,7 @@ describe("Moves - Safeguard", () => { it("protects from confusion", async () => { game.override.moveset([Moves.CONFUSE_RAY]); - await game.startBattle(); + await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.CONFUSE_RAY); @@ -74,7 +74,7 @@ describe("Moves - Safeguard", () => { it("protects ally from status", async () => { game.override.battleType("double"); - await game.startBattle(); + await game.classicMode.startBattle(); game.move.select(Moves.SPORE, 0, BattlerIndex.ENEMY_2); game.move.select(Moves.NUZZLE, 1, BattlerIndex.ENEMY_2); @@ -90,7 +90,7 @@ describe("Moves - Safeguard", () => { }, TIMEOUT); it("protects from Yawn", async () => { - await game.startBattle(); + await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.YAWN); @@ -101,7 +101,7 @@ describe("Moves - Safeguard", () => { }, TIMEOUT); it("doesn't protect from already existing Yawn", async () => { - await game.startBattle(); + await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.YAWN); @@ -116,12 +116,13 @@ describe("Moves - Safeguard", () => { it("doesn't protect from self-inflicted via Rest or Flame Orb", async () => { game.override.enemyHeldItems([{name: "FLAME_ORB"}]); - await game.startBattle(); + await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPLASH); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); + enemyPokemon.damageAndUpdate(1); expect(enemyPokemon.status?.effect).toEqual(StatusEffect.BURN); @@ -135,7 +136,7 @@ describe("Moves - Safeguard", () => { it("protects from ability-inflicted status", async () => { game.override.ability(Abilities.STATIC); vi.spyOn(allAbilities[Abilities.STATIC].getAttrs(PostDefendContactApplyStatusEffectAbAttr)[0], "chance", "get").mockReturnValue(100); - await game.startBattle(); + await game.classicMode.startBattle(); const enemyPokemon = game.scene.getEnemyPokemon()!; game.move.select(Moves.SPLASH); From 80e347840df421780cb9fc4647ce6f20a76ba165 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Tue, 10 Sep 2024 01:54:17 +0900 Subject: [PATCH 12/30] [Bug] Fix line spacing in level up stats and move info in Japanese (#4095) --- src/ui/battle-message-ui-handler.ts | 3 +++ src/ui/move-info-overlay.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/src/ui/battle-message-ui-handler.ts b/src/ui/battle-message-ui-handler.ts index 3bea0f21433..9a694d50b29 100644 --- a/src/ui/battle-message-ui-handler.ts +++ b/src/ui/battle-message-ui-handler.ts @@ -97,6 +97,7 @@ export default class BattleMessageUiHandler extends MessageUiHandler { this.levelUpStatsContainer = levelUpStatsContainer; const levelUpStatsLabelsContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 73, -94, "", TextStyle.WINDOW, { maxLines: 6 }); + levelUpStatsLabelsContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); let levelUpStatsLabelText = ""; for (const s of PERMANENT_STATS) { @@ -112,11 +113,13 @@ export default class BattleMessageUiHandler extends MessageUiHandler { levelUpStatsContainer.add(levelUpStatsLabelsContent); const levelUpStatsIncrContent = addTextObject(this.scene, (this.scene.game.canvas.width / 6) - 50, -94, "+\n+\n+\n+\n+\n+", TextStyle.WINDOW, { maxLines: 6 }); + levelUpStatsIncrContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); levelUpStatsContainer.add(levelUpStatsIncrContent); this.levelUpStatsIncrContent = levelUpStatsIncrContent; const levelUpStatsValuesContent = addBBCodeTextObject(this.scene, (this.scene.game.canvas.width / 6) - 7, -94, "", TextStyle.WINDOW, { maxLines: 6, lineSpacing: 5}); + levelUpStatsValuesContent.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); levelUpStatsValuesContent.setOrigin(1, 0); levelUpStatsValuesContent.setAlign("right"); levelUpStatsContainer.add(levelUpStatsValuesContent); diff --git a/src/ui/move-info-overlay.ts b/src/ui/move-info-overlay.ts index 859e95a39b6..77010f84528 100644 --- a/src/ui/move-info-overlay.ts +++ b/src/ui/move-info-overlay.ts @@ -58,6 +58,7 @@ export default class MoveInfoOverlay extends Phaser.GameObjects.Container implem // set up the description; wordWrap uses true pixels, unaffected by any scaling, while other values are affected this.desc = addTextObject(scene, (options?.onSide && !options?.right ? EFF_WIDTH : 0) + BORDER, (options?.top ? EFF_HEIGHT : 0) + BORDER - 2, "", TextStyle.BATTLE_INFO, { wordWrap: { width: (width - (BORDER - 2) * 2 - (options?.onSide ? EFF_WIDTH : 0)) * GLOBAL_SCALE } }); + this.desc.setLineSpacing(i18next.resolvedLanguage === "ja" ? 25 : 5); // limit the text rendering, required for scrolling later on const maskPointOrigin = { From c59f6edf36dd0fa2176128c49fadd0acb357d1d0 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 10 Sep 2024 00:54:31 +0800 Subject: [PATCH 13/30] [Move] Implement Power Shift (#4083) * fully implement power shift * cleanup --- src/data/move.ts | 64 ++++++++++++++++++++++++++++-- src/locales/en/move-trigger.json | 1 + src/test/moves/power_shift.test.ts | 64 ++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 src/test/moves/power_shift.test.ts diff --git a/src/data/move.ts b/src/data/move.ts index 6ab134c1708..d9e385fdd0e 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -5987,9 +5987,8 @@ export class SwapStatAttr extends MoveEffectAttr { } /** - * Takes the average of the user's and target's corresponding current - * {@linkcode stat} values and sets that stat to the average for both - * temporarily. + * Swaps the user's and target's corresponding current + * {@linkcode EffectiveStat | stat} values * @param user the {@linkcode Pokemon} that used the move * @param target the {@linkcode Pokemon} that the move was used on * @param move N/A @@ -6013,6 +6012,62 @@ export class SwapStatAttr extends MoveEffectAttr { } } +/** + * Attribute used to switch the user's own stats. + * Used by Power Shift. + * @extends MoveEffectAttr + */ +export class ShiftStatAttr extends MoveEffectAttr { + private statToSwitch: EffectiveStat; + private statToSwitchWith: EffectiveStat; + + constructor(statToSwitch: EffectiveStat, statToSwitchWith: EffectiveStat) { + super(); + + this.statToSwitch = statToSwitch; + this.statToSwitchWith = statToSwitchWith; + } + + /** + * Switches the user's stats based on the {@linkcode statToSwitch} and {@linkcode statToSwitchWith} attributes. + * @param {Pokemon} user the {@linkcode Pokemon} that used the move + * @param target n/a + * @param move n/a + * @param args n/a + * @returns whether the effect was applied + */ + override apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean { + if (!super.apply(user, target, move, args)) { + return false; + } + + const firstStat = user.getStat(this.statToSwitch, false); + const secondStat = user.getStat(this.statToSwitchWith, false); + + user.setStat(this.statToSwitch, secondStat, false); + user.setStat(this.statToSwitchWith, firstStat, false); + + user.scene.queueMessage(i18next.t("moveTriggers:shiftedStats", { + pokemonName: getPokemonNameWithAffix(user), + statToSwitch: i18next.t(getStatKey(this.statToSwitch)), + statToSwitchWith: i18next.t(getStatKey(this.statToSwitchWith)) + })); + + return true; + } + + /** + * Encourages the user to use the move if the stat to switch with is greater than the stat to switch. + * @param {Pokemon} user the {@linkcode Pokemon} that used the move + * @param target n/a + * @param move n/a + * @returns number of points to add to the user's benefit score + */ + override getUserBenefitScore(user: Pokemon, target: Pokemon, move: Move): integer { + return user.getStat(this.statToSwitchWith, false) > user.getStat(this.statToSwitch, false) ? 10 : 0; + } +} + /** * Attribute used for status moves, namely Power Split and Guard Split, * that take the average of a user's and target's corresponding @@ -8894,7 +8949,8 @@ export function initMoves() { new AttackMove(Moves.PSYSHIELD_BASH, Type.PSYCHIC, MoveCategory.PHYSICAL, 70, 90, 10, 100, 0, 8) .attr(StatStageChangeAttr, [ Stat.DEF ], 1, true), new SelfStatusMove(Moves.POWER_SHIFT, Type.NORMAL, -1, 10, -1, 0, 8) - .unimplemented(), + .target(MoveTarget.USER) + .attr(ShiftStatAttr, Stat.ATK, Stat.DEF), new AttackMove(Moves.STONE_AXE, Type.ROCK, MoveCategory.PHYSICAL, 65, 90, 15, 100, 0, 8) .attr(AddArenaTrapTagHitAttr, ArenaTagType.STEALTH_ROCK) .slicingMove(), diff --git a/src/locales/en/move-trigger.json b/src/locales/en/move-trigger.json index e70fb9dcfb7..867905c5a9f 100644 --- a/src/locales/en/move-trigger.json +++ b/src/locales/en/move-trigger.json @@ -7,6 +7,7 @@ "switchedStat": "{{pokemonName}} switched {{stat}} with its target!", "sharedGuard": "{{pokemonName}} shared its guard with the target!", "sharedPower": "{{pokemonName}} shared its power with the target!", + "shiftedStats": "{{pokemonName}} switched its {{statToSwitch}} and {{statToSwitchWith}}!", "goingAllOutForAttack": "{{pokemonName}} is going all out for this attack!", "regainedHealth": "{{pokemonName}} regained\nhealth!", "keptGoingAndCrashed": "{{pokemonName}} kept going\nand crashed!", diff --git a/src/test/moves/power_shift.test.ts b/src/test/moves/power_shift.test.ts new file mode 100644 index 00000000000..350041d9e4e --- /dev/null +++ b/src/test/moves/power_shift.test.ts @@ -0,0 +1,64 @@ +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import { SPLASH_ONLY } from "#test/utils/testUtils"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Moves - Power Shift", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 20 * 1000; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .moveset([Moves.POWER_SHIFT, Moves.BULK_UP]) + .battleType("single") + .ability(Abilities.BALL_FETCH) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(SPLASH_ONLY); + }); + + it("switches the user's raw Attack stat with its raw Defense stat", async () => { + await game.classicMode.startBattle([Species.MAGIKARP]); + + const playerPokemon = game.scene.getPlayerPokemon()!; + + playerPokemon.setStat(Stat.ATK, 10, false); + playerPokemon.setStat(Stat.DEF, 20, false); + + game.move.select(Moves.BULK_UP); + + await game.phaseInterceptor.to("TurnEndPhase"); + + // Stat stages are increased by 1 + expect(playerPokemon.getStatStageMultiplier(Stat.ATK)).toBe(1.5); + expect(playerPokemon.getStatStageMultiplier(Stat.DEF)).toBe(1.5); + + await game.toNextTurn(); + + game.move.select(Moves.POWER_SHIFT); + + await game.phaseInterceptor.to("TurnEndPhase"); + + // Effective stats are calculated correctly + expect(playerPokemon.getEffectiveStat(Stat.ATK)).toBe(30); + expect(playerPokemon.getEffectiveStat(Stat.DEF)).toBe(15); + // Raw stats are swapped + expect(playerPokemon.getStat(Stat.ATK, false)).toBe(20); + expect(playerPokemon.getStat(Stat.DEF, false)).toBe(10); + }, TIMEOUT); +}); From 11d912bad8f2ec36b36d7151afa5e3e649e2b834 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Mon, 9 Sep 2024 09:55:11 -0700 Subject: [PATCH 14/30] [Dev] Make `OPP_MOVESET_OVERRIDE` fully override the enemy's moveset (#4062) * Make `OPP_MOVESET_OVERRIDE` fully override the enemy's moveset * Update tests with new override behavior * Fix tests * Fix another test * Move overrides no longer required to be arrays * Remove `SPLASH_ONLY` test utility variable * Update moveset override helper functions * Missed some tests --- src/field/pokemon.ts | 10 ++- src/overrides.ts | 4 +- src/test/abilities/aura_break.test.ts | 3 +- src/test/abilities/battery.test.ts | 3 +- src/test/abilities/beast_boost.test.ts | 5 +- src/test/abilities/contrary.test.ts | 8 +- src/test/abilities/costar.test.ts | 3 +- src/test/abilities/dancer.test.ts | 2 +- src/test/abilities/disguise.test.ts | 7 +- src/test/abilities/dry_skin.test.ts | 80 ++++++++----------- src/test/abilities/flash_fire.test.ts | 13 ++- src/test/abilities/flower_gift.test.ts | 7 +- src/test/abilities/forecast.test.ts | 7 +- src/test/abilities/galvanize.test.ts | 3 +- src/test/abilities/gulp_missile.test.ts | 19 +++-- src/test/abilities/heatproof.test.ts | 3 +- src/test/abilities/hustle.test.ts | 3 +- src/test/abilities/hyper_cutter.test.ts | 3 +- src/test/abilities/imposter.test.ts | 7 +- src/test/abilities/intimidate.test.ts | 5 +- src/test/abilities/libero.test.ts | 3 +- src/test/abilities/magic_guard.test.ts | 3 +- src/test/abilities/moody.test.ts | 5 +- src/test/abilities/moxie.test.ts | 3 +- src/test/abilities/parental_bond.test.ts | 7 +- src/test/abilities/pastel_veil.test.ts | 3 +- src/test/abilities/power_spot.test.ts | 3 +- src/test/abilities/protean.test.ts | 3 +- src/test/abilities/quick_draw.test.ts | 4 +- src/test/abilities/sand_spit.test.ts | 4 +- src/test/abilities/sap_sipper.test.ts | 11 ++- src/test/abilities/simple.test.ts | 8 +- src/test/abilities/steely_spirit.test.ts | 3 +- src/test/abilities/sweet_veil.test.ts | 5 +- src/test/abilities/tera_shell.test.ts | 8 +- src/test/abilities/wind_power.test.ts | 3 +- src/test/abilities/wind_rider.test.ts | 3 +- src/test/abilities/wonder_skin.test.ts | 3 +- src/test/abilities/zero_to_hero.test.ts | 5 +- src/test/arena/arena_gravity.test.ts | 3 +- src/test/arena/weather_fog.test.ts | 2 +- src/test/arena/weather_hail.test.ts | 5 +- src/test/arena/weather_sandstorm.test.ts | 5 +- src/test/battle/battle.test.ts | 3 +- src/test/battle/damage_calculation.test.ts | 3 +- src/test/battle/double_battle.test.ts | 3 +- src/test/battle/inverse_battle.test.ts | 3 +- src/test/boss-pokemon.test.ts | 3 +- src/test/evolution.test.ts | 5 +- src/test/final_boss.test.ts | 3 +- src/test/items/dire_hit.test.ts | 3 +- .../double_battle_chance_booster.test.ts | 3 +- src/test/items/grip_claw.test.ts | 3 +- src/test/items/scope_lens.test.ts | 3 +- .../items/temp_stat_stage_booster.test.ts | 3 +- src/test/moves/alluring_voice.test.ts | 2 +- src/test/moves/baton_pass.test.ts | 10 ++- src/test/moves/beak_blast.test.ts | 6 +- src/test/moves/beat_up.test.ts | 2 +- src/test/moves/belly_drum.test.ts | 3 +- src/test/moves/burning_jealousy.test.ts | 7 +- src/test/moves/clangorous_soul.test.ts | 3 +- src/test/moves/crafty_shield.test.ts | 6 +- src/test/moves/disable.test.ts | 7 +- src/test/moves/dragon_cheer.test.ts | 3 +- src/test/moves/dragon_rage.test.ts | 3 +- src/test/moves/dragon_tail.test.ts | 7 +- src/test/moves/fake_out.test.ts | 3 +- src/test/moves/fillet_away.test.ts | 3 +- src/test/moves/fissure.test.ts | 3 +- src/test/moves/flame_burst.test.ts | 2 +- src/test/moves/flower_shield.test.ts | 3 +- src/test/moves/focus_punch.test.ts | 7 +- src/test/moves/foresight.test.ts | 5 +- src/test/moves/freeze_dry.test.ts | 5 +- src/test/moves/freezy_frost.test.ts | 3 +- src/test/moves/gastro_acid.test.ts | 3 +- src/test/moves/gigaton_hammer.test.ts | 3 +- src/test/moves/glaive_rush.test.ts | 10 +-- src/test/moves/growth.test.ts | 3 +- src/test/moves/guard_split.test.ts | 5 +- src/test/moves/guard_swap.test.ts | 2 +- src/test/moves/hard_press.test.ts | 3 +- src/test/moves/haze.test.ts | 3 +- src/test/moves/hyper_beam.test.ts | 2 +- src/test/moves/jaw_lock.test.ts | 5 +- src/test/moves/lash_out.test.ts | 2 +- src/test/moves/lucky_chant.test.ts | 4 +- src/test/moves/lunar_blessing.test.ts | 3 +- src/test/moves/make_it_rain.test.ts | 3 +- src/test/moves/mat_block.test.ts | 4 +- src/test/moves/miracle_eye.test.ts | 3 +- src/test/moves/multi_target.test.ts | 3 +- src/test/moves/octolock.test.ts | 3 +- src/test/moves/parting_shot.test.ts | 5 +- src/test/moves/power_split.test.ts | 5 +- src/test/moves/power_swap.test.ts | 2 +- src/test/moves/protect.test.ts | 10 +-- src/test/moves/quick_guard.test.ts | 8 +- src/test/moves/rollout.test.ts | 3 +- src/test/moves/safeguard.test.ts | 10 ++- src/test/moves/shell_trap.test.ts | 9 +-- src/test/moves/speed_swap.test.ts | 3 +- src/test/moves/spikes.test.ts | 3 +- src/test/moves/spit_up.test.ts | 3 +- src/test/moves/stockpile.test.ts | 3 +- src/test/moves/swallow.test.ts | 3 +- src/test/moves/tail_whip.test.ts | 3 +- src/test/moves/tailwind.test.ts | 3 +- src/test/moves/tera_blast.test.ts | 3 +- src/test/moves/thunder_wave.test.ts | 3 +- src/test/moves/tidy_up.test.ts | 3 +- src/test/moves/transform.test.ts | 5 +- src/test/moves/u_turn.test.ts | 3 +- src/test/moves/wide_guard.test.ts | 8 +- src/test/reload.test.ts | 3 +- src/test/ui/type-hints.test.ts | 5 +- src/test/utils/helpers/overridesHelper.ts | 10 ++- src/test/utils/testUtils.ts | 4 - 119 files changed, 260 insertions(+), 352 deletions(-) diff --git a/src/field/pokemon.ts b/src/field/pokemon.ts index 01d728d6de0..4bc4aca448c 100644 --- a/src/field/pokemon.ts +++ b/src/field/pokemon.ts @@ -984,10 +984,16 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container { : this.moveset; // Overrides moveset based on arrays specified in overrides.ts - const overrideArray: Array = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE; + let overrideArray: Moves | Array = this.isPlayer() ? Overrides.MOVESET_OVERRIDE : Overrides.OPP_MOVESET_OVERRIDE; + if (!Array.isArray(overrideArray)) { + overrideArray = [overrideArray]; + } if (overrideArray.length > 0) { + if (!this.isPlayer()) { + this.moveset = []; + } overrideArray.forEach((move: Moves, index: number) => { - const ppUsed = this.moveset[index]?.ppUsed || 0; + const ppUsed = this.moveset[index]?.ppUsed ?? 0; this.moveset[index] = new PokemonMove(move, Math.min(ppUsed, allMoves[move].pp)); }); } diff --git a/src/overrides.ts b/src/overrides.ts index 48c118b55bc..d1597dfdee8 100644 --- a/src/overrides.ts +++ b/src/overrides.ts @@ -98,7 +98,7 @@ class DefaultOverrides { readonly PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; readonly STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; readonly GENDER_OVERRIDE: Gender | null = null; - readonly MOVESET_OVERRIDE: Array = []; + readonly MOVESET_OVERRIDE: Moves | Array = []; readonly SHINY_OVERRIDE: boolean = false; readonly VARIANT_OVERRIDE: Variant = 0; @@ -111,7 +111,7 @@ class DefaultOverrides { readonly OPP_PASSIVE_ABILITY_OVERRIDE: Abilities = Abilities.NONE; readonly OPP_STATUS_OVERRIDE: StatusEffect = StatusEffect.NONE; readonly OPP_GENDER_OVERRIDE: Gender | null = null; - readonly OPP_MOVESET_OVERRIDE: Array = []; + readonly OPP_MOVESET_OVERRIDE: Moves | Array = []; readonly OPP_SHINY_OVERRIDE: boolean = false; readonly OPP_VARIANT_OVERRIDE: Variant = 0; readonly OPP_IVS_OVERRIDE: number | number[] = []; diff --git a/src/test/abilities/aura_break.test.ts b/src/test/abilities/aura_break.test.ts index 0fb2212d817..422ac5178c1 100644 --- a/src/test/abilities/aura_break.test.ts +++ b/src/test/abilities/aura_break.test.ts @@ -3,7 +3,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -27,7 +26,7 @@ describe("Abilities - Aura Break", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.moveset([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.AURA_BREAK); game.override.enemySpecies(Species.SHUCKLE); }); diff --git a/src/test/abilities/battery.test.ts b/src/test/abilities/battery.test.ts index 020866509d6..cd02ed0c4eb 100644 --- a/src/test/abilities/battery.test.ts +++ b/src/test/abilities/battery.test.ts @@ -5,7 +5,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -31,7 +30,7 @@ describe("Abilities - Battery", () => { game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("raises the power of allies' special moves by 30%", async () => { diff --git a/src/test/abilities/beast_boost.test.ts b/src/test/abilities/beast_boost.test.ts index 05645a1231d..26bae7b8838 100644 --- a/src/test/abilities/beast_boost.test.ts +++ b/src/test/abilities/beast_boost.test.ts @@ -4,7 +4,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -31,7 +30,7 @@ describe("Abilities - Beast Boost", () => { .ability(Abilities.BEAST_BOOST) .startingLevel(2000) .moveset([ Moves.FLAMETHROWER ]) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("should prefer highest stat to boost its corresponding stat stage by 1 when winning a battle", async() => { @@ -51,7 +50,7 @@ describe("Abilities - Beast Boost", () => { }, 20000); it("should use in-battle overriden stats when determining the stat stage to raise by 1", async() => { - game.override.enemyMoveset(new Array(4).fill(Moves.GUARD_SPLIT)); + game.override.enemyMoveset([Moves.GUARD_SPLIT]); await game.classicMode.startBattle([Species.SLOWBRO]); diff --git a/src/test/abilities/contrary.test.ts b/src/test/abilities/contrary.test.ts index 19ecc7e0240..95a209395dc 100644 --- a/src/test/abilities/contrary.test.ts +++ b/src/test/abilities/contrary.test.ts @@ -1,10 +1,10 @@ -import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Contrary", () => { let phaserGame: Phaser.Game; @@ -27,7 +27,7 @@ describe("Abilities - Contrary", () => { .enemySpecies(Species.BULBASAUR) .enemyAbility(Abilities.CONTRARY) .ability(Abilities.INTIMIDATE) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("should invert stat changes when applied", async() => { diff --git a/src/test/abilities/costar.test.ts b/src/test/abilities/costar.test.ts index 96ec775f2a0..794bed0d3cf 100644 --- a/src/test/abilities/costar.test.ts +++ b/src/test/abilities/costar.test.ts @@ -5,7 +5,6 @@ import { Species } from "#app/enums/species"; import { CommandPhase } from "#app/phases/command-phase"; import { MessagePhase } from "#app/phases/message-phase"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; @@ -30,7 +29,7 @@ describe("Abilities - COSTAR", () => { game.override.battleType("double"); game.override.ability(Abilities.COSTAR); game.override.moveset([Moves.SPLASH, Moves.NASTY_PLOT]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); diff --git a/src/test/abilities/dancer.test.ts b/src/test/abilities/dancer.test.ts index d80f497f8b2..ec5ce53f4c3 100644 --- a/src/test/abilities/dancer.test.ts +++ b/src/test/abilities/dancer.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Dancer", () => { .moveset([Moves.SWORDS_DANCE, Moves.SPLASH]) .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.DANCER) - .enemyMoveset(Array(4).fill(Moves.VICTORY_DANCE)); + .enemyMoveset([Moves.VICTORY_DANCE]); }); // Reference Link: https://bulbapedia.bulbagarden.net/wiki/Dancer_(Ability) diff --git a/src/test/abilities/disguise.test.ts b/src/test/abilities/disguise.test.ts index ef145262954..fa7f26d2716 100644 --- a/src/test/abilities/disguise.test.ts +++ b/src/test/abilities/disguise.test.ts @@ -6,7 +6,6 @@ import { StatusEffect } from "#app/data/status-effect"; import { Stat } from "#enums/stat"; import GameManager from "#test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -31,7 +30,7 @@ describe("Abilities - Disguise", () => { game.override .battleType("single") .enemySpecies(Species.MIMIKYU) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.REGIELEKI) .moveset([Moves.SHADOW_SNEAK, Moves.VACUUM_WAVE, Moves.TOXIC_THREAD, Moves.SPLASH]); }, TIMEOUT); @@ -108,7 +107,7 @@ describe("Abilities - Disguise", () => { }, TIMEOUT); it("persists form change when switched out", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); game.override.starterSpecies(0); await game.classicMode.startBattle([ Species.MIMIKYU, Species.FURRET ]); @@ -194,7 +193,7 @@ describe("Abilities - Disguise", () => { }, TIMEOUT); it("doesn't faint twice when fainting due to Disguise break damage, nor prevent faint from Disguise break damage if using Endure", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.ENDURE)); + game.override.enemyMoveset([Moves.ENDURE]); await game.classicMode.startBattle(); const mimikyu = game.scene.getEnemyPokemon()!; diff --git a/src/test/abilities/dry_skin.test.ts b/src/test/abilities/dry_skin.test.ts index b337e4d96f7..1af8831f25b 100644 --- a/src/test/abilities/dry_skin.test.ts +++ b/src/test/abilities/dry_skin.test.ts @@ -1,9 +1,7 @@ import { Species } from "#app/enums/species"; -import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -23,63 +21,56 @@ describe("Abilities - Dry Skin", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.battleType("single"); - game.override.disableCrits(); - game.override.enemyAbility(Abilities.DRY_SKIN); - game.override.enemyMoveset(SPLASH_ONLY); - game.override.enemySpecies(Species.CHARMANDER); - game.override.ability(Abilities.UNNERVE); - game.override.starterSpecies(Species.CHANDELURE); + game.override + .battleType("single") + .disableCrits() + .enemyAbility(Abilities.DRY_SKIN) + .enemyMoveset(Moves.SPLASH) + .enemySpecies(Species.CHARMANDER) + .ability(Abilities.BALL_FETCH) + .moveset([Moves.SUNNY_DAY, Moves.RAIN_DANCE, Moves.SPLASH, Moves.WATER_GUN]) + .starterSpecies(Species.CHANDELURE); }); it("during sunlight, lose 1/8 of maximum health at the end of each turn", async () => { - game.override.moveset([Moves.SUNNY_DAY, Moves.SPLASH]); - - await game.startBattle(); + await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; - expect(enemy).not.toBe(undefined); // first turn - let previousEnemyHp = enemy.hp; game.move.select(Moves.SUNNY_DAY); - await game.phaseInterceptor.to(TurnEndPhase); - expect(enemy.hp).toBeLessThan(previousEnemyHp); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); // second turn - previousEnemyHp = enemy.hp; + enemy.hp = enemy.getMaxHp(); game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - expect(enemy.hp).toBeLessThan(previousEnemyHp); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.hp).toBeLessThan(enemy.getMaxHp()); }); it("during rain, gain 1/8 of maximum health at the end of each turn", async () => { - game.override.moveset([Moves.RAIN_DANCE, Moves.SPLASH]); - - await game.startBattle(); + await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; - expect(enemy).not.toBe(undefined); enemy.hp = 1; // first turn - let previousEnemyHp = enemy.hp; game.move.select(Moves.RAIN_DANCE); - await game.phaseInterceptor.to(TurnEndPhase); - expect(enemy.hp).toBeGreaterThan(previousEnemyHp); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.hp).toBeGreaterThan(1); // second turn - previousEnemyHp = enemy.hp; + enemy.hp = 1; game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to(TurnEndPhase); - expect(enemy.hp).toBeGreaterThan(previousEnemyHp); + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.hp).toBeGreaterThan(1); }); it("opposing fire attacks do 25% more damage", async () => { game.override.moveset([Moves.FLAMETHROWER]); - - await game.startBattle(); + await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; const initialHP = 1000; @@ -87,72 +78,65 @@ describe("Abilities - Dry Skin", () => { // first turn game.move.select(Moves.FLAMETHROWER); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); const fireDamageTakenWithDrySkin = initialHP - enemy.hp; - expect(enemy.hp > 0); enemy.hp = initialHP; game.override.enemyAbility(Abilities.NONE); // second turn game.move.select(Moves.FLAMETHROWER); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); const fireDamageTakenWithoutDrySkin = initialHP - enemy.hp; expect(fireDamageTakenWithDrySkin).toBeGreaterThan(fireDamageTakenWithoutDrySkin); }); it("opposing water attacks heal 1/4 of maximum health and deal no damage", async () => { - game.override.moveset([Moves.WATER_GUN]); - - await game.startBattle(); + await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; - expect(enemy).not.toBe(undefined); enemy.hp = 1; game.move.select(Moves.WATER_GUN); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.hp).toBeGreaterThan(1); }); it("opposing water attacks do not heal if they were protected from", async () => { - game.override.moveset([Moves.WATER_GUN]); + game.override.enemyMoveset([Moves.PROTECT]); - await game.startBattle(); + await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; - expect(enemy).not.toBe(undefined); enemy.hp = 1; - game.override.enemyMoveset([Moves.PROTECT, Moves.PROTECT, Moves.PROTECT, Moves.PROTECT]); game.move.select(Moves.WATER_GUN); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); expect(enemy.hp).toBe(1); }); it("multi-strike water attacks only heal once", async () => { game.override.moveset([Moves.WATER_GUN, Moves.WATER_SHURIKEN]); - await game.startBattle(); + await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; - expect(enemy).not.toBe(undefined); enemy.hp = 1; // first turn game.move.select(Moves.WATER_SHURIKEN); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); const healthGainedFromWaterShuriken = enemy.hp - 1; enemy.hp = 1; // second turn game.move.select(Moves.WATER_GUN); - await game.phaseInterceptor.to(TurnEndPhase); + await game.phaseInterceptor.to("TurnEndPhase"); const healthGainedFromWaterGun = enemy.hp - 1; expect(healthGainedFromWaterShuriken).toBe(healthGainedFromWaterGun); diff --git a/src/test/abilities/flash_fire.test.ts b/src/test/abilities/flash_fire.test.ts index de40873998f..c3cf31496ea 100644 --- a/src/test/abilities/flash_fire.test.ts +++ b/src/test/abilities/flash_fire.test.ts @@ -7,7 +7,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -38,7 +37,7 @@ describe("Abilities - Flash Fire", () => { it("immune to Fire-type moves", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY); + game.override.enemyMoveset([Moves.EMBER]).moveset(Moves.SPLASH); await game.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -49,7 +48,7 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("not activate if the Pokémon is protected from the Fire-type move", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset([Moves.PROTECT]); + game.override.enemyMoveset([Moves.EMBER]).moveset([Moves.PROTECT]); await game.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -60,7 +59,7 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("activated by Will-O-Wisp", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.WILL_O_WISP)).moveset(SPLASH_ONLY); + game.override.enemyMoveset([Moves.WILL_O_WISP]).moveset(Moves.SPLASH); await game.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; @@ -75,7 +74,7 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("activated after being frozen", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset(SPLASH_ONLY); + game.override.enemyMoveset([Moves.EMBER]).moveset(Moves.SPLASH); game.override.statusEffect(StatusEffect.FREEZE); await game.startBattle([Species.BLISSEY]); @@ -88,7 +87,7 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("not passing with baton pass", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.EMBER)).moveset([Moves.BATON_PASS]); + game.override.enemyMoveset([Moves.EMBER]).moveset([Moves.BATON_PASS]); await game.startBattle([Species.BLISSEY, Species.CHANSEY]); // ensure use baton pass after enemy moved @@ -104,7 +103,7 @@ describe("Abilities - Flash Fire", () => { }, 20000); it("boosts Fire-type move when the ability is activated", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.FIRE_PLEDGE)).moveset([Moves.EMBER, Moves.SPLASH]); + game.override.enemyMoveset([Moves.FIRE_PLEDGE]).moveset([Moves.EMBER, Moves.SPLASH]); game.override.enemyAbility(Abilities.FLASH_FIRE).ability(Abilities.NONE); await game.startBattle([Species.BLISSEY]); const blissey = game.scene.getPlayerPokemon()!; diff --git a/src/test/abilities/flower_gift.test.ts b/src/test/abilities/flower_gift.test.ts index de07bd29478..256b61c6fea 100644 --- a/src/test/abilities/flower_gift.test.ts +++ b/src/test/abilities/flower_gift.test.ts @@ -5,7 +5,6 @@ import { WeatherType } from "#app/enums/weather-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -44,7 +43,7 @@ describe("Abilities - Flower Gift", () => { game.override .moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SKILL_SWAP]) .enemySpecies(Species.MAGIKARP) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); }); @@ -92,7 +91,7 @@ describe("Abilities - Flower Gift", () => { }); it("reverts to Overcast Form when the Pokémon loses Flower Gift, changes form under Harsh Sunlight/Sunny when it regains it", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SKILL_SWAP)).weather(WeatherType.HARSH_SUN); + game.override.enemyMoveset([Moves.SKILL_SWAP]).weather(WeatherType.HARSH_SUN); await game.classicMode.startBattle([Species.CHERRIM]); @@ -111,7 +110,7 @@ describe("Abilities - Flower Gift", () => { }); it("reverts to Overcast Form when the Flower Gift is suppressed, changes form under Harsh Sunlight/Sunny when it regains it", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)).weather(WeatherType.HARSH_SUN); + game.override.enemyMoveset([Moves.GASTRO_ACID]).weather(WeatherType.HARSH_SUN); await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]); diff --git a/src/test/abilities/forecast.test.ts b/src/test/abilities/forecast.test.ts index 78453c5f4d2..c1eb3600b8b 100644 --- a/src/test/abilities/forecast.test.ts +++ b/src/test/abilities/forecast.test.ts @@ -10,7 +10,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -67,7 +66,7 @@ describe("Abilities - Forecast", () => { game.override .moveset([Moves.SPLASH, Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.TACKLE]) .enemySpecies(Species.MAGIKARP) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); }); @@ -229,7 +228,7 @@ describe("Abilities - Forecast", () => { }); it("reverts to Normal Form when Forecast is suppressed, changes form to match the weather when it regains it", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)).weather(WeatherType.RAIN); + game.override.enemyMoveset([Moves.GASTRO_ACID]).weather(WeatherType.RAIN); await game.startBattle([Species.CASTFORM, Species.PIKACHU]); const castform = game.scene.getPlayerPokemon()!; @@ -260,7 +259,7 @@ describe("Abilities - Forecast", () => { }); it("does not change Castform's form until after Stealth Rock deals damage", async () => { - game.override.weather(WeatherType.RAIN).enemyMoveset(Array(4).fill(Moves.STEALTH_ROCK)); + game.override.weather(WeatherType.RAIN).enemyMoveset([Moves.STEALTH_ROCK]); await game.startBattle([Species.PIKACHU, Species.CASTFORM]); // First turn - set up stealth rock diff --git a/src/test/abilities/galvanize.test.ts b/src/test/abilities/galvanize.test.ts index 4b0ddc14d7c..f81b854180a 100644 --- a/src/test/abilities/galvanize.test.ts +++ b/src/test/abilities/galvanize.test.ts @@ -6,7 +6,6 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { HitResult } from "#app/field/pokemon"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -36,7 +35,7 @@ describe("Abilities - Galvanize", () => { .moveset([Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES]) .enemySpecies(Species.DUSCLOPS) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyLevel(100); }); diff --git a/src/test/abilities/gulp_missile.test.ts b/src/test/abilities/gulp_missile.test.ts index 286c3af1c56..ac0efd8e8d1 100644 --- a/src/test/abilities/gulp_missile.test.ts +++ b/src/test/abilities/gulp_missile.test.ts @@ -11,7 +11,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { Stat } from "#enums/stat"; describe("Abilities - Gulp Missile", () => { @@ -49,7 +48,7 @@ describe("Abilities - Gulp Missile", () => { .moveset([Moves.SURF, Moves.DIVE, Moves.SPLASH]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyLevel(5); }); @@ -108,7 +107,7 @@ describe("Abilities - Gulp Missile", () => { }); it("deals 1/4 of the attacker's maximum HP when hit by a damaging attack", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.startBattle([Species.CRAMORANT]); const enemy = game.scene.getEnemyPokemon()!; @@ -121,7 +120,7 @@ describe("Abilities - Gulp Missile", () => { }); it("does not have any effect when hit by non-damaging attack", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TAIL_WHIP)); + game.override.enemyMoveset([Moves.TAIL_WHIP]); await game.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -140,7 +139,7 @@ describe("Abilities - Gulp Missile", () => { }); it("lowers attacker's DEF stat stage by 1 when hit in Gulping form", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -164,7 +163,7 @@ describe("Abilities - Gulp Missile", () => { }); it("paralyzes the enemy when hit in Gorging form", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -188,7 +187,7 @@ describe("Abilities - Gulp Missile", () => { }); it("does not activate the ability when underwater", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SURF)); + game.override.enemyMoveset([Moves.SURF]); await game.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -201,7 +200,7 @@ describe("Abilities - Gulp Missile", () => { }); it("prevents effect damage but inflicts secondary effect on attacker with Magic Guard", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)).enemyAbility(Abilities.MAGIC_GUARD); + game.override.enemyMoveset([Moves.TACKLE]).enemyAbility(Abilities.MAGIC_GUARD); await game.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -225,7 +224,7 @@ describe("Abilities - Gulp Missile", () => { }); it("cannot be suppressed", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.GASTRO_ACID)); + game.override.enemyMoveset([Moves.GASTRO_ACID]); await game.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; @@ -245,7 +244,7 @@ describe("Abilities - Gulp Missile", () => { }); it("cannot be swapped with another ability", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SKILL_SWAP)); + game.override.enemyMoveset([Moves.SKILL_SWAP]); await game.startBattle([Species.CRAMORANT]); const cramorant = game.scene.getPlayerPokemon()!; diff --git a/src/test/abilities/heatproof.test.ts b/src/test/abilities/heatproof.test.ts index e2a558e6d99..61c406201bd 100644 --- a/src/test/abilities/heatproof.test.ts +++ b/src/test/abilities/heatproof.test.ts @@ -5,7 +5,6 @@ import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -30,7 +29,7 @@ describe("Abilities - Heatproof", () => { .disableCrits() .enemySpecies(Species.CHARMANDER) .enemyAbility(Abilities.HEATPROOF) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyLevel(100) .starterSpecies(Species.CHANDELURE) .ability(Abilities.BALL_FETCH) diff --git a/src/test/abilities/hustle.test.ts b/src/test/abilities/hustle.test.ts index ff96b98c7ac..29cbfdc1a5d 100644 --- a/src/test/abilities/hustle.test.ts +++ b/src/test/abilities/hustle.test.ts @@ -4,7 +4,6 @@ import { Stat } from "#app/enums/stat"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,7 +28,7 @@ describe("Abilities - Hustle", () => { .moveset([ Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE ]) .disableCrits() .battleType("single") - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.SHUCKLE) .enemyAbility(Abilities.BALL_FETCH); }); diff --git a/src/test/abilities/hyper_cutter.test.ts b/src/test/abilities/hyper_cutter.test.ts index 64e04ac2fd3..ec947add939 100644 --- a/src/test/abilities/hyper_cutter.test.ts +++ b/src/test/abilities/hyper_cutter.test.ts @@ -3,7 +3,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -29,7 +28,7 @@ describe("Abilities - Hyper Cutter", () => { .ability(Abilities.BALL_FETCH) .enemySpecies(Species.SHUCKLE) .enemyAbility(Abilities.HYPER_CUTTER) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); // Reference Link: https://bulbapedia.bulbagarden.net/wiki/Hyper_Cutter_(Ability) diff --git a/src/test/abilities/imposter.test.ts b/src/test/abilities/imposter.test.ts index 2857f80632a..27673564aaa 100644 --- a/src/test/abilities/imposter.test.ts +++ b/src/test/abilities/imposter.test.ts @@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; import { Abilities } from "#enums/abilities"; -import { SPLASH_ONLY } from "../utils/testUtils"; // TODO: Add more tests once Imposter is fully implemented describe("Abilities - Imposter", () => { @@ -31,9 +30,9 @@ describe("Abilities - Imposter", () => { .enemyLevel(200) .enemyAbility(Abilities.BEAST_BOOST) .enemyPassiveAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .ability(Abilities.IMPOSTER) - .moveset(SPLASH_ONLY); + .moveset(Moves.SPLASH); }); it("should copy species, ability, gender, all stats except HP, all stat stages, moveset, and types of target", async () => { @@ -77,7 +76,7 @@ describe("Abilities - Imposter", () => { }, 20000); it("should copy in-battle overridden stats", async () => { - game.override.enemyMoveset(new Array(4).fill(Moves.POWER_SPLIT)); + game.override.enemyMoveset([Moves.POWER_SPLIT]); await game.startBattle([ Species.DITTO diff --git a/src/test/abilities/intimidate.test.ts b/src/test/abilities/intimidate.test.ts index f90ba6c0e1e..d4c097022df 100644 --- a/src/test/abilities/intimidate.test.ts +++ b/src/test/abilities/intimidate.test.ts @@ -7,7 +7,6 @@ import { getMovePosition } from "#test/utils/gameManagerUtils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; describe("Abilities - Intimidate", () => { let phaserGame: Phaser.Game; @@ -31,7 +30,7 @@ describe("Abilities - Intimidate", () => { .enemyPassiveAbility(Abilities.HYDRATION) .ability(Abilities.INTIMIDATE) .startingWave(3) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("should lower ATK stat stage by 1 of enemy Pokemon on entry and player switch", async () => { @@ -108,7 +107,7 @@ describe("Abilities - Intimidate", () => { it("should lower ATK stat stage by 1 for every switch", async () => { game.override.moveset([Moves.SPLASH]) - .enemyMoveset(new Array(4).fill(Moves.VOLT_SWITCH)) + .enemyMoveset([Moves.VOLT_SWITCH]) .startingWave(5); await game.classicMode.startBattle([ Species.MIGHTYENA, Species.POOCHYENA ]); diff --git a/src/test/abilities/libero.test.ts b/src/test/abilities/libero.test.ts index 7895e7de6bf..51f182d5401 100644 --- a/src/test/abilities/libero.test.ts +++ b/src/test/abilities/libero.test.ts @@ -9,7 +9,6 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; @@ -183,7 +182,7 @@ describe("Abilities - Libero", () => { "ability applies correctly even if the pokemon's move misses", async () => { game.override.moveset([Moves.TACKLE]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/magic_guard.test.ts b/src/test/abilities/magic_guard.test.ts index 64c1746c7d9..4b3fb0ba985 100644 --- a/src/test/abilities/magic_guard.test.ts +++ b/src/test/abilities/magic_guard.test.ts @@ -8,7 +8,6 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -39,7 +38,7 @@ describe("Abilities - Magic Guard", () => { /** Enemy Pokemon overrides */ game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyLevel(100); }); diff --git a/src/test/abilities/moody.test.ts b/src/test/abilities/moody.test.ts index 5c46ea68ec5..166f69b0fe3 100644 --- a/src/test/abilities/moody.test.ts +++ b/src/test/abilities/moody.test.ts @@ -3,7 +3,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,8 +28,8 @@ describe("Abilities - Moody", () => { .enemySpecies(Species.RATTATA) .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.MOODY) - .enemyMoveset(SPLASH_ONLY) - .moveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH) + .moveset(Moves.SPLASH); }); it("should increase one stat stage by 2 and decrease a different stat stage by 1", diff --git a/src/test/abilities/moxie.test.ts b/src/test/abilities/moxie.test.ts index e713d78f39e..5f337fedabb 100644 --- a/src/test/abilities/moxie.test.ts +++ b/src/test/abilities/moxie.test.ts @@ -5,7 +5,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { BattlerIndex } from "#app/battle"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { VictoryPhase } from "#app/phases/victory-phase"; @@ -34,7 +33,7 @@ describe("Abilities - Moxie", () => { game.override.ability(Abilities.MOXIE); game.override.startingLevel(2000); game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("should raise ATK stat stage by 1 when winning a battle", async() => { diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 81a30524a5e..2ad3f9e3f5c 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -34,7 +33,7 @@ describe("Abilities - Parental Bond", () => { game.override.ability(Abilities.PARENTAL_BOND); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.FUR_COAT); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.startingLevel(100); game.override.enemyLevel(100); }); @@ -175,7 +174,7 @@ describe("Abilities - Parental Bond", () => { "should not apply multiplier to counter moves", async () => { game.override.moveset([Moves.COUNTER]); - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.classicMode.startBattle([Species.SHUCKLE]); @@ -465,7 +464,7 @@ describe("Abilities - Parental Bond", () => { "should not cause user to hit into King's Shield more than once", async () => { game.override.moveset([Moves.TACKLE]); - game.override.enemyMoveset(Array(4).fill(Moves.KINGS_SHIELD)); + game.override.enemyMoveset([Moves.KINGS_SHIELD]); await game.classicMode.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/pastel_veil.test.ts b/src/test/abilities/pastel_veil.test.ts index ba90c7e3b3f..31490aab143 100644 --- a/src/test/abilities/pastel_veil.test.ts +++ b/src/test/abilities/pastel_veil.test.ts @@ -8,7 +8,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Pastel Veil", () => { let phaserGame: Phaser.Game; @@ -31,7 +30,7 @@ describe("Abilities - Pastel Veil", () => { .moveset([Moves.TOXIC_THREAD, Moves.SPLASH]) .enemyAbility(Abilities.BALL_FETCH) .enemySpecies(Species.SUNKERN) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("prevents the user and its allies from being afflicted by poison", async () => { diff --git a/src/test/abilities/power_spot.test.ts b/src/test/abilities/power_spot.test.ts index b83284c0bac..6d349a1a3f9 100644 --- a/src/test/abilities/power_spot.test.ts +++ b/src/test/abilities/power_spot.test.ts @@ -5,7 +5,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,7 +28,7 @@ describe("Abilities - Power Spot", () => { game = new GameManager(phaserGame); game.override.battleType("double"); game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); }); diff --git a/src/test/abilities/protean.test.ts b/src/test/abilities/protean.test.ts index 6ecabbfade0..4be58a677a6 100644 --- a/src/test/abilities/protean.test.ts +++ b/src/test/abilities/protean.test.ts @@ -9,7 +9,6 @@ import { Biome } from "#enums/biome"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; @@ -183,7 +182,7 @@ describe("Abilities - Protean", () => { "ability applies correctly even if the pokemon's move misses", async () => { game.override.moveset([Moves.TACKLE]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); await game.startBattle([Species.MAGIKARP]); diff --git a/src/test/abilities/quick_draw.test.ts b/src/test/abilities/quick_draw.test.ts index 00d344ed333..a02ee5cf56a 100644 --- a/src/test/abilities/quick_draw.test.ts +++ b/src/test/abilities/quick_draw.test.ts @@ -32,7 +32,7 @@ describe("Abilities - Quick Draw", () => { game.override.enemyLevel(100); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); vi.spyOn(allAbilities[Abilities.QUICK_DRAW].getAttrs(BypassSpeedChanceAbAttr)[0], "chance", "get").mockReturnValue(100); }); @@ -76,7 +76,7 @@ describe("Abilities - Quick Draw", () => { ); test("does not increase priority", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.EXTREME_SPEED)); + game.override.enemyMoveset([Moves.EXTREME_SPEED]); await game.startBattle(); diff --git a/src/test/abilities/sand_spit.test.ts b/src/test/abilities/sand_spit.test.ts index 041e20faf7f..add13ede296 100644 --- a/src/test/abilities/sand_spit.test.ts +++ b/src/test/abilities/sand_spit.test.ts @@ -35,7 +35,7 @@ describe("Abilities - Sand Spit", () => { }); it("should trigger when hit with damaging move", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.startBattle(); game.move.select(Moves.SPLASH); @@ -45,7 +45,7 @@ describe("Abilities - Sand Spit", () => { }, 20000); it("should not trigger when targetted with status moves", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + game.override.enemyMoveset([Moves.GROWL]); await game.startBattle(); game.move.select(Moves.COIL); diff --git a/src/test/abilities/sap_sipper.test.ts b/src/test/abilities/sap_sipper.test.ts index 2d70ede3530..5e8cac74c95 100644 --- a/src/test/abilities/sap_sipper.test.ts +++ b/src/test/abilities/sap_sipper.test.ts @@ -9,7 +9,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; // See also: TypeImmunityAbAttr describe("Abilities - Sap Sipper", () => { @@ -37,7 +36,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemySpecies(Species.DUSKULL); game.override.enemyAbility(enemyAbility); @@ -59,7 +58,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -80,7 +79,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -100,7 +99,7 @@ describe("Abilities - Sap Sipper", () => { const enemyAbility = Abilities.SAP_SIPPER; game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(enemyAbility); @@ -123,7 +122,7 @@ describe("Abilities - Sap Sipper", () => { game.override.moveset([ moveToUse ]); game.override.ability(ability); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemySpecies(Species.RATTATA); game.override.enemyAbility(Abilities.NONE); diff --git a/src/test/abilities/simple.test.ts b/src/test/abilities/simple.test.ts index 4310c5d45d1..e5ca474d7c3 100644 --- a/src/test/abilities/simple.test.ts +++ b/src/test/abilities/simple.test.ts @@ -1,10 +1,10 @@ -import { Stat } from "#enums/stat"; -import GameManager from "#test/utils/gameManager"; +import { Moves } from "#app/enums/moves"; import { Abilities } from "#enums/abilities"; import { Species } from "#enums/species"; +import { Stat } from "#enums/stat"; +import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Abilities - Simple", () => { let phaserGame: Phaser.Game; @@ -27,7 +27,7 @@ describe("Abilities - Simple", () => { .enemySpecies(Species.BULBASAUR) .enemyAbility(Abilities.SIMPLE) .ability(Abilities.INTIMIDATE) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("should double stat changes when applied", async() => { diff --git a/src/test/abilities/steely_spirit.test.ts b/src/test/abilities/steely_spirit.test.ts index 7aaa0a42ae3..7b5879555be 100644 --- a/src/test/abilities/steely_spirit.test.ts +++ b/src/test/abilities/steely_spirit.test.ts @@ -4,7 +4,6 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -31,7 +30,7 @@ describe("Abilities - Steely Spirit", () => { game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.moveset([Moves.IRON_HEAD, Moves.SPLASH]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); vi.spyOn(allMoves[moveToCheck], "calculateBattlePower"); }); diff --git a/src/test/abilities/sweet_veil.test.ts b/src/test/abilities/sweet_veil.test.ts index 5de3c7285a9..c2946443245 100644 --- a/src/test/abilities/sweet_veil.test.ts +++ b/src/test/abilities/sweet_veil.test.ts @@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -45,7 +44,7 @@ describe("Abilities - Sweet Veil", () => { }); it("causes Rest to fail when used by the user or its allies", async () => { - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); await game.startBattle([Species.SWIRLIX, Species.MAGIKARP]); game.move.select(Moves.SPLASH); @@ -72,7 +71,7 @@ describe("Abilities - Sweet Veil", () => { game.override.enemySpecies(Species.PIKACHU); game.override.enemyLevel(5); game.override.startingLevel(5); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); await game.startBattle([Species.SHUCKLE, Species.SHUCKLE, Species.SWIRLIX]); diff --git a/src/test/abilities/tera_shell.test.ts b/src/test/abilities/tera_shell.test.ts index 6a6b7bb252b..2826469f3bf 100644 --- a/src/test/abilities/tera_shell.test.ts +++ b/src/test/abilities/tera_shell.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Tera Shell", () => { .moveset([Moves.SPLASH]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset(Array(4).fill(Moves.MACH_PUNCH)) + .enemyMoveset([Moves.MACH_PUNCH]) .startingLevel(100) .enemyLevel(100); }); @@ -60,7 +60,7 @@ describe("Abilities - Tera Shell", () => { it( "should not override type immunities", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); await game.classicMode.startBattle([Species.SNORLAX]); @@ -77,7 +77,7 @@ describe("Abilities - Tera Shell", () => { it( "should not override type multipliers less than 0.5x", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.QUICK_ATTACK)); + game.override.enemyMoveset([Moves.QUICK_ATTACK]); await game.classicMode.startBattle([Species.AGGRON]); @@ -94,7 +94,7 @@ describe("Abilities - Tera Shell", () => { it( "should not affect the effectiveness of fixed-damage moves", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.DRAGON_RAGE)); + game.override.enemyMoveset([Moves.DRAGON_RAGE]); await game.classicMode.startBattle([Species.CHARIZARD]); diff --git a/src/test/abilities/wind_power.test.ts b/src/test/abilities/wind_power.test.ts index c944e01b43a..12b8d2f2299 100644 --- a/src/test/abilities/wind_power.test.ts +++ b/src/test/abilities/wind_power.test.ts @@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -28,7 +27,7 @@ describe("Abilities - Wind Power", () => { game.override.enemySpecies(Species.SHIFTRY); game.override.enemyAbility(Abilities.WIND_POWER); game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("it becomes charged when hit by wind moves", async () => { diff --git a/src/test/abilities/wind_rider.test.ts b/src/test/abilities/wind_rider.test.ts index 7a1fee6794a..c917f56e101 100644 --- a/src/test/abilities/wind_rider.test.ts +++ b/src/test/abilities/wind_rider.test.ts @@ -3,7 +3,6 @@ import GameManager from "#test/utils/gameManager"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -28,7 +27,7 @@ describe("Abilities - Wind Rider", () => { .enemySpecies(Species.SHIFTRY) .enemyAbility(Abilities.WIND_RIDER) .moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("takes no damage from wind moves and its ATK stat stage is raised by 1 when hit by one", async () => { diff --git a/src/test/abilities/wonder_skin.test.ts b/src/test/abilities/wonder_skin.test.ts index 0c2aedc8ce8..6ef985fbd42 100644 --- a/src/test/abilities/wonder_skin.test.ts +++ b/src/test/abilities/wonder_skin.test.ts @@ -5,7 +5,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -30,7 +29,7 @@ describe("Abilities - Wonder Skin", () => { game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.WONDER_SKIN); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("lowers accuracy of status moves to 50%", async () => { diff --git a/src/test/abilities/zero_to_hero.test.ts b/src/test/abilities/zero_to_hero.test.ts index 1a9697f974e..eafc32b4c79 100644 --- a/src/test/abilities/zero_to_hero.test.ts +++ b/src/test/abilities/zero_to_hero.test.ts @@ -6,7 +6,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -30,8 +29,8 @@ describe("Abilities - ZERO TO HERO", () => { game = new GameManager(phaserGame); game.override .battleType("single") - .moveset(SPLASH_ONLY) - .enemyMoveset(SPLASH_ONLY) + .moveset(Moves.SPLASH) + .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); }); diff --git a/src/test/arena/arena_gravity.test.ts b/src/test/arena/arena_gravity.test.ts index eda8c687ba1..47b8bf4cf70 100644 --- a/src/test/arena/arena_gravity.test.ts +++ b/src/test/arena/arena_gravity.test.ts @@ -8,7 +8,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Arena - Gravity", () => { let phaserGame: Phaser.Game; @@ -32,7 +31,7 @@ describe("Arena - Gravity", () => { .ability(Abilities.UNNERVE) .enemyAbility(Abilities.BALL_FETCH) .enemySpecies(Species.SHUCKLE) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); // Reference: https://bulbapedia.bulbagarden.net/wiki/Gravity_(move) diff --git a/src/test/arena/weather_fog.test.ts b/src/test/arena/weather_fog.test.ts index b36b0de2e06..b47145e8dd0 100644 --- a/src/test/arena/weather_fog.test.ts +++ b/src/test/arena/weather_fog.test.ts @@ -31,7 +31,7 @@ describe("Weather - Fog", () => { game.override.ability(Abilities.BALL_FETCH); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MAGIKARP); - game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset([Moves.SPLASH]); }); it("move accuracy is multiplied by 90%", async () => { diff --git a/src/test/arena/weather_hail.test.ts b/src/test/arena/weather_hail.test.ts index 75125b3448c..31d20be2ded 100644 --- a/src/test/arena/weather_hail.test.ts +++ b/src/test/arena/weather_hail.test.ts @@ -4,7 +4,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { BattlerIndex } from "#app/battle"; describe("Weather - Hail", () => { @@ -26,8 +25,8 @@ describe("Weather - Hail", () => { game.override .weather(WeatherType.HAIL) .battleType("single") - .moveset(SPLASH_ONLY) - .enemyMoveset(SPLASH_ONLY) + .moveset(Moves.SPLASH) + .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.MAGIKARP); }); diff --git a/src/test/arena/weather_sandstorm.test.ts b/src/test/arena/weather_sandstorm.test.ts index 978774ba4c1..91188de6985 100644 --- a/src/test/arena/weather_sandstorm.test.ts +++ b/src/test/arena/weather_sandstorm.test.ts @@ -4,7 +4,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Weather - Sandstorm", () => { let phaserGame: Phaser.Game; @@ -25,8 +24,8 @@ describe("Weather - Sandstorm", () => { game.override .weather(WeatherType.SANDSTORM) .battleType("single") - .moveset(SPLASH_ONLY) - .enemyMoveset(SPLASH_ONLY) + .moveset(Moves.SPLASH) + .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.MAGIKARP); }); diff --git a/src/test/battle/battle.test.ts b/src/test/battle/battle.test.ts index 25dfbc765bd..6e15bbd99d9 100644 --- a/src/test/battle/battle.test.ts +++ b/src/test/battle/battle.test.ts @@ -25,7 +25,6 @@ import { PlayerGender } from "#enums/player-gender"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Test Battle Phase", () => { let phaserGame: Phaser.Game; @@ -319,7 +318,7 @@ describe("Test Battle Phase", () => { .startingWave(1) .startingLevel(100) .moveset([moveToUse]) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .startingHeldItems([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ACC }]); await game.startBattle(); diff --git a/src/test/battle/damage_calculation.test.ts b/src/test/battle/damage_calculation.test.ts index 9c7c9dc9d3e..89f2bb4c269 100644 --- a/src/test/battle/damage_calculation.test.ts +++ b/src/test/battle/damage_calculation.test.ts @@ -5,7 +5,6 @@ import { ArenaTagType } from "#enums/arena-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -31,7 +30,7 @@ describe("Round Down and Minimun 1 test in Damage Calculation", () => { it("When the user fails to use Jump Kick with Wonder Guard ability, the damage should be 1.", async () => { game.override.enemySpecies(Species.GASTLY); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.starterSpecies(Species.SHEDINJA); game.override.moveset([Moves.JUMP_KICK]); game.override.ability(Abilities.WONDER_GUARD); diff --git a/src/test/battle/double_battle.test.ts b/src/test/battle/double_battle.test.ts index d264a29ef9b..b7a5616d642 100644 --- a/src/test/battle/double_battle.test.ts +++ b/src/test/battle/double_battle.test.ts @@ -4,7 +4,6 @@ import { TurnInitPhase } from "#app/phases/turn-init-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -29,7 +28,7 @@ describe("Double Battles", () => { // double-battle player's pokemon both fainted in same round, then revive one, and next double battle summons two player's pokemon successfully. // (There were bugs that either only summon one when can summon two, player stuck in switchPhase etc) it("3v2 edge case: player summons 2 pokemon on the next battle after being fainted and revived", async () => { - game.override.battleType("double").enemyMoveset(SPLASH_ONLY).moveset(SPLASH_ONLY); + game.override.battleType("double").enemyMoveset(Moves.SPLASH).moveset(Moves.SPLASH); await game.startBattle([ Species.BULBASAUR, Species.CHARIZARD, diff --git a/src/test/battle/inverse_battle.test.ts b/src/test/battle/inverse_battle.test.ts index 2a561a09e5e..d808f71addb 100644 --- a/src/test/battle/inverse_battle.test.ts +++ b/src/test/battle/inverse_battle.test.ts @@ -8,7 +8,6 @@ import { Species } from "#enums/species"; import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; const TIMEOUT = 20 * 1000; @@ -38,7 +37,7 @@ describe("Inverse Battle", () => { .ability(Abilities.BALL_FETCH) .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("Immune types are 2x effective - Thunderbolt against Ground Type", async () => { diff --git a/src/test/boss-pokemon.test.ts b/src/test/boss-pokemon.test.ts index c6fc276551f..8a0a0e01617 100644 --- a/src/test/boss-pokemon.test.ts +++ b/src/test/boss-pokemon.test.ts @@ -2,7 +2,6 @@ import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import GameManager from "./utils/gameManager"; import { Species } from "#app/enums/species"; import { getPokemonSpecies } from "#app/data/pokemon-species"; -import { SPLASH_ONLY } from "./utils/testUtils"; import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { EFFECTIVE_STATS } from "#app/enums/stat"; @@ -33,7 +32,7 @@ describe("Boss Pokemon / Shields", () => { .disableTrainerWaves() .disableCrits() .enemySpecies(Species.RATTATA) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyHeldItems([]) .startingLevel(1000) .moveset([Moves.FALSE_SWIPE, Moves.SUPER_FANG, Moves.SPLASH]) diff --git a/src/test/evolution.test.ts b/src/test/evolution.test.ts index 9f0806b8e24..16922babd7c 100644 --- a/src/test/evolution.test.ts +++ b/src/test/evolution.test.ts @@ -6,7 +6,6 @@ import * as Utils from "#app/utils"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "./utils/testUtils"; describe("Evolution", () => { let phaserGame: Phaser.Game; @@ -99,7 +98,7 @@ describe("Evolution", () => { it("should increase both HP and max HP when evolving", async () => { game.override.moveset([Moves.SURF]) .enemySpecies(Species.GOLEM) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .startingWave(21) .startingLevel(16) .enemyLevel(50); @@ -126,7 +125,7 @@ describe("Evolution", () => { it("should not fully heal HP when evolving", async () => { game.override.moveset([Moves.SURF]) .enemySpecies(Species.GOLEM) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .startingWave(21) .startingLevel(13) .enemyLevel(30); diff --git a/src/test/final_boss.test.ts b/src/test/final_boss.test.ts index 5d006998a0b..fee4dc6c8f6 100644 --- a/src/test/final_boss.test.ts +++ b/src/test/final_boss.test.ts @@ -7,7 +7,6 @@ import { GameModes } from "#app/game-mode"; import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import GameManager from "./utils/gameManager"; -import { SPLASH_ONLY } from "./utils/testUtils"; const FinalWave = { Classic: 200, @@ -29,7 +28,7 @@ describe("Final Boss", () => { .startingWave(FinalWave.Classic) .startingBiome(Biome.END) .disableCrits() - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .moveset([ Moves.SPLASH, Moves.WILL_O_WISP, Moves.DRAGON_PULSE ]) .startingLevel(10000); }); diff --git a/src/test/items/dire_hit.test.ts b/src/test/items/dire_hit.test.ts index 4b5988294f3..601552de7f1 100644 --- a/src/test/items/dire_hit.test.ts +++ b/src/test/items/dire_hit.test.ts @@ -4,7 +4,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { BattleEndPhase } from "#app/phases/battle-end-phase"; import { TempCritBoosterModifier } from "#app/modifier/modifier"; import { Mode } from "#app/ui/ui"; @@ -34,7 +33,7 @@ describe("Items - Dire Hit", () => { game.override .enemySpecies(Species.MAGIKARP) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .moveset([ Moves.POUND ]) .startingHeldItems([{ name: "DIRE_HIT" }]) .battleType("single") diff --git a/src/test/items/double_battle_chance_booster.test.ts b/src/test/items/double_battle_chance_booster.test.ts index 808d4c7ca51..f581af7afc5 100644 --- a/src/test/items/double_battle_chance_booster.test.ts +++ b/src/test/items/double_battle_chance_booster.test.ts @@ -4,7 +4,6 @@ import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { ShopCursorTarget } from "#app/enums/shop-cursor-target.js"; import { Mode } from "#app/ui/ui.js"; import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler.js"; @@ -64,7 +63,7 @@ describe("Items - Double Battle Chance Boosters", () => { game.override .startingModifier([{ name: "LURE" }]) .itemRewards([{ name: "LURE" }]) - .moveset(SPLASH_ONLY) + .moveset(Moves.SPLASH) .startingLevel(200); await game.classicMode.startBattle([ diff --git a/src/test/items/grip_claw.test.ts b/src/test/items/grip_claw.test.ts index 09afa9aea0b..d9871616449 100644 --- a/src/test/items/grip_claw.test.ts +++ b/src/test/items/grip_claw.test.ts @@ -8,7 +8,6 @@ import { MoveEndPhase } from "#app/phases/move-end-phase"; import GameManager from "#test/utils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; // 20 seconds @@ -38,7 +37,7 @@ describe("Items - Grip Claw", () => { ]) .enemySpecies(Species.SNORLAX) .ability(Abilities.KLUTZ) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyHeldItems([ { name: "BERRY", type: BerryType.SITRUS, count: 2 }, { name: "BERRY", type: BerryType.LUM, count: 2 }, diff --git a/src/test/items/scope_lens.test.ts b/src/test/items/scope_lens.test.ts index c8629093ab5..e39517ceae9 100644 --- a/src/test/items/scope_lens.test.ts +++ b/src/test/items/scope_lens.test.ts @@ -4,7 +4,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Items - Scope Lens", () => { let phaserGame: Phaser.Game; @@ -25,7 +24,7 @@ describe("Items - Scope Lens", () => { game.override .enemySpecies(Species.MAGIKARP) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .moveset([ Moves.POUND ]) .startingHeldItems([{ name: "SCOPE_LENS" }]) .battleType("single") diff --git a/src/test/items/temp_stat_stage_booster.test.ts b/src/test/items/temp_stat_stage_booster.test.ts index 3e32fa13a04..6186799623a 100644 --- a/src/test/items/temp_stat_stage_booster.test.ts +++ b/src/test/items/temp_stat_stage_booster.test.ts @@ -5,7 +5,6 @@ import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { Moves } from "#app/enums/moves"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { Abilities } from "#app/enums/abilities"; import { TempStatStageBoosterModifier } from "#app/modifier/modifier"; import { Mode } from "#app/ui/ui"; @@ -34,7 +33,7 @@ describe("Items - Temporary Stat Stage Boosters", () => { game.override .battleType("single") .enemySpecies(Species.SHUCKLE) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .moveset([ Moves.TACKLE, Moves.SPLASH, Moves.HONE_CLAWS, Moves.BELLY_DRUM ]) .startingModifier([{ name: "TEMP_STAT_STAGE_BOOSTER", type: Stat.ATK }]); diff --git a/src/test/moves/alluring_voice.test.ts b/src/test/moves/alluring_voice.test.ts index 9807d1bce85..b438d0f736a 100644 --- a/src/test/moves/alluring_voice.test.ts +++ b/src/test/moves/alluring_voice.test.ts @@ -31,7 +31,7 @@ describe("Moves - Alluring Voice", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.ICE_SCALES) - .enemyMoveset(Array(4).fill(Moves.HOWL)) + .enemyMoveset([Moves.HOWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) diff --git a/src/test/moves/baton_pass.test.ts b/src/test/moves/baton_pass.test.ts index 1a4edafdd36..5643efceae2 100644 --- a/src/test/moves/baton_pass.test.ts +++ b/src/test/moves/baton_pass.test.ts @@ -5,7 +5,6 @@ import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -31,7 +30,7 @@ describe("Moves - Baton Pass", () => { .enemyAbility(Abilities.BALL_FETCH) .moveset([Moves.BATON_PASS, Moves.NASTY_PLOT, Moves.SPLASH]) .ability(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .disableCrits(); }); @@ -71,7 +70,10 @@ describe("Moves - Baton Pass", () => { // round 2 - baton pass game.scene.getEnemyPokemon()!.hp = 100; - game.override.enemyMoveset(new Array(4).fill(Moves.BATON_PASS)); + game.override.enemyMoveset([Moves.BATON_PASS]); + // Force moveset to update mid-battle + // TODO: replace with enemy ai control function when it's added + game.scene.getEnemyParty()[0].getMoveset(); game.move.select(Moves.SPLASH); await game.phaseInterceptor.to("PostSummonPhase", false); @@ -90,7 +92,7 @@ describe("Moves - Baton Pass", () => { }, 20000); it("doesn't transfer effects that aren't transferrable", async() => { - game.override.enemyMoveset(Array(4).fill(Moves.SALT_CURE)); + game.override.enemyMoveset([Moves.SALT_CURE]); await game.classicMode.startBattle([Species.PIKACHU, Species.FEEBAS]); const [player1, player2] = game.scene.getParty(); diff --git a/src/test/moves/beak_blast.test.ts b/src/test/moves/beak_blast.test.ts index 2a93dc00a54..fe748c87826 100644 --- a/src/test/moves/beak_blast.test.ts +++ b/src/test/moves/beak_blast.test.ts @@ -34,7 +34,7 @@ describe("Moves - Beak Blast", () => { .moveset([Moves.BEAK_BLAST]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset(Array(4).fill(Moves.TACKLE)) + .enemyMoveset([Moves.TACKLE]) .startingLevel(100) .enemyLevel(100); }); @@ -80,7 +80,7 @@ describe("Moves - Beak Blast", () => { it( "should not burn attackers that don't make contact", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.WATER_GUN)); + game.override.enemyMoveset([Moves.WATER_GUN]); await game.startBattle([Species.BLASTOISE]); @@ -116,7 +116,7 @@ describe("Moves - Beak Blast", () => { it( "should be blocked by Protect", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.PROTECT)); + game.override.enemyMoveset([Moves.PROTECT]); await game.startBattle([Species.BLASTOISE]); diff --git a/src/test/moves/beat_up.test.ts b/src/test/moves/beat_up.test.ts index ce1598a49b4..70b33f56583 100644 --- a/src/test/moves/beat_up.test.ts +++ b/src/test/moves/beat_up.test.ts @@ -29,7 +29,7 @@ describe("Moves - Beat Up", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyLevel(100); - game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset([Moves.SPLASH]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); diff --git a/src/test/moves/belly_drum.test.ts b/src/test/moves/belly_drum.test.ts index 7024deb3f18..3d85c59a2a5 100644 --- a/src/test/moves/belly_drum.test.ts +++ b/src/test/moves/belly_drum.test.ts @@ -6,7 +6,6 @@ import { Stat } from "#enums/stat"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { Abilities } from "#app/enums/abilities"; const TIMEOUT = 20 * 1000; @@ -37,7 +36,7 @@ describe("Moves - BELLY DRUM", () => { .startingLevel(100) .enemyLevel(100) .moveset([Moves.BELLY_DRUM]) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH); }); diff --git a/src/test/moves/burning_jealousy.test.ts b/src/test/moves/burning_jealousy.test.ts index 2cb6a0bc52a..3f2bf453684 100644 --- a/src/test/moves/burning_jealousy.test.ts +++ b/src/test/moves/burning_jealousy.test.ts @@ -7,7 +7,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -32,7 +31,7 @@ describe("Moves - Burning Jealousy", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.ICE_SCALES) - .enemyMoveset(Array(4).fill(Moves.HOWL)) + .enemyMoveset([Moves.HOWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) @@ -73,7 +72,7 @@ describe("Moves - Burning Jealousy", () => { game.override .enemySpecies(Species.DITTO) .enemyAbility(Abilities.IMPOSTER) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; @@ -91,7 +90,7 @@ describe("Moves - Burning Jealousy", () => { it("should be boosted by Sheer Force even if opponent didn't raise stat stages", async () => { game.override .ability(Abilities.SHEER_FORCE) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); vi.spyOn(allMoves[Moves.BURNING_JEALOUSY], "calculateBattlePower"); await game.classicMode.startBattle(); diff --git a/src/test/moves/clangorous_soul.test.ts b/src/test/moves/clangorous_soul.test.ts index 9bd3bc2379e..015b73b4dab 100644 --- a/src/test/moves/clangorous_soul.test.ts +++ b/src/test/moves/clangorous_soul.test.ts @@ -5,7 +5,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; const TIMEOUT = 20 * 1000; /** HP Cost of Move */ @@ -34,7 +33,7 @@ describe("Moves - Clangorous Soul", () => { game.override.startingLevel(100); game.override.enemyLevel(100); game.override.moveset([Moves.CLANGOROUS_SOUL]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/Clangorous_Soul_(move) diff --git a/src/test/moves/crafty_shield.test.ts b/src/test/moves/crafty_shield.test.ts index e73a1fd256d..7b962518944 100644 --- a/src/test/moves/crafty_shield.test.ts +++ b/src/test/moves/crafty_shield.test.ts @@ -33,7 +33,7 @@ describe("Moves - Crafty Shield", () => { game.override.moveset([Moves.CRAFTY_SHIELD, Moves.SPLASH, Moves.SWORDS_DANCE]); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + game.override.enemyMoveset([Moves.GROWL]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); @@ -62,7 +62,7 @@ describe("Moves - Crafty Shield", () => { test( "should not protect the user and allies from attack moves", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); @@ -84,7 +84,7 @@ describe("Moves - Crafty Shield", () => { "should protect the user and allies from moves that ignore other protection", async () => { game.override.enemySpecies(Species.DUSCLOPS); - game.override.enemyMoveset(Array(4).fill(Moves.CURSE)); + game.override.enemyMoveset([Moves.CURSE]); await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); diff --git a/src/test/moves/disable.test.ts b/src/test/moves/disable.test.ts index 3d207035ce3..a35d294e91f 100644 --- a/src/test/moves/disable.test.ts +++ b/src/test/moves/disable.test.ts @@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; describe("Moves - Disable", () => { @@ -28,7 +27,7 @@ describe("Moves - Disable", () => { .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH) .moveset([Moves.DISABLE, Moves.SPLASH]) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.PIKACHU) .enemySpecies(Species.SHUCKLE); }); @@ -79,7 +78,7 @@ describe("Moves - Disable", () => { }, 20000); it("cannot disable STRUGGLE", async() => { - game.override.enemyMoveset(Array(4).fill(Moves.STRUGGLE)); + game.override.enemyMoveset([Moves.STRUGGLE]); await game.classicMode.startBattle(); const playerMon = game.scene.getPlayerPokemon()!; @@ -114,7 +113,7 @@ describe("Moves - Disable", () => { }, 20000); it("disables NATURE POWER, not the move invoked by it", async() => { - game.override.enemyMoveset(Array(4).fill(Moves.NATURE_POWER)); + game.override.enemyMoveset([Moves.NATURE_POWER]); await game.classicMode.startBattle(); const enemyMon = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/dragon_cheer.test.ts b/src/test/moves/dragon_cheer.test.ts index 747d71bd000..0fc389ccfb6 100644 --- a/src/test/moves/dragon_cheer.test.ts +++ b/src/test/moves/dragon_cheer.test.ts @@ -4,7 +4,6 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { Abilities } from "#enums/abilities"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,7 +27,7 @@ describe("Moves - Dragon Cheer", () => { game.override .battleType("double") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyLevel(20) .moveset([Moves.DRAGON_CHEER, Moves.TACKLE, Moves.SPLASH]); }); diff --git a/src/test/moves/dragon_rage.test.ts b/src/test/moves/dragon_rage.test.ts index 5da6e082ce5..cab8c3f808b 100644 --- a/src/test/moves/dragon_rage.test.ts +++ b/src/test/moves/dragon_rage.test.ts @@ -8,7 +8,6 @@ import { Abilities } from "#enums/abilities"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -42,7 +41,7 @@ describe("Moves - Dragon Rage", () => { game.override.startingLevel(100); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); diff --git a/src/test/moves/dragon_tail.test.ts b/src/test/moves/dragon_tail.test.ts index 362383e2fe3..e1af29b2db1 100644 --- a/src/test/moves/dragon_tail.test.ts +++ b/src/test/moves/dragon_tail.test.ts @@ -9,7 +9,6 @@ import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import GameManager from "../utils/gameManager"; -import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -32,7 +31,7 @@ describe("Moves - Dragon Tail", () => { game.override.battleType("single") .moveset([Moves.DRAGON_TAIL, Moves.SPLASH]) .enemySpecies(Species.WAILORD) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .startingLevel(5) .enemyLevel(5); @@ -82,7 +81,7 @@ describe("Moves - Dragon Tail", () => { test( "Double battles should proceed without crashing", async () => { - game.override.battleType("double").enemyMoveset(SPLASH_ONLY); + game.override.battleType("double").enemyMoveset(Moves.SPLASH); game.override.moveset([Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER]) .enemyAbility(Abilities.ROUGH_SKIN); await game.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]); @@ -116,7 +115,7 @@ describe("Moves - Dragon Tail", () => { test( "Flee move redirection works", async () => { - game.override.battleType("double").enemyMoveset(SPLASH_ONLY); + game.override.battleType("double").enemyMoveset(Moves.SPLASH); game.override.moveset([Moves.DRAGON_TAIL, Moves.SPLASH, Moves.FLAMETHROWER]); game.override.enemyAbility(Abilities.ROUGH_SKIN); await game.startBattle([Species.DRATINI, Species.DRATINI, Species.WAILORD, Species.WAILORD]); diff --git a/src/test/moves/fake_out.test.ts b/src/test/moves/fake_out.test.ts index ac09917daea..04d6216b952 100644 --- a/src/test/moves/fake_out.test.ts +++ b/src/test/moves/fake_out.test.ts @@ -3,7 +3,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Fake Out", () => { let phaserGame: Phaser.Game; @@ -26,7 +25,7 @@ describe("Moves - Fake Out", () => { .enemySpecies(Species.CORVIKNIGHT) .starterSpecies(Species.FEEBAS) .moveset([Moves.FAKE_OUT, Moves.SPLASH]) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .disableCrits(); }); diff --git a/src/test/moves/fillet_away.test.ts b/src/test/moves/fillet_away.test.ts index a639a86c5c1..68ace42c2ec 100644 --- a/src/test/moves/fillet_away.test.ts +++ b/src/test/moves/fillet_away.test.ts @@ -4,7 +4,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import { Stat } from "#enums/stat"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, test } from "vitest"; @@ -35,7 +34,7 @@ describe("Moves - FILLET AWAY", () => { game.override.startingLevel(100); game.override.enemyLevel(100); game.override.moveset([Moves.FILLET_AWAY]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); //Bulbapedia Reference: https://bulbapedia.bulbagarden.net/wiki/fillet_away_(move) diff --git a/src/test/moves/fissure.test.ts b/src/test/moves/fissure.test.ts index 34612d1fb18..8689ce4079e 100644 --- a/src/test/moves/fissure.test.ts +++ b/src/test/moves/fissure.test.ts @@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -38,7 +37,7 @@ describe("Moves - Fissure", () => { game.override.startingLevel(100); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyPassiveAbility(Abilities.BALL_FETCH); game.override.enemyLevel(100); diff --git a/src/test/moves/flame_burst.test.ts b/src/test/moves/flame_burst.test.ts index 2777b8178b8..b2858af2b24 100644 --- a/src/test/moves/flame_burst.test.ts +++ b/src/test/moves/flame_burst.test.ts @@ -42,7 +42,7 @@ describe("Moves - Flame Burst", () => { game.override.startingWave(4); game.override.enemySpecies(Species.SHUCKLE); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset(new Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset([Moves.SPLASH]); }); it("inflicts damage to the target's ally equal to 1/16 of its max HP", async () => { diff --git a/src/test/moves/flower_shield.test.ts b/src/test/moves/flower_shield.test.ts index ffe8ae995d3..f5fe8d532cc 100644 --- a/src/test/moves/flower_shield.test.ts +++ b/src/test/moves/flower_shield.test.ts @@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -31,7 +30,7 @@ describe("Moves - Flower Shield", () => { game.override.enemyAbility(Abilities.NONE); game.override.battleType("single"); game.override.moveset([Moves.FLOWER_SHIELD, Moves.SPLASH]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("raises DEF stat stage by 1 for all Grass-type Pokemon on the field by one stage - single battle", async () => { diff --git a/src/test/moves/focus_punch.test.ts b/src/test/moves/focus_punch.test.ts index 249647f0294..ca80c688169 100644 --- a/src/test/moves/focus_punch.test.ts +++ b/src/test/moves/focus_punch.test.ts @@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -35,7 +34,7 @@ describe("Moves - Focus Punch", () => { .moveset([Moves.FOCUS_PUNCH]) .enemySpecies(Species.GROUDON) .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .startingLevel(100) .enemyLevel(100); }); @@ -68,7 +67,7 @@ describe("Moves - Focus Punch", () => { it( "should fail if the user is hit", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.startBattle([Species.CHARIZARD]); @@ -95,7 +94,7 @@ describe("Moves - Focus Punch", () => { it( "should be cancelled if the user falls asleep mid-turn", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SPORE)); + game.override.enemyMoveset([Moves.SPORE]); await game.startBattle([Species.CHARIZARD]); diff --git a/src/test/moves/foresight.test.ts b/src/test/moves/foresight.test.ts index b856ec0f852..d58097691fd 100644 --- a/src/test/moves/foresight.test.ts +++ b/src/test/moves/foresight.test.ts @@ -4,7 +4,6 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Foresight", () => { let phaserGame: Phaser.Game; @@ -25,7 +24,7 @@ describe("Moves - Foresight", () => { game.override .disableCrits() .enemySpecies(Species.GASTLY) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyLevel(5) .starterSpecies(Species.MAGIKARP) .moveset([Moves.FORESIGHT, Moves.QUICK_ATTACK, Moves.MACH_PUNCH]); @@ -55,7 +54,7 @@ describe("Moves - Foresight", () => { }); it("should ignore target's evasiveness boosts", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.MINIMIZE)); + game.override.enemyMoveset([Moves.MINIMIZE]); await game.startBattle(); const pokemon = game.scene.getPlayerPokemon()!; diff --git a/src/test/moves/freeze_dry.test.ts b/src/test/moves/freeze_dry.test.ts index 445a432a812..ff9e2f07162 100644 --- a/src/test/moves/freeze_dry.test.ts +++ b/src/test/moves/freeze_dry.test.ts @@ -3,7 +3,6 @@ import { Abilities } from "#app/enums/abilities"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -28,7 +27,7 @@ describe("Moves - Freeze-Dry", () => { .battleType("single") .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .starterSpecies(Species.FEEBAS) .ability(Abilities.BALL_FETCH) .moveset([Moves.FREEZE_DRY]); @@ -92,7 +91,7 @@ describe("Moves - Freeze-Dry", () => { // enable once Electrify is implemented (and the interaction is fixed, as above) it.todo("should deal 2x damage to water types under Electrify", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.ELECTRIFY)); + game.override.enemyMoveset([Moves.ELECTRIFY]); await game.classicMode.startBattle(); const enemy = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/freezy_frost.test.ts b/src/test/moves/freezy_frost.test.ts index ae42d5b6dc6..05c61aab49a 100644 --- a/src/test/moves/freezy_frost.test.ts +++ b/src/test/moves/freezy_frost.test.ts @@ -5,7 +5,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { allMoves } from "#app/data/move"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; @@ -28,7 +27,7 @@ describe("Moves - Freezy Frost", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyLevel(100); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(100); diff --git a/src/test/moves/gastro_acid.test.ts b/src/test/moves/gastro_acid.test.ts index 67fd3464cf9..cfc458a908f 100644 --- a/src/test/moves/gastro_acid.test.ts +++ b/src/test/moves/gastro_acid.test.ts @@ -4,7 +4,6 @@ import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { MoveResult } from "#app/field/pokemon"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; const TIMEOUT = 20 * 1000; @@ -31,7 +30,7 @@ describe("Moves - Gastro Acid", () => { game.override.ability(Abilities.NONE); game.override.moveset([Moves.GASTRO_ACID, Moves.WATER_GUN, Moves.SPLASH, Moves.CORE_ENFORCER]); game.override.enemySpecies(Species.BIDOOF); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.WATER_ABSORB); }); diff --git a/src/test/moves/gigaton_hammer.test.ts b/src/test/moves/gigaton_hammer.test.ts index 0162375cdb2..b0ab06fdeb5 100644 --- a/src/test/moves/gigaton_hammer.test.ts +++ b/src/test/moves/gigaton_hammer.test.ts @@ -4,7 +4,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Gigaton Hammer", () => { let phaserGame: Phaser.Game; @@ -29,7 +28,7 @@ describe("Moves - Gigaton Hammer", () => { .moveset([Moves.GIGATON_HAMMER]) .startingLevel(10) .enemyLevel(100) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .disableCrits(); }); diff --git a/src/test/moves/glaive_rush.test.ts b/src/test/moves/glaive_rush.test.ts index 5867ef751b8..9eed6868432 100644 --- a/src/test/moves/glaive_rush.test.ts +++ b/src/test/moves/glaive_rush.test.ts @@ -29,7 +29,7 @@ describe("Moves - Glaive Rush", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(Array(4).fill(Moves.GLAIVE_RUSH)) + .enemyMoveset([Moves.GLAIVE_RUSH]) .starterSpecies(Species.KLINK) .ability(Abilities.BALL_FETCH) .moveset([Moves.SHADOW_SNEAK, Moves.AVALANCHE, Moves.SPLASH, Moves.GLAIVE_RUSH]); @@ -67,7 +67,7 @@ describe("Moves - Glaive Rush", () => { it("interacts properly with multi-lens", async () => { game.override .startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) - .enemyMoveset(Array(4).fill(Moves.AVALANCHE)); + .enemyMoveset([Moves.AVALANCHE]); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -88,7 +88,7 @@ describe("Moves - Glaive Rush", () => { }, TIMEOUT); it("secondary effects only last until next move", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)); + game.override.enemyMoveset([Moves.SHADOW_SNEAK]); await game.classicMode.startBattle(); const player = game.scene.getPlayerPokemon()!; @@ -115,7 +115,7 @@ describe("Moves - Glaive Rush", () => { it("secondary effects are removed upon switching", async () => { game.override - .enemyMoveset(Array(4).fill(Moves.SHADOW_SNEAK)) + .enemyMoveset([Moves.SHADOW_SNEAK]) .starterSpecies(0); await game.classicMode.startBattle([Species.KLINK, Species.FEEBAS]); @@ -152,7 +152,7 @@ describe("Moves - Glaive Rush", () => { game.move.select(Moves.SHADOW_SNEAK); await game.phaseInterceptor.to("TurnEndPhase"); - game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset([Moves.SPLASH]); const damagedHP1 = 1000 - enemy.hp; enemy.hp = 1000; diff --git a/src/test/moves/growth.test.ts b/src/test/moves/growth.test.ts index defe5e26f41..a66e4ec6719 100644 --- a/src/test/moves/growth.test.ts +++ b/src/test/moves/growth.test.ts @@ -5,7 +5,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; @@ -29,7 +28,7 @@ describe("Moves - Growth", () => { game.override.enemyAbility(Abilities.MOXIE); game.override.ability(Abilities.INSOMNIA); game.override.moveset([ Moves.GROWTH ]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("should raise SPATK stat stage by 1", async() => { diff --git a/src/test/moves/guard_split.test.ts b/src/test/moves/guard_split.test.ts index f95d09f726c..36be82ba5e4 100644 --- a/src/test/moves/guard_split.test.ts +++ b/src/test/moves/guard_split.test.ts @@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Guard Split", () => { let phaserGame: Phaser.Game; @@ -34,7 +33,7 @@ describe("Moves - Guard Split", () => { }); it("should average the user's DEF and SPDEF stats with those of the target", async () => { - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); await game.startBattle([ Species.INDEEDEE ]); @@ -56,7 +55,7 @@ describe("Moves - Guard Split", () => { }, 20000); it("should be idempotent", async () => { - game.override.enemyMoveset(new Array(4).fill(Moves.GUARD_SPLIT)); + game.override.enemyMoveset([Moves.GUARD_SPLIT]); await game.startBattle([ Species.INDEEDEE ]); diff --git a/src/test/moves/guard_swap.test.ts b/src/test/moves/guard_swap.test.ts index 407d475de09..a27afaaa7ba 100644 --- a/src/test/moves/guard_swap.test.ts +++ b/src/test/moves/guard_swap.test.ts @@ -27,7 +27,7 @@ describe("Moves - Guard Swap", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(new Array(4).fill(Moves.SHELL_SMASH)) + .enemyMoveset([Moves.SHELL_SMASH]) .enemySpecies(Species.MEW) .enemyLevel(200) .moveset([ Moves.GUARD_SWAP ]) diff --git a/src/test/moves/hard_press.test.ts b/src/test/moves/hard_press.test.ts index 70c78490269..5d2e4e5b145 100644 --- a/src/test/moves/hard_press.test.ts +++ b/src/test/moves/hard_press.test.ts @@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -30,7 +29,7 @@ describe("Moves - Hard Press", () => { game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.MUNCHLAX); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.moveset([Moves.HARD_PRESS]); vi.spyOn(moveToCheck, "calculateBattlePower"); }); diff --git a/src/test/moves/haze.test.ts b/src/test/moves/haze.test.ts index 42081ce74e8..211c1a41409 100644 --- a/src/test/moves/haze.test.ts +++ b/src/test/moves/haze.test.ts @@ -5,7 +5,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; describe("Moves - Haze", () => { @@ -28,7 +27,7 @@ describe("Moves - Haze", () => { game.override.enemySpecies(Species.RATTATA); game.override.enemyLevel(100); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(100); diff --git a/src/test/moves/hyper_beam.test.ts b/src/test/moves/hyper_beam.test.ts index 1280d8b429a..7aa2dbfec2b 100644 --- a/src/test/moves/hyper_beam.test.ts +++ b/src/test/moves/hyper_beam.test.ts @@ -32,7 +32,7 @@ describe("Moves - Hyper Beam", () => { game.override.ability(Abilities.BALL_FETCH); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset([Moves.SPLASH]); game.override.enemyLevel(100); game.override.moveset([Moves.HYPER_BEAM, Moves.TACKLE]); diff --git a/src/test/moves/jaw_lock.test.ts b/src/test/moves/jaw_lock.test.ts index 42f7a244977..75fd6f0ff32 100644 --- a/src/test/moves/jaw_lock.test.ts +++ b/src/test/moves/jaw_lock.test.ts @@ -6,7 +6,6 @@ import { FaintPhase } from "#app/phases/faint-phase"; import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import { TurnEndPhase } from "#app/phases/turn-end-phase"; import GameManager from "#app/test/utils/gameManager"; -import { SPLASH_ONLY } from "#app/test/utils/testUtils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; @@ -35,7 +34,7 @@ describe("Moves - Jaw Lock", () => { .battleType("single") .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .moveset([Moves.JAW_LOCK, Moves.SPLASH]) .startingLevel(100) .enemyLevel(100) @@ -153,7 +152,7 @@ describe("Moves - Jaw Lock", () => { it( "should not trap either pokemon if the target is protected", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.PROTECT)); + game.override.enemyMoveset([Moves.PROTECT]); await game.startBattle([Species.BULBASAUR]); diff --git a/src/test/moves/lash_out.test.ts b/src/test/moves/lash_out.test.ts index 74d9fcd66c0..8c414832f36 100644 --- a/src/test/moves/lash_out.test.ts +++ b/src/test/moves/lash_out.test.ts @@ -30,7 +30,7 @@ describe("Moves - Lash Out", () => { .disableCrits() .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.FUR_COAT) - .enemyMoveset(Array(4).fill(Moves.GROWL)) + .enemyMoveset([Moves.GROWL]) .startingLevel(10) .enemyLevel(10) .starterSpecies(Species.FEEBAS) diff --git a/src/test/moves/lucky_chant.test.ts b/src/test/moves/lucky_chant.test.ts index 7d5bfe02476..57e5ff80f1d 100644 --- a/src/test/moves/lucky_chant.test.ts +++ b/src/test/moves/lucky_chant.test.ts @@ -31,7 +31,7 @@ describe("Moves - Lucky Chant", () => { .moveset([Moves.LUCKY_CHANT, Moves.SPLASH, Moves.FOLLOW_ME]) .enemySpecies(Species.SNORLAX) .enemyAbility(Abilities.INSOMNIA) - .enemyMoveset(Array(4).fill(Moves.FLOWER_TRICK)) + .enemyMoveset([Moves.FLOWER_TRICK]) .startingLevel(100) .enemyLevel(100); }); @@ -87,7 +87,7 @@ describe("Moves - Lucky Chant", () => { it( "should prevent critical hits from field effects", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.startBattle([Species.CHARIZARD]); diff --git a/src/test/moves/lunar_blessing.test.ts b/src/test/moves/lunar_blessing.test.ts index 92428c39029..6a104762f4d 100644 --- a/src/test/moves/lunar_blessing.test.ts +++ b/src/test/moves/lunar_blessing.test.ts @@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -26,7 +25,7 @@ describe("Moves - Lunar Blessing", () => { game.override.battleType("double"); game.override.enemySpecies(Species.SHUCKLE); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.BALL_FETCH); game.override.moveset([Moves.LUNAR_BLESSING, Moves.SPLASH]); diff --git a/src/test/moves/make_it_rain.test.ts b/src/test/moves/make_it_rain.test.ts index e41472d7561..5ac35168f92 100644 --- a/src/test/moves/make_it_rain.test.ts +++ b/src/test/moves/make_it_rain.test.ts @@ -5,7 +5,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { MoveEndPhase } from "#app/phases/move-end-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; @@ -31,7 +30,7 @@ describe("Moves - Make It Rain", () => { game.override.moveset([Moves.MAKE_IT_RAIN, Moves.SPLASH]); game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.startingLevel(100); game.override.enemyLevel(100); }); diff --git a/src/test/moves/mat_block.test.ts b/src/test/moves/mat_block.test.ts index 4a95985eb92..b759f49bf98 100644 --- a/src/test/moves/mat_block.test.ts +++ b/src/test/moves/mat_block.test.ts @@ -33,7 +33,7 @@ describe("Moves - Mat Block", () => { game.override.moveset([Moves.MAT_BLOCK, Moves.SPLASH]); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); @@ -62,7 +62,7 @@ describe("Moves - Mat Block", () => { test( "should not protect the user and allies from status moves", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + game.override.enemyMoveset([Moves.GROWL]); await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); diff --git a/src/test/moves/miracle_eye.test.ts b/src/test/moves/miracle_eye.test.ts index d6b21a5dc2f..0528b509c82 100644 --- a/src/test/moves/miracle_eye.test.ts +++ b/src/test/moves/miracle_eye.test.ts @@ -5,7 +5,6 @@ import { MoveEffectPhase } from "#app/phases/move-effect-phase"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Miracle Eye", () => { let phaserGame: Phaser.Game; @@ -26,7 +25,7 @@ describe("Moves - Miracle Eye", () => { game.override .disableCrits() .enemySpecies(Species.UMBREON) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyLevel(5) .starterSpecies(Species.MAGIKARP) .moveset([Moves.MIRACLE_EYE, Moves.CONFUSION]); diff --git a/src/test/moves/multi_target.test.ts b/src/test/moves/multi_target.test.ts index 16ccd5519b1..5e830f23fc7 100644 --- a/src/test/moves/multi_target.test.ts +++ b/src/test/moves/multi_target.test.ts @@ -4,7 +4,6 @@ import { Species } from "#app/enums/species"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -32,7 +31,7 @@ describe("Multi-target damage reduction", () => { .enemyLevel(100) .startingLevel(100) .enemySpecies(Species.POLIWAG) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .moveset([Moves.TACKLE, Moves.DAZZLING_GLEAM, Moves.EARTHQUAKE, Moves.SPLASH]) .ability(Abilities.BALL_FETCH); diff --git a/src/test/moves/octolock.test.ts b/src/test/moves/octolock.test.ts index c86906ea240..7618b08e9fc 100644 --- a/src/test/moves/octolock.test.ts +++ b/src/test/moves/octolock.test.ts @@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -30,7 +29,7 @@ describe("Moves - Octolock", () => { game.override.battleType("single") .enemySpecies(Species.RATTATA) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .startingLevel(2000) .moveset([ Moves.OCTOLOCK, Moves.SPLASH ]) diff --git a/src/test/moves/parting_shot.test.ts b/src/test/moves/parting_shot.test.ts index d9535ca6482..52cfaf98111 100644 --- a/src/test/moves/parting_shot.test.ts +++ b/src/test/moves/parting_shot.test.ts @@ -9,7 +9,6 @@ import { BerryPhase } from "#app/phases/berry-phase"; import { FaintPhase } from "#app/phases/faint-phase"; import { MessagePhase } from "#app/phases/message-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; -import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -31,7 +30,7 @@ describe("Moves - Parting Shot", () => { game = new GameManager(phaserGame); game.override.battleType("single"); game.override.moveset([Moves.PARTING_SHOT, Moves.SPLASH]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.startingLevel(5); game.override.enemyLevel(5); @@ -125,7 +124,7 @@ describe("Moves - Parting Shot", () => { game.override .enemySpecies(Species.ALTARIA) .enemyAbility(Abilities.NONE) - .enemyMoveset(Array(4).fill(Moves.MIST)); + .enemyMoveset([Moves.MIST]); await game.startBattle([Species.SNORLAX, Species.MEOWTH]); const enemyPokemon = game.scene.getEnemyPokemon()!; diff --git a/src/test/moves/power_split.test.ts b/src/test/moves/power_split.test.ts index a532a90a54d..aaf34541567 100644 --- a/src/test/moves/power_split.test.ts +++ b/src/test/moves/power_split.test.ts @@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Power Split", () => { let phaserGame: Phaser.Game; @@ -34,7 +33,7 @@ describe("Moves - Power Split", () => { }); it("should average the user's ATK and SPATK stats with those of the target", async () => { - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); await game.startBattle([ Species.INDEEDEE ]); @@ -56,7 +55,7 @@ describe("Moves - Power Split", () => { }, 20000); it("should be idempotent", async () => { - game.override.enemyMoveset(new Array(4).fill(Moves.POWER_SPLIT)); + game.override.enemyMoveset([Moves.POWER_SPLIT]); await game.startBattle([ Species.INDEEDEE ]); diff --git a/src/test/moves/power_swap.test.ts b/src/test/moves/power_swap.test.ts index f1efeaa3af3..a3d4bfca19a 100644 --- a/src/test/moves/power_swap.test.ts +++ b/src/test/moves/power_swap.test.ts @@ -27,7 +27,7 @@ describe("Moves - Power Swap", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(new Array(4).fill(Moves.SHELL_SMASH)) + .enemyMoveset([Moves.SHELL_SMASH]) .enemySpecies(Species.MEW) .enemyLevel(200) .moveset([ Moves.POWER_SWAP ]) diff --git a/src/test/moves/protect.test.ts b/src/test/moves/protect.test.ts index 83cd088aa47..24bbcbb9d34 100644 --- a/src/test/moves/protect.test.ts +++ b/src/test/moves/protect.test.ts @@ -35,7 +35,7 @@ describe("Moves - Protect", () => { game.override.enemySpecies(Species.SNORLAX); game.override.enemyAbility(Abilities.INSOMNIA); - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); game.override.startingLevel(100); game.override.enemyLevel(100); @@ -59,7 +59,7 @@ describe("Moves - Protect", () => { test( "should prevent secondary effects from the opponent's attack", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.CEASELESS_EDGE)); + game.override.enemyMoveset([Moves.CEASELESS_EDGE]); vi.spyOn(allMoves[Moves.CEASELESS_EDGE], "accuracy", "get").mockReturnValue(100); await game.classicMode.startBattle([Species.CHARIZARD]); @@ -78,7 +78,7 @@ describe("Moves - Protect", () => { test( "should protect the user from status moves", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.CHARM)); + game.override.enemyMoveset([Moves.CHARM]); await game.classicMode.startBattle([Species.CHARIZARD]); @@ -95,7 +95,7 @@ describe("Moves - Protect", () => { test( "should stop subsequent hits of a multi-hit move", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACHYON_CUTTER)); + game.override.enemyMoveset([Moves.TACHYON_CUTTER]); await game.classicMode.startBattle([Species.CHARIZARD]); @@ -114,7 +114,7 @@ describe("Moves - Protect", () => { test( "should fail if the user is the last to move in the turn", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.PROTECT)); + game.override.enemyMoveset([Moves.PROTECT]); await game.classicMode.startBattle([Species.CHARIZARD]); diff --git a/src/test/moves/quick_guard.test.ts b/src/test/moves/quick_guard.test.ts index 5f4af40eb71..9ab0fe1509c 100644 --- a/src/test/moves/quick_guard.test.ts +++ b/src/test/moves/quick_guard.test.ts @@ -32,7 +32,7 @@ describe("Moves - Quick Guard", () => { game.override.moveset([Moves.QUICK_GUARD, Moves.SPLASH, Moves.FOLLOW_ME]); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset(Array(4).fill(Moves.QUICK_ATTACK)); + game.override.enemyMoveset([Moves.QUICK_ATTACK]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); @@ -59,7 +59,7 @@ describe("Moves - Quick Guard", () => { "should protect the user and allies from Prankster-boosted moves", async () => { game.override.enemyAbility(Abilities.PRANKSTER); - game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + game.override.enemyMoveset([Moves.GROWL]); await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); @@ -77,7 +77,7 @@ describe("Moves - Quick Guard", () => { test( "should stop subsequent hits of a multi-hit priority move", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.WATER_SHURIKEN)); + game.override.enemyMoveset([Moves.WATER_SHURIKEN]); await game.classicMode.startBattle([Species.CHARIZARD, Species.BLASTOISE]); @@ -98,7 +98,7 @@ describe("Moves - Quick Guard", () => { "should fail if the user is the last to move in the turn", async () => { game.override.battleType("single"); - game.override.enemyMoveset(Array(4).fill(Moves.QUICK_GUARD)); + game.override.enemyMoveset([Moves.QUICK_GUARD]); await game.classicMode.startBattle([Species.CHARIZARD]); diff --git a/src/test/moves/rollout.test.ts b/src/test/moves/rollout.test.ts index ddb0b22e642..c08535a61df 100644 --- a/src/test/moves/rollout.test.ts +++ b/src/test/moves/rollout.test.ts @@ -4,7 +4,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -32,7 +31,7 @@ describe("Moves - Rollout", () => { game.override.enemyAbility(Abilities.BALL_FETCH); game.override.startingLevel(100); game.override.enemyLevel(100); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("should double it's dmg on sequential uses but reset after 5", async () => { diff --git a/src/test/moves/safeguard.test.ts b/src/test/moves/safeguard.test.ts index 8068c475539..2caf698a73a 100644 --- a/src/test/moves/safeguard.test.ts +++ b/src/test/moves/safeguard.test.ts @@ -29,7 +29,7 @@ describe("Moves - Safeguard", () => { game.override .battleType("single") .enemySpecies(Species.DRATINI) - .enemyMoveset(Array(4).fill(Moves.SAFEGUARD)) + .enemyMoveset([Moves.SAFEGUARD]) .enemyAbility(Abilities.BALL_FETCH) .enemyLevel(5) .starterSpecies(Species.DRATINI) @@ -126,8 +126,12 @@ describe("Moves - Safeguard", () => { expect(enemyPokemon.status?.effect).toEqual(StatusEffect.BURN); - game.override.enemyMoveset(Array(4).fill(Moves.REST)); + game.override.enemyMoveset([Moves.REST]); + // Force the moveset to update mid-battle + // TODO: Remove after enemy AI rework is in + enemyPokemon.getMoveset(); game.move.select(Moves.SPLASH); + enemyPokemon.damageAndUpdate(1); await game.toNextTurn(); expect(enemyPokemon.status?.effect).toEqual(StatusEffect.SLEEP); @@ -142,7 +146,7 @@ describe("Moves - Safeguard", () => { game.move.select(Moves.SPLASH); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.toNextTurn(); - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); game.move.select(Moves.SPLASH); await game.toNextTurn(); diff --git a/src/test/moves/shell_trap.test.ts b/src/test/moves/shell_trap.test.ts index 4549a8b2b73..213b9c3fd0a 100644 --- a/src/test/moves/shell_trap.test.ts +++ b/src/test/moves/shell_trap.test.ts @@ -9,7 +9,6 @@ import { MovePhase } from "#app/phases/move-phase"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -33,7 +32,7 @@ describe("Moves - Shell Trap", () => { .battleType("double") .moveset([Moves.SHELL_TRAP, Moves.SPLASH, Moves.BULLDOZE]) .enemySpecies(Species.SNORLAX) - .enemyMoveset(Array(4).fill(Moves.RAZOR_LEAF)) + .enemyMoveset([Moves.RAZOR_LEAF]) .startingLevel(100) .enemyLevel(100); @@ -67,7 +66,7 @@ describe("Moves - Shell Trap", () => { it( "should fail if the user is only hit by special attacks", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SWIFT)); + game.override.enemyMoveset([Moves.SWIFT]); await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); @@ -93,7 +92,7 @@ describe("Moves - Shell Trap", () => { it( "should fail if the user isn't hit with any attack", async () => { - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); await game.startBattle([Species.CHARIZARD, Species.TURTONATOR]); @@ -119,7 +118,7 @@ describe("Moves - Shell Trap", () => { it( "should not activate from an ally's attack", async () => { - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); await game.startBattle([Species.BLASTOISE, Species.CHARIZARD]); diff --git a/src/test/moves/speed_swap.test.ts b/src/test/moves/speed_swap.test.ts index 131d506792b..179f1212394 100644 --- a/src/test/moves/speed_swap.test.ts +++ b/src/test/moves/speed_swap.test.ts @@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Stat } from "#enums/stat"; import { Abilities } from "#enums/abilities"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Speed Swap", () => { let phaserGame: Phaser.Game; @@ -27,7 +26,7 @@ describe("Moves - Speed Swap", () => { game.override .battleType("single") .enemyAbility(Abilities.NONE) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.MEW) .enemyLevel(200) .moveset([ Moves.SPEED_SWAP ]) diff --git a/src/test/moves/spikes.test.ts b/src/test/moves/spikes.test.ts index fa2e7521152..aa59912d802 100644 --- a/src/test/moves/spikes.test.ts +++ b/src/test/moves/spikes.test.ts @@ -4,7 +4,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Spikes", () => { @@ -28,7 +27,7 @@ describe("Moves - Spikes", () => { .enemySpecies(Species.MAGIKARP) .enemyAbility(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .moveset([Moves.SPIKES, Moves.SPLASH, Moves.ROAR]); }); diff --git a/src/test/moves/spit_up.test.ts b/src/test/moves/spit_up.test.ts index f88791efb74..acf7f01d991 100644 --- a/src/test/moves/spit_up.test.ts +++ b/src/test/moves/spit_up.test.ts @@ -9,7 +9,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import { MovePhase } from "#app/phases/move-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; @@ -33,7 +32,7 @@ describe("Moves - Spit Up", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.NONE); game.override.enemyLevel(2000); diff --git a/src/test/moves/stockpile.test.ts b/src/test/moves/stockpile.test.ts index d57768d0ffd..8e7a44d053b 100644 --- a/src/test/moves/stockpile.test.ts +++ b/src/test/moves/stockpile.test.ts @@ -7,7 +7,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -30,7 +29,7 @@ describe("Moves - Stockpile", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.NONE); game.override.startingLevel(2000); diff --git a/src/test/moves/swallow.test.ts b/src/test/moves/swallow.test.ts index 9cea7ae8dc9..5a0e63e6e78 100644 --- a/src/test/moves/swallow.test.ts +++ b/src/test/moves/swallow.test.ts @@ -8,7 +8,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -30,7 +29,7 @@ describe("Moves - Swallow", () => { game.override.battleType("single"); game.override.enemySpecies(Species.RATTATA); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.enemyAbility(Abilities.NONE); game.override.enemyLevel(2000); diff --git a/src/test/moves/tail_whip.test.ts b/src/test/moves/tail_whip.test.ts index 04730a04f7a..5c83feb8a4e 100644 --- a/src/test/moves/tail_whip.test.ts +++ b/src/test/moves/tail_whip.test.ts @@ -5,7 +5,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; import { EnemyCommandPhase } from "#app/phases/enemy-command-phase"; import { TurnInitPhase } from "#app/phases/turn-init-phase"; @@ -33,7 +32,7 @@ describe("Moves - Tail whip", () => { game.override.ability(Abilities.INSOMNIA); game.override.startingLevel(2000); game.override.moveset([ moveToUse ]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("should lower DEF stat stage by 1", async() => { diff --git a/src/test/moves/tailwind.test.ts b/src/test/moves/tailwind.test.ts index d158a9cce86..6a08cfe802f 100644 --- a/src/test/moves/tailwind.test.ts +++ b/src/test/moves/tailwind.test.ts @@ -5,7 +5,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -27,7 +26,7 @@ describe("Moves - Tailwind", () => { game = new GameManager(phaserGame); game.override.battleType("double"); game.override.moveset([Moves.TAILWIND, Moves.SPLASH, Moves.PETAL_BLIZZARD, Moves.SANDSTORM]); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); }); it("doubles the Speed stat of the Pokemons on its side", async () => { diff --git a/src/test/moves/tera_blast.test.ts b/src/test/moves/tera_blast.test.ts index fa7a99adc14..55d61496297 100644 --- a/src/test/moves/tera_blast.test.ts +++ b/src/test/moves/tera_blast.test.ts @@ -9,7 +9,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - Tera Blast", () => { let phaserGame: Phaser.Game; @@ -37,7 +36,7 @@ describe("Moves - Tera Blast", () => { .ability(Abilities.BALL_FETCH) .startingHeldItems([{ name: "TERA_SHARD", type: Type.FIRE }]) .enemySpecies(Species.MAGIKARP) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemyAbility(Abilities.BALL_FETCH) .enemyLevel(20); diff --git a/src/test/moves/thunder_wave.test.ts b/src/test/moves/thunder_wave.test.ts index 0c91be29714..7ad59518013 100644 --- a/src/test/moves/thunder_wave.test.ts +++ b/src/test/moves/thunder_wave.test.ts @@ -6,7 +6,6 @@ import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; const TIMEOUT = 20 * 1000; @@ -30,7 +29,7 @@ describe("Moves - Thunder Wave", () => { .battleType("single") .starterSpecies(Species.PIKACHU) .moveset([Moves.THUNDER_WAVE]) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); // References: https://bulbapedia.bulbagarden.net/wiki/Thunder_Wave_(move) diff --git a/src/test/moves/tidy_up.test.ts b/src/test/moves/tidy_up.test.ts index 5204b06106b..255fe948447 100644 --- a/src/test/moves/tidy_up.test.ts +++ b/src/test/moves/tidy_up.test.ts @@ -6,7 +6,6 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -30,7 +29,7 @@ describe("Moves - Tidy Up", () => { game.override.battleType("single"); game.override.enemySpecies(Species.MAGIKARP); game.override.enemyAbility(Abilities.BALL_FETCH); - game.override.enemyMoveset(SPLASH_ONLY); + game.override.enemyMoveset(Moves.SPLASH); game.override.starterSpecies(Species.FEEBAS); game.override.ability(Abilities.BALL_FETCH); game.override.moveset([Moves.TIDY_UP]); diff --git a/src/test/moves/transform.test.ts b/src/test/moves/transform.test.ts index 45769447e4d..6686f1fc73b 100644 --- a/src/test/moves/transform.test.ts +++ b/src/test/moves/transform.test.ts @@ -6,7 +6,6 @@ import { TurnEndPhase } from "#app/phases/turn-end-phase"; import { Moves } from "#enums/moves"; import { Stat, BATTLE_STATS, EFFECTIVE_STATS } from "#enums/stat"; import { Abilities } from "#enums/abilities"; -import { SPLASH_ONLY } from "../utils/testUtils"; // TODO: Add more tests once Transform is fully implemented describe("Moves - Transform", () => { @@ -31,7 +30,7 @@ describe("Moves - Transform", () => { .enemyLevel(200) .enemyAbility(Abilities.BEAST_BOOST) .enemyPassiveAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .ability(Abilities.INTIMIDATE) .moveset([ Moves.TRANSFORM ]); }); @@ -77,7 +76,7 @@ describe("Moves - Transform", () => { }, 20000); it("should copy in-battle overridden stats", async () => { - game.override.enemyMoveset(new Array(4).fill(Moves.POWER_SPLIT)); + game.override.enemyMoveset([Moves.POWER_SPLIT]); await game.startBattle([ Species.DITTO diff --git a/src/test/moves/u_turn.test.ts b/src/test/moves/u_turn.test.ts index ae55302bb42..c4b6ae2497f 100644 --- a/src/test/moves/u_turn.test.ts +++ b/src/test/moves/u_turn.test.ts @@ -7,7 +7,6 @@ import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("Moves - U-turn", () => { let phaserGame: Phaser.Game; @@ -31,7 +30,7 @@ describe("Moves - U-turn", () => { .startingLevel(90) .startingWave(97) .moveset([Moves.U_TURN]) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .disableCrits(); }); diff --git a/src/test/moves/wide_guard.test.ts b/src/test/moves/wide_guard.test.ts index 6feeff815b5..b4e6e305539 100644 --- a/src/test/moves/wide_guard.test.ts +++ b/src/test/moves/wide_guard.test.ts @@ -32,7 +32,7 @@ describe("Moves - Wide Guard", () => { game.override.moveset([Moves.WIDE_GUARD, Moves.SPLASH, Moves.SURF]); game.override.enemySpecies(Species.SNORLAX); - game.override.enemyMoveset(Array(4).fill(Moves.SWIFT)); + game.override.enemyMoveset([Moves.SWIFT]); game.override.enemyAbility(Abilities.INSOMNIA); game.override.startingLevel(100); @@ -61,7 +61,7 @@ describe("Moves - Wide Guard", () => { test( "should protect the user and allies from multi-target status moves", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.GROWL)); + game.override.enemyMoveset([Moves.GROWL]); await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); @@ -82,7 +82,7 @@ describe("Moves - Wide Guard", () => { test( "should not protect the user and allies from single-target moves", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.TACKLE)); + game.override.enemyMoveset([Moves.TACKLE]); await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); @@ -103,7 +103,7 @@ describe("Moves - Wide Guard", () => { test( "should protect the user from its ally's multi-target move", async () => { - game.override.enemyMoveset(Array(4).fill(Moves.SPLASH)); + game.override.enemyMoveset([Moves.SPLASH]); await game.startBattle([Species.CHARIZARD, Species.BLASTOISE]); diff --git a/src/test/reload.test.ts b/src/test/reload.test.ts index 0a712fcc7df..a96a525ca2d 100644 --- a/src/test/reload.test.ts +++ b/src/test/reload.test.ts @@ -2,7 +2,6 @@ import { Species } from "#app/enums/species"; import { GameModes } from "#app/game-mode"; import GameManager from "#test/utils/gameManager"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { SPLASH_ONLY } from "./utils/testUtils"; import { Moves } from "#app/enums/moves"; import { Biome } from "#app/enums/biome"; @@ -45,7 +44,7 @@ describe("Reload", () => { .enemyLevel(1000) .disableTrainerWaves() .moveset([Moves.KOWTOW_CLEAVE]) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); await game.dailyMode.startBattle(); // Transition from Daily Run Wave 10 to Wave 11 in order to trigger biome switch diff --git a/src/test/ui/type-hints.test.ts b/src/test/ui/type-hints.test.ts index ccab02b82bf..726094b258a 100644 --- a/src/test/ui/type-hints.test.ts +++ b/src/test/ui/type-hints.test.ts @@ -8,7 +8,6 @@ import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import MockText from "../utils/mocks/mocksContainer/mockText"; -import { SPLASH_ONLY } from "../utils/testUtils"; describe("UI - Type Hints", () => { let phaserGame: Phaser.Game; @@ -27,7 +26,7 @@ describe("UI - Type Hints", () => { beforeEach(async () => { game = new GameManager(phaserGame); game.settings.typeHints(true); //activate type hints - game.override.battleType("single").startingLevel(100).startingWave(1).enemyMoveset(SPLASH_ONLY); + game.override.battleType("single").startingLevel(100).startingWave(1).enemyMoveset(Moves.SPLASH); }); it("check immunity color", async () => { @@ -36,7 +35,7 @@ describe("UI - Type Hints", () => { .startingLevel(100) .startingWave(1) .enemySpecies(Species.FLORGES) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .moveset([Moves.DRAGON_CLAW]); game.settings.typeHints(true); //activate type hints diff --git a/src/test/utils/helpers/overridesHelper.ts b/src/test/utils/helpers/overridesHelper.ts index 3eeeecbc5f8..a17b841b682 100644 --- a/src/test/utils/helpers/overridesHelper.ts +++ b/src/test/utils/helpers/overridesHelper.ts @@ -133,8 +133,11 @@ export class OverridesHelper extends GameManagerHelper { * @param moveset the {@linkcode Moves | moves}set to set * @returns this */ - moveset(moveset: Moves[]): this { + moveset(moveset: Moves | Moves[]): this { vi.spyOn(Overrides, "MOVESET_OVERRIDE", "get").mockReturnValue(moveset); + if (!Array.isArray(moveset)) { + moveset = [moveset]; + } const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); this.log(`Player Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); return this; @@ -252,8 +255,11 @@ export class OverridesHelper extends GameManagerHelper { * @param moveset the {@linkcode Moves | moves}set to set * @returns this */ - enemyMoveset(moveset: Moves[]): this { + enemyMoveset(moveset: Moves | Moves[]): this { vi.spyOn(Overrides, "OPP_MOVESET_OVERRIDE", "get").mockReturnValue(moveset); + if (!Array.isArray(moveset)) { + moveset = [moveset]; + } const movesetStr = moveset.map((moveId) => Moves[moveId]).join(", "); this.log(`Enemy Pokemon moveset set to ${movesetStr} (=[${moveset.join(", ")}])!`); return this; diff --git a/src/test/utils/testUtils.ts b/src/test/utils/testUtils.ts index 2265cf8d79c..b922fc9c61c 100644 --- a/src/test/utils/testUtils.ts +++ b/src/test/utils/testUtils.ts @@ -1,10 +1,6 @@ -import { Moves } from "#app/enums/moves"; import i18next, { type ParseKeys } from "i18next"; import { vi } from "vitest"; -/** Ready to use array of Moves.SPLASH x4 */ -export const SPLASH_ONLY = [Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH]; - /** * Sets up the i18next mock. * Includes a i18next.t mocked implementation only returning the raw key (`(key) => key`) From 8df7422e8fa520813b3549f5e53f684ad7419ec6 Mon Sep 17 00:00:00 2001 From: Taylor Le Lievre <78890517+tlelievre26@users.noreply.github.com> Date: Mon, 9 Sep 2024 12:59:58 -0400 Subject: [PATCH 15/30] [Bug] Primal weather no longer persists if last mon dies to indirect damage (#3492) * Fixed Delta Stream remaining active when last mon dies to indirect damage * Rebasing changes * Linting fix * Combined if statements * Changed params to optional * Added unit test * Apply suggestions from code review * Fix test and remove `.js` from import --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> --- src/data/ability.ts | 14 ++++++------- src/phases/faint-phase.ts | 2 ++ src/test/arena/weather_strong_winds.test.ts | 23 +++++++++++++++++---- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/data/ability.ts b/src/data/ability.ts index 10aba1f030e..1304f281285 100755 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -3923,7 +3923,7 @@ export class PostBattleLootAbAttr extends PostBattleAbAttr { } export class PostFaintAbAttr extends AbAttr { - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { return false; } } @@ -3974,7 +3974,7 @@ export class PostFaintClearWeatherAbAttr extends PostFaintAbAttr { * @param args N/A * @returns {boolean} Returns true if the weather clears, otherwise false. */ - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { const weatherType = pokemon.scene.arena.weather?.weatherType; let turnOffWeather = false; @@ -4022,8 +4022,8 @@ export class PostFaintContactDamageAbAttr extends PostFaintAbAttr { this.damageRatio = damageRatio; } - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + if (move !== undefined && attacker !== undefined && move.checkFlag(MoveFlags.MAKES_CONTACT, attacker, pokemon)) { //If the mon didn't die to indirect damage const cancelled = new Utils.BooleanHolder(false); pokemon.scene.getField(true).map(p => applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled, simulated)); if (cancelled.value || attacker.hasAbilityWithAttr(BlockNonDirectDamageAbAttr)) { @@ -4052,8 +4052,8 @@ export class PostFaintHPDamageAbAttr extends PostFaintAbAttr { super (); } - applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker: Pokemon, move: Move, hitResult: HitResult, args: any[]): boolean { - if (!simulated) { + applyPostFaint(pokemon: Pokemon, passive: boolean, simulated: boolean, attacker?: Pokemon, move?: Move, hitResult?: HitResult, ...args: any[]): boolean { + if (move !== undefined && attacker !== undefined && !simulated) { //If the mon didn't die to indirect damage const damage = pokemon.turnData.attacksReceived[0].damage; attacker.damageAndUpdate((damage), HitResult.OTHER); attacker.turnData.damageTaken += damage; @@ -4711,7 +4711,7 @@ export function applyPostBattleAbAttrs(attrType: Constructor, } export function applyPostFaintAbAttrs(attrType: Constructor, - pokemon: Pokemon, attacker: Pokemon, move: Move, hitResult: HitResult, simulated: boolean = false, ...args: any[]): Promise { + pokemon: Pokemon, attacker?: Pokemon, move?: Move, hitResult?: HitResult, simulated: boolean = false, ...args: any[]): Promise { return applyAbAttrsInternal(attrType, pokemon, (attr, passive) => attr.applyPostFaint(pokemon, passive, simulated, attacker, move, hitResult, args), args, false, simulated); } diff --git a/src/phases/faint-phase.ts b/src/phases/faint-phase.ts index 48366afaad4..c30003b79aa 100644 --- a/src/phases/faint-phase.ts +++ b/src/phases/faint-phase.ts @@ -65,6 +65,8 @@ export class FaintPhase extends PokemonPhase { if (pokemon.turnData?.attacksReceived?.length) { const lastAttack = pokemon.turnData.attacksReceived[0]; applyPostFaintAbAttrs(PostFaintAbAttr, pokemon, this.scene.getPokemonById(lastAttack.sourceId)!, new PokemonMove(lastAttack.move).getMove(), lastAttack.result); // TODO: is this bang correct? + } else { //If killed by indirect damage, apply post-faint abilities without providing a last move + applyPostFaintAbAttrs(PostFaintAbAttr, pokemon); } const alivePlayField = this.scene.getField(true); diff --git a/src/test/arena/weather_strong_winds.test.ts b/src/test/arena/weather_strong_winds.test.ts index 8b2d3e2547e..5ce0e61e647 100644 --- a/src/test/arena/weather_strong_winds.test.ts +++ b/src/test/arena/weather_strong_winds.test.ts @@ -1,4 +1,5 @@ import { allMoves } from "#app/data/move"; +import { StatusEffect } from "#app/enums/status-effect"; import { TurnStartPhase } from "#app/phases/turn-start-phase"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -33,7 +34,7 @@ describe("Weather - Strong Winds", () => { it("electric type move is not very effective on Rayquaza", async () => { game.override.enemySpecies(Species.RAYQUAZA); - await game.startBattle([Species.PIKACHU]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -44,7 +45,7 @@ describe("Weather - Strong Winds", () => { }); it("electric type move is neutral for flying type pokemon", async () => { - await game.startBattle([Species.PIKACHU]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -55,7 +56,7 @@ describe("Weather - Strong Winds", () => { }); it("ice type move is neutral for flying type pokemon", async () => { - await game.startBattle([Species.PIKACHU]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -66,7 +67,7 @@ describe("Weather - Strong Winds", () => { }); it("rock type move is neutral for flying type pokemon", async () => { - await game.startBattle([Species.PIKACHU]); + await game.classicMode.startBattle([Species.PIKACHU]); const pikachu = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; @@ -75,4 +76,18 @@ describe("Weather - Strong Winds", () => { await game.phaseInterceptor.to(TurnStartPhase); expect(enemy.getAttackTypeEffectiveness(allMoves[Moves.ROCK_SLIDE].type, pikachu)).toBe(1); }); + + it("weather goes away when last trainer pokemon dies to indirect damage", async () => { + game.override.enemyStatusEffect(StatusEffect.POISON); + + await game.classicMode.startBattle([Species.MAGIKARP]); + + const enemy = game.scene.getEnemyPokemon()!; + enemy.hp = 1; + + game.move.select(Moves.SPLASH); + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(game.scene.arena.weather?.weatherType).toBeUndefined(); + }); }); From 401568609b86fc816b03be5d8c15bde9f0944fcb Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 10 Sep 2024 01:00:26 +0800 Subject: [PATCH 16/30] [Dev] Add imports, Handle kebab-case fileName argument in test boilerplate script (#4072) * add imports, handle kebab-case fileName argument * fix spacing --- create-test-boilerplate.js | 46 +++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index 3c53eb1125b..3e598384fee 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -20,54 +20,59 @@ const type = args[0]; // "move" or "ability" let fileName = args[1]; // The file name if (!type || !fileName) { - console.error('Please provide both a type ("move", "ability", or "item") and a file name.'); - process.exit(1); + console.error('Please provide a type ("move", "ability", or "item") and a file name.'); + process.exit(1); } -// Convert fileName from to snake_case if camelCase is given -fileName = fileName.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase(); +// Convert fileName from kebab-case or camelCase to snake_case +fileName = fileName + .replace(/-+/g, '_') // Convert kebab-case (dashes) to underscores + .replace(/([a-z])([A-Z])/g, '$1_$2') // Convert camelCase to snake_case + .toLowerCase(); // Ensure all lowercase // Format the description for the test case const formattedName = fileName - .replace(/_/g, ' ') - .replace(/\b\w/g, char => char.toUpperCase()); + .replace(/_/g, ' ') + .replace(/\b\w/g, char => char.toUpperCase()); // Determine the directory based on the type let dir; let description; if (type === 'move') { - dir = path.join(__dirname, 'src', 'test', 'moves'); - description = `Moves - ${formattedName}`; + dir = path.join(__dirname, 'src', 'test', 'moves'); + description = `Moves - ${formattedName}`; } else if (type === 'ability') { - dir = path.join(__dirname, 'src', 'test', 'abilities'); - description = `Abilities - ${formattedName}`; + dir = path.join(__dirname, 'src', 'test', 'abilities'); + description = `Abilities - ${formattedName}`; } else if (type === "item") { - dir = path.join(__dirname, 'src', 'test', 'items'); - description = `Items - ${formattedName}`; + dir = path.join(__dirname, 'src', 'test', 'items'); + description = `Items - ${formattedName}`; } else { - console.error('Invalid type. Please use "move", "ability", or "item".'); - process.exit(1); + console.error('Invalid type. Please use "move", "ability", or "item".'); + process.exit(1); } // Ensure the directory exists if (!fs.existsSync(dir)) { - fs.mkdirSync(dir, { recursive: true }); + fs.mkdirSync(dir, { recursive: true }); } // Create the file with the given name const filePath = path.join(dir, `${fileName}.test.ts`); if (fs.existsSync(filePath)) { - console.error(`File "${fileName}.test.ts" already exists.`); - process.exit(1); + console.error(`File "${fileName}.test.ts" already exists.`); + process.exit(1); } // Define the content template const content = `import { Abilities } from "#enums/abilities"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; describe("${description}", () => { let phaserGame: Phaser.Game; @@ -87,14 +92,15 @@ describe("${description}", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override + .moveset([Moves.SPLASH]) .battleType("single") .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(SPLASH_ONLY); }); it("test case", async () => { - // await game.classicMode.startBattle(); - // game.move.select(); + // await game.classicMode.startBattle([Species.MAGIKARP]); + // game.move.select(Moves.SPLASH); }, TIMEOUT); }); `; From 9afab182e9dc15c865b410ccd2555dd3b2fc5e39 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 10 Sep 2024 03:02:11 +0800 Subject: [PATCH 17/30] [Test] Remove obsolete splash_only (#4139) --- create-test-boilerplate.js | 3 +-- src/test/moves/power_shift.test.ts | 3 +-- src/test/moves/tar_shot.test.ts | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/create-test-boilerplate.js b/create-test-boilerplate.js index 3e598384fee..d9cdbd4e7cf 100644 --- a/create-test-boilerplate.js +++ b/create-test-boilerplate.js @@ -70,7 +70,6 @@ const content = `import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, it, expect } from "vitest"; @@ -95,7 +94,7 @@ describe("${description}", () => { .moveset([Moves.SPLASH]) .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("test case", async () => { diff --git a/src/test/moves/power_shift.test.ts b/src/test/moves/power_shift.test.ts index 350041d9e4e..3fda315193e 100644 --- a/src/test/moves/power_shift.test.ts +++ b/src/test/moves/power_shift.test.ts @@ -3,7 +3,6 @@ import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -29,7 +28,7 @@ describe("Moves - Power Shift", () => { .battleType("single") .ability(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY); + .enemyMoveset(Moves.SPLASH); }); it("switches the user's raw Attack stat with its raw Defense stat", async () => { diff --git a/src/test/moves/tar_shot.test.ts b/src/test/moves/tar_shot.test.ts index 15667122a37..2963f061fc6 100644 --- a/src/test/moves/tar_shot.test.ts +++ b/src/test/moves/tar_shot.test.ts @@ -5,7 +5,6 @@ import { Species } from "#app/enums/species"; import { Stat } from "#app/enums/stat"; import { Abilities } from "#enums/abilities"; import GameManager from "#test/utils/gameManager"; -import { SPLASH_ONLY } from "#test/utils/testUtils"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; @@ -29,7 +28,7 @@ describe("Moves - Tar Shot", () => { game.override .battleType("single") .enemyAbility(Abilities.BALL_FETCH) - .enemyMoveset(SPLASH_ONLY) + .enemyMoveset(Moves.SPLASH) .enemySpecies(Species.TANGELA) .enemyLevel(1000) .moveset([Moves.TAR_SHOT, Moves.FIRE_PUNCH]) From 93170930441ef5524a438a77b188b2ca056622bf Mon Sep 17 00:00:00 2001 From: Brandon Bay Date: Mon, 9 Sep 2024 15:07:00 -0400 Subject: [PATCH 18/30] [Enhancement] [UI/UX] Add ability and passive tooltips to starter select screen (#4023) * Add ability and passive tooltips to starter select screen * Remove explicit casts to BattleScene * Increase tooltip size, reverse y when necessary, and always show passive tooltip * Add ability name to tooltip title and persist tooltips between Pokemon * Use vi function mocks --- .../mocks/mocksContainer/mockContainer.ts | 5 +- .../utils/mocks/mocksContainer/mockSprite.ts | 5 +- .../utils/mocks/mocksContainer/mockText.ts | 2 + src/ui/starter-select-ui-handler.ts | 87 ++++++++++++++++--- src/ui/ui.ts | 30 +++++-- 5 files changed, 104 insertions(+), 25 deletions(-) diff --git a/src/test/utils/mocks/mocksContainer/mockContainer.ts b/src/test/utils/mocks/mocksContainer/mockContainer.ts index d2cdd852257..94ae61a6ce4 100644 --- a/src/test/utils/mocks/mocksContainer/mockContainer.ts +++ b/src/test/utils/mocks/mocksContainer/mockContainer.ts @@ -52,9 +52,8 @@ export default class MockContainer implements MockGameObject { /// Sets the position of this Game Object to be a relative position from the source Game Object. } - setInteractive(hitArea?, callback?, dropZone?) { - /// Sets the InteractiveObject to be a drop zone for a drag and drop operation. - } + setInteractive = vi.fn(); + setOrigin(x, y) { this.x = x; this.y = y; diff --git a/src/test/utils/mocks/mocksContainer/mockSprite.ts b/src/test/utils/mocks/mocksContainer/mockSprite.ts index 35cd2d5faab..ae43df46cf5 100644 --- a/src/test/utils/mocks/mocksContainer/mockSprite.ts +++ b/src/test/utils/mocks/mocksContainer/mockSprite.ts @@ -1,5 +1,6 @@ import Phaser from "phaser"; import { MockGameObject } from "../mockGameObject"; +import { vi } from "vitest"; import Sprite = Phaser.GameObjects.Sprite; import Frame = Phaser.Textures.Frame; @@ -101,9 +102,7 @@ export default class MockSprite implements MockGameObject { return this.phaserSprite.stop(); } - setInteractive(hitArea, hitAreaCallback, dropZone) { - return null; - } + setInteractive = vi.fn(); on(event, callback, source) { return this.phaserSprite.on(event, callback, source); diff --git a/src/test/utils/mocks/mocksContainer/mockText.ts b/src/test/utils/mocks/mocksContainer/mockText.ts index 6b9ecf083fd..5a89432902b 100644 --- a/src/test/utils/mocks/mocksContainer/mockText.ts +++ b/src/test/utils/mocks/mocksContainer/mockText.ts @@ -197,6 +197,8 @@ export default class MockText implements MockGameObject { this.color = color; }); + setInteractive = vi.fn(); + setShadowColor(color) { // Sets the shadow color. // return this.phaserText.setShadowColor(color); diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 6b75c46bd45..e1269499b10 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -266,6 +266,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { private pokemonPassiveDisabledIcon: Phaser.GameObjects.Sprite; private pokemonPassiveLockedIcon: Phaser.GameObjects.Sprite; + private activeTooltip: "ABILITY" | "PASSIVE" | "CANDY" | undefined; private instructionsContainer: Phaser.GameObjects.Container; private filterInstructionsContainer: Phaser.GameObjects.Container; private shinyIconElement: Phaser.GameObjects.Sprite; @@ -561,10 +562,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonAbilityLabelText = addTextObject(this.scene, 6, 127 + starterInfoYOffset, i18next.t("starterSelectUiHandler:ability"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); this.pokemonAbilityLabelText.setOrigin(0, 0); this.pokemonAbilityLabelText.setVisible(false); + this.starterSelectContainer.add(this.pokemonAbilityLabelText); this.pokemonAbilityText = addTextObject(this.scene, starterInfoXPos, 127 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); this.pokemonAbilityText.setOrigin(0, 0); + this.pokemonAbilityText.setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains); + this.starterSelectContainer.add(this.pokemonAbilityText); this.pokemonPassiveLabelText = addTextObject(this.scene, 6, 136 + starterInfoYOffset, i18next.t("starterSelectUiHandler:passive"), TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); @@ -574,6 +578,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveText = addTextObject(this.scene, starterInfoXPos, 136 + starterInfoYOffset, "", TextStyle.SUMMARY_ALT, { fontSize: starterInfoTextSize }); this.pokemonPassiveText.setOrigin(0, 0); + this.pokemonPassiveText.setInteractive(new Phaser.Geom.Rectangle(0, 0, 250, 55), Phaser.Geom.Rectangle.Contains); this.starterSelectContainer.add(this.pokemonPassiveText); this.pokemonPassiveDisabledIcon = this.scene.add.sprite(starterInfoXPos, 137 + starterInfoYOffset, "icon_stop"); @@ -1921,6 +1926,14 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } while (newAbilityIndex !== this.abilityCursor); starterAttributes.ability = newAbilityIndex; // store the selected ability + + const { visible: tooltipVisible } = this.scene.ui.getTooltip(); + + if (tooltipVisible && this.activeTooltip === "ABILITY") { + const newAbility = allAbilities[this.lastSpecies.getAbility(newAbilityIndex)]; + this.scene.ui.editTooltip(`${newAbility.name}`, `${newAbility.description}`); + } + this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, newAbilityIndex, undefined); success = true; } @@ -2687,12 +2700,30 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } + getFriendship(speciesId: number) { + let currentFriendship = this.scene.gameData.starterData[speciesId].friendship; + if (!currentFriendship || currentFriendship === undefined) { + currentFriendship = 0; + } + + const friendshipCap = getStarterValueFriendshipCap(speciesStarters[speciesId]); + + return { currentFriendship, friendshipCap }; + } + setSpecies(species: PokemonSpecies | null) { this.speciesStarterDexEntry = species ? this.scene.gameData.dexData[species.speciesId] : null; this.dexAttrCursor = species ? this.getCurrentDexProps(species.speciesId) : 0n; this.abilityCursor = species ? this.scene.gameData.getStarterSpeciesDefaultAbilityIndex(species) : 0; this.natureCursor = species ? this.scene.gameData.getSpeciesDefaultNature(species) : 0; + if (!species && this.scene.ui.getTooltip().visible) { + this.scene.ui.hideTooltip(); + } + + this.pokemonAbilityText.off("pointerover"); + this.pokemonPassiveText.off("pointerover"); + const starterAttributes : StarterAttributes | null = species ? {...this.starterPreferences[species.speciesId]} : null; if (starterAttributes?.nature) { @@ -2807,17 +2838,18 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonHatchedIcon.setVisible(true); this.pokemonHatchedCountText.setVisible(true); - let currentFriendship = this.scene.gameData.starterData[this.lastSpecies.speciesId].friendship; - if (!currentFriendship || currentFriendship === undefined) { - currentFriendship = 0; - } - - const friendshipCap = getStarterValueFriendshipCap(speciesStarters[this.lastSpecies.speciesId]); + const { currentFriendship, friendshipCap } = this.getFriendship(this.lastSpecies.speciesId); const candyCropY = 16 - (16 * (currentFriendship / friendshipCap)); if (this.pokemonCandyDarknessOverlay.visible) { - this.pokemonCandyDarknessOverlay.on("pointerover", () => (this.scene as BattleScene).ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true)); - this.pokemonCandyDarknessOverlay.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); + this.pokemonCandyDarknessOverlay.on("pointerover", () => { + this.scene.ui.showTooltip("", `${currentFriendship}/${friendshipCap}`, true); + this.activeTooltip = "CANDY"; + }); + this.pokemonCandyDarknessOverlay.on("pointerout", () => { + this.scene.ui.hideTooltip(); + this.activeTooltip = undefined; + }); } this.pokemonCandyDarknessOverlay.setCrop(0, 0, 16, candyCropY); @@ -2932,6 +2964,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.abilityCursor = -1; this.natureCursor = -1; + if (this.activeTooltip === "CANDY") { + const { currentFriendship, friendshipCap } = this.getFriendship(this.lastSpecies.speciesId); + this.scene.ui.editTooltip("", `${currentFriendship}/${friendshipCap}`); + } + if (species?.forms?.find(f => f.formKey === "female")) { if (female !== undefined) { formIndex = female ? 1 : 0; @@ -3081,8 +3118,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } if (dexEntry.caughtAttr) { - const ability = this.lastSpecies.getAbility(abilityIndex!); // TODO: is this bang correct? - this.pokemonAbilityText.setText(allAbilities[ability].name); + const ability = allAbilities[this.lastSpecies.getAbility(abilityIndex!)]; // TODO: is this bang correct? + this.pokemonAbilityText.setText(ability.name); const isHidden = abilityIndex === (this.lastSpecies.ability2 ? 2 : 1); this.pokemonAbilityText.setColor(this.getTextColor(!isHidden ? TextStyle.SUMMARY_ALT : TextStyle.SUMMARY_GOLD)); @@ -3091,6 +3128,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { const passiveAttr = this.scene.gameData.starterData[species.speciesId].passiveAttr; const passiveAbility = allAbilities[starterPassiveAbilities[this.lastSpecies.speciesId]]; + if (this.pokemonAbilityText.visible) { + if (this.activeTooltip === "ABILITY") { + this.scene.ui.editTooltip(`${ability.name}`, `${ability.description}`); + } + + this.pokemonAbilityText.on("pointerover", () => { + this.scene.ui.showTooltip(`${ability.name}`, `${ability.description}`, true); + this.activeTooltip = "ABILITY"; + }); + this.pokemonAbilityText.on("pointerout", () => { + this.scene.ui.hideTooltip(); + this.activeTooltip = undefined; + }); + } + if (passiveAbility) { const isUnlocked = !!(passiveAttr & PassiveAttr.UNLOCKED); const isEnabled = !!(passiveAttr & PassiveAttr.ENABLED); @@ -3107,6 +3159,21 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.pokemonPassiveText.setAlpha(textAlpha); this.pokemonPassiveText.setShadowColor(this.getTextColor(textStyle, true)); + if (this.activeTooltip === "PASSIVE") { + this.scene.ui.editTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`); + } + + if (this.pokemonPassiveText.visible) { + this.pokemonPassiveText.on("pointerover", () => { + this.scene.ui.showTooltip(`${passiveAbility.name}`, `${passiveAbility.description}`, true); + this.activeTooltip = "PASSIVE"; + }); + this.pokemonPassiveText.on("pointerout", () => { + this.scene.ui.hideTooltip(); + this.activeTooltip = undefined; + }); + } + const iconPosition = { x: this.pokemonPassiveText.x + this.pokemonPassiveText.displayWidth + 1, y: this.pokemonPassiveText.y + this.pokemonPassiveText.displayHeight / 2 diff --git a/src/ui/ui.ts b/src/ui/ui.ts index a9bcbbf0cb5..50fb240aad8 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -244,7 +244,7 @@ export default class UI extends Phaser.GameObjects.Container { this.tooltipContent = addTextObject(this.scene, 6, 16, "", TextStyle.TOOLTIP_CONTENT); this.tooltipContent.setName("text-tooltip-content"); - this.tooltipContent.setWordWrapWidth(696); + this.tooltipContent.setWordWrapWidth(850); this.tooltipContainer.add(this.tooltipBg); this.tooltipContainer.add(this.tooltipTitle); @@ -368,14 +368,13 @@ export default class UI extends Phaser.GameObjects.Container { return false; } + getTooltip(): { visible: boolean; title: string; content: string } { + return { visible: this.tooltipContainer.visible, title: this.tooltipTitle.text, content: this.tooltipContent.text }; + } + showTooltip(title: string, content: string, overlap?: boolean): void { this.tooltipContainer.setVisible(true); - this.tooltipTitle.setText(title || ""); - const wrappedContent = this.tooltipContent.runWordWrap(content); - this.tooltipContent.setText(wrappedContent); - this.tooltipContent.y = title ? 16 : 4; - this.tooltipBg.width = Math.min(Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, 684); - this.tooltipBg.height = (title ? 31 : 19) + 10.5 * (wrappedContent.split("\n").length - 1); + this.editTooltip(title, content); if (overlap) { (this.scene as BattleScene).uiContainer.moveAbove(this.tooltipContainer, this); } else { @@ -383,6 +382,15 @@ export default class UI extends Phaser.GameObjects.Container { } } + editTooltip(title: string, content: string): void { + this.tooltipTitle.setText(title || ""); + const wrappedContent = this.tooltipContent.runWordWrap(content); + this.tooltipContent.setText(wrappedContent); + this.tooltipContent.y = title ? 16 : 4; + this.tooltipBg.width = Math.min(Math.max(this.tooltipTitle.displayWidth, this.tooltipContent.displayWidth) + 12, 838); + this.tooltipBg.height = (title ? 31 : 19) + 10.5 * (wrappedContent.split("\n").length - 1); + } + hideTooltip(): void { this.tooltipContainer.setVisible(false); this.tooltipTitle.clearTint(); @@ -390,8 +398,12 @@ export default class UI extends Phaser.GameObjects.Container { update(): void { if (this.tooltipContainer.visible) { - const reverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.x >= this.scene.game.canvas.width - this.tooltipBg.width * 6 - 12; - this.tooltipContainer.setPosition(!reverse ? this.scene.game.input.mousePointer!.x / 6 + 2 : this.scene.game.input.mousePointer!.x / 6 - this.tooltipBg.width - 2, this.scene.game.input.mousePointer!.y / 6 + 2); // TODO: are these bangs correct? + const xReverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.x >= this.scene.game.canvas.width - this.tooltipBg.width * 6 - 12; + const yReverse = this.scene.game.input.mousePointer && this.scene.game.input.mousePointer.y >= this.scene.game.canvas.height - this.tooltipBg.height * 6 - 12; + this.tooltipContainer.setPosition( + !xReverse ? this.scene.game.input.mousePointer!.x / 6 + 2 : this.scene.game.input.mousePointer!.x / 6 - this.tooltipBg.width - 2, + !yReverse ? this.scene.game.input.mousePointer!.y / 6 + 2 : this.scene.game.input.mousePointer!.y / 6 - this.tooltipBg.height - 2, + ); } } From a82d64b5b5b4705902566484fc643f1ec2852d53 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 10 Sep 2024 03:41:53 +0800 Subject: [PATCH 19/30] [Ability] Implement Gorilla Tactics (#4051) * fully implement gorilla tactics * fix atk increase * update oversight * add showAbility param * fix postmerge * fix postmerge * update tests --- src/data/ability.ts | 40 +++++++++- src/data/battler-tags.ts | 85 +++++++++++++++++++++- src/enums/battler-tag-type.ts | 1 + src/locales/en/battle.json | 1 + src/test/abilities/gorilla_tactics.test.ts | 84 +++++++++++++++++++++ 5 files changed, 204 insertions(+), 7 deletions(-) create mode 100644 src/test/abilities/gorilla_tactics.test.ts diff --git a/src/data/ability.ts b/src/data/ability.ts index 1304f281285..6acf77cfca5 100755 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -1595,8 +1595,8 @@ export class PostAttackAbAttr extends AbAttr { private attackCondition: PokemonAttackCondition; /** The default attackCondition requires that the selected move is a damaging move */ - constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS)) { - super(); + constructor(attackCondition: PokemonAttackCondition = (user, target, move) => (move.category !== MoveCategory.STATUS), showAbility: boolean = true) { + super(showAbility); this.attackCondition = attackCondition; } @@ -1624,6 +1624,40 @@ export class PostAttackAbAttr extends AbAttr { } } +/** + * Ability attribute for Gorilla Tactics + * @extends PostAttackAbAttr + */ +export class GorillaTacticsAbAttr extends PostAttackAbAttr { + constructor() { + super((user, target, move) => true, false); + } + + /** + * + * @param {Pokemon} pokemon the {@linkcode Pokemon} with this ability + * @param passive n/a + * @param simulated whether the ability is being simulated + * @param defender n/a + * @param move n/a + * @param hitResult n/a + * @param args n/a + * @returns `true` if the ability is applied + */ + applyPostAttackAfterMoveTypeCheck(pokemon: Pokemon, passive: boolean, simulated: boolean, defender: Pokemon, move: Move, hitResult: HitResult | null, args: any[]): boolean | Promise { + if (simulated) { + return simulated; + } + + if (pokemon.getTag(BattlerTagType.GORILLA_TACTICS)) { + return false; + } + + pokemon.addTag(BattlerTagType.GORILLA_TACTICS); + return true; + } +} + export class PostAttackStealHeldItemAbAttr extends PostAttackAbAttr { private stealCondition: PokemonAttackCondition | null; @@ -5597,7 +5631,7 @@ export function initAbilities() { .bypassFaint() .partial(), new Ability(Abilities.GORILLA_TACTICS, 8) - .unimplemented(), + .attr(GorillaTacticsAbAttr), new Ability(Abilities.NEUTRALIZING_GAS, 8) .attr(SuppressFieldAbilitiesAbAttr) .attr(UncopiableAbilityAbAttr) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index 71385facb23..52e039ed874 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -119,7 +119,9 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { const move = phase.move; if (this.isMoveRestricted(move.moveId)) { - pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId)); + if (this.interruptedText(pokemon, move.moveId)) { + pokemon.scene.queueMessage(this.interruptedText(pokemon, move.moveId)); + } phase.cancel(); } @@ -155,7 +157,9 @@ export abstract class MoveRestrictionBattlerTag extends BattlerTag { * @param {Moves} move {@linkcode Moves} ID of the move being interrupted * @returns {string} text to display when the move is interrupted */ - abstract interruptedText(pokemon: Pokemon, move: Moves): string; + interruptedText(pokemon: Pokemon, move: Moves): string { + return ""; + } } /** @@ -221,7 +225,7 @@ export class DisabledTag extends MoveRestrictionBattlerTag { /** * @override * - * Ensures that move history exists on `pokemon` and has a valid move. If so, sets the {@link moveId} and shows a message. + * Ensures that move history exists on `pokemon` and has a valid move. If so, sets the {@linkcode moveId} and shows a message. * Otherwise the move ID will not get assigned and this tag will get removed next turn. */ override onAdd(pokemon: Pokemon): void { @@ -250,7 +254,12 @@ export class DisabledTag extends MoveRestrictionBattlerTag { return i18next.t("battle:moveDisabled", { moveName: allMoves[move].name }); } - /** @override */ + /** + * @override + * @param {Pokemon} pokemon {@linkcode Pokemon} attempting to use the restricted move + * @param {Moves} move {@linkcode Moves} ID of the move being interrupted + * @returns {string} text to display when the move is interrupted + */ override interruptedText(pokemon: Pokemon, move: Moves): string { return i18next.t("battle:disableInterruptedMove", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon), moveName: allMoves[move].name }); } @@ -262,6 +271,72 @@ export class DisabledTag extends MoveRestrictionBattlerTag { } } +/** + * Tag used by Gorilla Tactics to restrict the user to using only one move. + * @extends MoveRestrictionBattlerTag + */ +export class GorillaTacticsTag extends MoveRestrictionBattlerTag { + private moveId = Moves.NONE; + + constructor() { + super(BattlerTagType.GORILLA_TACTICS, BattlerTagLapseType.CUSTOM, 0); + } + + /** @override */ + override isMoveRestricted(move: Moves): boolean { + return move !== this.moveId; + } + + /** + * @override + * @param {Pokemon} pokemon the {@linkcode Pokemon} to check if the tag can be added + * @returns `true` if the pokemon has a valid move and no existing {@linkcode GorillaTacticsTag}; `false` otherwise + */ + override canAdd(pokemon: Pokemon): boolean { + return (this.getLastValidMove(pokemon) !== undefined) && !pokemon.getTag(GorillaTacticsTag); + } + + /** + * Ensures that move history exists on {@linkcode Pokemon} and has a valid move. + * If so, sets the {@linkcode moveId} and increases the user's Attack by 50%. + * @override + * @param {Pokemon} pokemon the {@linkcode Pokemon} to add the tag to + */ + override onAdd(pokemon: Pokemon): void { + const lastValidMove = this.getLastValidMove(pokemon); + + if (!lastValidMove) { + return; + } + + this.moveId = lastValidMove; + pokemon.setStat(Stat.ATK, pokemon.getStat(Stat.ATK, false) * 1.5, false); + } + + /** + * + * @override + * @param {Pokemon} pokemon n/a + * @param {Moves} move {@linkcode Moves} ID of the move being denied + * @returns {string} text to display when the move is denied + */ + override selectionDeniedText(pokemon: Pokemon, move: Moves): string { + return i18next.t("battle:canOnlyUseMove", { moveName: allMoves[this.moveId].name, pokemonName: getPokemonNameWithAffix(pokemon) }); + } + + /** + * Gets the last valid move from the pokemon's move history. + * @param {Pokemon} pokemon {@linkcode Pokemon} to get the last valid move from + * @returns {Moves | undefined} the last valid move from the pokemon's move history + */ + getLastValidMove(pokemon: Pokemon): Moves | undefined { + const move = pokemon.getLastXMoves() + .find(m => m.move !== Moves.NONE && m.move !== Moves.STRUGGLE && !m.virtual); + + return move?.move; + } +} + /** * BattlerTag that represents the "recharge" effects of moves like Hyper Beam. */ @@ -2203,6 +2278,8 @@ export function getBattlerTag(tagType: BattlerTagType, turnCount: number, source return new TarShotTag(); case BattlerTagType.THROAT_CHOPPED: return new ThroatChoppedTag(); + case BattlerTagType.GORILLA_TACTICS: + return new GorillaTacticsTag(); case BattlerTagType.NONE: default: return new BattlerTag(tagType, BattlerTagLapseType.CUSTOM, turnCount, sourceMove, sourceId); diff --git a/src/enums/battler-tag-type.ts b/src/enums/battler-tag-type.ts index 7d559f32cb3..cb83ebf4882 100644 --- a/src/enums/battler-tag-type.ts +++ b/src/enums/battler-tag-type.ts @@ -73,6 +73,7 @@ export enum BattlerTagType { SHELL_TRAP = "SHELL_TRAP", DRAGON_CHEER = "DRAGON_CHEER", NO_RETREAT = "NO_RETREAT", + GORILLA_TACTICS = "GORILLA_TACTICS", THROAT_CHOPPED = "THROAT_CHOPPED", TAR_SHOT = "TAR_SHOT", } diff --git a/src/locales/en/battle.json b/src/locales/en/battle.json index 0aabaacd99c..217c77422d1 100644 --- a/src/locales/en/battle.json +++ b/src/locales/en/battle.json @@ -44,6 +44,7 @@ "moveNotImplemented": "{{moveName}} is not yet implemented and cannot be selected.", "moveNoPP": "There's no PP left for\nthis move!", "moveDisabled": "{{moveName}} is disabled!", + "canOnlyUseMove": "{{pokemonName}} can only use {{moveName}}!", "moveCannotBeSelected": "{{moveName}} cannot be selected!", "disableInterruptedMove": "{{pokemonNameWithAffix}}'s {{moveName}}\nis disabled!", "throatChopInterruptedMove": "The effects of Throat Chop prevent\n{{pokemonName}} from using certain moves!", diff --git a/src/test/abilities/gorilla_tactics.test.ts b/src/test/abilities/gorilla_tactics.test.ts new file mode 100644 index 00000000000..e772088ea97 --- /dev/null +++ b/src/test/abilities/gorilla_tactics.test.ts @@ -0,0 +1,84 @@ +import { BattlerIndex } from "#app/battle"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Stat } from "#app/enums/stat"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +describe("Abilities - Gorilla Tactics", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const TIMEOUT = 20 * 1000; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.SPLASH, Moves.DISABLE]) + .enemySpecies(Species.MAGIKARP) + .enemyLevel(30) + .moveset([Moves.SPLASH, Moves.TACKLE]) + .ability(Abilities.GORILLA_TACTICS); + }); + + it("boosts the Pokémon's Attack by 50%, but limits the Pokémon to using only one move", async () => { + await game.classicMode.startBattle([Species.GALAR_DARMANITAN]); + + const darmanitan = game.scene.getPlayerPokemon()!; + const initialAtkStat = darmanitan.getStat(Stat.ATK); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.SPLASH); + + await game.phaseInterceptor.to("TurnEndPhase"); + + expect(darmanitan.getStat(Stat.ATK, false)).toBeCloseTo(initialAtkStat * 1.5); + // Other moves should be restricted + expect(darmanitan.isMoveRestricted(Moves.TACKLE)).toBe(true); + expect(darmanitan.isMoveRestricted(Moves.SPLASH)).toBe(false); + }, TIMEOUT); + + it("should struggle if the only usable move is disabled", async () => { + await game.classicMode.startBattle([Species.GALAR_DARMANITAN]); + + const darmanitan = game.scene.getPlayerPokemon()!; + const enemy = game.scene.getEnemyPokemon()!; + + game.move.select(Moves.SPLASH); + + await game.phaseInterceptor.to("TurnEndPhase"); + + // Turn where Tackle is interrupted by Disable + await game.toNextTurn(); + + game.move.select(Moves.SPLASH); + await game.forceEnemyMove(Moves.DISABLE); + + await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); + + await game.phaseInterceptor.to("TurnEndPhase"); + expect(enemy.hp).toBe(enemy.getMaxHp()); + + // Turn where Struggle is used + await game.toNextTurn(); + + game.move.select(Moves.TACKLE); + await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); + + await game.phaseInterceptor.to("MoveEndPhase"); + expect(darmanitan.hp).toBeLessThan(darmanitan.getMaxHp()); + }, TIMEOUT); +}); From d9a8448c6eb898cd55710aced996e12199906024 Mon Sep 17 00:00:00 2001 From: Jannik Tappert <38758606+CodeTappert@users.noreply.github.com> Date: Mon, 9 Sep 2024 21:57:07 +0200 Subject: [PATCH 20/30] [Enhancement] Added the ability to localize the tera type hover text (#4138) --- src/locales/de/fight-ui-handler.json | 3 ++- src/locales/en/fight-ui-handler.json | 3 ++- src/ui/battle-info.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/locales/de/fight-ui-handler.json b/src/locales/de/fight-ui-handler.json index 6965540c703..f803375e8de 100644 --- a/src/locales/de/fight-ui-handler.json +++ b/src/locales/de/fight-ui-handler.json @@ -3,5 +3,6 @@ "power": "Stärke", "accuracy": "Genauigkeit", "abilityFlyInText": "{{passive}}{{abilityName}} von {{pokemonName}} wirkt!", - "passive": "Passive Fähigkeit " + "passive": "Passive Fähigkeit ", + "teraHover": "Tera-Typ {{type}}" } \ No newline at end of file diff --git a/src/locales/en/fight-ui-handler.json b/src/locales/en/fight-ui-handler.json index 35b7f42772a..1b8bd1f5c71 100644 --- a/src/locales/en/fight-ui-handler.json +++ b/src/locales/en/fight-ui-handler.json @@ -3,5 +3,6 @@ "power": "Power", "accuracy": "Accuracy", "abilityFlyInText": " {{pokemonName}}'s {{passive}}{{abilityName}}", - "passive": "Passive " + "passive": "Passive ", + "teraHover": "{{type}} Terastallized" } \ No newline at end of file diff --git a/src/ui/battle-info.ts b/src/ui/battle-info.ts index 05c634609f8..c7b82dc826e 100644 --- a/src/ui/battle-info.ts +++ b/src/ui/battle-info.ts @@ -323,7 +323,7 @@ export default class BattleInfo extends Phaser.GameObjects.Container { this.teraIcon.setVisible(this.lastTeraType !== Type.UNKNOWN); this.teraIcon.on("pointerover", () => { if (this.lastTeraType !== Type.UNKNOWN) { - (this.scene as BattleScene).ui.showTooltip("", `${Utils.toReadableString(Type[this.lastTeraType])} Terastallized`); + (this.scene as BattleScene).ui.showTooltip("", i18next.t("fightUiHandler:teraHover", {type: i18next.t(`pokemonInfo:Type.${Type[this.lastTeraType]}`) })); } }); this.teraIcon.on("pointerout", () => (this.scene as BattleScene).ui.hideTooltip()); From e9595954710669526350a04ac2889d34a60016d8 Mon Sep 17 00:00:00 2001 From: "Adrian T." <68144167+torranx@users.noreply.github.com> Date: Tue, 10 Sep 2024 04:03:29 +0800 Subject: [PATCH 21/30] [Test] Fix throat chop and gorilla tactics tests (#4140) --- src/test/abilities/gorilla_tactics.test.ts | 17 ++++++++--------- src/test/moves/throat_chop.test.ts | 6 ++++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/test/abilities/gorilla_tactics.test.ts b/src/test/abilities/gorilla_tactics.test.ts index e772088ea97..df698194323 100644 --- a/src/test/abilities/gorilla_tactics.test.ts +++ b/src/test/abilities/gorilla_tactics.test.ts @@ -30,7 +30,7 @@ describe("Abilities - Gorilla Tactics", () => { .enemyMoveset([Moves.SPLASH, Moves.DISABLE]) .enemySpecies(Species.MAGIKARP) .enemyLevel(30) - .moveset([Moves.SPLASH, Moves.TACKLE]) + .moveset([Moves.SPLASH, Moves.TACKLE, Moves.GROWL]) .ability(Abilities.GORILLA_TACTICS); }); @@ -57,22 +57,21 @@ describe("Abilities - Gorilla Tactics", () => { const darmanitan = game.scene.getPlayerPokemon()!; const enemy = game.scene.getEnemyPokemon()!; - game.move.select(Moves.SPLASH); + // First turn, lock move to Growl + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.SPLASH); - await game.phaseInterceptor.to("TurnEndPhase"); - - // Turn where Tackle is interrupted by Disable + // Second turn, Growl is interrupted by Disable await game.toNextTurn(); - game.move.select(Moves.SPLASH); + game.move.select(Moves.GROWL); await game.forceEnemyMove(Moves.DISABLE); - await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); await game.phaseInterceptor.to("TurnEndPhase"); - expect(enemy.hp).toBe(enemy.getMaxHp()); + expect(enemy.getStatStage(Stat.ATK)).toBe(-1); // Only the effect of the first Growl should be applied - // Turn where Struggle is used + // Third turn, Struggle is used await game.toNextTurn(); game.move.select(Moves.TACKLE); diff --git a/src/test/moves/throat_chop.test.ts b/src/test/moves/throat_chop.test.ts index 151aec58b38..cb34b4bafff 100644 --- a/src/test/moves/throat_chop.test.ts +++ b/src/test/moves/throat_chop.test.ts @@ -36,12 +36,14 @@ describe("Moves - Throat Chop", () => { it("prevents the target from using sound-based moves for two turns", async () => { await game.classicMode.startBattle([Species.MAGIKARP]); + const enemy = game.scene.getEnemyPokemon()!; + game.move.select(Moves.GROWL); await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]); // First turn, move is interrupted await game.phaseInterceptor.to("TurnEndPhase"); - expect(game.scene.getPlayerPokemon()?.getStatStage(Stat.ATK)).toBe(0); + expect(enemy.getStatStage(Stat.ATK)).toBe(0); // Second turn, struggle if no valid moves await game.toNextTurn(); @@ -50,6 +52,6 @@ describe("Moves - Throat Chop", () => { await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]); await game.phaseInterceptor.to("MoveEndPhase"); - expect(game.scene.getEnemyPokemon()!.isFullHp()).toBe(false); + expect(enemy.isFullHp()).toBe(false); }, TIMEOUT); }); From a919b9c0afc0ea3d49af2aff00bfb503ccc497fe Mon Sep 17 00:00:00 2001 From: Raidette <73134872+Raidette@users.noreply.github.com> Date: Mon, 9 Sep 2024 23:35:04 +0200 Subject: [PATCH 22/30] [Move] Implement After You (#1789) * Complete after you implementation (no localization) * reset override changes * Remove hardcoded English text, add tests * Fix test * Make sure phases occur in the correct order * fix after-you issues - fix i18n interpolation ot state "target name" and not "pokemon name" as the target takes the offer, not the user - fix some tsdocs - add override to apply - update scene.findPhase to be able to use generic types. Add tsdocs * add move-trigger.afterYou for DE * fix after_you.test.ts --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com> --- src/battle-scene.ts | 10 ++++- src/data/move.ts | 35 ++++++++++++++++- src/locales/de/move-trigger.json | 3 +- src/locales/en/move-trigger.json | 5 ++- src/test/moves/after_you.test.ts | 65 ++++++++++++++++++++++++++++++++ 5 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 src/test/moves/after_you.test.ts diff --git a/src/battle-scene.ts b/src/battle-scene.ts index ff4258a13f5..72778fa8589 100644 --- a/src/battle-scene.ts +++ b/src/battle-scene.ts @@ -2193,8 +2193,14 @@ export default class BattleScene extends SceneBase { return true; } - findPhase(phaseFilter: (phase: Phase) => boolean): Phase | undefined { - return this.phaseQueue.find(phaseFilter); + /** + * Find a specific {@linkcode Phase} in the phase queue. + * + * @param phaseFilter filter function to use to find the wanted phase + * @returns the found phase or undefined if none found + */ + findPhase

(phaseFilter: (phase: P) => boolean): P | undefined { + return this.phaseQueue.find(phaseFilter) as P; } tryReplacePhase(phaseFilter: (phase: Phase) => boolean, phase: Phase): boolean { diff --git a/src/data/move.ts b/src/data/move.ts index d9e385fdd0e..7800d6df12a 100644 --- a/src/data/move.ts +++ b/src/data/move.ts @@ -6272,12 +6272,42 @@ export class VariableTargetAttr extends MoveAttr { } } +/** + * Attribute for {@linkcode Moves.AFTER_YOU} + * + * [After You - Move | Bulbapedia](https://bulbapedia.bulbagarden.net/wiki/After_You_(move)) + */ +export class AfterYouAttr extends MoveEffectAttr { + /** + * Allows the target of this move to act right after the user. + * + * @param user {@linkcode Pokemon} that is using the move. + * @param target {@linkcode Pokemon} that will move right after this move is used. + * @param move {@linkcode Move} {@linkcode Moves.AFTER_YOU} + * @param _args N/A + * @returns true + */ + override apply(user: Pokemon, target: Pokemon, _move: Move, _args: any[]): boolean { + user.scene.queueMessage(i18next.t("moveTriggers:afterYou", {targetName: getPokemonNameWithAffix(target)})); + + //Will find next acting phase of the targeted pokémon, delete it and queue it next on successful delete. + const nextAttackPhase = target.scene.findPhase((phase) => phase.pokemon === target); + if (nextAttackPhase && target.scene.tryRemovePhase((phase: MovePhase) => phase.pokemon === target)) { + target.scene.prependToPhase(new MovePhase(target.scene, target, [...nextAttackPhase.targets], nextAttackPhase.move), MovePhase); + } + + return true; + } +} + const failOnGravityCondition: MoveConditionFunc = (user, target, move) => !user.scene.arena.getTag(ArenaTagType.GRAVITY); const failOnBossCondition: MoveConditionFunc = (user, target, move) => !target.isBossImmune(); const failOnMaxCondition: MoveConditionFunc = (user, target, move) => !target.isMax(); +const failIfSingleBattle: MoveConditionFunc = (user, target, move) => user.scene.currentBattle.double; + const failIfDampCondition: MoveConditionFunc = (user, target, move) => { const cancelled = new Utils.BooleanHolder(false); user.scene.getField(true).map(p=>applyAbAttrs(FieldPreventExplosiveMovesAbAttr, p, cancelled)); @@ -7925,7 +7955,10 @@ export function initMoves() { .attr(AbilityGiveAttr), new StatusMove(Moves.AFTER_YOU, Type.NORMAL, -1, 15, -1, 0, 5) .ignoresProtect() - .unimplemented(), + .target(MoveTarget.NEAR_OTHER) + .condition(failIfSingleBattle) + .condition((user, target, move) => !target.turnData.acted) + .attr(AfterYouAttr), new AttackMove(Moves.ROUND, Type.NORMAL, MoveCategory.SPECIAL, 60, 100, 15, -1, 0, 5) .soundBased() .partial(), diff --git a/src/locales/de/move-trigger.json b/src/locales/de/move-trigger.json index 61283c9e62e..01b22429fb3 100644 --- a/src/locales/de/move-trigger.json +++ b/src/locales/de/move-trigger.json @@ -66,5 +66,6 @@ "revivalBlessing": "{{pokemonName}} ist wieder fit und kampfbereit!", "swapArenaTags": "{{pokemonName}} hat die Effekte, die auf den beiden Seiten des Kampffeldes wirken, miteinander getauscht!", "exposedMove": "{{pokemonName}} erkennt {{targetPokemonName}}!", - "safeguard": "{{targetName}} wird durch Bodyguard geschützt!" + "safeguard": "{{targetName}} wird durch Bodyguard geschützt!", + "afterYou": "{{targetName}} lässt sich auf Galanterie ein!" } diff --git a/src/locales/en/move-trigger.json b/src/locales/en/move-trigger.json index 867905c5a9f..375ea354d33 100644 --- a/src/locales/en/move-trigger.json +++ b/src/locales/en/move-trigger.json @@ -67,5 +67,6 @@ "revivalBlessing": "{{pokemonName}} was revived!", "swapArenaTags": "{{pokemonName}} swapped the battle effects affecting each side of the field!", "exposedMove": "{{pokemonName}} identified\n{{targetPokemonName}}!", - "safeguard": "{{targetName}} is protected by Safeguard!" -} \ No newline at end of file + "safeguard": "{{targetName}} is protected by Safeguard!", + "afterYou": "{{pokemonName}} took the kind offer!" +} diff --git a/src/test/moves/after_you.test.ts b/src/test/moves/after_you.test.ts new file mode 100644 index 00000000000..efce1b28a17 --- /dev/null +++ b/src/test/moves/after_you.test.ts @@ -0,0 +1,65 @@ +import { BattlerIndex } from "#app/battle"; +import { Abilities } from "#app/enums/abilities"; +import { MoveResult } from "#app/field/pokemon"; +import { MovePhase } from "#app/phases/move-phase"; +import { Moves } from "#enums/moves"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; + +const TIMEOUT = 20 * 1000; + +describe("Moves - After You", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("double") + .enemyLevel(5) + .enemySpecies(Species.PIKACHU) + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset(Moves.SPLASH) + .ability(Abilities.BALL_FETCH) + .moveset([Moves.AFTER_YOU, Moves.SPLASH]); + }); + + it("makes the target move immediately after the user", async () => { + await game.classicMode.startBattle([Species.REGIELEKI, Species.SHUCKLE]); + + game.move.select(Moves.AFTER_YOU, 0, BattlerIndex.PLAYER_2); + game.move.select(Moves.SPLASH, 1); + + await game.phaseInterceptor.to("MoveEffectPhase"); + await game.phaseInterceptor.to(MovePhase, false); + const phase = game.scene.getCurrentPhase() as MovePhase; + expect(phase.pokemon).toBe(game.scene.getPlayerField()[1]); + await game.phaseInterceptor.to("MoveEndPhase"); + }, TIMEOUT); + + it("fails if target already moved", async () => { + game.override.enemySpecies(Species.SHUCKLE); + await game.classicMode.startBattle([Species.REGIELEKI, Species.PIKACHU]); + + game.move.select(Moves.SPLASH); + game.move.select(Moves.AFTER_YOU, 1, BattlerIndex.PLAYER); + + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to("MoveEndPhase"); + await game.phaseInterceptor.to(MovePhase); + + expect(game.scene.getPlayerField()[1].getLastXMoves(1)[0].result).toBe(MoveResult.FAIL); + }, TIMEOUT); +}); From 9c4c19b5fb1870911e420f692644374ed1c6fe97 Mon Sep 17 00:00:00 2001 From: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Date: Tue, 10 Sep 2024 16:12:17 +0200 Subject: [PATCH 23/30] [UI Bug] Fix HA icon not always showing in egg summary screen (#4150) --- src/ui/egg-summary-ui-handler.ts | 104 +++++++++++++++++-------------- src/ui/pokemon-info-container.ts | 2 +- 2 files changed, 57 insertions(+), 49 deletions(-) diff --git a/src/ui/egg-summary-ui-handler.ts b/src/ui/egg-summary-ui-handler.ts index af82ab33438..1d18e75f530 100644 --- a/src/ui/egg-summary-ui-handler.ts +++ b/src/ui/egg-summary-ui-handler.ts @@ -29,8 +29,10 @@ export default class EggSummaryUiHandler extends MessageUiHandler { private summaryContainer: Phaser.GameObjects.Container; /** container for the mini pokemon sprites */ private pokemonIconSpritesContainer: Phaser.GameObjects.Container; - /** container for the icons displayed alongside the mini icons (e.g. shiny, HA capsule) */ + /** container for the icons displayed on top of the mini pokemon sprites (e.g. shiny, HA capsule) */ private pokemonIconsContainer: Phaser.GameObjects.Container; + /** container for the elements displayed behind the mini pokemon sprites (e.g. egg rarity bg) */ + private pokemonBackgroundContainer: Phaser.GameObjects.Container; /** hatch info container that displays the current pokemon / hatch (main element on left hand side) */ private infoContainer: PokemonHatchInfoContainer; /** handles jumping animations for the pokemon sprite icons */ @@ -71,15 +73,17 @@ export default class EggSummaryUiHandler extends MessageUiHandler { this.eggHatchBg.setOrigin(0, 0); this.eggHatchContainer.add(this.eggHatchBg); - this.pokemonIconsContainer = this.scene.add.container(iconContainerX, iconContainerY); - this.pokemonIconSpritesContainer = this.scene.add.container(iconContainerX, iconContainerY); - this.summaryContainer.add(this.pokemonIconsContainer); - this.summaryContainer.add(this.pokemonIconSpritesContainer); - this.cursorObj = this.scene.add.image(0, 0, "select_cursor"); this.cursorObj.setOrigin(0, 0); this.summaryContainer.add(this.cursorObj); + this.pokemonIconSpritesContainer = this.scene.add.container(iconContainerX, iconContainerY); + this.pokemonIconsContainer = this.scene.add.container(iconContainerX, iconContainerY); + this.pokemonBackgroundContainer = this.scene.add.container(iconContainerX, iconContainerY); + this.summaryContainer.add(this.pokemonBackgroundContainer); + this.summaryContainer.add(this.pokemonIconSpritesContainer); + this.summaryContainer.add(this.pokemonIconsContainer); + this.infoContainer = new PokemonHatchInfoContainer(this.scene, this.summaryContainer); this.infoContainer.setup(); this.infoContainer.changeToEggSummaryLayout(); @@ -95,6 +99,7 @@ export default class EggSummaryUiHandler extends MessageUiHandler { this.summaryContainer.setVisible(false); this.pokemonIconSpritesContainer.removeAll(true); this.pokemonIconsContainer.removeAll(true); + this.pokemonBackgroundContainer.removeAll(true); this.eggHatchBg.setVisible(false); this.getUi().hideTooltip(); // Note: Questions on garbage collection go to @frutescens @@ -164,25 +169,25 @@ export default class EggSummaryUiHandler extends MessageUiHandler { const offset = 2; const rightSideX = 12; - const bg = this.scene.add.image(x+2, y+5, "passive_bg"); - bg.setOrigin(0, 0); - bg.setScale(0.75); - bg.setVisible(true); - this.pokemonIconsContainer.add(bg); + const rarityBg = this.scene.add.image(x + 2, y + 5, "passive_bg"); + rarityBg.setOrigin(0, 0); + rarityBg.setScale(0.75); + rarityBg.setVisible(true); + this.pokemonBackgroundContainer.add(rarityBg); // set tint for passive bg switch (getEggTierForSpecies(displayPokemon.species)) { case EggTier.COMMON: - bg.setVisible(false); + rarityBg.setVisible(false); break; case EggTier.GREAT: - bg.setTint(0xabafff); + rarityBg.setTint(0xabafff); break; case EggTier.ULTRA: - bg.setTint(0xffffaa); + rarityBg.setTint(0xffffaa); break; case EggTier.MASTER: - bg.setTint(0xdfffaf); + rarityBg.setTint(0xdfffaf); break; } const species = displayPokemon.species; @@ -192,35 +197,31 @@ export default class EggSummaryUiHandler extends MessageUiHandler { const isShiny = displayPokemon.shiny; // set pokemon icon (and replace with base sprite if there is a mismatch) - const icon = this.scene.add.sprite(x - offset, y + offset, species.getIconAtlasKey(formIndex, isShiny, variant)); - icon.setScale(0.5); - icon.setOrigin(0, 0); - icon.setFrame(species.getIconId(female, formIndex, isShiny, variant)); + const pokemonIcon = this.scene.add.sprite(x - offset, y + offset, species.getIconAtlasKey(formIndex, isShiny, variant)); + pokemonIcon.setScale(0.5); + pokemonIcon.setOrigin(0, 0); + pokemonIcon.setFrame(species.getIconId(female, formIndex, isShiny, variant)); - if (icon.frame.name !== species.getIconId(female, formIndex, isShiny, variant)) { + if (pokemonIcon.frame.name !== species.getIconId(female, formIndex, isShiny, variant)) { console.log(`${species.name}'s variant icon does not exist. Replacing with default.`); - icon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); - icon.setFrame(species.getIconId(female, formIndex, false, variant)); + pokemonIcon.setTexture(species.getIconAtlasKey(formIndex, false, variant)); + pokemonIcon.setFrame(species.getIconId(female, formIndex, false, variant)); } - this.pokemonIconSpritesContainer.add(icon); - this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.NONE); + this.pokemonIconSpritesContainer.add(pokemonIcon); - const shiny = this.scene.add.image(x + rightSideX, y + offset * 2, "shiny_star_small"); - shiny.setScale(0.5); - shiny.setVisible(displayPokemon.shiny); - shiny.setTint(getVariantTint(displayPokemon.variant)); - this.pokemonIconsContainer.add(shiny); + const shinyIcon = this.scene.add.image(x + rightSideX, y + offset, "shiny_star_small"); + shinyIcon.setOrigin(0, 0); + shinyIcon.setScale(0.5); + shinyIcon.setVisible(displayPokemon.shiny); + shinyIcon.setTint(getVariantTint(displayPokemon.variant)); + this.pokemonIconsContainer.add(shinyIcon); - const ha = this.scene.add.image(x + rightSideX, y + 7, "ha_capsule"); - ha.setScale(0.5); - ha.setVisible((displayPokemon.hasAbility(displayPokemon.species.abilityHidden))); - this.pokemonIconsContainer.add(ha); + const haIcon = this.scene.add.image(x + rightSideX, y + offset * 4, "ha_capsule"); + haIcon.setOrigin(0, 0); + haIcon.setScale(0.5); + haIcon.setVisible(displayPokemon.abilityIndex === 2); + this.pokemonIconsContainer.add(haIcon); - const pb = this.scene.add.image(x + rightSideX, y + offset * 7, "icon_owned"); - pb.setOrigin(0, 0); - pb.setScale(0.5); - - // add animation for new unlocks (new catch or new shiny or new form) const dexEntry = value.dexEntryBeforeUpdate; const caughtAttr = dexEntry.caughtAttr; const newShiny = BigInt(1 << (displayPokemon.shiny ? 1 : 0)); @@ -228,17 +229,24 @@ export default class EggSummaryUiHandler extends MessageUiHandler { const newShinyOrVariant = ((newShiny & caughtAttr) === BigInt(0)) || ((newVariant & caughtAttr) === BigInt(0)); const newForm = (BigInt(1 << displayPokemon.formIndex) * DexAttr.DEFAULT_FORM & caughtAttr) === BigInt(0); - pb.setVisible(!caughtAttr || newForm); - if (!caughtAttr || newShinyOrVariant || newForm) { - this.iconAnimHandler.addOrUpdate(icon, PokemonIconAnimMode.PASSIVE); - } - this.pokemonIconsContainer.add(pb); + const pokeballIcon = this.scene.add.image(x + rightSideX, y + offset * 7, "icon_owned"); + pokeballIcon.setOrigin(0, 0); + pokeballIcon.setScale(0.5); + pokeballIcon.setVisible(!caughtAttr || newForm); + this.pokemonIconsContainer.add(pokeballIcon); - const em = this.scene.add.image(x, y + offset, "icon_egg_move"); - em.setOrigin(0, 0); - em.setScale(0.5); - em.setVisible(value.eggMoveUnlocked); - this.pokemonIconsContainer.add(em); + const eggMoveIcon = this.scene.add.image(x, y + offset, "icon_egg_move"); + eggMoveIcon.setOrigin(0, 0); + eggMoveIcon.setScale(0.5); + eggMoveIcon.setVisible(value.eggMoveUnlocked); + this.pokemonIconsContainer.add(eggMoveIcon); + + // add animation to the Pokemon sprite for new unlocks (new catch, new shiny or new form) + if (!caughtAttr || newShinyOrVariant || newForm) { + this.iconAnimHandler.addOrUpdate(pokemonIcon, PokemonIconAnimMode.PASSIVE); + } else { + this.iconAnimHandler.addOrUpdate(pokemonIcon, PokemonIconAnimMode.NONE); + } }); this.setCursor(0); diff --git a/src/ui/pokemon-info-container.ts b/src/ui/pokemon-info-container.ts index 49bfd4d7293..3c54e529d43 100644 --- a/src/ui/pokemon-info-container.ts +++ b/src/ui/pokemon-info-container.ts @@ -262,7 +262,7 @@ export default class PokemonInfoContainer extends Phaser.GameObjects.Container { this.pokemonFormText.disableInteractive(); } - const abilityTextStyle = pokemon.abilityIndex === (pokemon.species.ability2 ? 2 : 1) ? TextStyle.MONEY : TextStyle.WINDOW; + const abilityTextStyle = pokemon.abilityIndex === 2 ? TextStyle.MONEY : TextStyle.WINDOW; this.pokemonAbilityText.setText(pokemon.getAbility(true).name); this.pokemonAbilityText.setColor(getTextColor(abilityTextStyle, false, this.scene.uiTheme)); this.pokemonAbilityText.setShadowColor(getTextColor(abilityTextStyle, true, this.scene.uiTheme)); From 4b8083211ab114c94d7f194494a168bf353647b1 Mon Sep 17 00:00:00 2001 From: Madmadness65 <59298170+Madmadness65@users.noreply.github.com> Date: Tue, 10 Sep 2024 09:13:16 -0500 Subject: [PATCH 24/30] [P3 Bug] Fix Transform SFX not playing on quiet form changes (#4144) --- src/phases/quiet-form-change-phase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/phases/quiet-form-change-phase.ts b/src/phases/quiet-form-change-phase.ts index 6a1d31d137d..dde500e156a 100644 --- a/src/phases/quiet-form-change-phase.ts +++ b/src/phases/quiet-form-change-phase.ts @@ -65,7 +65,7 @@ export class QuietFormChangePhase extends BattlePhase { pokemonFormTintSprite.setVisible(false); pokemonFormTintSprite.setTintFill(0xFFFFFF); - this.scene.playSound("PRSFX- Transform"); + this.scene.playSound("battle_anims/PRSFX- Transform"); this.scene.tweens.add({ targets: pokemonTintSprite, From 5bf21a4f7519d2a8850e6ea5b4c7e12b9d89909d Mon Sep 17 00:00:00 2001 From: PigeonBar <56974298+PigeonBar@users.noreply.github.com> Date: Tue, 10 Sep 2024 10:15:07 -0400 Subject: [PATCH 25/30] [Bug] Fix rare egg move and species rates for Manaphy eggs (#4125) --- src/data/egg.ts | 12 ++- src/test/eggs/manaphy-egg.test.ts | 118 ++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/test/eggs/manaphy-egg.test.ts diff --git a/src/data/egg.ts b/src/data/egg.ts index ce27030ebef..1cd5c65fc18 100644 --- a/src/data/egg.ts +++ b/src/data/egg.ts @@ -222,7 +222,7 @@ export class Egg { let pokemonSpecies = getPokemonSpecies(this._species); // Special condition to have Phione eggs also have a chance of generating Manaphy - if (this._species === Species.PHIONE) { + if (this._species === Species.PHIONE && this._sourceType === EggSourceType.SAME_SPECIES_EGG) { pokemonSpecies = getPokemonSpecies(Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) ? Species.PHIONE : Species.MANAPHY); } @@ -326,7 +326,8 @@ export class Egg { break; } - return Utils.randSeedInt(baseChance * Math.pow(2, 3 - this.tier)) ? Utils.randSeedInt(3) : 3; + const tierMultiplier = this.isManaphyEgg() ? 2 : Math.pow(2, 3 - this.tier); + return Utils.randSeedInt(baseChance * tierMultiplier) ? Utils.randSeedInt(3) : 3; } private getEggTierDefaultHatchWaves(eggTier?: EggTier): number { @@ -361,7 +362,12 @@ export class Egg { * the species that was the legendary focus at the time */ if (this.isManaphyEgg()) { - const rand = Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE); + /** + * Adding a technicality to make unit tests easier: By making this check pass + * when Utils.randSeedInt(8) = 1, and by making the generatePlayerPokemon() species + * check pass when Utils.randSeedInt(8) = 0, we can tell them apart during tests. + */ + const rand = (Utils.randSeedInt(MANAPHY_EGG_MANAPHY_RATE) !== 1); return rand ? Species.PHIONE : Species.MANAPHY; } else if (this.tier === EggTier.MASTER && this._sourceType === EggSourceType.GACHA_LEGENDARY) { diff --git a/src/test/eggs/manaphy-egg.test.ts b/src/test/eggs/manaphy-egg.test.ts new file mode 100644 index 00000000000..257bf330bb8 --- /dev/null +++ b/src/test/eggs/manaphy-egg.test.ts @@ -0,0 +1,118 @@ +import { Egg } from "#app/data/egg"; +import { EggSourceType } from "#app/enums/egg-source-types"; +import { EggTier } from "#app/enums/egg-type"; +import { Species } from "#enums/species"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; + +describe("Manaphy Eggs", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + const EGG_HATCH_COUNT: integer = 48; + let rngSweepProgress: number = 0; + + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + game = new GameManager(phaserGame); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + vi.restoreAllMocks(); + }); + + beforeEach(async () => { + await game.importData("src/test/utils/saves/everything.prsv"); + + /** + * In our tests, we will perform an "RNG sweep" by letting rngSweepProgress + * increase uniformly from 0 to 1 in order to get a uniform sample of the + * possible RNG outcomes. This will let us quickly and consistently find + * the probability of each RNG outcome. + */ + vi.spyOn(Phaser.Math.RND, "realInRange").mockImplementation((min: number, max: number) => { + return rngSweepProgress * (max - min) + min; + }); + }); + + it("should have correct Manaphy rates and Rare Egg Move rates, from the egg gacha", () => { + const scene = game.scene; + + let manaphyCount = 0; + let phioneCount = 0; + let rareEggMoveCount = 0; + for (let i = 0; i < EGG_HATCH_COUNT; i++) { + rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); + + const newEgg = new Egg({ scene, tier: EggTier.COMMON, sourceType: EggSourceType.GACHA_SHINY, id: 204 }); + const newHatch = newEgg.generatePlayerPokemon(scene); + if (newHatch.species.speciesId === Species.MANAPHY) { + manaphyCount++; + } else if (newHatch.species.speciesId === Species.PHIONE) { + phioneCount++; + } + if (newEgg.eggMoveIndex === 3) { + rareEggMoveCount++; + } + } + + expect(manaphyCount + phioneCount).toBe(EGG_HATCH_COUNT); + expect(manaphyCount).toBe(1/8 * EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe(1/12 * EGG_HATCH_COUNT); + }); + + it("should have correct Manaphy rates and Rare Egg Move rates, from Phione species eggs", () => { + const scene = game.scene; + + let manaphyCount = 0; + let phioneCount = 0; + let rareEggMoveCount = 0; + for (let i = 0; i < EGG_HATCH_COUNT; i++) { + rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); + + const newEgg = new Egg({ scene, species: Species.PHIONE, sourceType: EggSourceType.SAME_SPECIES_EGG }); + const newHatch = newEgg.generatePlayerPokemon(scene); + if (newHatch.species.speciesId === Species.MANAPHY) { + manaphyCount++; + } else if (newHatch.species.speciesId === Species.PHIONE) { + phioneCount++; + } + if (newEgg.eggMoveIndex === 3) { + rareEggMoveCount++; + } + } + + expect(manaphyCount + phioneCount).toBe(EGG_HATCH_COUNT); + expect(manaphyCount).toBe(1/8 * EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe(1/6 * EGG_HATCH_COUNT); + }); + + it("should have correct Manaphy rates and Rare Egg Move rates, from Manaphy species eggs", () => { + const scene = game.scene; + + let manaphyCount = 0; + let phioneCount = 0; + let rareEggMoveCount = 0; + for (let i = 0; i < EGG_HATCH_COUNT; i++) { + rngSweepProgress = (2 * i + 1) / (2 * EGG_HATCH_COUNT); + + const newEgg = new Egg({ scene, species: Species.MANAPHY, sourceType: EggSourceType.SAME_SPECIES_EGG }); + const newHatch = newEgg.generatePlayerPokemon(scene); + if (newHatch.species.speciesId === Species.MANAPHY) { + manaphyCount++; + } else if (newHatch.species.speciesId === Species.PHIONE) { + phioneCount++; + } + if (newEgg.eggMoveIndex === 3) { + rareEggMoveCount++; + } + } + + expect(phioneCount).toBe(0); + expect(manaphyCount).toBe(EGG_HATCH_COUNT); + expect(rareEggMoveCount).toBe(1/6 * EGG_HATCH_COUNT); + }); +}); From 150ab3d1b29a7191bfef6d2107e3ffe43a38aa54 Mon Sep 17 00:00:00 2001 From: AJ Fontaine <36677462+Fontbane@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:54:23 -0400 Subject: [PATCH 26/30] [UI/UX] Make "CH-CHING!" sound when unlocking passive (#4151) * Make "CH-CHING!" sound when unlocking passive * Remove unused parameters in line above sound --- src/ui/starter-select-ui-handler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index e1269499b10..89f1b87bcf4 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1724,7 +1724,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); ui.setMode(Mode.STARTER_SELECT); - this.setSpeciesDetails(this.lastSpecies, undefined, undefined, undefined, undefined, undefined, undefined); + this.setSpeciesDetails(this.lastSpecies); + this.scene.playSound("se/buy"); // if starterContainer exists, update the passive background if (starterContainer) { From d1b058fe3e4224343283a74e44d98589d6702a20 Mon Sep 17 00:00:00 2001 From: MokaStitcher <54149968+MokaStitcher@users.noreply.github.com> Date: Tue, 10 Sep 2024 20:00:50 +0200 Subject: [PATCH 27/30] [UI] fix candy upgrade icon not updating after purchasing eggs (#4153) --- src/ui/starter-select-ui-handler.ts | 53 +++++++++++++++++------------ 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/src/ui/starter-select-ui-handler.ts b/src/ui/starter-select-ui-handler.ts index 89f1b87bcf4..0c3d8de61b0 100644 --- a/src/ui/starter-select-ui-handler.ts +++ b/src/ui/starter-select-ui-handler.ts @@ -1220,6 +1220,19 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } } + /** + * Update the display of candy upgrade icons or animations for the given StarterContainer + * @param starterContainer the container for the Pokemon to update + */ + updateCandyUpgradeDisplay(starterContainer: StarterContainer) { + if (this.isUpgradeIconEnabled() ) { + this.setUpgradeIcon(starterContainer); + } + if (this.isUpgradeAnimationEnabled()) { + this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); + } + } + /** * Processes an {@linkcode CandyUpgradeNotificationChangedEvent} sent when the corresponding setting changes * @param event {@linkcode Event} sent by the callback @@ -1624,7 +1637,7 @@ export default class StarterSelectUiHandler extends MessageUiHandler { } }); } - const candyCount = starterData.candyCount; + const passiveAttr = starterData.passiveAttr; if (passiveAttr & PassiveAttr.UNLOCKED) { // this is for enabling and disabling the passive if (!(passiveAttr & PassiveAttr.ENABLED)) { @@ -1705,8 +1718,13 @@ export default class StarterSelectUiHandler extends MessageUiHandler { return true; } }); - const showUseCandies = () => { // this lets you use your candies + + // Purchases with Candy + const candyCount = starterData.candyCount; + const showUseCandies = () => { const options: any[] = []; // TODO: add proper type + + // Unlock passive option if (!(passiveAttr & PassiveAttr.UNLOCKED)) { const passiveCost = getPassiveCandyCount(speciesStarters[this.lastSpecies.speciesId]); options.push({ @@ -1727,16 +1745,9 @@ export default class StarterSelectUiHandler extends MessageUiHandler { this.setSpeciesDetails(this.lastSpecies); this.scene.playSound("se/buy"); - // if starterContainer exists, update the passive background + // update the passive background and icon/animation for available upgrade if (starterContainer) { - // Update the candy upgrade display - if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(starterContainer); - } - if (this.isUpgradeAnimationEnabled()) { - this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); - } - + this.updateCandyUpgradeDisplay(starterContainer); starterContainer.starterPassiveBgs.setVisible(!!this.scene.gameData.starterData[this.lastSpecies.speciesId].passiveAttr); } return true; @@ -1747,6 +1758,8 @@ export default class StarterSelectUiHandler extends MessageUiHandler { itemArgs: starterColors[this.lastSpecies.speciesId] }); } + + // Reduce cost option const valueReduction = starterData.valueReduction; if (valueReduction < valueReductionMax) { const reductionCost = getValueReductionCandyCounts(speciesStarters[this.lastSpecies.speciesId])[valueReduction]; @@ -1768,19 +1781,10 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); this.scene.playSound("se/buy"); - // if starterContainer exists, update the value reduction background + // update the value label and icon/animation for available upgrade if (starterContainer) { this.updateStarterValueLabel(starterContainer); - - // If the notification setting is set to 'On', update the candy upgrade display - if (this.scene.candyUpgradeNotification === 2) { - if (this.isUpgradeIconEnabled() ) { - this.setUpgradeIcon(starterContainer); - } - if (this.isUpgradeAnimationEnabled()) { - this.setUpgradeAnimation(starterContainer.icon, this.lastSpecies, true); - } - } + this.updateCandyUpgradeDisplay(starterContainer); } return true; } @@ -1813,6 +1817,11 @@ export default class StarterSelectUiHandler extends MessageUiHandler { ui.setMode(Mode.STARTER_SELECT); this.scene.playSound("se/buy"); + // update the icon/animation for available upgrade + if (starterContainer) { + this.updateCandyUpgradeDisplay(starterContainer); + } + return true; } return false; From 14ace406344b02151ad7e1bdedcc3c77a599d04d Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Tue, 10 Sep 2024 13:34:50 -0700 Subject: [PATCH 28/30] [Misc] eslint rule to prevent `.js` imports (#4160) * add `eslint-plugin-import-x` module * add import eslint rules * remove .js extensions * rename account.spec to account.test * move fontFace.setup into `setupFiles` instead of importing it in `vitest.setup.ts` --- eslint.config.js | 7 +- package-lock.json | 200 ++++++++++++++++++ package.json | 1 + src/phases/weather-effect-phase.ts | 2 +- src/system/version-converter.ts | 2 +- src/test/{account.spec.ts => account.test.ts} | 0 .../double_battle_chance_booster.test.ts | 12 +- src/test/vitest.setup.ts | 1 - vitest.config.ts | 2 +- 9 files changed, 214 insertions(+), 13 deletions(-) rename src/test/{account.spec.ts => account.test.ts} (100%) diff --git a/eslint.config.js b/eslint.config.js index eeea38e3178..80e9e67b525 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,7 +1,7 @@ import tseslint from '@typescript-eslint/eslint-plugin'; import stylisticTs from '@stylistic/eslint-plugin-ts' import parser from '@typescript-eslint/parser'; -// import imports from 'eslint-plugin-import'; // Disabled due to not being compatible with eslint v9 +import importX from 'eslint-plugin-import-x'; export default [ { @@ -11,7 +11,7 @@ export default [ parser: parser }, plugins: { - // imports: imports.configs.recommended // Disabled due to not being compatible with eslint v9 + "import-x": importX, '@stylistic/ts': stylisticTs, '@typescript-eslint': tseslint }, @@ -39,7 +39,8 @@ export default [ }], "space-before-blocks": ["error", "always"], // Enforces a space before blocks "keyword-spacing": ["error", { "before": true, "after": true }], // Enforces spacing before and after keywords - "comma-spacing": ["error", { "before": false, "after": true }] // Enforces spacing after comma + "comma-spacing": ["error", { "before": false, "after": true }], // Enforces spacing after comma + "import-x/extensions": ["error", "never", { "json": "always" }], // Enforces no extension for imports unless json } } ] diff --git a/package-lock.json b/package-lock.json index 0605b299dab..4a447554819 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "@vitest/coverage-istanbul": "^2.0.4", "dependency-cruiser": "^16.3.10", "eslint": "^9.7.0", + "eslint-plugin-import-x": "^4.2.1", "jsdom": "^24.0.0", "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", @@ -2505,6 +2506,19 @@ "node": ">=8" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -2687,6 +2701,155 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.2.1.tgz", + "integrity": "sha512-WWi2GedccIJa0zXxx3WDnTgouGQTtdYK1nhXMwywbqqAgB0Ov+p1pYBsWh3VaB0bvBOwLse6OfVII7jZD9xo5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.1.0", + "debug": "^4.3.4", + "doctrine": "^3.0.0", + "eslint-import-resolver-node": "^0.3.9", + "get-tsconfig": "^4.7.3", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3", + "semver": "^7.6.3", + "stable-hash": "^0.0.4", + "tslib": "^2.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/scope-manager": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.5.0.tgz", + "integrity": "sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/types": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.5.0.tgz", + "integrity": "sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.5.0.tgz", + "integrity": "sha512-vEG2Sf9P8BPQ+d0pxdfndw3xIXaoSjliG0/Ejk7UggByZPKXmJmw3GW5jV2gHNQNawBUyfahoSiCFVov0Ruf7Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/visitor-keys": "8.5.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/utils": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.5.0.tgz", + "integrity": "sha512-6yyGYVL0e+VzGYp60wvkBHiqDWOpT63pdMV2CVG4LVDd5uR6q1qQN/7LafBZtAtNIn/mqXjsSeS5ggv/P0iECw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.5.0", + "@typescript-eslint/types": "8.5.0", + "@typescript-eslint/typescript-estree": "8.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.5.0.tgz", + "integrity": "sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.5.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/eslint-scope": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", @@ -3143,6 +3306,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", + "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -4854,6 +5030,16 @@ "node": ">=4" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -5069,6 +5255,13 @@ "node": ">=0.10.0" } }, + "node_modules/stable-hash": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.4.tgz", + "integrity": "sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==", + "dev": true, + "license": "MIT" + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -5460,6 +5653,13 @@ "node": ">=6" } }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 83e82585d1e..dddf5aedebd 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "@vitest/coverage-istanbul": "^2.0.4", "dependency-cruiser": "^16.3.10", "eslint": "^9.7.0", + "eslint-plugin-import-x": "^4.2.1", "jsdom": "^24.0.0", "lefthook": "^1.6.12", "phaser3spectorjs": "^0.0.8", diff --git a/src/phases/weather-effect-phase.ts b/src/phases/weather-effect-phase.ts index e85ef0326f6..73de44389d0 100644 --- a/src/phases/weather-effect-phase.ts +++ b/src/phases/weather-effect-phase.ts @@ -1,5 +1,5 @@ import BattleScene from "#app/battle-scene"; -import { applyPreWeatherEffectAbAttrs, SuppressWeatherEffectAbAttr, PreWeatherDamageAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPostWeatherLapseAbAttrs, PostWeatherLapseAbAttr } from "#app/data/ability.js"; +import { applyPreWeatherEffectAbAttrs, SuppressWeatherEffectAbAttr, PreWeatherDamageAbAttr, applyAbAttrs, BlockNonDirectDamageAbAttr, applyPostWeatherLapseAbAttrs, PostWeatherLapseAbAttr } from "#app/data/ability"; import { CommonAnim } from "#app/data/battle-anims"; import { Weather, getWeatherDamageMessage, getWeatherLapseMessage } from "#app/data/weather"; import { BattlerTagType } from "#app/enums/battler-tag-type"; diff --git a/src/system/version-converter.ts b/src/system/version-converter.ts index ed65fcd99b8..1a7c7b2026a 100644 --- a/src/system/version-converter.ts +++ b/src/system/version-converter.ts @@ -1,4 +1,4 @@ -import { allSpecies } from "#app/data/pokemon-species.js"; +import { allSpecies } from "#app/data/pokemon-species"; import { AbilityAttr, defaultStarterSpecies, DexAttr, SessionSaveData, SystemSaveData } from "./game-data"; import { SettingKeys } from "./settings/settings"; diff --git a/src/test/account.spec.ts b/src/test/account.test.ts similarity index 100% rename from src/test/account.spec.ts rename to src/test/account.test.ts diff --git a/src/test/items/double_battle_chance_booster.test.ts b/src/test/items/double_battle_chance_booster.test.ts index f581af7afc5..1d5051fa9e9 100644 --- a/src/test/items/double_battle_chance_booster.test.ts +++ b/src/test/items/double_battle_chance_booster.test.ts @@ -1,13 +1,13 @@ -import { Moves } from "#app/enums/moves.js"; -import { Species } from "#app/enums/species.js"; +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; import { DoubleBattleChanceBoosterModifier } from "#app/modifier/modifier"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; -import { ShopCursorTarget } from "#app/enums/shop-cursor-target.js"; -import { Mode } from "#app/ui/ui.js"; -import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler.js"; -import { Button } from "#app/enums/buttons.js"; +import { ShopCursorTarget } from "#app/enums/shop-cursor-target"; +import { Mode } from "#app/ui/ui"; +import ModifierSelectUiHandler from "#app/ui/modifier-select-ui-handler"; +import { Button } from "#app/enums/buttons"; describe("Items - Double Battle Chance Boosters", () => { let phaserGame: Phaser.Game; diff --git a/src/test/vitest.setup.ts b/src/test/vitest.setup.ts index eaa987c1a66..bf806cd053a 100644 --- a/src/test/vitest.setup.ts +++ b/src/test/vitest.setup.ts @@ -1,4 +1,3 @@ -import "#test/fontFace.setup"; import "vitest-canvas-mock"; import { initLoggedInUser } from "#app/account"; diff --git a/vitest.config.ts b/vitest.config.ts index 9a765a89ae7..bfa380ec5fa 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -2,7 +2,7 @@ import { defineProject, UserWorkspaceConfig } from 'vitest/config'; import { defaultConfig } from './vite.config'; export const defaultProjectTestConfig: UserWorkspaceConfig["test"] = { - setupFiles: ['./src/test/vitest.setup.ts'], + setupFiles: ['./src/test/fontFace.setup.ts', './src/test/vitest.setup.ts'], server: { deps: { inline: ['vitest-canvas-mock'], From e17bf592c22a7e53d7a06e6e891d975dc0962ffe Mon Sep 17 00:00:00 2001 From: flx-sta <50131232+flx-sta@users.noreply.github.com> Date: Tue, 10 Sep 2024 14:13:42 -0700 Subject: [PATCH 29/30] [Bug] Use silent mode during tests (unless debugging!) + test workflow optimization (#4154) * add :silent to all tests but disable it if the runner is in debug mode! * fix: use `--silent` instead of `:silent` Cause the previous was npm scrpt specific (whops) * remove env and replace with logic in each call * reduce redundancy by checking out once * move pre-test into `needs` after `checkout` * use cache approach in pre-test * add node.js install step to `setup` job * WIP: setup -> pre-test -> all other tests with using cache * use matrix approach for tests * fix matrix approach for tests * fix wrong use of env var in `run-test-template.yml` * test: out-comment `run-tests` to see whats wrong * test: see if this works * let's try using matrix again... * make `node-version` input a string * remove `node-version` input for now * test: without a matrix fornow * change usage of reuseable workflow call * fix call of matrix.project * try using working-dir * try setup for pre-tests * remove `runs-on` from run-tests * fix some identations for run-tests * add pre-test as requirement for running tests * use `1` instead of `'1'` to check `runner.debug` * add `options` input. Possible fix for debug = not silent * try again... * not as an ENV but inside * move 2nd ${{ !runner.debug && '--silent' }} check into test-template * fix printing `false` instead of empty-string on runner-debug check * try a yml array approach * test running with file include path * make `project` always `main` for now * remove all extra vitest workspaces * adopt `shards` workflow in vitest * fix workflow reference in tests.yml * add missing `$` in test-shard-template.yml` * chore: fix vitest.config.ts after merge man.. cant trust these machines * make `project` a variable. try to use inputs on job names * adjust `test-shard-template` job name --- .github/workflows/test-shard-template.yml | 30 +++++++ .github/workflows/tests.yml | 98 +++++------------------ vitest.config.ts | 84 +++++++++---------- vitest.workspace.ts | 54 ------------- 4 files changed, 90 insertions(+), 176 deletions(-) create mode 100644 .github/workflows/test-shard-template.yml diff --git a/.github/workflows/test-shard-template.yml b/.github/workflows/test-shard-template.yml new file mode 100644 index 00000000000..ac89b503f0c --- /dev/null +++ b/.github/workflows/test-shard-template.yml @@ -0,0 +1,30 @@ +name: Test Template + +on: + workflow_call: + inputs: + project: + required: true + type: string + shard: + required: true + type: number + totalShards: + required: true + type: number + +jobs: + test: + name: Shard ${{ inputs.shard }} of ${{ inputs.totalShards }} + runs-on: ubuntu-latest + steps: + - name: Check out Git repository + uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + - name: Install Node.js dependencies + run: npm ci + - name: Run tests + run: npx vitest --project ${{ inputs.project }} --shard=${{ inputs.shard }}/${{ inputs.totalShards }} ${{ !runner.debug && '--silent' || '' }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2a78ec252b8..66cc3ecc139 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -15,91 +15,33 @@ on: types: [checks_requested] jobs: - run-misc-tests: # Define a job named "run-tests" - name: Run misc tests # Human-readable name for the job - runs-on: ubuntu-latest # Specify the latest Ubuntu runner for the job - - steps: - - name: Check out Git repository # Step to check out the repository - uses: actions/checkout@v4 # Use the checkout action version 4 - - - name: Set up Node.js # Step to set up Node.js environment - uses: actions/setup-node@v4 # Use the setup-node action version 4 - with: - node-version: 20 # Specify Node.js version 20 - - - name: Install Node.js dependencies # Step to install Node.js dependencies - run: npm ci # Use 'npm ci' to install dependencies - - - name: pre-test # pre-test to check overrides - run: npx vitest run --project pre - - name: test misc - run: npx vitest --project misc - - run-abilities-tests: - name: Run abilities tests - runs-on: ubuntu-latest + pre-test: + name: Run Pre-test + runs-on: ubuntu-latest steps: - name: Check out Git repository uses: actions/checkout@v4 + with: + path: tests-action - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Install Node.js dependencies + working-directory: tests-action run: npm ci - - name: pre-test - run: npx vitest run --project pre - - name: test abilities - run: npx vitest --project abilities + - name: Run Pre-test + working-directory: tests-action + run: npx vitest run --project pre ${{ !runner.debug && '--silent' || '' }} - run-items-tests: - name: Run items tests - runs-on: ubuntu-latest - steps: - - name: Check out Git repository - uses: actions/checkout@v4 - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Install Node.js dependencies - run: npm ci - - name: pre-test - run: npx vitest run --project pre - - name: test items - run: npx vitest --project items - - run-moves-tests: - name: Run moves tests - runs-on: ubuntu-latest - steps: - - name: Check out Git repository - uses: actions/checkout@v4 - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Install Node.js dependencies - run: npm ci - - name: pre-test - run: npx vitest run --project pre - - name: test moves - run: npx vitest --project moves - - run-battle-tests: - name: Run battle tests - runs-on: ubuntu-latest - steps: - - name: Check out Git repository - uses: actions/checkout@v4 - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Install Node.js dependencies - run: npm ci - - name: pre-test - run: npx vitest run --project pre - - name: test battle - run: npx vitest --project battle \ No newline at end of file + run-tests: + name: Run Tests + needs: [pre-test] + strategy: + matrix: + shard: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] + uses: ./.github/workflows/test-shard-template.yml + with: + project: main + shard: ${{ matrix.shard }} + totalShards: 10 \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts index bfa380ec5fa..54462675704 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,46 +1,42 @@ -import { defineProject, UserWorkspaceConfig } from 'vitest/config'; -import { defaultConfig } from './vite.config'; - -export const defaultProjectTestConfig: UserWorkspaceConfig["test"] = { - setupFiles: ['./src/test/fontFace.setup.ts', './src/test/vitest.setup.ts'], - server: { - deps: { - inline: ['vitest-canvas-mock'], - //@ts-ignore - optimizer: { - web: { - include: ['vitest-canvas-mock'], - } - } - } - }, - environment: 'jsdom' as const, - environmentOptions: { - jsdom: { - resources: 'usable', - }, - }, - threads: false, - trace: true, - restoreMocks: true, - watch: false, - coverage: { - provider: 'istanbul' as const, - reportsDirectory: 'coverage' as const, - reporters: ['text-summary', 'html'], - }, -} +import { defineProject } from "vitest/config"; +import { defaultConfig } from "./vite.config"; export default defineProject(({ mode }) => ({ - ...defaultConfig, - test: { - ...defaultProjectTestConfig, - name: "main", - include: ["./src/test/**/*.{test,spec}.ts"], - exclude: ["./src/test/pre.test.ts"], - }, - esbuild: { - pure: mode === 'production' ? [ 'console.log' ] : [], - keepNames: true, - }, -})) + ...defaultConfig, + test: { + setupFiles: ["./src/test/fontFace.setup.ts", "./src/test/vitest.setup.ts"], + server: { + deps: { + inline: ["vitest-canvas-mock"], + //@ts-ignore + optimizer: { + web: { + include: ["vitest-canvas-mock"], + }, + }, + }, + }, + environment: "jsdom" as const, + environmentOptions: { + jsdom: { + resources: "usable", + }, + }, + threads: false, + trace: true, + restoreMocks: true, + watch: false, + coverage: { + provider: "istanbul" as const, + reportsDirectory: "coverage" as const, + reporters: ["text-summary", "html"], + }, + name: "main", + include: ["./src/test/**/*.{test,spec}.ts"], + exclude: ["./src/test/pre.test.ts"], + }, + esbuild: { + pure: mode === "production" ? ["console.log"] : [], + keepNames: true, + }, +})); diff --git a/vitest.workspace.ts b/vitest.workspace.ts index a885b77dc9d..38121942004 100644 --- a/vitest.workspace.ts +++ b/vitest.workspace.ts @@ -1,6 +1,5 @@ import { defineWorkspace } from "vitest/config"; import { defaultConfig } from "./vite.config"; -import { defaultProjectTestConfig } from "./vitest.config"; export default defineWorkspace([ { @@ -11,58 +10,5 @@ export default defineWorkspace([ environment: "jsdom", }, }, - { - ...defaultConfig, - test: { - ...defaultProjectTestConfig, - name: "misc", - include: [ - "src/test/achievements/**/*.{test,spec}.ts", - "src/test/arena/**/*.{test,spec}.ts", - "src/test/battlerTags/**/*.{test,spec}.ts", - "src/test/eggs/**/*.{test,spec}.ts", - "src/test/field/**/*.{test,spec}.ts", - "src/test/inputs/**/*.{test,spec}.ts", - "src/test/localization/**/*.{test,spec}.ts", - "src/test/phases/**/*.{test,spec}.ts", - "src/test/settingMenu/**/*.{test,spec}.ts", - "src/test/sprites/**/*.{test,spec}.ts", - "src/test/ui/**/*.{test,spec}.ts", - "src/test/*.{test,spec}.ts", - ], - }, - }, - { - ...defaultConfig, - test: { - ...defaultProjectTestConfig, - name: "abilities", - include: ["src/test/abilities/**/*.{test,spec}.ts"], - }, - }, - { - ...defaultConfig, - test: { - ...defaultProjectTestConfig, - name: "battle", - include: ["src/test/battle/**/*.{test,spec}.ts"], - }, - }, - { - ...defaultConfig, - test: { - ...defaultProjectTestConfig, - name: "items", - include: ["src/test/items/**/*.{test,spec}.ts"], - }, - }, - { - ...defaultConfig, - test: { - ...defaultProjectTestConfig, - name: "moves", - include: ["src/test/moves/**/*.{test,spec}.ts"], - }, - }, "./vitest.config.ts", ]); From e657322294bc39f9f398b72c0f8fdcd8f4d496d5 Mon Sep 17 00:00:00 2001 From: Leo Kim <47556641+KimJeongSun@users.noreply.github.com> Date: Wed, 11 Sep 2024 12:45:53 +0900 Subject: [PATCH 30/30] [Enhancement] Update instruction for gamepad in run history UI (#4053) * update instruction for pad in run history UI * move getGamepadType function to ui.ts * Update src/ui/ui.ts Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> --------- Co-authored-by: Adrian T. <68144167+torranx@users.noreply.github.com> --- src/ui/run-info-ui-handler.ts | 23 +++++++++++++++++++---- src/ui/ui.ts | 17 +++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/ui/run-info-ui-handler.ts b/src/ui/run-info-ui-handler.ts index d6bafb8599e..f398abed6f5 100644 --- a/src/ui/run-info-ui-handler.ts +++ b/src/ui/run-info-ui-handler.ts @@ -21,6 +21,7 @@ import { getVariantTint } from "#app/data/variant"; import * as Modifier from "../modifier/modifier"; import { Species } from "#enums/species"; import { PlayerGender } from "#enums/player-gender"; +import { SettingKeyboard } from "#app/system/settings/settings-keyboard"; /** * RunInfoUiMode indicates possible overlays of RunInfoUiHandler. @@ -151,7 +152,13 @@ export default class RunInfoUiHandler extends UiHandler { const headerBgCoords = headerBg.getTopRight(); const abilityButtonContainer = this.scene.add.container(0, 0); const abilityButtonText = addTextObject(this.scene, 8, 0, i18next.t("runHistory:viewHeldItems"), TextStyle.WINDOW, {fontSize:"34px"}); - const abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, "keyboard", "E.png"); + const gamepadType = this.getUi().getGamepadType(); + let abilityButtonElement: Phaser.GameObjects.Sprite; + if (gamepadType === "touch") { + abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, "keyboard", "E.png"); + } else { + abilityButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 2, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Ability)); + } abilityButtonContainer.add([abilityButtonText, abilityButtonElement]); abilityButtonContainer.setPosition(headerBgCoords.x - abilityButtonText.displayWidth - abilityButtonElement.displayWidth - 8, 10); this.runContainer.add(abilityButtonContainer); @@ -180,11 +187,19 @@ export default class RunInfoUiHandler extends UiHandler { if (this.isVictory) { const hallofFameInstructionContainer = this.scene.add.container(0, 0); const shinyButtonText = addTextObject(this.scene, 8, 0, i18next.t("runHistory:viewHallOfFame"), TextStyle.WINDOW, {fontSize:"65px"}); - const shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, "keyboard", "R.png"); + const formButtonText = addTextObject(this.scene, 8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, {fontSize:"65px"}); + const gamepadType = this.getUi().getGamepadType(); + let shinyButtonElement: Phaser.GameObjects.Sprite; + let formButtonElement: Phaser.GameObjects.Sprite; + if (gamepadType === "touch") { + shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, "keyboard", "R.png"); + formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, "keyboard", "F.png"); + } else { + shinyButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 4, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Shiny)); + formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, gamepadType, this.scene.inputController?.getIconForLatestInputRecorded(SettingKeyboard.Button_Cycle_Form)); + } hallofFameInstructionContainer.add([shinyButtonText, shinyButtonElement]); - const formButtonText = addTextObject(this.scene, 8, 12, i18next.t("runHistory:viewEndingSplash"), TextStyle.WINDOW, {fontSize:"65px"}); - const formButtonElement = new Phaser.GameObjects.Sprite(this.scene, 0, 16, "keyboard", "F.png"); hallofFameInstructionContainer.add([formButtonText, formButtonElement]); hallofFameInstructionContainer.setPosition(12, 25); diff --git a/src/ui/ui.ts b/src/ui/ui.ts index 50fb240aad8..82b3ee6b4fa 100644 --- a/src/ui/ui.ts +++ b/src/ui/ui.ts @@ -52,6 +52,7 @@ import RunInfoUiHandler from "./run-info-ui-handler"; import EggSummaryUiHandler from "./egg-summary-ui-handler"; import TestDialogueUiHandler from "#app/ui/test-dialogue-ui-handler"; import AutoCompleteUiHandler from "./autocomplete-ui-handler"; +import { Device } from "#enums/devices"; export enum Mode { MESSAGE, @@ -578,4 +579,20 @@ export default class UI extends Phaser.GameObjects.Container { public getModeChain(): Mode[] { return this.modeChain; } + + /** + * getGamepadType - returns the type of gamepad being used + * inputMethod could be "keyboard" or "touch" or "gamepad" + * if inputMethod is "keyboard" or "touch", then the inputMethod is returned + * if inputMethod is "gamepad", then the gamepad type is returned it could be "xbox" or "dualshock" + * @returns gamepad type + */ + public getGamepadType(): string { + const scene = this.scene as BattleScene; + if (scene.inputMethod === "gamepad") { + return scene.inputController.getConfig(scene.inputController.selectedDevice[Device.GAMEPAD]).padType; + } else { + return scene.inputMethod; + } + } }