On this page
  1. One throw, step by step
  2. The chance, as HP falls
  3. Which ball
  4. Every species
  5. The Safari Zone
  6. Compare
  7. Related
  8. References
  9. Sources

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 M, current HP H, and a ball factor F of 83 for a Great Ball and 123 for any other ball, the target is

T=⌊⌊255M/F⌋max⁡(⌊H/4⌋,1)⌋

A target above 2553 catches without a second byte; otherwise a second byte at most T 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.

ShakesMessage
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

Interactive: formula-lab (needs JavaScript)

Capture 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

Interactive: formula-lab (needs JavaScript)

The best 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

Interactive: view (needs JavaScript)

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 n eating turns protects only n−1 flee rolls, because each turn’s count comes off before its roll19.

#Compare

Interactive: formula-lab (needs JavaScript)

Three generations

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

  1. ^ 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.

    In the claim ledger

  2. ^ 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.

    In the claim ledger

  3. ^ 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 T=⌊⌊255M/F⌋/max⁡(⌊H/4⌋,1)⌋ from the Pokémon's max HP M and current HP H, with F 8 for a Great Ball and 12 for every other ball, each division rounding down. A T over 255 catches; otherwise a second random byte catches when it is at most T. 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.

    In the claim ledger

  4. ^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.

    In the claim ledger

  5. ^ 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 MAROWAK
    
    constants/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.

    In the claim ledger

  6. ^ 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.

    In the claim ledger

  7. ^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.

    In the claim ledger

  8. ^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.

    In the claim ledger

  9. ^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 rate
    
    data/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.

    In the claim ledger

  10. ^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.

    In the claim ledger

  11. ^ 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 Y=⌊100C/B⌋ from the catch rate C, with B 255 for a Poké Ball, 200 for a Great Ball, and 150 for any other, then Z=⌊min⁡(T,255)⋅Y/255⌋ from the HP test's result T, plus 10 for sleep or freeze or 5 for another status. A Z 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 Y over 255, which would show three, never runs: Y 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.

    In the claim ledger

  12. ^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.

    In the claim ledger

  13. ^A wild Pokémon enters battle at full HP with no status. Its max HP is ⌊2(B+D)L/100⌋+L+10, capped at 999, where B is its species' base HP, L its level, and D 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 999
    
    constants/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.

    In the claim ledger

  14. ^ 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.

    In the claim ledger

  15. ^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 claim ledger

  16. ^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.

    In the claim ledger

  17. ^ 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 rate
    
    data/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.

    In the claim ledger

  18. ^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.

    In the claim ledger

  19. ^ 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 b, so with chance b/256. b 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, b is divided by 4, rounded down; while it is angry, b is doubled, up to 255. The count is taken off before the roll, so bait that adds n eating turns lowers the chance on n−1 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.

    In the claim ledger

  20. ^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.

    In the claim ledger

  21. ^PokeBallEffect catches 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/pokecrystal
    How 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.

    In the claim ledger

  22. ^Except with a Level Ball, PokeBallEffect scales the ball-modified rate C′ by HP: X=max⁡(⌊C′(3M−2H)/3M⌋,1) for max HP M and current HP H. When 3M is 256 or more, both 3M and 2H are first divided by 4 (a quartered 2H of 0 becomes 1) and only each low byte is kept, so the formula breaks for max HP over 341.Codepret/pokecrystal
    How 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.

    In the claim ledger

  23. ^Crystal adds 10 to X 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.

    In the claim ledger

  24. ^The final rate goes into wFinalCatchRate, and one random byte at most that rate catches, so the chance is (X+1)/256 and a final rate of 255 always catches. This one roll decides the throw; the wobbles come after.Codepret/pokecrystal
    How 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.

    In the claim ledger

  25. ^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 p/256, where p is read from the first row of WobbleProbabilities whose catch rate is at least the final rate (63 for a rate of 1, up to 255 for 255). The table's comment gives nLeft/255 = (nRight/255) ** 4, so each p is a fourth root, p/255=(𝑟𝑎𝑡𝑒/255)1/4.Codepret/pokecrystalrevised
    How 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.

    In the claim ledger

  26. ^An a over 254 catches at once. Otherwise Emerald turns it into a threshold b=⌊1048560/Sqrt(Sqrt(⌊16711680/a⌋))⌋, with Sqrt the GBA BIOS call, and draws up to four 16-bit Random() values; each one below b 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/pokeemerald
    How 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.

    In the claim ledger

Sources

Code