mirror of
https://github.com/pagefaultgames/pokerogue.git
synced 2025-08-19 13:59:27 +02:00
implement corrosive gas
This commit is contained in:
parent
7a0c88e661
commit
9b1689451a
@ -2374,8 +2374,10 @@ export class RemoveHeldItemAttr extends MoveEffectAttr {
|
|||||||
* @returns {boolean} True if an item was removed
|
* @returns {boolean} True if an item was removed
|
||||||
*/
|
*/
|
||||||
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
apply(user: Pokemon, target: Pokemon, move: Move, args: any[]): boolean {
|
||||||
if (!this.berriesOnly && target.isPlayer()) { // "Wild Pokemon cannot knock off Player Pokemon's held items" (See Bulbapedia)
|
if (move.id !== Moves.CORROSIVE_GAS) {
|
||||||
return false;
|
if (!this.berriesOnly && target.isPlayer()) { // "Wild Pokemon cannot knock off Player Pokemon's held items" (See Bulbapedia)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (move.hitsSubstitute(user, target)) {
|
if (move.hitsSubstitute(user, target)) {
|
||||||
@ -2407,6 +2409,8 @@ export class RemoveHeldItemAttr extends MoveEffectAttr {
|
|||||||
|
|
||||||
if (this.berriesOnly) {
|
if (this.berriesOnly) {
|
||||||
user.scene.queueMessage(i18next.t("moveTriggers:incineratedItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name }));
|
user.scene.queueMessage(i18next.t("moveTriggers:incineratedItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name }));
|
||||||
|
} else if (move.id === Moves.CORROSIVE_GAS) {
|
||||||
|
user.scene.queueMessage(i18next.t("moveTriggers:corrosiveGasItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name }));
|
||||||
} else {
|
} else {
|
||||||
user.scene.queueMessage(i18next.t("moveTriggers:knockedOffItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name }));
|
user.scene.queueMessage(i18next.t("moveTriggers:knockedOffItem", { pokemonName: getPokemonNameWithAffix(user), targetName: getPokemonNameWithAffix(target), itemName: removedItem.type.name }));
|
||||||
}
|
}
|
||||||
@ -10034,7 +10038,7 @@ export function initMoves() {
|
|||||||
.makesContact(false),
|
.makesContact(false),
|
||||||
new StatusMove(Moves.CORROSIVE_GAS, Type.POISON, 100, 40, -1, 0, 8)
|
new StatusMove(Moves.CORROSIVE_GAS, Type.POISON, 100, 40, -1, 0, 8)
|
||||||
.target(MoveTarget.ALL_NEAR_OTHERS)
|
.target(MoveTarget.ALL_NEAR_OTHERS)
|
||||||
.unimplemented(),
|
.attr(RemoveHeldItemAttr, false),
|
||||||
new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8)
|
new StatusMove(Moves.COACHING, Type.FIGHTING, -1, 10, -1, 0, 8)
|
||||||
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1)
|
.attr(StatStageChangeAttr, [ Stat.ATK, Stat.DEF ], 1)
|
||||||
.target(MoveTarget.NEAR_ALLY),
|
.target(MoveTarget.NEAR_ALLY),
|
||||||
|
110
src/test/moves/corrosive_gas.test.ts
Normal file
110
src/test/moves/corrosive_gas.test.ts
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
import { Moves } from "#enums/moves";
|
||||||
|
import { Species } from "#enums/species";
|
||||||
|
import GameManager from "#test/utils/gameManager";
|
||||||
|
import Phaser from "phaser";
|
||||||
|
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
|
||||||
|
|
||||||
|
describe("Moves - Corrosive Gas", () => {
|
||||||
|
let phaserGame: Phaser.Game;
|
||||||
|
let game: GameManager;
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
phaserGame = new Phaser.Game({
|
||||||
|
type: Phaser.HEADLESS,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
game.phaseInterceptor.restoreOg();
|
||||||
|
});
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
game = new GameManager(phaserGame);
|
||||||
|
game.override
|
||||||
|
.moveset([ Moves.SPLASH, Moves.CORROSIVE_GAS ])
|
||||||
|
.battleType("double")
|
||||||
|
.enemySpecies(Species.MAGIKARP)
|
||||||
|
.enemyMoveset(Moves.SPLASH);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should remove enemy and player items", async () => {
|
||||||
|
game.override
|
||||||
|
.enemyHeldItems([
|
||||||
|
{ name: "SOUL_DEW", count: 1 },
|
||||||
|
{ name: "LUCKY_EGG", count: 1 },
|
||||||
|
{ name: "LEFTOVERS", count: 1 },
|
||||||
|
{ name: "GRIP_CLAW", count: 1 },
|
||||||
|
{ name: "MULTI_LENS", count: 1 },
|
||||||
|
])
|
||||||
|
.startingHeldItems(
|
||||||
|
[
|
||||||
|
{ name: "SOUL_DEW", count: 1 },
|
||||||
|
{ name: "LUCKY_EGG", count: 1 },
|
||||||
|
{ name: "LEFTOVERS", count: 1 },
|
||||||
|
{ name: "GRIP_CLAW", count: 1 },
|
||||||
|
{ name: "MULTI_LENS", count: 1 },
|
||||||
|
]
|
||||||
|
);
|
||||||
|
await game.classicMode.startBattle([ Species.STAKATAKA, Species.SALAZZLE ]);
|
||||||
|
const playerPokemon = game.scene.getPlayerField()!;
|
||||||
|
const enemyPokemon = game.scene.getEnemyField()!;
|
||||||
|
|
||||||
|
const staka = playerPokemon[0];
|
||||||
|
const salazzle = playerPokemon[1];
|
||||||
|
const karp1 = enemyPokemon[0];
|
||||||
|
const karp2 = enemyPokemon[1];
|
||||||
|
|
||||||
|
const stakaHeldItemCt = staka.getHeldItems().length;
|
||||||
|
const salazzleHeldItemCt = salazzle.getHeldItems().length;
|
||||||
|
const magikarpItemCt1 = karp1.getHeldItems().length;
|
||||||
|
const magikarpItemCt2 = karp2.getHeldItems().length;
|
||||||
|
|
||||||
|
game.move.select(Moves.SPLASH);
|
||||||
|
game.move.select(Moves.CORROSIVE_GAS);
|
||||||
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
|
|
||||||
|
expect(salazzle.getHeldItems().length).toEqual(salazzleHeldItemCt);
|
||||||
|
expect(staka.getHeldItems().length).toBeLessThan(stakaHeldItemCt);
|
||||||
|
expect(karp1.getHeldItems().length).toBeLessThan(magikarpItemCt1);
|
||||||
|
expect(karp2.getHeldItems().length).toBeLessThan(magikarpItemCt2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not remove untransferrable items", async () => {
|
||||||
|
game.override
|
||||||
|
.enemyMoveset(Moves.CORROSIVE_GAS)
|
||||||
|
.enemyHeldItems([
|
||||||
|
{ name: "BASE_STAT_BOOSTER", count: 1 },
|
||||||
|
{ name: "TEMP_STAT_STAGE_BOOSTER", count: 1 }
|
||||||
|
])
|
||||||
|
.startingHeldItems(
|
||||||
|
[
|
||||||
|
{ name: "FORM_CHANGE_ITEM", count: 1 },
|
||||||
|
{ name: "BASE_STAT_BOOSTER", count: 1 },
|
||||||
|
{ name: "TEMP_STAT_STAGE_BOOSTER", count: 1 }
|
||||||
|
]
|
||||||
|
);
|
||||||
|
await game.classicMode.startBattle([ Species.GIRATINA, Species.AGGRON ]);
|
||||||
|
const playerPokemon = game.scene.getPlayerField()!;
|
||||||
|
const enemyPokemon = game.scene.getEnemyField()!;
|
||||||
|
|
||||||
|
const giratina = playerPokemon[0];
|
||||||
|
const aggron = playerPokemon[1];
|
||||||
|
const karp1 = enemyPokemon[0];
|
||||||
|
const karp2 = enemyPokemon[1];
|
||||||
|
|
||||||
|
const giratinaHeldItemCt = giratina.getHeldItems().length;
|
||||||
|
const aggronHeldItemCt = aggron.getHeldItems().length;
|
||||||
|
const magikarpItemCt1 = karp1.getHeldItems().length;
|
||||||
|
const magikarpItemCt2 = karp2.getHeldItems().length;
|
||||||
|
|
||||||
|
game.move.select(Moves.SPLASH);
|
||||||
|
game.move.select(Moves.SPLASH);
|
||||||
|
await game.phaseInterceptor.to("BerryPhase");
|
||||||
|
|
||||||
|
expect(giratina.getHeldItems().length).toEqual(giratinaHeldItemCt);
|
||||||
|
expect(aggron.getHeldItems().length).toEqual(aggronHeldItemCt);
|
||||||
|
expect(karp1.getHeldItems().length).toEqual(magikarpItemCt1);
|
||||||
|
expect(karp2.getHeldItems().length).toEqual(magikarpItemCt2);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user