pokemon-showdown/sim/global-types.ts
Guangcong Luo 3546cde82c Fix Emergency Exit timing
This is a really hacky implementation of Emergency Exit, but Emergency
Exit itself is a huge mess on cart, too.

Our previous implementation:
- activated Emergency Exit at AfterMoveSecondary timing for move damage
- activated Emergency Exit immediately after dealing any other damage

This new one:
- activates Emergency Exit only in three situations:
- right after AfterMoveSecondary timing, for move damage
- right after DamagingHit timing, for DamagingHit residual damage
  (Rough Skin, Iron Barbs, Rocky Helmet)
- right after the switch update, for switch-hazard residual damage
  (Stealth Rock, Spikes)
- does not otherwise activate (so Substitute, Hail, Toxic, etc no
  longer activate Emergency Exit)

This should much accurately simulate Emergency Exit behavior, including
most famously timing it after healing berries after hazards, as
documented in:

https://www.smogon.com/forums/threads/pokemon-sun-moon-battle-mechanics-research.3586701/#post-7075354

Fixes #6309
2020-02-08 07:59:54 -08:00

1386 lines
66 KiB
TypeScript

type Battle = import('./battle').Battle
type Field = import('./field').Field
type ModdedDex = import('./dex').ModdedDex
type Pokemon = import('./pokemon').Pokemon
type PRNGSeed = import('./prng').PRNGSeed;
type Side = import('./side').Side
type TeamValidator = import('./team-validator').TeamValidator
type PokemonSources = import('./team-validator').PokemonSources
type ID = '' | string & {__isID: true};
interface AnyObject {[k: string]: any}
type DexTable<T> = {[key: string]: T}
type GenderName = 'M' | 'F' | 'N' | '';
type StatNameExceptHP = 'atk' | 'def' | 'spa' | 'spd' | 'spe';
type StatName = 'hp' | StatNameExceptHP;
type StatsExceptHPTable = {[stat in StatNameExceptHP]: number};
type StatsTable = {[stat in StatName]: number };
type SparseStatsTable = Partial<StatsTable>;
type BoostName = StatNameExceptHP | 'accuracy' | 'evasion';
type BoostsTable = {[boost in BoostName]: number };
type SparseBoostsTable = Partial<BoostsTable>;
type Nonstandard = 'Past' | 'Future' | 'Unobtainable' | 'CAP' | 'LGPE' | 'Custom';
/**
* Describes the acceptable target(s) of a move.
* adjacentAlly - Only relevant to Doubles or Triples, the move only targets an ally of the user.
* adjacentAllyOrSelf - The move can target the user or its ally.
* adjacentFoe - The move can target a foe, but not (in Triples) a distant foe.
* all - The move targets the field or all Pokémon at once.
* allAdjacent - The move is a spread move that also hits the user's ally.
* allAdjacentFoes - The move is a spread move.
* allies - The move affects all active Pokémon on the user's team.
* allySide - The move adds a side condition on the user's side.
* allyTeam - The move affects all unfainted Pokémon on the user's team.
* any - The move can hit any other active Pokémon, not just those adjacent.
* foeSide - The move adds a side condition on the foe's side.
* normal - The move can hit one adjacent Pokémon of your choice.
* randomNormal - The move targets an adjacent foe at random.
* scripted - The move targets the foe that damaged the user.
* self - The move affects the user of the move.
*/
type MoveTarget = 'adjacentAlly' | 'adjacentAllyOrSelf' | 'adjacentFoe' | 'all' | 'allAdjacent' | 'allAdjacentFoes' | 'allies' | 'allySide' | 'allyTeam' | 'any' | 'foeSide' | 'normal' | 'randomNormal' | 'scripted' | 'self';
type PokemonSet = {
name: string,
species: string,
item: string,
ability: string,
moves: string[],
nature: string,
gender: string,
evs: StatsTable,
ivs: StatsTable,
level: number,
shiny?: boolean,
happiness?: number,
pokeball?: string,
hpType?: string,
};
/**
* Describes a possible way to get a move onto a pokemon.
*
* First character is a generation number, 1-7.
* Second character is a source ID, one of:
*
* - L = start or level-up, 3rd char+ is the level
* - M = TM/HM
* - T = tutor
* - R = restricted (special moves like Rotom moves)
* - E = egg
* - S = event, 3rd char+ is the index in .eventPokemon
* - D = Dream World, only 5D is valid
* - V = Virtual Console transfer, only 7V is valid
* - C = NOT A REAL SOURCE, see note, only 3C/4C is valid
*
* C marks certain moves learned by a pokemon's prevo. It's used to
* work around the chainbreeding checker's shortcuts for performance;
* it lets the pokemon be a valid father for teaching the move, but
* is otherwise ignored by the learnset checker (which will actually
* check prevos for compatibility).
*/
type MoveSource = string;
type EventInfo = {
generation: number,
level?: number,
shiny?: boolean | 1,
gender?: GenderName,
nature?: string,
ivs?: SparseStatsTable,
perfectIVs?: number,
isHidden?: boolean,
abilities?: string[],
maxEggMoves?: number,
moves?: string[],
pokeball?: string,
from?: string,
};
type Effect = Ability | Item | ActiveMove | Template | PureEffect | Format
interface SelfEffect {
boosts?: SparseBoostsTable
chance?: number
pseudoWeather?: string
sideCondition?: string
slotCondition?: string
terrain?: string
volatileStatus?: string
weather?: string
onHit?: MoveEventMethods['onHit']
}
interface SecondaryEffect {
chance?: number
ability?: Ability
boosts?: SparseBoostsTable
dustproof?: boolean
kingsrock?: boolean
self?: SelfEffect
status?: string
volatileStatus?: string
onHit?: MoveEventMethods['onHit']
}
interface CommonHandlers {
ModifierEffect: (this: Battle, relayVar: number, target: Pokemon, source: Pokemon, effect: Effect) => number | void;
ModifierMove: (this: Battle, relayVar: number, target: Pokemon, source: Pokemon, move: ActiveMove) => number | void;
ResultMove: boolean | ((this: Battle, target: Pokemon, source: Pokemon, move: ActiveMove) => boolean | null | "" | void);
ExtResultMove: boolean | ((this: Battle, target: Pokemon, source: Pokemon, move: ActiveMove) => boolean | null | number | "" | void);
VoidEffect: (this: Battle, target: Pokemon, source: Pokemon, effect: Effect) => void;
VoidMove: (this: Battle, target: Pokemon, source: Pokemon, move: ActiveMove) => void;
ModifierSourceEffect: (this: Battle, relayVar: number, source: Pokemon, target: Pokemon, effect: Effect) => number | void;
ModifierSourceMove: (this: Battle, relayVar: number, source: Pokemon, target: Pokemon, move: ActiveMove) => number | void;
ResultSourceMove: boolean | ((this: Battle, source: Pokemon, target: Pokemon, move: ActiveMove) => boolean | null | "" | void);
ExtResultSourceMove: boolean | ((this: Battle, source: Pokemon, target: Pokemon, move: ActiveMove) => boolean | null | number | "" | void);
VoidSourceEffect: (this: Battle, source: Pokemon, target: Pokemon, effect: Effect) => void;
VoidSourceMove: (this: Battle, source: Pokemon, target: Pokemon, move: ActiveMove) => void;
}
interface AbilityEventMethods {
onCheckShow?: (this: Battle, pokemon: Pokemon) => void
onEnd?: (this: Battle, target: Pokemon & Side & Field) => void
onPreStart?: (this: Battle, pokemon: Pokemon) => void
onStart?: (this: Battle, target: Pokemon) => void
}
interface ItemEventMethods {
onEat?: ((this: Battle, pokemon: Pokemon) => void) | false
onPrimal?: (this: Battle, pokemon: Pokemon) => void
onStart?: (this: Battle, target: Pokemon) => void
onTakeItem?: ((this: Battle, item: Item, pokemon: Pokemon, source: Pokemon, move?: ActiveMove) => boolean | void) | boolean
}
interface MoveEventMethods {
/** Return true to stop the move from being used */
beforeMoveCallback?: (this: Battle, pokemon: Pokemon, target: Pokemon | null, move: ActiveMove) => boolean | void
beforeTurnCallback?: (this: Battle, pokemon: Pokemon, target: Pokemon) => void
damageCallback?: (this: Battle, pokemon: Pokemon, target: Pokemon) => number | false
onAfterHit?: CommonHandlers['VoidSourceMove']
onAfterSubDamage?: (this: Battle, damage: number, target: Pokemon, source: Pokemon, move: ActiveMove) => void
onAfterMoveSecondarySelf?: CommonHandlers['VoidSourceMove']
onAfterMoveSecondary?: CommonHandlers['VoidMove']
onAfterMove?: CommonHandlers['VoidSourceMove']
/* Invoked by the global BasePower event (onEffect = true) */
onBasePower?: CommonHandlers['ModifierSourceMove']
onEffectiveness?: (this: Battle, typeMod: number, target: Pokemon | null, type: string, move: ActiveMove) => number | void
onHit?: CommonHandlers['ResultMove']
onHitField?: CommonHandlers['ResultMove']
onHitSide?: (this: Battle, side: Side, source: Pokemon, move: ActiveMove) => boolean | null | "" | void
onModifyMove?: (this: Battle, move: ActiveMove, pokemon: Pokemon, target: Pokemon) => void
onMoveFail?: CommonHandlers['VoidMove']
onModifyType?: (this: Battle, move: ActiveMove, pokemon: Pokemon, target: Pokemon) => void
onPrepareHit?: CommonHandlers['ResultMove']
onTry?: CommonHandlers['ResultSourceMove']
onTryHit?: CommonHandlers['ExtResultSourceMove']
onTryHitField?: CommonHandlers['ResultMove']
onTryHitSide?: (this: Battle, side: Side, source: Pokemon, move: ActiveMove) => boolean | null | "" | void
onTryImmunity?: CommonHandlers['ResultMove']
onTryMove?: CommonHandlers['ResultSourceMove']
onUseMoveMessage?: CommonHandlers['VoidSourceMove']
}
interface PureEffectEventMethods {
durationCallback?: (this: Battle, target: Pokemon, source: Pokemon, effect: Effect | null) => number
onCopy?: (this: Battle, pokemon: Pokemon) => void
onEnd?: (this: Battle, target: Pokemon & Side & Field) => void
onRestart?: (this: Battle, target: Pokemon & Side & Field, source: Pokemon) => void
onStart?: (this: Battle, target: Pokemon & Side & Field, source: Pokemon, sourceEffect: Effect) => void
}
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) => void
onAfterHit?: MoveEventMethods['onAfterHit']
onAfterSetStatus?: (this: Battle, status: PureEffect, target: Pokemon, source: Pokemon, effect: Effect) => void
onAfterSubDamage?: MoveEventMethods['onAfterSubDamage']
onAfterSwitchInSelf?: (this: Battle, pokemon: Pokemon) => void
onAfterUseItem?: (this: Battle, item: Item, pokemon: Pokemon) => void
onAfterBoost?: (this: Battle, boost: SparseBoostsTable, 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
onBoost?: (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']
onFaint?: CommonHandlers['VoidEffect']
onFlinch?: ((this: Battle, pokemon: Pokemon) => boolean | void) | boolean
onFractionalPriority?: CommonHandlers['ModifierSourceMove']
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']
onModifySpA?: CommonHandlers['ModifierSourceMove']
onModifySpD?: CommonHandlers['ModifierMove']
onModifySpe?: (this: Battle, spe: number, pokemon: Pokemon) => number | void
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 & Side, source: Pokemon, effect: Effect) => void
onSetAbility?: (this: Battle, ability: string, target: Pokemon, source: Pokemon, effect: Effect) => boolean | void
onSetStatus?: (this: Battle, status: PureEffect, target: Pokemon, source: Pokemon, effect: Effect) => boolean | null | void
onSetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => 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
onTerrain?: (this: Battle, pokemon: Pokemon) => void
onTerrainStart?: (this: Battle, target: Pokemon, source: Pokemon, terrain: PureEffect) => void
onWeatherStart?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => void
onTrapPokemon?: (this: Battle, pokemon: Pokemon) => void
onTryAddVolatile?: (this: Battle, status: PureEffect, target: Pokemon, source: Pokemon, sourceEffect: Effect) => boolean | null | void
onTryEatItem?: boolean | ((this: Battle, item: Item, pokemon: Pokemon) => boolean | void)
/* FIXME: onTryHeal() is run with two different sets of arguments */
onTryHeal?: (
((this: Battle, relayVar: number, target: Pokemon, source: Pokemon, effect: Effect) => number | boolean | void) |
((this: Battle, pokemon: Pokemon) => boolean | void) | boolean
);
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
onUpdate?: (this: Battle, pokemon: Pokemon) => void
onWeather?: (this: Battle, target: Pokemon, source: null, effect: PureEffect) => void
onWeatherModifyDamage?: CommonHandlers['ModifierSourceMove']
onModifyDamagePhase1?: CommonHandlers['ModifierSourceMove']
onModifyDamagePhase2?: CommonHandlers['ModifierSourceMove']
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: PureEffect, 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
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
onAllyBeforeTurn?: (this: Battle, pokemon: Pokemon) => void
onAllyBoost?: (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
onAllyModifyType?: MoveEventMethods['onModifyType']
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: PureEffect, target: Pokemon, source: Pokemon, effect: Effect) => boolean | null | void
onAllySetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => boolean | void
onAllyStallMove?: (this: Battle, pokemon: Pokemon) => boolean | void
onAllySwitchIn?: (this: Battle, pokemon: Pokemon) => 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
onAllyTerrainStart?: (this: Battle, target: Pokemon, source: Pokemon, terrain: PureEffect) => void
onAllyWeatherStart?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => void
onAllyTrapPokemon?: (this: Battle, pokemon: Pokemon) => void
onAllyTryAddVolatile?: (this: Battle, status: PureEffect, 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
onAllyUpdate?: (this: Battle, pokemon: Pokemon) => void
onAllyWeather?: (this: Battle, target: Pokemon, source: null, effect: PureEffect) => void
onAllyWeatherModifyDamage?: CommonHandlers['ModifierSourceMove']
onAllyModifyDamagePhase1?: CommonHandlers['ModifierSourceMove']
onAllyModifyDamagePhase2?: 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: PureEffect, 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
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
onFoeBeforeTurn?: (this: Battle, pokemon: Pokemon) => void
onFoeBoost?: (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
onFoeModifyType?: MoveEventMethods['onModifyType']
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: PureEffect, target: Pokemon, source: Pokemon, effect: Effect) => boolean | null | void
onFoeSetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => boolean | void
onFoeStallMove?: (this: Battle, pokemon: Pokemon) => boolean | void
onFoeSwitchIn?: (this: Battle, pokemon: Pokemon) => 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
onFoeTerrainStart?: (this: Battle, target: Pokemon, source: Pokemon, terrain: PureEffect) => void
onFoeWeatherStart?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => void
onFoeTrapPokemon?: (this: Battle, pokemon: Pokemon) => void
onFoeTryAddVolatile?: (this: Battle, status: PureEffect, 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
onFoeUpdate?: (this: Battle, pokemon: Pokemon) => void
onFoeWeather?: (this: Battle, target: Pokemon, source: null, effect: PureEffect) => 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: PureEffect, 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
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
onSourceBeforeTurn?: (this: Battle, pokemon: Pokemon) => void
onSourceBoost?: (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
onSourceModifyType?: MoveEventMethods['onModifyType']
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: PureEffect, target: Pokemon, source: Pokemon, effect: Effect) => boolean | null | void
onSourceSetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => boolean | void
onSourceStallMove?: (this: Battle, pokemon: Pokemon) => boolean | void
onSourceSwitchIn?: (this: Battle, pokemon: Pokemon) => 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
onSourceTerrainStart?: (this: Battle, target: Pokemon, source: Pokemon, terrain: PureEffect) => void
onSourceWeatherStart?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => void
onSourceTrapPokemon?: (this: Battle, pokemon: Pokemon) => void
onSourceTryAddVolatile?: (this: Battle, status: PureEffect, 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
onSourceUpdate?: (this: Battle, pokemon: Pokemon) => void
onSourceWeather?: (this: Battle, target: Pokemon, source: null, effect: PureEffect) => 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: PureEffect, 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
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
onAnyBeforeTurn?: (this: Battle, pokemon: Pokemon) => void
onAnyBoost?: (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
onAnyModifyType?: MoveEventMethods['onModifyType']
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']
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: PureEffect, target: Pokemon, source: Pokemon, effect: Effect) => boolean | null | void
onAnySetWeather?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => 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
onAnyTerrainStart?: (this: Battle, target: Pokemon, source: Pokemon, terrain: PureEffect) => void
onAnyWeatherStart?: (this: Battle, target: Pokemon, source: Pokemon, weather: PureEffect) => void
onAnyTrapPokemon?: (this: Battle, pokemon: Pokemon) => void
onAnyTryAddVolatile?: (this: Battle, status: PureEffect, 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
onAnyUpdate?: (this: Battle, pokemon: Pokemon) => void
onAnyWeather?: (this: Battle, target: Pokemon, source: null, effect: PureEffect) => void
onAnyWeatherModifyDamage?: CommonHandlers['ModifierSourceMove']
onAnyModifyDamagePhase1?: CommonHandlers['ModifierSourceMove']
onAnyModifyDamagePhase2?: CommonHandlers['ModifierSourceMove']
// Priorities (incomplete list)
onAccuracyPriority?: number
onDamagingHitOrder?: number
onAfterMoveSecondaryPriority?: number
onAfterMoveSecondarySelfPriority?: number
onAfterMoveSelfPriority?: number
onAnyBasePowerPriority?: number
onAnyInvulnerabilityPriority?: number
onAnyFaintPriority?: number
onAllyBasePowerPriority?: number
onAllyModifyAtkPriority?: number
onAttractPriority?: number
onBasePowerPriority?: number
onBeforeMovePriority?: number
onBeforeSwitchOutPriority?: number
onBoostPriority?: number
onDamagePriority?: number
onDragOutPriority?: number
onFoeBasePowerPriority?: number
onFoeBeforeMovePriority?: number
onFoeModifyDefPriority?: number
onFoeRedirectTargetPriority?: number
onFoeTrapPokemonPriority?: number
onFractionalPriorityPriority?: number
onHitPriority?: number
onModifyAccuracyPriority?: number
onModifyAtkPriority?: number
onModifyCritRatioPriority?: number
onModifyDefPriority?: number
onModifyMovePriority?: number
onModifyPriorityPriority?: number
onModifySpAPriority?: number
onModifySpDPriority?: number
onModifyTypePriority?: number
onModifyWeightPriority?: number
onRedirectTargetPriority?: number
onResidualOrder?: number
onResidualPriority?: number
onResidualSubOrder?: number
onSourceBasePowerPriority?: number
onSourceInvulnerabilityPriority?: number
onSourceModifyAtkPriority?: number
onSourceModifySpAPriority?: number
onSwitchInPriority?: number
onTrapPokemonPriority?: number
onTryHealPriority?: number
onTryHitPriority?: number
onTryMovePriority?: number
onTryPrimaryHitPriority?: number
onTypePriority?: number
}
interface EffectData {
id: string
name: string
num: number
affectsFainted?: boolean
counterMax?: number
desc?: string
drain?: [number, number]
duration?: number
durationCallback?: (this: Battle, target: Pokemon, source: Pokemon, effect: Effect | null) => number
effect?: Partial<PureEffect>
effectType?: string
infiltrates?: boolean
isNonstandard?: Nonstandard | null
isUnreleased?: boolean | 'Past'
/**
* `true` for generic Z-moves like Gigavolt Havoc.
* Also `true` for Z-powered status moves like Z-Encore.
* Move ID of the base move, for specific Z-moves like Stoked
* Sparksurfer.
*/
isZ?: boolean | string
/**
* `true` for Max moves like Max Airstream. If its a G-Max moves, this is
* the species ID of the Gigantamax Pokemon that can use this G-Max move.
*/
isMax?: boolean | string
noCopy?: boolean
recoil?: [number, number]
secondary?: SecondaryEffect | null
secondaries?: SecondaryEffect[] | null
self?: SelfEffect | null
shortDesc?: string
status?: string
weather?: string
onRestart?: (this: Battle, target: Pokemon & Side & Field, source: Pokemon) => void
}
interface ModdedEffectData extends Partial<EffectData> {
inherit?: boolean
}
type EffectType = 'Effect' | 'Pokemon' | 'Move' | 'Item' | 'Ability' | 'Format' | 'Ruleset' | 'Weather' | 'Status' | 'Rule' | 'ValidatorRule'
interface BasicEffect extends EffectData {
id: ID
weather?: ID
status?: ID
effectType: EffectType
exists: boolean
fullname: string
gen: number
sourceEffect: string
toString: () => string
}
interface PureEffectData extends EffectData, PureEffectEventMethods, EventMethods, EffectData {
}
interface ModdedPureEffectData extends Partial<PureEffectData>, ModdedEffectData {}
interface PureEffect extends Readonly<BasicEffect & PureEffectData> {
readonly effectType: 'Status' | 'Effect' | 'Weather'
}
interface AbilityData extends EffectData, AbilityEventMethods, EventMethods {
rating: number
isUnbreakable?: boolean
suppressWeather?: boolean
}
interface ModdedAbilityData extends Partial<AbilityData>, ModdedEffectData {
onAfterMega?: (this: Battle, pokemon: Pokemon) => void
}
interface Ability extends Readonly<BasicEffect & AbilityData> {
readonly effectType: 'Ability'
}
interface FlingData {
basePower: number
status?: string
volatileStatus?: string
effect?: MoveEventMethods['onHit']
}
interface ItemData extends EffectData, ItemEventMethods, EventMethods {
gen: number
fling?: FlingData
forcedForme?: string
ignoreKlutz?: boolean
isBerry?: boolean
isChoice?: boolean
isGem?: boolean
isPokeball?: boolean
megaStone?: string
megaEvolves?: string
naturalGift?: {basePower: number, type: string}
onDrive?: string
onMemory?: string
onPlate?: string
spritenum?: number
zMove?: string | true
zMoveFrom?: string
zMoveType?: string
itemUser?: string[]
boosts?: SparseBoostsTable | false
}
interface ModdedItemData extends Partial<ItemData>, ModdedEffectData {
onCustap?: (this: Battle, pokemon: Pokemon) => void
}
interface Item extends Readonly<BasicEffect & ItemData> {
readonly effectType: 'Item'
}
interface MoveData extends EffectData, MoveEventMethods {
accuracy: true | number
basePower: number
category: 'Physical' | 'Special' | 'Status'
flags: AnyObject
pp: number
priority: number
target: MoveTarget
type: string
alwaysHit?: boolean
baseMoveType?: string
basePowerModifier?: number
boosts?: SparseBoostsTable | false
breaksProtect?: boolean
contestType?: string
critModifier?: number
critRatio?: number
damage?: number | 'level' | false | null
defensiveCategory?: 'Physical' | 'Special' | 'Status'
forceSwitch?: boolean
hasCustomRecoil?: boolean
heal?: number[] | null
ignoreAbility?: boolean
ignoreAccuracy?: boolean
ignoreDefensive?: boolean
ignoreEvasion?: boolean
ignoreImmunity?: boolean | {[k: string]: boolean}
ignoreNegativeOffensive?: boolean
ignoreOffensive?: boolean
ignorePositiveDefensive?: boolean
ignorePositiveEvasion?: boolean
isSelfHit?: boolean
isFutureMove?: boolean
isViable?: boolean
isMax?: boolean | string
mindBlownRecoil?: boolean
multiaccuracy?: boolean
multihit?: number | number[]
multihitType?: string
noDamageVariance?: boolean
noFaint?: boolean
noMetronome?: string[]
nonGhostTarget?: string
noPPBoosts?: boolean
noSketch?: boolean
ohko?: boolean | string
pressureTarget?: string
pseudoWeather?: string
selfBoost?: {boosts?: SparseBoostsTable}
selfdestruct?: string | boolean
selfSwitch?: string | boolean
sideCondition?: string
sleepUsable?: boolean
slotCondition?: string
spreadModifier?: number
stallingMove?: boolean
stealsBoosts?: boolean
struggleRecoil?: boolean
terrain?: string
thawsTarget?: boolean
/**
* Tracks the original target through Ally Switch and other switch-out-and-back-in
* situations, rather than just targeting a slot. (Stalwart, Snipe Shot)
*/
tracksTarget?: boolean
useTargetOffensive?: boolean
useSourceDefensiveAsOffensive?: boolean
volatileStatus?: string
weather?: string
willCrit?: boolean
forceSTAB?: boolean
zMovePower?: number
zMoveEffect?: string
zMoveBoost?: SparseBoostsTable
gmaxPower?: number
basePowerCallback?: (this: Battle, pokemon: Pokemon, target: Pokemon, move: ActiveMove) => number | false | null
baseMove?: string
/**
* Has this move been boosted by a Z-crystal? Usually the same as
* `isZ`, but hacked moves will have this be `false` and `isZ` be
* truthy.
*/
isZPowered?: boolean
/**
* Same idea has `isZPowered`. Hacked Max moves will have this be
* `false` and `isMax` be truthy.
*/
maxPowered?: boolean
}
interface ModdedMoveData extends Partial<MoveData>, ModdedEffectData {}
interface Move extends Readonly<BasicEffect & MoveData> {
readonly effectType: 'Move'
}
type MoveHitData = {[targetSlotid: string]: {
/** Did this move crit against the target? */
crit: boolean;
/** The type effectiveness of this move against the target */
typeMod: number;
/**
* Is this move a Z-Move that broke the target's protection?
* (does 0.25x regular damage)
*/
zBrokeProtect: boolean;
}}
interface ActiveMove extends BasicEffect, MoveData {
readonly effectType: 'Move'
id: ID
weather?: ID
status?: ID
hit: number
moveHitData?: MoveHitData
ability?: Ability
aerilateBoosted?: boolean
allies?: Pokemon[]
auraBooster?: Pokemon
causedCrashDamage?: boolean
forceStatus?: ID
galvanizeBoosted?: boolean
hasAuraBreak?: boolean
hasBounced?: boolean
hasSheerForce?: boolean
/** Is the move called by Dancer? Used to prevent infinite Dancer recursion. */
isExternal?: boolean
lastHit?: boolean
magnitude?: number
negateSecondary?: boolean
normalizeBoosted?: boolean
pixilateBoosted?: boolean
pranksterBoosted?: boolean
refrigerateBoosted?: boolean
selfDropped?: boolean
selfSwitch?: ID | boolean
spreadHit?: boolean
stab?: number
statusRoll?: string
totalDamage?: number | false
willChangeForme?: boolean
infiltrates?: boolean
}
type TemplateAbility = {0: string, 1?: string, H?: string, S?: string}
interface TemplateData {
abilities: TemplateAbility
baseStats: StatsTable
canHatch?: boolean
color: string
eggGroups: string[]
heightm: number
num: number
species: string
types: string[]
weightkg: number
baseForme?: string
baseSpecies?: string
evoLevel?: number
evoMove?: string
evoCondition?: string
evoItem?: string
evos?: string[]
evoType?: 'trade' | 'useItem' | 'levelMove' | 'levelExtra' | 'levelFriendship' | 'levelHold' | 'other'
forme?: string
gender?: GenderName
genderRatio?: {[k: string]: number}
maxHP?: number
otherForms?: string[]
otherFormes?: string[]
prevo?: string
inheritsFrom?: string | string[]
}
interface ModdedTemplateData extends Partial<TemplateData> {
inherit?: true,
}
interface TemplateFormatsData {
battleOnly?: boolean
comboMoves?: readonly string[]
doublesTier?: string
encounters?: EventInfo[]
essentialMove?: string
eventOnly?: boolean
eventPokemon?: EventInfo[]
exclusiveMoves?: readonly string[]
gen?: number
isGigantamax?: string
isNonstandard?: Nonstandard | null
isUnreleased?: boolean | 'Past'
maleOnlyHidden?: boolean
randomBattleMoves?: readonly string[]
randomDoubleBattleMoves?: readonly string[]
requiredAbility?: string
requiredItem?: string
requiredItems?: string[]
requiredMove?: string
tier?: string
unreleasedHidden?: boolean | 'Past'
}
interface ModdedTemplateFormatsData extends Partial<TemplateFormatsData> {
inherit?: true,
randomSet1?: RandomTeamsTypes.TemplateRandomSet
randomSet2?: RandomTeamsTypes.TemplateRandomSet
randomSet3?: RandomTeamsTypes.TemplateRandomSet
randomSet4?: RandomTeamsTypes.TemplateRandomSet
randomSet5?: RandomTeamsTypes.TemplateRandomSet
}
type Template = import('./dex-data').Template;
type GameType = 'singles' | 'doubles' | 'triples' | 'rotation' | 'multi' | 'free-for-all'
type SideID = 'p1' | 'p2' | 'p3' | 'p4'
interface GameTimerSettings {
dcTimer: boolean;
dcTimerBank: boolean;
starting: number;
grace: number;
addPerTurn: number;
maxPerTurn: number;
maxFirstTurn: number;
timeoutAutoChoose: boolean;
accelerate: boolean;
}
interface FormatsData extends EventMethods {
name: string
banlist?: string[]
battle?: ModdedBattleScriptsData
pokemon?: ModdedBattlePokemon
cannotMega?: string[]
challengeShow?: boolean
debug?: boolean
defaultLevel?: number
desc?: string
effectType?: string
forcedLevel?: number
gameType?: GameType
maxForcedLevel?: number
maxLevel?: number
mod?: string
onBasePowerPriority?: number
onModifyMovePriority?: number
onModifyTypePriority?: number
onSwitchInPriority?: number
rated?: boolean
minSourceGen?: number
restrictedAbilities?: string[]
restrictedMoves?: string[]
restrictedStones?: string[]
ruleset?: string[]
searchShow?: boolean
allowMultisearch?: boolean
team?: string
teamLength?: {validate?: [number, number], battle?: number}
threads?: string[]
timer?: Partial<GameTimerSettings>
tournamentShow?: boolean
unbanlist?: string[]
checkLearnset?: (this: TeamValidator, move: Move, template: Template, setSources: PokemonSources, set: PokemonSet) => {type: string, [any: string]: any} | null
onAfterMega?: (this: Battle, pokemon: Pokemon) => void
onBegin?: (this: Battle) => void
onChangeSet?: (this: TeamValidator, set: PokemonSet, format: Format, setHas?: AnyObject, teamHas?: AnyObject) => string[] | void
onModifyTemplate?: (this: Battle, template: Template, target?: Pokemon, source?: Pokemon, effect?: Effect) => Template | void
onStart?: (this: Battle) => void
onTeamPreview?: (this: Battle) => void
onValidateSet?: (this: TeamValidator, set: PokemonSet, format: Format, setHas: AnyObject, teamHas: AnyObject) => string[] | void
onValidateTeam?: (this: TeamValidator, team: PokemonSet[], format: Format, teamHas: AnyObject) => string[] | void
validateSet?: (this: TeamValidator, set: PokemonSet, teamHas: AnyObject) => string[] | null
validateTeam?: (this: TeamValidator, team: PokemonSet[], removeNicknames: boolean) => string[] | void,
trunc?: (n: number) => number;
section?: string,
column?: number
}
interface ModdedFormatsData extends Partial<FormatsData> {
inherit?: boolean
}
interface Format extends Readonly<BasicEffect & FormatsData> {
readonly effectType: 'Format' | 'Ruleset' | 'Rule' | 'ValidatorRule'
readonly baseRuleset: string[]
readonly banlist: string[]
readonly customRules: string[] | null
readonly defaultLevel: number
readonly maxLevel: number
readonly noLog: boolean
readonly ruleset: string[]
readonly unbanlist: string[]
ruleTable: import('./dex-data').RuleTable | null
}
type SpreadMoveTargets = (Pokemon | false | null)[]
type SpreadMoveDamage = (number | boolean | undefined)[]
type ZMoveOptions = ({move: string, target: MoveTarget} | null)[]
type DynamaxOptions = {maxMoves: ({move: string, target: MoveTarget})[], gigantamax?: string}
interface BattleScriptsData {
gen: number
zMoveTable?: {[k: string]: string}
maxMoveTable?: {[k: string]: string}
afterMoveSecondaryEvent?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => undefined
calcRecoilDamage?: (this: Battle, damageDealt: number, move: Move) => number
canMegaEvo?: (this: Battle, pokemon: Pokemon) => string | undefined | null
canUltraBurst?: (this: Battle, pokemon: Pokemon) => string | null
canZMove?: (this: Battle, pokemon: Pokemon) => ZMoveOptions | void
canDynamax?: (this: Battle, pokemon: Pokemon, skipChecks?: boolean) => DynamaxOptions | void
forceSwitch?: (this: Battle, damage: SpreadMoveDamage, targets: SpreadMoveTargets, source: Pokemon, move: ActiveMove, moveData: ActiveMove, isSecondary?: boolean, isSelf?: boolean) => SpreadMoveDamage
getActiveMaxMove?: (this: Battle, move: Move, pokemon: Pokemon) => ActiveMove
getActiveZMove?: (this: Battle, move: Move, pokemon: Pokemon) => ActiveMove
getMaxMove?: (this: Battle, move: Move, pokemon: Pokemon) => Move | undefined
getSpreadDamage?: (this: Battle, damage: SpreadMoveDamage, targets: SpreadMoveTargets, source: Pokemon, move: ActiveMove, moveData: ActiveMove, isSecondary?: boolean, isSelf?: boolean) => SpreadMoveDamage
getZMove?: (this: Battle, move: Move, pokemon: Pokemon, skipChecks?: boolean) => string | undefined
hitStepAccuracy?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => boolean[]
hitStepBreakProtect?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => undefined
hitStepMoveHitLoop?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => SpreadMoveDamage
hitStepTryImmunity?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => boolean[]
hitStepStealBoosts?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => undefined
hitStepTryHitEvent?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => (boolean | '')[]
hitStepInvulnerabilityEvent?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => boolean[]
hitStepTypeImmunity?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => boolean[]
isAdjacent?: (this: Battle, pokemon1: Pokemon, pokemon2: Pokemon) => boolean
moveHit?: (this: Battle, target: Pokemon | null, pokemon: Pokemon, move: ActiveMove, moveData?: ActiveMove, isSecondary?: boolean, isSelf?: boolean) => number | undefined | false
resolveAction?: (this: Battle, action: AnyObject, midTurn?: boolean) => Actions.Action
runAction?: (this: Battle, action: Actions.Action) => void
runMegaEvo?: (this: Battle, pokemon: Pokemon) => boolean
runMove?: (this: Battle, moveOrMoveName: Move | string, pokemon: Pokemon, targetLoc: number, sourceEffect?: Effect | null, zMove?: string, externalMove?: boolean, maxMove?: string, originalTarget?: Pokemon) => void
runMoveEffects?: (this: Battle, damage: SpreadMoveDamage, targets: SpreadMoveTargets, source: Pokemon, move: ActiveMove, moveData: ActiveMove, isSecondary?: boolean, isSelf?: boolean) => SpreadMoveDamage
runZPower?: (this: Battle, move: ActiveMove, pokemon: Pokemon) => void
secondaries?: (this: Battle, targets: SpreadMoveTargets, source: Pokemon, move: ActiveMove, moveData: ActiveMove, isSelf?: boolean) => void
selfDrops?: (this: Battle, targets: SpreadMoveTargets, source: Pokemon, move: ActiveMove, moveData: ActiveMove, isSecondary?: boolean) => void
spreadMoveHit?: (this: Battle, targets: SpreadMoveTargets, pokemon: Pokemon, move: ActiveMove, moveData?: ActiveMove, isSecondary?: boolean, isSelf?: boolean) => [SpreadMoveDamage, SpreadMoveTargets]
targetTypeChoices?: (this: Battle, targetType: string) => boolean
tryMoveHit?: (this: Battle, target: Pokemon, pokemon: Pokemon, move: ActiveMove) => number | undefined | false | ''
tryPrimaryHitEvent?: (this: Battle, damage: SpreadMoveDamage, targets: SpreadMoveTargets, pokemon: Pokemon, move: ActiveMove, moveData: ActiveMove, isSecondary?: boolean) => SpreadMoveDamage
trySpreadMoveHit?: (this: Battle, targets: Pokemon[], pokemon: Pokemon, move: ActiveMove) => boolean
useMove?: (this: Battle, move: Move, pokemon: Pokemon, target?: Pokemon | null, sourceEffect?: Effect | null, zMove?: string, maxMove?: string) => boolean
useMoveInner?: (this: Battle, move: Move, pokemon: Pokemon, target?: Pokemon | null, sourceEffect?: Effect | null, zMove?: string, maxMove?: string) => boolean
}
interface ModdedBattleSide {
lastMove?: Move | null
}
interface ModdedBattlePokemon {
inherit?: boolean
boostBy?: (this: Pokemon, boost: SparseBoostsTable) => boolean | number
calculateStat?: (this: Pokemon, statName: StatNameExceptHP, boost: number, modifier?: number) => number
getAbility?: (this: Pokemon) => Ability
getActionSpeed?: (this: Pokemon) => number
getRequestData?: (this: Pokemon) => {moves: {move: string, id: ID, target?: string, disabled?: boolean}[], maybeDisabled?: boolean, trapped?: boolean, maybeTrapped?: boolean, canMegaEvo?: boolean, canUltraBurst?: boolean, canZMove?: ZMoveOptions}
getStat?: (this: Pokemon, statName: StatNameExceptHP, unboosted?: boolean, unmodified?: boolean, fastReturn?: boolean) => number
getWeight?: (this: Pokemon) => number
hasAbility?: (this: Pokemon, ability: string | string[]) => boolean
isGrounded?: (this: Pokemon, negateImmunity: boolean | undefined) => boolean | null
modifyStat?: (this: Pokemon, statName: StatNameExceptHP, modifier: number) => void
moveUsed?: (this: Pokemon, move: Move, targetLoc?: number) => void
recalculateStats?: (this: Pokemon) => void
setAbility?: (this: Pokemon, ability: string | Ability, source: Pokemon | null, isFromFormeChange: boolean) => string | false
transformInto?: (this: Pokemon, pokemon: Pokemon, effect: Effect | null) => boolean
setStatus?: (this: Pokemon, status: string | PureEffect, source: Pokemon | null, sourceEffect: Effect | null, ignoreImmunities: boolean) => boolean
ignoringAbility?: (this: Pokemon) => boolean;
}
interface ModdedBattleScriptsData extends Partial<BattleScriptsData> {
inherit?: string
lastDamage?: number
pokemon?: ModdedBattlePokemon
side?: ModdedBattleSide
boost?: (this: Battle, boost: SparseBoostsTable, target: Pokemon, source?: Pokemon | null, effect?: Effect | string | null, isSecondary?: boolean, isSelf?: boolean) => boolean | null | 0
debug?: (this: Battle, activity: string) => void
getDamage?: (this: Battle, pokemon: Pokemon, target: Pokemon, move: string | number | ActiveMove, suppressMessages: boolean) => number | undefined | null | false
getEffect?: (this: Battle, name: string | Effect | null) => Effect
init?: (this: ModdedDex) => void
modifyDamage?: (this: Battle, baseDamage: number, pokemon: Pokemon, target: Pokemon, move: ActiveMove, suppressMessages?: boolean) => void
natureModify?: (this: Battle, stats: StatsTable, set: PokemonSet) => StatsTable
spreadModify?: (this: Battle, baseStats: StatsTable, set: PokemonSet) => StatsTable
suppressingWeather?: (this: Battle) => boolean
// oms
doGetMixedTemplate?: (this: Battle, template: Template, deltas: AnyObject) => Template
getMegaDeltas?: (this: Battle, megaSpecies: Template) => AnyObject
getMixedTemplate?: (this: Battle, originalSpecies: string, megaSpecies: string) => Template
getAbility?: (this: Battle, name: string | Ability ) => Ability
getZMove?: (this: Battle, move: Move, pokemon: Pokemon, skipChecks?: boolean) => string | undefined
getActiveZMove?: (this: Battle, move: Move, pokemon: Pokemon) => ActiveMove
canZMove?: (this: Battle, pokemon: Pokemon) => ZMoveOptions | void
}
interface TypeData {
damageTaken: {[attackingTypeNameOrEffectid: string]: number}
HPdvs?: SparseStatsTable
HPivs?: SparseStatsTable
}
interface ModdedTypeData extends Partial<TypeData> {
inherit?: boolean
}
interface TypeInfo extends Readonly<TypeData> {
readonly effectType: 'Type' | 'EffectType'
readonly exists: boolean
readonly gen: number
readonly HPdvs: SparseStatsTable
readonly HPivs: SparseStatsTable
readonly id: ID
readonly name: string
readonly toString: () => string
}
interface PlayerOptions {
name?: string;
avatar?: string;
rating?: number;
team?: PokemonSet[] | string | null;
seed?: PRNGSeed;
}
namespace Actions {
/** A move action */
export interface MoveAction {
/** action type */
choice: 'move' | 'beforeTurnMove';
order: 3 | 5 | 200 | 201 | 199;
/** priority of the action (lower first) */
priority: number;
/** fractional priority of the action (lower first) */
fractionalPriority: number;
/** speed of pokemon using move (higher first if priority tie) */
speed: number;
/** the pokemon doing the move */
pokemon: Pokemon;
/** location of the target, relative to pokemon's side */
targetLoc: number;
/** original target pokemon, for target-tracking moves */
originalTarget: Pokemon;
/** a move to use (move action only) */
moveid: ID
/** a move to use (move action only) */
move: Move;
/** true if megaing or ultra bursting */
mega: boolean | 'done';
/** if zmoving, the name of the zmove */
zmove?: string;
/** if dynamaxed, the name of the max move */
maxMove?: string;
/** effect that called the move (eg Instruct) if any */
sourceEffect?: Effect | null;
}
/** A switch action */
export interface SwitchAction {
/** action type */
choice: 'switch' | 'instaswitch';
order: 3 | 103;
/** priority of the action (lower first) */
priority: number;
/** speed of pokemon switching (higher first if priority tie) */
speed: number;
/** the pokemon doing the switch */
pokemon: Pokemon;
/** pokemon to switch to */
target: Pokemon;
/** effect that called the switch (eg U */
sourceEffect: Effect | null;
}
/** A Team Preview choice action */
export interface TeamAction {
/** action type */
choice: 'team';
/** priority of the action (lower first) */
priority: number;
/** unused for this action type */
speed: 1;
/** the pokemon switching */
pokemon: Pokemon;
/** new index */
index: number;
}
/** A generic action not done by a pokemon */
export interface FieldAction {
/** action type */
choice: 'start' | 'residual' | 'pass' | 'beforeTurn';
/** priority of the action (lower first) */
priority: number;
/** unused for this action type */
speed: 1;
/** unused for this action type */
pokemon: null;
}
/** A generic action done by a single pokemon */
export interface PokemonAction {
/** action type */
choice: 'megaEvo' | 'shift' | 'runPrimal' | 'runSwitch' | 'event' | 'runUnnerve' | 'runDynamax';
/** priority of the action (lower first) */
priority: number;
/** speed of pokemon doing action (higher first if priority tie) */
speed: number;
/** the pokemon doing action */
pokemon: Pokemon;
}
export type Action = MoveAction | SwitchAction | TeamAction | FieldAction | PokemonAction;
}
namespace RandomTeamsTypes {
export interface TeamDetails {
megaStone?: number;
zMove?: number;
hail?: number;
rain?: number;
sand?: number;
sun?: number;
stealthRock?: number;
spikes?: number;
toxicSpikes?: number;
stickyWeb?: number;
rapidSpin?: number;
defog?: number;
illusion?: number;
}
export interface FactoryTeamDetails {
megaCount: number;
zCount?: number;
forceResult: boolean;
weather?: string;
typeCount: {[k: string]: number};
typeComboCount: {[k: string]: number};
baseFormes: {[k: string]: number};
has: {[k: string]: number};
weaknesses: {[k: string]: number};
resistances: {[k: string]: number};
}
export interface RandomSet {
name: string;
species: string;
gender: string | boolean;
moves: string[];
ability: string;
evs: SparseStatsTable;
ivs: SparseStatsTable;
item: string;
level: number;
shiny: boolean;
nature?: string;
happiness?: number;
moveset?: RandomTeamsTypes.RandomSet;
other?: {discard: boolean, restrictMoves: {[k: string]: number}};
}
export interface RandomFactorySet {
name: string;
species: string;
gender: string;
item: string;
ability: string;
shiny: boolean;
level: number;
happiness: number;
evs: SparseStatsTable;
ivs: SparseStatsTable;
nature: string;
moves: string[];
}
export interface TemplateRandomSet {
chance: number;
item: string[];
baseMove1?: string;
baseMove2?: string;
baseMove3?: string;
baseMove4?: string;
fillerMoves1?: string[];
fillerMoves2?: string[];
fillerMoves3?: string[];
fillerMoves4?: string[];
}
}
interface PokemonModData {
gluttonyFlag?: boolean; // Gen-NEXT
innate?: string; // Partners in Crime
originalSpecies?: string; // Mix and Mega
[key: string]: any;
}