Files
Crystal/src/game/battle/constants.ts
T
Sébastien QUEROL 32d736ecae
Checks / web (push) Canceled after 0s
Port weather, copying moves, held items and obedience (#28)
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.
2026-10-03 15:03:19 +02:00

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;