mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-05-18 03:01:00 -05:00
64 lines
2.6 KiB
JavaScript
64 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
/**@type {ModdedBattleScriptsData} */
|
|
exports.BattleScripts = {
|
|
getEffect(name) {
|
|
if (name && typeof name !== 'string') {
|
|
return name;
|
|
}
|
|
let id = toID(name);
|
|
if (id.startsWith('ability') && !['abilitypowerofalchemy', 'abilityreceiver', 'abilitytrace'].includes(id)) return Object.assign(Object.create(this.getAbility(id.slice(7))), {id});
|
|
return Object.getPrototypeOf(this).getEffect.call(this, name);
|
|
},
|
|
pokemon: {
|
|
setAbility(ability, source, isFromFormechange) {
|
|
if (!this.hp) return false;
|
|
ability = this.battle.getAbility(ability);
|
|
let oldAbility = this.ability;
|
|
if (!isFromFormechange) {
|
|
if (['illusion', 'battlebond', 'comatose', 'disguise', 'multitype', 'powerconstruct', 'rkssystem', 'schooling', 'shieldsdown', 'stancechange'].includes(ability.id)) return false;
|
|
if (['battlebond', 'comatose', 'disguise', 'multitype', 'powerconstruct', 'rkssystem', 'schooling', 'shieldsdown', 'stancechange'].includes(oldAbility)) return false;
|
|
}
|
|
this.battle.singleEvent('End', this.battle.getAbility(oldAbility), this.abilityData, this, source);
|
|
let ally = this.side.active.find(ally => ally && ally !== this && !ally.fainted);
|
|
if (ally && ally.m.innate) {
|
|
ally.removeVolatile(ally.m.innate);
|
|
delete ally.m.innate;
|
|
}
|
|
this.ability = ability.id;
|
|
this.abilityData = {id: ability.id, target: this};
|
|
if (ability.id) {
|
|
this.battle.singleEvent('Start', ability, this.abilityData, this, source);
|
|
if (ally && ally.ability !== this.ability) {
|
|
ally.m.innate = 'ability' + ability.id;
|
|
ally.addVolatile(ally.m.innate);
|
|
}
|
|
}
|
|
this.abilityOrder = this.battle.abilityOrder++;
|
|
return oldAbility;
|
|
},
|
|
hasAbility(ability) {
|
|
if (!this.ignoringAbility()) {
|
|
if (Array.isArray(ability) ? ability.map(toID).includes(this.ability) : toID(ability) === this.ability) {
|
|
return true;
|
|
}
|
|
}
|
|
let ally = this.side.active.find(ally => ally && ally !== this && !ally.fainted);
|
|
if (!ally || ally.ignoringAbility()) return false;
|
|
if (Array.isArray(ability)) return ability.map(toID).includes(ally.ability);
|
|
return toID(ability) === ally.ability;
|
|
},
|
|
getRequestData() {
|
|
let ally = this.side.active.find(ally => ally && ally !== this && !ally.fainted);
|
|
this.moveSlots = this.baseMoveSlots.concat(ally ? ally.baseMoveSlots : []);
|
|
for (const moveSlot of this.moveSlots) {
|
|
moveSlot.disabled = false;
|
|
moveSlot.disabledSource = '';
|
|
}
|
|
this.battle.runEvent('DisableMove', this);
|
|
if (!this.ateBerry) this.disableMove('belch');
|
|
return Object.getPrototypeOf(this).getRequestData.call(this);
|
|
},
|
|
},
|
|
};
|