mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-09-23 15:03:24 +02:00
Rename ArenaTagSide to ArenaSide
This commit is contained in:
parent
87e6095a00
commit
7dfaff9984
@ -20,7 +20,7 @@ import { getNonVolatileStatusEffects, getStatusEffectDescriptor, getStatusEffect
|
|||||||
import { TerrainType } from "#data/terrain";
|
import { TerrainType } from "#data/terrain";
|
||||||
import type { Weather } from "#data/weather";
|
import type { Weather } from "#data/weather";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleType } from "#enums/battle-type";
|
import { BattleType } from "#enums/battle-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
@ -1133,7 +1133,7 @@ export class PostDefendApplyArenaTrapTagAbAttr extends PostDefendAbAttr {
|
|||||||
0,
|
0,
|
||||||
undefined,
|
undefined,
|
||||||
pokemon.id,
|
pokemon.id,
|
||||||
pokemon.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER,
|
pokemon.isPlayer() ? ArenaSide.ENEMY : ArenaSide.PLAYER,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2636,11 +2636,11 @@ export class PostSummonRemoveArenaTagAbAttr extends PostSummonAbAttr {
|
|||||||
export class PostSummonAddArenaTagAbAttr extends PostSummonAbAttr {
|
export class PostSummonAddArenaTagAbAttr extends PostSummonAbAttr {
|
||||||
private readonly tagType: ArenaTagType;
|
private readonly tagType: ArenaTagType;
|
||||||
private readonly turnCount: number;
|
private readonly turnCount: number;
|
||||||
private readonly side?: ArenaTagSide;
|
private readonly side?: ArenaSide;
|
||||||
private readonly quiet?: boolean;
|
private readonly quiet?: boolean;
|
||||||
private sourceId: number;
|
private sourceId: number;
|
||||||
|
|
||||||
constructor(showAbility: boolean, tagType: ArenaTagType, turnCount: number, side?: ArenaTagSide, quiet?: boolean) {
|
constructor(showAbility: boolean, tagType: ArenaTagType, turnCount: number, side?: ArenaSide, quiet?: boolean) {
|
||||||
super(showAbility);
|
super(showAbility);
|
||||||
this.tagType = tagType;
|
this.tagType = tagType;
|
||||||
this.turnCount = turnCount;
|
this.turnCount = turnCount;
|
||||||
@ -5871,7 +5871,7 @@ export class PostSummonStatStageChangeOnArenaAbAttr extends PostSummonStatStageC
|
|||||||
}
|
}
|
||||||
|
|
||||||
override canApply(params: AbAttrBaseParams): boolean {
|
override canApply(params: AbAttrBaseParams): boolean {
|
||||||
const side = params.pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = params.pokemon.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
return (globalScene.arena.getTagOnSide(this.arenaTagType, side) ?? false) && super.canApply(params);
|
return (globalScene.arena.getTagOnSide(this.arenaTagType, side) ?? false) && super.canApply(params);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ import { getPokemonNameWithAffix } from "#app/messages";
|
|||||||
import { CommonBattleAnim } from "#data/battle-anims";
|
import { CommonBattleAnim } from "#data/battle-anims";
|
||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import type { BattlerIndex } from "#enums/battler-index";
|
import type { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -100,10 +100,10 @@ interface BaseArenaTag {
|
|||||||
// Note: Intentionally not using `?`, as the property should always exist, but just be undefined if not present.
|
// Note: Intentionally not using `?`, as the property should always exist, but just be undefined if not present.
|
||||||
sourceId: number | undefined;
|
sourceId: number | undefined;
|
||||||
/**
|
/**
|
||||||
* The {@linkcode ArenaTagSide | side of the field} that this arena tag affects.
|
* The {@linkcode ArenaSide | side of the field} that this arena tag affects.
|
||||||
* @defaultValue `ArenaTagSide.BOTH`
|
* @defaultValue `ArenaTagSide.BOTH`
|
||||||
*/
|
*/
|
||||||
side: ArenaTagSide;
|
side: ArenaSide;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -118,9 +118,9 @@ export abstract class ArenaTag implements BaseArenaTag {
|
|||||||
public maxDuration: number;
|
public maxDuration: number;
|
||||||
public sourceMove?: MoveId;
|
public sourceMove?: MoveId;
|
||||||
public sourceId: number | undefined;
|
public sourceId: number | undefined;
|
||||||
public side: ArenaTagSide;
|
public side: ArenaSide;
|
||||||
|
|
||||||
constructor(turnCount: number, sourceMove?: MoveId, sourceId?: number, side: ArenaTagSide = ArenaTagSide.BOTH) {
|
constructor(turnCount: number, sourceMove?: MoveId, sourceId?: number, side: ArenaSide = ArenaSide.BOTH) {
|
||||||
this.turnCount = turnCount;
|
this.turnCount = turnCount;
|
||||||
this.maxDuration = turnCount;
|
this.maxDuration = turnCount;
|
||||||
this.sourceMove = sourceMove;
|
this.sourceMove = sourceMove;
|
||||||
@ -138,7 +138,7 @@ export abstract class ArenaTag implements BaseArenaTag {
|
|||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:arenaOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:arenaOnRemove${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
{ moveName: this.getMoveName() },
|
{ moveName: this.getMoveName() },
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -191,11 +191,11 @@ export abstract class ArenaTag implements BaseArenaTag {
|
|||||||
*/
|
*/
|
||||||
public getAffectedPokemon(): Pokemon[] {
|
public getAffectedPokemon(): Pokemon[] {
|
||||||
switch (this.side) {
|
switch (this.side) {
|
||||||
case ArenaTagSide.PLAYER:
|
case ArenaSide.PLAYER:
|
||||||
return globalScene.getPlayerField() ?? [];
|
return globalScene.getPlayerField() ?? [];
|
||||||
case ArenaTagSide.ENEMY:
|
case ArenaSide.ENEMY:
|
||||||
return globalScene.getEnemyField() ?? [];
|
return globalScene.getEnemyField() ?? [];
|
||||||
case ArenaTagSide.BOTH:
|
case ArenaSide.BOTH:
|
||||||
default:
|
default:
|
||||||
return globalScene.getField(true) ?? [];
|
return globalScene.getField(true) ?? [];
|
||||||
}
|
}
|
||||||
@ -215,7 +215,7 @@ export abstract class SerializableArenaTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
export class MistTag extends SerializableArenaTag {
|
export class MistTag extends SerializableArenaTag {
|
||||||
readonly tagType = ArenaTagType.MIST;
|
readonly tagType = ArenaTagType.MIST;
|
||||||
constructor(turnCount: number, sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(turnCount, MoveId.MIST, sourceId, side);
|
super(turnCount, MoveId.MIST, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -320,7 +320,7 @@ class ReflectTag extends WeakenMoveScreenTag {
|
|||||||
return [MoveCategory.PHYSICAL];
|
return [MoveCategory.PHYSICAL];
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(turnCount: number, sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(turnCount, MoveId.REFLECT, sourceId, side);
|
super(turnCount, MoveId.REFLECT, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,7 +328,7 @@ class ReflectTag extends WeakenMoveScreenTag {
|
|||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:reflectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:reflectOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -344,7 +344,7 @@ class LightScreenTag extends WeakenMoveScreenTag {
|
|||||||
protected get weakenedCategories(): [MoveCategory.SPECIAL] {
|
protected get weakenedCategories(): [MoveCategory.SPECIAL] {
|
||||||
return [MoveCategory.SPECIAL];
|
return [MoveCategory.SPECIAL];
|
||||||
}
|
}
|
||||||
constructor(turnCount: number, sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(turnCount, MoveId.LIGHT_SCREEN, sourceId, side);
|
super(turnCount, MoveId.LIGHT_SCREEN, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -352,7 +352,7 @@ class LightScreenTag extends WeakenMoveScreenTag {
|
|||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:lightScreenOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:lightScreenOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -369,7 +369,7 @@ class AuroraVeilTag extends WeakenMoveScreenTag {
|
|||||||
return [MoveCategory.PHYSICAL, MoveCategory.SPECIAL];
|
return [MoveCategory.PHYSICAL, MoveCategory.SPECIAL];
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(turnCount: number, sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(turnCount, MoveId.AURORA_VEIL, sourceId, side);
|
super(turnCount, MoveId.AURORA_VEIL, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -377,7 +377,7 @@ class AuroraVeilTag extends WeakenMoveScreenTag {
|
|||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:auroraVeilOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:auroraVeilOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -402,7 +402,7 @@ export abstract class ConditionalProtectTag extends ArenaTag {
|
|||||||
constructor(
|
constructor(
|
||||||
sourceMove: MoveId,
|
sourceMove: MoveId,
|
||||||
sourceId: number | undefined,
|
sourceId: number | undefined,
|
||||||
side: ArenaTagSide,
|
side: ArenaSide,
|
||||||
condition: ProtectConditionFunc,
|
condition: ProtectConditionFunc,
|
||||||
ignoresBypass = false,
|
ignoresBypass = false,
|
||||||
) {
|
) {
|
||||||
@ -415,7 +415,7 @@ export abstract class ConditionalProtectTag extends ArenaTag {
|
|||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:conditionalProtectOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:conditionalProtectOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
{ moveName: super.getMoveName() },
|
{ moveName: super.getMoveName() },
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
@ -445,7 +445,7 @@ export abstract class ConditionalProtectTag extends ArenaTag {
|
|||||||
moveId: MoveId,
|
moveId: MoveId,
|
||||||
ignoresProtectBypass: BooleanHolder,
|
ignoresProtectBypass: BooleanHolder,
|
||||||
): boolean {
|
): boolean {
|
||||||
if ((this.side === ArenaTagSide.PLAYER) === defender.isPlayer() && this.protectConditionFunc(arena, moveId)) {
|
if ((this.side === ArenaSide.PLAYER) === defender.isPlayer() && this.protectConditionFunc(arena, moveId)) {
|
||||||
if (!isProtected.value) {
|
if (!isProtected.value) {
|
||||||
isProtected.value = true;
|
isProtected.value = true;
|
||||||
if (!simulated) {
|
if (!simulated) {
|
||||||
@ -493,7 +493,7 @@ const QuickGuardConditionFunc: ProtectConditionFunc = (_arena, moveId) => {
|
|||||||
*/
|
*/
|
||||||
class QuickGuardTag extends ConditionalProtectTag {
|
class QuickGuardTag extends ConditionalProtectTag {
|
||||||
public readonly tagType = ArenaTagType.QUICK_GUARD;
|
public readonly tagType = ArenaTagType.QUICK_GUARD;
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.QUICK_GUARD, sourceId, side, QuickGuardConditionFunc);
|
super(MoveId.QUICK_GUARD, sourceId, side, QuickGuardConditionFunc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -525,7 +525,7 @@ const WideGuardConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean =
|
|||||||
*/
|
*/
|
||||||
class WideGuardTag extends ConditionalProtectTag {
|
class WideGuardTag extends ConditionalProtectTag {
|
||||||
public readonly tagType = ArenaTagType.WIDE_GUARD;
|
public readonly tagType = ArenaTagType.WIDE_GUARD;
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.WIDE_GUARD, sourceId, side, WideGuardConditionFunc);
|
super(MoveId.WIDE_GUARD, sourceId, side, WideGuardConditionFunc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -548,7 +548,7 @@ const MatBlockConditionFunc: ProtectConditionFunc = (_arena, moveId): boolean =>
|
|||||||
*/
|
*/
|
||||||
class MatBlockTag extends ConditionalProtectTag {
|
class MatBlockTag extends ConditionalProtectTag {
|
||||||
public readonly tagType = ArenaTagType.MAT_BLOCK;
|
public readonly tagType = ArenaTagType.MAT_BLOCK;
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.MAT_BLOCK, sourceId, side, MatBlockConditionFunc);
|
super(MoveId.MAT_BLOCK, sourceId, side, MatBlockConditionFunc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -593,7 +593,7 @@ const CraftyShieldConditionFunc: ProtectConditionFunc = (_arena, moveId) => {
|
|||||||
*/
|
*/
|
||||||
class CraftyShieldTag extends ConditionalProtectTag {
|
class CraftyShieldTag extends ConditionalProtectTag {
|
||||||
public readonly tagType = ArenaTagType.CRAFTY_SHIELD;
|
public readonly tagType = ArenaTagType.CRAFTY_SHIELD;
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true);
|
super(MoveId.CRAFTY_SHIELD, sourceId, side, CraftyShieldConditionFunc, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -608,7 +608,7 @@ export class NoCritTag extends SerializableArenaTag {
|
|||||||
/** Queues a message upon adding this effect to the field */
|
/** Queues a message upon adding this effect to the field */
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(`arenaTag:noCritOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : "Enemy"}`, {
|
i18next.t(`arenaTag:noCritOnAdd${this.side === ArenaSide.PLAYER ? "Player" : "Enemy"}`, {
|
||||||
moveName: this.getMoveName(),
|
moveName: this.getMoveName(),
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
@ -752,7 +752,7 @@ export abstract class EntryHazardTag extends SerializableArenaTag {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(sourceMove: MoveId, sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceMove: MoveId, sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(0, sourceMove, sourceId, side);
|
super(0, sourceMove, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -811,7 +811,7 @@ export abstract class EntryHazardTag extends SerializableArenaTag {
|
|||||||
* @returns `true` if this hazard affects the given Pokemon; `false` otherwise.
|
* @returns `true` if this hazard affects the given Pokemon; `false` otherwise.
|
||||||
*/
|
*/
|
||||||
override apply(_arena: Arena, simulated: boolean, pokemon: Pokemon): boolean {
|
override apply(_arena: Arena, simulated: boolean, pokemon: Pokemon): boolean {
|
||||||
if ((this.side === ArenaTagSide.PLAYER) !== pokemon.isPlayer()) {
|
if ((this.side === ArenaSide.PLAYER) !== pokemon.isPlayer()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -896,7 +896,7 @@ class SpikesTag extends DamagingTrapTag {
|
|||||||
return 3 as const;
|
return 3 as const;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.SPIKES, sourceId, side);
|
super(MoveId.SPIKES, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -933,7 +933,7 @@ class StealthRockTag extends DamagingTrapTag {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.STEALTH_ROCK, sourceId, side);
|
super(MoveId.STEALTH_ROCK, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -977,7 +977,7 @@ class ToxicSpikesTag extends EntryHazardTag {
|
|||||||
return 2 as const;
|
return 2 as const;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.TOXIC_SPIKES, sourceId, side);
|
super(MoveId.TOXIC_SPIKES, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1040,7 +1040,7 @@ class StickyWebTag extends EntryHazardTag {
|
|||||||
return 1 as const;
|
return 1 as const;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.STICKY_WEB, sourceId, side);
|
super(MoveId.STICKY_WEB, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1103,7 +1103,7 @@ class ImprisonTag extends EntryHazardTag {
|
|||||||
return 1 as const;
|
return 1 as const;
|
||||||
}
|
}
|
||||||
|
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(MoveId.IMPRISON, sourceId, side);
|
super(MoveId.IMPRISON, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1259,7 +1259,7 @@ export class GravityTag extends SerializableArenaTag {
|
|||||||
*/
|
*/
|
||||||
class TailwindTag extends SerializableArenaTag {
|
class TailwindTag extends SerializableArenaTag {
|
||||||
public readonly tagType = ArenaTagType.TAILWIND;
|
public readonly tagType = ArenaTagType.TAILWIND;
|
||||||
constructor(turnCount: number, sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(turnCount, MoveId.TAILWIND, sourceId, side);
|
super(turnCount, MoveId.TAILWIND, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1274,7 +1274,7 @@ class TailwindTag extends SerializableArenaTag {
|
|||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:tailwindOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:tailwindOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1315,7 +1315,7 @@ class TailwindTag extends SerializableArenaTag {
|
|||||||
if (!quiet) {
|
if (!quiet) {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:tailwindOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:tailwindOnRemove${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1328,7 +1328,7 @@ class TailwindTag extends SerializableArenaTag {
|
|||||||
*/
|
*/
|
||||||
class HappyHourTag extends SerializableArenaTag {
|
class HappyHourTag extends SerializableArenaTag {
|
||||||
public readonly tagType = ArenaTagType.HAPPY_HOUR;
|
public readonly tagType = ArenaTagType.HAPPY_HOUR;
|
||||||
constructor(turnCount: number, sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(turnCount, MoveId.HAPPY_HOUR, sourceId, side);
|
super(turnCount, MoveId.HAPPY_HOUR, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1343,14 +1343,14 @@ class HappyHourTag extends SerializableArenaTag {
|
|||||||
|
|
||||||
class SafeguardTag extends ArenaTag {
|
class SafeguardTag extends ArenaTag {
|
||||||
public readonly tagType = ArenaTagType.SAFEGUARD;
|
public readonly tagType = ArenaTagType.SAFEGUARD;
|
||||||
constructor(turnCount: number, sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(turnCount: number, sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(turnCount, MoveId.SAFEGUARD, sourceId, side);
|
super(turnCount, MoveId.SAFEGUARD, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
onAdd(_arena: Arena): void {
|
onAdd(_arena: Arena): void {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:safeguardOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:safeguardOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1358,7 +1358,7 @@ class SafeguardTag extends ArenaTag {
|
|||||||
onRemove(_arena: Arena): void {
|
onRemove(_arena: Arena): void {
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:safeguardOnRemove${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:safeguardOnRemove${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1380,7 +1380,7 @@ class NoneTag extends ArenaTag {
|
|||||||
*/
|
*/
|
||||||
class FireGrassPledgeTag extends SerializableArenaTag {
|
class FireGrassPledgeTag extends SerializableArenaTag {
|
||||||
public readonly tagType = ArenaTagType.FIRE_GRASS_PLEDGE;
|
public readonly tagType = ArenaTagType.FIRE_GRASS_PLEDGE;
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(4, MoveId.FIRE_PLEDGE, sourceId, side);
|
super(4, MoveId.FIRE_PLEDGE, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1388,14 +1388,14 @@ class FireGrassPledgeTag extends SerializableArenaTag {
|
|||||||
// "A sea of fire enveloped your/the opposing team!"
|
// "A sea of fire enveloped your/the opposing team!"
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:fireGrassPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:fireGrassPledgeOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
override lapse(arena: Arena): boolean {
|
override lapse(arena: Arena): boolean {
|
||||||
const field: Pokemon[] =
|
const field: Pokemon[] =
|
||||||
this.side === ArenaTagSide.PLAYER ? globalScene.getPlayerField() : globalScene.getEnemyField();
|
this.side === ArenaSide.PLAYER ? globalScene.getPlayerField() : globalScene.getEnemyField();
|
||||||
|
|
||||||
field
|
field
|
||||||
.filter(pokemon => !pokemon.isOfType(PokemonType.FIRE) && !pokemon.switchOutStatus)
|
.filter(pokemon => !pokemon.isOfType(PokemonType.FIRE) && !pokemon.switchOutStatus)
|
||||||
@ -1429,7 +1429,7 @@ class FireGrassPledgeTag extends SerializableArenaTag {
|
|||||||
*/
|
*/
|
||||||
class WaterFirePledgeTag extends SerializableArenaTag {
|
class WaterFirePledgeTag extends SerializableArenaTag {
|
||||||
public readonly tagType = ArenaTagType.WATER_FIRE_PLEDGE;
|
public readonly tagType = ArenaTagType.WATER_FIRE_PLEDGE;
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(4, MoveId.WATER_PLEDGE, sourceId, side);
|
super(4, MoveId.WATER_PLEDGE, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1437,7 +1437,7 @@ class WaterFirePledgeTag extends SerializableArenaTag {
|
|||||||
// "A rainbow appeared in the sky on your/the opposing team's side!"
|
// "A rainbow appeared in the sky on your/the opposing team's side!"
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:waterFirePledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:waterFirePledgeOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1464,7 +1464,7 @@ class WaterFirePledgeTag extends SerializableArenaTag {
|
|||||||
*/
|
*/
|
||||||
class GrassWaterPledgeTag extends SerializableArenaTag {
|
class GrassWaterPledgeTag extends SerializableArenaTag {
|
||||||
public readonly tagType = ArenaTagType.GRASS_WATER_PLEDGE;
|
public readonly tagType = ArenaTagType.GRASS_WATER_PLEDGE;
|
||||||
constructor(sourceId: number | undefined, side: ArenaTagSide) {
|
constructor(sourceId: number | undefined, side: ArenaSide) {
|
||||||
super(4, MoveId.GRASS_PLEDGE, sourceId, side);
|
super(4, MoveId.GRASS_PLEDGE, sourceId, side);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1472,7 +1472,7 @@ class GrassWaterPledgeTag extends SerializableArenaTag {
|
|||||||
// "A swamp enveloped your/the opposing team!"
|
// "A swamp enveloped your/the opposing team!"
|
||||||
globalScene.phaseManager.queueMessage(
|
globalScene.phaseManager.queueMessage(
|
||||||
i18next.t(
|
i18next.t(
|
||||||
`arenaTag:grassWaterPledgeOnAdd${this.side === ArenaTagSide.PLAYER ? "Player" : this.side === ArenaTagSide.ENEMY ? "Enemy" : ""}`,
|
`arenaTag:grassWaterPledgeOnAdd${this.side === ArenaSide.PLAYER ? "Player" : this.side === ArenaSide.ENEMY ? "Enemy" : ""}`,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1743,7 +1743,7 @@ export function getArenaTag(
|
|||||||
turnCount: number,
|
turnCount: number,
|
||||||
sourceMove: MoveId | undefined,
|
sourceMove: MoveId | undefined,
|
||||||
sourceId: number | undefined,
|
sourceId: number | undefined,
|
||||||
side: ArenaTagSide = ArenaTagSide.BOTH,
|
side: ArenaSide = ArenaSide.BOTH,
|
||||||
): ArenaTag | null {
|
): ArenaTag | null {
|
||||||
switch (tagType) {
|
switch (tagType) {
|
||||||
case ArenaTagType.MIST:
|
case ArenaTagType.MIST:
|
||||||
|
@ -34,7 +34,7 @@ import {
|
|||||||
import { TerrainType } from "#data/terrain";
|
import { TerrainType } from "#data/terrain";
|
||||||
import { getTypeDamageMultiplier } from "#data/type";
|
import { getTypeDamageMultiplier } from "#data/type";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleType } from "#enums/battle-type";
|
import { BattleType } from "#enums/battle-type";
|
||||||
import type { BattlerIndex } from "#enums/battler-index";
|
import type { BattlerIndex } from "#enums/battler-index";
|
||||||
@ -1342,7 +1342,7 @@ export class MoveEffectAttr extends MoveAttr {
|
|||||||
applyAbAttrs("MoveEffectChanceMultiplierAbAttr", {pokemon: user, simulated: !showAbility, chance: moveChance, move});
|
applyAbAttrs("MoveEffectChanceMultiplierAbAttr", {pokemon: user, simulated: !showAbility, chance: moveChance, move});
|
||||||
|
|
||||||
if ((!move.hasAttr("FlinchAttr") || moveChance.value <= move.chance) && !move.hasAttr("SecretPowerAttr")) {
|
if ((!move.hasAttr("FlinchAttr") || moveChance.value <= move.chance) && !move.hasAttr("SecretPowerAttr")) {
|
||||||
const userSide = user.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const userSide = user.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
globalScene.arena.applyTagsForSide(ArenaTagType.WATER_FIRE_PLEDGE, userSide, false, moveChance);
|
globalScene.arena.applyTagsForSide(ArenaTagType.WATER_FIRE_PLEDGE, userSide, false, moveChance);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6009,7 +6009,7 @@ export class AddArenaTagAttr extends MoveEffectAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((move.chance < 0 || move.chance === 100 || user.randBattleSeedInt(100) < move.chance) && user.getLastXMoves(1)[0]?.result === MoveResult.SUCCESS) {
|
if ((move.chance < 0 || move.chance === 100 || user.randBattleSeedInt(100) < move.chance) && user.getLastXMoves(1)[0]?.result === MoveResult.SUCCESS) {
|
||||||
const side = ((this.selfSideTarget ? user : target).isPlayer() !== (move.hasAttr("AddArenaTrapTagAttr") && target === user)) ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = ((this.selfSideTarget ? user : target).isPlayer() !== (move.hasAttr("AddArenaTrapTagAttr") && target === user)) ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
globalScene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, side);
|
globalScene.arena.addTag(this.tagType, this.turnCount, move.id, user.id, side);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -6019,7 +6019,7 @@ export class AddArenaTagAttr extends MoveEffectAttr {
|
|||||||
|
|
||||||
getCondition(): MoveConditionFunc | null {
|
getCondition(): MoveConditionFunc | null {
|
||||||
return this.failOnOverlap
|
return this.failOnOverlap
|
||||||
? (user, target, move) => !globalScene.arena.getTagOnSide(this.tagType, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY)
|
? (user, target, move) => !globalScene.arena.getTagOnSide(this.tagType, target.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY)
|
||||||
: null;
|
: null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6045,7 +6045,7 @@ export class RemoveArenaTagsAttr extends MoveEffectAttr {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
|
|
||||||
for (const tagType of this.tagTypes) {
|
for (const tagType of this.tagTypes) {
|
||||||
globalScene.arena.removeTagOnSide(tagType, side);
|
globalScene.arena.removeTagOnSide(tagType, side);
|
||||||
@ -6058,7 +6058,7 @@ export class RemoveArenaTagsAttr extends MoveEffectAttr {
|
|||||||
export class AddArenaTrapTagAttr extends AddArenaTagAttr {
|
export class AddArenaTrapTagAttr extends AddArenaTagAttr {
|
||||||
getCondition(): MoveConditionFunc {
|
getCondition(): MoveConditionFunc {
|
||||||
return (user, target, move) => {
|
return (user, target, move) => {
|
||||||
const side = (this.selfSideTarget !== user.isPlayer()) ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER;
|
const side = (this.selfSideTarget !== user.isPlayer()) ? ArenaSide.ENEMY : ArenaSide.PLAYER;
|
||||||
const tag = globalScene.arena.getTagOnSide(this.tagType, side) as EntryHazardTag;
|
const tag = globalScene.arena.getTagOnSide(this.tagType, side) as EntryHazardTag;
|
||||||
if (!tag) {
|
if (!tag) {
|
||||||
return true;
|
return true;
|
||||||
@ -6080,7 +6080,7 @@ export class AddArenaTrapTagHitAttr extends AddArenaTagAttr {
|
|||||||
*/
|
*/
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true);
|
const moveChance = this.getMoveChance(user, target, move, this.selfTarget, true);
|
||||||
const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = (this.selfSideTarget ? user : target).isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
const tag = globalScene.arena.getTagOnSide(this.tagType, side) as EntryHazardTag;
|
const tag = globalScene.arena.getTagOnSide(this.tagType, side) as EntryHazardTag;
|
||||||
if ((moveChance < 0 || moveChance === 100 || user.randBattleSeedInt(100) < moveChance) && user.getLastXMoves(1)[0]?.result === MoveResult.SUCCESS) {
|
if ((moveChance < 0 || moveChance === 100 || user.randBattleSeedInt(100) < moveChance) && user.getLastXMoves(1)[0]?.result === MoveResult.SUCCESS) {
|
||||||
globalScene.arena.addTag(this.tagType, 0, move.id, user.id, side);
|
globalScene.arena.addTag(this.tagType, 0, move.id, user.id, side);
|
||||||
@ -6109,20 +6109,20 @@ export class RemoveArenaTrapAttr extends MoveEffectAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.targetBothSides) {
|
if (this.targetBothSides) {
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaSide.PLAYER);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaSide.PLAYER);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaSide.PLAYER);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaSide.PLAYER);
|
||||||
|
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaSide.ENEMY);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaSide.ENEMY);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaSide.ENEMY);
|
||||||
} else {
|
} else {
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.SPIKES, target.isPlayer() ? ArenaSide.ENEMY : ArenaSide.PLAYER);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.TOXIC_SPIKES, target.isPlayer() ? ArenaSide.ENEMY : ArenaSide.PLAYER);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.STEALTH_ROCK, target.isPlayer() ? ArenaSide.ENEMY : ArenaSide.PLAYER);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, target.isPlayer() ? ArenaTagSide.ENEMY : ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, target.isPlayer() ? ArenaSide.ENEMY : ArenaSide.PLAYER);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -6145,17 +6145,17 @@ export class RemoveScreensAttr extends MoveEffectAttr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.targetBothSides) {
|
if (this.targetBothSides) {
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaSide.PLAYER);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaSide.PLAYER);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.PLAYER);
|
globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaSide.PLAYER);
|
||||||
|
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, ArenaSide.ENEMY);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaSide.ENEMY);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, ArenaSide.ENEMY);
|
||||||
} else {
|
} else {
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.REFLECT, target.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.LIGHT_SCREEN, target.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY);
|
||||||
globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY);
|
globalScene.arena.removeTagOnSide(ArenaTagType.AURORA_VEIL, target.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -6178,20 +6178,20 @@ export class SwapArenaTagsAttr extends MoveEffectAttr {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tagPlayerTemp = globalScene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaTagSide.PLAYER);
|
const tagPlayerTemp = globalScene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaSide.PLAYER);
|
||||||
const tagEnemyTemp = globalScene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaTagSide.ENEMY);
|
const tagEnemyTemp = globalScene.arena.findTagsOnSide((t => this.SwapTags.includes(t.tagType)), ArenaSide.ENEMY);
|
||||||
|
|
||||||
|
|
||||||
if (tagPlayerTemp) {
|
if (tagPlayerTemp) {
|
||||||
for (const swapTagsType of tagPlayerTemp) {
|
for (const swapTagsType of tagPlayerTemp) {
|
||||||
globalScene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.PLAYER, true);
|
globalScene.arena.removeTagOnSide(swapTagsType.tagType, ArenaSide.PLAYER, true);
|
||||||
globalScene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaTagSide.ENEMY, true); // TODO: is the bang correct?
|
globalScene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaSide.ENEMY, true); // TODO: is the bang correct?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (tagEnemyTemp) {
|
if (tagEnemyTemp) {
|
||||||
for (const swapTagsType of tagEnemyTemp) {
|
for (const swapTagsType of tagEnemyTemp) {
|
||||||
globalScene.arena.removeTagOnSide(swapTagsType.tagType, ArenaTagSide.ENEMY, true);
|
globalScene.arena.removeTagOnSide(swapTagsType.tagType, ArenaSide.ENEMY, true);
|
||||||
globalScene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaTagSide.PLAYER, true); // TODO: is the bang correct?
|
globalScene.arena.addTag(swapTagsType.tagType, swapTagsType.turnCount, swapTagsType.sourceMove, swapTagsType.sourceId!, ArenaSide.PLAYER, true); // TODO: is the bang correct?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
5
src/enums/arena-side.ts
Normal file
5
src/enums/arena-side.ts
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export enum ArenaSide {
|
||||||
|
BOTH,
|
||||||
|
PLAYER,
|
||||||
|
ENEMY,
|
||||||
|
}
|
@ -1,6 +0,0 @@
|
|||||||
// TODO: rename to something else (this isn't used only for arena tags)
|
|
||||||
export enum ArenaTagSide {
|
|
||||||
BOTH,
|
|
||||||
PLAYER,
|
|
||||||
ENEMY,
|
|
||||||
}
|
|
@ -1,5 +1,5 @@
|
|||||||
import type { TerrainType } from "#data/terrain";
|
import type { TerrainType } from "#data/terrain";
|
||||||
import type { ArenaTagSide } from "#enums/arena-tag-side";
|
import type { ArenaSide } from "#enums/arena-side";
|
||||||
import type { ArenaTagType } from "#enums/arena-tag-type";
|
import type { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import type { WeatherType } from "#enums/weather-type";
|
import type { WeatherType } from "#enums/weather-type";
|
||||||
|
|
||||||
@ -60,8 +60,8 @@ export class TerrainChangedEvent extends ArenaEvent {
|
|||||||
export class TagAddedEvent extends ArenaEvent {
|
export class TagAddedEvent extends ArenaEvent {
|
||||||
/** The {@linkcode ArenaTagType} being added */
|
/** The {@linkcode ArenaTagType} being added */
|
||||||
public arenaTagType: ArenaTagType;
|
public arenaTagType: ArenaTagType;
|
||||||
/** The {@linkcode ArenaTagSide} the tag is being placed on */
|
/** The {@linkcode ArenaSide} the tag is being placed on */
|
||||||
public arenaTagSide: ArenaTagSide;
|
public arenaTagSide: ArenaSide;
|
||||||
/** The current number of layers of the arena trap. */
|
/** The current number of layers of the arena trap. */
|
||||||
public arenaTagLayers: number;
|
public arenaTagLayers: number;
|
||||||
/** The maximum amount of layers of the arena trap. */
|
/** The maximum amount of layers of the arena trap. */
|
||||||
@ -69,7 +69,7 @@ export class TagAddedEvent extends ArenaEvent {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
arenaTagType: ArenaTagType,
|
arenaTagType: ArenaTagType,
|
||||||
arenaTagSide: ArenaTagSide,
|
arenaTagSide: ArenaSide,
|
||||||
duration: number,
|
duration: number,
|
||||||
maxDuration?: number,
|
maxDuration?: number,
|
||||||
arenaTagLayers?: number,
|
arenaTagLayers?: number,
|
||||||
@ -87,9 +87,9 @@ export class TagAddedEvent extends ArenaEvent {
|
|||||||
export class TagRemovedEvent extends ArenaEvent {
|
export class TagRemovedEvent extends ArenaEvent {
|
||||||
/** The {@linkcode ArenaTagType} being removed */
|
/** The {@linkcode ArenaTagType} being removed */
|
||||||
public arenaTagType: ArenaTagType;
|
public arenaTagType: ArenaTagType;
|
||||||
/** The {@linkcode ArenaTagSide} the tag was being placed on */
|
/** The {@linkcode ArenaSide} the tag was being placed on */
|
||||||
public arenaTagSide: ArenaTagSide;
|
public arenaTagSide: ArenaSide;
|
||||||
constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaTagSide, duration: number) {
|
constructor(arenaTagType: ArenaTagType, arenaTagSide: ArenaSide, duration: number) {
|
||||||
super(ArenaEventType.TAG_REMOVED, duration);
|
super(ArenaEventType.TAG_REMOVED, duration);
|
||||||
|
|
||||||
this.arenaTagType = arenaTagType;
|
this.arenaTagType = arenaTagType;
|
||||||
|
@ -20,7 +20,7 @@ import {
|
|||||||
Weather,
|
Weather,
|
||||||
} from "#data/weather";
|
} from "#data/weather";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import type { ArenaTagType } from "#enums/arena-tag-type";
|
import type { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import type { BattlerIndex } from "#enums/battler-index";
|
import type { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BiomeId } from "#enums/biome-id";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
@ -652,13 +652,13 @@ export class Arena {
|
|||||||
/**
|
/**
|
||||||
* Applies each `ArenaTag` in this Arena, based on which side (self, enemy, or both) is passed in as a parameter
|
* Applies each `ArenaTag` in this Arena, based on which side (self, enemy, or both) is passed in as a parameter
|
||||||
* @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply
|
* @param tagType Either an {@linkcode ArenaTagType} string, or an actual {@linkcode ArenaTag} class to filter which ones to apply
|
||||||
* @param side {@linkcode ArenaTagSide} which side's arena tags to apply
|
* @param side {@linkcode ArenaSide} which side's arena tags to apply
|
||||||
* @param simulated if `true`, this applies arena tags without changing game state
|
* @param simulated if `true`, this applies arena tags without changing game state
|
||||||
* @param args array of parameters that the called upon tags may need
|
* @param args array of parameters that the called upon tags may need
|
||||||
*/
|
*/
|
||||||
applyTagsForSide(
|
applyTagsForSide(
|
||||||
tagType: ArenaTagType | Constructor<ArenaTag> | AbstractConstructor<ArenaTag>,
|
tagType: ArenaTagType | Constructor<ArenaTag> | AbstractConstructor<ArenaTag>,
|
||||||
side: ArenaTagSide,
|
side: ArenaSide,
|
||||||
simulated: boolean,
|
simulated: boolean,
|
||||||
...args: unknown[]
|
...args: unknown[]
|
||||||
): void {
|
): void {
|
||||||
@ -666,7 +666,7 @@ export class Arena {
|
|||||||
typeof tagType === "string"
|
typeof tagType === "string"
|
||||||
? this.tags.filter(t => t.tagType === tagType)
|
? this.tags.filter(t => t.tagType === tagType)
|
||||||
: this.tags.filter(t => t instanceof tagType);
|
: this.tags.filter(t => t instanceof tagType);
|
||||||
if (side !== ArenaTagSide.BOTH) {
|
if (side !== ArenaSide.BOTH) {
|
||||||
tags = tags.filter(t => t.side === side);
|
tags = tags.filter(t => t.side === side);
|
||||||
}
|
}
|
||||||
tags.forEach(t => t.apply(this, simulated, ...args));
|
tags.forEach(t => t.apply(this, simulated, ...args));
|
||||||
@ -684,7 +684,7 @@ export class Arena {
|
|||||||
simulated: boolean,
|
simulated: boolean,
|
||||||
...args: unknown[]
|
...args: unknown[]
|
||||||
): void {
|
): void {
|
||||||
this.applyTagsForSide(tagType, ArenaTagSide.BOTH, simulated, ...args);
|
this.applyTagsForSide(tagType, ArenaSide.BOTH, simulated, ...args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -693,7 +693,7 @@ export class Arena {
|
|||||||
* @param turnCount - The number of turns the newly-added tag should last.
|
* @param turnCount - The number of turns the newly-added tag should last.
|
||||||
* @param sourceId - The {@linkcode Pokemon.id | PID} of the Pokemon creating the tag.
|
* @param sourceId - The {@linkcode Pokemon.id | PID} of the Pokemon creating the tag.
|
||||||
* @param sourceMove - The {@linkcode MoveId} of the move creating the tag, or `undefined` if not from a move.
|
* @param sourceMove - The {@linkcode MoveId} of the move creating the tag, or `undefined` if not from a move.
|
||||||
* @param side - The {@linkcode ArenaTagSide}(s) to which the tag should apply; default `ArenaTagSide.BOTH`.
|
* @param side - The {@linkcode ArenaSide}(s) to which the tag should apply; default `ArenaTagSide.BOTH`.
|
||||||
* @param quiet - Whether to suppress messages produced by tag addition; default `false`.
|
* @param quiet - Whether to suppress messages produced by tag addition; default `false`.
|
||||||
* @returns `true` if the tag was successfully added without overlapping.
|
* @returns `true` if the tag was successfully added without overlapping.
|
||||||
// TODO: Do we need the return value here? literally nothing uses it
|
// TODO: Do we need the return value here? literally nothing uses it
|
||||||
@ -703,7 +703,7 @@ export class Arena {
|
|||||||
turnCount: number,
|
turnCount: number,
|
||||||
sourceMove: MoveId | undefined,
|
sourceMove: MoveId | undefined,
|
||||||
sourceId: number,
|
sourceId: number,
|
||||||
side: ArenaTagSide = ArenaTagSide.BOTH,
|
side: ArenaSide = ArenaSide.BOTH,
|
||||||
quiet = false,
|
quiet = false,
|
||||||
): boolean {
|
): boolean {
|
||||||
const existingTag = this.getTagOnSide(tagType, side);
|
const existingTag = this.getTagOnSide(tagType, side);
|
||||||
@ -747,7 +747,7 @@ export class Arena {
|
|||||||
*/
|
*/
|
||||||
getTag<T extends ArenaTag>(tagType: Constructor<T> | AbstractConstructor<T>): T | undefined;
|
getTag<T extends ArenaTag>(tagType: Constructor<T> | AbstractConstructor<T>): T | undefined;
|
||||||
getTag(tagType: ArenaTagType | Constructor<ArenaTag> | AbstractConstructor<ArenaTag>): ArenaTag | undefined {
|
getTag(tagType: ArenaTagType | Constructor<ArenaTag> | AbstractConstructor<ArenaTag>): ArenaTag | undefined {
|
||||||
return this.getTagOnSide(tagType, ArenaTagSide.BOTH);
|
return this.getTagOnSide(tagType, ArenaSide.BOTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
hasTag(tagType: ArenaTagType): boolean {
|
hasTag(tagType: ArenaTagType): boolean {
|
||||||
@ -759,19 +759,19 @@ export class Arena {
|
|||||||
*
|
*
|
||||||
* eg: `MIST` only applies to the user's side, while `MUD_SPORT` applies to both user and enemy side
|
* eg: `MIST` only applies to the user's side, while `MUD_SPORT` applies to both user and enemy side
|
||||||
* @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get
|
* @param tagType The {@linkcode ArenaTagType} or {@linkcode ArenaTag} to get
|
||||||
* @param side The {@linkcode ArenaTagSide} to look at
|
* @param side The {@linkcode ArenaSide} to look at
|
||||||
* @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there
|
* @returns either the {@linkcode ArenaTag}, or `undefined` if it isn't there
|
||||||
*/
|
*/
|
||||||
getTagOnSide(
|
getTagOnSide(
|
||||||
tagType: ArenaTagType | Constructor<ArenaTag> | AbstractConstructor<ArenaTag>,
|
tagType: ArenaTagType | Constructor<ArenaTag> | AbstractConstructor<ArenaTag>,
|
||||||
side: ArenaTagSide,
|
side: ArenaSide,
|
||||||
): ArenaTag | undefined {
|
): ArenaTag | undefined {
|
||||||
return typeof tagType === "string"
|
return typeof tagType === "string"
|
||||||
? this.tags.find(
|
? this.tags.find(
|
||||||
t => t.tagType === tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side),
|
t => t.tagType === tagType && (side === ArenaSide.BOTH || t.side === ArenaSide.BOTH || t.side === side),
|
||||||
)
|
)
|
||||||
: this.tags.find(
|
: this.tags.find(
|
||||||
t => t instanceof tagType && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side),
|
t => t instanceof tagType && (side === ArenaSide.BOTH || t.side === ArenaSide.BOTH || t.side === side),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -784,18 +784,18 @@ export class Arena {
|
|||||||
* @returns array of {@linkcode ArenaTag}s from which the Arena's tags return true and apply to both sides
|
* @returns array of {@linkcode ArenaTag}s from which the Arena's tags return true and apply to both sides
|
||||||
*/
|
*/
|
||||||
findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] {
|
findTags(tagPredicate: (t: ArenaTag) => boolean): ArenaTag[] {
|
||||||
return this.findTagsOnSide(tagPredicate, ArenaTagSide.BOTH);
|
return this.findTagsOnSide(tagPredicate, ArenaSide.BOTH);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns specific tags from the arena that pass the `tagPredicate` function passed in as a parameter, and apply to the given side
|
* Returns specific tags from the arena that pass the `tagPredicate` function passed in as a parameter, and apply to the given side
|
||||||
* @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s
|
* @param tagPredicate a function mapping {@linkcode ArenaTag}s to `boolean`s
|
||||||
* @param side The {@linkcode ArenaTagSide} to look at
|
* @param side The {@linkcode ArenaSide} to look at
|
||||||
* @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side
|
* @returns array of {@linkcode ArenaTag}s from which the Arena's tags return `true` and apply to the given side
|
||||||
*/
|
*/
|
||||||
findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaTagSide): ArenaTag[] {
|
findTagsOnSide(tagPredicate: (t: ArenaTag) => boolean, side: ArenaSide): ArenaTag[] {
|
||||||
return this.tags.filter(
|
return this.tags.filter(
|
||||||
t => tagPredicate(t) && (side === ArenaTagSide.BOTH || t.side === ArenaTagSide.BOTH || t.side === side),
|
t => tagPredicate(t) && (side === ArenaSide.BOTH || t.side === ArenaSide.BOTH || t.side === side),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -822,7 +822,7 @@ export class Arena {
|
|||||||
return !!tag;
|
return !!tag;
|
||||||
}
|
}
|
||||||
|
|
||||||
removeTagOnSide(tagType: ArenaTagType, side: ArenaTagSide, quiet = false): boolean {
|
removeTagOnSide(tagType: ArenaTagType, side: ArenaSide, quiet = false): boolean {
|
||||||
const tag = this.getTagOnSide(tagType, side);
|
const tag = this.getTagOnSide(tagType, side);
|
||||||
if (tag) {
|
if (tag) {
|
||||||
tag.onRemove(this, quiet);
|
tag.onRemove(this, quiet);
|
||||||
|
@ -68,7 +68,7 @@ import type { TypeDamageMultiplier } from "#data/type";
|
|||||||
import { getTypeDamageMultiplier, getTypeRgb } from "#data/type";
|
import { getTypeDamageMultiplier, getTypeRgb } from "#data/type";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { AiType } from "#enums/ai-type";
|
import { AiType } from "#enums/ai-type";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
@ -1519,7 +1519,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Stat.SPD: {
|
case Stat.SPD: {
|
||||||
const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = this.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
if (globalScene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) {
|
if (globalScene.arena.getTagOnSide(ArenaTagType.TAILWIND, side)) {
|
||||||
ret *= 2;
|
ret *= 2;
|
||||||
}
|
}
|
||||||
@ -2358,7 +2358,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
applyAbAttrs("CheckTrappedAbAttr", { pokemon: opponent, trapped, opponent: this, simulated }, trappedAbMessages);
|
applyAbAttrs("CheckTrappedAbAttr", { pokemon: opponent, trapped, opponent: this, simulated }, trappedAbMessages);
|
||||||
}
|
}
|
||||||
|
|
||||||
const side = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = this.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
return (
|
return (
|
||||||
trapped.value || !!this.getTag(TrappedTag) || !!globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, side)
|
trapped.value || !!this.getTag(TrappedTag) || !!globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, side)
|
||||||
);
|
);
|
||||||
@ -3543,7 +3543,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
effectiveness,
|
effectiveness,
|
||||||
}: getAttackDamageParams): DamageCalculationResult {
|
}: getAttackDamageParams): DamageCalculationResult {
|
||||||
const damage = new NumberHolder(0);
|
const damage = new NumberHolder(0);
|
||||||
const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const defendingSide = this.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
|
|
||||||
const variableCategory = new NumberHolder(move.category);
|
const variableCategory = new NumberHolder(move.category);
|
||||||
applyMoveAttrs("VariableMoveCategoryAttr", source, this, move, variableCategory);
|
applyMoveAttrs("VariableMoveCategoryAttr", source, this, move, variableCategory);
|
||||||
@ -3849,7 +3849,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
applyAbAttrs("BlockCritAbAttr", { pokemon: this, blockCrit });
|
applyAbAttrs("BlockCritAbAttr", { pokemon: this, blockCrit });
|
||||||
const blockCritTag = globalScene.arena.getTagOnSide(
|
const blockCritTag = globalScene.arena.getTagOnSide(
|
||||||
NoCritTag,
|
NoCritTag,
|
||||||
this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY,
|
this.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY,
|
||||||
);
|
);
|
||||||
isCritical &&= !blockCritTag && !blockCrit.value; // need to roll a crit and not be blocked by either crit prevention effect
|
isCritical &&= !blockCritTag && !blockCrit.value; // need to roll a crit and not be blocked by either crit prevention effect
|
||||||
|
|
||||||
@ -5016,7 +5016,7 @@ export abstract class Pokemon extends Phaser.GameObjects.Container {
|
|||||||
* @returns Whether this Pokémon is protected by Safeguard
|
* @returns Whether this Pokémon is protected by Safeguard
|
||||||
*/
|
*/
|
||||||
public isSafeguarded(attacker: Pokemon): boolean {
|
public isSafeguarded(attacker: Pokemon): boolean {
|
||||||
const defendingSide = this.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const defendingSide = this.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
if (globalScene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) {
|
if (globalScene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, defendingSide)) {
|
||||||
const bypassed = new BooleanHolder(false);
|
const bypassed = new BooleanHolder(false);
|
||||||
if (attacker) {
|
if (attacker) {
|
||||||
|
@ -3,7 +3,7 @@ import { pokemonPrevolutions } from "#balance/pokemon-evolutions";
|
|||||||
import { signatureSpecies } from "#balance/signature-species";
|
import { signatureSpecies } from "#balance/signature-species";
|
||||||
import { EntryHazardTag } from "#data/arena-tag";
|
import { EntryHazardTag } from "#data/arena-tag";
|
||||||
import type { PokemonSpecies } from "#data/pokemon-species";
|
import type { PokemonSpecies } from "#data/pokemon-species";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { PartyMemberStrength } from "#enums/party-member-strength";
|
import { PartyMemberStrength } from "#enums/party-member-strength";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
import { TeraAIMode } from "#enums/tera-ai-mode";
|
import { TeraAIMode } from "#enums/tera-ai-mode";
|
||||||
@ -574,7 +574,7 @@ export class Trainer extends Phaser.GameObjects.Container {
|
|||||||
score /= playerField.length;
|
score /= playerField.length;
|
||||||
if (forSwitch && !p.isOnField()) {
|
if (forSwitch && !p.isOnField()) {
|
||||||
globalScene.arena
|
globalScene.arena
|
||||||
.findTagsOnSide(t => t instanceof EntryHazardTag, ArenaTagSide.ENEMY)
|
.findTagsOnSide(t => t instanceof EntryHazardTag, ArenaSide.ENEMY)
|
||||||
.map(t => (score *= (t as EntryHazardTag).getMatchupScoreMultiplier(p)));
|
.map(t => (score *= (t as EntryHazardTag).getMatchupScoreMultiplier(p)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import { getPokemonNameWithAffix } from "#app/messages";
|
|||||||
import { speciesStarterCosts } from "#balance/starters";
|
import { speciesStarterCosts } from "#balance/starters";
|
||||||
import { TrappedTag } from "#data/battler-tags";
|
import { TrappedTag } from "#data/battler-tags";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleType } from "#enums/battle-type";
|
import { BattleType } from "#enums/battle-type";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -526,7 +526,7 @@ export class CommandPhase extends FieldPhase {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const trapTag = playerPokemon.getTag(TrappedTag);
|
const trapTag = playerPokemon.getTag(TrappedTag);
|
||||||
const fairyLockTag = globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER);
|
const fairyLockTag = globalScene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.PLAYER);
|
||||||
|
|
||||||
if (!isSwitch) {
|
if (!isSwitch) {
|
||||||
globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex);
|
globalScene.ui.setMode(UiMode.COMMAND, this.fieldIndex);
|
||||||
|
@ -6,7 +6,7 @@ import { MoveAnim } from "#data/battle-anims";
|
|||||||
import { DamageProtectedTag, ProtectedTag, SemiInvulnerableTag, SubstituteTag, TypeBoostTag } from "#data/battler-tags";
|
import { DamageProtectedTag, ProtectedTag, SemiInvulnerableTag, SubstituteTag, TypeBoostTag } from "#data/battler-tags";
|
||||||
import { SpeciesFormChangePostMoveTrigger } from "#data/form-change-triggers";
|
import { SpeciesFormChangePostMoveTrigger } from "#data/form-change-triggers";
|
||||||
import type { TypeDamageMultiplier } from "#data/type";
|
import type { TypeDamageMultiplier } from "#data/type";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BattlerTagLapseType } from "#enums/battler-tag-lapse-type";
|
import { BattlerTagLapseType } from "#enums/battler-tag-lapse-type";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -438,8 +438,8 @@ export class MoveEffectPhase extends PokemonPhase {
|
|||||||
* @returns Whether the pokemon was protected
|
* @returns Whether the pokemon was protected
|
||||||
*/
|
*/
|
||||||
private protectedCheck(user: Pokemon, target: Pokemon): boolean {
|
private protectedCheck(user: Pokemon, target: Pokemon): boolean {
|
||||||
/** The {@linkcode ArenaTagSide} to which the target belongs */
|
/** The {@linkcode ArenaSide} to which the target belongs */
|
||||||
const targetSide = target.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const targetSide = target.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
/** Has the invoked move been cancelled by conditional protection (e.g Quick Guard)? */
|
/** Has the invoked move been cancelled by conditional protection (e.g Quick Guard)? */
|
||||||
const hasConditionalProtectApplied = new BooleanHolder(false);
|
const hasConditionalProtectApplied = new BooleanHolder(false);
|
||||||
/** Does the applied conditional protection bypass Protect-ignoring effects? */
|
/** Does the applied conditional protection bypass Protect-ignoring effects? */
|
||||||
|
@ -5,7 +5,7 @@ import { handleTutorial, Tutorial } from "#app/tutorial";
|
|||||||
import type { ArenaTag } from "#data/arena-tag";
|
import type { ArenaTag } from "#data/arena-tag";
|
||||||
import { MistTag } from "#data/arena-tag";
|
import { MistTag } from "#data/arena-tag";
|
||||||
import { OctolockTag } from "#data/battler-tags";
|
import { OctolockTag } from "#data/battler-tags";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import type { BattlerIndex } from "#enums/battler-index";
|
import type { BattlerIndex } from "#enums/battler-index";
|
||||||
import { type BattleStat, getStatKey, getStatStageChangeDescriptionKey, Stat } from "#enums/stat";
|
import { type BattleStat, getStatKey, getStatStageChangeDescriptionKey, Stat } from "#enums/stat";
|
||||||
@ -92,7 +92,7 @@ export class StatStageChangePhase extends PokemonPhase {
|
|||||||
/** If this SSCP is from sticky web, then check if pokemon that last sucessfully used sticky web is on field */
|
/** If this SSCP is from sticky web, then check if pokemon that last sucessfully used sticky web is on field */
|
||||||
const stickyTagID = globalScene.arena.findTagsOnSide(
|
const stickyTagID = globalScene.arena.findTagsOnSide(
|
||||||
(t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB,
|
(t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB,
|
||||||
ArenaTagSide.PLAYER,
|
ArenaSide.PLAYER,
|
||||||
)[0].sourceId;
|
)[0].sourceId;
|
||||||
globalScene.getEnemyField().forEach(e => {
|
globalScene.getEnemyField().forEach(e => {
|
||||||
if (e.id === stickyTagID) {
|
if (e.id === stickyTagID) {
|
||||||
@ -105,7 +105,7 @@ export class StatStageChangePhase extends PokemonPhase {
|
|||||||
} else {
|
} else {
|
||||||
const stickyTagID = globalScene.arena.findTagsOnSide(
|
const stickyTagID = globalScene.arena.findTagsOnSide(
|
||||||
(t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB,
|
(t: ArenaTag) => t.tagType === ArenaTagType.STICKY_WEB,
|
||||||
ArenaTagSide.ENEMY,
|
ArenaSide.ENEMY,
|
||||||
)[0].sourceId;
|
)[0].sourceId;
|
||||||
globalScene.getPlayerField().forEach(e => {
|
globalScene.getPlayerField().forEach(e => {
|
||||||
if (e.id === stickyTagID) {
|
if (e.id === stickyTagID) {
|
||||||
@ -133,7 +133,7 @@ export class StatStageChangePhase extends PokemonPhase {
|
|||||||
// TODO: add a reference to the source of the stat change to fix Infiltrator interaction
|
// TODO: add a reference to the source of the stat change to fix Infiltrator interaction
|
||||||
globalScene.arena.applyTagsForSide(
|
globalScene.arena.applyTagsForSide(
|
||||||
MistTag,
|
MistTag,
|
||||||
pokemon.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY,
|
pokemon.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY,
|
||||||
false,
|
false,
|
||||||
null,
|
null,
|
||||||
cancelled,
|
cancelled,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { applyAbAttrs } from "#abilities/apply-ab-attrs";
|
import { applyAbAttrs } from "#abilities/apply-ab-attrs";
|
||||||
import type { TurnCommand } from "#app/battle";
|
import type { TurnCommand } from "#app/battle";
|
||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import type { BattlerIndex } from "#enums/battler-index";
|
import type { BattlerIndex } from "#enums/battler-index";
|
||||||
import { Command } from "#enums/command";
|
import { Command } from "#enums/command";
|
||||||
import { SwitchType } from "#enums/switch-type";
|
import { SwitchType } from "#enums/switch-type";
|
||||||
@ -54,7 +54,7 @@ export class TurnStartPhase extends FieldPhase {
|
|||||||
const field = globalScene.getField();
|
const field = globalScene.getField();
|
||||||
const moveOrder = this.getCommandOrder();
|
const moveOrder = this.getCommandOrder();
|
||||||
|
|
||||||
for (const pokemon of inSpeedOrder(ArenaTagSide.BOTH)) {
|
for (const pokemon of inSpeedOrder(ArenaSide.BOTH)) {
|
||||||
const preTurnCommand = globalScene.currentBattle.preTurnCommands[pokemon.getBattlerIndex()];
|
const preTurnCommand = globalScene.currentBattle.preTurnCommands[pokemon.getBattlerIndex()];
|
||||||
|
|
||||||
if (preTurnCommand?.skip) {
|
if (preTurnCommand?.skip) {
|
||||||
@ -68,7 +68,7 @@ export class TurnStartPhase extends FieldPhase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const phaseManager = globalScene.phaseManager;
|
const phaseManager = globalScene.phaseManager;
|
||||||
for (const pokemon of inSpeedOrder(ArenaTagSide.BOTH)) {
|
for (const pokemon of inSpeedOrder(ArenaSide.BOTH)) {
|
||||||
applyAbAttrs("BypassSpeedChanceAbAttr", { pokemon });
|
applyAbAttrs("BypassSpeedChanceAbAttr", { pokemon });
|
||||||
globalScene.applyModifiers(BypassSpeedChanceModifier, pokemon.isPlayer(), pokemon);
|
globalScene.applyModifiers(BypassSpeedChanceModifier, pokemon.isPlayer(), pokemon);
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { EntryHazardTag } from "#data/arena-tag";
|
import { EntryHazardTag } from "#data/arena-tag";
|
||||||
import { TerrainType } from "#data/terrain";
|
import { TerrainType } from "#data/terrain";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { TextStyle } from "#enums/text-style";
|
import { TextStyle } from "#enums/text-style";
|
||||||
import { WeatherType } from "#enums/weather-type";
|
import { WeatherType } from "#enums/weather-type";
|
||||||
@ -294,9 +294,9 @@ export class ArenaFlyout extends Phaser.GameObjects.Container {
|
|||||||
const isArenaTrapTag = globalScene.arena.getTag(tagAddedEvent.arenaTagType) instanceof EntryHazardTag;
|
const isArenaTrapTag = globalScene.arena.getTag(tagAddedEvent.arenaTagType) instanceof EntryHazardTag;
|
||||||
let arenaEffectType: ArenaEffectType;
|
let arenaEffectType: ArenaEffectType;
|
||||||
|
|
||||||
if (tagAddedEvent.arenaTagSide === ArenaTagSide.BOTH) {
|
if (tagAddedEvent.arenaTagSide === ArenaSide.BOTH) {
|
||||||
arenaEffectType = ArenaEffectType.FIELD;
|
arenaEffectType = ArenaEffectType.FIELD;
|
||||||
} else if (tagAddedEvent.arenaTagSide === ArenaTagSide.PLAYER) {
|
} else if (tagAddedEvent.arenaTagSide === ArenaSide.PLAYER) {
|
||||||
arenaEffectType = ArenaEffectType.PLAYER;
|
arenaEffectType = ArenaEffectType.PLAYER;
|
||||||
} else {
|
} else {
|
||||||
arenaEffectType = ArenaEffectType.ENEMY;
|
arenaEffectType = ArenaEffectType.ENEMY;
|
||||||
|
@ -1,23 +1,23 @@
|
|||||||
import { globalScene } from "#app/global-scene";
|
import { globalScene } from "#app/global-scene";
|
||||||
import { PokemonPriorityQueue } from "#app/queues/pokemon-priority-queue";
|
import { PokemonPriorityQueue } from "#app/queues/pokemon-priority-queue";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import type { Pokemon } from "#field/pokemon";
|
import type { Pokemon } from "#field/pokemon";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A generator function which uses a priority queue to yield each pokemon from a given side of the field in speed order.
|
* A generator function which uses a priority queue to yield each pokemon from a given side of the field in speed order.
|
||||||
* @param side - The {@linkcode ArenaTagSide | side} of the field to use
|
* @param side - The {@linkcode ArenaSide | side} of the field to use
|
||||||
* @returns A {@linkcode Generator} of {@linkcode Pokemon}
|
* @returns A {@linkcode Generator} of {@linkcode Pokemon}
|
||||||
*
|
*
|
||||||
* @remarks
|
* @remarks
|
||||||
* This should almost always be used by iteration in a `for...of` loop
|
* This should almost always be used by iteration in a `for...of` loop
|
||||||
*/
|
*/
|
||||||
export function* inSpeedOrder(side: ArenaTagSide = ArenaTagSide.BOTH): Generator<Pokemon, number> {
|
export function* inSpeedOrder(side: ArenaSide = ArenaSide.BOTH): Generator<Pokemon, number> {
|
||||||
let pokemonList: Pokemon[];
|
let pokemonList: Pokemon[];
|
||||||
switch (side) {
|
switch (side) {
|
||||||
case ArenaTagSide.PLAYER:
|
case ArenaSide.PLAYER:
|
||||||
pokemonList = globalScene.getPlayerField(true);
|
pokemonList = globalScene.getPlayerField(true);
|
||||||
break;
|
break;
|
||||||
case ArenaTagSide.ENEMY:
|
case ArenaSide.ENEMY:
|
||||||
pokemonList = globalScene.getEnemyField(true);
|
pokemonList = globalScene.getEnemyField(true);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
6
test/@types/vitest.d.ts
vendored
6
test/@types/vitest.d.ts
vendored
@ -5,7 +5,7 @@ import type { Phase } from "#app/phase";
|
|||||||
import type { ArenaTag } from "#data/arena-tag";
|
import type { ArenaTag } from "#data/arena-tag";
|
||||||
import type { TerrainType } from "#data/terrain";
|
import type { TerrainType } from "#data/terrain";
|
||||||
import type { AbilityId } from "#enums/ability-id";
|
import type { AbilityId } from "#enums/ability-id";
|
||||||
import type { ArenaTagSide } from "#enums/arena-tag-side";
|
import type { ArenaSide } from "#enums/arena-side";
|
||||||
import type { ArenaTagType } from "#enums/arena-tag-type";
|
import type { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import type { BattlerTagType } from "#enums/battler-tag-type";
|
import type { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import type { MoveId } from "#enums/move-id";
|
import type { MoveId } from "#enums/move-id";
|
||||||
@ -118,9 +118,9 @@ interface ArenaMatchers {
|
|||||||
/**
|
/**
|
||||||
* Check whether the current {@linkcode Arena} contains the given {@linkcode ArenaTag}.
|
* Check whether the current {@linkcode Arena} contains the given {@linkcode ArenaTag}.
|
||||||
* @param expectedType - The {@linkcode ArenaTagType} of the desired tag
|
* @param expectedType - The {@linkcode ArenaTagType} of the desired tag
|
||||||
* @param side - The {@linkcode ArenaTagSide | side(s) of the field} the tag should affect; default {@linkcode ArenaTagSide.BOTH}
|
* @param side - The {@linkcode ArenaSide | side(s) of the field} the tag should affect; default {@linkcode ArenaSide.BOTH}
|
||||||
*/
|
*/
|
||||||
toHaveArenaTag(expectedType: ArenaTagType, side?: ArenaTagSide): void;
|
toHaveArenaTag(expectedType: ArenaTagType, side?: ArenaSide): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether the current {@linkcode Arena} contains the given {@linkcode PositionalTag}.
|
* Check whether the current {@linkcode Arena} contains the given {@linkcode PositionalTag}.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { allAbilities } from "#data/data-lists";
|
import { allAbilities } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -82,8 +82,8 @@ describe("Abilities - Good As Gold", () => {
|
|||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
expect(good_as_gold.getAbility().id).toBe(AbilityId.GOOD_AS_GOLD);
|
expect(good_as_gold.getAbility().id).toBe(AbilityId.GOOD_AS_GOLD);
|
||||||
expect(good_as_gold.getStatStage(Stat.ATK)).toBe(0);
|
expect(good_as_gold.getStatStage(Stat.ATK)).toBe(0);
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaSide.PLAYER)).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not block field targeted effects in singles", async () => {
|
it("should not block field targeted effects in singles", async () => {
|
||||||
@ -93,7 +93,7 @@ describe("Abilities - Good As Gold", () => {
|
|||||||
game.move.select(MoveId.SPLASH, 0);
|
game.move.select(MoveId.SPLASH, 0);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.PLAYER)).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should block the ally's helping hand", async () => {
|
it("should block the ally's helping hand", async () => {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
@ -63,7 +63,7 @@ describe("Abilities - Infiltrator", () => {
|
|||||||
|
|
||||||
const preScreenDmg = enemy.getAttackDamage({ source: player, move: allMoves[move] }).damage;
|
const preScreenDmg = enemy.getAttackDamage({ source: player, move: allMoves[move] }).damage;
|
||||||
|
|
||||||
game.scene.arena.addTag(tagType, 1, MoveId.NONE, enemy.id, ArenaTagSide.ENEMY, true);
|
game.scene.arena.addTag(tagType, 1, MoveId.NONE, enemy.id, ArenaSide.ENEMY, true);
|
||||||
|
|
||||||
const postScreenDmg = enemy.getAttackDamage({ source: player, move: allMoves[move] }).damage;
|
const postScreenDmg = enemy.getAttackDamage({ source: player, move: allMoves[move] }).damage;
|
||||||
|
|
||||||
@ -77,7 +77,7 @@ describe("Abilities - Infiltrator", () => {
|
|||||||
const player = game.field.getPlayerPokemon();
|
const player = game.field.getPlayerPokemon();
|
||||||
const enemy = game.field.getEnemyPokemon();
|
const enemy = game.field.getEnemyPokemon();
|
||||||
|
|
||||||
game.scene.arena.addTag(ArenaTagType.SAFEGUARD, 1, MoveId.NONE, enemy.id, ArenaTagSide.ENEMY, true);
|
game.scene.arena.addTag(ArenaTagType.SAFEGUARD, 1, MoveId.NONE, enemy.id, ArenaSide.ENEMY, true);
|
||||||
|
|
||||||
game.move.use(MoveId.SPORE);
|
game.move.use(MoveId.SPORE);
|
||||||
await game.toEndOfTurn();
|
await game.toEndOfTurn();
|
||||||
@ -93,7 +93,7 @@ describe("Abilities - Infiltrator", () => {
|
|||||||
const player = game.field.getPlayerPokemon();
|
const player = game.field.getPlayerPokemon();
|
||||||
const enemy = game.field.getEnemyPokemon();
|
const enemy = game.field.getEnemyPokemon();
|
||||||
|
|
||||||
game.scene.arena.addTag(ArenaTagType.MIST, 1, MoveId.NONE, enemy.id, ArenaTagSide.ENEMY, true);
|
game.scene.arena.addTag(ArenaTagType.MIST, 1, MoveId.NONE, enemy.id, ArenaSide.ENEMY, true);
|
||||||
|
|
||||||
game.move.select(MoveId.BABY_DOLL_EYES);
|
game.move.select(MoveId.BABY_DOLL_EYES);
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { allAbilities, allMoves } from "#data/data-lists";
|
import { allAbilities, allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -126,8 +126,8 @@ describe("Abilities - Magic Bounce", () => {
|
|||||||
game.move.select(MoveId.SPIKES);
|
game.move.select(MoveId.SPIKES);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1);
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.PLAYER)!["layers"]).toBe(1);
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY)).toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should bounce spikes even when the target is protected", async () => {
|
it("should bounce spikes even when the target is protected", async () => {
|
||||||
@ -136,7 +136,7 @@ describe("Abilities - Magic Bounce", () => {
|
|||||||
|
|
||||||
game.move.select(MoveId.SPIKES);
|
game.move.select(MoveId.SPIKES);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1);
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.PLAYER)!["layers"]).toBe(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not bounce spikes when the target is in the semi-invulnerable state", async () => {
|
it("should not bounce spikes when the target is in the semi-invulnerable state", async () => {
|
||||||
@ -146,7 +146,7 @@ describe("Abilities - Magic Bounce", () => {
|
|||||||
game.move.select(MoveId.SPIKES);
|
game.move.select(MoveId.SPIKES);
|
||||||
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
|
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)!["layers"]).toBe(1);
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY)!["layers"]).toBe(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not bounce back curse", async () => {
|
it("should not bounce back curse", async () => {
|
||||||
@ -305,22 +305,16 @@ describe("Abilities - Magic Bounce", () => {
|
|||||||
await game.phaseInterceptor.to("TurnEndPhase");
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
|
||||||
expect(
|
expect(
|
||||||
game.scene.arena
|
game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex(),
|
||||||
.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)
|
|
||||||
?.getSourcePokemon()
|
|
||||||
?.getBattlerIndex(),
|
|
||||||
).toBe(BattlerIndex.ENEMY);
|
).toBe(BattlerIndex.ENEMY);
|
||||||
game.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER, true);
|
game.scene.arena.removeTagOnSide(ArenaTagType.STICKY_WEB, ArenaSide.PLAYER, true);
|
||||||
|
|
||||||
// turn 2
|
// turn 2
|
||||||
game.move.select(MoveId.STICKY_WEB, 0);
|
game.move.select(MoveId.STICKY_WEB, 0);
|
||||||
game.move.select(MoveId.TRICK_ROOM, 1);
|
game.move.select(MoveId.TRICK_ROOM, 1);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
expect(
|
expect(
|
||||||
game.scene.arena
|
game.scene.arena.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaSide.PLAYER)?.getSourcePokemon()?.getBattlerIndex(),
|
||||||
.getTagOnSide(ArenaTagType.STICKY_WEB, ArenaTagSide.PLAYER)
|
|
||||||
?.getSourcePokemon()
|
|
||||||
?.getBattlerIndex(),
|
|
||||||
).toBe(BattlerIndex.ENEMY);
|
).toBe(BattlerIndex.ENEMY);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { getStatusEffectCatchRateMultiplier } from "#data/status-effect";
|
import { getStatusEffectCatchRateMultiplier } from "#data/status-effect";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
@ -156,8 +156,8 @@ describe("AbilityId - Magic Guard", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("should prevent damage from entry hazards, but not Toxic Spikes poison", async () => {
|
it("should prevent damage from entry hazards, but not Toxic Spikes poison", async () => {
|
||||||
game.scene.arena.addTag(ArenaTagType.SPIKES, -1, MoveId.SPIKES, 0, ArenaTagSide.PLAYER);
|
game.scene.arena.addTag(ArenaTagType.SPIKES, -1, MoveId.SPIKES, 0, ArenaSide.PLAYER);
|
||||||
game.scene.arena.addTag(ArenaTagType.TOXIC_SPIKES, -1, MoveId.TOXIC_SPIKES, 0, ArenaTagSide.PLAYER);
|
game.scene.arena.addTag(ArenaTagType.TOXIC_SPIKES, -1, MoveId.TOXIC_SPIKES, 0, ArenaSide.PLAYER);
|
||||||
await game.classicMode.startBattle([SpeciesId.MAGIKARP]);
|
await game.classicMode.startBattle([SpeciesId.MAGIKARP]);
|
||||||
|
|
||||||
// Magic guard prevented damage but not poison
|
// Magic guard prevented damage but not poison
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -323,8 +323,8 @@ describe("Abilities - Wimp Out", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Magic Guard passive should not allow indirect damage to trigger Wimp Out", async () => {
|
it("Magic Guard passive should not allow indirect damage to trigger Wimp Out", async () => {
|
||||||
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, MoveId.STEALTH_ROCK, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, MoveId.STEALTH_ROCK, 0, ArenaSide.ENEMY);
|
||||||
game.scene.arena.addTag(ArenaTagType.SPIKES, 1, MoveId.SPIKES, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.SPIKES, 1, MoveId.SPIKES, 0, ArenaSide.ENEMY);
|
||||||
game.override
|
game.override
|
||||||
.passiveAbility(AbilityId.MAGIC_GUARD)
|
.passiveAbility(AbilityId.MAGIC_GUARD)
|
||||||
.enemyMoveset([MoveId.LEECH_SEED])
|
.enemyMoveset([MoveId.LEECH_SEED])
|
||||||
@ -378,8 +378,8 @@ describe("Abilities - Wimp Out", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Activates due to entry hazards", async () => {
|
it("Activates due to entry hazards", async () => {
|
||||||
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, MoveId.STEALTH_ROCK, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 1, MoveId.STEALTH_ROCK, 0, ArenaSide.ENEMY);
|
||||||
game.scene.arena.addTag(ArenaTagType.SPIKES, 1, MoveId.SPIKES, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.SPIKES, 1, MoveId.SPIKES, 0, ArenaSide.ENEMY);
|
||||||
game.override.enemySpecies(SpeciesId.CENTISKORCH).enemyAbility(AbilityId.WIMP_OUT).startingWave(4);
|
game.override.enemySpecies(SpeciesId.CENTISKORCH).enemyAbility(AbilityId.WIMP_OUT).startingWave(4);
|
||||||
await game.classicMode.startBattle([SpeciesId.TYRUNT]);
|
await game.classicMode.startBattle([SpeciesId.TYRUNT]);
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import type { BattleScene } from "#app/battle-scene";
|
import type { BattleScene } from "#app/battle-scene";
|
||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
@ -137,7 +137,7 @@ describe("Moves - Aurora Veil", () => {
|
|||||||
*/
|
*/
|
||||||
const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => {
|
const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => {
|
||||||
const multiplierHolder = new NumberHolder(1);
|
const multiplierHolder = new NumberHolder(1);
|
||||||
const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = defender.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
|
|
||||||
if (globalScene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side) && move.getAttrs("CritOnlyAttr").length === 0) {
|
if (globalScene.arena.getTagOnSide(ArenaTagType.AURORA_VEIL, side) && move.getAttrs("CritOnlyAttr").length === 0) {
|
||||||
globalScene.arena.applyTagsForSide(
|
globalScene.arena.applyTagsForSide(
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { EntryHazardTag } from "#data/arena-tag";
|
import { EntryHazardTag } from "#data/arena-tag";
|
||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
@ -50,11 +50,11 @@ describe("Moves - Ceaseless Edge", () => {
|
|||||||
|
|
||||||
await game.phaseInterceptor.to(MoveEffectPhase, false);
|
await game.phaseInterceptor.to(MoveEffectPhase, false);
|
||||||
// Spikes should not have any layers before move effect is applied
|
// Spikes should not have any layers before move effect is applied
|
||||||
const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as EntryHazardTag;
|
const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY) as EntryHazardTag;
|
||||||
expect(tagBefore instanceof EntryHazardTag).toBeFalsy();
|
expect(tagBefore instanceof EntryHazardTag).toBeFalsy();
|
||||||
|
|
||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
await game.phaseInterceptor.to(TurnEndPhase);
|
||||||
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as EntryHazardTag;
|
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY) as EntryHazardTag;
|
||||||
expect(tagAfter instanceof EntryHazardTag).toBeTruthy();
|
expect(tagAfter instanceof EntryHazardTag).toBeTruthy();
|
||||||
expect(tagAfter.layers).toBe(1);
|
expect(tagAfter.layers).toBe(1);
|
||||||
expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp);
|
expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp);
|
||||||
@ -72,11 +72,11 @@ describe("Moves - Ceaseless Edge", () => {
|
|||||||
|
|
||||||
await game.phaseInterceptor.to(MoveEffectPhase, false);
|
await game.phaseInterceptor.to(MoveEffectPhase, false);
|
||||||
// Spikes should not have any layers before move effect is applied
|
// Spikes should not have any layers before move effect is applied
|
||||||
const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as EntryHazardTag;
|
const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY) as EntryHazardTag;
|
||||||
expect(tagBefore instanceof EntryHazardTag).toBeFalsy();
|
expect(tagBefore instanceof EntryHazardTag).toBeFalsy();
|
||||||
|
|
||||||
await game.phaseInterceptor.to(TurnEndPhase);
|
await game.phaseInterceptor.to(TurnEndPhase);
|
||||||
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as EntryHazardTag;
|
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY) as EntryHazardTag;
|
||||||
expect(tagAfter instanceof EntryHazardTag).toBeTruthy();
|
expect(tagAfter instanceof EntryHazardTag).toBeTruthy();
|
||||||
expect(tagAfter.layers).toBe(2);
|
expect(tagAfter.layers).toBe(2);
|
||||||
expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp);
|
expect(enemyPokemon.hp).toBeLessThan(enemyStartingHp);
|
||||||
@ -90,11 +90,11 @@ describe("Moves - Ceaseless Edge", () => {
|
|||||||
game.move.select(MoveId.CEASELESS_EDGE);
|
game.move.select(MoveId.CEASELESS_EDGE);
|
||||||
await game.phaseInterceptor.to(MoveEffectPhase, false);
|
await game.phaseInterceptor.to(MoveEffectPhase, false);
|
||||||
// Spikes should not have any layers before move effect is applied
|
// Spikes should not have any layers before move effect is applied
|
||||||
const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as EntryHazardTag;
|
const tagBefore = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY) as EntryHazardTag;
|
||||||
expect(tagBefore instanceof EntryHazardTag).toBeFalsy();
|
expect(tagBefore instanceof EntryHazardTag).toBeFalsy();
|
||||||
|
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as EntryHazardTag;
|
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY) as EntryHazardTag;
|
||||||
expect(tagAfter instanceof EntryHazardTag).toBeTruthy();
|
expect(tagAfter instanceof EntryHazardTag).toBeTruthy();
|
||||||
expect(tagAfter.layers).toBe(2);
|
expect(tagAfter.layers).toBe(2);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
@ -47,7 +47,7 @@ describe("Move - Court Change", () => {
|
|||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
// enemy team will be in the swamp and slowed
|
// enemy team will be in the swamp and slowed
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaSide.ENEMY)).toBeDefined();
|
||||||
expect(enemyPokemon.getEffectiveStat(Stat.SPD)).toBe(enemyPokemon.getStat(Stat.SPD) / 4);
|
expect(enemyPokemon.getEffectiveStat(Stat.SPD)).toBe(enemyPokemon.getStat(Stat.SPD) / 4);
|
||||||
|
|
||||||
game.move.use(MoveId.COURT_CHANGE);
|
game.move.use(MoveId.COURT_CHANGE);
|
||||||
@ -55,8 +55,8 @@ describe("Move - Court Change", () => {
|
|||||||
await game.toEndOfTurn();
|
await game.toEndOfTurn();
|
||||||
|
|
||||||
// own team should now be in the swamp and slowed
|
// own team should now be in the swamp and slowed
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeUndefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaSide.ENEMY)).toBeUndefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(regieleki.getEffectiveStat(Stat.SPD)).toBe(regieleki.getStat(Stat.SPD) / 4);
|
expect(regieleki.getEffectiveStat(Stat.SPD)).toBe(regieleki.getStat(Stat.SPD) / 4);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -71,15 +71,15 @@ describe("Move - Court Change", () => {
|
|||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
// Ninjask will not be poisoned because of Safeguard
|
// Ninjask will not be poisoned because of Safeguard
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(ninjask.status?.effect).toBeUndefined();
|
expect(ninjask.status?.effect).toBeUndefined();
|
||||||
|
|
||||||
game.move.use(MoveId.COURT_CHANGE);
|
game.move.use(MoveId.COURT_CHANGE);
|
||||||
await game.toEndOfTurn();
|
await game.toEndOfTurn();
|
||||||
|
|
||||||
// Ninjask should now be poisoned due to lack of Safeguard
|
// Ninjask should now be poisoned due to lack of Safeguard
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaTagSide.PLAYER)).toBeUndefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaSide.PLAYER)).toBeUndefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaTagSide.ENEMY)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SAFEGUARD, ArenaSide.ENEMY)).toBeDefined();
|
||||||
expect(ninjask.status?.effect).toBe(StatusEffect.POISON);
|
expect(ninjask.status?.effect).toBe(StatusEffect.POISON);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -79,7 +79,7 @@ describe("Moves - Crafty Shield", () => {
|
|||||||
await game.move.forceEnemyMove(MoveId.TOXIC_SPIKES);
|
await game.move.forceEnemyMove(MoveId.TOXIC_SPIKES);
|
||||||
await game.phaseInterceptor.to("TurnEndPhase");
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TOXIC_SPIKES, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(charizard.getTag(BattlerTagType.PERISH_SONG)).toBeDefined();
|
expect(charizard.getTag(BattlerTagType.PERISH_SONG)).toBeDefined();
|
||||||
expect(blastoise.getTag(BattlerTagType.PERISH_SONG)).toBeDefined();
|
expect(blastoise.getTag(BattlerTagType.PERISH_SONG)).toBeDefined();
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import type { EntryHazardTag } from "#data/arena-tag";
|
import type { EntryHazardTag } from "#data/arena-tag";
|
||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
@ -191,7 +191,7 @@ describe("Moves - Destiny Bond", () => {
|
|||||||
expect(playerPokemon.isFainted()).toBe(true);
|
expect(playerPokemon.isFainted()).toBe(true);
|
||||||
|
|
||||||
// Ceaseless Edge spikes effect should still activate
|
// Ceaseless Edge spikes effect should still activate
|
||||||
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY) as EntryHazardTag;
|
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY) as EntryHazardTag;
|
||||||
expect(tagAfter.tagType).toBe(ArenaTagType.SPIKES);
|
expect(tagAfter.tagType).toBe(ArenaTagType.SPIKES);
|
||||||
expect(tagAfter.layers).toBe(1);
|
expect(tagAfter.layers).toBe(1);
|
||||||
});
|
});
|
||||||
@ -216,10 +216,7 @@ describe("Moves - Destiny Bond", () => {
|
|||||||
expect(playerPokemon1?.isFainted()).toBe(true);
|
expect(playerPokemon1?.isFainted()).toBe(true);
|
||||||
|
|
||||||
// Pledge secondary effect should still activate
|
// Pledge secondary effect should still activate
|
||||||
const tagAfter = game.scene.arena.getTagOnSide(
|
const tagAfter = game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaSide.ENEMY) as EntryHazardTag;
|
||||||
ArenaTagType.GRASS_WATER_PLEDGE,
|
|
||||||
ArenaTagSide.ENEMY,
|
|
||||||
) as EntryHazardTag;
|
|
||||||
expect(tagAfter.tagType).toBe(ArenaTagType.GRASS_WATER_PLEDGE);
|
expect(tagAfter.tagType).toBe(ArenaTagType.GRASS_WATER_PLEDGE);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ import { getPokemonNameWithAffix } from "#app/messages";
|
|||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import type { TypeDamageMultiplier } from "#data/type";
|
import type { TypeDamageMultiplier } from "#data/type";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleType } from "#enums/battle-type";
|
import { BattleType } from "#enums/battle-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
@ -72,8 +72,8 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
// Tag should've been added to the opposing side of the field
|
// Tag should've been added to the opposing side of the field
|
||||||
expect(game).not.toHaveArenaTag(tagType, ArenaTagSide.PLAYER);
|
expect(game).not.toHaveArenaTag(tagType, ArenaSide.PLAYER);
|
||||||
expect(game).toHaveArenaTag(tagType, ArenaTagSide.ENEMY);
|
expect(game).toHaveArenaTag(tagType, ArenaSide.ENEMY);
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: re-enable after re-fixing hazards moves
|
// TODO: re-enable after re-fixing hazards moves
|
||||||
@ -90,7 +90,7 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
|
|
||||||
expect(enemy1.isFainted()).toBe(true);
|
expect(enemy1.isFainted()).toBe(true);
|
||||||
expect(enemy2.isFainted()).toBe(true);
|
expect(enemy2.isFainted()).toBe(true);
|
||||||
expect(game).toHaveArenaTag(tagType, ArenaTagSide.ENEMY);
|
expect(game).toHaveArenaTag(tagType, ArenaSide.ENEMY);
|
||||||
});
|
});
|
||||||
|
|
||||||
const maxLayers = tagType === ArenaTagType.SPIKES ? 3 : tagType === ArenaTagType.TOXIC_SPIKES ? 2 : 1;
|
const maxLayers = tagType === ArenaTagType.SPIKES ? 3 : tagType === ArenaTagType.TOXIC_SPIKES ? 2 : 1;
|
||||||
@ -110,14 +110,14 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
expect(feebas).toHaveUsedMove({ move, result: MoveResult.SUCCESS });
|
expect(feebas).toHaveUsedMove({ move, result: MoveResult.SUCCESS });
|
||||||
expect(game).toHaveArenaTag({ tagType, side: ArenaTagSide.ENEMY, layers: i + 1 });
|
expect(game).toHaveArenaTag({ tagType, side: ArenaSide.ENEMY, layers: i + 1 });
|
||||||
}
|
}
|
||||||
|
|
||||||
game.move.use(move);
|
game.move.use(move);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
expect(feebas).toHaveUsedMove({ move, result: MoveResult.FAIL });
|
expect(feebas).toHaveUsedMove({ move, result: MoveResult.FAIL });
|
||||||
expect(game).toHaveArenaTag({ tagType, side: ArenaTagSide.ENEMY, layers: maxLayers });
|
expect(game).toHaveArenaTag({ tagType, side: ArenaSide.ENEMY, layers: maxLayers });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
{ layers: 3, damage: 25 },
|
{ layers: 3, damage: 25 },
|
||||||
])("should play message and deal $damage% of the target's max HP at $layers", async ({ layers, damage }) => {
|
])("should play message and deal $damage% of the target's max HP at $layers", async ({ layers, damage }) => {
|
||||||
for (let i = 0; i < layers; i++) {
|
for (let i = 0; i < layers; i++) {
|
||||||
game.scene.arena.addTag(ArenaTagType.SPIKES, 0, undefined, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.SPIKES, 0, undefined, 0, ArenaSide.ENEMY);
|
||||||
}
|
}
|
||||||
|
|
||||||
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.POOCHYENA]);
|
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.POOCHYENA]);
|
||||||
@ -149,7 +149,7 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
{ name: "Toxic", layers: 2, status: StatusEffect.TOXIC },
|
{ name: "Toxic", layers: 2, status: StatusEffect.TOXIC },
|
||||||
])("should apply $name at $layers without displaying neutralization msg", async ({ layers, status }) => {
|
])("should apply $name at $layers without displaying neutralization msg", async ({ layers, status }) => {
|
||||||
for (let i = 0; i < layers; i++) {
|
for (let i = 0; i < layers; i++) {
|
||||||
game.scene.arena.addTag(ArenaTagType.TOXIC_SPIKES, 0, undefined, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.TOXIC_SPIKES, 0, undefined, 0, ArenaSide.ENEMY);
|
||||||
}
|
}
|
||||||
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.POOCHYENA]);
|
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.POOCHYENA]);
|
||||||
|
|
||||||
@ -167,13 +167,13 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
it("should be removed without triggering upon a grounded Poison-type switching in", async () => {
|
it("should be removed without triggering upon a grounded Poison-type switching in", async () => {
|
||||||
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.EKANS]);
|
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.EKANS]);
|
||||||
|
|
||||||
game.scene.arena.addTag(ArenaTagType.TOXIC_SPIKES, 0, undefined, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.TOXIC_SPIKES, 0, undefined, 0, ArenaSide.ENEMY);
|
||||||
|
|
||||||
game.doSwitchPokemon(1);
|
game.doSwitchPokemon(1);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
const ekans = game.field.getPlayerPokemon();
|
const ekans = game.field.getPlayerPokemon();
|
||||||
expect(game).not.toHaveArenaTag(ArenaTagType.TOXIC_SPIKES, ArenaTagSide.PLAYER);
|
expect(game).not.toHaveArenaTag(ArenaTagType.TOXIC_SPIKES, ArenaSide.PLAYER);
|
||||||
expect(game.textInterceptor.logs).not.toContain(
|
expect(game.textInterceptor.logs).not.toContain(
|
||||||
i18next.t("arenaTag:toxicSpikesActivateTrapPoison", {
|
i18next.t("arenaTag:toxicSpikesActivateTrapPoison", {
|
||||||
pokemonNameWithAffix: getPokemonNameWithAffix(ekans),
|
pokemonNameWithAffix: getPokemonNameWithAffix(ekans),
|
||||||
@ -192,7 +192,7 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
{ multi: 4, species: SpeciesId.DELIBIRD },
|
{ multi: 4, species: SpeciesId.DELIBIRD },
|
||||||
])("should deal damage based on the target's weakness to Rock - $multi", async ({ multi, species }) => {
|
])("should deal damage based on the target's weakness to Rock - $multi", async ({ multi, species }) => {
|
||||||
game.override.enemySpecies(species);
|
game.override.enemySpecies(species);
|
||||||
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 0, undefined, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 0, undefined, 0, ArenaSide.ENEMY);
|
||||||
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.EKANS]);
|
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.EKANS]);
|
||||||
|
|
||||||
const enemy = game.field.getEnemyPokemon();
|
const enemy = game.field.getEnemyPokemon();
|
||||||
@ -207,7 +207,7 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
|
|
||||||
it("should ignore strong winds for type effectiveness", async () => {
|
it("should ignore strong winds for type effectiveness", async () => {
|
||||||
game.override.enemyAbility(AbilityId.DELTA_STREAM).enemySpecies(SpeciesId.RAYQUAZA);
|
game.override.enemyAbility(AbilityId.DELTA_STREAM).enemySpecies(SpeciesId.RAYQUAZA);
|
||||||
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 0, undefined, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.STEALTH_ROCK, 0, undefined, 0, ArenaSide.ENEMY);
|
||||||
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.EKANS]);
|
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.EKANS]);
|
||||||
|
|
||||||
const rayquaza = game.field.getEnemyPokemon();
|
const rayquaza = game.field.getEnemyPokemon();
|
||||||
@ -218,7 +218,7 @@ describe("Moves - Entry Hazards", () => {
|
|||||||
|
|
||||||
describe("Sticky Web", () => {
|
describe("Sticky Web", () => {
|
||||||
it("should lower the target's speed by 1 stage on entry", async () => {
|
it("should lower the target's speed by 1 stage on entry", async () => {
|
||||||
game.scene.arena.addTag(ArenaTagType.STICKY_WEB, 0, undefined, 0, ArenaTagSide.ENEMY);
|
game.scene.arena.addTag(ArenaTagType.STICKY_WEB, 0, undefined, 0, ArenaSide.ENEMY);
|
||||||
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.EKANS]);
|
await game.classicMode.startBattle([SpeciesId.MIGHTYENA, SpeciesId.EKANS]);
|
||||||
|
|
||||||
const enemy = game.field.getEnemyPokemon();
|
const enemy = game.field.getEnemyPokemon();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
@ -43,8 +43,8 @@ describe("Moves - Fairy Lock", () => {
|
|||||||
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
||||||
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.ENEMY)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.ENEMY)).toBeDefined();
|
||||||
|
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
@ -74,8 +74,8 @@ describe("Moves - Fairy Lock", () => {
|
|||||||
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.ENEMY)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.ENEMY)).toBeDefined();
|
||||||
|
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
@ -102,8 +102,8 @@ describe("Moves - Fairy Lock", () => {
|
|||||||
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.ENEMY)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.ENEMY)).toBeDefined();
|
||||||
|
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
game.move.select(MoveId.SPLASH);
|
game.move.select(MoveId.SPLASH);
|
||||||
@ -129,8 +129,8 @@ describe("Moves - Fairy Lock", () => {
|
|||||||
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
||||||
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
await game.move.selectEnemyMove(MoveId.SPLASH, 1);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaTagSide.ENEMY)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FAIRY_LOCK, ArenaSide.ENEMY)).toBeDefined();
|
||||||
|
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
game.move.select(MoveId.SPLASH);
|
game.move.select(MoveId.SPLASH);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import type { BattleScene } from "#app/battle-scene";
|
import type { BattleScene } from "#app/battle-scene";
|
||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
@ -125,7 +125,7 @@ describe("Moves - Light Screen", () => {
|
|||||||
*/
|
*/
|
||||||
const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => {
|
const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => {
|
||||||
const multiplierHolder = new NumberHolder(1);
|
const multiplierHolder = new NumberHolder(1);
|
||||||
const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = defender.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
|
|
||||||
if (globalScene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side) && move.getAttrs("CritOnlyAttr").length === 0) {
|
if (globalScene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, side) && move.getAttrs("CritOnlyAttr").length === 0) {
|
||||||
globalScene.arena.applyTagsForSide(
|
globalScene.arena.applyTagsForSide(
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -164,8 +164,8 @@ describe("Moves - Magic Coat", () => {
|
|||||||
game.move.select(MoveId.SPIKES);
|
game.move.select(MoveId.SPIKES);
|
||||||
await game.phaseInterceptor.to("BerryPhase");
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.PLAYER)!["layers"]).toBe(1);
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.PLAYER)!["layers"]).toBe(1);
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaTagSide.ENEMY)).toBeUndefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.SPIKES, ArenaSide.ENEMY)).toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should not bounce back curse", async () => {
|
it("should not bounce back curse", async () => {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { allAbilities, allMoves } from "#data/data-lists";
|
import { allAbilities, allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
@ -129,7 +129,7 @@ describe("Moves - Pledge Moves", () => {
|
|||||||
const baseDmg = baseDmgMock.mock.results.at(-1)!.value;
|
const baseDmg = baseDmgMock.mock.results.at(-1)!.value;
|
||||||
expect(enemyPokemon[0].getMaxHp() - enemyPokemon[0].hp).toBe(toDmgValue(baseDmg * 1.5));
|
expect(enemyPokemon[0].getMaxHp() - enemyPokemon[0].hp).toBe(toDmgValue(baseDmg * 1.5));
|
||||||
expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked
|
expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.FIRE_GRASS_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.FIRE_GRASS_PLEDGE, ArenaSide.ENEMY)).toBeDefined();
|
||||||
|
|
||||||
const enemyStartingHp = enemyPokemon.map(p => p.hp);
|
const enemyStartingHp = enemyPokemon.map(p => p.hp);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
@ -160,7 +160,7 @@ describe("Moves - Pledge Moves", () => {
|
|||||||
expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.WATER);
|
expect(playerPokemon[1].getMoveType).toHaveLastReturnedWith(PokemonType.WATER);
|
||||||
expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(150);
|
expect(firePledge.calculateBattlePower).toHaveLastReturnedWith(150);
|
||||||
expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked
|
expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp()); // PLAYER should not have attacked
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaSide.PLAYER)).toBeDefined();
|
||||||
|
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
@ -198,7 +198,7 @@ describe("Moves - Pledge Moves", () => {
|
|||||||
expect(waterPledge.calculateBattlePower).toHaveLastReturnedWith(150);
|
expect(waterPledge.calculateBattlePower).toHaveLastReturnedWith(150);
|
||||||
expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp());
|
expect(enemyPokemon[1].hp).toBe(enemyPokemon[1].getMaxHp());
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaTagSide.ENEMY)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.GRASS_WATER_PLEDGE, ArenaSide.ENEMY)).toBeDefined();
|
||||||
enemyPokemon.forEach((p, i) => expect(p.getEffectiveStat(Stat.SPD)).toBe(Math.floor(enemyStartingSpd[i] / 4)));
|
enemyPokemon.forEach((p, i) => expect(p.getEffectiveStat(Stat.SPD)).toBe(Math.floor(enemyStartingSpd[i] / 4)));
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -234,7 +234,7 @@ describe("Moves - Pledge Moves", () => {
|
|||||||
|
|
||||||
await game.phaseInterceptor.to("TurnEndPhase");
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaSide.PLAYER)).toBeDefined();
|
||||||
|
|
||||||
game.move.select(MoveId.IRON_HEAD, 0, BattlerIndex.ENEMY);
|
game.move.select(MoveId.IRON_HEAD, 0, BattlerIndex.ENEMY);
|
||||||
game.move.select(MoveId.SPLASH, 1);
|
game.move.select(MoveId.SPLASH, 1);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import type { BattleScene } from "#app/battle-scene";
|
import type { BattleScene } from "#app/battle-scene";
|
||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
@ -141,7 +141,7 @@ describe("Moves - Reflect", () => {
|
|||||||
*/
|
*/
|
||||||
const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => {
|
const getMockedMoveDamage = (defender: Pokemon, attacker: Pokemon, move: Move) => {
|
||||||
const multiplierHolder = new NumberHolder(1);
|
const multiplierHolder = new NumberHolder(1);
|
||||||
const side = defender.isPlayer() ? ArenaTagSide.PLAYER : ArenaTagSide.ENEMY;
|
const side = defender.isPlayer() ? ArenaSide.PLAYER : ArenaSide.ENEMY;
|
||||||
|
|
||||||
if (globalScene.arena.getTagOnSide(ArenaTagType.REFLECT, side) && move.getAttrs("CritOnlyAttr").length === 0) {
|
if (globalScene.arena.getTagOnSide(ArenaTagType.REFLECT, side) && move.getAttrs("CritOnlyAttr").length === 0) {
|
||||||
globalScene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, false, attacker, move.category, multiplierHolder);
|
globalScene.arena.applyTagsForSide(ArenaTagType.REFLECT, side, false, attacker, move.category, multiplierHolder);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { allAbilities, allMoves } from "#data/data-lists";
|
import { allAbilities, allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BiomeId } from "#enums/biome-id";
|
import { BiomeId } from "#enums/biome-id";
|
||||||
@ -74,7 +74,7 @@ describe("Moves - Secret Power", () => {
|
|||||||
|
|
||||||
await game.phaseInterceptor.to("TurnEndPhase");
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
|
||||||
let rainbowEffect = game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaTagSide.PLAYER);
|
let rainbowEffect = game.scene.arena.getTagOnSide(ArenaTagType.WATER_FIRE_PLEDGE, ArenaSide.PLAYER);
|
||||||
expect(rainbowEffect).toBeDefined();
|
expect(rainbowEffect).toBeDefined();
|
||||||
|
|
||||||
rainbowEffect = rainbowEffect!;
|
rainbowEffect = rainbowEffect!;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { SubstituteTag, TrappedTag } from "#data/battler-tags";
|
import { SubstituteTag, TrappedTag } from "#data/battler-tags";
|
||||||
import { allMoves } from "#data/data-lists";
|
import { allMoves } from "#data/data-lists";
|
||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { BattlerTagType } from "#enums/battler-tag-type";
|
import { BattlerTagType } from "#enums/battler-tag-type";
|
||||||
@ -189,7 +189,7 @@ describe("Moves - Substitute", () => {
|
|||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0);
|
expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0);
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.LIGHT_SCREEN, ArenaSide.PLAYER)).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't block the opponent from setting hazards", async () => {
|
it("shouldn't block the opponent from setting hazards", async () => {
|
||||||
@ -205,7 +205,7 @@ describe("Moves - Substitute", () => {
|
|||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0);
|
expect(leadPokemon.getMoveEffectiveness).not.toHaveReturnedWith(0);
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.STEALTH_ROCK, ArenaSide.PLAYER)).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shouldn't block moves that target both sides of the field", async () => {
|
it("shouldn't block moves that target both sides of the field", async () => {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
import { SpeciesId } from "#enums/species-id";
|
import { SpeciesId } from "#enums/species-id";
|
||||||
@ -49,7 +49,7 @@ describe("Moves - Tailwind", () => {
|
|||||||
|
|
||||||
expect(magikarp.getEffectiveStat(Stat.SPD)).toBe(magikarpSpd * 2);
|
expect(magikarp.getEffectiveStat(Stat.SPD)).toBe(magikarpSpd * 2);
|
||||||
expect(meowth.getEffectiveStat(Stat.SPD)).toBe(meowthSpd * 2);
|
expect(meowth.getEffectiveStat(Stat.SPD)).toBe(meowthSpd * 2);
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.PLAYER)).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("lasts for 4 turns", async () => {
|
it("lasts for 4 turns", async () => {
|
||||||
@ -59,20 +59,20 @@ describe("Moves - Tailwind", () => {
|
|||||||
|
|
||||||
game.move.select(MoveId.TAILWIND);
|
game.move.select(MoveId.TAILWIND);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.PLAYER)).toBeDefined();
|
||||||
|
|
||||||
game.move.select(MoveId.SPLASH);
|
game.move.select(MoveId.SPLASH);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.PLAYER)).toBeDefined();
|
||||||
|
|
||||||
game.move.select(MoveId.SPLASH);
|
game.move.select(MoveId.SPLASH);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.PLAYER)).toBeDefined();
|
||||||
|
|
||||||
game.move.select(MoveId.SPLASH);
|
game.move.select(MoveId.SPLASH);
|
||||||
await game.toNextTurn();
|
await game.toNextTurn();
|
||||||
|
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.PLAYER)).toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("does not affect the opposing side", async () => {
|
it("does not affect the opposing side", async () => {
|
||||||
@ -88,8 +88,8 @@ describe("Moves - Tailwind", () => {
|
|||||||
|
|
||||||
expect(ally.getEffectiveStat(Stat.SPD)).equal(allySpd);
|
expect(ally.getEffectiveStat(Stat.SPD)).equal(allySpd);
|
||||||
expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd);
|
expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd);
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeUndefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.PLAYER)).toBeUndefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.ENEMY)).toBeUndefined();
|
||||||
|
|
||||||
game.move.select(MoveId.TAILWIND);
|
game.move.select(MoveId.TAILWIND);
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ describe("Moves - Tailwind", () => {
|
|||||||
|
|
||||||
expect(ally.getEffectiveStat(Stat.SPD)).toBe(allySpd * 2);
|
expect(ally.getEffectiveStat(Stat.SPD)).toBe(allySpd * 2);
|
||||||
expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd);
|
expect(enemy.getEffectiveStat(Stat.SPD)).equal(enemySpd);
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.PLAYER)).toBeDefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.PLAYER)).toBeDefined();
|
||||||
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaTagSide.ENEMY)).toBeUndefined();
|
expect(game.scene.arena.getTagOnSide(ArenaTagType.TAILWIND, ArenaSide.ENEMY)).toBeUndefined();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { AbilityId } from "#enums/ability-id";
|
import { AbilityId } from "#enums/ability-id";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattlerIndex } from "#enums/battler-index";
|
import { BattlerIndex } from "#enums/battler-index";
|
||||||
import { MoveId } from "#enums/move-id";
|
import { MoveId } from "#enums/move-id";
|
||||||
@ -50,7 +50,7 @@ describe("Move - Trick Room", () => {
|
|||||||
|
|
||||||
expect(game).toHaveArenaTag({
|
expect(game).toHaveArenaTag({
|
||||||
tagType: ArenaTagType.TRICK_ROOM,
|
tagType: ArenaTagType.TRICK_ROOM,
|
||||||
side: ArenaTagSide.BOTH,
|
side: ArenaSide.BOTH,
|
||||||
sourceId: feebas.id,
|
sourceId: feebas.id,
|
||||||
sourceMove: MoveId.TRICK_ROOM,
|
sourceMove: MoveId.TRICK_ROOM,
|
||||||
turnCount: 4, // The 5 turn limit _includes_ the current turn!
|
turnCount: 4, // The 5 turn limit _includes_ the current turn!
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import type { ArenaTag, ArenaTagTypeMap } from "#data/arena-tag";
|
import type { ArenaTag, ArenaTagTypeMap } from "#data/arena-tag";
|
||||||
import { ArenaTagSide } from "#enums/arena-tag-side";
|
import { ArenaSide } from "#enums/arena-side";
|
||||||
import type { ArenaTagType } from "#enums/arena-tag-type";
|
import type { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import type { OneOther } from "#test/@types/test-helpers";
|
import type { OneOther } from "#test/@types/test-helpers";
|
||||||
// biome-ignore lint/correctness/noUnusedImports: TSDoc
|
// biome-ignore lint/correctness/noUnusedImports: TSDoc
|
||||||
@ -28,15 +28,15 @@ export type toHaveArenaTagOptions<A extends ArenaTagType> = OneOther<
|
|||||||
* @param received - The object to check. Should be the current {@linkcode GameManager}.
|
* @param received - The object to check. Should be the current {@linkcode GameManager}.
|
||||||
* @param expectedTag - The `ArenaTagType` of the desired tag, or a partially-filled object
|
* @param expectedTag - The `ArenaTagType` of the desired tag, or a partially-filled object
|
||||||
* containing the desired properties
|
* containing the desired properties
|
||||||
* @param side - The {@linkcode ArenaTagSide | side of the field} the tag should affect, or
|
* @param side - The {@linkcode ArenaSide | side of the field} the tag should affect, or
|
||||||
* {@linkcode ArenaTagSide.BOTH} to check both sides
|
* {@linkcode ArenaSide.BOTH} to check both sides
|
||||||
* @returns The result of the matching
|
* @returns The result of the matching
|
||||||
*/
|
*/
|
||||||
export function toHaveArenaTag<A extends ArenaTagType>(
|
export function toHaveArenaTag<A extends ArenaTagType>(
|
||||||
this: MatcherState,
|
this: MatcherState,
|
||||||
received: unknown,
|
received: unknown,
|
||||||
expectedTag: A | toHaveArenaTagOptions<A>,
|
expectedTag: A | toHaveArenaTagOptions<A>,
|
||||||
side: ArenaTagSide = ArenaTagSide.BOTH,
|
side: ArenaSide = ArenaSide.BOTH,
|
||||||
): SyncExpectationResult {
|
): SyncExpectationResult {
|
||||||
if (!isGameManagerInstance(received)) {
|
if (!isGameManagerInstance(received)) {
|
||||||
return {
|
return {
|
||||||
@ -55,7 +55,7 @@ export function toHaveArenaTag<A extends ArenaTagType>(
|
|||||||
// Coerce lone `tagType`s into objects
|
// Coerce lone `tagType`s into objects
|
||||||
// Bangs are ok as we enforce safety via overloads
|
// Bangs are ok as we enforce safety via overloads
|
||||||
// @ts-expect-error - Typescript is being stupid as tag type and side will always exist
|
// @ts-expect-error - Typescript is being stupid as tag type and side will always exist
|
||||||
const etag: Partial<ArenaTag> & { tagType: T; side: ArenaTagSide } =
|
const etag: Partial<ArenaTag> & { tagType: T; side: ArenaSide } =
|
||||||
typeof expectedTag === "object" ? expectedTag : { tagType: expectedTag, side };
|
typeof expectedTag === "object" ? expectedTag : { tagType: expectedTag, side };
|
||||||
|
|
||||||
// If checking only tag type/side OR no tags were found, break out early.
|
// If checking only tag type/side OR no tags were found, break out early.
|
||||||
|
Loading…
Reference in New Issue
Block a user