[Bug] Fix forced switch bugs in enemy partner trainer battles (#5644)

* Add isPartner method to trainer class

* Ensure force switches cannot pull pokemon from the wrong trainer

* Add override for battle type

* Fixup tests and broken assumptions

* Make move fail override semi-invuln check

Bandaid fix because move effect phase does not allow for the move to fail if all of its conditions fail

* Restore overrides

* Apply kev's suggestions from code review

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* Fix illusion test battle type invocation

* Update struggle and healer tests to use battleStyle

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
This commit is contained in:
Sirz Benjie 2025-04-18 04:35:46 -05:00 committed by GitHub
parent 82cd492117
commit 54ce58411b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
330 changed files with 757 additions and 628 deletions

View File

@ -77,7 +77,8 @@ import {
} from "#app/data/abilities/ability"; } from "#app/data/abilities/ability";
import { allAbilities } from "./data/data-lists"; import { allAbilities } from "./data/data-lists";
import type { FixedBattleConfig } from "#app/battle"; import type { FixedBattleConfig } from "#app/battle";
import Battle, { BattleType } from "#app/battle"; import Battle from "#app/battle";
import { BattleType } from "#enums/battle-type";
import type { GameMode } from "#app/game-mode"; import type { GameMode } from "#app/game-mode";
import { GameModes, getGameMode } from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode";
import FieldSpritePipeline from "#app/pipelines/field-sprite"; import FieldSpritePipeline from "#app/pipelines/field-sprite";
@ -1338,22 +1339,27 @@ export default class BattleScene extends SceneBase {
} else { } else {
if ( if (
!this.gameMode.hasTrainers || !this.gameMode.hasTrainers ||
Overrides.BATTLE_TYPE_OVERRIDE === BattleType.WILD ||
(Overrides.DISABLE_STANDARD_TRAINERS_OVERRIDE && isNullOrUndefined(trainerData)) (Overrides.DISABLE_STANDARD_TRAINERS_OVERRIDE && isNullOrUndefined(trainerData))
) { ) {
newBattleType = BattleType.WILD; newBattleType = BattleType.WILD;
} else if (battleType === undefined) {
newBattleType = this.gameMode.isWaveTrainer(newWaveIndex, this.arena) ? BattleType.TRAINER : BattleType.WILD;
} else { } else {
newBattleType = battleType; newBattleType =
Overrides.BATTLE_TYPE_OVERRIDE ??
battleType ??
(this.gameMode.isWaveTrainer(newWaveIndex, this.arena) ? BattleType.TRAINER : BattleType.WILD);
} }
if (newBattleType === BattleType.TRAINER) { if (newBattleType === BattleType.TRAINER) {
const trainerType = this.arena.randomTrainerType(newWaveIndex); const trainerType =
Overrides.RANDOM_TRAINER_OVERRIDE?.trainerType ?? this.arena.randomTrainerType(newWaveIndex);
let doubleTrainer = false; let doubleTrainer = false;
if (trainerConfigs[trainerType].doubleOnly) { if (trainerConfigs[trainerType].doubleOnly) {
doubleTrainer = true; doubleTrainer = true;
} else if (trainerConfigs[trainerType].hasDouble) { } else if (trainerConfigs[trainerType].hasDouble) {
doubleTrainer = !randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); doubleTrainer =
Overrides.RANDOM_TRAINER_OVERRIDE?.alwaysDouble ||
!randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField));
// Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance // Add a check that special trainers can't be double except for tate and liza - they should use the normal double chance
if ( if (
trainerConfigs[trainerType].trainerTypeDouble && trainerConfigs[trainerType].trainerTypeDouble &&
@ -1373,7 +1379,10 @@ export default class BattleScene extends SceneBase {
// Check for mystery encounter // Check for mystery encounter
// Can only occur in place of a standard (non-boss) wild battle, waves 10-180 // Can only occur in place of a standard (non-boss) wild battle, waves 10-180
if (this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || newBattleType === BattleType.MYSTERY_ENCOUNTER) { if (
!Overrides.BATTLE_TYPE_OVERRIDE &&
(this.isWaveMysteryEncounter(newBattleType, newWaveIndex) || newBattleType === BattleType.MYSTERY_ENCOUNTER)
) {
newBattleType = BattleType.MYSTERY_ENCOUNTER; newBattleType = BattleType.MYSTERY_ENCOUNTER;
// Reset to base spawn weight // Reset to base spawn weight
this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT; this.mysteryEncounterSaveData.encounterSpawnChance = BASE_MYSTERY_ENCOUNTER_SPAWN_WEIGHT;
@ -1383,9 +1392,9 @@ export default class BattleScene extends SceneBase {
if (double === undefined && newWaveIndex > 1) { if (double === undefined && newWaveIndex > 1) {
if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) { if (newBattleType === BattleType.WILD && !this.gameMode.isWaveFinal(newWaveIndex)) {
newDouble = !randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField)); newDouble = !randSeedInt(this.getDoubleBattleChance(newWaveIndex, playerField));
} else if (newBattleType === BattleType.TRAINER) {
newDouble = newTrainer?.variant === TrainerVariant.DOUBLE;
} }
} else if (double === undefined && newBattleType === BattleType.TRAINER) {
newDouble = newTrainer?.variant === TrainerVariant.DOUBLE;
} else if (!battleConfig) { } else if (!battleConfig) {
newDouble = !!double; newDouble = !!double;
} }
@ -1395,10 +1404,10 @@ export default class BattleScene extends SceneBase {
newDouble = false; newDouble = false;
} }
if (!isNullOrUndefined(Overrides.BATTLE_TYPE_OVERRIDE)) { if (!isNullOrUndefined(Overrides.BATTLE_STYLE_OVERRIDE)) {
let doubleOverrideForWave: "single" | "double" | null = null; let doubleOverrideForWave: "single" | "double" | null = null;
switch (Overrides.BATTLE_TYPE_OVERRIDE) { switch (Overrides.BATTLE_STYLE_OVERRIDE) {
case "double": case "double":
doubleOverrideForWave = "double"; doubleOverrideForWave = "double";
break; break;
@ -1418,7 +1427,7 @@ export default class BattleScene extends SceneBase {
} }
/** /**
* Override battles into single only if not fighting with trainers. * Override battles into single only if not fighting with trainers.
* @see {@link https://github.com/pagefaultgames/pokerogue/issues/1948 | GitHub Issue #1948} * @see {@link https://github.com/pagefaultgames/pokerogue/issues/1948 GitHub Issue #1948}
*/ */
if (newBattleType !== BattleType.TRAINER && doubleOverrideForWave === "single") { if (newBattleType !== BattleType.TRAINER && doubleOverrideForWave === "single") {
newDouble = false; newDouble = false;

View File

@ -30,6 +30,7 @@ import { MysteryEncounterMode } from "#enums/mystery-encounter-mode";
import type { CustomModifierSettings } from "#app/modifier/modifier-type"; import type { CustomModifierSettings } from "#app/modifier/modifier-type";
import { ModifierTier } from "#app/modifier/modifier-tier"; import { ModifierTier } from "#app/modifier/modifier-tier";
import type { MysteryEncounterType } from "#enums/mystery-encounter-type"; import type { MysteryEncounterType } from "#enums/mystery-encounter-type";
import { BattleType } from "#enums/battle-type";
export enum ClassicFixedBossWaves { export enum ClassicFixedBossWaves {
TOWN_YOUNGSTER = 5, TOWN_YOUNGSTER = 5,
@ -54,13 +55,6 @@ export enum ClassicFixedBossWaves {
RIVAL_6 = 195, RIVAL_6 = 195,
} }
export enum BattleType {
WILD,
TRAINER,
CLEAR,
MYSTERY_ENCOUNTER,
}
export enum BattlerIndex { export enum BattlerIndex {
ATTACKER = -1, ATTACKER = -1,
PLAYER, PLAYER,

View File

@ -30,7 +30,7 @@ import i18next from "i18next";
import { Command } from "#app/ui/command-ui-handler"; import { Command } from "#app/ui/command-ui-handler";
import { BerryModifierType } from "#app/modifier/modifier-type"; import { BerryModifierType } from "#app/modifier/modifier-type";
import { getPokeballName } from "#app/data/pokeball"; import { getPokeballName } from "#app/data/pokeball";
import { BattleType } from "#app/battle"; import { BattleType } from "#enums/battle-type";
import { MovePhase } from "#app/phases/move-phase"; import { MovePhase } from "#app/phases/move-phase";
import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase"; import { PokemonHealPhase } from "#app/phases/pokemon-heal-phase";
import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase"; import { StatStageChangePhase } from "#app/phases/stat-stage-change-phase";
@ -44,6 +44,7 @@ import { PokemonTransformPhase } from "#app/phases/pokemon-transform-phase";
import { allAbilities } from "#app/data/data-lists"; import { allAbilities } from "#app/data/data-lists";
import { AbAttr } from "#app/data/abilities/ab-attrs/ab-attr"; import { AbAttr } from "#app/data/abilities/ab-attrs/ab-attr";
import { Ability } from "#app/data/abilities/ability-class"; import { Ability } from "#app/data/abilities/ability-class";
import { TrainerVariant } from "#app/field/trainer";
// Enum imports // Enum imports
import { Stat, type BattleStat , BATTLE_STATS, EFFECTIVE_STATS, getStatKey, type EffectiveStat } from "#enums/stat"; import { Stat, type BattleStat , BATTLE_STATS, EFFECTIVE_STATS, getStatKey, type EffectiveStat } from "#enums/stat";
@ -61,6 +62,7 @@ import { MoveFlags } from "#enums/MoveFlags";
import { MoveTarget } from "#enums/MoveTarget"; import { MoveTarget } from "#enums/MoveTarget";
import { MoveCategory } from "#enums/MoveCategory"; import { MoveCategory } from "#enums/MoveCategory";
// Type imports // Type imports
import type { EnemyPokemon, PokemonMove } from "#app/field/pokemon"; import type { EnemyPokemon, PokemonMove } from "#app/field/pokemon";
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
@ -5526,8 +5528,8 @@ class ForceSwitchOutHelper {
const party = player ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); const party = player ? globalScene.getPlayerParty() : globalScene.getEnemyParty();
return (!player && globalScene.currentBattle.battleType === BattleType.WILD) return (!player && globalScene.currentBattle.battleType === BattleType.WILD)
|| party.filter(p => p.isAllowedInBattle() || party.filter(p => p.isAllowedInBattle() && !p.isOnField()
&& (player || (p as EnemyPokemon).trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)).length > globalScene.currentBattle.getBattlerCount(); && (player || (p as EnemyPokemon).trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)).length > 0;
} }
/** /**

View File

@ -8,7 +8,8 @@ import { speciesStarterCosts } from "#app/data/balance/starters";
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
import { PokemonMove } from "#app/field/pokemon"; import { PokemonMove } from "#app/field/pokemon";
import type { FixedBattleConfig } from "#app/battle"; import type { FixedBattleConfig } from "#app/battle";
import { ClassicFixedBossWaves, BattleType, getRandomTrainerFunc } from "#app/battle"; import { ClassicFixedBossWaves, getRandomTrainerFunc } from "#app/battle";
import { BattleType } from "#enums/battle-type";
import Trainer, { TrainerVariant } from "#app/field/trainer"; import Trainer, { TrainerVariant } from "#app/field/trainer";
import { PokemonType } from "#enums/pokemon-type"; import { PokemonType } from "#enums/pokemon-type";
import { Challenges } from "#enums/challenges"; import { Challenges } from "#enums/challenges";

View File

@ -75,7 +75,7 @@ import {
PreserveBerryModifier, PreserveBerryModifier,
} from "../../modifier/modifier"; } from "../../modifier/modifier";
import type { BattlerIndex } from "../../battle"; import type { BattlerIndex } from "../../battle";
import { BattleType } from "../../battle"; import { BattleType } from "#enums/battle-type";
import { TerrainType } from "../terrain"; import { TerrainType } from "../terrain";
import { ModifierPoolType } from "#app/modifier/modifier-type"; import { ModifierPoolType } from "#app/modifier/modifier-type";
import { Command } from "../../ui/command-ui-handler"; import { Command } from "../../ui/command-ui-handler";
@ -121,6 +121,7 @@ import { MoveFlags } from "#enums/MoveFlags";
import { MoveEffectTrigger } from "#enums/MoveEffectTrigger"; import { MoveEffectTrigger } from "#enums/MoveEffectTrigger";
import { MultiHitType } from "#enums/MultiHitType"; import { MultiHitType } from "#enums/MultiHitType";
import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidMirrorMoveMoves, invalidSleepTalkMoves } from "./invalid-moves"; import { invalidAssistMoves, invalidCopycatMoves, invalidMetronomeMoves, invalidMirrorMoveMoves, invalidSleepTalkMoves } from "./invalid-moves";
import { TrainerVariant } from "#app/field/trainer";
type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean; type MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => boolean;
type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean; type UserMoveConditionFunc = (user: Pokemon, move: Move) => boolean;
@ -6295,9 +6296,10 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
return false; return false;
} else if (globalScene.currentBattle.battleType !== BattleType.WILD) { // Switch out logic for enemy trainers } else if (globalScene.currentBattle.battleType !== BattleType.WILD) { // Switch out logic for enemy trainers
// Find indices of off-field Pokemon that are eligible to be switched into // Find indices of off-field Pokemon that are eligible to be switched into
const isPartnerTrainer = globalScene.currentBattle.trainer?.isPartner();
const eligibleNewIndices: number[] = []; const eligibleNewIndices: number[] = [];
globalScene.getEnemyParty().forEach((pokemon, index) => { globalScene.getEnemyParty().forEach((pokemon, index) => {
if (pokemon.isAllowedInBattle() && !pokemon.isOnField()) { if (pokemon.isAllowedInBattle() && !pokemon.isOnField() && (!isPartnerTrainer || pokemon.trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)) {
eligibleNewIndices.push(index); eligibleNewIndices.push(index);
} }
}); });
@ -6347,15 +6349,6 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
} }
} }
if (globalScene.currentBattle.waveIndex % 10 === 0) {
return false;
}
// Don't allow wild mons to flee with U-turn et al.
if (this.selfSwitch && !user.isPlayer() && move.category !== MoveCategory.STATUS) {
return false;
}
const allyPokemon = switchOutTarget.getAlly(); const allyPokemon = switchOutTarget.getAlly();
if (switchOutTarget.hp > 0) { if (switchOutTarget.hp > 0) {
@ -6368,13 +6361,12 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
} }
} }
if (!allyPokemon?.isActive(true)) { // clear out enemy held item modifiers of the switch out target
globalScene.clearEnemyHeldItemModifiers(); globalScene.clearEnemyHeldItemModifiers(switchOutTarget);
if (switchOutTarget.hp) { if (!allyPokemon?.isActive(true) && switchOutTarget.hp) {
globalScene.pushPhase(new BattleEndPhase(false)); globalScene.pushPhase(new BattleEndPhase(false));
globalScene.pushPhase(new NewBattlePhase()); globalScene.pushPhase(new NewBattlePhase());
}
} }
} }
@ -6393,6 +6385,7 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
} }
} }
getSwitchOutCondition(): MoveConditionFunc { getSwitchOutCondition(): MoveConditionFunc {
return (user, target, move) => { return (user, target, move) => {
const switchOutTarget = (this.selfSwitch ? user : target); const switchOutTarget = (this.selfSwitch ? user : target);
@ -6416,23 +6409,23 @@ export class ForceSwitchOutAttr extends MoveEffectAttr {
const blockedByAbility = new BooleanHolder(false); const blockedByAbility = new BooleanHolder(false);
applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility); applyAbAttrs(ForceSwitchOutImmunityAbAttr, target, blockedByAbility);
return !blockedByAbility.value; if (blockedByAbility.value) {
return false;
}
} }
if (!player && globalScene.currentBattle.battleType === BattleType.WILD) { if (!player && globalScene.currentBattle.battleType === BattleType.WILD) {
if (this.isBatonPass()) { // wild pokemon cannot switch out with baton pass.
return false; return !this.isBatonPass()
} && globalScene.currentBattle.waveIndex % 10 !== 0
// Don't allow wild opponents to flee on the boss stage since it can ruin a run early on // Don't allow wild mons to flee with U-turn et al.
if (globalScene.currentBattle.waveIndex % 10 === 0) { && !(this.selfSwitch && MoveCategory.STATUS !== move.category);
return false;
}
} }
const party = player ? globalScene.getPlayerParty() : globalScene.getEnemyParty(); const party = player ? globalScene.getPlayerParty() : globalScene.getEnemyParty();
return (!player && !globalScene.currentBattle.battleType) return party.filter(p => p.isAllowedInBattle() && !p.isOnField()
|| party.filter(p => p.isAllowedInBattle() && (player || (p as EnemyPokemon).trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)).length > 0;
&& (player || (p as EnemyPokemon).trainerSlot === (switchOutTarget as EnemyPokemon).trainerSlot)).length > globalScene.currentBattle.getBattlerCount();
}; };
} }

View File

@ -1,5 +1,6 @@
import type Battle from "#app/battle"; import type Battle from "#app/battle";
import { BattlerIndex, BattleType } from "#app/battle"; import { BattlerIndex } from "#app/battle";
import { BattleType } from "#enums/battle-type";
import { biomeLinks, BiomePoolTier } from "#app/data/balance/biomes"; import { biomeLinks, BiomePoolTier } from "#app/data/balance/biomes";
import type MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option"; import type MysteryEncounterOption from "#app/data/mystery-encounters/mystery-encounter-option";
import { import {

6
src/enums/battle-type.ts Normal file
View File

@ -0,0 +1,6 @@
export enum BattleType {
WILD,
TRAINER,
CLEAR,
MYSTERY_ENCOUNTER
}

View File

@ -223,6 +223,13 @@ export default class Trainer extends Phaser.GameObjects.Container {
return this.config.doubleOnly || this.variant === TrainerVariant.DOUBLE; return this.config.doubleOnly || this.variant === TrainerVariant.DOUBLE;
} }
/**
* Return whether the trainer is a duo, like Tate & Liza
*/
isPartner(): boolean {
return this.variant === TrainerVariant.DOUBLE;
}
getMixedBattleBgm(): string { getMixedBattleBgm(): string {
return this.config.mixedBattleBgm; return this.config.mixedBattleBgm;
} }

View File

@ -15,11 +15,13 @@ import { MysteryEncounterType } from "#enums/mystery-encounter-type";
import { PokeballType } from "#enums/pokeball"; import { PokeballType } from "#enums/pokeball";
import { PokemonType } from "#enums/pokemon-type"; import { PokemonType } from "#enums/pokemon-type";
import { Species } from "#enums/species"; import { Species } from "#enums/species";
import { Stat } from "#enums/stat"; import { BATTLE_STATS, Stat } from "#enums/stat";
import { StatusEffect } from "#enums/status-effect"; import { StatusEffect } from "#enums/status-effect";
import { TimeOfDay } from "#enums/time-of-day"; import { TimeOfDay } from "#enums/time-of-day";
import { VariantTier } from "#enums/variant-tier"; import { VariantTier } from "#enums/variant-tier";
import { WeatherType } from "#enums/weather-type"; import { WeatherType } from "#enums/weather-type";
import { TrainerType } from "#enums/trainer-type";
import { BattleType } from "#enums/battle-type";
/** /**
* This comment block exists to prevent IDEs from automatically removing unused imports * This comment block exists to prevent IDEs from automatically removing unused imports
@ -41,7 +43,7 @@ import { WeatherType } from "#enums/weather-type";
* } * }
* ``` * ```
*/ */
const overrides = {} satisfies Partial<InstanceType<typeof DefaultOverrides>>; const overrides = {} satisfies Partial<InstanceType<OverridesType>>;
/** /**
* If you need to add Overrides values for local testing do that inside {@linkcode overrides} * If you need to add Overrides values for local testing do that inside {@linkcode overrides}
@ -69,7 +71,7 @@ class DefaultOverrides {
* *
* If `"odd-doubles"`, follow the `"double"` rule on odd wave numbers, and follow the `"single"` rule on even wave numbers. * If `"odd-doubles"`, follow the `"double"` rule on odd wave numbers, and follow the `"single"` rule on even wave numbers.
*/ */
readonly BATTLE_TYPE_OVERRIDE: BattleStyle | null = null; readonly BATTLE_STYLE_OVERRIDE: BattleStyle | null = null;
readonly STARTING_WAVE_OVERRIDE: number = 0; readonly STARTING_WAVE_OVERRIDE: number = 0;
readonly STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN; readonly STARTING_BIOME_OVERRIDE: Biome = Biome.TOWN;
readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null; readonly ARENA_TINT_OVERRIDE: TimeOfDay | null = null;
@ -259,6 +261,16 @@ class DefaultOverrides {
* If `true`, disable all non-scripted opponent trainer encounters. * If `true`, disable all non-scripted opponent trainer encounters.
*/ */
readonly DISABLE_STANDARD_TRAINERS_OVERRIDE: boolean = false; readonly DISABLE_STANDARD_TRAINERS_OVERRIDE: boolean = false;
/**
* Set all non-scripted waves to use the selected battle type.
*
* Ignored if set to {@linkcode BattleType.TRAINER} and `DISABLE_STANDARD_TRAINERS_OVERRIDE` is `true`.
*/
readonly BATTLE_TYPE_OVERRIDE: Exclude<BattleType, BattleType.CLEAR> | null = null;
/** Force all random trainer types to be the provided type. */
readonly RANDOM_TRAINER_OVERRIDE: RandomTrainerOverride | null = null;
} }
export const defaultOverrides = new DefaultOverrides(); export const defaultOverrides = new DefaultOverrides();
@ -269,3 +281,13 @@ export default {
} satisfies InstanceType<typeof DefaultOverrides>; } satisfies InstanceType<typeof DefaultOverrides>;
export type BattleStyle = "double" | "single" | "even-doubles" | "odd-doubles"; export type BattleStyle = "double" | "single" | "even-doubles" | "odd-doubles";
export type RandomTrainerOverride = {
/** The Type of trainer to force */
trainerType: Exclude<TrainerType, TrainerType.UNKNOWN>,
/* If the selected trainer type has a double version, it will always use its double version. */
alwaysDouble?: boolean
}
/** The type of the {@linkcode DefaultOverrides} class */
export type OverridesType = typeof DefaultOverrides;

View File

@ -1,6 +1,6 @@
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import type { TurnCommand } from "#app/battle"; import type { TurnCommand } from "#app/battle";
import { BattleType } from "#app/battle"; import { BattleType } from "#enums/battle-type";
import type { EncoreTag } from "#app/data/battler-tags"; import type { EncoreTag } from "#app/data/battler-tags";
import { TrappedTag } from "#app/data/battler-tags"; import { TrappedTag } from "#app/data/battler-tags";
import type { MoveTargetSet } from "#app/data/moves/move"; import type { MoveTargetSet } from "#app/data/moves/move";

View File

@ -1,4 +1,5 @@
import { BattlerIndex, BattleType } from "#app/battle"; import { BattlerIndex } from "#app/battle";
import { BattleType } from "#enums/battle-type";
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import { PLAYER_PARTY_MAX_SIZE } from "#app/constants"; import { PLAYER_PARTY_MAX_SIZE } from "#app/constants";
import { applyAbAttrs, SyncEncounterNatureAbAttr, applyPreSummonAbAttrs, PreSummonAbAttr } from "#app/data/abilities/ability"; import { applyAbAttrs, SyncEncounterNatureAbAttr, applyPreSummonAbAttrs, PreSummonAbAttr } from "#app/data/abilities/ability";

View File

@ -1,5 +1,5 @@
import type { BattlerIndex } from "#app/battle"; import type { BattlerIndex } from "#app/battle";
import { BattleType } from "#app/battle"; import { BattleType } from "#enums/battle-type";
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import { import {
applyPostFaintAbAttrs, applyPostFaintAbAttrs,

View File

@ -1,5 +1,5 @@
import { clientSessionId } from "#app/account"; import { clientSessionId } from "#app/account";
import { BattleType } from "#app/battle"; import { BattleType } from "#enums/battle-type";
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions"; import { pokemonEvolutions } from "#app/data/balance/pokemon-evolutions";
import { getCharVariantFromDialogue } from "#app/data/dialogue"; import { getCharVariantFromDialogue } from "#app/data/dialogue";

View File

@ -1,4 +1,4 @@
import { BattleType } from "#app/battle"; import { BattleType } from "#enums/battle-type";
import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball"; import { getPokeballAtlasKey, getPokeballTintColor } from "#app/data/pokeball";
import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms"; import { SpeciesFormChangeActiveTrigger } from "#app/data/pokemon-forms";
import { TrainerSlot } from "#enums/trainer-slot"; import { TrainerSlot } from "#enums/trainer-slot";

View File

@ -1,5 +1,5 @@
import { loggedInUser } from "#app/account"; import { loggedInUser } from "#app/account";
import { BattleType } from "#app/battle"; import { BattleType } from "#enums/battle-type";
import { fetchDailyRunSeed, getDailyRunStarters } from "#app/data/daily-run"; import { fetchDailyRunSeed, getDailyRunStarters } from "#app/data/daily-run";
import { Gender } from "#app/data/gender"; import { Gender } from "#app/data/gender";
import { getBiomeKey } from "#app/field/arena"; import { getBiomeKey } from "#app/field/arena";

View File

@ -1,5 +1,6 @@
import type { BattlerIndex } from "#app/battle"; import type { BattlerIndex } from "#app/battle";
import { BattleType, ClassicFixedBossWaves } from "#app/battle"; import { ClassicFixedBossWaves } from "#app/battle";
import { BattleType } from "#enums/battle-type";
import type { CustomModifierSettings } from "#app/modifier/modifier-type"; import type { CustomModifierSettings } from "#app/modifier/modifier-type";
import { modifierTypes } from "#app/modifier/modifier-type"; import { modifierTypes } from "#app/modifier/modifier-type";
import { BattleEndPhase } from "./battle-end-phase"; import { BattleEndPhase } from "./battle-end-phase";

View File

@ -15,7 +15,7 @@ import PersistentModifierData from "#app/system/modifier-data";
import ArenaData from "#app/system/arena-data"; import ArenaData from "#app/system/arena-data";
import { Unlockables } from "#app/system/unlockables"; import { Unlockables } from "#app/system/unlockables";
import { GameModes, getGameMode } from "#app/game-mode"; import { GameModes, getGameMode } from "#app/game-mode";
import { BattleType } from "#app/battle"; import { BattleType } from "#enums/battle-type";
import TrainerData from "#app/system/trainer-data"; import TrainerData from "#app/system/trainer-data";
import { trainerConfigs } from "#app/data/trainers/trainer-config"; import { trainerConfigs } from "#app/data/trainers/trainer-config";
import { resetSettings, setSetting, SettingKeys } from "#app/system/settings/settings"; import { resetSettings, setSetting, SettingKeys } from "#app/system/settings/settings";

View File

@ -1,4 +1,4 @@
import { BattleType } from "../battle"; import { BattleType } from "#enums/battle-type";
import { globalScene } from "#app/global-scene"; import { globalScene } from "#app/global-scene";
import type { Gender } from "../data/gender"; import type { Gender } from "../data/gender";
import type { Nature } from "#enums/nature"; import type { Nature } from "#enums/nature";

View File

@ -14,7 +14,7 @@ import type { PokemonMove } from "#app/field/pokemon";
import type Pokemon from "#app/field/pokemon"; import type Pokemon from "#app/field/pokemon";
import type { CommandPhase } from "#app/phases/command-phase"; import type { CommandPhase } from "#app/phases/command-phase";
import MoveInfoOverlay from "./move-info-overlay"; import MoveInfoOverlay from "./move-info-overlay";
import { BattleType } from "#app/battle"; import { BattleType } from "#enums/battle-type";
export default class FightUiHandler extends UiHandler implements InfoToggle { export default class FightUiHandler extends UiHandler implements InfoToggle {
public static readonly MOVES_CONTAINER_NAME = "moves"; public static readonly MOVES_CONTAINER_NAME = "moves";

View File

@ -8,7 +8,7 @@ import type PokemonData from "../system/pokemon-data";
import MessageUiHandler from "./message-ui-handler"; import MessageUiHandler from "./message-ui-handler";
import i18next from "i18next"; import i18next from "i18next";
import { Button } from "../enums/buttons"; import { Button } from "../enums/buttons";
import { BattleType } from "../battle"; import { BattleType } from "#enums/battle-type";
import type { RunEntry } from "../system/game-data"; import type { RunEntry } from "../system/game-data";
import { PlayerGender } from "#enums/player-gender"; import { PlayerGender } from "#enums/player-gender";
import { TrainerVariant } from "../field/trainer"; import { TrainerVariant } from "../field/trainer";

View File

@ -9,7 +9,7 @@ import { formatLargeNumber, getPlayTimeString, formatMoney, formatFancyLargeNumb
import type PokemonData from "../system/pokemon-data"; import type PokemonData from "../system/pokemon-data";
import i18next from "i18next"; import i18next from "i18next";
import { Button } from "../enums/buttons"; import { Button } from "../enums/buttons";
import { BattleType } from "../battle"; import { BattleType } from "#enums/battle-type";
import { TrainerVariant } from "../field/trainer"; import { TrainerVariant } from "../field/trainer";
import { Challenges } from "#enums/challenges"; import { Challenges } from "#enums/challenges";
import { getLuckString, getLuckTextTint } from "../modifier/modifier-type"; import { getLuckString, getLuckTextTint } from "../modifier/modifier-type";

View File

@ -24,7 +24,7 @@ describe("Ability Duplication", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([Moves.SPLASH]) .moveset([Moves.SPLASH])
.battleType("single") .battleStyle("single")
.ability(Abilities.HUGE_POWER) .ability(Abilities.HUGE_POWER)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(Moves.SPLASH); .enemyMoveset(Moves.SPLASH);

View File

@ -27,7 +27,7 @@ describe("Ability Timing", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.INTIMIDATE) .enemyAbility(Abilities.INTIMIDATE)
.ability(Abilities.BALL_FETCH); .ability(Abilities.BALL_FETCH);

View File

@ -26,7 +26,7 @@ describe("Abilities - Analytic", () => {
game.override game.override
.moveset([Moves.SPLASH, Moves.TACKLE]) .moveset([Moves.SPLASH, Moves.TACKLE])
.ability(Abilities.ANALYTIC) .ability(Abilities.ANALYTIC)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.startingLevel(200) .startingLevel(200)
.enemyLevel(200) .enemyLevel(200)
@ -53,7 +53,7 @@ describe("Abilities - Analytic", () => {
}); });
it("should increase damage only if the user moves last in doubles", async () => { it("should increase damage only if the user moves last in doubles", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
await game.classicMode.startBattle([Species.GENGAR, Species.SHUCKLE]); await game.classicMode.startBattle([Species.GENGAR, Species.SHUCKLE]);
const [enemy] = game.scene.getEnemyField(); const [enemy] = game.scene.getEnemyField();

View File

@ -32,7 +32,7 @@ describe("Abilities - Arena Trap", () => {
// TODO: Enable test when Issue #935 is addressed // TODO: Enable test when Issue #935 is addressed
it.todo("should not allow grounded Pokémon to flee", async () => { it.todo("should not allow grounded Pokémon to flee", async () => {
game.override.battleType("single"); game.override.battleStyle("single");
await game.classicMode.startBattle(); await game.classicMode.startBattle();
@ -61,7 +61,7 @@ describe("Abilities - Arena Trap", () => {
*/ */
it("should lift if pokemon with this ability leaves the field", async () => { it("should lift if pokemon with this ability leaves the field", async () => {
game.override game.override
.battleType("double") .battleStyle("double")
.enemyMoveset(Moves.SPLASH) .enemyMoveset(Moves.SPLASH)
.moveset([Moves.ROAR, Moves.SPLASH]) .moveset([Moves.ROAR, Moves.SPLASH])
.ability(Abilities.BALL_FETCH); .ability(Abilities.BALL_FETCH);

View File

@ -25,7 +25,7 @@ describe("Moves - Aroma Veil", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("double") .battleStyle("double")
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset([Moves.HEAL_BLOCK, Moves.IMPRISON, Moves.SPLASH]) .enemyMoveset([Moves.HEAL_BLOCK, Moves.IMPRISON, Moves.SPLASH])
.enemySpecies(Species.SHUCKLE) .enemySpecies(Species.SHUCKLE)

View File

@ -24,7 +24,7 @@ describe("Abilities - Aura Break", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.moveset([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]); game.override.moveset([Moves.MOONBLAST, Moves.DARK_PULSE, Moves.MOONBLAST, Moves.DARK_PULSE]);
game.override.enemyMoveset(Moves.SPLASH); game.override.enemyMoveset(Moves.SPLASH);
game.override.enemyAbility(Abilities.AURA_BREAK); game.override.enemyAbility(Abilities.AURA_BREAK);

View File

@ -26,7 +26,7 @@ describe("Abilities - Battery", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("double"); game.override.battleStyle("double");
game.override.enemySpecies(Species.SHUCKLE); game.override.enemySpecies(Species.SHUCKLE);
game.override.enemyAbility(Abilities.BALL_FETCH); game.override.enemyAbility(Abilities.BALL_FETCH);
game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]);

View File

@ -28,7 +28,7 @@ describe("Abilities - BATTLE BOND", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.startingWave(4) // Leads to arena reset on Wave 5 trainer battle .startingWave(4) // Leads to arena reset on Wave 5 trainer battle
.ability(Abilities.BATTLE_BOND) .ability(Abilities.BATTLE_BOND)
.starterForms({ [Species.GRENINJA]: ashForm }) .starterForms({ [Species.GRENINJA]: ashForm })

View File

@ -24,7 +24,7 @@ describe("Abilities - Beast Boost", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.BULBASAUR) .enemySpecies(Species.BULBASAUR)
.enemyAbility(Abilities.BEAST_BOOST) .enemyAbility(Abilities.BEAST_BOOST)
.ability(Abilities.BEAST_BOOST) .ability(Abilities.BEAST_BOOST)

View File

@ -34,7 +34,7 @@ describe("Abilities - Commander", () => {
.enemyLevel(100) .enemyLevel(100)
.moveset([Moves.LIQUIDATION, Moves.MEMENTO, Moves.SPLASH, Moves.FLIP_TURN]) .moveset([Moves.LIQUIDATION, Moves.MEMENTO, Moves.SPLASH, Moves.FLIP_TURN])
.ability(Abilities.COMMANDER) .ability(Abilities.COMMANDER)
.battleType("double") .battleStyle("double")
.disableCrits() .disableCrits()
.enemySpecies(Species.SNORLAX) .enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -25,7 +25,7 @@ describe("Abilities - Competitive", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.BEEDRILL) .enemySpecies(Species.BEEDRILL)
.enemyMoveset(Moves.TICKLE) .enemyMoveset(Moves.TICKLE)
.startingLevel(1) .startingLevel(1)

View File

@ -23,7 +23,7 @@ describe("Abilities - Contrary", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.BULBASAUR) .enemySpecies(Species.BULBASAUR)
.enemyAbility(Abilities.CONTRARY) .enemyAbility(Abilities.CONTRARY)
.ability(Abilities.INTIMIDATE) .ability(Abilities.INTIMIDATE)

View File

@ -23,7 +23,7 @@ describe("Abilities - Corrosion", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([Moves.SPLASH]) .moveset([Moves.SPLASH])
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.GRIMER) .enemySpecies(Species.GRIMER)
.enemyAbility(Abilities.CORROSION) .enemyAbility(Abilities.CORROSION)

View File

@ -24,7 +24,7 @@ describe("Abilities - COSTAR", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("double"); game.override.battleStyle("double");
game.override.ability(Abilities.COSTAR); game.override.ability(Abilities.COSTAR);
game.override.moveset([Moves.SPLASH, Moves.NASTY_PLOT]); game.override.moveset([Moves.SPLASH, Moves.NASTY_PLOT]);
game.override.enemyMoveset(Moves.SPLASH); game.override.enemyMoveset(Moves.SPLASH);

View File

@ -23,7 +23,7 @@ describe("Abilities - Dancer", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("double"); game.override.battleStyle("double");
}); });
// Reference Link: https://bulbapedia.bulbagarden.net/wiki/Dancer_(Ability) // Reference Link: https://bulbapedia.bulbagarden.net/wiki/Dancer_(Ability)

View File

@ -25,7 +25,7 @@ describe("Abilities - Defiant", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.BEEDRILL) .enemySpecies(Species.BEEDRILL)
.enemyMoveset(Moves.TICKLE) .enemyMoveset(Moves.TICKLE)
.startingLevel(1) .startingLevel(1)

View File

@ -38,7 +38,7 @@ describe("Abilities - Desolate Land", () => {
* is forcefully moved out of the field from moves such as Roar {@linkcode Moves.ROAR} * is forcefully moved out of the field from moves such as Roar {@linkcode Moves.ROAR}
*/ */
it("should lift only when all pokemon with this ability leave the field", async () => { it("should lift only when all pokemon with this ability leave the field", async () => {
game.override.battleType("double").enemyMoveset([Moves.SPLASH, Moves.ROAR]); game.override.battleStyle("double").enemyMoveset([Moves.SPLASH, Moves.ROAR]);
await game.classicMode.startBattle([Species.MAGCARGO, Species.MAGCARGO, Species.MAGIKARP, Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGCARGO, Species.MAGCARGO, Species.MAGIKARP, Species.MAGIKARP]);
expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN);
@ -76,7 +76,7 @@ describe("Abilities - Desolate Land", () => {
it("should lift when enemy faints", async () => { it("should lift when enemy faints", async () => {
game.override game.override
.battleType("single") .battleStyle("single")
.moveset([Moves.SHEER_COLD]) .moveset([Moves.SHEER_COLD])
.ability(Abilities.NO_GUARD) .ability(Abilities.NO_GUARD)
.startingLevel(100) .startingLevel(100)
@ -96,7 +96,7 @@ describe("Abilities - Desolate Land", () => {
}); });
it("should lift when pokemon returns upon switching from double to single battle", async () => { it("should lift when pokemon returns upon switching from double to single battle", async () => {
game.override.battleType("even-doubles").enemyMoveset([Moves.SPLASH, Moves.MEMENTO]).startingWave(12); game.override.battleStyle("even-doubles").enemyMoveset([Moves.SPLASH, Moves.MEMENTO]).startingWave(12);
await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGCARGO]); await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGCARGO]);
expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN); expect(game.scene.arena.weather?.weatherType).toBe(WeatherType.HARSH_SUN);
@ -117,7 +117,7 @@ describe("Abilities - Desolate Land", () => {
it("should lift when enemy is captured", async () => { it("should lift when enemy is captured", async () => {
game.override game.override
.battleType("single") .battleStyle("single")
.enemyMoveset([Moves.SPLASH]) .enemyMoveset([Moves.SPLASH])
.enemySpecies(Species.MAGCARGO) .enemySpecies(Species.MAGCARGO)
.enemyHasPassiveAbility(true); .enemyHasPassiveAbility(true);

View File

@ -27,7 +27,7 @@ describe("Abilities - Disguise", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.MIMIKYU) .enemySpecies(Species.MIMIKYU)
.enemyMoveset(Moves.SPLASH) .enemyMoveset(Moves.SPLASH)
.starterSpecies(Species.REGIELEKI) .starterSpecies(Species.REGIELEKI)

View File

@ -22,7 +22,7 @@ describe("Abilities - Dry Skin", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemyAbility(Abilities.DRY_SKIN) .enemyAbility(Abilities.DRY_SKIN)
.enemyMoveset(Moves.SPLASH) .enemyMoveset(Moves.SPLASH)

View File

@ -27,7 +27,7 @@ describe("Abilities - Early Bird", () => {
game.override game.override
.moveset([Moves.REST, Moves.BELLY_DRUM, Moves.SPLASH]) .moveset([Moves.REST, Moves.BELLY_DRUM, Moves.SPLASH])
.ability(Abilities.EARLY_BIRD) .ability(Abilities.EARLY_BIRD)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -27,7 +27,7 @@ describe("Abilities - Flash Fire", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.ability(Abilities.FLASH_FIRE) .ability(Abilities.FLASH_FIRE)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.startingLevel(20) .startingLevel(20)

View File

@ -47,7 +47,7 @@ describe("Abilities - Flower Gift", () => {
allyAbility = Abilities.BALL_FETCH, allyAbility = Abilities.BALL_FETCH,
enemyAbility = Abilities.BALL_FETCH, enemyAbility = Abilities.BALL_FETCH,
): Promise<[number, number]> => { ): Promise<[number, number]> => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.moveset([Moves.SPLASH, Moves.SUNNY_DAY, move, Moves.HEAL_PULSE]); game.override.moveset([Moves.SPLASH, Moves.SUNNY_DAY, move, Moves.HEAL_PULSE]);
game.override.enemyMoveset([Moves.SPLASH, Moves.HEAL_PULSE]); game.override.enemyMoveset([Moves.SPLASH, Moves.HEAL_PULSE]);
const target_index = allyAttacker ? BattlerIndex.ENEMY : BattlerIndex.PLAYER_2; const target_index = allyAttacker ? BattlerIndex.ENEMY : BattlerIndex.PLAYER_2;
@ -110,7 +110,7 @@ describe("Abilities - Flower Gift", () => {
}); });
it("increases the ATK and SPDEF stat stages of the Pokémon with this Ability and its allies by 1.5× during Harsh Sunlight", async () => { it("increases the ATK and SPDEF stat stages of the Pokémon with this Ability and its allies by 1.5× during Harsh Sunlight", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]); await game.classicMode.startBattle([Species.CHERRIM, Species.MAGIKARP]);
const [cherrim, magikarp] = game.scene.getPlayerField(); const [cherrim, magikarp] = game.scene.getPlayerField();

View File

@ -31,7 +31,7 @@ describe("Abilities - Flower Veil", () => {
.moveset([Moves.SPLASH]) .moveset([Moves.SPLASH])
.enemySpecies(Species.BULBASAUR) .enemySpecies(Species.BULBASAUR)
.ability(Abilities.FLOWER_VEIL) .ability(Abilities.FLOWER_VEIL)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -63,7 +63,7 @@ describe("Abilities - Flower Veil", () => {
}); });
it("should prevent drowsiness from yawn for a grass user and its grass allies", async () => { it("should prevent drowsiness from yawn for a grass user and its grass allies", async () => {
game.override.enemyMoveset([Moves.YAWN]).moveset([Moves.SPLASH]).battleType("double"); game.override.enemyMoveset([Moves.YAWN]).moveset([Moves.SPLASH]).battleStyle("double");
await game.classicMode.startBattle([Species.BULBASAUR, Species.BULBASAUR]); await game.classicMode.startBattle([Species.BULBASAUR, Species.BULBASAUR]);
// Clear the ability of the ally to isolate the test // Clear the ability of the ally to isolate the test
@ -81,7 +81,7 @@ describe("Abilities - Flower Veil", () => {
}); });
it("should prevent status conditions from moves like Thunder Wave for a grass user and its grass allies", async () => { it("should prevent status conditions from moves like Thunder Wave for a grass user and its grass allies", async () => {
game.override.enemyMoveset([Moves.THUNDER_WAVE]).moveset([Moves.SPLASH]).battleType("double"); game.override.enemyMoveset([Moves.THUNDER_WAVE]).moveset([Moves.SPLASH]).battleStyle("double");
vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100);
await game.classicMode.startBattle([Species.BULBASAUR]); await game.classicMode.startBattle([Species.BULBASAUR]);
@ -93,7 +93,7 @@ describe("Abilities - Flower Veil", () => {
}); });
it("should not prevent status conditions for a non-grass user and its non-grass allies", async () => { it("should not prevent status conditions for a non-grass user and its non-grass allies", async () => {
game.override.enemyMoveset([Moves.THUNDER_WAVE]).moveset([Moves.SPLASH]).battleType("double"); game.override.enemyMoveset([Moves.THUNDER_WAVE]).moveset([Moves.SPLASH]).battleStyle("double");
await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]);
const [user, ally] = game.scene.getPlayerField(); const [user, ally] = game.scene.getPlayerField();
vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100); vi.spyOn(allMoves[Moves.THUNDER_WAVE], "accuracy", "get").mockReturnValue(100);
@ -113,7 +113,7 @@ describe("Abilities - Flower Veil", () => {
*******************************************/ *******************************************/
it("should prevent the status drops from enemies for the a grass user and its grass allies", async () => { it("should prevent the status drops from enemies for the a grass user and its grass allies", async () => {
game.override.enemyMoveset([Moves.GROWL]).moveset([Moves.SPLASH]).battleType("double"); game.override.enemyMoveset([Moves.GROWL]).moveset([Moves.SPLASH]).battleStyle("double");
await game.classicMode.startBattle([Species.BULBASAUR, Species.BULBASAUR]); await game.classicMode.startBattle([Species.BULBASAUR, Species.BULBASAUR]);
const [user, ally] = game.scene.getPlayerField(); const [user, ally] = game.scene.getPlayerField();
// Clear the ally ability to isolate the test // Clear the ally ability to isolate the test
@ -126,7 +126,7 @@ describe("Abilities - Flower Veil", () => {
}); });
it("should not prevent status drops for a non-grass user and its non-grass allies", async () => { it("should not prevent status drops for a non-grass user and its non-grass allies", async () => {
game.override.enemyMoveset([Moves.GROWL]).moveset([Moves.SPLASH]).battleType("double"); game.override.enemyMoveset([Moves.GROWL]).moveset([Moves.SPLASH]).battleStyle("double");
await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]);
const [user, ally] = game.scene.getPlayerField(); const [user, ally] = game.scene.getPlayerField();
// Clear the ally ability to isolate the test // Clear the ally ability to isolate the test
@ -139,7 +139,7 @@ describe("Abilities - Flower Veil", () => {
}); });
it("should not prevent self-inflicted stat drops from moves like Close Combat for a user or its allies", async () => { it("should not prevent self-inflicted stat drops from moves like Close Combat for a user or its allies", async () => {
game.override.moveset([Moves.CLOSE_COMBAT]).battleType("double"); game.override.moveset([Moves.CLOSE_COMBAT]).battleStyle("double");
await game.classicMode.startBattle([Species.BULBASAUR, Species.BULBASAUR]); await game.classicMode.startBattle([Species.BULBASAUR, Species.BULBASAUR]);
const [user, ally] = game.scene.getPlayerField(); const [user, ally] = game.scene.getPlayerField();
// Clear the ally ability to isolate the test // Clear the ally ability to isolate the test

View File

@ -75,7 +75,7 @@ describe("Abilities - Forecast", () => {
async () => { async () => {
game.override game.override
.moveset([Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SNOWSCAPE, Moves.SPLASH]) .moveset([Moves.RAIN_DANCE, Moves.SUNNY_DAY, Moves.SNOWSCAPE, Moves.SPLASH])
.battleType("double") .battleStyle("double")
.starterForms({ .starterForms({
[Species.KYOGRE]: 1, [Species.KYOGRE]: 1,
[Species.GROUDON]: 1, [Species.GROUDON]: 1,

View File

@ -26,7 +26,7 @@ describe("Moves - Friend Guard", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("double") .battleStyle("double")
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset([Moves.TACKLE, Moves.SPLASH, Moves.DRAGON_RAGE]) .enemyMoveset([Moves.TACKLE, Moves.SPLASH, Moves.DRAGON_RAGE])
.enemySpecies(Species.SHUCKLE) .enemySpecies(Species.SHUCKLE)

View File

@ -27,7 +27,7 @@ describe("Abilities - Galvanize", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.startingLevel(100) .startingLevel(100)
.ability(Abilities.GALVANIZE) .ability(Abilities.GALVANIZE)
.moveset([Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES]) .moveset([Moves.TACKLE, Moves.REVELATION_DANCE, Moves.FURY_SWIPES])

View File

@ -32,7 +32,7 @@ describe("Abilities - Good As Gold", () => {
game.override game.override
.moveset([Moves.SPLASH]) .moveset([Moves.SPLASH])
.ability(Abilities.GOOD_AS_GOLD) .ability(Abilities.GOOD_AS_GOLD)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -63,7 +63,7 @@ describe("Abilities - Good As Gold", () => {
}); });
it("should not block any status moves that target the field, one side, or all pokemon", async () => { it("should not block any status moves that target the field, one side, or all pokemon", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.enemyMoveset([Moves.STEALTH_ROCK, Moves.HAZE]); game.override.enemyMoveset([Moves.STEALTH_ROCK, Moves.HAZE]);
game.override.moveset([Moves.SWORDS_DANCE, Moves.SAFEGUARD]); game.override.moveset([Moves.SWORDS_DANCE, Moves.SAFEGUARD]);
await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]);
@ -85,7 +85,7 @@ describe("Abilities - Good As Gold", () => {
}); });
it("should not block field targeted effects in singles", async () => { it("should not block field targeted effects in singles", async () => {
game.override.battleType("single"); game.override.battleStyle("single");
game.override.enemyMoveset([Moves.SPIKES]); game.override.enemyMoveset([Moves.SPIKES]);
await game.classicMode.startBattle([Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP]);
@ -96,7 +96,7 @@ describe("Abilities - Good As Gold", () => {
}); });
it("should block the ally's helping hand", async () => { it("should block the ally's helping hand", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.moveset([Moves.HELPING_HAND, Moves.TACKLE]); game.override.moveset([Moves.HELPING_HAND, Moves.TACKLE]);
await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]); await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS]);
@ -108,7 +108,7 @@ describe("Abilities - Good As Gold", () => {
}); });
it("should block the ally's heal bell, but only if the good as gold user is on the field", async () => { it("should block the ally's heal bell, but only if the good as gold user is on the field", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.moveset([Moves.HEAL_BELL, Moves.SPLASH]); game.override.moveset([Moves.HEAL_BELL, Moves.SPLASH]);
game.override.statusEffect(StatusEffect.BURN); game.override.statusEffect(StatusEffect.BURN);
await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS, Species.ABRA]); await game.classicMode.startBattle([Species.MAGIKARP, Species.FEEBAS, Species.ABRA]);
@ -130,7 +130,7 @@ describe("Abilities - Good As Gold", () => {
}); });
it("should not block field targeted effects like rain dance", async () => { it("should not block field targeted effects like rain dance", async () => {
game.override.battleType("single"); game.override.battleStyle("single");
game.override.enemyMoveset([Moves.RAIN_DANCE]); game.override.enemyMoveset([Moves.RAIN_DANCE]);
game.override.weather(WeatherType.NONE); game.override.weather(WeatherType.NONE);
await game.classicMode.startBattle([Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP]);

View File

@ -23,7 +23,7 @@ describe("Abilities - Gorilla Tactics", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset([Moves.SPLASH, Moves.DISABLE]) .enemyMoveset([Moves.SPLASH, Moves.DISABLE])
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)

View File

@ -42,7 +42,7 @@ describe("Abilities - Gulp Missile", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.disableCrits() .disableCrits()
.battleType("single") .battleStyle("single")
.moveset([Moves.SURF, Moves.DIVE, Moves.SPLASH, Moves.SUBSTITUTE]) .moveset([Moves.SURF, Moves.DIVE, Moves.SPLASH, Moves.SUBSTITUTE])
.enemySpecies(Species.SNORLAX) .enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -32,7 +32,7 @@ describe("Abilities - Healer", () => {
game.override game.override
.moveset([Moves.SPLASH]) .moveset([Moves.SPLASH])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("double") .battleStyle("double")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -25,7 +25,7 @@ describe("Abilities - Heatproof", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.CHARMANDER) .enemySpecies(Species.CHARMANDER)
.enemyAbility(Abilities.HEATPROOF) .enemyAbility(Abilities.HEATPROOF)

View File

@ -28,7 +28,7 @@ describe("Abilities - Honey Gather", () => {
.startingLevel(100) .startingLevel(100)
.ability(Abilities.HONEY_GATHER) .ability(Abilities.HONEY_GATHER)
.passiveAbility(Abilities.RUN_AWAY) .passiveAbility(Abilities.RUN_AWAY)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -27,7 +27,7 @@ describe("Abilities - Hustle", () => {
.ability(Abilities.HUSTLE) .ability(Abilities.HUSTLE)
.moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE]) .moveset([Moves.TACKLE, Moves.GIGA_DRAIN, Moves.FISSURE])
.disableCrits() .disableCrits()
.battleType("single") .battleStyle("single")
.enemyMoveset(Moves.SPLASH) .enemyMoveset(Moves.SPLASH)
.enemySpecies(Species.SHUCKLE) .enemySpecies(Species.SHUCKLE)
.enemyAbility(Abilities.BALL_FETCH); .enemyAbility(Abilities.BALL_FETCH);

View File

@ -23,7 +23,7 @@ describe("Abilities - Hyper Cutter", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.moveset([Moves.SAND_ATTACK, Moves.NOBLE_ROAR, Moves.DEFOG, Moves.OCTOLOCK]) .moveset([Moves.SAND_ATTACK, Moves.NOBLE_ROAR, Moves.DEFOG, Moves.OCTOLOCK])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.enemySpecies(Species.SHUCKLE) .enemySpecies(Species.SHUCKLE)

View File

@ -30,7 +30,7 @@ describe("Abilities - Ice Face", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.enemySpecies(Species.EISCUE); game.override.enemySpecies(Species.EISCUE);
game.override.enemyAbility(Abilities.ICE_FACE); game.override.enemyAbility(Abilities.ICE_FACE);
game.override.moveset([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]); game.override.moveset([Moves.TACKLE, Moves.ICE_BEAM, Moves.TOXIC_THREAD, Moves.HAIL]);

View File

@ -29,7 +29,7 @@ describe("Abilities - Illuminate", () => {
}); });
it("should prevent ACC stat stage from being lowered", async () => { it("should prevent ACC stat stage from being lowered", async () => {
game.override.battleType("single"); game.override.battleStyle("single");
await game.classicMode.startBattle(); await game.classicMode.startBattle();

View File

@ -25,7 +25,7 @@ describe("Abilities - Illusion", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.enemySpecies(Species.ZORUA); game.override.enemySpecies(Species.ZORUA);
game.override.enemyAbility(Abilities.ILLUSION); game.override.enemyAbility(Abilities.ILLUSION);
game.override.enemyMoveset(Moves.TACKLE); game.override.enemyMoveset(Moves.TACKLE);

View File

@ -23,9 +23,9 @@ describe("Abilities - Immunity", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([ Moves.SPLASH ]) .moveset([Moves.SPLASH])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -33,12 +33,12 @@ describe("Abilities - Immunity", () => {
}); });
it("should remove poison when gained", async () => { it("should remove poison when gained", async () => {
game.override.ability(Abilities.IMMUNITY) game.override
.ability(Abilities.IMMUNITY)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.moveset(Moves.SKILL_SWAP) .moveset(Moves.SKILL_SWAP)
.enemyMoveset(Moves.SPLASH), .enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle([Species.FEEBAS]);
await game.classicMode.startBattle([ Species.FEEBAS ]);
const enemy = game.scene.getEnemyPokemon(); const enemy = game.scene.getEnemyPokemon();
enemy?.trySetStatus(StatusEffect.POISON); enemy?.trySetStatus(StatusEffect.POISON);
expect(enemy?.status?.effect).toBe(StatusEffect.POISON); expect(enemy?.status?.effect).toBe(StatusEffect.POISON);

View File

@ -25,7 +25,7 @@ describe("Abilities - Imposter", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.MEW) .enemySpecies(Species.MEW)
.enemyLevel(200) .enemyLevel(200)
.enemyAbility(Abilities.BEAST_BOOST) .enemyAbility(Abilities.BEAST_BOOST)

View File

@ -30,7 +30,7 @@ describe("Abilities - Infiltrator", () => {
game.override game.override
.moveset([Moves.TACKLE, Moves.WATER_GUN, Moves.SPORE, Moves.BABY_DOLL_EYES]) .moveset([Moves.TACKLE, Moves.WATER_GUN, Moves.SPORE, Moves.BABY_DOLL_EYES])
.ability(Abilities.INFILTRATOR) .ability(Abilities.INFILTRATOR)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.SNORLAX) .enemySpecies(Species.SNORLAX)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -23,9 +23,9 @@ describe("Abilities - Insomnia", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([ Moves.SPLASH ]) .moveset([Moves.SPLASH])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -33,12 +33,12 @@ describe("Abilities - Insomnia", () => {
}); });
it("should remove sleep when gained", async () => { it("should remove sleep when gained", async () => {
game.override.ability(Abilities.INSOMNIA) game.override
.ability(Abilities.INSOMNIA)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.moveset(Moves.SKILL_SWAP) .moveset(Moves.SKILL_SWAP)
.enemyMoveset(Moves.SPLASH), .enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle([Species.FEEBAS]);
await game.classicMode.startBattle([ Species.FEEBAS ]);
const enemy = game.scene.getEnemyPokemon(); const enemy = game.scene.getEnemyPokemon();
enemy?.trySetStatus(StatusEffect.SLEEP); enemy?.trySetStatus(StatusEffect.SLEEP);
expect(enemy?.status?.effect).toBe(StatusEffect.SLEEP); expect(enemy?.status?.effect).toBe(StatusEffect.SLEEP);

View File

@ -25,7 +25,7 @@ describe("Abilities - Intimidate", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.RATTATA) .enemySpecies(Species.RATTATA)
.enemyAbility(Abilities.INTIMIDATE) .enemyAbility(Abilities.INTIMIDATE)
.enemyPassiveAbility(Abilities.HYDRATION) .enemyPassiveAbility(Abilities.HYDRATION)
@ -65,7 +65,7 @@ describe("Abilities - Intimidate", () => {
}, 20000); }, 20000);
it("should lower ATK stat stage by 1 for every enemy Pokemon in a double battle on entry", async () => { it("should lower ATK stat stage by 1 for every enemy Pokemon in a double battle on entry", async () => {
game.override.battleType("double").startingWave(3); game.override.battleStyle("double").startingWave(3);
await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]); await game.classicMode.runToSummon([Species.MIGHTYENA, Species.POOCHYENA]);
game.onNextPrompt( game.onNextPrompt(
"CheckSwitchPhase", "CheckSwitchPhase",

View File

@ -22,7 +22,7 @@ describe("Abilities - Intrepid Sword", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.enemySpecies(Species.ZACIAN); game.override.enemySpecies(Species.ZACIAN);
game.override.enemyAbility(Abilities.INTREPID_SWORD); game.override.enemyAbility(Abilities.INTREPID_SWORD);
game.override.ability(Abilities.INTREPID_SWORD); game.override.ability(Abilities.INTREPID_SWORD);

View File

@ -29,7 +29,7 @@ describe("Abilities - Libero", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.ability(Abilities.LIBERO); game.override.ability(Abilities.LIBERO);
game.override.startingLevel(100); game.override.startingLevel(100);
game.override.enemySpecies(Species.RATTATA); game.override.enemySpecies(Species.RATTATA);

View File

@ -26,7 +26,7 @@ describe("Abilities - Lightningrod", () => {
game.override game.override
.moveset([Moves.SPLASH, Moves.SHOCK_WAVE]) .moveset([Moves.SPLASH, Moves.SHOCK_WAVE])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("double") .battleStyle("double")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -23,9 +23,9 @@ describe("Abilities - Limber", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([ Moves.SPLASH ]) .moveset([Moves.SPLASH])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -33,12 +33,12 @@ describe("Abilities - Limber", () => {
}); });
it("should remove paralysis when gained", async () => { it("should remove paralysis when gained", async () => {
game.override.ability(Abilities.LIMBER) game.override
.ability(Abilities.LIMBER)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.moveset(Moves.SKILL_SWAP) .moveset(Moves.SKILL_SWAP)
.enemyMoveset(Moves.SPLASH), .enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle([Species.FEEBAS]);
await game.classicMode.startBattle([ Species.FEEBAS ]);
const enemy = game.scene.getEnemyPokemon(); const enemy = game.scene.getEnemyPokemon();
enemy?.trySetStatus(StatusEffect.PARALYSIS); enemy?.trySetStatus(StatusEffect.PARALYSIS);
expect(enemy?.status?.effect).toBe(StatusEffect.PARALYSIS); expect(enemy?.status?.effect).toBe(StatusEffect.PARALYSIS);

View File

@ -30,7 +30,7 @@ describe("Abilities - Magic Bounce", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("single") .battleStyle("single")
.moveset([Moves.GROWL, Moves.SPLASH]) .moveset([Moves.GROWL, Moves.SPLASH])
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
@ -60,7 +60,7 @@ describe("Abilities - Magic Bounce", () => {
}); });
it("should individually bounce back multi-target moves", async () => { it("should individually bounce back multi-target moves", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.moveset([Moves.GROWL, Moves.SPLASH]); game.override.moveset([Moves.GROWL, Moves.SPLASH]);
await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]);
@ -114,7 +114,7 @@ describe("Abilities - Magic Bounce", () => {
}); });
it("should bounce back a spread status move against both pokemon", async () => { it("should bounce back a spread status move against both pokemon", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.moveset([Moves.GROWL, Moves.SPLASH]); game.override.moveset([Moves.GROWL, Moves.SPLASH]);
game.override.enemyMoveset([Moves.SPLASH]); game.override.enemyMoveset([Moves.SPLASH]);
await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]);
@ -127,7 +127,7 @@ describe("Abilities - Magic Bounce", () => {
}); });
it("should only bounce spikes back once in doubles when both targets have magic bounce", async () => { it("should only bounce spikes back once in doubles when both targets have magic bounce", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
await game.classicMode.startBattle([Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP]);
game.override.moveset([Moves.SPIKES]); game.override.moveset([Moves.SPIKES]);
@ -227,7 +227,7 @@ describe("Abilities - Magic Bounce", () => {
// TODO: stomping tantrum should consider moves that were bounced. // TODO: stomping tantrum should consider moves that were bounced.
it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => { it.todo("should cause stomping tantrum to double in power when the last move was bounced", async () => {
game.override.battleType("single"); game.override.battleStyle("single");
await game.classicMode.startBattle([Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP]);
game.override.moveset([Moves.STOMPING_TANTRUM, Moves.CHARM]); game.override.moveset([Moves.STOMPING_TANTRUM, Moves.CHARM]);
@ -309,7 +309,7 @@ describe("Abilities - Magic Bounce", () => {
}); });
it("should always apply the leftmost available target's magic bounce when bouncing moves like sticky webs in doubles", async () => { it("should always apply the leftmost available target's magic bounce when bouncing moves like sticky webs in doubles", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.moveset([Moves.STICKY_WEB, Moves.SPLASH, Moves.TRICK_ROOM]); game.override.moveset([Moves.STICKY_WEB, Moves.SPLASH, Moves.TRICK_ROOM]);
await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP, Species.MAGIKARP]);

View File

@ -23,9 +23,9 @@ describe("Abilities - Magma Armor", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([ Moves.SPLASH ]) .moveset([Moves.SPLASH])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -33,12 +33,12 @@ describe("Abilities - Magma Armor", () => {
}); });
it("should remove freeze when gained", async () => { it("should remove freeze when gained", async () => {
game.override.ability(Abilities.MAGMA_ARMOR) game.override
.ability(Abilities.MAGMA_ARMOR)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.moveset(Moves.SKILL_SWAP) .moveset(Moves.SKILL_SWAP)
.enemyMoveset(Moves.SPLASH), .enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle([Species.FEEBAS]);
await game.classicMode.startBattle([ Species.FEEBAS ]);
const enemy = game.scene.getEnemyPokemon(); const enemy = game.scene.getEnemyPokemon();
enemy?.trySetStatus(StatusEffect.FREEZE); enemy?.trySetStatus(StatusEffect.FREEZE);
expect(enemy?.status?.effect).toBe(StatusEffect.FREEZE); expect(enemy?.status?.effect).toBe(StatusEffect.FREEZE);

View File

@ -25,7 +25,7 @@ describe("Abilities - Mimicry", () => {
game.override game.override
.moveset([Moves.SPLASH]) .moveset([Moves.SPLASH])
.ability(Abilities.MIMICRY) .ability(Abilities.MIMICRY)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyMoveset(Moves.SPLASH); .enemyMoveset(Moves.SPLASH);

View File

@ -27,7 +27,7 @@ describe("Ability - Mirror Armor", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.RATTATA) .enemySpecies(Species.RATTATA)
.enemyMoveset([Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK]) .enemyMoveset([Moves.SPLASH, Moves.STICKY_WEB, Moves.TICKLE, Moves.OCTOLOCK])
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -71,7 +71,7 @@ describe("Ability - Mirror Armor", () => {
}); });
it("Player side + double battle Intimidate - opponents each lose -2 atk", async () => { it("Player side + double battle Intimidate - opponents each lose -2 atk", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.ability(Abilities.MIRROR_ARMOR); game.override.ability(Abilities.MIRROR_ARMOR);
game.override.enemyAbility(Abilities.INTIMIDATE); game.override.enemyAbility(Abilities.INTIMIDATE);
await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]);
@ -93,7 +93,7 @@ describe("Ability - Mirror Armor", () => {
}); });
it("Enemy side + double battle Intimidate - players each lose -2 atk", async () => { it("Enemy side + double battle Intimidate - players each lose -2 atk", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.enemyAbility(Abilities.MIRROR_ARMOR); game.override.enemyAbility(Abilities.MIRROR_ARMOR);
game.override.ability(Abilities.INTIMIDATE); game.override.ability(Abilities.INTIMIDATE);
await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]);
@ -134,7 +134,7 @@ describe("Ability - Mirror Armor", () => {
}); });
it("Player side + double battle Intimidate + Tickle - opponents each lose -3 atk, -1 def", async () => { it("Player side + double battle Intimidate + Tickle - opponents each lose -3 atk, -1 def", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.ability(Abilities.MIRROR_ARMOR); game.override.ability(Abilities.MIRROR_ARMOR);
game.override.enemyAbility(Abilities.INTIMIDATE); game.override.enemyAbility(Abilities.INTIMIDATE);
await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]); await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER]);
@ -288,7 +288,7 @@ describe("Ability - Mirror Armor", () => {
}); });
it("Double battle + sticky web applied player side - player switches out and enemy 1 should lose -1 speed", async () => { it("Double battle + sticky web applied player side - player switches out and enemy 1 should lose -1 speed", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.ability(Abilities.MIRROR_ARMOR); game.override.ability(Abilities.MIRROR_ARMOR);
await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]); await game.classicMode.startBattle([Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE]);

View File

@ -24,9 +24,9 @@ describe("Abilities - Mold Breaker", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([ Moves.SPLASH ]) .moveset([Moves.SPLASH])
.ability(Abilities.MOLD_BREAKER) .ability(Abilities.MOLD_BREAKER)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -34,17 +34,18 @@ describe("Abilities - Mold Breaker", () => {
}); });
it("should turn off the ignore abilities arena variable after the user's move", async () => { it("should turn off the ignore abilities arena variable after the user's move", async () => {
game.override.enemyMoveset(Moves.SPLASH) game.override
.enemyMoveset(Moves.SPLASH)
.ability(Abilities.MOLD_BREAKER) .ability(Abilities.MOLD_BREAKER)
.moveset([ Moves.ERUPTION ]) .moveset([Moves.ERUPTION])
.startingLevel(100) .startingLevel(100)
.enemyLevel(2); .enemyLevel(2);
await game.classicMode.startBattle([ Species.MAGIKARP ]); await game.classicMode.startBattle([Species.MAGIKARP]);
const enemy = game.scene.getEnemyPokemon()!; const enemy = game.scene.getEnemyPokemon()!;
expect(enemy.isFainted()).toBe(false); expect(enemy.isFainted()).toBe(false);
game.move.select(Moves.SPLASH); game.move.select(Moves.SPLASH);
await game.setTurnOrder([ BattlerIndex.PLAYER, BattlerIndex.ENEMY ]); await game.setTurnOrder([BattlerIndex.PLAYER, BattlerIndex.ENEMY]);
await game.phaseInterceptor.to("MoveEndPhase", true); await game.phaseInterceptor.to("MoveEndPhase", true);
expect(globalScene.arena.ignoreAbilities).toBe(false); expect(globalScene.arena.ignoreAbilities).toBe(false);
}); });

View File

@ -24,7 +24,7 @@ describe("Abilities - Moody", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.RATTATA) .enemySpecies(Species.RATTATA)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.ability(Abilities.MOODY) .ability(Abilities.MOODY)

View File

@ -27,7 +27,7 @@ describe("Abilities - Moxie", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
const moveToUse = Moves.AERIAL_ACE; const moveToUse = Moves.AERIAL_ACE;
game.override.battleType("single"); game.override.battleStyle("single");
game.override.enemySpecies(Species.RATTATA); game.override.enemySpecies(Species.RATTATA);
game.override.enemyAbility(Abilities.MOXIE); game.override.enemyAbility(Abilities.MOXIE);
game.override.ability(Abilities.MOXIE); game.override.ability(Abilities.MOXIE);
@ -54,7 +54,7 @@ describe("Abilities - Moxie", () => {
it.todo( it.todo(
"should raise ATK stat stage by 1 when defeating an ally Pokemon", "should raise ATK stat stage by 1 when defeating an ally Pokemon",
async () => { async () => {
game.override.battleType("double"); game.override.battleStyle("double");
const moveToUse = Moves.AERIAL_ACE; const moveToUse = Moves.AERIAL_ACE;
await game.startBattle([Species.MIGHTYENA, Species.MIGHTYENA]); await game.startBattle([Species.MIGHTYENA, Species.MIGHTYENA]);

View File

@ -24,7 +24,7 @@ describe("Abilities - Mummy", () => {
game.override game.override
.moveset([Moves.SPLASH]) .moveset([Moves.SPLASH])
.ability(Abilities.MUMMY) .ability(Abilities.MUMMY)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -24,7 +24,7 @@ describe("Abilities - Mycelium Might", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.disableCrits(); game.override.disableCrits();
game.override.enemySpecies(Species.SHUCKLE); game.override.enemySpecies(Species.SHUCKLE);
game.override.enemyAbility(Abilities.CLEAR_BODY); game.override.enemyAbility(Abilities.CLEAR_BODY);

View File

@ -31,7 +31,7 @@ describe("Abilities - Neutralizing Gas", () => {
game.override game.override
.moveset([Moves.SPLASH]) .moveset([Moves.SPLASH])
.ability(Abilities.NEUTRALIZING_GAS) .ability(Abilities.NEUTRALIZING_GAS)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -105,7 +105,7 @@ describe("Abilities - Neutralizing Gas", () => {
}); });
it("should only deactivate when all setters are off the field", async () => { it("should only deactivate when all setters are off the field", async () => {
game.override.enemyMoveset([Moves.ENTRAINMENT, Moves.SPLASH]).battleType("double"); game.override.enemyMoveset([Moves.ENTRAINMENT, Moves.SPLASH]).battleStyle("double");
await game.classicMode.startBattle([Species.ACCELGOR, Species.ACCELGOR]); await game.classicMode.startBattle([Species.ACCELGOR, Species.ACCELGOR]);
game.move.select(Moves.SPLASH, 0); game.move.select(Moves.SPLASH, 0);
@ -148,7 +148,7 @@ describe("Abilities - Neutralizing Gas", () => {
}); });
it("should deactivate upon catching a wild pokemon", async () => { it("should deactivate upon catching a wild pokemon", async () => {
game.override.battleType("single").enemyAbility(Abilities.NEUTRALIZING_GAS).ability(Abilities.BALL_FETCH); game.override.battleStyle("single").enemyAbility(Abilities.NEUTRALIZING_GAS).ability(Abilities.BALL_FETCH);
await game.classicMode.startBattle([Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP]);
expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined(); expect(game.scene.arena.getTag(ArenaTagType.NEUTRALIZING_GAS)).toBeDefined();
@ -174,7 +174,7 @@ describe("Abilities - Neutralizing Gas", () => {
}); });
it("should not activate abilities of pokemon no longer on the field", async () => { it("should not activate abilities of pokemon no longer on the field", async () => {
game.override.battleType("single").ability(Abilities.NEUTRALIZING_GAS).enemyAbility(Abilities.DELTA_STREAM); game.override.battleStyle("single").ability(Abilities.NEUTRALIZING_GAS).enemyAbility(Abilities.DELTA_STREAM);
await game.classicMode.startBattle([Species.MAGIKARP]); await game.classicMode.startBattle([Species.MAGIKARP]);
const enemy = game.scene.getEnemyPokemon()!; const enemy = game.scene.getEnemyPokemon()!;

View File

@ -33,7 +33,7 @@ describe("Abilities - No Guard", () => {
}); });
it("should make moves always hit regardless of move accuracy", async () => { it("should make moves always hit regardless of move accuracy", async () => {
game.override.battleType("single"); game.override.battleStyle("single");
await game.classicMode.startBattle([Species.REGIELEKI]); await game.classicMode.startBattle([Species.REGIELEKI]);

View File

@ -23,9 +23,9 @@ describe("Abilities - Oblivious", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([ Moves.SPLASH ]) .moveset([Moves.SPLASH])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -33,12 +33,12 @@ describe("Abilities - Oblivious", () => {
}); });
it("should remove taunt when gained", async () => { it("should remove taunt when gained", async () => {
game.override.ability(Abilities.OBLIVIOUS) game.override
.ability(Abilities.OBLIVIOUS)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.moveset(Moves.SKILL_SWAP) .moveset(Moves.SKILL_SWAP)
.enemyMoveset(Moves.SPLASH), .enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle([Species.FEEBAS]);
await game.classicMode.startBattle([ Species.FEEBAS ]);
const enemy = game.scene.getEnemyPokemon(); const enemy = game.scene.getEnemyPokemon();
enemy?.addTag(BattlerTagType.TAUNT); enemy?.addTag(BattlerTagType.TAUNT);
expect(enemy?.getTag(BattlerTagType.TAUNT)).toBeTruthy(); expect(enemy?.getTag(BattlerTagType.TAUNT)).toBeTruthy();
@ -50,12 +50,12 @@ describe("Abilities - Oblivious", () => {
}); });
it("should remove infatuation when gained", async () => { it("should remove infatuation when gained", async () => {
game.override.ability(Abilities.OBLIVIOUS) game.override
.ability(Abilities.OBLIVIOUS)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.moveset(Moves.SKILL_SWAP) .moveset(Moves.SKILL_SWAP)
.enemyMoveset(Moves.SPLASH), .enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle([Species.FEEBAS]);
await game.classicMode.startBattle([ Species.FEEBAS ]);
const enemy = game.scene.getEnemyPokemon(); const enemy = game.scene.getEnemyPokemon();
vi.spyOn(enemy!, "isOppositeGender").mockReturnValue(true); vi.spyOn(enemy!, "isOppositeGender").mockReturnValue(true);
enemy?.addTag(BattlerTagType.INFATUATED, 5, Moves.JUDGMENT, game.scene.getPlayerPokemon()?.id); // sourceID needs to be defined enemy?.addTag(BattlerTagType.INFATUATED, 5, Moves.JUDGMENT, game.scene.getPlayerPokemon()?.id); // sourceID needs to be defined

View File

@ -23,9 +23,9 @@ describe("Abilities - Own Tempo", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.moveset([ Moves.SPLASH ]) .moveset([Moves.SPLASH])
.ability(Abilities.BALL_FETCH) .ability(Abilities.BALL_FETCH)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
@ -33,12 +33,12 @@ describe("Abilities - Own Tempo", () => {
}); });
it("should remove confusion when gained", async () => { it("should remove confusion when gained", async () => {
game.override.ability(Abilities.OWN_TEMPO) game.override
.ability(Abilities.OWN_TEMPO)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.moveset(Moves.SKILL_SWAP) .moveset(Moves.SKILL_SWAP)
.enemyMoveset(Moves.SPLASH), .enemyMoveset(Moves.SPLASH);
await game.classicMode.startBattle([Species.FEEBAS]);
await game.classicMode.startBattle([ Species.FEEBAS ]);
const enemy = game.scene.getEnemyPokemon(); const enemy = game.scene.getEnemyPokemon();
enemy?.addTag(BattlerTagType.CONFUSED); enemy?.addTag(BattlerTagType.CONFUSED);
expect(enemy?.getTag(BattlerTagType.CONFUSED)).toBeTruthy(); expect(enemy?.getTag(BattlerTagType.CONFUSED)).toBeTruthy();

View File

@ -26,7 +26,7 @@ describe("Abilities - Parental Bond", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.disableCrits(); game.override.disableCrits();
game.override.ability(Abilities.PARENTAL_BOND); game.override.ability(Abilities.PARENTAL_BOND);
game.override.enemySpecies(Species.SNORLAX); game.override.enemySpecies(Species.SNORLAX);
@ -167,7 +167,7 @@ describe("Abilities - Parental Bond", () => {
}); });
it("should not apply to multi-target moves", async () => { it("should not apply to multi-target moves", async () => {
game.override.battleType("double"); game.override.battleStyle("double");
game.override.moveset([Moves.EARTHQUAKE]); game.override.moveset([Moves.EARTHQUAKE]);
game.override.passiveAbility(Abilities.LEVITATE); game.override.passiveAbility(Abilities.LEVITATE);

View File

@ -26,7 +26,7 @@ describe("Abilities - Pastel Veil", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("double") .battleStyle("double")
.moveset([Moves.TOXIC_THREAD, Moves.SPLASH]) .moveset([Moves.TOXIC_THREAD, Moves.SPLASH])
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.enemySpecies(Species.SUNKERN) .enemySpecies(Species.SUNKERN)

View File

@ -21,7 +21,7 @@ describe("Abilities - Perish Song", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.disableCrits(); game.override.disableCrits();
game.override.enemySpecies(Species.MAGIKARP); game.override.enemySpecies(Species.MAGIKARP);

View File

@ -25,7 +25,7 @@ describe("Abilities - POWER CONSTRUCT", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
const moveToUse = Moves.SPLASH; const moveToUse = Moves.SPLASH;
game.override.battleType("single"); game.override.battleStyle("single");
game.override.ability(Abilities.POWER_CONSTRUCT); game.override.ability(Abilities.POWER_CONSTRUCT);
game.override.moveset([moveToUse]); game.override.moveset([moveToUse]);
game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);

View File

@ -26,7 +26,7 @@ describe("Abilities - Power Spot", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("double"); game.override.battleStyle("double");
game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]); game.override.moveset([Moves.TACKLE, Moves.BREAKING_SWIPE, Moves.SPLASH, Moves.DAZZLING_GLEAM]);
game.override.enemyMoveset(Moves.SPLASH); game.override.enemyMoveset(Moves.SPLASH);
game.override.enemySpecies(Species.SHUCKLE); game.override.enemySpecies(Species.SHUCKLE);

View File

@ -29,7 +29,7 @@ describe("Abilities - Protean", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.ability(Abilities.PROTEAN); game.override.ability(Abilities.PROTEAN);
game.override.startingLevel(100); game.override.startingLevel(100);
game.override.enemySpecies(Species.RATTATA); game.override.enemySpecies(Species.RATTATA);

View File

@ -27,7 +27,7 @@ describe("Abilities - Protosynthesis", () => {
game.override game.override
.moveset([Moves.SPLASH, Moves.TACKLE]) .moveset([Moves.SPLASH, Moves.TACKLE])
.ability(Abilities.PROTOSYNTHESIS) .ability(Abilities.PROTOSYNTHESIS)
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.enemySpecies(Species.MAGIKARP) .enemySpecies(Species.MAGIKARP)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -24,7 +24,7 @@ describe("Abilities - Quick Draw", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.starterSpecies(Species.MAGIKARP); game.override.starterSpecies(Species.MAGIKARP);
game.override.ability(Abilities.QUICK_DRAW); game.override.ability(Abilities.QUICK_DRAW);

View File

@ -22,7 +22,7 @@ describe("Abilities - Sand Spit", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.disableCrits(); game.override.disableCrits();
game.override.enemySpecies(Species.MAGIKARP); game.override.enemySpecies(Species.MAGIKARP);

View File

@ -34,7 +34,7 @@ describe("Abilities - Sand Veil", () => {
game.override.enemyMoveset([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]); game.override.enemyMoveset([Moves.TWISTER, Moves.TWISTER, Moves.TWISTER, Moves.TWISTER]);
game.override.startingLevel(100); game.override.startingLevel(100);
game.override.enemyLevel(100); game.override.enemyLevel(100);
game.override.weather(WeatherType.SANDSTORM).battleType("double"); game.override.weather(WeatherType.SANDSTORM).battleStyle("double");
}); });
test("ability should increase the evasiveness of the source", async () => { test("ability should increase the evasiveness of the source", async () => {

View File

@ -29,7 +29,7 @@ describe("Abilities - Sap Sipper", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.disableCrits() .disableCrits()
.ability(Abilities.SAP_SIPPER) .ability(Abilities.SAP_SIPPER)
.enemySpecies(Species.RATTATA) .enemySpecies(Species.RATTATA)

View File

@ -25,7 +25,7 @@ describe("Abilities - SCHOOLING", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
const moveToUse = Moves.SPLASH; const moveToUse = Moves.SPLASH;
game.override.battleType("single"); game.override.battleStyle("single");
game.override.ability(Abilities.SCHOOLING); game.override.ability(Abilities.SCHOOLING);
game.override.moveset([moveToUse]); game.override.moveset([moveToUse]);
game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]); game.override.enemyMoveset([Moves.TACKLE, Moves.TACKLE, Moves.TACKLE, Moves.TACKLE]);

View File

@ -24,7 +24,7 @@ describe("Abilities - Screen Cleaner", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.ability(Abilities.SCREEN_CLEANER); game.override.ability(Abilities.SCREEN_CLEANER);
game.override.enemySpecies(Species.SHUCKLE); game.override.enemySpecies(Species.SHUCKLE);
}); });

View File

@ -22,7 +22,7 @@ describe("Abilities - Seed Sower", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.disableCrits(); game.override.disableCrits();
game.override.enemySpecies(Species.MAGIKARP); game.override.enemySpecies(Species.MAGIKARP);

View File

@ -26,7 +26,7 @@ describe("Abilities - Serene Grace", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.disableCrits() .disableCrits()
.battleType("single") .battleStyle("single")
.ability(Abilities.SERENE_GRACE) .ability(Abilities.SERENE_GRACE)
.moveset([Moves.AIR_SLASH]) .moveset([Moves.AIR_SLASH])
.enemySpecies(Species.ALOLA_GEODUDE) .enemySpecies(Species.ALOLA_GEODUDE)

View File

@ -26,7 +26,7 @@ describe("Abilities - Sheer Force", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.ability(Abilities.SHEER_FORCE) .ability(Abilities.SHEER_FORCE)
.enemySpecies(Species.ONIX) .enemySpecies(Species.ONIX)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)

View File

@ -31,7 +31,7 @@ describe("Abilities - Shield Dust", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override.battleType("single"); game.override.battleStyle("single");
game.override.enemySpecies(Species.ONIX); game.override.enemySpecies(Species.ONIX);
game.override.enemyAbility(Abilities.SHIELD_DUST); game.override.enemyAbility(Abilities.SHIELD_DUST);
game.override.startingLevel(100); game.override.startingLevel(100);

View File

@ -26,7 +26,7 @@ describe("Abilities - SHIELDS DOWN", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
const moveToUse = Moves.SPLASH; const moveToUse = Moves.SPLASH;
game.override.battleType("single"); game.override.battleStyle("single");
game.override.ability(Abilities.SHIELDS_DOWN); game.override.ability(Abilities.SHIELDS_DOWN);
game.override.moveset([moveToUse]); game.override.moveset([moveToUse]);
game.override.enemyMoveset([Moves.TACKLE]); game.override.enemyMoveset([Moves.TACKLE]);

View File

@ -23,7 +23,7 @@ describe("Abilities - Simple", () => {
beforeEach(() => { beforeEach(() => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.BULBASAUR) .enemySpecies(Species.BULBASAUR)
.enemyAbility(Abilities.SIMPLE) .enemyAbility(Abilities.SIMPLE)
.ability(Abilities.INTIMIDATE) .ability(Abilities.INTIMIDATE)

View File

@ -27,7 +27,7 @@ describe("Abilities - Speed Boost", () => {
game = new GameManager(phaserGame); game = new GameManager(phaserGame);
game.override game.override
.battleType("single") .battleStyle("single")
.enemySpecies(Species.SHUCKLE) .enemySpecies(Species.SHUCKLE)
.enemyAbility(Abilities.BALL_FETCH) .enemyAbility(Abilities.BALL_FETCH)
.enemyLevel(100) .enemyLevel(100)

Some files were not shown because too many files have changed in this diff Show More