pokecrystal-board/engine/items/item_effects.asm

2945 lines
48 KiB
NASM
Raw Normal View History

2018-06-24 07:09:41 -07:00
_DoItemEffect::
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
ld [wNamedObjectIndex], a
call GetItemName
call CopyName1
ld a, 1
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
dec a
ld hl, ItemEffects
rst JumpTable
ret
2018-06-24 07:09:41 -07:00
ItemEffects:
; entries correspond to item ids (see constants/item_constants.asm)
table_width 2, ItemEffects
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_I
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
assert_table_length ITEM_B3
; The items past ITEM_B3 do not have effect entries:
; BRICK_PIECE
; SURF_MAIL
; LITEBLUEMAIL
; PORTRAITMAIL
; LOVELY_MAIL
; EON_MAIL
; MORPH_MAIL
; BLUESKY_MAIL
; MUSIC_MAIL
; MIRAGE_MAIL
; ITEM_BE
; They all have the ITEMMENU_NOUSE attribute so they can't be used anyway.
; NoEffect would be appropriate, with the table then being NUM_ITEMS long.
2018-06-24 07:09:41 -07:00
PokeBallEffect:
ld a, [wBattleMode]
2013-05-07 23:02:15 -07:00
dec a
jp nz, UseBallInTrainerBattle
2018-01-23 14:39:09 -08:00
ld a, [wPartyCount]
cp PARTY_LENGTH
jr nz, .room_in_party
ld a, BANK(sBoxCount)
call OpenSRAM
ld a, [sBoxCount]
cp MONS_PER_BOX
2013-05-07 23:02:15 -07:00
call CloseSRAM
jp z, Ball_BoxIsFullMessage
2013-05-07 23:02:15 -07:00
.room_in_party
2013-05-07 23:02:15 -07:00
xor a
2015-11-09 13:41:09 -08:00
ld [wWildMon], a
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
cp PARK_BALL
call nz, ReturnToBattle_UseBall
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld hl, wOptions
res NO_TEXT_SCROLL, [hl]
ld hl, ItemUsedText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonCatchRate]
2013-05-07 23:02:15 -07:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wBattleType]
cp BATTLETYPE_TUTORIAL
jp z, .catch_without_fail
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
cp MASTER_BALL
jp z, .catch_without_fail
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2013-05-07 23:02:15 -07:00
ld c, a
ld hl, BallMultiplierFunctionTable
2013-05-07 23:02:15 -07:00
.get_multiplier_loop
2013-05-07 23:02:15 -07:00
ld a, [hli]
cp $ff
jr z, .skip_or_return_from_ball_fn
2013-05-07 23:02:15 -07:00
cp c
jr z, .call_ball_function
2013-05-07 23:02:15 -07:00
inc hl
inc hl
jr .get_multiplier_loop
2013-05-07 23:02:15 -07:00
.call_ball_function
2013-05-07 23:02:15 -07:00
ld a, [hli]
ld h, [hl]
ld l, a
ld de, .skip_or_return_from_ball_fn
2013-05-07 23:02:15 -07:00
push de
jp hl
2013-05-07 23:02:15 -07:00
.skip_or_return_from_ball_fn
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2013-12-24 14:11:52 -08:00
cp LEVEL_BALL
2013-05-07 23:02:15 -07:00
ld a, b
jp z, .skip_hp_calc
2013-12-24 14:11:52 -08:00
2013-05-07 23:02:15 -07:00
ld a, b
ldh [hMultiplicand + 2], a
2013-12-24 14:11:52 -08:00
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonHP
2013-05-07 23:02:15 -07:00
ld b, [hl]
inc hl
ld c, [hl]
inc hl
ld d, [hl]
inc hl
ld e, [hl]
sla c
rl b
2013-12-24 14:11:52 -08:00
2013-05-07 23:02:15 -07:00
ld h, d
ld l, e
add hl, de
add hl, de
2013-05-07 23:02:15 -07:00
ld d, h
ld e, l
ld a, d
and a
jr z, .okay_1
2013-12-24 14:11:52 -08:00
2013-05-07 23:02:15 -07:00
srl d
rr e
srl d
rr e
srl b
rr c
srl b
rr c
2013-12-24 14:11:52 -08:00
2013-05-07 23:02:15 -07:00
ld a, c
and a
jr nz, .okay_1
2013-05-07 23:02:15 -07:00
ld c, $1
.okay_1
2013-05-07 23:02:15 -07:00
ld b, e
2013-12-24 14:11:52 -08:00
2013-05-07 23:02:15 -07:00
push bc
ld a, b
sub c
ldh [hMultiplier], a
2013-05-07 23:02:15 -07:00
xor a
ldh [hDividend + 0], a
ldh [hMultiplicand + 0], a
ldh [hMultiplicand + 1], a
2013-05-07 23:02:15 -07:00
call Multiply
pop bc
2013-12-24 14:11:52 -08:00
2013-05-07 23:02:15 -07:00
ld a, b
ldh [hDivisor], a
ld b, 4
2013-05-07 23:02:15 -07:00
call Divide
ldh a, [hQuotient + 3]
2013-05-07 23:02:15 -07:00
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.
2016-03-27 09:47:28 -07:00
; Uncomment the line below to fix this.
2013-05-07 23:02:15 -07:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonStatus]
2013-12-24 14:11:52 -08:00
and 1 << FRZ | SLP
ld c, 10
jr nz, .addstatus
2018-01-23 14:39:09 -08:00
; ld a, [wEnemyMonStatus]
2013-05-07 23:02:15 -07:00
and a
2013-12-24 14:11:52 -08:00
ld c, 5
jr nz, .addstatus
2013-12-24 14:11:52 -08:00
ld c, 0
.addstatus
2013-05-07 23:02:15 -07:00
ld a, b
add c
jr nc, .max_1
2013-05-07 23:02:15 -07:00
ld a, $ff
.max_1
2018-02-02 09:29:42 -08:00
; 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.
2013-05-07 23:02:15 -07:00
ld d, a
push de
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonItem]
; ld b, a
2017-12-24 09:47:30 -08:00
farcall GetItemHeldEffect
2013-05-07 23:02:15 -07:00
ld a, b
cp HELD_CATCH_CHANCE
2013-05-07 23:02:15 -07:00
pop de
ld a, d
2018-02-02 09:29:42 -08:00
jr nz, .max_2
2013-05-07 23:02:15 -07:00
add c
2018-02-02 09:29:42 -08:00
jr nc, .max_2
2013-05-07 23:02:15 -07:00
ld a, $ff
2018-02-02 09:29:42 -08:00
.max_2
2018-02-02 09:29:42 -08:00
.skip_hp_calc
2013-05-07 23:02:15 -07:00
ld b, a
2020-11-03 19:45:12 -08:00
ld [wFinalCatchRate], a
call Random
2013-05-07 23:02:15 -07:00
cp b
2013-12-24 14:11:52 -08:00
ld a, 0
jr z, .catch_without_fail
jr nc, .fail_to_catch
2013-05-07 23:02:15 -07:00
.catch_without_fail
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonSpecies]
2013-05-07 23:02:15 -07:00
.fail_to_catch
2015-11-09 13:41:09 -08:00
ld [wWildMon], a
2013-12-24 14:11:52 -08:00
ld c, 20
2013-05-07 23:02:15 -07:00
call DelayFrames
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
cp POKE_BALL + 1 ; Assumes Master/Ultra/Great come before
jr c, .not_kurt_ball
2013-12-24 14:11:52 -08:00
ld a, POKE_BALL
.not_kurt_ball
2016-01-27 09:25:12 -08:00
ld [wBattleAnimParam], a
2013-12-24 14:11:52 -08:00
ld de, ANIM_THROW_POKE_BALL
2013-05-07 23:02:15 -07:00
ld a, e
2018-01-23 14:39:09 -08:00
ld [wFXAnimID], a
2013-05-07 23:02:15 -07:00
ld a, d
2018-01-23 14:39:09 -08:00
ld [wFXAnimID + 1], a
2013-05-07 23:02:15 -07:00
xor a
ldh [hBattleTurn], a
2020-11-03 19:45:12 -08:00
ld [wThrownBallWobbleCount], a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
predef PlayBattleAnim
2013-05-07 23:02:15 -07:00
2015-11-09 13:41:09 -08:00
ld a, [wWildMon]
2013-05-07 23:02:15 -07:00
and a
jr nz, .caught
2020-11-03 19:45:12 -08:00
ld a, [wThrownBallWobbleCount]
cp 1
ld hl, BallBrokeFreeText
jp z, .shake_and_break_free
2020-11-03 19:45:12 -08:00
cp 2
ld hl, BallAppearedCaughtText
jp z, .shake_and_break_free
2020-11-03 19:45:12 -08:00
cp 3
ld hl, BallAlmostHadItText
jp z, .shake_and_break_free
2020-11-03 19:45:12 -08:00
cp 4
ld hl, BallSoCloseText
jp z, .shake_and_break_free
2020-11-03 19:45:12 -08:00
.caught
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonStatus
2013-05-07 23:02:15 -07:00
ld a, [hli]
push af
inc hl
ld a, [hli]
push af
ld a, [hl]
push af
push hl
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonItem
2013-05-07 23:02:15 -07:00
ld a, [hl]
push af
push hl
2018-01-23 14:39:09 -08:00
ld hl, wEnemySubStatus5
2013-05-07 23:02:15 -07:00
ld a, [hl]
push af
set SUBSTATUS_TRANSFORMED, [hl]
2017-12-19 16:04:56 -08:00
; 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.
2018-01-23 14:39:09 -08:00
; To fix, do not set [wTempEnemyMonSpecies] to DITTO.
bit SUBSTATUS_TRANSFORMED, a
2016-01-10 14:44:09 -08:00
jr nz, .ditto
jr .not_ditto
2013-05-07 23:02:15 -07:00
2016-01-10 14:44:09 -08:00
.ditto
2013-12-24 14:11:52 -08:00
ld a, DITTO
2018-01-23 14:39:09 -08:00
ld [wTempEnemyMonSpecies], a
2016-01-10 14:44:09 -08:00
jr .load_data
2013-05-07 23:02:15 -07:00
2016-01-10 14:44:09 -08:00
.not_ditto
set SUBSTATUS_TRANSFORMED, [hl]
ld hl, wEnemyBackupDVs
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonDVs]
2013-05-07 23:02:15 -07:00
ld [hli], a
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonDVs + 1]
2013-05-07 23:02:15 -07:00
ld [hl], a
2016-01-10 14:44:09 -08:00
.load_data
2018-01-23 14:39:09 -08:00
ld a, [wTempEnemyMonSpecies]
ld [wCurPartySpecies], a
ld a, [wEnemyMonLevel]
ld [wCurPartyLevel], a
2017-12-24 09:47:30 -08:00
farcall LoadEnemyMon
2013-05-07 23:02:15 -07:00
pop af
2018-01-23 14:39:09 -08:00
ld [wEnemySubStatus5], a
2013-05-07 23:02:15 -07:00
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
2018-01-23 14:39:09 -08:00
ld hl, wEnemySubStatus5
bit SUBSTATUS_TRANSFORMED, [hl]
jr nz, .Transformed
2015-11-09 13:41:09 -08:00
ld hl, wWildMonMoves
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonMoves
ld bc, NUM_MOVES
2013-05-07 23:02:15 -07:00
call CopyBytes
2015-11-09 13:41:09 -08:00
ld hl, wWildMonPP
2018-01-23 14:39:09 -08:00
ld de, wEnemyMonPP
ld bc, NUM_MOVES
2013-05-07 23:02:15 -07:00
call CopyBytes
2018-06-25 09:24:18 -07:00
.Transformed:
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonSpecies]
2015-11-09 13:41:09 -08:00
ld [wWildMon], a
2018-01-23 14:39:09 -08:00
ld [wCurPartySpecies], a
ld [wTempSpecies], a
2018-01-23 14:39:09 -08:00
ld a, [wBattleType]
cp BATTLETYPE_TUTORIAL
jp z, .FinishTutorial
farcall StubbedTrainerRankings_WildMonsCaught
2013-05-07 23:02:15 -07:00
ld hl, Text_GotchaMonWasCaught
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
call ClearSprites
ld a, [wTempSpecies]
2013-05-07 23:02:15 -07:00
dec a
2013-12-24 14:11:52 -08:00
call CheckCaughtMon
2013-05-07 23:02:15 -07:00
ld a, c
push af
ld a, [wTempSpecies]
2013-05-07 23:02:15 -07:00
dec a
2013-12-24 14:11:52 -08:00
call SetSeenAndCaughtMon
2013-05-07 23:02:15 -07:00
pop af
and a
jr nz, .skip_pokedex
2013-05-07 23:02:15 -07:00
call CheckReceivedDex
jr z, .skip_pokedex
ld hl, NewDexDataText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
call ClearSprites
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonSpecies]
ld [wTempSpecies], a
predef NewPokedexEntry
2013-05-07 23:02:15 -07:00
.skip_pokedex
2018-01-23 14:39:09 -08:00
ld a, [wBattleType]
cp BATTLETYPE_CONTEST
jp z, .catch_bug_contest_mon
cp BATTLETYPE_CELEBI
jr nz, .not_celebi
2015-10-24 07:34:19 -07:00
ld hl, wBattleResult
2018-04-05 08:44:02 -07:00
set BATTLERESULT_CAUGHT_CELEBI, [hl]
.not_celebi
2018-01-23 14:39:09 -08:00
ld a, [wPartyCount]
cp PARTY_LENGTH
jr z, .SendToPC
2013-12-24 14:11:52 -08:00
xor a ; PARTYMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
2013-05-07 23:02:15 -07:00
call ClearSprites
predef TryAddMonToParty
2013-05-07 23:02:15 -07:00
2017-12-24 09:47:30 -08:00
farcall SetCaughtData
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2013-12-24 14:11:52 -08:00
cp FRIEND_BALL
jr nz, .SkipPartyMonFriendBall
2013-12-24 14:11:52 -08:00
2018-01-23 14:39:09 -08:00
ld a, [wPartyCount]
2013-05-07 23:02:15 -07:00
dec a
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1Happiness
ld bc, PARTYMON_STRUCT_LENGTH
2013-05-07 23:02:15 -07:00
call AddNTimes
ld a, FRIEND_BALL_HAPPINESS
2013-05-07 23:02:15 -07:00
ld [hl], a
2018-06-25 09:24:18 -07:00
.SkipPartyMonFriendBall:
ld hl, AskGiveNicknameText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
ld [wNamedObjectIndex], a
2013-12-24 14:11:52 -08:00
call GetPokemonName
2013-05-07 23:02:15 -07:00
2013-12-03 23:49:12 -08:00
call YesNoBox
jp c, .return_from_capture
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wPartyCount]
2013-05-07 23:02:15 -07:00
dec a
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
ld hl, wPartyMonNicknames
2018-01-20 09:25:55 -08:00
ld bc, MON_NAME_LENGTH
2013-05-07 23:02:15 -07:00
call AddNTimes
ld d, h
ld e, l
push de
xor a ; PARTYMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
2018-09-16 13:02:58 -07:00
ld b, NAME_MON
2017-12-24 09:47:30 -08:00
farcall NamingScreen
2013-05-07 23:02:15 -07:00
2015-11-20 08:47:52 -08:00
call RotateThreePalettesRight
2013-05-07 23:02:15 -07:00
2015-11-04 13:14:27 -08:00
call LoadStandardFont
2013-05-07 23:02:15 -07:00
pop hl
2018-01-23 14:39:09 -08:00
ld de, wStringBuffer1
2013-07-29 20:58:02 -07:00
call InitName
2013-05-07 23:02:15 -07:00
jp .return_from_capture
2013-05-07 23:02:15 -07:00
.SendToPC:
2013-05-07 23:02:15 -07:00
call ClearSprites
predef SendMonIntoBox
2013-05-07 23:02:15 -07:00
2017-12-24 09:47:30 -08:00
farcall SetBoxMonCaughtData
2013-05-07 23:02:15 -07:00
ld a, BANK(sBoxCount)
call OpenSRAM
2013-05-07 23:02:15 -07:00
ld a, [sBoxCount]
cp MONS_PER_BOX
jr nz, .BoxNotFullYet
2015-10-24 07:34:19 -07:00
ld hl, wBattleResult
2018-04-05 08:44:02 -07:00
set BATTLERESULT_BOX_FULL, [hl]
.BoxNotFullYet:
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2013-12-24 14:11:52 -08:00
cp FRIEND_BALL
jr nz, .SkipBoxMonFriendBall
; The captured mon is now first in the box
ld a, FRIEND_BALL_HAPPINESS
ld [sBoxMon1Happiness], a
.SkipBoxMonFriendBall:
2013-05-07 23:02:15 -07:00
call CloseSRAM
ld hl, AskGiveNicknameText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
ld [wNamedObjectIndex], a
2013-12-24 14:11:52 -08:00
call GetPokemonName
2013-05-07 23:02:15 -07:00
2013-12-03 23:49:12 -08:00
call YesNoBox
jr c, .SkipBoxMonNickname
2013-05-07 23:02:15 -07:00
xor a
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
ld a, BOXMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
2015-12-18 17:07:09 -08:00
ld de, wMonOrItemNameBuffer
2018-09-16 13:02:58 -07:00
ld b, NAME_MON
2017-12-24 09:47:30 -08:00
farcall NamingScreen
2013-05-07 23:02:15 -07:00
2015-10-04 11:14:51 -07:00
ld a, BANK(sBoxMonNicknames)
call OpenSRAM
2013-05-07 23:02:15 -07:00
2015-12-18 17:07:09 -08:00
ld hl, wMonOrItemNameBuffer
2015-10-04 11:14:51 -07:00
ld de, sBoxMonNicknames
2018-01-20 09:25:55 -08:00
ld bc, MON_NAME_LENGTH
2013-05-07 23:02:15 -07:00
call CopyBytes
2015-10-04 11:14:51 -07:00
ld hl, sBoxMonNicknames
2018-01-23 14:39:09 -08:00
ld de, wStringBuffer1
2013-07-29 20:58:02 -07:00
call InitName
2013-05-07 23:02:15 -07:00
call CloseSRAM
.SkipBoxMonNickname:
2015-10-04 11:14:51 -07:00
ld a, BANK(sBoxMonNicknames)
call OpenSRAM
2013-05-07 23:02:15 -07:00
2015-10-04 11:14:51 -07:00
ld hl, sBoxMonNicknames
2015-12-18 17:07:09 -08:00
ld de, wMonOrItemNameBuffer
2018-01-20 09:25:55 -08:00
ld bc, MON_NAME_LENGTH
2013-05-07 23:02:15 -07:00
call CopyBytes
call CloseSRAM
ld hl, BallSentToPCText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
2015-11-20 08:47:52 -08:00
call RotateThreePalettesRight
2015-11-04 13:14:27 -08:00
call LoadStandardFont
jr .return_from_capture
2013-05-07 23:02:15 -07:00
.catch_bug_contest_mon
2017-12-24 09:47:30 -08:00
farcall BugContest_SetCaughtContestMon
jr .return_from_capture
2013-05-07 23:02:15 -07:00
.FinishTutorial:
ld hl, Text_GotchaMonWasCaught
2013-05-07 23:02:15 -07:00
.shake_and_break_free
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
call ClearSprites
.return_from_capture
2018-01-23 14:39:09 -08:00
ld a, [wBattleType]
2013-12-24 14:11:52 -08:00
cp BATTLETYPE_TUTORIAL
2013-05-07 23:02:15 -07:00
ret z
2015-09-09 16:27:07 -07:00
cp BATTLETYPE_DEBUG
2013-05-07 23:02:15 -07:00
ret z
cp BATTLETYPE_CONTEST
jr z, .used_park_ball
2013-12-24 14:11:52 -08:00
2015-11-09 13:41:09 -08:00
ld a, [wWildMon]
2013-05-07 23:02:15 -07:00
and a
jr z, .toss
2013-05-07 23:02:15 -07:00
2015-11-11 20:38:57 -08:00
call ClearBGPalettes
call ClearTilemap
2013-05-07 23:02:15 -07:00
.toss
2018-01-23 14:39:09 -08:00
ld hl, wNumItems
2013-05-07 23:02:15 -07:00
inc a
ld [wItemQuantityChange], a
2013-12-24 14:11:52 -08:00
jp TossItem
2013-05-07 23:02:15 -07:00
.used_park_ball
2015-11-08 10:27:26 -08:00
ld hl, wParkBallsRemaining
2013-05-07 23:02:15 -07:00
dec [hl]
ret
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
2018-01-10 19:53:42 -08:00
db -1 ; end
2013-05-08 00:27:46 -07:00
UltraBallMultiplier:
; multiply catch rate by 2
2013-05-08 00:27:46 -07:00
sla b
ret nc
ld b, $ff
ret
2014-10-23 23:43:50 -07:00
SafariBallMultiplier:
GreatBallMultiplier:
2014-10-23 23:43:50 -07:00
ParkBallMultiplier:
; multiply catch rate by 1.5
2013-05-08 00:27:46 -07:00
ld a, b
srl a
add b
ld b, a
ret nc
ld b, $ff
ret
HeavyBall_GetDexEntryBank:
; This function is buggy.
; It gets the wrong bank for Kadabra (64), Tauros (128), and Sunflora (192).
; Uncomment the line below to fix this.
2013-05-27 20:28:21 -07:00
push hl
push de
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonSpecies]
; dec a
2013-05-27 20:28:21 -07:00
rlca
rlca
2018-01-16 14:27:50 -08:00
maskbits NUM_DEX_ENTRY_BANKS
2013-05-27 20:28:21 -07:00
ld hl, .PokedexEntryBanks
ld d, 0
ld e, a
add hl, de
ld a, [hl]
pop de
pop hl
ret
2013-05-08 00:27:46 -07:00
.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")
2013-05-08 00:27:46 -07:00
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
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonSpecies]
2013-05-27 20:28:21 -07:00
ld hl, PokedexDataPointerTable
2013-05-08 00:27:46 -07:00
dec a
ld e, a
2013-05-27 20:28:21 -07:00
ld d, 0
2013-05-08 00:27:46 -07:00
add hl, de
add hl, de
2013-05-27 20:28:21 -07:00
ld a, BANK(PokedexDataPointerTable)
call GetFarWord
2013-05-08 00:27:46 -07:00
.SkipText:
call HeavyBall_GetDexEntryBank
2013-05-08 00:27:46 -07:00
call GetFarByte
inc hl
2013-05-27 20:28:21 -07:00
cp "@"
jr nz, .SkipText
2013-05-08 00:27:46 -07:00
call HeavyBall_GetDexEntryBank
2013-05-08 00:27:46 -07:00
push bc
inc hl
inc hl
call GetFarWord
2013-05-08 00:27:46 -07:00
srl h
rr l
ld b, h
ld c, l
2018-05-06 09:16:57 -07:00
rept 4
2013-05-08 00:27:46 -07:00
srl b
rr c
2018-05-06 09:16:57 -07:00
endr
call .subbc
2013-05-08 00:27:46 -07:00
srl b
rr c
call .subbc
2013-05-08 00:27:46 -07:00
ld a, h
pop bc
jr .compare
2013-05-08 00:27:46 -07:00
.subbc
; subtract bc from hl
2013-05-08 00:27:46 -07:00
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
2013-05-08 00:27:46 -07:00
ld c, a
cp HIGH(1024) ; 102.4 kg
jr c, .lightmon
2013-05-08 00:27:46 -07:00
ld hl, .WeightsTable
.lookup
2013-05-08 00:27:46 -07:00
ld a, c
cp [hl]
jr c, .heavymon
2013-05-08 00:27:46 -07:00
inc hl
inc hl
jr .lookup
2013-05-08 00:27:46 -07:00
.heavymon
2013-05-08 00:27:46 -07:00
inc hl
ld a, b
add [hl]
ld b, a
ret nc
ld b, $ff
ret
.lightmon
2013-05-08 00:27:46 -07:00
ld a, b
2013-05-27 20:28:21 -07:00
sub 20
2013-05-08 00:27:46 -07:00
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
2013-05-08 00:27:46 -07:00
LureBallMultiplier:
; multiply catch rate by 3 if this is a fishing rod battle
2018-01-23 14:39:09 -08:00
ld a, [wBattleType]
cp BATTLETYPE_FISH
2013-05-08 00:27:46 -07:00
ret nz
2013-05-08 00:27:46 -07:00
ld a, b
add a
jr c, .max
2013-05-08 00:27:46 -07:00
add b
jr nc, .done
.max
2013-05-08 00:27:46 -07:00
ld a, $ff
.done
2013-05-08 00:27:46 -07:00
ld b, a
ret
MoonBallMultiplier:
; This function is buggy.
; Intent: multiply catch rate by 4 if mon evolves with moon stone
; Reality: no boost
2013-05-08 00:27:46 -07:00
push bc
2018-01-23 14:39:09 -08:00
ld a, [wTempEnemyMonSpecies]
2013-05-08 00:27:46 -07:00
dec a
ld c, a
ld b, 0
ld hl, EvosAttacksPointers
2013-05-08 00:27:46 -07:00
add hl, bc
add hl, bc
ld a, BANK(EvosAttacksPointers)
call GetFarWord
2013-05-08 00:27:46 -07:00
pop bc
2013-05-08 00:27:46 -07:00
push bc
ld a, BANK("Evolutions and Attacks")
2013-05-08 00:27:46 -07:00
call GetFarByte
cp EVOLVE_ITEM
2013-05-08 00:27:46 -07:00
pop bc
ret nz
2013-05-08 00:27:46 -07:00
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×.
2013-05-08 00:27:46 -07:00
push bc
ld a, BANK("Evolutions and Attacks")
2013-05-08 00:27:46 -07:00
call GetFarByte
2014-10-23 23:43:50 -07:00
cp MOON_STONE_RED ; BURN_HEAL
2013-05-08 00:27:46 -07:00
pop bc
ret nz
sla b
jr c, .max
sla b
jr nc, .done
.max
2013-05-08 00:27:46 -07:00
ld b, $ff
.done
2013-05-08 00:27:46 -07:00
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
2013-05-08 00:27:46 -07:00
; does species match?
2018-01-23 14:39:09 -08:00
ld a, [wTempEnemyMonSpecies]
2013-05-08 00:27:46 -07:00
ld c, a
2018-01-23 14:39:09 -08:00
ld a, [wTempBattleMonSpecies]
2013-05-08 00:27:46 -07:00
cp c
ret nz
2013-08-03 13:19:29 -07:00
; check player mon species
2013-05-08 00:27:46 -07:00
push bc
2018-01-23 14:39:09 -08:00
ld a, [wTempBattleMonSpecies]
ld [wCurPartySpecies], a
xor a ; PARTYMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
ld a, [wCurBattleMon]
ld [wCurPartyMon], a
farcall GetGender
jr c, .done1 ; no effect on genderless
2013-05-08 00:27:46 -07:00
ld d, 0 ; male
jr nz, .playermale
inc d ; female
.playermale
2013-08-03 13:19:29 -07:00
; check wild mon species
2013-05-08 00:27:46 -07:00
push de
2018-01-23 14:39:09 -08:00
ld a, [wTempEnemyMonSpecies]
ld [wCurPartySpecies], a
ld a, WILDMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
farcall GetGender
jr c, .done2 ; no effect on genderless
2013-05-08 00:27:46 -07:00
ld d, 0 ; male
jr nz, .wildmale
inc d ; female
.wildmale
2013-08-03 13:19:29 -07:00
2013-05-08 00:27:46 -07:00
ld a, d
pop de
cp d
pop bc
2017-12-12 17:15:07 -08:00
ret nz ; for the intended effect, this should be "ret z"
2013-08-03 13:19:29 -07:00
2013-05-08 00:27:46 -07:00
sla b
jr c, .max
2013-05-08 00:27:46 -07:00
sla b
jr c, .max
2013-05-08 00:27:46 -07:00
sla b
ret nc
.max
2013-05-08 00:27:46 -07:00
ld b, $ff
ret
.done2
2013-05-08 00:27:46 -07:00
pop de
.done1
2013-05-08 00:27:46 -07:00
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.
2018-01-23 14:39:09 -08:00
ld a, [wTempEnemyMonSpecies]
2013-05-08 00:27:46 -07:00
ld c, a
2013-12-24 14:19:39 -08:00
ld hl, FleeMons
ld d, 3
2013-05-08 00:27:46 -07:00
2013-12-24 14:19:39 -08:00
.loop
ld a, BANK(FleeMons)
2013-05-08 00:27:46 -07:00
call GetFarByte
inc hl
2013-12-24 14:19:39 -08:00
cp -1
jr z, .next
2013-05-08 00:27:46 -07:00
cp c
2017-12-12 17:15:07 -08:00
jr nz, .next ; for the intended effect, this should be "jr nz, .loop"
2013-05-08 00:27:46 -07:00
sla b
2013-12-24 14:19:39 -08:00
jr c, .max
2013-05-08 00:27:46 -07:00
sla b
ret nc
2013-12-24 14:19:39 -08:00
.max
2013-05-08 00:27:46 -07:00
ld b, $ff
ret
2013-12-24 14:19:39 -08:00
.next
2013-05-08 00:27:46 -07:00
dec d
2013-12-24 14:19:39 -08:00
jr nz, .loop
2013-05-08 00:27:46 -07:00
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
2018-01-23 14:39:09 -08:00
ld a, [wBattleMonLevel]
2013-05-08 00:27:46 -07:00
ld c, a
2018-01-23 14:39:09 -08:00
ld a, [wEnemyMonLevel]
2013-05-08 00:27:46 -07:00
cp c
ret nc ; if player is lower level, we're done here
2013-05-08 00:27:46 -07:00
sla b
jr c, .max
2013-05-08 00:27:46 -07:00
srl c
cp c
ret nc ; if player/2 is lower level, we're done here
2013-05-08 00:27:46 -07:00
sla b
jr c, .max
2013-05-08 00:27:46 -07:00
srl c
cp c
ret nc ; if player/4 is lower level, we're done here
2013-05-08 00:27:46 -07:00
sla b
ret nc
.max
2013-05-08 00:27:46 -07:00
ld b, $ff
ret
; BallDodgedText and BallMissedText were used in Gen 1.
BallDodgedText: ; unreferenced
text_far _BallDodgedText
text_end
2013-12-24 14:11:52 -08:00
BallMissedText: ; unreferenced
text_far _BallMissedText
text_end
2013-12-24 14:11:52 -08:00
BallBrokeFreeText:
text_far _BallBrokeFreeText
text_end
2013-12-24 14:11:52 -08:00
BallAppearedCaughtText:
text_far _BallAppearedCaughtText
text_end
2013-12-24 14:11:52 -08:00
BallAlmostHadItText:
text_far _BallAlmostHadItText
text_end
2013-12-24 14:11:52 -08:00
BallSoCloseText:
text_far _BallSoCloseText
text_end
2013-12-24 14:11:52 -08:00
Text_GotchaMonWasCaught:
2013-12-24 14:11:52 -08:00
; Gotcha! @ was caught!@ @
text_far Text_BallCaught
text_asm
2013-12-24 14:11:52 -08:00
call WaitSFX
push bc
ld de, MUSIC_NONE
call PlayMusic
call DelayFrame
ld de, MUSIC_CAPTURE
call PlayMusic
pop bc
ld hl, WaitButtonText
2013-12-24 14:11:52 -08:00
ret
WaitButtonText:
text_far _WaitButtonText
text_end
2013-12-24 14:11:52 -08:00
BallSentToPCText:
text_far _BallSentToPCText
text_end
2013-12-24 14:11:52 -08:00
NewDexDataText:
text_far _NewDexDataText
text_end
2013-12-24 14:11:52 -08:00
AskGiveNicknameText:
text_far _AskGiveNicknameText
text_end
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
ReturnToBattle_UseBall:
2017-12-24 09:47:30 -08:00
farcall _ReturnToBattle_UseBall
2013-10-01 21:53:35 -07:00
ret
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
TownMapEffect:
2017-12-24 09:47:30 -08:00
farcall PokegearMap
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
BicycleEffect:
2017-12-24 09:47:30 -08:00
farcall BikeFunction
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
EvoStoneEffect:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_EVO_STONE
call UseItem_SelectMon
2013-05-07 23:02:15 -07:00
jp c, .DecidedNotToUse
2013-05-07 23:02:15 -07:00
ld a, MON_ITEM
2013-05-07 23:02:15 -07:00
call GetPartyParamLocation
ld a, [hl]
2013-12-24 14:11:52 -08:00
cp EVERSTONE
jr z, .NoEffect
2013-12-24 14:11:52 -08:00
2020-06-20 08:56:18 -07:00
ld a, TRUE
ld [wForceEvolution], a
2017-12-24 09:47:30 -08:00
farcall EvolvePokemon
2013-05-07 23:02:15 -07:00
2015-11-23 13:04:53 -08:00
ld a, [wMonTriedToEvolve]
2013-05-07 23:02:15 -07:00
and a
jr z, .NoEffect
2013-12-24 14:11:52 -08:00
jp UseDisposableItem
2013-05-07 23:02:15 -07:00
.NoEffect:
call WontHaveAnyEffectMessage
2013-05-07 23:02:15 -07:00
.DecidedNotToUse:
2013-05-07 23:02:15 -07:00
xor a
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
VitaminEffect:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
2013-05-07 23:02:15 -07:00
jp c, RareCandy_StatBooster_ExitMenu
2013-05-07 23:02:15 -07:00
call RareCandy_StatBooster_GetParameters
2013-05-07 23:02:15 -07:00
call GetStatExpRelativePointer
2013-05-07 23:02:15 -07:00
ld a, MON_STAT_EXP
2013-05-07 23:02:15 -07:00
call GetPartyParamLocation
add hl, bc
ld a, [hl]
2013-12-24 14:11:52 -08:00
cp 100
jr nc, NoEffectMessage
2013-12-24 14:11:52 -08:00
add 10
2013-05-07 23:02:15 -07:00
ld [hl], a
call UpdateStatsAfterItem
2013-05-07 23:02:15 -07:00
call GetStatExpRelativePointer
2013-05-07 23:02:15 -07:00
ld hl, StatStrings
2013-05-07 23:02:15 -07:00
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
2018-01-23 14:39:09 -08:00
ld de, wStringBuffer2
2015-10-12 09:33:24 -07:00
ld bc, ITEM_NAME_LENGTH
2013-05-07 23:02:15 -07:00
call CopyBytes
2015-10-10 04:45:39 -07:00
call Play_SFX_FULL_HEAL
2013-05-07 23:02:15 -07:00
ld hl, ItemStatRoseText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
2015-10-12 09:33:24 -07:00
ld c, HAPPINESS_USEDITEM
2017-12-24 09:47:30 -08:00
farcall ChangeHappiness
2013-05-07 23:02:15 -07:00
jp UseDisposableItem
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
NoEffectMessage:
ld hl, ItemWontHaveEffectText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
jp ClearPalettes
2018-06-24 07:09:41 -07:00
UpdateStatsAfterItem:
ld a, MON_MAXHP
2013-12-24 14:11:52 -08:00
call GetPartyParamLocation
ld d, h
ld e, l
2015-12-21 11:10:16 -08:00
ld a, MON_STAT_EXP - 1
2013-12-24 14:11:52 -08:00
call GetPartyParamLocation
ld b, TRUE
predef_jump CalcMonStats
2013-12-24 14:11:52 -08:00
2018-06-24 07:09:41 -07:00
RareCandy_StatBooster_ExitMenu:
2013-12-24 14:11:52 -08:00
xor a
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
2013-12-24 14:11:52 -08:00
jp ClearPalettes
ItemStatRoseText:
text_far _ItemStatRoseText
text_end
2013-12-24 14:11:52 -08:00
2018-06-24 07:09:41 -07:00
StatStrings:
2013-12-24 14:11:52 -08:00
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@"
2018-06-24 07:09:41 -07:00
GetStatExpRelativePointer:
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2020-06-22 13:30:13 -07:00
ld hl, StatExpItemPointerOffsets
2013-12-24 14:11:52 -08:00
.next
cp [hl]
inc hl
jr z, .got_it
2013-12-24 14:11:52 -08:00
inc hl
jr .next
.got_it
2013-12-24 14:11:52 -08:00
ld a, [hl]
ld c, a
ld b, 0
ret
2020-06-22 13:30:13 -07:00
StatExpItemPointerOffsets:
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
2013-12-24 14:11:52 -08:00
2018-06-24 07:09:41 -07:00
RareCandy_StatBooster_GetParameters:
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
ld [wCurSpecies], a
ld [wTempSpecies], a
ld a, MON_LEVEL
2013-12-24 14:11:52 -08:00
call GetPartyParamLocation
ld a, [hl]
2018-01-23 14:39:09 -08:00
ld [wCurPartyLevel], a
2013-12-24 14:11:52 -08:00
call GetBaseData
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
ld hl, wPartyMonNicknames
call GetNickname
2013-12-24 14:11:52 -08:00
ret
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
RareCandyEffect:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
2013-05-07 23:02:15 -07:00
jp c, RareCandy_StatBooster_ExitMenu
2013-05-07 23:02:15 -07:00
call RareCandy_StatBooster_GetParameters
2013-05-07 23:02:15 -07:00
ld a, MON_LEVEL
2013-05-07 23:02:15 -07:00
call GetPartyParamLocation
ld a, [hl]
2014-06-03 14:07:10 -07:00
cp MAX_LEVEL
jp nc, NoEffectMessage
2013-12-24 14:11:52 -08:00
2013-05-07 23:02:15 -07:00
inc a
ld [hl], a
2018-01-23 14:39:09 -08:00
ld [wCurPartyLevel], a
2013-05-07 23:02:15 -07:00
push de
ld d, a
2017-12-24 09:47:30 -08:00
farcall CalcExpAtLevel
2013-05-07 23:02:15 -07:00
pop de
ld a, MON_EXP
2013-05-07 23:02:15 -07:00
call GetPartyParamLocation
ldh a, [hMultiplicand + 0]
2013-05-07 23:02:15 -07:00
ld [hli], a
ldh a, [hMultiplicand + 1]
2013-05-07 23:02:15 -07:00
ld [hli], a
ldh a, [hMultiplicand + 2]
2013-05-07 23:02:15 -07:00
ld [hl], a
2013-12-24 14:11:52 -08:00
ld a, MON_MAXHP
2013-05-07 23:02:15 -07:00
call GetPartyParamLocation
ld a, [hli]
ld b, a
ld c, [hl]
push bc
call UpdateStatsAfterItem
2013-05-07 23:02:15 -07:00
ld a, MON_MAXHP + 1
2013-05-07 23:02:15 -07:00
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
2017-12-24 09:47:30 -08:00
farcall LevelUpHappinessMod
2013-05-07 23:02:15 -07:00
2015-11-08 07:59:28 -08:00
ld a, PARTYMENUTEXT_LEVEL_UP
call ItemActionText
2013-05-07 23:02:15 -07:00
xor a ; PARTYMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
predef CopyMonToTempMon
2013-05-07 23:02:15 -07:00
hlcoord 9, 0
ld b, 10
ld c, 9
2019-04-08 05:15:10 -07:00
call Textbox
2013-05-07 23:02:15 -07:00
hlcoord 11, 1
2018-01-09 12:39:48 -08:00
ld bc, 4
predef PrintTempMonStats
2013-05-07 23:02:15 -07:00
call WaitPressAorB_BlinkCursor
2013-05-07 23:02:15 -07:00
xor a ; PARTYMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
ld a, [wCurPartySpecies]
ld [wTempSpecies], a
predef LearnLevelMoves
2013-05-07 23:02:15 -07:00
xor a
ld [wForceEvolution], a
2017-12-24 09:47:30 -08:00
farcall EvolvePokemon
2013-05-07 23:02:15 -07:00
jp UseDisposableItem
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
HealPowderEffect:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
2013-05-07 23:02:15 -07:00
jp c, StatusHealer_ExitMenu
2013-05-07 23:02:15 -07:00
call UseStatusHealer
2020-10-04 16:43:28 -07:00
cp FALSE
jr nz, .not_used
2013-05-07 23:02:15 -07:00
2015-10-12 09:33:24 -07:00
ld c, HAPPINESS_BITTERPOWDER
2017-12-24 09:47:30 -08:00
farcall ChangeHappiness
call LooksBitterMessage
2013-05-07 23:02:15 -07:00
ld a, $0
2020-10-04 16:43:28 -07:00
.not_used
jp StatusHealer_Jumptable
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
StatusHealingEffect:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
FullyHealStatus:
call UseStatusHealer
jp StatusHealer_Jumptable
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
UseStatusHealer:
call IsMonFainted
2020-10-04 16:43:28 -07:00
ld a, TRUE
ret z
2015-11-08 07:59:28 -08:00
call GetItemHealingAction
ld a, MON_STATUS
call GetPartyParamLocation
ld a, [hl]
and c
2015-11-08 07:59:28 -08:00
jr nz, .good
call IsItemUsedOnConfusedMon
2020-10-04 16:43:28 -07:00
ld a, TRUE
ret nc
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUTEXT_HEAL_CONFUSION
.good
xor a
ld [hl], a
ld a, b
2018-01-23 14:39:09 -08:00
ld [wPartyMenuActionText], a
2015-11-08 07:59:28 -08:00
call HealStatus
2015-10-10 04:45:39 -07:00
call Play_SFX_FULL_HEAL
call ItemActionTextWaitButton
call UseDisposableItem
2020-10-04 16:43:28 -07:00
ld a, FALSE
ret
2018-06-24 07:09:41 -07:00
IsItemUsedOnConfusedMon:
call IsItemUsedOnBattleMon
2015-11-08 07:59:28 -08:00
jr nc, .nope
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus3]
2015-11-08 07:59:28 -08:00
bit SUBSTATUS_CONFUSED, a
jr z, .nope
ld a, c
cp $ff
2015-11-08 07:59:28 -08:00
jr nz, .nope
scf
ret
2015-11-08 07:59:28 -08:00
.nope
and a
ret
2018-06-24 07:09:41 -07:00
BattlemonRestoreHealth:
call IsItemUsedOnBattleMon
ret nc
ld a, MON_HP
call GetPartyParamLocation
ld a, [hli]
2018-01-23 14:39:09 -08:00
ld [wBattleMonHP], a
ld a, [hld]
2018-01-23 14:39:09 -08:00
ld [wBattleMonHP + 1], a
ret
2018-06-24 07:09:41 -07:00
HealStatus:
call IsItemUsedOnBattleMon
ret nc
xor a
2018-01-23 14:39:09 -08:00
ld [wBattleMonStatus], a
ld hl, wPlayerSubStatus5
2015-11-08 07:59:28 -08:00
res SUBSTATUS_TOXIC, [hl]
2018-01-23 14:39:09 -08:00
ld hl, wPlayerSubStatus1
2015-11-08 07:59:28 -08:00
res SUBSTATUS_NIGHTMARE, [hl]
call GetItemHealingAction
ld a, c
2015-11-08 07:59:28 -08:00
cp %11111111
jr nz, .not_full_heal
2018-01-23 14:39:09 -08:00
ld hl, wPlayerSubStatus3
2015-11-08 07:59:28 -08:00
res SUBSTATUS_CONFUSED, [hl]
.not_full_heal
push bc
2017-12-24 09:47:30 -08:00
farcall CalcPlayerStats
pop bc
ret
2018-06-24 07:09:41 -07:00
GetItemHealingAction:
push hl
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2018-01-10 22:45:27 -08:00
ld hl, StatusHealingActions
2013-12-24 14:11:52 -08:00
ld bc, 3
.next
cp [hl]
2015-11-08 07:59:28 -08:00
jr z, .found_it
add hl, bc
2013-12-24 14:11:52 -08:00
jr .next
2015-11-08 07:59:28 -08:00
.found_it
inc hl
ld b, [hl]
inc hl
ld a, [hl]
ld c, a
2013-12-24 14:11:52 -08:00
cp %11111111
pop hl
ret
2018-01-10 22:45:27 -08:00
INCLUDE "data/items/heal_status.asm"
2018-06-24 07:09:41 -07:00
StatusHealer_Jumptable:
2015-12-26 18:59:03 -08:00
ld hl, .dw
2013-12-24 14:11:52 -08:00
rst JumpTable
ret
2018-06-24 07:09:41 -07:00
.dw
dw StatusHealer_ClearPalettes
dw StatusHealer_NoEffect
dw StatusHealer_ExitMenu
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
RevivalHerbEffect:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
2013-05-07 23:02:15 -07:00
call RevivePokemon
2020-10-04 16:43:28 -07:00
cp FALSE
jr nz, .not_used
2013-12-24 14:11:52 -08:00
2015-10-12 09:33:24 -07:00
ld c, HAPPINESS_REVIVALHERB
2017-12-24 09:47:30 -08:00
farcall ChangeHappiness
call LooksBitterMessage
2013-05-07 23:02:15 -07:00
2020-10-04 16:43:28 -07:00
ld a, $0
.not_used
jp StatusHealer_Jumptable
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
ReviveEffect:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
2013-05-07 23:02:15 -07:00
call RevivePokemon
jp StatusHealer_Jumptable
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
RevivePokemon:
call IsMonFainted
2020-10-04 16:43:28 -07:00
ld a, TRUE
2013-12-24 14:11:52 -08:00
ret nz
ld a, [wBattleMode]
2013-12-24 14:11:52 -08:00
and a
jr z, .skip_to_revive
2013-12-24 14:11:52 -08:00
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
2013-12-24 14:11:52 -08:00
ld c, a
ld d, 0
2016-01-12 09:46:18 -08:00
ld hl, wBattleParticipantsIncludingFainted
2013-12-24 14:11:52 -08:00
ld b, CHECK_FLAG
predef SmallFarFlagAction
2013-12-24 14:11:52 -08:00
ld a, c
and a
jr z, .skip_to_revive
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
2013-12-24 14:11:52 -08:00
ld c, a
2015-11-07 18:04:54 -08:00
ld hl, wBattleParticipantsNotFainted
2013-12-24 14:11:52 -08:00
ld b, SET_FLAG
predef SmallFarFlagAction
2013-12-24 14:11:52 -08:00
.skip_to_revive
2013-12-24 14:11:52 -08:00
xor a
ld [wLowHealthAlarm], a
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2013-12-24 14:11:52 -08:00
cp REVIVE
jr z, .revive_half_hp
2013-05-07 23:02:15 -07:00
call ReviveFullHP
jr .finish_revive
2013-05-07 23:02:15 -07:00
.revive_half_hp
call ReviveHalfHP
2013-05-07 23:02:15 -07:00
.finish_revive
call HealHP_SFX_GFX
2015-11-08 07:59:28 -08:00
ld a, PARTYMENUTEXT_REVIVE
2018-01-23 14:39:09 -08:00
ld [wPartyMenuActionText], a
call ItemActionTextWaitButton
call UseDisposableItem
2020-10-04 16:43:28 -07:00
ld a, FALSE
2013-12-24 14:11:52 -08:00
ret
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
FullRestoreEffect:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, StatusHealer_ExitMenu
2013-05-07 23:02:15 -07:00
call IsMonFainted
jp z, StatusHealer_NoEffect
2013-05-07 23:02:15 -07:00
call IsMonAtFullHealth
jr c, .NotAtFullHealth
2013-05-07 23:02:15 -07:00
jp FullyHealStatus
2013-05-07 23:02:15 -07:00
.NotAtFullHealth:
call .FullRestore
jp StatusHealer_Jumptable
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
.FullRestore:
2013-12-24 14:11:52 -08:00
xor a
ld [wLowHealthAlarm], a
call ReviveFullHP
ld a, MON_STATUS
2013-12-24 14:11:52 -08:00
call GetPartyParamLocation
xor a
ld [hli], a
ld [hl], a
2015-11-08 07:59:28 -08:00
call HealStatus
call BattlemonRestoreHealth
call HealHP_SFX_GFX
2015-11-08 07:59:28 -08:00
ld a, PARTYMENUTEXT_HEAL_HP
2018-01-23 14:39:09 -08:00
ld [wPartyMenuActionText], a
call ItemActionTextWaitButton
call UseDisposableItem
2013-12-24 14:11:52 -08:00
ld a, 0
ret
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
BitterBerryEffect:
2018-01-23 14:39:09 -08:00
ld hl, wPlayerSubStatus3
2013-12-24 14:11:52 -08:00
bit SUBSTATUS_CONFUSED, [hl]
ld a, 1
jr z, .done
res SUBSTATUS_CONFUSED, [hl]
2013-05-07 23:02:15 -07:00
xor a
ldh [hBattleTurn], a
call UseItemText
2013-05-07 23:02:15 -07:00
2013-12-24 14:11:52 -08:00
ld hl, ConfusedNoMoreText
2019-04-08 05:15:10 -07:00
call StdBattleTextbox
2013-05-07 23:02:15 -07:00
2013-12-24 14:11:52 -08:00
ld a, 0
2013-05-07 23:02:15 -07:00
2013-12-24 14:11:52 -08:00
.done
jp StatusHealer_Jumptable
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
RestoreHPEffect:
call ItemRestoreHP
jp StatusHealer_Jumptable
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
EnergypowderEffect:
2015-10-12 09:33:24 -07:00
ld c, HAPPINESS_BITTERPOWDER
jr EnergypowderEnergyRootCommon
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
EnergyRootEffect:
2015-10-12 09:33:24 -07:00
ld c, HAPPINESS_ENERGYROOT
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
EnergypowderEnergyRootCommon:
2013-05-07 23:02:15 -07:00
push bc
call ItemRestoreHP
2013-05-07 23:02:15 -07:00
pop bc
2013-12-24 14:11:52 -08:00
cp 0
jr nz, .skip_happiness
2013-05-07 23:02:15 -07:00
2017-12-24 09:47:30 -08:00
farcall ChangeHappiness
call LooksBitterMessage
2013-12-24 14:11:52 -08:00
ld a, 0
2013-05-07 23:02:15 -07:00
.skip_happiness
jp StatusHealer_Jumptable
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
ItemRestoreHP:
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
2013-12-24 14:11:52 -08:00
ld a, 2
ret c
2013-12-24 14:11:52 -08:00
call IsMonFainted
2013-12-24 14:11:52 -08:00
ld a, 1
ret z
2013-12-24 14:11:52 -08:00
call IsMonAtFullHealth
2013-12-24 14:11:52 -08:00
ld a, 1
ret nc
2013-12-24 14:11:52 -08:00
xor a
ld [wLowHealthAlarm], a
call GetHealingItemAmount
call RestoreHealth
call BattlemonRestoreHealth
call HealHP_SFX_GFX
2015-11-08 07:59:28 -08:00
ld a, PARTYMENUTEXT_HEAL_HP
2018-01-23 14:39:09 -08:00
ld [wPartyMenuActionText], a
call ItemActionTextWaitButton
call UseDisposableItem
2013-12-24 14:11:52 -08:00
ld a, 0
ret
2018-06-24 07:09:41 -07:00
HealHP_SFX_GFX:
push de
2013-12-24 14:11:52 -08:00
ld de, SFX_POTION
call WaitPlaySFX
pop de
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
hlcoord 11, 0
ld bc, SCREEN_WIDTH * 2
call AddNTimes
ld a, $2
ld [wWhichHPBar], a
predef_jump AnimateHPBar
2018-06-24 07:09:41 -07:00
UseItem_SelectMon:
2015-11-08 07:59:28 -08:00
call .SelectMon
ret c
2013-12-24 14:11:52 -08:00
2018-01-23 14:39:09 -08:00
ld a, [wCurPartySpecies]
2013-12-24 14:11:52 -08:00
cp EGG
2015-11-08 07:59:28 -08:00
jr nz, .not_egg
2013-12-24 14:11:52 -08:00
call CantUseOnEggMessage
scf
ret
2013-12-24 14:11:52 -08:00
2015-11-08 07:59:28 -08:00
.not_egg
and a
ret
2018-06-24 07:09:41 -07:00
.SelectMon:
ld a, b
2018-01-23 14:39:09 -08:00
ld [wPartyMenuActionText], a
push hl
push de
push bc
2015-11-11 20:38:57 -08:00
call ClearBGPalettes
call ChooseMonToUseItemOn
pop bc
pop de
pop hl
ret
2018-06-24 07:09:41 -07:00
ChooseMonToUseItemOn:
2017-12-24 09:47:30 -08:00
farcall LoadPartyMenuGFX
farcall InitPartyMenuWithCancel
farcall InitPartyMenuGFX
farcall WritePartyMenuTilemap
farcall PrintPartyMenuText
call WaitBGMap
2015-09-09 16:27:07 -07:00
call SetPalettes
call DelayFrame
2017-12-24 09:47:30 -08:00
farcall PartyMenuSelect
ret
2018-06-24 07:09:41 -07:00
ItemActionText:
2018-01-23 14:39:09 -08:00
ld [wPartyMenuActionText], a
ld a, [wCurPartySpecies]
push af
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
push af
push hl
push de
push bc
2017-12-24 09:47:30 -08:00
farcall WritePartyMenuTilemap
farcall PrintPartyMenuActionText
call WaitBGMap
2015-09-09 16:27:07 -07:00
call SetPalettes
call DelayFrame
pop bc
pop de
pop hl
pop af
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
pop af
2018-01-23 14:39:09 -08:00
ld [wCurPartySpecies], a
ret
2018-06-24 07:09:41 -07:00
ItemActionTextWaitButton:
xor a
ldh [hBGMapMode], a
hlcoord 0, 0
ld bc, wTilemapEnd - wTilemap
2013-12-24 14:11:52 -08:00
ld a, " "
call ByteFill
2018-01-23 14:39:09 -08:00
ld a, [wPartyMenuActionText]
call ItemActionText
ld a, $1
ldh [hBGMapMode], a
ld c, 50
call DelayFrames
jp WaitPressAorB_BlinkCursor
2018-06-24 07:09:41 -07:00
StatusHealer_NoEffect:
call WontHaveAnyEffectMessage
jr StatusHealer_ClearPalettes
2018-06-24 07:09:41 -07:00
StatusHealer_ExitMenu:
xor a
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
2018-06-24 07:09:41 -07:00
StatusHealer_ClearPalettes:
call ClearPalettes
ret
2018-06-24 07:09:41 -07:00
IsItemUsedOnBattleMon:
ld a, [wBattleMode]
and a
ret z
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
push hl
2018-01-23 14:39:09 -08:00
ld hl, wCurBattleMon
cp [hl]
pop hl
jr nz, .nope
scf
ret
.nope
xor a
ret
2018-06-24 07:09:41 -07:00
ReviveHalfHP:
call LoadHPFromBuffer1
srl d
rr e
jr ContinueRevive
2018-06-24 07:09:41 -07:00
ReviveFullHP:
call LoadHPFromBuffer1
2018-06-24 07:09:41 -07:00
ContinueRevive:
ld a, MON_HP
call GetPartyParamLocation
ld [hl], d
inc hl
ld [hl], e
jp LoadCurHPIntoBuffer3
2018-06-24 07:09:41 -07:00
RestoreHealth:
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 LoadCurHPIntoBuffer3
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
2018-06-24 07:09:41 -07:00
RemoveHP:
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 LoadCurHPIntoBuffer3
ret
2018-06-24 07:09:41 -07:00
IsMonFainted:
push de
call LoadMaxHPIntoBuffer1
call LoadCurHPIntoBuffer2
call LoadHPFromBuffer2
ld a, d
or e
pop de
ret
2018-06-24 07:09:41 -07:00
IsMonAtFullHealth:
call LoadHPFromBuffer2
ld h, d
ld l, e
call LoadHPFromBuffer1
ld a, l
sub e
ld a, h
sbc d
ret
LoadCurHPIntoBuffer3:
ld a, MON_HP
call GetPartyParamLocation
ld a, [hli]
ld [wHPBuffer3 + 1], a
ld a, [hl]
ld [wHPBuffer3], a
ret
LoadHPIntoBuffer3: ; unreferenced
2013-12-24 14:11:52 -08:00
ld a, d
ld [wHPBuffer3 + 1], a
2013-12-24 14:11:52 -08:00
ld a, e
ld [wHPBuffer3], a
2013-12-24 14:11:52 -08:00
ret
LoadHPFromBuffer3: ; unreferenced
ld a, [wHPBuffer3 + 1]
2013-12-24 14:11:52 -08:00
ld d, a
ld a, [wHPBuffer3]
2013-12-24 14:11:52 -08:00
ld e, a
ret
LoadCurHPIntoBuffer2:
ld a, MON_HP
call GetPartyParamLocation
ld a, [hli]
ld [wHPBuffer2 + 1], a
ld a, [hl]
ld [wHPBuffer2], a
ret
LoadHPFromBuffer2:
ld a, [wHPBuffer2 + 1]
ld d, a
ld a, [wHPBuffer2]
ld e, a
ret
LoadMaxHPIntoBuffer1:
push hl
ld a, MON_MAXHP
call GetPartyParamLocation
ld a, [hli]
ld [wHPBuffer1 + 1], a
ld a, [hl]
ld [wHPBuffer1], a
pop hl
ret
2018-06-24 07:09:41 -07:00
LoadHPFromBuffer1:
ld a, [wHPBuffer1 + 1]
ld d, a
ld a, [wHPBuffer1]
ld e, a
ret
2018-06-24 07:09:41 -07:00
GetOneFifthMaxHP:
push bc
ld a, MON_MAXHP
call GetPartyParamLocation
ld a, [hli]
ldh [hDividend + 0], a
ld a, [hl]
ldh [hDividend + 1], a
ld a, 5
ldh [hDivisor], a
ld b, 2
call Divide
ldh a, [hQuotient + 2]
ld d, a
ldh a, [hQuotient + 3]
ld e, a
pop bc
ret
2018-06-24 07:09:41 -07:00
GetHealingItemAmount:
push hl
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2018-01-10 22:45:27 -08:00
ld hl, HealingHPAmounts
ld d, a
2013-12-24 14:11:52 -08:00
.next
ld a, [hli]
2013-12-24 14:11:52 -08:00
cp -1
jr z, .NotFound
cp d
2013-12-24 14:11:52 -08:00
jr z, .done
inc hl
inc hl
2013-12-24 14:11:52 -08:00
jr .next
.NotFound:
scf
2013-12-24 14:11:52 -08:00
.done
ld e, [hl]
inc hl
ld d, [hl]
pop hl
ret
2018-01-10 22:45:27 -08:00
INCLUDE "data/items/heal_hp.asm"
2018-06-24 07:09:41 -07:00
Softboiled_MilkDrinkFunction:
; Softboiled/Milk Drink in the field
2015-12-23 11:00:29 -08:00
ld a, [wPartyMenuCursor]
dec a
ld b, a
call .SelectMilkDrinkRecipient ; select pokemon
jr c, .skip
ld a, b
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
call IsMonFainted
call GetOneFifthMaxHP
call RemoveHP
push bc
call HealHP_SFX_GFX
pop bc
call GetOneFifthMaxHP
ld a, c
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
call IsMonFainted
call RestoreHealth
call HealHP_SFX_GFX
2015-11-08 07:59:28 -08:00
ld a, PARTYMENUTEXT_HEAL_HP
call ItemActionText
call JoyWaitAorB
.skip
ld a, b
inc a
2015-12-23 11:00:29 -08:00
ld [wPartyMenuCursor], a
ret
2018-06-24 07:09:41 -07:00
.SelectMilkDrinkRecipient:
2015-11-08 07:59:28 -08:00
.loop
push bc
2015-11-08 07:59:28 -08:00
ld a, PARTYMENUACTION_HEALING_ITEM
2018-01-23 14:39:09 -08:00
ld [wPartyMenuActionText], a
call ChooseMonToUseItemOn
pop bc
2015-11-08 07:59:28 -08:00
jr c, .set_carry
2015-12-23 11:00:29 -08:00
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
2018-01-23 14:39:09 -08:00
ld [wCurPartyMon], a
call IsMonFainted
jr z, .cant_use
call IsMonAtFullHealth
jr nc, .cant_use
xor a
ret
2015-11-08 07:59:28 -08:00
.set_carry
scf
ret
2015-11-08 07:59:28 -08:00
.cant_use
push bc
ld hl, .ItemCantUseOnMonText
2019-04-08 05:15:10 -07:00
call MenuTextboxBackup
pop bc
2015-11-08 07:59:28 -08:00
jr .loop
2013-05-07 23:02:15 -07:00
.ItemCantUseOnMonText:
text_far _ItemCantUseOnMonText
text_end
2013-12-24 14:11:52 -08:00
2018-06-24 07:09:41 -07:00
EscapeRopeEffect:
2013-05-07 23:02:15 -07:00
xor a
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
2017-12-24 09:47:30 -08:00
farcall EscapeRopeFunction
2013-05-07 23:02:15 -07:00
2015-12-13 11:15:16 -08:00
ld a, [wItemEffectSucceeded]
2013-12-24 14:11:52 -08:00
cp 1
call z, UseDisposableItem
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
SuperRepelEffect:
2013-12-24 14:11:52 -08:00
ld b, 200
jr UseRepel
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
MaxRepelEffect:
2013-12-24 14:11:52 -08:00
ld b, 250
jr UseRepel
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
RepelEffect:
2013-12-24 14:11:52 -08:00
ld b, 100
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
UseRepel:
2015-10-24 07:34:19 -07:00
ld a, [wRepelEffect]
2013-05-07 23:02:15 -07:00
and a
ld hl, RepelUsedEarlierIsStillInEffectText
2013-12-24 14:11:52 -08:00
jp nz, PrintText
2015-09-09 16:27:07 -07:00
2013-05-07 23:02:15 -07:00
ld a, b
2015-10-24 07:34:19 -07:00
ld [wRepelEffect], a
jp UseItemText
2013-05-07 23:02:15 -07:00
RepelUsedEarlierIsStillInEffectText:
text_far _RepelUsedEarlierIsStillInEffectText
text_end
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
XAccuracyEffect:
2018-01-23 14:39:09 -08:00
ld hl, wPlayerSubStatus4
bit SUBSTATUS_X_ACCURACY, [hl]
jp nz, WontHaveAnyEffect_NotUsedMessage
set SUBSTATUS_X_ACCURACY, [hl]
jp UseItemText
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
PokeDollEffect:
ld a, [wBattleMode]
dec a ; WILD_BATTLE?
jr nz, .not_wild
inc a ; TRUE
2015-11-08 16:09:36 -08:00
ld [wForcedSwitch], a
2015-10-24 07:34:19 -07:00
ld a, [wBattleResult]
2018-04-05 08:44:02 -07:00
and BATTLERESULT_BITMASK
or DRAW
2015-10-24 07:34:19 -07:00
ld [wBattleResult], a
jp UseItemText
2013-05-07 23:02:15 -07:00
.not_wild
2013-05-07 23:02:15 -07:00
xor a
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
GuardSpecEffect:
2018-01-23 14:39:09 -08:00
ld hl, wPlayerSubStatus4
2015-11-08 07:59:28 -08:00
bit SUBSTATUS_MIST, [hl]
jp nz, WontHaveAnyEffect_NotUsedMessage
2015-11-08 07:59:28 -08:00
set SUBSTATUS_MIST, [hl]
jp UseItemText
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
DireHitEffect:
2018-01-23 14:39:09 -08:00
ld hl, wPlayerSubStatus4
2015-11-08 07:59:28 -08:00
bit SUBSTATUS_FOCUS_ENERGY, [hl]
jp nz, WontHaveAnyEffect_NotUsedMessage
2015-11-08 07:59:28 -08:00
set SUBSTATUS_FOCUS_ENERGY, [hl]
jp UseItemText
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
XItemEffect:
call UseItemText
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
2018-01-10 22:45:27 -08:00
ld hl, XItemStats
2013-05-07 23:02:15 -07:00
2015-11-08 07:59:28 -08:00
.loop
2013-05-07 23:02:15 -07:00
cp [hl]
2015-11-08 07:59:28 -08:00
jr z, .got_it
2013-05-07 23:02:15 -07:00
inc hl
inc hl
2015-11-08 07:59:28 -08:00
jr .loop
2013-05-07 23:02:15 -07:00
2015-11-08 07:59:28 -08:00
.got_it
2013-05-07 23:02:15 -07:00
inc hl
ld b, [hl]
xor a
ldh [hBattleTurn], a
2018-01-23 14:39:09 -08:00
ld [wAttackMissed], a
ld [wEffectFailed], a
2018-08-17 08:48:41 -07:00
farcall RaiseStat
2013-05-07 23:02:15 -07:00
call WaitSFX
2017-12-24 09:47:30 -08:00
farcall BattleCommand_StatUpMessage
farcall BattleCommand_StatUpFailText
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurBattleMon]
ld [wCurPartyMon], a
2015-10-12 09:33:24 -07:00
ld c, HAPPINESS_USEDXITEM
2017-12-24 09:47:30 -08:00
farcall ChangeHappiness
2013-05-07 23:02:15 -07:00
ret
2018-01-10 22:45:27 -08:00
INCLUDE "data/items/x_stats.asm"
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
PokeFluteEffect:
ld a, [wBattleMode]
2013-05-07 23:02:15 -07:00
and a
jr nz, .in_battle
; overworld flute code was dummied out here
.in_battle
2013-05-07 23:02:15 -07:00
xor a
ld [wPokeFluteCuredSleep], a
2021-11-23 17:37:18 -08:00
ld b, ~SLP
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1Status
call .CureSleep
2013-05-07 23:02:15 -07:00
ld a, [wBattleMode]
cp WILD_BATTLE
jr z, .skip_otrainer
2018-01-23 14:39:09 -08:00
ld hl, wOTPartyMon1Status
call .CureSleep
.skip_otrainer
2018-01-23 14:39:09 -08:00
ld hl, wBattleMonStatus
2013-05-07 23:02:15 -07:00
ld a, [hl]
and b
ld [hl], a
2018-01-23 14:39:09 -08:00
ld hl, wEnemyMonStatus
2013-05-07 23:02:15 -07:00
ld a, [hl]
and b
ld [hl], a
ld a, [wPokeFluteCuredSleep]
2013-05-07 23:02:15 -07:00
and a
ld hl, .PlayedFluteText
2013-12-24 14:11:52 -08:00
jp z, PrintText
ld hl, .PlayedTheFlute
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
ld a, [wLowHealthAlarm]
and 1 << DANGER_ON_F
jr nz, .dummy
; more code was dummied out here
.dummy
ld hl, .FluteWakeUpText
2013-12-24 14:11:52 -08:00
jp PrintText
2013-05-07 23:02:15 -07:00
.CureSleep:
ld de, PARTYMON_STRUCT_LENGTH
ld c, PARTY_LENGTH
.loop
2013-05-08 00:27:46 -07:00
ld a, [hl]
push af
and SLP
jr z, .not_asleep
ld a, TRUE
ld [wPokeFluteCuredSleep], a
.not_asleep
2013-05-08 00:27:46 -07:00
pop af
and b
ld [hl], a
add hl, de
dec c
jr nz, .loop
2013-05-08 00:27:46 -07:00
ret
.PlayedFluteText:
text_far _PlayedFluteText
text_end
2013-05-08 00:27:46 -07:00
.FluteWakeUpText:
text_far _FluteWakeUpText
text_end
2013-05-08 00:27:46 -07:00
.PlayedTheFlute:
2013-12-24 14:11:52 -08:00
; played the # FLUTE.@ @
text_far Text_PlayedPokeFlute
text_asm
ld a, [wBattleMode]
2013-05-08 00:27:46 -07:00
and a
jr nz, .battle
2013-05-08 00:27:46 -07:00
push de
ld de, SFX_POKEFLUTE
call WaitPlaySFX
call WaitSFX
pop de
.battle
2020-06-21 16:01:54 -07:00
jp PokeFluteTerminator
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
BlueCardEffect:
ld hl, .BlueCardBalanceText
2019-04-08 05:15:10 -07:00
jp MenuTextboxWaitButton
2013-05-07 23:02:15 -07:00
.BlueCardBalanceText:
text_far _BlueCardBalanceText
text_end
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
CoinCaseEffect:
ld hl, .CoinCaseCountText
2019-04-08 05:15:10 -07:00
jp MenuTextboxWaitButton
2013-05-07 23:02:15 -07:00
.CoinCaseCountText:
text_far _CoinCaseCountText
text_end
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
OldRodEffect:
2013-05-07 23:02:15 -07:00
ld e, $0
2016-05-14 13:37:12 -07:00
jr UseRod
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
GoodRodEffect:
2013-05-07 23:02:15 -07:00
ld e, $1
2016-05-14 13:37:12 -07:00
jr UseRod
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
SuperRodEffect:
2013-05-07 23:02:15 -07:00
ld e, $2
2016-05-14 13:37:12 -07:00
jr UseRod
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
UseRod:
2017-12-24 09:47:30 -08:00
farcall FishFunction
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
ItemfinderEffect:
2017-12-24 09:47:30 -08:00
farcall ItemFinder
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
RestorePPEffect:
2018-01-23 14:39:09 -08:00
ld a, [wCurItem]
ld [wTempRestorePPItem], a
2013-05-07 23:02:15 -07:00
.loop
; Party Screen opens to choose on which mon to use the Item
2015-11-08 07:59:28 -08:00
ld b, PARTYMENUACTION_HEALING_ITEM
call UseItem_SelectMon
jp c, PPRestoreItem_Cancel
2013-05-07 23:02:15 -07:00
.loop2
ld a, [wTempRestorePPItem]
2013-12-24 14:11:52 -08:00
cp MAX_ELIXER
jp z, Elixer_RestorePPofAllMoves
2013-12-24 14:11:52 -08:00
cp ELIXER
jp z, Elixer_RestorePPofAllMoves
2013-12-24 14:11:52 -08:00
ld hl, RaiseThePPOfWhichMoveText
ld a, [wTempRestorePPItem]
2013-12-24 14:11:52 -08:00
cp PP_UP
jr z, .ppup
ld hl, RestoreThePPOfWhichMoveText
2013-05-07 23:02:15 -07:00
.ppup
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
2018-01-23 14:39:09 -08:00
ld a, [wCurMoveNum]
2013-05-07 23:02:15 -07:00
push af
xor a
2018-01-23 14:39:09 -08:00
ld [wCurMoveNum], a
2013-05-07 23:02:15 -07:00
ld a, $2
2015-11-23 13:04:53 -08:00
ld [wMoveSelectionMenuType], a
2017-12-24 09:47:30 -08:00
farcall MoveSelectionScreen
2013-05-07 23:02:15 -07:00
pop bc
2015-10-11 09:39:00 -07:00
2013-05-07 23:02:15 -07:00
ld a, b
2018-01-23 14:39:09 -08:00
ld [wCurMoveNum], a
jr nz, .loop
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1Moves
ld bc, PARTYMON_STRUCT_LENGTH
call GetMthMoveOfNthPartymon
2013-05-07 23:02:15 -07:00
push hl
ld a, [hl]
ld [wNamedObjectIndex], a
2013-12-24 14:11:52 -08:00
call GetMoveName
2013-05-07 23:02:15 -07:00
call CopyName1
pop hl
2015-10-11 09:39:00 -07:00
ld a, [wTempRestorePPItem]
2013-12-24 14:11:52 -08:00
cp PP_UP
jp nz, Not_PP_Up
2013-12-24 14:11:52 -08:00
2013-05-07 23:02:15 -07:00
ld a, [hl]
cp SKETCH
jr z, .CantUsePPUpOnSketch
2013-12-24 14:11:52 -08:00
2018-01-09 12:39:48 -08:00
ld bc, MON_PP - MON_MOVES
2013-05-07 23:02:15 -07:00
add hl, bc
ld a, [hl]
2018-01-09 14:20:47 -08:00
cp PP_UP_MASK
jr c, .do_ppup
2013-05-07 23:02:15 -07:00
.CantUsePPUpOnSketch:
ld hl, PPIsMaxedOutText
2013-12-24 14:11:52 -08:00
call PrintText
jr .loop2
2013-05-07 23:02:15 -07:00
.do_ppup
2013-05-07 23:02:15 -07:00
ld a, [hl]
2018-01-09 14:20:47 -08:00
add PP_UP_ONE
2013-05-07 23:02:15 -07:00
ld [hl], a
ld a, TRUE
ld [wUsePPUp], a
call ApplyPPUp
2015-10-10 04:45:39 -07:00
call Play_SFX_FULL_HEAL
2013-05-07 23:02:15 -07:00
ld hl, PPsIncreasedText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
FinishPPRestore:
2013-12-24 14:11:52 -08:00
call ClearPalettes
jp UseDisposableItem
2013-12-24 14:11:52 -08:00
2018-06-24 07:09:41 -07:00
BattleRestorePP:
ld a, [wBattleMode]
2013-12-24 14:11:52 -08:00
and a
jr z, .not_in_battle
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
2013-12-24 14:11:52 -08:00
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wCurBattleMon]
2013-12-24 14:11:52 -08:00
cp b
jr nz, .not_in_battle
2018-01-23 14:39:09 -08:00
ld a, [wPlayerSubStatus5]
2015-11-08 07:59:28 -08:00
bit SUBSTATUS_TRANSFORMED, a
jr nz, .not_in_battle
call .UpdateBattleMonPP
2013-05-07 23:02:15 -07:00
.not_in_battle
2015-10-10 04:45:39 -07:00
call Play_SFX_FULL_HEAL
ld hl, PPRestoredText
2013-12-24 14:11:52 -08:00
call PrintText
jr FinishPPRestore
2013-12-24 14:11:52 -08:00
.UpdateBattleMonPP:
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
ld hl, wPartyMon1Moves
ld bc, PARTYMON_STRUCT_LENGTH
2013-12-24 14:11:52 -08:00
call AddNTimes
2018-01-23 14:39:09 -08:00
ld de, wBattleMonMoves
ld b, NUM_MOVES
.loop
2013-12-24 14:11:52 -08:00
ld a, [de]
and a
jr z, .done
2013-12-24 14:11:52 -08:00
cp [hl]
jr nz, .next
2013-12-24 14:11:52 -08:00
push hl
push de
push bc
2018-05-06 09:16:57 -07:00
rept NUM_MOVES + 2 ; wBattleMonPP - wBattleMonMoves
2013-12-24 14:11:52 -08:00
inc de
2018-05-06 09:16:57 -07:00
endr
ld bc, MON_PP - MON_MOVES
2013-12-24 14:11:52 -08:00
add hl, bc
ld a, [hl]
ld [de], a
pop bc
pop de
pop hl
.next
2013-12-24 14:11:52 -08:00
inc hl
inc de
dec b
jr nz, .loop
2013-12-24 14:11:52 -08:00
.done
2013-12-24 14:11:52 -08:00
ret
2018-06-24 07:09:41 -07:00
Not_PP_Up:
call RestorePP
jr nz, BattleRestorePP
jp PPRestoreItem_NoEffect
2013-12-24 14:11:52 -08:00
2018-06-24 07:09:41 -07:00
Elixer_RestorePPofAllMoves:
2013-12-24 14:11:52 -08:00
xor a
2015-12-15 15:59:49 -08:00
ld hl, wMenuCursorY
2013-12-24 14:11:52 -08:00
ld [hli], a
ld [hl], a
ld b, NUM_MOVES
.moveLoop
2013-12-24 14:11:52 -08:00
push bc
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1Moves
ld bc, PARTYMON_STRUCT_LENGTH
call GetMthMoveOfNthPartymon
2013-12-24 14:11:52 -08:00
ld a, [hl]
and a
jr z, .next
call RestorePP
jr z, .next
2015-12-15 15:59:49 -08:00
ld hl, wMenuCursorX
2013-12-24 14:11:52 -08:00
inc [hl]
.next
2015-12-15 15:59:49 -08:00
ld hl, wMenuCursorY
2013-12-24 14:11:52 -08:00
inc [hl]
pop bc
dec b
jr nz, .moveLoop
2015-12-15 15:59:49 -08:00
ld a, [wMenuCursorX]
2013-12-24 14:11:52 -08:00
and a
jp nz, BattleRestorePP
2013-12-24 14:11:52 -08:00
2018-06-24 07:09:41 -07:00
PPRestoreItem_NoEffect:
call WontHaveAnyEffectMessage
2013-12-24 14:11:52 -08:00
2018-06-24 07:09:41 -07:00
PPRestoreItem_Cancel:
2013-05-07 23:02:15 -07:00
call ClearPalettes
2013-12-24 14:11:52 -08:00
xor a
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
2013-12-24 14:11:52 -08:00
ret
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
RestorePP:
xor a ; PARTYMON
2018-01-23 14:39:09 -08:00
ld [wMonType], a
2015-11-08 07:59:28 -08:00
call GetMaxPPOfMove
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1PP
ld bc, PARTYMON_STRUCT_LENGTH
call GetMthMoveOfNthPartymon
ld a, [wTempPP]
2013-12-24 14:11:52 -08:00
ld b, a
ld a, [hl]
2018-01-09 14:20:47 -08:00
and PP_MASK
2013-12-24 14:11:52 -08:00
cp b
jr nc, .dont_restore
2013-12-24 14:11:52 -08:00
ld a, [wTempRestorePPItem]
2013-12-24 14:11:52 -08:00
cp MAX_ELIXER
jr z, .restore_all
2013-12-24 14:11:52 -08:00
cp MAX_ETHER
jr z, .restore_all
2013-12-24 14:11:52 -08:00
ld c, 5
cp MYSTERYBERRY
jr z, .restore_some
2013-12-24 14:11:52 -08:00
ld c, 10
.restore_some
2013-12-24 14:11:52 -08:00
ld a, [hl]
2018-01-09 14:20:47 -08:00
and PP_MASK
2013-12-24 14:11:52 -08:00
add c
cp b
jr nc, .restore_all
2013-12-24 14:11:52 -08:00
ld b, a
.restore_all
2013-12-24 14:11:52 -08:00
ld a, [hl]
2018-01-09 14:20:47 -08:00
and PP_UP_MASK
2013-12-24 14:11:52 -08:00
or b
ld [hl], a
ret
.dont_restore
2013-12-24 14:11:52 -08:00
xor a
ret
2013-05-07 23:02:15 -07:00
RaiseThePPOfWhichMoveText:
text_far _RaiseThePPOfWhichMoveText
text_end
2013-05-07 23:02:15 -07:00
RestoreThePPOfWhichMoveText:
text_far _RestoreThePPOfWhichMoveText
text_end
2013-12-24 14:11:52 -08:00
PPIsMaxedOutText:
text_far _PPIsMaxedOutText
text_end
2013-12-24 14:11:52 -08:00
PPsIncreasedText:
text_far _PPsIncreasedText
text_end
2013-12-24 14:11:52 -08:00
PPRestoredText:
text_far _PPRestoredText
text_end
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
SquirtbottleEffect:
2017-12-24 09:47:30 -08:00
farcall _Squirtbottle
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
CardKeyEffect:
2017-12-24 09:47:30 -08:00
farcall _CardKey
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
BasementKeyEffect:
2017-12-24 09:47:30 -08:00
farcall _BasementKey
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
SacredAshEffect:
2017-12-24 09:47:30 -08:00
farcall _SacredAsh
2015-12-13 11:15:16 -08:00
ld a, [wItemEffectSucceeded]
2013-05-07 23:02:15 -07:00
cp $1
ret nz
call UseDisposableItem
2013-05-07 23:02:15 -07:00
ret
2018-06-24 07:09:41 -07:00
NormalBoxEffect:
ld c, DECOFLAG_SILVER_TROPHY_DOLL
jr OpenBox
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
GorgeousBoxEffect:
ld c, DECOFLAG_GOLD_TROPHY_DOLL
2018-06-24 07:09:41 -07:00
OpenBox:
2017-12-24 09:47:30 -08:00
farcall SetSpecificDecorationFlag
2013-05-07 23:02:15 -07:00
ld hl, .SentTrophyHomeText
2013-12-24 14:11:52 -08:00
call PrintText
2013-05-07 23:02:15 -07:00
jp UseDisposableItem
2013-05-07 23:02:15 -07:00
.SentTrophyHomeText:
text_far _SentTrophyHomeText
text_end
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
NoEffect:
jp IsntTheTimeMessage
2013-05-07 23:02:15 -07:00
2018-06-24 07:09:41 -07:00
Play_SFX_FULL_HEAL:
push de
ld de, SFX_FULL_HEAL
call WaitPlaySFX
pop de
ret
2018-06-24 07:09:41 -07:00
UseItemText:
ld hl, ItemUsedText
call PrintText
2015-10-10 04:45:39 -07:00
call Play_SFX_FULL_HEAL
call WaitPressAorB_BlinkCursor
2018-06-24 07:09:41 -07:00
UseDisposableItem:
2018-01-23 14:39:09 -08:00
ld hl, wNumItems
ld a, 1
ld [wItemQuantityChange], a
jp TossItem
2018-06-24 07:09:41 -07:00
UseBallInTrainerBattle:
call ReturnToBattle_UseBall
ld de, ANIM_THROW_POKE_BALL
ld a, e
2018-01-23 14:39:09 -08:00
ld [wFXAnimID], a
ld a, d
2018-01-23 14:39:09 -08:00
ld [wFXAnimID + 1], a
xor a
2016-01-27 09:25:12 -08:00
ld [wBattleAnimParam], a
ldh [hBattleTurn], a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
predef PlayBattleAnim
ld hl, BallBlockedText
call PrintText
ld hl, BallDontBeAThiefText
call PrintText
jr UseDisposableItem
2018-06-24 07:09:41 -07:00
WontHaveAnyEffect_NotUsedMessage:
ld hl, ItemWontHaveEffectText
call PrintText
; Item wasn't used.
ld a, $2
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
ret
2018-06-24 07:09:41 -07:00
LooksBitterMessage:
ld hl, ItemLooksBitterText
jp PrintText
2018-06-24 07:09:41 -07:00
Ball_BoxIsFullMessage:
ld hl, BallBoxFullText
call PrintText
; Item wasn't used.
ld a, $2
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
ret
2018-06-24 07:09:41 -07:00
CantUseOnEggMessage:
ld hl, ItemCantUseOnEggText
jr CantUseItemMessage
2018-06-24 07:09:41 -07:00
IsntTheTimeMessage:
ld hl, ItemOakWarningText
jr CantUseItemMessage
2018-06-24 07:09:41 -07:00
WontHaveAnyEffectMessage:
ld hl, ItemWontHaveEffectText
jr CantUseItemMessage
BelongsToSomeoneElseMessage: ; unreferenced
ld hl, ItemBelongsToSomeoneElseText
jr CantUseItemMessage
CyclingIsntAllowedMessage: ; unreferenced
ld hl, NoCyclingText
jr CantUseItemMessage
CantGetOnYourBikeMessage: ; unreferenced
ld hl, ItemCantGetOnText
; fallthrough
2018-06-24 07:09:41 -07:00
CantUseItemMessage:
; Item couldn't be used.
xor a
2015-12-13 11:15:16 -08:00
ld [wItemEffectSucceeded], a
jp PrintText
ItemLooksBitterText:
text_far _ItemLooksBitterText
text_end
ItemCantUseOnEggText:
text_far _ItemCantUseOnEggText
text_end
ItemOakWarningText:
text_far _ItemOakWarningText
text_end
ItemBelongsToSomeoneElseText:
text_far _ItemBelongsToSomeoneElseText
text_end
ItemWontHaveEffectText:
text_far _ItemWontHaveEffectText
text_end
BallBlockedText:
text_far _BallBlockedText
text_end
BallDontBeAThiefText:
text_far _BallDontBeAThiefText
text_end
NoCyclingText:
text_far _NoCyclingText
text_end
ItemCantGetOnText:
text_far _ItemCantGetOnText
text_end
BallBoxFullText:
text_far _BallBoxFullText
text_end
ItemUsedText:
text_far _ItemUsedText
text_end
ItemGotOnText: ; unreferenced
text_far _ItemGotOnText
text_end
ItemGotOffText: ; unreferenced
text_far _ItemGotOffText
text_end
2018-06-24 07:09:41 -07:00
ApplyPPUp:
ld a, MON_MOVES
call GetPartyParamLocation
push hl
2020-11-03 19:45:12 -08:00
ld de, wPPUpPPBuffer
predef FillPP
pop hl
ld bc, MON_PP - MON_MOVES
add hl, bc
2020-11-03 19:45:12 -08:00
ld de, wPPUpPPBuffer
ld b, 0
.loop
inc b
ld a, b
cp NUM_MOVES + 1
ret z
ld a, [wUsePPUp]
dec a ; FALSE?
jr nz, .use
2015-12-15 15:59:49 -08:00
ld a, [wMenuCursorY]
inc a
cp b
jr nz, .skip
.use
ld a, [hl]
2018-01-09 14:20:47 -08:00
and PP_UP_MASK
ld a, [de] ; wasted cycle
call nz, ComputeMaxPP
.skip
inc hl
inc de
jr .loop
2018-06-24 07:09:41 -07:00
ComputeMaxPP:
push bc
; Divide the base PP by 5.
ld a, [de]
ldh [hDividend + 3], a
xor a
ldh [hDividend], a
ldh [hDividend + 1], a
ldh [hDividend + 2], a
ld a, 5
ldh [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.
ldh a, [hQuotient + 3]
cp $8
jr c, .okay
ld a, $7
.okay
add b
ld b, a
ld a, [wTempPP]
dec a
jr z, .NoPPUp
dec c
jr nz, .loop
.NoPPUp:
ld [hl], b
pop bc
ret
2018-06-24 07:09:41 -07:00
RestoreAllPP:
ld a, MON_PP
call GetPartyParamLocation
push hl
ld a, MON_MOVES
call GetPartyParamLocation
pop de
xor a ; PARTYMON
2015-12-15 15:59:49 -08:00
ld [wMenuCursorY], a
2018-01-23 14:39:09 -08:00
ld [wMonType], a
ld c, NUM_MOVES
.loop
ld a, [hli]
and a
ret z
push hl
push de
push bc
2015-11-08 07:59:28 -08:00
call GetMaxPPOfMove
pop bc
pop de
ld a, [de]
2018-01-09 14:20:47 -08:00
and PP_UP_MASK
ld b, a
ld a, [wTempPP]
add b
ld [de], a
inc de
2015-12-15 15:59:49 -08:00
ld hl, wMenuCursorY
inc [hl]
pop hl
dec c
jr nz, .loop
ret
2018-06-24 07:09:41 -07:00
GetMaxPPOfMove:
2018-01-23 14:39:09 -08:00
ld a, [wStringBuffer1 + 0]
push af
2018-01-23 14:39:09 -08:00
ld a, [wStringBuffer1 + 1]
push af
2018-01-23 14:39:09 -08:00
ld a, [wMonType]
and a
2018-01-23 14:39:09 -08:00
ld hl, wPartyMon1Moves
ld bc, PARTYMON_STRUCT_LENGTH
jr z, .got_partymon ; PARTYMON
2018-01-23 14:39:09 -08:00
ld hl, wOTPartyMon1Moves
dec a
jr z, .got_partymon ; OTPARTYMON
2018-01-23 14:39:09 -08:00
ld hl, wTempMonMoves
dec a
jr z, .got_nonpartymon ; BOXMON
2018-01-23 14:39:09 -08:00
ld hl, wTempMonMoves ; Wasted cycles
dec a
2016-05-11 14:16:03 -07:00
jr z, .got_nonpartymon ; TEMPMON
2018-01-23 14:39:09 -08:00
ld hl, wBattleMonMoves ; WILDMON
2016-05-11 14:16:03 -07:00
.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
2018-01-23 14:39:09 -08:00
ld de, wStringBuffer1
ld [de], a
pop hl
push bc
ld bc, MON_PP - MON_MOVES
2018-01-23 14:39:09 -08:00
ld a, [wMonType]
cp WILDMON
jr nz, .notwild
2018-01-23 14:39:09 -08:00
ld bc, wEnemyMonPP - wEnemyMonMoves
.notwild
add hl, bc
ld a, [hl]
2018-01-09 14:20:47 -08:00
and PP_UP_MASK
pop bc
or b
2018-01-23 14:39:09 -08:00
ld hl, wStringBuffer1 + 1
ld [hl], a
xor a
ld [wTempPP], a
ld a, b ; this gets lost anyway
call ComputeMaxPP
ld a, [hl]
2018-01-09 14:20:47 -08:00
and PP_MASK
ld [wTempPP], a
pop af
2018-01-23 14:39:09 -08:00
ld [wStringBuffer1 + 1], a
pop af
2018-01-23 14:39:09 -08:00
ld [wStringBuffer1 + 0], a
ret
2018-06-24 07:09:41 -07:00
GetMthMoveOfNthPartymon:
2018-01-23 14:39:09 -08:00
ld a, [wCurPartyMon]
call AddNTimes
2018-06-24 07:09:41 -07:00
GetMthMoveOfCurrentMon:
2015-12-15 15:59:49 -08:00
ld a, [wMenuCursorY]
ld c, a
ld b, 0
add hl, bc
ret