[Bug] Fix Make It Rain not applying effect on KO (#2670)

This commit is contained in:
innerthunder 2024-06-27 16:52:13 -07:00 committed by GitHub
parent aa0d01f419
commit b2048148c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 33 additions and 1 deletions

View File

@ -5513,11 +5513,21 @@ const userSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target:
const targetSleptOrComatoseCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => target.status?.effect === StatusEffect.SLEEP || target.hasAbility(Abilities.COMATOSE);
/**
* Condition to apply effects only upon applying the move to its last target.
* Currently only used for Make It Rain.
* @param {Pokemon} user The user of the move.
* @param {Pokemon} target The current target of the move.
* @param {Move} move The move to which this condition applies.
* @returns true if the target is the last target to which the move applies.
*/
const lastTargetOnlyCondition: MoveConditionFunc = (user: Pokemon, target: Pokemon, move: Move) => {
const effectPhase = user.scene.getCurrentPhase();
const targetIndex = target.getFieldIndex() + (target.isPlayer() ? 0 : BattlerIndex.ENEMY);
if (effectPhase instanceof MoveEffectPhase) {
return target === effectPhase.getTargets().at(-1);
const activeTargets = effectPhase.getTargets();
return (activeTargets.length === 0 || targetIndex >= activeTargets.at(-1).getBattlerIndex());
}
return false;
};

View File

@ -6,6 +6,7 @@ import { Species } from "#enums/species";
import {
CommandPhase,
MoveEndPhase,
StatChangePhase,
} from "#app/phases";
import { Moves } from "#enums/moves";
import { getMovePosition } from "#app/test/utils/gameManagerUtils";
@ -57,4 +58,25 @@ describe("Moves - Make It Rain", () => {
expect(playerPokemon[0].summonData.battleStats[BattleStat.SPATK]).toBe(-1);
});
it("should apply effects even if the target faints", async () => {
vi.spyOn(overrides, "OPP_LEVEL_OVERRIDE", "get").mockReturnValue(1); // ensures the enemy will faint
vi.spyOn(overrides, "DOUBLE_BATTLE_OVERRIDE", "get").mockReturnValue(false);
vi.spyOn(overrides, "SINGLE_BATTLE_OVERRIDE", "get").mockReturnValue(true);
await game.startBattle([Species.CHARIZARD]);
const playerPokemon = game.scene.getPlayerPokemon();
expect(playerPokemon).toBeDefined();
const enemyPokemon = game.scene.getEnemyPokemon();
expect(enemyPokemon).toBeDefined();
game.doAttack(getMovePosition(game.scene, 0, Moves.MAKE_IT_RAIN));
await game.phaseInterceptor.to(StatChangePhase);
expect(enemyPokemon.isFainted()).toBe(true);
expect(playerPokemon.summonData.battleStats[BattleStat.SPATK]).toBe(-1);
});
});