Sim events:

Any event that fires on a pokemon also fires on that pokemon's side. So, for instance,
foeModifyMove can be captured by Reflect, a side condition on the foe's side.

Any event that fires on a side also fires on the global battle. So, for instance,
a move's basePower event can be captured by Rain Dance, a weather condition on
the global battle.

=== LIST OF EVENTS ===

beforeMove(user, target) [on move]
beforeMove(user, target, move) [on user]
foeBeforeMove(user, target, move) [on target]
	Fired before a pokemon uses a move it chose. Return true to prevent
	the move.

	Mostly effects that prevent a user from moving, such as paralysis.

	Moves not called directly (e.g. moves called by Metronome, Sleep Talk,
	or Pursuit) do not fire this event.

	examples: [volatile] Flinching, [status] fully paralyzed,
	          [move] Focus Punch

basePower(user, target) [on move]
basePower(user, target, basePower, move) [on user]
foeBasePower(user, target, basePower, move) [on target]
	Fired while calculating a move's base power. Return the modified
	base power.

	examples: [ability] Technician, [foe side condition] Reflect,
	          [move] Gyro Ball

beforeTurn(pokemon) [on pokemon]
beforeTurn(user) [on move]
	Fired before a turn starts on every active pokemon.

	Used for Focus Punch (for the "focusing" message) and Pursuit
	(to activate the side condition that listens for the foeSwitchOut
	event).

	examples: [move] Focus Punch, [move] Pursuit

damage(user, target) [on move]
	Fired while calculating a move's damage. Return a damage value in
	directly in HP. Bypasses weaknesses and resistances, but not immunities.

	examples: [move] Night Shade, [move] Endeavor

modifyMove(user, target, move) [on user]
foeModifyMove(user, target, move) [on target]
	Fired before a pokemon uses a move. Return true to prevent the move.

	The API is very similar to beforeMove, but the usage is different.

	Behavior differences:
	1. It is passed a copy of the move object that can be modified.
	2. It is fired for moves that bypass beforeMove (moves called by
	Metronome, Sleep Talk, or Pursuit switching).

	NOTE: Base Power modifications should be handled in basePower, not in
	modifyMove. This is because many moves have variable base power.

	NOTE: Priority modifications should be handled in movePriority. This is
	for performance reasons (there's no need to fire movePriority for
	moves that bypass priority, e.g. moves called by Sleep Talk).

	examples: [ability] Adaptability, [ability, foe ability] No Guard

modifyPokemon(pokemon) [on pokemon]
	Any effect that modifies a pokemon should be applied here.

	These are the properties of pokemon you can modify:
	- pokemon.stats
	- pokemon.weighthg
	- pokemon.type

	Whenever any effect is added or removed, the pokemon is reset and
	modifyPokemon is fired.

	examples: [ability] Light Metal, [volatile] Conversion 2, etc

stats(stats, pokemon) [on pokemon]
	A shortcut event for modifyPokemon(pokemon) : stats = pokemon.stats.

	Stats modifiers should be applied here.

	examples: [ability] Swift Swim, [status] Paralysis, etc


type(user, target) [on move]
	Fired when calculating a move's type. Returns the move's type, for
	the purposes of calculating damage. Not used for the move's type in
	any other situation.

	Only used for Struggle, which is Normal-type but does ???-type damage.

	examples: [move] Struggle

switchIn(pokemon) [on pokemon]
foeSwitchIn(pokemon) [on pokemon's foe's side]
	Fired after a pokemon switches in.

	If two pokemon switch in at once (first turn, or after two pokemon
	faint simultaneously), both switchIn events will fire after both pokemon
	have switched in, and the faster pokemon's switchIn event will fire
	first.

	examples: [ability] Drizzle, [ability] Intimidate, etc

switchOut(pokemon) [on pokemon]
foeSwitchOut(pokemon) [on pokemon's foe's side]
	Fired before a pokemon switches out. Return true to interrupt and
	prevent the pokemon from switching out.

	NOTE: This event fires for (and overrides) Baton Pass and U-Turn and
	Pokémon with Shed Shell. DO NOT use it to implement trapping: see the
	trapping flag.

	NOTE: NOTHING in BW or earlier prevents a pokemon from switching out
	at this stage, so you most likely DO NOT want to ever return true.

	examples: [foe side condition] Pursuit

immunity(type, target) [on target]
	Fired when determining whether or not a pokemon is immune to a move.
	Return true if it is immune. Or: 'noMessage' if it is immune - this
	suppresses the "It had no effect!" message, so you can replace it with
	your own, such as "Motor Drive raised its speed!"

	examples: [volatile] Magnet Rise, [ability] Volt Absorb, etc

immunity(effect, target) [on target]
	Fired when determining whether or not a pokemon is immune to a non-move
	effect, such as status infection or weather damage.

	examples: [type] Poison, [ability] Water Veil, [ability] Sand Rush, etc

