[P2] Camouflage now considers Terrains first (#4761)

* the fix... will maybe write a test later

* ughh

* made a test

* moved aorund function

* Update src/test/moves/camouflage.test.ts

Co-authored-by: PigeonBar <56974298+PigeonBar@users.noreply.github.com>

* lalal

---------

Co-authored-by: frutescens <info@laptop>
Co-authored-by: PigeonBar <56974298+PigeonBar@users.noreply.github.com>
This commit is contained in:
Mumble 2024-11-02 09:48:10 -07:00 committed by GitHub
parent 80a8c659ee
commit 1659f57262
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 144 additions and 63 deletions

View File

@ -5925,15 +5925,107 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr {
return false;
}
const biomeType = user.scene.arena.getTypeForBiome();
const terrainType = user.scene.arena.getTerrainType();
let typeChange: Type;
if (terrainType !== TerrainType.NONE) {
typeChange = this.getTypeForTerrain(user.scene.arena.getTerrainType());
} else {
typeChange = this.getTypeForBiome(user.scene.arena.biomeType);
}
user.summonData.types = [ biomeType ];
user.summonData.types = [ typeChange ];
user.updateInfo();
user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${Type[biomeType]}`) }));
user.scene.queueMessage(i18next.t("moveTriggers:transformedIntoType", { pokemonName: getPokemonNameWithAffix(user), typeName: i18next.t(`pokemonInfo:Type.${Type[typeChange]}`) }));
return true;
}
/**
* Retrieves a type from the current terrain
* @param terrainType {@linkcode TerrainType}
* @returns {@linkcode Type}
*/
private getTypeForTerrain(terrainType: TerrainType): Type {
switch (terrainType) {
case TerrainType.ELECTRIC:
return Type.ELECTRIC;
case TerrainType.MISTY:
return Type.FAIRY;
case TerrainType.GRASSY:
return Type.GRASS;
case TerrainType.PSYCHIC:
return Type.PSYCHIC;
case TerrainType.NONE:
default:
return Type.UNKNOWN;
}
}
/**
* Retrieves a type from the current biome
* @param biomeType {@linkcode Biome}
* @returns {@linkcode Type}
*/
private getTypeForBiome(biomeType: Biome): Type {
switch (biomeType) {
case Biome.TOWN:
case Biome.PLAINS:
case Biome.METROPOLIS:
return Type.NORMAL;
case Biome.GRASS:
case Biome.TALL_GRASS:
return Type.GRASS;
case Biome.FOREST:
case Biome.JUNGLE:
return Type.BUG;
case Biome.SLUM:
case Biome.SWAMP:
return Type.POISON;
case Biome.SEA:
case Biome.BEACH:
case Biome.LAKE:
case Biome.SEABED:
return Type.WATER;
case Biome.MOUNTAIN:
return Type.FLYING;
case Biome.BADLANDS:
return Type.GROUND;
case Biome.CAVE:
case Biome.DESERT:
return Type.ROCK;
case Biome.ICE_CAVE:
case Biome.SNOWY_FOREST:
return Type.ICE;
case Biome.MEADOW:
case Biome.FAIRY_CAVE:
case Biome.ISLAND:
return Type.FAIRY;
case Biome.POWER_PLANT:
return Type.ELECTRIC;
case Biome.VOLCANO:
return Type.FIRE;
case Biome.GRAVEYARD:
case Biome.TEMPLE:
return Type.GHOST;
case Biome.DOJO:
case Biome.CONSTRUCTION_SITE:
return Type.FIGHTING;
case Biome.FACTORY:
case Biome.LABORATORY:
return Type.STEEL;
case Biome.RUINS:
case Biome.SPACE:
return Type.PSYCHIC;
case Biome.WASTELAND:
case Biome.END:
return Type.DRAGON;
case Biome.ABYSS:
return Type.DARK;
default:
return Type.UNKNOWN;
}
}
}
export class ChangeTypeAttr extends MoveEffectAttr {

View File

@ -224,66 +224,6 @@ export class Arena {
return 0;
}
getTypeForBiome() {
switch (this.biomeType) {
case Biome.TOWN:
case Biome.PLAINS:
case Biome.METROPOLIS:
return Type.NORMAL;
case Biome.GRASS:
case Biome.TALL_GRASS:
return Type.GRASS;
case Biome.FOREST:
case Biome.JUNGLE:
return Type.BUG;
case Biome.SLUM:
case Biome.SWAMP:
return Type.POISON;
case Biome.SEA:
case Biome.BEACH:
case Biome.LAKE:
case Biome.SEABED:
return Type.WATER;
case Biome.MOUNTAIN:
return Type.FLYING;
case Biome.BADLANDS:
return Type.GROUND;
case Biome.CAVE:
case Biome.DESERT:
return Type.ROCK;
case Biome.ICE_CAVE:
case Biome.SNOWY_FOREST:
return Type.ICE;
case Biome.MEADOW:
case Biome.FAIRY_CAVE:
case Biome.ISLAND:
return Type.FAIRY;
case Biome.POWER_PLANT:
return Type.ELECTRIC;
case Biome.VOLCANO:
return Type.FIRE;
case Biome.GRAVEYARD:
case Biome.TEMPLE:
return Type.GHOST;
case Biome.DOJO:
case Biome.CONSTRUCTION_SITE:
return Type.FIGHTING;
case Biome.FACTORY:
case Biome.LABORATORY:
return Type.STEEL;
case Biome.RUINS:
case Biome.SPACE:
return Type.PSYCHIC;
case Biome.WASTELAND:
case Biome.END:
return Type.DRAGON;
case Biome.ABYSS:
return Type.DARK;
default:
return Type.UNKNOWN;
}
}
getBgTerrainColorRatioForBiome(): number {
switch (this.biomeType) {
case Biome.SPACE:

View File

@ -0,0 +1,49 @@
import { Abilities } from "#enums/abilities";
import { Moves } from "#enums/moves";
import { Species } from "#enums/species";
import { TerrainType } from "#app/data/terrain";
import { Type } from "#app/data/type";
import { BattlerIndex } from "#app/battle";
import GameManager from "#test/utils/gameManager";
import Phaser from "phaser";
import { afterEach, beforeAll, beforeEach, describe, expect, it } from "vitest";
describe("Moves - Camouflage", () => {
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.CAMOUFLAGE ])
.ability(Abilities.BALL_FETCH)
.battleType("single")
.disableCrits()
.enemySpecies(Species.REGIELEKI)
.enemyAbility(Abilities.BALL_FETCH)
.enemyMoveset(Moves.PSYCHIC_TERRAIN);
});
it("Camouflage should look at terrain first when selecting a type to change into", async () => {
await game.classicMode.startBattle([ Species.SHUCKLE ]);
const playerPokemon = game.scene.getPlayerPokemon()!;
game.move.select(Moves.CAMOUFLAGE);
await game.setTurnOrder([ BattlerIndex.ENEMY, BattlerIndex.PLAYER ]);
await game.phaseInterceptor.to("BerryPhase");
expect(game.scene.arena.getTerrainType()).toBe(TerrainType.PSYCHIC);
const pokemonType = playerPokemon.getTypes()[0];
expect(pokemonType).toBe(Type.PSYCHIC);
});
});