Apply Tera Shell to all hits for multi-hit moves

This commit is contained in:
innerthunder 2024-10-01 15:50:39 -07:00
parent 95386861bb
commit 01f3b00bc4
4 changed files with 30 additions and 0 deletions

View File

@ -519,6 +519,7 @@ export class FullHpResistTypeAbAttr extends PreDefendAbAttr {
if (pokemon.isFullHp() && typeMultiplier.value > 0.5) {
typeMultiplier.value = 0.5;
pokemon.turnData.moveEffectiveness = 0.5;
return true;
}
return false;

View File

@ -1538,6 +1538,9 @@ export default abstract class Pokemon extends Phaser.GameObjects.Container {
* @returns The type damage multiplier, indicating the effectiveness of the move
*/
getMoveEffectiveness(source: Pokemon, move: Move, ignoreAbility: boolean = false, simulated: boolean = true, cancelled?: Utils.BooleanHolder): TypeDamageMultiplier {
if (this.turnData.moveEffectiveness !== null) {
return this.turnData.moveEffectiveness;
}
if (move.hasAttr(TypelessAttr)) {
return 1;
}
@ -5019,6 +5022,7 @@ export class PokemonTurnData {
public order: number;
public statStagesIncreased: boolean = false;
public statStagesDecreased: boolean = false;
public moveEffectiveness: TypeDamageMultiplier | null = null;
}
export enum AiType {

View File

@ -360,6 +360,8 @@ export class MoveEffectPhase extends PokemonPhase {
this.scene.queueMessage(i18next.t("battle:attackHitsCount", { count: hitsTotal }));
}
this.scene.applyModifiers(HitHealModifier, this.player, user);
// Clear all cached move effectiveness values among targets
this.getTargets().forEach((target) => target.turnData.moveEffectiveness = null);
}
}

View File

@ -1,3 +1,4 @@
import { BattlerIndex } from "#app/battle";
import { Abilities } from "#app/enums/abilities";
import { Moves } from "#app/enums/moves";
import { Species } from "#app/enums/species";
@ -106,4 +107,26 @@ describe("Abilities - Tera Shell", () => {
expect(playerPokemon.hp).toBe(playerPokemon.getMaxHp() - 40);
}
);
it(
"should change the effectiveness of all strikes of a multi-strike move",
async () => {
game.override.enemyMoveset([Moves.DOUBLE_HIT]);
await game.classicMode.startBattle([Species.SNORLAX]);
const playerPokemon = game.scene.getPlayerPokemon()!;
vi.spyOn(playerPokemon, "apply");
game.move.select(Moves.SPLASH);
await game.setTurnOrder([BattlerIndex.ENEMY, BattlerIndex.PLAYER]);
await game.move.forceHit();
for (let i = 0; i < 2; i++) {
await game.phaseInterceptor.to("MoveEffectPhase");
expect(playerPokemon.apply).toHaveLastReturnedWith(HitResult.NOT_VERY_EFFECTIVE);
}
expect(playerPokemon.apply).toHaveReturnedTimes(2);
}
);
});