Jofthomas's picture
Upload 4781 files
5c2ed06 verified
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var field_exports = {};
__export(field_exports, {
Field: () => Field
});
module.exports = __toCommonJS(field_exports);
var import_state = require("./state");
var import_dex = require("./dex");
/**
* Simulator Field
* Pokemon Showdown - http://pokemonshowdown.com/
*
* @license MIT
*/
class Field {
constructor(battle) {
this.battle = battle;
const fieldScripts = this.battle.format.field || this.battle.dex.data.Scripts.field;
if (fieldScripts)
Object.assign(this, fieldScripts);
this.id = "";
this.weather = "";
this.weatherState = this.battle.initEffectState({ id: "" });
this.terrain = "";
this.terrainState = this.battle.initEffectState({ id: "" });
this.pseudoWeather = {};
}
toJSON() {
return import_state.State.serializeField(this);
}
setWeather(status, source = null, sourceEffect = null) {
status = this.battle.dex.conditions.get(status);
if (!sourceEffect && this.battle.effect)
sourceEffect = this.battle.effect;
if (!source && this.battle.event?.target)
source = this.battle.event.target;
if (source === "debug")
source = this.battle.sides[0].active[0];
if (this.weather === status.id) {
if (sourceEffect && sourceEffect.effectType === "Ability") {
if (this.battle.gen > 5 || this.weatherState.duration === 0) {
return false;
}
} else if (this.battle.gen > 2 || status.id === "sandstorm") {
return false;
}
}
if (source) {
const result = this.battle.runEvent("SetWeather", source, source, status);
if (!result) {
if (result === false) {
if (sourceEffect?.weather) {
this.battle.add("-fail", source, sourceEffect, "[from] " + this.weather);
} else if (sourceEffect && sourceEffect.effectType === "Ability") {
this.battle.add("-ability", source, sourceEffect, "[from] " + this.weather, "[fail]");
}
}
return null;
}
}
const prevWeather = this.weather;
const prevWeatherState = this.weatherState;
this.weather = status.id;
this.weatherState = this.battle.initEffectState({ id: status.id });
if (source) {
this.weatherState.source = source;
this.weatherState.sourceSlot = source.getSlot();
}
if (status.duration) {
this.weatherState.duration = status.duration;
}
if (status.durationCallback) {
if (!source)
throw new Error(`setting weather without a source`);
this.weatherState.duration = status.durationCallback.call(this.battle, source, source, sourceEffect);
}
if (!this.battle.singleEvent("FieldStart", status, this.weatherState, this, source, sourceEffect)) {
this.weather = prevWeather;
this.weatherState = prevWeatherState;
return false;
}
this.battle.eachEvent("WeatherChange", sourceEffect);
return true;
}
clearWeather() {
if (!this.weather)
return false;
const prevWeather = this.getWeather();
this.battle.singleEvent("FieldEnd", prevWeather, this.weatherState, this);
this.weather = "";
this.battle.clearEffectState(this.weatherState);
this.battle.eachEvent("WeatherChange");
return true;
}
effectiveWeather() {
if (this.suppressingWeather())
return "";
return this.weather;
}
suppressingWeather() {
for (const side of this.battle.sides) {
for (const pokemon of side.active) {
if (pokemon && !pokemon.fainted && !pokemon.ignoringAbility() && pokemon.getAbility().suppressWeather && !pokemon.abilityState.ending) {
return true;
}
}
}
return false;
}
isWeather(weather) {
const ourWeather = this.effectiveWeather();
if (!Array.isArray(weather)) {
return ourWeather === (0, import_dex.toID)(weather);
}
return weather.map(import_dex.toID).includes(ourWeather);
}
getWeather() {
return this.battle.dex.conditions.getByID(this.weather);
}
setTerrain(status, source = null, sourceEffect = null) {
status = this.battle.dex.conditions.get(status);
if (!sourceEffect && this.battle.effect)
sourceEffect = this.battle.effect;
if (!source && this.battle.event?.target)
source = this.battle.event.target;
if (source === "debug")
source = this.battle.sides[0].active[0];
if (!source)
throw new Error(`setting terrain without a source`);
if (this.terrain === status.id)
return false;
const prevTerrain = this.terrain;
const prevTerrainState = this.terrainState;
this.terrain = status.id;
this.terrainState = this.battle.initEffectState({
id: status.id,
source,
sourceSlot: source.getSlot(),
duration: status.duration
});
if (status.durationCallback) {
this.terrainState.duration = status.durationCallback.call(this.battle, source, source, sourceEffect);
}
if (!this.battle.singleEvent("FieldStart", status, this.terrainState, this, source, sourceEffect)) {
this.terrain = prevTerrain;
this.terrainState = prevTerrainState;
return false;
}
this.battle.eachEvent("TerrainChange", sourceEffect);
return true;
}
clearTerrain() {
if (!this.terrain)
return false;
const prevTerrain = this.getTerrain();
this.battle.singleEvent("FieldEnd", prevTerrain, this.terrainState, this);
this.terrain = "";
this.battle.clearEffectState(this.terrainState);
this.battle.eachEvent("TerrainChange");
return true;
}
effectiveTerrain(target) {
if (this.battle.event && !target)
target = this.battle.event.target;
return this.battle.runEvent("TryTerrain", target) ? this.terrain : "";
}
isTerrain(terrain, target) {
const ourTerrain = this.effectiveTerrain(target);
if (!Array.isArray(terrain)) {
return ourTerrain === (0, import_dex.toID)(terrain);
}
return terrain.map(import_dex.toID).includes(ourTerrain);
}
getTerrain() {
return this.battle.dex.conditions.getByID(this.terrain);
}
addPseudoWeather(status, source = null, sourceEffect = null) {
if (!source && this.battle.event?.target)
source = this.battle.event.target;
if (source === "debug")
source = this.battle.sides[0].active[0];
status = this.battle.dex.conditions.get(status);
let state = this.pseudoWeather[status.id];
if (state) {
if (!status.onFieldRestart)
return false;
return this.battle.singleEvent("FieldRestart", status, state, this, source, sourceEffect);
}
state = this.pseudoWeather[status.id] = this.battle.initEffectState({
id: status.id,
source,
sourceSlot: source?.getSlot(),
duration: status.duration
});
if (status.durationCallback) {
if (!source)
throw new Error(`setting fieldcond without a source`);
state.duration = status.durationCallback.call(this.battle, source, source, sourceEffect);
}
if (!this.battle.singleEvent("FieldStart", status, state, this, source, sourceEffect)) {
delete this.pseudoWeather[status.id];
return false;
}
this.battle.runEvent("PseudoWeatherChange", source, source, status);
return true;
}
getPseudoWeather(status) {
status = this.battle.dex.conditions.get(status);
return this.pseudoWeather[status.id] ? status : null;
}
removePseudoWeather(status) {
status = this.battle.dex.conditions.get(status);
const state = this.pseudoWeather[status.id];
if (!state)
return false;
this.battle.singleEvent("FieldEnd", status, state, this);
delete this.pseudoWeather[status.id];
return true;
}
destroy() {
this.battle = null;
}
}
//# sourceMappingURL=field.js.map