pokered/engine/battle/core.asm
2014-05-29 01:31:46 -07:00

8554 lines
158 KiB
NASM
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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, stataffecting or statuscausing 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
Func_3c04c: ; 3c04c (f:404c)
call Func_3ec92
ld a, $1
ld [wd125], a
call DisplayTextBoxID
FuncCoord 1, 5
ld hl, Coord
ld bc, $307
call ClearScreenArea
call DisableLCD
call LoadFontTilePatterns
call Func_3ee58
ld hl, vBGMap0
ld bc, $400
.asm_3c06f
ld a, $7f
ld [hli], a
dec bc
ld a, b
or c
jr nz, .asm_3c06f
ld hl, wTileMap
ld de, vBGMap0
ld b, $12
.asm_3c07f
ld c, $14
.asm_3c081
ld a, [hli]
ld [de], a
inc e
dec c
jr nz, .asm_3c081
ld a, $c
add e
ld e, a
jr nc, .asm_3c08e
inc d
.asm_3c08e
dec b
jr nz, .asm_3c07f
call EnableLCD
ld a, $90
ld [$ffb0], a
ld [rWY], a ; $ff4a
xor a
ld [$ffd7], a
ld [$ffaf], a
dec a
ld [wcfcb], a
call Delay3
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld b, $70
ld c, $90
ld a, c
ld [$ffae], a
call DelayFrame
ld a, $e4
ld [rBGP], a ; $ff47
ld [rOBP0], a ; $ff48
ld [rOBP1], a ; $ff49
.asm_3c0bb
ld h, b
ld l, $40
call Func_3c110
inc b
inc b
ld h, $0
ld l, $60
call Func_3c110
call Func_3c0ff
ld a, c
ld [$ffae], a
dec c
dec c
jr nz, .asm_3c0bb
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld a, $31
ld [$ffe1], a
FuncCoord 1, 5
ld hl, Coord
ld a, $1
call Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6))
xor a
ld [$ffb0], a
ld [rWY], a ; $ff4a
inc a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
call Delay3
ld b, $1
call GoPAL_SET
call HideSprites
ld hl, PrintBeginningBattleText
ld b, BANK(PrintBeginningBattleText)
jp Bankswitch
Func_3c0ff: ; 3c0ff (f:40ff)
push bc
ld hl, wOAMBuffer + $01
ld c, $15
ld de, $4
.asm_3c108
dec [hl]
dec [hl]
add hl, de
dec c
jr nz, .asm_3c108
pop bc
ret
Func_3c110: ; 3c110 (f:4110)
ld a, [$ff44]
cp l
jr nz, Func_3c110
ld a, h
ld [rSCX], a ; $ff43
.asm_3c118
ld a, [$ff44]
cp h
jr z, .asm_3c118
ret
Func_3c11e: ; 3c11e (f:411e)
xor a
ld [W_PLAYERMONSALIVEFLAGS], a
ld [wccf5], a
ld [wcd6a], a
inc a
ld [wd11d], a
ld hl, W_ENEMYMON1HP ; wd8a5
ld bc, $2b
ld d, $3
.asm_3c134
inc d
ld a, [hli]
or [hl]
jr nz, .asm_3c13c
add hl, bc
jr .asm_3c134
.asm_3c13c
ld a, d
ld [wcc3e], a
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
call nz, Func_3c92a
ld c, $28
call DelayFrames
call SaveScreenTilesToBuffer1
.asm_3c14f
call AnyPlayerPokemonAliveCheck
ld a, d
and a
jp z, HandlePlayerBlackOut
call LoadScreenTilesFromBuffer1
ld a, [W_BATTLETYPE] ; wd05a
and a
jp z, Func_3c1ad
.asm_3c161
call InitBattleMenu
ret c
ld a, [wcd6a]
and a
jr z, .asm_3c161
ld a, [W_NUMSAFARIBALLS] ; W_NUMSAFARIBALLS
and a
jr nz, .asm_3c17a
call LoadScreenTilesFromBuffer1
ld hl, OutOfSafariBallsText
jp PrintText
.asm_3c17a
callab PrintSafariZoneBattleText
ld a, [W_ENEMYMONSPEED + 1]
add a
ld b, a
jp c, asm_3c202
ld a, [wcce9]
and a
jr z, .asm_3c194
srl b
srl b
.asm_3c194
ld a, [wcce8]
and a
jr z, .asm_3c1a0
sla b
jr nc, .asm_3c1a0
ld b, $ff
.asm_3c1a0
call Random
cp b
jr nc, .asm_3c14f
jr asm_3c202
OutOfSafariBallsText: ; 3c1a8 (f:41a8)
TX_FAR _OutOfSafariBallsText
db "@"
Func_3c1ad: ; 3c1ad (f:41ad)
xor a
ld [wWhichPokemon], a ; wWhichPokemon
.asm_3c1b1
call Func_3ca97
jr nz, .asm_3c1bc
ld hl, wWhichPokemon ; wWhichPokemon
inc [hl]
jr .asm_3c1b1
.asm_3c1bc
ld a, [wWhichPokemon] ; wWhichPokemon
ld [wPlayerMonNumber], a ; wPlayerMonNumber
inc a
ld hl, W_NUMINPARTY ; W_NUMINPARTY
ld c, a
ld b, $0
add hl, bc
ld a, [hl]
ld [wcf91], a
ld [wcfd9], a
call LoadScreenTilesFromBuffer1
FuncCoord 1, 5
ld hl, Coord
ld a, $9
call Func_3c8df
call SaveScreenTilesToBuffer1
ld a, [wWhichPokemon] ; wWhichPokemon
ld c, a
ld b, $1
push bc
ld hl, W_PLAYERMONSALIVEFLAGS
ld a, $10 ; FlagActionPredef
call Predef
ld hl, wccf5
pop bc
ld a, $10 ; FlagActionPredef
call Predef
call Func_3cba6
call LoadScreenTilesFromBuffer1
call Func_3cc91
jr MainInBattleLoop
asm_3c202: ; 3c202 (f:4202)
call LoadScreenTilesFromBuffer1
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
ld hl, WildRanText
jr nz, .asm_3c216
xor a
ld [wcf0b], a
ld hl, EnemyRanText
.asm_3c216
call PrintText
ld a, (SFX_08_44 - SFX_Headers_08) / 3
call PlaySoundWaitForCurrent
xor a
ld [H_WHOSETURN], a ; $fff3
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, W_PLAYERMONCURHP
ld a, [hli]
or [hl]
jp z, HandlePlayerMonFainted ; test if current player mon is fainted
ld hl, W_ENEMYMONCURHP
ld a, [hli]
or [hl]
jp z, HandleEnemyMonFainted
call SaveScreenTilesToBuffer1
xor a
ld [wd11d], a
ld a, [W_PLAYERBATTSTATUS2]
and $60
jr nz, .asm_3c2a6 ; 0x3c252 $52
ld hl, W_ENEMYBATTSTATUS1
res 3, [hl]
ld hl, W_PLAYERBATTSTATUS1
res 3, [hl]
ld a, [hl]
and $12
jr nz, .asm_3c2a6 ; 0x3c261 $43
call InitBattleMenu ; show battle menu
ret c
ld a, [wd078]
and a
ret nz
ld a, [W_PLAYERMONSTATUS]
and $27
jr nz, .asm_3c2a6 ; 0x3c271 $33
ld a, [W_PLAYERBATTSTATUS1]
and $21
jr nz, .asm_3c2a6 ; 0x3c278 $2c
ld a, [W_ENEMYBATTSTATUS1]
bit 5, a
jr z, .asm_3c288 ; 0x3c27f $7
ld a, $ff
ld [wPlayerSelectedMove], a
jr .asm_3c2a6 ; 0x3c286 $1e
.asm_3c288
ld a, [wcd6a]
and a
jr nz, .asm_3c2a6 ; 0x3c28c $18
ld [wMoveMenuType], a
inc a
ld [W_ANIMATIONID], a
xor a
ld [wcc35], a
call MoveSelectionMenu
push af
call LoadScreenTilesFromBuffer1
call Func_3cd5a
pop af
jr nz, MainInBattleLoop
.asm_3c2a6
call SelectEnemyMove
ld a, [W_ISLINKBATTLE]
cp $4
jr nz, .noLinkBattle
ld a, [wcc3e]
cp $f
jp z, asm_3c202
cp $e
jr z, .noLinkBattle
cp $d
jr z, .noLinkBattle
sub $4
jr c, .noLinkBattle
ld a, [W_PLAYERBATTSTATUS1]
bit 5, a
jr z, .asm_3c2dd ; 0x3c2c9 $12
ld a, [wPlayerMoveListIndex]
ld hl, W_PLAYERMONMOVES
ld c, a
ld b, $0
add hl, bc
ld a, [hl]
cp $76
jr nz, .asm_3c2dd ; 0x3c2d8 $3
ld [wPlayerSelectedMove], a
.asm_3c2dd
callab Func_3a74b
.noLinkBattle
ld a, [wPlayerSelectedMove]
cp QUICK_ATTACK
jr nz, .playerDidNotUseQuickAttack
ld a, [wEnemySelectedMove]
cp QUICK_ATTACK
jr z, .compareSpeed ; both used Quick Attack
jp .playerMovesFirst ; player used Quick Attack
.playerDidNotUseQuickAttack
ld a, [wEnemySelectedMove]
cp QUICK_ATTACK
jr z, .enemyMovesFirst
ld a, [wPlayerSelectedMove]
cp COUNTER
jr nz, .playerDidNotUseCounter
ld a, [wEnemySelectedMove]
cp COUNTER
jr z, .compareSpeed ; both used Counter
jr .enemyMovesFirst ; player used Counter
.playerDidNotUseCounter
ld a, [wEnemySelectedMove]
cp COUNTER
jr z, .playerMovesFirst
.compareSpeed
ld de, W_PLAYERMONSPEED ; player speed value
ld hl, W_ENEMYMONSPEED ; enemy speed value
ld c, $2
call StringCmp ; compare speed values
jr z, .speedEqual
jr nc, .playerMovesFirst
jr .enemyMovesFirst
.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 Func_3e6bc ; execute enemy move
ld a, [wd078]
and a
ret nz
ld a, b
and a
jp z, HandlePlayerMonFainted
.AIActionUsedEnemyFirst
call HandlePoisonBurnLeechSeed
jp z, HandleEnemyMonFainted
call Func_3cd5a
call Func_3d65e ; execute player move
ld a, [wd078]
and a
ret nz
ld a, b
and a
jp z, HandleEnemyMonFainted
call HandlePoisonBurnLeechSeed
jp z, HandlePlayerMonFainted
call Func_3cd5a
call Func_3c50f
jp MainInBattleLoop
.playerMovesFirst
call Func_3d65e ; execute player move
ld a, [wd078]
and a
ret nz
ld a, b
and a
jp z, HandleEnemyMonFainted
call HandlePoisonBurnLeechSeed
jp z, HandlePlayerMonFainted
call Func_3cd5a
ld a, $1
ld [H_WHOSETURN], a
callab TrainerAI
jr c, .AIActionUsedPlayerFirst
call Func_3e6bc ; execute enemy move
ld a, [wd078]
and a
ret nz
ld a, b
and a
jp z, HandlePlayerMonFainted
.AIActionUsedPlayerFirst
call HandlePoisonBurnLeechSeed
jp z, HandleEnemyMonFainted
call Func_3cd5a
call Func_3c50f
jp MainInBattleLoop
HandlePoisonBurnLeechSeed: ; 3c3bd (f:43bd)
ld hl, W_PLAYERMONCURHP ; wd015
ld de, W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .playersTurn
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
ld de, W_ENEMYMONSTATUS ; wcfe9
.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 ; W_PLAYERBATTSTATUS2
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .playersTurn2
ld de, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
.playersTurn2
ld a, [de]
add a
jr nc, .notLeechSeeded
push hl
ld a, [H_WHOSETURN] ; $fff3
push af
xor $1
ld [H_WHOSETURN], a ; $fff3
xor a
ld [wcc5b], a
ld a,ABSORB
call PlayMoveAnimation ; play leech seed animation (from opposing mon)
pop af
ld [H_WHOSETURN], a ; $fff3
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 Func_3cd5a
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 ; W_PLAYERBATTSTATUS3
ld de, W_PLAYERTOXICCOUNTER ; wd06c
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .playersTurn
ld hl, W_ENEMYBATTSTATUS3 ; W_ENEMYBATTSTATUS3
ld de, W_ENEMYTOXICCOUNTER ; wd071
.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, W_ENEMYMONMAXHP ; W_ENEMYMONMAXHP
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .playersTurn
ld hl, W_PLAYERMONMAXHP ; wd023
.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] ; $fff3
xor $1
ld [H_WHOSETURN], a ; $fff3
call UpdateCurMonHPBar
ld a, [H_WHOSETURN] ; $fff3
xor $1
ld [H_WHOSETURN], a ; $fff3
pop hl
ret
UpdateCurMonHPBar: ; 3c4f6 (f:44f6)
FuncCoord 10, 9
ld hl, Coord ; tile pointer to player HP bar
ld a, [H_WHOSETURN] ; $fff3
and a
ld a, $1
jr z, .playersTurn
FuncCoord 2, 2
ld hl, Coord ; tile pointer to enemy HP bar
xor a
.playersTurn
push bc
ld [wListMenuID], a ; wListMenuID
ld a, $48
call Predef ; indirect jump to UpdateHPBar (fa1d (3:7a1d))
pop bc
ret
Func_3c50f: ; 3c50f (f:450f)
ld a, [wd06a]
and a
jr nz, .asm_3c51a
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
res 5, [hl]
.asm_3c51a
ld a, [wd06f]
and a
ret nz
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
res 5, [hl]
ret
HandleEnemyMonFainted: ; 3c525 (f:4525)
xor a
ld [wccf0], a
call FaintEnemyPokemon
call AnyPlayerPokemonAliveCheck
ld a, d
and a
jp z, HandlePlayerBlackOut
ld hl, W_PLAYERMONCURHP ; wd015
ld a, [hli]
or [hl]
call nz, Func_3cd60
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
ret z
call AnyEnemyPokemonAliveCheck
jp z, TrainerBattleVictory
ld hl, W_PLAYERMONCURHP ; wd015
ld a, [hli]
or [hl]
jr nz, .asm_3c555
call Func_3c79b
ret c
call Func_3c7d8
.asm_3c555
ld a, $1
ld [wcd6a], a
call Func_3c664
jp z, asm_3c202
xor a
ld [wcd6a], a
jp MainInBattleLoop
FaintEnemyPokemon ; 0x3c567
call ReadPlayerMonCurHPAndStatus
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
jr z, .wild
ld a, [W_ENEMYMONNUMBER] ; W_ENEMYMONNUMBER
ld hl, W_ENEMYMON1HP
ld bc, $2c ; mon struct len
call AddNTimes
xor a
ld [hli], a
ld [hl], a
.wild
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
res 2, [hl]
xor a
ld [W_NUMHITS], a ; wd074
ld hl, wd065 ; enemy statuses
ld [hli], a
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
ld [W_ENEMYDISABLEDMOVE], a ; W_ENEMYDISABLEDMOVE
ld [wccef], a
ld [wccf3], a
ld hl, wccf1
ld [hli], a
ld [hl], a
FuncCoord 12, 5
ld hl, Coord
FuncCoord 12, 6
ld de, Coord
call Func_3c893
ld hl, wTileMap
ld bc, $40b
call ClearScreenArea
ld a, [W_ISINBATTLE] ; 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, W_PLAYERMONCURHP ; wd015
ld a, [hli]
or [hl]
jr nz, .playermonnotfaint
ld a, [wccf0]
and a
jr nz, .playermonnotfaint
call Func_3c741
.playermonnotfaint
call AnyPlayerPokemonAliveCheck
ld a, d
and a
ret z
ld hl, EnemyMonFaintedText
call PrintText
call Func_3ee94
call SaveScreenTilesToBuffer1
xor a
ld [wcf0b], a
ld b, EXP__ALL
call IsItemInBag
push af
jr z, .no_exp_all
ld hl, wd002
ld b, $7
.exp_all_loop
srl [hl]
inc hl
dec b
jr nz, .exp_all_loop
.no_exp_all
xor a
ld [wcc5b], a
callab GainExperience
pop af
ret z
ld a, $1
ld [wcc5b], a
ld a, [W_NUMINPARTY] ; W_NUMINPARTY
ld b, $0
.asm_3c62c
scf
rl b
dec a
jr nz, .asm_3c62c
ld a, b
ld [W_PLAYERMONSALIVEFLAGS], 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] ; wEnemyPartyCount
ld b, a
xor a
ld hl, W_ENEMYMON1HP ; wd8a5
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
Func_3c664: ; 3c664 (f:4664)
ld hl, wcf1e
ld e, $30
call GetBattleHealthBarColor
callab DrawEnemyPokeballs
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
jr nz, .asm_3c687
call Func_3d605
ld a, [wcc3e]
cp $f
ret z
call LoadScreenTilesFromBuffer1
.asm_3c687
call EnemySendOut
xor a
ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM
ld [wcd6a], a
ld [wccd5], a
inc a
ret
TrainerBattleVictory: ; 3c696 (f:4696)
call Func_3c643
ld b, MUSIC_DEFEATED_GYM_LEADER
ld a, [W_GYMLEADERNO] ; W_GYMLEADERNO
and a
jr nz, .gymleader
ld b, MUSIC_DEFEATED_TRAINER
.gymleader
ld a, [W_TRAINERCLASS] ; wd031
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] ; W_ISLINKBATTLE
cp $4
ld a, b
call nz, PlayBattleVictoryMusic
ld hl, TrainerDefeatedText
call PrintText
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
ret z
call ScrollTrainerPicAfterBattle
ld c, $28
call DelayFrames
call Func_3381
ld hl, MoneyForWinningText
call PrintText
ld de, wPlayerMoney + 2 ; wd349
ld hl, wd07b
ld c, $3
ld a, $b ; AddBCDPredef
jp Predef
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 Func_3c741
call AnyPlayerPokemonAliveCheck ; test if any more mons are alive
ld a, d
and a
jp z, HandlePlayerBlackOut
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
ld a, [hli]
or [hl]
jr nz, .enemyMonNotFainted
call FaintEnemyPokemon
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
ret z ; if wild encounter, battle is over
call AnyEnemyPokemonAliveCheck
jp z, TrainerBattleVictory
.enemyMonNotFainted
call Func_3c79b
ret c
call Func_3c7d8
jp nz, MainInBattleLoop
ld a, $1
ld [wcd6a], a
call Func_3c664
jp z, asm_3c202
xor a
ld [wcd6a], a
jp MainInBattleLoop
Func_3c741: ; 3c741 (f:4741)
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld c, a
ld hl, W_PLAYERMONSALIVEFLAGS ; clear fainted mon's alive flag
ld b, $0
ld a, $10 ; FlagActionPredef
call Predef
ld hl, W_ENEMYBATTSTATUS1 ; 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 [W_PLAYERMONSTATUS], a ; W_PLAYERMONSTATUS
call ReadPlayerMonCurHPAndStatus
FuncCoord 9, 7
ld hl, Coord
ld bc, $50b
call ClearScreenArea
FuncCoord 1, 10
ld hl, Coord
FuncCoord 1, 11
ld de, Coord
call Func_3c893
ld a, $1
ld [wcf0b], a
ld a, [wccf0]
and a
ret z
ld a, [W_PLAYERMONID]
call PlayCry
ld hl, PlayerMonFaintedText
jp PrintText
PlayerMonFaintedText: ; 3c796 (f:4796)
TX_FAR _PlayerMonFaintedText
db "@"
Func_3c79b: ; 3c79b (f:479b)
call Func_3ee94
call SaveScreenTilesToBuffer1
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
and a
dec a
ret nz
ld hl, UseNextMonText
call PrintText
.asm_3c7ad
FuncCoord 13, 9
ld hl, Coord
ld bc, $a0e
ld a, $14
ld [wd125], a
call DisplayTextBoxID
ld a, [wd12e]
cp $2
jr z, .asm_3c7c4
and a
ret
.asm_3c7c4
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
and a
jr z, .asm_3c7ad
ld hl, W_PARTYMON1_SPEED ; wd193
ld de, W_ENEMYMONSPEED
jp Func_3cab9
UseNextMonText: ; 3c7d3 (f:47d3)
TX_FAR _UseNextMonText
db "@"
Func_3c7d8: ; 3c7d8 (f:47d8)
ld a, $2
ld [wd07d], a
call DisplayPartyMenu
.asm_3c7e0
jr nc, .asm_3c7e7
.asm_3c7e2
call GoBackToPartyMenu
jr .asm_3c7e0
.asm_3c7e7
call Func_3ca97
jr z, .asm_3c7e2
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
jr nz, .asm_3c7fa
inc a
ld [wcd6a], a
call Func_3d605
.asm_3c7fa
xor a
ld [wcd6a], a
call ClearSprites
ld a, [wWhichPokemon] ; wWhichPokemon
ld [wPlayerMonNumber], a ; wPlayerMonNumber
ld c, a
ld hl, W_PLAYERMONSALIVEFLAGS
ld b, $1
push bc
ld a, $10 ; FlagActionPredef
call Predef
pop bc
ld hl, wccf5
ld a, $10 ; FlagActionPredef
call Predef
call Func_3cba6
call GBPalWhiteOut
call Func_3ee5b
call LoadScreenTilesFromBuffer1
call GoPAL_SET_CF1C
call GBPalNormal
call Func_3cc91
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
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] ; W_ISLINKBATTLE
cp $4
jr z, .notSony1Battle
ld a, [W_CUROPPONENT] ; wd059
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] ; 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 "@"
Func_3c893: ; 3c893 (f:4893)
ld a, [wd730]
push af
set 6, a
ld [wd730], a
ld b, $7
.asm_3c89e
push bc
push de
push hl
ld b, $6
.asm_3c8a3
push bc
push hl
push de
ld bc, $7
call CopyData
pop de
pop hl
ld bc, $ffec
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, .asm_3c8a3
ld bc, $14
add hl, bc
ld de, SevenSpacesText
call PlaceString
ld c, $2
call DelayFrames
pop hl
pop de
pop bc
dec b
jr nz, .asm_3c89e
pop af
ld [wd730], a
ret
SevenSpacesText: ; 3c8d7 (f:48d7)
db " @"
Func_3c8df: ; 3c8df (f:48df)
ld [H_DOWNARROWBLINKCNT1], a ; $ff8b
ld c, a
.asm_3c8e2
push bc
push hl
ld b, $7
.asm_3c8e6
push hl
ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b
ld c, a
.asm_3c8ea
ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b
cp $8
jr z, .asm_3c8f5
ld a, [hld]
ld [hli], a
inc hl
jr .asm_3c8f8
.asm_3c8f5
ld a, [hli]
ld [hld], a
dec hl
.asm_3c8f8
dec c
jr nz, .asm_3c8ea
pop hl
ld de, $14
add hl, de
dec b
jr nz, .asm_3c8e6
ld c, $2
call DelayFrames
pop hl
pop bc
dec c
jr nz, .asm_3c8e2
ret
; XXX this needs cleaning up. it's what runs when a juggler switches pokemon
EnemySendOut: ; 3c90e (f:490e)
ld hl,W_PLAYERMONSALIVEFLAGS
xor a
ld [hl],a
ld a,[wPlayerMonNumber]
ld c,a
ld b,1
push bc
ld a,$10
call Predef
ld hl,wccf5
xor a
ld [hl],a
pop bc
ld a,$10
call Predef
Func_3c92a: ; 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]
FuncCoord 18, 0
ld hl,Coord
ld a,8
call Func_3c8df
call Func_3ee94
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,[W_ENEMYMONNUMBER]
cp b
jr z,.next2
ld hl,wEnemyMon1Species
ld a,b
ld [wWhichPokemon],a
push bc
ld bc,$2C
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,wd8c5
ld bc,$2C
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 [W_ENEMYMONID],a
ld [wcf91],a
call Func_3eb01
ld hl,W_ENEMYMONCURHP
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,[W_NUMINPARTY]
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
FuncCoord 0, 7
ld hl,Coord
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 Func_3ca97
jr z,.next8
xor a
ld [wCurrentMenuItem],a
.next7
call GBPalWhiteOut
call Func_3ee5b
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,[W_ENEMYMONID]
ld [wcf91],a
ld [wd0b5],a
call GetMonHeader
ld de,vFrontPic
call LoadMonFrontSprite
ld a,$CF
ld [$FFE1],a
FuncCoord 15, 6
ld hl,Coord
ld a,2
call Predef
ld a,[W_ENEMYMONID]
call PlayCry
call Func_3cdec
ld a,[wCurrentMenuItem]
and a
ret nz
xor a
ld [W_PLAYERMONSALIVEFLAGS],a
ld [wccf5],a
call SaveScreenTilesToBuffer1
jp Func_3d1ba
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
AnyPlayerPokemonAliveCheck: ; 3ca83 (f:4a83)
ld a, [W_NUMINPARTY] ; W_NUMINPARTY
ld e, a
xor a
ld hl, W_PARTYMON1_HP ; wd16c
ld bc, W_PARTYMON2DATA - W_PARTYMON1DATA - 1
.partyMonsLoop
or [hl]
inc hl
or [hl]
add hl, bc
dec e
jr nz, .partyMonsLoop
ld d, a
ret
Func_3ca97: ; 3ca97 (f:4a97)
ld a, [wWhichPokemon] ; wWhichPokemon
ld hl, W_PARTYMON1_HP ; wd16c
ld bc, $2c
call AddNTimes
ld a, [hli]
or [hl]
ret nz
ld a, [wd11d]
and a
jr nz, .asm_3cab2
ld hl, NoWillText
call PrintText
.asm_3cab2
xor a
ret
NoWillText: ; 3cab4 (f:4ab4)
TX_FAR _NoWillText
db "@"
Func_3cab9: ; 3cab9 (f:4ab9)
call IsGhostBattle
jp z, .asm_3cb5c
ld a, [W_BATTLETYPE] ; wd05a
cp $2
jp z, .asm_3cb5c
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
jp z, .asm_3cb5c
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
jr nz, .asm_3cb4c
ld a, [wd120]
inc a
ld [wd120], a
ld a, [hli]
ld [$ff97], a
ld a, [hl]
ld [$ff98], a
ld a, [de]
ld [$ff8d], a
inc de
ld a, [de]
ld [$ff8e], a
call LoadScreenTilesFromBuffer1
ld de, $ff97
ld hl, $ff8d
ld c, $2
call StringCmp
jr nc, .asm_3cb5c
xor a
ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
ld a, $20
ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
call Multiply
ld a, [$ff97]
ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
ld a, [$ff98]
ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
ld a, [$ff8d]
ld b, a
ld a, [$ff8e]
srl b
rr a
srl b
rr a
and a
jr z, .asm_3cb5c
ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
ld b, $2
call Divide
ld a, [$ff97]
and a
jr nz, .asm_3cb5c
ld a, [wd120]
ld c, a
.asm_3cb2b
dec c
jr z, .asm_3cb39
ld b, $1e
ld a, [$ff98]
add b
ld [$ff98], a
jr c, .asm_3cb5c
jr .asm_3cb2b
.asm_3cb39
call BattleRandom
ld b, a
ld a, [$ff98]
cp b
jr nc, .asm_3cb5c
ld a, $1
ld [wcd6a], a
ld hl, CantEscapeText
jr .asm_3cb4f
.asm_3cb4c
ld hl, NoRunningText
.asm_3cb4f
call PrintText
ld a, $1
ld [wd11f], a
call SaveScreenTilesToBuffer1
and a
ret
.asm_3cb5c
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
ld a, $2
jr nz, .asm_3cb81
call SaveScreenTilesToBuffer1
xor a
ld [wcd6a], a
ld a, $f
ld [wPlayerMoveListIndex], a ; wPlayerMoveListIndex
call Func_3d605
call LoadScreenTilesFromBuffer1
ld a, [wcc3e]
cp $f
ld a, $2
jr z, .asm_3cb81
dec a
.asm_3cb81
ld [wcf0b], a
ld a, (SFX_08_44 - SFX_Headers_08) / 3
call PlaySoundWaitForCurrent
ld hl, GotAwayText
call PrintText
call WaitForSoundToFinish
call SaveScreenTilesToBuffer1
scf
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 "@"
Func_3cba6: ; 3cba6 (f:4ba6)
ld a, [wWhichPokemon] ; wWhichPokemon
ld bc, $2c
ld hl, W_PARTYMON1_NUM ; W_PARTYMON1_NUM (aliases: W_PARTYMON1DATA)
call AddNTimes
ld de, W_PLAYERMONID
ld bc, $c
call CopyData
ld bc, $f
add hl, bc
ld de, W_PLAYERMONIVS
ld bc, $2
call CopyData
ld de, W_PLAYERMONPP ; W_PLAYERMONPP
ld bc, $4
call CopyData
ld de, W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL
ld bc, $b
call CopyData
ld a, [wcfd9]
ld [wd0b5], a
call GetMonHeader
ld hl, W_PARTYMON1NAME ; W_PARTYMON1NAME
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
call SkipFixedLengthTextEntries
ld de, W_PLAYERMONNAME
ld bc, $b
call CopyData
ld hl, W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL
ld de, wcd0f
ld bc, $b
call CopyData
call Func_3ed1a
call Func_3ee19
ld a, $7
ld b, $8
ld hl, wPlayerMonAttackMod ; wcd1a
.asm_3cc0e
ld [hli], a
dec b
jr nz, .asm_3cc0e
ret
Func_3cc13: ; 3cc13 (f:4c13)
ld a, [wWhichPokemon] ; wWhichPokemon
ld bc, $2c
ld hl, wEnemyMons ; wEnemyMon1Species
call AddNTimes
ld de, wcfe5
ld bc, $c
call CopyData
ld bc, $f
add hl, bc
ld de, W_ENEMYMONATKDEFIV
ld bc, $2
call CopyData
ld de, W_ENEMYMONPP ; wcffe
ld bc, $4
call CopyData
ld de, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
ld bc, $b
call CopyData
ld a, [wcfe5]
ld [wd0b5], a
call GetMonHeader
ld hl, W_ENEMYMON1NAME
ld a, [wWhichPokemon] ; wWhichPokemon
call SkipFixedLengthTextEntries
ld de, W_ENEMYMONNAME
ld bc, $b
call CopyData
ld hl, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
ld de, wcd23
ld bc, $b
call CopyData
call Func_3ed1e
ld hl, W_MONHBASESTATS
ld de, wd002
ld b, $5
.asm_3cc79
ld a, [hli]
ld [de], a
inc de
dec b
jr nz, .asm_3cc79
ld a, $7
ld b, $8
ld hl, wEnemyMonStatMods ; wcd2e
.asm_3cc86
ld [hli], a
dec b
jr nz, .asm_3cc86
ld a, [wWhichPokemon] ; wWhichPokemon
ld [W_ENEMYMONNUMBER], a ; W_ENEMYMONNUMBER
ret
Func_3cc91: ; 3cc91 (f:4c91)
callab SendOutMon
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
ld a, [hli]
or [hl]
jp z, Func_3cca4
call Func_3cdec
Func_3cca4: ; 3cca4 (f:4ca4)
call Func_3cd60
ld a, $4
call Predef ; indirect jump to LoadMonBackSprite (3f103 (f:7103))
xor a
ld [$ffe1], a
ld hl, wcc2d
ld [hli], a
ld [hl], a
ld [wcc5b], a
ld [wd05b], a
ld [W_PLAYERMOVENUM], a ; wcfd2
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 ; W_PLAYERDISABLEDMOVE
ld [wccee], a
ld [wccf7], a
ld b, $1
call GoPAL_SET
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
res 5, [hl]
ld a, $1
ld [H_WHOSETURN], a ; $fff3
ld a, POOF_ANIM
call PlayMoveAnimation
FuncCoord 4, 11
ld hl, Coord
ld a, $2
call Predef ; indirect jump to Func_3f073 (3f073 (f:7073))
ld a, [wcf91]
call PlayCry
call Func_3ee94
jp SaveScreenTilesToBuffer1
Func_3ccfa: ; 3ccfa (f:4cfa)
FuncCoord 1, 5
ld hl, Coord
ld bc, $707
call ClearScreenArea
FuncCoord 3, 7
ld hl, Coord
ld bc, $505
xor a
ld [wcd6c], a
ld [H_DOWNARROWBLINKCNT1], a ; $ff8b
ld a, $5
call Predef ; indirect jump to Func_79aba (79aba (1e:5aba))
ld c, $4
call DelayFrames
call Func_3cd3a
FuncCoord 4, 9
ld hl, Coord
ld bc, $303
ld a, $1
ld [wcd6c], a
xor a
ld [H_DOWNARROWBLINKCNT1], a ; $ff8b
ld a, $5
call Predef ; indirect jump to Func_79aba (79aba (1e:5aba))
call Delay3
call Func_3cd3a
ld a, $4c
FuncCoord 5, 11
ld [Coord], a
Func_3cd3a: ; 3cd3a (f:4d3a)
FuncCoord 1, 5
ld hl, Coord
ld bc, $707
jp ClearScreenArea
; reads player's current mon's HP into W_PLAYERMONCURHP
ReadPlayerMonCurHPAndStatus: ; 3cd43 (f:4d43)
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld hl, W_PARTYMON1_HP ; wd16c
ld bc, W_PARTYMON2DATA - W_PARTYMON1DATA
call AddNTimes
ld d, h
ld e, l
ld hl, W_PLAYERMONCURHP ; wd015
ld bc, $4 ; 2 bytes HP, 1 byte unknown (unused?), 1 byte status
jp CopyData
Func_3cd5a: ; 3cd5a (f:4d5a)
call Func_3cd60
jp Func_3cdec
Func_3cd60: ; 3cd60 (f:4d60)
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
FuncCoord 9, 7
ld hl, Coord
ld bc, $50b
call ClearScreenArea
callab PlacePlayerHUDTiles
FuncCoord 18, 9
ld hl, Coord
ld [hl], $73
ld de, W_PLAYERMONNAME
FuncCoord 10, 7
ld hl, Coord
call Func_3ce9c
call PlaceString
ld hl, W_PLAYERMONID
ld de, wcf98
ld bc, $c
call CopyData
ld hl, W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL
ld de, wcfb9
ld bc, $b
call CopyData
FuncCoord 14, 8
ld hl, Coord
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
FuncCoord 10, 9
ld hl, Coord
ld a, $5f
call Predef ; indirect jump to Func_128ef (128ef (4:68ef))
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld hl, wcf1d
call GetBattleHealthBarColor
ld hl, W_PLAYERMONCURHP ; wd015
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
Func_3cdec: ; 3cdec (f:4dec)
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld hl, wTileMap
ld bc, $40c
call ClearScreenArea
callab PlaceEnemyHUDTiles
ld de, W_ENEMYMONNAME
FuncCoord 1, 0
ld hl, Coord
call Func_3ce9c
call PlaceString
FuncCoord 4, 1
ld hl, Coord
push hl
inc hl
ld de, W_ENEMYMONSTATUS ; wcfe9
call PrintStatusConditionNotFainted
pop hl
jr nz, .asm_3ce23
ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL
ld [wcfb9], a
call PrintLevel
.asm_3ce23
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
ld a, [hli]
ld [$ff97], a
ld a, [hld]
ld [$ff98], a
or [hl]
jr nz, .asm_3ce36
ld c, a
ld e, a
ld d, $6
jp Func_3ce7f
.asm_3ce36
xor a
ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
ld a, $30
ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
call Multiply
ld hl, W_ENEMYMONMAXHP ; W_ENEMYMONMAXHP
ld a, [hli]
ld b, a
ld a, [hl]
ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
ld a, b
and a
jr z, .asm_3ce6a
ld a, [H_REMAINDER] ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
srl b
rr a
srl b
rr a
ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
ld a, [$ff97]
ld b, a
srl b
ld a, [$ff98]
rr a
srl b
rr a
ld [$ff98], a
ld a, b
ld [$ff97], a
.asm_3ce6a
ld a, [$ff97]
ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT)
ld a, [$ff98]
ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
ld a, $2
ld b, a
call Divide
ld a, [$ff98]
ld e, a
ld a, $6
ld d, a
ld c, a
Func_3ce7f: ; 3ce7f (f:4e7f)
xor a
ld [wListMenuID], a ; wListMenuID
FuncCoord 2, 2
ld hl, Coord
call DrawHPBar
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
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
Func_3ce9c: ; 3ce9c (f:4e9c)
push de
inc hl
inc hl
ld b, $2
.asm_3cea1
inc de
ld a, [de]
cp $50
jr z, .asm_3ceb1
inc de
ld a, [de]
cp $50
jr z, .asm_3ceb1
dec hl
dec b
jr nz, .asm_3cea1
.asm_3ceb1
pop de
ret
InitBattleMenu: ; 3ceb3 (f:4eb3)
call LoadScreenTilesFromBuffer1 ; restore saved screen
ld a, [W_BATTLETYPE] ; wd05a
and a
jr nz, .nonstandardbattle
call Func_3cd5a ; redraw names and HP bars?
call Func_3ee94
call SaveScreenTilesToBuffer1
.nonstandardbattle
ld a, [W_BATTLETYPE] ; wd05a
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] ; wd05a
dec a
jp nz, RegularBattleMenu ; regular battle
; the following happens for the old man tutorial
ld hl, W_PLAYERNAME ; wd158
ld de, W_GRASSRATE ; 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 ; $4f12
ld de, W_PLAYERNAME ; wd158
ld bc, $b
call CopyData
; the following simulates the keystrokes by drawing menus on screen
FuncCoord 9, 14
ld hl, Coord
ld [hl], "▶"
ld c, $50
call DelayFrames
ld [hl], $7f
FuncCoord 9, 16
ld hl, Coord
ld [hl], "▶"
ld c, $32
call DelayFrames
ld [hl], $ec
ld a, $2
jp Func_3cfe8
OldManName: ; 3cf12 (f:4f12)
db "OLD MAN@"
RegularBattleMenu: ; 3cf1a (f:4f1a)
ld a, [wcc2d]
ld [wCurrentMenuItem], a ; wCurrentMenuItem
ld [wLastMenuItem], a ; wLastMenuItem
sub $2
jr c, .leftcolumn
ld [wCurrentMenuItem], a ; wCurrentMenuItem
ld [wLastMenuItem], a ; wLastMenuItem
jr .rightcolumn
.leftcolumn
ld a, [W_BATTLETYPE] ; wd05a
cp $2
ld a, " "
jr z, .safaribattle
FuncCoord 15, 14
ld [Coord], a
FuncCoord 15, 16
ld [Coord], a
ld b, $9
jr .notsafari
.safaribattle
FuncCoord 13, 14
ld [Coord], a
FuncCoord 13, 16
ld [Coord], a
FuncCoord 7, 14
ld hl, Coord
ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS
ld bc, $102
call PrintNumber
ld b, $1
.notsafari
ld hl, wTopMenuItemY ; wTopMenuItemY
ld a, $e
ld [hli], a
ld a, b
ld [hli], a
inc hl
inc hl
ld a, $1
ld [hli], a
ld [hl], $11
call HandleMenuInput
bit 4, a
jr nz, .rightcolumn
jr .selection
.rightcolumn
ld a, [W_BATTLETYPE] ; wd05a
cp $2
ld a, " "
jr z, .safarirightcolumn
FuncCoord 9, 14
ld [Coord], a
FuncCoord 9, 16
ld [Coord], a
ld b, $f
jr .notsafarirightcolumn
.safarirightcolumn
FuncCoord 1, 14
ld [Coord], a
FuncCoord 1, 16
ld [Coord], a
FuncCoord 7, 14
ld hl, Coord
ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS
ld bc, $102
call PrintNumber
ld b, $d
.notsafarirightcolumn
ld hl, wTopMenuItemY ; wTopMenuItemY
ld a, $e
ld [hli], a
ld a, b
ld [hli], a
inc hl
inc hl
ld a, $1
ld [hli], a
ld a, $21
ld [hli], a
call HandleMenuInput
bit 5, a
jr nz, .leftcolumn
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
add $2 ; if we're in the right column, the actual id is +2
ld [wCurrentMenuItem], a ; wCurrentMenuItem
.selection
call PlaceUnfilledArrowMenuCursor
ld a, [W_BATTLETYPE] ; wd05a
cp $2
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld [wcc2d], a
jr z, .asm_3cfd0
cp $1
jr nz, .asm_3cfcb
inc a
jr .asm_3cfd0
.asm_3cfcb
cp $2 ; what
jr nz, .asm_3cfd0
dec a
.asm_3cfd0
and a
jr nz, Func_3cfe8
; first option was selected...
ld a, [W_BATTLETYPE] ; wd05a
cp $2
jr z, .safari1
xor a
ld [wd120], a
jp LoadScreenTilesFromBuffer1 ; restore saved screen and return??
.safari1 ; safari first option??
ld a, SAFARI_BALL
ld [wcf91], a
jr asm_3d05f
Func_3cfe8: ; 3cfe8 (f:4fe8)
cp $2
jp nz, Func_3d0ca
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
jr nz, .asm_3cffd
ld hl, ItemsCantBeUsedHereText
call PrintText
jp InitBattleMenu
.asm_3cffd ; bag?
call SaveScreenTilesToBuffer2 ; copy bg?
ld a, [W_BATTLETYPE] ; wd05a
cp $2
jr nz, asm_3d00e
ld a, SAFARI_BAIT
ld [wcf91], a
jr asm_3d05f
asm_3d00e: ; 3d00e (f:500e)
call LoadScreenTilesFromBuffer1
ld a, [W_BATTLETYPE] ; wd05a
and a
jr nz, .asm_3d01a
call Func_3cd5a
.asm_3d01a
ld a, [W_BATTLETYPE] ; wd05a
dec a
jr nz, Func_3d031
ld hl, OldManItemList
ld a, l
ld [wcf8b], a
ld a, h
ld [wcf8c], a
jr Func_3d03c
OldManItemList: ; 3d02d (f:502d)
db $01, POKE_BALL, 50, $ff
Func_3d031
ld hl, wNumBagItems ; wNumBagItems
ld a, l
ld [wcf8b], a
ld a, h
ld [wcf8c], a
Func_3d03c
xor a
ld [wcf93], a
ld a, $3
ld [wListMenuID], a ; wListMenuID
ld a, [wcc2c]
ld [wCurrentMenuItem], a ; wCurrentMenuItem
call DisplayListMenuID
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld [wcc2c], a
ld a, $0
ld [wcc37], a
ld [wcc35], a
jp c, InitBattleMenu
asm_3d05f: ; 3d05f (f:505f)
ld a, [wcf91]
ld [wd11e], a
call GetItemName
call CopyStringToCF4B ; copy name
xor a
ld [wd152], a
call UseItem
call Func_3ee5b
call ClearSprites
xor a
ld [wCurrentMenuItem], a ; wCurrentMenuItem
ld a, [W_BATTLETYPE] ; wd05a
cp $2
jr z, .asm_3d09c
ld a, [wcd6a]
and a
jp z, asm_3d00e
ld a, [W_PLAYERBATTSTATUS1] ; W_PLAYERBATTSTATUS1
bit 5, a
jr z, .asm_3d09c
ld hl, wd06a
dec [hl]
jr nz, .asm_3d09c
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
res 5, [hl]
.asm_3d09c
ld a, [wd11c]
and a
jr nz, .asm_3d0b7
ld a, [W_BATTLETYPE] ; wd05a
cp $2
jr z, .asm_3d0b2
call LoadScreenTilesFromBuffer1
call Func_3cd5a ; redraw name and hp bar?
call Delay3
.asm_3d0b2
call GBPalNormal
and a
ret
.asm_3d0b7
call GBPalNormal
xor a
ld [wd11c], a
ld a, $2
ld [wcf0b], a
scf
ret
ItemsCantBeUsedHereText: ; 3d0c5 (f:50c5)
TX_FAR _ItemsCantBeUsedHereText
db "@"
Func_3d0ca: ; 3d0ca (f:50ca)
dec a
jp nz, Func_3d1fa
call SaveScreenTilesToBuffer2
ld a, [W_BATTLETYPE] ; wd05a
cp $2
jr nz, Func_3d0e0
ld a, SAFARI_ROCK
ld [wcf91], a
jp asm_3d05f
Func_3d0e0: ; 3d0e0 (f:50e0)
call LoadScreenTilesFromBuffer1
xor a
ld [wd07d], a
ld [wcc35], a
call DisplayPartyMenu
asm_3d0ed: ; 3d0ed (f:50ed)
jp nc, Func_3d119
asm_3d0f0: ; 3d0f0 (f:50f0)
call ClearSprites
call GBPalWhiteOut
call Func_3ee5b
call LoadScreenTilesFromBuffer2
call GoPAL_SET_CF1C
call GBPalNormal
jp InitBattleMenu
Func_3d105: ; 3d105 (f:5105)
FuncCoord 11, 11
ld hl, Coord
ld bc, $81
ld a, $7f
call FillMemory
xor a
ld [wd07d], a
call GoBackToPartyMenu
jr asm_3d0ed
Func_3d119: ; 3d119 (f:5119)
ld a, $c
ld [wd125], a
call DisplayTextBoxID
ld hl, wTopMenuItemY ; wTopMenuItemY
ld a, $c
ld [hli], a
ld [hli], a
xor a
ld [hli], a
inc hl
ld a, $2
ld [hli], a
ld a, $3
ld [hli], a
xor a
ld [hl], a
call HandleMenuInput
bit 1, a
jr nz, Func_3d105
call PlaceUnfilledArrowMenuCursor
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
cp $2
jr z, asm_3d0f0
and a
jr z, .asm_3d18a
xor a
ld [wcc49], a
ld hl, W_PARTYMON1_NUM ; W_PARTYMON1_NUM (aliases: W_PARTYMON1DATA)
call ClearSprites
ld a, $36
call Predef ; indirect jump to StatusScreen (12953 (4:6953))
ld a, $37
call Predef ; indirect jump to StatusScreen2 (12b57 (4:6b57))
ld a, [W_ENEMYBATTSTATUS2] ; W_ENEMYBATTSTATUS2
bit 4, a
ld hl, AnimationSubstitute
jr nz, .asm_3d182
ld a, [wccf3]
and a
ld hl, AnimationMinimizeMon
jr nz, .asm_3d182
ld a, [wcfe5]
ld [wcf91], a
ld [wd0b5], a
call GetMonHeader
ld de, vFrontPic
call LoadMonFrontSprite
jr .asm_3d187
.asm_3d182
ld b, BANK(AnimationSubstitute) ; BANK(AnimationMinimizeMon)
call Bankswitch
.asm_3d187
jp Func_3d0e0
.asm_3d18a
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld d, a
ld a, [wWhichPokemon] ; wWhichPokemon
cp d
jr nz, .asm_3d19d
ld hl, AlreadyOutText
call PrintText
jp Func_3d105
.asm_3d19d
call Func_3ca97
jp z, Func_3d105
ld a, $1
ld [wcd6a], a
call GBPalWhiteOut
call ClearSprites
call Func_3ee5b
call LoadScreenTilesFromBuffer1
call GoPAL_SET_CF1C
call GBPalNormal
Func_3d1ba: ; 3d1ba (f:51ba)
callab RetreatMon
ld c, $32
call DelayFrames
call Func_3ccfa
ld a, [wWhichPokemon] ; wWhichPokemon
ld [wPlayerMonNumber], a ; wPlayerMonNumber
ld c, a
ld b, $1
push bc
ld hl, W_PLAYERMONSALIVEFLAGS
ld a, $10 ; FlagActionPredef
call Predef
pop bc
ld hl, wccf5
ld a, $10 ; FlagActionPredef
call Predef
call Func_3cba6
call Func_3cc91
call SaveScreenTilesToBuffer1
ld a, $2
ld [wCurrentMenuItem], a ; wCurrentMenuItem
and a
ret
AlreadyOutText: ; 3d1f5 (f:51f5)
TX_FAR _AlreadyOutText
db "@"
Func_3d1fa: ; 3d1fa (f:51fa)
call LoadScreenTilesFromBuffer1
ld a, $3
ld [wCurrentMenuItem], a ; wCurrentMenuItem
ld hl, W_PLAYERMONSPEED
ld de, W_ENEMYMONSPEED
call Func_3cab9
ld a, $0
ld [wd11f], a
ret c
ld a, [wcd6a]
and a
ret nz
jp InitBattleMenu
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, W_PLAYERMONMOVES
call .loadmoves
FuncCoord 4, 12
ld hl, Coord
ld b, $4
ld c, $e
di
call TextBoxBorder
FuncCoord 4, 12
ld hl, Coord
ld [hl], $7a
FuncCoord 10, 12
ld hl, Coord
ld [hl], $7e
ei
FuncCoord 6, 13
ld hl, Coord
call .writemoves
ld b, $5
ld a, $c
jr .menuset
.mimicmenu
ld hl, W_ENEMYMONMOVES
call .loadmoves
FuncCoord 0, 7
ld hl, Coord
ld b, $4
ld c, $e
call TextBoxBorder
FuncCoord 2, 8
ld hl, Coord
call .writemoves
ld b, $1
ld a, $7
jr .menuset
.relearnmenu
ld a, [wWhichPokemon] ; wWhichPokemon
ld hl, W_PARTYMON1_MOVE1 ; W_PARTYMON1_MOVE1
ld bc, $2c
call AddNTimes
call .loadmoves
FuncCoord 4, 7
ld hl, Coord
ld b, $4
ld c, $e
call TextBoxBorder
FuncCoord 6, 8
ld hl, Coord
call .writemoves
ld b, $5
ld a, $7
.menuset
ld hl, wTopMenuItemY ; wTopMenuItemY
ld [hli], a
ld a, b
ld [hli], a ; wTopMenuItemX
ld a, [wMoveMenuType]
cp $1
jr z, .selectedmoveknown
ld a, $1
jr nc, .selectedmoveknown
ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex
inc a
.selectedmoveknown
ld [hli], a ; wCurrentMenuItem
inc hl ; wTileBehindCursor untouched
ld a, [wcd6c]
inc a
inc a
ld [hli], a ; wMaxMenuItem
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] ; 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 ; wMenuWatchedKeys
ld a, [wMoveMenuType]
cp $1
jr z, .movelistindex1
ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex
inc a
.movelistindex1
ld [hl], a ; wLastMenuItem
Func_3d2fe: ; 3d2fe (f:52fe)
ld a, [wMoveMenuType]
and a
jr z, .battleselect
dec a
jr nz, .select
FuncCoord 1, 14
ld hl, Coord
ld de, WhichTechniqueString ; $53b8
call PlaceString
jr .select
.battleselect
ld a, [W_FLAGS_D733]
bit 0, a
jr nz, .select
call Func_3d4b6
ld a, [wcc35]
and a
jr z, .select
FuncCoord 5, 13
ld hl, Coord
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, Func_3d435 ; select
bit 1, a ; B, but was it reset above?
push af
xor a
ld [wcc35], a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
dec a
ld [wCurrentMenuItem], a ; wCurrentMenuItem
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 ; wPlayerMoveListIndex
jr nz, .moveselected
pop af
ret
.moveselected
pop af
ret nz
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld c, a
ld b, $0
add hl, bc
ld a, [hl]
and $3f
jr z, .nopp
ld a, [W_PLAYERDISABLEDMOVE] ; W_PLAYERDISABLEDMOVE
swap a
and $f
dec a
cp c
jr z, .disabled
ld a, [W_PLAYERBATTSTATUS3] ; W_PLAYERBATTSTATUS3
bit 3, a ; transformed
jr nz, .dummy ; game freak derp
.dummy
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld hl, W_PLAYERMONMOVES
ld c, a
ld b, $0
add hl, bc
ld a, [hl]
ld [wPlayerSelectedMove], a ; wPlayerSelectedMove
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] ; wCurrentMenuItem
and a
jp nz, Func_3d2fe
call EraseMenuCursor
ld a, [wcd6c]
inc a
ld [wCurrentMenuItem], a ; wCurrentMenuItem
jp Func_3d2fe
Func_3d3dd: ; 3d3dd (f:53dd)
ld a, [wCurrentMenuItem] ; 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 ; wCurrentMenuItem
jp Func_3d2fe
Func_3d3f5: ; 3d3f5 (f:53f5)
ld a, $a5
ld [wPlayerSelectedMove], a ; wPlayerSelectedMove
ld a, [W_PLAYERDISABLEDMOVE] ; W_PLAYERDISABLEDMOVE
and a
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
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 "@"
Func_3d435: ; 3d435 (f:5435)
ld a, [wcc35]
and a
jr z, asm_3d4ad
ld hl, W_PLAYERMONMOVES
call Func_3d493
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
call Func_3d493
ld hl, W_PLAYERDISABLEDMOVE ; W_PLAYERDISABLEDMOVE
ld a, [hl]
swap a
and $f
ld b, a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
cp b
jr nz, .asm_3d463
ld a, [hl]
and $f
ld b, a
ld a, [wcc35]
swap a
add b
ld [hl], a
jr .asm_3d474
.asm_3d463
ld a, [wcc35]
cp b
jr nz, .asm_3d474
ld a, [hl]
and $f
ld b, a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
swap a
add b
ld [hl], a
.asm_3d474
ld hl, W_PARTYMON1_MOVE1 ; W_PARTYMON1_MOVE1
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld bc, $2c
call AddNTimes
push hl
call Func_3d493
pop hl
ld bc, $15
add hl, bc
call Func_3d493
xor a
ld [wcc35], a
jp MoveSelectionMenu
Func_3d493: ; 3d493 (f:5493)
push hl
ld a, [wcc35]
dec a
ld c, a
ld b, $0
add hl, bc
ld d, h
ld e, l
pop hl
ld a, [wCurrentMenuItem] ; 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
asm_3d4ad: ; 3d4ad (f:54ad)
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld [wcc35], a
jp MoveSelectionMenu
Func_3d4b6: ; 3d4b6 (f:54b6)
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
FuncCoord 0, 8
ld hl, Coord
ld b, $3
ld c, $9
call TextBoxBorder
ld a, [W_PLAYERDISABLEDMOVE] ; W_PLAYERDISABLEDMOVE
and a
jr z, .asm_3d4df
swap a
and $f
ld b, a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
cp b
jr nz, .asm_3d4df
FuncCoord 1, 10
ld hl, Coord
ld de, DisabledText
call PlaceString
jr .asm_3d54e
.asm_3d4df
ld hl, wCurrentMenuItem ; wCurrentMenuItem
dec [hl]
xor a
ld [H_WHOSETURN], a ; $fff3
ld hl, W_PLAYERMONMOVES
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld c, a
ld b, $0
add hl, bc
ld a, [hl]
ld [wPlayerSelectedMove], a ; wPlayerSelectedMove
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld [wWhichPokemon], a ; wWhichPokemon
ld a, $4
ld [wcc49], a
callab GetMaxPP
ld hl, wCurrentMenuItem ; wCurrentMenuItem
ld c, [hl]
inc [hl]
ld b, $0
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
add hl, bc
ld a, [hl]
and $3f
ld [wcd6d], a
FuncCoord 1, 9
ld hl, Coord
ld de, TypeText
call PlaceString
FuncCoord 7, 11
ld hl, Coord
ld [hl], "/"
FuncCoord 5, 9
ld hl, Coord
ld [hl], "/"
FuncCoord 5, 11
ld hl, Coord
ld de, wcd6d
ld bc, $102
call PrintNumber
FuncCoord 8, 11
ld hl, Coord
ld de, wd11e
ld bc, $102
call PrintNumber
call GetCurrentMove
FuncCoord 2, 10
ld hl, Coord
ld a, $5d
call Predef ; indirect jump to Func_27d98 (27d98 (9:7d98))
.asm_3d54e
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
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
call SaveScreenTilesToBuffer1
call Func_3d605
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, W_ENEMYMONMOVES
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, [W_ENEMYMONSTATUS]
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, W_ENEMYMONMOVES+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, $a5
jr .done
Func_3d605: ; 3d605 (f:5605)
ld a, $ff
ld [wcc3e], a
ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex
cp $f
jr z, .asm_3d630
ld a, [wcd6a]
and a
jr nz, .asm_3d629
ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove
cp $a5
ld b, $e
jr z, .asm_3d62f
dec b
inc a
jr z, .asm_3d62f
ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex
jr .asm_3d630
.asm_3d629
ld a, [wWhichPokemon] ; 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
Func_3d65e: ; 3d65e (f:565e)
xor a
ld [H_WHOSETURN], a ; $fff3
ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove
inc a
jp z, Func_3d80a
xor a
ld [W_MOVEMISSED], a ; W_MOVEMISSED
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 Func_3d854
jr nz, .asm_3d68a
jp [hl]
.asm_3d68a
call GetCurrentMove
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
bit 4, [hl]
jr nz, asm_3d6a9
call Func_3dc88
jp z, Func_3d80a
Func_3d69a: ; 3d69a (f:569a)
ld a, [W_PLAYERMOVEEFFECT] ; wcfd3
cp CHARGE_EFFECT
jp z, Func_3f132
cp FLY_EFFECT
jp z, Func_3f132
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,Func_3f132
ld a,[W_PLAYERMOVEEFFECT]
ld hl,EffectsArray5B
ld de,1
call IsInArray
call c,Func_3f132
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 CalculateDamage
call MoreCalculateDamage
jp z,asm_3d74b
call AdjustDamageForMoveType
call Func_3e687
.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 ; 574B
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 Func_3cd60
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 ; 577A
call MirrorMoveCopyMove
jp z,Func_3d80a
xor a
ld [wcced],a
jp Func_3d69a
.next6
cp a,METRONOME_EFFECT
jr nz,.next7 ; 5784
call MetronomePickMove
jp Func_3d69a
.next7
ld a,[W_PLAYERMOVEEFFECT]
ld hl,EffectsArray3
ld de,1
call IsInArray
jp c,Func_3f132
ld a,[W_MOVEMISSED]
and a
jr z,.next8 ; 57A6
call PrintMoveFailureText
ld a,[W_PLAYERMOVEEFFECT]
cp a,EXPLODE_EFFECT
jr z,.next9 ; 57B9
jp Func_3d80a
.next8
call ApplyAttackToEnemyPokemon
call Func_3dc5c
callab DisplayEffectiveness
ld a,1
ld [wccf4],a
.next9
ld a,[W_PLAYERMOVEEFFECT]
ld hl,EffectsArray4
ld de,1
call IsInArray
call c,Func_3f132
ld hl,W_ENEMYMONCURHP
ld a,[hli]
ld b,[hl]
or b
ret z
call HandleBuildingRage
ld hl,W_PLAYERBATTSTATUS1
bit 2,[hl]
jr z,.next10 ; 57EF
ld a,[wd06a]
dec a
ld [wd06a],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,Func_3f132
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,[W_PLAYERMONSTATUS] ; players turn
and a,SLP | (1 << FRZ)
ret nz
ld hl,ScaredText
call PrintText
xor a
ret
.Ghost ; ghosts 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 ; $3493
ret z
.next
ld a,1
and a
ret
Func_3d854: ; 3d854 (f:5854)
ld hl,W_PLAYERMONSTATUS
ld a,[hl]
and a,SLP
jr z,.FrozenCheck ; to 5884
dec a
ld [W_PLAYERMONSTATUS],a ; decrement sleep count
and a
jr z,.WakeUp ; to 5874
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 Func_3da37
.FrozenCheck
bit FRZ,[hl] ; frozen?
jr z,.HeldInPlaceCheck ; to 5898
ld hl,IsFrozenText
call PrintText
xor a
ld [wccf1],a
ld hl,Func_3d80a
jp Func_3da37
.HeldInPlaceCheck
ld a,[W_ENEMYBATTSTATUS1]
bit 5,a
jp z,FlinchedCheck
ld hl,CantMoveText
call PrintText
ld hl,Func_3d80a
jp Func_3da37
FlinchedCheck: ; 3d8ac (f:58ac)
ld hl,W_PLAYERBATTSTATUS1
bit 3,[hl]
jp z,HyperBeamCheck
res 3,[hl]
ld hl,FlinchedText
call PrintText
ld hl,Func_3d80a
jp Func_3da37
HyperBeamCheck: ; 3d8c2 (f:58c2)
ld hl,W_PLAYERBATTSTATUS2
bit 5,[hl]
jr z,.next ; 58D7
res 5,[hl]
ld hl,MustRechargeText
call PrintText
ld hl,Func_3d80a ; $580a
jp Func_3da37
.next
ld hl,W_PLAYERDISABLEDMOVE
ld a,[hl]
and a
jr z,.next2 ; 58EE
dec a
ld [hl],a
and a,$F
jr nz,.next2
ld [hl],a
ld [wccee],a
ld hl,DisabledNoMoreText
call PrintText
.next2
ld a,[W_PLAYERBATTSTATUS1]
add a
jr nc,.next3 ; 5929
ld hl,wd06b
dec [hl]
jr nz,.next4 ; 5907
ld hl,W_PLAYERBATTSTATUS1
res 7,[hl]
ld hl,ConfusedNoMoreText
call PrintText
jr .next3
.next4
ld hl,IsConfusedText
call PrintText
xor a
ld [wcc5b],a
ld a,CONF_ANIM - 1
call PlayMoveAnimation
call BattleRandom
cp a,$80
jr c,.next3
ld hl,W_PLAYERBATTSTATUS1
ld a,[hl]
and a,$80 ; confused
ld [hl],a
call PrintHurtItselfText
jr .next5 ; 5952
.next3
ld a,[wccee]
and a
jr z,.ParalysisCheck ; 593E
ld hl,wPlayerSelectedMove
cp [hl]
jr nz,.ParalysisCheck
call PrintMoveIsDisabledText
ld hl,Func_3d80a ; $580a
jp Func_3da37
.ParalysisCheck
ld hl,W_PLAYERMONSTATUS
bit PAR,[hl]
jr z,.next7 ; 5975
call BattleRandom
cp a,$3F
jr nc,.next7
ld hl,FullyParalyzedText
call PrintText
.next5
ld hl,W_PLAYERBATTSTATUS1
ld a,[hl]
and a,$CC
ld [hl],a
ld a,[W_PLAYERMOVEEFFECT]
cp a,FLY_EFFECT
jr z,.next8 ; 5966
cp a,CHARGE_EFFECT
jr z,.next8
jr .next9 ; 596F
.next8
xor a
ld [wcc5b],a
ld a,STATUS_AFFECTED_ANIM
call PlayMoveAnimation
.next9
ld hl,Func_3d80a ; $580a
jp Func_3da37
.next7
ld hl,W_PLAYERBATTSTATUS1
bit 0,[hl]
jr z,.next10 ; 59D0
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,wd06a
dec [hl]
jr z,.next11 ; 599B
ld hl,Func_3d80a ; $580a
jp Func_3da37
.next11
ld hl,W_PLAYERBATTSTATUS1
res 0,[hl]
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,.next12 ; 59C2
ld a,1
ld [W_MOVEMISSED],a
.next12
xor a
ld [hli],a
ld [hl],a
ld a,BIDE
ld [W_PLAYERMOVENUM],a
ld hl,asm_3d705 ; $5705
jp Func_3da37
.next10
bit 1,[hl]
jr z,.next13 ; 59FF
ld a,THRASH
ld [W_PLAYERMOVENUM],a
ld hl,ThrashingAboutText
call PrintText
ld hl,wd06a
dec [hl]
ld hl,asm_3d6dc ; $56dc
jp nz,Func_3da37
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 Func_3da37
.next13
bit 5,[hl]
jp z,Func_3da1a
ld hl,AttackContinuesText
call PrintText
ld a,[wd06a]
dec a
ld [wd06a],a
ld hl,asm_3d714 ; $5714
jp nz,Func_3da37
jp Func_3da37
Func_3da1a: ; 3da1a (f:5a1a)
ld a, [W_PLAYERBATTSTATUS2] ; W_PLAYERBATTSTATUS2
bit 6, a
jp z, Func_3da39
ld a, RAGE
ld [wd11e], a
call GetMoveName
call CopyStringToCF4B
xor a
ld [W_PLAYERMOVEEFFECT], a ; wcfd3
ld hl, asm_3d6b0 ; $56b0
jp Func_3da37
Func_3da37: ; 3da37 (f:5a37)
xor a
ret
Func_3da39: ; 3da39 (f:5a39)
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 ; wPlayerSelectedMove
ld de, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3da97
inc hl
ld de, W_ENEMYBATTSTATUS1 ; 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, W_ENEMYMONDEFENSE ; wcff8
ld a, [hli]
push af
ld a, [hld]
push af
ld a, [W_PLAYERMONDEF]
ld [hli], a
ld a, [W_PLAYERMONDEF + 1]
ld [hl], a
ld hl, W_PLAYERMOVEEFFECT ; wcfd3
push hl
ld a, [hl]
push af
xor a
ld [hli], a
ld [wd05e], a
ld a, $28
ld [hli], a
xor a
ld [hl], a
call CalculateDamage
call MoreCalculateDamage
pop af
pop hl
ld [hl], a
ld hl, W_ENEMYMONDEFENSE + 1
pop af
ld [hld], a
pop af
ld [hl], a
xor a
ld [wcc5b], a
inc a
ld [H_WHOSETURN], a ; $fff3
call PlayMoveAnimation
call Func_3cd60
xor a
ld [H_WHOSETURN], a ; $fff3
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] ; $fff3
and a
ld a, [W_PLAYERMOVENUM] ; wcfd2
ld hl, wccf1
jr z, .asm_3db11
ld a, [W_ENEMYMOVENUM] ; 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 ; $5ba3
.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 ; wcfd3
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3dbed
ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
.asm_3dbed
ld hl, DoesntAffectMonText ; $5c57
ld a, [wd05b]
and $7f
jr z, .asm_3dc04
ld hl, AttackMissedText ; $5c42
ld a, [wd05e]
cp $ff
jr nz, .asm_3dc04
ld hl, UnaffectedText ; $5c4c
.asm_3dc04
push de
call PrintText
xor a
ld [wd05e], 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 ; 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 ; $5c47
call PrintText
ld b, $4
ld a, $24
call Predef ; indirect jump to Func_48125 (48125 (12:4125))
ld a, [H_WHOSETURN] ; $fff3
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 ; $5c57
jp PrintText
DoesntAffectMonText: ; 3dc57 (f:5c57)
TX_FAR _DoesntAffectMonText
db "@"
Func_3dc5c: ; 3dc5c (f:5c5c)
ld a, [wd05e]
and a
jr z, .asm_3dc75
dec a
add a
ld hl, CriticalOHKOTextPointers ; $5c7a
ld b, $0
ld c, a
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
call PrintText
xor a
ld [wd05e], a
.asm_3dc75
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 "@"
Func_3dc88: ; 3dc88 (f:5c88)
xor a
ld [wcced], a
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
jr nz, .asm_3dc97
ld a, $1
and a
ret
.asm_3dc97
ld hl, W_PARTYMON1_OTID ; W_PARTYMON1_OTID
ld bc, $2c
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
call AddNTimes
ld a, [wPlayerID] ; wPlayerID
cp [hl]
jr nz, .asm_3dcb1
inc hl
ld a, [wPlayerID + 1] ; wd35a
cp [hl]
jp z, Func_3ddb0
.asm_3dcb1
; what level might disobey?
ld hl, W_OBTAINEDBADGES
bit 7, [hl]
ld a, 101
jr nz, .asm_3dcce
bit 5, [hl]
ld a, 70
jr nz, .asm_3dcce
bit 3, [hl]
ld a, 50
jr nz, .asm_3dcce
bit 1, [hl]
ld a, 30
jr nz, .asm_3dcce
ld a, 10
.asm_3dcce
ld b, a
ld c, a
ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL
ld d, a
add b
ld b, a
jr nc, .asm_3dcda
ld b, $ff
.asm_3dcda
ld a, c
cp d
jp nc, Func_3ddb0
.asm_3dcdf
call BattleRandom
swap a
cp b
jr nc, .asm_3dcdf
cp c
jp c, Func_3ddb0
.asm_3dceb
call BattleRandom
cp b
jr nc, .asm_3dceb
cp c
jr c, .asm_3dd3f
ld a, d
sub c
ld b, a
call BattleRandom
swap a
sub b
jr c, .asm_3dd0e
cp b
jr nc, .asm_3dd20
ld hl, WontObeyText
call PrintText
call PrintHurtItselfText
jp Func_3ddb4
.asm_3dd0e
call BattleRandom
add a
swap a
and $7
jr z, .asm_3dd0e
ld [W_PLAYERMONSTATUS], a ; W_PLAYERMONSTATUS
ld hl, BeganToNapText
jr .asm_3dd3a
.asm_3dd20
call BattleRandom
and $3
ld hl, LoafingAroundText
and a
jr z, .asm_3dd3a
ld hl, WontObeyText
dec a
jr z, .asm_3dd3a
ld hl, TurnedAwayText
dec a
jr z, .asm_3dd3a
ld hl, IgnoredOrdersText
.asm_3dd3a
call PrintText
jr Func_3ddb4
.asm_3dd3f
ld a, [W_PLAYERMONMOVES + 1]
and a
jr z, .asm_3dd20
ld a, [wccee]
and a
jr nz, .asm_3dd20
ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove
cp $a5
jr z, .asm_3dd20
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
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] ; wCurrentMenuItem
ld c, a
ld b, $0
add hl, bc
ld a, [hl]
and $3f
ld b, a
pop af
cp b
jr z, .asm_3dd20
ld a, $1
ld [wcced], a
ld a, [wMaxMenuItem] ; wMaxMenuItem
ld b, a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld c, a
.asm_3dd86
call BattleRandom
and $3
cp b
jr nc, .asm_3dd86
cp c
jr z, .asm_3dd86
ld [wCurrentMenuItem], a ; wCurrentMenuItem
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
ld e, a
ld d, $0
add hl, de
ld a, [hl]
and a
jr z, .asm_3dd86
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld c, a
ld b, $0
ld hl, W_PLAYERMONMOVES
add hl, bc
ld a, [hl]
ld [wPlayerSelectedMove], a ; wPlayerSelectedMove
call GetCurrentMove
Func_3ddb0: ; 3ddb0 (f:5db0)
ld a, $1
and a
ret
Func_3ddb4: ; 3ddb4 (f:5db4)
xor a
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 "@"
CalculateDamage: ; 3ddcf (f:5dcf)
xor a
ld hl, W_DAMAGE ;damage to eventually inflict, intitialise to zero
ldi [hl], a
ld [hl], a
ld hl, W_PLAYERMOVEPOWER
ld a, [hli] ;*read attack base power
and a
ld d, a ;*D = attack base, used later
ret z ;return if attack is zero
ld a, [hl] ;*test attacking type
cp a, $14 ;types >= $14 are all special
jr nc, .specialAttack
.physicalAttack
ld hl, W_ENEMYMONDEFENSE ;opponent defense
ld a, [hli] ;*BC = opponent defense used later
ld b, a
ld c, [hl]
ld a, [W_ENEMYBATTSTATUS3] ;test for reflect
bit 2, a
jr z, .next
.doubleDefense
sla c ;x2 defense if bit2 of D069 is set
rl b
.next
ld hl, W_PLAYERMONATK ;attack pointer
ld a, [wd05e]
and a
jr z, .next3
ld c, 3
call Func_3df1c
ld a, [$ff97]
ld b, a
ld a, [$ff98]
ld c, a
push bc
ld hl, W_PARTYMON1_ATACK
ld a, [wPlayerMonNumber]
ld bc, $002c
call AddNTimes
pop bc
jr .next3
.specialAttack
ld hl, W_ENEMYMONSPECIAL ;opponent special
ld a, [hli] ;*BC = opponent special defense used later
ld b, a
ld c, [hl]
ld a, [W_ENEMYBATTSTATUS3] ;test for lightscreen
bit 1, a
jr z, .next2
.doubleSpecialDefense
sla c ;x2 special defense if bit1 of D069 set
rl b
.next2
ld hl, W_PLAYERMONSPECIAL
ld a, [wd05e] ;XXX
and a
jr z, .next3 ;skip portion of code that pulls up inactive pokemon
.loadOtherPoke
ld c, 5
call Func_3df1c
ld a, [$ff97]
ld b, a
ld a, [$ff98]
ld c, a
push bc
ld hl, W_PARTYMON1_SPECIAL
ld a, [wPlayerMonNumber]
ld bc, $002c
call AddNTimes
pop bc
.next3
ld a, [hli] ;HL: when this was taken
ld l, [hl]
ld h, a ;*HL = attacker attack
or b ;is either attack or defense high byte nonzero?
jr z, .next4
srl b ;[defense] BC /= 4 [this is just so it fits into a single byte, 10bits max]
rr c
srl b
rr c
srl h ;[attack] HL /= 4 [to apply equal scaling]
rr l
srl h
rr l
ld a, l
or h
jr nz, .next4 ;is HL result zero?
inc l ;minimum HL = 1
.next4
ld b, l ;*B = attack [possibly scaled] [C contains defense]
ld a, [W_PLAYERMONLEVEL] ;*E = level
ld e, a
ld a, [wd05e] ;critical hit?
and a
jr z, .next5
sla e ;double level if it was a critical hit
.next5
ld a, 1 ;return Z = 0
and a
ret
Func_3de75: ; 3de75 (f:5e75)
ld hl, W_DAMAGE ; W_DAMAGE
xor a
ld [hli], a
ld [hl], a
ld hl, W_ENEMYMOVEPOWER ; wcfce
ld a, [hli]
ld d, a
and a
ret z
ld a, [hl]
cp $14
jr nc, .asm_3debc
ld hl, W_PLAYERMONDEF
ld a, [hli]
ld b, a
ld c, [hl]
ld a, [W_PLAYERBATTSTATUS3] ; W_PLAYERBATTSTATUS3
bit 2, a
jr z, .asm_3de98
sla c
rl b
.asm_3de98
ld hl, W_ENEMYMONATTACK
ld a, [wd05e]
and a
jr z, .asm_3deef
ld hl, W_PARTYMON1_DEFENSE ; wd191
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld bc, $2c
call AddNTimes
ld a, [hli]
ld b, a
ld c, [hl]
push bc
ld c, $2
call Func_3df1c
ld hl, $ff97
pop bc
jr .asm_3deef
.asm_3debc
ld hl, W_PLAYERMONSPECIAL
ld a, [hli]
ld b, a
ld c, [hl]
ld a, [W_PLAYERBATTSTATUS3] ; W_PLAYERBATTSTATUS3
bit 1, a
jr z, .asm_3decd
sla c
rl b
.asm_3decd
ld hl, W_ENEMYMONSPECIAL ; wcffc
ld a, [wd05e]
and a
jr z, .asm_3deef
ld hl, W_PARTYMON1_SPECIAL ; W_PARTYMON1_SPECIAL
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld bc, $2c
call AddNTimes
ld a, [hli]
ld b, a
ld c, [hl]
push bc
ld c, $5
call Func_3df1c
ld hl, $ff97
pop bc
.asm_3deef
ld a, [hli]
ld l, [hl]
ld h, a
or b
jr z, .asm_3df0a
srl b
rr c
srl b
rr c
srl h
rr l
srl h
rr l
ld a, l
or h
jr nz, .asm_3df0a
inc l
.asm_3df0a
ld b, l
ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL
ld e, a
ld a, [wd05e]
and a
jr z, .asm_3df17
sla e
.asm_3df17
ld a, $1
and a
and a
ret
Func_3df1c: ; 3df1c (f:5f1c)
push de
push bc
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
jr nz, .asm_3df40
ld hl, wd8c6
dec c
sla c
ld b, $0
add hl, bc
ld a, [W_ENEMYMONNUMBER] ; W_ENEMYMONNUMBER
ld bc, $2c
call AddNTimes
ld a, [hli]
ld [$ff97], a
ld a, [hl]
ld [$ff98], a
pop bc
pop de
ret
.asm_3df40
ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL
ld [W_CURENEMYLVL], a ; W_CURENEMYLVL
ld a, [wcfe5]
ld [wd0b5], a
call GetMonHeader
ld hl, W_ENEMYMONATKDEFIV
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
MoreCalculateDamage: ; 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 Func_3f132
ld a, [W_MOVEMISSED] ; 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 [wd05e], a
ld a, [H_WHOSETURN] ; $fff3
and a
ld a, [wcfe5]
jr nz, .asm_3e032
ld a, [W_PLAYERMONID]
.asm_3e032
ld [wd0b5], a
call GetMonHeader
ld a, [W_MONHBASESPEED]
ld b, a
srl b ; (effective (base speed/2))
ld a, [H_WHOSETURN] ; $fff3
and a
ld hl, W_PLAYERMOVEPOWER ; W_PLAYERMOVEPOWER
ld de, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
jr z, .calcCriticalHitProbability
ld hl, W_ENEMYMOVEPOWER ; wcfce
ld de, W_ENEMYBATTSTATUS2 ; 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 [wd05e], 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,W_ENEMYMONCURHP
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,W_PLAYERMONLEVEL
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,[W_ENEMYMONCURHP + 1]
ld [wHPBarOldHP],a
sub b
ld [W_ENEMYMONCURHP + 1],a
ld a,[hl]
ld b,a
ld a,[W_ENEMYMONCURHP]
ld [wHPBarOldHP+1],a
sbc b
ld [W_ENEMYMONCURHP],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,W_ENEMYMONCURHP
ld [hli],a
ld [hl],a
.animateHpBar
ld hl,W_ENEMYMONMAXHP
ld a,[hli]
ld [wHPBarMaxHP+1],a
ld a,[hl]
ld [wHPBarMaxHP],a
ld hl,W_ENEMYMONCURHP
ld a,[hli]
ld [wHPBarNewHP+1],a
ld a,[hl]
ld [wHPBarNewHP],a
FuncCoord 2, 2
ld hl,Coord
xor a
ld [wListMenuID],a
ld a,$48
call Predef ; animate the HP bar shortening
ApplyAttackToEnemyPokemonDone: ; 3e19d (f:619d)
jp Func_3cd5a ; redraw pokemon names and HP bars
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,W_PLAYERMONCURHP
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,W_ENEMYMONLEVEL
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,[W_PLAYERMONCURHP + 1]
ld [wHPBarOldHP],a
sub b
ld [W_PLAYERMONCURHP + 1],a
ld [wHPBarNewHP],a
ld b,[hl]
ld a,[W_PLAYERMONCURHP]
ld [wHPBarOldHP+1],a
sbc b
ld [W_PLAYERMONCURHP],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,W_PLAYERMONCURHP
ld [hli],a
ld [hl],a
ld hl,wHPBarNewHP
ld [hli],a
ld [hl],a
.animateHpBar
ld hl,W_PLAYERMONMAXHP
ld a,[hli]
ld [wHPBarMaxHP+1],a
ld a,[hl]
ld [wHPBarMaxHP],a
FuncCoord 10, 9
ld hl,Coord
ld a,$01
ld [wListMenuID],a
ld a,$48
call Predef ; animate the HP bar shortening
ApplyAttackToPlayerPokemonDone
jp Func_3cd5a ; redraw pokemon names and HP bars
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 Func_3cd5a ; redraw pokemon names and HP bars
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_MOVES + 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,W_PLAYERMONPP
ld de,W_PARTYMON1_MOVE1PP
ld a,[wPlayerMoveListIndex]
jr z,.next
; values for enemy turn
ld hl,W_ENEMYMONPP
ld de,wd8c1 ; enemy party pokemon 1 PP
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,[W_ENEMYMONNUMBER] ; value for enemy turn
.next2
ld bc,$002c
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,W_PLAYERMONTYPES
ld a,[hli]
ld b,a ; b = type 1 of attacker
ld c,[hl] ; c = type 2 of attacker
ld hl,W_ENEMYMONTYPES
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,W_ENEMYMONTYPES
ld a,[hli]
ld b,a ; b = type 1 of attacker
ld c,[hl] ; c = type 2 of attacker
ld hl,W_PLAYERMONTYPES
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,W_PLAYERMONTYPES
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,W_ENEMYMONSTATUS
ld a,[H_WHOSETURN]
and a
jr z,.dreamEaterCheck
; enemy's turn
ld hl,W_PLAYERBATTSTATUS1
ld de,W_ENEMYMOVEEFFECT
ld bc,W_PLAYERMONSTATUS
.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 ; $03
jp z,.moveMissed
cp a,DREAM_EATER_EFFECT ; $08
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
Func_3e687: ; 3e687 (f:6687)
ld hl, W_DAMAGE ; W_DAMAGE
ld a, [hli]
and a
jr nz, .asm_3e692
ld a, [hl]
cp $2
ret c
.asm_3e692
xor a
ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND)
dec hl
ld a, [hli]
ld [$ff97], a
ld a, [hl]
ld [$ff98], a
.asm_3e69c
call BattleRandom
rrca
cp $d9
jr c, .asm_3e69c
ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
call Multiply
ld a, $ff
ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN)
ld b, $4
call Divide
ld a, [$ff97]
ld hl, W_DAMAGE ; W_DAMAGE
ld [hli], a
ld a, [$ff98]
ld [hl], a
ret
Func_3e6bc: ; 3e6bc (f:66bc)
ld a, [wEnemySelectedMove] ; wccdd
inc a
jp z, Func_3e88c
call PrintGhostText
jp z, Func_3e88c
ld a, [W_ISLINKBATTLE] ; 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 ; W_MOVEMISSED
ld [wccf4], a
ld a, $a
ld [wd05b], a
call Func_3e88f
jr nz, .asm_3e6f2
jp [hl]
.asm_3e6f2
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
bit 4, [hl]
jr nz, asm_3e70b
call GetCurrentMove
Func_3e6fc: ; 3e6fc (f:66fc)
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
cp CHARGE_EFFECT
jp z, Func_3f132
cp FLY_EFFECT
jp z, Func_3f132
jr asm_3e72b
asm_3e70b: ; 3e70b (f:670b)
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
res 4, [hl] ; no longer charging up for attack
res 6, [hl] ; no longer invulnerable to typcial attacks
ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM
ld [wd0b5], a
ld a, $2c
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] ; W_ENEMYMOVEEFFECT
ld hl, EffectsArray1 ; $4000
ld de, $1
call IsInArray
jp c, Func_3f132
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
ld hl, EffectsArray5B ; $4049
ld de, $1
call IsInArray
call c, Func_3f132
asm_3e750: ; 3e750 (f:6750)
call Func_3ec81
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
ld hl, EffectsArray2 ; $4011
ld de, $1
call IsInArray
jp c, Func_3e77f
call CriticalHitTest
call HandleCounterMove
jr z, asm_3e782
call Func_3ec81
call Func_3de75
call Func_3ec81
call MoreCalculateDamage
jp z, Func_3e7d1
call AdjustDamageForMoveType
call Func_3e687
Func_3e77f: ; 3e77f (f:677f)
call MoveHitTest
asm_3e782: ; 3e782 (f:6782)
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
and a
jr z, .asm_3e791
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
cp EXPLODE_EFFECT
jr z, asm_3e7a0
jr Func_3e7d1
.asm_3e791
call Func_3ec81
Func_3e794: ; 3e794 (f:6794)
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
and a
ld a, $1
jr z, asm_3e7a4
ld a, $2
jr asm_3e7a4
asm_3e7a0: ; 3e7a0 (f:67a0)
call Func_3ec81
xor a
asm_3e7a4: ; 3e7a4 (f:67a4)
push af
ld a, [W_ENEMYBATTSTATUS2] ; 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] ; W_ENEMYMOVENUM
call PlayMoveAnimation
call Func_3eed3
call Func_3cdec
ld a, [W_ENEMYBATTSTATUS2] ; 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 Func_3ec81
ld c, $1e
call DelayFrames
ld a, [W_ENEMYMOVEEFFECT] ; 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] ; 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] ; W_ENEMYMOVEEFFECT
ld hl, EffectsArray3 ; $4014
ld de, $1
call IsInArray
jp c, Func_3f132
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
and a
jr z, .asm_3e82b
call PrintMoveFailureText
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
cp EXPLODE_EFFECT
jr z, .asm_3e83e
jp Func_3e88c
.asm_3e82b
call ApplyAttackToPlayerPokemon
call Func_3dc5c
callab DisplayEffectiveness
ld a, $1
ld [wccf4], a
.asm_3e83e
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
ld hl, EffectsArray4 ; $4030
ld de, $1
call IsInArray
call c, Func_3f132
ld hl, W_PLAYERMONCURHP ; wd015
ld a, [hli]
ld b, [hl]
or b
ret z
call HandleBuildingRage
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
bit 2, [hl] ; is mon hitting multiple times? (example: double kick)
jr z, .asm_3e873
push hl
ld hl, wd06f
dec [hl]
pop hl
jp nz, Func_3e794
res 2, [hl] ; mon is no longer hitting multiple times
ld hl, HitXTimesText ; $6887
call PrintText
xor a
ld [wcd05], a
.asm_3e873
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
and a
jr z, Func_3e88c
ld hl, EffectsArray5 ; $403b
ld de, $1
call IsInArray
call nc, Func_3f132
jr Func_3e88c
HitXTimesText: ; 3e887 (f:6887)
TX_FAR _HitXTimesText
db "@"
Func_3e88c: ; 3e88c (f:688c)
ld b, $1
ret
Func_3e88f: ; 3e88f (f:688f)
ld hl, W_ENEMYMONSTATUS ; wcfe9
ld a, [hl]
and $7
jr z, .asm_3e8bf
dec a
ld [W_ENEMYMONSTATUS], a ; wcfe9
and a
jr z, .asm_3e8af
ld hl, FastAsleepText
call PrintText
xor a
ld [wcc5b], a
ld a,SLP_ANIM
call PlayMoveAnimation
jr .asm_3e8b5
.asm_3e8af
ld hl, WokeUpText
call PrintText
.asm_3e8b5
xor a
ld [wccf2], a
ld hl, Func_3e88c ; $688c
jp Func_3eab8
.asm_3e8bf
bit 5, [hl]
jr z, .asm_3e8d3
ld hl, IsFrozenText
call PrintText
xor a
ld [wccf2], a
ld hl, Func_3e88c ; $688c
jp Func_3eab8
.asm_3e8d3
ld a, [W_PLAYERBATTSTATUS1] ; W_PLAYERBATTSTATUS1
bit 5, a
jp z, Func_3e8e7
ld hl, CantMoveText
call PrintText
ld hl, Func_3e88c ; $688c
jp Func_3eab8
Func_3e8e7: ; 3e8e7 (f:68e7)
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
bit 3, [hl]
jp z, Func_3e8fd
res 3, [hl]
ld hl, FlinchedText
call PrintText
ld hl, Func_3e88c ; $688c
jp Func_3eab8
Func_3e8fd: ; 3e8fd (f:68fd)
ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
bit 5, [hl]
jr z, .asm_3e912
res 5, [hl]
ld hl, MustRechargeText
call PrintText
ld hl, Func_3e88c ; $688c
jp Func_3eab8
.asm_3e912
ld hl, W_ENEMYDISABLEDMOVE ; W_ENEMYDISABLEDMOVE
ld a, [hl]
and a
jr z, .asm_3e929
dec a
ld [hl], a
and $f
jr nz, .asm_3e929
ld [hl], a
ld [wccef], a
ld hl, DisabledNoMoreText
call PrintText
.asm_3e929
ld a, [W_ENEMYBATTSTATUS1] ; W_ENEMYBATTSTATUS1
add a
jp nc, Func_3e9aa
ld hl, wd070
dec [hl]
jr nz, .asm_3e944
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
res 7, [hl]
ld hl, ConfusedNoMoreText
call PrintText
jp Func_3e9aa
.asm_3e944
ld hl, IsConfusedText
call PrintText
xor a
ld [wcc5b], a
ld a,CONF_ANIM
call PlayMoveAnimation
call BattleRandom
cp $80
jr c, Func_3e9aa
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld a, [hl]
and $80
ld [hl], a
ld hl, HurtItselfText
call PrintText
ld hl, W_PLAYERMONDEF
ld a, [hli]
push af
ld a, [hld]
push af
ld a, [W_ENEMYMONDEFENSE] ; wcff8
ld [hli], a
ld a, [W_ENEMYMONDEFENSE + 1]
ld [hl], a
ld hl, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
push hl
ld a, [hl]
push af
xor a
ld [hli], a
ld [wd05e], a
ld a, $28
ld [hli], a
xor a
ld [hl], a
call Func_3de75
call MoreCalculateDamage
pop af
pop hl
ld [hl], a
ld hl, W_PLAYERMONDEF + 1
pop af
ld [hld], a
pop af
ld [hl], a
xor a
ld [wcc5b], a
ld [H_WHOSETURN], a ; $fff3
ld a, POUND
call PlayMoveAnimation
ld a, $1
ld [H_WHOSETURN], a ; $fff3
call ApplyDamageToEnemyPokemon
jr asm_3e9d3
Func_3e9aa: ; 3e9aa (f:69aa)
ld a, [wccef]
and a
jr z, .asm_3e9bf
ld hl, wEnemySelectedMove ; wccdd
cp [hl]
jr nz, .asm_3e9bf
call PrintMoveIsDisabledText
ld hl, Func_3e88c ; $688c
jp Func_3eab8
.asm_3e9bf
ld hl, W_ENEMYMONSTATUS ; wcfe9
bit 6, [hl]
jr z, asm_3e9f6
call BattleRandom
cp $3f
jr nc, asm_3e9f6
ld hl, FullyParalyzedText
call PrintText
asm_3e9d3: ; 3e9d3 (f:69d3)
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld a, [hl]
and $cc
ld [hl], a
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
cp FLY_EFFECT
jr z, .asm_3e9e7
cp CHARGE_EFFECT
jr z, .asm_3e9e7
jr .asm_3e9f0
.asm_3e9e7
xor a
ld [wcc5b], a
ld a, STATUS_AFFECTED_ANIM
call PlayMoveAnimation
.asm_3e9f0
ld hl, Func_3e88c ; $688c
jp Func_3eab8
asm_3e9f6: ; 3e9f6 (f:69f6)
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
bit 0, [hl] ; is mon using bide?
jr z, .asm_3ea54
xor a
ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM
ld hl, W_DAMAGE ; 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, wd06f
dec [hl]
jr z, .asm_3ea1c
ld hl, Func_3e88c ; $688c
jp Func_3eab8
.asm_3ea1c
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
res 0, [hl]
ld hl, UnleashedEnergyText
call PrintText
ld a, $1
ld [W_ENEMYMOVEPOWER], a ; wcfce
ld hl, wcd06
ld a, [hld]
add a
ld b, a
ld [wd0d8], a
ld a, [hl]
rl a
ld [W_DAMAGE], a ; W_DAMAGE
or b
jr nz, .asm_3ea43
ld a, $1
ld [W_MOVEMISSED], a ; W_MOVEMISSED
.asm_3ea43
xor a
ld [hli], a
ld [hl], a
ld a, BIDE
ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM
call Func_3ec81
ld hl, asm_3e782 ; $6782
jp Func_3eab8
.asm_3ea54
bit 1, [hl] ; is mon using thrash or petal dance?
jr z, .asm_3ea83
ld a, THRASH
ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM
ld hl, ThrashingAboutText
call PrintText
ld hl, wd06f
dec [hl]
ld hl, asm_3e750 ; $6750
jp nz, Func_3eab8
push hl
ld hl, W_ENEMYBATTSTATUS1 ; 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 Func_3eab8
.asm_3ea83
bit 5, [hl] ; is mon using multi-turn move?
jp z, Func_3ea9b
ld hl, AttackContinuesText
call PrintText
ld hl, wd06f
dec [hl]
ld hl, Func_3e794 ; $6794
jp nz, Func_3eab8
jp Func_3eab8
Func_3ea9b: ; 3ea9b (f:6a9b)
ld a, [W_ENEMYBATTSTATUS2] ; W_ENEMYBATTSTATUS2
bit 6, a ; is mon using rage?
jp z, Func_3eaba
ld a, RAGE
ld [wd11e], a
call GetMoveName
call CopyStringToCF4B
xor a
ld [W_ENEMYMOVEEFFECT], a ; W_ENEMYMOVEEFFECT
ld hl, asm_3e72b ; $672b
jp Func_3eab8
Func_3eab8: ; 3eab8 (f:6ab8)
xor a
ret
Func_3eaba: ; 3eaba (f:6aba)
ld a, $1
and a
ret
GetCurrentMove: ; 3eabe (f:6abe)
ld a, [H_WHOSETURN] ; $fff3
and a
jp z, .player
ld de, W_ENEMYMOVENUM ; W_ENEMYMOVENUM
ld a, [wEnemySelectedMove] ; wccdd
jr .selected
.player
ld de, W_PLAYERMOVENUM ; wcfd2
ld a, [W_FLAGS_D733]
bit 0, a
ld a, [wccd9]
jr nz, .selected
ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove
.selected
ld [wd0b5], a
dec a
ld hl, Moves ; $4000
ld bc, $6
call AddNTimes
ld a, BANK(Moves)
call FarCopyData
ld a, $2c
ld [wPredefBank], a
ld a, $2
ld [W_LISTTYPE], a ; list type 2 = move name
call GetName
ld de, wcd6d
jp CopyStringToCF4B
Func_3eb01: ; 3eb01 (f:6b01)
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
jp z, Func_3cc13
ld a, [W_ENEMYMONID]
ld [wcfe5], a
ld [wd0b5], a
call GetMonHeader
ld a, [W_ENEMYBATTSTATUS3] ; W_ENEMYBATTSTATUS3
bit 3, a
ld hl, wcceb
ld a, [hli]
ld b, [hl]
jr nz, .asm_3eb33
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
cp $2
ld a, $98
ld b, $88
jr z, .asm_3eb33
call BattleRandom
ld b, a
call BattleRandom
.asm_3eb33
ld hl, W_ENEMYMONATKDEFIV
ld [hli], a
ld [hl], b
ld de, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
ld a, [W_CURENEMYLVL] ; W_CURENEMYLVL
ld [de], a
inc de
ld b, $0
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
push hl
call CalcStats
pop hl
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
cp $2
jr z, .asm_3eb65
ld a, [W_ENEMYBATTSTATUS3] ; W_ENEMYBATTSTATUS3
bit 3, a
jr nz, .asm_3eb86
ld a, [W_ENEMYMONMAXHP] ; W_ENEMYMONMAXHP
ld [hli], a
ld a, [W_ENEMYMONMAXHP+1]
ld [hli], a
xor a
inc hl
ld [hl], a
jr .asm_3eb86
.asm_3eb65
ld hl, W_ENEMYMON1HP ; wd8a5 (aliases: W_WATERMONS)
ld a, [wWhichPokemon] ; wWhichPokemon
ld bc, $2c
call AddNTimes
ld a, [hli]
ld [W_ENEMYMONCURHP], a ; W_ENEMYMONCURHP
ld a, [hli]
ld [W_ENEMYMONCURHP + 1], a
ld a, [wWhichPokemon] ; wWhichPokemon
ld [W_ENEMYMONNUMBER], a ; W_ENEMYMONNUMBER
inc hl
ld a, [hl]
ld [W_ENEMYMONSTATUS], a ; wcfe9
jr .asm_3eb86
.asm_3eb86
ld hl, W_MONHTYPES
ld de, W_ENEMYMONTYPES ; wcfea
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] ; W_ISINBATTLE
cp $2
jr nz, .asm_3ebb0
ld hl, wd8ac
ld a, [wWhichPokemon] ; wWhichPokemon
ld bc, $2c
call AddNTimes
ld bc, $4
call CopyData
jr .asm_3ebca
.asm_3ebb0
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
ld a, $3e
call Predef ; indirect jump to WriteMonMoves (3afb8 (e:6fb8))
.asm_3ebca
ld hl, W_ENEMYMONMOVES
ld de, W_ENEMYMONSPECIAL + 1
ld a, $5e
call Predef ; indirect jump to LoadMovePPs (f473 (3:7473))
ld hl, W_MONHBASESTATS
ld de, wd002
ld b, $5
.asm_3ebdd
ld a, [hli]
ld [de], a
inc de
dec b
jr nz, .asm_3ebdd
ld hl, W_MONHCATCHRATE
ld a, [hli]
ld [de], a
inc de
ld a, [hl] ; base exp
ld [de], a
ld a, [W_ENEMYMONID]
ld [wd11e], a
call GetMonName
ld hl, wcd6d
ld de, W_ENEMYMONNAME
ld bc, $b
call CopyData
ld a, [W_ENEMYMONID]
ld [wd11e], a
ld a, $3a
call Predef ; indirect jump to IndexToPokedex (41010 (10:5010))
ld a, [wd11e]
dec a
ld c, a
ld b, $1
ld hl, wPokedexSeen ; wd30a
ld a, $10 ; FlagActionPredef
call Predef
ld hl, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
ld de, wcd23
ld bc, $b
call CopyData
ld a, $7
ld b, $8
ld hl, wEnemyMonStatMods ; wcd2e
.asm_3ec2d
ld [hli], a
dec b
jr nz, .asm_3ec2d
ret
Func_3ec32: ; 3ec32 (f:6c32)
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
jr nz, .asm_3ec4d
xor a
ld [wMenuJoypadPollCount], a ; wMenuJoypadPollCount
callab Func_372d6
ld a, $1
ld [wcfcb], a
call ClearScreen
.asm_3ec4d
call DelayFrame
ld a, $30
call Predef ; indirect jump to Func_7096d (7096d (1c:496d))
callab Func_3ee58
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld a, $ff
ld [wcfcb], a
call ClearSprites
call ClearScreen
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld [$ffb0], a
ld [rWY], a ; $ff4a
ld [$ffd7], a
ld hl, wd060
ld [hli], a
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
ld [W_PLAYERDISABLEDMOVE], a ; W_PLAYERDISABLEDMOVE
ret
Func_3ec81: ; 3ec81 (f:6c81)
push bc
ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL
ld b, a
ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL
ld [W_PLAYERMONLEVEL], a ; W_PLAYERMONLEVEL
ld a, b
ld [W_ENEMYMONLEVEL], a ; W_ENEMYMONLEVEL
pop bc
ret
Func_3ec92: ; 3ec92 (f:6c92)
ld a, [W_BATTLETYPE] ; wd05a
dec a
ld de, RedPicBack ; $7e0a
jr nz, .asm_3ec9e
ld de, OldManPic ; $7e9a
.asm_3ec9e
ld a, BANK(RedPicBack)
call UncompressSpriteFromDE
ld a, $3
call Predef ; indirect jump to ScaleSpriteByTwo (2fe40 (b:7e40))
ld hl, wOAMBuffer
xor a
ld [H_DOWNARROWBLINKCNT1], a ; $ff8b
ld b, $7
ld e, $a0
.asm_3ecb2
ld c, $3
ld d, $38
.asm_3ecb6
ld [hl], d
inc hl
ld [hl], e
ld a, $8
add d
ld d, a
inc hl
ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b
ld [hli], a
inc a
ld [H_DOWNARROWBLINKCNT1], a ; $ff8b
inc hl
dec c
jr nz, .asm_3ecb6
ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b
add $4
ld [H_DOWNARROWBLINKCNT1], a ; $ff8b
ld a, $8
add e
ld e, a
dec b
jr nz, .asm_3ecb2
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
FuncCoord 1, 5
ld hl, Coord
ld a, $1
jp Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6))
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
Func_3ed1a: ; 3ed1a (f:6d1a)
ld a, $1
jr asm_3ed1f
Func_3ed1e: ; 3ed1e (f:6d1e)
xor a
asm_3ed1f: ; 3ed1f (f:6d1f)
ld [H_WHOSETURN], a ; $fff3
call Func_3ed27
jp Func_3ed64
Func_3ed27: ; 3ed27 (f:6d27)
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3ed48
ld a, [W_PLAYERMONSTATUS] ; W_PLAYERMONSTATUS
and $40
ret z
ld hl, W_PLAYERMONSPEED + 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, .asm_3ed46
ld b, $1
.asm_3ed46
ld [hl], b
ret
.asm_3ed48
ld a, [W_ENEMYMONSTATUS] ; wcfe9
and $40
ret z
ld hl, W_ENEMYMONSPEED + 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, .asm_3ed62
ld b, $1
.asm_3ed62
ld [hl], b
ret
Func_3ed64: ; 3ed64 (f:6d64)
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3ed81
ld a, [W_PLAYERMONSTATUS] ; W_PLAYERMONSTATUS
and $10
ret z
ld hl, W_PLAYERMONATK + 1
ld a, [hld]
ld b, a
ld a, [hl]
srl a
rr b
ld [hli], a
or b
jr nz, .asm_3ed7f
ld b, $1
.asm_3ed7f
ld [hl], b
ret
.asm_3ed81
ld a, [W_ENEMYMONSTATUS] ; wcfe9
and $10
ret z
ld hl, W_ENEMYMONATTACK + 1
ld a, [hld]
ld b, a
ld a, [hl]
srl a
rr b
ld [hli], a
or b
jr nz, .asm_3ed97
ld b, $1
.asm_3ed97
ld [hl], b
ret
Func_3ed99: ; 3ed99 (f:6d99)
ld c, $0
.asm_3ed9b
call Func_3eda5
inc c
ld a, c
cp $4
jr nz, .asm_3ed9b
ret
Func_3eda5: ; 3eda5 (f:6da5)
push bc
push bc
ld a, [wd11e]
and a
ld a, c
ld hl, W_PLAYERMONATK
ld de, wcd12
ld bc, wPlayerMonAttackMod ; wcd1a
jr z, .asm_3edc0
ld hl, W_ENEMYMONATTACK
ld de, wcd26
ld bc, wEnemyMonStatMods ; wcd2e
.asm_3edc0
add c
ld c, a
jr nc, .asm_3edc5
inc b
.asm_3edc5
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, .asm_3edd4
inc d
.asm_3edd4
pop bc
push hl
ld hl, StatModifierRatios ; $76cb
dec b
sla b
ld c, b
ld b, $0
add hl, 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_3ee0c
ld a, $3
ld [$ff97], a
ld a, $e7
ld [$ff98], a
Func_3ee0c: ; 3ee0c (f:6e0c)
ld a, [$ff97]
ld [hli], a
ld b, a
ld a, [$ff98]
ld [hl], a
or b
jr nz, .asm_3ee17
inc [hl]
.asm_3ee17
pop bc
ret
Func_3ee19: ; 3ee19 (f:6e19)
ld a, [W_ISLINKBATTLE]
cp $4
ret z
ld a, [W_OBTAINEDBADGES]
ld b, a
ld hl, W_PLAYERMONATK
ld c, $4
.asm_3ee28
srl b
call c, Func_3ee35
inc hl
inc hl
srl b
dec c
jr nz, .asm_3ee28
ret
Func_3ee35: ; 3ee35 (f:6e35)
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 $e7
ld a, [hl]
sbc $3
ret c
ld a, $3
ld [hli], a
ld a, $e7
ld [hld], a
ret
Func_3ee58: ; 3ee58 (f:6e58)
call LoadHpBarAndStatusTilePatterns
Func_3ee5b: ; 3ee5b (f:6e5b)
ld a, [rLCDC] ; $ff40
add a
jr c, .asm_3ee7c
ld hl, BattleHudTiles1 ; $6080
ld de, vChars2 + $6d0
ld bc, $18
ld a, BANK(BattleHudTiles1)
call FarCopyDataDouble
ld hl, BattleHudTiles2 ; $6098
ld de, vChars2 + $730
ld bc, $30
ld a, BANK(BattleHudTiles2)
jp FarCopyDataDouble
.asm_3ee7c
ld de, BattleHudTiles1 ; $6080
ld hl, vChars2 + $6d0
ld bc, (BANK(BattleHudTiles1) << 8) + $03
call CopyVideoDataDouble
ld de, BattleHudTiles2 ; $6098
ld hl, vChars2 + $730
ld bc, (BANK(BattleHudTiles2) << 8) + $06
jp CopyVideoDataDouble
Func_3ee94: ; 3ee94 (f:6e94)
ld hl, TerminatorText_3ee9a ; $6e9a
jp PrintText
TerminatorText_3ee9a: ; 3ee9a (f:6e9a)
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] ; $fff3
and a
ld hl, W_ENEMYMONTYPE1 ; wcfea (aliases: W_ENEMYMONTYPES)
ld de, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld a, [W_PLAYERMOVENUM] ; wcfd2
jr z, .asm_3eeea
ld hl, W_PLAYERMONTYPE1 ; wd019 (aliases: W_PLAYERMONTYPES)
ld de, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld a, [W_ENEMYMOVENUM] ; 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] ; 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 MoveAnimationPredef ; predef 8
InitBattle: ; 3ef12 (f:6f12)
ld a, [W_CUROPPONENT] ; wd059
and a
jr z, asm_3ef23
InitOpponent: ; 3ef18 (f:6f18)
ld a, [W_CUROPPONENT] ; wd059
ld [wcf91], a
ld [W_ENEMYMONID], 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
ret nz
.asm_3ef2f
ld a, [wd13c]
and a
ret nz
callab Func_13870
ret nz
asm_3ef3d: ; 3ef3d (f:6f3d)
ld a, [wd35d]
push af
ld hl, wd358
ld a, [hl]
push af
res 1, [hl]
callab Func_525af
ld a, [W_ENEMYMONID]
sub $c8
jp c, InitWildBattle
ld [W_TRAINERCLASS], a ; wd031
call GetTrainerInformation
callab ReadTrainer
call Func_3ec32
call _LoadTrainerPic
xor a
ld [W_ENEMYMONID], a
ld [$ffe1], a
dec a
ld [wAICount], a ; wccdf
FuncCoord 12, 0
ld hl, Coord
ld a, $1
call Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6))
ld a, $ff
ld [W_ENEMYMONNUMBER], a ; W_ENEMYMONNUMBER
ld a, $2
ld [W_ISINBATTLE], a ; W_ISINBATTLE
jp Func_3efeb
InitWildBattle: ; 3ef8b (f:6f8b)
ld a, $1
ld [W_ISINBATTLE], a ; W_ISINBATTLE
call Func_3eb01
call Func_3ec32
ld a, [W_CUROPPONENT] ; wd059
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 ; $66b5
ld a, c
ld [hli], a ; write front sprite pointer
ld [hl], b
ld hl, W_ENEMYMONNAME ; 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 ; wd031
ld [$ffe1], a
FuncCoord 12, 0
ld hl, Coord
ld a, $1
call Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6))
Func_3efeb: ; 3efeb (f:6feb)
ld b, $0
call GoPAL_SET
call Func_3c04c
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld hl, TerminatorText_3f04a
call PrintText
call SaveScreenTilesToBuffer1
call ClearScreen
ld a, $98
ld [$ffbd], a
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
call Delay3
ld a, $9c
ld [$ffbd], a
call LoadScreenTilesFromBuffer1
FuncCoord 9, 7
ld hl, Coord
ld bc, $50a
call ClearScreenArea
FuncCoord 1, 0
ld hl, Coord
ld bc, $40a
call ClearScreenArea
call ClearSprites
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
call z, Func_3cdec
call Func_3c11e
callab Func_137aa
pop af
ld [wd358], a
pop af
ld [wd35d], a
ld a, [wd0d4]
ld [$ffd7], a
scf
ret
TerminatorText_3f04a: ; 3f04a (f:704a)
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] ; 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 ; $ff8b
ld b, $4c
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
and a
jr z, .asm_3f0bc
add b
ld [hl], a
call Delay3
ld bc, $ffd7
add hl, bc
ld a, $1
ld [wcd6c], a
ld bc, $303
ld a, $5
call Predef ; indirect jump to Func_79aba (79aba (1e:5aba))
ld c, $4
call DelayFrames
ld bc, $ffd7
add hl, bc
xor a
ld [wcd6c], a
ld bc, $505
ld a, $5
call Predef ; indirect jump to Func_79aba (79aba (1e:5aba))
ld c, $5
call DelayFrames
ld bc, $ffd7
jr .asm_3f0bf
.asm_3f0bc
ld bc, $ff85
.asm_3f0bf
add hl, bc
ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b
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
LoadMonBackSprite:
; Assumes the monster's attributes have
; been loaded with GetMonHeader.
ld a, [wcfd9]
ld [wcf91], a
FuncCoord 1, 5
ld hl, Coord
ld b, $7
ld c, $8
call ClearScreenArea
ld hl, W_MONHBACKSPRITE - W_MONHEADER
call UncompressMonSprite
ld a, $3
call Predef ; indirect jump to ScaleSpriteByTwo (2fe40 (b:7e40))
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
Func_3f132: ; 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, W_ENEMYMONSTATUS ; wcfe9
ld bc, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
ld a, [H_WHOSETURN] ; $fff3
and a
jp z, .asm_3f20e
ld de, W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS
ld bc, W_PLAYERBATTSTATUS2 ; 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] ; 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, W_ENEMYMONSTATUS ; wcfe9
ld de, W_PLAYERMOVEEFFECT ; wcfd3
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f260
ld hl, W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS
ld de, W_ENEMYMOVEEFFECT ; 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] ; 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] ; $fff3
and a
ld b, $c7
ld hl, W_PLAYERBATTSTATUS3 ; W_PLAYERBATTSTATUS3
ld a, [de]
ld de, W_PLAYERTOXICCOUNTER ; wd06c
jr nz, .asm_3f2b0
ld b, $a9
ld hl, W_ENEMYBATTSTATUS3 ; W_ENEMYBATTSTATUS3
ld de, W_ENEMYTOXICCOUNTER ; wd071
.asm_3f2b0
cp $5c
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, W_PLAYERMONCURHP ; wd015
ld de, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f302
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
ld de, W_ENEMYBATTSTATUS2 ; 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, [W_ENEMYMONSTATUS]
and a
jp nz, CheckDefrost
;opponent has no existing status
ld a, [W_PLAYERMOVETYPE]
ld b, a
ld a, [W_ENEMYMONTYPE1]
cp b
ret z ;return if they match [can't freeze an ice type etc.]
ld a, [W_ENEMYMONTYPE2]
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 [W_ENEMYMONSTATUS], a
call Func_3ed27 ;quarter speed of affected monster
ld a, $a9
call Func_3fbb9 ;animation
jp PrintMayNotAttackText ;print paralysis text
.burn
ld a, 1 << BRN
ld [W_ENEMYMONSTATUS], a
call Func_3ed64
ld a, $a9
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 [W_ENEMYMONSTATUS], a
ld a, $a9
call Func_3fbb9 ;animation
ld hl, FrozenText
jp PrintText
opponentAttacker: ; 3f382 (f:7382)
ld a, [W_PLAYERMONSTATUS] ;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, [W_PLAYERMONTYPE1]
cp b
ret z
ld a, [W_PLAYERMONTYPE2]
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 [W_PLAYERMONSTATUS], a
call Func_3ed27
jp PrintMayNotAttackText
.burn
ld a, 1 << BRN
ld [W_PLAYERMONSTATUS], a
call Func_3ed64
ld hl, BurnedText
jp PrintText
.freeze
ld a, 1 << FRZ
ld [W_PLAYERMONSTATUS], 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 [W_ENEMYMONSTATUS], a ;set opponent status to 00 ["defrost" a frozen monster]
ld hl, wd8a8 ;status of first opponent monster in their roster
ld a, [W_ENEMYMONNUMBER]
ld bc, $002c ;$2C bytes per roster entry
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 [W_PLAYERMONSTATUS], a
ld hl, W_PARTYMON1_STATUS
ld a, [wPlayerMonNumber]
ld bc, $002c
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 ; wcd1a
ld de, W_PLAYERMOVEEFFECT ; wcfd3
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f439
ld hl, wEnemyMonStatMods ; wcd2e
ld de, W_ENEMYMOVEEFFECT ; 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, W_PLAYERMONATK + 1
ld de, wcd12
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f472
ld hl, W_ENEMYMONATTACK + 1
ld de, wcd26
.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 ; $76cb
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 ; W_PLAYERBATTSTATUS2
ld de, W_PLAYERMOVENUM ; wcfd2
ld bc, wccf7
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f4e6
ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
ld de, W_ENEMYMOVENUM ; 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] ; $fff3
and a
call z, Func_3ee19
ld hl, MonsStatsRoseText
call PrintText
call Func_3ed27
jp Func_3ed64
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] ; $fff3
and a
ld a, [W_PLAYERMOVEEFFECT] ; wcfd3
jr z, .asm_3f53b
ld a, [W_ENEMYMOVEEFFECT] ; 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 ; wcd2e
ld de, W_PLAYERMOVEEFFECT ; wcfd3
ld bc, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f572
ld hl, wPlayerMonStatMods ; wcd1a
ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
ld bc, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld a, [W_ISLINKBATTLE] ; 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] ; 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, W_ENEMYMONATTACK + 1
ld de, wcd26
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f5d8
ld hl, W_PLAYERMONATK + 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 ; $76cb
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] ; $fff3
and a
call nz, Func_3ee19
ld hl, MonsStatsFellText
call PrintText
call Func_3ed27
jp Func_3ed64
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] ; $fff3
and a
ld a, [W_PLAYERMOVEEFFECT] ; wcfd3
jr z, .asm_3f674
ld a, [W_ENEMYMOVEEFFECT] ; 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, wd06a
ld a, [H_WHOSETURN]
and a
jr z, .asm_3f6fc
ld hl, W_ENEMYBATTSTATUS1
ld de, wcd05
ld bc, wd06f
.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 $ae
jp Func_3fb96
ThrashPetalDanceEffect: ; 3f717 (f:7717)
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld de, wd06a
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f728
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de, wd06f
.asm_3f728
set 1, [hl] ; mon is now using thrash/petal dance
call BattleRandom
and $1
inc a
inc a
ld [de], a
ld a, [H_WHOSETURN] ; $fff3
add $b0
jp Func_3fb96
SwitchAndTeleportEffect: ; 3f739 (f:7739)
ld a, [H_WHOSETURN] ; $fff3
and a
jr nz, .asm_3f791
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
jr nz, .asm_3f77e
ld a, [W_CURENEMYLVL] ; W_CURENEMYLVL
ld b, a
ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL
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] ; wcfd2
cp TELEPORT
jp nz, PrintDidntAffectText
jp PrintButItFailedText_
.asm_3f76e
call ReadPlayerMonCurHPAndStatus
xor a
ld [wcc5b], a
inc a
ld [wd078], a
ld a, [W_PLAYERMOVENUM] ; wcfd2
jr .asm_3f7e4
.asm_3f77e
ld c, $32
call DelayFrames
ld hl, IsUnaffectedText
ld a, [W_PLAYERMOVENUM] ; wcfd2
cp TELEPORT
jp nz, PrintText
jp PrintButItFailedText_
.asm_3f791
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
jr nz, .asm_3f7d1
ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL
ld b, a
ld a, [W_CURENEMYLVL] ; 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] ; W_ENEMYMOVENUM
cp TELEPORT
jp nz, PrintDidntAffectText
jp PrintButItFailedText_
.asm_3f7c1
call ReadPlayerMonCurHPAndStatus
xor a
ld [wcc5b], a
inc a
ld [wd078], a
ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM
jr .asm_3f7e4
.asm_3f7d1
ld c, $32
call DelayFrames
ld hl, IsUnaffectedText
ld a, [W_ENEMYMOVENUM] ; 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 ; $7802
cp TELEPORT
jr z, .asm_3f7ff
ld hl, RanAwayScaredText ; $7807
cp ROAR
jr z, .asm_3f7ff
ld hl, WasBlownAwayText ; $780c
.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 ; W_PLAYERBATTSTATUS1
ld de, wd06a
ld bc, W_NUMHITS ; wd074
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f828
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de, wd06f
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 ; wcfd3
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f838
ld hl, W_ENEMYMOVEEFFECT ; 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 ; W_ENEMYBATTSTATUS1
ld de, W_PLAYERMOVEEFFECT ; wcfd3
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f870
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld de, W_ENEMYMOVEEFFECT ; 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 ; W_PLAYERBATTSTATUS1
ld de, W_PLAYERMOVEEFFECT ; wcfd3
ld a, [H_WHOSETURN] ; $fff3
and a
ld b, $ae
jr z, .asm_3f8a1
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
ld b, $af
.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, $64
.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, $c0
.asm_3f8b6
xor a
ld [wcc5b], a
ld a, b
call Func_3fbb9
ld a, [de]
ld [wWhichTrade], a ; wWhichTrade
ld hl, ChargeMoveEffectText ; $78c8
jp PrintText
ChargeMoveEffectText: ; 3f8c8 (f:78c8)
TX_FAR _ChargeMoveEffectText
db $08 ; asm
ld a, [wWhichTrade] ; wWhichTrade
cp RAZOR_WIND
ld hl, MadeWhirlwindText ; $78f9
jr z, .asm_3f8f8
cp SOLARBEAM
ld hl, TookInSunlightText ; $78fe
jr z, .asm_3f8f8
cp SKULL_BASH
ld hl, LoweredItsHeadText ; $7903
jr z, .asm_3f8f8
cp SKY_ATTACK
ld hl, SkyAttackGlowingText ; $7908
jr z, .asm_3f8f8
cp FLY
ld hl, FlewUpHighText ; $790d
jr z, .asm_3f8f8
cp DIG
ld hl, DugAHoleText ; $7912
.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 ; W_PLAYERBATTSTATUS1
ld de, wd06a
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f928
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de, wd06f
.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] ; W_MOVEMISSED
and a
jr nz, Func_3f9a6
Func_3f96f: ; 3f96f (f:796f)
ld a, [H_WHOSETURN] ; $fff3
and a
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld bc, wd070
ld a, [W_PLAYERMOVEEFFECT] ; wcfd3
jr z, .asm_3f986
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld bc, wd06b
ld a, [W_ENEMYMOVEEFFECT] ; 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 ; $79a1
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 ; W_PLAYERBATTSTATUS2
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f9cc
ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
.asm_3f9cc
set 5, [hl] ; mon now needs to recharge
ret
Func_3f9cf: ; 3f9cf (f:79cf)
push hl
ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f9db
ld hl, W_PLAYERBATTSTATUS2 ; 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, W_PLAYERMONMOVES
ld a, [W_PLAYERBATTSTATUS1]
jr nz, .asm_3fa13
ld a, [W_ISLINKBATTLE]
cp $4
jr nz, .asm_3fa3a
ld hl, W_ENEMYMONMOVES
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, W_PLAYERMONMOVES
ld a, [wPlayerMoveListIndex]
jr z, .asm_3fa5f
ld hl, W_ENEMYMONMOVES
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, W_ENEMYMONMOVES
ld a, [wCurrentMenuItem]
ld c, a
ld b, $0
add hl, bc
ld d, [hl]
pop af
ld hl, W_PLAYERMONMOVES
.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] ; W_MOVEMISSED
and a
jr nz, .asm_3fb06
ld de, W_ENEMYDISABLEDMOVE ; W_ENEMYDISABLEDMOVE
ld hl, W_ENEMYMONMOVES
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3faa4
ld de, W_PLAYERDISABLEDMOVE ; W_PLAYERDISABLEDMOVE
ld hl, W_PLAYERMONMOVES
.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] ; $fff3
and a
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
jr nz, .asm_3facf
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
cp $4
pop hl
jr nz, .asm_3fae1
push hl
ld hl, W_ENEMYMONPP ; wcffe
.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] ; $fff3
and a
jr nz, .asm_3faf8
inc hl
.asm_3faf8
ld a, [wd11e]
ld [hl], a
call GetMoveName
ld hl, MoveWasDisabledText ; $7b09
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 ; $7b74
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] ; $fff3
and a
ld a, [W_PLAYERMOVENUM] ; wcfd2
jr z, .asm_3fb94
ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM
.asm_3fb94
and a
ret z
Func_3fb96: ; 3fb96 (f:7b96)
ld [W_ANIMATIONID], a ; W_ANIMATIONID
ld a, [H_WHOSETURN] ; $fff3
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] ; $fff3
and a
ld a, [W_PLAYERMOVENUM] ; wcfd2
jr z, .asm_3fbb7
ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM
.asm_3fbb7
and a
ret z
Func_3fbb9: ; 3fbb9 (f:7bb9)
ld [W_ANIMATIONID], a ; W_ANIMATIONID
Func_3fbbc: ; 3fbbc (f:7bbc)
push hl
push de
push bc
ld a, $8
call Predef ; indirect jump to MoveAnimation (78d5e (1e:4d5e))
pop bc
pop de
pop hl
ret