Since we're aiming for consistency across the codebase, I believe it includes a uniform way to refer to the creatures this game consists of in the labels of the code. The only exceptions to this rule are labels referring to things named through the use of the <PK><MN> or <PKMN> characters, in which case PKMN is used. Most of this was already consistent enough™, I just picked the convention with the most occurences and fixed the outliers.
3272 lines
48 KiB
NASM
3272 lines
48 KiB
NASM
_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 (see constants/item_constants.asm)
|
||
dw MasterBall
|
||
dw UltraBall
|
||
dw Brightpowder
|
||
dw GreatBall
|
||
dw PokeBall
|
||
dw TownMap
|
||
dw Bicycle
|
||
dw MoonStone
|
||
dw Antidote
|
||
dw BurnHeal
|
||
dw IceHeal
|
||
dw Awakening
|
||
dw ParlyzHeal
|
||
dw FullRestore
|
||
dw MaxPotion
|
||
dw HyperPotion
|
||
dw SuperPotion
|
||
dw Potion
|
||
dw EscapeRope
|
||
dw Repel
|
||
dw MaxElixer
|
||
dw FireStone
|
||
dw Thunderstone
|
||
dw WaterStone
|
||
dw Item19
|
||
dw HPUp
|
||
dw Protein
|
||
dw Iron
|
||
dw Carbos
|
||
dw LuckyPunch
|
||
dw Calcium
|
||
dw RareCandy
|
||
dw XAccuracy
|
||
dw LeafStone
|
||
dw MetalPowder
|
||
dw Nugget
|
||
dw PokeDoll
|
||
dw FullHeal
|
||
dw Revive
|
||
dw MaxRevive
|
||
dw GuardSpec
|
||
dw SuperRepel
|
||
dw MaxRepel
|
||
dw DireHit
|
||
dw Item2D
|
||
dw FreshWater
|
||
dw SodaPop
|
||
dw Lemonade
|
||
dw XAttack
|
||
dw Item32
|
||
dw XDefend
|
||
dw XSpeed
|
||
dw XSpecial
|
||
dw CoinCase
|
||
dw Itemfinder
|
||
dw PokeFlute
|
||
dw ExpShare
|
||
dw OldRod
|
||
dw GoodRod
|
||
dw SilverLeaf
|
||
dw SuperRod
|
||
dw PPUp
|
||
dw Ether
|
||
dw MaxEther
|
||
dw Elixer
|
||
dw RedScale
|
||
dw Secretpotion
|
||
dw SSTicket
|
||
dw MysteryEgg
|
||
dw ClearBell
|
||
dw SilverWing
|
||
dw MoomooMilk
|
||
dw QuickClaw
|
||
dw Psncureberry
|
||
dw GoldLeaf
|
||
dw SoftSand
|
||
dw SharpBeak
|
||
dw Przcureberry
|
||
dw BurntBerry
|
||
dw IceBerry
|
||
dw PoisonBarb
|
||
dw KingsRock
|
||
dw BitterBerry
|
||
dw MintBerry
|
||
dw RedApricorn
|
||
dw Tinymushroom
|
||
dw BigMushroom
|
||
dw Silverpowder
|
||
dw BluApricorn
|
||
dw Item5A
|
||
dw AmuletCoin
|
||
dw YlwApricorn
|
||
dw GrnApricorn
|
||
dw CleanseTag
|
||
dw MysticWater
|
||
dw Twistedspoon
|
||
dw WhtApricorn
|
||
dw Blackbelt
|
||
dw BlkApricorn
|
||
dw Item64
|
||
dw PnkApricorn
|
||
dw Blackglasses
|
||
dw Slowpoketail
|
||
dw PinkBow
|
||
dw Stick
|
||
dw SmokeBall
|
||
dw Nevermeltice
|
||
dw Magnet
|
||
dw Miracleberry
|
||
dw Pearl
|
||
dw BigPearl
|
||
dw Everstone
|
||
dw SpellTag
|
||
dw Ragecandybar
|
||
dw GsBall
|
||
dw BlueCard
|
||
dw MiracleSeed
|
||
dw ThickClub
|
||
dw FocusBand
|
||
dw Item78
|
||
dw Energypowder
|
||
dw EnergyRoot
|
||
dw HealPowder
|
||
dw RevivalHerb
|
||
dw HardStone
|
||
dw LuckyEgg
|
||
dw CardKey
|
||
dw MachinePart
|
||
dw EggTicket
|
||
dw LostItem
|
||
dw Stardust
|
||
dw StarPiece
|
||
dw BasementKey
|
||
dw Pass
|
||
dw Item87
|
||
dw Item88
|
||
dw Item89
|
||
dw Charcoal
|
||
dw BerryJuice
|
||
dw ScopeLens
|
||
dw Item8D
|
||
dw Item8E
|
||
dw MetalCoat
|
||
dw DragonFang
|
||
dw Item91
|
||
dw Leftovers
|
||
dw Item93
|
||
dw Item94
|
||
dw Item95
|
||
dw Mysteryberry
|
||
dw DragonScale
|
||
dw BerserkGene
|
||
dw Item99
|
||
dw Item9A
|
||
dw Item9B
|
||
dw SacredAsh
|
||
dw HeavyBall
|
||
dw FlowerMail
|
||
dw LevelBall
|
||
dw LureBall
|
||
dw FastBall
|
||
dw ItemA2
|
||
dw LightBall
|
||
dw FriendBall
|
||
dw MoonBall
|
||
dw LoveBall
|
||
dw NormalBox
|
||
dw GorgeousBox
|
||
dw SunStone
|
||
dw PolkadotBow
|
||
dw ItemAB
|
||
dw UpGrade
|
||
dw Berry
|
||
dw GoldBerry
|
||
dw Squirtbottle
|
||
dw ItemB0
|
||
dw ParkBall
|
||
dw RainbowWing
|
||
dw ItemB3
|
||
; e8a2
|
||
|
||
|
||
MasterBall:
|
||
UltraBall:
|
||
GreatBall:
|
||
PokeBall:
|
||
HeavyBall:
|
||
LevelBall:
|
||
LureBall:
|
||
FastBall:
|
||
FriendBall:
|
||
MoonBall:
|
||
LoveBall:
|
||
ParkBall: ; 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
|
||
|
||
ld d, a
|
||
push de
|
||
|
||
; 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 a, [wBattleMonItem]
|
||
; ld b, a
|
||
farcall GetItemHeldEffect
|
||
ld a, b
|
||
cp HELD_CATCH_CHANCE
|
||
|
||
pop de
|
||
ld a, d
|
||
|
||
jr nz, .skip_hp_calc
|
||
add c
|
||
jr nc, .skip_hp_calc
|
||
ld a, $ff
|
||
.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 6, [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 7, [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(PokedexEntries1)
|
||
db BANK(PokedexEntries2)
|
||
db BANK(PokedexEntries3)
|
||
db BANK(PokedexEntries4)
|
||
|
||
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
|
||
|
||
GLOBAL EvosAttacks
|
||
GLOBAL EvosAttacksPointers
|
||
|
||
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(EvosAttacks)
|
||
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(EvosAttacks)
|
||
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
|
||
|
||
TownMap: ; ee01
|
||
farcall PokegearMap
|
||
ret
|
||
; ee08
|
||
|
||
|
||
Bicycle: ; ee08
|
||
farcall BikeFunction
|
||
ret
|
||
; ee0f
|
||
|
||
|
||
MoonStone:
|
||
FireStone:
|
||
Thunderstone:
|
||
WaterStone:
|
||
LeafStone:
|
||
SunStone: ; 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
|
||
|
||
|
||
HPUp:
|
||
Protein:
|
||
Iron:
|
||
Carbos:
|
||
Calcium: ; 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, $1
|
||
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
|
||
|
||
|
||
RareCandy: ; 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
|
||
|
||
|
||
HealPowder: ; 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
|
||
|
||
|
||
Antidote:
|
||
BurnHeal:
|
||
IceHeal:
|
||
Awakening:
|
||
ParlyzHeal:
|
||
FullHeal:
|
||
Psncureberry:
|
||
Przcureberry:
|
||
BurntBerry:
|
||
IceBerry:
|
||
MintBerry:
|
||
Miracleberry: ; 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
|
||
|
||
|
||
RevivalHerb: ; 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
|
||
|
||
|
||
Revive:
|
||
MaxRevive: ; 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
|
||
|
||
|
||
FullRestore: ; 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
|
||
|
||
|
||
BitterBerry: ; 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
|
||
|
||
|
||
MaxPotion:
|
||
HyperPotion:
|
||
SuperPotion:
|
||
Potion:
|
||
FreshWater:
|
||
SodaPop:
|
||
Lemonade:
|
||
MoomooMilk:
|
||
Ragecandybar:
|
||
BerryJuice:
|
||
Berry:
|
||
GoldBerry: ; f186
|
||
call ItemRestoreHP
|
||
jp StatusHealer_Jumptable
|
||
; f18c
|
||
|
||
|
||
Energypowder: ; f18c
|
||
ld c, HAPPINESS_BITTERPOWDER
|
||
jr EnergypowderEnergyRootCommon
|
||
; f190
|
||
|
||
EnergyRoot: ; 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
|
||
|
||
|
||
EscapeRope: ; f44f
|
||
xor a
|
||
ld [wItemEffectSucceeded], a
|
||
farcall EscapeRopeFunction
|
||
|
||
ld a, [wItemEffectSucceeded]
|
||
cp 1
|
||
call z, UseDisposableItem
|
||
ret
|
||
; f462
|
||
|
||
|
||
SuperRepel: ; f462
|
||
ld b, 200
|
||
jr UseRepel
|
||
; f466
|
||
|
||
MaxRepel: ; f466
|
||
ld b, 250
|
||
jr UseRepel
|
||
; f466
|
||
|
||
Repel: ; 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
|
||
|
||
|
||
XAccuracy: ; f482
|
||
ld hl, wPlayerSubStatus4
|
||
bit SUBSTATUS_X_ACCURACY, [hl]
|
||
jp nz, WontHaveAnyEffect_NotUsedMessage
|
||
set SUBSTATUS_X_ACCURACY, [hl]
|
||
jp UseItemText
|
||
; f48f
|
||
|
||
|
||
PokeDoll: ; f48f
|
||
ld a, [wBattleMode]
|
||
dec a
|
||
jr nz, .asm_f4a6
|
||
inc a
|
||
ld [wForcedSwitch], a
|
||
ld a, [wBattleResult]
|
||
and $c0
|
||
or $2
|
||
ld [wBattleResult], a
|
||
jp UseItemText
|
||
|
||
.asm_f4a6
|
||
xor a
|
||
ld [wItemEffectSucceeded], a
|
||
ret
|
||
; f4ab
|
||
|
||
|
||
GuardSpec: ; f4ab
|
||
ld hl, wPlayerSubStatus4
|
||
bit SUBSTATUS_MIST, [hl]
|
||
jp nz, WontHaveAnyEffect_NotUsedMessage
|
||
set SUBSTATUS_MIST, [hl]
|
||
jp UseItemText
|
||
; f4b8
|
||
|
||
|
||
DireHit: ; f4b8
|
||
ld hl, wPlayerSubStatus4
|
||
bit SUBSTATUS_FOCUS_ENERGY, [hl]
|
||
jp nz, WontHaveAnyEffect_NotUsedMessage
|
||
set SUBSTATUS_FOCUS_ENERGY, [hl]
|
||
jp UseItemText
|
||
; f4c5
|
||
|
||
|
||
XAttack:
|
||
XDefend:
|
||
XSpeed:
|
||
XSpecial: ; 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"
|
||
|
||
|
||
PokeFlute: ; 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
|
||
|
||
|
||
BlueCard: ; f58f
|
||
ld hl, .bluecardtext
|
||
jp MenuTextBoxWaitButton
|
||
|
||
.bluecardtext
|
||
text_jump UnknownText_0x1c5c5e
|
||
db "@"
|
||
; f59a
|
||
|
||
|
||
CoinCase: ; f59a
|
||
ld hl, .coincasetext
|
||
jp MenuTextBoxWaitButton
|
||
|
||
.coincasetext
|
||
text_jump UnknownText_0x1c5c7b
|
||
db "@"
|
||
; f5a5
|
||
|
||
|
||
OldRod: ; f5a5
|
||
ld e, $0
|
||
jr UseRod
|
||
; f5a9
|
||
|
||
GoodRod: ; f5a9
|
||
ld e, $1
|
||
jr UseRod
|
||
; f5ad
|
||
|
||
SuperRod: ; f5ad
|
||
ld e, $2
|
||
jr UseRod
|
||
; f5b1
|
||
|
||
UseRod: ; f5b1
|
||
farcall FishFunction
|
||
ret
|
||
; f5b8
|
||
|
||
|
||
Itemfinder: ; f5b8
|
||
farcall ItemFinder
|
||
ret
|
||
; f5bf
|
||
|
||
|
||
MaxElixer:
|
||
PPUp:
|
||
Ether:
|
||
MaxEther:
|
||
Elixer:
|
||
Mysteryberry: ; 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
|
||
|
||
|
||
Squirtbottle: ; f73e
|
||
farcall _Squirtbottle
|
||
ret
|
||
; f745
|
||
|
||
|
||
CardKey: ; f745
|
||
farcall _CardKey
|
||
ret
|
||
; f74c
|
||
|
||
|
||
BasementKey: ; f74c
|
||
farcall _BasementKey
|
||
ret
|
||
; f753
|
||
|
||
|
||
SacredAsh: ; f753
|
||
farcall _SacredAsh
|
||
ld a, [wItemEffectSucceeded]
|
||
cp $1
|
||
ret nz
|
||
call UseDisposableItem
|
||
ret
|
||
; f763
|
||
|
||
|
||
NormalBox: ; f763
|
||
ld c, DECOFLAG_SILVER_TROPHY_DOLL
|
||
jr OpenBox
|
||
; f767
|
||
|
||
GorgeousBox: ; 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
|
||
|
||
Brightpowder:
|
||
Item19:
|
||
LuckyPunch:
|
||
MetalPowder:
|
||
Nugget:
|
||
Item2D:
|
||
Item32:
|
||
ExpShare:
|
||
SilverLeaf:
|
||
RedScale:
|
||
Secretpotion:
|
||
SSTicket:
|
||
MysteryEgg:
|
||
ClearBell:
|
||
SilverWing:
|
||
QuickClaw:
|
||
GoldLeaf:
|
||
SoftSand:
|
||
SharpBeak:
|
||
PoisonBarb:
|
||
KingsRock:
|
||
RedApricorn:
|
||
Tinymushroom:
|
||
BigMushroom:
|
||
Silverpowder:
|
||
BluApricorn:
|
||
Item5A:
|
||
AmuletCoin:
|
||
YlwApricorn:
|
||
GrnApricorn:
|
||
CleanseTag:
|
||
MysticWater:
|
||
Twistedspoon:
|
||
WhtApricorn:
|
||
Blackbelt:
|
||
BlkApricorn:
|
||
Item64:
|
||
PnkApricorn:
|
||
Blackglasses:
|
||
Slowpoketail:
|
||
PinkBow:
|
||
Stick:
|
||
SmokeBall:
|
||
Nevermeltice:
|
||
Magnet:
|
||
Pearl:
|
||
BigPearl:
|
||
Everstone:
|
||
SpellTag:
|
||
GsBall:
|
||
MiracleSeed:
|
||
ThickClub:
|
||
FocusBand:
|
||
Item78:
|
||
HardStone:
|
||
LuckyEgg:
|
||
MachinePart:
|
||
EggTicket:
|
||
LostItem:
|
||
Stardust:
|
||
StarPiece:
|
||
Pass:
|
||
Item87:
|
||
Item88:
|
||
Item89:
|
||
Charcoal:
|
||
ScopeLens:
|
||
Item8D:
|
||
Item8E:
|
||
MetalCoat:
|
||
DragonFang:
|
||
Item91:
|
||
Leftovers:
|
||
Item93:
|
||
Item94:
|
||
Item95:
|
||
DragonScale:
|
||
BerserkGene:
|
||
Item99:
|
||
Item9A:
|
||
Item9B:
|
||
FlowerMail:
|
||
ItemA2:
|
||
LightBall:
|
||
PolkadotBow:
|
||
ItemAB:
|
||
UpGrade:
|
||
ItemB0:
|
||
RainbowWing:
|
||
ItemB3:
|
||
TeruSama: ; 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
|