From aaef47bc7d0ad296f93b15d1f22f7b29b6f45734 Mon Sep 17 00:00:00 2001 From: Michael Li Date: Mon, 2 Dec 2024 08:23:28 -0500 Subject: [PATCH] [P1 Bug] Fix multi lens granting infinite Future Sight hits --- src/phases/move-effect-phase.ts | 6 ++++-- src/test/abilities/parental_bond.test.ts | 24 ++++++++++++++++++++++-- src/test/items/multi_lens.test.ts | 22 +++++++++++++++++++++- 3 files changed, 47 insertions(+), 5 deletions(-) diff --git a/src/phases/move-effect-phase.ts b/src/phases/move-effect-phase.ts index 96ded602b30..d08fc46e563 100644 --- a/src/phases/move-effect-phase.ts +++ b/src/phases/move-effect-phase.ts @@ -56,7 +56,7 @@ import { PokemonMultiHitModifier, } from "#app/modifier/modifier"; import { PokemonPhase } from "#app/phases/pokemon-phase"; -import { BooleanHolder, executeIf, NumberHolder } from "#app/utils"; +import { BooleanHolder, executeIf, isNullOrUndefined, NumberHolder } from "#app/utils"; import { BattlerTagType } from "#enums/battler-tag-type"; import { Moves } from "#enums/moves"; import i18next from "i18next"; @@ -106,7 +106,9 @@ export class MoveEffectPhase extends PokemonPhase { */ return super.end(); } - user.resetTurnData(); + if (isNullOrUndefined(user.turnData)) { + user.resetTurnData(); + } } } diff --git a/src/test/abilities/parental_bond.test.ts b/src/test/abilities/parental_bond.test.ts index 6790e7e632c..a816ad3ac4b 100644 --- a/src/test/abilities/parental_bond.test.ts +++ b/src/test/abilities/parental_bond.test.ts @@ -1,5 +1,5 @@ import { Type } from "#enums/type"; -import { BattlerTagType } from "#app/enums/battler-tag-type"; +import { BattlerTagType } from "#enums/battler-tag-type"; import { toDmgValue } from "#app/utils"; import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; @@ -8,7 +8,7 @@ import { Stat } from "#enums/stat"; import { StatusEffect } from "#enums/status-effect"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; -import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; describe("Abilities - Parental Bond", () => { @@ -470,4 +470,24 @@ describe("Abilities - Parental Bond", () => { expect(enemyPokemon.getStatStage(Stat.SPATK)).toBe(1); } ); + + it("should cause Future Sight to hit exactly twice if the user switches out", async () => { + game.override.enemyLevel(1000) + .moveset(Moves.FUTURE_SIGHT); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "damageAndUpdate"); + + game.move.select(Moves.FUTURE_SIGHT); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + game.doSwitchPokemon(2); + await game.toNextTurn(); + + expect(enemyPokemon.damageAndUpdate).toHaveBeenCalledTimes(2); + }); }); diff --git a/src/test/items/multi_lens.test.ts b/src/test/items/multi_lens.test.ts index f4b4c5712ee..d5257570744 100644 --- a/src/test/items/multi_lens.test.ts +++ b/src/test/items/multi_lens.test.ts @@ -24,7 +24,7 @@ describe("Items - Multi Lens", () => { beforeEach(() => { game = new GameManager(phaserGame); game.override - .moveset([ Moves.TACKLE, Moves.TRAILBLAZE, Moves.TACHYON_CUTTER ]) + .moveset([ Moves.TACKLE, Moves.TRAILBLAZE, Moves.TACHYON_CUTTER, Moves.FUTURE_SIGHT ]) .ability(Abilities.BALL_FETCH) .startingHeldItems([{ name: "MULTI_LENS" }]) .battleType("single") @@ -170,6 +170,7 @@ describe("Items - Multi Lens", () => { await game.phaseInterceptor.to("MoveEndPhase"); expect(enemyPokemon.getHpRatio()).toBeCloseTo(0.5, 5); }); + it("should result in correct damage for hp% attacks with 2 lenses + Parental Bond", async () => { game.override.startingHeldItems([{ name: "MULTI_LENS", count: 2 }]) .moveset(Moves.SUPER_FANG) @@ -188,4 +189,23 @@ describe("Items - Multi Lens", () => { await game.phaseInterceptor.to("MoveEndPhase"); expect(enemyPokemon.getHpRatio()).toBeCloseTo(0.25, 5); }); + + it("should cause Future Sight to hit exactly twice if the user switches out", async () => { + game.override.enemyLevel(1000); + await game.classicMode.startBattle([ Species.BULBASAUR, Species.CHARMANDER, Species.SQUIRTLE ]); + + const enemyPokemon = game.scene.getEnemyPokemon()!; + vi.spyOn(enemyPokemon, "damageAndUpdate"); + + game.move.select(Moves.FUTURE_SIGHT); + await game.toNextTurn(); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + game.doSwitchPokemon(2); + await game.toNextTurn(); + + expect(enemyPokemon.damageAndUpdate).toHaveBeenCalledTimes(2); + }); });