mirror of
https://github.com/smogon/pokemon-showdown.git
synced 2026-03-21 17:25:10 -05:00
* Implement Mega Stones as pairs {key: value}
* Fix Mega Evolution check
* Add constructor guards to Dex getters
* Update config/formats.ts
---------
Co-authored-by: Kris Johnson <11083252+KrisXV@users.noreply.github.com>
705 lines
40 KiB
TypeScript
705 lines
40 KiB
TypeScript
import { Utils } from '../lib/utils';
|
|
import { assignMissingFields, BasicEffect, toID } from './dex-data';
|
|
import type { SecondaryEffect, MoveEventMethods } from './dex-moves';
|
|
|
|
/**
|
|
* Event method prefixes:
|
|
* Ally: triggers for each ally (including the effect holder itself) that is a target of the event, i.e. Pastel Veil
|
|
* Foe: triggers for each foe that is a target of the event, i.e. Unnerve
|
|
* Source: triggers for the source of the event; events must have a source parameter to trigger these handlers
|
|
* Any: triggers for each target of the event regardless of the holder's relation to it
|
|
*/
|
|
|
|
export interface EventMethods {
|
|
onDamagingHit?: (this: Battle, damage: number, target: Pokemon, source: Pokemon, move: ActiveMove) => void;
|
|
onEmergencyExit?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAfterEachBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAfterHit?: MoveEventMethods['onAfterHit'];
|
|
onAfterMega?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAfterSetStatus?: (this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAfterSubDamage?: MoveEventMethods['onAfterSubDamage'];
|
|
onAfterSwitchInSelf?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAfterTerastallization?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAfterUseItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onAfterTakeItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onAfterBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAfterFaint?: (this: Battle, length: number, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAfterMoveSecondarySelf?: MoveEventMethods['onAfterMoveSecondarySelf'];
|
|
onAfterMoveSecondary?: MoveEventMethods['onAfterMoveSecondary'];
|
|
onAfterMove?: MoveEventMethods['onAfterMove'];
|
|
onAfterMoveSelf?: CommonHandlers['VoidSourceMove'];
|
|
onAttract?: (this: Battle, target: Pokemon, source: Pokemon) => void;
|
|
onAccuracy?: (
|
|
this: Battle, accuracy: number, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => number | boolean | null | void;
|
|
onBasePower?: CommonHandlers['ModifierSourceMove'];
|
|
onBeforeFaint?: (this: Battle, pokemon: Pokemon, effect: Effect) => void;
|
|
onBeforeMove?: CommonHandlers['VoidSourceMove'];
|
|
onBeforeSwitchIn?: (this: Battle, pokemon: Pokemon) => void;
|
|
onBeforeSwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onBeforeTurn?: (this: Battle, pokemon: Pokemon) => void;
|
|
onChangeBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onTryBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onChargeMove?: CommonHandlers['VoidSourceMove'];
|
|
onCriticalHit?: ((this: Battle, pokemon: Pokemon, source: null, move: ActiveMove) => boolean | void) | boolean;
|
|
onDamage?: (
|
|
this: Battle, damage: number, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => number | boolean | null | void;
|
|
onDeductPP?: (this: Battle, target: Pokemon, source: Pokemon) => number | void;
|
|
onDisableMove?: (this: Battle, pokemon: Pokemon) => void;
|
|
onDragOut?: (this: Battle, pokemon: Pokemon, source?: Pokemon, move?: ActiveMove) => void;
|
|
onEatItem?: (this: Battle, item: Item, pokemon: Pokemon, source?: Pokemon, effect?: Effect) => void;
|
|
onEffectiveness?: MoveEventMethods['onEffectiveness'];
|
|
onEntryHazard?: (this: Battle, pokemon: Pokemon) => void;
|
|
onFaint?: CommonHandlers['VoidEffect'];
|
|
onFlinch?: ((this: Battle, pokemon: Pokemon) => boolean | void) | boolean;
|
|
onFractionalPriority?: CommonHandlers['ModifierSourceMove'] | -0.1;
|
|
onHit?: MoveEventMethods['onHit'];
|
|
onImmunity?: (this: Battle, type: string, pokemon: Pokemon) => void;
|
|
onLockMove?: string | ((this: Battle, pokemon: Pokemon) => void | string);
|
|
onMaybeTrapPokemon?: (this: Battle, pokemon: Pokemon) => void;
|
|
onModifyAccuracy?: CommonHandlers['ModifierMove'];
|
|
onModifyAtk?: CommonHandlers['ModifierSourceMove'];
|
|
onModifyBoost?: (this: Battle, boosts: SparseBoostsTable, pokemon: Pokemon) => SparseBoostsTable | void;
|
|
onModifyCritRatio?: CommonHandlers['ModifierSourceMove'];
|
|
onModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onModifyDef?: CommonHandlers['ModifierMove'];
|
|
onModifyMove?: MoveEventMethods['onModifyMove'];
|
|
onModifyPriority?: CommonHandlers['ModifierSourceMove'];
|
|
onModifySecondaries?: (
|
|
this: Battle, secondaries: SecondaryEffect[], target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => void;
|
|
onModifyType?: MoveEventMethods['onModifyType'];
|
|
onModifyTarget?: MoveEventMethods['onModifyTarget'];
|
|
onModifySpA?: CommonHandlers['ModifierSourceMove'];
|
|
onModifySpD?: CommonHandlers['ModifierMove'];
|
|
onModifySpe?: (this: Battle, spe: number, pokemon: Pokemon) => number | void;
|
|
onModifySTAB?: CommonHandlers['ModifierSourceMove'];
|
|
onModifyWeight?: (this: Battle, weighthg: number, pokemon: Pokemon) => number | void;
|
|
onMoveAborted?: CommonHandlers['VoidMove'];
|
|
onNegateImmunity?: ((this: Battle, pokemon: Pokemon, type: string) => boolean | void) | boolean;
|
|
onOverrideAction?: (this: Battle, pokemon: Pokemon, target: Pokemon, move: ActiveMove) => string | void;
|
|
onPrepareHit?: CommonHandlers['ResultSourceMove'];
|
|
onPseudoWeatherChange?: (this: Battle, target: Pokemon, source: Pokemon, pseudoWeather: Condition) => void;
|
|
onRedirectTarget?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, source2: Effect, move: ActiveMove
|
|
) => Pokemon | void;
|
|
onResidual?: (this: Battle, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onSetAbility?: (
|
|
this: Battle, ability: string, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => null | void;
|
|
onSetStatus?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => boolean | null | void;
|
|
onSetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: Condition) => boolean | void;
|
|
onSideConditionStart?: (this: Battle, target: Side, source: Pokemon, sideCondition: Condition) => void;
|
|
onStallMove?: (this: Battle, pokemon: Pokemon) => boolean | void;
|
|
onSwitchIn?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSwap?: (this: Battle, target: Pokemon, source: Pokemon) => void;
|
|
onTakeItem?: (
|
|
(this: Battle, item: Item, pokemon: Pokemon, source: Pokemon, move?: ActiveMove) => boolean | void
|
|
) | boolean;
|
|
onWeatherChange?: (this: Battle, target: Pokemon, source: Pokemon, sourceEffect: Effect) => void;
|
|
onTerrainChange?: (this: Battle, target: Pokemon, source: Pokemon, sourceEffect: Effect) => void;
|
|
onTrapPokemon?: (this: Battle, pokemon: Pokemon) => void;
|
|
onTryAddVolatile?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, sourceEffect: Effect
|
|
) => boolean | null | void;
|
|
onTryEatItem?: boolean | ((this: Battle, item: Item, pokemon: Pokemon) => boolean | void);
|
|
onTryHeal?: (
|
|
((this: Battle, relayVar: number, target: Pokemon, source: Pokemon, effect: Effect) => number | boolean | null | void)
|
|
);
|
|
onTryHit?: MoveEventMethods['onTryHit'];
|
|
onTryHitField?: MoveEventMethods['onTryHitField'];
|
|
onTryHitSide?: CommonHandlers['ResultMove'];
|
|
onInvulnerability?: CommonHandlers['ExtResultMove'];
|
|
onTryMove?: MoveEventMethods['onTryMove'];
|
|
onTryPrimaryHit?: (this: Battle, target: Pokemon, source: Pokemon, move: ActiveMove) => boolean | null | number | void;
|
|
onType?: (this: Battle, types: string[], pokemon: Pokemon) => string[] | void;
|
|
onUseItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onUpdate?: (this: Battle, pokemon: Pokemon) => void;
|
|
onWeather?: (this: Battle, target: Pokemon, source: null, effect: Condition) => void;
|
|
onWeatherModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onModifyDamagePhase1?: CommonHandlers['ModifierSourceMove'];
|
|
onModifyDamagePhase2?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeDamagingHit?: (this: Battle, damage: number, target: Pokemon, source: Pokemon, move: ActiveMove) => void;
|
|
onFoeAfterEachBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon) => void;
|
|
onFoeAfterHit?: MoveEventMethods['onAfterHit'];
|
|
onFoeAfterSetStatus?: (this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onFoeAfterSubDamage?: MoveEventMethods['onAfterSubDamage'];
|
|
onFoeAfterSwitchInSelf?: (this: Battle, pokemon: Pokemon) => void;
|
|
onFoeAfterUseItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onFoeAfterBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onFoeAfterFaint?: (this: Battle, length: number, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onFoeAfterMoveSecondarySelf?: MoveEventMethods['onAfterMoveSecondarySelf'];
|
|
onFoeAfterMoveSecondary?: MoveEventMethods['onAfterMoveSecondary'];
|
|
onFoeAfterMove?: MoveEventMethods['onAfterMove'];
|
|
onFoeAfterMoveSelf?: CommonHandlers['VoidSourceMove'];
|
|
onFoeAttract?: (this: Battle, target: Pokemon, source: Pokemon) => void;
|
|
onFoeAccuracy?: (
|
|
this: Battle, accuracy: number, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => number | boolean | null | void;
|
|
onFoeBasePower?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeBeforeFaint?: (this: Battle, pokemon: Pokemon, effect: Effect) => void;
|
|
onFoeBeforeMove?: CommonHandlers['VoidSourceMove'];
|
|
onFoeBeforeSwitchIn?: (this: Battle, pokemon: Pokemon) => void;
|
|
onFoeBeforeSwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onFoeTryBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onFoeChargeMove?: CommonHandlers['VoidSourceMove'];
|
|
onFoeCriticalHit?: ((this: Battle, pokemon: Pokemon, source: null, move: ActiveMove) => boolean | void) | boolean;
|
|
onFoeDamage?: (
|
|
this: Battle, damage: number, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => number | boolean | null | void;
|
|
onFoeDeductPP?: (this: Battle, target: Pokemon, source: Pokemon) => number | void;
|
|
onFoeDisableMove?: (this: Battle, pokemon: Pokemon) => void;
|
|
onFoeDragOut?: (this: Battle, pokemon: Pokemon, source?: Pokemon, move?: ActiveMove) => void;
|
|
onFoeEatItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onFoeEffectiveness?: MoveEventMethods['onEffectiveness'];
|
|
onFoeFaint?: CommonHandlers['VoidEffect'];
|
|
onFoeFlinch?: ((this: Battle, pokemon: Pokemon) => boolean | void) | boolean;
|
|
onFoeHit?: MoveEventMethods['onHit'];
|
|
onFoeImmunity?: (this: Battle, type: string, pokemon: Pokemon) => void;
|
|
onFoeLockMove?: string | ((this: Battle, pokemon: Pokemon) => void | string);
|
|
onFoeMaybeTrapPokemon?: (this: Battle, pokemon: Pokemon, source?: Pokemon) => void;
|
|
onFoeModifyAccuracy?: CommonHandlers['ModifierMove'];
|
|
onFoeModifyAtk?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeModifyBoost?: (this: Battle, boosts: SparseBoostsTable, pokemon: Pokemon) => SparseBoostsTable | void;
|
|
onFoeModifyCritRatio?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeModifyDef?: CommonHandlers['ModifierMove'];
|
|
onFoeModifyMove?: MoveEventMethods['onModifyMove'];
|
|
onFoeModifyPriority?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeModifySecondaries?: (
|
|
this: Battle, secondaries: SecondaryEffect[], target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => void;
|
|
onFoeModifySpA?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeModifySpD?: CommonHandlers['ModifierMove'];
|
|
onFoeModifySpe?: (this: Battle, spe: number, pokemon: Pokemon) => number | void;
|
|
onFoeModifySTAB?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeModifyType?: MoveEventMethods['onModifyType'];
|
|
onFoeModifyTarget?: MoveEventMethods['onModifyTarget'];
|
|
onFoeModifyWeight?: (this: Battle, weighthg: number, pokemon: Pokemon) => number | void;
|
|
onFoeMoveAborted?: CommonHandlers['VoidMove'];
|
|
onFoeNegateImmunity?: ((this: Battle, pokemon: Pokemon, type: string) => boolean | void) | boolean;
|
|
onFoeOverrideAction?: (this: Battle, pokemon: Pokemon, target: Pokemon, move: ActiveMove) => string | void;
|
|
onFoePrepareHit?: CommonHandlers['ResultSourceMove'];
|
|
onFoeRedirectTarget?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, source2: Effect, move: ActiveMove
|
|
) => Pokemon | void;
|
|
onFoeResidual?: (this: Battle, target: Pokemon & Side, source: Pokemon, effect: Effect) => void;
|
|
onFoeSetAbility?: (this: Battle, ability: string, target: Pokemon, source: Pokemon, effect: Effect) => boolean | void;
|
|
onFoeSetStatus?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => boolean | null | void;
|
|
onFoeSetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: Condition) => boolean | void;
|
|
onFoeStallMove?: (this: Battle, pokemon: Pokemon) => boolean | void;
|
|
onFoeSwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onFoeTakeItem?: (
|
|
(this: Battle, item: Item, pokemon: Pokemon, source: Pokemon, move?: ActiveMove) => boolean | void
|
|
) | boolean;
|
|
onFoeTerrain?: (this: Battle, pokemon: Pokemon) => void;
|
|
onFoeTrapPokemon?: (this: Battle, pokemon: Pokemon) => void;
|
|
onFoeTryAddVolatile?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, sourceEffect: Effect
|
|
) => boolean | null | void;
|
|
onFoeTryEatItem?: boolean | ((this: Battle, item: Item, pokemon: Pokemon) => boolean | void);
|
|
/* FIXME: onFoeTryHeal() is run with two different sets of arguments */
|
|
onFoeTryHeal?: (
|
|
((this: Battle, relayVar: number, target: Pokemon, source: Pokemon, effect: Effect) => number | boolean | void) |
|
|
((this: Battle, pokemon: Pokemon) => boolean | void) | boolean
|
|
);
|
|
onFoeTryHit?: MoveEventMethods['onTryHit'];
|
|
onFoeTryHitField?: MoveEventMethods['onTryHitField'];
|
|
onFoeTryHitSide?: CommonHandlers['ResultMove'];
|
|
onFoeInvulnerability?: CommonHandlers['ExtResultMove'];
|
|
onFoeTryMove?: MoveEventMethods['onTryMove'];
|
|
onFoeTryPrimaryHit?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => boolean | null | number | void;
|
|
onFoeType?: (this: Battle, types: string[], pokemon: Pokemon) => string[] | void;
|
|
onFoeWeatherModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeModifyDamagePhase1?: CommonHandlers['ModifierSourceMove'];
|
|
onFoeModifyDamagePhase2?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceDamagingHit?: (this: Battle, damage: number, target: Pokemon, source: Pokemon, move: ActiveMove) => void;
|
|
onSourceAfterEachBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon) => void;
|
|
onSourceAfterHit?: MoveEventMethods['onAfterHit'];
|
|
onSourceAfterSetStatus?: (this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onSourceAfterSubDamage?: MoveEventMethods['onAfterSubDamage'];
|
|
onSourceAfterSwitchInSelf?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSourceAfterUseItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onSourceAfterBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onSourceAfterFaint?: (this: Battle, length: number, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onSourceAfterMoveSecondarySelf?: MoveEventMethods['onAfterMoveSecondarySelf'];
|
|
onSourceAfterMoveSecondary?: MoveEventMethods['onAfterMoveSecondary'];
|
|
onSourceAfterMove?: MoveEventMethods['onAfterMove'];
|
|
onSourceAfterMoveSelf?: CommonHandlers['VoidSourceMove'];
|
|
onSourceAttract?: (this: Battle, target: Pokemon, source: Pokemon) => void;
|
|
onSourceAccuracy?: (
|
|
this: Battle, accuracy: number, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => number | boolean | null | void;
|
|
onSourceBasePower?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceBeforeFaint?: (this: Battle, pokemon: Pokemon, effect: Effect) => void;
|
|
onSourceBeforeMove?: CommonHandlers['VoidSourceMove'];
|
|
onSourceBeforeSwitchIn?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSourceBeforeSwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSourceTryBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onSourceChargeMove?: CommonHandlers['VoidSourceMove'];
|
|
onSourceCriticalHit?: ((this: Battle, pokemon: Pokemon, source: null, move: ActiveMove) => boolean | void) | boolean;
|
|
onSourceDamage?: (
|
|
this: Battle, damage: number, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => number | boolean | null | void;
|
|
onSourceDeductPP?: (this: Battle, target: Pokemon, source: Pokemon) => number | void;
|
|
onSourceDisableMove?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSourceDragOut?: (this: Battle, pokemon: Pokemon, source?: Pokemon, move?: ActiveMove) => void;
|
|
onSourceEatItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onSourceEffectiveness?: MoveEventMethods['onEffectiveness'];
|
|
onSourceFaint?: CommonHandlers['VoidEffect'];
|
|
onSourceFlinch?: ((this: Battle, pokemon: Pokemon) => boolean | void) | boolean;
|
|
onSourceHit?: MoveEventMethods['onHit'];
|
|
onSourceImmunity?: (this: Battle, type: string, pokemon: Pokemon) => void;
|
|
onSourceLockMove?: string | ((this: Battle, pokemon: Pokemon) => void | string);
|
|
onSourceMaybeTrapPokemon?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSourceModifyAccuracy?: CommonHandlers['ModifierMove'];
|
|
onSourceModifyAtk?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceModifyBoost?: (this: Battle, boosts: SparseBoostsTable, pokemon: Pokemon) => SparseBoostsTable | void;
|
|
onSourceModifyCritRatio?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceModifyDef?: CommonHandlers['ModifierMove'];
|
|
onSourceModifyMove?: MoveEventMethods['onModifyMove'];
|
|
onSourceModifyPriority?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceModifySecondaries?: (
|
|
this: Battle, secondaries: SecondaryEffect[], target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => void;
|
|
onSourceModifySpA?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceModifySpD?: CommonHandlers['ModifierMove'];
|
|
onSourceModifySpe?: (this: Battle, spe: number, pokemon: Pokemon) => number | void;
|
|
onSourceModifySTAB?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceModifyType?: MoveEventMethods['onModifyType'];
|
|
onSourceModifyTarget?: MoveEventMethods['onModifyTarget'];
|
|
onSourceModifyWeight?: (this: Battle, weighthg: number, pokemon: Pokemon) => number | void;
|
|
onSourceMoveAborted?: CommonHandlers['VoidMove'];
|
|
onSourceNegateImmunity?: ((this: Battle, pokemon: Pokemon, type: string) => boolean | void) | boolean;
|
|
onSourceOverrideAction?: (this: Battle, pokemon: Pokemon, target: Pokemon, move: ActiveMove) => string | void;
|
|
onSourcePrepareHit?: CommonHandlers['ResultSourceMove'];
|
|
onSourceRedirectTarget?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, source2: Effect, move: ActiveMove
|
|
) => Pokemon | void;
|
|
onSourceResidual?: (this: Battle, target: Pokemon & Side, source: Pokemon, effect: Effect) => void;
|
|
onSourceSetAbility?: (
|
|
this: Battle, ability: string, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => boolean | void;
|
|
onSourceSetStatus?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => boolean | null | void;
|
|
onSourceSetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: Condition) => boolean | void;
|
|
onSourceStallMove?: (this: Battle, pokemon: Pokemon) => boolean | void;
|
|
onSourceSwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSourceTakeItem?: (
|
|
(this: Battle, item: Item, pokemon: Pokemon, source: Pokemon, move?: ActiveMove) => boolean | void
|
|
) | boolean;
|
|
onSourceTerrain?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSourceTrapPokemon?: (this: Battle, pokemon: Pokemon) => void;
|
|
onSourceTryAddVolatile?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, sourceEffect: Effect
|
|
) => boolean | null | void;
|
|
onSourceTryEatItem?: boolean | ((this: Battle, item: Item, pokemon: Pokemon) => boolean | void);
|
|
/* FIXME: onSourceTryHeal() is run with two different sets of arguments */
|
|
onSourceTryHeal?: (
|
|
((this: Battle, relayVar: number, target: Pokemon, source: Pokemon, effect: Effect) => number | boolean | void) |
|
|
((this: Battle, pokemon: Pokemon) => boolean | void) | boolean
|
|
);
|
|
onSourceTryHit?: MoveEventMethods['onTryHit'];
|
|
onSourceTryHitField?: MoveEventMethods['onTryHitField'];
|
|
onSourceTryHitSide?: CommonHandlers['ResultMove'];
|
|
onSourceInvulnerability?: CommonHandlers['ExtResultMove'];
|
|
onSourceTryMove?: MoveEventMethods['onTryMove'];
|
|
onSourceTryPrimaryHit?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => boolean | null | number | void;
|
|
onSourceType?: (this: Battle, types: string[], pokemon: Pokemon) => string[] | void;
|
|
onSourceWeatherModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceModifyDamagePhase1?: CommonHandlers['ModifierSourceMove'];
|
|
onSourceModifyDamagePhase2?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyDamagingHit?: (this: Battle, damage: number, target: Pokemon, source: Pokemon, move: ActiveMove) => void;
|
|
onAnyAfterEachBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon) => void;
|
|
onAnyAfterHit?: MoveEventMethods['onAfterHit'];
|
|
onAnyAfterSetStatus?: (this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAnyAfterSubDamage?: MoveEventMethods['onAfterSubDamage'];
|
|
onAnyAfterSwitchInSelf?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyAfterUseItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onAnyAfterBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAnyAfterFaint?: (this: Battle, length: number, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAnyAfterMega?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyAfterMoveSecondarySelf?: MoveEventMethods['onAfterMoveSecondarySelf'];
|
|
onAnyAfterMoveSecondary?: MoveEventMethods['onAfterMoveSecondary'];
|
|
onAnyAfterMove?: MoveEventMethods['onAfterMove'];
|
|
onAnyAfterMoveSelf?: CommonHandlers['VoidSourceMove'];
|
|
onAnyAfterTerastallization?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyAttract?: (this: Battle, target: Pokemon, source: Pokemon) => void;
|
|
onAnyAccuracy?: (
|
|
this: Battle, accuracy: number, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => number | boolean | null | void;
|
|
onAnyBasePower?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyBeforeFaint?: (this: Battle, pokemon: Pokemon, effect: Effect) => void;
|
|
onAnyBeforeMove?: CommonHandlers['VoidSourceMove'];
|
|
onAnyBeforeSwitchIn?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyBeforeSwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyTryBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAnyChargeMove?: CommonHandlers['VoidSourceMove'];
|
|
onAnyCriticalHit?: ((this: Battle, pokemon: Pokemon, source: null, move: ActiveMove) => boolean | void) | boolean;
|
|
onAnyDamage?: (
|
|
this: Battle, damage: number, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => number | boolean | null | void;
|
|
onAnyDeductPP?: (this: Battle, target: Pokemon, source: Pokemon) => number | void;
|
|
onAnyDisableMove?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyDragOut?: (this: Battle, pokemon: Pokemon, source?: Pokemon, move?: ActiveMove) => void;
|
|
onAnyEatItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onAnyEffectiveness?: MoveEventMethods['onEffectiveness'];
|
|
onAnyFaint?: CommonHandlers['VoidEffect'];
|
|
onAnyFlinch?: ((this: Battle, pokemon: Pokemon) => boolean | void) | boolean;
|
|
onAnyHit?: MoveEventMethods['onHit'];
|
|
onAnyImmunity?: (this: Battle, type: string, pokemon: Pokemon) => void;
|
|
onAnyLockMove?: string | ((this: Battle, pokemon: Pokemon) => void | string);
|
|
onAnyMaybeTrapPokemon?: (this: Battle, pokemon: Pokemon, source?: Pokemon) => void;
|
|
onAnyModifyAccuracy?: CommonHandlers['ModifierMove'];
|
|
onAnyModifyAtk?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyModifyBoost?: (this: Battle, boosts: SparseBoostsTable, pokemon: Pokemon) => SparseBoostsTable | void;
|
|
onAnyModifyCritRatio?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyModifyDef?: CommonHandlers['ModifierMove'];
|
|
onAnyModifyMove?: MoveEventMethods['onModifyMove'];
|
|
onAnyModifyPriority?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyModifySecondaries?: (
|
|
this: Battle, secondaries: SecondaryEffect[], target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => void;
|
|
onAnyModifySpA?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyModifySpD?: CommonHandlers['ModifierMove'];
|
|
onAnyModifySpe?: (this: Battle, spe: number, pokemon: Pokemon) => number | void;
|
|
onAnyModifySTAB?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyModifyType?: MoveEventMethods['onModifyType'];
|
|
onAnyModifyTarget?: MoveEventMethods['onModifyTarget'];
|
|
onAnyModifyWeight?: (this: Battle, weighthg: number, pokemon: Pokemon) => number | void;
|
|
onAnyMoveAborted?: CommonHandlers['VoidMove'];
|
|
onAnyNegateImmunity?: ((this: Battle, pokemon: Pokemon, type: string) => boolean | void) | boolean;
|
|
onAnyOverrideAction?: (this: Battle, pokemon: Pokemon, target: Pokemon, move: ActiveMove) => string | void;
|
|
onAnyPrepareHit?: CommonHandlers['ResultSourceMove'];
|
|
onAnyPseudoWeatherChange?: (this: Battle, target: Pokemon, source: Pokemon, pseudoWeather: Condition) => void;
|
|
onAnyRedirectTarget?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, source2: Effect, move: ActiveMove
|
|
) => Pokemon | void;
|
|
onAnyResidual?: (this: Battle, target: Pokemon & Side, source: Pokemon, effect: Effect) => void;
|
|
onAnySetAbility?: (this: Battle, ability: string, target: Pokemon, source: Pokemon, effect: Effect) => boolean | void;
|
|
onAnySetStatus?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => boolean | null | void;
|
|
onAnySetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: Condition) => boolean | void;
|
|
onAnyStallMove?: (this: Battle, pokemon: Pokemon) => boolean | void;
|
|
onAnySwitchIn?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnySwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyTakeItem?: (
|
|
(this: Battle, item: Item, pokemon: Pokemon, source: Pokemon, move?: ActiveMove) => boolean | void
|
|
) | boolean;
|
|
onAnyTerrain?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyTrapPokemon?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAnyTryAddVolatile?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, sourceEffect: Effect
|
|
) => boolean | null | void;
|
|
onAnyTryEatItem?: boolean | ((this: Battle, item: Item, pokemon: Pokemon) => boolean | void);
|
|
/* FIXME: onAnyTryHeal() is run with two different sets of arguments */
|
|
onAnyTryHeal?: (
|
|
((this: Battle, relayVar: number, target: Pokemon, source: Pokemon, effect: Effect) => number | boolean | void) |
|
|
((this: Battle, pokemon: Pokemon) => boolean | void) | boolean
|
|
);
|
|
onAnyTryHit?: MoveEventMethods['onTryHit'];
|
|
onAnyTryHitField?: MoveEventMethods['onTryHitField'];
|
|
onAnyTryHitSide?: CommonHandlers['ResultMove'];
|
|
onAnyInvulnerability?: CommonHandlers['ExtResultMove'];
|
|
onAnyTryMove?: MoveEventMethods['onTryMove'];
|
|
onAnyTryPrimaryHit?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => boolean | null | number | void;
|
|
onAnyType?: (this: Battle, types: string[], pokemon: Pokemon) => string[] | void;
|
|
onAnyWeatherModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyModifyDamagePhase1?: CommonHandlers['ModifierSourceMove'];
|
|
onAnyModifyDamagePhase2?: CommonHandlers['ModifierSourceMove'];
|
|
|
|
// Priorities (incomplete list)
|
|
onAccuracyPriority?: number;
|
|
onDamagingHitOrder?: number;
|
|
onAfterMoveSecondaryPriority?: number;
|
|
onAfterMoveSecondarySelfPriority?: number;
|
|
onAfterMoveSelfPriority?: number;
|
|
onAfterSetStatusPriority?: number;
|
|
onAnyBasePowerPriority?: number;
|
|
onAnyInvulnerabilityPriority?: number;
|
|
onAnyModifyAccuracyPriority?: number;
|
|
onAnyFaintPriority?: number;
|
|
onAnyPrepareHitPriority?: number;
|
|
onAnySwitchInPriority?: number;
|
|
onAnySwitchInSubOrder?: number;
|
|
onAllyBasePowerPriority?: number;
|
|
onAllyModifyAtkPriority?: number;
|
|
onAllyModifySpAPriority?: number;
|
|
onAllyModifySpDPriority?: number;
|
|
onAttractPriority?: number;
|
|
onBasePowerPriority?: number;
|
|
onBeforeMovePriority?: number;
|
|
onBeforeSwitchOutPriority?: number;
|
|
onChangeBoostPriority?: number;
|
|
onDamagePriority?: number;
|
|
onDragOutPriority?: number;
|
|
onEffectivenessPriority?: number;
|
|
onFoeBasePowerPriority?: number;
|
|
onFoeBeforeMovePriority?: number;
|
|
onFoeModifyDefPriority?: number;
|
|
onFoeModifySpDPriority?: number;
|
|
onFoeRedirectTargetPriority?: number;
|
|
onFoeTrapPokemonPriority?: number;
|
|
onFractionalPriorityPriority?: number;
|
|
onHitPriority?: number;
|
|
onInvulnerabilityPriority?: number;
|
|
onMaybeTrapPokemonPriority?: number;
|
|
onModifyAccuracyPriority?: number;
|
|
onModifyAtkPriority?: number;
|
|
onModifyCritRatioPriority?: number;
|
|
onModifyDefPriority?: number;
|
|
onModifyMovePriority?: number;
|
|
onModifyPriorityPriority?: number;
|
|
onModifySpAPriority?: number;
|
|
onModifySpDPriority?: number;
|
|
onModifySpePriority?: number;
|
|
onModifySTABPriority?: number;
|
|
onModifyTypePriority?: number;
|
|
onModifyWeightPriority?: number;
|
|
onRedirectTargetPriority?: number;
|
|
onResidualOrder?: number;
|
|
onResidualPriority?: number;
|
|
onResidualSubOrder?: number;
|
|
onSourceBasePowerPriority?: number;
|
|
onSourceInvulnerabilityPriority?: number;
|
|
onSourceModifyAccuracyPriority?: number;
|
|
onSourceModifyAtkPriority?: number;
|
|
onSourceModifyDamagePriority?: number;
|
|
onSourceModifySpAPriority?: number;
|
|
onSwitchInPriority?: number;
|
|
onSwitchInSubOrder?: number;
|
|
onTrapPokemonPriority?: number;
|
|
onTryBoostPriority?: number;
|
|
onTryEatItemPriority?: number;
|
|
onTryHealPriority?: number;
|
|
onTryHitPriority?: number;
|
|
onTryMovePriority?: number;
|
|
onTryPrimaryHitPriority?: number;
|
|
onTypePriority?: number;
|
|
}
|
|
|
|
export interface PokemonEventMethods extends EventMethods {
|
|
onAllyDamagingHit?: (this: Battle, damage: number, target: Pokemon, source: Pokemon, move: ActiveMove) => void;
|
|
onAllyAfterEachBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon) => void;
|
|
onAllyAfterHit?: MoveEventMethods['onAfterHit'];
|
|
onAllyAfterSetStatus?: (this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAllyAfterSubDamage?: MoveEventMethods['onAfterSubDamage'];
|
|
onAllyAfterSwitchInSelf?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAllyAfterUseItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onAllyAfterBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAllyAfterFaint?: (this: Battle, length: number, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAllyAfterMoveSecondarySelf?: MoveEventMethods['onAfterMoveSecondarySelf'];
|
|
onAllyAfterMoveSecondary?: MoveEventMethods['onAfterMoveSecondary'];
|
|
onAllyAfterMove?: MoveEventMethods['onAfterMove'];
|
|
onAllyAfterMoveSelf?: CommonHandlers['VoidSourceMove'];
|
|
onAllyAttract?: (this: Battle, target: Pokemon, source: Pokemon) => void;
|
|
onAllyAccuracy?: (
|
|
this: Battle, accuracy: number, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => number | boolean | null | void;
|
|
onAllyBasePower?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyBeforeFaint?: (this: Battle, pokemon: Pokemon, effect: Effect) => void;
|
|
onAllyBeforeMove?: CommonHandlers['VoidSourceMove'];
|
|
onAllyBeforeSwitchIn?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAllyBeforeSwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAllyTryBoost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source: Pokemon, effect: Effect) => void;
|
|
onAllyChargeMove?: CommonHandlers['VoidSourceMove'];
|
|
onAllyCriticalHit?: ((this: Battle, pokemon: Pokemon, source: null, move: ActiveMove) => boolean | void) | boolean;
|
|
onAllyDamage?: (
|
|
this: Battle, damage: number, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => number | boolean | null | void;
|
|
onAllyDeductPP?: (this: Battle, target: Pokemon, source: Pokemon) => number | void;
|
|
onAllyDisableMove?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAllyDragOut?: (this: Battle, pokemon: Pokemon, source?: Pokemon, move?: ActiveMove) => void;
|
|
onAllyEatItem?: (this: Battle, item: Item, pokemon: Pokemon) => void;
|
|
onAllyEffectiveness?: MoveEventMethods['onEffectiveness'];
|
|
onAllyFaint?: CommonHandlers['VoidEffect'];
|
|
onAllyFlinch?: ((this: Battle, pokemon: Pokemon) => boolean | void) | boolean;
|
|
onAllyHit?: MoveEventMethods['onHit'];
|
|
onAllyImmunity?: (this: Battle, type: string, pokemon: Pokemon) => void;
|
|
onAllyLockMove?: string | ((this: Battle, pokemon: Pokemon) => void | string);
|
|
onAllyMaybeTrapPokemon?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAllyModifyAccuracy?: CommonHandlers['ModifierMove'];
|
|
onAllyModifyAtk?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyModifyBoost?: (this: Battle, boosts: SparseBoostsTable, pokemon: Pokemon) => SparseBoostsTable | void;
|
|
onAllyModifyCritRatio?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyModifyDef?: CommonHandlers['ModifierMove'];
|
|
onAllyModifyMove?: MoveEventMethods['onModifyMove'];
|
|
onAllyModifyPriority?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyModifySecondaries?: (
|
|
this: Battle, secondaries: SecondaryEffect[], target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => void;
|
|
onAllyModifySpA?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyModifySpD?: CommonHandlers['ModifierMove'];
|
|
onAllyModifySpe?: (this: Battle, spe: number, pokemon: Pokemon) => number | void;
|
|
onAllyModifySTAB?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyModifyType?: MoveEventMethods['onModifyType'];
|
|
onAllyModifyTarget?: MoveEventMethods['onModifyTarget'];
|
|
onAllyModifyWeight?: (this: Battle, weighthg: number, pokemon: Pokemon) => number | void;
|
|
onAllyMoveAborted?: CommonHandlers['VoidMove'];
|
|
onAllyNegateImmunity?: ((this: Battle, pokemon: Pokemon, type: string) => boolean | void) | boolean;
|
|
onAllyOverrideAction?: (this: Battle, pokemon: Pokemon, target: Pokemon, move: ActiveMove) => string | void;
|
|
onAllyPrepareHit?: CommonHandlers['ResultSourceMove'];
|
|
onAllyRedirectTarget?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, source2: Effect, move: ActiveMove
|
|
) => Pokemon | void;
|
|
onAllyResidual?: (this: Battle, target: Pokemon & Side, source: Pokemon, effect: Effect) => void;
|
|
onAllySetAbility?: (this: Battle, ability: string, target: Pokemon, source: Pokemon, effect: Effect) => boolean | void;
|
|
onAllySetStatus?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, effect: Effect
|
|
) => boolean | null | void;
|
|
onAllySetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: Condition) => boolean | void;
|
|
onAllyStallMove?: (this: Battle, pokemon: Pokemon) => boolean | void;
|
|
onAllySwitchOut?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAllyTakeItem?: (
|
|
(this: Battle, item: Item, pokemon: Pokemon, source: Pokemon, move?: ActiveMove) => boolean | void
|
|
) | boolean;
|
|
onAllyTerrain?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAllyTrapPokemon?: (this: Battle, pokemon: Pokemon) => void;
|
|
onAllyTryAddVolatile?: (
|
|
this: Battle, status: Condition, target: Pokemon, source: Pokemon, sourceEffect: Effect
|
|
) => boolean | null | void;
|
|
onAllyTryEatItem?: boolean | ((this: Battle, item: Item, pokemon: Pokemon) => boolean | void);
|
|
/* FIXME: onAllyTryHeal() is run with two different sets of arguments */
|
|
onAllyTryHeal?: (
|
|
((this: Battle, relayVar: number, target: Pokemon, source: Pokemon, effect: Effect) => number | boolean | void) |
|
|
((this: Battle, pokemon: Pokemon) => boolean | void) | boolean
|
|
);
|
|
onAllyTryHit?: MoveEventMethods['onTryHit'];
|
|
onAllyTryHitField?: MoveEventMethods['onTryHitField'];
|
|
onAllyTryHitSide?: CommonHandlers['ResultMove'];
|
|
onAllyInvulnerability?: CommonHandlers['ExtResultMove'];
|
|
onAllyTryMove?: MoveEventMethods['onTryMove'];
|
|
onAllyTryPrimaryHit?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, move: ActiveMove
|
|
) => boolean | null | number | void;
|
|
onAllyType?: (this: Battle, types: string[], pokemon: Pokemon) => string[] | void;
|
|
onAllyWeatherModifyDamage?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyModifyDamagePhase1?: CommonHandlers['ModifierSourceMove'];
|
|
onAllyModifyDamagePhase2?: CommonHandlers['ModifierSourceMove'];
|
|
}
|
|
export interface SideEventMethods extends EventMethods {
|
|
onSideStart?: (this: Battle, target: Side, source: Pokemon, sourceEffect: Effect) => void;
|
|
onSideRestart?: (this: Battle, target: Side, source: Pokemon, sourceEffect: Effect) => void;
|
|
onSideResidual?: (this: Battle, target: Side, source: Pokemon, effect: Effect) => void;
|
|
onSideEnd?: (this: Battle, target: Side) => void;
|
|
onSideResidualOrder?: number;
|
|
onSideResidualPriority?: number;
|
|
onSideResidualSubOrder?: number;
|
|
}
|
|
export interface FieldEventMethods extends EventMethods {
|
|
onFieldStart?: (this: Battle, target: Field, source: Pokemon, sourceEffect: Effect) => void;
|
|
onFieldRestart?: (this: Battle, target: Field, source: Pokemon, sourceEffect: Effect) => void;
|
|
onFieldResidual?: (this: Battle, target: Field, source: Pokemon, effect: Effect) => void;
|
|
onFieldEnd?: (this: Battle, target: Field) => void;
|
|
onFieldResidualOrder?: number;
|
|
onFieldResidualPriority?: number;
|
|
onFieldResidualSubOrder?: number;
|
|
}
|
|
export interface PokemonConditionData extends Partial<Condition>, PokemonEventMethods {}
|
|
export interface SideConditionData extends
|
|
Partial<Omit<Condition, 'onStart' | 'onRestart' | 'onEnd'>>, SideEventMethods {}
|
|
export interface FieldConditionData extends
|
|
Partial<Omit<Condition, 'onStart' | 'onRestart' | 'onEnd'>>, FieldEventMethods {}
|
|
|
|
export type ConditionData = PokemonConditionData | SideConditionData | FieldConditionData;
|
|
|
|
export type ModdedConditionData = ConditionData & { inherit?: true };
|
|
export interface ConditionDataTable { [id: IDEntry]: ConditionData }
|
|
export interface ModdedConditionDataTable { [id: IDEntry]: ModdedConditionData }
|
|
|
|
export class Condition extends BasicEffect implements
|
|
Readonly<BasicEffect & SideConditionData & FieldConditionData & PokemonConditionData> {
|
|
declare readonly effectType: 'Condition' | 'Weather' | 'Status' | 'Terrain';
|
|
declare readonly counterMax?: number;
|
|
declare effectOrder?: number;
|
|
|
|
declare readonly durationCallback?: (this: Battle, target: Pokemon, source: Pokemon, effect: Effect | null) => number;
|
|
declare readonly onCopy?: (this: Battle, pokemon: Pokemon) => void;
|
|
declare readonly onEnd?: (this: Battle, target: Pokemon) => void;
|
|
declare readonly onRestart?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, sourceEffect: Effect
|
|
) => boolean | null | void;
|
|
declare readonly onStart?: (
|
|
this: Battle, target: Pokemon, source: Pokemon, sourceEffect: Effect
|
|
) => boolean | null | void;
|
|
|
|
constructor(data: AnyObject) {
|
|
super(data);
|
|
this.effectType = (['Weather', 'Status', 'Terrain'].includes(data.effectType) ? data.effectType : 'Condition');
|
|
assignMissingFields(this, data);
|
|
}
|
|
}
|
|
|
|
const EMPTY_CONDITION: Condition = Utils.deepFreeze(new Condition({ name: '', exists: false }));
|
|
|
|
export class DexConditions {
|
|
readonly dex: ModdedDex;
|
|
readonly conditionCache = new Map<ID, Condition>();
|
|
|
|
constructor(dex: ModdedDex) {
|
|
this.dex = dex;
|
|
}
|
|
|
|
get(name?: string | Effect | null): Condition {
|
|
if (!name) return EMPTY_CONDITION;
|
|
if (typeof name !== 'string') return name as Condition;
|
|
|
|
return this.getByID(name.startsWith('item:') || name.startsWith('ability:') ? name as ID : toID(name));
|
|
}
|
|
|
|
getByID(id: ID): Condition {
|
|
if (id === '' || id === 'constructor') return EMPTY_CONDITION;
|
|
|
|
let condition = this.conditionCache.get(id);
|
|
if (condition) return condition;
|
|
|
|
let found;
|
|
if (id.startsWith('item:')) {
|
|
const item = this.dex.items.getByID(id.slice(5) as ID);
|
|
condition = { ...item, id: 'item:' + item.id as ID } as any as Condition;
|
|
} else if (id.startsWith('ability:')) {
|
|
const ability = this.dex.abilities.getByID(id.slice(8) as ID);
|
|
condition = { ...ability, id: 'ability:' + ability.id as ID } as any as Condition;
|
|
} else if (this.dex.data.Rulesets.hasOwnProperty(id)) {
|
|
condition = this.dex.formats.get(id) as any as Condition;
|
|
// formats can't be frozen if they don't have a ruleTable
|
|
this.conditionCache.set(id, condition);
|
|
return condition;
|
|
} else if (this.dex.data.Conditions.hasOwnProperty(id)) {
|
|
condition = new Condition({ name: id, ...this.dex.data.Conditions[id] });
|
|
} else if (
|
|
(this.dex.data.Moves.hasOwnProperty(id) && (found = this.dex.data.Moves[id]).condition) ||
|
|
(this.dex.data.Abilities.hasOwnProperty(id) && (found = this.dex.data.Abilities[id]).condition) ||
|
|
(this.dex.data.Items.hasOwnProperty(id) && (found = this.dex.data.Items[id]).condition)
|
|
) {
|
|
condition = new Condition({ name: found.name || id, ...found.condition });
|
|
} else if (id === 'recoil') {
|
|
condition = new Condition({ name: 'Recoil', effectType: 'Recoil' });
|
|
} else if (id === 'drain') {
|
|
condition = new Condition({ name: 'Drain', effectType: 'Drain' });
|
|
} else {
|
|
condition = new Condition({ name: id, exists: false });
|
|
}
|
|
|
|
this.conditionCache.set(id, this.dex.deepFreeze(condition));
|
|
return condition;
|
|
}
|
|
}
|