From 8363945084161ecc90bf2f98d266467eaf0b0e97 Mon Sep 17 00:00:00 2001 From: NightKev <34855794+DayKev@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:00:28 -0700 Subject: [PATCH] Update Eternatus tests & helper function --- src/test/final_boss.test.ts | 58 ++++++++++++++--------------------- src/test/utils/gameManager.ts | 23 ++++++++------ 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/test/final_boss.test.ts b/src/test/final_boss.test.ts index a76601b0201..5d006998a0b 100644 --- a/src/test/final_boss.test.ts +++ b/src/test/final_boss.test.ts @@ -1,14 +1,13 @@ +import { StatusEffect } from "#app/data/status-effect"; +import { Abilities } from "#app/enums/abilities"; import { Biome } from "#app/enums/biome"; import { Moves } from "#app/enums/moves"; import { Species } from "#app/enums/species"; import { GameModes } from "#app/game-mode"; +import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; import GameManager from "./utils/gameManager"; import { SPLASH_ONLY } from "./utils/testUtils"; -import { TurnHeldItemTransferModifier } from "#app/modifier/modifier"; -import { Abilities } from "#app/enums/abilities"; -import { CommandPhase } from "#app/phases/command-phase"; -import { StatusEffect } from "#app/data/status-effect"; const FinalWave = { Classic: 200, @@ -26,7 +25,13 @@ describe("Final Boss", () => { beforeEach(() => { game = new GameManager(phaserGame); - game.override.startingWave(FinalWave.Classic).startingBiome(Biome.END).disableCrits(); + game.override + .startingWave(FinalWave.Classic) + .startingBiome(Biome.END) + .disableCrits() + .enemyMoveset(SPLASH_ONLY) + .moveset([ Moves.SPLASH, Moves.WILL_O_WISP, Moves.DRAGON_PULSE ]) + .startingLevel(10000); }); afterEach(() => { @@ -34,7 +39,7 @@ describe("Final Boss", () => { }); it("should spawn Eternatus on wave 200 in END biome", async () => { - await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -43,7 +48,7 @@ describe("Final Boss", () => { it("should NOT spawn Eternatus before wave 200 in END biome", async () => { game.override.startingWave(FinalWave.Classic - 1); - await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).not.toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).toBe(Biome.END); @@ -52,7 +57,7 @@ describe("Final Boss", () => { it("should NOT spawn Eternatus outside of END biome", async () => { game.override.startingBiome(Biome.FOREST); - await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); expect(game.scene.currentBattle.waveIndex).toBe(FinalWave.Classic); expect(game.scene.arena.biomeType).not.toBe(Biome.END); @@ -60,26 +65,19 @@ describe("Final Boss", () => { }); it("should not have passive enabled on Eternatus", async () => { - await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); - const eternatus = game.scene.getEnemyPokemon(); - expect(eternatus?.species.speciesId).toBe(Species.ETERNATUS); - expect(eternatus?.hasPassive()).toBe(false); + const eternatus = game.scene.getEnemyPokemon()!; + expect(eternatus.species.speciesId).toBe(Species.ETERNATUS); + expect(eternatus.hasPassive()).toBe(false); }); it("should change form on direct hit down to last boss fragment", async () => { - game.override.startingLevel(10000); - game.override.starterSpecies(Species.KYUREM); - game.override.moveset([Moves.DRAGON_PULSE]); - game.override.enemyMoveset(SPLASH_ONLY); - game.override.enemyHeldItems([]); - - // This handles skipping all dialog at the start of the battle and when switching phase - await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC); - await game.phaseInterceptor.to(CommandPhase); + await game.runToFinalBossEncounter([Species.KYUREM], GameModes.CLASSIC); + await game.phaseInterceptor.to("CommandPhase"); // Eternatus phase 1 - let eternatus = game.scene.getEnemyPokemon()!; + const eternatus = game.scene.getEnemyPokemon()!; const phase1Hp = eternatus.getMaxHp(); expect(eternatus.species.speciesId).toBe(Species.ETERNATUS); expect(eternatus.formIndex).toBe(0); @@ -90,14 +88,12 @@ describe("Final Boss", () => { await game.toNextTurn(); // Eternatus phase 2: changed form, healed and restored its shields - eternatus = game.scene.getEnemyPokemon()!; expect(eternatus.species.speciesId).toBe(Species.ETERNATUS); expect(eternatus.hp).toBeGreaterThan(phase1Hp); expect(eternatus.hp).toBe(eternatus.getMaxHp()); expect(eternatus.formIndex).toBe(1); expect(eternatus.bossSegments).toBe(5); expect(eternatus.bossSegmentIndex).toBe(4); - // should carry a mini black hole const miniBlackHole = eternatus.getHeldItems().find(m => m instanceof TurnHeldItemTransferModifier); expect(miniBlackHole).toBeDefined(); expect(miniBlackHole?.stackCount).toBe(1); @@ -105,23 +101,18 @@ describe("Final Boss", () => { it("should change form on status damage down to last boss fragment", async () => { game.override.ability(Abilities.NO_GUARD); - game.override.moveset([ Moves.SPLASH, Moves.WILL_O_WISP ]); - game.override.enemyMoveset(SPLASH_ONLY); - game.override.enemyHeldItems([]); - // This handles skipping all dialog at the start of the battle and when switching phase - await game.runToFinalBossEncounter(game, [Species.BIDOOF], GameModes.CLASSIC); - await game.phaseInterceptor.to(CommandPhase); + await game.runToFinalBossEncounter([Species.BIDOOF], GameModes.CLASSIC); + await game.phaseInterceptor.to("CommandPhase"); // Eternatus phase 1 - let eternatus = game.scene.getEnemyPokemon()!; + const eternatus = game.scene.getEnemyPokemon()!; const phase1Hp = eternatus.getMaxHp(); expect(eternatus.species.speciesId).toBe(Species.ETERNATUS); expect(eternatus.formIndex).toBe(0); expect(eternatus.bossSegments).toBe(4); expect(eternatus.bossSegmentIndex).toBe(3); - // Burn the boss game.move.select(Moves.WILL_O_WISP); await game.toNextTurn(); expect(eternatus.status?.effect).toBe(StatusEffect.BURN); @@ -136,19 +127,16 @@ describe("Final Boss", () => { expect(eternatus.bossSegmentIndex).toBe(1); - // Last burn should break the shield game.move.select(Moves.SPLASH); await game.toNextTurn(); // Eternatus phase 2: changed form, healed and restored its shields - eternatus = game.scene.getEnemyPokemon()!; expect(eternatus.hp).toBeGreaterThan(phase1Hp); expect(eternatus.hp).toBe(eternatus.getMaxHp()); expect(eternatus.status).toBeFalsy(); expect(eternatus.formIndex).toBe(1); expect(eternatus.bossSegments).toBe(5); expect(eternatus.bossSegmentIndex).toBe(4); - // should carry a mini black hole const miniBlackHole = eternatus.getHeldItems().find(m => m instanceof TurnHeldItemTransferModifier); expect(miniBlackHole).toBeDefined(); expect(miniBlackHole?.stackCount).toBe(1); diff --git a/src/test/utils/gameManager.ts b/src/test/utils/gameManager.ts index 0defe6f2ac5..52836fe0598 100644 --- a/src/test/utils/gameManager.ts +++ b/src/test/utils/gameManager.ts @@ -5,6 +5,7 @@ import { EnemyPokemon, PlayerPokemon } from "#app/field/pokemon"; import Trainer from "#app/field/trainer"; import { GameModes, getGameMode } from "#app/game-mode"; import { ModifierTypeOption, modifierTypes } from "#app/modifier/modifier-type"; +import overrides from "#app/overrides"; import { CommandPhase } from "#app/phases/command-phase"; import { EncounterPhase } from "#app/phases/encounter-phase"; import { FaintPhase } from "#app/phases/faint-phase"; @@ -144,22 +145,26 @@ export default class GameManager { * @param species * @param mode */ - async runToFinalBossEncounter(game: GameManager, species: Species[], mode: GameModes) { + async runToFinalBossEncounter(species: Species[], mode: GameModes) { console.log("===to final boss encounter==="); - await game.runToTitle(); + await this.runToTitle(); - game.onNextPrompt("TitlePhase", Mode.TITLE, () => { - game.scene.gameMode = getGameMode(mode); - const starters = generateStarter(game.scene, species); - const selectStarterPhase = new SelectStarterPhase(game.scene); - game.scene.pushPhase(new EncounterPhase(game.scene, false)); + this.onNextPrompt("TitlePhase", Mode.TITLE, () => { + this.scene.gameMode = getGameMode(mode); + const starters = generateStarter(this.scene, species); + const selectStarterPhase = new SelectStarterPhase(this.scene); + this.scene.pushPhase(new EncounterPhase(this.scene, false)); selectStarterPhase.initBattle(starters); }); // This will consider all battle entry dialog as seens and skip them - vi.spyOn(game.scene.ui, "shouldSkipDialogue").mockReturnValue(true); + vi.spyOn(this.scene.ui, "shouldSkipDialogue").mockReturnValue(true); - await game.phaseInterceptor.to(EncounterPhase, true); + if (overrides.OPP_HELD_ITEMS_OVERRIDE.length === 0) { + this.removeEnemyHeldItems(); + } + + await this.phaseInterceptor.to(EncounterPhase); console.log("===finished run to final boss encounter==="); }