Spaces:
Paused
Paused
| 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) => 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']; | |
| 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; | |
| 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 | 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; | |
| onAnyAfterMoveSecondarySelf?: MoveEventMethods['onAfterMoveSecondarySelf']; | |
| onAnyAfterMoveSecondary?: MoveEventMethods['onAfterMoveSecondary']; | |
| onAnyAfterMove?: MoveEventMethods['onAfterMove']; | |
| onAnyAfterMoveSelf?: CommonHandlers['VoidSourceMove']; | |
| 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) => 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; | |
| 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; | |
| onAllySideConditionStart?: (this: Battle, target: Pokemon, source: Pokemon, sideCondition: Condition) => 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' | 'Terastal'; | |
| 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'].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 === '') 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; | |
| } | |
| } | |