[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:
parent
80a8c659ee
commit
1659f57262
|
@ -5925,15 +5925,107 @@ export class CopyBiomeTypeAttr extends MoveEffectAttr {
|
||||||
return false;
|
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.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;
|
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 {
|
export class ChangeTypeAttr extends MoveEffectAttr {
|
||||||
|
|
|
@ -224,66 +224,6 @@ export class Arena {
|
||||||
return 0;
|
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 {
|
getBgTerrainColorRatioForBiome(): number {
|
||||||
switch (this.biomeType) {
|
switch (this.biomeType) {
|
||||||
case Biome.SPACE:
|
case Biome.SPACE:
|
||||||
|
|
|
@ -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);
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue