From 87b4af04be8f71dbe937be2fe53e23cb2a3671b1 Mon Sep 17 00:00:00 2001 From: frutescens Date: Mon, 23 Sep 2024 20:04:56 -0700 Subject: [PATCH] adding tests so that git doesn't auto-fail --- src/data/battler-tags.ts | 3 +- src/test/abilities/aroma_veil.test.ts | 54 +++++++++++++++++++++++ src/test/moves/imprison.test.ts | 54 +++++++++++++++++++++++ src/test/moves/taunt.test.ts | 54 +++++++++++++++++++++++ src/test/moves/torment.test.ts | 63 +++++++++++++++++++++++++++ 5 files changed, 227 insertions(+), 1 deletion(-) diff --git a/src/data/battler-tags.ts b/src/data/battler-tags.ts index c9fc72676ba..0a8ea4c658e 100644 --- a/src/data/battler-tags.ts +++ b/src/data/battler-tags.ts @@ -2482,7 +2482,8 @@ export class TormentTag extends MoveRestrictionBattlerTag { return false; } const isLockedIntoMove = allMoves[lastMove.move].hasAttr(ConsecutiveUseDoublePowerAttr); - if (lastMove.move === move && lastMove.result === MoveResult.SUCCESS && lastMove.move !== Moves.STRUGGLE && !isLockedIntoMove) { + const validLastMoveResult = (lastMove.result === MoveResult.SUCCESS) || (lastMove.result === MoveResult.MISS); + if (lastMove.move === move && validLastMoveResult && lastMove.move !== Moves.STRUGGLE && !isLockedIntoMove) { return true; } return false; diff --git a/src/test/abilities/aroma_veil.test.ts b/src/test/abilities/aroma_veil.test.ts index e69de29bb2d..e01b63dbf88 100644 --- a/src/test/abilities/aroma_veil.test.ts +++ b/src/test/abilities/aroma_veil.test.ts @@ -0,0 +1,54 @@ +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { MoveResult } from "#app/field/pokemon"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; + +describe("Moves - Aroma Veil", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.TAUNT, Moves.SPLASH]) + .enemySpecies(Species.SHUCKLE) + .moveset([Moves.GROWL]); + }); + + it("Pokemon should not be able to use the same move consecutively", async () => { + await game.classicMode.startBattle([Species.REGIELEKI]); + + const playerPokemon = game.scene.getPlayerPokemon(); + + // First turn, Player Pokemon fails usin + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.TAUNT); + await game.toNextTurn(); + const move1 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move1.move).toBe(Moves.GROWL); + expect(move1.result).toBe(MoveResult.SUCCESS); + expect(playerPokemon?.getTag(BattlerTagType.TAUNT)).toBeDefined(); + + // Second turn, Taunt forces Struggle to occur + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const move2 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move2.move).toBe(Moves.STRUGGLE); + }); +}); diff --git a/src/test/moves/imprison.test.ts b/src/test/moves/imprison.test.ts index e69de29bb2d..92669591a9f 100644 --- a/src/test/moves/imprison.test.ts +++ b/src/test/moves/imprison.test.ts @@ -0,0 +1,54 @@ +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { MoveResult } from "#app/field/pokemon"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; + +describe("Moves - Imprison", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.IMPRISON, Moves.SPLASH]) + .enemySpecies(Species.SHUCKLE) + .moveset([Moves.GROWL]); + }); + + it("Pokemon should not be able to use the same move consecutively", async () => { + await game.classicMode.startBattle([Species.REGIELEKI]); + + const playerPokemon = game.scene.getPlayerPokemon(); + + // First turn, Player Pokemon fails usin + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.IMPRISON); + await game.toNextTurn(); + const move1 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move1.move).toBe(Moves.GROWL); + expect(move1.result).toBe(MoveResult.SUCCESS); + expect(playerPokemon?.getTag(BattlerTagType.TAUNT)).toBeDefined(); + + // Second turn, Taunt forces Struggle to occur + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const move2 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move2.move).toBe(Moves.STRUGGLE); + }); +}); diff --git a/src/test/moves/taunt.test.ts b/src/test/moves/taunt.test.ts index e69de29bb2d..368d052ff8d 100644 --- a/src/test/moves/taunt.test.ts +++ b/src/test/moves/taunt.test.ts @@ -0,0 +1,54 @@ +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { MoveResult } from "#app/field/pokemon"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; + +describe("Moves - Taunt", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.TAUNT, Moves.SPLASH]) + .enemySpecies(Species.SHUCKLE) + .moveset([Moves.GROWL]); + }); + + it("Pokemon should not be able to use Status Moves", async () => { + await game.classicMode.startBattle([Species.REGIELEKI]); + + const playerPokemon = game.scene.getPlayerPokemon(); + + // First turn, Player Pokemon succeeds using Growl + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.TAUNT); + await game.toNextTurn(); + const move1 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move1.move).toBe(Moves.GROWL); + expect(move1.result).toBe(MoveResult.SUCCESS); + expect(playerPokemon?.getTag(BattlerTagType.TAUNT)).toBeDefined(); + + // Second turn, Taunt forces Struggle to occur + game.move.select(Moves.GROWL); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const move2 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move2.move).toBe(Moves.STRUGGLE); + }); +}); diff --git a/src/test/moves/torment.test.ts b/src/test/moves/torment.test.ts index e69de29bb2d..479736f0621 100644 --- a/src/test/moves/torment.test.ts +++ b/src/test/moves/torment.test.ts @@ -0,0 +1,63 @@ +import { Moves } from "#app/enums/moves"; +import { Species } from "#app/enums/species"; +import { Abilities } from "#enums/abilities"; +import GameManager from "#test/utils/gameManager"; +import Phaser from "phaser"; +import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { MoveResult } from "#app/field/pokemon"; +import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { TurnEndPhase } from "#app/phases/turn-end-phase"; + +describe("Moves - Torment", () => { + let phaserGame: Phaser.Game; + let game: GameManager; + beforeAll(() => { + phaserGame = new Phaser.Game({ + type: Phaser.HEADLESS, + }); + }); + + afterEach(() => { + game.phaseInterceptor.restoreOg(); + }); + + beforeEach(() => { + game = new GameManager(phaserGame); + game.override + .battleType("single") + .enemyAbility(Abilities.BALL_FETCH) + .enemyMoveset([Moves.TORMENT, Moves.SPLASH]) + .enemySpecies(Species.SHUCKLE) + .enemyLevel(30) + .moveset([Moves.TACKLE]); + }); + + it("Pokemon should not be able to use the same move consecutively", async () => { + await game.classicMode.startBattle([Species.CHANSEY]); + + const playerPokemon = game.scene.getPlayerPokemon(); + + // First turn, Player Pokemon uses Tackle successfully + game.move.select(Moves.TACKLE); + await game.forceEnemyMove(Moves.TORMENT); + await game.toNextTurn(); + const move1 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move1.move).toBe(Moves.TACKLE); + expect(move1.result).toBe(MoveResult.SUCCESS); + expect(playerPokemon?.getTag(BattlerTagType.TORMENT)).toBeDefined(); + + // Second turn, Torment forces Struggle to occur + game.move.select(Moves.TACKLE); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + const move2 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move2.move).toBe(Moves.STRUGGLE); + + // Third turn, Tackle can be used. + game.move.select(Moves.TACKLE); + await game.forceEnemyMove(Moves.SPLASH); + await game.phaseInterceptor.to(TurnEndPhase); + const move3 = playerPokemon?.getLastXMoves(1)[0]!; + expect(move3.move).toBe(Moves.TACKLE); + }); +});