Fixed Protect test failure

god i hate interacting with the spaghetti that is `MoveEffectPhase` but it's done
This commit is contained in:
Bertie690 2024-11-18 10:45:19 -05:00
parent 3657b3e208
commit 7e69a795b5
2 changed files with 12 additions and 8 deletions

View File

@ -6646,7 +6646,11 @@ export class CopyMoveAttr extends OverrideMoveEffectAttr {
* *
* Used for [Instruct](https://bulbapedia.bulbagarden.net/wiki/Instruct_(move)). * Used for [Instruct](https://bulbapedia.bulbagarden.net/wiki/Instruct_(move)).
*/ */
export class RepeatMoveAttr extends OverrideMoveEffectAttr { export class RepeatMoveAttr extends MoveEffectAttr {
constructor() {
super(false, { trigger: MoveEffectTrigger.POST_APPLY }); // needed to ensure correct protect interaction
}
/** /**
* Forces the target to re-use their last used move again * Forces the target to re-use their last used move again
* *
@ -6669,7 +6673,6 @@ export class RepeatMoveAttr extends OverrideMoveEffectAttr {
target.getMoveQueue().unshift({ move: lastMove.move, targets: moveTargets, ignorePP: false }); target.getMoveQueue().unshift({ move: lastMove.move, targets: moveTargets, ignorePP: false });
target.turnData.extraTurns++; target.turnData.extraTurns++;
target.scene.appendToPhase(new MovePhase(target.scene, target, moveTargets, movesetMove), MoveEndPhase); target.scene.appendToPhase(new MovePhase(target.scene, target, moveTargets, movesetMove), MoveEndPhase);
return true; return true;
} }
@ -6732,7 +6735,7 @@ export class RepeatMoveAttr extends OverrideMoveEffectAttr {
Moves.TRANSFORM, Moves.TRANSFORM,
Moves.MIMIC, Moves.MIMIC,
Moves.STRUGGLE, Moves.STRUGGLE,
// TODO: Add Z-move & Max Move blockage if/when they are implemented // TODO: Add Max/G-Move blockage if or when they are implemented
]; ];
if (!movesetMove // called move not in target's moveset (dancer, forgetting the move, etc.) if (!movesetMove // called move not in target's moveset (dancer, forgetting the move, etc.)
@ -6751,10 +6754,8 @@ export class RepeatMoveAttr extends OverrideMoveEffectAttr {
/* Ideally, the AI would score instruct based on the scorings of the on-field pokemons' /* Ideally, the AI would score instruct based on the scorings of the on-field pokemons'
* last used moves at the time of using Instruct (by the time the instructor gets to act) * last used moves at the time of using Instruct (by the time the instructor gets to act)
* with respect to the user's side. * with respect to the user's side.
* It would then take the greatest of said scores and use it as the score for instruct
* (since that'd be the mon it would be most utile to use Instruct on).
* In 99.9% of cases, this would be the pokemon's ally (unless the target had last * In 99.9% of cases, this would be the pokemon's ally (unless the target had last
* used a move like decorate on the user or its ally) * used a move like Decorate on the user or its ally)
*/ */
return 2; return 2;
} }

View File

@ -197,13 +197,16 @@ describe("Moves - Instruct", () => {
it("should not repeat enemy's move through protect", async () => { it("should not repeat enemy's move through protect", async () => {
await game.classicMode.startBattle([ Species.AMOONGUSS ]); await game.classicMode.startBattle([ Species.AMOONGUSS ]);
const MoveToUse = Moves.PROTECT;
const enemyPokemon = game.scene.getEnemyPokemon()!; const enemyPokemon = game.scene.getEnemyPokemon()!;
game.move.changeMoveset(enemyPokemon, Moves.PROTECT); game.move.changeMoveset(enemyPokemon, MoveToUse);
game.move.select(Moves.INSTRUCT); game.move.select(Moves.INSTRUCT);
await game.forceEnemyMove(Moves.PROTECT); await game.forceEnemyMove(Moves.PROTECT);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to("TurnEndPhase", false); await game.phaseInterceptor.to("TurnEndPhase", false);
expect(enemyPokemon.getLastXMoves()[0].move).toBe(Moves.PROTECT); expect(enemyPokemon.getLastXMoves(-1)[0].move).toBe(Moves.PROTECT);
expect(enemyPokemon.getLastXMoves(-1)[1]).toBeUndefined(); // undefined because protect failed
expect(enemyPokemon.getMoveset().find(m => m?.moveId === Moves.PROTECT)?.ppUsed).toBe(1); expect(enemyPokemon.getMoveset().find(m => m?.moveId === Moves.PROTECT)?.ppUsed).toBe(1);
}); });