getHit(target, source, move) [on target]
foeGetHit(target, source, move) [on source]
hit(target, source) [on move]
	Fired when a move hits (doesn't miss). Return true to prevent the move's
	effects.

	Also used for moves whose effects are too complicated to be represented
	in any other way.

	examples: [foe volatile] Protect, [move] Belly Drum, etc

movePriority(priority, user, target, move) [on user]
foeMovePriority(priority, user, target, move) [on target]
	Fired when determining a move's priority. Return the move's priority.

	examples: [ability] Prankster

start(pokemon, source) [on status, on volatile]
start(side, source) [on side condition]
start(placeholder, source) [on weather, on field effect]
	Fired when an effect starts.

	source is the pokemon that inflicted the effect, or null if no such
	pokemon did. For instance, if Pikachu uses Toxic, source is Pikachu,
	but if you are poisoned by Toxic Spikes, source is null.

	Useful for cancelling an effect that fails (e.g. Encore against a newly
	switched-in foe), for giving messages that an effect has started, and
	for initializing effect data (e.g. Substitute, Wish).

	NOTE: Not fired for abilities and items. For abilities and items, see
	the switchIn event.

	examples: [volatile] Encore, [side condition] Reflect,
	          [volatile] Substitute

restart(pokemon) [on status, on volatile]
restart(side) [on side condition]
restart() [on weather, on field effect]
	Fired when trying to induce an effect that's already active.

	Useful for effects that can have multiple "layers".

	examples: [side condition] Toxic Spikes, [side condition] Pursuit,
	          [volatile] Stockpile

end(pokemon) [on status, on volatile, on item, on ability]
end(side) [on side condition]
end() [on weather, on field effect]
	Fired when an effect ends naturally, usually because its duration ends.
	Return true to stop an effect from ending.

	Most ways an effect can end are "natural". The biggest exception is
	when a pokemon swiches out. In general, if you would receive a message
	when the effect ends, the end event would be fired.

	NOTE: NOT fired when a pokemon switches out (see switchOut).

	NOTE: If you return true when an event expires from its duration counter
	      reaching 0, it will never expire unless you reset its duration. To
	      extend an effect by one turn, simply set its duration counter to 1
	      before returning true.

	Useful for giving messages that an effect has ended.

	examples: [volatile] Encore, [side condition] Reflect,
	          [volatile] Substitute

duration(pokemon, source) [on status, on volatile]
duration(side) [on side condition]
duration() [on weather, on field effect]
	Fired while calculating an effect's duration. Returns the duration in
	turns, including the current one.

	source is the pokemon that inflicted the effect, or null if no such
	pokemon did. For instance, if Pikachu uses Toxic, source is Pikachu,
	but if you are poisoned by Toxic Spikes, source is null.

	For instance, Protect has a duration of 1 turn, and Wish has a duration
	of 2 turns. Return 0 to have it never expire.

	The effect's residual event is not fired when it expires - instead, its
	end event is fired when its residual event would otherwise have fired.

	Do not use this for effects that don't expire during a residual. For
	instance, sleep expires through a sleep counter that decrements every
	beforeMove event, not every residual event.

	examples: [weather] Rain Dance, [side condition] Reflect

residual(pokemon) [on status, on volatile, on ability, on item]
residual(side) [on side condition]
residual() [on weather, on field effect]
	Fired at the end of each turn, but before fainted pokemon are switched in.

	Useful for whatever end-of-turn effects this may have.

	The duration counter of each effect is decremented automatically before
	this event is fired (see duration for details).

	examples: [volatile] Ghost-type Curse, [weather] Sandstorm


=== DETAILED USAGE NOTES ===

In aesoft's unnamed sim, as well as in Pokémon Lab and DougJustDoug's framework,
everything in Pokémon is an effect.

There are 8 types of effects
- move, associated with a pokemon (Grass Knot, Magnitude...)
- status, associated with a pokemon (Sleep, Poison...)
- volatile, associated with a pokemon (Protect, Substitute...)
- ability, associated with a pokemon (Intimidate, Technician...)
- item, associated with a pokemon (Leftovers, Choice Scarf...)
- side condition, associated with a side (Reflect, Tailwind...)
- weather, associated with a battle (Rain Dance, Sunny Day...)
- field effect, associated with a battle (Trick Room...)

Effects associated with a side are also associated with every pokemon on a side,
and effects associated with a battle are associated with every pokemon.

For convenience, every effect has the same ID as the move, ability, or item that
induces it. The only exceptions are effects with many moves associated with them,
such as statuses, and certain volatile statuses (flinch, confusion, locked moves,
and trapping).

Nearly every effect has some sort of event listener, and each action fires an
event.

For instance, here is the Technician ability:

"Technician": {
	desc: "When this Pokemon uses an attack that has 60 Base Power or less, the
		move's Base Power receives a 50% boost. For example, a move with 60 Base
		Power effectively becomes a move with 90 Base Power.",
	basePowerCallbackPriority: 10,
	basePowerCallback: function(pokemon, target, basePower, move) {
		if (basePower <= 60) {
			return basePower * 1.5;
		}
		return basePower;
	},
	id: "Technician",
	name: "Technician",
	num: "101"
}

Now, let's work through an example:

> In rain, A Technician Roserade uses Grass Knot against a Vaporen behind Light
> Screen.

This fires the basePower event:

basePower(user, target) [on move]
basePower(user, target, basePower, move) [on user]
foeBasePower(user, target, basePower, move) [on target]

First, the basePower callback on the move is fired.

Grass Knot's basePowerCallback function returns 60 as its Base Power against
Vaporeon.

Next, all basePower callbacks associated with Roserade are fired. This includes
the basePower callbacks of Roserade's effects (its Technician ability), the
basePower callbacks of Roserade's teams's effects (there are none), and the
basePower callbacks of the battle effects (rain).

These callbacks are sorted by their listed priority. The Technician callback
goes first, since it has a priority of 10, and so the attack's new base power is 90.

Then, the rain's callback is called. Since Grass Knot is neither a Water nor a Fire
move, its base power is unchanged.

Finally, all foeBasePower callbacks associated with Vaporeon are fired.

These are also sorted by their listed priority, and then run. With the foeBasePower
callback of Light Screen, we get a final base power of 45, which is then
passed on to the damage formula.
