Checks / web (push) Canceled after 0s
Complete the weather, Substitute, Transform, called-move and forced-switch effects. Add held-item behavior, Exp. Share awards and badge-based traded Pokemon obedience, and persist trainer berry consumption. Validated with 576 passing unit tests and 149 browser tests, native/reference builds, reference/vendor/release checks and 320 Metal Powder emulator comparisons per browser. Smart AI and special balls/battle types remain on #28.
545 lines
11 KiB
TypeScript
545 lines
11 KiB
TypeScript
/** Battle constants under their PRET names (constants/*.asm and
|
|
* macros/scripts/battle_commands.asm). `npm run check:reference` compares
|
|
* every entry with the pinned source, so a wrong value cannot ship. */
|
|
export const C = {
|
|
// Move effects (constants/move_effect_constants.asm)
|
|
EFFECT_NORMAL_HIT: 0,
|
|
EFFECT_LEECH_HIT: 3,
|
|
EFFECT_SELFDESTRUCT: 7,
|
|
EFFECT_DREAM_EATER: 8,
|
|
EFFECT_ALWAYS_HIT: 17,
|
|
EFFECT_ATTACK_DOWN: 18,
|
|
EFFECT_DEFENSE_DOWN: 19,
|
|
EFFECT_EVASION_DOWN: 24,
|
|
EFFECT_BIDE: 26,
|
|
EFFECT_RAMPAGE: 27,
|
|
EFFECT_MULTI_HIT: 29,
|
|
EFFECT_CONVERSION: 30,
|
|
EFFECT_TOXIC: 33,
|
|
EFFECT_OHKO: 38,
|
|
EFFECT_RAZOR_WIND: 39,
|
|
EFFECT_SUPER_FANG: 40,
|
|
EFFECT_STATIC_DAMAGE: 41,
|
|
EFFECT_DOUBLE_HIT: 44,
|
|
EFFECT_JUMP_KICK: 45,
|
|
EFFECT_ATTACK_DOWN_2: 58,
|
|
EFFECT_EVASION_DOWN_2: 64,
|
|
EFFECT_ATTACK_DOWN_HIT: 68,
|
|
EFFECT_ACCURACY_DOWN_HIT: 73,
|
|
EFFECT_EVASION_DOWN_HIT: 74,
|
|
EFFECT_SKY_ATTACK: 75,
|
|
EFFECT_CONFUSE_HIT: 76,
|
|
EFFECT_POISON_MULTI_HIT: 77,
|
|
EFFECT_RAGE: 81,
|
|
EFFECT_SPLASH: 85,
|
|
EFFECT_SNORE: 92,
|
|
EFFECT_PRIORITY_HIT: 103,
|
|
EFFECT_TRIPLE_KICK: 104,
|
|
EFFECT_PROTECT: 111,
|
|
EFFECT_ENDURE: 116,
|
|
EFFECT_ROLLOUT: 117,
|
|
EFFECT_SWAGGER: 118,
|
|
EFFECT_FURY_CUTTER: 119,
|
|
EFFECT_SKULL_BASH: 145,
|
|
EFFECT_FUTURE_SIGHT: 148,
|
|
EFFECT_SOLARBEAM: 151,
|
|
EFFECT_THUNDER: 152,
|
|
EFFECT_BEAT_UP: 154,
|
|
EFFECT_FLY: 155,
|
|
|
|
EFFECT_SLEEP: 1,
|
|
EFFECT_HEAL: 32,
|
|
EFFECT_LIGHT_SCREEN: 35,
|
|
EFFECT_MIST: 46,
|
|
EFFECT_FOCUS_ENERGY: 47,
|
|
EFFECT_CONFUSE: 49,
|
|
EFFECT_TRANSFORM: 57,
|
|
EFFECT_REFLECT: 65,
|
|
EFFECT_SUBSTITUTE: 79,
|
|
EFFECT_LEECH_SEED: 84,
|
|
EFFECT_DISABLE: 86,
|
|
EFFECT_LEVEL_DAMAGE: 87,
|
|
EFFECT_PSYWAVE: 88,
|
|
EFFECT_ENCORE: 90,
|
|
EFFECT_SLEEP_TALK: 97,
|
|
EFFECT_MEAN_LOOK: 106,
|
|
EFFECT_NIGHTMARE: 107,
|
|
EFFECT_SPIKES: 112,
|
|
EFFECT_FORESIGHT: 113,
|
|
EFFECT_PERISH_SONG: 114,
|
|
EFFECT_SANDSTORM: 115,
|
|
EFFECT_ATTRACT: 120,
|
|
EFFECT_SAFEGUARD: 124,
|
|
EFFECT_RAIN_DANCE: 136,
|
|
EFFECT_SUNNY_DAY: 137,
|
|
EFFECT_TELEPORT: 153,
|
|
EFFECT_MORNING_SUN: 132,
|
|
EFFECT_SYNTHESIS: 133,
|
|
EFFECT_MOONLIGHT: 134,
|
|
EFFECT_POISON: 66,
|
|
EFFECT_PARALYZE: 67,
|
|
EFFECT_ATTACK_UP: 10,
|
|
EFFECT_EVASION_UP: 16,
|
|
EFFECT_ATTACK_UP_2: 50,
|
|
EFFECT_EVASION_UP_2: 56,
|
|
EFFECT_PURSUIT: 128,
|
|
EFFECT_HYPER_BEAM: 80,
|
|
EFFECT_TRAP_TARGET: 42,
|
|
EFFECT_LOCK_ON: 94,
|
|
EFFECT_COUNTER: 89,
|
|
EFFECT_REVERSAL: 99,
|
|
EFFECT_FALSE_SWIPE: 101,
|
|
EFFECT_HIDDEN_POWER: 135,
|
|
EFFECT_FAKE_OUT: 141,
|
|
EFFECT_MIRROR_COAT: 144,
|
|
|
|
// Moves (constants/move_constants.asm)
|
|
RAZOR_WIND: 13,
|
|
GUST: 16,
|
|
BIND: 20,
|
|
WRAP: 35,
|
|
SOLARBEAM: 76,
|
|
FIRE_SPIN: 83,
|
|
BIDE: 117,
|
|
CLAMP: 128,
|
|
SKULL_BASH: 130,
|
|
SKY_ATTACK: 143,
|
|
WHIRLPOOL: 250,
|
|
ROAR: 46,
|
|
TRANSFORM: 144,
|
|
MIRROR_MOVE: 119,
|
|
REST: 156,
|
|
ENCORE: 227,
|
|
FUTURE_SIGHT: 248,
|
|
WHIRLWIND: 18,
|
|
FLY: 19,
|
|
THUNDER: 87,
|
|
EARTHQUAKE: 89,
|
|
FISSURE: 90,
|
|
DIG: 91,
|
|
MIMIC: 102,
|
|
MINIMIZE: 107,
|
|
SUBSTITUTE: 164,
|
|
STRUGGLE: 165,
|
|
FLAME_WHEEL: 172,
|
|
SNORE: 173,
|
|
SLEEP_TALK: 214,
|
|
SACRED_FIRE: 221,
|
|
MAGNITUDE: 222,
|
|
VITAL_THROW: 233,
|
|
TWISTER: 239,
|
|
|
|
// Types (constants/type_constants.asm)
|
|
NORMAL: 0,
|
|
FLYING: 2,
|
|
POISON: 3,
|
|
ROCK: 5,
|
|
GROUND: 4,
|
|
STEEL: 9,
|
|
BIRD: 6,
|
|
GHOST: 8,
|
|
GRASS: 22,
|
|
UNUSED_TYPES: 10,
|
|
UNUSED_TYPES_END: 20,
|
|
TYPES_END: 28,
|
|
CURSE_TYPE: 19,
|
|
FIRE: 20,
|
|
SPECIAL: 20,
|
|
ICE: 25,
|
|
|
|
// Species and items
|
|
PIKACHU: 25,
|
|
FARFETCH_D: 83,
|
|
CUBONE: 104,
|
|
MAROWAK: 105,
|
|
CHANSEY: 113,
|
|
MAGIKARP: 129,
|
|
DITTO: 132,
|
|
UNOWN: 201,
|
|
NO_ITEM: 0,
|
|
MASTER_BALL: 1,
|
|
ULTRA_BALL: 2,
|
|
GREAT_BALL: 4,
|
|
POKE_BALL: 5,
|
|
LUCKY_PUNCH: 30,
|
|
METAL_POWDER: 35,
|
|
BERSERK_GENE: 0x98,
|
|
STICK: 105,
|
|
THICK_CLUB: 118,
|
|
EXP_SHARE: 57,
|
|
CLEANSE_TAG: 94,
|
|
LUCKY_EGG: 126,
|
|
LIGHT_BALL: 163,
|
|
|
|
// Held item effects (constants/item_data_constants.asm)
|
|
HELD_BERRY: 1,
|
|
HELD_LEFTOVERS: 3,
|
|
HELD_RESTORE_PP: 6,
|
|
HELD_HEAL_POISON: 10,
|
|
HELD_HEAL_PARALYZE: 14,
|
|
HELD_HEAL_STATUS: 15,
|
|
HELD_HEAL_CONFUSION: 16,
|
|
HELD_PREVENT_POISON: 20,
|
|
HELD_PREVENT_BURN: 21,
|
|
HELD_PREVENT_FREEZE: 22,
|
|
HELD_PREVENT_SLEEP: 23,
|
|
HELD_PREVENT_PARALYZE: 24,
|
|
HELD_PREVENT_CONFUSE: 25,
|
|
HELD_CATCH_CHANCE: 70,
|
|
HELD_ESCAPE: 72,
|
|
HELD_CRITICAL_UP: 73,
|
|
HELD_QUICK_CLAW: 74,
|
|
HELD_FLINCH: 75,
|
|
HELD_ATTACK_UP: 31,
|
|
HELD_EVASION_UP: 37,
|
|
HELD_BRIGHTPOWDER: 77,
|
|
HELD_FOCUS_BAND: 79,
|
|
|
|
// Stats and levels
|
|
ATTACK: 0,
|
|
DEFENSE: 1,
|
|
SPEED: 2,
|
|
SP_ATTACK: 3,
|
|
SP_DEFENSE: 4,
|
|
ACCURACY: 5,
|
|
EVASION: 6,
|
|
ABILITY: 7,
|
|
REST_SLEEP_TURNS: 2,
|
|
BASE_STAT_LEVEL: 7,
|
|
MAX_STAT_LEVEL: 13,
|
|
MAX_LEVEL: 100,
|
|
PP_MASK: 63,
|
|
NUM_MOVES: 4,
|
|
BASE_HAPPINESS: 70,
|
|
START_MONEY: 3000,
|
|
MAX_MONEY: 999999,
|
|
MAX_COINS: 9999,
|
|
|
|
// Status bits and masks
|
|
SLP_MASK: 7,
|
|
PSN: 3,
|
|
BRN: 4,
|
|
FRZ: 5,
|
|
PAR: 6,
|
|
|
|
// Substatus bits, by byte: 1 (Nightmare..In Love), 2 (Curled),
|
|
// 3 (Bide..Confused), 4 (X Accuracy..Leech Seed), 5 (Toxic..Can't Run)
|
|
SUBSTATUS_NIGHTMARE: 0,
|
|
SUBSTATUS_CURSE: 1,
|
|
SUBSTATUS_PROTECT: 2,
|
|
SUBSTATUS_IDENTIFIED: 3,
|
|
SUBSTATUS_PERISH: 4,
|
|
SUBSTATUS_ENDURE: 5,
|
|
SUBSTATUS_ROLLOUT: 6,
|
|
SUBSTATUS_IN_LOVE: 7,
|
|
SUBSTATUS_CURLED: 0,
|
|
SUBSTATUS_BIDE: 0,
|
|
SUBSTATUS_RAMPAGE: 1,
|
|
SUBSTATUS_IN_LOOP: 2,
|
|
SUBSTATUS_FLINCHED: 3,
|
|
SUBSTATUS_CHARGED: 4,
|
|
SUBSTATUS_UNDERGROUND: 5,
|
|
SUBSTATUS_FLYING: 6,
|
|
SUBSTATUS_CONFUSED: 7,
|
|
SUBSTATUS_X_ACCURACY: 0,
|
|
SUBSTATUS_MIST: 1,
|
|
SUBSTATUS_FOCUS_ENERGY: 2,
|
|
SUBSTATUS_SUBSTITUTE: 4,
|
|
SUBSTATUS_RECHARGE: 5,
|
|
SUBSTATUS_RAGE: 6,
|
|
SUBSTATUS_LEECH_SEED: 7,
|
|
SUBSTATUS_TOXIC: 0,
|
|
SUBSTATUS_TRANSFORMED: 3,
|
|
SUBSTATUS_ENCORED: 4,
|
|
SUBSTATUS_LOCK_ON: 5,
|
|
SUBSTATUS_DESTINY_BOND: 6,
|
|
SUBSTATUS_CANT_RUN: 7,
|
|
|
|
// Screens, weather and effectiveness
|
|
SCREENS_SPIKES: 0,
|
|
SCREENS_SAFEGUARD: 2,
|
|
SCREENS_LIGHT_SCREEN: 3,
|
|
SCREENS_REFLECT: 4,
|
|
SCREENS_UNUSED: 5,
|
|
WEATHER_SANDSTORM: 3,
|
|
WEATHER_NONE: 0,
|
|
WEATHER_RAIN: 1,
|
|
WEATHER_SUN: 2,
|
|
NO_EFFECT: 0,
|
|
NOT_VERY_EFFECTIVE: 5,
|
|
EFFECTIVE: 10,
|
|
SUPER_EFFECTIVE: 20,
|
|
STAB_DAMAGE: 128,
|
|
EFFECTIVENESS_MASK: 127,
|
|
BASE_PRIORITY: 1,
|
|
|
|
// Battle modes, types and results
|
|
BATTLEPLAYERACTION_USEITEM: 1,
|
|
BATTLEPLAYERACTION_SWITCH: 2,
|
|
ITEMMENU_CURRENT: 4,
|
|
ITEMMENU_PARTY: 5,
|
|
ITEMMENU_CLOSE: 6,
|
|
// Trophy dolls from the Normal and Gorgeous Box (constants/deco_constants.asm)
|
|
DECOFLAG_GOLD_TROPHY_DOLL: 43,
|
|
DECOFLAG_SILVER_TROPHY_DOLL: 44,
|
|
// Menus outside battle (constants/menu_constants.asm)
|
|
MONMENU_FIELD_MOVE: 0,
|
|
MONMENUITEM_STATS: 15,
|
|
MONMENUITEM_SWITCH: 16,
|
|
MONMENUITEM_ITEM: 17,
|
|
MONMENUITEM_CANCEL: 18,
|
|
MONMENUITEM_MOVE: 19,
|
|
MONMENUITEM_MAIL: 20,
|
|
NUM_MONMENU_ITEMS: 8,
|
|
PARTYMENUACTION_CHOOSE_POKEMON: 0,
|
|
PARTYMENUACTION_HEALING_ITEM: 1,
|
|
PARTYMENUACTION_MOVE: 4,
|
|
PARTYMENUACTION_GIVE_ITEM: 8,
|
|
KEY_ITEM_POCKET: 2,
|
|
TM_HM_POCKET: 3,
|
|
PP_UP: 0x3e,
|
|
SOFTBOILED: 0x87,
|
|
MILK_DRINK: 0xd0,
|
|
RARE_CANDY: 0x20,
|
|
HP_UP: 0x1a,
|
|
PROTEIN: 0x1b,
|
|
IRON: 0x1c,
|
|
CARBOS: 0x1d,
|
|
CALCIUM: 0x1f,
|
|
EVERSTONE: 0x70,
|
|
PARTYMENUACTION_EVO_STONE: 5,
|
|
PARTYMENUTEXT_LEVEL_UP: 0xf8,
|
|
HAPPINESS_USEDITEM: 0x02,
|
|
// Evolution (constants/pokemon_data_constants.asm)
|
|
EVOLVE_LEVEL: 1,
|
|
EVOLVE_ITEM: 2,
|
|
EVOLVE_TRADE: 3,
|
|
EVOLVE_HAPPINESS: 4,
|
|
EVOLVE_STAT: 5,
|
|
TR_ANYTIME: 1,
|
|
TR_MORNDAY: 2,
|
|
TR_NITE: 3,
|
|
ATK_GT_DEF: 1,
|
|
ATK_LT_DEF: 2,
|
|
ATK_EQ_DEF: 3,
|
|
HAPPINESS_TO_EVOLVE: 220,
|
|
SKETCH: 0xa6,
|
|
PP_UP_MASK: 0xc0,
|
|
PP_UP_ONE: 0x40,
|
|
PARTYMENUTEXT_HEAL_HP: 0xf5,
|
|
PARTYMENUTEXT_HEAL_CONFUSION: 0xf9,
|
|
PARTYMENUTEXT_REVIVE: 0xf7,
|
|
HAPPINESS_GAINLEVEL: 0x01,
|
|
HAPPINESS_USEDXITEM: 0x03,
|
|
HAPPINESS_FAINTED: 0x06,
|
|
HAPPINESS_BEATENBYSTRONGFOE: 0x08,
|
|
HAPPINESS_BITTERPOWDER: 0x0f,
|
|
HAPPINESS_ENERGYROOT: 0x10,
|
|
HAPPINESS_REVIVALHERB: 0x11,
|
|
HAPPINESS_GAINLEVELATHOME: 0x13,
|
|
REVIVE: 0x27,
|
|
ELIXER: 0x41,
|
|
MAX_ELIXER: 0x15,
|
|
MAX_ETHER: 0x40,
|
|
MYSTERYBERRY: 0x96,
|
|
EGG: 0xfd,
|
|
WILD_BATTLE: 1,
|
|
TRAINER_BATTLE: 2,
|
|
HELD_AMULET_COIN: 76,
|
|
BATTLETYPE_NORMAL: 0,
|
|
BATTLETYPE_DEBUG: 2,
|
|
BATTLETYPE_TUTORIAL: 3,
|
|
BATTLETYPE_FISH: 4,
|
|
BATTLETYPE_ROAMING: 5,
|
|
BATTLETYPE_CONTEST: 6,
|
|
BATTLETYPE_FORCESHINY: 7,
|
|
BATTLETYPE_TRAP: 9,
|
|
BATTLETYPE_FORCEITEM: 10,
|
|
BATTLETYPE_CELEBI: 11,
|
|
BATTLETYPE_TREE: 8,
|
|
TREEMON_SLEEP_TURNS: 7,
|
|
BATTLETYPE_SUICUNE: 12,
|
|
WIN: 0,
|
|
LOSE: 1,
|
|
DRAW: 2,
|
|
MORN_F: 0,
|
|
DAY_F: 1,
|
|
NITE_F: 2,
|
|
} as const;
|
|
|
|
/** Battle command IDs (macros/scripts/battle_commands.asm). */
|
|
export const COMMAND = {
|
|
checkturn: 1,
|
|
checkobedience: 2,
|
|
usedmovetext: 3,
|
|
doturn: 4,
|
|
critical: 5,
|
|
damagestats: 6,
|
|
stab: 7,
|
|
damagevariation: 8,
|
|
checkhit: 9,
|
|
lowersub: 10,
|
|
moveanimnosub: 11,
|
|
raisesub: 12,
|
|
failuretext: 13,
|
|
applydamage: 14,
|
|
criticaltext: 15,
|
|
supereffectivetext: 16,
|
|
checkfaint: 17,
|
|
buildopponentrage: 18,
|
|
poisontarget: 19,
|
|
sleeptarget: 20,
|
|
draintarget: 21,
|
|
eatdream: 22,
|
|
burntarget: 23,
|
|
freezetarget: 24,
|
|
paralyzetarget: 25,
|
|
selfdestruct: 26,
|
|
mirrormove: 27,
|
|
payday: 30,
|
|
conversion: 31,
|
|
resetstats: 32,
|
|
storeenergy: 33,
|
|
unleashenergy: 34,
|
|
forceswitch: 35,
|
|
endloop: 36,
|
|
flinchtarget: 37,
|
|
ohko: 38,
|
|
recoil: 39,
|
|
mist: 40,
|
|
focusenergy: 41,
|
|
confuse: 42,
|
|
confusetarget: 43,
|
|
heal: 44,
|
|
transform: 45,
|
|
screen: 46,
|
|
poison: 47,
|
|
paralyze: 48,
|
|
substitute: 49,
|
|
rechargenextturn: 50,
|
|
mimic: 51,
|
|
metronome: 52,
|
|
leechseed: 53,
|
|
splash: 54,
|
|
disable: 55,
|
|
cleartext: 56,
|
|
charge: 57,
|
|
checkcharge: 58,
|
|
traptarget: 59,
|
|
rampage: 61,
|
|
checkrampage: 62,
|
|
constantdamage: 63,
|
|
counter: 64,
|
|
encore: 65,
|
|
painsplit: 66,
|
|
snore: 67,
|
|
conversion2: 68,
|
|
lockon: 69,
|
|
sketch: 70,
|
|
sleeptalk: 72,
|
|
destinybond: 73,
|
|
spite: 74,
|
|
falseswipe: 75,
|
|
healbell: 76,
|
|
kingsrock: 77,
|
|
triplekick: 78,
|
|
kickcounter: 79,
|
|
thief: 80,
|
|
arenatrap: 81,
|
|
nightmare: 82,
|
|
defrost: 83,
|
|
curse: 84,
|
|
protect: 85,
|
|
spikes: 86,
|
|
foresight: 87,
|
|
perishsong: 88,
|
|
startsandstorm: 89,
|
|
endure: 90,
|
|
checkrollout: 91,
|
|
rolloutpower: 92,
|
|
furycutter: 94,
|
|
attract: 95,
|
|
happinesspower: 96,
|
|
present: 97,
|
|
damagecalc: 98,
|
|
frustrationpower: 99,
|
|
safeguard: 100,
|
|
checksafeguard: 101,
|
|
getmagnitude: 102,
|
|
batonpass: 103,
|
|
pursuit: 104,
|
|
clearhazards: 105,
|
|
healmorn: 106,
|
|
healday: 107,
|
|
healnite: 108,
|
|
hiddenpower: 109,
|
|
startrain: 110,
|
|
startsun: 111,
|
|
attackup: 112,
|
|
defenseup: 113,
|
|
speedup: 114,
|
|
specialattackup: 115,
|
|
specialdefenseup: 116,
|
|
accuracyup: 117,
|
|
evasionup: 118,
|
|
attackup2: 119,
|
|
defenseup2: 120,
|
|
speedup2: 121,
|
|
specialattackup2: 122,
|
|
specialdefenseup2: 123,
|
|
accuracyup2: 124,
|
|
evasionup2: 125,
|
|
attackdown: 126,
|
|
defensedown: 127,
|
|
speeddown: 128,
|
|
specialattackdown: 129,
|
|
specialdefensedown: 130,
|
|
accuracydown: 131,
|
|
evasiondown: 132,
|
|
attackdown2: 133,
|
|
defensedown2: 134,
|
|
speeddown2: 135,
|
|
specialattackdown2: 136,
|
|
specialdefensedown2: 137,
|
|
accuracydown2: 138,
|
|
evasiondown2: 139,
|
|
statupmessage: 140,
|
|
statdownmessage: 141,
|
|
statupfailtext: 142,
|
|
statdownfailtext: 143,
|
|
effectchance: 144,
|
|
statdownanim: 145,
|
|
statupanim: 146,
|
|
switchturn: 147,
|
|
fakeout: 148,
|
|
bellydrum: 149,
|
|
psychup: 150,
|
|
rage: 151,
|
|
doubleflyingdamage: 152,
|
|
doubleundergrounddamage: 153,
|
|
mirrorcoat: 154,
|
|
checkfuturesight: 155,
|
|
futuresight: 156,
|
|
doubleminimizedamage: 157,
|
|
skipsuncharge: 158,
|
|
thunderaccuracy: 159,
|
|
teleport: 160,
|
|
beatup: 161,
|
|
ragedamage: 162,
|
|
resettypematchup: 163,
|
|
allstatsup: 164,
|
|
bidefailtext: 165,
|
|
raisesubnoanim: 166,
|
|
lowersubnoanim: 167,
|
|
beatupfailtext: 168,
|
|
clearmissdamage: 169,
|
|
movedelay: 170,
|
|
moveanim: 171,
|
|
tristatuschance: 172,
|
|
supereffectivelooptext: 173,
|
|
startloop: 174,
|
|
curl: 175,
|
|
endmove: 0xff,
|
|
endturn: 0xfe,
|
|
} as const;
|