|
"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"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|
} |
|
} |
|
|
|
|