Add Psychic Terrain priority block effect and terrain messages

This commit is contained in:
Flashfyre 2024-03-18 18:03:13 -04:00
parent 47a51c9958
commit aa1e1a480f
4 changed files with 49 additions and 10 deletions

View File

@ -1,3 +1,4 @@
import Move from "./move";
import { Type } from "./type"; import { Type } from "./type";
export enum TerrainType { export enum TerrainType {
@ -42,6 +43,15 @@ export class Terrain {
return 1; return 1;
} }
isMoveTerrainCancelled(move: Move): boolean {
switch (this.terrainType) {
case TerrainType.PSYCHIC:
return move.priority > 0;
}
return false;
}
} }
export function getTerrainColor(terrainType: TerrainType): [ integer, integer, integer ] { export function getTerrainColor(terrainType: TerrainType): [ integer, integer, integer ] {

View File

@ -194,15 +194,35 @@ export function getWeatherClearMessage(weatherType: WeatherType): string {
} }
export function getTerrainStartMessage(terrainType: TerrainType): string { export function getTerrainStartMessage(terrainType: TerrainType): string {
return terrainType switch (terrainType) {
? `The terrain became ${Utils.toReadableString(TerrainType[terrainType])}!` case TerrainType.MISTY:
: null; return 'Mist swirled around the battlefield!';
case TerrainType.ELECTRIC:
return 'An electric current ran across the battlefield!';
case TerrainType.GRASSY:
return 'Grass grew to cover the battlefield!';
case TerrainType.PSYCHIC:
return 'The battlefield got weird!';
}
} }
export function getTerrainClearMessage(terrainType: TerrainType): string { export function getTerrainClearMessage(terrainType: TerrainType): string {
return terrainType switch (terrainType) {
? `The ${Utils.toReadableString(TerrainType[terrainType])} terrain faded.` case TerrainType.MISTY:
: null; return 'The mist disappeared from the battlefield.';
case TerrainType.ELECTRIC:
return 'The electricity disappeared from the battlefield.';
case TerrainType.GRASSY:
return 'The grass disappeared from the battlefield.';
case TerrainType.PSYCHIC:
return 'The weirdness disappeared from the battlefield!';
}
}
export function getTerrainBlockMessage(pokemon: Pokemon, terrainType: TerrainType): string {
if (terrainType === TerrainType.MISTY)
return getPokemonMessage(pokemon, ` surrounds itself with a protective mist!`);
return getPokemonMessage(pokemon, ` is protected by the ${Utils.toReadableString(TerrainType[terrainType])} Terrain!`);
} }
interface WeatherPoolEntry { interface WeatherPoolEntry {

View File

@ -298,6 +298,10 @@ export class Arena {
return this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(move); return this.weather && !this.weather.isEffectSuppressed(this.scene) && this.weather.isMoveWeatherCancelled(move);
} }
isMoveTerrainCancelled(move: Move) {
return this.terrain && this.terrain.isMoveTerrainCancelled(move);
}
getAttackTypeMultiplier(attackType: Type, grounded: boolean): number { getAttackTypeMultiplier(attackType: Type, grounded: boolean): number {
let weatherMultiplier = 1; let weatherMultiplier = 1;
if (this.weather && !this.weather.isEffectSuppressed(this.scene)) if (this.weather && !this.weather.isEffectSuppressed(this.scene))

View File

@ -26,7 +26,7 @@ import { BattlerTagType } from "./data/enums/battler-tag-type";
import { getPokemonMessage } from "./messages"; import { getPokemonMessage } from "./messages";
import { Starter } from "./ui/starter-select-ui-handler"; import { Starter } from "./ui/starter-select-ui-handler";
import { Gender } from "./data/gender"; import { Gender } from "./data/gender";
import { Weather, WeatherType, getRandomWeatherType, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather"; import { Weather, WeatherType, getRandomWeatherType, getTerrainBlockMessage, getWeatherDamageMessage, getWeatherLapseMessage } from "./data/weather";
import { TempBattleStat } from "./data/temp-battle-stat"; import { TempBattleStat } from "./data/temp-battle-stat";
import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag"; import { ArenaTagSide, ArenaTrapTag, MistTag, TrickRoomTag } from "./data/arena-tag";
import { ArenaTagType } from "./data/enums/arena-tag-type"; import { ArenaTagType } from "./data/enums/arena-tag-type";
@ -2040,13 +2040,18 @@ export class MovePhase extends BattlePhase {
// Assume conditions affecting targets only apply to moves with a single target // Assume conditions affecting targets only apply to moves with a single target
let success = this.move.getMove().applyConditions(this.pokemon, targets[0], this.move.getMove()); let success = this.move.getMove().applyConditions(this.pokemon, targets[0], this.move.getMove());
let failedText = null;
if (success && this.scene.arena.isMoveWeatherCancelled(this.move.getMove())) if (success && this.scene.arena.isMoveWeatherCancelled(this.move.getMove()))
success = false; success = false;
else if (success && this.scene.arena.isMoveTerrainCancelled(this.move.getMove())) {
success = false;
failedText = getTerrainBlockMessage(targets[0], this.scene.arena.terrain.terrainType);
}
if (success) if (success)
this.scene.unshiftPhase(this.getEffectPhase()); this.scene.unshiftPhase(this.getEffectPhase());
else { else {
this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual }); this.pokemon.pushMoveHistory({ move: this.move.moveId, targets: this.targets, result: MoveResult.FAIL, virtual: this.move.virtual });
this.showFailedText(); this.showFailedText(failedText);
} }
this.end(); this.end();
@ -2109,8 +2114,8 @@ export class MovePhase extends BattlePhase {
this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500); this.scene.queueMessage(getPokemonMessage(this.pokemon, ` used\n${this.move.getName()}!`), 500);
} }
showFailedText(): void { showFailedText(failedText: string = null): void {
this.scene.queueMessage('But it failed!'); this.scene.queueMessage(failedText || 'But it failed!');
} }
end() { end() {