diff options
author | entrpntr <entrpntr@gmail.com> | 2020-05-04 16:23:03 -0400 |
---|---|---|
committer | entrpntr <entrpntr@gmail.com> | 2020-05-04 16:23:03 -0400 |
commit | 858f7a0b8a7aebe69df387654e3201051d348b9e (patch) | |
tree | 990a5c6dbd7e312b57a89298070cbff8e55293aa | |
parent | fd35959d94c9487e74b2376e529302b32061af83 (diff) |
Finish cleanup of bank 3.
-rw-r--r-- | data/battle/wobble_probabilities.asm | 27 | ||||
-rw-r--r-- | data/items/heal_hp.asm | 17 | ||||
-rw-r--r-- | data/items/heal_status.asm | 19 | ||||
-rw-r--r-- | data/items/x_stats.asm | 6 | ||||
-rwxr-xr-x | engine/battle/anim_hp_bar.asm | 235 | ||||
-rw-r--r-- | engine/battle_anims/pokeball_wobble.asm | 45 | ||||
-rwxr-xr-x | engine/events/engine_flags.asm | 9 | ||||
-rwxr-xr-x | engine/events/overworld.asm | 2 | ||||
-rwxr-xr-x | engine/events/specials.asm | 5 | ||||
-rwxr-xr-x | engine/items/item_effects.asm | 1861 | ||||
-rwxr-xr-x | engine/items/items.asm | 406 | ||||
-rw-r--r-- | engine/items/tmhm.asm | 4 | ||||
-rwxr-xr-x | engine/overworld/variables.asm | 1 | ||||
-rwxr-xr-x | engine/pokemon/health.asm | 48 | ||||
-rwxr-xr-x | engine/pokemon/move_mon.asm | 8 | ||||
-rwxr-xr-x | home/names.asm | 2 | ||||
-rw-r--r-- | layout.link | 1 | ||||
-rw-r--r-- | main.asm | 13 | ||||
-rw-r--r-- | wram.asm | 6 |
19 files changed, 1378 insertions, 1337 deletions
diff --git a/data/battle/wobble_probabilities.asm b/data/battle/wobble_probabilities.asm new file mode 100644 index 00000000..38e9a12c --- /dev/null +++ b/data/battle/wobble_probabilities.asm @@ -0,0 +1,27 @@ +WobbleProbabilities: +; catch rate, chance of wobbling / 255 +; nLeft/255 = (nRight/255) ** 4 + db 1, 63 + db 2, 75 + db 3, 84 + db 4, 90 + db 5, 95 + db 7, 103 + db 10, 113 + db 15, 126 + db 20, 134 + db 30, 149 + db 40, 160 + db 50, 169 + db 60, 177 + db 80, 191 + db 100, 201 + db 120, 211 + db 140, 220 + db 160, 227 + db 180, 234 + db 200, 240 + db 220, 246 + db 240, 251 + db 254, 253 + db 255, 255 diff --git a/data/items/heal_hp.asm b/data/items/heal_hp.asm new file mode 100644 index 00000000..cc3da236 --- /dev/null +++ b/data/items/heal_hp.asm @@ -0,0 +1,17 @@ +HealingHPAmounts: + dbw FRESH_WATER, 50 + dbw SODA_POP, 60 + dbw LEMONADE, 80 + dbw HYPER_POTION, 200 + dbw SUPER_POTION, 50 + dbw POTION, 20 + dbw MAX_POTION, MAX_STAT_VALUE + dbw FULL_RESTORE, MAX_STAT_VALUE + dbw MOOMOO_MILK, 100 + dbw BERRY, 10 + dbw GOLD_BERRY, 30 + dbw ENERGYPOWDER, 50 + dbw ENERGY_ROOT, 200 + dbw RAGECANDYBAR, 20 + dbw BERRY_JUICE, 20 + dbw -1, 0 ; end diff --git a/data/items/heal_status.asm b/data/items/heal_status.asm new file mode 100644 index 00000000..b39f2f80 --- /dev/null +++ b/data/items/heal_status.asm @@ -0,0 +1,19 @@ +; See also data/battle/held_heal_status.asm + +StatusHealingActions: + ; item, party menu action text, status + db ANTIDOTE, PARTYMENUTEXT_HEAL_PSN, 1 << PSN + db BURN_HEAL, PARTYMENUTEXT_HEAL_BRN, 1 << BRN + db ICE_HEAL, PARTYMENUTEXT_HEAL_FRZ, 1 << FRZ + db AWAKENING, PARTYMENUTEXT_HEAL_SLP, SLP + db PARLYZ_HEAL, PARTYMENUTEXT_HEAL_PAR, 1 << PAR + db FULL_HEAL, PARTYMENUTEXT_HEAL_ALL, %11111111 + db FULL_RESTORE, PARTYMENUTEXT_HEAL_ALL, %11111111 + db HEAL_POWDER, PARTYMENUTEXT_HEAL_ALL, %11111111 + db PSNCUREBERRY, PARTYMENUTEXT_HEAL_PSN, 1 << PSN + db PRZCUREBERRY, PARTYMENUTEXT_HEAL_PAR, 1 << PAR + db BURNT_BERRY, PARTYMENUTEXT_HEAL_FRZ, 1 << FRZ + db ICE_BERRY, PARTYMENUTEXT_HEAL_BRN, 1 << BRN + db MINT_BERRY, PARTYMENUTEXT_HEAL_SLP, SLP + db MIRACLEBERRY, PARTYMENUTEXT_HEAL_ALL, %11111111 + db -1, 0, 0 ; end diff --git a/data/items/x_stats.asm b/data/items/x_stats.asm new file mode 100644 index 00000000..25554209 --- /dev/null +++ b/data/items/x_stats.asm @@ -0,0 +1,6 @@ +XItemStats: + ; item, stat + db X_ATTACK, ATTACK + db X_DEFEND, DEFENSE + db X_SPEED, SPEED + db X_SPECIAL, SP_ATTACK diff --git a/engine/battle/anim_hp_bar.asm b/engine/battle/anim_hp_bar.asm index 561cba42..9248ad4f 100755 --- a/engine/battle/anim_hp_bar.asm +++ b/engine/battle/anim_hp_bar.asm @@ -1,61 +1,59 @@ -HP_BAR_MAX_PIXELS EQU $30 - -AnimateHPBar_: ; d62d (3:562d) - call Functiond665 - jr c, .asm_d64b - call Functiond676 -.asm_d635 +_AnimateHPBar: + call .IsMaximumMoreThan48Pixels + jr c, .MoreThan48Pixels + call .ComputePixels +.ShortAnimLoop: push bc push hl - call Functiond6e8 + call ShortAnim_UpdateVariables pop hl pop bc push af push bc push hl - call Functiond736 - call Functiond7cf + call ShortHPBarAnim_UpdateTiles + call HPBarAnim_BGMapUpdate pop hl pop bc pop af - jr nc, .asm_d635 + jr nc, .ShortAnimLoop ret -.asm_d64b - call Functiond676 -.asm_d64e +.MoreThan48Pixels: + call .ComputePixels +.LongAnimLoop: push bc push hl - call Functiond6fb + call LongAnim_UpdateVariables pop hl pop bc ret c push af push bc push hl - call Functiond74f - call Functiond7cf + call LongHPBarAnim_UpdateTiles + call HPBarAnim_BGMapUpdate pop hl pop bc pop af - jr nc, .asm_d64e + jr nc, .LongAnimLoop ret -Functiond665: ; d665 (3:5665) +.IsMaximumMoreThan48Pixels: ld a, [wCurHPAnimMaxHP + 1] and a - jr nz, .asm_d674 + jr nz, .player ld a, [wCurHPAnimMaxHP] - cp HP_BAR_MAX_PIXELS - jr nc, .asm_d674 + cp HP_BAR_LENGTH_PX + jr nc, .player and a ret -.asm_d674 +.player scf ret -Functiond676: ; d676 (3:5676) +.ComputePixels: push hl ld hl, wCurHPAnimMaxHP ld a, [hli] @@ -70,6 +68,7 @@ Functiond676: ; d676 (3:5676) call ComputeHPBarPixels ld a, e ld [wCurHPBarPixels], a + ld a, [wCurHPAnimNewHP] ld c, a ld a, [wCurHPAnimNewHP + 1] @@ -81,6 +80,7 @@ Functiond676: ; d676 (3:5676) call ComputeHPBarPixels ld a, e ld [wNewHPBarPixels], a + push hl ld hl, wCurHPAnimOldHP ld a, [hli] @@ -98,15 +98,15 @@ Functiond676: ; d676 (3:5676) ld a, d sbc b ld d, a - jr c, .asm_d6c7 + jr c, .negative ld a, [wCurHPAnimOldHP] ld [wCurHPAnimLowHP], a ld a, [wCurHPAnimNewHP] ld [wCurHPAnimHighHP], a - ld bc, $1 - jr .asm_d6df + ld bc, 1 + jr .got_direction -.asm_d6c7 +.negative ld a, [wCurHPAnimOldHP] ld [wCurHPAnimHighHP], a ld a, [wCurHPAnimNewHP] @@ -118,31 +118,32 @@ Functiond676: ; d676 (3:5676) ld a, d xor $ff ld d, a - ld bc, rIE -.asm_d6df + ld bc, -1 +.got_direction ld a, d ld [wCurHPAnimDeltaHP], a ld a, e ld [wCurHPAnimDeltaHP + 1], a ret -Functiond6e8: ; d6e8 (3:56e8) +ShortAnim_UpdateVariables: ld hl, wCurHPBarPixels ld a, [wNewHPBarPixels] cp [hl] - jr nz, .asm_d6f3 + jr nz, .not_finished scf ret -.asm_d6f3 +.not_finished ld a, c add [hl] ld [hl], a - call Functiond83f + call ShortHPBar_CalcPixelFrame and a ret -Functiond6fb: ; d6fb (3:56fb) +LongAnim_UpdateVariables: +.loop ld hl, wCurHPAnimOldHP ld a, [hli] ld e, a @@ -150,15 +151,15 @@ Functiond6fb: ; d6fb (3:56fb) ld d, a ld a, e cp [hl] - jr nz, .asm_d70d + jr nz, .next inc hl ld a, d cp [hl] - jr nz, .asm_d70d + jr nz, .next scf ret -.asm_d70d +.next ld l, e ld h, d add hl, bc @@ -178,27 +179,26 @@ Functiond6fb: ; d6fb (3:56fb) ld c, a ld a, [hli] ld b, a - ; BUG: This routine is meant to make the HP bar move at - ; the same rate regardless of how many HP the Pokemon has. - ; In actuality, this causes Pokemon with more than 48 HP - ; to gain or lose HP at the rate of 1 HP per BGMap update - ; rather than 1 pixel on the HUD. - ; To fix, move the "ld a, e" above the "pop de". - call ComputeHPBarPixels ; returns to e + ; This routine is buggy. The result from ComputeHPBarPixels is stored + ; in e. However, the pop de opcode deletes this result before it is even + ; used. The game then proceeds as though it never deleted that output. + ; To fix, uncomment the line below. + call ComputeHPBarPixels + ; ld a, e pop bc - pop de ; overloads e + pop de pop hl - ld a, e ; expects result from ComputeHPBarPixels + ld a, e ; Comment or delete this line to fix the above bug. ld hl, wCurHPBarPixels cp [hl] - jr z, Functiond6fb + jr z, .loop ld [hl], a and a ret -Functiond736: ; d736 (3:5736) - call Functiond78a - ld d, $6 +ShortHPBarAnim_UpdateTiles: + call HPBarAnim_UpdateHPRemaining + ld d, HP_BAR_LENGTH ld a, [wWhichHPBar] and $1 ld b, a @@ -206,13 +206,13 @@ Functiond736: ; d736 (3:5736) ld e, a ld c, a push de - call Functiond777 + call HPBarAnim_RedrawHPBar pop de - call Functiond7ba + call HPBarAnim_PaletteUpdate ret -Functiond74f: ; d74f (3:574f) - call Functiond78a +LongHPBarAnim_UpdateTiles: + call HPBarAnim_UpdateHPRemaining ld a, [wCurHPAnimOldHP] ld c, a ld a, [wCurHPAnimOldHP + 1] @@ -223,45 +223,45 @@ Functiond74f: ; d74f (3:574f) ld d, a call ComputeHPBarPixels ld c, e - ld d, $6 + ld d, HP_BAR_LENGTH ld a, [wWhichHPBar] and $1 ld b, a push de - call Functiond777 + call HPBarAnim_RedrawHPBar pop de - call Functiond7ba + call HPBarAnim_PaletteUpdate ret -Functiond777: ; d777 (3:5777) +HPBarAnim_RedrawHPBar: ld a, [wWhichHPBar] cp $2 - jr nz, .asm_d786 - ld a, $28 + jr nz, .skip + ld a, 2 * SCREEN_WIDTH add l ld l, a - ld a, $0 + ld a, 0 adc h ld h, a -.asm_d786 +.skip call DrawBattleHPBar ret -Functiond78a: ; d78a (3:578a) +HPBarAnim_UpdateHPRemaining: ld a, [wWhichHPBar] and a ret z cp $1 - jr z, .asm_d798 - ld de, $16 - jr .asm_d79b + jr z, .load_15 + ld de, SCREEN_WIDTH + 2 + jr .loaded_de -.asm_d798 - ld de, $15 -.asm_d79b +.load_15 + ld de, SCREEN_WIDTH + 1 +.loaded_de push hl add hl, de - ld a, $7f + ld a, " " ld [hli], a ld [hli], a ld [hld], a @@ -276,7 +276,7 @@ Functiond78a: ; d78a (3:578a) pop hl ret -Functiond7ba: ; d7ba (3:57ba) +HPBarAnim_PaletteUpdate: ldh a, [hCGB] and a ret z @@ -284,45 +284,43 @@ Functiond7ba: ; d7ba (3:57ba) call SetHPPal ld a, [wCurHPAnimPal] ld c, a - ld a, $2 - ld hl, $520b - rst FarCall + farcall ApplyHPBarPals ret -Functiond7cf: ; d7cf (3:57cf) +HPBarAnim_BGMapUpdate: ldh a, [hCGB] and a - jr nz, .asm_d7db + jr nz, .cgb call DelayFrame call DelayFrame ret -.asm_d7db +.cgb ld a, [wWhichHPBar] and a - jr z, .asm_d82f + jr z, .load_0 cp $1 - jr z, .asm_d833 + jr z, .load_1 ld a, [wCurPartyMon] cp $3 - jr nc, .asm_d7f0 + jr nc, .bottom_half_of_screen ld c, $0 - jr .asm_d7f2 + jr .got_third -.asm_d7f0 +.bottom_half_of_screen ld c, $1 -.asm_d7f2 +.got_third push af cp $2 - jr z, .asm_d805 + jr z, .skip_delay cp $5 - jr z, .asm_d805 + jr z, .skip_delay ld a, $2 ldh [hBGMapMode], a ld a, c ldh [hBGMapThird], a call DelayFrame -.asm_d805 +.skip_delay ld a, $1 ldh [hBGMapMode], a ld a, c @@ -330,12 +328,12 @@ Functiond7cf: ; d7cf (3:57cf) call DelayFrame pop af cp $2 - jr z, .asm_d819 + jr z, .two_frames cp $5 - jr z, .asm_d819 + jr z, .two_frames ret -.asm_d819 +.two_frames inc c ld a, $2 ldh [hBGMapMode], a @@ -349,73 +347,78 @@ Functiond7cf: ; d7cf (3:57cf) call DelayFrame ret -.asm_d82f +.load_0 ld c, $0 - jr .asm_d835 + jr .finish -.asm_d833 +.load_1 ld c, $1 -.asm_d835 +.finish call DelayFrame ld a, c ldh [hBGMapThird], a call DelayFrame ret -Functiond83f: ; d83f (3:583f) +ShortHPBar_CalcPixelFrame: ld a, [wCurHPAnimMaxHP] ld c, a - ld b, $0 - ld hl, $0 + ld b, 0 + ld hl, 0 ld a, [wCurHPBarPixels] - cp HP_BAR_MAX_PIXELS - jr nc, .asm_d88b + cp HP_BAR_LENGTH_PX + jr nc, .return_max and a - jr z, .asm_d886 + jr z, .return_zero call AddNTimes - ld b, $0 -.asm_d857 + + ld b, 0 +; This routine is buggy. If [wCurHPAnimMaxHP] * [wCurHPBarPixels] is +; divisible by HP_BAR_LENGTH_PX, the loop runs one extra time. +; To fix, uncomment the line below. +.loop ld a, l - sub HP_BAR_MAX_PIXELS % $100 + sub HP_BAR_LENGTH_PX ld l, a ld a, h - sbc HP_BAR_MAX_PIXELS / $100 + sbc $0 ld h, a - jr c, .asm_d864 + ; jr z, .done + jr c, .done inc b - jr .asm_d857 + jr .loop -.asm_d864 +.done push bc ld bc, $80 add hl, bc pop bc ld a, l - sub HP_BAR_MAX_PIXELS % $100 + sub HP_BAR_LENGTH_PX ld l, a ld a, h - sbc HP_BAR_MAX_PIXELS / $100 + sbc $0 ld h, a - jr c, .asm_d875 + jr c, .no_carry inc b -.asm_d875 +.no_carry ld a, [wCurHPAnimLowHP] cp b - jr nc, .asm_d882 + jr nc, .finish ld a, [wCurHPAnimHighHP] cp b - jr c, .asm_d882 + jr c, .finish ld a, b -.asm_d882 +.finish ld [wCurHPAnimOldHP], a ret -.asm_d886 +.return_zero xor a ld [wCurHPAnimOldHP], a ret -.asm_d88b +.return_max ld a, [wCurHPAnimMaxHP] ld [wCurHPAnimOldHP], a ret diff --git a/engine/battle_anims/pokeball_wobble.asm b/engine/battle_anims/pokeball_wobble.asm new file mode 100644 index 00000000..c430e513 --- /dev/null +++ b/engine/battle_anims/pokeball_wobble.asm @@ -0,0 +1,45 @@ +GetPokeBallWobble: +; Returns whether a Poke Ball will wobble in the catch animation. +; Whether a Pokemon is caught is determined beforehand. + + ld a, [wBuffer2] + inc a + ld [wBuffer2], a + +; Wobble up to 3 times. + cp 3 + 1 + jr z, .finished + + ld a, [wWildMon] + and a + ld c, 0 ; next + ret nz + + ld hl, WobbleProbabilities + ld a, [wBuffer1] + ld b, a +.loop + ld a, [hli] + cp b + jr nc, .checkwobble + inc hl + jr .loop + +.checkwobble + ld b, [hl] + call Random + cp b + ld c, 0 ; next + ret c + ld c, 2 ; escaped + ret + +.finished + ld a, [wWildMon] + and a + ld c, 1 ; caught + ret nz + ld c, 2 ; escaped + ret + +INCLUDE "data/battle/wobble_probabilities.asm" diff --git a/engine/events/engine_flags.asm b/engine/events/engine_flags.asm index d1329f1d..4099dfda 100755 --- a/engine/events/engine_flags.asm +++ b/engine/events/engine_flags.asm @@ -1,4 +1,4 @@ -EngineFlagAction:: ; c01b +EngineFlagAction:: ; Do action b on engine flag de ; ; b = 0: reset flag @@ -7,22 +7,21 @@ EngineFlagAction:: ; c01b ; ; Setting/resetting does not return a result. - ; 16-bit flag ids are considered invalid, but it's nice ; to know that the infrastructure is there. ld a, d - cp 0 + cp HIGH(NUM_ENGINE_FLAGS) jr z, .ceiling jr c, .read ; cp 0 can't set carry! jr .invalid -; There are only $a2 engine flags, so +; There are only NUM_ENGINE_FLAGS engine flags, so ; anything beyond that is invalid too. .ceiling ld a, e - cp NUM_ENGINE_FLAGS + cp LOW(NUM_ENGINE_FLAGS) jr c, .read ; Invalid flags are treated as flag 00. diff --git a/engine/events/overworld.asm b/engine/events/overworld.asm index ca8116c4..441f38b0 100755 --- a/engine/events/overworld.asm +++ b/engine/events/overworld.asm @@ -1577,7 +1577,7 @@ MovementData_CastRod: PutTheRodAway: hlcoord 1, 14 - lb bc, $3, $12 + lb bc, 3, 18 call ClearBox call WaitBGMap xor a diff --git a/engine/events/specials.asm b/engine/events/specials.asm index ab02d3a0..f4b6437d 100755 --- a/engine/events/specials.asm +++ b/engine/events/specials.asm @@ -90,9 +90,7 @@ NameRival: .default IF DEF(_GOLD) db "SILVER@" -ENDC - -IF DEF(_SILVER) +ELIF DEF(_SILVER) db "GOLD@" ENDC @@ -317,6 +315,7 @@ CheckSwarmFlag:: ret CheckPokerus: +; Check if a monster in your party has Pokerus farcall _CheckPokerus jp ScriptReturnCarry diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm index ddbd1001..29f72831 100755 --- a/engine/items/item_effects.asm +++ b/engine/items/item_effects.asm @@ -12,198 +12,188 @@ _DoItemEffect:: ret ItemEffects: - 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 ItemfinderEffect - 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 Item47 - 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 Item73 - dw Item74 - 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 Item81 - 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 - -FastBall: ; e926 -FriendBall: ; e926 -GreatBall: ; e926 -HeavyBall: ; e926 -LevelBall: ; e926 -LoveBall: ; e926 -LureBall: ; e926 -MasterBall: ; e926 -MoonBall: ; e926 -ParkBall: ; e926 -PokeBall: ; e926 -UltraBall: ; e926 +; entries correspond to item ids + dw PokeBallEffect ; MASTER_BALL + dw PokeBallEffect ; ULTRA_BALL + dw NoEffect ; BRIGHTPOWDER + dw PokeBallEffect ; GREAT_BALL + dw PokeBallEffect ; POKE_BALL + dw TownMapEffect ; TOWN_MAP + dw BicycleEffect ; BICYCLE + dw EvoStoneEffect ; MOON_STONE + dw StatusHealingEffect ; ANTIDOTE + dw StatusHealingEffect ; BURN_HEAL + dw StatusHealingEffect ; ICE_HEAL + dw StatusHealingEffect ; AWAKENING + dw StatusHealingEffect ; PARLYZ_HEAL + dw FullRestoreEffect ; FULL_RESTORE + dw RestoreHPEffect ; MAX_POTION + dw RestoreHPEffect ; HYPER_POTION + dw RestoreHPEffect ; SUPER_POTION + dw RestoreHPEffect ; POTION + dw EscapeRopeEffect ; ESCAPE_ROPE + dw RepelEffect ; REPEL + dw RestorePPEffect ; MAX_ELIXER + dw EvoStoneEffect ; FIRE_STONE + dw EvoStoneEffect ; THUNDERSTONE + dw EvoStoneEffect ; WATER_STONE + dw NoEffect ; ITEM_19 + dw VitaminEffect ; HP_UP + dw VitaminEffect ; PROTEIN + dw VitaminEffect ; IRON + dw VitaminEffect ; CARBOS + dw NoEffect ; LUCKY_PUNCH + dw VitaminEffect ; CALCIUM + dw RareCandyEffect ; RARE_CANDY + dw XAccuracyEffect ; X_ACCURACY + dw EvoStoneEffect ; LEAF_STONE + dw NoEffect ; METAL_POWDER + dw NoEffect ; NUGGET + dw PokeDollEffect ; POKE_DOLL + dw StatusHealingEffect ; FULL_HEAL + dw ReviveEffect ; REVIVE + dw ReviveEffect ; MAX_REVIVE + dw GuardSpecEffect ; GUARD_SPEC + dw SuperRepelEffect ; SUPER_REPEL + dw MaxRepelEffect ; MAX_REPEL + dw DireHitEffect ; DIRE_HIT + dw NoEffect ; ITEM_2D + dw RestoreHPEffect ; FRESH_WATER + dw RestoreHPEffect ; SODA_POP + dw RestoreHPEffect ; LEMONADE + dw XItemEffect ; X_ATTACK + dw NoEffect ; ITEM_32 + dw XItemEffect ; X_DEFEND + dw XItemEffect ; X_SPEED + dw XItemEffect ; X_SPECIAL + dw CoinCaseEffect ; COIN_CASE + dw ItemfinderEffect ; ITEMFINDER + dw PokeFluteEffect ; POKE_FLUTE + dw NoEffect ; EXP_SHARE + dw OldRodEffect ; OLD_ROD + dw GoodRodEffect ; GOOD_ROD + dw NoEffect ; SILVER_LEAF + dw SuperRodEffect ; SUPER_ROD + dw RestorePPEffect ; PP_UP + dw RestorePPEffect ; ETHER + dw RestorePPEffect ; MAX_ETHER + dw RestorePPEffect ; ELIXER + dw NoEffect ; RED_SCALE + dw NoEffect ; SECRETPOTION + dw NoEffect ; S_S_TICKET + dw NoEffect ; MYSTERY_EGG + dw NoEffect ; ITEM_46 + 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 ; ITEM_73 + dw NoEffect ; ITEM_74 + 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 ; ITEM_81 + 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 + +PokeBallEffect: ld a, [wBattleMode] dec a jp nz, UseBallInTrainerBattle @@ -640,6 +630,7 @@ UltraBall: ; e926 ld a, BANK(sBoxMonNicknames) call OpenSRAM + ld hl, wMonOrItemNameBuffer ld de, sBoxMonNicknames ld bc, MON_NAME_LENGTH @@ -654,6 +645,7 @@ UltraBall: ; e926 .SkipBoxMonNickname: ld a, BANK(sBoxMonNicknames) call OpenSRAM + ld hl, sBoxMonNicknames ld de, wMonOrItemNameBuffer ld bc, MON_NAME_LENGTH @@ -728,8 +720,8 @@ UltraBallMultiplier: ld b, $ff ret -GreatBallMultiplier: SafariBallMultiplier: +GreatBallMultiplier: ParkBallMultiplier: ; multiply catch rate by 1.5 ld a, b @@ -755,17 +747,19 @@ HeavyBallMultiplier: add hl, de rlca rlca - and $3 + and %11 add BANK("Pokedex Entries 001-064") ld d, a ld a, BANK(PokedexDataPointerTable) call GetFarHalfword -.loop + +.SkipText: ld a, d call GetFarByte inc hl cp "@" - jr nz, .loop + jr nz, .SkipText + ld a, d push bc inc hl @@ -851,12 +845,13 @@ LureBallMultiplier: ld a, b add a - jr c, .asm_ed2d + jr c, .max + add b - jr nc, .asm_ed2f -.asm_ed2d + jr nc, .done +.max ld a, $ff -.asm_ed2f +.done ld b, a ret @@ -869,15 +864,15 @@ MoonBallMultiplier: dec a ld c, a ld b, 0 - ld hl, EvosAttacksPointers ; $67bd + ld hl, EvosAttacksPointers add hl, bc add hl, bc - ld a, BANK(EvosAttacksPointers) ; $10 + ld a, BANK(EvosAttacksPointers) call GetFarHalfword pop bc push bc - ld a, BANK(EvosAttacksPointers) ; $10 + ld a, BANK(EvosAttacksPointers) call GetFarByte cp EVOLVE_ITEM pop bc @@ -891,7 +886,7 @@ MoonBallMultiplier: ; No Pokémon evolve with Burn Heal, ; so Moon Balls always have a catch rate of 1×. push bc - ld a, BANK(EvosAttacksPointers) ; $10 + ld a, BANK(EvosAttacksPointers) call GetFarByte cp MOON_STONE_RED ; BURN_HEAL pop bc @@ -922,45 +917,52 @@ LoveBallMultiplier: push bc ld a, [wTempBattleMonSpecies] ld [wCurPartySpecies], a - xor a + xor a ; PARTYMON ld [wMonType], a ld a, [wCurBattleMon] ld [wCurPartyMon], a - farcall GetGender ; 14:52f1 - jr c, .asm_edba - ld d, $0 - jr nz, .asm_ed8d - inc d -.asm_ed8d + 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, $4 + ld a, WILDMON ld [wMonType], a - farcall GetGender ; 14:52f1 - jr c, .asm_edb9 - ld d, $0 - jr nz, .asm_eda6 - inc d -.asm_eda6 + 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” + ret nz ; for the intended effect, this should be "ret z" + sla b - jr c, .asm_edb6 + jr c, .max sla b - jr c, .asm_edb6 + jr c, .max sla b ret nc -.asm_edb6 +.max ld b, $ff ret -.asm_edb9 +.done2 pop de -.asm_edba + +.done1 pop bc ret @@ -973,27 +975,30 @@ FastBallMultiplier: ld a, [wTempEnemyMonSpecies] ld c, a ld hl, FleeMons - ld d, $3 -.asm_edc5 + ld d, 3 + +.loop ld a, BANK(FleeMons) call GetFarByte inc hl - cp $ff - jr z, .asm_eddc + cp -1 + jr z, .next cp c - jr nz, .asm_eddc ; for the intended effect, this should be “jr nz, .loop” + jr nz, .next ; for the intended effect, this should be "jr nz, .loop" sla b - jr c, .asm_edd9 + jr c, .max + sla b ret nc -.asm_edd9 + +.max ld b, $ff ret -.asm_eddc +.next dec d - jr nz, .asm_edc5 + jr nz, .loop ret LevelBallMultiplier: @@ -1004,20 +1009,23 @@ LevelBallMultiplier: ld c, a ld a, [wEnemyMonLevel] cp c - ret nc + ret nc ; if player is lower level, we're done here sla b - jr c, .asm_edfc + jr c, .max + srl c cp c - ret nc + ret nc ; if player/2 is lower level, we're done here sla b - jr c, .asm_edfc + jr c, .max + srl c cp c - ret nc + ret nc ; if player/4 is lower level, we're done here sla b ret nc -.asm_edfc + +.max ld b, $ff ret @@ -1083,65 +1091,69 @@ ReturnToBattle_UseBall: farcall _ReturnToBattle_UseBall ret -TownMap: ; ee55 (3:6e55) - farcall TownMap_ ; 24:5a4f +TownMapEffect: + farcall PokegearMap ret -Bicycle: ; ee5c - farcall BikeFunction ; same bank +BicycleEffect: + farcall BikeFunction ret -FireStone: ; ee63 -LeafStone: ; ee63 -MoonStone: ; ee63 -SunStone: ; ee63 -Thunderstone: ; ee63 -WaterStone: ; ee63 +EvoStoneEffect: ld b, PARTYMENUACTION_EVO_STONE - call Functionf24f - jp c, .cancel + call UseItem_SelectMon + + jp c, .DecidedNotToUse + ld a, MON_ITEM call GetPartyParamLocation + ld a, [hl] cp EVERSTONE - jr z, .failed + jr z, .NoEffect + ld a, $1 ld [wForceEvolution], a - farcall EvolvePokemon ; 10:61db - ld a, [wd154] + farcall EvolvePokemon + + ld a, [wMonTriedToEvolve] and a - jr z, .failed + jr z, .NoEffect + jp UseDisposableItem -.failed +.NoEffect: call WontHaveAnyEffectMessage -.cancel + +.DecidedNotToUse: xor a ld [wItemEffectSucceeded], a ret - -Calcium: ; ee91 -Carbos: ; ee91 -HPUp: ; ee91 -Iron: ; ee91 -Protein: ; ee91 +VitaminEffect: ld b, PARTYMENUACTION_HEALING_ITEM - call Functionf24f - jp c, Functioneef3 - call Functionef49 - call Functionef2d + 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, Functioneed7 + jr nc, NoEffectMessage + add 10 ld [hl], a - call Functioneee0 - call Functionef2d + call UpdateStatsAfterItem + + call GetStatExpRelativePointer + ld hl, StatStrings add hl, bc ld a, [hli] @@ -1161,12 +1173,12 @@ Protein: ; ee91 jp UseDisposableItem -Functioneed7: +NoEffectMessage: ld hl, ItemWontHaveEffectText call PrintText jp ClearPalettes -Functioneee0: ; eee0 (3:6ee0) +UpdateStatsAfterItem: ld a, MON_MAXHP call GetPartyParamLocation ld d, h @@ -1176,7 +1188,7 @@ Functioneee0: ; eee0 (3:6ee0) ld b, TRUE predef_jump CalcMonStats -Functioneef3: ; eef3 (3:6ef3) +RareCandy_StatBooster_ExitMenu: xor a ld [wItemEffectSucceeded], a jp ClearPalettes @@ -1198,34 +1210,34 @@ StatStrings: .speed db "SPEED@" .special db "SPECIAL@" -Functionef2d: ; ef2d (3:6f2d) +GetStatExpRelativePointer: ld a, [wCurItem] - ld hl, StatOffsets -.asm_ef33 + ld hl, Table_eeeb +.next cp [hl] inc hl - jr z, .asm_ef3a + jr z, .got_it inc hl - jr .asm_ef33 + jr .next -.asm_ef3a +.got_it ld a, [hl] ld c, a - ld b, $0 + ld b, 0 ret -StatOffsets: +Table_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 -Functionef49: ; ef49 (3:6f49) +RareCandy_StatBooster_GetParameters: ld a, [wCurPartySpecies] ld [wCurSpecies], a - ld [wd151], a - ld a, $1f + ld [wTempSpecies], a + ld a, MON_LEVEL call GetPartyParamLocation ld a, [hl] ld [wCurPartyLevel], a @@ -1235,24 +1247,30 @@ Functionef49: ; ef49 (3:6f49) call GetNick ret -RareCandy: ; ef68 (3:6f68) +RareCandyEffect: ld b, PARTYMENUACTION_HEALING_ITEM - call Functionf24f - jp c, Functioneef3 - call Functionef49 + 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, Functioneed7 + jp nc, NoEffectMessage + inc a ld [hl], a ld [wCurPartyLevel], a push de ld d, a farcall CalcExpAtLevel + pop de - ld a, $8 + ld a, MON_EXP call GetPartyParamLocation ldh a, [hMultiplicand + 0] @@ -1262,15 +1280,17 @@ RareCandy: ; ef68 (3:6f68) ldh a, [hMultiplicand + 2] ld [hl], a - ld a, $24 + ld a, MON_MAXHP call GetPartyParamLocation ld a, [hli] ld b, a ld c, [hl] push bc - call Functioneee0 - ld a, $25 + call UpdateStatsAfterItem + + ld a, MON_MAXHP + 1 call GetPartyParamLocation + pop bc ld a, [hld] sub c @@ -1285,110 +1305,114 @@ RareCandy: ; ef68 (3:6f68) ld a, [hl] adc b ld [hl], a - ld c, $1 + ld c, 1 farcall ChangeHappiness + ld a, PARTYMENUTEXT_LEVEL_UP - call Functionf2a0 - xor a + 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 + ld bc, 4 predef PrintTempMonStats + call WaitPressAorB_BlinkCursor - xor a + + xor a ; PARTYMON ld [wMonType], a ld a, [wCurPartySpecies] - ld [wd151], a + ld [wTempSpecies], a predef LearnLevelMoves + xor a ld [wForceEvolution], a farcall EvolvePokemon + jp UseDisposableItem -HealPowder: ; f003 (3:7003) - ld b, $1 - call Functionf24f - jp c, Functionf2f4 - call Functionf030 +HealPowderEffect: + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + + jp c, StatusHealer_ExitMenu + + call UseStatusHealer + cp $0 - jr nz, .asm_f01f - ld c, $f + jr nz, .asm_efc9 + ld c, HAPPINESS_BITTERPOWDER farcall ChangeHappiness + call LooksBitterMessage + ld a, $0 -.asm_f01f - jp Functionf0f4 - -Antidote: ; f022 -Awakening: ; f022 -BurnHeal: ; f022 -BurntBerry: ; f022 -FullHeal: ; f022 -IceBerry: ; f022 -IceHeal: ; f022 -MintBerry: ; f022 -Miracleberry: ; f022 -ParlyzHeal: ; f022 -Przcureberry: ; f022 -Psncureberry: ; f022 - ld b, $1 - call Functionf24f - jp c, Functionf2f4 -Functionf02a: - call Functionf030 - jp Functionf0f4 - -Functionf030: ; f030 (3:7030) - call Functionf363 + +.asm_efc9 + jp StatusHealer_Jumptable + +StatusHealingEffect: + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + +FullyHealStatus: + call UseStatusHealer + jp StatusHealer_Jumptable + +UseStatusHealer: + call IsMonFainted ld a, $1 ret z - call Functionf0ae + call GetItemHealingAction ld a, MON_STATUS call GetPartyParamLocation ld a, [hl] and c - jr nz, .asm_f04a - call Functionf05f + jr nz, .good + call IsItemUsedOnConfusedMon ld a, $1 ret nc ld b, PARTYMENUTEXT_HEAL_CONFUSION -.asm_f04a +.good xor a ld [hl], a ld a, b ld [wPartyMenuActionText], a - call Functionf086 + call HealStatus call Play_SFX_FULL_HEAL - call Functionf2cf + call ItemActionTextWaitButton call UseDisposableItem ld a, $0 ret -Functionf05f: ; f05f (3:705f) - call Functionf2fc - jr nc, .asm_f072 +IsItemUsedOnConfusedMon: + call IsItemUsedOnBattleMon + jr nc, .nope ld a, [wPlayerSubStatus3] bit SUBSTATUS_CONFUSED, a - jr z, .asm_f072 + jr z, .nope ld a, c cp $ff - jr nz, .asm_f072 + jr nz, .nope scf ret -.asm_f072 +.nope and a ret -RestoreBattlemonHP: - call Functionf2fc +BattlemonRestoreHealth: + call IsItemUsedOnBattleMon ret nc - ld a, $22 + ld a, MON_HP call GetPartyParamLocation ld a, [hli] ld [wBattleMonHP], a @@ -1396,284 +1420,281 @@ RestoreBattlemonHP: ld [wBattleMonHP + 1], a ret -Functionf086: ; f086 (3:7086) - call Functionf2fc +HealStatus: + call IsItemUsedOnBattleMon ret nc xor a ld [wBattleMonStatus], a ld hl, wPlayerSubStatus5 - res 0, [hl] + res SUBSTATUS_TOXIC, [hl] ld hl, wPlayerSubStatus1 - res 0, [hl] - call Functionf0ae + res SUBSTATUS_NIGHTMARE, [hl] + call GetItemHealingAction ld a, c - cp $ff - jr nz, .asm_f0a5 + cp %11111111 + jr nz, .not_full_heal ld hl, wPlayerSubStatus3 - res 7, [hl] -.asm_f0a5 + res SUBSTATUS_CONFUSED, [hl] +.not_full_heal push bc - farcall CalcPlayerStats ; d:66f6 + farcall CalcPlayerStats pop bc ret -Functionf0ae: ; f0ae (3:70ae) +GetItemHealingAction: push hl ld a, [wCurItem] - ld hl, .healingactions ; $70c7 - ld bc, $3 -.asm_f0b8 + ld hl, StatusHealingActions + ld bc, 3 +.next cp [hl] - jr z, .asm_f0be + jr z, .found_it add hl, bc - jr .asm_f0b8 + jr .next -.asm_f0be +.found_it inc hl ld b, [hl] inc hl ld a, [hl] ld c, a - cp $ff + cp %11111111 pop hl ret -.healingactions - db ANTIDOTE, PARTYMENUTEXT_HEAL_PSN, 1 << PSN - db BURN_HEAL, PARTYMENUTEXT_HEAL_BRN, 1 << BRN - db ICE_HEAL, PARTYMENUTEXT_HEAL_FRZ, 1 << FRZ - db AWAKENING, PARTYMENUTEXT_HEAL_SLP, SLP - db PARLYZ_HEAL, PARTYMENUTEXT_HEAL_PAR, 1 << PAR - db FULL_HEAL, PARTYMENUTEXT_HEAL_ALL, %11111111 - db FULL_RESTORE, PARTYMENUTEXT_HEAL_ALL, %11111111 - db HEAL_POWDER, PARTYMENUTEXT_HEAL_ALL, %11111111 - db PSNCUREBERRY, PARTYMENUTEXT_HEAL_PSN, 1 << PSN - db PRZCUREBERRY, PARTYMENUTEXT_HEAL_PAR, 1 << PAR - db BURNT_BERRY, PARTYMENUTEXT_HEAL_FRZ, 1 << FRZ - db ICE_BERRY, PARTYMENUTEXT_HEAL_BRN, 1 << BRN - db MINT_BERRY, PARTYMENUTEXT_HEAL_SLP, SLP - db MIRACLEBERRY, PARTYMENUTEXT_HEAL_ALL, %11111111 - db -1, 0, 0 - -Functionf0f4: ; f0f4 (3:70f4) - ld hl, .Jumptable ; $70f9 +INCLUDE "data/items/heal_status.asm" + +StatusHealer_Jumptable: + ld hl, .dw rst JumpTable ret -.Jumptable: - dw Functionf2f8 - dw Functionf2ef - dw Functionf2f4 +.dw + dw StatusHealer_ClearPalettes + dw StatusHealer_NoEffect + dw StatusHealer_ExitMenu -RevivalHerb: ; f0ff - ld b, $1 - call Functionf24f - jp c, Functionf2f4 - call Functionf12c - cp $0 - jr nz, .asm_f11b - ld c, $11 +RevivalHerbEffect: + 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_f11b - jp Functionf0f4 + ld a, 0 -MaxRevive: ; f11e -Revive: ; f11e - ld b, $1 - call Functionf24f - jp c, Functionf2f4 - call Functionf12c - jp Functionf0f4 +.asm_f0c5 + jp StatusHealer_Jumptable -Functionf12c: ; f12c (3:712c) - call Functionf363 - ld a, $1 +ReviveEffect: + ld b, PARTYMENUACTION_HEALING_ITEM + call UseItem_SelectMon + jp c, StatusHealer_ExitMenu + + call RevivePokemon + jp StatusHealer_Jumptable + +RevivePokemon: + call IsMonFainted + ld a, 1 ret nz ld a, [wBattleMode] and a - jr z, .asm_f15a + jr z, .skip_to_revive + ld a, [wCurPartyMon] ld c, a - ld d, $0 + ld d, 0 ld hl, wBattleParticipantsIncludingFainted ld b, CHECK_FLAG predef SmallFarFlagAction ld a, c and a - jr z, .asm_f15a + jr z, .skip_to_revive + ld a, [wCurPartyMon] ld c, a ld hl, wBattleParticipantsNotFainted ld b, SET_FLAG predef SmallFarFlagAction -.asm_f15a + +.skip_to_revive xor a ld [wLowHealthAlarm], a ld a, [wCurItem] cp REVIVE - jr z, .asm_f16a - call Functionf319 - jr .asm_f16d - -.asm_f16a - call Functionf310 -.asm_f16d - call Functionf231 - ld a, $f7 + 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 Functionf2cf + call ItemActionTextWaitButton call UseDisposableItem - ld a, $0 + ld a, 0 ret -FullRestore: ; f17e (3:717e) - ld b, $1 - call Functionf24f - jp c, Functionf2f4 - call Functionf363 - jp z, Functionf2ef - call CalculateCurHPAnimRemainingHP - jr c, .asm_f194 - jp Functionf02a - -.asm_f194 - call Functionf19a - jp Functionf0f4 - -Functionf19a: ; f19a (3:719a) +FullRestoreEffect: + 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 + +.FullRestore: xor a ld [wLowHealthAlarm], a - call Functionf319 - ld a, $20 + call ReviveFullHP + ld a, MON_STATUS call GetPartyParamLocation xor a ld [hli], a ld [hl], a - call Functionf086 - call RestoreBattlemonHP - call Functionf231 - ld a, $f5 + call HealStatus + call BattlemonRestoreHealth + call HealHP_SFX_GFX + ld a, PARTYMENUTEXT_HEAL_HP ld [wPartyMenuActionText], a - call Functionf2cf + call ItemActionTextWaitButton call UseDisposableItem - ld a, $0 + ld a, 0 ret -BitterBerry: ; f1c0 +BitterBerryEffect: ld hl, wPlayerSubStatus3 - bit 7, [hl] - ld a, $1 - jr z, .asm_f1d9 - res 7, [hl] + bit SUBSTATUS_CONFUSED, [hl] + ld a, 1 + jr z, .done + + res SUBSTATUS_CONFUSED, [hl] xor a ldh [hBattleTurn], a call UseItemText + ld hl, ConfusedNoMoreText call StdBattleTextbox - ld a, $0 -.asm_f1d9 - jp Functionf0f4 - -Berry: ; f1dc -BerryJuice: ; f1dc -FreshWater: ; f1dc -GoldBerry: ; f1dc -HyperPotion: ; f1dc -Lemonade: ; f1dc -MaxPotion: ; f1dc -MoomooMilk: ; f1dc -Potion: ; f1dc -Ragecandybar: ; f1dc -SodaPop: ; f1dc -SuperPotion: ; f1dc - call Functionf1ff - jp Functionf0f4 - -Energypowder: ; f1e2 (3:71e2) - ld c, $f - jr asm_f1e8 - -EnergyRoot: ; f1e6 (3:71e6) - ld c, $10 -asm_f1e8: + + ld a, 0 + +.done + jp StatusHealer_Jumptable + +RestoreHPEffect: + call ItemRestoreHP + jp StatusHealer_Jumptable + +EnergypowderEffect: + ld c, HAPPINESS_BITTERPOWDER + jr EnergypowderEnergyRootCommon + +EnergyRootEffect: + ld c, HAPPINESS_ENERGYROOT + +EnergypowderEnergyRootCommon: push bc - call Functionf1ff + call ItemRestoreHP pop bc - cp $0 - jr nz, .asm_f1fc + cp 0 + jr nz, .skip_happiness + farcall ChangeHappiness call LooksBitterMessage - ld a, $0 -.asm_f1fc - jp Functionf0f4 + ld a, 0 + +.skip_happiness + jp StatusHealer_Jumptable -Functionf1ff: ; f1ff (3:71ff) +ItemRestoreHP: ld b, PARTYMENUACTION_HEALING_ITEM - call Functionf24f - ld a, $2 + call UseItem_SelectMon + ld a, 2 ret c - call Functionf363 - ld a, $1 + + call IsMonFainted + ld a, 1 ret z - call CalculateCurHPAnimRemainingHP - ld a, $1 + + call IsMonAtFullHealth + ld a, 1 ret nc + xor a ld [wLowHealthAlarm], a - call Functionf3eb - call Functionf327 - call RestoreBattlemonHP - call Functionf231 + call GetHealingItemAmount + call RestoreHealth + call BattlemonRestoreHealth + call HealHP_SFX_GFX ld a, PARTYMENUTEXT_HEAL_HP ld [wPartyMenuActionText], a - call Functionf2cf + call ItemActionTextWaitButton call UseDisposableItem - ld a, $0 + ld a, 0 ret -Functionf231: ; f231 (3:7231) +HealHP_SFX_GFX: push de - ld de, $4 + ld de, SFX_POTION call WaitPlaySFX pop de ld a, [wCurPartyMon] hlcoord 11, 0 - ld bc, $28 + ld bc, SCREEN_WIDTH * 2 call AddNTimes ld a, $2 ld [wWhichHPBar], a predef_jump AnimateHPBar -Functionf24f: ; f24f (3:724f) - call Functionf261 +UseItem_SelectMon: + call .SelectMon ret c + ld a, [wCurPartySpecies] cp EGG - jr nz, .asm_f25f + jr nz, .not_egg + call CantUseOnEggMessage scf ret -.asm_f25f +.not_egg and a ret -Functionf261: ; f261 (3:7261) +.SelectMon: ld a, b ld [wPartyMenuActionText], a push hl push de push bc call ClearBGPalettes - call Functionf272 + call ChooseMonToUseItemOn pop bc pop de pop hl ret -Functionf272: ; f272 (3:7272) +ChooseMonToUseItemOn: farcall LoadPartyMenuGFX farcall InitPartyMenuWithCancel farcall InitPartyMenuGFX @@ -1685,7 +1706,7 @@ Functionf272: ; f272 (3:7272) farcall PartyMenuSelect ret -Functionf2a0: ; f2a0 (3:72a0) +ItemActionText: ld [wPartyMenuActionText], a ld a, [wCurPartySpecies] push af @@ -1708,33 +1729,33 @@ Functionf2a0: ; f2a0 (3:72a0) ld [wCurPartySpecies], a ret -Functionf2cf: ; f2cf (3:72cf) +ItemActionTextWaitButton: xor a ldh [hBGMapMode], a hlcoord 0, 0 - ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld bc, wTilemapEnd - wTilemap ld a, " " call ByteFill ld a, [wPartyMenuActionText] - call Functionf2a0 + call ItemActionText ld a, $1 ldh [hBGMapMode], a ld c, 50 call DelayFrames jp WaitPressAorB_BlinkCursor -Functionf2ef: ; f2ef (3:72ef) +StatusHealer_NoEffect: call WontHaveAnyEffectMessage - jr Functionf2f8 + jr StatusHealer_ClearPalettes -Functionf2f4: ; f2f4 (3:72f4) +StatusHealer_ExitMenu: xor a - ld [wFieldMoveSucceeded], a -Functionf2f8: ; f2f8 (3:72f8) + ld [wItemEffectSucceeded], a +StatusHealer_ClearPalettes: call ClearPalettes ret -Functionf2fc: ; f2fc (3:72fc) +IsItemUsedOnBattleMon: ld a, [wBattleMode] and a ret z @@ -1743,32 +1764,32 @@ Functionf2fc: ; f2fc (3:72fc) ld hl, wCurBattleMon cp [hl] pop hl - jr nz, .asm_f30e + jr nz, .nope scf ret -.asm_f30e +.nope xor a ret -Functionf310: ; f310 (3:7310) - call GetCurHPAnimMaxHP +ReviveHalfHP: + call LoadHPFromBuffer1 srl d rr e - jr asm_f31c + jr ContinueRevive -Functionf319: ; f319 (3:7319) - call GetCurHPAnimMaxHP -asm_f31c: +ReviveFullHP: + call LoadHPFromBuffer1 +ContinueRevive: ld a, MON_HP call GetPartyParamLocation ld [hl], d inc hl ld [hl], e - jp CopyCurHPToAnimBufferNewHP + jp LoadCurHPIntoBuffer5 -Functionf327: ; f327 (3:7327) - ld a, $23 +RestoreHealth: + ld a, MON_HP + 1 call GetPartyParamLocation ld a, [hl] add e @@ -1776,8 +1797,8 @@ Functionf327: ; f327 (3:7327) ld a, [hl] adc d ld [hl], a - jr c, .asm_f34b - call CopyCurHPToAnimBufferNewHP + jr c, .full_hp + call LoadCurHPIntoBuffer5 ld a, MON_HP + 1 call GetPartyParamLocation ld d, h @@ -1790,13 +1811,13 @@ Functionf327: ; f327 (3:7327) dec hl ld a, [de] sbc [hl] - jr c, .asm_f34e -.asm_f34b - call Functionf319 -.asm_f34e + jr c, .finish +.full_hp + call ReviveFullHP +.finish ret -Functionf34f: ; f34f (3:734f) +RemoveHP: ld a, MON_HP + 1 call GetPartyParamLocation ld a, [hl] @@ -1805,93 +1826,93 @@ Functionf34f: ; f34f (3:734f) ld a, [hl] sbc d ld [hl], a - jr nc, .asm_f35f + jr nc, .okay xor a ld [hld], a ld [hl], a -.asm_f35f - call CopyCurHPToAnimBufferNewHP +.okay + call LoadCurHPIntoBuffer5 ret -Functionf363: ; f363 (3:7363) +IsMonFainted: push de - call CopyMaxHPToAnimBufferMaxHP - call CopyCurHPToAnimBufferOldHP - call GetCurHPAnimOldHP + call LoadMaxHPToBuffer1 + call LoadCurHPToBuffer3 + call LoadHPFromBuffer3 ld a, d or e pop de ret -CalculateCurHPAnimRemainingHP: ; f371 (3:7371) - call GetCurHPAnimOldHP +IsMonAtFullHealth: + call LoadHPFromBuffer3 ld h, d ld l, e - call GetCurHPAnimMaxHP + call LoadHPFromBuffer1 ld a, l sub e ld a, h sbc d ret -CopyCurHPToAnimBufferNewHP: ; f37e (3:737e) +LoadCurHPIntoBuffer5: ld a, MON_HP call GetPartyParamLocation ld a, [hli] - ld [wCurHPAnimNewHP + 1], a + ld [wBuffer6], a ld a, [hl] - ld [wCurHPAnimNewHP], a + ld [wBuffer5], a ret -SetCurHPAnimNewHP: +LoadHPIntoBuffer5: ld a, d - ld [wCurHPAnimNewHP + 1], a + ld [wBuffer6], a ld a, e - ld [wCurHPAnimNewHP], a + ld [wBuffer5], a ret -GetCurHPAnimNewHP: - ld a, [wCurHPAnimNewHP + 1] +LoadHPFromBuffer5: + ld a, [wBuffer6] ld d, a - ld a, [wCurHPAnimNewHP] + ld a, [wBuffer5] ld e, a ret -CopyCurHPToAnimBufferOldHP: ; f39e (3:739e) +LoadCurHPToBuffer3: ld a, MON_HP call GetPartyParamLocation ld a, [hli] - ld [wCurHPAnimOldHP + 1], a + ld [wBuffer4], a ld a, [hl] - ld [wCurHPAnimOldHP], a + ld [wBuffer3], a ret -GetCurHPAnimOldHP: ; f3ac (3:73ac) - ld a, [wCurHPAnimOldHP + 1] +LoadHPFromBuffer3: + ld a, [wBuffer4] ld d, a - ld a, [wCurHPAnimOldHP] + ld a, [wBuffer3] ld e, a ret -CopyMaxHPToAnimBufferMaxHP: ; f3b5 (3:73b5) +LoadMaxHPToBuffer1: push hl ld a, MON_MAXHP call GetPartyParamLocation ld a, [hli] - ld [wCurHPAnimMaxHP + 1], a + ld [wBuffer2], a ld a, [hl] - ld [wCurHPAnimMaxHP], a + ld [wBuffer1], a pop hl ret -GetCurHPAnimMaxHP: ; f3c5 (3:73c5) - ld a, [wCurHPAnimMaxHP + 1] +LoadHPFromBuffer1: + ld a, [wBuffer2] ld d, a - ld a, [wCurHPAnimMaxHP] + ld a, [wBuffer1] ld e, a ret -GetOneFifthMaxHP: ; f3ce (3:73ce) +GetOneFifthMaxHP: push bc ld a, MON_MAXHP call GetPartyParamLocation @@ -1910,135 +1931,122 @@ GetOneFifthMaxHP: ; f3ce (3:73ce) pop bc ret -Functionf3eb: ; f3eb (3:73eb) +GetHealingItemAmount: push hl ld a, [wCurItem] - ld hl, HealingItemParameters + ld hl, HealingHPAmounts ld d, a -.asm_f3f3 +.next ld a, [hli] cp -1 - jr z, .asm_f3ff + jr z, .NotFound cp d - jr z, .asm_f400 + jr z, .done inc hl inc hl - jr .asm_f3f3 + jr .next -.asm_f3ff +.NotFound: scf -.asm_f400 +.done ld e, [hl] inc hl ld d, [hl] pop hl ret -HealingItemParameters: - dbw FRESH_WATER, 50 - dbw SODA_POP, 60 - dbw LEMONADE, 80 - dbw HYPER_POTION, 200 - dbw SUPER_POTION, 50 - dbw POTION, 20 - dbw MAX_POTION, 999 - dbw FULL_RESTORE, 999 - dbw MOOMOO_MILK, 100 - dbw BERRY, 10 - dbw GOLD_BERRY, 30 - dbw ENERGYPOWDER, 50 - dbw ENERGY_ROOT, 200 - dbw RAGECANDYBAR, 20 - dbw BERRY_JUICE, 20 - dbw -1, 0 +INCLUDE "data/items/heal_hp.asm" Softboiled_MilkDrinkFunction: +; Softboiled/Milk Drink in the field ld a, [wPartyMenuCursor] dec a ld b, a - call Functionf46f - jr c, .asm_f469 + call .SelectMilkDrinkRecipient ; select pokemon + jr c, .skip ld a, b ld [wCurPartyMon], a - call Functionf363 + call IsMonFainted call GetOneFifthMaxHP - call Functionf34f + call RemoveHP push bc - call Functionf231 + call HealHP_SFX_GFX pop bc call GetOneFifthMaxHP ld a, c ld [wCurPartyMon], a - call Functionf363 - call Functionf327 -.asm_f45d - call Functionf231 + call IsMonFainted + call RestoreHealth + call HealHP_SFX_GFX ld a, PARTYMENUTEXT_HEAL_HP - call Functionf2a0 + call ItemActionText call JoyWaitAorB -.asm_f469 +.skip ld a, b inc a ld [wPartyMenuCursor], a ret -Functionf46f: ; f46f (3:746f) +.SelectMilkDrinkRecipient: +.loop push bc - ld a, $1 + ld a, PARTYMENUACTION_HEALING_ITEM ld [wPartyMenuActionText], a - call Functionf272 + call ChooseMonToUseItemOn pop bc - jr c, .asm_f494 + jr c, .set_carry ld a, [wPartyMenuCursor] dec a ld c, a ld a, b cp c - jr z, .asm_f496 + jr z, .cant_use ; chose the same mon as user ld a, c ld [wCurPartyMon], a - call Functionf363 - jr z, .asm_f496 - call CalculateCurHPAnimRemainingHP - jr nc, .asm_f496 + call IsMonFainted + jr z, .cant_use + call IsMonAtFullHealth + jr nc, .cant_use xor a ret -.asm_f494 +.set_carry scf ret -.asm_f496 +.cant_use push bc ld hl, .ItemCantUseOnMonText call MenuTextboxBackup pop bc - jr Functionf46f + jr .loop .ItemCantUseOnMonText: text_far _ItemCantUseOnMonText text_end -EscapeRope: ; f4a5 (3:74a5) +EscapeRopeEffect: xor a - ld [wFieldMoveSucceeded], a - farcall EscapeRopeFunction ; same bank - ld a, [wFieldMoveSucceeded] - cp $1 + ld [wItemEffectSucceeded], a + farcall EscapeRopeFunction + + ld a, [wItemEffectSucceeded] + cp 1 call z, UseDisposableItem ret -SuperRepel: ; f4b8 (3:74b8) +SuperRepelEffect: ld b, 200 - jr asm_f4c2 + jr UseRepel -MaxRepel: ; f4bc (3:74bc) +MaxRepelEffect: ld b, 250 - jr asm_f4c2 + jr UseRepel -Repel: ; f4c0 (3:74c0) +RepelEffect: ld b, 100 -asm_f4c2: + +UseRepel: ld a, [wRepelEffect] and a ld hl, RepelUsedEarlierIsStillInEffectText @@ -2052,57 +2060,57 @@ RepelUsedEarlierIsStillInEffectText: text_far _RepelUsedEarlierIsStillInEffectText text_end -XAccuracy: ; f4d8 (3:74d8) +XAccuracyEffect: ld hl, wPlayerSubStatus4 bit SUBSTATUS_X_ACCURACY, [hl] jp nz, WontHaveAnyEffect_NotUsedMessage set SUBSTATUS_X_ACCURACY, [hl] jp UseItemText -PokeDoll: ; f4e5 (3:74e5) +PokeDollEffect: ld a, [wBattleMode] dec a jr nz, .asm_f4f6 inc a ld [wForcedSwitch], a + ; set battle draw inc a ld [wBattleResult], a jp UseItemText .asm_f4f6 xor a - ld [wFieldMoveSucceeded], a + ld [wItemEffectSucceeded], a ret -GuardSpec: ; f4fb (3:74fb) +GuardSpecEffect: ld hl, wPlayerSubStatus4 bit SUBSTATUS_MIST, [hl] jp nz, WontHaveAnyEffect_NotUsedMessage set SUBSTATUS_MIST, [hl] jp UseItemText -DireHit: ; f508 (3:7508) +DireHitEffect: ld hl, wPlayerSubStatus4 bit SUBSTATUS_FOCUS_ENERGY, [hl] jp nz, WontHaveAnyEffect_NotUsedMessage set SUBSTATUS_FOCUS_ENERGY, [hl] jp UseItemText -XAttack: ; f515 -XDefend: ; f515 -XSpecial: ; f515 -XSpeed: ; f515 +XItemEffect: call UseItemText + ld a, [wCurItem] - ld hl, .x_item_table -.asm_f51e + ld hl, XItemStats + +.loop cp [hl] - jr z, .asm_f525 + jr z, .got_it inc hl inc hl - jr .asm_f51e + jr .loop -.asm_f525 +.got_it inc hl ld b, [hl] xor a @@ -2121,13 +2129,9 @@ XSpeed: ; f515 farcall ChangeHappiness ret -.x_item_table - db X_ATTACK, ATTACK - db X_DEFEND, DEFENSE - db X_SPEED, SPEED - db X_SPECIAL, SP_ATTACK +INCLUDE "data/items/x_stats.asm" -PokeFlute: +PokeFluteEffect: ld a, [wBattleMode] and a jr nz, .dummy @@ -2205,19 +2209,22 @@ PokeFlute: text_asm ld a, [wBattleMode] and a - jr nz, .asm_f5dc + jr nz, .battle + push de ld de, SFX_POKEFLUTE call WaitPlaySFX call WaitSFX pop de -.asm_f5dc + +.battle ld hl, .terminator ret -.terminator db "@" +.terminator + db "@" -CoinCase: +CoinCaseEffect: ld hl, .CoinCaseCountText jp MenuTextboxWaitButton @@ -2225,15 +2232,15 @@ CoinCase: text_far _CoinCaseCountText text_end -OldRod: ; f5ec (3:75ec) +OldRodEffect: ld e, $0 jr UseRod -GoodRod: ; f5f0 (3:75f0) +GoodRodEffect: ld e, $1 jr UseRod -SuperRod: ; f5f4 (3:75f4) +SuperRodEffect: ld e, $2 jr UseRod @@ -2241,34 +2248,34 @@ UseRod: farcall FishFunction ret -ItemfinderEffect: ; f5ff (3:75ff) +ItemfinderEffect: farcall ItemFinder ret -Elixer: ; f606 -Ether: ; f606 -MaxElixer: ; f606 -MaxEther: ; f606 -Mysteryberry: ; f606 -PPUp: ; f606 (3:7606) +RestorePPEffect: ld a, [wCurItem] - ld [wMovementBufferCount], a -.asm_f60c - ld b, $1 - call Functionf24f - jp c, Functionf727 -.asm_f614 - ld a, [wMovementBufferCount] + ld [wceed], 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, [wceed] cp MAX_ELIXER - jp z, Functionf6f6 + jp z, Elixer_RestorePPofAllMoves cp ELIXER - jp z, Functionf6f6 + jp z, Elixer_RestorePPofAllMoves + ld hl, RaiseThePPOfWhichMoveText - ld a, [wMovementBufferCount] + ld a, [wceed] cp PP_UP - jr z, .asm_f62e + jr z, .ppup ld hl, RestoreThePPOfWhichMoveText -.asm_f62e + +.ppup call PrintText ld a, [wCurMoveNum] @@ -2277,187 +2284,201 @@ PPUp: ; f606 (3:7606) ld [wCurMoveNum], a ld a, $2 ld [wMoveSelectionMenuType], a - ld a, $f - ld hl, $62f3 - rst FarCall + farcall MoveSelectionScreen pop bc ld a, b ld [wCurMoveNum], a - jr nz, .asm_f60c + jr nz, .loop ld hl, wPartyMon1Moves - ld bc, $30 - call Functionf9aa + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon + push hl ld a, [hl] - ld [wd151], a + ld [wNamedObjectIndexBuffer], a call GetMoveName call CopyName1 pop hl + ld a, [wceed] cp PP_UP - jp nz, Functionf6ee + jp nz, Not_PP_Up + ld a, [hl] - cp $a6 - jr z, .asm_f676 - ld bc, $15 + cp SKETCH + jr z, .CantUsePPUpOnSketch + + ld bc, MON_PP - MON_MOVES add hl, bc ld a, [hl] - cp $c0 - jr c, .asm_f67e -.asm_f676 + cp PP_UP_MASK + jr c, .do_ppup + +.CantUsePPUpOnSketch: +.pp_is_maxed_out ld hl, PPIsMaxedOutText call PrintText - jr .asm_f614 + jr .loop2 -.asm_f67e +.do_ppup ld a, [hl] - add $40 + add PP_UP_ONE ld [hl], a - ld a, $1 - ld [wd151], a - call Functionf893 + ld a, TRUE + ld [wUsePPUp], a + call ApplyPPUp call Play_SFX_FULL_HEAL ld hl, PPsIncreasedText call PrintText -asm_f693: + +FinishPPRestore: call ClearPalettes jp UseDisposableItem -asm_f699: +BattleRestorePP: ld a, [wBattleMode] and a - jr z, .asm_f6b3 + jr z, .not_in_battle ld a, [wCurPartyMon] ld b, a ld a, [wCurBattleMon] cp b - jr nz, .asm_f6b3 + jr nz, .not_in_battle ld a, [wPlayerSubStatus5] bit SUBSTATUS_TRANSFORMED, a - jr nz, .asm_f6b3 - call Functionf6be -.asm_f6b3 + jr nz, .not_in_battle + call .UpdateBattleMonPP + +.not_in_battle call Play_SFX_FULL_HEAL ld hl, PPRestoredText call PrintText - jr asm_f693 + jr FinishPPRestore -Functionf6be: ; f6be (3:76be) +.UpdateBattleMonPP: ld a, [wCurPartyMon] ld hl, wPartyMon1Moves - ld bc, $30 + ld bc, PARTYMON_STRUCT_LENGTH call AddNTimes ld de, wBattleMonMoves - ld b, $4 -.asm_f6cf + ld b, NUM_MOVES +.loop ld a, [de] and a - jr z, .asm_f6ed + jr z, .done cp [hl] - jr nz, .asm_f6e8 + jr nz, .next push hl push de push bc +rept NUM_MOVES + 2 ; wBattleMonPP - wBattleMonMoves inc de - inc de - inc de - inc de - inc de - inc de - ld bc, $15 +endr + ld bc, MON_PP - MON_MOVES add hl, bc ld a, [hl] ld [de], a pop bc pop de pop hl -.asm_f6e8 + +.next inc hl inc de dec b - jr nz, .asm_f6cf -.asm_f6ed + jr nz, .loop + +.done ret -Functionf6ee: ; f6ee (3:76ee) - call Functionf72f - jr nz, asm_f699 - jp Functionf724 +Not_PP_Up: + call RestorePP + jr nz, BattleRestorePP + jp PPRestoreItem_NoEffect -Functionf6f6: ; f6f6 (3:76f6) +Elixer_RestorePPofAllMoves: xor a ld hl, wMenuCursorY ld [hli], a ld [hl], a - ld b, $4 -.asm_f6fe + ld b, NUM_MOVES +.moveLoop push bc ld hl, wPartyMon1Moves - ld bc, $30 - call Functionf9aa + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon ld a, [hl] and a - jr z, .asm_f715 - call Functionf72f - jr z, .asm_f715 + jr z, .next + + call RestorePP + jr z, .next ld hl, wMenuCursorX inc [hl] -.asm_f715 + +.next ld hl, wMenuCursorY inc [hl] pop bc dec b - jr nz, .asm_f6fe + jr nz, .moveLoop ld a, [wMenuCursorX] and a - jp nz, asm_f699 -Functionf724: ; f724 (3:7724) + jp nz, BattleRestorePP + +PPRestoreItem_NoEffect: call WontHaveAnyEffectMessage -Functionf727: ; f727 (3:7727) + +PPRestoreItem_Cancel: call ClearPalettes xor a - ld [wFieldMoveSucceeded], a + ld [wItemEffectSucceeded], a ret -Functionf72f: ; f72f (3:772f) - xor a +RestorePP: + xor a ; PARTYMON ld [wMonType], a call GetMaxPPOfMove ld hl, wPartyMon1PP - ld bc, $30 - call Functionf9aa - ld a, [wd151] + ld bc, PARTYMON_STRUCT_LENGTH + call GetMthMoveOfNthPartymon + ld a, [wTempPP] ld b, a ld a, [hl] - and $3f + and PP_MASK cp b - jr nc, .asm_f76a + jr nc, .dont_restore + ld a, [wceed] cp MAX_ELIXER - jr z, .asm_f764 - cp $40 - jr z, .asm_f764 - ld c, $5 - cp $96 - jr z, .asm_f75c - ld c, $a -.asm_f75c + 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 $3f + and PP_MASK add c cp b - jr nc, .asm_f764 + jr nc, .restore_all ld b, a -.asm_f764 + +.restore_all ld a, [hl] - and $c0 + and PP_UP_MASK or b ld [hl], a ret -.asm_f76a +.dont_restore xor a ret @@ -2481,33 +2502,33 @@ PPRestoredText: text_far _PPRestoredText text_end -Squirtbottle: ; f785 (3:7785) - farcall SquirtbottleFunction ; 14:4763 +SquirtbottleEffect: + farcall _Squirtbottle ret -CardKey: ; f78c (3:778c) - farcall CardKeyFunction ; 14:47ac +CardKeyEffect: + farcall _CardKey ret -BasementKey: ; f793 (3:7793) - farcall BasementKeyFunction ; 14:47e7 +BasementKeyEffect: + farcall _BasementKey ret -SacredAsh: ; f79a (3:779a) - farcall SacredAshFunction ; 14:4819 - ld a, [wFieldMoveSucceeded] +SacredAshEffect: + farcall _SacredAsh + ld a, [wItemEffectSucceeded] cp $1 ret nz call UseDisposableItem ret -NormalBox: ; f7aa (3:77aa) +NormalBoxEffect: ld c, DECOFLAG_SILVER_TROPHY_DOLL - jr asm_f7b0 + jr OpenBox -GorgeousBox: ; f7ae (3:77ae) +GorgeousBoxEffect: ld c, DECOFLAG_GOLD_TROPHY_DOLL -asm_f7b0: +OpenBox: farcall SetSpecificDecorationFlag ld hl, .SentTrophyHomeText @@ -2519,97 +2540,7 @@ asm_f7b0: text_far _SentTrophyHomeText text_end -AmuletCoin: ; f7c4 -BerserkGene: ; f7c4 -BigMushroom: ; f7c4 -BigPearl: ; f7c4 -Blackbelt: ; f7c4 -Blackglasses: ; f7c4 -BlkApricorn: ; f7c4 -BluApricorn: ; f7c4 -Brightpowder: ; f7c4 -Charcoal: ; f7c4 -CleanseTag: ; f7c4 -DragonFang: ; f7c4 -DragonScale: ; f7c4 -Everstone: ; f7c4 -ExpShare: ; f7c4 -FlowerMail: ; f7c4 -FocusBand: ; f7c4 -GoldLeaf: ; f7c4 -GrnApricorn: ; f7c4 -HardStone: ; f7c4 -Item19: ; f7c4 -Item2D: ; f7c4 -Item32: ; f7c4 -Item47: ; f7c4 -Item5A: ; f7c4 -Item64: ; f7c4 -Item73: ; f7c4 -Item74: ; f7c4 -Item78: ; f7c4 -Item81: ; f7c4 -Item87: ; f7c4 -Item88: ; f7c4 -Item89: ; f7c4 -Item8D: ; f7c4 -Item8E: ; f7c4 -Item91: ; f7c4 -Item93: ; f7c4 -Item94: ; f7c4 -Item95: ; f7c4 -Item99: ; f7c4 -Item9A: ; f7c4 -Item9B: ; f7c4 -ItemA2: ; f7c4 -ItemAB: ; f7c4 -ItemB0: ; f7c4 -ItemB3: ; f7c4 -KingsRock: ; f7c4 -Leftovers: ; f7c4 -LightBall: ; f7c4 -LostItem: ; f7c4 -LuckyEgg: ; f7c4 -LuckyPunch: ; f7c4 -MachinePart: ; f7c4 -Magnet: ; f7c4 -MetalCoat: ; f7c4 -MetalPowder: ; f7c4 -MiracleSeed: ; f7c4 -MysteryEgg: ; f7c4 -MysticWater: ; f7c4 -Nevermeltice: ; f7c4 -Nugget: ; f7c4 -Pass: ; f7c4 -Pearl: ; f7c4 -PinkBow: ; f7c4 -PnkApricorn: ; f7c4 -PoisonBarb: ; f7c4 -PolkadotBow: ; f7c4 -QuickClaw: ; f7c4 -RainbowWing: ; f7c4 -RedApricorn: ; f7c4 -RedScale: ; f7c4 -SSTicket: ; f7c4 -ScopeLens: ; f7c4 -Secretpotion: ; f7c4 -SharpBeak: ; f7c4 -SilverLeaf: ; f7c4 -SilverWing: ; f7c4 -Silverpowder: ; f7c4 -Slowpoketail: ; f7c4 -SmokeBall: ; f7c4 -SoftSand: ; f7c4 -SpellTag: ; f7c4 -StarPiece: ; f7c4 -Stardust: ; f7c4 -Stick: ; f7c4 -ThickClub: ; f7c4 -Tinymushroom: ; f7c4 -Twistedspoon: ; f7c4 -UpGrade: ; f7c4 -WhtApricorn: ; f7c4 -YlwApricorn: ; f7c4 +NoEffect: jp IsntTheTimeMessage Play_SFX_FULL_HEAL: @@ -2751,40 +2682,42 @@ ItemGotOffText: text_far _ItemGotOffText text_end -Functionf893: ; f893 (3:7893) - ld a, $2 +ApplyPPUp: + ld a, MON_MOVES call GetPartyParamLocation push hl ld de, wBuffer1 predef FillPP pop hl - ld bc, $15 + ld bc, MON_PP - MON_MOVES add hl, bc - ld de, wCurHPAnimMaxHP - ld b, $0 -.asm_f8ab + ld de, wBuffer1 + ld b, 0 +.loop inc b ld a, b - cp $5 + cp NUM_MOVES + 1 ret z - ld a, [wd151] - dec a - jr nz, .asm_f8bd + ld a, [wUsePPUp] + dec a ; FALSE? + jr nz, .use ld a, [wMenuCursorY] inc a cp b - jr nz, .asm_f8c4 -.asm_f8bd + jr nz, .skip + +.use ld a, [hl] - and $c0 - ld a, [de] - call nz, Functionf8c8 -.asm_f8c4 + and PP_UP_MASK + ld a, [de] ; wasted cycle + call nz, ComputeMaxPP + +.skip inc hl inc de - jr .asm_f8ab + jr .loop -Functionf8c8: ; f8c8 (3:78c8) +ComputeMaxPP: push bc ; Divide the base PP by 5. ld a, [de] @@ -2807,37 +2740,44 @@ Functionf8c8: ; f8c8 (3:78c8) ld c, a ; If this value is 0, we are done and a - jr z, .asm_f8fd -.asm_f8ea + 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, .asm_f8f2 + jr c, .okay ld a, $7 -.asm_f8f2 + +.okay add b ld b, a - ld a, [wd151] + ld a, [wTempPP] dec a - jr z, .asm_f8fd + jr z, .NoPPUp dec c - jr nz, .asm_f8ea -.asm_f8fd + jr nz, .loop + +.NoPPUp: ld [hl], b pop bc ret -Functionf900: ; f900 (3:7900) - ld a, $17 +RestoreAllPP: + ld a, MON_PP call GetPartyParamLocation push hl - ld a, $2 + ld a, MON_MOVES call GetPartyParamLocation pop de - xor a + xor a ; PARTYMON ld [wMenuCursorY], a ld [wMonType], a - ld c, $4 -.asm_f915 + ld c, NUM_MOVES +.loop ld a, [hli] and a ret z @@ -2848,9 +2788,9 @@ Functionf900: ; f900 (3:7900) pop bc pop de ld a, [de] - and $c0 + and PP_UP_MASK ld b, a - ld a, [wd151] + ld a, [wTempPP] add b ld [de], a inc de @@ -2858,41 +2798,50 @@ Functionf900: ; f900 (3:7900) inc [hl] pop hl dec c - jr nz, .asm_f915 + jr nz, .loop ret -GetMaxPPOfMove: ; f933 (3:7933) - ld a, [wStringBuffer1] +GetMaxPPOfMove: + ld a, [wStringBuffer1 + 0] push af ld a, [wStringBuffer1 + 1] push af + ld a, [wMonType] and a + ld hl, wPartyMon1Moves - ld bc, $30 - jr z, .asm_f961 + ld bc, PARTYMON_STRUCT_LENGTH + jr z, .got_partymon ; PARTYMON + ld hl, wOTPartyMon1Moves dec a - jr z, .asm_f961 + jr z, .got_partymon ; OTPARTYMON + ld hl, wTempMonMoves dec a - jr z, .asm_f95c - ld hl, wTempMonMoves + jr z, .got_nonpartymon ; BOXMON + + ld hl, wTempMonMoves ; Wasted cycles dec a - jr z, .asm_f95c - ld hl, wBattleMonMoves -.asm_f95c - call Functionf9b0 - jr .asm_f964 - -.asm_f961 - call Functionf9aa -.asm_f964 + 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, $7 + ld bc, MOVE_LENGTH call AddNTimes ld a, BANK(Moves) call GetFarByte @@ -2900,103 +2849,43 @@ GetMaxPPOfMove: ; f933 (3:7933) ld de, wStringBuffer1 ld [de], a pop hl + push bc - ld bc, $15 + ld bc, MON_PP - MON_MOVES ld a, [wMonType] - cp $4 - jr nz, .asm_f989 - ld bc, $6 -.asm_f989 + cp WILDMON + jr nz, .notwild + ld bc, wEnemyMonPP - wEnemyMonMoves +.notwild add hl, bc ld a, [hl] - and $c0 + and PP_UP_MASK pop bc + or b ld hl, wStringBuffer1 + 1 ld [hl], a xor a - ld [wd151], a - ld a, b - call Functionf8c8 + ld [wTempPP], a + ld a, b ; this gets lost anyway + call ComputeMaxPP ld a, [hl] - and $3f - ld [wd151], a + and PP_MASK + ld [wTempPP], a + pop af ld [wStringBuffer1 + 1], a -.asm_f9a3 pop af - ld [wStringBuffer1], a + ld [wStringBuffer1 + 0], a ret -Functionf9aa: ; f9aa (3:79aa) +GetMthMoveOfNthPartymon: ld a, [wCurPartyMon] call AddNTimes -Functionf9b0: ; f9b0 (3:79b0) + +GetMthMoveOfCurrentMon: ld a, [wMenuCursorY] ld c, a - ld b, $0 + ld b, 0 add hl, bc ret - -GetPokeballWobble: - ld a, [wBuffer2] - inc a - ld [wBuffer2], a - cp $4 - jr z, .asm_f9e3 - ld a, [wWildMon] - and a - ld c, $0 - ret nz - ld hl, PokeballWobbleProbabilities - ld a, [wCurHPAnimMaxHP] - ld b, a -.asm_f9d1 - ld a, [hli] - cp b - jr nc, .asm_f9d8 - inc hl - jr .asm_f9d1 - -.asm_f9d8 - ld b, [hl] - call Random - cp b - ld c, $0 - ret c - ld c, $2 - ret - -.asm_f9e3 - ld a, [wWildMon] - and a - ld c, $1 - ret nz - ld c, $2 - ret - -PokeballWobbleProbabilities: - db 1, 63 - db 2, 75 - db 3, 84 - db 4, 90 - db 5, 95 - db 7, 103 - db 10, 113 - db 15, 126 - db 20, 134 - db 30, 149 - db 40, 160 - db 50, 169 - db 60, 177 - db 80, 191 - db 100, 201 - db 120, 211 - db 140, 220 - db 160, 227 - db 180, 234 - db 200, 240 - db 220, 246 - db 240, 251 - db 254, 253 - db 255, 255 diff --git a/engine/items/items.asm b/engine/items/items.asm index 5ab48b2a..ef0f10dd 100755 --- a/engine/items/items.asm +++ b/engine/items/items.asm @@ -1,235 +1,244 @@ -_ReceiveItem:: ; d1e2 (3:51e2) - call CheckBagOrPC - jp nz, PutItemInPocketOrPC +_ReceiveItem:: + call DoesHLEqualNumItems + jp nz, PutItemInPocket push hl call CheckItemPocket pop de ld a, [wItemAttributeParamBuffer] dec a - ld hl, .Jumptable + ld hl, .Pockets rst JumpTable ret -.Jumptable - dw ReceiveNormalItem - dw ReceiveKeyItem - dw ReceiveBall - dw ReceiveTMHM +.Pockets: +; entries correspond to item types + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM -ReceiveNormalItem: +.Item: ld h, d ld l, e - jp PutItemInPocketOrPC + jp PutItemInPocket -ReceiveKeyItem: +.KeyItem: ld h, d ld l, e - jp PutItemInKeyItemPocket + jp ReceiveKeyItem -ReceiveBall: +.Ball: ld hl, wNumBalls - jp PutItemInPocketOrPC + jp PutItemInPocket -ReceiveTMHM: +.TMHM: ld h, d ld l, e ld a, [wCurItem] ld c, a - call GetNumberedTMHM - jp PutItemInTMPocket + call GetTMHMNumber + jp ReceiveTMHM -_TossItem:: ; d21a (3:521a) - call CheckBagOrPC - jr nz, remove_item_from_bag_or_pc +_TossItem:: + call DoesHLEqualNumItems + jr nz, .remove push hl call CheckItemPocket pop de ld a, [wItemAttributeParamBuffer] dec a - ld hl, .Jumptable ; $522d + ld hl, .Pockets rst JumpTable ret -.Jumptable - dw RemoveNormalItem - dw RemoveKeyItem - dw RemoveBall - dw RemoveTMHM +.Pockets: +; entries correspond to item types + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM -RemoveBall: +.Ball: ld hl, wNumBalls - jp RemoveItemAndQuantity + jp RemoveItemFromPocket -RemoveTMHM: +.TMHM: ld h, d ld l, e ld a, [wCurItem] ld c, a - call GetNumberedTMHM - jp RemoveTMorHM + call GetTMHMNumber + jp TossTMHM -RemoveKeyItem: +.KeyItem: ld h, d ld l, e - jp RemoveItemWithoutQuantity + jp TossKeyItem -RemoveNormalItem: +.Item: ld h, d ld l, e -remove_item_from_bag_or_pc: - jp RemoveItemAndQuantity -_CheckItem:: ; d251 (3:5251) - call CheckBagOrPC - jr nz, check_item_in_bag_or_pc +.remove + jp RemoveItemFromPocket + +_CheckItem:: + call DoesHLEqualNumItems + jr nz, .nope push hl call CheckItemPocket pop de ld a, [wItemAttributeParamBuffer] dec a - ld hl, .Jumptable + ld hl, .Pockets rst JumpTable ret -.Jumptable - dw CheckNormalItem - dw CheckKeyItem - dw CheckBall - dw CheckTMHM +.Pockets: +; entries correspond to item types + dw .Item + dw .KeyItem + dw .Ball + dw .TMHM -CheckBall: +.Ball: ld hl, wNumBalls - jp CheckItemWithQuantity + jp CheckTheItem -CheckTMHM: +.TMHM: ld h, d ld l, e ld a, [wCurItem] ld c, a - call GetNumberedTMHM - jp CheckTMorHM + call GetTMHMNumber + jp CheckTMHM -CheckKeyItem: +.KeyItem: ld h, d ld l, e - jp CheckItemWithoutQuantity + jp CheckKeyItems -CheckNormalItem: +.Item: ld h, d ld l, e -check_item_in_bag_or_pc: - jp CheckItemWithQuantity -CheckBagOrPC: ; d288 (3:5288) +.nope + jp CheckTheItem + +DoesHLEqualNumItems: ld a, l - cp wNumItems % $100 + cp LOW(wNumItems) ret nz ld a, h - cp wNumItems / $100 + cp HIGH(wNumItems) ret -GetPocketCapacity: ; d290 (3:5290) +GetPocketCapacity: ld c, MAX_ITEMS ld a, e - cp wNumItems % $100 - jr nz, .asm_d29b + cp LOW(wNumItems) + jr nz, .not_bag ld a, d - cp wNumItems / $100 + cp HIGH(wNumItems) ret z -.asm_d29b + +.not_bag ld c, MAX_PC_ITEMS ld a, e cp LOW(wNumPCItems) - jr nz, .asm_d2a6 + jr nz, .not_pc ld a, d cp HIGH(wNumPCItems) ret z -.asm_d2a6 + +.not_pc ld c, MAX_BALLS ret -PutItemInPocketOrPC: ; d2a9 (3:52a9) +PutItemInPocket: ld d, h ld e, l inc hl ld a, [wCurItem] ld c, a - ld b, $0 -.asm_d2b2 + ld b, 0 +.loop ld a, [hli] - cp $ff - jr z, .asm_d2ca + cp -1 + jr z, .terminator cp c - jr nz, .asm_d2c7 - ld a, $63 + jr nz, .next + ld a, 99 sub [hl] add b ld b, a ld a, [wItemQuantityChangeBuffer] cp b - jr z, .asm_d2d3 - jr c, .asm_d2d3 -.asm_d2c7 + jr z, .ok + jr c, .ok + +.next inc hl - jr .asm_d2b2 + jr .loop -.asm_d2ca +.terminator call GetPocketCapacity ld a, [de] cp c - jr c, .asm_d2d3 + jr c, .ok and a ret -.asm_d2d3 +.ok ld h, d ld l, e ld a, [wCurItem] ld c, a ld a, [wItemQuantityChangeBuffer] ld [wItemQuantityBuffer], a -.asm_d2df +.loop2 inc hl ld a, [hli] - cp $ff - jr z, .asm_d2fc + cp -1 + jr z, .terminator2 cp c - jr nz, .asm_d2df + jr nz, .loop2 ld a, [wItemQuantityBuffer] add [hl] - cp $64 - jr nc, .asm_d2f3 + cp 100 + jr nc, .newstack ld [hl], a - jr .asm_d30a + jr .done -.asm_d2f3 - ld [hl], $63 - sub $63 +.newstack + ld [hl], 99 + sub 99 ld [wItemQuantityBuffer], a - jr .asm_d2df + jr .loop2 -.asm_d2fc +.terminator2 dec hl ld a, [wCurItem] ld [hli], a ld a, [wItemQuantityBuffer] ld [hli], a - ld [hl], $ff + ld [hl], -1 ld h, d ld l, e inc [hl] -.asm_d30a + +.done scf ret -RemoveItemAndQuantity: ; d30c (3:530c) +RemoveItemFromPocket: ld d, h ld e, l ld a, [hli] ld c, a ld a, [wCurItemQuantity] cp c - jr nc, .asm_d325 + jr nc, .ok ; memory ld c, a ld b, $0 add hl, bc @@ -237,202 +246,206 @@ RemoveItemAndQuantity: ; d30c (3:530c) ld a, [wCurItem] cp [hl] inc hl - jr z, .asm_d334 + jr z, .skip ld h, d ld l, e inc hl -.asm_d325 + +.ok ld a, [wCurItem] ld b, a -.asm_d329 +.loop ld a, [hli] cp b - jr z, .asm_d334 - cp $ff - jr z, .asm_d354 + jr z, .skip + cp -1 + jr z, .nope inc hl - jr .asm_d329 + jr .loop -.asm_d334 +.skip ld a, [wItemQuantityChangeBuffer] ld b, a ld a, [hl] sub b - jr c, .asm_d354 + jr c, .nope ld [hl], a ld [wItemQuantityBuffer], a and a - jr nz, .asm_d352 + jr nz, .yup dec hl ld b, h ld c, l inc hl inc hl -.asm_d348 +.loop2 ld a, [hli] ld [bc], a inc bc - cp $ff - jr nz, .asm_d348 + cp -1 + jr nz, .loop2 ld h, d ld l, e dec [hl] -.asm_d352 + +.yup scf ret -.asm_d354 +.nope and a ret -CheckItemWithQuantity: ; d356 (3:5356) +CheckTheItem: ld a, [wCurItem] ld c, a -.asm_d35a +.loop inc hl ld a, [hli] - cp $ff - jr z, .asm_d365 + cp -1 + jr z, .done cp c - jr nz, .asm_d35a + jr nz, .loop scf ret -.asm_d365 +.done and a ret -PutItemInKeyItemPocket: ; d367 (3:5367) - ld hl, wItemsEnd +ReceiveKeyItem: + ld hl, wNumKeyItems ld a, [hli] - cp $19 - jr nc, .asm_d37f + cp MAX_KEY_ITEMS + jr nc, .nope ld c, a - ld b, $0 + ld b, 0 add hl, bc ld a, [wCurItem] ld [hli], a - ld [hl], $ff + ld [hl], -1 ld hl, wNumKeyItems inc [hl] scf ret -.asm_d37f +.nope and a ret -RemoveItemWithoutQuantity: ; d381 (3:5381) +TossKeyItem: ld a, [wCurItemQuantity] ld e, a - ld d, $0 - ld hl, wItemsEnd + ld d, 0 + ld hl, wNumKeyItems ld a, [hl] cp e - jr nc, .asm_d394 - call FindAndTossKeyItem + jr nc, .ok + call .Toss ret nc - jr .asm_d397 + jr .ok2 -.asm_d394 +.ok dec [hl] inc hl add hl, de -.asm_d397 + +.ok2 ld d, h ld e, l inc hl -.asm_d39a +.loop ld a, [hli] ld [de], a inc de - cp $ff - jr nz, .asm_d39a + cp -1 + jr nz, .loop scf ret -FindAndTossKeyItem: ; d3a3 (3:53a3) - ld hl, wItemsEnd +.Toss: + ld hl, wNumKeyItems ld a, [wCurItem] ld c, a -.asm_d3aa +.loop3 inc hl ld a, [hl] cp c - jr z, .asm_d3b5 - cp $ff - jr nz, .asm_d3aa + jr z, .ok3 + cp -1 + jr nz, .loop3 xor a ret -.asm_d3b5 +.ok3 ld a, [wNumKeyItems] dec a ld [wNumKeyItems], a scf ret -CheckItemWithoutQuantity: ; d3be (3:53be) +CheckKeyItems: ld a, [wCurItem] ld c, a ld hl, wKeyItems -.asm_d3c5 +.loop ld a, [hli] cp c - jr z, .asm_d3cf - cp $ff - jr nz, .asm_d3c5 + jr z, .done + cp -1 + jr nz, .loop and a ret -.asm_d3cf +.done scf ret -PutItemInTMPocket: ; d3d1 (3:53d1) +ReceiveTMHM: dec c - ld b, $0 + ld b, 0 ld hl, wTMsHMs add hl, bc ld a, [wItemQuantityChangeBuffer] add [hl] - cp $64 - jr nc, .asm_d3e3 + cp 100 + jr nc, .toomany ld [hl], a scf ret -.asm_d3e3 +.toomany and a ret -RemoveTMorHM: ; d3e5 (3:53e5) +TossTMHM: dec c - ld b, $0 + ld b, 0 ld hl, wTMsHMs add hl, bc ld a, [wItemQuantityChangeBuffer] ld b, a ld a, [hl] sub b - jr c, .asm_d406 + jr c, .nope ld [hl], a ld [wItemQuantityBuffer], a - jr nz, .asm_d404 + jr nz, .yup ld a, [wTMHMPocketScrollPosition] and a - jr z, .asm_d404 + jr z, .yup dec a ld [wTMHMPocketScrollPosition], a -.asm_d404 + +.yup scf ret -.asm_d406 +.nope and a ret -CheckTMorHM: ; d408 (3:5408) +CheckTMHM: dec c ld b, $0 ld hl, wTMsHMs @@ -443,107 +456,124 @@ CheckTMorHM: ; d408 (3:5408) scf ret -GetNumberedTMHM:: ; d414 (3:5414) +GetTMHMNumber:: +; Return the number of a TM/HM by item id c. ld a, c - cp ITEM_C3 - jr c, .asm_d41f - cp ITEM_DC - jr c, .asm_d41e +; Skip any dummy items. + cp ITEM_C3 ; TM04-05 + jr c, .done + cp ITEM_DC ; TM28-29 + jr c, .skip dec a -.asm_d41e +.skip dec a -.asm_d41f - sub $bf +.done + sub TM01 inc a ld c, a ret -GetNumberedTM: +GetNumberedTMHM: +; Return the item id of a TM/HM by number c. ld a, c +; Skip any gaps. cp ITEM_C3 - (TM01 - 1) - jr c, .asm_d42f + jr c, .done cp ITEM_DC - (TM01 - 1) - 1 - jr c, .asm_d42e + jr c, .skip_one +.skip_two inc a -.asm_d42e +.skip_one inc a -.asm_d42f +.done add TM01 dec a ld c, a ret -_CheckTossableItem:: ; d434 (3:5434) - ld a, $4 +_CheckTossableItem:: +; Return 1 in wItemAttributeParamBuffer and carry if wCurItem can't be removed from the bag. + ld a, ITEMATTR_PERMISSIONS call GetItemAttr - bit 7, a + bit CANT_TOSS_F, a jr nz, ItemAttr_ReturnCarry and a ret CheckSelectableItem: - ld a, $4 +; Return 1 in wItemAttributeParamBuffer and carry if wCurItem can't be selected. + ld a, ITEMATTR_PERMISSIONS call GetItemAttr - bit 6, a + bit CANT_SELECT_F, a jr nz, ItemAttr_ReturnCarry and a ret CheckItemPocket:: - ld a, $5 +; Return the pocket for wCurItem in wItemAttributeParamBuffer. + ld a, ITEMATTR_POCKET call GetItemAttr and $f ld [wItemAttributeParamBuffer], a ret CheckItemContext: - ld a, $6 +; Return the context for wCurItem in wItemAttributeParamBuffer. + ld a, ITEMATTR_HELP call GetItemAttr and $f ld [wItemAttributeParamBuffer], a ret CheckItemMenu: - ld a, $6 +; Return the menu for wCurItem in wItemAttributeParamBuffer. + ld a, ITEMATTR_HELP call GetItemAttr swap a and $f ld [wItemAttributeParamBuffer], a ret -GetItemAttr: ; d46d (3:546d) +GetItemAttr: +; Get attribute a of wCurItem. + push hl push bc + ld hl, ItemAttributes ld c, a - ld b, $0 + ld b, 0 add hl, bc + xor a ld [wItemAttributeParamBuffer], a + ld a, [wCurItem] dec a ld c, a - ld a, $7 + ld a, ITEMATTR_STRUCT_LENGTH call AddNTimes ld a, BANK(ItemAttributes) call GetFarByte + pop bc pop hl ret ItemAttr_ReturnCarry: - ld a, $1 + ld a, 1 ld [wItemAttributeParamBuffer], a scf ret GetItemPrice: +; Return the price of wCurItem in de. push hl push bc - ld a, $0 + ld a, ITEMATTR_PRICE call GetItemAttr ld e, a - ld a, $1 + ld a, ITEMATTR_PRICE_HI call GetItemAttr ld d, a pop bc diff --git a/engine/items/tmhm.asm b/engine/items/tmhm.asm index 1849d23c..f5261123 100644 --- a/engine/items/tmhm.asm +++ b/engine/items/tmhm.asm @@ -23,7 +23,7 @@ TMHMPocket: .ConvertItemToTMHMNumber: ld a, [wCurItem] ld c, a - callfar GetNumberedTM + callfar GetNumberedTMHM ld a, c ld [wCurItem], a ret @@ -31,7 +31,7 @@ TMHMPocket: ConvertCurItemIntoCurTMHM: ld a, [wCurItem] ld c, a - callfar GetNumberedTMHM + callfar GetTMHMNumber ld a, c ld [wTempTMHM], a ret diff --git a/engine/overworld/variables.asm b/engine/overworld/variables.asm index 6f14c549..406cf715 100755 --- a/engine/overworld/variables.asm +++ b/engine/overworld/variables.asm @@ -120,4 +120,3 @@ _GetVarAction:: ld a, [wBattleResult] and $ff ^ BATTLERESULT_BITMASK jp .loadstringbuffer2 - diff --git a/engine/pokemon/health.asm b/engine/pokemon/health.asm index 022477b0..d11a073b 100755 --- a/engine/pokemon/health.asm +++ b/engine/pokemon/health.asm @@ -1,54 +1,62 @@ -HealParty: ; c69d (3:469d) +HealParty: xor a ld [wCurPartyMon], a ld hl, wPartySpecies -.asm_c6a4 +.loop ld a, [hli] cp -1 - jr z, .asm_c6bb + jr z, .done cp EGG - jr z, .asm_c6b2 + jr z, .next + push hl call HealPartyMon pop hl -.asm_c6b2 + +.next ld a, [wCurPartyMon] inc a ld [wCurPartyMon], a - jr .asm_c6a4 + jr .loop -.asm_c6bb +.done ret HealPartyMon: - ld a, $0 + ld a, MON_SPECIES call GetPartyParamLocation ld d, h ld e, l - ld hl, $20 + + ld hl, MON_STATUS add hl, de xor a ld [hli], a ld [hl], a - ld hl, $24 + + ld hl, MON_MAXHP add hl, de + + ; bc = MON_HP ld b, h ld c, l dec bc dec bc + ld a, [hli] ld [bc], a inc bc ld a, [hl] ld [bc], a - farcall Functionf900 + + farcall RestoreAllPP ret ComputeHPBarPixels: ; e = bc * (6 * 8) / de ld a, b or c - jr z, .asm_c722 + jr z, .zero push hl xor a ldh [hMultiplicand + 0], a @@ -62,7 +70,7 @@ ComputeHPBarPixels: ; We need de to be under 256 because hDivisor is only 1 byte. ld a, d and a - jr z, .asm_c711 + jr z, .divide ; divide de and hProduct by 4 srl d rr e @@ -78,25 +86,25 @@ ComputeHPBarPixels: ldh [hDividend + 3], a ld a, b ldh [hDividend + 2], a -.asm_c711 +.divide ld a, e ldh [hDivisor], a - ld b, $4 + ld b, 4 call Divide ldh a, [hQuotient + 3] ld e, a pop hl and a ret nz - ld e, $1 + ld e, 1 ret -.asm_c722 - ld e, $0 +.zero + ld e, 0 ret -AnimateHPBar: ; c725 (3:4725) +AnimateHPBar: call WaitBGMap - call AnimateHPBar_ + call _AnimateHPBar call WaitBGMap ret diff --git a/engine/pokemon/move_mon.asm b/engine/pokemon/move_mon.asm index 566e23ee..0c50dd4e 100755 --- a/engine/pokemon/move_mon.asm +++ b/engine/pokemon/move_mon.asm @@ -803,7 +803,7 @@ RetrieveMonFromDayCareLady: jp RetrieveBreedmon RetrieveBreedmon: - ld hl, wPokemonData + ld hl, wPartyCount ld a, [hl] cp PARTY_LENGTH jr nz, .room_in_party @@ -1693,7 +1693,7 @@ GivePoke:: call CopyBytes pop af and a - jr z, .set_caught_data + jr z, .wildmon pop de pop bc pop hl @@ -1750,8 +1750,8 @@ GivePoke:: call CloseSRAM jr .skip_nickname -.set_caught_data - callfar Functionc7cd0 +.wildmon + callfar GiveANickname_YesNo pop de jr c, .skip_nickname call InitNickname diff --git a/home/names.asm b/home/names.asm index 35b3d132..e3da8793 100755 --- a/home/names.asm +++ b/home/names.asm @@ -196,7 +196,7 @@ GetTMHMName:: push de ld a, [wNamedObjectIndexBuffer] ld c, a - callfar GetNumberedTMHM + callfar GetTMHMNumber pop de ; HM numbers start from 51, not 1 diff --git a/layout.link b/layout.link index 795b7535..59cc54c9 100644 --- a/layout.link +++ b/layout.link @@ -64,7 +64,6 @@ ROMX $0e ROMX $0f "Battle Core" ROMX $10 - org $4000 "bank10" ROMX $11 org $4000 @@ -46,6 +46,7 @@ INCLUDE "engine/pokemon/breedmon_level_growth.asm" INCLUDE "engine/pokemon/search2.asm" INCLUDE "engine/events/bug_contest/caught_mon.asm" INCLUDE "engine/items/item_effects.asm" +INCLUDE "engine/battle_anims/pokeball_wobble.asm" INCLUDE "engine/pokemon/knows_move.asm" @@ -416,13 +417,13 @@ DoPoisonStep:: dr $50610, $506f2 SweetScentFromMenu:: dr $506f2, $50763 -SquirtbottleFunction:: +_Squirtbottle:: dr $50763, $507ac -CardKeyFunction:: +_CardKey:: dr $507ac, $507e7 -BasementKeyFunction:: +_BasementKey:: dr $507e7, $50819 -SacredAshFunction:: +_SacredAsh:: dr $50819, $5087d CopyMonToTempMon:: dr $5087d, $50940 @@ -626,7 +627,7 @@ _TownMap:: dr $9188a, $919c1 PlayRadio:: dr $919c1, $91a4f -TownMap_:: +PokegearMap:: dr $91a4f, $91a61 _FlyMap:: dr $91a61, $91c7f @@ -679,7 +680,7 @@ PrintTodaysLuckyNumber:: dr $c7bad, $c7bbf CheckPartyFullAfterContest:: dr $c7bbf, $c7cd0 -Functionc7cd0:: +GiveANickname_YesNo:: dr $c7cd0, $c7cde @@ -1740,11 +1740,11 @@ wd151:: wFailedToFlee:: db ; d152 wNumFleeAttempts:: db ; d153 -wd154:: ds 1 ; d154 -wROMBankBackup:: ds 1 ; d155 +wMonTriedToEvolve:: db ; d154 +wROMBankBackup:: db ; d155 wFarByte:: wTempBank:: db ; d156 -wTimeOfDay:: ds 1 ; d157 +wTimeOfDay:: db ; d157 wd158:: ds 1 ; d158 wMapStatus:: db ; d159 |