forked from pagefaultgames/pokerogue
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[P2] Fixes party status cure moves only curing the player's pokemon, …
…even when used by enemy pokemon (pagefaultgames#3369) * Fixes bug with Status Cure moves only curing player pokemon, refactors PartyStatusCureAttr, removes PartyStatusCurePhase * Adds check for user ID, since user always cures its own status regardless of ability * Adds unit tests for sparkly swirl * Merge and fix conflicts * Fix conflicts with SPLASH_ONLY * Fix failing sparkly swirl test due to splash_only * Adds unit tests for heal bell and aromatherapy * Update src/data/move.ts --------- Co-authored-by: flx-sta <[email protected]>
- Loading branch information
Showing
5 changed files
with
311 additions
and
52 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
import { StatusEffect } from "#app/enums/status-effect"; | ||
import { CommandPhase } from "#app/phases/command-phase"; | ||
import { Abilities } from "#enums/abilities"; | ||
import { Moves } from "#enums/moves"; | ||
import { Species } from "#enums/species"; | ||
import GameManager from "#test/utils/gameManager"; | ||
import Phaser from "phaser"; | ||
import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; | ||
|
||
describe("Moves - Aromatherapy", () => { | ||
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 | ||
.moveset([Moves.AROMATHERAPY, Moves.SPLASH]) | ||
.statusEffect(StatusEffect.BURN) | ||
.battleType("double") | ||
.enemyAbility(Abilities.BALL_FETCH) | ||
.enemyMoveset(Moves.SPLASH); | ||
}); | ||
|
||
it("should cure status effect of the user, its ally, and all party pokemon", async () => { | ||
await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); | ||
const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getParty(); | ||
|
||
vi.spyOn(leftPlayer, "resetStatus"); | ||
vi.spyOn(rightPlayer, "resetStatus"); | ||
vi.spyOn(partyPokemon, "resetStatus"); | ||
|
||
game.move.select(Moves.AROMATHERAPY, 0); | ||
await game.phaseInterceptor.to(CommandPhase); | ||
game.move.select(Moves.SPLASH, 1); | ||
await game.toNextTurn(); | ||
|
||
expect(leftPlayer.resetStatus).toHaveBeenCalledOnce(); | ||
expect(rightPlayer.resetStatus).toHaveBeenCalledOnce(); | ||
expect(partyPokemon.resetStatus).toHaveBeenCalledOnce(); | ||
|
||
expect(leftPlayer.status?.effect).toBeUndefined(); | ||
expect(rightPlayer.status?.effect).toBeUndefined(); | ||
expect(partyPokemon.status?.effect).toBeUndefined(); | ||
}); | ||
|
||
it("should not cure status effect of the target/target's allies", async () => { | ||
game.override.enemyStatusEffect(StatusEffect.BURN); | ||
await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); | ||
const [leftOpp, rightOpp] = game.scene.getEnemyField(); | ||
|
||
vi.spyOn(leftOpp, "resetStatus"); | ||
vi.spyOn(rightOpp, "resetStatus"); | ||
|
||
game.move.select(Moves.AROMATHERAPY, 0); | ||
await game.phaseInterceptor.to(CommandPhase); | ||
game.move.select(Moves.SPLASH, 1); | ||
await game.toNextTurn(); | ||
|
||
expect(leftOpp.resetStatus).toHaveBeenCalledTimes(0); | ||
expect(rightOpp.resetStatus).toHaveBeenCalledTimes(0); | ||
|
||
expect(leftOpp.status?.effect).toBeTruthy(); | ||
expect(rightOpp.status?.effect).toBeTruthy(); | ||
|
||
expect(leftOpp.status?.effect).toBe(StatusEffect.BURN); | ||
expect(rightOpp.status?.effect).toBe(StatusEffect.BURN); | ||
}); | ||
|
||
it("should not cure status effect of allies ON FIELD with Sap Sipper, should still cure allies in party", async () => { | ||
game.override.ability(Abilities.SAP_SIPPER); | ||
await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); | ||
const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getParty(); | ||
|
||
vi.spyOn(leftPlayer, "resetStatus"); | ||
vi.spyOn(rightPlayer, "resetStatus"); | ||
vi.spyOn(partyPokemon, "resetStatus"); | ||
|
||
game.move.select(Moves.AROMATHERAPY, 0); | ||
await game.phaseInterceptor.to(CommandPhase); | ||
game.move.select(Moves.SPLASH, 1); | ||
await game.toNextTurn(); | ||
|
||
expect(leftPlayer.resetStatus).toHaveBeenCalledOnce(); | ||
expect(rightPlayer.resetStatus).toHaveBeenCalledTimes(0); | ||
expect(partyPokemon.resetStatus).toHaveBeenCalledOnce(); | ||
|
||
expect(leftPlayer.status?.effect).toBeUndefined(); | ||
expect(rightPlayer.status?.effect).toBe(StatusEffect.BURN); | ||
expect(partyPokemon.status?.effect).toBeUndefined(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
import { StatusEffect } from "#app/enums/status-effect"; | ||
import { CommandPhase } from "#app/phases/command-phase"; | ||
import { Abilities } from "#enums/abilities"; | ||
import { Moves } from "#enums/moves"; | ||
import { Species } from "#enums/species"; | ||
import GameManager from "#test/utils/gameManager"; | ||
import Phaser from "phaser"; | ||
import { afterEach, beforeAll, beforeEach, describe, it, expect, vi } from "vitest"; | ||
|
||
describe("Moves - Heal Bell", () => { | ||
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 | ||
.moveset([Moves.HEAL_BELL, Moves.SPLASH]) | ||
.statusEffect(StatusEffect.BURN) | ||
.battleType("double") | ||
.enemyAbility(Abilities.BALL_FETCH) | ||
.enemyMoveset(Moves.SPLASH); | ||
}); | ||
|
||
it("should cure status effect of the user, its ally, and all party pokemon", async () => { | ||
await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); | ||
const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getParty(); | ||
|
||
vi.spyOn(leftPlayer, "resetStatus"); | ||
vi.spyOn(rightPlayer, "resetStatus"); | ||
vi.spyOn(partyPokemon, "resetStatus"); | ||
|
||
game.move.select(Moves.HEAL_BELL, 0); | ||
await game.phaseInterceptor.to(CommandPhase); | ||
game.move.select(Moves.SPLASH, 1); | ||
await game.toNextTurn(); | ||
|
||
expect(leftPlayer.resetStatus).toHaveBeenCalledOnce(); | ||
expect(rightPlayer.resetStatus).toHaveBeenCalledOnce(); | ||
expect(partyPokemon.resetStatus).toHaveBeenCalledOnce(); | ||
|
||
expect(leftPlayer.status?.effect).toBeUndefined(); | ||
expect(rightPlayer.status?.effect).toBeUndefined(); | ||
expect(partyPokemon.status?.effect).toBeUndefined(); | ||
}); | ||
|
||
it("should not cure status effect of the target/target's allies", async () => { | ||
game.override.enemyStatusEffect(StatusEffect.BURN); | ||
await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); | ||
const [leftOpp, rightOpp] = game.scene.getEnemyField(); | ||
|
||
vi.spyOn(leftOpp, "resetStatus"); | ||
vi.spyOn(rightOpp, "resetStatus"); | ||
|
||
game.move.select(Moves.HEAL_BELL, 0); | ||
await game.phaseInterceptor.to(CommandPhase); | ||
game.move.select(Moves.SPLASH, 1); | ||
await game.toNextTurn(); | ||
|
||
expect(leftOpp.resetStatus).toHaveBeenCalledTimes(0); | ||
expect(rightOpp.resetStatus).toHaveBeenCalledTimes(0); | ||
|
||
expect(leftOpp.status?.effect).toBeTruthy(); | ||
expect(rightOpp.status?.effect).toBeTruthy(); | ||
|
||
expect(leftOpp.status?.effect).toBe(StatusEffect.BURN); | ||
expect(rightOpp.status?.effect).toBe(StatusEffect.BURN); | ||
}); | ||
|
||
it("should not cure status effect of allies ON FIELD with Soundproof, should still cure allies in party", async () => { | ||
game.override.ability(Abilities.SOUNDPROOF); | ||
await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); | ||
const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getParty(); | ||
|
||
vi.spyOn(leftPlayer, "resetStatus"); | ||
vi.spyOn(rightPlayer, "resetStatus"); | ||
vi.spyOn(partyPokemon, "resetStatus"); | ||
|
||
game.move.select(Moves.HEAL_BELL, 0); | ||
await game.phaseInterceptor.to(CommandPhase); | ||
game.move.select(Moves.SPLASH, 1); | ||
await game.toNextTurn(); | ||
|
||
expect(leftPlayer.resetStatus).toHaveBeenCalledOnce(); | ||
expect(rightPlayer.resetStatus).toHaveBeenCalledTimes(0); | ||
expect(partyPokemon.resetStatus).toHaveBeenCalledOnce(); | ||
|
||
expect(leftPlayer.status?.effect).toBeUndefined(); | ||
expect(rightPlayer.status?.effect).toBe(StatusEffect.BURN); | ||
expect(partyPokemon.status?.effect).toBeUndefined(); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
import { allMoves } from "#app/data/move"; | ||
import { StatusEffect } from "#app/enums/status-effect"; | ||
import { CommandPhase } from "#app/phases/command-phase"; | ||
import { Abilities } from "#enums/abilities"; | ||
import { Moves } from "#enums/moves"; | ||
import { Species } from "#enums/species"; | ||
import GameManager from "#test/utils/gameManager"; | ||
import Phaser from "phaser"; | ||
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; | ||
|
||
describe("Moves - Sparkly Swirl", () => { | ||
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 | ||
.enemySpecies(Species.SHUCKLE) | ||
.enemyLevel(100) | ||
.enemyMoveset(Moves.SPLASH) | ||
.enemyAbility(Abilities.BALL_FETCH) | ||
.moveset([Moves.SPARKLY_SWIRL, Moves.SPLASH]) | ||
.ability(Abilities.BALL_FETCH); | ||
|
||
vi.spyOn(allMoves[Moves.SPARKLY_SWIRL], "accuracy", "get").mockReturnValue(100); | ||
}); | ||
|
||
it("should cure status effect of the user, its ally, and all party pokemon", async () => { | ||
game.override | ||
.battleType("double") | ||
.statusEffect(StatusEffect.BURN); | ||
await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA, Species.RATTATA]); | ||
const [leftPlayer, rightPlayer, partyPokemon] = game.scene.getParty(); | ||
const leftOpp = game.scene.getEnemyPokemon()!; | ||
|
||
vi.spyOn(leftPlayer, "resetStatus"); | ||
vi.spyOn(rightPlayer, "resetStatus"); | ||
vi.spyOn(partyPokemon, "resetStatus"); | ||
|
||
game.move.select(Moves.SPARKLY_SWIRL, 0, leftOpp.getBattlerIndex()); | ||
await game.phaseInterceptor.to(CommandPhase); | ||
game.move.select(Moves.SPLASH, 1); | ||
await game.toNextTurn(); | ||
|
||
expect(leftPlayer.resetStatus).toHaveBeenCalledOnce(); | ||
expect(rightPlayer.resetStatus).toHaveBeenCalledOnce(); | ||
expect(partyPokemon.resetStatus).toHaveBeenCalledOnce(); | ||
|
||
expect(leftPlayer.status?.effect).toBeUndefined(); | ||
expect(rightPlayer.status?.effect).toBeUndefined(); | ||
expect(partyPokemon.status?.effect).toBeUndefined(); | ||
}); | ||
|
||
it("should not cure status effect of the target/target's allies", async () => { | ||
game.override | ||
.battleType("double") | ||
.enemyStatusEffect(StatusEffect.BURN); | ||
await game.classicMode.startBattle([Species.RATTATA, Species.RATTATA]); | ||
const [leftOpp, rightOpp] = game.scene.getEnemyField(); | ||
|
||
vi.spyOn(leftOpp, "resetStatus"); | ||
vi.spyOn(rightOpp, "resetStatus"); | ||
|
||
game.move.select(Moves.SPARKLY_SWIRL, 0, leftOpp.getBattlerIndex()); | ||
await game.phaseInterceptor.to(CommandPhase); | ||
game.move.select(Moves.SPLASH, 1); | ||
await game.toNextTurn(); | ||
|
||
expect(leftOpp.resetStatus).toHaveBeenCalledTimes(0); | ||
expect(rightOpp.resetStatus).toHaveBeenCalledTimes(0); | ||
|
||
expect(leftOpp.status?.effect).toBeTruthy(); | ||
expect(rightOpp.status?.effect).toBeTruthy(); | ||
|
||
expect(leftOpp.status?.effect).toBe(StatusEffect.BURN); | ||
expect(rightOpp.status?.effect).toBe(StatusEffect.BURN); | ||
}); | ||
}); |