diff options
author | yenatch <yenatch@gmail.com> | 2014-09-23 15:07:38 -0700 |
---|---|---|
committer | yenatch <yenatch@gmail.com> | 2014-09-23 15:08:12 -0700 |
commit | 070c9649645f564c081bfaedbe07b64191868e2d (patch) | |
tree | 139aed9103dacf7ddfc31e3d9f45dd4e1d5e5dd2 | |
parent | a81487e9c6ee271f0ffeaacd681b929c0b4afaf0 (diff) |
Accidentally committed .orig files from merge dff0cdeb.
-rwxr-xr-x | engine/battle/core.asm.orig | 8639 | ||||
-rwxr-xr-x | engine/menu/pokedex.asm.orig | 647 | ||||
-rwxr-xr-x | engine/town_map.asm.orig | 605 |
3 files changed, 0 insertions, 9891 deletions
diff --git a/engine/battle/core.asm.orig b/engine/battle/core.asm.orig deleted file mode 100755 index b8314a82..00000000 --- a/engine/battle/core.asm.orig +++ /dev/null @@ -1,8639 +0,0 @@ -BattleCore: - -; These are move effects (second value from the Moves table in bank $E). -EffectsArray1: ; 3c000 (f:4000) - db CONVERSION_EFFECT - db HAZE_EFFECT - db SWITCH_AND_TELEPORT_EFFECT - db MIST_EFFECT - db FOCUS_ENERGY_EFFECT - db CONFUSION_EFFECT - db HEAL_EFFECT - db TRANSFORM_EFFECT - db LIGHT_SCREEN_EFFECT - db REFLECT_EFFECT - db POISON_EFFECT - db PARALYZE_EFFECT - db SUBSTITUTE_EFFECT - db MIMIC_EFFECT - db LEECH_SEED_EFFECT - db SPLASH_EFFECT - db -1 -EffectsArray2: ; 3c011 (f:4011) -; moves that do damage but not through normal calculations -; e.g., Super Fang, Psywave - db SUPER_FANG_EFFECT - db SPECIAL_DAMAGE_EFFECT - db -1 -EffectsArray3: ; 3c014 (f:4014) -; non-damaging, stat‐affecting or status‐causing moves? -; e.g., Meditate, Bide, Hypnosis - db $01 - db ATTACK_UP1_EFFECT - db DEFENSE_UP1_EFFECT - db SPEED_UP1_EFFECT - db SPECIAL_UP1_EFFECT - db ACCURACY_UP1_EFFECT - db EVASION_UP1_EFFECT - db ATTACK_DOWN1_EFFECT - db DEFENSE_DOWN1_EFFECT - db SPEED_DOWN1_EFFECT - db SPECIAL_DOWN1_EFFECT - db ACCURACY_DOWN1_EFFECT - db EVASION_DOWN1_EFFECT - db BIDE_EFFECT - db SLEEP_EFFECT - db ATTACK_UP2_EFFECT - db DEFENSE_UP2_EFFECT - db SPEED_UP2_EFFECT - db SPECIAL_UP2_EFFECT - db ACCURACY_UP2_EFFECT - db EVASION_UP2_EFFECT - db ATTACK_DOWN2_EFFECT - db DEFENSE_DOWN2_EFFECT - db SPEED_DOWN2_EFFECT - db SPECIAL_DOWN2_EFFECT - db ACCURACY_DOWN2_EFFECT - db EVASION_DOWN2_EFFECT - db -1 -EffectsArray4: ; 3c030 (f:4030) -; Attacks that aren't finished after they faint the opponent. - db DRAIN_HP_EFFECT - db EXPLODE_EFFECT - db DREAM_EATER_EFFECT - db PAY_DAY_EFFECT - db TWO_TO_FIVE_ATTACKS_EFFECT - db $1E - db ATTACK_TWICE_EFFECT - db RECOIL_EFFECT - db TWINEEDLE_EFFECT - db RAGE_EFFECT - db -1 -EffectsArray5: ; 3c03b (f:403b) - db DRAIN_HP_EFFECT - db EXPLODE_EFFECT - db DREAM_EATER_EFFECT - db PAY_DAY_EFFECT - db SWIFT_EFFECT - db TWO_TO_FIVE_ATTACKS_EFFECT - db $1E - db CHARGE_EFFECT - db SUPER_FANG_EFFECT - db SPECIAL_DAMAGE_EFFECT - db FLY_EFFECT - db ATTACK_TWICE_EFFECT - db JUMP_KICK_EFFECT - db RECOIL_EFFECT - ; fallthrough to Next EffectsArray -EffectsArray5B: ; 3c049 (f:4049) -; moves that prevent the player from switching moves? - db THRASH_PETAL_DANCE_EFFECT - db TRAPPING_EFFECT - db -1 - -SlidePlayerAndEnemySilhouettesOnScreen: ; 3c04c (f:404c) - call LoadPlayerBackPic - ld a, $1 ; the usual text box at the bottom of the screen - ld [wd125], a - call DisplayTextBoxID - hlCoord 1, 5 - ld bc, $307 - call ClearScreenArea - call DisableLCD - call LoadFontTilePatterns - call LoadHudAndHpBarAndStatusTilePatterns - ld hl, vBGMap0 - ld bc, $400 -.clearBackgroundLoop - ld a, $7f - ld [hli], a - dec bc - ld a, b - or c - jr nz, .clearBackgroundLoop -; copy the work RAM tile map to VRAM - ld hl, wTileMap - ld de, vBGMap0 - ld b, 18 ; number of rows -.copyRowLoop - ld c, 20 ; number of columns -.copyColumnLoop - ld a, [hli] - ld [de], a - inc e - dec c - jr nz, .copyColumnLoop - ld a, 12 ; number of off screen tiles to the right of screen in VRAM - add e ; skip the off screen tiles - ld e, a - jr nc, .noCarry - inc d -.noCarry - dec b - jr nz, .copyRowLoop - call EnableLCD - ld a, $90 - ld [hVBlankWY], a - ld [rWY], a - xor a - ld [hTilesetType], a - ld [hVBlankSCY], a - dec a - ld [wUpdateSpritesEnabled], a - call Delay3 - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ld b, $70 - ld c, $90 - ld a, c - ld [hVBlankSCX], a - call DelayFrame - ld a, %11100100 ; inverted palette for silhouette effect - ld [rBGP], a - ld [rOBP0], a - ld [rOBP1], a -.slideSilhouettesLoop ; slide silhouettes of the player's pic and the enemy's pic onto the screen - ld h, b - ld l, $40 - call SetScrollXForSlidingPlayerBodyLeft ; begin background scrolling on line $40 - inc b - inc b - ld h, $0 - ld l, $60 - call SetScrollXForSlidingPlayerBodyLeft ; end background scrolling on line $60 - call SlidePlayerHeadLeft - ld a, c - ld [hVBlankSCX], a - dec c - dec c - jr nz, .slideSilhouettesLoop - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - ld a, $31 - ld [$ffe1], a - hlCoord 1, 5 - predef Func_3f0c6 - xor a - ld [hVBlankWY], a - ld [rWY], a - inc a - ld [H_AUTOBGTRANSFERENABLED], a - call Delay3 - ld b, $1 - call GoPAL_SET - call HideSprites - ld hl, PrintBeginningBattleText - ld b, BANK(PrintBeginningBattleText) - jp Bankswitch - -; when a battle is starting, silhouettes of the player's pic and the enemy's pic are slid onto the screen -; the lower of the player's pic (his body) is part of the background, but his head is a sprite -; the reason for this is that it shares Y coordinates with the lower part of the enemy pic, so background scrolling wouldn't work for both pics -; instead, the enemy pic is part of the background and uses the scroll register, while the player's head is a sprite and is slid by changing its X coordinates in a loop -SlidePlayerHeadLeft: ; 3c0ff (f:40ff) - push bc - ld hl, wOAMBuffer + $01 - ld c, $15 ; number of OAM entries - ld de, $4 ; size of OAM entry -.loop - dec [hl] ; decrement X - dec [hl] ; decrement X - add hl, de ; next OAM entry - dec c - jr nz, .loop - pop bc - ret - -SetScrollXForSlidingPlayerBodyLeft: ; 3c110 (f:4110) - ld a, [rLY] - cp l - jr nz, SetScrollXForSlidingPlayerBodyLeft - ld a, h - ld [rSCX], a -.loop - ld a, [rLY] - cp h - jr z, .loop - ret - -StartBattle: ; 3c11e (f:411e) - xor a - ld [wPartyGainExpFlags], a - ld [wPartyFoughtCurrentEnemyFlags], a - ld [wcd6a], a - inc a - ld [wd11d], a - ld hl, wEnemyMon1HP - ld bc, wEnemyMon2 - wEnemyMon1 - 1 - ld d, $3 -.findFirstAliveEnemyMonLoop - inc d - ld a, [hli] - or [hl] - jr nz, .foundFirstAliveEnemyMon - add hl, bc - jr .findFirstAliveEnemyMonLoop -.foundFirstAliveEnemyMon - ld a, d - ld [wcc3e], a - ld a, [W_ISINBATTLE] - dec a ; is it a trainer battle? - call nz, EnemySendOutFirstMon ; if it is a trainer battle, send out enemy mon - ld c, 40 - call DelayFrames - call SaveScreenTilesToBuffer1 -.checkAnyPartyAlive - call AnyPartyAlive - ld a, d - and a - jp z, HandlePlayerBlackOut ; jump if no mon is alive - call LoadScreenTilesFromBuffer1 - ld a, [W_BATTLETYPE] - and a ; is it a normal battle? - jp z, .playerSendOutFirstMon ; if so, send out player mon -; safari zone battle -.displaySafariZoneBattleMenu - call DisplayBattleMenu - ret c ; return if the player ran from battle - ld a, [wcd6a] - and a ; was the item used successfully? - jr z, .displaySafariZoneBattleMenu ; if not, display the menu again; XXX does this ever jump? - ld a, [W_NUMSAFARIBALLS] - and a - jr nz, .notOutOfSafariBalls - call LoadScreenTilesFromBuffer1 - ld hl, .outOfSafariBallsText - jp PrintText -.notOutOfSafariBalls - callab PrintSafariZoneBattleText - ld a, [wEnemyMonSpeed + 1] - add a - ld b, a ; init b (which is later compared with random value) to (enemy speed % 256) * 2 - jp c, EnemyRan ; if (enemy speed % 256) > 127, the enemy runs - ld a, [wSafariBaitFactor] - and a ; is bait factor 0? - jr z, .checkEscapeFactor -; bait factor is not 0 -; divide b by 4 (making the mon less likely to run) - srl b - srl b -.checkEscapeFactor - ld a, [wSafariEscapeFactor] - and a ; is escape factor 0? - jr z, .compareWithRandomValue -; escape factor is not 0 -; multiply b by 2 (making the mon more likely to run) - sla b - jr nc, .compareWithRandomValue -; cap b at 255 - ld b, $ff -.compareWithRandomValue - call Random - cp b - jr nc, .checkAnyPartyAlive - jr EnemyRan ; if b was greater than the random value, the enemy runs - -.outOfSafariBallsText - TX_FAR _OutOfSafariBallsText - db "@" - -.playerSendOutFirstMon - xor a - ld [wWhichPokemon], a -.findFirstAliveMonLoop - call HasMonFainted - jr nz, .foundFirstAliveMon -; fainted, go to the next one - ld hl, wWhichPokemon - inc [hl] - jr .findFirstAliveMonLoop -.foundFirstAliveMon - ld a, [wWhichPokemon] - ld [wPlayerMonNumber], a - inc a - ld hl, wPartySpecies - 1 - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] ; species - ld [wcf91], a - ld [wBattleMonSpecies2], a - call LoadScreenTilesFromBuffer1 - hlCoord 1, 5 - ld a, $9 - call SlideTrainerPicOffScreen - call SaveScreenTilesToBuffer1 - ld a, [wWhichPokemon] - ld c, a - ld b, $1 - push bc - ld hl, wPartyGainExpFlags - predef FlagActionPredef - ld hl, wPartyFoughtCurrentEnemyFlags - pop bc - predef FlagActionPredef - call LoadBattleMonFromParty - call LoadScreenTilesFromBuffer1 - call SendOutMon - jr MainInBattleLoop - -; wild mon or link battle enemy ran from battle -EnemyRan: ; 3c202 (f:4202) - call LoadScreenTilesFromBuffer1 - ld a, [W_ISLINKBATTLE] - cp $4 - ld hl, WildRanText - jr nz, .printText -; link battle - xor a - ld [wBattleResult], a - ld hl, EnemyRanText -.printText - call PrintText - ld a, (SFX_08_44 - SFX_Headers_08) / 3 - call PlaySoundWaitForCurrent - xor a - ld [H_WHOSETURN], a - ld hl, AnimationSlideEnemyMonOut - ld b, BANK(AnimationSlideEnemyMonOut) - jp Bankswitch - -WildRanText: ; 3c229 (f:4229) - TX_FAR _WildRanText - db "@" - -EnemyRanText: ; 3c22e (f:422e) - TX_FAR _EnemyRanText - db "@" - -MainInBattleLoop: ; 3c233 (f:4233) - call ReadPlayerMonCurHPAndStatus - ld hl, wBattleMonHP - ld a, [hli] - or [hl] ; is battle mon HP 0? - jp z, HandlePlayerMonFainted ; if battle mon HP is 0, jump - ld hl, wEnemyMonHP - ld a, [hli] - or [hl] ; is enemy mon HP 0? - jp z, HandleEnemyMonFainted ; if enemy mon HP is 0, jump - call SaveScreenTilesToBuffer1 - xor a - ld [wd11d], a - ld a, [W_PLAYERBATTSTATUS2] - and %01100000 ; check if the player is using Rage or needs to recharge - jr nz, .selectEnemyMove -; the player is not using Rage and doesn't need to recharge - ld hl, W_ENEMYBATTSTATUS1 - res 3, [hl] ; reset flinch bit - ld hl, W_PLAYERBATTSTATUS1 - res 3, [hl] ; reset flinch bit - ld a, [hl] - and %00010010 ; check if the player is thrashing about or charging for an attack - jr nz, .selectEnemyMove ; if so, jump -; the player is neither thrashing about nor charging for an attack - call DisplayBattleMenu ; show battle menu - ret c ; return if player ran from battle - ld a, [wEscapedFromBattle] - and a - ret nz ; return if pokedoll was used to escape from battle - ld a, [wBattleMonStatus] - and (1 << FRZ) | SLP ; is mon frozen or asleep? - jr nz, .selectEnemyMove ; if so, jump - ld a, [W_PLAYERBATTSTATUS1] - and %00100001 ; check player is using Bide or using a multi-turn attack like wrap - jr nz, .selectEnemyMove ; if so, jump - ld a, [W_ENEMYBATTSTATUS1] - bit 5, a ; check if enemy is using a multi-turn attack like wrap - jr z, .selectPlayerMove ; if not, jump -; enemy is using a mult-turn attack like wrap, so player is trapped and cannot select a move - ld a, $ff - ld [wPlayerSelectedMove], a - jr .selectEnemyMove -.selectPlayerMove - ld a, [wcd6a] - and a - jr nz, .selectEnemyMove - ld [wMoveMenuType], a - inc a - ld [W_ANIMATIONID], a - xor a - ld [wMenuItemToSwap], a - call MoveSelectionMenu - push af - call LoadScreenTilesFromBuffer1 - call DrawHUDsAndHPBars - pop af - jr nz, MainInBattleLoop ; if the player didn't select a move, jump -.selectEnemyMove - call SelectEnemyMove - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .noLinkBattle -; link battle - ld a, [wcc3e] - cp $f - jp z, EnemyRan - cp $e - jr z, .noLinkBattle - cp $d - jr z, .noLinkBattle - sub $4 - jr c, .noLinkBattle -; the link battle enemy has switched mons - ld a, [W_PLAYERBATTSTATUS1] - bit 5, a ; check if using multi-turn move like Wrap - jr z, .asm_3c2dd - ld a, [wPlayerMoveListIndex] - ld hl, wBattleMonMoves - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - cp METRONOME - jr nz, .asm_3c2dd - ld [wPlayerSelectedMove], a -.asm_3c2dd - callab SwitchEnemyMon -.noLinkBattle - ld a, [wPlayerSelectedMove] - cp QUICK_ATTACK - jr nz, .playerDidNotUseQuickAttack - ld a, [wEnemySelectedMove] - cp QUICK_ATTACK - jr z, .compareSpeed ; if both used Quick Attack - jp .playerMovesFirst ; if player used Quick Attack and enemy didn't -.playerDidNotUseQuickAttack - ld a, [wEnemySelectedMove] - cp QUICK_ATTACK - jr z, .enemyMovesFirst ; if enemy used Quick Attack and player didn't - ld a, [wPlayerSelectedMove] - cp COUNTER - jr nz, .playerDidNotUseCounter - ld a, [wEnemySelectedMove] - cp COUNTER - jr z, .compareSpeed ; if both used Counter - jr .enemyMovesFirst ; if player used Counter and enemy didn't -.playerDidNotUseCounter - ld a, [wEnemySelectedMove] - cp COUNTER - jr z, .playerMovesFirst ; if enemy used Counter and player didn't -.compareSpeed - ld de, wBattleMonSpeed ; player speed value - ld hl, wEnemyMonSpeed ; enemy speed value - ld c, $2 - call StringCmp ; compare speed values - jr z, .speedEqual - jr nc, .playerMovesFirst ; if player is faster - jr .enemyMovesFirst ; if enemy is faster -.speedEqual - ld a, [$ffaa] - cp $2 - jr z, .invertOutcome - call BattleRandom - cp $80 - jr c, .playerMovesFirst - jr .enemyMovesFirst -.invertOutcome - call BattleRandom - cp $80 - jr c, .enemyMovesFirst - jr .playerMovesFirst -.enemyMovesFirst - ld a, $1 - ld [H_WHOSETURN], a - callab TrainerAI - jr c, .AIActionUsedEnemyFirst - call ExecuteEnemyMove - ld a, [wEscapedFromBattle] - and a ; was Teleport, Road, or Whirlwind used to escape from battle? - ret nz ; if so, return - ld a, b - and a - jp z, HandlePlayerMonFainted -.AIActionUsedEnemyFirst - call HandlePoisonBurnLeechSeed - jp z, HandleEnemyMonFainted - call DrawHUDsAndHPBars - call ExecutePlayerMove - ld a, [wEscapedFromBattle] - and a ; was Teleport, Road, or Whirlwind used to escape from battle? - ret nz ; if so, return - ld a, b - and a - jp z, HandleEnemyMonFainted - call HandlePoisonBurnLeechSeed - jp z, HandlePlayerMonFainted - call DrawHUDsAndHPBars - call CheckNumAttacksLeft - jp MainInBattleLoop -.playerMovesFirst - call ExecutePlayerMove - ld a, [wEscapedFromBattle] - and a ; was Teleport, Road, or Whirlwind used to escape from battle? - ret nz ; if so, return - ld a, b - and a - jp z, HandleEnemyMonFainted - call HandlePoisonBurnLeechSeed - jp z, HandlePlayerMonFainted - call DrawHUDsAndHPBars - ld a, $1 - ld [H_WHOSETURN], a - callab TrainerAI - jr c, .AIActionUsedPlayerFirst - call ExecuteEnemyMove - ld a, [wEscapedFromBattle] - and a ; was Teleport, Road, or Whirlwind used to escape from battle? - ret nz ; if so, return - ld a, b - and a - jp z, HandlePlayerMonFainted -.AIActionUsedPlayerFirst - call HandlePoisonBurnLeechSeed - jp z, HandleEnemyMonFainted - call DrawHUDsAndHPBars - call CheckNumAttacksLeft - jp MainInBattleLoop - -HandlePoisonBurnLeechSeed: ; 3c3bd (f:43bd) - ld hl, wBattleMonHP - ld de, wBattleMonStatus - ld a, [H_WHOSETURN] - and a - jr z, .playersTurn - ld hl, wEnemyMonHP - ld de, wEnemyMonStatus -.playersTurn - ld a, [de] - and (1 << BRN) | (1 << PSN) - jr z, .notBurnedOrPoisoned - push hl - ld hl, HurtByPoisonText - ld a, [de] - and 1 << BRN - jr z, .poisoned - ld hl, HurtByBurnText -.poisoned - call PrintText - xor a - ld [wcc5b], a - ld a,BURN_PSN_ANIM - call PlayMoveAnimation ; play burn/poison animation - pop hl - call HandlePoisonBurnLeechSeed_DecreaseOwnHP -.notBurnedOrPoisoned - ld de, W_PLAYERBATTSTATUS2 - ld a, [H_WHOSETURN] - and a - jr z, .playersTurn2 - ld de, W_ENEMYBATTSTATUS2 -.playersTurn2 - ld a, [de] - add a - jr nc, .notLeechSeeded - push hl - ld a, [H_WHOSETURN] - push af - xor $1 - ld [H_WHOSETURN], a - xor a - ld [wcc5b], a - ld a,ABSORB - call PlayMoveAnimation ; play leech seed animation (from opposing mon) - pop af - ld [H_WHOSETURN], a - pop hl - call HandlePoisonBurnLeechSeed_DecreaseOwnHP - call HandlePoisonBurnLeechSeed_IncreaseEnemyHP - push hl - ld hl, HurtByLeechSeedText - call PrintText - pop hl -.notLeechSeeded - ld a, [hli] - or [hl] - ret nz ; test if fainted - call DrawHUDsAndHPBars - ld c, $14 - call DelayFrames - xor a - ret - -HurtByPoisonText: ; 3c42e (f:442e) - TX_FAR _HurtByPoisonText - db "@" - -HurtByBurnText: ; 3c433 (f:4433) - TX_FAR _HurtByBurnText - db "@" - -HurtByLeechSeedText: ; 3c438 (f:4438) - TX_FAR _HurtByLeechSeedText - db "@" - -; decreases the mon's current HP by 1/16 of the Max HP (multiplied by number of toxic ticks if active) -; note that the toxic ticks are considered even if the damage is not poison (hence the Leech Seed glitch) -; hl: HP pointer -; bc (out): total damage -HandlePoisonBurnLeechSeed_DecreaseOwnHP: ; 3c43d (f:443d) - push hl - push hl - ld bc, $e ; skip to max HP - add hl, bc - ld a, [hli] ; load max HP - ld [wHPBarMaxHP+1], a - ld b, a - ld a, [hl] - ld [wHPBarMaxHP], a - ld c, a - srl b - rr c - srl b - rr c - srl c - srl c ; c = max HP/16 (assumption: HP < 1024) - ld a, c - and a - jr nz, .nonZeroDamage - inc c ; damage is at least 1 -.nonZeroDamage - ld hl, W_PLAYERBATTSTATUS3 - ld de, W_PLAYERTOXICCOUNTER - ld a, [H_WHOSETURN] - and a - jr z, .playersTurn - ld hl, W_ENEMYBATTSTATUS3 - ld de, W_ENEMYTOXICCOUNTER -.playersTurn - bit 0, [hl] - jr z, .noToxic - ld a, [de] ; increment toxic counter - inc a - ld [de], a - ld hl, $0000 -.toxicTicksLoop - add hl, bc - dec a - jr nz, .toxicTicksLoop - ld b, h ; bc = damage * toxic counter - ld c, l -.noToxic - pop hl - inc hl - ld a, [hl] ; subtract total damage from current HP - ld [wHPBarOldHP], a - sub c - ld [hld], a - ld [wHPBarNewHP], a - ld a, [hl] - ld [wHPBarOldHP+1], a - sbc b - ld [hl], a - ld [wHPBarNewHP+1], a - jr nc, .noOverkill - xor a ; overkill: zero HP - ld [hli], a - ld [hl], a - ld [wHPBarNewHP], a - ld [wHPBarNewHP+1], a -.noOverkill - call UpdateCurMonHPBar - pop hl - ret - -; adds bc to enemy HP -HandlePoisonBurnLeechSeed_IncreaseEnemyHP: ; 3c4a3 (f:44a3) - push hl - ld hl, wEnemyMonMaxHP - ld a, [H_WHOSETURN] - and a - jr z, .playersTurn - ld hl, wBattleMonMaxHP -.playersTurn - ld a, [hli] - ld [wHPBarMaxHP+1], a - ld a, [hl] - ld [wHPBarMaxHP], a - ld de, $fff2 - add hl, de ; skip back fomr max hp to current hp - ld a, [hl] - ld [wHPBarOldHP], a ; add bc to current HP - add c - ld [hld], a - ld [wHPBarNewHP], a - ld a, [hl] - ld [wHPBarOldHP+1], a - adc b - ld [hli], a - ld [wHPBarNewHP+1], a - ld a, [wHPBarMaxHP] - ld c, a - ld a, [hld] - sub c - ld a, [wHPBarMaxHP+1] - ld b, a - ld a, [hl] - sbc b - jr c, .noOverfullHeal - ld a, b ; overfull heal, set HP to max HP - ld [hli], a - ld [wHPBarNewHP+1], a - ld a, c - ld [hl], a - ld [wHPBarNewHP], a -.noOverfullHeal - ld a, [H_WHOSETURN] - xor $1 - ld [H_WHOSETURN], a - call UpdateCurMonHPBar - ld a, [H_WHOSETURN] - xor $1 - ld [H_WHOSETURN], a - pop hl - ret - -UpdateCurMonHPBar: ; 3c4f6 (f:44f6) - hlCoord 10, 9 ; tile pointer to player HP bar - ld a, [H_WHOSETURN] - and a - ld a, $1 - jr z, .playersTurn - hlCoord 2, 2 ; tile pointer to enemy HP bar - xor a -.playersTurn - push bc - ld [wListMenuID], a - predef UpdateHPBar2 - pop bc - ret - -CheckNumAttacksLeft: ; 3c50f (f:450f) - ld a, [wPlayerNumAttacksLeft] - and a - jr nz, .checkEnemy -; player has 0 attacks left - ld hl, W_PLAYERBATTSTATUS1 - res 5, [hl] ; player not using multi-turn attack like wrap any more -.checkEnemy - ld a, [wEnemyNumAttacksLeft] - and a - ret nz -; enemy has 0 attacks left - ld hl, W_ENEMYBATTSTATUS1 - res 5, [hl] ; enemy not using multi-turn attack like wrap any more - ret - -HandleEnemyMonFainted: ; 3c525 (f:4525) - xor a - ld [wccf0], a - call FaintEnemyPokemon - call AnyPartyAlive - ld a, d - and a - jp z, HandlePlayerBlackOut ; if no party mons are alive, the player blacks out - ld hl, wBattleMonHP - ld a, [hli] - or [hl] ; is battle mon HP zero? - call nz, DrawPlayerHUDAndHPBar ; if battle mon HP is not zero, draw player HD and HP bar - ld a, [W_ISINBATTLE] - dec a - ret z ; return if it's a wild battle - call AnyEnemyPokemonAliveCheck - jp z, TrainerBattleVictory - ld hl, wBattleMonHP - ld a, [hli] - or [hl] ; does battle mon have 0 HP? - jr nz, .skipReplacingBattleMon ; if not, skip replacing battle mon - call DoUseNextMonDialogue ; this call is useless in a trainer battle. it shouldn't be here - ret c - call ChooseNextMon -.skipReplacingBattleMon - ld a, $1 - ld [wcd6a], a - call ReplaceFaintedEnemyMon - jp z, EnemyRan - xor a - ld [wcd6a], a - jp MainInBattleLoop - -FaintEnemyPokemon ; 0x3c567 - call ReadPlayerMonCurHPAndStatus - ld a, [W_ISINBATTLE] - dec a - jr z, .wild - ld a, [wEnemyMonPartyPos] - ld hl, wEnemyMon1HP - ld bc, wEnemyMon2 - wEnemyMon1 - call AddNTimes - xor a - ld [hli], a - ld [hl], a -.wild - ld hl, W_PLAYERBATTSTATUS1 - res 2, [hl] - xor a - ld [W_NUMHITS], a - ld hl, wd065 ; enemy statuses - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld [W_ENEMYDISABLEDMOVE], a - ld [wccef], a - ld [wccf3], a - ld hl, wccf1 - ld [hli], a - ld [hl], a - hlCoord 12, 5 - deCoord 12, 6 - call SlideDownFaintedMonPic - ld hl, wTileMap - ld bc, $40b - call ClearScreenArea - ld a, [W_ISINBATTLE] - dec a - jr z, .wild_win - xor a - ld [wc0f1], a - ld [wc0f2], a - ld a, (SFX_08_48 - SFX_Headers_08) / 3 ; SFX_FALL? - call PlaySoundWaitForCurrent -.sfxwait - ld a, [wc02a] - cp (SFX_08_48 - SFX_Headers_08) / 3 - jr z, .sfxwait - ld a, (SFX_08_43 - SFX_Headers_08) / 3 ; SFX_DROP - call PlaySound - call WaitForSoundToFinish - jr .sfxplayed -.wild_win - call Func_3c643 - ld a, MUSIC_DEFEATED_WILD_MON - call PlayBattleVictoryMusic -.sfxplayed - ld hl, wBattleMonHP - ld a, [hli] - or [hl] - jr nz, .playermonnotfaint - ld a, [wccf0] - and a - jr nz, .playermonnotfaint - call RemoveFaintedPlayerMon -.playermonnotfaint - call AnyPartyAlive - ld a, d - and a - ret z - ld hl, EnemyMonFaintedText - call PrintText - call PrintEmptyString - call SaveScreenTilesToBuffer1 - xor a - ld [wBattleResult], a - ld b, EXP__ALL - call IsItemInBag - push af - jr z, .giveExpToMonsThatFought ; if no exp all, then jump - -; the player has exp all -; first, we halve the values that determine exp gain -; the enemy mon base stats are added to stat exp, so they are halved -; the base exp (which determines normal exp) is also halved - ld hl, wEnemyMonBaseStats - ld b, $7 -.halveExpDataLoop - srl [hl] - inc hl - dec b - jr nz, .halveExpDataLoop - -; give exp (divided evenly) to the mons that actually fought in battle against the enemy mon that has fainted -; if exp all is in the bag, this will be only be half of the stat exp and normal exp, due to the above loop -.giveExpToMonsThatFought - xor a - ld [wcc5b], a - callab GainExperience - pop af - ret z ; return if no exp all - -; the player has exp all -; now, set the gain exp flag for every party member -; half of the total stat exp and normal exp will divided evenly amongst every party member - ld a, $1 - ld [wcc5b], a - ld a, [wPartyCount] - ld b, 0 -.gainExpFlagsLoop - scf - rl b - dec a - jr nz, .gainExpFlagsLoop - ld a, b - ld [wPartyGainExpFlags], a - ld hl, GainExperience - ld b, BANK(GainExperience) - jp Bankswitch - -EnemyMonFaintedText: ; 0x3c63e - TX_FAR _EnemyMonFaintedText - db "@" - -Func_3c643: ; 3c643 (f:4643) - xor a - ld [wd083], a - ld [wc02a], a - inc a - ld [wccf6], a - ret - -AnyEnemyPokemonAliveCheck: ; 3c64f (f:464f) - ld a, [wEnemyPartyCount] - ld b, a - xor a - ld hl, wEnemyMon1HP - ld de, $2c -.asm_3c65a - or [hl] - inc hl - or [hl] - dec hl - add hl, de - dec b - jr nz, .asm_3c65a - and a - ret - -; stores whether enemy ran in Z flag -ReplaceFaintedEnemyMon: ; 3c664 (f:4664) - ld hl, wcf1e - ld e, $30 - call GetBattleHealthBarColor - callab DrawEnemyPokeballs - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .asm_3c687 -; link battle - call LinkBattleExchangeData - ld a, [wcc3e] - cp $f - ret z - call LoadScreenTilesFromBuffer1 -.asm_3c687 - call EnemySendOut - xor a - ld [W_ENEMYMOVENUM], a - ld [wcd6a], a - ld [wccd5], a - inc a ; reset Z flag - ret - -TrainerBattleVictory: ; 3c696 (f:4696) - call Func_3c643 - ld b, MUSIC_DEFEATED_GYM_LEADER - ld a, [W_GYMLEADERNO] - and a - jr nz, .gymleader - ld b, MUSIC_DEFEATED_TRAINER -.gymleader - ld a, [W_TRAINERCLASS] - cp SONY3 ; final battle against rival - jr nz, .notrival - ld b, MUSIC_DEFEATED_GYM_LEADER - ld hl, W_FLAGS_D733 - set 1, [hl] -.notrival - ld a, [W_ISLINKBATTLE] - cp $4 - ld a, b - call nz, PlayBattleVictoryMusic - ld hl, TrainerDefeatedText - call PrintText - ld a, [W_ISLINKBATTLE] - cp $4 - ret z - call ScrollTrainerPicAfterBattle - ld c, $28 - call DelayFrames - call PrintEndBattleText - ld hl, MoneyForWinningText - call PrintText - ld de, wPlayerMoney + 2 - ld hl, wd07b - ld c, $3 - predef_jump AddBCDPredef - -MoneyForWinningText: ; 3c6e4 (f:46e4) - TX_FAR _MoneyForWinningText - db "@" - -TrainerDefeatedText: ; 3c6e9 (f:46e9) - TX_FAR _TrainerDefeatedText - db "@" - -PlayBattleVictoryMusic: ; 3c6ee (f:46ee) - push af - ld a, $ff - ld [wc0ee], a - call PlaySoundWaitForCurrent - ld c, BANK(Music_DefeatedTrainer) - pop af - call PlayMusic - jp Delay3 - -HandlePlayerMonFainted: ; 3c700 (f:4700) - ld a, $1 - ld [wccf0], a - call RemoveFaintedPlayerMon - call AnyPartyAlive ; test if any more mons are alive - ld a, d - and a - jp z, HandlePlayerBlackOut - ld hl, wEnemyMonHP - ld a, [hli] - or [hl] ; is enemy mon's HP 0? - jr nz, .doUseNextMonDialogue ; if not, jump -; the enemy mon has 0 HP - call FaintEnemyPokemon - ld a, [W_ISINBATTLE] - dec a - ret z ; if wild encounter, battle is over - call AnyEnemyPokemonAliveCheck - jp z, TrainerBattleVictory -.doUseNextMonDialogue - call DoUseNextMonDialogue - ret c ; return if the player ran from battle - call ChooseNextMon - jp nz, MainInBattleLoop ; if the enemy mon has more than 0 HP, go back to battle loop -; the enemy mon has 0 HP - ld a, $1 - ld [wcd6a], a - call ReplaceFaintedEnemyMon - jp z, EnemyRan ; if enemy ran from battle rather than sending out another mon, jump - xor a - ld [wcd6a], a - jp MainInBattleLoop - -; resets flags, slides mon's pic down, plays cry, and prints fainted message -RemoveFaintedPlayerMon: ; 3c741 (f:4741) - ld a, [wPlayerMonNumber] - ld c, a - ld hl, wPartyGainExpFlags - ld b, $0 - predef FlagActionPredef ; clear gain exp flag for fainted mon - ld hl, W_ENEMYBATTSTATUS1 - res 2, [hl] ; reset "attacking multiple times" flag - ld a, [wd083] - bit 7, a ; skip sound flag (red bar (?)) - jr z, .skipWaitForSound - ld a, $ff - ld [wd083], a - call WaitForSoundToFinish -.skipWaitForSound - ld hl, wcd05 - ld [hli], a - ld [hl], a - ld [wBattleMonStatus], a - call ReadPlayerMonCurHPAndStatus - hlCoord 9, 7 - ld bc, $50b - call ClearScreenArea - hlCoord 1, 10 - deCoord 1, 11 - call SlideDownFaintedMonPic - ld a, $1 - ld [wBattleResult], a - ld a, [wccf0] - and a - ret z - ld a, [wBattleMonSpecies] - call PlayCry - ld hl, PlayerMonFaintedText - jp PrintText - -PlayerMonFaintedText: ; 3c796 (f:4796) - TX_FAR _PlayerMonFaintedText - db "@" - -; asks if you want to use next mon -; stores whether you ran in C flag -DoUseNextMonDialogue: ; 3c79b (f:479b) - call PrintEmptyString - call SaveScreenTilesToBuffer1 - ld a, [W_ISINBATTLE] - and a - dec a - ret nz ; return if it's a trainer battle - ld hl, UseNextMonText - call PrintText -.displayYesNoBox - hlCoord 13, 9 - ld bc, $a0e - ld a, $14 ; yes/no text box - ld [wd125], a - call DisplayTextBoxID - ld a, [wd12e] - cp $2 ; did the player choose NO? - jr z, .tryRunning ; if the player chose NO, try running - and a ; reset carry - ret -.tryRunning - ld a, [wCurrentMenuItem] - and a - jr z, .displayYesNoBox ; xxx when does this happen? - ld hl, wPartyMon1Speed - ld de, wEnemyMonSpeed - jp TryRunningFromBattle - -UseNextMonText: ; 3c7d3 (f:47d3) - TX_FAR _UseNextMonText - db "@" - -; choose next player mon to send out -; stores whether enemy mon has no HP left in Z flag -ChooseNextMon: ; 3c7d8 (f:47d8) - ld a, $2 - ld [wd07d], a - call DisplayPartyMenu -.checkIfMonChosen - jr nc, .monChosen -.goBackToPartyMenu - call GoBackToPartyMenu - jr .checkIfMonChosen -.monChosen - call HasMonFainted - jr z, .goBackToPartyMenu ; if mon fainted, you have to choose another - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .asm_3c7fa - inc a - ld [wcd6a], a - call LinkBattleExchangeData -.asm_3c7fa - xor a - ld [wcd6a], a - call ClearSprites - ld a, [wWhichPokemon] - ld [wPlayerMonNumber], a - ld c, a - ld hl, wPartyGainExpFlags - ld b, $1 - push bc - predef FlagActionPredef - pop bc - ld hl, wPartyFoughtCurrentEnemyFlags - predef FlagActionPredef - call LoadBattleMonFromParty - call GBPalWhiteOut - call LoadHudTilePatterns - call LoadScreenTilesFromBuffer1 - call GoPAL_SET_CF1C - call GBPalNormal - call SendOutMon - ld hl, wEnemyMonHP - ld a, [hli] - or [hl] - ret - -; called when player is out of usable mons. -; prints approriate lose message, sets carry flag if player blacked out (special case for initial rival fight) -HandlePlayerBlackOut: ; 3c837 (f:4837) - ld a, [W_ISLINKBATTLE] - cp $4 - jr z, .notSony1Battle - ld a, [W_CUROPPONENT] - cp $c8 + SONY1 - jr nz, .notSony1Battle - ld hl, wTileMap ; sony 1 battle - ld bc, $815 - call ClearScreenArea - call ScrollTrainerPicAfterBattle - ld c, $28 - call DelayFrames - ld hl, Sony1WinText - call PrintText - ld a, [W_CURMAP] - cp OAKS_LAB - ret z ; starter battle in oak's lab: don't black out -.notSony1Battle - ld b, $0 - call GoPAL_SET - ld hl, PlayerBlackedOutText2 - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .noLinkBattle - ld hl, LinkBattleLostText -.noLinkBattle - call PrintText - ld a, [wd732] - res 5, a - ld [wd732], a - call ClearScreen - scf - ret - -Sony1WinText: ; 3c884 (f:4884) - TX_FAR _Sony1WinText - db "@" - -PlayerBlackedOutText2: ; 3c889 (f:4889) - TX_FAR _PlayerBlackedOutText2 - db "@" - -LinkBattleLostText: ; 3c88e (f:488e) - TX_FAR _LinkBattleLostText - db "@" - -; slides pic of fainted mon downwards until it disappears -; bug: when this is called, [H_AUTOBGTRANSFERENABLED] is non-zero, so there is screen tearing -SlideDownFaintedMonPic: ; 3c893 (f:4893) - ld a, [wd730] - push af - set 6, a - ld [wd730], a - ld b, 7 ; number of times to slide -.slideStepLoop ; each iteration, the mon is slid down one row - push bc - push de - push hl - ld b, 6 ; number of rows -.rowLoop - push bc - push hl - push de - ld bc, $7 - call CopyData - pop de - pop hl - ld bc, -20 - add hl, bc - push hl - ld h, d - ld l, e - add hl, bc - ld d, h - ld e, l - pop hl - pop bc - dec b - jr nz, .rowLoop - ld bc, 20 - add hl, bc - ld de, SevenSpacesText - call PlaceString - ld c, 2 - call DelayFrames - pop hl - pop de - pop bc - dec b - jr nz, .slideStepLoop - pop af - ld [wd730], a - ret - -SevenSpacesText: ; 3c8d7 (f:48d7) - db " @" - -; slides the player or enemy trainer off screen -; a is the number of tiles to slide it horizontally (always 9 for the player trainer or 8 for the enemy trainer) -; if a is 8, the slide is to the right, else it is to the left -; bug: when this is called, [H_AUTOBGTRANSFERENABLED] is non-zero, so there is screen tearing -SlideTrainerPicOffScreen: ; 3c8df (f:48df) - ld [$FF8B], a - ld c, a -.slideStepLoop ; each iteration, the trainer pic is slid one tile left/right - push bc - push hl - ld b, 7 ; number of rows -.rowLoop - push hl - ld a, [$FF8B] - ld c, a -.columnLoop - ld a, [$FF8B] - cp 8 - jr z, .slideRight -.slideLeft ; slide player sprite off screen - ld a, [hld] - ld [hli], a - inc hl - jr .nextColumn -.slideRight ; slide enemy trainer sprite off screen - ld a, [hli] - ld [hld], a - dec hl -.nextColumn - dec c - jr nz, .columnLoop - pop hl - ld de, 20 - add hl, de - dec b - jr nz, .rowLoop - ld c, 2 - call DelayFrames - pop hl - pop bc - dec c - jr nz, .slideStepLoop - ret - -; send out a trainer's mon -EnemySendOut: ; 3c90e (f:490e) - ld hl,wPartyGainExpFlags - xor a - ld [hl],a - ld a,[wPlayerMonNumber] - ld c,a - ld b,1 - push bc - predef FlagActionPredef - ld hl,wPartyFoughtCurrentEnemyFlags - xor a - ld [hl],a - pop bc - predef FlagActionPredef - -; don't change wPartyGainExpFlags or wPartyFoughtCurrentEnemyFlags -EnemySendOutFirstMon: ; 3c92a (f:492a) - xor a - ld hl,wd065 - ld [hli],a - ld [hli],a - ld [hli],a - ld [hli],a - ld [hl],a - ld [W_ENEMYDISABLEDMOVE],a - ld [wccef],a - ld [wccf3],a - ld hl,wccf1 - ld [hli],a - ld [hl],a - dec a - ld [wAICount],a - ld hl,W_PLAYERBATTSTATUS1 - res 5,[hl] - hlCoord 18, 0 - ld a,8 - call SlideTrainerPicOffScreen - call PrintEmptyString - call SaveScreenTilesToBuffer1 - ld a,[W_ISLINKBATTLE] - cp 4 - jr nz,.next - ld a,[wcc3e] - sub 4 - ld [wWhichPokemon],a - jr .next3 -.next - ld b,$FF -.next2 - inc b - ld a,[wEnemyMonPartyPos] - cp b - jr z,.next2 - ld hl,wEnemyMon1 - ld a,b - ld [wWhichPokemon],a - push bc - ld bc,wEnemyMon2 - wEnemyMon1 - call AddNTimes - pop bc - inc hl - ld a,[hli] - ld c,a - ld a,[hl] - or c - jr z,.next2 -.next3 - ld a,[wWhichPokemon] - ld hl,wEnemyMon1Level - ld bc,wEnemyMon2 - wEnemyMon1 - call AddNTimes - ld a,[hl] - ld [W_CURENEMYLVL],a - ld a,[wWhichPokemon] - inc a - ld hl,wEnemyPartyCount - ld c,a - ld b,0 - add hl,bc - ld a,[hl] - ld [wEnemyMonSpecies2],a - ld [wcf91],a - call LoadEnemyMonData - ld hl,wEnemyMonHP - ld a,[hli] - ld [wcce3],a - ld a,[hl] - ld [wcce4],a - ld a,1 - ld [wCurrentMenuItem],a - ld a,[wd11d] - dec a - jr z,.next4 - ld a,[wPartyCount] - dec a - jr z,.next4 - ld a,[W_ISLINKBATTLE] - cp 4 - jr z,.next4 - ld a,[W_OPTIONS] - bit 6,a - jr nz,.next4 - ld hl, TrainerAboutToUseText - call PrintText - hlCoord 0, 7 - ld bc,$0801 - ld a,$14 - ld [wd125],a - call DisplayTextBoxID - ld a,[wCurrentMenuItem] - and a - jr nz,.next4 - ld a,2 - ld [wd07d],a - call DisplayPartyMenu -.next9 - ld a,1 - ld [wCurrentMenuItem],a - jr c,.next7 - ld hl,wPlayerMonNumber - ld a,[wWhichPokemon] - cp [hl] - jr nz,.next6 - ld hl,AlreadyOutText - call PrintText -.next8 - call GoBackToPartyMenu - jr .next9 -.next6 - call HasMonFainted - jr z,.next8 - xor a - ld [wCurrentMenuItem],a -.next7 - call GBPalWhiteOut - call LoadHudTilePatterns - call LoadScreenTilesFromBuffer1 -.next4 - call ClearSprites - ld hl,wTileMap - ld bc,$040B - call ClearScreenArea - ld b,1 - call GoPAL_SET - call GBPalNormal - ld hl,TrainerSentOutText - call PrintText - ld a,[wEnemyMonSpecies2] - ld [wcf91],a - ld [wd0b5],a - call GetMonHeader - ld de,vFrontPic - call LoadMonFrontSprite - ld a,$CF - ld [$FFE1],a - hlCoord 15, 6 - predef Func_3f073 - ld a,[wEnemyMonSpecies2] - call PlayCry - call DrawEnemyHUDAndHPBar - ld a,[wCurrentMenuItem] - and a - ret nz - xor a - ld [wPartyGainExpFlags],a - ld [wPartyFoughtCurrentEnemyFlags],a - call SaveScreenTilesToBuffer1 - jp SwitchPlayerMon - -TrainerAboutToUseText: ; 3ca79 (f:4a79) - TX_FAR _TrainerAboutToUseText - db "@" - -TrainerSentOutText: ; 3ca7e (f:4a7e) - TX_FAR _TrainerSentOutText - db "@" - -; tests if the player has any pokemon that are not fainted -; sets d = 0 if all fainted, d != 0 if some mons are still alive -AnyPartyAlive: ; 3ca83 (f:4a83) - ld a, [wPartyCount] - ld e, a - xor a - ld hl, wPartyMon1HP - ld bc, wPartyMon2 - wPartyMon1 - 1 -.partyMonsLoop - or [hl] - inc hl - or [hl] - add hl, bc - dec e - jr nz, .partyMonsLoop - ld d, a - ret - -; tests if player mon has fainted -; stores whether mon has fainted in Z flag -HasMonFainted: ; 3ca97 (f:4a97) - ld a, [wWhichPokemon] - ld hl, wPartyMon1HP - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - ld a, [hli] - or [hl] - ret nz - ld a, [wd11d] - and a - jr nz, .done - ld hl, NoWillText - call PrintText -.done - xor a - ret - -NoWillText: ; 3cab4 (f:4ab4) - TX_FAR _NoWillText - db "@" - -; try to run from battle (hl = player speed, de = enemy speed) -; stores whether the attempt was successful in carry flag -TryRunningFromBattle: ; 3cab9 (f:4ab9) - call IsGhostBattle - jp z, .canEscape ; jump if it's a ghost battle - ld a, [W_BATTLETYPE] - cp $2 - jp z, .canEscape ; jump if it's a safari battle - ld a, [W_ISLINKBATTLE] - cp $4 - jp z, .canEscape - ld a, [W_ISINBATTLE] - dec a - jr nz, .trainerBattle ; jump if it's a trainer battle - ld a, [wNumRunAttempts] - inc a - ld [wNumRunAttempts], a - ld a, [hli] - ld [H_MULTIPLICAND + 1], a - ld a, [hl] - ld [H_MULTIPLICAND + 2], a - ld a, [de] - ld [$ff8d], a - inc de - ld a, [de] - ld [$ff8e], a - call LoadScreenTilesFromBuffer1 - ld de, H_MULTIPLICAND + 1 - ld hl, $ff8d - ld c, $2 - call StringCmp - jr nc, .canEscape ; jump if player speed greater than enemy speed - xor a - ld [H_MULTIPLICAND], a - ld a, 32 - ld [H_MULTIPLIER], a - call Multiply ; multiply player speed by 32 - ld a, [H_PRODUCT + 2] - ld [H_DIVIDEND], a - ld a, [H_PRODUCT + 3] - ld [H_DIVIDEND + 1], a - ld a, [$ff8d] - ld b, a - ld a, [$ff8e] -; divide enemy speed by 4 - srl b - rr a - srl b - rr a - and a - jr z, .canEscape ; jump if enemy speed divided by 4, mod 256 is 0 - ld [H_DIVISOR], a ; ((enemy speed / 4) % 256) - ld b, $2 - call Divide ; divide (player speed * 32) by ((enemy speed / 4) % 256) - ld a, [H_QUOTIENT + 2] - and a ; is the quotient greater than 256? - jr nz, .canEscape ; if so, the player can escape - ld a, [wNumRunAttempts] - ld c, a -; add 30 to the quotient for each run attempt -.loop - dec c - jr z, .compareWithRandomValue - ld b, 30 - ld a, [H_QUOTIENT + 3] - add b - ld [H_QUOTIENT + 3], a - jr c, .canEscape - jr .loop -.compareWithRandomValue - call BattleRandom - ld b, a - ld a, [H_QUOTIENT + 3] - cp b - jr nc, .canEscape ; if the random value was less than or equal to the quotient plus 30 times the number of attempts, the player can escape -; can't escape - ld a, $1 - ld [wcd6a], a - ld hl, CantEscapeText - jr .printCantEscapeOrNoRunningText -.trainerBattle - ld hl, NoRunningText -.printCantEscapeOrNoRunningText - call PrintText - ld a, $1 - ld [wd11f], a - call SaveScreenTilesToBuffer1 - and a ; reset carry - ret -.canEscape - ld a, [W_ISLINKBATTLE] - cp $4 - ld a, $2 - jr nz, .playSound -; link battle - call SaveScreenTilesToBuffer1 - xor a - ld [wcd6a], a - ld a, $f - ld [wPlayerMoveListIndex], a - call LinkBattleExchangeData - call LoadScreenTilesFromBuffer1 - ld a, [wcc3e] - cp $f - ld a, $2 - jr z, .playSound - dec a -.playSound - ld [wBattleResult], a - ld a, (SFX_08_44 - SFX_Headers_08) / 3 - call PlaySoundWaitForCurrent - ld hl, GotAwayText - call PrintText - call WaitForSoundToFinish - call SaveScreenTilesToBuffer1 - scf ; set carry - ret - -CantEscapeText: ; 3cb97 (f:4b97) - TX_FAR _CantEscapeText - db "@" - -NoRunningText: ; 3cb9c (f:4b9c) - TX_FAR _NoRunningText - db "@" - -GotAwayText: ; 3cba1 (f:4ba1) - TX_FAR _GotAwayText - db "@" - -; copies from party data to battle mon data when sending out a new player mon -LoadBattleMonFromParty: ; 3cba6 (f:4ba6) - ld a, [wWhichPokemon] - ld bc, $2c - ld hl, wPartyMon1Species - call AddNTimes - ld de, wBattleMonSpecies - ld bc, $c - call CopyData - ld bc, $f - add hl, bc - ld de, wBattleMonDVs - ld bc, $2 - call CopyData - ld de, wBattleMonPP - ld bc, $4 - call CopyData - ld de, wBattleMonLevel - ld bc, $b - call CopyData - ld a, [wBattleMonSpecies2] - ld [wd0b5], a - call GetMonHeader - ld hl, wPartyMonNicks - ld a, [wPlayerMonNumber] - call SkipFixedLengthTextEntries - ld de, wBattleMonNick - ld bc, $b - call CopyData - ld hl, wBattleMonLevel - ld de, wPlayerMonUnmodifiedLevel ; block of memory used for unmodified stats - ld bc, $b - call CopyData - call ApplyBurnAndParalysisPenaltiesToPlayer - call ApplyBadgeStatBoosts - ld a, $7 ; default stat modifier - ld b, $8 - ld hl, wPlayerMonAttackMod -.statModLoop - ld [hli], a - dec b - jr nz, .statModLoop - ret - -; copies from enemy party data to current enemy mon data when sending out a new enemy mon -LoadEnemyMonFromParty: ; 3cc13 (f:4c13) - ld a, [wWhichPokemon] - ld bc, $2c - ld hl, wEnemyMons - call AddNTimes - ld de, wEnemyMonSpecies - ld bc, $c - call CopyData - ld bc, $f - add hl, bc - ld de, wEnemyMonDVs - ld bc, $2 - call CopyData - ld de, wEnemyMonPP - ld bc, $4 - call CopyData - ld de, wEnemyMonLevel - ld bc, $b - call CopyData - ld a, [wEnemyMonSpecies] - ld [wd0b5], a - call GetMonHeader - ld hl, wEnemyMonNicks - ld a, [wWhichPokemon] - call SkipFixedLengthTextEntries - ld de, wEnemyMonNick - ld bc, $b - call CopyData - ld hl, wEnemyMonLevel - ld de, wEnemyMonUnmodifiedLevel ; block of memory used for unmodified stats - ld bc, $b - call CopyData - call ApplyBurnAndParalysisPenaltiesToEnemy - ld hl, W_MONHBASESTATS - ld de, wEnemyMonBaseStats - ld b, $5 -.copyBaseStatsLoop - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .copyBaseStatsLoop - ld a, $7 ; default stat modifier - ld b, $8 - ld hl, wEnemyMonStatMods -.statModLoop - ld [hli], a - dec b - jr nz, .statModLoop - ld a, [wWhichPokemon] - ld [wEnemyMonPartyPos], a - ret - -SendOutMon: ; 3cc91 (f:4c91) - callab PrintSendOutMonMessage - ld hl, wEnemyMonHP - ld a, [hli] - or [hl] ; is enemy mon HP zero? - jp z, .skipDrawingEnemyHUDAndHPBar; if HP is zero, skip drawing the HUD and HP bar - call DrawEnemyHUDAndHPBar -.skipDrawingEnemyHUDAndHPBar - call DrawPlayerHUDAndHPBar - predef LoadMonBackPic - xor a - ld [$ffe1], a - ld hl, wcc2d - ld [hli], a - ld [hl], a - ld [wcc5b], a - ld [wd05b], a - ld [W_PLAYERMOVENUM], a - ld hl, wccf1 - ld [hli], a - ld [hl], a - ld hl, wd060 - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld [W_PLAYERDISABLEDMOVE], a - ld [wccee], a - ld [wccf7], a - ld b, $1 - call GoPAL_SET - ld hl, W_ENEMYBATTSTATUS1 - res 5, [hl] - ld a, $1 - ld [H_WHOSETURN], a - ld a, POOF_ANIM - call PlayMoveAnimation - hlCoord 4, 11 - predef Func_3f073 - ld a, [wcf91] - call PlayCry - call PrintEmptyString - jp SaveScreenTilesToBuffer1 - -; show 2 stages of the player getting smaller before disappearing -AnimateRetreatingPlayerMon: ; 3ccfa (f:4cfa) - hlCoord 1, 5 - ld bc, $707 - call ClearScreenArea - hlCoord 3, 7 - ld bc, $505 - xor a - ld [wcd6c], a - ld [H_DOWNARROWBLINKCNT1], a - predef Func_79aba - ld c, $4 - call DelayFrames - call .clearScreenArea - hlCoord 4, 9 - ld bc, $303 - ld a, $1 - ld [wcd6c], a - xor a - ld [H_DOWNARROWBLINKCNT1], a - predef Func_79aba - call Delay3 - call .clearScreenArea - ld a, $4c - Coorda 5, 11 -.clearScreenArea - hlCoord 1, 5 - ld bc, $707 - jp ClearScreenArea - -; reads player's current mon's HP into wBattleMonHP -ReadPlayerMonCurHPAndStatus: ; 3cd43 (f:4d43) - ld a, [wPlayerMonNumber] - ld hl, wPartyMon1HP - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - ld d, h - ld e, l - ld hl, wBattleMonHP - ld bc, $4 ; 2 bytes HP, 1 byte unknown (unused?), 1 byte status - jp CopyData - -DrawHUDsAndHPBars: ; 3cd5a (f:4d5a) - call DrawPlayerHUDAndHPBar - jp DrawEnemyHUDAndHPBar - -DrawPlayerHUDAndHPBar: ; 3cd60 (f:4d60) - xor a - ld [H_AUTOBGTRANSFERENABLED], a - hlCoord 9, 7 - ld bc, $50b - call ClearScreenArea - callab PlacePlayerHUDTiles - hlCoord 18, 9 - ld [hl], $73 - ld de, wBattleMonNick - hlCoord 10, 7 - call CenterMonName - call PlaceString - ld hl, wBattleMonSpecies - ld de, wcf98 - ld bc, $c - call CopyData - ld hl, wBattleMonLevel - ld de, wcfb9 - ld bc, $b - call CopyData - hlCoord 14, 8 - push hl - inc hl - ld de, wcf9c - call PrintStatusConditionNotFainted - pop hl - jr nz, .asm_3cdae - call PrintLevel -.asm_3cdae - ld a, [wcf98] - ld [wcf91], a - hlCoord 10, 9 - predef DrawHP - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - ld hl, wcf1d - call GetBattleHealthBarColor - ld hl, wBattleMonHP - ld a, [hli] - or [hl] - jr z, .asm_3cdd9 - ld a, [wccf6] - and a - ret nz - ld a, [wcf1d] - cp $2 - jr z, .asm_3cde6 -.asm_3cdd9 - ld hl, wd083 - bit 7, [hl] - ld [hl], $0 - ret z - xor a - ld [wc02a], a - ret -.asm_3cde6 - ld hl, wd083 - set 7, [hl] - ret - -DrawEnemyHUDAndHPBar: ; 3cdec (f:4dec) - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ld hl, wTileMap - ld bc, $40c - call ClearScreenArea - callab PlaceEnemyHUDTiles - ld de, wEnemyMonNick - hlCoord 1, 0 - call CenterMonName - call PlaceString - hlCoord 4, 1 - push hl - inc hl - ld de, wEnemyMonStatus - call PrintStatusConditionNotFainted - pop hl - jr nz, .skipPrintLevel ; if the mon has a status condition, skip printing the level - ld a, [wEnemyMonLevel] - ld [wcfb9], a - call PrintLevel -.skipPrintLevel - ld hl, wEnemyMonHP - ld a, [hli] - ld [H_MULTIPLICAND + 1], a - ld a, [hld] - ld [H_MULTIPLICAND + 2], a - or [hl] ; is current HP zero? - jr nz, .hpNonzero -; current HP is 0 -; set variables for DrawHPBar - ld c, a - ld e, a - ld d, $6 - jp .drawHPBar -.hpNonzero - xor a - ld [H_MULTIPLICAND], a - ld a, 48 - ld [H_MULTIPLIER], a - call Multiply ; multiply current HP by 48 - ld hl, wEnemyMonMaxHP - ld a, [hli] - ld b, a - ld a, [hl] - ld [H_DIVISOR], a - ld a, b - and a ; is max HP > 255? - jr z, .doDivide -; if max HP > 255, scale both (current HP * 48) and max HP by dividing by 4 so that max HP fits in one byte -; (it needs to be one byte so it can be used as the divisor for the Divide function) - ld a, [H_DIVISOR] - srl b - rr a - srl b - rr a - ld [H_DIVISOR], a - ld a, [H_PRODUCT + 2] - ld b, a - srl b - ld a, [H_PRODUCT + 3] - rr a - srl b - rr a - ld [H_PRODUCT + 3], a - ld a, b - ld [H_PRODUCT + 2], a -.doDivide - ld a, [H_PRODUCT + 2] - ld [H_DIVIDEND], a - ld a, [H_PRODUCT + 3] - ld [H_DIVIDEND + 1], a - ld a, $2 - ld b, a - call Divide ; divide (current HP * 48) by max HP - ld a, [H_QUOTIENT + 3] -; set variables for DrawHPBar - ld e, a - ld a, $6 - ld d, a - ld c, a -.drawHPBar - xor a - ld [wListMenuID], a - hlCoord 2, 2 - call DrawHPBar - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - ld hl, wcf1e - -GetBattleHealthBarColor: ; 3ce90 (f:4e90) - ld b, [hl] - call GetHealthBarColor - ld a, [hl] - cp b - ret z - ld b, $1 - jp GoPAL_SET - -; center's mon's name on the battle screen -; if the name is 1 or 2 letters long, it is printed 2 spaces more to the right than usual (i.e. for names longer than 4 letters) -; if the name is 3 or 4 letters long, it is printed 1 space more to the right than usual (i.e. for names longer than 4 letters) -CenterMonName: ; 3ce9c (f:4e9c) - push de - inc hl - inc hl - ld b, $2 -.loop - inc de - ld a, [de] - cp $50 - jr z, .done - inc de - ld a, [de] - cp $50 - jr z, .done - dec hl - dec b - jr nz, .loop -.done - pop de - ret - -DisplayBattleMenu: ; 3ceb3 (f:4eb3) - call LoadScreenTilesFromBuffer1 ; restore saved screen - ld a, [W_BATTLETYPE] - and a - jr nz, .nonstandardbattle - call DrawHUDsAndHPBars - call PrintEmptyString - call SaveScreenTilesToBuffer1 -.nonstandardbattle - ld a, [W_BATTLETYPE] - cp $2 ; safari - ld a, $b ; safari menu id - jr nz, .menuselected - ld a, $1b ; regular menu id -.menuselected - ld [wd125], a - call DisplayTextBoxID - ld a, [W_BATTLETYPE] - dec a - jp nz, .handleBattleMenuInput ; handle menu input if it's not the old man tutorial -; the following happens for the old man tutorial - ld hl, wPlayerName - ld de, W_GRASSRATE - ld bc, $b - call CopyData ; temporarily save the player name in unused space, - ; which is supposed to get overwritten when entering a - ; map with wild pokémon. due to an oversight, the data - ; may not get overwritten (cinnabar) and the infamous - ; missingno. glitch can show up. - ld hl, .oldManName - ld de, wPlayerName - ld bc, $b - call CopyData - ; the following simulates the keystrokes by drawing menus on screen - hlCoord 9, 14 - ld [hl], "▶" - ld c, $50 - call DelayFrames - ld [hl], $7f - hlCoord 9, 16 - ld [hl], "▶" - ld c, $32 - call DelayFrames - ld [hl], $ec - ld a, $2 ; select the "ITEM" menu - jp .upperLeftMenuItemWasNotSelected -.oldManName - db "OLD MAN@" -.handleBattleMenuInput - ld a, [wcc2d] - ld [wCurrentMenuItem], a - ld [wLastMenuItem], a - sub 2 ; check if the cursor is in the left column - jr c, .leftColumn -; cursor is in the right column - ld [wCurrentMenuItem], a - ld [wLastMenuItem], a - jr .rightColumn -.leftColumn ; put cursor in left column of menu - ld a, [W_BATTLETYPE] - cp $2 - ld a, " " - jr z, .safariLeftColumn -; put cursor in left column for normal battle menu (i.e. when it's not a Safari battle) - Coorda 15, 14 ; clear upper cursor position in right column - Coorda 15, 16 ; clear lower cursor position in right column - ld b, $9 ; top menu item X - jr .leftColumn_WaitForInput -.safariLeftColumn - Coorda 13, 14 - Coorda 13, 16 - hlCoord 7, 14 - ld de, W_NUMSAFARIBALLS - ld bc, $102 - call PrintNumber - ld b, $1 ; top menu item X -.leftColumn_WaitForInput - ld hl, wTopMenuItemY - ld a, $e - ld [hli], a ; wTopMenuItemY - ld a, b - ld [hli], a ; wTopMenuItemX - inc hl - inc hl - ld a, $1 - ld [hli], a ; wMaxMenuItem - ld [hl], D_RIGHT | A_BUTTON ; wMenuWatchedKeys - call HandleMenuInput - bit 4, a ; check if right was pressed - jr nz, .rightColumn - jr .AButtonPressed ; the A button was pressed -.rightColumn ; put cursor in right column of menu - ld a, [W_BATTLETYPE] - cp $2 - ld a, " " - jr z, .safariRightColumn -; put cursor in right column for normal battle menu (i.e. when it's not a Safari battle) - Coorda 9, 14 ; clear upper cursor position in left column - Coorda 9, 16 ; clear lower cursor position in left column - ld b, $f ; top menu item X - jr .rightColumn_WaitForInput -.safariRightColumn - Coorda 1, 14 ; clear upper cursor position in left column - Coorda 1, 16 ; clear lower cursor position in left column - hlCoord 7, 14 - ld de, W_NUMSAFARIBALLS - ld bc, $102 - call PrintNumber - ld b, $d ; top menu item X -.rightColumn_WaitForInput - ld hl, wTopMenuItemY - ld a, $e - ld [hli], a ; wTopMenuItemY - ld a, b - ld [hli], a ; wTopMenuItemX - inc hl - inc hl - ld a, $1 - ld [hli], a ; wMaxMenuItem - ld a, D_LEFT | A_BUTTON - ld [hli], a ; wMenuWatchedKeys - call HandleMenuInput - bit 5, a ; check if left was pressed - jr nz, .leftColumn ; if left was pressed, jump - ld a, [wCurrentMenuItem] - add $2 ; if we're in the right column, the actual id is +2 - ld [wCurrentMenuItem], a -.AButtonPressed - call PlaceUnfilledArrowMenuCursor - ld a, [W_BATTLETYPE] - cp $2 ; is it a Safari battle? - ld a, [wCurrentMenuItem] - ld [wcc2d], a - jr z, .handleMenuSelection -; not Safari battle -; swap the IDs of the item menu and party menu (this is probably because they swapped the positions of these menu items in first generation English versions) - cp $1 ; was the item menu selected? - jr nz, .notItemMenu -; item menu was selected - inc a ; increment a to 2 - jr .handleMenuSelection -.notItemMenu - cp $2 ; was the party menu selected? - jr nz, .handleMenuSelection -; party menu selected - dec a ; decrement a to 1 -.handleMenuSelection - and a - jr nz, .upperLeftMenuItemWasNotSelected -; the upper left menu item was selected - ld a, [W_BATTLETYPE] - cp $2 - jr z, .throwSafariBallWasSelected -; the "FIGHT" menu was selected - xor a - ld [wNumRunAttempts], a - jp LoadScreenTilesFromBuffer1 ; restore saved screen and return -.throwSafariBallWasSelected - ld a, SAFARI_BALL - ld [wcf91], a - jr .useItem -.upperLeftMenuItemWasNotSelected ; a menu item other than the upper left item was selected - cp $2 - jp nz, .partyMenuOrRockOrRunWasSelected -; either the bag (normal battle) or bait (safari battle) was selected - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .notLinkBattle -; can't use items in link battles - ld hl, .itemsCantBeUsedHereText - call PrintText - jp DisplayBattleMenu -.notLinkBattle - call SaveScreenTilesToBuffer2 - ld a, [W_BATTLETYPE] - cp $2 ; is it a safari battle? - jr nz, .bagWasSelected -; bait was selected - ld a, SAFARI_BAIT - ld [wcf91], a - jr .useItem -.bagWasSelected - call LoadScreenTilesFromBuffer1 - ld a, [W_BATTLETYPE] - and a ; is it a normal battle? - jr nz, .next -; normal battle - call DrawHUDsAndHPBars -.next - ld a, [W_BATTLETYPE] - dec a ; is it the old man tutorial? - jr nz, .getPlayerBagPointer ; no, it is a normal battle - ld hl, .oldManItemList - ld a, l - ld [wcf8b], a - ld a, h - ld [wcf8c], a -<<<<<<< HEAD - jr Func_3d03c - -OldManItemList: ; 3d02d (f:502d) - db 1 ; # items - db POKE_BALL, 50 - db -1 - -Func_3d031 - ld hl, wNumBagItems ; wNumBagItems -======= - jr .displayBagMenu -.oldManItemList - db $01, POKE_BALL, 50, $ff -.getPlayerBagPointer ; get the pointer to player's bag when in a normal battle - ld hl, wNumBagItems ->>>>>>> yama/master - ld a, l - ld [wcf8b], a - ld a, h - ld [wcf8c], a -.displayBagMenu - xor a - ld [wcf93], a - ld a, ITEMLISTMENU - ld [wListMenuID], a - ld a, [wcc2c] - ld [wCurrentMenuItem], a - call DisplayListMenuID - ld a, [wCurrentMenuItem] - ld [wcc2c], a - ld a, $0 - ld [wcc37], a - ld [wMenuItemToSwap], a - jp c, DisplayBattleMenu ; go back to battle menu if an item was not selected -.useItem ; either use an item from the bag or use a safari zone item - ld a, [wcf91] - ld [wd11e], a - call GetItemName - call CopyStringToCF4B ; copy name - xor a - ld [wd152], a - call UseItem - call LoadHudTilePatterns - call ClearSprites - xor a - ld [wCurrentMenuItem], a - ld a, [W_BATTLETYPE] - cp $2 ; is it a safari battle? - jr z, .checkIfMonCaptured - ld a, [wcd6a] - and a ; was the item used successfully? - jp z, .bagWasSelected ; if not, go back to the bag menu - ld a, [W_PLAYERBATTSTATUS1] - bit 5, a ; is the player using a multi-turn move like wrap? - jr z, .checkIfMonCaptured - ld hl, wPlayerNumAttacksLeft - dec [hl] - jr nz, .checkIfMonCaptured - ld hl, W_PLAYERBATTSTATUS1 - res 5, [hl] ; not using multi-turn move any more -.checkIfMonCaptured - ld a, [wd11c] - and a ; was the enemy mon captured with a ball? - jr nz, .returnAfterCapturingMon - ld a, [W_BATTLETYPE] - cp $2 ; is it a safari battle? - jr z, .returnAfterUsingItem_NoCapture -; not a safari battle - call LoadScreenTilesFromBuffer1 - call DrawHUDsAndHPBars - call Delay3 -.returnAfterUsingItem_NoCapture - call GBPalNormal - and a ; reset carry - ret -.returnAfterCapturingMon - call GBPalNormal - xor a - ld [wd11c], a - ld a, $2 - ld [wBattleResult], a - scf ; set carry - ret - -.itemsCantBeUsedHereText - TX_FAR _ItemsCantBeUsedHereText - db "@" - -.partyMenuOrRockOrRunWasSelected - dec a ; was Run selected? - jp nz, BattleMenu_RunWasSelected -; party menu or rock was selected - call SaveScreenTilesToBuffer2 - ld a, [W_BATTLETYPE] - cp $2 ; is it a safari battle? - jr nz, .partyMenuWasSelected -; safari battle - ld a, SAFARI_ROCK - ld [wcf91], a - jp .useItem -.partyMenuWasSelected - call LoadScreenTilesFromBuffer1 - xor a - ld [wd07d], a - ld [wMenuItemToSwap], a - call DisplayPartyMenu -.checkIfPartyMonWasSelected - jp nc, .partyMonWasSelected ; if a party mon was selected, jump, else we quit the party menu -.quitPartyMenu - call ClearSprites - call GBPalWhiteOut - call LoadHudTilePatterns - call LoadScreenTilesFromBuffer2 - call GoPAL_SET_CF1C - call GBPalNormal - jp DisplayBattleMenu -.partyMonDeselected - hlCoord 11, 11 - ld bc, $81 - ld a, $7f - call FillMemory - xor a - ld [wd07d], a - call GoBackToPartyMenu - jr .checkIfPartyMonWasSelected -.partyMonWasSelected - ld a, $c ; switch/stats/cancel menu - ld [wd125], a - call DisplayTextBoxID - ld hl, wTopMenuItemY - ld a, $c - ld [hli], a ; wTopMenuItemY - ld [hli], a ; wTopMenuItemX - xor a - ld [hli], a ; wCurrentMenuItem - inc hl - ld a, $2 - ld [hli], a ; wMaxMenuItem - ld a, B_BUTTON | A_BUTTON - ld [hli], a ; wMenuWatchedKeys - xor a - ld [hl], a ; wLastMenuItem - call HandleMenuInput - bit 1, a ; was A pressed? - jr nz, .partyMonDeselected ; if B was pressed, jump -; A was pressed - call PlaceUnfilledArrowMenuCursor - ld a, [wCurrentMenuItem] - cp $2 ; was Cancel selected? - jr z, .quitPartyMenu ; if so, quit the party menu entirely - and a ; was Switch selected? - jr z, .switchMon ; if so, jump -; Stats was selected - xor a - ld [wcc49], a - ld hl, wPartyMon1 - call ClearSprites -; display the two status screens - predef StatusScreen - predef StatusScreen2 -; now we need to reload the enemy mon pic - ld a, [W_ENEMYBATTSTATUS2] - bit 4, a ; does the enemy mon have a substitute? - ld hl, AnimationSubstitute - jr nz, .doEnemyMonAnimation -; enemy mon doesn't have substitute - ld a, [wccf3] - and a ; has the enemy mon used Minimise? - ld hl, AnimationMinimizeMon - jr nz, .doEnemyMonAnimation -; enemy mon is not minimised - ld a, [wEnemyMonSpecies] - ld [wcf91], a - ld [wd0b5], a - call GetMonHeader - ld de, vFrontPic - call LoadMonFrontSprite - jr .enemyMonPicReloaded -.doEnemyMonAnimation - ld b, BANK(AnimationSubstitute) ; BANK(AnimationMinimizeMon) - call Bankswitch -.enemyMonPicReloaded ; enemy mon pic has been reloaded, so return to the party menu - jp .partyMenuWasSelected -.switchMon - ld a, [wPlayerMonNumber] - ld d, a - ld a, [wWhichPokemon] - cp d ; check if the mon to switch to is already out - jr nz, .notAlreadyOut -; mon is already out - ld hl, AlreadyOutText - call PrintText - jp .partyMonDeselected -.notAlreadyOut - call HasMonFainted - jp z, .partyMonDeselected ; can't switch to fainted mon - ld a, $1 - ld [wcd6a], a - call GBPalWhiteOut - call ClearSprites - call LoadHudTilePatterns - call LoadScreenTilesFromBuffer1 - call GoPAL_SET_CF1C - call GBPalNormal -; fall through to SwitchPlayerMon - -SwitchPlayerMon: ; 3d1ba (f:51ba) - callab RetreatMon - ld c, $32 - call DelayFrames - call AnimateRetreatingPlayerMon - ld a, [wWhichPokemon] - ld [wPlayerMonNumber], a - ld c, a - ld b, $1 - push bc - ld hl, wPartyGainExpFlags - predef FlagActionPredef - pop bc - ld hl, wPartyFoughtCurrentEnemyFlags - predef FlagActionPredef - call LoadBattleMonFromParty - call SendOutMon - call SaveScreenTilesToBuffer1 - ld a, $2 - ld [wCurrentMenuItem], a - and a - ret - -AlreadyOutText: ; 3d1f5 (f:51f5) - TX_FAR _AlreadyOutText - db "@" - -BattleMenu_RunWasSelected: ; 3d1fa (f:51fa) - call LoadScreenTilesFromBuffer1 - ld a, $3 - ld [wCurrentMenuItem], a - ld hl, wBattleMonSpeed - ld de, wEnemyMonSpeed - call TryRunningFromBattle - ld a, $0 - ld [wd11f], a - ret c - ld a, [wcd6a] - and a - ret nz - jp DisplayBattleMenu - -MoveSelectionMenu: ; 3d219 (f:5219) - ld a, [wMoveMenuType] - dec a - jr z, .mimicmenu - dec a - jr z, .relearnmenu - jr .regularmenu - -.loadmoves - ld de, wd0dc - ld bc, $4 - call CopyData - callab Func_39b87 - ret - -.writemoves - ld de, wd0e1 - ld a, [$fff6] - set 2, a - ld [$fff6], a - call PlaceString - ld a, [$fff6] - res 2, a - ld [$fff6], a - ret - -.regularmenu - call Func_3d3f5 - ret z - ld hl, wBattleMonMoves - call .loadmoves - hlCoord 4, 12 - ld b, $4 - ld c, $e - di - call TextBoxBorder - hlCoord 4, 12 - ld [hl], $7a - hlCoord 10, 12 - ld [hl], $7e - ei - hlCoord 6, 13 - call .writemoves - ld b, $5 - ld a, $c - jr .menuset -.mimicmenu - ld hl, wEnemyMonMoves - call .loadmoves - hlCoord 0, 7 - ld b, $4 - ld c, $e - call TextBoxBorder - hlCoord 2, 8 - call .writemoves - ld b, $1 - ld a, $7 - jr .menuset -.relearnmenu - ld a, [wWhichPokemon] - ld hl, wPartyMon1Moves - ld bc, $2c - call AddNTimes - call .loadmoves - hlCoord 4, 7 - ld b, $4 - ld c, $e - call TextBoxBorder - hlCoord 6, 8 - call .writemoves - ld b, $5 - ld a, $7 -.menuset - ld hl, wTopMenuItemY - ld [hli], a - ld a, b - ld [hli], a - ld a, [wMoveMenuType] - cp $1 - jr z, .selectedmoveknown - ld a, $1 - jr nc, .selectedmoveknown - ld a, [wPlayerMoveListIndex] - inc a -.selectedmoveknown - ld [hli], a - inc hl ; wTileBehindCursor untouched - ld a, [wcd6c] - inc a - inc a - ld [hli], a - ld a, [wMoveMenuType] - dec a - ld b, $c1 ; can't use B - jr z, .matchedkeyspicked - dec a - ld b, $c3 - jr z, .matchedkeyspicked - ld a, [W_ISLINKBATTLE] - cp $4 - jr z, .matchedkeyspicked - ld a, [W_FLAGS_D733] - bit 0, a - ld b, $c7 - jr z, .matchedkeyspicked - ld b, $ff -.matchedkeyspicked - ld a, b - ld [hli], a - ld a, [wMoveMenuType] - cp $1 - jr z, .movelistindex1 - ld a, [wPlayerMoveListIndex] - inc a -.movelistindex1 - ld [hl], a - -Func_3d2fe: ; 3d2fe (f:52fe) - ld a, [wMoveMenuType] - and a - jr z, .battleselect - dec a - jr nz, .select - hlCoord 1, 14 - ld de, WhichTechniqueString - call PlaceString - jr .select -.battleselect - ld a, [W_FLAGS_D733] - bit 0, a - jr nz, .select - call Func_3d4b6 - ld a, [wMenuItemToSwap] - and a - jr z, .select - hlCoord 5, 13 - dec a - ld bc, $14 - call AddNTimes - ld [hl], $ec -.select - ld hl, $fff6 - set 1, [hl] - call HandleMenuInput - ld hl, $fff6 - res 1, [hl] - bit 6, a - jp nz, Func_3d3c9 ; up - bit 7, a - jp nz, Func_3d3dd ; down - bit 2, a - jp nz, SwapMovesInMenu ; select - bit 1, a ; B, but was it reset above? - push af - xor a - ld [wMenuItemToSwap], a - ld a, [wCurrentMenuItem] - dec a - ld [wCurrentMenuItem], a - ld b, a - ld a, [wMoveMenuType] - dec a ; if not mimic - jr nz, .nob - pop af - ret -.nob - dec a - ld a, b - ld [wPlayerMoveListIndex], a - jr nz, .moveselected - pop af - ret -.moveselected - pop af - ret nz - ld hl, wBattleMonPP - ld a, [wCurrentMenuItem] - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - and $3f - jr z, .nopp - ld a, [W_PLAYERDISABLEDMOVE] - swap a - and $f - dec a - cp c - jr z, .disabled - ld a, [W_PLAYERBATTSTATUS3] - bit 3, a ; transformed - jr nz, .dummy ; game freak derp -.dummy - ld a, [wCurrentMenuItem] - ld hl, wBattleMonMoves - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - ld [wPlayerSelectedMove], a - xor a - ret -.disabled - ld hl, MoveDisabledText - jr .print -.nopp - ld hl, MoveNoPPText -.print - call PrintText - call LoadScreenTilesFromBuffer1 - jp MoveSelectionMenu - -MoveNoPPText: ; 3d3ae (f:53ae) - TX_FAR _MoveNoPPText - db "@" - -MoveDisabledText: ; 3d3b3 (f:53b3) - TX_FAR _MoveDisabledText - db "@" - -WhichTechniqueString: ; 3d3b8 (f:53b8) - db "WHICH TECHNIQUE?@" - -Func_3d3c9: ; 3d3c9 (f:53c9) - ld a, [wCurrentMenuItem] - and a - jp nz, Func_3d2fe - call EraseMenuCursor - ld a, [wcd6c] - inc a - ld [wCurrentMenuItem], a - jp Func_3d2fe - -Func_3d3dd: ; 3d3dd (f:53dd) - ld a, [wCurrentMenuItem] - ld b, a - ld a, [wcd6c] - inc a - inc a - cp b - jp nz, Func_3d2fe - call EraseMenuCursor - ld a, $1 - ld [wCurrentMenuItem], a - jp Func_3d2fe - -Func_3d3f5: ; 3d3f5 (f:53f5) - ld a, STRUGGLE - ld [wPlayerSelectedMove], a - ld a, [W_PLAYERDISABLEDMOVE] - and a - ld hl, wBattleMonPP - jr nz, .asm_3d40e - ld a, [hli] - or [hl] - inc hl - or [hl] - inc hl - or [hl] - and $3f - ret nz - jr .asm_3d423 -.asm_3d40e - swap a - and $f - ld b, a - ld d, $5 - xor a -.asm_3d416 - dec d - jr z, .asm_3d421 - ld c, [hl] - inc hl - dec b - jr z, .asm_3d416 - or c - jr .asm_3d416 -.asm_3d421 - and a - ret nz -.asm_3d423 - ld hl, NoMovesLeftText - call PrintText - ld c, $3c - call DelayFrames - xor a - ret - -NoMovesLeftText: ; 3d430 (f:5430) - TX_FAR _NoMovesLeftText - db "@" - -SwapMovesInMenu: ; 3d435 (f:5435) - ld a, [wMenuItemToSwap] - and a - jr z, .noMenuItemSelected - ld hl, wBattleMonMoves - call .swapBytes ; swap moves - ld hl, wBattleMonPP - call .swapBytes ; swap move PP -; update the index of the disabled move if necessary - ld hl, W_PLAYERDISABLEDMOVE - ld a, [hl] - swap a - and $f - ld b, a - ld a, [wCurrentMenuItem] - cp b - jr nz, .next - ld a, [hl] - and $f - ld b, a - ld a, [wMenuItemToSwap] - swap a - add b - ld [hl], a - jr .swapMovesInPartyMon -.next - ld a, [wMenuItemToSwap] - cp b - jr nz, .swapMovesInPartyMon - ld a, [hl] - and $f - ld b, a - ld a, [wCurrentMenuItem] - swap a - add b - ld [hl], a -.swapMovesInPartyMon - ld hl, wPartyMon1Moves - ld a, [wPlayerMonNumber] - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - push hl - call .swapBytes ; swap moves - pop hl - ld bc, $15 - add hl, bc - call .swapBytes ; swap move PP - xor a - ld [wMenuItemToSwap], a ; deselect the item - jp MoveSelectionMenu -.swapBytes - push hl - ld a, [wMenuItemToSwap] - dec a - ld c, a - ld b, 0 - add hl, bc - ld d, h - ld e, l - pop hl - ld a, [wCurrentMenuItem] - dec a - ld c, a - ld b, 0 - add hl, bc - ld a, [de] - ld b, [hl] - ld [hl], a - ld a, b - ld [de], a - ret -.noMenuItemSelected - ld a, [wCurrentMenuItem] - ld [wMenuItemToSwap], a ; select the current menu item for swapping - jp MoveSelectionMenu - -Func_3d4b6: ; 3d4b6 (f:54b6) - xor a - ld [H_AUTOBGTRANSFERENABLED], a - hlCoord 0, 8 - ld b, $3 - ld c, $9 - call TextBoxBorder - ld a, [W_PLAYERDISABLEDMOVE] - and a - jr z, .asm_3d4df - swap a - and $f - ld b, a - ld a, [wCurrentMenuItem] - cp b - jr nz, .asm_3d4df - hlCoord 1, 10 - ld de, DisabledText - call PlaceString - jr .asm_3d54e -.asm_3d4df - ld hl, wCurrentMenuItem - dec [hl] - xor a - ld [H_WHOSETURN], a - ld hl, wBattleMonMoves - ld a, [wCurrentMenuItem] - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - ld [wPlayerSelectedMove], a - ld a, [wPlayerMonNumber] - ld [wWhichPokemon], a - ld a, $4 - ld [wcc49], a - callab GetMaxPP - ld hl, wCurrentMenuItem - ld c, [hl] - inc [hl] - ld b, $0 - ld hl, wBattleMonPP - add hl, bc - ld a, [hl] - and $3f - ld [wcd6d], a - hlCoord 1, 9 - ld de, TypeText - call PlaceString - hlCoord 7, 11 - ld [hl], "/" - hlCoord 5, 9 - ld [hl], "/" - hlCoord 5, 11 - ld de, wcd6d - ld bc, $102 - call PrintNumber - hlCoord 8, 11 - ld de, wd11e - ld bc, $102 - call PrintNumber - call GetCurrentMove - hlCoord 2, 10 - predef Func_27d98 -.asm_3d54e - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - jp Delay3 - -DisabledText: ; 3d555 (f:5555) - db "disabled!@" - -TypeText: ; 3d55f (f:555f) - db "TYPE@" - -SelectEnemyMove: ; 3d564 (f:5564) - ld a, [W_ISLINKBATTLE] - sub $4 - jr nz, .noLinkBattle -; link battle - call SaveScreenTilesToBuffer1 - call LinkBattleExchangeData - call LoadScreenTilesFromBuffer1 - ld a, [wcc3e] - cp $e - jp z, .asm_3d601 - cp $d - jr z, .unableToMove - cp $4 - ret nc - ld [wEnemyMoveListIndex], a - ld c, a - ld hl, wEnemyMonMoves - ld b, $0 - add hl, bc - ld a, [hl] - jr .done -.noLinkBattle - ld a, [W_ENEMYBATTSTATUS2] - and $60 ; need to recharge or using rage - ret nz - ld hl, W_ENEMYBATTSTATUS1 - ld a, [hl] - and $12 ; using multi-turn move or bide - ret nz - ld a, [wEnemyMonStatus] - and SLP | 1 << FRZ ; sleeping or frozen - ret nz - ld a, [W_ENEMYBATTSTATUS1] - and $21 ; using fly/dig or thrash/petal dance - ret nz - ld a, [W_PLAYERBATTSTATUS1] - bit 5, a ; caught in player's multi-turn move (e.g. wrap) - jr z, .notCaughtInWrap -.unableToMove - ld a, $ff - jr .done -.notCaughtInWrap - ld hl, wEnemyMonMoves+1 ; 2nd enemy move - ld a, [hld] - and a - jr nz, .atLeastTwoMovesAvailable - ld a, [W_ENEMYDISABLEDMOVE] - and a - ld a, STRUGGLE ; struggle if the only move is disabled - jr nz, .done -.atLeastTwoMovesAvailable - ld a, [W_ISINBATTLE] - dec a - jr z, .chooseRandomMove ; wild encounter - callab AIEnemyTrainerChooseMoves -.chooseRandomMove - push hl - call BattleRandom - ld b, $1 - cp $3f ; select move 1 in [0,3e] (63/256 chance) - jr c, .moveChosen - inc hl - inc b - cp $7f ; select move 1 in [3f,7e] (64/256 chance) - jr c, .moveChosen - inc hl - inc b - cp $be ; select move 1 in [7f,bd] (63/256 chance) - jr c, .moveChosen - inc hl - inc b ; select move 4 in [be,ff] (66/256 chance) -.moveChosen - ld a, b - dec a - ld [wEnemyMoveListIndex], a - ld a, [W_ENEMYDISABLEDMOVE] - swap a - and $f - cp b - ld a, [hl] - pop hl - jr z, .chooseRandomMove ; move disabled, try again - and a - jr z, .chooseRandomMove ; move non-existant, try again -.done - ld [wEnemySelectedMove], a - ret -.asm_3d601 - ld a, STRUGGLE - jr .done - -; this appears to exchange data with the other gameboy during link battles -LinkBattleExchangeData: ; 3d605 (f:5605) - ld a, $ff - ld [wcc3e], a - ld a, [wPlayerMoveListIndex] - cp $f ; is the player running from battle? - jr z, .asm_3d630 - ld a, [wcd6a] - and a - jr nz, .asm_3d629 - ld a, [wPlayerSelectedMove] - cp STRUGGLE - ld b, $e - jr z, .asm_3d62f - dec b - inc a - jr z, .asm_3d62f - ld a, [wPlayerMoveListIndex] - jr .asm_3d630 -.asm_3d629 - ld a, [wWhichPokemon] - add $4 - ld b, a -.asm_3d62f - ld a, b -.asm_3d630 - ld [wcc42], a - callab PrintWaitingText -.asm_3d63b - call Func_22c3 - call DelayFrame - ld a, [wcc3e] - inc a - jr z, .asm_3d63b - ld b, $a -.asm_3d649 - call DelayFrame - call Func_22c3 - dec b - jr nz, .asm_3d649 - ld b, $a -.asm_3d654 - call DelayFrame - call Func_22ed - dec b - jr nz, .asm_3d654 - ret - -ExecutePlayerMove: ; 3d65e (f:565e) - xor a - ld [H_WHOSETURN], a - ld a, [wPlayerSelectedMove] - inc a - jp z, Func_3d80a - xor a - ld [W_MOVEMISSED], a - ld [wcced], a - ld [wccf4], a - ld a, $a - ld [wd05b], a - ld a, [wcd6a] - and a - jp nz, Func_3d80a - call PrintGhostText - jp z, Func_3d80a - call CheckPlayerStatusConditions - jr nz, .asm_3d68a - jp [hl] -.asm_3d68a - call GetCurrentMove - ld hl, W_PLAYERBATTSTATUS1 - bit 4, [hl] - jr nz, asm_3d6a9 - call CheckForDisobedience - jp z, Func_3d80a - -Func_3d69a: ; 3d69a (f:569a) - ld a, [W_PLAYERMOVEEFFECT] - cp CHARGE_EFFECT - jp z, JumpMoveEffect - cp FLY_EFFECT - jp z, JumpMoveEffect - jr asm_3d6b0 - -; in-battle stuff -asm_3d6a9: ; 3d6a9 (f:56a9) - ld hl,W_PLAYERBATTSTATUS1 - res 4,[hl] - res 6,[hl] -asm_3d6b0: ; 3d6b0 (f:56b0) - call PrintMonName1Text - ld hl,DecrementPP - ld de,wPlayerSelectedMove ; pointer to the move just used - ld b,BANK(DecrementPP) - call Bankswitch - ld a,[W_PLAYERMOVEEFFECT] ; effect of the move just used - ld hl,EffectsArray1 - ld de,1 - call IsInArray - jp c,JumpMoveEffect - ld a,[W_PLAYERMOVEEFFECT] - ld hl,EffectsArray5B - ld de,1 - call IsInArray - call c,JumpMoveEffect -asm_3d6dc: ; 3d6dc (f:56dc) - ld a,[W_PLAYERMOVEEFFECT] - ld hl,EffectsArray2 - ld de,1 - call IsInArray - jp c,.asm_3d702 - call CriticalHitTest - call HandleCounterMove - jr z,asm_3d705 - call GetDamageVarsForPlayerAttack - call CalculateDamage - jp z,asm_3d74b - call AdjustDamageForMoveType - call RandomizeDamage -.asm_3d702 - call MoveHitTest -asm_3d705 - ld a,[W_MOVEMISSED] - and a - jr z,asm_3d714 - ld a,[W_PLAYERMOVEEFFECT] - sub a,7 - jr z,asm_3d71e - jr asm_3d74b -asm_3d714 - ld a,[W_PLAYERMOVEEFFECT] - and a - ld a,4 - jr z,asm_3d71e - ld a,5 -asm_3d71e - push af - ld a,[W_PLAYERBATTSTATUS2] - bit 4,a - ld hl,Func_79747 - ld b,BANK(Func_79747) - call nz,Bankswitch - pop af - ld [wcc5b],a - ld a,[W_PLAYERMOVENUM] - call PlayMoveAnimation - call Func_3eed3 - call DrawPlayerHUDAndHPBar - ld a,[W_PLAYERBATTSTATUS2] - bit 4,a - ld hl,Func_79771 - ld b,BANK(Func_79771) - call nz,Bankswitch - jr asm_3d766 -asm_3d74b - ld c,$1E - call DelayFrames - ld a,[W_PLAYERMOVEEFFECT] - cp a,FLY_EFFECT - jr z,.next5 - cp a,CHARGE_EFFECT - jr z,.next5 - jr asm_3d766 -.next5 - xor a - ld [wcc5b],a - ld a,STATUS_AFFECTED_ANIM - call PlayMoveAnimation -asm_3d766 - ld a,[W_PLAYERMOVEEFFECT] - cp a,MIRROR_MOVE_EFFECT - jr nz,.next6 - call MirrorMoveCopyMove - jp z,Func_3d80a - xor a - ld [wcced],a - jp Func_3d69a -.next6 - cp a,METRONOME_EFFECT - jr nz,.next7 - call MetronomePickMove - jp Func_3d69a -.next7 - ld a,[W_PLAYERMOVEEFFECT] - ld hl,EffectsArray3 - ld de,1 - call IsInArray - jp c,JumpMoveEffect - ld a,[W_MOVEMISSED] - and a - jr z,.next8 - call PrintMoveFailureText - ld a,[W_PLAYERMOVEEFFECT] - cp a,EXPLODE_EFFECT - jr z,.next9 - jp Func_3d80a -.next8 - call ApplyAttackToEnemyPokemon - call PrintCriticalOHKOText - callab DisplayEffectiveness - ld a,1 - ld [wccf4],a -.next9 - ld a,[W_PLAYERMOVEEFFECT] - ld hl,EffectsArray4 - ld de,1 - call IsInArray - call c,JumpMoveEffect - ld hl,wEnemyMonHP - ld a,[hli] - ld b,[hl] - or b - ret z - call HandleBuildingRage - - ld hl,W_PLAYERBATTSTATUS1 - bit 2,[hl] - jr z,.next10 - ld a,[wPlayerNumAttacksLeft] - dec a - ld [wPlayerNumAttacksLeft],a - jp nz,asm_3d714 - - res 2,[hl] - ld hl,MultiHitText - call PrintText - xor a - ld [W_NUMHITS],a ; reset -.next10 - ld a,[W_PLAYERMOVEEFFECT] - and a - jp z,Func_3d80a - ld hl,EffectsArray5 - ld de,1 - call IsInArray - call nc,JumpMoveEffect - jp Func_3d80a - -MultiHitText: ; 3d805 (f:5805) - TX_FAR _MultiHitText - db "@" - -Func_3d80a: ; 3d80a (f:580a) - xor a - ld [wcd6a],a - ld b,1 - ret - -PrintGhostText: ; 3d811 (f:5811) -; print the ghost battle messages - call IsGhostBattle - ret nz - ld a,[H_WHOSETURN] - and a - jr nz,.Ghost - ld a,[wBattleMonStatus] ; player’s turn - and a,SLP | (1 << FRZ) - ret nz - ld hl,ScaredText - call PrintText - xor a - ret -.Ghost ; ghost’s turn - ld hl,GetOutText - call PrintText - xor a - ret - -ScaredText: ; 3d830 (f:5830) - TX_FAR _ScaredText - db "@" - -GetOutText: ; 3d835 (f:5835) - TX_FAR _GetOutText - db "@" - -IsGhostBattle: ; 3d83a (f:583a) - ld a,[W_ISINBATTLE] - dec a - ret nz - ld a,[W_CURMAP] - cp a,POKEMONTOWER_1 - jr c,.next - cp a,LAVENDER_HOUSE_1 - jr nc,.next - ld b,SILPH_SCOPE - call IsItemInBag - ret z -.next - ld a,1 - and a - ret - -; checks for various status conditions affecting the player mon -; stores whether the mon cannot use a move this turn in Z flag -CheckPlayerStatusConditions: ; 3d854 (f:5854) - ld hl,wBattleMonStatus - ld a,[hl] - and a,SLP ; sleep mask - jr z,.FrozenCheck - -; sleeping - dec a - ld [wBattleMonStatus],a ; decrement number of turns left - and a - jr z,.WakeUp ; if the number of turns hit 0, wake up -; fast asleep - xor a - ld [wcc5b],a - ld a,SLP_ANIM - 1 - call PlayMoveAnimation - ld hl,FastAsleepText - call PrintText - jr .sleepDone -.WakeUp - ld hl,WokeUpText - call PrintText -.sleepDone - xor a - ld [wccf1],a - ld hl,Func_3d80a - jp .CannotUseMove - -.FrozenCheck - bit FRZ,[hl] ; frozen? - jr z,.HeldInPlaceCheck - ld hl,IsFrozenText - call PrintText - xor a - ld [wccf1],a - ld hl,Func_3d80a - jp .CannotUseMove - -.HeldInPlaceCheck - ld a,[W_ENEMYBATTSTATUS1] - bit 5,a - jp z,.FlinchedCheck - ld hl,CantMoveText - call PrintText - ld hl,Func_3d80a - jp .CannotUseMove - -.FlinchedCheck - ld hl,W_PLAYERBATTSTATUS1 - bit 3,[hl] - jp z,.HyperBeamCheck - res 3,[hl] - ld hl,FlinchedText - call PrintText - ld hl,Func_3d80a - jp .CannotUseMove - -.HyperBeamCheck - ld hl,W_PLAYERBATTSTATUS2 - bit 5,[hl] - jr z,.AnyMoveDisabledCheck - res 5,[hl] - ld hl,MustRechargeText - call PrintText - ld hl,Func_3d80a - jp .CannotUseMove - -.AnyMoveDisabledCheck - ld hl,W_PLAYERDISABLEDMOVE - ld a,[hl] - and a - jr z,.ConfusedCheck - dec a - ld [hl],a - and a,$F - jr nz,.ConfusedCheck - ld [hl],a - ld [wccee],a - ld hl,DisabledNoMoreText - call PrintText - -.ConfusedCheck - ld a,[W_PLAYERBATTSTATUS1] - add a - jr nc,.TriedToUseDisabledMoveCheck - ld hl,wd06b - dec [hl] - jr nz,.IsConfused - ld hl,W_PLAYERBATTSTATUS1 - res 7,[hl] - ld hl,ConfusedNoMoreText - call PrintText - jr .TriedToUseDisabledMoveCheck -.IsConfused - ld hl,IsConfusedText - call PrintText - xor a - ld [wcc5b],a - ld a,CONF_ANIM - 1 - call PlayMoveAnimation - call BattleRandom - cp a,$80 - jr c,.TriedToUseDisabledMoveCheck - ld hl,W_PLAYERBATTSTATUS1 - ld a,[hl] - and a,$80 ; confused - ld [hl],a - call PrintHurtItselfText - jr .MonHurtItselfOrFullyParalysed - -.TriedToUseDisabledMoveCheck - ld a,[wccee] - and a - jr z,.ParalysisCheck - ld hl,wPlayerSelectedMove - cp [hl] - jr nz,.ParalysisCheck - call PrintMoveIsDisabledText - ld hl,Func_3d80a - jp .CannotUseMove - -.ParalysisCheck - ld hl,wBattleMonStatus - bit PAR,[hl] - jr z,.BideCheck - call BattleRandom - cp a,$3F - jr nc,.BideCheck - ld hl,FullyParalyzedText - call PrintText - -.MonHurtItselfOrFullyParalysed - ld hl,W_PLAYERBATTSTATUS1 - ld a,[hl] - and a,$CC ; clear bide, thrashing, charging up, and multi-turn moves such as warp - ld [hl],a - ld a,[W_PLAYERMOVEEFFECT] - cp a,FLY_EFFECT - jr z,.FlyOrChargeEffect - cp a,CHARGE_EFFECT - jr z,.FlyOrChargeEffect - jr .NotFlyOrChargeEffect - -.FlyOrChargeEffect - xor a - ld [wcc5b],a - ld a,STATUS_AFFECTED_ANIM - call PlayMoveAnimation -.NotFlyOrChargeEffect - ld hl,Func_3d80a - jp .CannotUseMove - -.BideCheck - ld hl,W_PLAYERBATTSTATUS1 - bit 0,[hl] ; is mon using bide? - jr z,.ThrashingAboutCheck - xor a - ld [W_PLAYERMOVENUM],a - ld hl,W_DAMAGE - ld a,[hli] - ld b,a - ld c,[hl] - ld hl,wd075 - ld a,[hl] - add c - ld [hld],a - ld a,[hl] - adc b - ld [hl],a - ld hl,wPlayerNumAttacksLeft - dec [hl] - jr z,.UnleashEnergy - ld hl,Func_3d80a - jp .CannotUseMove -.UnleashEnergy - ld hl,W_PLAYERBATTSTATUS1 - res 0,[hl] ; not using bide any more - ld hl,UnleashedEnergyText - call PrintText - ld a,1 - ld [W_PLAYERMOVEPOWER],a - ld hl,wd075 - ld a,[hld] - add a - ld b,a - ld [wd0d8],a - ld a,[hl] - rl a - ld [W_DAMAGE],a - or b - jr nz,.next - ld a,1 - ld [W_MOVEMISSED],a -.next - xor a - ld [hli],a - ld [hl],a - ld a,BIDE - ld [W_PLAYERMOVENUM],a - ld hl,asm_3d705 - jp .CannotUseMove - -.ThrashingAboutCheck - bit 1,[hl] ; is mon using thrash or petal dance? - jr z,.MultiturnMoveCheck - ld a,THRASH - ld [W_PLAYERMOVENUM],a - ld hl,ThrashingAboutText - call PrintText - ld hl,wPlayerNumAttacksLeft - dec [hl] - ld hl,asm_3d6dc - jp nz,.CannotUseMove - push hl - ld hl,W_PLAYERBATTSTATUS1 - res 1,[hl] - set 7,[hl] - call BattleRandom - and a,3 - inc a - inc a - ld [wd06b],a - pop hl - jp .CannotUseMove - -.MultiturnMoveCheck - bit 5,[hl] ; is mon using multi-turn move? - jp z,.RageCheck - ld hl,AttackContinuesText - call PrintText - ld a,[wPlayerNumAttacksLeft] - dec a - ld [wPlayerNumAttacksLeft],a - ld hl,asm_3d714 - jp nz,.CannotUseMove - jp .CannotUseMove - -.RageCheck - ld a, [W_PLAYERBATTSTATUS2] - bit 6, a ; is mon using rage? - jp z, .CanUseMove - ld a, RAGE - ld [wd11e], a - call GetMoveName - call CopyStringToCF4B - xor a - ld [W_PLAYERMOVEEFFECT], a - ld hl, asm_3d6b0 - jp .CannotUseMove - -.CannotUseMove - xor a - ret - -.CanUseMove - ld a, $1 - and a - ret - -FastAsleepText: ; 3da3d (f:5a3d) - TX_FAR _FastAsleepText - db "@" - -WokeUpText: ; 3da42 (f:5a42) - TX_FAR _WokeUpText - db "@" - -IsFrozenText: ; 3da47 (f:5a47) - TX_FAR _IsFrozenText - db "@" - -FullyParalyzedText: ; 3da4c (f:5a4c) - TX_FAR _FullyParalyzedText - db "@" - -FlinchedText: ; 3da51 (f:5a51) - TX_FAR _FlinchedText - db "@" - -MustRechargeText: ; 3da56 (f:5a56) - TX_FAR _MustRechargeText - db "@" - -DisabledNoMoreText: ; 3da5b (f:5a5b) - TX_FAR _DisabledNoMoreText - db "@" - -IsConfusedText: ; 3da60 (f:5a60) - TX_FAR _IsConfusedText - db "@" - -HurtItselfText: ; 3da65 (f:5a65) - TX_FAR _HurtItselfText - db "@" - -ConfusedNoMoreText: ; 3da6a (f:5a6a) - TX_FAR _ConfusedNoMoreText - db "@" - -SavingEnergyText: ; 3da6f (f:5a6f) - TX_FAR _SavingEnergyText - db "@" - -UnleashedEnergyText: ; 3da74 (f:5a74) - TX_FAR _UnleashedEnergyText - db "@" - -ThrashingAboutText: ; 3da79 (f:5a79) - TX_FAR _ThrashingAboutText - db "@" - -AttackContinuesText: ; 3da7e (f:5a7e) - TX_FAR _AttackContinuesText - db "@" - -CantMoveText: ; 3da83 (f:5a83) - TX_FAR _CantMoveText - db "@" - -PrintMoveIsDisabledText: ; 3da88 (f:5a88) - ld hl, wPlayerSelectedMove - ld de, W_PLAYERBATTSTATUS1 - ld a, [H_WHOSETURN] - and a - jr z, .asm_3da97 - inc hl - ld de, W_ENEMYBATTSTATUS1 -.asm_3da97 - ld a, [de] - res 4, a - ld [de], a - ld a, [hl] - ld [wd11e], a - call GetMoveName - ld hl, MoveIsDisabledText - jp PrintText - -MoveIsDisabledText: ; 3daa8 (f:5aa8) - TX_FAR _MoveIsDisabledText - db "@" - -PrintHurtItselfText: ; 3daad (f:5aad) - ld hl, HurtItselfText - call PrintText - ld hl, wEnemyMonDefense - ld a, [hli] - push af - ld a, [hld] - push af - ld a, [wBattleMonDefense] - ld [hli], a - ld a, [wBattleMonDefense + 1] - ld [hl], a - ld hl, W_PLAYERMOVEEFFECT - push hl - ld a, [hl] - push af - xor a - ld [hli], a - ld [wCriticalHitOrOHKO], a - ld a, $28 - ld [hli], a - xor a - ld [hl], a - call GetDamageVarsForPlayerAttack - call CalculateDamage - pop af - pop hl - ld [hl], a - ld hl, wEnemyMonDefense + 1 - pop af - ld [hld], a - pop af - ld [hl], a - xor a - ld [wcc5b], a - inc a - ld [H_WHOSETURN], a - call PlayMoveAnimation - call DrawPlayerHUDAndHPBar - xor a - ld [H_WHOSETURN], a - jp ApplyDamageToPlayerPokemon - -PrintMonName1Text: ; 3daf5 (f:5af5) - ld hl, MonName1Text - jp PrintText - -MonName1Text: ; 3dafb (f:5afb) - TX_FAR _MonName1Text - db $08 ; asm - ld a, [H_WHOSETURN] - and a - ld a, [W_PLAYERMOVENUM] - ld hl, wccf1 - jr z, .asm_3db11 - ld a, [W_ENEMYMOVENUM] - ld hl, wccf2 -.asm_3db11 - ld [hl], a - ld [wd11e], a - call Func_3db85 - ld a, [wcced] - and a - ld hl, Used2Text - ret nz - ld a, [wd11e] - cp DOUBLESLAP - ld hl, Used2Text - ret c - ld hl, Used1Text - ret - -Used1Text: ; 3db2d (f:5b2d) - TX_FAR _Used1Text - db $08 ; asm - jr PrintInsteadText - -Used2Text: ; 3db34 (f:5b34) - TX_FAR _Used2Text - db $08 ; asm - -PrintInsteadText: ; 3db39 (f:5b39) - ld a, [wcced] - and a - jr z, PrintCF4BText - ld hl, InsteadText - ret - -InsteadText: ; 3db43 (f:5b43) - TX_FAR _InsteadText - db $08 ; asm - -PrintCF4BText: ; 3db48 (f:5b48) - ld hl, CF4BText - ret - -CF4BText: ; 3db4c (f:5b4c) - TX_FAR _CF4BText - db $08 ; asm - ld hl, ExclamationPointPointerTable - ld a, [wd11e] - add a - push bc - ld b, $0 - ld c, a - add hl, bc - pop bc - ld a, [hli] - ld h, [hl] - ld l, a - ret - -ExclamationPointPointerTable: ; 3db62 (f:5b62) - dw ExclamationPoint1Text - dw ExclamationPoint2Text - dw ExclamationPoint3Text - dw ExclamationPoint4Text - dw ExclamationPoint5Text - -ExclamationPoint1Text: ; 3db6c (f:5b6c) - TX_FAR _ExclamationPoint1Text - db "@" - -ExclamationPoint2Text: ; 3db71 (f:5b71) - TX_FAR _ExclamationPoint2Text - db "@" - -ExclamationPoint3Text: ; 3db76 (f:5b76) - TX_FAR _ExclamationPoint3Text - db "@" - -ExclamationPoint4Text: ; 3db7b (f:5b7b) - TX_FAR _ExclamationPoint4Text - db "@" - -ExclamationPoint5Text: ; 3db80 (f:5b80) - TX_FAR _ExclamationPoint5Text - db "@" - -Func_3db85: ; 3db85 (f:5b85) - push bc - ld a, [wd11e] ; move number - ld c, a - ld b, $0 - ld hl, UnknownMovesList_3dba3 -.asm_3db8f - ld a, [hli] - cp $ff - jr z, .asm_3db9d - cp c - jr z, .asm_3db9d - and a - jr nz, .asm_3db8f - inc b - jr .asm_3db8f -.asm_3db9d - ld a, b - ld [wd11e], a - pop bc - ret - -UnknownMovesList_3dba3: ; 3dba3 (f:5ba3) - db SWORDS_DANCE, GROWTH - db $00 - db RECOVER, BIDE, SELFDESTRUCT, AMNESIA - db $00 - db MEDITATE, AGILITY, TELEPORT, MIMIC, DOUBLE_TEAM, BARRAGE - db $00 - db POUND, SCRATCH, VICEGRIP, WING_ATTACK, FLY, BIND, SLAM, HORN_ATTACK, BODY_SLAM - db WRAP, THRASH, TAIL_WHIP, LEER, BITE, GROWL, ROAR, SING, PECK, COUNTER - db STRENGTH, ABSORB, STRING_SHOT, EARTHQUAKE, FISSURE, DIG, TOXIC, SCREECH, HARDEN - db MINIMIZE, WITHDRAW, DEFENSE_CURL, METRONOME, LICK, CLAMP, CONSTRICT, POISON_GAS - db LEECH_LIFE, BUBBLE, FLASH, SPLASH, ACID_ARMOR, FURY_SWIPES, REST, SHARPEN, SLASH, SUBSTITUTE - db $00 - db $FF ; terminator - -PrintMoveFailureText: ; 3dbe2 (f:5be2) - ld de, W_PLAYERMOVEEFFECT - ld a, [H_WHOSETURN] - and a - jr z, .playersTurn - ld de, W_ENEMYMOVEEFFECT -.playersTurn - ld hl, DoesntAffectMonText - ld a, [wd05b] - and $7f - jr z, .asm_3dc04 - ld hl, AttackMissedText - ld a, [wCriticalHitOrOHKO] - cp $ff - jr nz, .asm_3dc04 - ld hl, UnaffectedText -.asm_3dc04 - push de - call PrintText - xor a - ld [wCriticalHitOrOHKO], a - pop de - ld a, [de] - cp JUMP_KICK_EFFECT - ret nz - - ; if you get here, the mon used hi jump kick and missed - ld hl, W_DAMAGE - ld a, [hli] - ld b, [hl] - srl a - rr b - srl a - rr b - srl a - rr b - ld [hl], b - dec hl - ld [hli], a - or b - jr nz, .asm_3dc2a - inc a - ld [hl], a -.asm_3dc2a - ld hl, KeptGoingAndCrashedText - call PrintText - ld b, $4 - predef Func_48125 - ld a, [H_WHOSETURN] - and a - jr nz, .asm_3dc3f - jp ApplyDamageToPlayerPokemon -.asm_3dc3f - jp ApplyDamageToEnemyPokemon - -AttackMissedText: ; 3dc42 (f:5c42) - TX_FAR _AttackMissedText - db "@" - -KeptGoingAndCrashedText: ; 3dc47 (f:5c47) - TX_FAR _KeptGoingAndCrashedText - db "@" - -UnaffectedText: ; 3dc4c (f:5c4c) - TX_FAR _UnaffectedText - db "@" - -PrintDoesntAffectText: ; 3dc51 (f:5c51) - ld hl, DoesntAffectMonText - jp PrintText - -DoesntAffectMonText: ; 3dc57 (f:5c57) - TX_FAR _DoesntAffectMonText - db "@" - -; if there was a critical hit or an OHKO was successful, print the corresponding text -PrintCriticalOHKOText: ; 3dc5c (f:5c5c) - ld a, [wCriticalHitOrOHKO] - and a - jr z, .done ; do nothing if there was no critical hit or successful OHKO - dec a - add a - ld hl, CriticalOHKOTextPointers - ld b, $0 - ld c, a - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - call PrintText - xor a - ld [wCriticalHitOrOHKO], a -.done - ld c, $14 - jp DelayFrames - -CriticalOHKOTextPointers: ; 3dc7a (f:5c7a) - dw CriticalHitText - dw OHKOText - -CriticalHitText: ; 3dc7e (f:5c7e) - TX_FAR _CriticalHitText - db "@" - -OHKOText: ; 3dc83 (f:5c83) - TX_FAR _OHKOText - db "@" - -; checks if a traded mon will disobey due to lack of badges -; stores whether the mon will use a move in Z flag -CheckForDisobedience: ; 3dc88 (f:5c88) - xor a - ld [wcced], a - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .checkIfMonIsTraded - ld a, $1 - and a - ret -; compare the mon's original trainer ID with the player's ID to see if it was traded -.checkIfMonIsTraded - ld hl, wPartyMon1OTID - ld bc, wPartyMon2 - wPartyMon1 - ld a, [wPlayerMonNumber] - call AddNTimes - ld a, [wPlayerID] - cp [hl] - jr nz, .monIsTraded - inc hl - ld a, [wPlayerID + 1] - cp [hl] - jp z, .canUseMove -; it was traded -.monIsTraded -; what level might disobey? - ld hl, W_OBTAINEDBADGES - bit 7, [hl] - ld a, 101 - jr nz, .next - bit 5, [hl] - ld a, 70 - jr nz, .next - bit 3, [hl] - ld a, 50 - jr nz, .next - bit 1, [hl] - ld a, 30 - jr nz, .next - ld a, 10 -.next - ld b, a - ld c, a - ld a, [wBattleMonLevel] - ld d, a - add b - ld b, a - jr nc, .noCarry - ld b, $ff ; cap b at $ff -.noCarry - ld a, c - cp d - jp nc, .canUseMove -.loop1 - call BattleRandom - swap a - cp b - jr nc, .loop1 - cp c - jp c, .canUseMove -.loop2 - call BattleRandom - cp b - jr nc, .loop2 - cp c - jr c, .useRandomMove - ld a, d - sub c - ld b, a - call BattleRandom - swap a - sub b - jr c, .monNaps - cp b - jr nc, .monDoesNothing - ld hl, WontObeyText - call PrintText - call PrintHurtItselfText - jp .cannotUseMove -.monNaps - call BattleRandom - add a - swap a - and SLP ; sleep mask - jr z, .monNaps ; keep trying until we get at least 1 turn of sleep - ld [wBattleMonStatus], a - ld hl, BeganToNapText - jr .printText -.monDoesNothing - call BattleRandom - and $3 - ld hl, LoafingAroundText - and a - jr z, .printText - ld hl, WontObeyText - dec a - jr z, .printText - ld hl, TurnedAwayText - dec a - jr z, .printText - ld hl, IgnoredOrdersText -.printText - call PrintText - jr .cannotUseMove -.useRandomMove - ld a, [wBattleMonMoves + 1] - and a ; is the second move slot empty? - jr z, .monDoesNothing ; mon will not use move if it only knows one move - ld a, [wccee] - and a - jr nz, .monDoesNothing - ld a, [wPlayerSelectedMove] - cp STRUGGLE - jr z, .monDoesNothing ; mon will not use move if struggling -; check if only one move has remaining PP - ld hl, wBattleMonPP - push hl - ld a, [hli] - and $3f - ld b, a - ld a, [hli] - and $3f - add b - ld b, a - ld a, [hli] - and $3f - add b - ld b, a - ld a, [hl] - and $3f - add b - pop hl - push af - ld a, [wCurrentMenuItem] - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - and $3f - ld b, a - pop af - cp b - jr z, .monDoesNothing ; mon will not use move if only one move has remaining PP - ld a, $1 - ld [wcced], a - ld a, [wMaxMenuItem] - ld b, a - ld a, [wCurrentMenuItem] - ld c, a -.chooseMove - call BattleRandom - and $3 - cp b - jr nc, .chooseMove ; if the random number is greater than the move count, choose another - cp c - jr z, .chooseMove ; if the random number matches the move the player selected, choose another - ld [wCurrentMenuItem], a - ld hl, wBattleMonPP - ld e, a - ld d, $0 - add hl, de - ld a, [hl] - and a ; does the move have any PP left? - jr z, .chooseMove ; if the move has no PP left, choose another - ld a, [wCurrentMenuItem] - ld c, a - ld b, $0 - ld hl, wBattleMonMoves - add hl, bc - ld a, [hl] - ld [wPlayerSelectedMove], a - call GetCurrentMove -.canUseMove - ld a, $1 - and a; clear Z flag - ret -.cannotUseMove - xor a ; set Z flag - ret - -LoafingAroundText: ; 3ddb6 (f:5db6) - TX_FAR _LoafingAroundText - db "@" - -BeganToNapText: ; 3ddbb (f:5dbb) - TX_FAR _BeganToNapText - db "@" - -WontObeyText: ; 3ddc0 (f:5dc0) - TX_FAR _WontObeyText - db "@" - -TurnedAwayText: ; 3ddc5 (f:5dc5) - TX_FAR _TurnedAwayText - db "@" - -IgnoredOrdersText: ; 3ddca (f:5dca) - TX_FAR _IgnoredOrdersText - db "@" - -; sets b, c, d, and e for the CalculateDamage routine in the case of an attack by the player mon -GetDamageVarsForPlayerAttack: ; 3ddcf (f:5dcf) - xor a - ld hl, W_DAMAGE ; damage to eventually inflict, initialise to zero - ldi [hl], a - ld [hl], a - ld hl, W_PLAYERMOVEPOWER - ld a, [hli] - and a - ld d, a ; d = move power - ret z ; return if move power is zero - ld a, [hl] ; a = [W_PLAYERMOVETYPE] - cp FIRE ; types >= FIRE are all special - jr nc, .specialAttack -.physicalAttack - ld hl, wEnemyMonDefense - ld a, [hli] - ld b, a - ld c, [hl] ; bc = enemy defense - ld a, [W_ENEMYBATTSTATUS3] - bit 2, a ; check for Reflect - jr z, .physicalAttackCritCheck -; if the enemy has used Reflect, double the enemy's defense - sla c - rl b -.physicalAttackCritCheck - ld hl, wBattleMonAttack - ld a, [wCriticalHitOrOHKO] - and a ; check for critical hit - jr z, .scaleStats -; in the case of a critical hit, reset the player's attack and the enemy's defense to their base values - ld c, 3 ; defense stat - call GetEnemyMonStat - ld a, [$ff97] - ld b, a - ld a, [$ff98] - ld c, a - push bc - ld hl, wPartyMon1Attack - ld a, [wPlayerMonNumber] - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - pop bc - jr .scaleStats -.specialAttack - ld hl, wEnemyMonSpecial - ld a, [hli] - ld b, a - ld c, [hl] ; bc = enemy special - ld a, [W_ENEMYBATTSTATUS3] - bit 1, a ; check for Light Screen - jr z, .specialAttackCritCheck -; if the enemy has used Light Screen, double the enemy's special - sla c - rl b -.specialAttackCritCheck - ld hl, wBattleMonSpecial - ld a, [wCriticalHitOrOHKO] - and a ; check for critical hit - jr z, .scaleStats -; in the case of a critical hit, reset the player's and enemy's specials to their base values - ld c, 5 ; special stat - call GetEnemyMonStat - ld a, [$ff97] - ld b, a - ld a, [$ff98] - ld c, a - push bc - ld hl, wPartyMon1Special - ld a, [wPlayerMonNumber] - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - pop bc -; if either the offensive or defensive stat is too large to store in a byte, scale both stats by dividing them by 4 -; this allows values with up to 10 bits (values up to 1023) to be handled -; anything larger will wrap around -.scaleStats - ld a, [hli] - ld l, [hl] - ld h, a ; hl = player's offensive stat - or b ; is either high byte nonzero? - jr z, .next ; if not, we don't need to scale - ; bc /= 4 (scale enemy's defensive stat) - srl b - rr c - srl b - rr c - ; hl /= 4 (scale player's offensive stat) - srl h - rr l - srl h - rr l - ld a, l - or h ; is the player's offensive stat 0? - jr nz, .next - inc l ; if the player's offensive stat is 0, bump it up to 1 -.next - ld b, l ; b = player's offensive stat (possibly scaled) (c already contains enemy's defensive stat (possibly scaled)) - ld a, [wBattleMonLevel] - ld e, a ; e = level - ld a, [wCriticalHitOrOHKO] - and a ; check for critical hit - jr z, .done - sla e ; double level if it was a critical hit -.done - ld a, 1 - and a - ret - -; sets b, c, d, and e for the CalculateDamage routine in the case of an attack by the enemy mon -GetDamageVarsForEnemyAttack: ; 3de75 (f:5e75) - ld hl, W_DAMAGE ; damage to eventually inflict, initialise to zero - xor a - ld [hli], a - ld [hl], a - ld hl, W_ENEMYMOVEPOWER - ld a, [hli] - ld d, a ; d = move power - and a - ret z ; return if move power is zero - ld a, [hl] ; a = [W_ENEMYMOVETYPE] - cp FIRE ; types >= FIRE are all special - jr nc, .specialAttack -.physicalAttack - ld hl, wBattleMonDefense - ld a, [hli] - ld b, a - ld c, [hl] ; bc = player defense - ld a, [W_PLAYERBATTSTATUS3] - bit 2, a ; check for Reflect - jr z, .physicalAttackCritCheck -; if the player has used Reflect, double the player's defense - sla c - rl b -.physicalAttackCritCheck - ld hl, wEnemyMonAttack - ld a, [wCriticalHitOrOHKO] - and a ; check for critical hit - jr z, .scaleStats -; in the case of a critical hit, reset the player's defense and the enemy's attack to their base values - ld hl, wPartyMon1Defense - ld a, [wPlayerMonNumber] - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - ld a, [hli] - ld b, a - ld c, [hl] - push bc - ld c, 2 ; attack stat - call GetEnemyMonStat - ld hl, $ff97 - pop bc - jr .scaleStats -.specialAttack - ld hl, wBattleMonSpecial - ld a, [hli] - ld b, a - ld c, [hl] - ld a, [W_PLAYERBATTSTATUS3] - bit 1, a ; check for Light Screen - jr z, .specialAttackCritCheck -; if the player has used Light Screen, double the player's special - sla c - rl b -.specialAttackCritCheck - ld hl, wEnemyMonSpecial - ld a, [wCriticalHitOrOHKO] - and a ; check for critical hit - jr z, .scaleStats -; in the case of a critical hit, reset the player's and enemy's specials to their base values - ld hl, wPartyMon1Special - ld a, [wPlayerMonNumber] - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - ld a, [hli] - ld b, a - ld c, [hl] - push bc - ld c, 5 ; special stat - call GetEnemyMonStat - ld hl, $ff97 - pop bc -; if either the offensive or defensive stat is too large to store in a byte, scale both stats by dividing them by 4 -; this allows values with up to 10 bits (values up to 1023) to be handled -; anything larger will wrap around -.scaleStats - ld a, [hli] - ld l, [hl] - ld h, a ; hl = enemy's offensive stat - or b ; is either high byte nonzero? - jr z, .next ; if not, we don't need to scale -; bc /= 4 (scale player's defensive stat) - srl b - rr c - srl b - rr c -; hl /= 4 (scale enemy's offensive stat) - srl h - rr l - srl h - rr l - ld a, l - or h ; is the enemy's offensive stat 0? - jr nz, .next - inc l ; if the enemy's offensive stat is 0, bump it up to 1 -.next - ld b, l ; b = enemy's offensive stat (possibly scaled) (c already contains player's defensive stat (possibly scaled)) - ld a, [wEnemyMonLevel] - ld e, a - ld a, [wCriticalHitOrOHKO] - and a ; check for critical hit - jr z, .done - sla e ; double level if it was a critical hit -.done - ld a, $1 - and a - and a - ret - -; get stat c of enemy mon -; c: stat to get (HP=1,Attack=2,Defense=3,Speed=4,Special=5) -GetEnemyMonStat: ; 3df1c (f:5f1c) - push de - push bc - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .asm_3df40 - ld hl, wEnemyMon1Stats - dec c - sla c - ld b, $0 - add hl, bc - ld a, [wEnemyMonPartyPos] - ld bc, wEnemyMon2 - wEnemyMon1 - call AddNTimes - ld a, [hli] - ld [$ff97], a - ld a, [hl] - ld [$ff98], a - pop bc - pop de - ret -.asm_3df40 - ld a, [wEnemyMonLevel] - ld [W_CURENEMYLVL], a - ld a, [wEnemyMonSpecies] - ld [wd0b5], a - call GetMonHeader - ld hl, wEnemyMonDVs - ld de, wcfaf - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - pop bc - ld b, $0 - ld hl, wcfa4 - call CalcStat - pop de - ret - -CalculateDamage: ; 3df65 (f:5f65) -; input: -; b: attack -; c: opponent defense -; d: base power -; e: level - - ld a, [$fff3] ; whose turn? - and a - ld a, [W_PLAYERMOVEEFFECT] - jr z, .effect - ld a, [W_ENEMYMOVEEFFECT] -.effect - -; EXPLODE_EFFECT halves defense. - cp a, EXPLODE_EFFECT - jr nz, .ok - srl c - jr nz, .ok - inc c ; ...with a minimum value of 1 (used as a divisor later on) -.ok - -; Multi-hit attacks may or may not have 0 bp. - cp a, TWO_TO_FIVE_ATTACKS_EFFECT - jr z, .skipbp - cp a, $1e - jr z, .skipbp - -; Calculate OHKO damage based on remaining HP. - cp a, OHKO_EFFECT - jp z, Func_3e016 - -; Don't calculate damage for moves that don't do any. - ld a, d ; base power - and a - ret z -.skipbp - - xor a - ld hl, H_DIVIDEND - ldi [hl], a - ldi [hl], a - ld [hl], a - -; Multiply level by 2 - ld a, e ; level - add a - jr nc, .nc - push af - ld a, 1 - ld [hl], a - pop af -.nc - inc hl - ldi [hl], a - -; Divide by 5 - ld a, 5 - ldd [hl], a - push bc - ld b, 4 - call Divide - pop bc - -; Add 2 - inc [hl] - inc [hl] - - inc hl ; multiplier - -; Multiply by attack base power - ld [hl], d - call Multiply - -; Multiply by attack stat - ld [hl], b - call Multiply - -; Divide by defender's defense stat - ld [hl], c - ld b, 4 - call Divide - -; Divide by 50 - ld [hl], 50 - ld b, 4 - call Divide - - ld hl, W_DAMAGE - ld b, [hl] - ld a, [H_QUOTIENT + 3] - add b - ld [H_QUOTIENT + 3], a - jr nc, .asm_3dfd0 - - ld a, [H_QUOTIENT + 2] - inc a - ld [H_QUOTIENT + 2], a - and a - jr z, .asm_3e004 - -.asm_3dfd0 - ld a, [H_QUOTIENT] - ld b, a - ld a, [H_QUOTIENT + 1] - or a - jr nz, .asm_3e004 - - ld a, [H_QUOTIENT + 2] - cp 998 / $100 - jr c, .asm_3dfe8 - cp 998 / $100 + 1 - jr nc, .asm_3e004 - ld a, [H_QUOTIENT + 3] - cp 998 % $100 - jr nc, .asm_3e004 - -.asm_3dfe8 - inc hl - ld a, [H_QUOTIENT + 3] - ld b, [hl] - add b - ld [hld], a - - ld a, [H_QUOTIENT + 2] - ld b, [hl] - adc b - ld [hl], a - jr c, .asm_3e004 - - ld a, [hl] - cp 998 / $100 - jr c, .asm_3e00a - cp 998 / $100 + 1 - jr nc, .asm_3e004 - inc hl - ld a, [hld] - cp 998 % $100 - jr c, .asm_3e00a - -.asm_3e004 - ld a, 997 / $100 - ld [hli], a - ld a, 997 % $100 - ld [hld], a - -.asm_3e00a - inc hl - ld a, [hl] - add 2 - ld [hld], a - jr nc, .done - inc [hl] -.done - - ld a, 1 - and a - ret - -Func_3e016: ; 3e016 (f:6016) - call JumpMoveEffect - ld a, [W_MOVEMISSED] - dec a - ret - - -UnusedHighCriticalMoves: ; 3e01e (f:601e) - db KARATE_CHOP - db RAZOR_LEAF - db CRABHAMMER - db SLASH - db $FF -; 3e023 - -; determines if attack is a critical hit -; azure heights claims "the fastest pokémon (who are,not coincidentally, -; among the most popular) tend to CH about 20 to 25% of the time." -CriticalHitTest: ; 3e023 (f:6023) - xor a - ld [wCriticalHitOrOHKO], a - ld a, [H_WHOSETURN] - and a - ld a, [wEnemyMonSpecies] - jr nz, .asm_3e032 - ld a, [wBattleMonSpecies] -.asm_3e032 - ld [wd0b5], a - call GetMonHeader - ld a, [W_MONHBASESPEED] - ld b, a - srl b ; (effective (base speed/2)) - ld a, [H_WHOSETURN] - and a - ld hl, W_PLAYERMOVEPOWER - ld de, W_PLAYERBATTSTATUS2 - jr z, .calcCriticalHitProbability - ld hl, W_ENEMYMOVEPOWER - ld de, W_ENEMYBATTSTATUS2 -.calcCriticalHitProbability ; 0x3e04f - ld a, [hld] ; read base power from RAM - and a - ret z ; do nothing if zero - dec hl - ld c, [hl] ; read move id - ld a, [de] - bit 2, a ; test for focus energy - jr nz, .focusEnergyUsed ; bug: using focus energy causes a shift to the right instead of left, - ; resulting in 1/4 the usual crit chance - sla b ; (effective (base speed/2)*2) - jr nc, .noFocusEnergyUsed - ld b, $ff ; cap at 255/256 - jr .noFocusEnergyUsed -.focusEnergyUsed - srl b -.noFocusEnergyUsed - ld hl, HighCriticalMoves ; table of high critical hit moves -.Loop - ld a, [hli] ; read move from move table - cp c ; does it match the move about to be used? - jr z, .HighCritical ; if so, the move about to be used is a high critical hit ratio move - inc a ; move on to the next move, FF terminates loop - jr nz, .Loop ; check the next move in HighCriticalMoves - srl b ; /2 for regular move (effective (base speed / 2)) - jr .SkipHighCritical ; continue as a normal move -.HighCritical - sla b ; *2 for high critical hit moves - jr nc, .noCarry - ld b, $ff ; cap at 255/256 -.noCarry - sla b ; *4 for high critical move (effective (base speed/2)*8)) - jr nc, .SkipHighCritical - ld b, $ff -.SkipHighCritical - call BattleRandom ; generates a random value, in "a" - rlc a - rlc a - rlc a - cp b ; check a against calculated crit rate - ret nc ; no critical hit if no borrow - ld a, $1 - ld [wCriticalHitOrOHKO], a ; set critical hit flag - ret - -; high critical hit moves -HighCriticalMoves: ; 3e08e (f:608e) - db KARATE_CHOP - db RAZOR_LEAF - db CRABHAMMER - db SLASH - db $FF - - -; function to determine if Counter hits and if so, how much damage it does -HandleCounterMove: ; 3e093 (f:6093) - ld a,[H_WHOSETURN] ; whose turn - and a -; player's turn - ld hl,wEnemySelectedMove - ld de,W_ENEMYMOVEPOWER - ld a,[wPlayerSelectedMove] - jr z,.next -; enemy's turn - ld hl,wPlayerSelectedMove - ld de,W_PLAYERMOVEPOWER - ld a,[wEnemySelectedMove] -.next - cp a,COUNTER - ret nz ; return if not using Counter - ld a,$01 - ld [W_MOVEMISSED],a ; initialize the move missed variable to true (it is set to false below if the move hits) - ld a,[hl] - cp a,COUNTER - ret z ; if the target also used Counter, miss - ld a,[de] - and a - ret z ; if the move the target used has 0 power, miss -; check if the move the target used was Normal or Fighting type - inc de - ld a,[de] - and a ; normal type - jr z,.counterableType - cp a,FIGHTING - jr z,.counterableType -; if the move wasn't Normal or Fighting type, miss - xor a - ret -.counterableType - ld hl,W_DAMAGE - ld a,[hli] - or [hl] - ret z ; Counter misses if the target did no damage to the Counter user -; double the damage that the target did to the Counter user - ld a,[hl] - add a - ldd [hl],a - ld a,[hl] - adc a - ld [hl],a - jr nc,.noCarry -; damage is capped at 0xFFFF - ld a,$ff - ld [hli],a - ld [hl],a -.noCarry - xor a - ld [W_MOVEMISSED],a - call MoveHitTest ; do the normal move hit test in addition to Counter's special rules - xor a - ret - -ApplyAttackToEnemyPokemon: ; 3e0df (f:60df) - ld a,[W_PLAYERMOVEEFFECT] - cp a,OHKO_EFFECT - jr z,ApplyDamageToEnemyPokemon - cp a,SUPER_FANG_EFFECT - jr z,.superFangEffect - cp a,SPECIAL_DAMAGE_EFFECT - jr z,.specialDamage - ld a,[W_PLAYERMOVEPOWER] - and a - jp z,ApplyAttackToEnemyPokemonDone - jr ApplyDamageToEnemyPokemon -.superFangEffect -; set the damage to half the target's HP - ld hl,wEnemyMonHP - ld de,W_DAMAGE - ld a,[hli] - srl a - ld [de],a - inc de - ld b,a - ld a,[hl] - rr a - ld [de],a - or b - jr nz,ApplyDamageToEnemyPokemon -; make sure Super Fang's damage is always at least 1 - ld a,$01 - ld [de],a - jr ApplyDamageToEnemyPokemon -.specialDamage - ld hl,wBattleMonLevel - ld a,[hl] - ld b,a - ld a,[W_PLAYERMOVENUM] - cp a,SEISMIC_TOSS - jr z,.storeDamage - cp a,NIGHT_SHADE - jr z,.storeDamage - ld b,SONICBOOM_DAMAGE - cp a,SONICBOOM - jr z,.storeDamage - ld b,DRAGON_RAGE_DAMAGE - cp a,DRAGON_RAGE - jr z,.storeDamage -; Psywave - ld a,[hl] - ld b,a - srl a - add b - ld b,a ; b = level * 1.5 -; loop until a random number in the range [1, b) is found -.loop - call BattleRandom - and a - jr z,.loop - cp b - jr nc,.loop - ld b,a -.storeDamage - ld hl,W_DAMAGE - xor a - ld [hli],a - ld a,b - ld [hl],a - -ApplyDamageToEnemyPokemon: ; 3e142 (f:6142) - ld hl,W_DAMAGE - ld a,[hli] - ld b,a - ld a,[hl] - or b - jr z,ApplyAttackToEnemyPokemonDone ; we're done if damage is 0 - ld a,[W_ENEMYBATTSTATUS2] - bit 4,a ; does the enemy have a substitute? - jp nz,AttackSubstitute -; subtract the damage from the pokemon's current HP -; also, save the current HP at wHPBarOldHP - ld a,[hld] - ld b,a - ld a,[wEnemyMonHP + 1] - ld [wHPBarOldHP],a - sub b - ld [wEnemyMonHP + 1],a - ld a,[hl] - ld b,a - ld a,[wEnemyMonHP] - ld [wHPBarOldHP+1],a - sbc b - ld [wEnemyMonHP],a - jr nc,.animateHpBar -; if more damage was done than the current HP, zero the HP and set the damage -; equal to how much HP the pokemon had before the attack - ld a,[wHPBarOldHP+1] - ld [hli],a - ld a,[wHPBarOldHP] - ld [hl],a - xor a - ld hl,wEnemyMonHP - ld [hli],a - ld [hl],a -.animateHpBar - ld hl,wEnemyMonMaxHP - ld a,[hli] - ld [wHPBarMaxHP+1],a - ld a,[hl] - ld [wHPBarMaxHP],a - ld hl,wEnemyMonHP - ld a,[hli] - ld [wHPBarNewHP+1],a - ld a,[hl] - ld [wHPBarNewHP],a - hlCoord 2, 2 - xor a - ld [wListMenuID],a - predef UpdateHPBar2 ; animate the HP bar shortening -ApplyAttackToEnemyPokemonDone: ; 3e19d (f:619d) - jp DrawHUDsAndHPBars - -ApplyAttackToPlayerPokemon: ; 3e1a0 (f:61a0) - ld a,[W_ENEMYMOVEEFFECT] - cp a,OHKO_EFFECT - jr z,ApplyDamageToPlayerPokemon - cp a,SUPER_FANG_EFFECT - jr z,.superFangEffect - cp a,SPECIAL_DAMAGE_EFFECT - jr z,.specialDamage - ld a,[W_ENEMYMOVEPOWER] - and a - jp z,ApplyAttackToPlayerPokemonDone - jr ApplyDamageToPlayerPokemon -.superFangEffect -; set the damage to half the target's HP - ld hl,wBattleMonHP - ld de,W_DAMAGE - ld a,[hli] - srl a - ld [de],a - inc de - ld b,a - ld a,[hl] - rr a - ld [de],a - or b - jr nz,ApplyDamageToPlayerPokemon -; make sure Super Fang's damage is always at least 1 - ld a,$01 - ld [de],a - jr ApplyDamageToPlayerPokemon -.specialDamage - ld hl,wEnemyMonLevel - ld a,[hl] - ld b,a - ld a,[W_ENEMYMOVENUM] - cp a,SEISMIC_TOSS - jr z,.storeDamage - cp a,NIGHT_SHADE - jr z,.storeDamage - ld b,SONICBOOM_DAMAGE - cp a,SONICBOOM - jr z,.storeDamage - ld b,DRAGON_RAGE_DAMAGE - cp a,DRAGON_RAGE - jr z,.storeDamage -; Psywave - ld a,[hl] - ld b,a - srl a - add b - ld b,a ; b = attacker's level * 1.5 -; loop until a random number in the range [0, b) is found -; this differs from the range when the player attacks, which is [1, b) -; it's possible for the enemy to do 0 damage with Psywave, but the player always does at least 1 damage -.loop - call BattleRandom - cp b - jr nc,.loop - ld b,a -.storeDamage - ld hl,W_DAMAGE - xor a - ld [hli],a - ld a,b - ld [hl],a - -ApplyDamageToPlayerPokemon: ; 3e200 (f:6200) - ld hl,W_DAMAGE - ld a,[hli] - ld b,a - ld a,[hl] - or b - jr z,ApplyAttackToPlayerPokemonDone ; we're done if damage is 0 - ld a,[W_PLAYERBATTSTATUS2] - bit 4,a ; does the player have a substitute? - jp nz,AttackSubstitute -; subtract the damage from the pokemon's current HP -; also, save the current HP at wHPBarOldHP and the new HP at wHPBarNewHP - ld a,[hld] - ld b,a - ld a,[wBattleMonHP + 1] - ld [wHPBarOldHP],a - sub b - ld [wBattleMonHP + 1],a - ld [wHPBarNewHP],a - ld b,[hl] - ld a,[wBattleMonHP] - ld [wHPBarOldHP+1],a - sbc b - ld [wBattleMonHP],a - ld [wHPBarNewHP+1],a - jr nc,.animateHpBar -; if more damage was done than the current HP, zero the HP and set the damage -; equal to how much HP the pokemon had before the attack - ld a,[wHPBarOldHP+1] - ld [hli],a - ld a,[wHPBarOldHP] - ld [hl],a - xor a - ld hl,wBattleMonHP - ld [hli],a - ld [hl],a - ld hl,wHPBarNewHP - ld [hli],a - ld [hl],a -.animateHpBar - ld hl,wBattleMonMaxHP - ld a,[hli] - ld [wHPBarMaxHP+1],a - ld a,[hl] - ld [wHPBarMaxHP],a - hlCoord 10, 9 - ld a,$01 - ld [wListMenuID],a - predef UpdateHPBar2 ; animate the HP bar shortening -ApplyAttackToPlayerPokemonDone - jp DrawHUDsAndHPBars - -AttackSubstitute: ; 3e25e (f:625e) - ld hl,SubstituteTookDamageText - call PrintText -; values for player turn - ld de,wEnemySubstituteHP - ld bc,W_ENEMYBATTSTATUS2 - ld a,[H_WHOSETURN] - and a - jr z,.applyDamageToSubstitute -; values for enemy turn - ld de,wPlayerSubstituteHP - ld bc,W_PLAYERBATTSTATUS2 -.applyDamageToSubstitute - ld hl,W_DAMAGE - ld a,[hli] - and a - jr nz,.substituteBroke ; damage > 0xFF always breaks substitutes -; subtract damage from HP of substitute - ld a,[de] - sub [hl] - ld [de],a - ret nc -.substituteBroke - ld h,b - ld l,c - res 4,[hl] ; unset the substitute bit - ld hl,SubstituteBrokeText - call PrintText -; flip whose turn it is for the next function call - ld a,[H_WHOSETURN] - xor a,$01 - ld [H_WHOSETURN],a - callab Func_79747 ; animate the substitute breaking -; flip the turn back to the way it was - ld a,[H_WHOSETURN] - xor a,$01 - ld [H_WHOSETURN],a - ld hl,W_PLAYERMOVEEFFECT ; value for player's turn - and a - jr z,.nullifyEffect - ld hl,W_ENEMYMOVEEFFECT ; value for enemy's turn -.nullifyEffect - xor a - ld [hl],a ; zero the effect of the attacker's move - jp DrawHUDsAndHPBars - -SubstituteTookDamageText: ; 3e2ac (f:62ac) - TX_FAR _SubstituteTookDamageText - db "@" - -SubstituteBrokeText: ; 3e2b1 (f:62b1) - TX_FAR _SubstituteBrokeText - db "@" - -; this function raises the attack modifier of a pokemon using Rage when that pokemon is attacked -HandleBuildingRage: ; 3e2b6 (f:62b6) -; values for the player turn - ld hl,W_ENEMYBATTSTATUS2 - ld de,wEnemyMonStatMods - ld bc,W_ENEMYMOVENUM - ld a,[H_WHOSETURN] - and a - jr z,.next -; values for the enemy turn - ld hl,W_PLAYERBATTSTATUS2 - ld de,wPlayerMonStatMods - ld bc,W_PLAYERMOVENUM -.next - bit 6,[hl] ; is the pokemon being attacked under the effect of Rage? - ret z ; return if not - ld a,[de] - cp a,$0d ; maximum stat modifier value - ret z ; return if attack modifier is already maxed - ld a,[H_WHOSETURN] - xor a,$01 ; flip turn for the stat modifier raising function - ld [H_WHOSETURN],a -; change the target pokemon's move to $00 and the effect to the one -; that causes the attack modifier to go up one stage - ld h,b - ld l,c - ld [hl],$00 ; null move number - inc hl - ld [hl],ATTACK_UP1_EFFECT - push hl - ld hl,BuildingRageText - call PrintText - call StatModifierUpEffect ; stat modifier raising function - pop hl - xor a - ldd [hl],a ; null move effect - ld a,RAGE - ld [hl],a ; restore the target pokemon's move number to Rage - ld a,[H_WHOSETURN] - xor a,$01 ; flip turn back to the way it was - ld [H_WHOSETURN],a - ret - -BuildingRageText: ; 3e2f8 (f:62f8) - TX_FAR _BuildingRageText - db "@" - -; copy last move for Mirror Move -; sets zero flag on failure and unsets zero flag on success -MirrorMoveCopyMove: ; 3e2fd (f:62fd) - ld a,[H_WHOSETURN] - and a -; values for player turn - ld a,[wccf2] - ld hl,wPlayerSelectedMove - ld de,W_PLAYERMOVENUM - jr z,.next -; values for enemy turn - ld a,[wccf1] - ld de,W_ENEMYMOVENUM - ld hl,wEnemySelectedMove -.next - ld [hl],a - cp a,MIRROR_MOVE ; did the target pokemon also use Mirror Move? - jr z,.mirrorMoveFailed - and a ; null move? - jr nz,ReloadMoveData -.mirrorMoveFailed -; Mirror Move fails on itself and null moves - ld hl,MirrorMoveFailedText - call PrintText - xor a - ret - -MirrorMoveFailedText: ; 3e324 (f:6324) - TX_FAR _MirrorMoveFailedText - db "@" - -; function used to reload move data for moves like Mirror Move and Metronome -ReloadMoveData: ; 3e329 (f:6329) - ld [wd11e],a - dec a - ld hl,Moves - ld bc,$0006 - call AddNTimes - ld a,BANK(Moves) - call FarCopyData ; copy the move's stats - call IncrementMovePP -; the follow two function calls are used to reload the move name - call GetMoveName - call CopyStringToCF4B - ld a,$01 - and a - ret - -; function that picks a random move for metronome -MetronomePickMove: ; 3e348 (f:6348) - xor a - ld [wcc5b],a - ld a,METRONOME - call PlayMoveAnimation ; play Metronome's animation -; values for player turn - ld de,W_PLAYERMOVENUM - ld hl,wPlayerSelectedMove - ld a,[H_WHOSETURN] - and a - jr z,.pickMoveLoop -; values for enemy turn - ld de,W_ENEMYMOVENUM - ld hl,wEnemySelectedMove -; loop to pick a random number in the range [1, $a5) to be the move used by Metronome -.pickMoveLoop - call BattleRandom - and a - jr z,.pickMoveLoop - cp a,NUM_ATTACKS + 1 ; max normal move number + 1 (this is Struggle's move number) - jr nc,.pickMoveLoop - cp a,METRONOME - jr z,.pickMoveLoop - ld [hl],a - jr ReloadMoveData - -; this function increments the current move's PP -; it's used to prevent moves that run another move within the same turn -; (like Mirror Move and Metronome) from losing 2 PP -IncrementMovePP: ; 3e373 (f:6373) - ld a,[H_WHOSETURN] - and a -; values for player turn - ld hl,wBattleMonPP - ld de,wPartyMon1PP - ld a,[wPlayerMoveListIndex] - jr z,.next -; values for enemy turn - ld hl,wEnemyMonPP - ld de,wEnemyMon1PP - ld a,[wEnemyMoveListIndex] -.next - ld b,$00 - ld c,a - add hl,bc - inc [hl] ; increment PP in the currently battling pokemon memory location - ld h,d - ld l,e - add hl,bc - ld a,[H_WHOSETURN] - and a - ld a,[wPlayerMonNumber] ; value for player turn - jr z,.next2 - ld a,[wEnemyMonPartyPos] ; value for enemy turn -.next2 - ld bc,wEnemyMon2 - wEnemyMon1 - call AddNTimes - inc [hl] ; increment PP in the party memory location - ret - -; function to adjust the base damage of an attack to account for type effectiveness -AdjustDamageForMoveType: ; 3e3a5 (f:63a5) -; values for player turn - ld hl,wBattleMonType - ld a,[hli] - ld b,a ; b = type 1 of attacker - ld c,[hl] ; c = type 2 of attacker - ld hl,wEnemyMonType - ld a,[hli] - ld d,a ; d = type 1 of defender - ld e,[hl] ; e = type 2 of defender - ld a,[W_PLAYERMOVETYPE] - ld [wd11e],a - ld a,[H_WHOSETURN] - and a - jr z,.next -; values for enemy turn - ld hl,wEnemyMonType - ld a,[hli] - ld b,a ; b = type 1 of attacker - ld c,[hl] ; c = type 2 of attacker - ld hl,wBattleMonType - ld a,[hli] - ld d,a ; d = type 1 of defender - ld e,[hl] ; e = type 2 of defender - ld a,[W_ENEMYMOVETYPE] - ld [wd11e],a -.next - ld a,[wd11e] ; move type - cp b ; does the move type match type 1 of the attacker? - jr z,.sameTypeAttackBonus - cp c ; does the move type match type 2 of the attacker? - jr z,.sameTypeAttackBonus - jr .skipSameTypeAttackBonus -.sameTypeAttackBonus -; if the move type matches one of the attacker's types - ld hl,W_DAMAGE + 1 - ld a,[hld] - ld h,[hl] - ld l,a ; hl = damage - ld b,h - ld c,l ; bc = damage - srl b - rr c ; bc = floor(0.5 * damage) - add hl,bc ; hl = floor(1.5 * damage) -; store damage - ld a,h - ld [W_DAMAGE],a - ld a,l - ld [W_DAMAGE + 1],a - ld hl,wd05b - set 7,[hl] -.skipSameTypeAttackBonus - ld a,[wd11e] - ld b,a ; b = move type - ld hl,TypeEffects -.loop - ld a,[hli] ; a = "attacking type" of the current type pair - cp a,$ff - jr z,.done - cp b ; does move type match "attacking type"? - jr nz,.nextTypePair - ld a,[hl] ; a = "defending type" of the current type pair - cp d ; does type 1 of defender match "defending type"? - jr z,.matchingPairFound - cp e ; does type 2 of defender match "defending type"? - jr z,.matchingPairFound - jr .nextTypePair -.matchingPairFound -; if the move type matches the "attacking type" and one of the defender's types matches the "defending type" - push hl - push bc - inc hl - ld a,[wd05b] - and a,$80 - ld b,a - ld a,[hl] ; a = damage multiplier - ld [H_MULTIPLIER],a - add b - ld [wd05b],a - xor a - ld [H_MULTIPLICAND],a - ld hl,W_DAMAGE - ld a,[hli] - ld [H_MULTIPLICAND + 1],a - ld a,[hld] - ld [H_MULTIPLICAND + 2],a - call Multiply - ld a,10 - ld [H_DIVISOR],a - ld b,$04 - call Divide - ld a,[H_QUOTIENT + 2] - ld [hli],a - ld b,a - ld a,[H_QUOTIENT + 3] - ld [hl],a - or b ; is damage 0? - jr nz,.skipTypeImmunity -.typeImmunity -; if damage is 0, make the move miss - inc a - ld [W_MOVEMISSED],a -.skipTypeImmunity - pop bc - pop hl -.nextTypePair - inc hl - inc hl - jp .loop -.done - ret - -; function to tell how effective the type of an enemy attack is on the player's current pokemon -; this doesn't take into account the effects that dual types can have -; (e.g. 4x weakness / resistance, weaknesses and resistances canceling) -; the result is stored in [wd11e] -; ($05 is not very effective, $10 is neutral, $14 is super effective) -; as far is can tell, this is only used once in some AI code to help decide which move to use -AIGetTypeEffectiveness: ; 3e449 (f:6449) - ld a,[W_ENEMYMOVETYPE] - ld d,a ; d = type of enemy move - ld hl,wBattleMonType - ld b,[hl] ; b = type 1 of player's pokemon - inc hl - ld c,[hl] ; c = type 2 of player's pokemon - ld a,$10 - ld [wd11e],a ; initialize [wd11e] to neutral effectiveness - ld hl,TypeEffects -.loop - ld a,[hli] - cp a,$ff - ret z - cp d ; match the type of the move - jr nz,.nextTypePair1 - ld a,[hli] - cp b ; match with type 1 of pokemon - jr z,.done - cp c ; or match with type 2 of pokemon - jr z,.done - jr .nextTypePair2 -.nextTypePair1 - inc hl -.nextTypePair2 - inc hl - jr .loop -.done - ld a,[hl] - ld [wd11e],a ; store damage multiplier - ret - -INCLUDE "data/type_effects.asm" - -; some tests that need to pass for a move to hit -MoveHitTest: ; 3e56b (f:656b) -; player's turn - ld hl,W_ENEMYBATTSTATUS1 - ld de,W_PLAYERMOVEEFFECT - ld bc,wEnemyMonStatus - ld a,[H_WHOSETURN] - and a - jr z,.dreamEaterCheck -; enemy's turn - ld hl,W_PLAYERBATTSTATUS1 - ld de,W_ENEMYMOVEEFFECT - ld bc,wBattleMonStatus -.dreamEaterCheck - ld a,[de] - cp a,DREAM_EATER_EFFECT - jr nz,.swiftCheck - ld a,[bc] - and a,$07 ; is the target pokemon sleeping? - jp z,.moveMissed -.swiftCheck - ld a,[de] - cp a,SWIFT_EFFECT - ret z ; Swift never misses (interestingly, Azure Heights lists this is a myth, but it appears to be true) - call CheckTargetSubstitute ; substitute check (note that this overwrites a) - jr z,.checkForDigOrFlyStatus -; this code is buggy. it's supposed to prevent HP draining moves from working on substitutes. -; since $7b79 overwrites a with either $00 or $01, it never works. - cp a,DRAIN_HP_EFFECT - jp z,.moveMissed - cp a,DREAM_EATER_EFFECT - jp z,.moveMissed -.checkForDigOrFlyStatus - bit 6,[hl] - jp nz,.moveMissed - ld a,[H_WHOSETURN] - and a - jr nz,.enemyTurn -.playerTurn -; this checks if the move effect is disallowed by mist - ld a,[W_PLAYERMOVEEFFECT] - cp a,ATTACK_DOWN1_EFFECT - jr c,.skipEnemyMistCheck - cp a,BIDE_EFFECT - jr c,.enemyMistCheck - cp a,$3a - jr c,.skipEnemyMistCheck - cp a,POISON_EFFECT - jr c,.enemyMistCheck - jr .skipEnemyMistCheck -.enemyMistCheck -; if move effect is from $12 to $19 inclusive or $3a to $41 inclusive -; i.e. the following moves -; GROWL, TAIL WHIP, LEER, STRING SHOT, SAND-ATTACK, SMOKESCREEN, KINESIS, -; FLASH, CONVERSION, HAZE*, SCREECH, LIGHT SCREEN*, REFLECT* -; the moves that are marked with an asterisk are not affected since this -; function is not called when those moves are used -; XXX are there are any others like those three? - ld a,[W_ENEMYBATTSTATUS2] - bit 1,a ; is mon protected by mist? - jp nz,.moveMissed -.skipEnemyMistCheck - ld a,[W_PLAYERBATTSTATUS2] - bit 0,a ; is the player using X Accuracy? - ret nz ; if so, always hit regardless of accuracy/evasion - jr .calcHitChance -.enemyTurn - ld a,[W_ENEMYMOVEEFFECT] - cp a,ATTACK_DOWN1_EFFECT - jr c,.skipPlayerMistCheck - cp a,BIDE_EFFECT - jr c,.playerMistCheck - cp a,$3a - jr c,.skipPlayerMistCheck - cp a,POISON_EFFECT - jr c,.playerMistCheck - jr .skipPlayerMistCheck -.playerMistCheck -; similar to enemy mist check - ld a,[W_PLAYERBATTSTATUS2] - bit 1,a ; is mon protected by mist? - jp nz,.moveMissed -.skipPlayerMistCheck - ld a,[W_ENEMYBATTSTATUS2] - bit 0,a ; is the enemy using X Accuracy? - ret nz ; if so, always hit regardless of accuracy/evasion -.calcHitChance - call CalcHitChance ; scale the move accuracy according to attacker's accuracy and target's evasion - ld a,[W_PLAYERMOVEACCURACY] - ld b,a - ld a,[H_WHOSETURN] - and a - jr z,.doAccuracyCheck - ld a,[W_ENEMYMOVEACCURACY] - ld b,a -.doAccuracyCheck -; if the random number generated is greater than or equal to the scaled accuracy, the move misses -; note that this means that even the highest accuracy is still just a 255/256 chance, not 100% - call BattleRandom - cp b - jr nc,.moveMissed - ret -.moveMissed - xor a - ld hl,W_DAMAGE ; zero the damage - ld [hli],a - ld [hl],a - inc a - ld [W_MOVEMISSED],a - ld a,[H_WHOSETURN] - and a - jr z,.playerTurn2 -.enemyTurn2 - ld hl,W_ENEMYBATTSTATUS1 - res 5,[hl] ; end multi-turn attack e.g. wrap - ret -.playerTurn2 - ld hl,W_PLAYERBATTSTATUS1 - res 5,[hl] ; end multi-turn attack e.g. wrap - ret - -; values for player turn -CalcHitChance: ; 3e624 (f:6624) - ld hl,W_PLAYERMOVEACCURACY - ld a,[H_WHOSETURN] - and a - ld a,[wPlayerMonAccuracyMod] - ld b,a - ld a,[wEnemyMonEvasionMod] - ld c,a - jr z,.next -; values for enemy turn - ld hl,W_ENEMYMOVEACCURACY - ld a,[wEnemyMonAccuracyMod] - ld b,a - ld a,[wPlayerMonEvasionMod] - ld c,a -.next - ld a,$0e - sub c - ld c,a ; c = 14 - EVASIONMOD (this "reflects" the value over 7, so that an increase in the target's evasion decreases the hit chance instead of increasing the hit chance) -; zero the high bytes of the multiplicand - xor a - ld [H_MULTIPLICAND],a - ld [H_MULTIPLICAND + 1],a - ld a,[hl] - ld [H_MULTIPLICAND + 2],a ; set multiplicand to move accuracy - push hl - ld d,$02 ; loop has two iterations -; loop to do the calculations, the first iteration multiplies by the accuracy ratio and the second iteration multiplies by the evasion ratio -.loop - push bc - ld hl, StatModifierRatios ; $76cb ; stat modifier ratios - dec b - sla b - ld c,b - ld b,$00 - add hl,bc ; hl = address of stat modifier ratio - pop bc - ld a,[hli] - ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio - call Multiply - ld a,[hl] - ld [H_DIVISOR],a ; set divisor to the the denominator of the ratio (the dividend is the product of the previous multiplication) - ld b,$04 ; number of bytes in the dividend - call Divide - ld a,[H_QUOTIENT + 3] - ld b,a - ld a,[H_QUOTIENT + 2] - or b - jp nz,.nextCalculation -; make sure the result is always at least one - ld [H_QUOTIENT + 2],a - ld a,$01 - ld [H_QUOTIENT + 3],a -.nextCalculation - ld b,c - dec d - jr nz,.loop - ld a,[H_QUOTIENT + 2] - and a ; is the calculated hit chance over 0xFF? - ld a,[H_QUOTIENT + 3] - jr z,.storeAccuracy -; if calculated hit chance over 0xFF - ld a,$ff ; set the hit chance to 0xFF -.storeAccuracy - pop hl - ld [hl],a ; store the hit chance in the move accuracy variable - ret - -; multiplies damage by a random percentage from ~85% to 100% -RandomizeDamage: ; 3e687 (f:6687) - ld hl, W_DAMAGE - ld a, [hli] - and a - jr nz, .DamageGreaterThanOne - ld a, [hl] - cp 2 - ret c -.DamageGreaterThanOne - xor a - ld [H_MULTIPLICAND], a - dec hl - ld a, [hli] - ld [H_MULTIPLICAND + 1], a - ld a, [hl] - ld [H_MULTIPLICAND + 2], a -; loop until a random number greater than or equal to 217 is generated -.loop - call BattleRandom - rrca - cp 217 - jr c, .loop - ld [H_MULTIPLIER], a - call Multiply ; multiply damage by the random number, which is in the range [217, 255] - ld a, 255 - ld [H_DIVISOR], a - ld b, $4 - call Divide ; divide the result by 255 -; store the modified damage - ld a, [H_QUOTIENT + 2] - ld hl, W_DAMAGE - ld [hli], a - ld a, [H_QUOTIENT + 3] - ld [hl], a - ret - -ExecuteEnemyMove: ; 3e6bc (f:66bc) - ld a, [wEnemySelectedMove] - inc a - jp z, Func_3e88c - call PrintGhostText - jp z, Func_3e88c - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .asm_3e6dc - ld b, $1 - ld a, [wcc3e] - cp $e - jr z, .asm_3e6dc - cp $4 - ret nc -.asm_3e6dc - ld hl, wccd5 - inc [hl] - xor a - ld [W_MOVEMISSED], a - ld [wccf4], a - ld a, $a - ld [wd05b], a - call CheckEnemyStatusConditions - jr nz, .canUseMove - jp [hl] -.canUseMove - ld hl, W_ENEMYBATTSTATUS1 - bit 4, [hl] ; is the enemy charging up for attack? - jr nz, asm_3e70b ; if so, jump - call GetCurrentMove - -Func_3e6fc: ; 3e6fc (f:66fc) - ld a, [W_ENEMYMOVEEFFECT] - cp CHARGE_EFFECT - jp z, JumpMoveEffect - cp FLY_EFFECT - jp z, JumpMoveEffect - jr asm_3e72b -asm_3e70b: ; 3e70b (f:670b) - ld hl, W_ENEMYBATTSTATUS1 - res 4, [hl] ; no longer charging up for attack - res 6, [hl] ; no longer invulnerable to typical attacks - ld a, [W_ENEMYMOVENUM] - ld [wd0b5], a - ld a, BANK(MoveNames) - ld [wPredefBank], a - ld a, MOVE_NAME - ld [W_LISTTYPE], a - call GetName - ld de, wcd6d - call CopyStringToCF4B -asm_3e72b: ; 3e72b (f:672b) - xor a - ld [wcced], a - call PrintMonName1Text - ld a, [W_ENEMYMOVEEFFECT] - ld hl, EffectsArray1 - ld de, $1 - call IsInArray - jp c, JumpMoveEffect - ld a, [W_ENEMYMOVEEFFECT] - ld hl, EffectsArray5B - ld de, $1 - call IsInArray - call c, JumpMoveEffect -asm_3e750: ; 3e750 (f:6750) - call SwapPlayerAndEnemyLevels - ld a, [W_ENEMYMOVEEFFECT] - ld hl, EffectsArray2 - ld de, $1 - call IsInArray - jp c, Func_3e77f - call CriticalHitTest - call HandleCounterMove - jr z, asm_3e782 - call SwapPlayerAndEnemyLevels - call GetDamageVarsForEnemyAttack - call SwapPlayerAndEnemyLevels - call CalculateDamage - jp z, Func_3e7d1 - call AdjustDamageForMoveType - call RandomizeDamage - -Func_3e77f: ; 3e77f (f:677f) - call MoveHitTest -asm_3e782: ; 3e782 (f:6782) - ld a, [W_MOVEMISSED] - and a - jr z, .asm_3e791 - ld a, [W_ENEMYMOVEEFFECT] - cp EXPLODE_EFFECT - jr z, asm_3e7a0 - jr Func_3e7d1 -.asm_3e791 - call SwapPlayerAndEnemyLevels - -Func_3e794: ; 3e794 (f:6794) - ld a, [W_ENEMYMOVEEFFECT] - and a - ld a, $1 - jr z, asm_3e7a4 - ld a, $2 - jr asm_3e7a4 -asm_3e7a0: ; 3e7a0 (f:67a0) - call SwapPlayerAndEnemyLevels - xor a -asm_3e7a4: ; 3e7a4 (f:67a4) - push af - ld a, [W_ENEMYBATTSTATUS2] - bit 4, a ; does mon have a substitute? - ld hl, Func_79747 - ld b, BANK(Func_79747) - call nz, Bankswitch - pop af - ld [wcc5b], a - ld a, [W_ENEMYMOVENUM] - call PlayMoveAnimation - call Func_3eed3 - call DrawEnemyHUDAndHPBar - ld a, [W_ENEMYBATTSTATUS2] - bit 4, a ; does mon have a substitute? - ld hl, Func_79771 - ld b, BANK(Func_79771) - call nz, Bankswitch ; slide the substitute's sprite out - jr asm_3e7ef - -Func_3e7d1: ; 3e7d1 (f:67d1) - call SwapPlayerAndEnemyLevels - ld c, $1e - call DelayFrames - ld a, [W_ENEMYMOVEEFFECT] - cp FLY_EFFECT - jr z, .asm_3e7e6 - cp CHARGE_EFFECT - jr z, .asm_3e7e6 - jr asm_3e7ef -.asm_3e7e6 - xor a - ld [wcc5b], a - ld a,STATUS_AFFECTED_ANIM - call PlayMoveAnimation -asm_3e7ef: ; 3e7ef (f:67ef) - ld a, [W_ENEMYMOVEEFFECT] - cp MIRROR_MOVE_EFFECT - jr nz, .notMirrorMoveEffect - call MirrorMoveCopyMove - jp z, Func_3e88c - jp Func_3e6fc -.notMirrorMoveEffect - cp METRONOME_EFFECT - jr nz, .notMetronomeEffect - call MetronomePickMove - jp Func_3e6fc -.notMetronomeEffect - ld a, [W_ENEMYMOVEEFFECT] - ld hl, EffectsArray3 - ld de, $1 - call IsInArray - jp c, JumpMoveEffect - ld a, [W_MOVEMISSED] - and a - jr z, .asm_3e82b - call PrintMoveFailureText - ld a, [W_ENEMYMOVEEFFECT] - cp EXPLODE_EFFECT - jr z, .asm_3e83e - jp Func_3e88c -.asm_3e82b - call ApplyAttackToPlayerPokemon - call PrintCriticalOHKOText - callab DisplayEffectiveness - ld a, 1 - ld [wccf4], a -.asm_3e83e - ld a, [W_ENEMYMOVEEFFECT] - ld hl, EffectsArray4 - ld de, $1 - call IsInArray - call c, JumpMoveEffect - ld hl, wBattleMonHP - ld a, [hli] - ld b, [hl] - or b - ret z - call HandleBuildingRage - ld hl, W_ENEMYBATTSTATUS1 - bit 2, [hl] ; is mon hitting multiple times? (example: double kick) - jr z, .asm_3e873 - push hl - ld hl, wEnemyNumAttacksLeft - dec [hl] - pop hl - jp nz, Func_3e794 - res 2, [hl] ; mon is no longer hitting multiple times - ld hl, HitXTimesText - call PrintText - xor a - ld [wcd05], a -.asm_3e873 - ld a, [W_ENEMYMOVEEFFECT] - and a - jr z, Func_3e88c - ld hl, EffectsArray5 - ld de, $1 - call IsInArray - call nc, JumpMoveEffect - jr Func_3e88c - -HitXTimesText: ; 3e887 (f:6887) - TX_FAR _HitXTimesText - db "@" - -Func_3e88c: ; 3e88c (f:688c) - ld b, $1 - ret - -; checks for various status conditions affecting the enemy mon -; stores whether the mon cannot use a move this turn in Z flag -CheckEnemyStatusConditions: ; 3e88f (f:688f) - ld hl, wEnemyMonStatus - ld a, [hl] - and SLP ; sleep mask - jr z, .checkIfFrozen - dec a ; decrement number of turns left - ld [wEnemyMonStatus], a - and a - jr z, .wokeUp ; if the number of turns hit 0, wake up - ld hl, FastAsleepText - call PrintText - xor a - ld [wcc5b], a - ld a,SLP_ANIM - call PlayMoveAnimation - jr .next1 -.wokeUp - ld hl, WokeUpText - call PrintText -.next1 - xor a - ld [wccf2], a - ld hl, Func_3e88c - jp .cannotUseMove -.checkIfFrozen - bit FRZ, [hl] - jr z, .checkIfTrapped - ld hl, IsFrozenText - call PrintText - xor a - ld [wccf2], a - ld hl, Func_3e88c - jp .cannotUseMove -.checkIfTrapped - ld a, [W_PLAYERBATTSTATUS1] - bit 5, a ; is the player using a multi-turn attack like warp - jp z, .checkIfFlinched - ld hl, CantMoveText - call PrintText - ld hl, Func_3e88c - jp .cannotUseMove -.checkIfFlinched - ld hl, W_ENEMYBATTSTATUS1 - bit 3, [hl] ; check if enemy mon flinched - jp z, .checkIfMustRecharge - res 3, [hl] - ld hl, FlinchedText - call PrintText - ld hl, Func_3e88c - jp .cannotUseMove -.checkIfMustRecharge - ld hl, W_ENEMYBATTSTATUS2 - bit 5, [hl] ; check if enemy mon has to recharge after using a move - jr z, .checkIfAnyMoveDisabled - res 5, [hl] - ld hl, MustRechargeText - call PrintText - ld hl, Func_3e88c - jp .cannotUseMove -.checkIfAnyMoveDisabled - ld hl, W_ENEMYDISABLEDMOVE - ld a, [hl] - and a - jr z, .checkIfConfused - dec a - ld [hl], a - and $f - jr nz, .checkIfConfused - ld [hl], a - ld [wccef], a - ld hl, DisabledNoMoreText - call PrintText -.checkIfConfused - ld a, [W_ENEMYBATTSTATUS1] - add a ; check if enemy mon is confused - jp nc, .checkIfTriedToUseDisabledMove - ld hl, wd070 - dec [hl] - jr nz, .isConfused - ld hl, W_ENEMYBATTSTATUS1 - res 7, [hl] - ld hl, ConfusedNoMoreText - call PrintText - jp .checkIfTriedToUseDisabledMove -.isConfused - ld hl, IsConfusedText - call PrintText - xor a - ld [wcc5b], a - ld a,CONF_ANIM - call PlayMoveAnimation - call BattleRandom - cp $80 - jr c, .checkIfTriedToUseDisabledMove - ld hl, W_ENEMYBATTSTATUS1 - ld a, [hl] - and $80 - ld [hl], a - ld hl, HurtItselfText - call PrintText - ld hl, wBattleMonDefense - ld a, [hli] - push af - ld a, [hld] - push af - ld a, [wEnemyMonDefense] - ld [hli], a - ld a, [wEnemyMonDefense + 1] - ld [hl], a - ld hl, W_ENEMYMOVEEFFECT - push hl - ld a, [hl] - push af - xor a - ld [hli], a - ld [wCriticalHitOrOHKO], a - ld a, $28 - ld [hli], a - xor a - ld [hl], a - call GetDamageVarsForEnemyAttack - call CalculateDamage - pop af - pop hl - ld [hl], a - ld hl, wBattleMonDefense + 1 - pop af - ld [hld], a - pop af - ld [hl], a - xor a - ld [wcc5b], a - ld [H_WHOSETURN], a - ld a, POUND - call PlayMoveAnimation - ld a, $1 - ld [H_WHOSETURN], a - call ApplyDamageToEnemyPokemon - jr .monHurtItselfOrFullyParalysed -.checkIfTriedToUseDisabledMove - ld a, [wccef] - and a - jr z, .checkIfParalysed - ld hl, wEnemySelectedMove - cp [hl] - jr nz, .checkIfParalysed - call PrintMoveIsDisabledText - ld hl, Func_3e88c - jp .cannotUseMove -.checkIfParalysed - ld hl, wEnemyMonStatus - bit PAR, [hl] - jr z, .checkIfUsingBide - call BattleRandom - cp $3f - jr nc, .checkIfUsingBide - ld hl, FullyParalyzedText - call PrintText -.monHurtItselfOrFullyParalysed - ld hl, W_ENEMYBATTSTATUS1 - ld a, [hl] - and $cc ; clear bide, thrashing, charging up, and multi-turn moves such as warp - ld [hl], a - ld a, [W_ENEMYMOVEEFFECT] - cp FLY_EFFECT - jr z, .flyOrChargeEffect - cp CHARGE_EFFECT - jr z, .flyOrChargeEffect - jr .notFlyOrChargeEffect -.flyOrChargeEffect - xor a - ld [wcc5b], a - ld a, STATUS_AFFECTED_ANIM - call PlayMoveAnimation -.notFlyOrChargeEffect - ld hl, Func_3e88c - jp .cannotUseMove -.checkIfUsingBide - ld hl, W_ENEMYBATTSTATUS1 - bit 0, [hl] ; is mon using bide? - jr z, .checkIfThrashingAbout - xor a - ld [W_ENEMYMOVENUM], a - ld hl, W_DAMAGE - ld a, [hli] - ld b, a - ld c, [hl] - ld hl, wcd06 - ld a, [hl] - add c - ld [hld], a - ld a, [hl] - adc b - ld [hl], a - ld hl, wEnemyNumAttacksLeft - dec [hl] - jr z, .unleashEnergy - ld hl, Func_3e88c - jp .cannotUseMove -.unleashEnergy - ld hl, W_ENEMYBATTSTATUS1 - res 0, [hl] ; not using bide any more - ld hl, UnleashedEnergyText - call PrintText - ld a, $1 - ld [W_ENEMYMOVEPOWER], a - ld hl, wcd06 - ld a, [hld] - add a - ld b, a - ld [wd0d8], a - ld a, [hl] - rl a - ld [W_DAMAGE], a - or b - jr nz, .next2 - ld a, $1 - ld [W_MOVEMISSED], a -.next2 - xor a - ld [hli], a - ld [hl], a - ld a, BIDE - ld [W_ENEMYMOVENUM], a - call SwapPlayerAndEnemyLevels - ld hl, asm_3e782 - jp .cannotUseMove -.checkIfThrashingAbout - bit 1, [hl] ; is mon using thrash or petal dance? - jr z, .checkIfUsingMultiturnMove - ld a, THRASH - ld [W_ENEMYMOVENUM], a - ld hl, ThrashingAboutText - call PrintText - ld hl, wEnemyNumAttacksLeft - dec [hl] - ld hl, asm_3e750 - jp nz, .cannotUseMove - push hl - ld hl, W_ENEMYBATTSTATUS1 - res 1, [hl] ; mon is no longer using thrash or petal dance - set 7, [hl] ; mon is now confused - call BattleRandom - and $3 - inc a - inc a - ld [wd070], a - pop hl - jp .cannotUseMove -.checkIfUsingMultiturnMove - bit 5, [hl] ; is mon using multi-turn move? - jp z, .checkIfUsingRage - ld hl, AttackContinuesText - call PrintText - ld hl, wEnemyNumAttacksLeft - dec [hl] - ld hl, Func_3e794 - jp nz, .cannotUseMove - jp .cannotUseMove -.checkIfUsingRage - ld a, [W_ENEMYBATTSTATUS2] - bit 6, a ; is mon using rage? - jp z, .canUseMove - ld a, RAGE - ld [wd11e], a - call GetMoveName - call CopyStringToCF4B - xor a - ld [W_ENEMYMOVEEFFECT], a - ld hl, asm_3e72b - jp .cannotUseMove -.cannotUseMove - xor a ; set Z flag - ret -.canUseMove - ld a, $1 - and a ; clear Z flag - ret - -GetCurrentMove: ; 3eabe (f:6abe) - ld a, [H_WHOSETURN] - and a - jp z, .player - ld de, W_ENEMYMOVENUM - ld a, [wEnemySelectedMove] - jr .selected -.player - ld de, W_PLAYERMOVENUM - ld a, [W_FLAGS_D733] - bit 0, a - ld a, [wccd9] - jr nz, .selected - ld a, [wPlayerSelectedMove] -.selected - ld [wd0b5], a - dec a - ld hl, Moves - ld bc, $6 - call AddNTimes - ld a, BANK(Moves) - call FarCopyData - - ld a, BANK(MoveNames) - ld [wPredefBank], a - ld a, MOVE_NAME - ld [W_LISTTYPE], a - call GetName - ld de, wcd6d - jp CopyStringToCF4B - -LoadEnemyMonData: ; 3eb01 (f:6b01) - ld a, [W_ISLINKBATTLE] - cp $4 - jp z, LoadEnemyMonFromParty - ld a, [wEnemyMonSpecies2] - ld [wEnemyMonSpecies], a - ld [wd0b5], a - call GetMonHeader - ld a, [W_ENEMYBATTSTATUS3] - bit 3, a ; is enemy mon transformed? - ld hl, wcceb ; copied DVs from when it used Transform - ld a, [hli] - ld b, [hl] - jr nz, .storeDVs - ld a, [W_ISINBATTLE] - cp $2 ; is it a trainer battle? -; fixed DVs for trainer mon - ld a, $98 - ld b, $88 - jr z, .storeDVs -; random DVs for wild mon - call BattleRandom - ld b, a - call BattleRandom -.storeDVs - ld hl, wEnemyMonDVs - ld [hli], a - ld [hl], b - ld de, wEnemyMonLevel - ld a, [W_CURENEMYLVL] - ld [de], a - inc de - ld b, $0 - ld hl, wEnemyMonHP - push hl - call CalcStats - pop hl - ld a, [W_ISINBATTLE] - cp $2 ; is it a trainer battle? - jr z, .copyHPAndStatusFromPartyData - ld a, [W_ENEMYBATTSTATUS3] - bit 3, a ; is enemy mon transformed? - jr nz, .copyTypes ; if transformed, jump -; if it's a wild mon and not transformed, init the current HP to max HP and the status to 0 - ld a, [wEnemyMonMaxHP] - ld [hli], a - ld a, [wEnemyMonMaxHP+1] - ld [hli], a - xor a - inc hl - ld [hl], a ; init status to 0 - jr .copyTypes -; if it's a trainer mon, copy the HP and status from the enemy party data -.copyHPAndStatusFromPartyData - ld hl, wEnemyMon1HP - ld a, [wWhichPokemon] - ld bc, wEnemyMon2 - wEnemyMon1 - call AddNTimes - ld a, [hli] - ld [wEnemyMonHP], a - ld a, [hli] - ld [wEnemyMonHP + 1], a - ld a, [wWhichPokemon] - ld [wEnemyMonPartyPos], a - inc hl - ld a, [hl] - ld [wEnemyMonStatus], a - jr .copyTypes -.copyTypes - ld hl, W_MONHTYPES - ld de, wEnemyMonType - ld a, [hli] ; copy type 1 - ld [de], a - inc de - ld a, [hli] ; copy type 2 - ld [de], a - inc de - ld a, [hli] ; copy catch rate - ld [de], a - inc de - ld a, [W_ISINBATTLE] - cp $2 ; is it a trainer battle? - jr nz, .copyStandardMoves -; if it's a trainer battle, copy moves from enemy party data - ld hl, wEnemyMon1Moves - ld a, [wWhichPokemon] - ld bc, wEnemyMon2 - wEnemyMon1 - call AddNTimes - ld bc, NUM_MOVES - call CopyData - jr .loadMovePPs -.copyStandardMoves -; for a wild mon, first copy default moves from the mon header - ld hl, W_MONHMOVES - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - dec de - dec de - dec de - xor a - ld [wHPBarMaxHP], a - predef WriteMonMoves ; get moves based on current level -.loadMovePPs - ld hl, wEnemyMonMoves - ld de, wEnemyMonSpecial + 1 - predef LoadMovePPs - ld hl, W_MONHBASESTATS - ld de, wEnemyMonBaseStats - ld b, $5 -.copyBaseStatsLoop - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .copyBaseStatsLoop - ld hl, W_MONHCATCHRATE - ld a, [hli] - ld [de], a - inc de - ld a, [hl] ; base exp - ld [de], a - ld a, [wEnemyMonSpecies2] - ld [wd11e], a - call GetMonName - ld hl, wcd6d - ld de, wEnemyMonNick - ld bc, $b - call CopyData - ld a, [wEnemyMonSpecies2] - ld [wd11e], a - predef IndexToPokedex - ld a, [wd11e] - dec a - ld c, a - ld b, $1 - ld hl, wPokedexSeen - predef FlagActionPredef ; mark this mon as seen in the pokedex - ld hl, wEnemyMonLevel - ld de, wEnemyMonUnmodifiedLevel - ld bc, $b - call CopyData - ld a, $7 ; default stat mod - ld b, $8 ; number of stat mods - ld hl, wEnemyMonStatMods -.statModLoop - ld [hli], a - dec b - jr nz, .statModLoop - ret - -; calls BattleTransition to show the battle transition animation and initializes some battle variables -DoBattleTransitionAndInitBattleVariables: ; 3ec32 (f:6c32) - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .next -; link battle - xor a - ld [wMenuJoypadPollCount], a - callab DisplayLinkBattleVersusTextBox - ld a, $1 - ld [wUpdateSpritesEnabled], a - call ClearScreen -.next - call DelayFrame - predef BattleTransition - callab LoadHudAndHpBarAndStatusTilePatterns - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - ld a, $ff - ld [wUpdateSpritesEnabled], a - call ClearSprites - call ClearScreen - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ld [hVBlankWY], a - ld [rWY], a - ld [hTilesetType], a - ld hl, wd060 - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld [W_PLAYERDISABLEDMOVE], a - ret - -; swaps the level values of the BattleMon and EnemyMon structs -SwapPlayerAndEnemyLevels: ; 3ec81 (f:6c81) - push bc - ld a, [wBattleMonLevel] - ld b, a - ld a, [wEnemyMonLevel] - ld [wBattleMonLevel], a - ld a, b - ld [wEnemyMonLevel], a - pop bc - ret - -; loads either red back pic or old man back pic -; also writes OAM data and loads tile patterns for the Red or Old Man back sprite's head -; (for use when scrolling the player sprite and enemy's silhouettes on screen) -LoadPlayerBackPic: ; 3ec92 (f:6c92) - ld a, [W_BATTLETYPE] - dec a ; is it the old man tutorial? - ld de, RedPicBack - jr nz, .next - ld de, OldManPic -.next - ld a, BANK(RedPicBack) - call UncompressSpriteFromDE - predef ScaleSpriteByTwo - ld hl, wOAMBuffer - xor a - ld [$FF8B], a ; initial tile number - ld b, $7 ; 7 columns - ld e, $a0 ; X for the left-most column -.loop ; each loop iteration writes 3 OAM entries in a vertical column - ld c, $3 ; 3 tiles per column - ld d, $38 ; Y for the top of each column -.innerLoop ; each loop iteration writes 1 OAM entry in the column - ld [hl], d ; OAM Y - inc hl - ld [hl], e ; OAM X - ld a, $8 ; height of tile - add d ; increase Y by height of tile - ld d, a - inc hl - ld a, [$FF8B] - ld [hli], a ; OAM tile number - inc a ; increment tile number - ld [$FF8B], a - inc hl - dec c - jr nz, .innerLoop - ld a, [$FF8B] - add $4 ; increase tile number by 4 - ld [$FF8B], a - ld a, $8 ; width of tile - add e ; increase X by width of tile - ld e, a - dec b - jr nz, .loop - ld de, vBackPic - call InterlaceMergeSpriteBuffers - ld a, $a - ld [$0], a - xor a - ld [$4000], a - ld hl, vSprites - ld de, S_SPRITEBUFFER1 - ld a, [H_LOADEDROMBANK] - ld b, a - ld c, 7 * 7 - call CopyVideoData - xor a - ld [$0], a - ld a, $31 - ld [$ffe1], a - hlCoord 1, 5 - predef_jump Func_3f0c6 - -Func_3ed02: ; 3ed02 (f:6d02) - callab Func_39680 - ld hl, Func_396a7 - ld b, BANK(Func_396a7) - jp Bankswitch - -ScrollTrainerPicAfterBattle: ; 3ed12 (f:6d12) - ld hl, _ScrollTrainerPicAfterBattle - ld b, BANK(_ScrollTrainerPicAfterBattle) - jp Bankswitch - -ApplyBurnAndParalysisPenaltiesToPlayer: ; 3ed1a (f:6d1a) - ld a, $1 - jr ApplyBurnAndParalysisPenalties - -ApplyBurnAndParalysisPenaltiesToEnemy: ; 3ed1e (f:6d1e) - xor a - -ApplyBurnAndParalysisPenalties: ; 3ed1f (f:6d1f) - ld [H_WHOSETURN], a - call QuarterSpeedDueToParalysis - jp HalveAttackDueToBurn - -QuarterSpeedDueToParalysis: ; 3ed27 (f:6d27) - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn -.enemyTurn ; quarter the player's speed - ld a, [wBattleMonStatus] - and 1 << PAR - ret z ; return if player not paralysed - ld hl, wBattleMonSpeed + 1 - ld a, [hld] - ld b, a - ld a, [hl] - srl a - rr b - srl a - rr b - ld [hli], a - or b - jr nz, .storePlayerSpeed - ld b, 1 ; give the player a minimum of at least one speed point -.storePlayerSpeed - ld [hl], b - ret -.playerTurn ; quarter the enemy's speed - ld a, [wEnemyMonStatus] - and 1 << PAR - ret z ; return if enemy not paralysed - ld hl, wEnemyMonSpeed + 1 - ld a, [hld] - ld b, a - ld a, [hl] - srl a - rr b - srl a - rr b - ld [hli], a - or b - jr nz, .storeEnemySpeed - ld b, 1 ; give the enemy a minimum of at least one speed point -.storeEnemySpeed - ld [hl], b - ret - -HalveAttackDueToBurn: ; 3ed64 (f:6d64) - ld a, [H_WHOSETURN] - and a - jr z, .playerTurn -.enemyTurn ; halve the player's attack - ld a, [wBattleMonStatus] - and 1 << BRN - ret z ; return if player not burnt - ld hl, wBattleMonAttack + 1 - ld a, [hld] - ld b, a - ld a, [hl] - srl a - rr b - ld [hli], a - or b - jr nz, .storePlayerAttack - ld b, 1 ; give the player a minimum of at least one attack point -.storePlayerAttack - ld [hl], b - ret -.playerTurn ; halve the enemy's attack - ld a, [wEnemyMonStatus] - and 1 << BRN - ret z ; return if enemy not burnt - ld hl, wEnemyMonAttack + 1 - ld a, [hld] - ld b, a - ld a, [hl] - srl a - rr b - ld [hli], a - or b - jr nz, .storeEnemyAttack - ld b, 1 ; give the enemy a minimum of at least one attack point -.storeEnemyAttack - ld [hl], b - ret - -CalculateModifiedStats: ; 3ed99 (f:6d99) - ld c, 0 -.loop - call CalculateModifiedStat - inc c - ld a, c - cp 4 - jr nz, .loop - ret - -; calculate modified stat for stat c (0 = attack, 1 = defense, 2 = speed, 3 = special) -CalculateModifiedStat: ; 3eda5 (f:6da5) - push bc - push bc - ld a, [wd11e] - and a - ld a, c - ld hl, wBattleMonAttack - ld de, wPlayerMonUnmodifiedAttack - ld bc, wPlayerMonAttackMod - jr z, .next - ld hl, wEnemyMonAttack - ld de, wEnemyMonUnmodifiedAttack - ld bc, wEnemyMonStatMods -.next - add c - ld c, a - jr nc, .noCarry1 - inc b -.noCarry1 - ld a, [bc] - pop bc - ld b, a - push bc - sla c - ld b, 0 - add hl, bc - ld a, c - add e - ld e, a - jr nc, .noCarry2 - inc d -.noCarry2 - pop bc - push hl - ld hl, StatModifierRatios - dec b - sla b - ld c, b - ld b, 0 - add hl, bc - xor a - ld [H_MULTIPLICAND], a - ld a, [de] - ld [H_MULTIPLICAND + 1], a - inc de - ld a, [de] - ld [H_MULTIPLICAND + 2], a - ld a, [hli] - ld [H_MULTIPLIER], a - call Multiply - ld a, [hl] - ld [H_DIVISOR], a - ld b, $4 - call Divide - pop hl - ld a, [H_DIVIDEND + 3] - sub 999 % $100 - ld a, [H_DIVIDEND + 2] - sbc 999 / $100 - jp c, .storeNewStatValue -; cap the stat at 999 - ld a, 999 / $100 - ld [H_DIVIDEND + 2], a - ld a, 999 % $100 - ld [H_DIVIDEND + 3], a -.storeNewStatValue - ld a, [H_DIVIDEND + 2] - ld [hli], a - ld b, a - ld a, [H_DIVIDEND + 3] - ld [hl], a - or b - jr nz, .done - inc [hl] ; if the stat is 0, bump it up to 1 -.done - pop bc - ret - -ApplyBadgeStatBoosts: ; 3ee19 (f:6e19) - ld a, [W_ISLINKBATTLE] - cp $4 - ret z ; return if link battle - ld a, [W_OBTAINEDBADGES] - ld b, a - ld hl, wBattleMonAttack - ld c, $4 -; the boost is applied for badges whose bit position is even -; the order of boosts matches the order they are laid out in RAM -; Boulder (bit 0) - attack -; Thunder (bit 2) - defense -; Soul (bit 4) - speed -; Volcano (bit 6) - special -.loop - srl b - call c, .applyBoostToStat - inc hl - inc hl - srl b - dec c - jr nz, .loop - ret - -; multiply stat at hl by 1.125 -; cap stat at 999 -.applyBoostToStat - ld a, [hli] - ld d, a - ld e, [hl] - srl d - rr e - srl d - rr e - srl d - rr e - ld a, [hl] - add e - ld [hld], a - ld a, [hl] - adc d - ld [hli], a - ld a, [hld] - sub 999 % $100 - ld a, [hl] - sbc 999 / $100 - ret c - ld a, 999 / $100 - ld [hli], a - ld a, 999 % $100 - ld [hld], a - ret - -LoadHudAndHpBarAndStatusTilePatterns: ; 3ee58 (f:6e58) - call LoadHpBarAndStatusTilePatterns - -LoadHudTilePatterns: ; 3ee5b (f:6e5b) - ld a, [rLCDC] - add a ; is LCD disabled? - jr c, .lcdEnabled -.lcdDisabled - ld hl, BattleHudTiles1 - ld de, vChars2 + $6d0 - ld bc, $18 - ld a, BANK(BattleHudTiles1) - call FarCopyDataDouble - ld hl, BattleHudTiles2 - ld de, vChars2 + $730 - ld bc, $30 - ld a, BANK(BattleHudTiles2) - jp FarCopyDataDouble -.lcdEnabled - ld de, BattleHudTiles1 - ld hl, vChars2 + $6d0 - ld bc, (BANK(BattleHudTiles1) << 8) + $03 - call CopyVideoDataDouble - ld de, BattleHudTiles2 - ld hl, vChars2 + $730 - ld bc, (BANK(BattleHudTiles2) << 8) + $06 - jp CopyVideoDataDouble - -PrintEmptyString: ; 3ee94 (f:6e94) - ld hl, .emptyString - jp PrintText -.emptyString - db "@" - - -BattleRandom: -; Link battles use a shared PRNG. - - ld a, [W_ISLINKBATTLE] - cp $4 - jp nz, Random - - push hl - push bc - ld a, [wccde] - ld c, a - ld b, 0 - ld hl, wd148 - add hl, bc - inc a - ld [wccde], a - cp 9 - ld a, [hl] - pop bc - pop hl - ret c - - push hl - push bc - push af - - xor a - ld [wccde], a - - ld hl, wd148 - ld b, 9 -.loop - ld a, [hl] - ld c, a - add a - add a - add c - inc a - ld [hli], a - dec b - jr nz, .loop - - pop af - pop bc - pop hl - ret - - -Func_3eed3: ; 3eed3 (f:6ed3) - ld a, [H_WHOSETURN] - and a - ld hl, wEnemyMonType1 ; wcfea (aliases: wEnemyMonType) - ld de, W_ENEMYBATTSTATUS1 - ld a, [W_PLAYERMOVENUM] - jr z, .asm_3eeea - ld hl, wBattleMonType1 ; wd019 (aliases: wBattleMonType) - ld de, W_ENEMYBATTSTATUS1 - ld a, [W_ENEMYMOVENUM] -.asm_3eeea - cp SELFDESTRUCT - jr z, .asm_3eef1 - cp EXPLOSION - ret nz -.asm_3eef1 - ld a, [de] - bit 6, a ; fly/dig - ret nz - ld a, [hli] - cp GHOST - ret z - ld a, [hl] - cp GHOST - ret z - ld a, [W_MOVEMISSED] - and a - ret nz - ld a, MEGA_PUNCH - ld [wcc5b], a - -PlayMoveAnimation: ; 3ef07 (f:6f07) - ld [W_ANIMATIONID],a - call Delay3 - predef_jump MoveAnimation - -InitBattle: ; 3ef12 (f:6f12) - ld a, [W_CUROPPONENT] - and a - jr z, asm_3ef23 - -InitOpponent: ; 3ef18 (f:6f18) - ld a, [W_CUROPPONENT] - ld [wcf91], a - ld [wEnemyMonSpecies2], a - jr asm_3ef3d -asm_3ef23: ; 3ef23 (f:6f23) - ld a, [wd732] - bit 1, a - jr z, .asm_3ef2f - ld a, [hJoyHeld] - bit 1, a ; B button pressed? - ret nz -.asm_3ef2f - ld a, [wNumberOfNoRandomBattleStepsLeft] - and a - ret nz - callab Func_13870 - ret nz -asm_3ef3d: ; 3ef3d (f:6f3d) - ld a, [wMapPalOffset] - push af - ld hl, wd358 - ld a, [hl] - push af - res 1, [hl] - callab Func_525af - ld a, [wEnemyMonSpecies2] - sub $c8 - jp c, InitWildBattle - ld [W_TRAINERCLASS], a - call GetTrainerInformation - callab ReadTrainer - call DoBattleTransitionAndInitBattleVariables - call _LoadTrainerPic - xor a - ld [wEnemyMonSpecies2], a - ld [$ffe1], a - dec a - ld [wAICount], a - hlCoord 12, 0 - predef Func_3f0c6 - ld a, $ff - ld [wEnemyMonPartyPos], a - ld a, $2 - ld [W_ISINBATTLE], a - jp InitBattle_Common - -InitWildBattle: ; 3ef8b (f:6f8b) - ld a, $1 - ld [W_ISINBATTLE], a - call LoadEnemyMonData - call DoBattleTransitionAndInitBattleVariables - ld a, [W_CUROPPONENT] - cp MAROWAK - jr z, .isGhost - call IsGhostBattle - jr nz, .isNoGhost -.isGhost - ld hl, W_MONHSPRITEDIM - ld a, $66 - ld [hli], a ; write sprite dimensions - ld bc, GhostPic - ld a, c - ld [hli], a ; write front sprite pointer - ld [hl], b - ld hl, wEnemyMonNick ; set name to "GHOST" - ld a, "G" - ld [hli], a - ld a, "H" - ld [hli], a - ld a, "O" - ld [hli], a - ld a, "S" - ld [hli], a - ld a, "T" - ld [hli], a - ld [hl], "@" - ld a, [wcf91] - push af - ld a, MON_GHOST - ld [wcf91], a - ld de, vFrontPic - call LoadMonFrontSprite ; load ghost sprite - pop af - ld [wcf91], a - jr .spriteLoaded -.isNoGhost - ld de, vFrontPic - call LoadMonFrontSprite ; load mon sprite -.spriteLoaded - xor a - ld [W_TRAINERCLASS], a - ld [$ffe1], a - hlCoord 12, 0 - predef Func_3f0c6 - -; common code that executes after init battle code specific to trainer or wild battles -InitBattle_Common: ; 3efeb (f:6feb) - ld b, $0 - call GoPAL_SET - call SlidePlayerAndEnemySilhouettesOnScreen - xor a - ld [H_AUTOBGTRANSFERENABLED], a - ld hl, .emptyString - call PrintText - call SaveScreenTilesToBuffer1 - call ClearScreen - ld a, $98 - ld [$ffbd], a - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a - call Delay3 - ld a, $9c - ld [$ffbd], a - call LoadScreenTilesFromBuffer1 - hlCoord 9, 7 - ld bc, $50a - call ClearScreenArea - hlCoord 1, 0 - ld bc, $40a - call ClearScreenArea - call ClearSprites - ld a, [W_ISINBATTLE] - dec a ; is it a wild battle? - call z, DrawEnemyHUDAndHPBar ; draw enemy HUD and HP bar if it's a wild battle - call StartBattle - callab EndOfBattle - pop af - ld [wd358], a - pop af - ld [wMapPalOffset], a - ld a, [wd0d4] - ld [hTilesetType], a - scf - ret -.emptyString - db "@" - -_LoadTrainerPic: ; 3f04b (f:704b) -; wd033-wd034 contain pointer to pic - ld a, [wd033] - ld e, a - ld a, [wd034] - ld d, a ; de contains pointer to trainer pic - ld a, [W_ISLINKBATTLE] - and a - ld a, Bank(TrainerPics) ; this is where all the trainer pics are (not counting Red's) - jr z, .loadSprite - ld a, Bank(RedPicFront) -.loadSprite - call UncompressSpriteFromDE - ld de, vFrontPic - ld a, $77 - ld c, a - jp LoadUncompressedSpriteData - -Func_3f069: ; 3f069 (f:7069) - xor a - ld [wc0f1], a - ld [wc0f2], a - jp PlaySound - -Func_3f073: ; 3f073 (f:7073) - ld a, [wPredefRegisters] - ld h, a - ld a, [wPredefRegisters + 1] - ld l, a - ld a, [$ffe1] - ld [H_DOWNARROWBLINKCNT1], a - ld b, $4c - ld a, [W_ISINBATTLE] - and a - jr z, .asm_3f0bc - add b - ld [hl], a - call Delay3 - ld bc, -41 - add hl, bc - ld a, $1 - ld [wcd6c], a - ld bc, $303 - predef Func_79aba - ld c, $4 - call DelayFrames - ld bc, -41 - add hl, bc - xor a - ld [wcd6c], a - ld bc, $505 - predef Func_79aba - ld c, $5 - call DelayFrames - ld bc, -41 - jr .asm_3f0bf -.asm_3f0bc - ld bc, -123 -.asm_3f0bf - add hl, bc - ld a, [H_DOWNARROWBLINKCNT1] - add $31 - jr asm_3f0d0 - -Func_3f0c6: ; 3f0c6 (f:70c6) - ld a, [wPredefRegisters] - ld h, a - ld a, [wPredefRegisters + 1] - ld l, a - ld a, [$ffe1] -asm_3f0d0: ; 3f0d0 (f:70d0) - ld bc, $707 - ld de, $14 - push af - ld a, [W_SPRITEFLIPPED] - and a - jr nz, .asm_3f0ed - pop af -.asm_3f0de - push bc - push hl -.asm_3f0e0 - ld [hl], a - add hl, de - inc a - dec c - jr nz, .asm_3f0e0 - pop hl - inc hl - pop bc - dec b - jr nz, .asm_3f0de - ret -.asm_3f0ed - push bc - ld b, $0 - dec c - add hl, bc - pop bc - pop af -.asm_3f0f4 - push bc - push hl -.asm_3f0f6 - ld [hl], a - add hl, de - inc a - dec c - jr nz, .asm_3f0f6 - pop hl - dec hl - pop bc - dec b - jr nz, .asm_3f0f4 - ret - -LoadMonBackPic: -; Assumes the monster's attributes have -; been loaded with GetMonHeader. - ld a, [wBattleMonSpecies2] - ld [wcf91], a - hlCoord 1, 5 - ld b, $7 - ld c, $8 - call ClearScreenArea - ld hl, W_MONHBACKSPRITE - W_MONHEADER - call UncompressMonSprite - predef ScaleSpriteByTwo - ld de, vBackPic - call InterlaceMergeSpriteBuffers ; combine the two buffers to a single 2bpp sprite - ld hl, vSprites - ld de, vBackPic - ld c, (2*SPRITEBUFFERSIZE)/16 ; count of 16-byte chunks to be copied - ld a, [H_LOADEDROMBANK] - ld b, a - jp CopyVideoData - -JumpMoveEffect: ; 3f132 (f:7132) - call _JumpMoveEffect - ld b, $1 - ret - -_JumpMoveEffect: ; 3f138 (f:7138) - ld a, [$fff3] ;whose turn? - and a - ld a, [W_PLAYERMOVEEFFECT] - jr z, .next1 - ld a, [W_ENEMYMOVEEFFECT] -.next1 - dec a ;subtract 1, there is no special effect for 00 - add a ;x2, 16bit pointers - ld hl, MoveEffectPointerTable - ld b, 0 - ld c, a - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] ;jump to special effect handler - -MoveEffectPointerTable: ; 3f150 (f:7150) - dw SleepEffect ; unused effect - dw PoisonEffect ; POISON_SIDE_EFFECT1 - dw DrainHPEffect ; DRAIN_HP_EFFECT - dw FreezeBurnParalyzeEffect ; BURN_SIDE_EFFECT1 - dw FreezeBurnParalyzeEffect ; FREEZE_SIDE_EFFECT - dw FreezeBurnParalyzeEffect ; PARALYZE_SIDE_EFFECT1 - dw ExplodeEffect ; EXPLODE_EFFECT - dw DrainHPEffect ; DREAM_EATER_EFFECT - dw $0000 ; MIRROR_MOVE_EFFECT - dw StatModifierUpEffect ; ATTACK_UP1_EFFECT - dw StatModifierUpEffect ; DEFENSE_UP1_EFFECT - dw StatModifierUpEffect ; SPEED_UP1_EFFECT - dw StatModifierUpEffect ; SPECIAL_UP1_EFFECT - dw StatModifierUpEffect ; ACCURACY_UP1_EFFECT - dw StatModifierUpEffect ; EVASION_UP1_EFFECT - dw PayDayEffect ; PAY_DAY_EFFECT - dw $0000 ; SWIFT_EFFECT - dw StatModifierDownEffect ; ATTACK_DOWN1_EFFECT - dw StatModifierDownEffect ; DEFENSE_DOWN1_EFFECT - dw StatModifierDownEffect ; SPEED_DOWN1_EFFECT - dw StatModifierDownEffect ; SPECIAL_DOWN1_EFFECT - dw StatModifierDownEffect ; ACCURACY_DOWN1_EFFECT - dw StatModifierDownEffect ; EVASION_DOWN1_EFFECT - dw ConversionEffect ; CONVERSION_EFFECT - dw HazeEffect ; HAZE_EFFECT - dw BideEffect ; BIDE_EFFECT - dw ThrashPetalDanceEffect ; THRASH_PETAL_DANCE_EFFECT - dw SwitchAndTeleportEffect ; SWITCH_AND_TELEPORT_EFFECT - dw TwoToFiveAttacksEffect ; TWO_TO_FIVE_ATTACKS_EFFECT - dw TwoToFiveAttacksEffect ; unused effect - dw FlichSideEffect ; FLINCH_SIDE_EFFECT1 - dw SleepEffect ; SLEEP_EFFECT - dw PoisonEffect ; POISON_SIDE_EFFECT2 - dw FreezeBurnParalyzeEffect ; BURN_SIDE_EFFECT2 - dw FreezeBurnParalyzeEffect ; unused effect - dw FreezeBurnParalyzeEffect ; PARALYZE_SIDE_EFFECT2 - dw FlichSideEffect ; FLINCH_SIDE_EFFECT2 - dw OneHitKOEffect ; OHKO_EFFECT - dw ChargeEffect ; CHARGE_EFFECT - dw $0000 ; SUPER_FANG_EFFECT - dw $0000 ; SPECIAL_DAMAGE_EFFECT - dw TrappingEffect ; TRAPPING_EFFECT - dw ChargeEffect ; FLY_EFFECT - dw TwoToFiveAttacksEffect ; ATTACK_TWICE_EFFECT - dw $0000 ; JUMP_KICK_EFFECT - dw MistEffect ; MIST_EFFECT - dw FocusEnergyEffect ; FOCUS_ENERGY_EFFECT - dw RecoilEffect ; RECOIL_EFFECT - dw ConfusionEffect ; CONFUSION_EFFECT - dw StatModifierUpEffect ; ATTACK_UP2_EFFECT - dw StatModifierUpEffect ; DEFENSE_UP2_EFFECT - dw StatModifierUpEffect ; SPEED_UP2_EFFECT - dw StatModifierUpEffect ; SPECIAL_UP2_EFFECT - dw StatModifierUpEffect ; ACCURACY_UP2_EFFECT - dw StatModifierUpEffect ; EVASION_UP2_EFFECT - dw HealEffect ; HEAL_EFFECT - dw TransformEffect ; TRANSFORM_EFFECT - dw StatModifierDownEffect ; ATTACK_DOWN2_EFFECT - dw StatModifierDownEffect ; DEFENSE_DOWN2_EFFECT - dw StatModifierDownEffect ; SPEED_DOWN2_EFFECT - dw StatModifierDownEffect ; SPECIAL_DOWN2_EFFECT - dw StatModifierDownEffect ; ACCURACY_DOWN2_EFFECT - dw StatModifierDownEffect ; EVASION_DOWN2_EFFECT - dw ReflectLightScreenEffect ; LIGHT_SCREEN_EFFECT - dw ReflectLightScreenEffect ; REFLECT_EFFECT - dw PoisonEffect ; POISON_EFFECT - dw ParalyzeEffect ; PARALYZE_EFFECT - dw StatModifierDownEffect ; ATTACK_DOWN_SIDE_EFFECT - dw StatModifierDownEffect ; DEFENSE_DOWN_SIDE_EFFECT - dw StatModifierDownEffect ; SPEED_DOWN_SIDE_EFFECT - dw StatModifierDownEffect ; SPECIAL_DOWN_SIDE_EFFECT - dw StatModifierDownEffect ; unused effect - dw StatModifierDownEffect ; unused effect - dw StatModifierDownEffect ; unused effect - dw StatModifierDownEffect ; unused effect - dw ConfusionSideEffect ; CONFUSION_SIDE_EFFECT - dw TwoToFiveAttacksEffect ; TWINEEDLE_EFFECT - dw $0000 ; unused effect - dw SubstituteEffect ; SUBSTITUTE_EFFECT - dw HyperBeamEffect ; HYPER_BEAM_EFFECT - dw RageEffect ; RAGE_EFFECT - dw MimicEffect ; MIMIC_EFFECT - dw $0000 ; METRONOME_EFFECT - dw LeechSeedEffect ; LEECH_SEED_EFFECT - dw SplashEffect ; SPLASH_EFFECT - dw DisableEffect ; DISABLE_EFFECT - -SleepEffect: ; 3f1fc (f:71fc) - ld de, wEnemyMonStatus - ld bc, W_ENEMYBATTSTATUS2 - ld a, [H_WHOSETURN] - and a - jp z, .asm_3f20e - ld de, wBattleMonStatus - ld bc, W_PLAYERBATTSTATUS2 - -.asm_3f20e - ld a, [bc] - bit 5, a ; does the mon need to recharge? (hyper beam) - res 5, a ; mon no longer needs to recharge - ld [bc], a - jr nz, .asm_3f231 - ld a, [de] - ld b, a - and $7 - jr z, .asm_3f222 - ld hl, AlreadyAsleepText - jp PrintText -.asm_3f222 - ld a, b - and a - jr nz, .asm_3f242 - push de - call MoveHitTest - pop de - ld a, [W_MOVEMISSED] - and a - jr nz, .asm_3f242 -.asm_3f231 - call BattleRandom - and $7 - jr z, .asm_3f231 - ld [de], a - call Func_3fb89 - ld hl, FellAsleepText - jp PrintText -.asm_3f242 - jp PrintDidntAffectText - -FellAsleepText: ; 3f245 (f:7245) - TX_FAR _FellAsleepText - db "@" - -AlreadyAsleepText: ; 3f24a (f:724a) - TX_FAR _AlreadyAsleepText - db "@" - -PoisonEffect: ; 3f24f (f:724f) - ld hl, wEnemyMonStatus - ld de, W_PLAYERMOVEEFFECT - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f260 - ld hl, wBattleMonStatus - ld de, W_ENEMYMOVEEFFECT -.asm_3f260 - call CheckTargetSubstitute - jr nz, .asm_3f2d3 - ld a, [hli] - ld b, a - and a - jr nz, .asm_3f2d3 - ld a, [hli] - cp $3 - jr z, .asm_3f2d3 - ld a, [hld] - cp $3 - jr z, .asm_3f2d3 - ld a, [de] - cp POISON_SIDE_EFFECT1 - ld b, $34 ; ~20% chance of poisoning - jr z, .asm_3f290 - cp POISON_SIDE_EFFECT2 - ld b, $67 ; ~40% chance of poisoning - jr z, .asm_3f290 - push hl - push de - call MoveHitTest - pop de - pop hl - ld a, [W_MOVEMISSED] - and a - jr nz, .asm_3f2d7 - jr .asm_3f295 -.asm_3f290 - call BattleRandom - cp b - ret nc -.asm_3f295 - dec hl - set 3, [hl] - push de - dec de - ld a, [H_WHOSETURN] - and a -<<<<<<< HEAD - ld b, ANIM_C7 - ld hl, W_PLAYERBATTSTATUS3 ; W_PLAYERBATTSTATUS3 -======= - ld b, $c7 - ld hl, W_PLAYERBATTSTATUS3 ->>>>>>> yama/master - ld a, [de] - ld de, W_PLAYERTOXICCOUNTER - jr nz, .asm_3f2b0 -<<<<<<< HEAD - ld b, ANIM_A9 - ld hl, W_ENEMYBATTSTATUS3 ; W_ENEMYBATTSTATUS3 - ld de, W_ENEMYTOXICCOUNTER ; wd071 -======= - ld b, $a9 - ld hl, W_ENEMYBATTSTATUS3 - ld de, W_ENEMYTOXICCOUNTER ->>>>>>> yama/master -.asm_3f2b0 - cp TOXIC - jr nz, .asm_3f2bd - set 0, [hl] - xor a - ld [de], a - ld hl, BadlyPoisonedText - jr .asm_3f2c0 -.asm_3f2bd - ld hl, PoisonedText -.asm_3f2c0 - pop de - ld a, [de] - cp POISON_EFFECT - jr z, .asm_3f2cd - ld a, b - call Func_3fb96 - jp PrintText -.asm_3f2cd - call Func_3fb89 - jp PrintText -.asm_3f2d3 - ld a, [de] - cp POISON_EFFECT - ret nz -.asm_3f2d7 - ld c, $32 - call DelayFrames - jp PrintDidntAffectText - -PoisonedText: ; 3f2df (f:72df) - TX_FAR _PoisonedText - db "@" - -BadlyPoisonedText: ; 3f2e4 (f:72e4) - TX_FAR _BadlyPoisonedText - db "@" - -DrainHPEffect: ; 3f2e9 (f:72e9) - ld hl, DrainHPEffect_ - ld b, BANK(DrainHPEffect_) - jp Bankswitch - -ExplodeEffect: ; 3f2f1 (f:72f1) - ld hl, wBattleMonHP - ld de, W_PLAYERBATTSTATUS2 - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f302 - ld hl, wEnemyMonHP - ld de, W_ENEMYBATTSTATUS2 -.asm_3f302 - xor a - ld [hli], a ; set the mon's HP to 0 - ld [hli], a - inc hl - ld [hl], a ; set mon's status to 0 - ld a, [de] - res 7, a ; clear mon's leech seed status - ld [de], a - ret - -FreezeBurnParalyzeEffect: ; 3f30c (f:730c) - xor a - ld [wcc5b], a - call CheckTargetSubstitute ;test bit 4 of d063/d068 flags [target has substitute flag] - ret nz ;return if they have a substitute, can't effect them - ld a, [$fff3] ;whose turn? - and a - jp nz, opponentAttacker - ld a, [wEnemyMonStatus] - and a - jp nz, CheckDefrost - ;opponent has no existing status - ld a, [W_PLAYERMOVETYPE] - ld b, a - ld a, [wEnemyMonType1] - cp b - ret z ;return if they match [can't freeze an ice type etc.] - ld a, [wEnemyMonType2] - cp b - ret z ;return.. - ld a, [W_PLAYERMOVEEFFECT] - cp a, 7 ;10% status effects are 04, 05, 06 so 07 will set carry for those - ld b, $1a ;[1A-1]/100 or [26-1]/256 = 9.8%~ chance - jr c, .next1 ;branch ahead if this is a 10% chance effect.. - ld b, $4d ;..or use [4D-1]/100 or [76-1]/256 = 29.7%~ chance - sub a, $1e ;subtract $1E to map to equivalent 10% chance effects -.next1 - push af ;push effect... - call BattleRandom ;get random 8bit value for probability test - cp b ;success? - pop bc ;...pop effect into C - ret nc ;do nothing if random value is >= 1A or 4D [no status applied] - ;the test passed - ld a, b ;what type of effect is this? - cp a, BURN_SIDE_EFFECT1 - jr z, .burn - cp a, FREEZE_SIDE_EFFECT - jr z, .freeze - ld a, 1 << PAR - ld [wEnemyMonStatus], a -<<<<<<< HEAD - call Func_3ed27 ;quarter speed of affected monster - ld a, ANIM_A9 -======= - call QuarterSpeedDueToParalysis ;quarter speed of affected monster - ld a, $a9 ->>>>>>> yama/master - call Func_3fbb9 ;animation - jp PrintMayNotAttackText ;print paralysis text -.burn - ld a, 1 << BRN - ld [wEnemyMonStatus], a -<<<<<<< HEAD - call Func_3ed64 - ld a, ANIM_A9 -======= - call HalveAttackDueToBurn - ld a, $a9 ->>>>>>> yama/master - call Func_3fbb9 ;animation - ld hl, BurnedText - jp PrintText -.freeze - call Func_3f9cf ;resets bit 5 of the D063/D068 flags - ld a, 1 << FRZ - ld [wEnemyMonStatus], a - ld a, ANIM_A9 - call Func_3fbb9 ;animation - ld hl, FrozenText - jp PrintText -opponentAttacker: ; 3f382 (f:7382) - ld a, [wBattleMonStatus] ;this appears to the same as above with addresses swapped for opponent - and a - jp nz, CheckDefrost - ld a, [W_ENEMYMOVETYPE] - ld b, a - ld a, [wBattleMonType1] - cp b - ret z - ld a, [wBattleMonType2] - cp b - ret z - ld a, [W_ENEMYMOVEEFFECT] - cp a, 7 - ld b, $1a - jr c, .next1 - ld b, $4d - sub a, $1e -.next1 - push af - call BattleRandom - cp b - pop bc - ret nc - ld a, b - cp a, BURN_SIDE_EFFECT1 - jr z, .burn - cp a, FREEZE_SIDE_EFFECT - jr z, .freeze - ld a, 1 << PAR - ld [wBattleMonStatus], a - call QuarterSpeedDueToParalysis - jp PrintMayNotAttackText -.burn - ld a, 1 << BRN - ld [wBattleMonStatus], a - call HalveAttackDueToBurn - ld hl, BurnedText - jp PrintText -.freeze - ld a, 1 << FRZ - ld [wBattleMonStatus], a - ld hl, FrozenText - jp PrintText - -BurnedText: ; 3f3d8 (f:73d8) - TX_FAR _BurnedText - db "@" - -FrozenText: ; 3f3dd (f:73dd) - TX_FAR _FrozenText - db "@" - -CheckDefrost: ; 3f3e2 (f:73e2) - and a, 1 << FRZ ;are they frozen? - ret z ;return if so - ;not frozen - ld a, [$fff3] ;whose turn? - and a - jr nz, .opponent - ;player [attacker] - ld a, [W_PLAYERMOVETYPE] - sub a, FIRE - ret nz ;return if it isn't fire - ;type is fire - ld [wEnemyMonStatus], a ;set opponent status to 00 ["defrost" a frozen monster] - ld hl, wEnemyMon1Status - ld a, [wEnemyMonPartyPos] - ld bc, wEnemyMon2 - wEnemyMon1 - call AddNTimes - xor a - ld [hl], a ;clear status in roster - ld hl, FireDefrostedText - jr .common -.opponent - ld a, [W_ENEMYMOVETYPE] ;same as above with addresses swapped - sub a, FIRE - ret nz - ld [wBattleMonStatus], a - ld hl, wPartyMon1Status - ld a, [wPlayerMonNumber] - ld bc, wPartyMon2 - wPartyMon1 - call AddNTimes - xor a - ld [hl], a - ld hl, FireDefrostedText -.common - jp PrintText - -FireDefrostedText: ; 3f423 (f:7423) - TX_FAR _FireDefrostedText - db "@" - -StatModifierUpEffect: ; 3f428 (f:7428) - ld hl, wPlayerMonStatMods - ld de, W_PLAYERMOVEEFFECT - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f439 - ld hl, wEnemyMonStatMods - ld de, W_ENEMYMOVEEFFECT -.asm_3f439 - ld a, [de] - sub $a - cp $8 - jr c, .asm_3f442 - sub $28 -.asm_3f442 - ld c, a - ld b, $0 - add hl, bc - ld b, [hl] - inc b - ld a, $d - cp b - jp c, Func_3f522 - ld a, [de] - cp $12 - jr c, .asm_3f45a - inc b - ld a, $d - cp b - jr nc, .asm_3f45a - ld b, a -.asm_3f45a - ld [hl], b - ld a, c - cp $4 - jr nc, asm_3f4ca - push hl - ld hl, wBattleMonAttack + 1 - ld de, wcd12 - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f472 - ld hl, wEnemyMonAttack + 1 - ld de, wEnemyMonUnmodifiedAttack -.asm_3f472 - push bc - sla c - ld b, $0 - add hl, bc - ld a, c - add e - ld e, a - jr nc, .asm_3f47e - inc d -.asm_3f47e - pop bc - ld a, [hld] - sub $e7 - jr nz, .asm_3f48a - ld a, [hl] - sbc $3 - jp z, Func_3f520 -.asm_3f48a - push hl - push bc - ld hl, StatModifierRatios - dec b - sla b - ld c, b - ld b, $0 - add hl, bc - pop bc - xor a - ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) - ld a, [de] - ld [$ff97], a - inc de - ld a, [de] - ld [$ff98], a - ld a, [hli] - ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) - call Multiply - ld a, [hl] - ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) - ld b, $4 - call Divide - pop hl - ld a, [$ff98] - sub $e7 - ld a, [$ff97] - sbc $3 - jp c, Func_3f4c3 - ld a, 999 / $100 - ld [$ff97], a - ld a, 999 % $100 - ld [$ff98], a - -Func_3f4c3: ; 3f4c3 (f:74c3) - ld a, [$ff97] - ld [hli], a - ld a, [$ff98] - ld [hl], a - pop hl -asm_3f4ca: ; 3f4ca (f:74ca) - ld b, c - inc b - call Func_3f688 - ld hl, W_PLAYERBATTSTATUS2 - ld de, W_PLAYERMOVENUM - ld bc, wccf7 - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f4e6 - ld hl, W_ENEMYBATTSTATUS2 - ld de, W_ENEMYMOVENUM - ld bc, wccf3 -.asm_3f4e6 - ld a, [de] - cp MINIMIZE - jr nz, .asm_3f4f9 - bit 4, [hl] - push af - push bc - ld hl, Func_79747 - ld b, BANK(Func_79747) - push de - call nz, Bankswitch - pop de -.asm_3f4f9 - call Func_3fba8 - ld a, [de] - cp MINIMIZE - jr nz, .asm_3f50e - pop bc - ld a, $1 - ld [bc], a - ld hl, Func_79771 - ld b, BANK(Func_79771) - pop af - call nz, Bankswitch -.asm_3f50e - ld a, [H_WHOSETURN] - and a - call z, ApplyBadgeStatBoosts - ld hl, MonsStatsRoseText - call PrintText - call QuarterSpeedDueToParalysis - jp HalveAttackDueToBurn - -Func_3f520: ; 3f520 (f:7520) - pop hl - dec [hl] - -Func_3f522: ; 3f522 (f:7522) - ld hl, NothingHappenedText - jp PrintText - -MonsStatsRoseText: ; 3f528 (f:7528) - TX_FAR _MonsStatsRoseText - db $08 ; asm - ld hl, GreatlyRoseText - ld a, [H_WHOSETURN] - and a - ld a, [W_PLAYERMOVEEFFECT] - jr z, .asm_3f53b - ld a, [W_ENEMYMOVEEFFECT] -.asm_3f53b - cp ATTACK_DOWN1_EFFECT - ret nc - ld hl, RoseText - ret - -GreatlyRoseText: ; 3f542 (f:7542) - db $0a - TX_FAR _GreatlyRoseText - -RoseText: ; 3f547 (f:7547) - TX_FAR _RoseText - db "@" - -StatModifierDownEffect: ; 3f54c (f:754c) - ld hl, wEnemyMonStatMods - ld de, W_PLAYERMOVEEFFECT - ld bc, W_ENEMYBATTSTATUS1 - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f572 - ld hl, wPlayerMonStatMods - ld de, W_ENEMYMOVEEFFECT - ld bc, W_PLAYERBATTSTATUS1 - ld a, [W_ISLINKBATTLE] - cp $4 - jr z, .asm_3f572 - call BattleRandom - cp $40 - jp c, Func_3f65a -.asm_3f572 - call CheckTargetSubstitute - jp nz, Func_3f65a - ld a, [de] - cp ATTACK_DOWN_SIDE_EFFECT - jr c, .asm_3f58a - call BattleRandom - cp SPLASH_EFFECT - jp nc, Func_3f650 - ld a, [de] - sub ATTACK_DOWN_SIDE_EFFECT - jr .asm_3f5a9 -.asm_3f58a - push hl - push de - push bc - call MoveHitTest - pop bc - pop de - pop hl - ld a, [W_MOVEMISSED] - and a - jp nz, Func_3f65a - ld a, [bc] - bit 6, a - jp nz, Func_3f65a - ld a, [de] - sub $12 - cp $8 - jr c, .asm_3f5a9 - sub $28 -.asm_3f5a9 - ld c, a - ld b, $0 - add hl, bc - ld b, [hl] - dec b - jp z, Func_3f650 - ld a, [de] - cp $24 - jr c, .asm_3f5bf - cp $44 - jr nc, .asm_3f5bf - dec b - jr nz, .asm_3f5bf - inc b -.asm_3f5bf - ld [hl], b - ld a, c - cp $4 - jr nc, asm_3f62c - push hl - push de - ld hl, wEnemyMonAttack + 1 - ld de, wEnemyMonUnmodifiedAttack - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f5d8 - ld hl, wBattleMonAttack + 1 - ld de, wcd12 -.asm_3f5d8 - push bc - sla c - ld b, $0 - add hl, bc - ld a, c - add e - ld e, a - jr nc, .asm_3f5e4 - inc d -.asm_3f5e4 - pop bc - ld a, [hld] - sub $1 - jr nz, .asm_3f5ef - ld a, [hl] - and a - jp z, Func_3f64d -.asm_3f5ef - push hl - push bc - ld hl, StatModifierRatios - dec b - sla b - ld c, b - ld b, $0 - add hl, bc - pop bc - xor a - ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) - ld a, [de] - ld [$ff97], a - inc de - ld a, [de] - ld [$ff98], a - ld a, [hli] - ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) - call Multiply - ld a, [hl] - ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) - ld b, $4 - call Divide - pop hl - ld a, [$ff98] - ld b, a - ld a, [$ff97] - or b - jp nz, Func_3f624 - ld [$ff97], a - ld a, $1 - ld [$ff98], a - -Func_3f624: ; 3f624 (f:7624) - ld a, [$ff97] - ld [hli], a - ld a, [$ff98] - ld [hl], a - pop de - pop hl -asm_3f62c: ; 3f62c (f:762c) - ld b, c - inc b - push de - call Func_3f688 - pop de - ld a, [de] - cp $44 - jr nc, .asm_3f63b - call Func_3fb89 -.asm_3f63b - ld a, [H_WHOSETURN] - and a - call nz, ApplyBadgeStatBoosts - ld hl, MonsStatsFellText - call PrintText - call QuarterSpeedDueToParalysis - jp HalveAttackDueToBurn - -Func_3f64d: ; 3f64d (f:764d) - pop de - pop hl - inc [hl] - -Func_3f650: ; 3f650 (f:7650) - ld a, [de] - cp ATTACK_DOWN_SIDE_EFFECT - ret nc - ld hl, NothingHappenedText - jp PrintText - -Func_3f65a: ; 3f65a (f:765a) - ld a, [de] - cp $44 - ret nc - jp Func_3fb4e - -MonsStatsFellText: ; 3f661 (f:7661) - TX_FAR _MonsStatsFellText - db $08 ; asm - ld hl, FellText - ld a, [H_WHOSETURN] - and a - ld a, [W_PLAYERMOVEEFFECT] - jr z, .asm_3f674 - ld a, [W_ENEMYMOVEEFFECT] -.asm_3f674 - cp $1a - ret c - cp $44 - ret nc - ld hl, GreatlyFellText - ret - -GreatlyFellText: ; 3f67e (f:767e) - db $0a - TX_FAR _GreatlyFellText - -FellText: ; 3f683 (f:7683) - TX_FAR _FellText - db "@" - -Func_3f688: ; 3f688 (f:7688) - ld hl, StatsTextStrings - ld c, $50 -.asm_3f68d - dec b - jr z, .asm_3f696 -.asm_3f690 - ld a, [hli] - cp c - jr z, .asm_3f68d - jr .asm_3f690 -.asm_3f696 - ld de, wcf4b - ld bc, $a - jp CopyData - -StatsTextStrings: ; 3f69f (f:769f) - db "ATTACK@" - db "DEFENSE@" - db "SPEED@" - db "SPECIAL@" - db "ACCURACY@" - db "EVADE@" - -StatModifierRatios: ; 3f6cb (f:76cb) -; first byte is numerator, second byte is denominator - db 25, 100 ; 0.25 - db 28, 100 ; 0.28 - db 33, 100 ; 0.33 - db 40, 100 ; 0.40 - db 50, 100 ; 0.50 - db 66, 100 ; 0.66 - db 1, 1 ; 1.00 - db 15, 10 ; 1.50 - db 2, 1 ; 2.00 - db 25, 10 ; 2.50 - db 3, 1 ; 3.00 - db 35, 10 ; 3.50 - db 4, 1 ; 4.00 - -BideEffect: ; 3f6e5 (f:76e5) - ld hl, W_PLAYERBATTSTATUS1 - ld de, W_NUMHITS - ld bc, wPlayerNumAttacksLeft - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f6fc - ld hl, W_ENEMYBATTSTATUS1 - ld de, wcd05 - ld bc, wEnemyNumAttacksLeft -.asm_3f6fc - set 0, [hl] ; mon is now using bide - xor a - ld [de], a - inc de - ld [de], a - ld [W_PLAYERMOVEEFFECT], a - ld [W_ENEMYMOVEEFFECT], a - call BattleRandom - and $1 - inc a - inc a - ld [bc], a - ld a, [H_WHOSETURN] - add XSTATITEM_ANIM - jp Func_3fb96 - -ThrashPetalDanceEffect: ; 3f717 (f:7717) - ld hl, W_PLAYERBATTSTATUS1 - ld de, wPlayerNumAttacksLeft - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f728 - ld hl, W_ENEMYBATTSTATUS1 - ld de, wEnemyNumAttacksLeft -.asm_3f728 - set 1, [hl] ; mon is now using thrash/petal dance - call BattleRandom - and $1 - inc a - inc a - ld [de], a -<<<<<<< HEAD - ld a, [H_WHOSETURN] ; $fff3 - add ANIM_B0 -======= - ld a, [H_WHOSETURN] - add $b0 ->>>>>>> yama/master - jp Func_3fb96 - -SwitchAndTeleportEffect: ; 3f739 (f:7739) - ld a, [H_WHOSETURN] - and a - jr nz, .asm_3f791 - ld a, [W_ISINBATTLE] - dec a - jr nz, .asm_3f77e - ld a, [W_CURENEMYLVL] - ld b, a - ld a, [wBattleMonLevel] - cp b - jr nc, .asm_3f76e - add b - ld c, a - inc c -.asm_3f751 - call BattleRandom - cp c - jr nc, .asm_3f751 - srl b - srl b - cp b - jr nc, .asm_3f76e - ld c, $32 - call DelayFrames - ld a, [W_PLAYERMOVENUM] - cp TELEPORT - jp nz, PrintDidntAffectText - jp PrintButItFailedText_ -.asm_3f76e - call ReadPlayerMonCurHPAndStatus - xor a - ld [wcc5b], a - inc a - ld [wEscapedFromBattle], a - ld a, [W_PLAYERMOVENUM] - jr .asm_3f7e4 -.asm_3f77e - ld c, $32 - call DelayFrames - ld hl, IsUnaffectedText - ld a, [W_PLAYERMOVENUM] - cp TELEPORT - jp nz, PrintText - jp PrintButItFailedText_ -.asm_3f791 - ld a, [W_ISINBATTLE] - dec a - jr nz, .asm_3f7d1 - ld a, [wBattleMonLevel] - ld b, a - ld a, [W_CURENEMYLVL] - cp b - jr nc, .asm_3f7c1 - add b - ld c, a - inc c -.asm_3f7a4 - call BattleRandom - cp c - jr nc, .asm_3f7a4 - srl b - srl b - cp b - jr nc, .asm_3f7c1 - ld c, $32 - call DelayFrames - ld a, [W_ENEMYMOVENUM] - cp TELEPORT - jp nz, PrintDidntAffectText - jp PrintButItFailedText_ -.asm_3f7c1 - call ReadPlayerMonCurHPAndStatus - xor a - ld [wcc5b], a - inc a - ld [wEscapedFromBattle], a - ld a, [W_ENEMYMOVENUM] - jr .asm_3f7e4 -.asm_3f7d1 - ld c, $32 - call DelayFrames - ld hl, IsUnaffectedText - ld a, [W_ENEMYMOVENUM] - cp TELEPORT - jp nz, PrintText - jp Func_3fb4e -.asm_3f7e4 - push af - call Func_3fbb9 - ld c, $14 - call DelayFrames - pop af - ld hl, RanFromBattleText - cp TELEPORT - jr z, .asm_3f7ff - ld hl, RanAwayScaredText - cp ROAR - jr z, .asm_3f7ff - ld hl, WasBlownAwayText -.asm_3f7ff - jp PrintText - -RanFromBattleText: ; 3f802 (f:7802) - TX_FAR _RanFromBattleText - db "@" - -RanAwayScaredText: ; 3f807 (f:7807) - TX_FAR _RanAwayScaredText - db "@" - -WasBlownAwayText: ; 3f80c (f:780c) - TX_FAR _WasBlownAwayText - db "@" - -TwoToFiveAttacksEffect: ; 3f811 (f:7811) - ld hl, W_PLAYERBATTSTATUS1 - ld de, wPlayerNumAttacksLeft - ld bc, W_NUMHITS - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f828 - ld hl, W_ENEMYBATTSTATUS1 - ld de, wEnemyNumAttacksLeft - ld bc, wcd05 -.asm_3f828 - bit 2, [hl] ; is mon attacking multiple times? - ret nz - set 2, [hl] ; mon is now attacking multiple times - ld hl, W_PLAYERMOVEEFFECT - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f838 - ld hl, W_ENEMYMOVEEFFECT -.asm_3f838 - ld a, [hl] - cp TWINEEDLE_EFFECT - jr z, .asm_3f856 - cp ATTACK_TWICE_EFFECT - ld a, $2 - jr z, .asm_3f853 - call BattleRandom - and $3 - cp $2 - jr c, .asm_3f851 - call BattleRandom - and $3 -.asm_3f851 - inc a - inc a -.asm_3f853 - ld [de], a - ld [bc], a - ret -.asm_3f856 - ld a, $2 - ld [hl], a - jr .asm_3f853 - -FlichSideEffect: ; 3f85b (f:785b) - call CheckTargetSubstitute - ret nz - ld hl, W_ENEMYBATTSTATUS1 - ld de, W_PLAYERMOVEEFFECT - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f870 - ld hl, W_PLAYERBATTSTATUS1 - ld de, W_ENEMYMOVEEFFECT -.asm_3f870 - ld a, [de] - cp FLINCH_SIDE_EFFECT1 - ld b, $1a ; ~10% chance of flinch - jr z, .asm_3f879 - ld b, $4d ; ~30% chance of flinch -.asm_3f879 - call BattleRandom - cp b - ret nc - set 3, [hl] ; set mon's status to flinching - call Func_3f9cf - ret - -OneHitKOEffect: ; 3f884 (f:7884) - ld hl, OneHitKOEffect_ - ld b, BANK(OneHitKOEffect_) - jp Bankswitch - -ChargeEffect: ; 3f88c (f:788c) - ld hl, W_PLAYERBATTSTATUS1 - ld de, W_PLAYERMOVEEFFECT - ld a, [H_WHOSETURN] - and a - ld b, XSTATITEM_ANIM - jr z, .asm_3f8a1 -<<<<<<< HEAD - ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 - ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT - ld b, ANIM_AF -======= - ld hl, W_ENEMYBATTSTATUS1 - ld de, W_ENEMYMOVEEFFECT - ld b, $af ->>>>>>> yama/master -.asm_3f8a1 - set 4, [hl] - ld a, [de] - dec de ; de contains enemy or player MOVENUM - cp FLY_EFFECT - jr nz, .asm_3f8ad - set 6, [hl] ; mon is now invulnerable to typical attacks (fly/dig) - ld b, TELEPORT -.asm_3f8ad - ld a, [de] - cp DIG - jr nz, .asm_3f8b6 - set 6, [hl] ; mon is now invulnerable to typical attacks (fly/dig) - ld b, ANIM_C0 -.asm_3f8b6 - xor a - ld [wcc5b], a - ld a, b - call Func_3fbb9 - ld a, [de] - ld [wWhichTrade], a - ld hl, ChargeMoveEffectText - jp PrintText - -ChargeMoveEffectText: ; 3f8c8 (f:78c8) - TX_FAR _ChargeMoveEffectText - db $08 ; asm - ld a, [wWhichTrade] - cp RAZOR_WIND - ld hl, MadeWhirlwindText - jr z, .asm_3f8f8 - cp SOLARBEAM - ld hl, TookInSunlightText - jr z, .asm_3f8f8 - cp SKULL_BASH - ld hl, LoweredItsHeadText - jr z, .asm_3f8f8 - cp SKY_ATTACK - ld hl, SkyAttackGlowingText - jr z, .asm_3f8f8 - cp FLY - ld hl, FlewUpHighText - jr z, .asm_3f8f8 - cp DIG - ld hl, DugAHoleText -.asm_3f8f8 - ret - -MadeWhirlwindText: ; 3f8f9 (f:78f9) - TX_FAR _MadeWhirlwindText - db "@" - -TookInSunlightText: ; 3f8fe (f:78fe) - TX_FAR _TookInSunlightText - db "@" - -LoweredItsHeadText: ; 3f903 (f:7903) - TX_FAR _LoweredItsHeadText - db "@" - -SkyAttackGlowingText: ; 3f908 (f:7908) - TX_FAR _SkyAttackGlowingText - db "@" - -FlewUpHighText: ; 3f90d (f:790d) - TX_FAR _FlewUpHighText - db "@" - -DugAHoleText: ; 3f912 (f:7912) - TX_FAR _DugAHoleText - db "@" - -TrappingEffect: ; 3f917 (f:7917) - ld hl, W_PLAYERBATTSTATUS1 - ld de, wPlayerNumAttacksLeft - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f928 - ld hl, W_ENEMYBATTSTATUS1 - ld de, wEnemyNumAttacksLeft -.asm_3f928 - bit 5, [hl] - ret nz - call Func_3f9cf - set 5, [hl] - call BattleRandom - and $3 - cp $2 - jr c, .asm_3f93e - call BattleRandom - and $3 -.asm_3f93e - inc a - ld [de], a - ret - -MistEffect: ; 3f941 (f:7941) - ld hl, MistEffect_ - ld b, BANK(MistEffect_) - jp Bankswitch - -FocusEnergyEffect: ; 3f949 (f:7949) - ld hl, FocusEnergyEffect_ - ld b, BANK(FocusEnergyEffect_) - jp Bankswitch - -RecoilEffect: ; 3f951 (f:7951) - ld hl, RecoilEffect_ - ld b, BANK(RecoilEffect_) - jp Bankswitch - -ConfusionSideEffect: ; 3f959 (f:7959) - call BattleRandom - cp $19 - ret nc - jr Func_3f96f - -ConfusionEffect: ; 3f961 (f:7961) - call CheckTargetSubstitute - jr nz, Func_3f9a6 - call MoveHitTest - ld a, [W_MOVEMISSED] - and a - jr nz, Func_3f9a6 - -Func_3f96f: ; 3f96f (f:796f) - ld a, [H_WHOSETURN] - and a - ld hl, W_ENEMYBATTSTATUS1 - ld bc, wd070 - ld a, [W_PLAYERMOVEEFFECT] - jr z, .asm_3f986 - ld hl, W_PLAYERBATTSTATUS1 - ld bc, wd06b - ld a, [W_ENEMYMOVEEFFECT] -.asm_3f986 - bit 7, [hl] ; is mon confused? - jr nz, Func_3f9a6 - set 7, [hl] ; mon is now confused - push af - call BattleRandom - and $3 - inc a - inc a - ld [bc], a - pop af - cp CONFUSION_SIDE_EFFECT - call nz, Func_3fb89 - ld hl, BecameConfusedText - jp PrintText - -BecameConfusedText: ; 3f9a1 (f:79a1) - TX_FAR _BecameConfusedText - db "@" - -Func_3f9a6: ; 3f9a6 (f:79a6) - cp CONFUSION_SIDE_EFFECT - ret z - ld c, $32 - call DelayFrames - jp Func_3fb4e - -ParalyzeEffect: ; 3f9b1 (f:79b1) - ld hl, ParalyzeEffect_ - ld b, BANK(ParalyzeEffect_) - jp Bankswitch - -SubstituteEffect: ; 3f9b9 (f:79b9) - ld hl, SubstituteEffectHandler - ld b, BANK(SubstituteEffectHandler) - jp Bankswitch - -HyperBeamEffect: ; 3f9c1 (f:79c1) - ld hl, W_PLAYERBATTSTATUS2 - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f9cc - ld hl, W_ENEMYBATTSTATUS2 -.asm_3f9cc - set 5, [hl] ; mon now needs to recharge - ret - -Func_3f9cf: ; 3f9cf (f:79cf) - push hl - ld hl, W_ENEMYBATTSTATUS2 - ld a, [H_WHOSETURN] - and a - jr z, .asm_3f9db - ld hl, W_PLAYERBATTSTATUS2 -.asm_3f9db - res 5, [hl] ; mon no longer needs to recharge - pop hl - ret - -RageEffect: ; 3f9df (f:79df) - ld hl, W_PLAYERBATTSTATUS2 - ld a, [H_WHOSETURN] - and a - jr z, .player - ld hl, W_ENEMYBATTSTATUS2 -.player - set 6, [hl] ; mon is now in "rage" mode - ret - -MimicEffect: ; 3f9ed (f:79ed) - ld c, $32 - call DelayFrames - call MoveHitTest - ld a, [W_MOVEMISSED] - and a - jr nz, .asm_3fa74 - ld a, [H_WHOSETURN] - and a - ld hl, wBattleMonMoves - ld a, [W_PLAYERBATTSTATUS1] - jr nz, .asm_3fa13 - ld a, [W_ISLINKBATTLE] - cp $4 - jr nz, .asm_3fa3a - ld hl, wEnemyMonMoves - ld a, [W_ENEMYBATTSTATUS1] -.asm_3fa13 - bit 6, a - jr nz, .asm_3fa74 -.asm_3fa17 - push hl - call BattleRandom - and $3 - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - pop hl - and a - jr z, .asm_3fa17 - ld d, a - ld a, [H_WHOSETURN] - and a - ld hl, wBattleMonMoves - ld a, [wPlayerMoveListIndex] - jr z, .asm_3fa5f - ld hl, wEnemyMonMoves - ld a, [wEnemyMoveListIndex] - jr .asm_3fa5f -.asm_3fa3a - ld a, [W_ENEMYBATTSTATUS1] - bit 6, a - jr nz, .asm_3fa74 - ld a, [wCurrentMenuItem] - push af - ld a, $1 - ld [wMoveMenuType], a - call MoveSelectionMenu - call LoadScreenTilesFromBuffer1 - ld hl, wEnemyMonMoves - ld a, [wCurrentMenuItem] - ld c, a - ld b, $0 - add hl, bc - ld d, [hl] - pop af - ld hl, wBattleMonMoves -.asm_3fa5f - ld c, a - ld b, $0 - add hl, bc - ld a, d - ld [hl], a - ld [wd11e], a - call GetMoveName - call Func_3fba8 - ld hl, MimicLearnedMoveText - jp PrintText -.asm_3fa74 - jp PrintButItFailedText_ - -MimicLearnedMoveText: ; 3fa77 (f:7a77) - TX_FAR _MimicLearnedMoveText - db "@" - -LeechSeedEffect: ; 3fa7c (f:7a7c) - ld hl, LeechSeedEffect_ - ld b, BANK(LeechSeedEffect_) - jp Bankswitch - -SplashEffect: ; 3fa84 (f:7a84) - call Func_3fba8 - jp PrintNoEffectText - -DisableEffect: ; 3fa8a (f:7a8a) - call MoveHitTest - ld a, [W_MOVEMISSED] - and a - jr nz, .asm_3fb06 - ld de, W_ENEMYDISABLEDMOVE - ld hl, wEnemyMonMoves - ld a, [H_WHOSETURN] - and a - jr z, .asm_3faa4 - ld de, W_PLAYERDISABLEDMOVE - ld hl, wBattleMonMoves -.asm_3faa4 - ld a, [de] - and a - jr nz, .asm_3fb06 -.asm_3faa8 - push hl - call BattleRandom - and $3 - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - pop hl - and a - jr z, .asm_3faa8 - ld [wd11e], a - push hl - ld a, [H_WHOSETURN] - and a - ld hl, wBattleMonPP - jr nz, .asm_3facf - ld a, [W_ISLINKBATTLE] - cp $4 - pop hl - jr nz, .asm_3fae1 - push hl - ld hl, wEnemyMonPP -.asm_3facf - push hl - ld a, [hli] - or [hl] - inc hl - or [hl] - inc hl - or [hl] - and $3f - pop hl - jr z, .asm_3fb05 - add hl, bc - ld a, [hl] - pop hl - and a - jr z, .asm_3faa8 -.asm_3fae1 - call BattleRandom - and $7 - inc a - inc c - swap c - add c - ld [de], a - call Func_3fb89 - ld hl, wccee - ld a, [H_WHOSETURN] - and a - jr nz, .asm_3faf8 - inc hl -.asm_3faf8 - ld a, [wd11e] - ld [hl], a - call GetMoveName - ld hl, MoveWasDisabledText - jp PrintText -.asm_3fb05 - pop hl -.asm_3fb06 - jp PrintButItFailedText_ - -MoveWasDisabledText: ; 3fb09 (f:7b09) - TX_FAR _MoveWasDisabledText - db "@" - -PayDayEffect: ; 3fb0e (f:7b0e) - ld hl, PayDayEffect_ - ld b, BANK(PayDayEffect_) - jp Bankswitch - -ConversionEffect: ; 3fb16 (f:7b16) - ld hl, ConversionEffect_ - ld b, BANK(ConversionEffect_) - jp Bankswitch - -HazeEffect: ; 3fb1e (f:7b1e) - ld hl, HazeEffect_ - ld b, BANK(HazeEffect_) - jp Bankswitch - -HealEffect: ; 3fb26 (f:7b26) - ld hl, HealEffect_ - ld b, BANK(HealEffect_) - jp Bankswitch - -TransformEffect: ; 3fb2e (f:7b2e) - ld hl, TransformEffect_ - ld b, BANK(TransformEffect_) - jp Bankswitch - -ReflectLightScreenEffect: ; 3fb36 (f:7b36) - ld hl, ReflectLightScreenEffect_ - ld b, BANK(ReflectLightScreenEffect_) - jp Bankswitch - -NothingHappenedText: ; 3fb3e (f:7b3e) - TX_FAR _NothingHappenedText - db "@" - -PrintNoEffectText: ; 3fb43 (f:7b43) - ld hl, NoEffectText - jp PrintText - -NoEffectText: ; 3fb49 (f:7b49) - TX_FAR _NoEffectText - db "@" - -Func_3fb4e: ; 3fb4e (f:7b4e) - ld a, [wccf4] - and a - ret nz - -PrintButItFailedText_: ; 3fb53 (f:7b53) - ld hl, ButItFailedText - jp PrintText - -ButItFailedText: ; 3fb59 (f:7b59) - TX_FAR _ButItFailedText - db "@" - -PrintDidntAffectText: ; 3fb5e (f:7b5e) - ld hl, DidntAffectText - jp PrintText - -DidntAffectText: ; 3fb64 (f:7b64) - TX_FAR _DidntAffectText - db "@" - -IsUnaffectedText: ; 3fb69 (f:7b69) - TX_FAR _IsUnaffectedText - db "@" - -PrintMayNotAttackText: ; 3fb6e (f:7b6e) - ld hl, ParalyzedMayNotAttackText - jp PrintText - -ParalyzedMayNotAttackText: ; 3fb74 (f:7b74) - TX_FAR _ParalyzedMayNotAttackText - db "@" - -CheckTargetSubstitute: ; 3fb79 (f:7b79) - push hl - ld hl, W_ENEMYBATTSTATUS2 - ld a, [$fff3] ;whose turn? - and a - jr z, .next1 - ld hl, W_PLAYERBATTSTATUS2 -.next1 - bit 4, [hl] ;test bit 4 in d063/d068 flags - pop hl - ret - -Func_3fb89: ; 3fb89 (f:7b89) - ld a, [H_WHOSETURN] - and a - ld a, [W_PLAYERMOVENUM] - jr z, .asm_3fb94 - ld a, [W_ENEMYMOVENUM] -.asm_3fb94 - and a - ret z - -Func_3fb96: ; 3fb96 (f:7b96) - ld [W_ANIMATIONID], a - ld a, [H_WHOSETURN] - and a - ld a, $6 - jr z, .asm_3fba2 - ld a, $3 -.asm_3fba2 - ld [wcc5b], a - jp Func_3fbbc - -Func_3fba8: ; 3fba8 (f:7ba8) - xor a - ld [wcc5b], a - ld a, [H_WHOSETURN] - and a - ld a, [W_PLAYERMOVENUM] - jr z, .asm_3fbb7 - ld a, [W_ENEMYMOVENUM] -.asm_3fbb7 - and a - ret z - -Func_3fbb9: ; 3fbb9 (f:7bb9) - ld [W_ANIMATIONID], a - -Func_3fbbc: ; 3fbbc (f:7bbc) - push hl - push de - push bc - predef MoveAnimation - pop bc - pop de - pop hl - ret diff --git a/engine/menu/pokedex.asm.orig b/engine/menu/pokedex.asm.orig deleted file mode 100755 index 7d7d2b38..00000000 --- a/engine/menu/pokedex.asm.orig +++ /dev/null @@ -1,647 +0,0 @@ -ShowPokedexMenu: ; 40000 (10:4000) - call GBPalWhiteOut - call ClearScreen - call UpdateSprites ; move sprites - ld a,[wListScrollOffset] - push af - xor a - ld [wCurrentMenuItem],a - ld [wListScrollOffset],a - ld [wLastMenuItem],a - inc a - ld [wd11e],a - ld [hJoy7],a -.setUpGraphics - ld b,$08 - call GoPAL_SET - callab LoadPokedexTilePatterns -.doPokemonListMenu - ld hl,wTopMenuItemY - ld a,3 - ld [hli],a ; top menu item Y - xor a - ld [hli],a ; top menu item X - inc a - ld [wcc37],a - inc hl - inc hl - ld a,6 - ld [hli],a ; max menu item ID - ld [hl],%00110011 ; menu watched keys (Left, Right, B button, A button) - call HandlePokedexListMenu - jr c,.goToSideMenu ; if the player chose a pokemon from the list -.exitPokedex - xor a - ld [wcc37],a - ld [wCurrentMenuItem],a - ld [wLastMenuItem],a -<<<<<<< HEAD - ld [hJoy7],a - ld [wcd3a],a - ld [wcd3b],a -======= - ld [$ffb7],a - ld [wWastedByteCD3A],a - ld [wOverrideSimulatedJoypadStatesMask],a ->>>>>>> yama/master - pop af - ld [wListScrollOffset],a - call GBPalWhiteOutWithDelay3 - call GoPAL_SET_CF1C - jp ReloadMapData -.goToSideMenu - call HandlePokedexSideMenu - dec b - jr z,.exitPokedex ; if the player chose Quit - dec b - jr z,.doPokemonListMenu ; if pokemon not seen or player pressed B button - jp .setUpGraphics ; if pokemon data or area was shown - -; handles the menu on the lower right in the pokedex screen -; OUTPUT: -; b = reason for exiting menu -; 00: showed pokemon data or area -; 01: the player chose Quit -; 02: the pokemon has not been seen yet or the player pressed the B button -HandlePokedexSideMenu: ; 4006d (10:406d) - call PlaceUnfilledArrowMenuCursor - ld a,[wCurrentMenuItem] - push af - ld b,a - ld a,[wLastMenuItem] - push af - ld a,[wListScrollOffset] - push af - add b - inc a - ld [wd11e],a - ld a,[wd11e] - push af - ld a,[wWhichTrade] - push af - ld hl,wPokedexSeen - call IsPokemonBitSet - ld b,2 - jr z,.exitSideMenu - call PokedexToIndex - ld hl,wTopMenuItemY - ld a,10 - ld [hli],a ; top menu item Y - ld a,15 - ld [hli],a ; top menu item X - xor a - ld [hli],a ; current menu item ID - inc hl - ld a,3 - ld [hli],a ; max menu item ID - ld [hli],a ; menu watched keys (A button and B button) - xor a - ld [hli],a ; old menu item ID - ld [wcc37],a -.handleMenuInput - call HandleMenuInput - bit 1,a ; was the B button pressed? - ld b,2 - jr nz,.buttonBPressed - ld a,[wCurrentMenuItem] - and a - jr z,.choseData - dec a - jr z,.choseCry - dec a - jr z,.choseArea -.choseQuit - ld b,1 -.exitSideMenu - pop af - ld [wWhichTrade],a - pop af - ld [wd11e],a - pop af - ld [wListScrollOffset],a - pop af - ld [wLastMenuItem],a - pop af - ld [wCurrentMenuItem],a - push bc - hlCoord 0, 3 - ld de,20 - ld bc,$7f0d ; 13 blank tiles - call DrawTileLine ; cover up the menu cursor in the pokemon list - pop bc - ret -.buttonBPressed - push bc - hlCoord 15, 10 - ld de,20 - ld bc,$7f07 ; 7 blank tiles - call DrawTileLine ; cover up the menu cursor in the side menu - pop bc - jr .exitSideMenu -.choseData - call ShowPokedexDataInternal - ld b,0 - jr .exitSideMenu -; play pokemon cry -.choseCry - ld a,[wd11e] - call GetCryData ; get cry data - call PlaySound ; play sound - jr .handleMenuInput -.choseArea - predef LoadTownMap_Nest ; display pokemon areas - ld b,0 - jr .exitSideMenu - -; handles the list of pokemon on the left of the pokedex screen -; sets carry flag if player presses A, unsets carry flag if player presses B -HandlePokedexListMenu: ; 40111 (10:4111) - xor a - ld [H_AUTOBGTRANSFERENABLED],a -; draw the horizontal line separating the seen and owned amounts from the menu - hlCoord 15, 8 - ld a,$7a ; horizontal line tile - ld [hli],a - ld [hli],a - ld [hli],a - ld [hli],a - ld [hli],a - hlCoord 14, 0 - ld [hl],$71 ; vertical line tile - hlCoord 14, 1 - call DrawPokedexVerticalLine - hlCoord 14, 9 - call DrawPokedexVerticalLine - ld hl,wPokedexSeen - ld b,wPokedexSeenEnd - wPokedexSeen - call CountSetBits - ld de,wd11e - hlCoord 16, 3 - ld bc,$0103 - call PrintNumber ; print number of seen pokemon - ld hl,wPokedexOwned - ld b,wPokedexOwnedEnd - wPokedexOwned - call CountSetBits - ld de,wd11e - hlCoord 16, 6 - ld bc,$0103 - call PrintNumber ; print number of owned pokemon - hlCoord 16, 2 - ld de,PokedexSeenText - call PlaceString - hlCoord 16, 5 - ld de,PokedexOwnText - call PlaceString - hlCoord 1, 1 - ld de,PokedexContentsText - call PlaceString - hlCoord 16, 10 - ld de,PokedexMenuItemsText - call PlaceString -; find the highest pokedex number among the pokemon the player has seen - ld hl,wPokedexSeenEnd - 1 - ld b,153 -.maxSeenPokemonLoop - ld a,[hld] - ld c,8 -.maxSeenPokemonInnerLoop - dec b - sla a - jr c,.storeMaxSeenPokemon - dec c - jr nz,.maxSeenPokemonInnerLoop - jr .maxSeenPokemonLoop -.storeMaxSeenPokemon - ld a,b - ld [wWhichTrade],a ; max seen pokemon -.loop - xor a - ld [H_AUTOBGTRANSFERENABLED],a - hlCoord 4, 2 - ld bc,$0e0a - call ClearScreenArea - hlCoord 1, 3 - ld a,[wListScrollOffset] - ld [wd11e],a - ld d,7 - ld a,[wWhichTrade] - cp a,7 - jr nc,.printPokemonLoop - ld d,a - dec a - ld [wMaxMenuItem],a -; loop to print pokemon pokedex numbers and names -; if the player has owned the pokemon, it puts a pokeball beside the name -.printPokemonLoop - ld a,[wd11e] - inc a - ld [wd11e],a - push af - push de - push hl - ld de,-20 - add hl,de - ld de,wd11e - ld bc,$8103 - call PrintNumber ; print the pokedex number - ld de,20 - add hl,de - dec hl - push hl - ld hl,wPokedexOwned - call IsPokemonBitSet - pop hl - ld a," " - jr z,.writeTile - ld a,$72 ; pokeball tile -.writeTile - ld [hl],a ; put a pokeball next to pokemon that the player has owned - push hl - ld hl,wPokedexSeen - call IsPokemonBitSet - jr nz,.getPokemonName ; if the player has seen the pokemon - ld de,.dashedLine ; print a dashed line in place of the name if the player hasn't seen the pokemon - jr .skipGettingName -.dashedLine ; for unseen pokemon in the list - db "----------@" -.getPokemonName - call PokedexToIndex - call GetMonName -.skipGettingName - pop hl - inc hl - call PlaceString - pop hl - ld bc,2 * 20 - add hl,bc - pop de - pop af - ld [wd11e],a - dec d - jr nz,.printPokemonLoop - ld a,01 - ld [H_AUTOBGTRANSFERENABLED],a - call Delay3 - call GBPalNormal - call HandleMenuInput - bit 1,a ; was the B button pressed? - jp nz,.buttonBPressed -.checkIfUpPressed - bit 6,a ; was Up pressed? - jr z,.checkIfDownPressed -.upPressed ; scroll up one row - ld a,[wListScrollOffset] - and a - jp z,.loop - dec a - ld [wListScrollOffset],a - jp .loop -.checkIfDownPressed - bit 7,a ; was Down pressed? - jr z,.checkIfRightPressed -.downPressed ; scroll down one row - ld a,[wWhichTrade] - cp a,7 - jp c,.loop - sub a,7 - ld b,a - ld a,[wListScrollOffset] - cp b - jp z,.loop - inc a - ld [wListScrollOffset],a - jp .loop -.checkIfRightPressed - bit 4,a ; was Right pressed? - jr z,.checkIfLeftPressed -.rightPressed ; scroll down 7 rows - ld a,[wWhichTrade] - cp a,7 - jp c,.loop - sub a,6 - ld b,a - ld a,[wListScrollOffset] - add a,7 - ld [wListScrollOffset],a - cp b - jp c,.loop - dec b - ld a,b - ld [wListScrollOffset],a - jp .loop -.checkIfLeftPressed ; scroll up 7 rows - bit 5,a ; was Left pressed? - jr z,.buttonAPressed -.leftPressed - ld a,[wListScrollOffset] - sub a,7 - ld [wListScrollOffset],a - jp nc,.loop - xor a - ld [wListScrollOffset],a - jp .loop -.buttonAPressed - scf - ret -.buttonBPressed - and a - ret - -DrawPokedexVerticalLine: ; 4028e (10:428e) - ld c,9 ; height of line - ld de,20 ; width of screen - ld a,$71 ; vertical line tile -.loop - ld [hl],a - add hl,de - xor a,1 ; toggle between vertical line tile and box tile - dec c - jr nz,.loop - ret - -PokedexSeenText: ; 4029d (10:429d) - db "SEEN@" - -PokedexOwnText: ; 402a2 (10:42a2) - db "OWN@" - -PokedexContentsText: ; 402a6 (10:42a6) - db "CONTENTS@" - -PokedexMenuItemsText: ; 402af (10:42af) - db "DATA" - next "CRY" - next "AREA" - next "QUIT@" - -; tests if a pokemon's bit is set in the seen or owned pokemon bit fields -; INPUT: -; [wd11e] = pokedex number -; hl = address of bit field -IsPokemonBitSet: ; 402c2 (10:42c2) - ld a,[wd11e] - dec a - ld c,a - ld b,2 - predef FlagActionPredef - ld a,c - and a - ret - -; function to display pokedex data from outside the pokedex -ShowPokedexData: ; 402d1 (10:42d1) - call GBPalWhiteOutWithDelay3 - call ClearScreen - call UpdateSprites - callab LoadPokedexTilePatterns ; load pokedex tiles - -; function to display pokedex data from inside the pokedex -ShowPokedexDataInternal: ; 402e2 (10:42e2) - ld hl,wd72c - set 1,[hl] - ld a,$33 ; 3/7 volume - ld [$ff24],a - call GBPalWhiteOut ; zero all palettes - call ClearScreen - ld a,[wd11e] ; pokemon ID - ld [wcf91],a - push af - ld b,04 - call GoPAL_SET - pop af - ld [wd11e],a - ld a,[hTilesetType] - push af - xor a - ld [hTilesetType],a - hlCoord 0, 0 - ld de,1 - ld bc,$6414 - call DrawTileLine ; draw top border - hlCoord 0, 17 - ld b,$6f - call DrawTileLine ; draw bottom border - hlCoord 0, 1 - ld de,20 - ld bc,$6610 - call DrawTileLine ; draw left border - hlCoord 19, 1 - ld b,$67 - call DrawTileLine ; draw right border - ld a,$63 ; upper left corner tile - Coorda 0, 0 - ld a,$65 ; upper right corner tile - Coorda 19, 0 - ld a,$6c ; lower left corner tile - Coorda 0, 17 - ld a,$6e ; lower right corner tile - Coorda 19, 17 - hlCoord 0, 9 - ld de,PokedexDataDividerLine - call PlaceString ; draw horizontal divider line - hlCoord 9, 6 - ld de,HeightWeightText - call PlaceString - call GetMonName - hlCoord 9, 2 - call PlaceString - ld hl,PokedexEntryPointers - ld a,[wd11e] - dec a - ld e,a - ld d,0 - add hl,de - add hl,de - ld a,[hli] - ld e,a - ld d,[hl] ; de = address of pokedex entry - hlCoord 9, 4 - call PlaceString ; print species name - ld h,b - ld l,c - push de - ld a,[wd11e] - push af - call IndexToPokedex - hlCoord 2, 8 - ld a, "№" - ld [hli],a - ld a,$f2 - ld [hli],a - ld de,wd11e - ld bc,$8103 - call PrintNumber ; print pokedex number - ld hl,wPokedexOwned - call IsPokemonBitSet - pop af - ld [wd11e],a - ld a,[wcf91] - ld [wd0b5],a - pop de - push af - push bc - push de - push hl - call Delay3 - call GBPalNormal - call GetMonHeader ; load pokemon picture location - hlCoord 1, 1 - call LoadFlippedFrontSpriteByMonIndex ; draw pokemon picture - ld a,[wcf91] - call PlayCry ; play pokemon cry - pop hl - pop de - pop bc - pop af - ld a,c - and a - jp z,.waitForButtonPress ; if the pokemon has not been owned, don't print the height, weight, or description - inc de ; de = address of feet (height) - ld a,[de] ; reads feet, but a is overwritten without being used - hlCoord 12, 6 - ld bc,$0102 - call PrintNumber ; print feet (height) - ld a,$60 ; feet symbol tile (one tick) - ld [hl],a - inc de - inc de ; de = address of inches (height) - hlCoord 15, 6 - ld bc,$8102 - call PrintNumber ; print inches (height) - ld a,$61 ; inches symbol tile (two ticks) - ld [hl],a -; now print the weight (note that weight is stored in tenths of pounds internally) - inc de - inc de - inc de ; de = address of upper byte of weight - push de -; put weight in big-endian order at $ff8b - ld hl,$ff8b - ld a,[hl] ; save existing value of [$ff8b] - push af - ld a,[de] ; a = upper byte of weight - ld [hli],a ; store upper byte of weight in [$ff8b] - ld a,[hl] ; save existing value of [$ff8c] - push af - dec de - ld a,[de] ; a = lower byte of weight - ld [hl],a ; store lower byte of weight in [$ff8c] - ld de,$ff8b - hlCoord 11, 8 - ld bc,$0205 ; no leading zeroes, right-aligned, 2 bytes, 5 digits - call PrintNumber ; print weight - hlCoord 14, 8 - ld a,[$ff8c] - sub a,10 - ld a,[$ff8b] - sbc a,0 - jr nc,.next - ld [hl],"0" ; if the weight is less than 10, put a 0 before the decimal point -.next - inc hl - ld a,[hli] - ld [hld],a ; make space for the decimal point by moving the last digit forward one tile - ld [hl],$f2 ; decimal point tile - pop af - ld [$ff8c],a ; restore original value of [$ff8c] - pop af - ld [$ff8b],a ; restore original value of [$ff8b] - pop hl - inc hl ; hl = address of pokedex description text - bcCoord 1, 11 - ld a,2 - ld [$fff4],a - call TextCommandProcessor ; print pokedex description text - xor a - ld [$fff4],a -.waitForButtonPress - call JoypadLowSensitivity - ld a,[hJoy5] - and a,%00000011 ; A button and B button - jr z,.waitForButtonPress - pop af - ld [hTilesetType],a - call GBPalWhiteOut - call ClearScreen - call GoPAL_SET_CF1C - call LoadTextBoxTilePatterns - call GBPalNormal - ld hl,wd72c - res 1,[hl] - ld a,$77 ; max volume - ld [$ff24],a - ret - -HeightWeightText: ; 40448 (10:4448) - db "HT ?",$60,"??",$61,$4E,"WT ???lb@" - -; XXX does anything point to this? -Unknown_4045D: ; 4045d (10:445d) - db $54,$50 - -; horizontal line that divides the pokedex text description from the rest of the data -PokedexDataDividerLine: ; 4045f (10:445f) - db $68,$69,$6B,$69,$6B - db $69,$6B,$69,$6B,$6B - db $6B,$6B,$69,$6B,$69 - db $6B,$69,$6B,$69,$6A - db $50 - -; draws a line of tiles -; INPUT: -; b = tile ID -; c = number of tile ID's to write -; de = amount to destination address after each tile (1 for horizontal, 20 for vertical) -; hl = destination address -DrawTileLine: ; 40474 (10:4474) - push bc - push de -.loop - ld [hl],b - add hl,de - dec c - jr nz,.loop - pop de - pop bc - ret - -INCLUDE "data/pokedex_entries.asm" - -PokedexToIndex: ; 40ff9 (10:4ff9) - ; converts the Pokédex number at wd11e to an index - push bc - push hl - ld a,[wd11e] - ld b,a - ld c,0 - ld hl,PokedexOrder - -.loop ; go through the list until we find an entry with a matching dex number - inc c - ld a,[hli] - cp b - jr nz,.loop - - ld a,c - ld [wd11e],a - pop hl - pop bc - ret - -IndexToPokedex: ; 41010 (10:5010) - ; converts the indexédex number at wd11e to a Pokédex number - push bc - push hl - ld a,[wd11e] - dec a - ld hl,PokedexOrder - ld b,0 - ld c,a - add hl,bc - ld a,[hl] - ld [wd11e],a - pop hl - pop bc - ret - -INCLUDE "data/pokedex_order.asm" diff --git a/engine/town_map.asm.orig b/engine/town_map.asm.orig deleted file mode 100755 index 9ccc03c0..00000000 --- a/engine/town_map.asm.orig +++ /dev/null @@ -1,605 +0,0 @@ -DisplayTownMap: ; 70e3e (1c:4e3e) - call LoadTownMap - ld hl, wUpdateSpritesEnabled - ld a, [hl] - push af - ld [hl], $ff - push hl - ld a, $1 - ld [hJoy7], a - ld a, [W_CURMAP] ; W_CURMAP - push af - ld b, $0 - call Func_711c4 - hlCoord 1, 0 - ld de, wcd6d - call PlaceString - ld hl, wOAMBuffer - ld de, wTileMapBackup - ld bc, $10 - call CopyData - ld hl, vSprites + $40 - ld de, TownMapCursor ; $4f40 - ld bc, (BANK(TownMapCursor) << 8) + $04 - call CopyVideoDataDouble - xor a - ld [wWhichTrade], a ; wWhichTrade - pop af - jr Func_70e92 - -Func_70e7e: ; 70e7e (1c:4e7e) - ld hl, wTileMap - ld bc, $114 - call ClearScreenArea - ld hl, TownMapOrder ; $4f11 - ld a, [wWhichTrade] ; wWhichTrade - ld c, a - ld b, $0 - add hl, bc - ld a, [hl] - -Func_70e92: ; 70e92 (1c:4e92) - ld de, wHPBarMaxHP - call Func_712f1 - ld a, [de] - push hl - call Func_71258 - ld a, $4 - ld [wcd5b], a - ld hl, wOAMBuffer + $10 - call Func_71279 - pop hl - ld de, wcd6d -.asm_70eac - ld a, [hli] - ld [de], a - inc de - cp $50 - jr nz, .asm_70eac - hlCoord 1, 0 - ld de, wcd6d - call PlaceString - ld hl, wOAMBuffer + $10 - ld de, wTileMapBackup + 16 - ld bc, $10 - call CopyData -.asm_70ec8 - call TownMapSpriteBlinkingAnimation - call JoypadLowSensitivity - ld a, [hJoy5] - ld b, a - and $c3 - jr z, .asm_70ec8 - ld a, (SFX_02_3c - SFX_Headers_02) / 3 - call PlaySound - bit 6, b - jr nz, .asm_70ef2 - bit 7, b - jr nz, .asm_70f01 - xor a -<<<<<<< HEAD - ld [wd09b], a - ld [hJoy7], a - ld [W_SUBANIMTRANSFORM], a ; W_SUBANIMTRANSFORM -======= - ld [wTownMapSpriteBlinkingEnabled], a - ld [$ffb7], a - ld [wTownMapSpriteBlinkingCounter], a ->>>>>>> yama/master - call Func_711ab - pop hl - pop af - ld [hl], a - ret -.asm_70ef2 - ld a, [wWhichTrade] ; wWhichTrade - inc a - cp $2f - jr nz, .asm_70efb - xor a -.asm_70efb - ld [wWhichTrade], a ; wWhichTrade - jp Func_70e7e -.asm_70f01 - ld a, [wWhichTrade] ; wWhichTrade - dec a - cp $ff - jr nz, .asm_70f0b - ld a, $2e -.asm_70f0b - ld [wWhichTrade], a ; wWhichTrade - jp Func_70e7e - -INCLUDE "data/town_map_order.asm" - -TownMapCursor: ; 70f40 (1c:4f40) - INCBIN "gfx/town_map_cursor.1bpp" - -LoadTownMap_Nest: ; 70f60 (1c:4f60) - call LoadTownMap - ld hl, wUpdateSpritesEnabled - ld a, [hl] - push af - ld [hl], $ff - push hl - call Func_711ef - call GetMonName - hlCoord 1, 0 - call PlaceString - ld h, b - ld l, c - ld de, MonsNestText - call PlaceString - call WaitForTextScrollButtonPress - call Func_711ab - pop hl - pop af - ld [hl], a - ret - -MonsNestText: ; 70f89 (1c:4f89) - db "'s NEST@" - -LoadTownMap_Fly: ; 70f90 (1c:4f90) - call ClearSprites - call LoadTownMap - call LoadPlayerSpriteGraphics - call LoadFontTilePatterns - ld de, BirdSprite ; $4d80 - ld hl, vSprites + $40 - ld bc, (BANK(BirdSprite) << 8) + $0c - call CopyVideoData - ld de, TownMapUpArrow ; $5093 - ld hl, vChars1 + $6d0 - ld bc, (BANK(TownMapUpArrow) << 8) + $01 - call CopyVideoDataDouble - call Func_71070 - ld hl, wUpdateSpritesEnabled - ld a, [hl] - push af - ld [hl], $ff - push hl - ld hl, wTileMap - ld de, ToText - call PlaceString - ld a, [W_CURMAP] ; W_CURMAP - ld b, $0 - call Func_711c4 - ld hl, wTrainerEngageDistance - deCoord 18, 0 - -.townMapFlyLoop - ld a, $7f - ld [de], a - push hl - push hl - hlCoord 3, 0 - ld bc, $10f - call ClearScreenArea - pop hl - ld a, [hl] - ld b, $4 - call Func_711c4 - hlCoord 3, 0 - ld de, wcd6d - call PlaceString - ld c, $f - call DelayFrames - hlCoord 18, 0 - ld [hl], $ed - hlCoord 19, 0 - ld [hl], $ee - pop hl -.asm_71004 - push hl - call DelayFrame - call JoypadLowSensitivity - ld a, [hJoy5] - ld b, a - pop hl - and $c3 - jr z, .asm_71004 - bit 0, b - jr nz, .asm_71026 - ld a, (SFX_02_3c - SFX_Headers_02) / 3 - call PlaySound - bit 6, b - jr nz, .asm_71042 - bit 7, b - jr nz, .asm_71058 - jr .asm_71037 -.asm_71026 - ld a, (SFX_02_3e - SFX_Headers_02) / 3 - call PlaySound - ld a, [hl] - ld [wDestinationMap], a - ld hl, wd732 - set 3, [hl] - inc hl - set 7, [hl] -.asm_71037 - xor a - ld [wTownMapSpriteBlinkingEnabled], a - call GBPalWhiteOutWithDelay3 - pop hl - pop af - ld [hl], a - ret -.asm_71042 - deCoord 18, 0 - inc hl - ld a, [hl] - cp $ff - jr z, .asm_71052 - cp $fe - jr z, .asm_71042 - jp .townMapFlyLoop -.asm_71052 - ld hl, wTrainerEngageDistance - jp .townMapFlyLoop -.asm_71058 - deCoord 19, 0 - dec hl - ld a, [hl] - cp $ff - jr z, .asm_71068 - cp $fe - jr z, .asm_71058 - jp .townMapFlyLoop -.asm_71068 - ld hl, wcd49 - jr .asm_71058 - -ToText: ; 7106d (1c:506d) - db "To@" - -Func_71070: ; 71070 (1c:5070) - ld hl, wWhichTrade ; wWhichTrade - ld [hl], $ff - inc hl - ld a, [W_TOWNVISITEDFLAG] - ld e, a - ld a, [W_TOWNVISITEDFLAG + 1] - ld d, a - ld bc, $b -.asm_71081 - srl d - rr e - ld a, $fe - jr nc, .asm_7108a - ld a, b -.asm_7108a - ld [hl], a - inc hl - inc b - dec c - jr nz, .asm_71081 - ld [hl], $ff - ret - -TownMapUpArrow: ; 71093 (1c:5093) - INCBIN "gfx/up_arrow.1bpp" - -LoadTownMap: ; 7109b (1c:509b) - call GBPalWhiteOutWithDelay3 - call ClearScreen - call UpdateSprites - ld hl, wTileMap - ld b, $12 - ld c, $12 - call TextBoxBorder - call DisableLCD - ld hl, WorldMapTileGraphics ; $65a8 - ld de, vChars2 + $600 - ld bc, $100 - ld a, BANK(WorldMapTileGraphics) - call FarCopyData2 - ld hl, MonNestIcon ; $56be - ld de, vSprites + $40 - ld bc, $8 - ld a, BANK(MonNestIcon) - call FarCopyDataDouble - ld hl, wTileMap - ld de, CompressedMap ; $5100 -.asm_710d3 - ld a, [de] - and a - jr z, .asm_710e9 - ld b, a - and $f - ld c, a - ld a, b - swap a - and $f - add $60 -.asm_710e2 - ld [hli], a - dec c - jr nz, .asm_710e2 - inc de - jr .asm_710d3 -.asm_710e9 - call EnableLCD - ld b, $2 - call GoPAL_SET - call Delay3 - call GBPalNormal - xor a - ld [wTownMapSpriteBlinkingCounter], a - inc a - ld [wTownMapSpriteBlinkingEnabled], a - ret - -CompressedMap: ; 71100 (1c:5100) -; you can decompress this file with the redrle program in the extras/ dir - INCBIN "gfx/town_map.rle" - -Func_711ab: ; 711ab (1c:51ab) - xor a - ld [wTownMapSpriteBlinkingEnabled], a - call GBPalWhiteOut - call ClearScreen - call ClearSprites - call LoadPlayerSpriteGraphics - call LoadFontTilePatterns - call UpdateSprites - jp GoPAL_SET_CF1C - -Func_711c4: ; 711c4 (1c:51c4) - push af - ld a, b - ld [wcd5b], a - pop af - ld de, wHPBarMaxHP - call Func_712f1 - ld a, [de] - push hl - call Func_71258 - call Func_7126d - pop hl - ld de, wcd6d -.asm_711dc - ld a, [hli] - ld [de], a - inc de - cp $50 - jr nz, .asm_711dc - ld hl, wOAMBuffer - ld de, wTileMapBackup - ld bc, $a0 - jp CopyData - -Func_711ef: ; 711ef (1c:51ef) - callba Func_e9cb - call Func_712d9 - ld hl, wOAMBuffer - ld de, wHPBarMaxHP -.asm_71200 - ld a, [de] - cp $ff - jr z, .asm_7121d - and a - jr z, .asm_7121a - push hl - call Func_712f1 - pop hl - ld a, [de] - cp $19 - jr z, .asm_7121a - call Func_71258 - ld a, $4 - ld [hli], a - xor a - ld [hli], a -.asm_7121a - inc de - jr .asm_71200 -.asm_7121d - ld a, l - and a - jr nz, .asm_71236 - hlCoord 1, 7 - ld b, $2 - ld c, $f - call TextBoxBorder - hlCoord 2, 9 - ld de, AreaUnknownText - call PlaceString - jr .asm_7123e -.asm_71236 - ld a, [W_CURMAP] ; W_CURMAP - ld b, $0 - call Func_711c4 -.asm_7123e - ld hl, wOAMBuffer - ld de, wTileMapBackup - ld bc, $a0 - jp CopyData - -AreaUnknownText: ; 7124a (1c:524a) - db " AREA UNKNOWN@" - -Func_71258: ; 71258 (1c:5258) - push af - and $f0 - srl a - add $18 - ld b, a - ld [hli], a - pop af - and $f - swap a - srl a - add $18 - ld c, a - ld [hli], a - ret - -Func_7126d: ; 7126d (1c:526d) - ld a, [wcd5b] - and a - ld hl, wOAMBuffer + $90 - jr z, Func_71279 - ld hl, wOAMBuffer + $80 - -Func_71279: ; 71279 (1c:5279) - push hl - ld hl, $fcfc - add hl, bc - ld b, h - ld c, l - pop hl - -Func_71281: ; 71281 (1c:5281) - ld de, $202 -.asm_71284 - push de - push bc -.asm_71286 - ld a, b - ld [hli], a - ld a, c - ld [hli], a - ld a, [wcd5b] - ld [hli], a - inc a - ld [wcd5b], a - xor a - ld [hli], a - inc d - ld a, $8 - add c - ld c, a - dec e - jr nz, .asm_71286 - pop bc - pop de - ld a, $8 - add b - ld b, a - dec d - jr nz, .asm_71284 - ret - -Func_712a6: ; 712a6 (1c:52a6) - xor a - ld [wcd5c], a - ld de, $202 -.asm_712ad - push de - push bc -.asm_712af - ld a, b - ld [hli], a - ld a, c - ld [hli], a - ld a, [wcd5b] - ld [hli], a - ld a, [wcd5c] - ld [hli], a - xor $20 - ld [wcd5c], a - inc d - ld a, $8 - add c - ld c, a - dec e - jr nz, .asm_712af - pop bc - pop de - push hl - ld hl, wcd5b - inc [hl] - inc [hl] - pop hl - ld a, $8 - add b - ld b, a - dec d - jr nz, .asm_712ad - ret - -Func_712d9: ; 712d9 (1c:52d9) - ld de, wHPBarMaxHP -.asm_712dc - ld a, [de] - inc de - cp $ff - ret z - ld c, a - ld l, e - ld h, d -.asm_712e4 - ld a, [hl] - cp $ff - jr z, .asm_712dc - cp c - jr nz, .asm_712ee - xor a - ld [hl], a -.asm_712ee - inc hl - jr .asm_712e4 - -Func_712f1: ; 712f1 (1c:52f1) - cp REDS_HOUSE_1F - jr c, .asm_71304 - ld bc, $4 - ld hl, InternalMapEntries ; $5382 -.asm_712fb - cp [hl] - jr c, .asm_71301 - add hl, bc - jr .asm_712fb -.asm_71301 - inc hl - jr .asm_7130d -.asm_71304 - ld hl, ExternalMapEntries ; $5313 - ld c, a - ld b, $0 - add hl, bc - add hl, bc - add hl, bc -.asm_7130d - ld a, [hli] - ld [de], a - ld a, [hli] - ld h, [hl] - ld l, a - ret - -INCLUDE "data/town_map_entries.asm" - -INCLUDE "text/map_names.asm" - -MonNestIcon: ; 716be (1c:56be) - INCBIN "gfx/mon_nest_icon.1bpp" - -TownMapSpriteBlinkingAnimation: ; 716c6 (1c:56c6) - ld a, [wTownMapSpriteBlinkingCounter] - inc a - cp 25 - jr z, .hideSprites - cp 50 - jr nz, .done -; show sprites when the counter reaches 50 - ld hl, wTileMapBackup - ld de, wOAMBuffer - ld bc, $90 - call CopyData - xor a - jr .done -.hideSprites - ld hl, wOAMBuffer - ld b, $24 - ld de, $4 -.hideSpritesLoop - ld [hl], $a0 - add hl, de - dec b - jr nz, .hideSpritesLoop - ld a, 25 -.done - ld [wTownMapSpriteBlinkingCounter], a - jp DelayFrame |