[Move] Add Retaliate double damage condition (#1831)
* Add retaliate double damage condition * undo override changes * add death history and bug fix where retaliate didn't work after 10 turns * delete the unnecassary log * optimization * made some corrections * add retaliate test as draft * add retaliate test * Update src/test/moves/retaliate.test.ts (delete log) Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * remove submodule * Update src/test/moves/retaliate.test.ts Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> * update retaliate test * Update src/test/moves/retaliate.test.ts Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> * update unit test * remove wide lens for retaliate test * Update src/test/moves/retaliate.test.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/battle.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/test/moves/retaliate.test.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * Update src/test/moves/retaliate.test.ts Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> * optimization * Fix indentation * Use default values * Add parentheses for clarity * Update src/battle.ts Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> * Update src/battle.ts Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> * Update src/data/move.ts Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> * Update src/phases/faint-phase.ts Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> * Update src/phases/faint-phase.ts Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> * bug on import --------- Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com> Co-authored-by: schmidtc1 <62030095+schmidtc1@users.noreply.github.com> Co-authored-by: flx-sta <50131232+flx-sta@users.noreply.github.com>
This commit is contained in:
parent
91d266ea74
commit
8195373824
|
@ -1,5 +1,4 @@
|
||||||
import BattleScene from "./battle-scene";
|
import BattleScene from "./battle-scene";
|
||||||
import { EnemyPokemon, PlayerPokemon, QueuedMove } from "./field/pokemon";
|
|
||||||
import { Command } from "./ui/command-ui-handler";
|
import { Command } from "./ui/command-ui-handler";
|
||||||
import * as Utils from "./utils";
|
import * as Utils from "./utils";
|
||||||
import Trainer, { TrainerVariant } from "./field/trainer";
|
import Trainer, { TrainerVariant } from "./field/trainer";
|
||||||
|
@ -7,6 +6,7 @@ import { GameMode } from "./game-mode";
|
||||||
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
|
import { MoneyMultiplierModifier, PokemonHeldItemModifier } from "./modifier/modifier";
|
||||||
import { PokeballType } from "./data/pokeball";
|
import { PokeballType } from "./data/pokeball";
|
||||||
import { trainerConfigs } from "#app/data/trainer-config";
|
import { trainerConfigs } from "#app/data/trainer-config";
|
||||||
|
import Pokemon, { EnemyPokemon, PlayerPokemon, QueuedMove } from "#app/field/pokemon";
|
||||||
import { ArenaTagType } from "#enums/arena-tag-type";
|
import { ArenaTagType } from "#enums/arena-tag-type";
|
||||||
import { BattleSpec } from "#enums/battle-spec";
|
import { BattleSpec } from "#enums/battle-spec";
|
||||||
import { Moves } from "#enums/moves";
|
import { Moves } from "#enums/moves";
|
||||||
|
@ -38,6 +38,11 @@ export interface TurnCommand {
|
||||||
args?: any[];
|
args?: any[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface FaintLogEntry {
|
||||||
|
pokemon: Pokemon,
|
||||||
|
turn: number
|
||||||
|
}
|
||||||
|
|
||||||
interface TurnCommands {
|
interface TurnCommands {
|
||||||
[key: number]: TurnCommand | null
|
[key: number]: TurnCommand | null
|
||||||
}
|
}
|
||||||
|
@ -69,6 +74,8 @@ export default class Battle {
|
||||||
public playerFaints: number = 0;
|
public playerFaints: number = 0;
|
||||||
/** The number of times a Pokemon on the enemy's side has fainted this battle */
|
/** The number of times a Pokemon on the enemy's side has fainted this battle */
|
||||||
public enemyFaints: number = 0;
|
public enemyFaints: number = 0;
|
||||||
|
public playerFaintsHistory: FaintLogEntry[] = [];
|
||||||
|
public enemyFaintsHistory: FaintLogEntry[] = [];
|
||||||
|
|
||||||
private rngCounter: number = 0;
|
private rngCounter: number = 0;
|
||||||
|
|
||||||
|
|
|
@ -8024,7 +8024,15 @@ export function initMoves() {
|
||||||
new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
|
new StatusMove(Moves.REFLECT_TYPE, Type.NORMAL, -1, 15, -1, 0, 5)
|
||||||
.attr(CopyTypeAttr),
|
.attr(CopyTypeAttr),
|
||||||
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5)
|
new AttackMove(Moves.RETALIATE, Type.NORMAL, MoveCategory.PHYSICAL, 70, 100, 5, -1, 0, 5)
|
||||||
.partial(),
|
.attr(MovePowerMultiplierAttr, (user, target, move) => {
|
||||||
|
const turn = user.scene.currentBattle.turn;
|
||||||
|
const lastPlayerFaint = user.scene.currentBattle.playerFaintsHistory[user.scene.currentBattle.playerFaintsHistory.length - 1];
|
||||||
|
const lastEnemyFaint = user.scene.currentBattle.enemyFaintsHistory[user.scene.currentBattle.enemyFaintsHistory.length - 1];
|
||||||
|
return (
|
||||||
|
(lastPlayerFaint !== undefined && turn - lastPlayerFaint.turn === 1 && user.isPlayer()) ||
|
||||||
|
(lastEnemyFaint !== undefined && turn - lastEnemyFaint.turn === 1 && !user.isPlayer())
|
||||||
|
) ? 2 : 1;
|
||||||
|
}),
|
||||||
new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
|
new AttackMove(Moves.FINAL_GAMBIT, Type.FIGHTING, MoveCategory.SPECIAL, -1, 100, 5, -1, 0, 5)
|
||||||
.attr(UserHpDamageAttr)
|
.attr(UserHpDamageAttr)
|
||||||
.attr(SacrificialAttrOnHit),
|
.attr(SacrificialAttrOnHit),
|
||||||
|
|
|
@ -55,8 +55,10 @@ export class FaintPhase extends PokemonPhase {
|
||||||
// Track total times pokemon have been KO'd for supreme overlord/last respects
|
// Track total times pokemon have been KO'd for supreme overlord/last respects
|
||||||
if (pokemon.isPlayer()) {
|
if (pokemon.isPlayer()) {
|
||||||
this.scene.currentBattle.playerFaints += 1;
|
this.scene.currentBattle.playerFaints += 1;
|
||||||
|
this.scene.currentBattle.playerFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn });
|
||||||
} else {
|
} else {
|
||||||
this.scene.currentBattle.enemyFaints += 1;
|
this.scene.currentBattle.enemyFaints += 1;
|
||||||
|
this.scene.currentBattle.enemyFaintsHistory.push({ pokemon: pokemon, turn: this.scene.currentBattle.turn });
|
||||||
}
|
}
|
||||||
|
|
||||||
this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true);
|
this.scene.queueMessage(i18next.t("battle:fainted", { pokemonNameWithAffix: getPokemonNameWithAffix(pokemon) }), null, true);
|
||||||
|
|
|
@ -0,0 +1,49 @@
|
||||||
|
import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
|
||||||
|
import Phaser from "phaser";
|
||||||
|
import GameManager from "#app/test/utils/gameManager";
|
||||||
|
import { Species } from "#enums/species";
|
||||||
|
import { Moves } from "#enums/moves";
|
||||||
|
import { allMoves } from "#app/data/move";
|
||||||
|
|
||||||
|
describe("Moves - Retaliate", () => {
|
||||||
|
let phaserGame: Phaser.Game;
|
||||||
|
let game: GameManager;
|
||||||
|
|
||||||
|
const retaliate = allMoves[Moves.RETALIATE];
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
phaserGame = new Phaser.Game({
|
||||||
|
type: Phaser.HEADLESS,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
game.phaseInterceptor.restoreOg();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
game = new GameManager(phaserGame);
|
||||||
|
game.override
|
||||||
|
.battleType("single")
|
||||||
|
.enemySpecies(Species.SNORLAX)
|
||||||
|
.enemyMoveset([Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE, Moves.RETALIATE])
|
||||||
|
.enemyLevel(100)
|
||||||
|
.moveset([Moves.RETALIATE, Moves.SPLASH])
|
||||||
|
.startingLevel(80)
|
||||||
|
.disableCrits();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("increases power if ally died previous turn", async () => {
|
||||||
|
vi.spyOn(retaliate, "calculateBattlePower");
|
||||||
|
await game.startBattle([Species.ABRA, Species.COBALION]);
|
||||||
|
game.move.select(Moves.RETALIATE);
|
||||||
|
await game.phaseInterceptor.to("TurnEndPhase");
|
||||||
|
expect(retaliate.calculateBattlePower).toHaveLastReturnedWith(70);
|
||||||
|
game.doSelectPartyPokemon(1);
|
||||||
|
|
||||||
|
await game.toNextTurn();
|
||||||
|
game.move.select(Moves.RETALIATE);
|
||||||
|
await game.phaseInterceptor.to("MoveEffectPhase");
|
||||||
|
expect(retaliate.calculateBattlePower).toHaveReturnedWith(140);
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue