diff --git a/src/data/ability.ts b/src/data/ability.ts index c0b412a0249..f786754bbf0 100644 --- a/src/data/ability.ts +++ b/src/data/ability.ts @@ -4693,28 +4693,24 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { } const currentTerrain = pokemon.scene.arena.getTerrainType(); const typeChange: Type[] = []; - let isRevert: boolean = false; - if (currentTerrain !== TerrainType.NONE) { - switch (currentTerrain) { - case TerrainType.ELECTRIC: - typeChange.push(Type.ELECTRIC); - break; - case TerrainType.MISTY: - typeChange.push(Type.FAIRY); - break; - case TerrainType.GRASSY: - typeChange.push(Type.GRASS); - break; - case TerrainType.PSYCHIC: - typeChange.push(Type.PSYCHIC); - break; - default: - pokemon.getTypes(false, false, true).forEach(t => { - typeChange.push(t); - }); - isRevert = true; - break; - } + switch (currentTerrain) { + case TerrainType.ELECTRIC: + typeChange.push(Type.ELECTRIC); + break; + case TerrainType.MISTY: + typeChange.push(Type.FAIRY); + break; + case TerrainType.GRASSY: + typeChange.push(Type.GRASS); + break; + case TerrainType.PSYCHIC: + typeChange.push(Type.PSYCHIC); + break; + default: + pokemon.getTypes(false, false, true).forEach(t => { + typeChange.push(t); + }); + break; } if (typeChange.length !== 0) { if (pokemon.summonData.addedType && typeChange.includes(pokemon.summonData.addedType)) { @@ -4725,15 +4721,22 @@ export class TerrainEventTypeChangeAbAttr extends PostSummonAbAttr { } let message: string = ""; const pokemonName = getPokemonNameWithAffix(pokemon); - if (isRevert) { + if (currentTerrain === TerrainType.NONE) { message = i18next.t("abilityTriggers:pokemonTypeChangeRevert", { pokemonNameWithAffix: pokemonName }); } else { const typeName = i18next.t(`pokemonInfo:Type.${Type[typeChange[0]]})`); - message = i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix: pokemonName, typeName: typeName }); + message = i18next.t("abilityTriggers:pokemonTypeChange", { pokemonNameWithAffix: pokemonName, moveType: typeName }); } pokemon.scene.queueMessage(message); return true; } + + applyPostSummon(pokemon: Pokemon, passive: boolean, simulated: boolean, args: any[]): boolean | Promise { + if (pokemon.scene.arena.getTerrainType() !== TerrainType.NONE) { + return this.apply(pokemon, passive, simulated, new Utils.BooleanHolder(false), []); + } + return false; + } } async function applyAbAttrsInternal( diff --git a/src/test/abilities/mimicry.test.ts b/src/test/abilities/mimicry.test.ts index a067665e0b5..3b442491d36 100644 --- a/src/test/abilities/mimicry.test.ts +++ b/src/test/abilities/mimicry.test.ts @@ -1,6 +1,7 @@ import { Abilities } from "#enums/abilities"; import { Moves } from "#enums/moves"; import { Species } from "#enums/species"; +import { Type } from "#app/data/type"; import GameManager from "#test/utils/gameManager"; import Phaser from "phaser"; import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest"; @@ -23,20 +24,52 @@ describe("Abilities - Mimicry", () => { game = new GameManager(phaserGame); game.override .moveset([ Moves.SPLASH ]) - .ability(Abilities.BALL_FETCH) + .ability(Abilities.MIMICRY) .battleType("single") .disableCrits() .enemySpecies(Species.MAGIKARP) - .enemyAbility(Abilities.BALL_FETCH) .enemyMoveset(Moves.SPLASH); }); - it("should do X", async () => { - await game.classicMode.startBattle([ Species.FEEBAS ]); + // List of Tests (Work in Progress) + // Pokemon should return to original root type even when transformed when terrain ends + // The effect of Forest's Curse is removed when Mimicry activates in Grassy Terrain + it("Mimicry activates after the Pokémon with Mimicry is switched in while terrain is present, or whenever there is a change in terrain", async () => { + game.override.enemyAbility(Abilities.MISTY_SURGE); + await game.classicMode.startBattle([ Species.FEEBAS, Species.ABRA ]); + + const playerPokemon1 = game.scene.getPlayerPokemon(); + game.move.select(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon1?.getTypes().includes(Type.FAIRY)).toBe(true); + + game.doSwitchPokemon(1); + await game.toNextTurn(); + + const playerPokemon2 = game.scene.getPlayerPokemon(); + expect(playerPokemon2?.getTypes().includes(Type.FAIRY)).toBe(true); + }); + + it("Pokemon should revert back to its original, root type once terrain ends", async () => { + game.override + .moveset([ Moves.SPLASH, Moves.TRANSFORM ]) + .enemyAbility(Abilities.MIMICRY) + .enemyMoveset([ Moves.SPLASH, Moves.PSYCHIC_TERRAIN ]); + await game.classicMode.startBattle([ Species.REGIELEKI ]); + + const playerPokemon1 = game.scene.getPlayerPokemon(); + game.move.select(Moves.TRANSFORM); + await game.forceEnemyMove(Moves.PSYCHIC_TERRAIN); + await game.toNextTurn(); + expect(playerPokemon1?.getTypes().includes(Type.PSYCHIC)).toBe(true); + + if (game.scene.arena.terrain) { + game.scene.arena.terrain.turnsLeft = 1; + } game.move.select(Moves.SPLASH); - await game.phaseInterceptor.to("BerryPhase"); - - expect(true).toBe(true); + await game.forceEnemyMove(Moves.SPLASH); + await game.toNextTurn(); + expect(playerPokemon1?.getTypes().includes(Type.ELECTRIC)).toBe(true); }); });