diff options
Diffstat (limited to 'engine')
-rwxr-xr-x | engine/battle/anim_hp_bar.asm (renamed from engine/anim_hp_bar.asm) | 0 | ||||
-rw-r--r-- | engine/events/bug_contest/caught_mon.asm | 37 | ||||
-rw-r--r-- | engine/events/checktime.asm | 19 | ||||
-rwxr-xr-x | engine/events/engine_flags.asm (renamed from engine/engine_flags.asm) | 0 | ||||
-rwxr-xr-x | engine/events/specials.asm (renamed from engine/specials.asm) | 38 | ||||
-rwxr-xr-x | engine/gfx/color.asm (renamed from engine/color.asm) | 0 | ||||
-rwxr-xr-x | engine/items/item_effects.asm | 2897 | ||||
-rwxr-xr-x | engine/items/items.asm (renamed from engine/items.asm) | 0 | ||||
-rw-r--r-- | engine/math/sine.asm (renamed from engine/sine.asm) | 0 | ||||
-rwxr-xr-x | engine/overworld/variables.asm (renamed from engine/variables.asm) | 0 | ||||
-rw-r--r-- | engine/pokemon/breedmon_level_growth.asm | 27 | ||||
-rwxr-xr-x | engine/pokemon/health.asm (renamed from engine/health.asm) | 0 | ||||
-rw-r--r-- | engine/pokemon/knows_move.asm | 24 | ||||
-rwxr-xr-x | engine/pokemon/move_mon.asm (renamed from engine/move_mon.asm) | 0 | ||||
-rw-r--r-- | engine/pokemon/search2.asm | 134 | ||||
-rw-r--r-- | engine/smallflag.asm | 74 | ||||
-rw-r--r-- | engine/tilesets/map_palettes.asm | 110 |
17 files changed, 3341 insertions, 19 deletions
diff --git a/engine/anim_hp_bar.asm b/engine/battle/anim_hp_bar.asm index 561cba42..561cba42 100755 --- a/engine/anim_hp_bar.asm +++ b/engine/battle/anim_hp_bar.asm diff --git a/engine/events/bug_contest/caught_mon.asm b/engine/events/bug_contest/caught_mon.asm new file mode 100644 index 00000000..b2cc044a --- /dev/null +++ b/engine/events/bug_contest/caught_mon.asm @@ -0,0 +1,37 @@ +BugContest_SetCaughtContestMon: + ld a, [wContestMon] + and a + jr z, .firstcatch + ld [wNamedObjectIndexBuffer], a + farcall DisplayAlreadyCaughtText + farcall DisplayCaughtContestMonStats + lb bc, 14, 7 + call PlaceYesNoBox + ret c + +.firstcatch + call .generatestats + ld a, [wTempEnemyMonSpecies] + ld [wNamedObjectIndexBuffer], a + call GetPokemonName + ld hl, .ContestCaughtMonText + call PrintText + ret + +.generatestats + ld a, [wTempEnemyMonSpecies] + ld [wCurSpecies], a + ld [wCurPartySpecies], a + call GetBaseData + xor a + ld bc, PARTYMON_STRUCT_LENGTH + ld hl, wContestMon + call ByteFill + xor a + ld [wMonType], a + ld hl, wContestMon + jp GeneratePartyMonStats + +.ContestCaughtMonText: + text_far _ContestCaughtMonText + text_end diff --git a/engine/events/checktime.asm b/engine/events/checktime.asm new file mode 100644 index 00000000..6e470e88 --- /dev/null +++ b/engine/events/checktime.asm @@ -0,0 +1,19 @@ +CheckTime:: + ld a, [wTimeOfDay] + ld hl, .TimeOfDayTable + ld de, 2 + call IsInArray + inc hl + ld c, [hl] + ret c + + xor a + ld c, a + ret + +.TimeOfDayTable: + db MORN_F, MORN + db DAY_F, DAY + db NITE_F, NITE + db NITE_F, NITE + db -1 diff --git a/engine/engine_flags.asm b/engine/events/engine_flags.asm index 9fa5f8c0..9fa5f8c0 100755 --- a/engine/engine_flags.asm +++ b/engine/events/engine_flags.asm diff --git a/engine/specials.asm b/engine/events/specials.asm index 80d32a02..e51f3451 100755 --- a/engine/specials.asm +++ b/engine/events/specials.asm @@ -167,40 +167,40 @@ UnusedSetSeenMon: ; c3ac call SetSeenMon ret -FindPartyMonAboveLevel: ; c3b4 +FindPartyMonAboveLevel: ld a, [wScriptVar] ld b, a - farcall PartySearch_MaximumLevel ; same bank - jr z, asm_c3f2 - jr asm_c3ec + farcall _FindPartyMonAboveLevel ; same bank + jr z, FoundNone + jr FoundOne -FindPartyMonAtLeastThatHappy: ; c3c2 +FindPartyMonAtLeastThatHappy: ld a, [wScriptVar] ld b, a - farcall PartySearch_MinimumHappiness ; same bank - jr z, asm_c3f2 - jr asm_c3ec + farcall _FindPartyMonAtLeastThatHappy ; same bank + jr z, FoundNone + jr FoundOne -FindPartyMonThatSpecies: ; c3d0 +FindPartyMonThatSpecies: ld a, [wScriptVar] ld b, a - farcall PartySearch_SameSpecies ; same bank - jr z, asm_c3f2 - jr asm_c3ec + farcall _FindPartyMonThatSpecies ; same bank + jr z, FoundNone + jr FoundOne -FindPartyMonThatSpeciesYourTrainerID: ; c3de +FindPartyMonThatSpeciesYourTrainerID: ld a, [wScriptVar] ld b, a - farcall PartySearch_SameSpeciesAndYourID ; same bank - jr z, asm_c3f2 - jr asm_c3ec + farcall _FindPartyMonThatSpeciesYourTrainerID ; same bank + jr z, FoundNone + jr FoundOne -asm_c3ec - ld a, $1 +FoundOne: + ld a, TRUE ld [wScriptVar], a ret -asm_c3f2 +FoundNone: xor a ld [wScriptVar], a ret diff --git a/engine/color.asm b/engine/gfx/color.asm index 05c13b2b..05c13b2b 100755 --- a/engine/color.asm +++ b/engine/gfx/color.asm diff --git a/engine/items/item_effects.asm b/engine/items/item_effects.asm new file mode 100755 index 00000000..274b8468 --- /dev/null +++ b/engine/items/item_effects.asm @@ -0,0 +1,2897 @@ +_DoItemEffect:: ; e7a6 (3:67a6) + ld a, [wCurItem] + ld [wd151], a + call GetItemName + call CopyName1 + ld a, $1 + ld [wFieldMoveSucceeded], a + ld a, [wCurItem] + dec a + ld hl, .ItemEffects + rst JumpTable + 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 + ld a, [wBattleMode] + dec a + jp nz, Functionf7e7 + ld a, [wPartyCount] + cp PARTY_LENGTH + jr nz, .room_in_party_or_pc + ld a, $1 + call OpenSRAM + ld a, [$ad6c] + cp $14 + call CloseSRAM + jp z, FailToUseBall +.room_in_party_or_pc + xor a + ld [wWildMon], a + ld a, [wCurItem] + cp PARK_BALL + call nz, ReturnToBattle_UseBall + ld hl, wOptions + res NO_TEXT_SCROLL, [hl] + ld hl, Text_UsedItem ; $7884 + call PrintText + ld a, [wd114] + ld b, a + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jp z, .catch_without_fail + ld a, [wCurItem] + cp MASTER_BALL + jp z, .catch_without_fail + ld a, [wCurItem] + ld c, a + ld hl, BallMultiplierFunctionTable ; $6c73 +.get_multiplier_loop + ld a, [hli] + cp $ff + jr z, .skip_or_return_from_ball_fn + cp c + jr z, .call_ball_function + inc hl + inc hl + jr .get_multiplier_loop + +.call_ball_function + ld a, [hli] + ld h, [hl] + ld l, a + ld de, .skip_or_return_from_ball_fn + push de + jp hl + +.skip_or_return_from_ball_fn + ld a, [wCurItem] + cp LEVEL_BALL + ld a, b + jp z, .skip_hp_calc + ld a, b + ldh [hPrintNum4], a + ld hl, wEnemyMonHP + ld b, [hl] + inc hl + ld c, [hl] + inc hl + ld d, [hl] + inc hl + ld e, [hl] +; (3 * MaxHP - 2 * CurHP) / (3 * MaxHP) * level + sla c + rl b + ld h, d + ld l, e + add hl, de + add hl, de + ld d, h + ld e, l +; This routine is buggy. The intention is to get de, the Max HP score, +; to be an 8-bit number. To do this, we divide both bc and de by 4. +; It only does this division once, and doesn't check to make sure that +; e is not zero. In addition to passing along a divide-by-zero error, +; this could also cause an unusually small denominator to be passed, +; sending the resulting catch rate through the floor. + ld a, d + and a + jr z, .okay_hp_div + srl d + rr e + srl d + rr e + srl b + rr c + srl b + rr c + ld a, c + and a + jr nz, .okay_hp_div + ld c, $1 +.okay_hp_div + ld b, e + + push bc + ld a, b + sub c + ldh [hMultiplier], a + xor a + ldh [hDividend + 0], a + ldh [hMultiplicand + 0], a + ldh [hMultiplicand + 1], a + call Multiply + pop bc + + ld a, b + ldh [hDivisor], a + ld b, $4 + call Divide + + ldh a, [hQuotient + 2] + and a + jr nz, .statuscheck + ld a, 1 +.statuscheck +; This routine is buggy. It was intended that SLP and FRZ provide a higher +; catch rate than BRN/PSN/PAR, which in turn provide a higher catch rate than +; no status effect at all. But instead, it makes BRN/PSN/PAR provide no +; benefit. +; Uncomment the line below to fix this. + ld b, a + ld a, [wEnemyMonStatus] + and 1 << FRZ | SLP + ld c, $a + jr nz, .add_status + ; ld a, [wEnemyMonStatus] + and a + ld c, $5 + jr nz, .add_status + ld c, $0 +.add_status + ld a, b + add c + jr nc, .max_catch_rate + ld a, $ff +.max_catch_rate + ld d, a + push de + + ; BUG: farcall overwrites a, + ; and GetItemHeldEffect takes b anyway. + + ; This is probably the reason + ; the HELD_CATCH_CHANCE effect + ; is never used. + + ; Uncomment the line below to fix. + + ld a, [wBattleMonItem] + ; ld b, a + farcall GetItemHeldEffect ; d:7e9b + ld a, b + cp HELD_CATCH_CHANCE + pop de + ld a, d + jr nz, .skip_hp_calc + add c + jr nc, .skip_hp_calc + ld a, $ff +.skip_hp_calc + ld b, a + ld [wCurHPAnimMaxHP], a + call Random + cp b + ld a, $0 + jr z, .catch_without_fail + jr nc, .asm_ea23 +.catch_without_fail + ld a, [wEnemyMonSpecies] +.asm_ea23 + ld [wWildMon], a + ld c, 20 + call DelayFrames + ld a, [wCurItem] + cp POKE_BALL + 1 + jr c, .asm_ea34 + ld a, $5 +.asm_ea34 + ld [wcb67], a + ld de, ANIM_THROW_POKE_BALL + ld a, e + ld [wcf3e], a + ld a, d + ld [wcf3f], a + xor a + ldh [hBattleTurn], a + ld [wBuffer2], a + ld [wcf46], a + predef PlayBattleAnim + ld a, [wWildMon] + and a + jr nz, .caught + ld a, [wBuffer2] + cp $1 + ld hl, Text_ThePokemonBrokeFree ; $6e09 + jp z, .break_free + cp $2 + ld hl, Text_AppearedToBeCaught ; $6e0e + jp z, .break_free + cp $3 + ld hl, Text_AarghAlmostHadIt ; $6e13 + jp z, .break_free + cp $4 + ld hl, Text_ShootItWasSoCloseToo ; $6e18 + jp z, .break_free +.caught + ld hl, wEnemyMonStatus + ld a, [hli] + push af + inc hl + ld a, [hli] + push af + ld a, [hl] + push af + push hl + ld hl, wEnemyMonItem + ld a, [hl] + push af + push hl + ld hl, wEnemySubStatus5 + ld a, [hl] + push af + set SUBSTATUS_TRANSFORMED, [hl] + bit SUBSTATUS_TRANSFORMED, a + jr nz, .ditto + jr .not_ditto + +.ditto + ld a, DITTO + ld [wTempEnemyMonSpecies], a + jr .load_data + +.not_ditto + set SUBSTATUS_TRANSFORMED, [hl] + ld hl, wcbd0 + ld a, [wEnemyMonDVs] + ld [hli], a + ld a, [wEnemyMonMovesEnd + 1] + ld [hl], a +.load_data + ld a, [wTempEnemyMonSpecies] + ld [wCurPartySpecies], a + ld a, [wEnemyMonLevel] + ld [wCurPartyLevel], a + farcall LoadEnemyMon + pop af + ld [wEnemySubStatus5], a + pop hl + pop af + ld [hl], a + pop hl + pop af + ld [hld], a + pop af + ld [hld], a + dec hl + pop af + ld [hl], a + ld hl, wEnemySubStatus5 + bit SUBSTATUS_TRANSFORMED, [hl] + jr nz, .transformed + ld hl, wWildMonMoves + ld de, wEnemyMonMoves + ld bc, NUM_MOVES + call CopyBytes + ld hl, wWildMonPP + ld de, wEnemyMonPP + ld bc, NUM_MOVES + call CopyBytes +.transformed + ld a, [wEnemyMonSpecies] + ld [wWildMon], a + ld [wCurPartySpecies], a + ld [wd151], a + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + jp z, .finish_tutorial + ld hl, Text_GotchaMonWasCaught ; $6e1d + call PrintText + call ClearSprites + ld a, [wd151] + dec a + call CheckCaughtMon + ld a, c + push af + ld a, [wd151] + dec a + call SetSeenAndCaughtMon + pop af + and a + jr nz, .skip_dex + call CheckReceivedDex + jr z, .skip_dex + ld hl, Text_MonNewlyAddedToPokedex ; $6e44 + call PrintText + call ClearSprites + ld a, [wEnemyMonSpecies] + ld [wd151], a + predef NewPokedexEntry +.skip_dex + ld a, [wBattleType] + cp BATTLETYPE_CONTEST + jp z, .catch_bug_contest_mon + ld a, [wPartyCount] + cp PARTY_LENGTH + jr z, .send_mon_to_pc + xor a + ld [wMonType], a + call ClearSprites + predef TryAddMonToParty + ld a, [wCurItem] + cp FRIEND_BALL + jr nz, .skip_party_mon_friend_ball + ld a, [wPartyCount] + dec a + ld hl, wPartyMon1Happiness + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, FRIEND_BALL_HAPPINESS + ld [hl], a +.skip_party_mon_friend_ball + ld hl, Text_AskNicknameNewlyCaughtMon ; $6e49 + call PrintText + ld a, [wCurPartySpecies] + ld [wd151], a + call GetPokemonName + call YesNoBox + jp c, .end_ball_function + ld a, [wPartyCount] + dec a + ld [wCurPartyMon], a + ld hl, wPartyMon1Nickname + ld bc, MON_NAME_LENGTH + call AddNTimes + ld d, h + ld e, l + push de + xor a + ld [wMonType], a + ld b, $0 + farcall NamingScreen + call RotateThreePalettesRight + call Functiond9e + pop hl + ld de, wStringBuffer1 + call InitName + jp .end_ball_function + +.send_mon_to_pc + call ClearSprites + predef SendMonIntoBox + ld a, BANK(sBoxCount) + call OpenSRAM + ld a, [sBoxCount] + cp MONS_PER_BOX + jr nz, .not_full_yet + ld hl, wBattleResult + set 7, [hl] +.not_full_yet + ld a, [wCurItem] + cp FRIEND_BALL + jr nz, .skip_box_mon_friend_ball + ld a, FRIEND_BALL_HAPPINESS + ld [sBoxMon1Happiness], a +.skip_box_mon_friend_ball + call CloseSRAM + ld hl, Text_AskNicknameNewlyCaughtMon ; $6e49 + call PrintText + ld a, [wCurPartySpecies] + ld [wd151], a + call GetPokemonName + call YesNoBox + jr c, .init_name_in_sram + xor a + ld [wCurPartyMon], a + ld a, $2 + ld [wMonType], a + ld de, wMonOrItemNameBuffer + ld b, $0 + farcall NamingScreen + ld a, $1 + call OpenSRAM + ld hl, wMonOrItemNameBuffer + ld de, sBoxMonNicknames + ld bc, MON_NAME_LENGTH + call CopyBytes + ld hl, sBoxMonNicknames + ld de, wStringBuffer1 + call InitName + call CloseSRAM +.init_name_in_sram + ld a, $1 + call OpenSRAM + ld hl, sBoxMonNicknames + ld de, wMonOrItemNameBuffer + ld bc, MON_NAME_LENGTH + call CopyBytes + call CloseSRAM + ld hl, Text_SentToBillsPC ; $6e3f + call PrintText + call RotateThreePalettesRight + call Functiond9e + jr .end_ball_function + +.catch_bug_contest_mon + farcall BugContest_SetCaughtContestMon ; same bank + jr .end_ball_function + +.finish_tutorial + ld hl, Text_GotchaMonWasCaught ; $6e1d +.break_free + call PrintText + call ClearSprites +.end_ball_function + ld a, [wBattleType] + cp BATTLETYPE_TUTORIAL + ret z + cp BATTLETYPE_DEBUG + ret z + cp BATTLETYPE_CONTEST + jr z, .used_park_ball + ld a, [wWildMon] + and a + jr z, .toss + call ClearBGPalettes + call ClearTilemap +.toss + ld hl, wNumItems + inc a + ld [wItemQuantityChangeBuffer], a + jp TossItem + +.used_park_ball + ld hl, wParkBallsRemaining + dec [hl] + ret + +BallMultiplierFunctionTable: ; ec73 + dbw ULTRA_BALL, UltraBallMultiplier + dbw GREAT_BALL, GreatBallMultiplier + dbw SAFARI_BALL, SafariBallMultiplier ; Safari Ball, leftover from RBY + dbw HEAVY_BALL, HeavyBallMultiplier + dbw LEVEL_BALL, LevelBallMultiplier + dbw LURE_BALL, LureBallMultiplier + dbw FAST_BALL, FastBallMultiplier + dbw MOON_BALL, MoonBallMultiplier + dbw LOVE_BALL, LoveBallMultiplier + dbw PARK_BALL, ParkBallMultiplier + db $ff + +UltraBallMultiplier: + sla b + ret nc + ld b, $ff + ret + +GreatBallMultiplier: +SafariBallMultiplier: +ParkBallMultiplier: + ld a, b + srl a + add b + ld b, a + ret nc + ld b, $ff + ret + +HeavyBallMultiplier: + ld a, [wEnemyMon] + dec a + ld hl, PokedexDataPointerTable + ld e, a + ld d, $0 + add hl, de + add hl, de + rlca + rlca + and $3 + add BANK("Pokedex Entries 001-064") + ld d, a + ld a, BANK(PokedexDataPointerTable) + call GetFarHalfword +.loop + ld a, d + call GetFarByte + inc hl + cp "@" + jr nz, .loop + ld a, d + push bc + inc hl + inc hl + call GetFarHalfword + srl h + rr l + ld b, h + ld c, l + srl b + rr c + srl b + rr c + srl b + rr c + srl b + rr c + call .sub_bc + srl b + rr c + call .sub_bc + ld a, h + pop bc + jr .compare + +.sub_bc + push bc + ld a, b + cpl + ld b, a + ld a, c + cpl + ld c, a + inc bc + add hl, bc + pop bc + ret + +.compare + ld c, a + cp 1024 >> 8 ; 102.4 kg + jr c, .lightmon + ld hl, .WeightsTable ; $6d18 +.lookup + ld a, c + cp [hl] + jr c, .heavymon + inc hl + inc hl + jr .lookup + +.heavymon + inc hl + ld a, b + add [hl] + ld b, a + ret nc + ld b, $ff + ret + +.lightmon + ld a, b + sub 20 + ld b, a + ret nc + ld b, $1 + ret + +.WeightsTable +; weight factor, boost + db 2048 >> 8, 0 + db 3072 >> 8, 20 + db 4096 >> 8, 30 + db 65280 >> 8, 40 + +LureBallMultiplier: + ld a, [wBattleType] + cp BATTLETYPE_FISH + ret nz + ld a, b + add a + jr c, .asm_ed2d + add b + jr nc, .asm_ed2f +.asm_ed2d + ld a, $ff +.asm_ed2f + ld b, a + ret + +MoonBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 4 if mon evolves with moon stone +; Reality: no boost + push bc + ld a, [wTempEnemyMonSpecies] + dec a + ld c, a + ld b, $0 + ld hl, EvosAttacksPointers ; $67bd + add hl, bc + add hl, bc + ld a, BANK(EvosAttacksPointers) ; $10 + call GetFarHalfword + pop bc + push bc + ld a, BANK(EvosAttacksPointers) ; $10 + call GetFarByte + cp EVOLVE_ITEM + pop bc + ret nz + inc hl + inc hl + inc hl +; Moon Stone's constant from Pokémon Red is used. +; No Pokémon evolve with Burn Heal, +; so Moon Balls always have a catch rate of 1×. + push bc + ld a, BANK(EvosAttacksPointers) ; $10 + call GetFarByte + cp MOON_STONE_RED ; BURN_HEAL + pop bc + ret nz + sla b + jr c, .max + sla b + jr nc, .done +.max + ld b, $ff +.done + ret + +LoveBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 8 if mons are of same species, different sex +; Reality: multiply catch rate by 8 if mons are of same species, same sex + ld a, [wTempEnemyMonSpecies] + ld c, a + ld a, [wd0ee] + cp c + ret nz + push bc + ld a, [wd0ee] + ld [wCurPartySpecies], a + xor a + 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 + push de + ld a, [wTempEnemyMonSpecies] + ld [wCurPartySpecies], a + ld a, $4 + ld [wMonType], a + farcall GetGender ; 14:52f1 + jr c, .asm_edb9 + ld d, $0 + jr nz, .asm_eda6 + inc d +.asm_eda6 + ld a, d + pop de + cp d + pop bc + ret nz ; for the intended effect, this should be “ret z” + sla b + jr c, .asm_edb6 + sla b + jr c, .asm_edb6 + sla b + ret nc +.asm_edb6 + ld b, $ff + ret + +.asm_edb9 + pop de +.asm_edba + pop bc + ret + +FastBallMultiplier: +; This function is buggy. +; Intent: multiply catch rate by 4 if enemy mon is in one of the three +; FleeMons tables. +; Reality: multiply catch rate by 4 if enemy mon is one of the first three in +; the first FleeMons table. + ld a, [wTempEnemyMonSpecies] + ld c, a + ld hl, FleeMons + ld d, $3 +.asm_edc5 + ld a, BANK(FleeMons) + call GetFarByte + inc hl + cp $ff + jr z, .asm_eddc + cp c + jr nz, .asm_eddc ; for the intended effect, this should be “jr nz, .loop” + sla b + jr c, .asm_edd9 + sla b + ret nc +.asm_edd9 + ld b, $ff + ret + +.asm_eddc + dec d + jr nz, .asm_edc5 + ret + +LevelBallMultiplier: +; multiply catch rate by 8 if player mon level / 4 > enemy mon level +; multiply catch rate by 4 if player mon level / 2 > enemy mon level +; multiply catch rate by 2 if player mon level > enemy mon level + ld a, [wBattleMonLevel] + ld c, a + ld a, [wEnemyMonLevel] + cp c + ret nc + sla b + jr c, .asm_edfc + srl c + cp c + ret nc + sla b + jr c, .asm_edfc + srl c + cp c + ret nc + sla b + ret nc +.asm_edfc + ld b, $ff + ret + +; These two texts were carried over from gen 1. +; They are not used in gen 2, and are dummied out. + +Text_ThisMonCantBeCaught: + text_far Text_ThisMonCantBeCaught_ + db "@" + +Text_YouMissedThePokemon: + text_far Text_YouMissedThePokemon_ + db "@" + +Text_ThePokemonBrokeFree: + text_far Text_ThePokemonBrokeFree_ + db "@" + +Text_AppearedToBeCaught: + text_far Text_AppearedToBeCaught_ + db "@" + +Text_AarghAlmostHadIt: + text_far Text_AarghAlmostHadIt_ + db "@" + +Text_ShootItWasSoCloseToo: + text_far Text_ShootItWasSoCloseToo_ + db "@" + +Text_GotchaMonWasCaught: + text_far Text_GotchaMonWasCaught_ + text_asm + call WaitSFX + push bc + ld de, MUSIC_NONE + call PlayMusic + call DelayFrame + ld de, MUSIC_CAPTURE + call PlayMusic + pop bc + ld hl, Text_CaughtMonWaitbutton + ret + +Text_CaughtMonWaitbutton: + text_far Text_Promptbutton_2 + db "@" + +Text_SentToBillsPC: + text_far Text_SentToBillsPC_ + db "@" + +Text_MonNewlyAddedToPokedex: + text_far Text_MonNewlyAddedToPokedex_ + db "@" + +Text_AskNicknameNewlyCaughtMon: + text_far Text_AskNicknameNewlyCaughtMon_ + db "@" + +ReturnToBattle_UseBall: ; ee4e (3:6e4e) + farcall ReturnToBattle_UseBall_ ; 9:7307 + ret + +TownMap: ; ee55 (3:6e55) + farcall TownMap_ ; 24:5a4f + ret + +Bicycle: ; ee5c + farcall BicycleFunction ; same bank + ret + +FireStone: ; ee63 +LeafStone: ; ee63 +MoonStone: ; ee63 +SunStone: ; ee63 +Thunderstone: ; ee63 +WaterStone: ; ee63 + ld b, PARTYMENUACTION_EVO_STONE + call Functionf24f + jp c, .cancel + ld a, MON_ITEM + call GetPartyParamLocation + ld a, [hl] + cp EVERSTONE + jr z, .failed + ld a, $1 + ld [wd0d2], a + farcall EvolvePokemon ; 10:61db + ld a, [wd154] + and a + jr z, .failed + jp Functionf7dc + +.failed + call Functionf839 +.cancel + xor a + ld [wFieldMoveSucceeded], a + ret + + +Calcium: ; ee91 +Carbos: ; ee91 +HPUp: ; ee91 +Iron: ; ee91 +Protein: ; ee91 + ld b, PARTYMENUACTION_HEALING_ITEM + call Functionf24f + jp c, Functioneef3 + call Functionef49 + call Functionef2d + ld a, MON_STAT_EXP + call GetPartyParamLocation + add hl, bc + ld a, [hl] + cp 100 + jr nc, Functioneed7 + add 10 + ld [hl], a + call Functioneee0 + call Functionef2d + ld hl, StatStrings + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld de, wStringBuffer2 + ld bc, ITEM_NAME_LENGTH + call CopyBytes + call Functionf7c7 + ld hl, Text_StatRoseFromVitamin ; $6efa + call PrintText + ld c, HAPPINESS_USEDITEM + farcall ChangeHappiness + jp Functionf7dc + +Functioneed7: + ld hl, Text_WontHaveAnyEffect ; $7866 + call PrintText + jp ClearPalettes + +Functioneee0: ; eee0 (3:6ee0) + ld a, MON_MAXHP + call GetPartyParamLocation + ld d, h + ld e, l + ld a, MON_STAT_EXP - 1 + call GetPartyParamLocation + ld b, $1 + predef_jump CalcMonStats + +Functioneef3: ; eef3 (3:6ef3) + xor a + ld [wFieldMoveSucceeded], a + jp ClearPalettes + +Text_StatRoseFromVitamin: + text_far Text_StatRoseFromVitamin_ + db "@" + +StatStrings: + 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@" + +Functionef2d: ; ef2d (3:6f2d) + ld a, [wCurItem] + ld hl, StatOffsets +.asm_ef33 + cp [hl] + inc hl + jr z, .asm_ef3a + inc hl + jr .asm_ef33 + +.asm_ef3a + ld a, [hl] + ld c, a + ld b, $0 + ret + +StatOffsets: + 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) + ld a, [wCurPartySpecies] + ld [wCurSpecies], a + ld [wd151], a + ld a, $1f + call GetPartyParamLocation + ld a, [hl] + ld [wCurPartyLevel], a + call GetBaseData + ld a, [wCurPartyMon] + ld hl, wPartyMonNicknames + call GetNick + ret + +RareCandy: ; ef68 (3:6f68) + ld b, PARTYMENUACTION_HEALING_ITEM + call Functionf24f + jp c, Functioneef3 + call Functionef49 + ld a, MON_LEVEL + call GetPartyParamLocation + ld a, [hl] + cp MAX_LEVEL + jp nc, Functioneed7 + inc a + ld [hl], a + ld [wCurPartyLevel], a + push de + ld d, a + farcall CalcExpAtLevel + pop de + ld a, $8 + call GetPartyParamLocation + ldh a, [hQuotient] + ld [hli], a + ldh a, [hPrintNum3] + ld [hli], a + ldh a, [hPrintNum4] + ld [hl], a + ld a, $24 + call GetPartyParamLocation + ld a, [hli] + ld b, a + ld c, [hl] + push bc + call Functioneee0 + ld a, $25 + 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 + ld c, $1 + farcall ChangeHappiness + ld a, PARTYMENUTEXT_LEVEL_UP + call Functionf2a0 + xor a + ld [wMonType], a + predef CopyMonToTempMon + hlcoord 9, 0 + ld b, 10 + ld c, 9 + call Textbox + hlcoord 11, 1 + ld bc, $4 + predef PrintTempMonStats + call WaitPressAorB_BlinkCursor + xor a + ld [wMonType], a + ld a, [wCurPartySpecies] + ld [wd151], a + predef LearnLevelMoves + xor a + ld [wd0d2], a + farcall EvolvePokemon + jp Functionf7dc + +HealPowder: ; f003 (3:7003) + ld b, $1 + call Functionf24f + jp c, Functionf2f4 + call Functionf030 + cp $0 + jr nz, .asm_f01f + ld c, $f + farcall ChangeHappiness + call Functionf81d + 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 + ld a, $1 + ret z + call Functionf0ae + ld a, MON_STATUS + call GetPartyParamLocation + ld a, [hl] + and c + jr nz, .asm_f04a + call Functionf05f + ld a, $1 + ret nc + ld b, PARTYMENUTEXT_HEAL_CONFUSION +.asm_f04a + xor a + ld [hl], a + ld a, b + ld [wPartyMenuActionText], a + call Functionf086 + call Functionf7c7 + call Functionf2cf + call Functionf7dc + ld a, $0 + ret + +Functionf05f: ; f05f (3:705f) + call Functionf2fc + jr nc, .asm_f072 + ld a, [wPlayerSubStatus3] + bit SUBSTATUS_CONFUSED, a + jr z, .asm_f072 + ld a, c + cp $ff + jr nz, .asm_f072 + scf + ret + +.asm_f072 + and a + ret + +RestoreBattlemonHP: + call Functionf2fc + ret nc + ld a, $22 + call GetPartyParamLocation + ld a, [hli] + ld [wBattleMonHP], a + ld a, [hld] + ld [wBattleMonHP + 1], a + ret + +Functionf086: ; f086 (3:7086) + call Functionf2fc + ret nc + xor a + ld [wBattleMonStatus], a + ld hl, wPlayerSubStatus5 + res 0, [hl] + ld hl, wPlayerSubStatus1 + res 0, [hl] + call Functionf0ae + ld a, c + cp $ff + jr nz, .asm_f0a5 + ld hl, wPlayerSubStatus3 + res 7, [hl] +.asm_f0a5 + push bc + farcall CalcPlayerStats ; d:66f6 + pop bc + ret + +Functionf0ae: ; f0ae (3:70ae) + push hl + ld a, [wCurItem] + ld hl, .healingactions ; $70c7 + ld bc, $3 +.asm_f0b8 + cp [hl] + jr z, .asm_f0be + add hl, bc + jr .asm_f0b8 + +.asm_f0be + inc hl + ld b, [hl] + inc hl + ld a, [hl] + ld c, a + cp $ff + 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 + rst JumpTable + ret + +.Jumptable: + dw Functionf2f8 + dw Functionf2ef + dw Functionf2f4 + +RevivalHerb: ; f0ff + ld b, $1 + call Functionf24f + jp c, Functionf2f4 + call Functionf12c + cp $0 + jr nz, .asm_f11b + ld c, $11 + farcall ChangeHappiness + call Functionf81d + ld a, $0 +.asm_f11b + jp Functionf0f4 + +MaxRevive: ; f11e +Revive: ; f11e + ld b, $1 + call Functionf24f + jp c, Functionf2f4 + call Functionf12c + jp Functionf0f4 + +Functionf12c: ; f12c (3:712c) + call Functionf363 + ld a, $1 + ret nz + ld a, [wBattleMode] + and a + jr z, .asm_f15a + ld a, [wCurPartyMon] + ld c, a + ld d, $0 + ld hl, wcbda + ld b, CHECK_FLAG + predef SmallFarFlagAction + ld a, c + and a + jr z, .asm_f15a + ld a, [wCurPartyMon] + ld c, a + ld hl, wcb42 + ld b, SET_FLAG + predef SmallFarFlagAction +.asm_f15a + 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 + ld [wPartyMenuActionText], a + call Functionf2cf + call Functionf7dc + 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) + xor a + ld [wLowHealthAlarm], a + call Functionf319 + ld a, $20 + call GetPartyParamLocation + xor a + ld [hli], a + ld [hl], a + call Functionf086 + call RestoreBattlemonHP + call Functionf231 + ld a, $f5 + ld [wPartyMenuActionText], a + call Functionf2cf + call Functionf7dc + ld a, $0 + ret + +BitterBerry: ; f1c0 + ld hl, wPlayerSubStatus3 + bit 7, [hl] + ld a, $1 + jr z, .asm_f1d9 + res 7, [hl] + xor a + ldh [hBattleTurn], a + call Functionf7d0 + 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 + push bc + call Functionf1ff + pop bc + cp $0 + jr nz, .asm_f1fc + farcall ChangeHappiness + call Functionf81d + ld a, $0 +.asm_f1fc + jp Functionf0f4 + +Functionf1ff: ; f1ff (3:71ff) + ld b, PARTYMENUACTION_HEALING_ITEM + call Functionf24f + ld a, $2 + ret c + call Functionf363 + ld a, $1 + ret z + call CalculateCurHPAnimRemainingHP + ld a, $1 + ret nc + xor a + ld [wLowHealthAlarm], a + call Functionf3eb + call Functionf327 + call RestoreBattlemonHP + call Functionf231 + ld a, PARTYMENUTEXT_HEAL_HP + ld [wPartyMenuActionText], a + call Functionf2cf + call Functionf7dc + ld a, $0 + ret + +Functionf231: ; f231 (3:7231) + push de + ld de, $4 + call WaitPlaySFX + pop de + ld a, [wCurPartyMon] + hlcoord 11, 0 + ld bc, $28 + call AddNTimes + ld a, $2 + ld [wWhichHPBar], a + predef_jump AnimateHPBar + +Functionf24f: ; f24f (3:724f) + call Functionf261 + ret c + ld a, [wCurPartySpecies] + cp EGG + jr nz, .asm_f25f + call Functionf82f + scf + ret + +.asm_f25f + and a + ret + +Functionf261: ; f261 (3:7261) + ld a, b + ld [wPartyMenuActionText], a + push hl + push de + push bc + call ClearBGPalettes + call Functionf272 + pop bc + pop de + pop hl + ret + +Functionf272: ; f272 (3:7272) + farcall LoadPartyMenuGFX + farcall InitPartyMenuWithCancel + farcall InitPartyMenuGFX + farcall WritePartyMenuTilemap + farcall PrintPartyMenuText + call WaitBGMap + call SetPalettes + call DelayFrame + farcall PartyMenuSelect + ret + +Functionf2a0: ; f2a0 (3:72a0) + ld [wPartyMenuActionText], a + ld a, [wCurPartySpecies] + push af + ld a, [wCurPartyMon] + push af + push hl + push de + push bc + farcall WritePartyMenuTilemap + farcall PrintPartyMenuActionText + call WaitBGMap + call SetPalettes + call DelayFrame + pop bc + pop de + pop hl + pop af + ld [wCurPartyMon], a + pop af + ld [wCurPartySpecies], a + ret + +Functionf2cf: ; f2cf (3:72cf) + xor a + ldh [hBGMapMode], a + hlcoord 0, 0 + ld bc, SCREEN_HEIGHT * SCREEN_WIDTH + ld a, " " + call ByteFill + ld a, [wPartyMenuActionText] + call Functionf2a0 + ld a, $1 + ldh [hBGMapMode], a + ld c, 50 + call DelayFrames + jp WaitPressAorB_BlinkCursor + +Functionf2ef: ; f2ef (3:72ef) + call Functionf839 + jr Functionf2f8 + +Functionf2f4: ; f2f4 (3:72f4) + xor a + ld [wFieldMoveSucceeded], a +Functionf2f8: ; f2f8 (3:72f8) + call ClearPalettes + ret + +Functionf2fc: ; f2fc (3:72fc) + ld a, [wBattleMode] + and a + ret z + ld a, [wCurPartyMon] + push hl + ld hl, wCurBattleMon + cp [hl] + pop hl + jr nz, .asm_f30e + scf + ret + +.asm_f30e + xor a + ret + +Functionf310: ; f310 (3:7310) + call GetCurHPAnimMaxHP + srl d + rr e + jr asm_f31c + +Functionf319: ; f319 (3:7319) + call GetCurHPAnimMaxHP +asm_f31c + ld a, MON_HP + call GetPartyParamLocation + ld [hl], d + inc hl + ld [hl], e + jp CopyCurHPToAnimBufferNewHP + +Functionf327: ; f327 (3:7327) + ld a, $23 + call GetPartyParamLocation + ld a, [hl] + add e + ld [hld], a + ld a, [hl] + adc d + ld [hl], a + jr c, .asm_f34b + call CopyCurHPToAnimBufferNewHP + 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, .asm_f34e +.asm_f34b + call Functionf319 +.asm_f34e + ret + +Functionf34f: ; f34f (3:734f) + 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, .asm_f35f + xor a + ld [hld], a + ld [hl], a +.asm_f35f + call CopyCurHPToAnimBufferNewHP + ret + +Functionf363: ; f363 (3:7363) + push de + call CopyMaxHPToAnimBufferMaxHP + call CopyCurHPToAnimBufferOldHP + call GetCurHPAnimOldHP + ld a, d + or e + pop de + ret + +CalculateCurHPAnimRemainingHP: ; f371 (3:7371) + call GetCurHPAnimOldHP + ld h, d + ld l, e + call GetCurHPAnimMaxHP + ld a, l + sub e + ld a, h + sbc d + ret + +CopyCurHPToAnimBufferNewHP: ; f37e (3:737e) + ld a, MON_HP + call GetPartyParamLocation + ld a, [hli] + ld [wCurHPAnimNewHP + 1], a + ld a, [hl] + ld [wCurHPAnimNewHP], a + ret + +SetCurHPAnimNewHP: + ld a, d + ld [wCurHPAnimNewHP + 1], a + ld a, e + ld [wCurHPAnimNewHP], a + ret + +GetCurHPAnimNewHP: + ld a, [wCurHPAnimNewHP + 1] + ld d, a + ld a, [wCurHPAnimNewHP] + ld e, a + ret + +CopyCurHPToAnimBufferOldHP: ; f39e (3:739e) + ld a, MON_HP + call GetPartyParamLocation + ld a, [hli] + ld [wCurHPAnimOldHP + 1], a + ld a, [hl] + ld [wCurHPAnimOldHP], a + ret + +GetCurHPAnimOldHP: ; f3ac (3:73ac) + ld a, [wCurHPAnimOldHP + 1] + ld d, a + ld a, [wCurHPAnimOldHP] + ld e, a + ret + +CopyMaxHPToAnimBufferMaxHP: ; f3b5 (3:73b5) + push hl + ld a, MON_MAXHP + call GetPartyParamLocation + ld a, [hli] + ld [wCurHPAnimMaxHP + 1], a + ld a, [hl] + ld [wCurHPAnimMaxHP], a + pop hl + ret + +GetCurHPAnimMaxHP: ; f3c5 (3:73c5) + ld a, [wCurHPAnimMaxHP + 1] + ld d, a + ld a, [wCurHPAnimMaxHP] + ld e, a + ret + +GetOneFifthMaxHP: ; f3ce (3:73ce) + 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 + 1] + ld d, a + ldh a, [hQuotient + 2] + ld e, a + pop bc + ret + +Functionf3eb: ; f3eb (3:73eb) + push hl + ld a, [wCurItem] + ld hl, HealingItemParameters + ld d, a +.asm_f3f3 + ld a, [hli] + cp -1 + jr z, .asm_f3ff + cp d + jr z, .asm_f400 + inc hl + inc hl + jr .asm_f3f3 + +.asm_f3ff + scf +.asm_f400 + 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 + +Softboiled_MilkDrinkFunction: + ld a, [wPartyMenuCursor] + dec a + ld b, a + call Functionf46f + jr c, .asm_f469 + ld a, b + ld [wCurPartyMon], a + call Functionf363 + call GetOneFifthMaxHP + call Functionf34f + push bc + call Functionf231 + pop bc + call GetOneFifthMaxHP + ld a, c + ld [wCurPartyMon], a + call Functionf363 + call Functionf327 +.asm_f45d + call Functionf231 + ld a, PARTYMENUTEXT_HEAL_HP + call Functionf2a0 + call JoyWaitAorB +.asm_f469 + ld a, b + inc a + ld [wPartyMenuCursor], a + ret + +Functionf46f: ; f46f (3:746f) + push bc + ld a, $1 + ld [wPartyMenuActionText], a + call Functionf272 + pop bc + jr c, .asm_f494 + ld a, [wPartyMenuCursor] + dec a + ld c, a + ld a, b + cp c + jr z, .asm_f496 + ld a, c + ld [wCurPartyMon], a + call Functionf363 + jr z, .asm_f496 + call CalculateCurHPAnimRemainingHP + jr nc, .asm_f496 + xor a + ret + +.asm_f494 + scf + ret + +.asm_f496 + push bc + ld hl, Text_MilkDrinkCantBeUsed + call MenuTextboxBackup + pop bc + jr Functionf46f + +Text_MilkDrinkCantBeUsed: + text_far Text_MilkDrinkCantBeUsed_ + db "@" + +EscapeRope: ; f4a5 (3:74a5) + xor a + ld [wFieldMoveSucceeded], a + farcall EscapeRopeFunction ; same bank + ld a, [wFieldMoveSucceeded] + cp $1 + call z, Functionf7dc + ret + +SuperRepel: ; f4b8 (3:74b8) + ld b, 200 + jr asm_f4c2 + +MaxRepel: ; f4bc (3:74bc) + ld b, 250 + jr asm_f4c2 + +Repel: ; f4c0 (3:74c0) + ld b, 100 +asm_f4c2 + ld a, [wRepelSteps] + and a + ld hl, Text_RepelsEffectsStillLinger + jp nz, PrintText + ld a, b + ld [wRepelSteps], a + jp Functionf7d0 + +Text_RepelsEffectsStillLinger: + text_far Text_RepelUsedEarlierIsStillInEffect + db "@" + +XAccuracy: ; f4d8 (3:74d8) + ld hl, wPlayerSubStatus4 + bit SUBSTATUS_X_ACCURACY, [hl] + jp nz, Functionf811 + set SUBSTATUS_X_ACCURACY, [hl] + jp Functionf7d0 + +PokeDoll: ; f4e5 (3:74e5) + ld a, [wBattleMode] + dec a + jr nz, .asm_f4f6 + inc a + ld [wd11c], a + inc a + ld [wBattleResult], a + jp Functionf7d0 + +.asm_f4f6 + xor a + ld [wFieldMoveSucceeded], a + ret + +GuardSpec: ; f4fb (3:74fb) + ld hl, wPlayerSubStatus4 + bit SUBSTATUS_MIST, [hl] + jp nz, Functionf811 + set SUBSTATUS_MIST, [hl] + jp Functionf7d0 + +DireHit: ; f508 (3:7508) + ld hl, wPlayerSubStatus4 + bit SUBSTATUS_FOCUS_ENERGY, [hl] + jp nz, Functionf811 + set SUBSTATUS_FOCUS_ENERGY, [hl] + jp Functionf7d0 + +XAttack: ; f515 +XDefend: ; f515 +XSpecial: ; f515 +XSpeed: ; f515 + call Functionf7d0 + ld a, [wCurItem] + ld hl, .x_item_table +.asm_f51e + cp [hl] + jr z, .asm_f525 + inc hl + inc hl + jr .asm_f51e + +.asm_f525 + inc hl + ld b, [hl] + xor a + ldh [hBattleTurn], a + ld [wcb45], a + ld [wcbeb], a + farcall CheckIfStatCanBeRaised + call WaitSFX + farcall BattleCommand_StatUpMessage + farcall BattleCommand_StatUpFailText + ld a, [wCurBattleMon] + ld [wCurPartyMon], a + ld c, HAPPINESS_USEDXITEM + farcall ChangeHappiness + ret + +.x_item_table + db X_ATTACK, ATTACK + db X_DEFEND, DEFENSE + db X_SPEED, SPEED + db X_SPECIAL, SP_ATTACK + +PokeFlute: ; f55c (3:755c) + ld a, [wBattleMode] + and a + jr nz, .dummy +.dummy + + xor a + ld [wceed], a + + ld b, $ff ^ SLP + + ld hl, wPartyMon1Status + call .CureSleep + + ld a, [wBattleMode] + cp $1 + jr z, .skip_otrainer + ld hl, wOTPartyMon1Status + call .CureSleep +.skip_otrainer + + ld hl, wBattleMonStatus + ld a, [hl] + and b + ld [hl], a + ld hl, wEnemyMonStatus + ld a, [hl] + and b + ld [hl], a + + ld a, [wceed] + and a + ld hl, Text_NowThatsACatchyTune ; $75bc + jp z, PrintText + ld hl, Text_PlayedThePokeFlute ; $75c6 + call PrintText + + ld a, [wLowHealthAlarm] + and $80 + jr nz, .dummy2 +.dummy2 + ld hl, Text_AllSleepingMonWokeUp ; $75c1 + jp PrintText + +.CureSleep: ; f5a4 (3:75a4) + ld de, PARTYMON_STRUCT_LENGTH + ld c, PARTY_LENGTH + +.loop + ld a, [hl] + push af + and SLP + jr z, .not_asleep + ld a, 1 + ld [wceed], a +.not_asleep + pop af + and b + ld [hl], a + add hl, de + dec c + jr nz, .loop + ret + +Text_NowThatsACatchyTune: + text_far Text_NowThatsACatchyTune_ + db "@" + +Text_AllSleepingMonWokeUp: + text_far Text_AllSleepingMonWokeUp_ + db "@" + +Text_PlayedThePokeFlute: + text_far Text_PlayedThePokeFlute_ + text_asm + ld a, [wBattleMode] + and a + jr nz, .asm_f5dc + push de + ld de, SFX_POKEFLUTE + call WaitPlaySFX + call WaitSFX + pop de +.asm_f5dc + ld hl, .terminator + ret + +.terminator db "@" + +CoinCase: ; f5e1 (3:75e1) + ld hl, Text_CoinCase + jp MenuTextboxWaitButton + +Text_CoinCase: + text_far Text_CoinCase_ + db "@" + +OldRod: ; f5ec (3:75ec) + ld e, $0 + jr UseRod + +GoodRod: ; f5f0 (3:75f0) + ld e, $1 + jr UseRod + +SuperRod: ; f5f4 (3:75f4) + ld e, $2 + jr UseRod + +UseRod: + farcall FishingRodFunction ; same bank + ret + +ItemfinderEffect: ; f5ff (3:75ff) + farcall ItemFinder + ret + +Elixer: ; f606 +Ether: ; f606 +MaxElixer: ; f606 +MaxEther: ; f606 +Mysteryberry: ; f606 +PPUp: ; f606 (3:7606) + ld a, [wCurItem] + ld [wMovementBufferCount], a +.asm_f60c + ld b, $1 + call Functionf24f + jp c, Functionf727 +.asm_f614 + ld a, [wMovementBufferCount] + cp MAX_ELIXER + jp z, Functionf6f6 + cp ELIXER + jp z, Functionf6f6 + ld hl, Text_RaiseThePPOfWhichMove + ld a, [wMovementBufferCount] + cp PP_UP + jr z, .asm_f62e + ld hl, Text_RestoreThePPOfWhichMove +.asm_f62e + call PrintText + ld a, [wcfc7] + push af + xor a + ld [wcfc7], a + ld a, $2 + ld [wd11f], a + ld a, $f + ld hl, $62f3 + rst FarCall + pop bc + ld a, b + ld [wcfc7], a + jr nz, .asm_f60c + ld hl, wPartyMon1Moves + ld bc, $30 + call Functionf9aa + push hl + ld a, [hl] + ld [wd151], a + call GetMoveName + call CopyName1 + pop hl + ld a, [wceed] + cp PP_UP + jp nz, Functionf6ee + ld a, [hl] + cp $a6 + jr z, .asm_f676 + ld bc, $15 + add hl, bc + ld a, [hl] + cp $c0 + jr c, .asm_f67e +.asm_f676 + ld hl, Text_PPIsMaxedOut ; $7776 + call PrintText + jr .asm_f614 + +.asm_f67e + ld a, [hl] + add $40 + ld [hl], a + ld a, $1 + ld [wd151], a + call Functionf893 + call Functionf7c7 + ld hl, Text_PPsIncreased ; $777b + call PrintText +asm_f693 + call ClearPalettes + jp Functionf7dc + +asm_f699 + ld a, [wBattleMode] + and a + jr z, .asm_f6b3 + ld a, [wCurPartyMon] + ld b, a + ld a, [wCurBattleMon] + cp b + jr nz, .asm_f6b3 + ld a, [wPlayerSubStatus5] + bit SUBSTATUS_TRANSFORMED, a + jr nz, .asm_f6b3 + call Functionf6be +.asm_f6b3 + call Functionf7c7 + ld hl, Text_PPWasRestored + call PrintText + jr asm_f693 + +Functionf6be: ; f6be (3:76be) + ld a, [wCurPartyMon] + ld hl, wPartyMon1Moves + ld bc, $30 + call AddNTimes + ld de, wBattleMonMoves + ld b, $4 +.asm_f6cf + ld a, [de] + and a + jr z, .asm_f6ed + cp [hl] + jr nz, .asm_f6e8 + push hl + push de + push bc + inc de + inc de + inc de + inc de + inc de + inc de + ld bc, $15 + add hl, bc + ld a, [hl] + ld [de], a + pop bc + pop de + pop hl +.asm_f6e8 + inc hl + inc de + dec b + jr nz, .asm_f6cf +.asm_f6ed + ret + +Functionf6ee: ; f6ee (3:76ee) + call Functionf72f + jr nz, asm_f699 + jp Functionf724 + +Functionf6f6: ; f6f6 (3:76f6) + xor a + ld hl, wMenuCursorY + ld [hli], a + ld [hl], a + ld b, $4 +.asm_f6fe + push bc + ld hl, wPartyMon1Moves + ld bc, $30 + call Functionf9aa + ld a, [hl] + and a + jr z, .asm_f715 + call Functionf72f + jr z, .asm_f715 + ld hl, wcee1 + inc [hl] +.asm_f715 + ld hl, wMenuCursorY + inc [hl] + pop bc + dec b + jr nz, .asm_f6fe + ld a, [wcee1] + and a + jp nz, asm_f699 +Functionf724: ; f724 (3:7724) + call Functionf839 +Functionf727: ; f727 (3:7727) + call ClearPalettes + xor a + ld [wFieldMoveSucceeded], a + ret + +Functionf72f: ; f72f (3:772f) + xor a + ld [wMonType], a + call GetMaxPPOfMove + ld hl, wPartyMon1PP + ld bc, $30 + call Functionf9aa + ld a, [wd151] + ld b, a + ld a, [hl] + and $3f + cp b + jr nc, .asm_f76a + 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 + ld a, [hl] + and $3f + add c + cp b + jr nc, .asm_f764 + ld b, a +.asm_f764 + ld a, [hl] + and $c0 + or b + ld [hl], a + ret + +.asm_f76a + xor a + ret + +Text_RaiseThePPOfWhichMove: + text_far Text_RaiseThePPOfWhichMove_ + db "@" + +Text_RestoreThePPOfWhichMove: + text_far Text_RestoreThePPOfWhichMove_ + db "@" + +Text_PPIsMaxedOut: + text_far Text_PPIsMaxedOut_ + db "@" + +Text_PPsIncreased: + text_far Text_PPsIncreased_ + db "@" + +Text_PPWasRestored: + text_far Text_PPWasRestored_ + db "@" + +Squirtbottle: ; f785 (3:7785) + farcall SquirtbottleFunction ; 14:4763 + ret + +CardKey: ; f78c (3:778c) + farcall CardKeyFunction ; 14:47ac + ret + +BasementKey: ; f793 (3:7793) + farcall BasementKeyFunction ; 14:47e7 + ret + +SacredAsh: ; f79a (3:779a) + farcall SacredAshFunction ; 14:4819 + ld a, [wFieldMoveSucceeded] + cp $1 + ret nz + call Functionf7dc + ret + +NormalBox: ; f7aa (3:77aa) + ld c, DECOFLAG_SILVER_TROPHY_DOLL + jr asm_f7b0 + +GorgeousBox: ; f7ae (3:77ae) + ld c, DECOFLAG_GOLD_TROPHY_DOLL +asm_f7b0 + farcall ReceiveDecorationC ; 9:70d5 + ld hl, Text_TrophyInside ; $77bf + call PrintText + jp Functionf7dc + +Text_TrophyInside: + text_far Text_TrophyInside_ + db "@" + +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 + jp Functionf834 + +Functionf7c7: ; f7c7 (3:77c7) + push de + ld de, SFX_FULL_HEAL + call WaitPlaySFX + pop de + ret + +Functionf7d0: ; f7d0 (3:77d0) + ld hl, Text_UsedItem + call PrintText + call Functionf7c7 + call WaitPressAorB_BlinkCursor +Functionf7dc: ; f7dc (3:77dc) + ld hl, wTMsHMsEnd + ld a, $1 + ld [wItemQuantityChangeBuffer], a + jp TossItem + +Functionf7e7: ; f7e7 (3:77e7) + call ReturnToBattle_UseBall + ld de, Start + ld a, e + ld [wcf3e], a + ld a, d + ld [wcf3f], a + xor a + ld [wcb67], a + ldh [hBattleTurn], a + ld [wcf46], a + predef PlayBattleAnim + ld hl, Text_BlockedTheBall + call PrintText + ld hl, Text_DontBeAThief + call PrintText + jr Functionf7dc + +Functionf811: ; f811 (3:7811) + ld hl, Text_WontHaveAnyEffect + call PrintText + ld a, $2 + ld [wFieldMoveSucceeded], a + ret + +Functionf81d: ; f81d (3:781d) + ld hl, Text_LooksBitter + jp PrintText + +FailToUseBall: ; f823 (3:7823) + ld hl, Text_CantUseBallBoxIsFull + call PrintText + ld a, $2 + ld [wFieldMoveSucceeded], a + ret + +Functionf82f: ; f82f (3:782f) + ld hl, Text_CantUseOnEgg + jr asm_f84b + +Functionf834: ; f834 (3:7834) + ld hl, Text_IsntTheTimeToUseThat + jr asm_f84b + +Functionf839: ; f839 (3:7839) + ld hl, Text_WontHaveAnyEffect + jr asm_f84b + +Functionf83e: + ld hl, Text_BelongsToSomeoneElse + jr asm_f84b + +Functionf843: + ld hl, Text_CyclingIsntAllowed + jr asm_f84b + +Functionf848: + ld hl, Text_CantGetOnYourItemNow +asm_f84b + xor a + ld [wFieldMoveSucceeded], a + jp PrintText + +Text_LooksBitter: + text_far Text_LooksBitter_ + db "@" + +Text_CantUseOnEgg: + text_far Text_CantUseOnEgg_ + db "@" + +Text_IsntTheTimeToUseThat: + text_far Text_IsntTheTimeToUseThat_ + db "@" + +Text_BelongsToSomeoneElse: + text_far Text_BelongsToSomeoneElse_ + db "@" + +Text_WontHaveAnyEffect: + text_far Text_WontHaveAnyEffect_ + db "@" + +Text_BlockedTheBall: + text_far Text_BlockedTheBall_ + db "@" + +Text_DontBeAThief: + text_far Text_DontBeAThief_ + db "@" + +Text_CyclingIsntAllowed: + text_far Text_CyclingIsntAllowed_ + db "@" + +Text_CantGetOnYourItemNow: + text_far Text_CantGetOnYourItemNow_ + db "@" + +Text_CantUseBallBoxIsFull: + text_far Text_CantUseBallBoxIsFull_ + db "@" + +Text_UsedItem: + text_far Text_UsedItem_ + db "@" + +Text_GotOnItem: + text_far Text_GotOnItem_ + db "@" + +Text_GotOffItem: + text_far Text_GotOffItem_ + db "@" + +Functionf893: ; f893 (3:7893) + ld a, $2 + call GetPartyParamLocation + push hl + ld de, wBuffer1 + predef FillPP + pop hl + ld bc, $15 + add hl, bc + ld de, wCurHPAnimMaxHP + ld b, $0 +.asm_f8ab + inc b + ld a, b + cp $5 + ret z + ld a, [wd151] + dec a + jr nz, .asm_f8bd + ld a, [wMenuCursorY] + inc a + cp b + jr nz, .asm_f8c4 +.asm_f8bd + ld a, [hl] + and $c0 + ld a, [de] + call nz, Functionf8c8 +.asm_f8c4 + inc hl + inc de + jr .asm_f8ab + +Functionf8c8: ; f8c8 (3:78c8) + 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, .asm_f8fd +.asm_f8ea + ldh a, [hPrintNum4] + cp $8 + jr c, .asm_f8f2 + ld a, $7 +.asm_f8f2 + add b + ld b, a + ld a, [wd151] + dec a + jr z, .asm_f8fd + dec c + jr nz, .asm_f8ea +.asm_f8fd + ld [hl], b + pop bc + ret + +Functionf900: ; f900 (3:7900) + ld a, $17 + call GetPartyParamLocation + push hl + ld a, $2 + call GetPartyParamLocation + pop de + xor a + ld [wMenuCursorY], a + ld [wMonType], a + ld c, $4 +.asm_f915 + ld a, [hli] + and a + ret z + push hl + push de + push bc + call GetMaxPPOfMove + pop bc + pop de + ld a, [de] + and $c0 + ld b, a + ld a, [wd151] + add b + ld [de], a + inc de + ld hl, wMenuCursorY + inc [hl] + pop hl + dec c + jr nz, .asm_f915 + ret + +GetMaxPPOfMove: ; f933 (3:7933) + ld a, [wStringBuffer1] + push af + ld a, [wStringBuffer1 + 1] + push af + ld a, [wMonType] + and a + ld hl, wPartyMon1Moves + ld bc, $30 + jr z, .asm_f961 + ld hl, wOTPartyMon1Moves + dec a + jr z, .asm_f961 + ld hl, wTempMonMoves + dec a + jr z, .asm_f95c + ld hl, wTempMonMoves + dec a + jr z, .asm_f95c + ld hl, wBattleMonMoves +.asm_f95c + call Functionf9b0 + jr .asm_f964 + +.asm_f961 + call Functionf9aa +.asm_f964 + ld a, [hl] + dec a + push hl + ld hl, Moves + MOVE_PP + ld bc, $7 + call AddNTimes + ld a, BANK(Moves) + call GetFarByte + ld b, a + ld de, wStringBuffer1 + ld [de], a + pop hl + push bc + ld bc, $15 + ld a, [wMonType] + cp $4 + jr nz, .asm_f989 + ld bc, $6 +.asm_f989 + add hl, bc + ld a, [hl] + and $c0 + pop bc + or b + ld hl, wStringBuffer1 + 1 + ld [hl], a + xor a + ld [wd151], a + ld a, b + call Functionf8c8 + ld a, [hl] + and $3f + ld [wd151], a + pop af + ld [wStringBuffer1 + 1], a +.asm_f9a3 + pop af + ld [wStringBuffer1], a + ret + +Functionf9aa: ; f9aa (3:79aa) + ld a, [wCurPartyMon] + call AddNTimes +Functionf9b0: ; f9b0 (3:79b0) + ld a, [wMenuCursorY] + ld c, a + 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.asm b/engine/items/items.asm index 428f652e..428f652e 100755 --- a/engine/items.asm +++ b/engine/items/items.asm diff --git a/engine/sine.asm b/engine/math/sine.asm index e22d785a..e22d785a 100644 --- a/engine/sine.asm +++ b/engine/math/sine.asm diff --git a/engine/variables.asm b/engine/overworld/variables.asm index 7e6906ee..7e6906ee 100755 --- a/engine/variables.asm +++ b/engine/overworld/variables.asm diff --git a/engine/pokemon/breedmon_level_growth.asm b/engine/pokemon/breedmon_level_growth.asm new file mode 100644 index 00000000..c6356dd6 --- /dev/null +++ b/engine/pokemon/breedmon_level_growth.asm @@ -0,0 +1,27 @@ +GetBreedMon1LevelGrowth: + ld hl, wBreedMon1Stats + ld de, wTempMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + callfar CalcLevel + ld a, [wBreedMon1Level] + ld b, a + ld a, d + ld e, a + sub b + ld d, a + ret + +GetBreedMon2LevelGrowth: + ld hl, wBreedMon2Stats + ld de, wTempMon + ld bc, BOXMON_STRUCT_LENGTH + call CopyBytes + callfar CalcLevel + ld a, [wBreedMon2Level] + ld b, a + ld a, d + ld e, a + sub b + ld d, a + ret diff --git a/engine/health.asm b/engine/pokemon/health.asm index a94a3ec3..a94a3ec3 100755 --- a/engine/health.asm +++ b/engine/pokemon/health.asm diff --git a/engine/pokemon/knows_move.asm b/engine/pokemon/knows_move.asm new file mode 100644 index 00000000..9fe0f6ac --- /dev/null +++ b/engine/pokemon/knows_move.asm @@ -0,0 +1,24 @@ +KnowsMove: + ld a, MON_MOVES + call GetPartyParamLocation + ld a, [wPutativeTMHMMove] + ld b, a + ld c, NUM_MOVES +.loop + ld a, [hli] + cp b + jr z, .knows_move + dec c + jr nz, .loop + and a + ret + +.knows_move + ld hl, .KnowsMoveText + call PrintText + scf + ret + +.KnowsMoveText: + text_far _KnowsMoveText + text_end diff --git a/engine/move_mon.asm b/engine/pokemon/move_mon.asm index 7198910d..7198910d 100755 --- a/engine/move_mon.asm +++ b/engine/pokemon/move_mon.asm diff --git a/engine/pokemon/search2.asm b/engine/pokemon/search2.asm new file mode 100644 index 00000000..c33d84ed --- /dev/null +++ b/engine/pokemon/search2.asm @@ -0,0 +1,134 @@ +_FindPartyMonAboveLevel: + ld hl, wPartyMon1Level + call FindAboveLevel + ret + +_FindPartyMonAtLeastThatHappy: + ld hl, wPartyMon1Happiness + call FindAtLeastThatHappy + ret + +_FindPartyMonThatSpecies: + ld hl, wPartyMon1Species + jp FindThatSpecies + +_FindPartyMonThatSpeciesYourTrainerID: + ld hl, wPartyMon1Species + call FindThatSpecies + ret z + ld a, c + ld hl, wPartyMon1ID + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + ld a, [wPlayerID] + cp [hl] + jr nz, .nope + inc hl + ld a, [wPlayerID + 1] + cp [hl] + jr nz, .nope + ld a, $1 + and a + ret + +.nope + xor a + ret + +FindAtLeastThatHappy: +; Sets the bits for the Pokemon that have a happiness greater than or equal to b. +; The lowest bits are used. Sets z if no Pokemon in your party is at least that happy. + ld c, $0 + ld a, [wPartyCount] + ld d, a +.loop + ld a, d + dec a + push hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, b + cp [hl] + pop hl + jr z, .greater_equal + jr nc, .lower + +.greater_equal + ld a, c + or $1 + ld c, a + +.lower + sla c + dec d + jr nz, .loop + call RetroactivelyIgnoreEggs + ld a, c + and a + ret + +FindAboveLevel: + ld c, $0 + ld a, [wPartyCount] + ld d, a +.loop + ld a, d + dec a + push hl + push bc + ld bc, PARTYMON_STRUCT_LENGTH + call AddNTimes + pop bc + ld a, b + cp [hl] + pop hl + jr c, .greater + ld a, c + or $1 + ld c, a + +.greater + sla c + dec d + jr nz, .loop + call RetroactivelyIgnoreEggs + ld a, c + and a + ret + +FindThatSpecies: +; Find species b in your party. +; If you have no Pokemon, returns c = -1 and z. +; If that species is in your party, returns its location in c, and nz. +; Otherwise, returns z. + ld c, -1 + ld hl, wPartySpecies +.loop + ld a, [hli] + cp -1 + ret z + inc c + cp b + jr nz, .loop + ld a, $1 + and a + ret + +RetroactivelyIgnoreEggs: + ld e, %11111110 + ld hl, wPartySpecies +.loop + ld a, [hli] + cp -1 + ret z + cp EGG + jr nz, .skip_notegg + ld a, c + and e + ld c, a + +.skip_notegg + rlc e + jr .loop diff --git a/engine/smallflag.asm b/engine/smallflag.asm new file mode 100644 index 00000000..f7d1406f --- /dev/null +++ b/engine/smallflag.asm @@ -0,0 +1,74 @@ +Functionc660: + nop + +SmallFarFlagAction: +; Perform action b on bit c in flag array hl. +; If checking a flag, check flag array d:hl unless d is 0. + +; For longer flag arrays, see FlagAction. + + push hl + push bc + +; Divide by 8 to get the byte we want. + push bc + srl c + srl c + srl c + ld b, 0 + add hl, bc + pop bc + +; Which bit we want from the byte + ld a, c + and 7 + ld c, a + +; Shift left until we can mask the bit + ld a, 1 + jr z, .shifted +.shift + add a + dec c + jr nz, .shift +.shifted + ld c, a + +; What are we doing to this flag? + dec b + jr z, .set ; 1 = SET_FLAG + dec b + jr z, .check ; 2 = CHECK_FLAG +; 0 = RESET_FLAG + +.reset + ld a, c + cpl + and [hl] + ld [hl], a + jr .done + +.set + ld a, [hl] + or c + ld [hl], a + jr .done + +.check + ld a, d + cp 0 + jr nz, .farcheck + + ld a, [hl] + and c + jr .done + +.farcheck + call GetFarByte + and c + +.done + pop bc + pop hl + ld c, a + ret diff --git a/engine/tilesets/map_palettes.asm b/engine/tilesets/map_palettes.asm new file mode 100644 index 00000000..0c45cf57 --- /dev/null +++ b/engine/tilesets/map_palettes.asm @@ -0,0 +1,110 @@ +_SwapTextboxPalettes:: + ld hl, wTilemap + ld de, wAttrmap + ld b, SCREEN_HEIGHT +.loop + ld c, SCREEN_WIDTH +.innerloop + ld a, [hli] + push hl + srl a + jr c, .UpperNybble + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + and $f + bit 3, a + jr z, .next + jr .asm_8038 + +.UpperNybble: + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + swap a + and $f + bit 3, a + jr z, .next + +.asm_8038 + ld a, [wMapGroup] + dec a + ld hl, Unknown85d7 + add l + ld l, a + jr nc, .asm_8044 + inc h +.asm_8044 + ld a, [hl] + +.next + pop hl + ld [de], a + inc de + dec c + jr nz, .innerloop + dec b + jr nz, .loop + ret + +_ScrollBGMapPalettes:: + ld hl, wBGMapBuffer + ld de, wBGMapPalBuffer +.loop + ld a, [hli] + push hl + srl a + jr c, .UpperNybble + +; .LowerNybble + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + and $f + bit 3, a + jr z, .next + jr .asm_8083 + +.UpperNybble: + ld hl, wTilesetPalettes + add [hl] + ld l, a + ld a, [wTilesetPalettes + 1] + adc 0 + ld h, a + ld a, [hl] + swap a + and $f + bit 3, a + jr z, .next + +.asm_8083 + ld a, [wMapGroup] + dec a + ld hl, Unknown85d7 + add l + ld l, a + jr nc, .asm_808f + inc h +.asm_808f + ld a, [hl] + +.next + pop hl + ld [de], a + inc de + dec c + jr nz, .loop + ret |