ref: fbe82a7fe0f310ade7436d4d8f352ee04e05a1ec
dir: /engine/items/item_effects.asm/
_DoItemEffect:: ; e722
ld a, [wCurItem]
ld [wd265], a
call GetItemName
call CopyName1
ld a, 1
ld [wItemEffectSucceeded], a
ld a, [wCurItem]
dec a
ld hl, ItemEffects
rst JumpTable
ret
; e73c
ItemEffects: ; e73c
; entries correspond to item ids
dw PokeBallEffect ; MASTER_BALL
dw PokeBallEffect ; ULTRA_BALL
dw NoEffect ; BRIGHTPOWDER
dw PokeBallEffect ; GREAT_BALL
dw PokeBallEffect ; POKE_BALL
dw TownMapEffect ; TOWN_MAP
dw BicycleEffect ; BICYCLE
dw EvoStoneEffect ; MOON_STONE
dw StatusHealingEffect ; ANTIDOTE
dw StatusHealingEffect ; BURN_HEAL
dw StatusHealingEffect ; ICE_HEAL
dw StatusHealingEffect ; AWAKENING
dw StatusHealingEffect ; PARLYZ_HEAL
dw FullRestoreEffect ; FULL_RESTORE
dw RestoreHPEffect ; MAX_POTION
dw RestoreHPEffect ; HYPER_POTION
dw RestoreHPEffect ; SUPER_POTION
dw RestoreHPEffect ; POTION
dw EscapeRopeEffect ; ESCAPE_ROPE
dw RepelEffect ; REPEL
dw RestorePPEffect ; MAX_ELIXER
dw EvoStoneEffect ; FIRE_STONE
dw EvoStoneEffect ; THUNDERSTONE
dw EvoStoneEffect ; WATER_STONE
dw NoEffect ; ITEM_19
dw VitaminEffect ; HP_UP
dw VitaminEffect ; PROTEIN
dw VitaminEffect ; IRON
dw VitaminEffect ; CARBOS
dw NoEffect ; LUCKY_PUNCH
dw VitaminEffect ; CALCIUM
dw RareCandyEffect ; RARE_CANDY
dw XAccuracyEffect ; X_ACCURACY
dw EvoStoneEffect ; LEAF_STONE
dw NoEffect ; METAL_POWDER
dw NoEffect ; NUGGET
dw PokeDollEffect ; POKE_DOLL
dw StatusHealingEffect ; FULL_HEAL
dw ReviveEffect ; REVIVE
dw ReviveEffect ; MAX_REVIVE
dw GuardSpecEffect ; GUARD_SPEC
dw SuperRepelEffect ; SUPER_REPEL
dw MaxRepelEffect ; MAX_REPEL
dw DireHitEffect ; DIRE_HIT
dw NoEffect ; ITEM_2D
dw RestoreHPEffect ; FRESH_WATER
dw RestoreHPEffect ; SODA_POP
dw RestoreHPEffect ; LEMONADE
dw XItemEffect ; X_ATTACK
dw NoEffect ; ITEM_32
dw XItemEffect ; X_DEFEND
dw XItemEffect ; X_SPEED
dw XItemEffect ; X_SPECIAL
dw CoinCaseEffect ; COIN_CASE
dw ItemfinderEffect ; ITEMFINDER
dw PokeFluteEffect ; POKE_FLUTE
dw NoEffect ; EXP_SHARE
dw OldRodEffect ; OLD_ROD
dw GoodRodEffect ; GOOD_ROD
dw NoEffect ; SILVER_LEAF
dw SuperRodEffect ; SUPER_ROD
dw RestorePPEffect ; PP_UP
dw RestorePPEffect ; ETHER
dw RestorePPEffect ; MAX_ETHER
dw RestorePPEffect ; ELIXER
dw NoEffect ; RED_SCALE
dw NoEffect ; SECRETPOTION
dw NoEffect ; S_S_TICKET
dw NoEffect ; MYSTERY_EGG
dw NoEffect ; CLEAR_BELL
dw NoEffect ; SILVER_WING
dw RestoreHPEffect ; MOOMOO_MILK
dw NoEffect ; QUICK_CLAW
dw StatusHealingEffect ; PSNCUREBERRY
dw NoEffect ; GOLD_LEAF
dw NoEffect ; SOFT_SAND
dw NoEffect ; SHARP_BEAK
dw StatusHealingEffect ; PRZCUREBERRY
dw StatusHealingEffect ; BURNT_BERRY
dw StatusHealingEffect ; ICE_BERRY
dw NoEffect ; POISON_BARB
dw NoEffect ; KINGS_ROCK
dw BitterBerryEffect ; BITTER_BERRY
dw StatusHealingEffect ; MINT_BERRY
dw NoEffect ; RED_APRICORN
dw NoEffect ; TINYMUSHROOM
dw NoEffect ; BIG_MUSHROOM
dw NoEffect ; SILVERPOWDER
dw NoEffect ; BLU_APRICORN
dw NoEffect ; ITEM_5A
dw NoEffect ; AMULET_COIN
dw NoEffect ; YLW_APRICORN
dw NoEffect ; GRN_APRICORN
dw NoEffect ; CLEANSE_TAG
dw NoEffect ; MYSTIC_WATER
dw NoEffect ; TWISTEDSPOON
dw NoEffect ; WHT_APRICORN
dw NoEffect ; BLACKBELT
dw NoEffect ; BLK_APRICORN
dw NoEffect ; ITEM_64
dw NoEffect ; PNK_APRICORN
dw NoEffect ; BLACKGLASSES
dw NoEffect ; SLOWPOKETAIL
dw NoEffect ; PINK_BOW
dw NoEffect ; STICK
dw NoEffect ; SMOKE_BALL
dw NoEffect ; NEVERMELTICE
dw NoEffect ; MAGNET
dw StatusHealingEffect ; MIRACLEBERRY
dw NoEffect ; PEARL
dw NoEffect ; BIG_PEARL
dw NoEffect ; EVERSTONE
dw NoEffect ; SPELL_TAG
dw RestoreHPEffect ; RAGECANDYBAR
dw NoEffect ; GS_BALL
dw BlueCardEffect ; BLUE_CARD
dw NoEffect ; MIRACLE_SEED
dw NoEffect ; THICK_CLUB
dw NoEffect ; FOCUS_BAND
dw NoEffect ; ITEM_78
dw EnergypowderEffect ; ENERGYPOWDER
dw EnergyRootEffect ; ENERGY_ROOT
dw HealPowderEffect ; HEAL_POWDER
dw RevivalHerbEffect ; REVIVAL_HERB
dw NoEffect ; HARD_STONE
dw NoEffect ; LUCKY_EGG
dw CardKeyEffect ; CARD_KEY
dw NoEffect ; MACHINE_PART
dw NoEffect ; EGG_TICKET
dw NoEffect ; LOST_ITEM
dw NoEffect ; STARDUST
dw NoEffect ; STAR_PIECE
dw BasementKeyEffect ; BASEMENT_KEY
dw NoEffect ; PASS
dw NoEffect ; ITEM_87
dw NoEffect ; ITEM_88
dw NoEffect ; ITEM_89
dw NoEffect ; CHARCOAL
dw RestoreHPEffect ; BERRY_JUICE
dw NoEffect ; SCOPE_LENS
dw NoEffect ; ITEM_8D
dw NoEffect ; ITEM_8E
dw NoEffect ; METAL_COAT
dw NoEffect ; DRAGON_FANG
dw NoEffect ; ITEM_91
dw NoEffect ; LEFTOVERS
dw NoEffect ; ITEM_93
dw NoEffect ; ITEM_94
dw NoEffect ; ITEM_95
dw RestorePPEffect ; MYSTERYBERRY
dw NoEffect ; DRAGON_SCALE
dw NoEffect ; BERSERK_GENE
dw NoEffect ; ITEM_99
dw NoEffect ; ITEM_9A
dw NoEffect ; ITEM_9B
dw SacredAshEffect ; SACRED_ASH
dw PokeBallEffect ; HEAVY_BALL
dw NoEffect ; FLOWER_MAIL
dw PokeBallEffect ; LEVEL_BALL
dw PokeBallEffect ; LURE_BALL
dw PokeBallEffect ; FAST_BALL
dw NoEffect ; ITEM_A2
dw NoEffect ; LIGHT_BALL
dw PokeBallEffect ; FRIEND_BALL
dw PokeBallEffect ; MOON_BALL
dw PokeBallEffect ; LOVE_BALL
dw NormalBoxEffect ; NORMAL_BOX
dw GorgeousBoxEffect ; GORGEOUS_BOX
dw EvoStoneEffect ; SUN_STONE
dw NoEffect ; POLKADOT_BOW
dw NoEffect ; ITEM_AB
dw NoEffect ; UP_GRADE
dw RestoreHPEffect ; BERRY
dw RestoreHPEffect ; GOLD_BERRY
dw SquirtbottleEffect ; SQUIRTBOTTLE
dw NoEffect ; ITEM_B0
dw PokeBallEffect ; PARK_BALL
dw NoEffect ; RAINBOW_WING
dw NoEffect ; ITEM_B3
; e8a2
PokeBallEffect: ; e8a2
ld a, [wBattleMode]
dec a
jp nz, UseBallInTrainerBattle
ld a, [wPartyCount]
cp PARTY_LENGTH
jr nz, .room_in_party
ld a, BANK(sBoxCount)
call GetSRAMBank
ld a, [sBoxCount]
cp MONS_PER_BOX
call CloseSRAM
jp z, Ball_BoxIsFullMessage
.room_in_party
xor a
ld [wWildMon], a
ld a, [wCurItem]
cp PARK_BALL
call nz, ReturnToBattle_UseBall
ld hl, wOptions
res NO_TEXT_SCROLL, [hl]
ld hl, UsedItemText
call PrintText
ld a, [wEnemyMonCatchRate]
ld b, a
ld a, [wBattleType]
cp BATTLETYPE_TUTORIAL
jp z, .catch_without_fail
ld a, [wCurItem]
cp MASTER_BALL
jp z, .catch_without_fail
ld a, [wCurItem]
ld c, a
ld hl, BallMultiplierFunctionTable
.get_multiplier_loop
ld a, [hli]
cp $ff
jr z, .skip_or_return_from_ball_fn
cp c
jr z, .call_ball_function
inc hl
inc hl
jr .get_multiplier_loop
.call_ball_function
ld a, [hli]
ld h, [hl]
ld l, a
ld de, .skip_or_return_from_ball_fn
push de
jp hl
.skip_or_return_from_ball_fn
ld a, [wCurItem]
cp LEVEL_BALL
ld a, b
jp z, .skip_hp_calc
ld a, b
ld [hMultiplicand + 2], a
ld hl, wEnemyMonHP
ld b, [hl]
inc hl
ld c, [hl]
inc hl
ld d, [hl]
inc hl
ld e, [hl]
sla c
rl b
ld h, d
ld l, e
add hl, de
add hl, de
ld d, h
ld e, l
ld a, d
and a
jr z, .okay_1
srl d
rr e
srl d
rr e
srl b
rr c
srl b
rr c
ld a, c
and a
jr nz, .okay_1
ld c, $1
.okay_1
ld b, e
push bc
ld a, b
sub c
ld [hMultiplier], a
xor a
ld [hDividend + 0], a
ld [hMultiplicand + 0], a
ld [hMultiplicand + 1], a
call Multiply
pop bc
ld a, b
ld [hDivisor], a
ld b, $4
call Divide
ld a, [hQuotient + 2]
and a
jr nz, .statuscheck
ld a, 1
.statuscheck
; This routine is buggy. It was intended that SLP and FRZ provide a higher
; catch rate than BRN/PSN/PAR, which in turn provide a higher catch rate than
; no status effect at all. But instead, it makes BRN/PSN/PAR provide no
; benefit.
; Uncomment the line below to fix this.
ld b, a
ld a, [wEnemyMonStatus]
and 1 << FRZ | SLP
ld c, 10
jr nz, .addstatus
; ld a, [wEnemyMonStatus]
and a
ld c, 5
jr nz, .addstatus
ld c, 0
.addstatus
ld a, b
add c
jr nc, .max_1
ld a, $ff
.max_1
; BUG: farcall overwrites a, and GetItemHeldEffect takes b anyway.
; This is probably the reason the HELD_CATCH_CHANCE effect is never used.
; Uncomment the line below to fix.
ld d, a
push de
ld a, [wBattleMonItem]
; ld b, a
farcall GetItemHeldEffect
ld a, b
cp HELD_CATCH_CHANCE
pop de
ld a, d
jr nz, .max_2
add c
jr nc, .max_2
ld a, $ff
.max_2
.skip_hp_calc
ld b, a
ld [wBuffer1], a
call Random
cp b
ld a, 0
jr z, .catch_without_fail
jr nc, .fail_to_catch
.catch_without_fail
ld a, [wEnemyMonSpecies]
.fail_to_catch
ld [wWildMon], a
ld c, 20
call DelayFrames
ld a, [wCurItem]
cp POKE_BALL + 1 ; Assumes Master/Ultra/Great come before
jr c, .not_kurt_ball
ld a, POKE_BALL
.not_kurt_ball
ld [wBattleAnimParam], a
ld de, ANIM_THROW_POKE_BALL
ld a, e
ld [wFXAnimID], a
ld a, d
ld [wFXAnimID + 1], a
xor a
ld [hBattleTurn], a
ld [wBuffer2], a
ld [wNumHits], a
predef PlayBattleAnim
ld a, [wWildMon]
and a
jr nz, .caught
ld a, [wBuffer2]
cp $1
ld hl, Text_NoShake
jp z, .shake_and_break_free
cp $2
ld hl, Text_OneShake
jp z, .shake_and_break_free
cp $3
ld hl, Text_TwoShakes
jp z, .shake_and_break_free
cp $4
ld hl, Text_ThreeShakes
jp z, .shake_and_break_free
.caught
ld hl, wEnemyMonStatus
ld a, [hli]
push af
inc hl
ld a, [hli]
push af
ld a, [hl]
push af
push hl
ld hl, wEnemyMonItem
ld a, [hl]
push af
push hl
ld hl, wEnemySubStatus5
ld a, [hl]
push af
set SUBSTATUS_TRANSFORMED, [hl]
; This code is buggy. Any wild Pokémon that has Transformed will be
; caught as a Ditto, even if it was something else like Mew.
; To fix, do not set [wTempEnemyMonSpecies] to DITTO.
bit SUBSTATUS_TRANSFORMED, a
jr nz, .ditto
jr .not_ditto
.ditto
ld a, DITTO
ld [wTempEnemyMonSpecies], a
jr .load_data
.not_ditto
set SUBSTATUS_TRANSFORMED, [hl]
ld hl, wEnemyBackupDVs
ld a, [wEnemyMonDVs]
ld [hli], a
ld a, [wEnemyMonDVs + 1]
ld [hl], a
.load_data
ld a, [wTempEnemyMonSpecies]
ld [wCurPartySpecies], a
ld a, [wEnemyMonLevel]
ld [wCurPartyLevel], a
farcall LoadEnemyMon
pop af
ld [wEnemySubStatus5], a
pop hl
pop af
ld [hl], a
pop hl
pop af
ld [hld], a
pop af
ld [hld], a
dec hl
pop af
ld [hl], a
ld hl, wEnemySubStatus5
bit SUBSTATUS_TRANSFORMED, [hl]
jr nz, .Transformed
ld hl, wWildMonMoves
ld de, wEnemyMonMoves
ld bc, NUM_MOVES
call CopyBytes
ld hl, wWildMonPP
ld de, wEnemyMonPP
ld bc, NUM_MOVES
call CopyBytes
.Transformed:
ld a, [wEnemyMonSpecies]
ld [wWildMon], a
ld [wCurPartySpecies], a
ld [wd265], a
ld a, [wBattleType]
cp BATTLETYPE_TUTORIAL
jp z, .FinishTutorial
farcall StubbedTrainerRankings_WildMonsCaught
ld hl, Text_GotchaMonWasCaught
call PrintText
call ClearSprites
ld a, [wd265]
dec a
call CheckCaughtMon
ld a, c
push af
ld a, [wd265]
dec a
call SetSeenAndCaughtMon
pop af
and a
jr nz, .skip_pokedex
call CheckReceivedDex
jr z, .skip_pokedex
ld hl, Text_AddedToPokedex
call PrintText
call ClearSprites
ld a, [wEnemyMonSpecies]
ld [wd265], a
predef NewPokedexEntry
.skip_pokedex
ld a, [wBattleType]
cp BATTLETYPE_CONTEST
jp z, .catch_bug_contest_mon
cp BATTLETYPE_CELEBI
jr nz, .not_celebi
ld hl, wBattleResult
set BATTLERESULT_CAUGHT_CELEBI, [hl]
.not_celebi
ld a, [wPartyCount]
cp PARTY_LENGTH
jr z, .SendToPC
xor a ; PARTYMON
ld [wMonType], a
call ClearSprites
predef TryAddMonToParty
farcall SetCaughtData
ld a, [wCurItem]
cp FRIEND_BALL
jr nz, .SkipPartyMonFriendBall
ld a, [wPartyCount]
dec a
ld hl, wPartyMon1Happiness
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
ld a, FRIEND_BALL_HAPPINESS
ld [hl], a
.SkipPartyMonFriendBall:
ld hl, Text_AskNicknameNewlyCaughtMon
call PrintText
ld a, [wCurPartySpecies]
ld [wd265], a
call GetPokemonName
call YesNoBox
jp c, .return_from_capture
ld a, [wPartyCount]
dec a
ld [wCurPartyMon], a
ld hl, wPartyMonNicknames
ld bc, MON_NAME_LENGTH
call AddNTimes
ld d, h
ld e, l
push de
xor a ; PARTYMON
ld [wMonType], a
ld b, 0
farcall NamingScreen
call RotateThreePalettesRight
call LoadStandardFont
pop hl
ld de, wStringBuffer1
call InitName
jp .return_from_capture
.SendToPC:
call ClearSprites
predef SendMonIntoBox
farcall SetBoxMonCaughtData
ld a, BANK(sBoxCount)
call GetSRAMBank
ld a, [sBoxCount]
cp MONS_PER_BOX
jr nz, .BoxNotFullYet
ld hl, wBattleResult
set BATTLERESULT_BOX_FULL, [hl]
.BoxNotFullYet:
ld a, [wCurItem]
cp FRIEND_BALL
jr nz, .SkipBoxMonFriendBall
; The captured mon is now first in the box
ld a, FRIEND_BALL_HAPPINESS
ld [sBoxMon1Happiness], a
.SkipBoxMonFriendBall:
call CloseSRAM
ld hl, Text_AskNicknameNewlyCaughtMon
call PrintText
ld a, [wCurPartySpecies]
ld [wd265], a
call GetPokemonName
call YesNoBox
jr c, .SkipBoxMonNickname
xor a
ld [wCurPartyMon], a
ld a, BOXMON
ld [wMonType], a
ld de, wMonOrItemNameBuffer
ld b, $0
farcall NamingScreen
ld a, BANK(sBoxMonNicknames)
call GetSRAMBank
ld hl, wMonOrItemNameBuffer
ld de, sBoxMonNicknames
ld bc, MON_NAME_LENGTH
call CopyBytes
ld hl, sBoxMonNicknames
ld de, wStringBuffer1
call InitName
call CloseSRAM
.SkipBoxMonNickname:
ld a, BANK(sBoxMonNicknames)
call GetSRAMBank
ld hl, sBoxMonNicknames
ld de, wMonOrItemNameBuffer
ld bc, MON_NAME_LENGTH
call CopyBytes
call CloseSRAM
ld hl, Text_SentToBillsPC
call PrintText
call RotateThreePalettesRight
call LoadStandardFont
jr .return_from_capture
.catch_bug_contest_mon
farcall BugContest_SetCaughtContestMon
jr .return_from_capture
.FinishTutorial:
ld hl, Text_GotchaMonWasCaught
.shake_and_break_free
call PrintText
call ClearSprites
.return_from_capture
ld a, [wBattleType]
cp BATTLETYPE_TUTORIAL
ret z
cp BATTLETYPE_DEBUG
ret z
cp BATTLETYPE_CONTEST
jr z, .used_park_ball
ld a, [wWildMon]
and a
jr z, .toss
call ClearBGPalettes
call ClearTileMap
.toss
ld hl, wNumItems
inc a
ld [wItemQuantityChangeBuffer], a
jp TossItem
.used_park_ball
ld hl, wParkBallsRemaining
dec [hl]
ret
; ec0a
BallMultiplierFunctionTable:
; table of routines that increase or decrease the catch rate based on
; which ball is used in a certain situation.
dbw ULTRA_BALL, UltraBallMultiplier
dbw GREAT_BALL, GreatBallMultiplier
dbw SAFARI_BALL, SafariBallMultiplier ; Safari Ball, leftover from RBY
dbw HEAVY_BALL, HeavyBallMultiplier
dbw LEVEL_BALL, LevelBallMultiplier
dbw LURE_BALL, LureBallMultiplier
dbw FAST_BALL, FastBallMultiplier
dbw MOON_BALL, MoonBallMultiplier
dbw LOVE_BALL, LoveBallMultiplier
dbw PARK_BALL, ParkBallMultiplier
db -1 ; end
UltraBallMultiplier:
; multiply catch rate by 2
sla b
ret nc
ld b, $ff
ret
SafariBallMultiplier:
GreatBallMultiplier:
ParkBallMultiplier:
; multiply catch rate by 1.5
ld a, b
srl a
add b
ld b, a
ret nc
ld b, $ff
ret
GetPokedexEntryBank:
push hl
push de
ld a, [wEnemyMonSpecies]
rlca
rlca
maskbits NUM_DEX_ENTRY_BANKS
ld hl, .PokedexEntryBanks
ld d, 0
ld e, a
add hl, de
ld a, [hl]
pop de
pop hl
ret
.PokedexEntryBanks:
db BANK("Pokedex Entries 001-064")
db BANK("Pokedex Entries 065-128")
db BANK("Pokedex Entries 129-192")
db BANK("Pokedex Entries 193-251")
HeavyBallMultiplier:
; subtract 20 from catch rate if weight < 102.4 kg
; else add 0 to catch rate if weight < 204.8 kg
; else add 20 to catch rate if weight < 307.2 kg
; else add 30 to catch rate if weight < 409.6 kg
; else add 40 to catch rate (never happens)
ld a, [wEnemyMonSpecies]
ld hl, PokedexDataPointerTable
dec a
ld e, a
ld d, 0
add hl, de
add hl, de
ld a, BANK(PokedexDataPointerTable)
call GetFarHalfword
.SkipText:
call GetPokedexEntryBank
call GetFarByte
inc hl
cp "@"
jr nz, .SkipText
call GetPokedexEntryBank
push bc
inc hl
inc hl
call GetFarHalfword
srl h
rr l
ld b, h
ld c, l
rept 4
srl b
rr c
endr
call .subbc
srl b
rr c
call .subbc
ld a, h
pop bc
jr .compare
.subbc
; subtract bc from hl
push bc
ld a, b
cpl
ld b, a
ld a, c
cpl
ld c, a
inc bc
add hl, bc
pop bc
ret
.compare
ld c, a
cp HIGH(1024) ; 102.4 kg
jr c, .lightmon
ld hl, .WeightsTable
.lookup
ld a, c
cp [hl]
jr c, .heavymon
inc hl
inc hl
jr .lookup
.heavymon
inc hl
ld a, b
add [hl]
ld b, a
ret nc
ld b, $ff
ret
.lightmon
ld a, b
sub 20
ld b, a
ret nc
ld b, $1
ret
.WeightsTable:
; weight factor, boost
db HIGH(2048), 0
db HIGH(3072), 20
db HIGH(4096), 30
db HIGH(65280), 40
LureBallMultiplier:
; multiply catch rate by 3 if this is a fishing rod battle
ld a, [wBattleType]
cp BATTLETYPE_FISH
ret nz
ld a, b
add a
jr c, .max
add b
jr nc, .done
.max
ld a, $ff
.done
ld b, a
ret
MoonBallMultiplier:
; This function is buggy.
; Intent: multiply catch rate by 4 if mon evolves with moon stone
; Reality: no boost
push bc
ld a, [wTempEnemyMonSpecies]
dec a
ld c, a
ld b, 0
ld hl, EvosAttacksPointers
add hl, bc
add hl, bc
ld a, BANK(EvosAttacksPointers)
call GetFarHalfword
pop bc
push bc
ld a, BANK("Evolutions and Attacks")
call GetFarByte
cp EVOLVE_ITEM
pop bc
ret nz
inc hl
inc hl
inc hl
; Moon Stone's constant from Pokémon Red is used.
; No Pokémon evolve with Burn Heal,
; so Moon Balls always have a catch rate of 1×.
push bc
ld a, BANK("Evolutions and Attacks")
call GetFarByte
cp MOON_STONE_RED ; BURN_HEAL
pop bc
ret nz
sla b
jr c, .max
sla b
jr nc, .done
.max
ld b, $ff
.done
ret
LoveBallMultiplier:
; This function is buggy.
; Intent: multiply catch rate by 8 if mons are of same species, different sex
; Reality: multiply catch rate by 8 if mons are of same species, same sex
; does species match?
ld a, [wTempEnemyMonSpecies]
ld c, a
ld a, [wTempBattleMonSpecies]
cp c
ret nz
; check player mon species
push bc
ld a, [wTempBattleMonSpecies]
ld [wCurPartySpecies], a
xor a ; PARTYMON
ld [wMonType], a
ld a, [wCurBattleMon]
ld [wCurPartyMon], a
farcall GetGender
jr c, .done1 ; no effect on genderless
ld d, 0 ; male
jr nz, .playermale
inc d ; female
.playermale
; check wild mon species
push de
ld a, [wTempEnemyMonSpecies]
ld [wCurPartySpecies], a
ld a, WILDMON
ld [wMonType], a
farcall GetGender
jr c, .done2 ; no effect on genderless
ld d, 0 ; male
jr nz, .wildmale
inc d ; female
.wildmale
ld a, d
pop de
cp d
pop bc
ret nz ; for the intended effect, this should be "ret z"
sla b
jr c, .max
sla b
jr c, .max
sla b
ret nc
.max
ld b, $ff
ret
.done2
pop de
.done1
pop bc
ret
FastBallMultiplier:
; This function is buggy.
; Intent: multiply catch rate by 4 if enemy mon is in one of the three
; FleeMons tables.
; Reality: multiply catch rate by 4 if enemy mon is one of the first three in
; the first FleeMons table.
ld a, [wTempEnemyMonSpecies]
ld c, a
ld hl, FleeMons
ld d, 3
.loop
ld a, BANK(FleeMons)
call GetFarByte
inc hl
cp -1
jr z, .next
cp c
jr nz, .next ; for the intended effect, this should be "jr nz, .loop"
sla b
jr c, .max
sla b
ret nc
.max
ld b, $ff
ret
.next
dec d
jr nz, .loop
ret
LevelBallMultiplier:
; multiply catch rate by 8 if player mon level / 4 > enemy mon level
; multiply catch rate by 4 if player mon level / 2 > enemy mon level
; multiply catch rate by 2 if player mon level > enemy mon level
ld a, [wBattleMonLevel]
ld c, a
ld a, [wEnemyMonLevel]
cp c
ret nc ; if player is lower level, we're done here
sla b
jr c, .max
srl c
cp c
ret nc ; if player/2 is lower level, we're done here
sla b
jr c, .max
srl c
cp c
ret nc ; if player/4 is lower level, we're done here
sla b
ret nc
.max
ld b, $ff
ret
; These two texts were carried over from gen 1.
; They are not used in gen 2, and are dummied out.
Text_RBY_CatchMarowak: ; 0xedab
; It dodged the thrown BALL! This #MON can't be caught!
text_jump UnknownText_0x1c5a5a
db "@"
; 0xedb0
Text_RBY_NoShake: ; 0xedb0
; You missed the #MON!
text_jump UnknownText_0x1c5a90
db "@"
; 0xedb5
Text_NoShake: ; 0xedb5
; Oh no! The #MON broke free!
text_jump UnknownText_0x1c5aa6
db "@"
; 0xedba
Text_OneShake: ; 0xedba
; Aww! It appeared to be caught!
text_jump UnknownText_0x1c5ac3
db "@"
; 0xedbf
Text_TwoShakes: ; 0xedbf
; Aargh! Almost had it!
text_jump UnknownText_0x1c5ae3
db "@"
; 0xedc4
Text_ThreeShakes: ; 0xedc4
; Shoot! It was so close too!
text_jump UnknownText_0x1c5afa
db "@"
; 0xedc9
Text_GotchaMonWasCaught: ; 0xedc9
; Gotcha! @ was caught!@ @
text_jump UnknownText_0x1c5b17
start_asm
call WaitSFX
push bc
ld de, MUSIC_NONE
call PlayMusic
call DelayFrame
ld de, MUSIC_CAPTURE
call PlayMusic
pop bc
ld hl, TextJump_Waitbutton
ret
; ede6
TextJump_Waitbutton: ; 0xede6
; @
text_jump Text_Waitbutton_2
db "@"
; 0xedeb
Text_SentToBillsPC: ; 0xedeb
; was sent to BILL's PC.
text_jump UnknownText_0x1c5b38
db "@"
; 0xedf0
Text_AddedToPokedex: ; 0xedf0
; 's data was newly added to the #DEX.@ @
text_jump UnknownText_0x1c5b53
db "@"
; 0xedf5
Text_AskNicknameNewlyCaughtMon: ; 0xedf5
; Give a nickname to @ ?
text_jump UnknownText_0x1c5b7f
db "@"
; 0xedfa
ReturnToBattle_UseBall: ; edfa (3:6dfa)
farcall _ReturnToBattle_UseBall
ret
TownMapEffect: ; ee01
farcall PokegearMap
ret
; ee08
BicycleEffect: ; ee08
farcall BikeFunction
ret
; ee0f
EvoStoneEffect: ; ee0f
ld b, PARTYMENUACTION_EVO_STONE
call UseItem_SelectMon
jp c, .DecidedNotToUse
ld a, MON_ITEM
call GetPartyParamLocation
ld a, [hl]
cp EVERSTONE
jr z, .NoEffect
ld a, $1
ld [wForceEvolution], a
farcall EvolvePokemon
ld a, [wMonTriedToEvolve]
and a
jr z, .NoEffect
jp UseDisposableItem
.NoEffect:
call WontHaveAnyEffectMessage
.DecidedNotToUse:
xor a
ld [wItemEffectSucceeded], a
ret
; ee3d
VitaminEffect: ; ee3d
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, RareCandy_StatBooster_ExitMenu
call RareCandy_StatBooster_GetParameters
call GetStatExpRelativePointer
ld a, MON_STAT_EXP
call GetPartyParamLocation
add hl, bc
ld a, [hl]
cp 100
jr nc, NoEffectMessage
add 10
ld [hl], a
call UpdateStatsAfterItem
call GetStatExpRelativePointer
ld hl, StatStrings
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld de, wStringBuffer2
ld bc, ITEM_NAME_LENGTH
call CopyBytes
call Play_SFX_FULL_HEAL
ld hl, Text_StatRose
call PrintText
ld c, HAPPINESS_USEDITEM
farcall ChangeHappiness
jp UseDisposableItem
NoEffectMessage: ; ee83
ld hl, WontHaveAnyEffectText
call PrintText
jp ClearPalettes
; ee8c
UpdateStatsAfterItem: ; ee8c
ld a, MON_MAXHP
call GetPartyParamLocation
ld d, h
ld e, l
ld a, MON_STAT_EXP - 1
call GetPartyParamLocation
ld b, TRUE
predef_jump CalcMonStats
; ee9f
RareCandy_StatBooster_ExitMenu: ; ee9f
xor a
ld [wItemEffectSucceeded], a
jp ClearPalettes
; eea6
Text_StatRose: ; 0xeea6
; 's @ rose.
text_jump UnknownText_0x1c5b9a
db "@"
; 0xeeab
StatStrings: ; eeab
dw .health
dw .attack
dw .defense
dw .speed
dw .special
.health db "HEALTH@"
.attack db "ATTACK@"
.defense db "DEFENSE@"
.speed db "SPEED@"
.special db "SPECIAL@"
; eed9
GetStatExpRelativePointer: ; eed9
ld a, [wCurItem]
ld hl, Table_eeeb
.next
cp [hl]
inc hl
jr z, .got_it
inc hl
jr .next
.got_it
ld a, [hl]
ld c, a
ld b, 0
ret
; eeeb
Table_eeeb: ; eeeb
db HP_UP, MON_HP_EXP - MON_STAT_EXP
db PROTEIN, MON_ATK_EXP - MON_STAT_EXP
db IRON, MON_DEF_EXP - MON_STAT_EXP
db CARBOS, MON_SPD_EXP - MON_STAT_EXP
db CALCIUM, MON_SPC_EXP - MON_STAT_EXP
; eef5
RareCandy_StatBooster_GetParameters: ; eef5
ld a, [wCurPartySpecies]
ld [wCurSpecies], a
ld [wd265], a
ld a, MON_LEVEL
call GetPartyParamLocation
ld a, [hl]
ld [wCurPartyLevel], a
call GetBaseData
ld a, [wCurPartyMon]
ld hl, wPartyMonNicknames
call GetNick
ret
; 0xef14
RareCandyEffect: ; ef14
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, RareCandy_StatBooster_ExitMenu
call RareCandy_StatBooster_GetParameters
ld a, MON_LEVEL
call GetPartyParamLocation
ld a, [hl]
cp MAX_LEVEL
jp nc, NoEffectMessage
inc a
ld [hl], a
ld [wCurPartyLevel], a
push de
ld d, a
farcall CalcExpAtLevel
pop de
ld a, MON_EXP
call GetPartyParamLocation
ld a, [hMultiplicand]
ld [hli], a
ld a, [hMultiplicand + 1]
ld [hli], a
ld a, [hMultiplicand + 2]
ld [hl], a
ld a, MON_MAXHP
call GetPartyParamLocation
ld a, [hli]
ld b, a
ld c, [hl]
push bc
call UpdateStatsAfterItem
ld a, MON_MAXHP + 1
call GetPartyParamLocation
pop bc
ld a, [hld]
sub c
ld c, a
ld a, [hl]
sbc b
ld b, a
dec hl
ld a, [hl]
add c
ld [hld], a
ld a, [hl]
adc b
ld [hl], a
farcall LevelUpHappinessMod
ld a, PARTYMENUTEXT_LEVEL_UP
call ItemActionText
xor a ; PARTYMON
ld [wMonType], a
predef CopyMonToTempMon
hlcoord 9, 0
ld b, 10
ld c, 9
call TextBox
hlcoord 11, 1
ld bc, 4
predef PrintTempMonStats
call WaitPressAorB_BlinkCursor
xor a ; PARTYMON
ld [wMonType], a
ld a, [wCurPartySpecies]
ld [wd265], a
predef LearnLevelMoves
xor a
ld [wForceEvolution], a
farcall EvolvePokemon
jp UseDisposableItem
; efad
HealPowderEffect: ; efad
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
call UseStatusHealer
cp $0
jr nz, .asm_efc9
ld c, HAPPINESS_BITTERPOWDER
farcall ChangeHappiness
call LooksBitterMessage
ld a, $0
.asm_efc9
jp StatusHealer_Jumptable
; efcc
StatusHealingEffect: ; efcc
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
FullyHealStatus: ; efd4
call UseStatusHealer
jp StatusHealer_Jumptable
; efda
UseStatusHealer: ; efda (3:6fda)
call IsMonFainted
ld a, $1
ret z
call GetItemHealingAction
ld a, MON_STATUS
call GetPartyParamLocation
ld a, [hl]
and c
jr nz, .good
call IsItemUsedOnConfusedMon
ld a, $1
ret nc
ld b, PARTYMENUTEXT_HEAL_CONFUSION
.good
xor a
ld [hl], a
ld a, b
ld [wPartyMenuActionText], a
call HealStatus
call Play_SFX_FULL_HEAL
call ItemActionTextWaitButton
call UseDisposableItem
ld a, $0
ret
IsItemUsedOnConfusedMon: ; f009 (3:7009)
call IsItemUsedOnBattleMon
jr nc, .nope
ld a, [wPlayerSubStatus3]
bit SUBSTATUS_CONFUSED, a
jr z, .nope
ld a, c
cp $ff
jr nz, .nope
scf
ret
.nope
and a
ret
BattlemonRestoreHealth: ; f01e (3:701e)
call IsItemUsedOnBattleMon
ret nc
ld a, MON_HP
call GetPartyParamLocation
ld a, [hli]
ld [wBattleMonHP], a
ld a, [hld]
ld [wBattleMonHP + 1], a
ret
HealStatus: ; f030 (3:7030)
call IsItemUsedOnBattleMon
ret nc
xor a
ld [wBattleMonStatus], a
ld hl, wPlayerSubStatus5
res SUBSTATUS_TOXIC, [hl]
ld hl, wPlayerSubStatus1
res SUBSTATUS_NIGHTMARE, [hl]
call GetItemHealingAction
ld a, c
cp %11111111
jr nz, .not_full_heal
ld hl, wPlayerSubStatus3
res SUBSTATUS_CONFUSED, [hl]
.not_full_heal
push bc
farcall CalcPlayerStats
pop bc
ret
GetItemHealingAction: ; f058 (3:7058)
push hl
ld a, [wCurItem]
ld hl, StatusHealingActions
ld bc, 3
.next
cp [hl]
jr z, .found_it
add hl, bc
jr .next
.found_it
inc hl
ld b, [hl]
inc hl
ld a, [hl]
ld c, a
cp %11111111
pop hl
ret
; f071 (3:7071)
INCLUDE "data/items/heal_status.asm"
StatusHealer_Jumptable: ; f09e (3:709e)
ld hl, .dw
rst JumpTable
ret
.dw ; f0a3 (3:70a3)
dw StatusHealer_ClearPalettes
dw StatusHealer_NoEffect
dw StatusHealer_ExitMenu
RevivalHerbEffect: ; f0a9
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
call RevivePokemon
cp 0
jr nz, .asm_f0c5
ld c, HAPPINESS_REVIVALHERB
farcall ChangeHappiness
call LooksBitterMessage
ld a, 0
.asm_f0c5
jp StatusHealer_Jumptable
; f0c8
ReviveEffect: ; f0c8
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
call RevivePokemon
jp StatusHealer_Jumptable
; f0d6
RevivePokemon: ; f0d6
call IsMonFainted
ld a, 1
ret nz
ld a, [wBattleMode]
and a
jr z, .skip_to_revive
ld a, [wCurPartyMon]
ld c, a
ld d, 0
ld hl, wBattleParticipantsIncludingFainted
ld b, CHECK_FLAG
predef SmallFarFlagAction
ld a, c
and a
jr z, .skip_to_revive
ld a, [wCurPartyMon]
ld c, a
ld hl, wBattleParticipantsNotFainted
ld b, SET_FLAG
predef SmallFarFlagAction
.skip_to_revive
xor a
ld [wLowHealthAlarm], a
ld a, [wCurItem]
cp REVIVE
jr z, .revive_half_hp
call ReviveFullHP
jr .finish_revive
.revive_half_hp
call ReviveHalfHP
.finish_revive
call HealHP_SFX_GFX
ld a, PARTYMENUTEXT_REVIVE
ld [wPartyMenuActionText], a
call ItemActionTextWaitButton
call UseDisposableItem
ld a, 0
ret
; f128
FullRestoreEffect: ; f128
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
call IsMonFainted
jp z, StatusHealer_NoEffect
call IsMonAtFullHealth
jr c, .NotAtFullHealth
jp FullyHealStatus
.NotAtFullHealth:
call .FullRestore
jp StatusHealer_Jumptable
; f144
.FullRestore: ; f144
xor a
ld [wLowHealthAlarm], a
call ReviveFullHP
ld a, MON_STATUS
call GetPartyParamLocation
xor a
ld [hli], a
ld [hl], a
call HealStatus
call BattlemonRestoreHealth
call HealHP_SFX_GFX
ld a, PARTYMENUTEXT_HEAL_HP
ld [wPartyMenuActionText], a
call ItemActionTextWaitButton
call UseDisposableItem
ld a, 0
ret
; f16a
BitterBerryEffect: ; f16a
ld hl, wPlayerSubStatus3
bit SUBSTATUS_CONFUSED, [hl]
ld a, 1
jr z, .done
res SUBSTATUS_CONFUSED, [hl]
xor a
ld [hBattleTurn], a
call UseItemText
ld hl, ConfusedNoMoreText
call StdBattleTextBox
ld a, 0
.done
jp StatusHealer_Jumptable
; f186
RestoreHPEffect: ; f186
call ItemRestoreHP
jp StatusHealer_Jumptable
; f18c
EnergypowderEffect: ; f18c
ld c, HAPPINESS_BITTERPOWDER
jr EnergypowderEnergyRootCommon
; f190
EnergyRootEffect: ; f190
ld c, HAPPINESS_ENERGYROOT
; f192
EnergypowderEnergyRootCommon: ; f192
push bc
call ItemRestoreHP
pop bc
cp 0
jr nz, .skip_happiness
farcall ChangeHappiness
call LooksBitterMessage
ld a, 0
.skip_happiness
jp StatusHealer_Jumptable
; f1a9
ItemRestoreHP: ; f1a9 (3:71a9)
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
ld a, 2
ret c
call IsMonFainted
ld a, 1
ret z
call IsMonAtFullHealth
ld a, 1
ret nc
xor a
ld [wLowHealthAlarm], a
call GetHealingItemAmount
call RestoreHealth
call BattlemonRestoreHealth
call HealHP_SFX_GFX
ld a, PARTYMENUTEXT_HEAL_HP
ld [wPartyMenuActionText], a
call ItemActionTextWaitButton
call UseDisposableItem
ld a, 0
ret
HealHP_SFX_GFX: ; f1db (3:71db)
push de
ld de, SFX_POTION
call WaitPlaySFX
pop de
ld a, [wCurPartyMon]
hlcoord 11, 0
ld bc, SCREEN_WIDTH * 2
call AddNTimes
ld a, $2
ld [wWhichHPBar], a
predef_jump AnimateHPBar
UseItem_SelectMon: ; f1f9 (3:71f9)
call .SelectMon
ret c
ld a, [wCurPartySpecies]
cp EGG
jr nz, .not_egg
call CantUseOnEggMessage
scf
ret
.not_egg
and a
ret
.SelectMon: ; f20b (3:720b)
ld a, b
ld [wPartyMenuActionText], a
push hl
push de
push bc
call ClearBGPalettes
call ChooseMonToUseItemOn
pop bc
pop de
pop hl
ret
ChooseMonToUseItemOn: ; f21c (3:721c)
farcall LoadPartyMenuGFX
farcall InitPartyMenuWithCancel
farcall InitPartyMenuGFX
farcall WritePartyMenuTilemap
farcall PrintPartyMenuText
call WaitBGMap
call SetPalettes
call DelayFrame
farcall PartyMenuSelect
ret
ItemActionText: ; f24a (3:724a)
ld [wPartyMenuActionText], a
ld a, [wCurPartySpecies]
push af
ld a, [wCurPartyMon]
push af
push hl
push de
push bc
farcall WritePartyMenuTilemap
farcall PrintPartyMenuActionText
call WaitBGMap
call SetPalettes
call DelayFrame
pop bc
pop de
pop hl
pop af
ld [wCurPartyMon], a
pop af
ld [wCurPartySpecies], a
ret
ItemActionTextWaitButton: ; f279 (3:7279)
xor a
ld [hBGMapMode], a
hlcoord 0, 0
ld bc, wTileMapEnd - wTileMap
ld a, " "
call ByteFill
ld a, [wPartyMenuActionText]
call ItemActionText
ld a, $1
ld [hBGMapMode], a
ld c, 50
call DelayFrames
jp WaitPressAorB_BlinkCursor
StatusHealer_NoEffect: ; f299 (3:7299)
call WontHaveAnyEffectMessage
jr StatusHealer_ClearPalettes
StatusHealer_ExitMenu: ; f29e (3:729e)
xor a
ld [wItemEffectSucceeded], a
StatusHealer_ClearPalettes: ; f2a2 (3:72a2)
call ClearPalettes
ret
IsItemUsedOnBattleMon: ; f2a6 (3:72a6)
ld a, [wBattleMode]
and a
ret z
ld a, [wCurPartyMon]
push hl
ld hl, wCurBattleMon
cp [hl]
pop hl
jr nz, .nope
scf
ret
.nope
xor a
ret
ReviveHalfHP: ; f2ba (3:72ba)
call LoadHPFromBuffer1
srl d
rr e
jr ContinueRevive
ReviveFullHP: ; f2c3 (3:72c3)
call LoadHPFromBuffer1
ContinueRevive: ; f2c6 (3:72c6)
ld a, MON_HP
call GetPartyParamLocation
ld [hl], d
inc hl
ld [hl], e
jp LoadCurHPIntoBuffer5
RestoreHealth: ; f2d1 (3:72d1)
ld a, MON_HP + 1
call GetPartyParamLocation
ld a, [hl]
add e
ld [hld], a
ld a, [hl]
adc d
ld [hl], a
jr c, .full_hp
call LoadCurHPIntoBuffer5
ld a, MON_HP + 1
call GetPartyParamLocation
ld d, h
ld e, l
ld a, MON_MAXHP + 1
call GetPartyParamLocation
ld a, [de]
sub [hl]
dec de
dec hl
ld a, [de]
sbc [hl]
jr c, .finish
.full_hp
call ReviveFullHP
.finish
ret
RemoveHP: ; f2f9 (3:72f9)
ld a, MON_HP + 1
call GetPartyParamLocation
ld a, [hl]
sub e
ld [hld], a
ld a, [hl]
sbc d
ld [hl], a
jr nc, .okay
xor a
ld [hld], a
ld [hl], a
.okay
call LoadCurHPIntoBuffer5
ret
IsMonFainted: ; f30d (3:730d)
push de
call LoadMaxHPToBuffer1
call LoadCurHPToBuffer3
call LoadHPFromBuffer3
ld a, d
or e
pop de
ret
IsMonAtFullHealth: ; f31b (3:731b)
call LoadHPFromBuffer3
ld h, d
ld l, e
call LoadHPFromBuffer1
ld a, l
sub e
ld a, h
sbc d
ret
LoadCurHPIntoBuffer5: ; f328 (3:7328)
ld a, MON_HP
call GetPartyParamLocation
ld a, [hli]
ld [wBuffer6], a
ld a, [hl]
ld [wBuffer5], a
ret
; f336 (3:7336)
LoadHPIntoBuffer5: ; f336
ld a, d
ld [wBuffer6], a
ld a, e
ld [wBuffer5], a
ret
; f33f
LoadHPFromBuffer5: ; f33f
ld a, [wBuffer6]
ld d, a
ld a, [wBuffer5]
ld e, a
ret
; f348
LoadCurHPToBuffer3: ; f348 (3:7348)
ld a, MON_HP
call GetPartyParamLocation
ld a, [hli]
ld [wBuffer4], a
ld a, [hl]
ld [wBuffer3], a
ret
LoadHPFromBuffer3: ; f356 (3:7356)
ld a, [wBuffer4]
ld d, a
ld a, [wBuffer3]
ld e, a
ret
LoadMaxHPToBuffer1: ; f35f (3:735f)
push hl
ld a, MON_MAXHP
call GetPartyParamLocation
ld a, [hli]
ld [wBuffer2], a
ld a, [hl]
ld [wBuffer1], a
pop hl
ret
LoadHPFromBuffer1: ; f36f (3:736f)
ld a, [wBuffer2]
ld d, a
ld a, [wBuffer1]
ld e, a
ret
GetOneFifthMaxHP: ; f378 (3:7378)
push bc
ld a, MON_MAXHP
call GetPartyParamLocation
ld a, [hli]
ld [hDividend + 0], a
ld a, [hl]
ld [hDividend + 1], a
ld a, 5
ld [hDivisor], a
ld b, 2
call Divide
ld a, [hQuotient + 1]
ld d, a
ld a, [hQuotient + 2]
ld e, a
pop bc
ret
GetHealingItemAmount: ; f395 (3:7395)
push hl
ld a, [wCurItem]
ld hl, HealingHPAmounts
ld d, a
.next
ld a, [hli]
cp -1
jr z, .NotFound
cp d
jr z, .done
inc hl
inc hl
jr .next
.NotFound:
scf
.done
ld e, [hl]
inc hl
ld d, [hl]
pop hl
ret
; f3af (3:73af)
INCLUDE "data/items/heal_hp.asm"
Softboiled_MilkDrinkFunction: ; f3df (3:73df)
; Softboiled/Milk Drink in the field
ld a, [wPartyMenuCursor]
dec a
ld b, a
call .SelectMilkDrinkRecipient ; select pokemon
jr c, .skip
ld a, b
ld [wCurPartyMon], a
call IsMonFainted
call GetOneFifthMaxHP
call RemoveHP
push bc
call HealHP_SFX_GFX
pop bc
call GetOneFifthMaxHP
ld a, c
ld [wCurPartyMon], a
call IsMonFainted
call RestoreHealth
call HealHP_SFX_GFX
ld a, PARTYMENUTEXT_HEAL_HP
call ItemActionText
call JoyWaitAorB
.skip
ld a, b
inc a
ld [wPartyMenuCursor], a
ret
.SelectMilkDrinkRecipient: ; f419 (3:7419)
.loop
push bc
ld a, PARTYMENUACTION_HEALING_ITEM
ld [wPartyMenuActionText], a
call ChooseMonToUseItemOn
pop bc
jr c, .set_carry
ld a, [wPartyMenuCursor]
dec a
ld c, a
ld a, b
cp c
jr z, .cant_use ; chose the same mon as user
ld a, c
ld [wCurPartyMon], a
call IsMonFainted
jr z, .cant_use
call IsMonAtFullHealth
jr nc, .cant_use
xor a
ret
.set_carry
scf
ret
.cant_use
push bc
ld hl, .Text_CantBeUsed
call MenuTextBoxBackup
pop bc
jr .loop
; f44a (3:744a)
.Text_CantBeUsed: ; 0xf44a
; That can't be used on this #MON.
text_jump UnknownText_0x1c5bac
db "@"
; 0xf44f
EscapeRopeEffect: ; f44f
xor a
ld [wItemEffectSucceeded], a
farcall EscapeRopeFunction
ld a, [wItemEffectSucceeded]
cp 1
call z, UseDisposableItem
ret
; f462
SuperRepelEffect: ; f462
ld b, 200
jr UseRepel
; f466
MaxRepelEffect: ; f466
ld b, 250
jr UseRepel
; f466
RepelEffect: ; f46a
ld b, 100
; f46c
UseRepel: ; f46c
ld a, [wRepelEffect]
and a
ld hl, TextJump_RepelUsedEarlierIsStillInEffect
jp nz, PrintText
ld a, b
ld [wRepelEffect], a
jp UseItemText
TextJump_RepelUsedEarlierIsStillInEffect: ; 0xf47d
; The REPEL used earlier is still in effect.
text_jump Text_RepelUsedEarlierIsStillInEffect
db "@"
; 0xf482
XAccuracyEffect: ; f482
ld hl, wPlayerSubStatus4
bit SUBSTATUS_X_ACCURACY, [hl]
jp nz, WontHaveAnyEffect_NotUsedMessage
set SUBSTATUS_X_ACCURACY, [hl]
jp UseItemText
; f48f
PokeDollEffect: ; f48f
ld a, [wBattleMode]
dec a
jr nz, .asm_f4a6
inc a
ld [wForcedSwitch], a
ld a, [wBattleResult]
and BATTLERESULT_BITMASK
or DRAW
ld [wBattleResult], a
jp UseItemText
.asm_f4a6
xor a
ld [wItemEffectSucceeded], a
ret
; f4ab
GuardSpecEffect: ; f4ab
ld hl, wPlayerSubStatus4
bit SUBSTATUS_MIST, [hl]
jp nz, WontHaveAnyEffect_NotUsedMessage
set SUBSTATUS_MIST, [hl]
jp UseItemText
; f4b8
DireHitEffect: ; f4b8
ld hl, wPlayerSubStatus4
bit SUBSTATUS_FOCUS_ENERGY, [hl]
jp nz, WontHaveAnyEffect_NotUsedMessage
set SUBSTATUS_FOCUS_ENERGY, [hl]
jp UseItemText
; f4c5
XItemEffect: ; f4c5
call UseItemText
ld a, [wCurItem]
ld hl, XItemStats
.loop
cp [hl]
jr z, .got_it
inc hl
inc hl
jr .loop
.got_it
inc hl
ld b, [hl]
xor a
ld [hBattleTurn], a
ld [wAttackMissed], a
ld [wEffectFailed], a
farcall CheckIfStatCanBeRaised
call WaitSFX
farcall BattleCommand_StatUpMessage
farcall BattleCommand_StatUpFailText
ld a, [wCurBattleMon]
ld [wCurPartyMon], a
ld c, HAPPINESS_USEDXITEM
farcall ChangeHappiness
ret
; f504
INCLUDE "data/items/x_stats.asm"
PokeFluteEffect: ; f50c
ld a, [wBattleMode]
and a
jr nz, .dummy
.dummy
xor a
ld [wd002], a
ld b, $ff ^ SLP
ld hl, wPartyMon1Status
call .CureSleep
ld a, [wBattleMode]
cp WILD_BATTLE
jr z, .skip_otrainer
ld hl, wOTPartyMon1Status
call .CureSleep
.skip_otrainer
ld hl, wBattleMonStatus
ld a, [hl]
and b
ld [hl], a
ld hl, wEnemyMonStatus
ld a, [hl]
and b
ld [hl], a
ld a, [wd002]
and a
ld hl, .CatchyTune
jp z, PrintText
ld hl, .PlayedTheFlute
call PrintText
ld a, [wLowHealthAlarm]
and 1 << DANGER_ON_F
jr nz, .dummy2
.dummy2
ld hl, .AllSleepingMonWokeUp
jp PrintText
.CureSleep:
ld de, PARTYMON_STRUCT_LENGTH
ld c, PARTY_LENGTH
.loop
ld a, [hl]
push af
and SLP
jr z, .not_asleep
ld a, 1
ld [wd002], a
.not_asleep
pop af
and b
ld [hl], a
add hl, de
dec c
jr nz, .loop
ret
; f56c
.CatchyTune: ; 0xf56c
; Played the # FLUTE. Now, that's a catchy tune!
text_jump UnknownText_0x1c5bf9
db "@"
; 0xf571
.AllSleepingMonWokeUp: ; 0xf571
; All sleeping #MON woke up.
text_jump UnknownText_0x1c5c28
db "@"
; 0xf576
.PlayedTheFlute: ; 0xf576
; played the # FLUTE.@ @
text_jump UnknownText_0x1c5c44
start_asm
ld a, [wBattleMode]
and a
jr nz, .battle
push de
ld de, SFX_POKEFLUTE
call WaitPlaySFX
call WaitSFX
pop de
.battle
jp PokeFluteTerminatorCharacter
; f58f
BlueCardEffect: ; f58f
ld hl, .bluecardtext
jp MenuTextBoxWaitButton
.bluecardtext
text_jump UnknownText_0x1c5c5e
db "@"
; f59a
CoinCaseEffect: ; f59a
ld hl, .coincasetext
jp MenuTextBoxWaitButton
.coincasetext
text_jump UnknownText_0x1c5c7b
db "@"
; f5a5
OldRodEffect: ; f5a5
ld e, $0
jr UseRod
; f5a9
GoodRodEffect: ; f5a9
ld e, $1
jr UseRod
; f5ad
SuperRodEffect: ; f5ad
ld e, $2
jr UseRod
; f5b1
UseRod: ; f5b1
farcall FishFunction
ret
; f5b8
ItemfinderEffect: ; f5b8
farcall ItemFinder
ret
; f5bf
RestorePPEffect: ; f5bf
ld a, [wCurItem]
ld [wd002], a
.loop
; Party Screen opens to choose on which mon to use the Item
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, PPRestoreItem_Cancel
.loop2
ld a, [wd002]
cp MAX_ELIXER
jp z, Elixer_RestorePPofAllMoves
cp ELIXER
jp z, Elixer_RestorePPofAllMoves
ld hl, TextJump_RaiseThePPOfWhichMove
ld a, [wd002]
cp PP_UP
jr z, .ppup
ld hl, TextJump_RestoreThePPOfWhichMove
.ppup
call PrintText
ld a, [wCurMoveNum]
push af
xor a
ld [wCurMoveNum], a
ld a, $2
ld [wMoveSelectionMenuType], a
farcall MoveSelectionScreen
pop bc
ld a, b
ld [wCurMoveNum], a
jr nz, .loop
ld hl, wPartyMon1Moves
ld bc, PARTYMON_STRUCT_LENGTH
call GetMthMoveOfNthPartymon
push hl
ld a, [hl]
ld [wd265], a
call GetMoveName
call CopyName1
pop hl
ld a, [wd002]
cp PP_UP
jp nz, Not_PP_Up
ld a, [hl]
cp SKETCH
jr z, .CantUsePPUpOnSketch
ld bc, MON_PP - MON_MOVES
add hl, bc
ld a, [hl]
cp PP_UP_MASK
jr c, .do_ppup
.CantUsePPUpOnSketch:
.pp_is_maxed_out
ld hl, TextJump_PPIsMaxedOut
call PrintText
jr .loop2
.do_ppup
ld a, [hl]
add PP_UP_ONE
ld [hl], a
ld a, $1
ld [wd265], a
call ApplyPPUp
call Play_SFX_FULL_HEAL
ld hl, TextJump_PPsIncreased
call PrintText
FinishPPRestore: ; f64c
call ClearPalettes
jp UseDisposableItem
; f652
BattleRestorePP: ; f652
ld a, [wBattleMode]
and a
jr z, .not_in_battle
ld a, [wCurPartyMon]
ld b, a
ld a, [wCurBattleMon]
cp b
jr nz, .not_in_battle
ld a, [wPlayerSubStatus5]
bit SUBSTATUS_TRANSFORMED, a
jr nz, .not_in_battle
call .UpdateBattleMonPP
.not_in_battle
call Play_SFX_FULL_HEAL
ld hl, UnknownText_0xf739
call PrintText
jr FinishPPRestore
.UpdateBattleMonPP:
ld a, [wCurPartyMon]
ld hl, wPartyMon1Moves
ld bc, PARTYMON_STRUCT_LENGTH
call AddNTimes
ld de, wBattleMonMoves
ld b, NUM_MOVES
.loop
ld a, [de]
and a
jr z, .done
cp [hl]
jr nz, .next
push hl
push de
push bc
rept NUM_MOVES + 2 ; wBattleMonPP - wBattleMonMoves
inc de
endr
ld bc, MON_PP - MON_MOVES
add hl, bc
ld a, [hl]
ld [de], a
pop bc
pop de
pop hl
.next
inc hl
inc de
dec b
jr nz, .loop
.done
ret
; f6a7
Not_PP_Up: ; f6a7
call RestorePP
jr nz, BattleRestorePP
jp PPRestoreItem_NoEffect
; f6af
Elixer_RestorePPofAllMoves: ; f6af
xor a
ld hl, wMenuCursorY
ld [hli], a
ld [hl], a
ld b, NUM_MOVES
.moveLoop
push bc
ld hl, wPartyMon1Moves
ld bc, PARTYMON_STRUCT_LENGTH
call GetMthMoveOfNthPartymon
ld a, [hl]
and a
jr z, .next
call RestorePP
jr z, .next
ld hl, wMenuCursorX
inc [hl]
.next
ld hl, wMenuCursorY
inc [hl]
pop bc
dec b
jr nz, .moveLoop
ld a, [wMenuCursorX]
and a
jp nz, BattleRestorePP
PPRestoreItem_NoEffect: ; f6dd
call WontHaveAnyEffectMessage
PPRestoreItem_Cancel: ; f6e0
call ClearPalettes
xor a
ld [wItemEffectSucceeded], a
ret
; f6e8
RestorePP: ; f6e8
xor a ; PARTYMON
ld [wMonType], a
call GetMaxPPOfMove
ld hl, wPartyMon1PP
ld bc, PARTYMON_STRUCT_LENGTH
call GetMthMoveOfNthPartymon
ld a, [wd265]
ld b, a
ld a, [hl]
and PP_MASK
cp b
jr nc, .dont_restore
ld a, [wd002]
cp MAX_ELIXER
jr z, .restore_all
cp MAX_ETHER
jr z, .restore_all
ld c, 5
cp MYSTERYBERRY
jr z, .restore_some
ld c, 10
.restore_some
ld a, [hl]
and PP_MASK
add c
cp b
jr nc, .restore_all
ld b, a
.restore_all
ld a, [hl]
and PP_UP_MASK
or b
ld [hl], a
ret
.dont_restore
xor a
ret
; f725
TextJump_RaiseThePPOfWhichMove: ; 0xf725
; Raise the PP of which move?
text_jump Text_RaiseThePPOfWhichMove
db "@"
; 0xf72a
TextJump_RestoreThePPOfWhichMove: ; 0xf72a
; Restore the PP of which move?
text_jump Text_RestoreThePPOfWhichMove
db "@"
; 0xf72f
TextJump_PPIsMaxedOut: ; 0xf72f
; 's PP is maxed out.
text_jump Text_PPIsMaxedOut
db "@"
; 0xf734
TextJump_PPsIncreased: ; 0xf734
; 's PP increased.
text_jump Text_PPsIncreased
db "@"
; 0xf739
UnknownText_0xf739: ; 0xf739
; PP was restored.
text_jump UnknownText_0x1c5cf1
db "@"
; 0xf73e
SquirtbottleEffect: ; f73e
farcall _Squirtbottle
ret
; f745
CardKeyEffect: ; f745
farcall _CardKey
ret
; f74c
BasementKeyEffect: ; f74c
farcall _BasementKey
ret
; f753
SacredAshEffect: ; f753
farcall _SacredAsh
ld a, [wItemEffectSucceeded]
cp $1
ret nz
call UseDisposableItem
ret
; f763
NormalBoxEffect: ; f763
ld c, DECOFLAG_SILVER_TROPHY_DOLL
jr OpenBox
; f767
GorgeousBoxEffect: ; f767
ld c, DECOFLAG_GOLD_TROPHY_DOLL
OpenBox: ; f769
farcall SetSpecificDecorationFlag
ld hl, .text
call PrintText
jp UseDisposableItem
; f778
.text ; 0xf778
; There was a trophy inside!
text_jump UnknownText_0x1c5d03
db "@"
; 0xf77d
NoEffect: ; f77d
jp IsntTheTimeMessage
; f780
Play_SFX_FULL_HEAL: ; f780
push de
ld de, SFX_FULL_HEAL
call WaitPlaySFX
pop de
ret
; f789
UseItemText: ; f789
ld hl, UsedItemText
call PrintText
call Play_SFX_FULL_HEAL
call WaitPressAorB_BlinkCursor
UseDisposableItem: ; f795
ld hl, wNumItems
ld a, 1
ld [wItemQuantityChangeBuffer], a
jp TossItem
; f7a0
UseBallInTrainerBattle: ; f7a0
call ReturnToBattle_UseBall
ld de, ANIM_THROW_POKE_BALL
ld a, e
ld [wFXAnimID], a
ld a, d
ld [wFXAnimID + 1], a
xor a
ld [wBattleAnimParam], a
ld [hBattleTurn], a
ld [wNumHits], a
predef PlayBattleAnim
ld hl, BlockedTheBallText
call PrintText
ld hl, DontBeAThiefText
call PrintText
jr UseDisposableItem
; f7ca
WontHaveAnyEffect_NotUsedMessage: ; f7ca
ld hl, WontHaveAnyEffectText
call PrintText
; Item wasn't used.
ld a, $2
ld [wItemEffectSucceeded], a
ret
; f7d6
LooksBitterMessage: ; f7d6
ld hl, LooksBitterText
jp PrintText
; f7dc
Ball_BoxIsFullMessage: ; f7dc
ld hl, Ball_BoxIsFullText
call PrintText
; Item wasn't used.
ld a, $2
ld [wItemEffectSucceeded], a
ret
; f7e8
CantUseOnEggMessage: ; f7e8
ld hl, CantUseOnEggText
jr CantUseItemMessage
IsntTheTimeMessage: ; f7ed
ld hl, IsntTheTimeText
jr CantUseItemMessage
WontHaveAnyEffectMessage: ; f7f2
ld hl, WontHaveAnyEffectText
jr CantUseItemMessage
BelongsToSomeoneElseMessage: ; f7f7
ld hl, BelongsToSomeoneElseText
jr CantUseItemMessage
CyclingIsntAllowedMessage: ; f7fc
ld hl, CyclingIsntAllowedText
jr CantUseItemMessage
CantGetOnYourBikeMessage: ; f801
ld hl, CantGetOnYourBikeText
CantUseItemMessage: ; f804
; Item couldn't be used.
xor a
ld [wItemEffectSucceeded], a
jp PrintText
; f80b
LooksBitterText: ; 0xf80b
; It looks bitter…
text_jump UnknownText_0x1c5d3e
db "@"
; 0xf810
CantUseOnEggText: ; 0xf810
; That can't be used on an EGG.
text_jump UnknownText_0x1c5d50
db "@"
; 0xf815
IsntTheTimeText: ; 0xf815
; OAK: ! This isn't the time to use that!
text_jump UnknownText_0x1c5d6e
db "@"
; 0xf81a
BelongsToSomeoneElseText: ; 0xf81a
; That belongs to someone else!
text_jump UnknownText_0x1c5d97
db "@"
; 0xf81f
WontHaveAnyEffectText: ; 0xf81f
; It won't have any effect.
text_jump UnknownText_0x1c5db6
db "@"
; 0xf824
BlockedTheBallText: ; 0xf824
; The trainer blocked the BALL!
text_jump UnknownText_0x1c5dd0
db "@"
; 0xf829
DontBeAThiefText: ; 0xf829
; Don't be a thief!
text_jump UnknownText_0x1c5def
db "@"
; 0xf82e
CyclingIsntAllowedText: ; 0xf82e
; Cycling isn't allowed here.
text_jump UnknownText_0x1c5e01
db "@"
; 0xf833
CantGetOnYourBikeText: ; 0xf833
; Can't get on your @ now.
text_jump UnknownText_0x1c5e1d
db "@"
; 0xf838
Ball_BoxIsFullText: ; 0xf838
; The #MON BOX is full. That can't be used now.
text_jump UnknownText_0x1c5e3a
db "@"
; 0xf83d
UsedItemText: ; 0xf83d
; used the@ .
text_jump UnknownText_0x1c5e68
db "@"
; 0xf842
GotOnTheItemText: ; 0xf842
; got on the@ .
text_jump UnknownText_0x1c5e7b
db "@"
; 0xf847
GotOffTheItemText: ; 0xf847
; got off@ the @ .
text_jump UnknownText_0x1c5e90
db "@"
; 0xf84c
ApplyPPUp: ; f84c
ld a, MON_MOVES
call GetPartyParamLocation
push hl
ld de, wBuffer1
predef FillPP
pop hl
ld bc, MON_PP - MON_MOVES
add hl, bc
ld de, wBuffer1
ld b, 0
.loop
inc b
ld a, b
cp NUM_MOVES + 1
ret z
ld a, [wd265]
dec a
jr nz, .use
ld a, [wMenuCursorY]
inc a
cp b
jr nz, .skip
.use
ld a, [hl]
and PP_UP_MASK
ld a, [de] ; wasted cycle
call nz, ComputeMaxPP
.skip
inc hl
inc de
jr .loop
; f881
ComputeMaxPP: ; f881
push bc
; Divide the base PP by 5.
ld a, [de]
ld [hDividend + 3], a
xor a
ld [hDividend], a
ld [hDividend + 1], a
ld [hDividend + 2], a
ld a, 5
ld [hDivisor], a
ld b, 4
call Divide
; Get the number of PP, which are bits 6 and 7 of the PP value stored in RAM.
ld a, [hl]
ld b, a
swap a
and $f
srl a
srl a
ld c, a
; If this value is 0, we are done
and a
jr z, .NoPPUp
.loop
; Normally, a move with 40 PP would have 64 PP with three PP Ups.
; Since this would overflow into bit 6, we prevent that from happening
; by decreasing the extra amount of PP each PP Up provides, resulting
; in a maximum of 61.
ld a, [hQuotient + 2]
cp $8
jr c, .okay
ld a, $7
.okay
add b
ld b, a
ld a, [wd265]
dec a
jr z, .NoPPUp
dec c
jr nz, .loop
.NoPPUp:
ld [hl], b
pop bc
ret
; f8b9
RestoreAllPP: ; f8b9
ld a, MON_PP
call GetPartyParamLocation
push hl
ld a, MON_MOVES
call GetPartyParamLocation
pop de
xor a ; PARTYMON
ld [wMenuCursorY], a
ld [wMonType], a
ld c, NUM_MOVES
.loop
ld a, [hli]
and a
ret z
push hl
push de
push bc
call GetMaxPPOfMove
pop bc
pop de
ld a, [de]
and PP_UP_MASK
ld b, a
ld a, [wd265]
add b
ld [de], a
inc de
ld hl, wMenuCursorY
inc [hl]
pop hl
dec c
jr nz, .loop
ret
; f8ec
GetMaxPPOfMove: ; f8ec
ld a, [wStringBuffer1 + 0]
push af
ld a, [wStringBuffer1 + 1]
push af
ld a, [wMonType]
and a
ld hl, wPartyMon1Moves
ld bc, PARTYMON_STRUCT_LENGTH
jr z, .got_partymon ; PARTYMON
ld hl, wOTPartyMon1Moves
dec a
jr z, .got_partymon ; OTPARTYMON
ld hl, wTempMonMoves
dec a
jr z, .got_nonpartymon ; BOXMON
ld hl, wTempMonMoves ; Wasted cycles
dec a
jr z, .got_nonpartymon ; TEMPMON
ld hl, wBattleMonMoves ; WILDMON
.got_nonpartymon ; BOXMON, TEMPMON, WILDMON
call GetMthMoveOfCurrentMon
jr .gotdatmove
.got_partymon ; PARTYMON, OTPARTYMON
call GetMthMoveOfNthPartymon
.gotdatmove
ld a, [hl]
dec a
push hl
ld hl, Moves + MOVE_PP
ld bc, MOVE_LENGTH
call AddNTimes
ld a, BANK(Moves)
call GetFarByte
ld b, a
ld de, wStringBuffer1
ld [de], a
pop hl
push bc
ld bc, MON_PP - MON_MOVES
ld a, [wMonType]
cp WILDMON
jr nz, .notwild
ld bc, wEnemyMonPP - wEnemyMonMoves
.notwild
add hl, bc
ld a, [hl]
and PP_UP_MASK
pop bc
or b
ld hl, wStringBuffer1 + 1
ld [hl], a
xor a
ld [wd265], a
ld a, b ; this gets lost anyway
call ComputeMaxPP
ld a, [hl]
and PP_MASK
ld [wd265], a
pop af
ld [wStringBuffer1 + 1], a
pop af
ld [wStringBuffer1 + 0], a
ret
; f963
GetMthMoveOfNthPartymon: ; f963
ld a, [wCurPartyMon]
call AddNTimes
GetMthMoveOfCurrentMon: ; f969
ld a, [wMenuCursorY]
ld c, a
ld b, 0
add hl, bc
ret
; f971