Capture
How a thrown ball catches a wild Pokémon in Red and Blue, from the first random number to the shakes.
On this page
A ball thrown at a wild Pokémon in Pokémon Red and Blue either catches it or shakes up to three times and lets it break free. Two random numbers decide most throws, the first against the species’ catch rate and the second against the Pokémon’s HP, and on both a low number catches1. A sleeping target, a low HP bar, and the right ball each make a catch likelier2,3.
#One throw, step by step
#Before any random number
A ball can be thrown only in battle. With six Pokémon in the party and the current PC box full, it can’t be thrown at all, and at a trainer’s Pokémon the trainer blocks it and the ball is used up4. A ghost in Pokémon Tower dodges every ball until the Silph Scope is in the bag, and the Marowak on the tower’s sixth floor dodges even then5. In the old man’s battle the throw always catches5.
#The first number
Every ball draws a first random number in a range the ball sets (0–255, 0–200, or 0–150 by ball6): the Poké Ball’s is the widest, then the Great Ball’s, then the Ultra and Safari Balls’. The game draws again whenever the number lands above the ball’s top, so a better ball draws lower numbers6. A Master Ball draws one too but ignores it, and catches every Pokémon the steps above let it reach, skipping every test below6,7.
A status takes an amount off the first number: 252 for sleep or freeze, 122 for a burn, paralysis, or poison. A first number below that amount catches at once2. Bad poison counts as plain poison8.
#The catch rate
Each species has its own catch rate, the same for every wild Pokémon of that species9. The lowest belong to Articuno, Zapdos, Moltres, and Mewtwo, and the table below lists every species (151 species: catch rate 3–255, base HP 10–25010). When the first number, less the status amount, is above the catch rate, the ball breaks open2.
#The HP test
A throw that passes the catch rate draws a second random byte against a target that grows as the Pokémon loses HP3. For max HP , current HP , and a ball factor of 83 for a Great Ball and 123 for any other ball, the target is
A target above 2553 catches without a second byte; otherwise a second byte at most catches3. At full HP the test passes about a third of the time, about half with a Great Ball, and from about a third of max HP down (half with a Great Ball) it always passes3.
The two tests pull the balls apart. The Ultra Ball’s lower first numbers pass the catch rate more often, but its larger factor gives it the smaller target, so at full HP a Great Ball can catch more often (Great 11.4%, Ultra 10.2% (Bulbasaur at full HP, computed)1).
#The shakes
A ball that fails shakes zero to three times. The count follows from the ball and the Pokémon’s catch rate, HP, and status, with no random number, so every failed throw at a Pokémon in the same state shows the same count, and each count has its message11.
| Shakes | Message |
|---|---|
| 0 | “You missed the POKéMON!” |
| 1 | “Darn! The POKéMON broke free!” |
| 2 | “Aww! It appeared to be caught!” |
| 3 | “Shoot! It was so close too!” |
“So close” says nothing about the throw that missed: the same Pokémon in the same state shows it on every miss11.
#After the catch
A caught Pokémon joins the party with the HP and status it had when the ball hit, or goes to the PC box when the party is full, and a species not yet owned gets its Pokédex entry. One caught while transformed comes out a Ditto12.
#The chance, as HP falls
Each line is one ball’s chance as the Pokémon’s HP falls from full to 1. Pick a scenario, or set the catch rate and status, and compare the Great and Ultra Ball lines at full HP and at 1 HP.
#Which ball
Each cell is one catch rate and one HP level, coloured by the ball with the best chance there. Point at a cell for every ball’s chance.
#Every species
The chances are for a Pokémon with max HP 100 and no status. A wild Pokémon’s max HP follows from its species’ base HP, its level, and a hidden value drawn when the battle starts13.
#The Safari Zone
A Safari Game costs 50014 yen and gives 3014 Safari Balls and a step counter14. The Safari Ball catches exactly as an Ultra Ball does15. The wild Pokémon never attacks; it watches, eats, gets angry, or runs16.
Bait halves the catch rate and makes the Pokémon eat for a few turns; a rock doubles it and makes the Pokémon angry17,18. An eating Pokémon flees much less often and an angry one more often19. When the angry spell runs out, the catch rate returns to the species’ own, undoing every rock and bait before it; when the eating spell runs out, the halved rate stays17. Bait that adds eating turns protects only flee rolls, because each turn’s count comes off before its roll19.
#Compare
Pokémon Yellow uses the same formula, and adds a Pikachu battle that always catches20. Pokémon Crystal folds the ball, the HP, and the status into one rate and decides the throw with one random number; its wobbles come after the result21,22,23,24,25. Pokémon Emerald turns the rate into a threshold for four random numbers: each one below it is a shake, and four catch26. The capture page follows the formula through later games.
References
- ^ abAt full HP a Great Ball can catch more often than an Ultra Ball (computed): against a Bulbasaur (catch rate 45) with max HP 100 and no status, the Great Ball catches about 11.4% of the time and the Ultra Ball about 10.2%. A throw rolls two random numbers from 0 to 255, and on both a low roll is the one that catches. With no status, the first roll must be at or below the species' catch rate, its base-stats byte, which loading the opposing Pokémon copies in; the Great Ball rerolls any first roll above 200 and the Ultra Ball any above 150, so the Ultra Ball's first roll passes at least as often. The second roll must be at or below a target of max HP × 255, divided by 8 for the Great Ball or 12 for the Ultra Ball, then by a quarter of current HP (at least 1); a target above 255 catches with no second roll. The Great Ball's smaller divisor gives it the larger target, and with no status and a catch rate of 200 or more both first rolls always pass, so there the Great Ball never catches less often.Codepret/pokeredrevised
How we know
1BaseStats:: 2 table_width BASE_DATA_SIZE 3INCLUDE "data/pokemon/base_stats/bulbasaur.asm"
data/pokemon/base_stats.asm lines 1–3 at af51989 · upstream ↗ 1 db DEX_BULBASAUR ; pokedex id ⋮ 3 db 45, 49, 49, 45, 65 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/bulbasaur.asm lines 1–7 at af51989 · upstream ↗ 5992LoadEnemyMonData: 5993 ld a, [wLinkState] 5994 cp LINK_STATE_BATTLING 5995 jp z, LoadEnemyMonFromParty 5996 ld a, [wEnemyMonSpecies2] 5997 ld [wEnemyMonSpecies], a 5998 ld [wCurSpecies], a 5999 call GetMonHeader
engine/battle/core.asm lines 5992–5999 at af51989 · upstream ↗ 401 predef IndexToPokedex 402 ld a, [wPokedexNum] 403 dec a 404 ld bc, BASE_DATA_SIZE 405 ld hl, BaseStats 406 call AddNTimes 407 ld de, wMonHeader 408 ld bc, BASE_DATA_SIZE 409 call CopyData
home/pokemon.asm lines 401–409 at af51989 · upstream ↗ 1522wMonHeader:: 1523; In the ROM base stats data structure, this is the dex number, but it is 1524; overwritten with the internal index number after the header is copied to WRAM. 1525wMonHIndex:: db 1526wMonHBaseStats:: 1527wMonHBaseHP:: db 1528wMonHBaseAttack:: db 1529wMonHBaseDefense:: db 1530wMonHBaseSpeed:: db 1531wMonHBaseSpecial:: db 1532wMonHTypes:: 1533wMonHType1:: db ⋮
ram/wram.asm lines 1522–1535 at af51989 · upstream ↗ 6107 ld hl, wMonHBaseStats 6108 ld de, wEnemyMonBaseStats 6109 ld b, NUM_STATS 6110.copyBaseStatsLoop 6111 ld a, [hli] 6112 ld [de], a 6113 inc de 6114 dec b 6115 jr nz, .copyBaseStatsLoop 6116 ld hl, wMonHCatchRate 6117 ld a, [hli] 6118 ld [de], a
engine/battle/core.asm lines 6107–6118 at af51989 · upstream ↗ 1200wEnemyMonBaseStats:: ds NUM_STATS 1201wEnemyMonActualCatchRate:: db
ram/wram.asm lines 1200–1201 at af51989 · upstream ↗ 185.loop 186 call Random 187 ld b, a ⋮ 189; Get the item ID. 190 ld hl, wCurItem 191 ld a, [hl] ⋮ 193; The Master Ball always succeeds. 194 cp MASTER_BALL 195 jp z, .captured ⋮ 197; Anything will do for the basic Poké Ball. 198 cp POKE_BALL 199 jr z, .checkForAilments ⋮
engine/items/item_effects.asm lines 185–214 at af51989 · upstream ↗ 225 ld a, [wEnemyMonStatus] 226 and a 227 jr z, .skipAilmentValueSubtraction ; no ailments
engine/items/item_effects.asm lines 225–227 at af51989 · upstream ↗ 241; Calculate MaxHP * 255. ⋮ 245 ld a, [hli] ⋮ 247 ld a, [hl] ⋮ 249 ld a, 255 250 ldh [hMultiplier], a 251 call Multiply ⋮ 253; Determine BallFactor. It's 8 for Great Balls and 12 for the others. 254 ld a, [wCurItem] 255 cp GREAT_BALL 256 ld a, 12 257 jr nz, .skip1 258 ld a, 8 ⋮
engine/items/item_effects.asm lines 241–287 at af51989 · upstream ↗ 300; If Rand1 - Status > CatchRate, the ball fails to capture the Pokémon. 301 ld a, [wEnemyMonActualCatchRate] 302 cp b 303 jr c, .failedToCapture ⋮ 305; If W > 255, the ball captures the Pokémon. 306 ldh a, [hQuotient + 2] 307 and a 308 jr nz, .captured ⋮ 310 call Random ; Let this random number be called Rand2. ⋮ 312; If Rand2 > X, the ball fails to capture the Pokémon. 313 ld b, a 314 ldh a, [hQuotient + 3] ⋮
engine/items/item_effects.asm lines 300–316 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-22.
Checked by a second AI model, 2026-10-25.
Revised after a check by a second AI model, 2026-10-27.
Revised after a check by the editor, 2026-10-27: Unmotivated for a player and unclear which way a roll should go; now result first, a low roll catches on both, and the catch-rate load quoted.
- ^ abcdeA sleeping or frozen Pokémon is easiest to catch, then a burned, paralyzed, or poisoned one. The ball subtracts 25 from its first number for sleep or freeze, 12 for any other status, and nothing without one, and a first number below that amount catches at once: sleep alone catches on 25 of a Poké Ball's 256 first numbers (9.8%) and on 25 of an Ultra Ball's 151 (16.6%) (computed). Otherwise the throw fails when the first number less that amount is above the catch rate, and goes on to the HP test when it isn't.Codepret/pokered
How we know
221; no status ailment: Status = 0 222; Burn/Paralysis/Poison: Status = 12 223; Freeze/Sleep: Status = 25 224; If Status is greater than Rand1, the Pokémon will be caught for sure. 225 ld a, [wEnemyMonStatus] 226 and a 227 jr z, .skipAilmentValueSubtraction ; no ailments 228 and (1 << FRZ) | SLP_MASK 229 ld c, 12 230 jr z, .notFrozenOrAsleep 231 ld c, 25 232.notFrozenOrAsleep ⋮
engine/items/item_effects.asm lines 216–239 at af51989 · upstream ↗ 67; non-volatile statuses 68DEF SLP_MASK EQU %111 ; 0-7 turns 69 const_def 3 70 const PSN ; 3 71 const BRN ; 4 72 const FRZ ; 5 73 const PAR ; 6
constants/battle_constants.asm lines 67–73 at af51989 · upstream ↗ 298 pop bc ; b = Rand1 - Status ⋮ 300; If Rand1 - Status > CatchRate, the ball fails to capture the Pokémon. 301 ld a, [wEnemyMonActualCatchRate] 302 cp b 303 jr c, .failedToCapture
engine/items/item_effects.asm lines 298–303 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-22.
Checked by a second AI model, 2026-10-27.
- ^ abcdefgThe lower the Pokémon's HP, the likelier a throw that passes the catch-rate test (the first number, less the status amount, at most the catch rate) is to catch, and a Great Ball's second test is easier than any other ball's. The ball computes from the Pokémon's max HP and current HP , with 8 for a Great Ball and 12 for every other ball, each division rounding down. A over 255 catches; otherwise a second random byte catches when it is at most . At full HP the second test so passes about a third of the time (about half with a Great Ball), and from roughly a third of max HP down (half with a Great Ball) it always passes (computed).Codepret/pokeredrevised
How we know
241; Calculate MaxHP * 255. ⋮ 244 ld hl, wEnemyMonMaxHP 245 ld a, [hli] ⋮ 247 ld a, [hl] ⋮ 249 ld a, 255 250 ldh [hMultiplier], a 251 call Multiply ⋮ 253; Determine BallFactor. It's 8 for Great Balls and 12 for the others. 254 ld a, [wCurItem] 255 cp GREAT_BALL 256 ld a, 12 257 jr nz, .skip1 ⋮
engine/items/item_effects.asm lines 241–316 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-27.
- ^A ball can be thrown only in battle; outside one, Oak says "This isn't the time to use that!". With six Pokémon in the party and 20 in the current PC box, a ball can't be thrown ("The POKéMON BOX is full! Can't use that item!"), except in the old man's battle. Thrown at a trainer's Pokémon, the ball is blocked ("The trainer blocked the BALL!", then "Don't be a thief!") and used up.Codepret/pokered
How we know
106; Balls can't be used out of battle. 107 ld a, [wIsInBattle] 108 and a 109 jp z, ItemUseNotTime ⋮ 111; Balls can't catch trainers' Pokémon. 112 dec a 113 jp nz, ThrowBallAtTrainerMon ⋮ 115; If this is for the old man battle, skip checking if the party & box are full. 116 ld a, [wBattleType] 117 dec a 118 jr z, .canUseBall ⋮ 120 ld a, [wPartyCount] ; is party full? ⋮
engine/items/item_effects.asm lines 106–125 at af51989 · upstream ↗ 58DEF PARTY_LENGTH EQU 6 ⋮ 60DEF MONS_PER_BOX EQU 20
constants/pokemon_data_constants.asm lines 58–60 at af51989 · upstream ↗ 2274RemoveUsedItem: 2275 ld hl, wNumBagItems 2276 ld a, 1 ; one item 2277 ld [wItemQuantity], a 2278 jp RemoveItemFromInventory ⋮ 2282 jr ItemUseFailed ⋮ 2284ItemUseNotTime: 2285 ld hl, ItemUseNotTimeText 2286 jr ItemUseFailed ⋮ 2290 jr ItemUseFailed ⋮ 2292ThrowBallAtTrainerMon: ⋮ 2296 ld a, TOSS_ANIM ⋮
engine/items/item_effects.asm lines 2274–2311 at af51989 · upstream ↗ 2321ItemUseNotTimeText: 2322 text_far _ItemUseNotTimeText ⋮ 2333ThrowBallAtTrainerMonText1: 2334 text_far _ThrowBallAtTrainerMonText1 ⋮ 2337ThrowBallAtTrainerMonText2: 2338 text_far _ThrowBallAtTrainerMonText2 ⋮ 2349BoxFullCannotThrowBallText: 2350 text_far _BoxFullCannotThrowBallText
engine/items/item_effects.asm lines 2321–2351 at af51989 · upstream ↗ 190_ItemUseNotTimeText:: 191 text "OAK: <PLAYER>!" 192 line "This isn't the" 193 cont "time to use that! " ⋮ 206_ThrowBallAtTrainerMonText1:: 207 text "The trainer" 208 line "blocked the BALL!" ⋮ 211_ThrowBallAtTrainerMonText2:: 212 text "Don't be a thief!" ⋮ 227_BoxFullCannotThrowBallText:: 228 text "The #MON BOX" 229 line "is full! Can't" ⋮
data/text/text_6.asm lines 190–231 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-27.
- ^ abA ball thrown at a ghost is dodged ("It dodged the thrown BALL! This POKéMON can't be caught!"): at any wild Pokémon in Pokémon Tower while the Silph Scope isn't in the bag, and at the Marowak on the tower's 6F even with it. A ball thrown in the old man's battle always catches, and that Pokémon isn't added to the player's party, nor is a ball taken from the bag. The ghost tests and the old man's catch both come before any random number is drawn.Codepret/pokeredrevised
How we know
149; If the player is fighting an unidentified ghost, set the value that indicates 150; the Pokémon can't be caught and skip the capture calculations. ⋮ 152 ld b, $10 ; can't be caught value 153 jp z, .setAnimData ⋮ 159; Old Man battle ⋮ 164 jp .captured ⋮ 170 cp POKEMON_TOWER_6F ⋮ 173 cp RESTLESS_SOUL 174 ld b, $10 ; can't be caught value 175 jp z, .setAnimData
engine/items/item_effects.asm lines 149–175 at af51989 · upstream ↗ 3309IsGhostBattle: 3310 ld a, [wIsInBattle] 3311 dec a 3312 ret nz 3313 ld a, [wCurMap] 3314 cp POKEMON_TOWER_1F 3315 jr c, .next 3316 cp POKEMON_TOWER_7F + 1 3317 jr nc, .next 3318 ld b, SILPH_SCOPE 3319 call IsItemInBag 3320 ret z ⋮
engine/battle/core.asm lines 3309–3324 at af51989 · upstream ↗ 61IsItemInBag:: 62; given an item_id in b 63; set zero flag if item isn't in player's bag 64; else reset zero flag
home/map_objects.asm lines 61–64 at af51989 · upstream ↗ 209DEF RESTLESS_SOUL EQU MAROWAKconstants/pokemon_constants.asm line 209 at af51989 · upstream ↗ 439; Determine the message to display from the animation. 440 ld a, [wPokeBallAnimData] 441 cp $10 442 ld hl, ItemUseBallText00 443 jp z, .printMessage
engine/items/item_effects.asm lines 439–443 at af51989 · upstream ↗ 1_ItemUseBallText00:: 2 text "It dodged the" 3 line "thrown BALL!" ⋮ 5 para "This #MON" 6 line "can't be caught!"
data/text/text_6.asm lines 1–6 at af51989 · upstream ↗ 512 ld [wCurPartySpecies], a 513 ld [wPokedexNum], a 514 ld a, [wBattleType] 515 dec a ; is this the old man battle? 516 jr z, .oldManCaughtMon ; if so, don't give the player the caught Pokémon
engine/items/item_effects.asm lines 512–516 at af51989 · upstream ↗ 569.oldManCaughtMon 570 ld hl, ItemUseBallText05 ⋮ 572.printMessage 573 call PrintText 574 call ClearSprites ⋮ 576.done 577 ld a, [wBattleType] 578 and a ; is this the old man battle? 579 ret nz ; if so, don't remove a ball from the bag
engine/items/item_effects.asm lines 568–579 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-27.
- ^ abcEvery ball but the Master Ball starts with a random first number whose range the ball sets: 0 to 255 for a Poké Ball, 0 to 200 for a Great Ball, and 0 to 150 for an Ultra or Safari Ball. The game draws a random byte and draws again while it is above the ball's limit. A Master Ball draws the byte too but ignores it, and catches without this or any later test.Codepret/pokeredrevised
How we know
177; Get the first random number. Let it be called Rand1. ⋮ 180; Poké Ball: [0, 255] 181; Great Ball: [0, 200] 182; Ultra/Safari Ball: [0, 150] ⋮ 185.loop 186 call Random 187 ld b, a ⋮ 194 cp MASTER_BALL 195 jp z, .captured ⋮ 198 cp POKE_BALL 199 jr z, .checkForAilments ⋮ 201; If it's a Great/Ultra/Safari Ball and Rand1 is greater than 200, try again. ⋮
engine/items/item_effects.asm lines 177–214 at af51989 · upstream ↗ 318.captured 319 jr .skipShakeCalculations
engine/items/item_effects.asm lines 318–319 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-27.
- ^A Master Ball catches every wild Pokémon but the ghosts, which dodge it as they dodge every ball, unless the party and the current PC box are both full, when no ball can be thrown: after the ghost tests, it skips the catch-rate, status, and HP tests, so neither status nor HP matters. A random byte is drawn before the ball is identified and never used.Codepret/pokeredrevised
How we know
149; If the player is fighting an unidentified ghost, set the value that indicates 150; the Pokémon can't be caught and skip the capture calculations. 151 callfar IsGhostBattle 152 ld b, $10 ; can't be caught value 153 jp z, .setAnimData ⋮ 170 cp POKEMON_TOWER_6F 171 jr nz, .loop 172 ld a, [wEnemyMonSpecies2] 173 cp RESTLESS_SOUL 174 ld b, $10 ; can't be caught value 175 jp z, .setAnimData
engine/items/item_effects.asm lines 149–175 at af51989 · upstream ↗ 185.loop 186 call Random 187 ld b, a ⋮ 189; Get the item ID. 190 ld hl, wCurItem 191 ld a, [hl] ⋮ 193; The Master Ball always succeeds. 194 cp MASTER_BALL 195 jp z, .captured
engine/items/item_effects.asm lines 185–195 at af51989 · upstream ↗ 318.captured 319 jr .skipShakeCalculations
engine/items/item_effects.asm lines 318–319 at af51989 · upstream ↗ 115; If this is for the old man battle, skip checking if the party & box are full. 116 ld a, [wBattleType] 117 dec a 118 jr z, .canUseBall ⋮ 120 ld a, [wPartyCount] ; is party full? 121 cp PARTY_LENGTH 122 jr nz, .canUseBall 123 ld a, [wBoxCount] ; is box full? 124 cp MONS_PER_BOX 125 jp z, BoxFullCannotThrowBall
engine/items/item_effects.asm lines 115–125 at af51989 · upstream ↗ 58DEF PARTY_LENGTH EQU 6 ⋮ 60DEF MONS_PER_BOX EQU 20
constants/pokemon_data_constants.asm lines 58–60 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27.
- ^A badly poisoned Pokémon is as easy to catch as a poisoned one. Toxic sets the same poison bit in the status byte as other poisoning moves, plus a separate badly-poisoned flag, and the ball's status tests read only the status byte, so it subtracts 12 from the first number and adds 5 to the shake count, as for any status but sleep or freeze.Codepret/pokered
How we know
119.inflictPoison 120 dec hl 121 set PSN, [hl] 122 push de 123 dec de 124 ldh a, [hWhoseTurn] 125 and a 126 ld b, SHAKE_SCREEN_ANIM 127 ld hl, wPlayerBattleStatus3 128 ld a, [de] 129 ld de, wPlayerToxicCounter 130 jr nz, .ok ⋮
engine/battle/effects.asm lines 119–137 at af51989 · upstream ↗ 67; non-volatile statuses 68DEF SLP_MASK EQU %111 ; 0-7 turns 69 const_def 3 70 const PSN ; 3 71 const BRN ; 4 72 const FRZ ; 5 73 const PAR ; 6
constants/battle_constants.asm lines 67–73 at af51989 · upstream ↗ 107; wPlayerBattleStatus3 or wEnemyBattleStatus3 bit flags 108 const_def 109 const BADLY_POISONED ; 0 ; Toxic
constants/battle_constants.asm lines 107–109 at af51989 · upstream ↗ 224; If Status is greater than Rand1, the Pokémon will be caught for sure. 225 ld a, [wEnemyMonStatus] 226 and a 227 jr z, .skipAilmentValueSubtraction ; no ailments 228 and (1 << FRZ) | SLP_MASK 229 ld c, 12 230 jr z, .notFrozenOrAsleep
engine/items/item_effects.asm lines 224–230 at af51989 · upstream ↗ 380 ld a, [wEnemyMonStatus] 381 and a 382 jr z, .skip5 383 and (1 << FRZ) | SLP_MASK 384 ld b, 5 385 jr z, .addAilmentValue 386 ld b, 10
engine/items/item_effects.asm lines 380–386 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-27.
- ^Every wild Pokémon of a species starts with the same catch rate, its species' (45 for a Bulbasaur): when the battle loads the Pokémon it copies the species' catch-rate byte, and the ball's catch-rate test reads that copy. In the Safari Zone, bait halves the copy and a rock doubles it, up to 255.Codepret/pokered
How we know
6107 ld hl, wMonHBaseStats 6108 ld de, wEnemyMonBaseStats ⋮ 6111 ld a, [hli] 6112 ld [de], a ⋮ 6116 ld hl, wMonHCatchRate 6117 ld a, [hli] 6118 ld [de], a
engine/battle/core.asm lines 6107–6118 at af51989 · upstream ↗ 1200wEnemyMonBaseStats:: ds NUM_STATS 1201wEnemyMonActualCatchRate:: db
ram/wram.asm lines 1200–1201 at af51989 · upstream ↗ 7 db 45 ; catch ratedata/pokemon/base_stats/bulbasaur.asm line 7 at af51989 · upstream ↗ 298 pop bc ; b = Rand1 - Status ⋮ 300; If Rand1 - Status > CatchRate, the ball fails to capture the Pokémon. 301 ld a, [wEnemyMonActualCatchRate] 302 cp b 303 jr c, .failedToCapture
engine/items/item_effects.asm lines 298–303 at af51989 · upstream ↗ 1436 ld hl, wEnemyMonActualCatchRate 1437 srl [hl] ; halve catch rate ⋮ 1449 ld hl, wEnemyMonActualCatchRate 1450 ld a, [hl] 1451 add a ; double catch rate 1452 jr nc, .noCarry 1453 ld a, $ff 1454.noCarry
engine/items/item_effects.asm lines 1432–1455 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-22.
Checked by a second AI model, 2026-10-27.
- ^Across all 151 species, a species' catch rate runs from 3 (Articuno, Zapdos, Moltres, and Mewtwo) to 255 (fifteen species, among them Caterpie, Pidgey, Rattata, and Magikarp), and its base HP from 10 (Diglett) to 250 (Chansey). The species' names are as the game prints them.Codepret/pokeredrevised
How we know
1 db DEX_BULBASAUR ; pokedex id ⋮ 3 db 45, 49, 49, 45, 65 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/bulbasaur.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_IVYSAUR ; pokedex id ⋮ 3 db 60, 62, 63, 60, 80 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/ivysaur.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_VENUSAUR ; pokedex id ⋮ 3 db 80, 82, 83, 80, 100 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/venusaur.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CHARMANDER ; pokedex id ⋮ 3 db 39, 52, 43, 65, 50 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/charmander.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CHARMELEON ; pokedex id ⋮ 3 db 58, 64, 58, 80, 65 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/charmeleon.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CHARIZARD ; pokedex id ⋮ 3 db 78, 84, 78, 100, 85 4 ; hp atk def spd spc ⋮ 6 db FIRE, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/charizard.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SQUIRTLE ; pokedex id ⋮ 3 db 44, 48, 65, 43, 50 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 45 ; catch rate
data/pokemon/base_stats/squirtle.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_WARTORTLE ; pokedex id ⋮ 3 db 59, 63, 80, 58, 65 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 45 ; catch rate
data/pokemon/base_stats/wartortle.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_BLASTOISE ; pokedex id ⋮ 3 db 79, 83, 100, 78, 85 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 45 ; catch rate
data/pokemon/base_stats/blastoise.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CATERPIE ; pokedex id ⋮ 3 db 45, 30, 35, 45, 20 4 ; hp atk def spd spc ⋮ 6 db BUG, BUG ; type 7 db 255 ; catch rate
data/pokemon/base_stats/caterpie.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_METAPOD ; pokedex id ⋮ 3 db 50, 20, 55, 30, 25 4 ; hp atk def spd spc ⋮ 6 db BUG, BUG ; type 7 db 120 ; catch rate
data/pokemon/base_stats/metapod.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_BUTTERFREE ; pokedex id ⋮ 3 db 60, 45, 50, 70, 80 4 ; hp atk def spd spc ⋮ 6 db BUG, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/butterfree.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_WEEDLE ; pokedex id ⋮ 3 db 40, 35, 30, 50, 20 4 ; hp atk def spd spc ⋮ 6 db BUG, POISON ; type 7 db 255 ; catch rate
data/pokemon/base_stats/weedle.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_KAKUNA ; pokedex id ⋮ 3 db 45, 25, 50, 35, 25 4 ; hp atk def spd spc ⋮ 6 db BUG, POISON ; type 7 db 120 ; catch rate
data/pokemon/base_stats/kakuna.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_BEEDRILL ; pokedex id ⋮ 3 db 65, 80, 40, 75, 45 4 ; hp atk def spd spc ⋮ 6 db BUG, POISON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/beedrill.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PIDGEY ; pokedex id ⋮ 3 db 40, 45, 40, 56, 35 4 ; hp atk def spd spc ⋮ 6 db NORMAL, FLYING ; type 7 db 255 ; catch rate
data/pokemon/base_stats/pidgey.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PIDGEOTTO ; pokedex id ⋮ 3 db 63, 60, 55, 71, 50 4 ; hp atk def spd spc ⋮ 6 db NORMAL, FLYING ; type 7 db 120 ; catch rate
data/pokemon/base_stats/pidgeotto.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PIDGEOT ; pokedex id ⋮ 3 db 83, 80, 75, 91, 70 4 ; hp atk def spd spc ⋮ 6 db NORMAL, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/pidgeot.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_RATTATA ; pokedex id ⋮ 3 db 30, 56, 35, 72, 25 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 255 ; catch rate
data/pokemon/base_stats/rattata.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_RATICATE ; pokedex id ⋮ 3 db 55, 81, 60, 97, 50 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 90 ; catch rate
data/pokemon/base_stats/raticate.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SPEAROW ; pokedex id ⋮ 3 db 40, 60, 30, 70, 31 4 ; hp atk def spd spc ⋮ 6 db NORMAL, FLYING ; type 7 db 255 ; catch rate
data/pokemon/base_stats/spearow.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_FEAROW ; pokedex id ⋮ 3 db 65, 90, 65, 100, 61 4 ; hp atk def spd spc ⋮ 6 db NORMAL, FLYING ; type 7 db 90 ; catch rate
data/pokemon/base_stats/fearow.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_EKANS ; pokedex id ⋮ 3 db 35, 60, 44, 55, 40 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 255 ; catch rate
data/pokemon/base_stats/ekans.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ARBOK ; pokedex id ⋮ 3 db 60, 85, 69, 80, 65 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 90 ; catch rate
data/pokemon/base_stats/arbok.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PIKACHU ; pokedex id ⋮ 3 db 35, 55, 30, 90, 50 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, ELECTRIC ; type 7 db 190 ; catch rate
data/pokemon/base_stats/pikachu.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_RAICHU ; pokedex id ⋮ 3 db 60, 90, 55, 100, 90 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, ELECTRIC ; type 7 db 75 ; catch rate
data/pokemon/base_stats/raichu.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SANDSHREW ; pokedex id ⋮ 3 db 50, 75, 85, 40, 30 4 ; hp atk def spd spc ⋮ 6 db GROUND, GROUND ; type 7 db 255 ; catch rate
data/pokemon/base_stats/sandshrew.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SANDSLASH ; pokedex id ⋮ 3 db 75, 100, 110, 65, 55 4 ; hp atk def spd spc ⋮ 6 db GROUND, GROUND ; type 7 db 90 ; catch rate
data/pokemon/base_stats/sandslash.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_NIDORAN_F ; pokedex id ⋮ 3 db 55, 47, 52, 41, 40 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 235 ; catch rate
data/pokemon/base_stats/nidoranf.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_NIDORINA ; pokedex id ⋮ 3 db 70, 62, 67, 56, 55 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 120 ; catch rate
data/pokemon/base_stats/nidorina.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_NIDOQUEEN ; pokedex id ⋮ 3 db 90, 82, 87, 76, 75 4 ; hp atk def spd spc ⋮ 6 db POISON, GROUND ; type 7 db 45 ; catch rate
data/pokemon/base_stats/nidoqueen.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_NIDORAN_M ; pokedex id ⋮ 3 db 46, 57, 40, 50, 40 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 235 ; catch rate
data/pokemon/base_stats/nidoranm.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_NIDORINO ; pokedex id ⋮ 3 db 61, 72, 57, 65, 55 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 120 ; catch rate
data/pokemon/base_stats/nidorino.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_NIDOKING ; pokedex id ⋮ 3 db 81, 92, 77, 85, 75 4 ; hp atk def spd spc ⋮ 6 db POISON, GROUND ; type 7 db 45 ; catch rate
data/pokemon/base_stats/nidoking.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CLEFAIRY ; pokedex id ⋮ 3 db 70, 45, 48, 35, 60 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 150 ; catch rate
data/pokemon/base_stats/clefairy.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CLEFABLE ; pokedex id ⋮ 3 db 95, 70, 73, 60, 85 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 25 ; catch rate
data/pokemon/base_stats/clefable.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_VULPIX ; pokedex id ⋮ 3 db 38, 41, 40, 65, 65 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 190 ; catch rate
data/pokemon/base_stats/vulpix.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_NINETALES ; pokedex id ⋮ 3 db 73, 76, 75, 100, 100 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 75 ; catch rate
data/pokemon/base_stats/ninetales.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_JIGGLYPUFF ; pokedex id ⋮ 3 db 115, 45, 20, 20, 25 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 170 ; catch rate
data/pokemon/base_stats/jigglypuff.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_WIGGLYTUFF ; pokedex id ⋮ 3 db 140, 70, 45, 45, 50 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 50 ; catch rate
data/pokemon/base_stats/wigglytuff.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ZUBAT ; pokedex id ⋮ 3 db 40, 45, 35, 55, 40 4 ; hp atk def spd spc ⋮ 6 db POISON, FLYING ; type 7 db 255 ; catch rate
data/pokemon/base_stats/zubat.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GOLBAT ; pokedex id ⋮ 3 db 75, 80, 70, 90, 75 4 ; hp atk def spd spc ⋮ 6 db POISON, FLYING ; type 7 db 90 ; catch rate
data/pokemon/base_stats/golbat.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ODDISH ; pokedex id ⋮ 3 db 45, 50, 55, 30, 75 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 255 ; catch rate
data/pokemon/base_stats/oddish.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GLOOM ; pokedex id ⋮ 3 db 60, 65, 70, 40, 85 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 120 ; catch rate
data/pokemon/base_stats/gloom.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_VILEPLUME ; pokedex id ⋮ 3 db 75, 80, 85, 50, 100 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/vileplume.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PARAS ; pokedex id ⋮ 3 db 35, 70, 55, 25, 55 4 ; hp atk def spd spc ⋮ 6 db BUG, GRASS ; type 7 db 190 ; catch rate
data/pokemon/base_stats/paras.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PARASECT ; pokedex id ⋮ 3 db 60, 95, 80, 30, 80 4 ; hp atk def spd spc ⋮ 6 db BUG, GRASS ; type 7 db 75 ; catch rate
data/pokemon/base_stats/parasect.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_VENONAT ; pokedex id ⋮ 3 db 60, 55, 50, 45, 40 4 ; hp atk def spd spc ⋮ 6 db BUG, POISON ; type 7 db 190 ; catch rate
data/pokemon/base_stats/venonat.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_VENOMOTH ; pokedex id ⋮ 3 db 70, 65, 60, 90, 90 4 ; hp atk def spd spc ⋮ 6 db BUG, POISON ; type 7 db 75 ; catch rate
data/pokemon/base_stats/venomoth.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DIGLETT ; pokedex id ⋮ 3 db 10, 55, 25, 95, 45 4 ; hp atk def spd spc ⋮ 6 db GROUND, GROUND ; type 7 db 255 ; catch rate
data/pokemon/base_stats/diglett.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DUGTRIO ; pokedex id ⋮ 3 db 35, 80, 50, 120, 70 4 ; hp atk def spd spc ⋮ 6 db GROUND, GROUND ; type 7 db 50 ; catch rate
data/pokemon/base_stats/dugtrio.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MEOWTH ; pokedex id ⋮ 3 db 40, 45, 35, 90, 40 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 255 ; catch rate
data/pokemon/base_stats/meowth.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PERSIAN ; pokedex id ⋮ 3 db 65, 70, 60, 115, 65 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 90 ; catch rate
data/pokemon/base_stats/persian.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PSYDUCK ; pokedex id ⋮ 3 db 50, 52, 48, 55, 50 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 190 ; catch rate
data/pokemon/base_stats/psyduck.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GOLDUCK ; pokedex id ⋮ 3 db 80, 82, 78, 85, 80 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 75 ; catch rate
data/pokemon/base_stats/golduck.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MANKEY ; pokedex id ⋮ 3 db 40, 80, 35, 70, 35 4 ; hp atk def spd spc ⋮ 6 db FIGHTING, FIGHTING ; type 7 db 190 ; catch rate
data/pokemon/base_stats/mankey.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PRIMEAPE ; pokedex id ⋮ 3 db 65, 105, 60, 95, 60 4 ; hp atk def spd spc ⋮ 6 db FIGHTING, FIGHTING ; type 7 db 75 ; catch rate
data/pokemon/base_stats/primeape.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GROWLITHE ; pokedex id ⋮ 3 db 55, 70, 45, 60, 50 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 190 ; catch rate
data/pokemon/base_stats/growlithe.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ARCANINE ; pokedex id ⋮ 3 db 90, 110, 80, 95, 80 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 75 ; catch rate
data/pokemon/base_stats/arcanine.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_POLIWAG ; pokedex id ⋮ 3 db 40, 50, 40, 90, 40 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 255 ; catch rate
data/pokemon/base_stats/poliwag.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_POLIWHIRL ; pokedex id ⋮ 3 db 65, 65, 65, 90, 50 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 120 ; catch rate
data/pokemon/base_stats/poliwhirl.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_POLIWRATH ; pokedex id ⋮ 3 db 90, 85, 95, 70, 70 4 ; hp atk def spd spc ⋮ 6 db WATER, FIGHTING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/poliwrath.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ABRA ; pokedex id ⋮ 3 db 25, 20, 15, 90, 105 4 ; hp atk def spd spc ⋮ 6 db PSYCHIC_TYPE, PSYCHIC_TYPE ; type 7 db 200 ; catch rate
data/pokemon/base_stats/abra.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_KADABRA ; pokedex id ⋮ 3 db 40, 35, 30, 105, 120 4 ; hp atk def spd spc ⋮ 6 db PSYCHIC_TYPE, PSYCHIC_TYPE ; type 7 db 100 ; catch rate
data/pokemon/base_stats/kadabra.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ALAKAZAM ; pokedex id ⋮ 3 db 55, 50, 45, 120, 135 4 ; hp atk def spd spc ⋮ 6 db PSYCHIC_TYPE, PSYCHIC_TYPE ; type 7 db 50 ; catch rate
data/pokemon/base_stats/alakazam.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MACHOP ; pokedex id ⋮ 3 db 70, 80, 50, 35, 35 4 ; hp atk def spd spc ⋮ 6 db FIGHTING, FIGHTING ; type 7 db 180 ; catch rate
data/pokemon/base_stats/machop.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MACHOKE ; pokedex id ⋮ 3 db 80, 100, 70, 45, 50 4 ; hp atk def spd spc ⋮ 6 db FIGHTING, FIGHTING ; type 7 db 90 ; catch rate
data/pokemon/base_stats/machoke.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MACHAMP ; pokedex id ⋮ 3 db 90, 130, 80, 55, 65 4 ; hp atk def spd spc ⋮ 6 db FIGHTING, FIGHTING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/machamp.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_BELLSPROUT ; pokedex id ⋮ 3 db 50, 75, 35, 40, 70 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 255 ; catch rate
data/pokemon/base_stats/bellsprout.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_WEEPINBELL ; pokedex id ⋮ 3 db 65, 90, 50, 55, 85 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 120 ; catch rate
data/pokemon/base_stats/weepinbell.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_VICTREEBEL ; pokedex id ⋮ 3 db 80, 105, 65, 70, 100 4 ; hp atk def spd spc ⋮ 6 db GRASS, POISON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/victreebel.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_TENTACOOL ; pokedex id ⋮ 3 db 40, 40, 35, 70, 100 4 ; hp atk def spd spc ⋮ 6 db WATER, POISON ; type 7 db 190 ; catch rate
data/pokemon/base_stats/tentacool.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_TENTACRUEL ; pokedex id ⋮ 3 db 80, 70, 65, 100, 120 4 ; hp atk def spd spc ⋮ 6 db WATER, POISON ; type 7 db 60 ; catch rate
data/pokemon/base_stats/tentacruel.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GEODUDE ; pokedex id ⋮ 3 db 40, 80, 100, 20, 30 4 ; hp atk def spd spc ⋮ 6 db ROCK, GROUND ; type 7 db 255 ; catch rate
data/pokemon/base_stats/geodude.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GRAVELER ; pokedex id ⋮ 3 db 55, 95, 115, 35, 45 4 ; hp atk def spd spc ⋮ 6 db ROCK, GROUND ; type 7 db 120 ; catch rate
data/pokemon/base_stats/graveler.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GOLEM ; pokedex id ⋮ 3 db 80, 110, 130, 45, 55 4 ; hp atk def spd spc ⋮ 6 db ROCK, GROUND ; type 7 db 45 ; catch rate
data/pokemon/base_stats/golem.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PONYTA ; pokedex id ⋮ 3 db 50, 85, 55, 90, 65 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 190 ; catch rate
data/pokemon/base_stats/ponyta.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_RAPIDASH ; pokedex id ⋮ 3 db 65, 100, 70, 105, 80 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 60 ; catch rate
data/pokemon/base_stats/rapidash.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SLOWPOKE ; pokedex id ⋮ 3 db 90, 65, 65, 15, 40 4 ; hp atk def spd spc ⋮ 6 db WATER, PSYCHIC_TYPE ; type 7 db 190 ; catch rate
data/pokemon/base_stats/slowpoke.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SLOWBRO ; pokedex id ⋮ 3 db 95, 75, 110, 30, 80 4 ; hp atk def spd spc ⋮ 6 db WATER, PSYCHIC_TYPE ; type 7 db 75 ; catch rate
data/pokemon/base_stats/slowbro.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MAGNEMITE ; pokedex id ⋮ 3 db 25, 35, 70, 45, 95 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, ELECTRIC ; type 7 db 190 ; catch rate
data/pokemon/base_stats/magnemite.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MAGNETON ; pokedex id ⋮ 3 db 50, 60, 95, 70, 120 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, ELECTRIC ; type 7 db 60 ; catch rate
data/pokemon/base_stats/magneton.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_FARFETCHD ; pokedex id ⋮ 3 db 52, 65, 55, 60, 58 4 ; hp atk def spd spc ⋮ 6 db NORMAL, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/farfetchd.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DODUO ; pokedex id ⋮ 3 db 35, 85, 45, 75, 35 4 ; hp atk def spd spc ⋮ 6 db NORMAL, FLYING ; type 7 db 190 ; catch rate
data/pokemon/base_stats/doduo.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DODRIO ; pokedex id ⋮ 3 db 60, 110, 70, 100, 60 4 ; hp atk def spd spc ⋮ 6 db NORMAL, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/dodrio.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SEEL ; pokedex id ⋮ 3 db 65, 45, 55, 45, 70 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 190 ; catch rate
data/pokemon/base_stats/seel.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DEWGONG ; pokedex id ⋮ 3 db 90, 70, 80, 70, 95 4 ; hp atk def spd spc ⋮ 6 db WATER, ICE ; type 7 db 75 ; catch rate
data/pokemon/base_stats/dewgong.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GRIMER ; pokedex id ⋮ 3 db 80, 80, 50, 25, 40 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 190 ; catch rate
data/pokemon/base_stats/grimer.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MUK ; pokedex id ⋮ 3 db 105, 105, 75, 50, 65 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 75 ; catch rate
data/pokemon/base_stats/muk.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SHELLDER ; pokedex id ⋮ 3 db 30, 65, 100, 40, 45 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 190 ; catch rate
data/pokemon/base_stats/shellder.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CLOYSTER ; pokedex id ⋮ 3 db 50, 95, 180, 70, 85 4 ; hp atk def spd spc ⋮ 6 db WATER, ICE ; type 7 db 60 ; catch rate
data/pokemon/base_stats/cloyster.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GASTLY ; pokedex id ⋮ 3 db 30, 35, 30, 80, 100 4 ; hp atk def spd spc ⋮ 6 db GHOST, POISON ; type 7 db 190 ; catch rate
data/pokemon/base_stats/gastly.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_HAUNTER ; pokedex id ⋮ 3 db 45, 50, 45, 95, 115 4 ; hp atk def spd spc ⋮ 6 db GHOST, POISON ; type 7 db 90 ; catch rate
data/pokemon/base_stats/haunter.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GENGAR ; pokedex id ⋮ 3 db 60, 65, 60, 110, 130 4 ; hp atk def spd spc ⋮ 6 db GHOST, POISON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/gengar.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ONIX ; pokedex id ⋮ 3 db 35, 45, 160, 70, 30 4 ; hp atk def spd spc ⋮ 6 db ROCK, GROUND ; type 7 db 45 ; catch rate
data/pokemon/base_stats/onix.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DROWZEE ; pokedex id ⋮ 3 db 60, 48, 45, 42, 90 4 ; hp atk def spd spc ⋮ 6 db PSYCHIC_TYPE, PSYCHIC_TYPE ; type 7 db 190 ; catch rate
data/pokemon/base_stats/drowzee.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_HYPNO ; pokedex id ⋮ 3 db 85, 73, 70, 67, 115 4 ; hp atk def spd spc ⋮ 6 db PSYCHIC_TYPE, PSYCHIC_TYPE ; type 7 db 75 ; catch rate
data/pokemon/base_stats/hypno.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_KRABBY ; pokedex id ⋮ 3 db 30, 105, 90, 50, 25 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 225 ; catch rate
data/pokemon/base_stats/krabby.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_KINGLER ; pokedex id ⋮ 3 db 55, 130, 115, 75, 50 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 60 ; catch rate
data/pokemon/base_stats/kingler.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_VOLTORB ; pokedex id ⋮ 3 db 40, 30, 50, 100, 55 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, ELECTRIC ; type 7 db 190 ; catch rate
data/pokemon/base_stats/voltorb.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ELECTRODE ; pokedex id ⋮ 3 db 60, 50, 70, 140, 80 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, ELECTRIC ; type 7 db 60 ; catch rate
data/pokemon/base_stats/electrode.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_EXEGGCUTE ; pokedex id ⋮ 3 db 60, 40, 80, 40, 60 4 ; hp atk def spd spc ⋮ 6 db GRASS, PSYCHIC_TYPE ; type 7 db 90 ; catch rate
data/pokemon/base_stats/exeggcute.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_EXEGGUTOR ; pokedex id ⋮ 3 db 95, 95, 85, 55, 125 4 ; hp atk def spd spc ⋮ 6 db GRASS, PSYCHIC_TYPE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/exeggutor.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CUBONE ; pokedex id ⋮ 3 db 50, 50, 95, 35, 40 4 ; hp atk def spd spc ⋮ 6 db GROUND, GROUND ; type 7 db 190 ; catch rate
data/pokemon/base_stats/cubone.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MAROWAK ; pokedex id ⋮ 3 db 60, 80, 110, 45, 50 4 ; hp atk def spd spc ⋮ 6 db GROUND, GROUND ; type 7 db 75 ; catch rate
data/pokemon/base_stats/marowak.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_HITMONLEE ; pokedex id ⋮ 3 db 50, 120, 53, 87, 35 4 ; hp atk def spd spc ⋮ 6 db FIGHTING, FIGHTING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/hitmonlee.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_HITMONCHAN ; pokedex id ⋮ 3 db 50, 105, 79, 76, 35 4 ; hp atk def spd spc ⋮ 6 db FIGHTING, FIGHTING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/hitmonchan.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_LICKITUNG ; pokedex id ⋮ 3 db 90, 55, 75, 30, 60 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 45 ; catch rate
data/pokemon/base_stats/lickitung.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_KOFFING ; pokedex id ⋮ 3 db 40, 65, 95, 35, 60 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 190 ; catch rate
data/pokemon/base_stats/koffing.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_WEEZING ; pokedex id ⋮ 3 db 65, 90, 120, 60, 85 4 ; hp atk def spd spc ⋮ 6 db POISON, POISON ; type 7 db 60 ; catch rate
data/pokemon/base_stats/weezing.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_RHYHORN ; pokedex id ⋮ 3 db 80, 85, 95, 25, 30 4 ; hp atk def spd spc ⋮ 6 db GROUND, ROCK ; type 7 db 120 ; catch rate
data/pokemon/base_stats/rhyhorn.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_RHYDON ; pokedex id ⋮ 3 db 105, 130, 120, 40, 45 4 ; hp atk def spd spc ⋮ 6 db GROUND, ROCK ; type 7 db 60 ; catch rate
data/pokemon/base_stats/rhydon.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_CHANSEY ; pokedex id ⋮ 3 db 250, 5, 5, 50, 105 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 30 ; catch rate
data/pokemon/base_stats/chansey.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_TANGELA ; pokedex id ⋮ 3 db 65, 55, 115, 60, 100 4 ; hp atk def spd spc ⋮ 6 db GRASS, GRASS ; type 7 db 45 ; catch rate
data/pokemon/base_stats/tangela.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_KANGASKHAN ; pokedex id ⋮ 3 db 105, 95, 80, 90, 40 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 45 ; catch rate
data/pokemon/base_stats/kangaskhan.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_HORSEA ; pokedex id ⋮ 3 db 30, 40, 70, 60, 70 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 225 ; catch rate
data/pokemon/base_stats/horsea.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SEADRA ; pokedex id ⋮ 3 db 55, 65, 95, 85, 95 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 75 ; catch rate
data/pokemon/base_stats/seadra.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GOLDEEN ; pokedex id ⋮ 3 db 45, 67, 60, 63, 50 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 225 ; catch rate
data/pokemon/base_stats/goldeen.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SEAKING ; pokedex id ⋮ 3 db 80, 92, 65, 68, 80 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 60 ; catch rate
data/pokemon/base_stats/seaking.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_STARYU ; pokedex id ⋮ 3 db 30, 45, 55, 85, 70 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 225 ; catch rate
data/pokemon/base_stats/staryu.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_STARMIE ; pokedex id ⋮ 3 db 60, 75, 85, 115, 100 4 ; hp atk def spd spc ⋮ 6 db WATER, PSYCHIC_TYPE ; type 7 db 60 ; catch rate
data/pokemon/base_stats/starmie.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MR_MIME ; pokedex id ⋮ 3 db 40, 45, 65, 90, 100 4 ; hp atk def spd spc ⋮ 6 db PSYCHIC_TYPE, PSYCHIC_TYPE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/mrmime.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SCYTHER ; pokedex id ⋮ 3 db 70, 110, 80, 105, 55 4 ; hp atk def spd spc ⋮ 6 db BUG, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/scyther.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_JYNX ; pokedex id ⋮ 3 db 65, 50, 35, 95, 95 4 ; hp atk def spd spc ⋮ 6 db ICE, PSYCHIC_TYPE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/jynx.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ELECTABUZZ ; pokedex id ⋮ 3 db 65, 83, 57, 105, 85 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, ELECTRIC ; type 7 db 45 ; catch rate
data/pokemon/base_stats/electabuzz.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MAGMAR ; pokedex id ⋮ 3 db 65, 95, 57, 93, 85 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/magmar.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PINSIR ; pokedex id ⋮ 3 db 65, 125, 100, 85, 55 4 ; hp atk def spd spc ⋮ 6 db BUG, BUG ; type 7 db 45 ; catch rate
data/pokemon/base_stats/pinsir.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_TAUROS ; pokedex id ⋮ 3 db 75, 100, 95, 110, 70 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 45 ; catch rate
data/pokemon/base_stats/tauros.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MAGIKARP ; pokedex id ⋮ 3 db 20, 10, 55, 80, 20 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 255 ; catch rate
data/pokemon/base_stats/magikarp.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_GYARADOS ; pokedex id ⋮ 3 db 95, 125, 79, 81, 100 4 ; hp atk def spd spc ⋮ 6 db WATER, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/gyarados.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_LAPRAS ; pokedex id ⋮ 3 db 130, 85, 80, 60, 95 4 ; hp atk def spd spc ⋮ 6 db WATER, ICE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/lapras.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DITTO ; pokedex id ⋮ 3 db 48, 48, 48, 48, 48 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 35 ; catch rate
data/pokemon/base_stats/ditto.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_EEVEE ; pokedex id ⋮ 3 db 55, 55, 50, 55, 65 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 45 ; catch rate
data/pokemon/base_stats/eevee.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_VAPOREON ; pokedex id ⋮ 3 db 130, 65, 60, 65, 110 4 ; hp atk def spd spc ⋮ 6 db WATER, WATER ; type 7 db 45 ; catch rate
data/pokemon/base_stats/vaporeon.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_JOLTEON ; pokedex id ⋮ 3 db 65, 65, 60, 130, 110 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, ELECTRIC ; type 7 db 45 ; catch rate
data/pokemon/base_stats/jolteon.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_FLAREON ; pokedex id ⋮ 3 db 65, 130, 60, 65, 110 4 ; hp atk def spd spc ⋮ 6 db FIRE, FIRE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/flareon.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_PORYGON ; pokedex id ⋮ 3 db 65, 60, 70, 40, 75 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 45 ; catch rate
data/pokemon/base_stats/porygon.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_OMANYTE ; pokedex id ⋮ 3 db 35, 40, 100, 35, 90 4 ; hp atk def spd spc ⋮ 6 db ROCK, WATER ; type 7 db 45 ; catch rate
data/pokemon/base_stats/omanyte.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_OMASTAR ; pokedex id ⋮ 3 db 70, 60, 125, 55, 115 4 ; hp atk def spd spc ⋮ 6 db ROCK, WATER ; type 7 db 45 ; catch rate
data/pokemon/base_stats/omastar.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_KABUTO ; pokedex id ⋮ 3 db 30, 80, 90, 55, 45 4 ; hp atk def spd spc ⋮ 6 db ROCK, WATER ; type 7 db 45 ; catch rate
data/pokemon/base_stats/kabuto.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_KABUTOPS ; pokedex id ⋮ 3 db 60, 115, 105, 80, 70 4 ; hp atk def spd spc ⋮ 6 db ROCK, WATER ; type 7 db 45 ; catch rate
data/pokemon/base_stats/kabutops.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_AERODACTYL ; pokedex id ⋮ 3 db 80, 105, 65, 130, 60 4 ; hp atk def spd spc ⋮ 6 db ROCK, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/aerodactyl.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_SNORLAX ; pokedex id ⋮ 3 db 160, 110, 65, 30, 65 4 ; hp atk def spd spc ⋮ 6 db NORMAL, NORMAL ; type 7 db 25 ; catch rate
data/pokemon/base_stats/snorlax.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ARTICUNO ; pokedex id ⋮ 3 db 90, 85, 100, 85, 125 4 ; hp atk def spd spc ⋮ 6 db ICE, FLYING ; type 7 db 3 ; catch rate
data/pokemon/base_stats/articuno.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_ZAPDOS ; pokedex id ⋮ 3 db 90, 90, 85, 100, 125 4 ; hp atk def spd spc ⋮ 6 db ELECTRIC, FLYING ; type 7 db 3 ; catch rate
data/pokemon/base_stats/zapdos.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MOLTRES ; pokedex id ⋮ 3 db 90, 100, 90, 90, 125 4 ; hp atk def spd spc ⋮ 6 db FIRE, FLYING ; type 7 db 3 ; catch rate
data/pokemon/base_stats/moltres.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DRATINI ; pokedex id ⋮ 3 db 41, 64, 45, 50, 50 4 ; hp atk def spd spc ⋮ 6 db DRAGON, DRAGON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/dratini.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DRAGONAIR ; pokedex id ⋮ 3 db 61, 84, 65, 70, 70 4 ; hp atk def spd spc ⋮ 6 db DRAGON, DRAGON ; type 7 db 45 ; catch rate
data/pokemon/base_stats/dragonair.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_DRAGONITE ; pokedex id ⋮ 3 db 91, 134, 95, 80, 100 4 ; hp atk def spd spc ⋮ 6 db DRAGON, FLYING ; type 7 db 45 ; catch rate
data/pokemon/base_stats/dragonite.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MEWTWO ; pokedex id ⋮ 3 db 106, 110, 90, 130, 154 4 ; hp atk def spd spc ⋮ 6 db PSYCHIC_TYPE, PSYCHIC_TYPE ; type 7 db 3 ; catch rate
data/pokemon/base_stats/mewtwo.asm lines 1–7 at af51989 · upstream ↗ 1 db DEX_MEW ; pokedex id ⋮ 3 db 100, 100, 100, 100, 100 4 ; hp atk def spd spc ⋮ 6 db PSYCHIC_TYPE, PSYCHIC_TYPE ; type 7 db 45 ; catch rate
data/pokemon/base_stats/mew.asm lines 1–7 at af51989 · upstream ↗ 3 dname "RHYDON" 4 dname "KANGASKHAN" 5 dname "NIDORAN♂" 6 dname "CLEFAIRY" 7 dname "SPEAROW" 8 dname "VOLTORB" 9 dname "NIDOKING" 10 dname "SLOWBRO" 11 dname "IVYSAUR" 12 dname "EXEGGUTOR" 13 dname "LICKITUNG" 14 dname "EXEGGCUTE" ⋮
data/pokemon/names.asm lines 3–192 at af51989 · upstream ↗ 3 db DEX_RHYDON 4 db DEX_KANGASKHAN 5 db DEX_NIDORAN_M 6 db DEX_CLEFAIRY 7 db DEX_SPEAROW 8 db DEX_VOLTORB 9 db DEX_NIDOKING 10 db DEX_SLOWBRO 11 db DEX_IVYSAUR 12 db DEX_EXEGGUTOR 13 db DEX_LICKITUNG 14 db DEX_EXEGGCUTE ⋮
data/pokemon/dex_order.asm lines 3–192 at af51989 · upstream ↗ 6 const_def 1 7 const DEX_BULBASAUR ; 1 8 const DEX_IVYSAUR ; 2 9 const DEX_VENUSAUR ; 3 10 const DEX_CHARMANDER ; 4 11 const DEX_CHARMELEON ; 5 12 const DEX_CHARIZARD ; 6 13 const DEX_SQUIRTLE ; 7 14 const DEX_WARTORTLE ; 8 15 const DEX_BLASTOISE ; 9 16 const DEX_CATERPIE ; 10 17 const DEX_METAPOD ; 11 ⋮
constants/pokedex_constants.asm lines 6–157 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27.
- ^ abA failed throw's shakes depend only on the ball and on the Pokémon's catch rate, HP, and status, so every failed throw of one ball at a Pokémon in the same state shows the same count: no random number feeds it (computed). The game computes from the catch rate , with 255 for a Poké Ball, 200 for a Great Ball, and 150 for any other, then from the HP test's result , plus 10 for sleep or freeze or 5 for another status. A under 10 misses ("You missed the POKéMON!"), under 30 shows one shake ("Darn! The POKéMON broke free!"), under 70 two ("Aww! It appeared to be caught!"), and 70 or more three ("Shoot! It was so close too!"). The code's branch for a over 255, which would show three, never runs: is at most 170 (computed).Codepret/pokered
How we know
284; Let W = ((MaxHP * 255) / BallFactor) / max(HP / 4, 1). Calculate W. 285 ldh [hDivisor], a 286 ld b, 4 287 call Divide ⋮ 289; If W > 255, store 255 in [hQuotient + 3]. 290; Let X = min(W, 255) = [hQuotient + 3]. 291 ldh a, [hQuotient + 2] 292 and a 293 jr z, .skip3 294 ld a, 255 295 ldh [hQuotient + 3], a ⋮ 297.skip3 ⋮
engine/items/item_effects.asm lines 284–303 at af51989 · upstream ↗ 321.failedToCapture 322 ldh a, [hQuotient + 3] 323 ld [wPokeBallCaptureCalcTemp], a ; Save X. ⋮ 325; Calculate CatchRate * 100. 326 xor a 327 ldh [hMultiplicand], a 328 ldh [hMultiplicand + 1], a 329 ld a, [wEnemyMonActualCatchRate] 330 ldh [hMultiplicand + 2], a 331 ld a, 100 332 ldh [hMultiplier], a 333 call Multiply ⋮
engine/items/item_effects.asm lines 321–362 at af51989 · upstream ↗ 363 jr nz, .setAnimData ⋮ 365; Calculate X * Y. 366 ld a, [wPokeBallCaptureCalcTemp] 367 ldh [hMultiplier], a 368 call Multiply ⋮ 370; Calculate (X * Y) / 255. 371 ld a, 255 372 ldh [hDivisor], a 373 ld b, 4 374 call Divide ⋮ 376; Determine Status2. 377; no status ailment: Status2 = 0 ⋮
engine/items/item_effects.asm lines 363–412 at af51989 · upstream ↗ 439; Determine the message to display from the animation. 440 ld a, [wPokeBallAnimData] 441 cp $10 442 ld hl, ItemUseBallText00 443 jp z, .printMessage 444 cp $20 445 ld hl, ItemUseBallText01 446 jp z, .printMessage 447 cp $61 448 ld hl, ItemUseBallText02 449 jp z, .printMessage 450 cp $62 ⋮
engine/items/item_effects.asm lines 439–455 at af51989 · upstream ↗ 587ItemUseBallText00: ⋮ 590 text_far _ItemUseBallText00 ⋮ 592ItemUseBallText01: ⋮ 594 text_far _ItemUseBallText01 ⋮ 596ItemUseBallText02: ⋮ 598 text_far _ItemUseBallText02 ⋮ 600ItemUseBallText03: ⋮ 602 text_far _ItemUseBallText03 ⋮ 604ItemUseBallText04: ⋮ 606 text_far _ItemUseBallText04
engine/items/item_effects.asm lines 587–607 at af51989 · upstream ↗ 9_ItemUseBallText01:: 10 text "You missed the" 11 line "#MON!" 12 prompt ⋮ 14_ItemUseBallText02:: 15 text "Darn! The #MON" 16 line "broke free!" 17 prompt ⋮ 19_ItemUseBallText03:: 20 text "Aww! It appeared" 21 line "to be caught! " 22 prompt ⋮
data/text/text_6.asm lines 9–27 at af51989 · upstream ↗ 16 charmap "#", $54 ; "POKé"constants/charmap.asm line 16 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-22.
Checked by a second AI model, 2026-10-27.
- ^Outside the old man's battle, a caught Pokémon ("All right! … was caught!") joins the party with the HP and status it had when the ball hit, or goes to the current PC box when the party is full, with "… was transferred to BILL's PC!" once the player has met Bill and "someone's PC!" before. A species not yet owned is first registered in the Pokédex and its entry shown ("New POKéDEX data will be added for …!"). A Pokémon that is transformed when caught is caught as a Ditto at its level, which a comment in the disassembly calls a bug, since a wild Pokémon could copy Transform with Mirror Move.Codepret/pokeredrevised
How we know
457; Save current HP. 458 ld hl, wEnemyMonHP ⋮ 464; Save status ailment. ⋮ 471; Bug: If the Pokémon is transformed, the Pokémon is assumed to be a Ditto. 472; This is a bug because a wild Pokémon could have used Transform via 473; Mirror Move even though the only wild Pokémon that knows Transform is Ditto. 474 ld hl, wEnemyBattleStatus3 475 bit TRANSFORMED, [hl] 476 jr z, .notTransformed 477 ld a, DITTO 478 ld [wEnemyMonSpecies2], a 479 jr .skip6 ⋮
engine/items/item_effects.asm lines 457–567 at af51989 · upstream ↗ 499 callfar LoadEnemyMonData 500 pop af 501 ld [wCurPartySpecies], a 502 pop hl 503 pop af 504 ld [hld], a 505 dec hl 506 pop af 507 ld [hld], a 508 pop af 509 ld [hl], a
engine/items/item_effects.asm lines 499–509 at af51989 · upstream ↗ 608ItemUseBallText05: ⋮ 611 text_far _ItemUseBallText05 ⋮ 615ItemUseBallText07: ⋮ 617 text_far _ItemUseBallText07 ⋮ 619ItemUseBallText08: ⋮ 621 text_far _ItemUseBallText08 ⋮ 624ItemUseBallText06: ⋮ 627 text_far _ItemUseBallText06
engine/items/item_effects.asm lines 608–630 at af51989 · upstream ↗ 109 ld a, [wIsInBattle] 110 and a ; is this a wild mon caught in battle? 111 jr nz, .copyEnemyMonData ⋮ 144.copyEnemyMonData ⋮ 147 ld a, [wEnemyMonDVs] ; copy IVs from cur enemy mon ⋮ 151 ld a, [wEnemyMonHP] ; copy HP from cur enemy mon ⋮ 154 ld a, [wEnemyMonHP+1] ⋮ 160 ld a, [wEnemyMonStatus] ; copy status ailments from cur enemy mon
engine/pokemon/add_mon.asm lines 109–162 at af51989 · upstream ↗ 29_ItemUseBallText05:: 30 text "All right!" 31 line "@" 32 text_ram wEnemyMonNick 33 text " was" 34 cont "caught!@" 35 text_end ⋮ 37_ItemUseBallText07:: 38 text_ram wBoxMonNicks 39 text " was" 40 line "transferred to" 41 cont "BILL's PC!" ⋮
data/text/text_6.asm lines 29–57 at af51989 · upstream ↗ 16 charmap "#", $54 ; "POKé"constants/charmap.asm line 16 at af51989 · upstream ↗ 521; Add the caught Pokémon to the Pokédex. 522 predef IndexToPokedex 523 ld a, [wPokedexNum] 524 dec a 525 ld c, a 526 ld b, FLAG_TEST 527 ld hl, wPokedexOwned 528 predef FlagActionPredef 529 ld a, c 530 push af 531 ld a, [wPokedexNum] 532 dec a ⋮
engine/items/item_effects.asm lines 521–539 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27.
- ^A wild Pokémon enters battle at full HP with no status. Its max HP is , capped at 999, where is its species' base HP, its level, and its HP DV, with no stat-experience bonus. A DV is a hidden value from 0 to 15 that each Pokémon has for each stat. A wild Pokémon's attack, defense, speed, and special DVs are the four 4-bit halves of two random bytes drawn when the battle loads it, and its HP DV takes the lowest bit of each: 8 from attack, 4 from defense, 2 from speed, and 1 from special. A level 5 Bulbasaur (base HP 45) so has 19 to 21 max HP (computed). A trainer's Pokémon gets fixed DVs and keeps its party HP and status instead, and a transformed one keeps the DVs it had before transforming.Codepret/pokeredrevised
How we know
6000 ld a, [wEnemyBattleStatus3] 6001 bit TRANSFORMED, a ; is enemy mon transformed? 6002 ld hl, wTransformedEnemyMonOriginalDVs ; original DVs before transforming 6003 ld a, [hli] 6004 ld b, [hl] 6005 jr nz, .storeDVs 6006 ld a, [wIsInBattle] 6007 cp TRAINER_BATTLE 6008; fixed DVs for trainer mon 6009 ld a, ATKDEFDV_TRAINER 6010 ld b, SPDSPCDV_TRAINER 6011 jr z, .storeDVs ⋮
engine/battle/core.asm lines 6000–6027 at af51989 · upstream ↗ 6029 ld a, [wIsInBattle] 6030 cp TRAINER_BATTLE 6031 jr z, .copyHPAndStatusFromPartyData 6032 ld a, [wEnemyBattleStatus3] 6033 bit TRANSFORMED, a ; is enemy mon transformed? 6034 jr nz, .copyTypes ; if transformed, jump 6035; if it's a wild mon and not transformed, init the current HP to max HP and the status to 0 6036 ld a, [wEnemyMonMaxHP] 6037 ld [hli], a 6038 ld a, [wEnemyMonMaxHP+1] 6039 ld [hli], a 6040 xor a ⋮
engine/battle/core.asm lines 6029–6043 at af51989 · upstream ↗ 6543BattleRandom: 6544; Link battles use a shared PRNG. ⋮ 6546 ld a, [wLinkState] 6547 cp LINK_STATE_BATTLING 6548 jp nz, Random
engine/battle/core.asm lines 6543–6548 at af51989 · upstream ↗ 50; calculates stat c of current mon 51; c: stat to calc (HP=1,Atk=2,Def=3,Spd=4,Spc=5) 52; b: consider stat exp? 53; hl: base ptr to stat exp values ([hl + 2*c - 1] and [hl + 2*c]) 54CalcStat:: 55 push hl 56 push de 57 push bc 58 ld a, b 59 ld d, a 60 push hl 61 ld hl, wMonHeader ⋮
home/move_mon.asm lines 49–71 at af51989 · upstream ↗ 109; get HP IV 110 push bc 111 ld a, [hl] ; Atk IV 112 swap a 113 and $1 114 sla a 115 sla a 116 sla a 117 ld b, a 118 ld a, [hli] ; Def IV 119 and $1 120 sla a ⋮
home/move_mon.asm lines 109–153 at af51989 · upstream ↗ 154.calcStatFromIV 155 ld d, $0 156 add e 157 ld e, a 158 jr nc, .noCarry 159 inc d ; de = Base + IV 160.noCarry 161 sla e 162 rl d ; de = (Base + IV) * 2 163 srl b 164 srl b ; b = ceil(Sqrt(stat exp)) / 4 165 ld a, b ⋮
home/move_mon.asm lines 154–227 at af51989 · upstream ↗ 75DEF MAX_STAT_VALUE EQU 999constants/battle_constants.asm line 75 at af51989 · upstream ↗ 3 db 45, 49, 49, 45, 65 4 ; hp atk def spd spc
data/pokemon/base_stats/bulbasaur.asm lines 3–4 at af51989 · upstream ↗ 6044; if it's a trainer mon, copy the HP and status from the enemy party data 6045.copyHPAndStatusFromPartyData 6046 ld hl, wEnemyMon1HP 6047 ld a, [wWhichPokemon] 6048 ld bc, wEnemyMon2 - wEnemyMon1 6049 call AddNTimes 6050 ld a, [hli] 6051 ld [wEnemyMonHP], a 6052 ld a, [hli] 6053 ld [wEnemyMonHP + 1], a 6054 ld a, [wWhichPokemon] 6055 ld [wEnemyMonPartyPos], a ⋮
engine/battle/core.asm lines 6044–6059 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27.
- ^ abcA Safari Game costs ¥500 and gives 30 Safari Balls and a step counter that starts at 502, shown out of 500. Each step takes one off, and a step that finds the counter at 0 ends the game ("PA: Ding-dong! Time's up!"); running out of Safari Balls ends it as soon as the player is back on the map. Either way the PA says "Your SAFARI GAME is over!" and the player is sent back to the gate.Codepret/pokeredrevised
How we know
158 xor a 159 ldh [hMoney], a 160 ld a, $05 161 ldh [hMoney + 1], a 162 ld a, $00 163 ldh [hMoney + 2], a 164 call HasEnoughMoney 165 jr nc, .success 166 ld hl, .NotEnoughMoneyText 167 call PrintText 168 jr .CantPayWalkDown ⋮ 170.success ⋮
scripts/SafariZoneGate.asm lines 158–191 at af51989 · upstream ↗ 6_SafariZoneGateSafariZoneWorker1WouldYouLikeToJoinText:: 7 text "For just ¥500,"
text/SafariZoneGate.asm lines 6–7 at af51989 · upstream ↗ 251SafariSteps: 252 db "/500@"
engine/overworld/player_state.asm lines 251–252 at af51989 · upstream ↗ 53 farcall SafariZoneCheck 54 ld a, [wSafariZoneGameOver] 55 and a 56 jp nz, WarpFound2
home/overworld.asm lines 53–56 at af51989 · upstream ↗ 307 CheckEvent EVENT_IN_SAFARI_ZONE 308 jr z, .notSafariZone 309 farcall SafariZoneCheckSteps 310 ld a, [wSafariZoneGameOver] 311 and a 312 jp nz, WarpFound2
home/overworld.asm lines 307–312 at af51989 · upstream ↗ 1SafariZoneCheck:: 2 CheckEventHL EVENT_IN_SAFARI_ZONE ; if we are not in the Safari Zone, ⋮ 4 ld a, [wNumSafariBalls] 5 and a 6 jr z, SafariZoneGameOver ⋮ 9SafariZoneCheckSteps:: ⋮ 14 ld a, [wSafariSteps] 15 ld b, a 16 ld a, [wSafariSteps + 1] 17 ld c, a 18 or b 19 jr z, SafariZoneGameOver ⋮
engine/events/hidden_events/safari_game.asm lines 1–80 at af51989 · upstream ↗ 310_TimesUpText:: 311 text "PA: Ding-dong!" ⋮ 313 para "Time's up!" 314 prompt ⋮ 316_GameOverText:: 317 text "PA: Your SAFARI" 318 line "GAME is over!"
data/text/text_2.asm lines 310–318 at af51989 · upstream ↗ 219PrintSafariZoneSteps:: 220 ld a, [wCurMap] 221 cp SAFARI_ZONE_EAST 222 ret c 223 cp CERULEAN_CAVE_2F 224 ret nc 225 hlcoord 0, 0 226 ld b, 3 227 ld c, 7 228 call TextBoxBorder 229 hlcoord 1, 1 230 ld de, wSafariSteps ⋮
engine/overworld/player_state.asm lines 219–235 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27.
- ^A Safari Ball catches exactly as an Ultra Ball does: its first roll is redrawn until it is at most 150, its HP check uses a ball factor of 12, and a missed throw counts its shakes against 150. Each throw takes one of the Safari Balls the gate hands out instead of a ball from the bag.Codepret/pokeredrevised
How we know
131 ld a, [wBattleType] 132 cp BATTLE_TYPE_SAFARI 133 jr nz, .skipSafariZoneCode ⋮ 135.safariZone 136 ld hl, wNumSafariBalls 137 dec [hl] ; remove a Safari Ball
engine/items/item_effects.asm lines 130–137 at af51989 · upstream ↗ 185.loop 186 call Random 187 ld b, a ⋮ 189; Get the item ID. 190 ld hl, wCurItem 191 ld a, [hl] ⋮ 193; The Master Ball always succeeds. 194 cp MASTER_BALL 195 jp z, .captured ⋮ 197; Anything will do for the basic Poké Ball. 198 cp POKE_BALL 199 jr z, .checkForAilments ⋮
engine/items/item_effects.asm lines 185–214 at af51989 · upstream ↗ 253; Determine BallFactor. It's 8 for Great Balls and 12 for the others. 254 ld a, [wCurItem] 255 cp GREAT_BALL 256 ld a, 12 257 jr nz, .skip1 258 ld a, 8
engine/items/item_effects.asm lines 252–258 at af51989 · upstream ↗ 335; Determine BallFactor2. 336; Poké Ball: BallFactor2 = 255 337; Great Ball: BallFactor2 = 200 338; Ultra/Safari Ball: BallFactor2 = 150 339 ld a, [wCurItem] 340 ld b, 255 341 cp POKE_BALL 342 jr z, .skip4 343 ld b, 200 344 cp GREAT_BALL 345 jr z, .skip4 346 ld b, 150 ⋮
engine/items/item_effects.asm lines 335–349 at af51989 · upstream ↗ 576.done 577 ld a, [wBattleType] 578 and a ; is this the old man battle? 579 ret nz ; if so, don't remove a ball from the bag
engine/items/item_effects.asm lines 576–579 at af51989 · upstream ↗ 48 const BATTLE_TYPE_NORMAL ; 0 49 const BATTLE_TYPE_OLD_MAN ; 1 50 const BATTLE_TYPE_SAFARI ; 2
constants/battle_constants.asm lines 48–50 at af51989 · upstream ↗ 2163.throwSafariBallWasSelected 2164 ld a, SAFARI_BALL 2165 ld [wCurItem], a
engine/battle/core.asm lines 2163–2165 at af51989 · upstream ↗ 186 ld a, 30 187 ld [wNumSafariBalls], a
scripts/SafariZoneGate.asm lines 186–187 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27.
- ^In the Safari Zone the wild Pokémon never attacks. Every battle on the Safari Zone's maps is a Safari battle, whose menu offers BALL×, BAIT, THROW ROCK, and RUN in place of the usual commands. After each of the player's actions that doesn't end the battle, the Pokémon either flees or the menu comes back; no move is ever chosen for either side.Codepret/pokered
How we know
30 ld a, [wCurMap] 31 cp SAFARI_ZONE_EAST 32 jr c, .notSafariBattle 33 cp SAFARI_ZONE_CENTER_REST_HOUSE 34 jr nc, .notSafariBattle 35 ld a, BATTLE_TYPE_SAFARI 36 ld [wBattleType], a
engine/battle/init_battle_variables.asm lines 30–36 at af51989 · upstream ↗ 72SafariZoneBattleMenuText: 73 db "BALL× BAIT" 74 next "THROW ROCK RUN@"
data/text_boxes.asm lines 72–74 at af51989 · upstream ↗ 158.checkAnyPartyAlive 159 call AnyPartyAlive 160 ld a, d 161 and a 162 jp z, HandlePlayerBlackOut ; jump if no mon is alive 163 call LoadScreenTilesFromBuffer1 164 ld a, [wBattleType] 165 and a ; is it a normal battle? 166 jp z, .playerSendOutFirstMon ; if so, send out player mon 167; safari zone battle 168.displaySafariZoneBattleMenu 169 call DisplayBattleMenu ⋮
engine/battle/core.asm lines 158–173 at af51989 · upstream ↗ 203.compareWithRandomValue 204 call Random 205 cp b 206 jr nc, .checkAnyPartyAlive 207 jr EnemyRan ; if b was greater than the random value, the enemy runs
engine/battle/core.asm lines 203–207 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-27.
- ^ abBait makes a Pokémon harder to catch and a rock easier. Bait halves its catch rate, rounded down, and a rock doubles it, up to 255; each throw works on the rate the last one left, so a Chansey's 30 becomes 15 after bait and 60 after a rock. Halving has no floor: six baits take a catch rate of 45 to 0 (computed), and with no status a rate of 0 still passes the catch-rate test, in which the ball's first random number, less the status amount, must not be above the catch rate, when that first number is 0. When the angry count runs out, the rate returns to the species' own value, undoing every bait and rock before it. When the eating count runs out, the rate stays where the bait left it, and bait thrown at an angry Pokémon clears the angry count without resetting the rate, as a rock thrown at an eating one clears the eating count.Codepret/pokeredrevised
How we know
1433ItemUseBait: 1434 ld hl, ThrewBaitText 1435 call PrintText 1436 ld hl, wEnemyMonActualCatchRate 1437 srl [hl] ; halve catch rate 1438 ld a, BAIT_ANIM 1439 ld hl, wSafariBaitFactor 1440 ld de, wSafariEscapeFactor 1441 jr BaitRockCommon ⋮ 1443; for CASCADEBADGE when used from the 1444; ITEM window, which corresponds to 1445; SAFARI_ROCK during Safari Game encounters ⋮
engine/items/item_effects.asm lines 1433–1465 at af51989 · upstream ↗ 1PrintSafariZoneBattleText: 2 ld hl, wSafariBaitFactor 3 ld a, [hl] 4 and a 5 jr z, .no_bait 6 dec [hl] 7 ld hl, SafariZoneEatingText 8 jr .done 9.no_bait 10 dec hl 11 ld a, [hl] 12 and a ⋮
engine/battle/safari_zone.asm lines 1–28 at af51989 · upstream ↗ 298 pop bc ; b = Rand1 - Status ⋮ 300; If Rand1 - Status > CatchRate, the ball fails to capture the Pokémon. 301 ld a, [wEnemyMonActualCatchRate] 302 cp b 303 jr c, .failedToCapture
engine/items/item_effects.asm lines 298–303 at af51989 · upstream ↗ 7 db 30 ; catch ratedata/pokemon/base_stats/chansey.asm line 7 at af51989 · upstream ↗ 84_ThrewBaitText:: 85 text "<PLAYER> threw" 86 line "some BAIT." 87 done ⋮ 89_ThrewRockText:: 90 text "<PLAYER> threw a" 91 line "ROCK."
data/text/text_6.asm lines 84–91 at af51989 · upstream ↗ 479wSafariEscapeFactor:: db 480wSafariBaitFactor:: db
ram/wram.asm lines 479–480 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27.
- ^Bait makes the Pokémon eat and a rock makes it angry, each for 1 to 5 more turns, and each ends the other: bait clears the angry count and a rock the eating count. The turns added are a random byte's low three bits, redrawn until under 5, plus 1, and a count stops at 255. After each of the player's actions that doesn't end the battle, the game prints "Wild CHANSEY is eating!" (with the Pokémon's name) and takes a turn off the eating count; when the Pokémon isn't eating, it prints "Wild CHANSEY is angry!" and takes one off the angry count, and with neither count it prints nothing.Codepret/pokered
How we know
1433ItemUseBait: 1434 ld hl, ThrewBaitText 1435 call PrintText 1436 ld hl, wEnemyMonActualCatchRate 1437 srl [hl] ; halve catch rate 1438 ld a, BAIT_ANIM 1439 ld hl, wSafariBaitFactor 1440 ld de, wSafariEscapeFactor 1441 jr BaitRockCommon ⋮ 1443; for CASCADEBADGE when used from the 1444; ITEM window, which corresponds to 1445; SAFARI_ROCK during Safari Game encounters ⋮
engine/items/item_effects.asm lines 1433–1481 at af51989 · upstream ↗ 1PrintSafariZoneBattleText: 2 ld hl, wSafariBaitFactor 3 ld a, [hl] 4 and a 5 jr z, .no_bait 6 dec [hl] 7 ld hl, SafariZoneEatingText 8 jr .done 9.no_bait 10 dec hl 11 ld a, [hl] 12 and a ⋮
engine/battle/safari_zone.asm lines 1–36 at af51989 · upstream ↗ 174 ld a, [wNumSafariBalls] 175 and a 176 jr nz, .notOutOfSafariBalls 177 call LoadScreenTilesFromBuffer1 178 ld hl, .outOfSafariBallsText 179 jp PrintText 180.notOutOfSafariBalls 181 callfar PrintSafariZoneBattleText
engine/battle/core.asm lines 174–181 at af51989 · upstream ↗ 479wSafariEscapeFactor:: db 480wSafariBaitFactor:: db
ram/wram.asm lines 479–480 at af51989 · upstream ↗ 1329_SafariZoneEatingText:: 1330 text "Wild @" 1331 text_ram wEnemyMonNick 1332 text_start 1333 line "is eating!" 1334 prompt ⋮ 1336_SafariZoneAngryText:: 1337 text "Wild @" 1338 text_ram wEnemyMonNick 1339 text_start 1340 line "is angry!" 1341 prompt
data/text/text_2.asm lines 1329–1341 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-27.
- ^ abA Safari Pokémon flees more often the faster it is, much less often while eating, and more often while angry: at a speed of 50 it flees about 39% of the time (100 in 256), 9.8% while eating, and 78% while angry (computed). After each of the player's actions that doesn't end the battle, it flees ("Wild CHANSEY ran!") when a random byte is below a threshold , so with chance . starts at twice its speed (the speed's low byte, all of any speed under 256), and a low byte of 128 or more makes it flee at once. While it is eating, is divided by 4, rounded down; while it is angry, is doubled, up to 255. The count is taken off before the roll, so bait that adds eating turns lowers the chance on of them (computed).Codepret/pokeredrevised
How we know
181 callfar PrintSafariZoneBattleText 182 ld a, [wEnemyMonSpeed + 1] 183 add a 184 ld b, a ; init b (which is later compared with random value) to (enemy speed % 256) * 2 185 jp c, EnemyRan ; if (enemy speed % 256) > 127, the enemy runs 186 ld a, [wSafariBaitFactor] 187 and a ; is bait factor 0? 188 jr z, .checkEscapeFactor 189; bait factor is not 0 190; divide b by 4 (making the mon less likely to run) 191 srl b 192 srl b ⋮
engine/battle/core.asm lines 181–207 at af51989 · upstream ↗ 254EnemyRan: 255 call LoadScreenTilesFromBuffer1 256 ld a, [wLinkState] 257 cp LINK_STATE_BATTLING 258 ld hl, WildRanText 259 jr nz, .printText 260; link battle 261 xor a 262 ld [wBattleResult], a 263 ld hl, EnemyRanText 264.printText 265 call PrintText ⋮
engine/battle/core.asm lines 254–270 at af51989 · upstream ↗ 832_WildRanText:: 833 text "Wild @" 834 text_ram wEnemyMonNick 835 text_start 836 line "ran!" 837 prompt
data/text/text_2.asm lines 832–837 at af51989 · upstream ↗ 1PrintSafariZoneBattleText: 2 ld hl, wSafariBaitFactor 3 ld a, [hl] 4 and a 5 jr z, .no_bait 6 dec [hl] 7 ld hl, SafariZoneEatingText 8 jr .done 9.no_bait 10 dec hl 11 ld a, [hl] 12 and a ⋮
engine/battle/safari_zone.asm lines 1–14 at af51989 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27.
- ^Yellow's catch formula is Red and Blue's: every range, status value, ball factor, shake divisor, and shake threshold quoted here is the same in both. The cases around it differ. Yellow adds the Pikachu battle in Pallet Town at the start of the game, which shows Professor Oak on the player's side: a ball there takes the old man's branch and catches outright, and, as in the old man's battle, the full-party-and-box refusal is skipped and the Pokémon isn't given to the player. In the old man's battle itself, the throw catches outright unless a story flag for the first catch training is set, in which case it skips the catch and takes the three-shake result, $63, the value a failed throw's shake count of 70 or more gets. After every catch it gives the player, Yellow also sets Pikachu's mood.Codepret/pokeyellow · pret/pokeredrevised
How we know
197.loop 198 call Random ⋮ 206 cp MASTER_BALL ⋮ 210 cp POKE_BALL ⋮ 214 ld a, 200 215 cp b 216 jr c, .loop ⋮ 220 cp GREAT_BALL ⋮ 224 ld a, 150 225 cp b 226 jr c, .loop ⋮ 240 and (1 << FRZ) | SLP_MASK ⋮
engine/items/item_effects.asm lines 197–428 at b6696f2 · upstream ↗ 185.loop 186 call Random ⋮ 194 cp MASTER_BALL ⋮ 198 cp POKE_BALL ⋮ 202 ld a, 200 203 cp b 204 jr c, .loop ⋮ 208 cp GREAT_BALL ⋮ 212 ld a, 150 213 cp b 214 jr c, .loop ⋮ 228 and (1 << FRZ) | SLP_MASK ⋮
engine/items/item_effects.asm lines 185–414 at af51989 · upstream ↗ 157 ld a, [wBattleType] 158 cp BATTLE_TYPE_OLD_MAN 159 jr z, .oldManBattle 160 cp BATTLE_TYPE_PIKACHU 161 jr z, .oldManBattle ; pikachu battle technically old man battle ⋮ 164.oldManBattle ⋮ 169 ld a, [wBattleType] 170 cp BATTLE_TYPE_OLD_MAN 171 jp nz, .captured
engine/items/item_effects.asm lines 157–171 at b6696f2 · upstream ↗ 115; If this is for the old man battle, skip checking if the party & box are full. 116 ld a, [wBattleType] 117 cp BATTLE_TYPE_OLD_MAN 118 jr z, .canUseBall 119 cp BATTLE_TYPE_PIKACHU 120 jr z, .canUseBall
engine/items/item_effects.asm lines 115–120 at b6696f2 · upstream ↗ 157 ld a, [wBattleType] 158 cp BATTLE_TYPE_OLD_MAN 159 jr z, .oldManBattle 160 cp BATTLE_TYPE_PIKACHU 161 jr z, .oldManBattle ; pikachu battle technically old man battle 162 jr .notOldManBattle ⋮ 164.oldManBattle 165 ld hl, wGrassRate 166 ld de, wPlayerName 167 ld bc, NAME_LENGTH 168 call CopyData ; save the player's name in the Wild Monster data (part of the Cinnabar Island Missingno. glitch) 169 ld a, [wBattleType] ⋮
engine/items/item_effects.asm lines 157–177 at b6696f2 · upstream ↗ 528 ld a, [wBattleType] 529 cp BATTLE_TYPE_OLD_MAN ; is this the old man battle? 530 jp z, .oldManCaughtMon ; if so, don't give the player the caught Pokémon 531 cp BATTLE_TYPE_PIKACHU 532 jr z, .oldManCaughtMon ; same with Pikachu battle
engine/items/item_effects.asm lines 528–532 at b6696f2 · upstream ↗ 563.skipShowingPokedexData 564 ld a, $1 565 ld [wPikachuEmotionModifier], a 566 ld a, $85 567 ld [wPikachuMood], a
engine/items/item_effects.asm lines 563–567 at b6696f2 · upstream ↗ 137PalletTownPikachuBattleScript: 138 ; start the pikachu battle 139 ld a, PAD_SELECT | PAD_START | PAD_CTRL_PAD 140 ld [wJoyIgnore], a 141 xor a 142 ld [wListScrollOffset], a 143 ld a, BATTLE_TYPE_PIKACHU 144 ld [wBattleType], a 145 ld a, STARTER_PIKACHU 146 ld [wCurOpponent], a
scripts/PalletTown.asm lines 137–146 at b6696f2 · upstream ↗ 6389 ld de, ProfOakPicBack 6390 cp BATTLE_TYPE_PIKACHU ; is it the pikachu battle at the beginning of the game? 6391 jr z, .next
engine/battle/core.asm lines 6389–6391 at b6696f2 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Checked by a second AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-27.
- ^
PokeBallEffectcatches outright with a Master Ball or in the catching tutorial. Otherwise a ball's routine changes the catch rate: the Ultra Ball doubles it, and the Great, Safari, and Park Balls add half of it, each capped at 255. The Poké Ball has no routine and leaves it as it is.Codepret/pokecrystalHow we know
242 ld a, [wEnemyMonCatchRate] 243 ld b, a 244 ld a, [wBattleType] 245 cp BATTLETYPE_TUTORIAL 246 jp z, .catch_without_fail 247 ld a, [wCurItem] 248 cp MASTER_BALL 249 jp z, .catch_without_fail 250 ld a, [wCurItem] ⋮ 252 ld hl, BallMultiplierFunctionTable
engine/items/item_effects.asm lines 242–270 at 97187cd · upstream ↗ 722BallMultiplierFunctionTable: ⋮ 725 dbw ULTRA_BALL, UltraBallMultiplier 726 dbw GREAT_BALL, GreatBallMultiplier 727 dbw SAFARI_BALL, SafariBallMultiplier ; Safari Ball, leftover from RBY ⋮ 737UltraBallMultiplier: 738; multiply catch rate by 2 739 sla b 740 ret nc 741 ld b, $ff 742 ret ⋮ 744SafariBallMultiplier: 745GreatBallMultiplier: ⋮
engine/items/item_effects.asm lines 722–754 at 97187cd · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^Except with a Level Ball,
PokeBallEffectscales the ball-modified rate by HP: for max HP and current HP . When is 256 or more, both and are first divided by 4 (a quartered of 0 becomes 1) and only each low byte is kept, so the formula breaks for max HP over 341.Codepret/pokecrystalHow we know
273 ld a, [wCurItem] 274 cp LEVEL_BALL 275 ld a, b 276 jp z, .skip_hp_calc ⋮ 278 ld a, b ⋮ 289 sla c 290 rl b ⋮ 292 ld h, d 293 ld l, e 294 add hl, de 295 add hl, de ⋮ 298 ld a, d ⋮
engine/items/item_effects.asm lines 272–338 at 97187cd · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^Crystal adds 10 to for a sleeping or frozen Pokémon, capped at 255, and nothing for burn, poison, or paralysis: the test meant to add 5 for them reads a value the sleep-and-freeze mask has already cleared. Gold and Silver have the same code, and their disassembly notes that those three statuses were meant to rank between sleep and none.Codepret/pokecrystal · pret/pokegold
How we know
339.statuscheck 340; BUG: BRN/PSN/PAR do not affect catch rate (see docs/bugs_and_glitches.md) 341 ld b, a 342 ld a, [wEnemyMonStatus] 343 and 1 << FRZ | SLP_MASK 344 ld c, 10 345 jr nz, .addstatus 346 and a 347 ld c, 5 348 jr nz, .addstatus 349 ld c, 0 350.addstatus ⋮
engine/items/item_effects.asm lines 339–355 at 97187cd · upstream ↗ 337.statuscheck 338; This routine is buggy. It was intended that SLP and FRZ provide a higher 339; catch rate than BRN/PSN/PAR, which in turn provide a higher catch rate than 340; no status effect at all. But instead, it makes BRN/PSN/PAR provide no 341; benefit. ⋮ 344 ld a, [wEnemyMonStatus] 345 and 1 << FRZ | SLP_MASK 346 ld c, 10 347 jr nz, .addstatus 348 ; ld a, [wEnemyMonStatus] 349 and a 350 ld c, 5 ⋮
engine/items/item_effects.asm lines 337–353 at fc702b6 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^The final rate goes into
wFinalCatchRate, and one random byte at most that rate catches, so the chance is and a final rate of 255 always catches. This one roll decides the throw; the wobbles come after.Codepret/pokecrystalHow we know
372.skip_hp_calc 373 ld b, a 374 ld [wFinalCatchRate], a 375 call Random ⋮ 377 cp b 378 ld a, 0 379 jr z, .catch_without_fail 380 jr nc, .fail_to_catch ⋮ 382.catch_without_fail 383 ld a, [wEnemyMonSpecies] ⋮ 385.fail_to_catch 386 ld [wWildMon], a
engine/items/item_effects.asm lines 372–386 at 97187cd · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
- ^The ball's wobbles are drawn after the throw is decided. A caught Pokémon always gets three. On a failed throw, each of up to three wobbles happens with chance , where is read from the first row of
WobbleProbabilitieswhose catch rate is at least the final rate (63 for a rate of 1, up to 255 for 255). The table's comment givesnLeft/255 = (nRight/255) ** 4, so each is a fourth root, .Codepret/pokecrystalrevisedHow we know
1GetPokeBallWobble: 2; Returns whether a Poke Ball will wobble in the catch animation. 3; Whether a Pokemon is caught is determined beforehand. ⋮ 18; Wobble up to 3 times. 19 cp 3 + 1 20 jr z, .finished ⋮ 22 ld a, [wWildMon] 23 and a 24 ld c, 0 ; next 25 jr nz, .done ⋮ 27 ld hl, WobbleProbabilities 28 ld a, [wFinalCatchRate] ⋮
engine/battle_anims/pokeball_wobble.asm lines 1–44 at 97187cd · upstream ↗ 1WobbleProbabilities: 2; catch rate, chance of wobbling / 255 3; nLeft/255 = (nRight/255) ** 4 4 db 1, 63 ⋮ 27 db 255, 255
data/battle/wobble_probabilities.asm lines 1–27 at 97187cd · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
Checked by a second AI model, 2026-10-27.
- ^An over 254 catches at once. Otherwise Emerald turns it into a threshold , with
Sqrtthe GBA BIOS call, and draws up to four 16-bitRandom()values; each one below is a shake. Four shakes catch; a throw that fails shows the shakes it passed, 0 to 3. A Master Ball's shakes are set to four after the draw.Codepret/pokeemeraldHow we know
10009 if (odds > 254) // mon caught ⋮ 10011 BtlController_EmitBallThrowAnim(B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); ⋮ 10018 else ⋮ 10021 else // mon may be caught, calculate shakes ⋮ 10023 u8 shakes; ⋮ 10025 odds = Sqrt(Sqrt(16711680 / odds)); 10026 odds = 1048560 / odds; ⋮ 10028 for (shakes = 0; shakes < BALL_3_SHAKES_SUCCESS && Random() < odds; shakes++); ⋮ 10030 if (gLastUsedItem == ITEM_MASTER_BALL) 10031 shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check? ⋮ 10036 if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above ⋮ 10043 else ⋮
src/battle_script_commands.c lines 10009–10050 at 731ad5b · upstream ↗ 134enum { 135 BALL_NO_SHAKES, 136 BALL_1_SHAKE, 137 BALL_2_SHAKES, 138 BALL_3_SHAKES_FAIL, 139 BALL_3_SHAKES_SUCCESS, 140 BALL_TRAINER_BLOCK,
include/battle_controllers.h lines 134–141 at 731ad5b · upstream ↗ 11u16 Random(void) ⋮ 15 return gRngValue >> 16;
src/random.c lines 11–16 at 731ad5b · upstream ↗ 72 .ifdef L_Sqrt 73 thumb_func_start Sqrt 74Sqrt: 75 svc #8
libagbsyscall/libagbsyscall.s lines 72–78 at 731ad5b · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
Sources
Code
- pret contributors. 2026. “pokered: disassembly of Pokémon Red and Blue.” pret. Commit af51989. pret/pokered @ af51989 · licence, all uses
- pret contributors. 2026. “pokeyellow: disassembly of Pokémon Yellow.” pret. Commit b6696f2. pret/pokeyellow @ b6696f2 · licence, all uses
- pret contributors. 2026. “pokecrystal: disassembly of Pokémon Crystal.” pret. Commit 97187cd. pret/pokecrystal @ 97187cd · licence, all uses
- pret contributors. 2026. “pokegold: disassembly of Pokémon Gold and Silver.” pret. Commit fc702b6. pret/pokegold @ fc702b6 · licence, all uses
- pret contributors. 2026. “pokeemerald: decompilation of Pokémon Emerald.” pret. Commit 731ad5b. pret/pokeemerald @ 731ad5b · licence, all uses