Spaces:
Paused
Paused
| ; | |
| 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 | |