import { TurnEndPhase } from "#app/phases/turn-end-phase"; import * as Utils from "#app/utils"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; import GameManager from "#test/testUtils/gameManager"; import Phase from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Items - Leek", () => { let phaserGame: Phaser.Game; let game: GameManager; beforeAll(() => { phaserGame = new Phase.Game({ type: Phaser.HEADLESS, }); }); afterEach(() => { game.phaseInterceptor.restoreOg(); }); beforeEach(() => { game = new GameManager(phaserGame); game.override .enemySpecies(Species.MAGIKARP) .enemyMoveset([ Moves.SPLASH, Moves.SPLASH, Moves.SPLASH, Moves.SPLASH ]) .startingHeldItems([{ name: "LEEK" }]) .moveset([ Moves.TACKLE ]) .disableCrits() .battleType("single"); }); it("should raise CRIT stage by 2 when held by FARFETCHD", async () => { await game.startBattle([ Species.FARFETCHD ]); const enemyMember = game.scene.getEnemyPokemon()!; vi.spyOn(enemyMember, "getCritStage"); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); expect(enemyMember.getCritStage).toHaveReturnedWith(2); }, 20000); it("should raise CRIT stage by 2 when held by GALAR_FARFETCHD", async () => { await game.startBattle([ Species.GALAR_FARFETCHD ]); const enemyMember = game.scene.getEnemyPokemon()!; vi.spyOn(enemyMember, "getCritStage"); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); expect(enemyMember.getCritStage).toHaveReturnedWith(2); }, 20000); it("should raise CRIT stage by 2 when held by SIRFETCHD", async () => { await game.startBattle([ Species.SIRFETCHD ]); const enemyMember = game.scene.getEnemyPokemon()!; vi.spyOn(enemyMember, "getCritStage"); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); expect(enemyMember.getCritStage).toHaveReturnedWith(2); }, 20000); it("should raise CRIT stage by 2 when held by FARFETCHD line fused with Pokemon", async () => { // Randomly choose from the Farfetch'd line const species = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; await game.startBattle([ species[Utils.randInt(species.length)], Species.PIKACHU, ]); const [ partyMember, ally ] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; partyMember.fusionFormIndex = ally.formIndex; partyMember.fusionAbilityIndex = ally.abilityIndex; partyMember.fusionShiny = ally.shiny; partyMember.fusionVariant = ally.variant; partyMember.fusionGender = ally.gender; partyMember.fusionLuck = ally.luck; const enemyMember = game.scene.getEnemyPokemon()!; vi.spyOn(enemyMember, "getCritStage"); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); expect(enemyMember.getCritStage).toHaveReturnedWith(2); }, 20000); it("should raise CRIT stage by 2 when held by Pokemon fused with FARFETCHD line", async () => { // Randomly choose from the Farfetch'd line const species = [ Species.FARFETCHD, Species.GALAR_FARFETCHD, Species.SIRFETCHD ]; await game.startBattle([ Species.PIKACHU, species[Utils.randInt(species.length)] ]); const [ partyMember, ally ] = game.scene.getPlayerParty(); // Fuse party members (taken from PlayerPokemon.fuse(...) function) partyMember.fusionSpecies = ally.species; partyMember.fusionFormIndex = ally.formIndex; partyMember.fusionAbilityIndex = ally.abilityIndex; partyMember.fusionShiny = ally.shiny; partyMember.fusionVariant = ally.variant; partyMember.fusionGender = ally.gender; partyMember.fusionLuck = ally.luck; const enemyMember = game.scene.getEnemyPokemon()!; vi.spyOn(enemyMember, "getCritStage"); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); expect(enemyMember.getCritStage).toHaveReturnedWith(2); }, 20000); it("should not raise CRIT stage when held by a Pokemon outside of FARFETCHD line", async () => { await game.startBattle([ Species.PIKACHU ]); const enemyMember = game.scene.getEnemyPokemon()!; vi.spyOn(enemyMember, "getCritStage"); game.move.select(Moves.TACKLE); await game.phaseInterceptor.to(TurnEndPhase); expect(enemyMember.getCritStage).toHaveReturnedWith(0); }, 20000); });