2014-05-22 22:13:20 +00:00
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 SP LASH_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 SP ECIAL_DAMAGE_EFFECT
db - 1
EffectsArray3: ; 3c014 (f:4014)
; non-damaging, stat‐ affecting or status‐ causing moves?
; e.g., Meditate, Bide, Hypnosis
db $ 01
db ATTACK_UP1_EFFECT
db DEFENSE_UP1_EFFECT
db SP EED_UP1_EFFECT
db SP ECIAL_UP1_EFFECT
db ACCURACY_UP1_EFFECT
db EVASION_UP1_EFFECT
db ATTACK_DOWN1_EFFECT
db DEFENSE_DOWN1_EFFECT
db SP EED_DOWN1_EFFECT
db SP ECIAL_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 SP EED_UP2_EFFECT
db SP ECIAL_UP2_EFFECT
db ACCURACY_UP2_EFFECT
db EVASION_UP2_EFFECT
db ATTACK_DOWN2_EFFECT
db DEFENSE_DOWN2_EFFECT
db SP EED_DOWN2_EFFECT
db SP ECIAL_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 $ 1 E
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 $ 1 E
db CH ARGE_EFFECT
db SUPER_FANG_EFFECT
db SP ECIAL_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
2014-05-26 21:04:56 +00:00
ld [ wd125 ], a
2014-05-22 22:13:20 +00:00
call Di sp layTextBoxID
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 5
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 307
call Cl earScreenArea
call Di sableLCD
call LoadFontTilePatterns
call Func_3ee58
2014-05-29 08:31:46 +00:00
ld hl , vBGMap0
2014-05-22 22:13:20 +00:00
ld bc , $ 400
.asm_3c06f
ld a , $ 7 f
ld [ hli ], a
dec bc
ld a , b
or c
jr nz , .asm_3c06f
ld hl , wTileMap
2014-05-29 08:31:46 +00:00
ld de , vBGMap0
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcfcb ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 5
2014-05-22 22:13:20 +00:00
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
2014-05-23 22:34:35 +00:00
call HideSprites
2014-05-22 22:13:20 +00:00
ld hl , PrintBeginningBattleText
ld b , BANK ( PrintBeginningBattleText )
jp Bankswitch
Func_3c0ff: ; 3c0ff (f:40ff)
push bc
2014-05-26 21:04:56 +00:00
ld hl , wOAMBuffer + $ 01
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wccf5 ], a
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
inc a
2014-05-26 21:04:56 +00:00
ld [ wd11d ], a
ld hl , W_ENEMYMON1HP ; wd8a5
2014-05-22 22:13:20 +00:00
ld bc , $ 2 b
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
2014-05-26 21:04:56 +00:00
ld [ wcc3e ], a
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
and a
jp z , Func_3c1ad
.asm_3c161
call InitBattleMenu
ret c
2014-05-26 21:04:56 +00:00
ld a , [ wcd6a ]
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3c161
2014-05-26 21:04:56 +00:00
ld a , [ W_NUMSAFARIBALLS ] ; W_NUMSAFARIBALLS
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3c17a
call LoadScreenTilesFromBuffer1
ld hl , OutOfSafariBallsText
jp PrintText
.asm_3c17a
callab PrintSafariZoneBattleText
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONSPEED + 1 ]
2014-05-22 22:13:20 +00:00
add a
ld b , a
jp c , asm_3c202
2014-05-26 21:04:56 +00:00
ld a , [ wcce9 ]
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3c194
srl b
srl b
.asm_3c194
2014-05-26 21:04:56 +00:00
ld a , [ wcce8 ]
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3c1a0
sla b
jr nc , .asm_3c1a0
ld b , $ ff
.asm_3c1a0
2014-05-24 18:40:38 +00:00
call Random
2014-05-22 22:13:20 +00:00
cp b
jr nc , .asm_3c14f
jr asm_3c202
OutOfSafariBallsText: ; 3c1a8 (f:41a8)
TX_FAR _OutOfSafariBallsText
db "@"
Func_3c1ad: ; 3c1ad (f:41ad)
xor a
2014-05-26 21:04:56 +00:00
ld [ wWhichPokemon ], a ; wWhichPokemon
2014-05-22 22:13:20 +00:00
.asm_3c1b1
call Func_3ca97
jr nz , .asm_3c1bc
2014-05-26 21:04:56 +00:00
ld hl , wWhichPokemon ; wWhichPokemon
2014-05-22 22:13:20 +00:00
inc [ hl ]
jr .asm_3c1b1
.asm_3c1bc
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
ld [ wPlayerMonNumber ], a ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
inc a
2014-05-26 21:04:56 +00:00
ld hl , W_NUMINPARTY ; W_NUMINPARTY
2014-05-22 22:13:20 +00:00
ld c , a
ld b , $ 0
add hl , bc
ld a , [ hl ]
2014-05-26 21:04:56 +00:00
ld [ wcf91 ], a
ld [ wcfd9 ], a
2014-05-22 22:13:20 +00:00
call LoadScreenTilesFromBuffer1
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 5
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld a , $ 9
call Func_3c8df
call SaveScreenTilesToBuffer1
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld c , a
ld b , $ 1
push bc
ld hl , W_PLAYERMONSALIVEFLAGS
2014-05-25 17:09:39 +00:00
ld a , $ 10 ; FlagActionPredef
call Predef
2014-05-26 21:04:56 +00:00
ld hl , wccf5
2014-05-22 22:13:20 +00:00
pop bc
2014-05-25 17:09:39 +00:00
ld a , $ 10 ; FlagActionPredef
call Predef
2014-05-22 22:13:20 +00:00
call Func_3cba6
call LoadScreenTilesFromBuffer1
call Func_3cc91
jr MainInBattleLoop
asm_3c202: ; 3c202 (f:4202)
call LoadScreenTilesFromBuffer1
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
ld hl , WildRanText
jr nz , .asm_3c216
xor a
2014-05-26 21:04:56 +00:00
ld [ wcf0b ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
or [ hl ]
jp z , HandleEnemyMonFainted
call SaveScreenTilesToBuffer1
xor a
2014-05-26 21:04:56 +00:00
ld [ wd11d ], a
ld a , [ W_PLAYERBATTSTATUS2 ]
2014-05-22 22:13:20 +00:00
and $ 60
jr nz , .asm_3c2a6 ; 0x3c252 $52
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 3 , [ hl ]
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 3 , [ hl ]
ld a , [ hl ]
and $ 12
jr nz , .asm_3c2a6 ; 0x3c261 $43
call InitBattleMenu ; show battle menu
ret c
2014-05-26 21:04:56 +00:00
ld a , [ wd078 ]
2014-05-22 22:13:20 +00:00
and a
ret nz
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONSTATUS ]
2014-05-22 22:13:20 +00:00
and $ 27
jr nz , .asm_3c2a6 ; 0x3c271 $33
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERBATTSTATUS1 ]
2014-05-22 22:13:20 +00:00
and $ 21
jr nz , .asm_3c2a6 ; 0x3c278 $2c
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYBATTSTATUS1 ]
2014-05-22 22:13:20 +00:00
bit 5 , a
jr z , .asm_3c288 ; 0x3c27f $7
ld a , $ ff
2014-05-26 21:04:56 +00:00
ld [ wPlayerSelectedMove ], a
2014-05-22 22:13:20 +00:00
jr .asm_3c2a6 ; 0x3c286 $1e
.asm_3c288
2014-05-26 21:04:56 +00:00
ld a , [ wcd6a ]
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3c2a6 ; 0x3c28c $18
2014-05-26 21:04:56 +00:00
ld [ wMoveMenuType ], a
2014-05-22 22:13:20 +00:00
inc a
2014-05-26 21:04:56 +00:00
ld [ W_ANIMATIONID ], a
2014-05-22 22:13:20 +00:00
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc35 ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wcc3e ]
2014-05-22 22:13:20 +00:00
cp $ f
jp z , asm_3c202
cp $ e
jr z , .noLinkBattle
cp $ d
jr z , .noLinkBattle
sub $ 4
jr c , .noLinkBattle
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERBATTSTATUS1 ]
2014-05-22 22:13:20 +00:00
bit 5 , a
jr z , .asm_3c2dd ; 0x3c2c9 $12
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerMoveListIndex ]
2014-05-22 22:13:20 +00:00
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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $ 80
jr c , .playerMovesFirst
jr .enemyMovesFirst
.invertOutcome
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wd078 ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wd078 ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wd078 ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wd078 ]
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONCURHP ; wd015
ld de , W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .playersTurn
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP ; W_ENEMYMONCURHP
ld de , W_ENEMYMONSTATUS ; wcfe9
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , BURN_PSN_ANIM
call PlayMoveAnimation ; play burn/poison animation
pop hl
call HandlePoisonBurnLeechSeed_DecreaseOwnHP
.notBurnedOrPoisoned
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .playersTurn2
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS3 ; W_PLAYERBATTSTATUS3
ld de , W_PLAYERTOXICCOUNTER ; wd06c
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .playersTurn
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS3 ; W_ENEMYBATTSTATUS3
ld de , W_ENEMYTOXICCOUNTER ; wd071
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONMAXHP ; W_ENEMYMONMAXHP
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .playersTurn
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONMAXHP ; wd023
2014-05-22 22:13:20 +00:00
.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)
2014-05-26 21:04:56 +00:00
FuncCoord 10 , 9
2014-05-22 22:13:20 +00:00
ld hl , Coord ; tile pointer to player HP bar
ld a , [ H_WHOSETURN ] ; $fff3
and a
ld a , $ 1
jr z , .playersTurn
2014-05-26 21:04:56 +00:00
FuncCoord 2 , 2
2014-05-22 22:13:20 +00:00
ld hl , Coord ; tile pointer to enemy HP bar
xor a
.playersTurn
push bc
2014-05-26 21:04:56 +00:00
ld [ wListMenuID ], a ; wListMenuID
2014-05-22 22:13:20 +00:00
ld a , $ 48
call Predef ; indirect jump to UpdateHPBar (fa1d (3:7a1d))
pop bc
ret
Func_3c50f: ; 3c50f (f:450f)
2014-05-26 21:04:56 +00:00
ld a , [ wd06a ]
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3c51a
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 5 , [ hl ]
.asm_3c51a
2014-05-26 21:04:56 +00:00
ld a , [ wd06f ]
2014-05-22 22:13:20 +00:00
and a
ret nz
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 5 , [ hl ]
ret
HandleEnemyMonFainted: ; 3c525 (f:4525)
xor a
2014-05-26 21:04:56 +00:00
ld [ wccf0 ], a
2014-05-22 22:13:20 +00:00
call FaintEnemyPokemon
call AnyPlayerPokemonAliveCheck
ld a , d
and a
jp z , HandlePlayerBlackOut
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
or [ hl ]
call nz , Func_3cd60
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
ret z
call AnyEnemyPokemonAliveCheck
jp z , TrainerBattleVictory
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
or [ hl ]
jr nz , .asm_3c555
call Func_3c79b
ret c
call Func_3c7d8
.asm_3c555
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
call Func_3c664
jp z , asm_3c202
xor a
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
jp MainInBattleLoop
FaintEnemyPokemon ; 0x3c567
call ReadPlayerMonCurHPAndStatus
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr z , .wild
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONNUMBER ] ; W_ENEMYMONNUMBER
2014-05-22 22:13:20 +00:00
ld hl , W_ENEMYMON1HP
ld bc , $ 2 c ; mon struct len
call AddNTimes
xor a
ld [ hli ], a
ld [ hl ], a
.wild
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 2 , [ hl ]
xor a
2014-05-26 21:04:56 +00:00
ld [ W_NUMHITS ], a ; wd074
ld hl , wd065 ; enemy statuses
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hli ], a
ld [ hli ], a
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYDISABLEDMOVE ], a ; W_ENEMYDISABLEDMOVE
ld [ wccef ], a
ld [ wccf3 ], a
ld hl , wccf1
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
FuncCoord 12 , 5
2014-05-22 22:13:20 +00:00
ld hl , Coord
2014-05-26 21:04:56 +00:00
FuncCoord 12 , 6
2014-05-22 22:13:20 +00:00
ld de , Coord
call Func_3c893
ld hl , wTileMap
ld bc , $ 40 b
call Cl earScreenArea
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr z , .wild_win
xor a
2014-05-26 21:04:56 +00:00
ld [ wc0f1 ], a
ld [ wc0f2 ], a
2014-05-22 22:13:20 +00:00
ld a , ( SFX_08_48 - SFX_Headers_08 ) / 3 ; SFX_FALL?
call PlaySoundWaitForCurrent
.sfxwait
2014-05-26 21:04:56 +00:00
ld a , [ wc02a ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
or [ hl ]
jr nz , .playermonnotfaint
2014-05-26 21:04:56 +00:00
ld a , [ wccf0 ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcf0b ], a
2014-05-22 22:13:20 +00:00
ld b , EXP__ALL
call IsItemInBag
push af
jr z , .no_exp_all
2014-05-26 21:04:56 +00:00
ld hl , wd002
2014-05-22 22:13:20 +00:00
ld b , $ 7
.exp_all_loop
srl [ hl ]
inc hl
dec b
jr nz , .exp_all_loop
.no_exp_all
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
callab GainExperience
pop af
ret z
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
ld a , [ W_NUMINPARTY ] ; W_NUMINPARTY
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wd083 ], a
ld [ wc02a ], a
2014-05-22 22:13:20 +00:00
inc a
2014-05-26 21:04:56 +00:00
ld [ wccf6 ], a
2014-05-22 22:13:20 +00:00
ret
AnyEnemyPokemonAliveCheck: ; 3c64f (f:464f)
2014-05-26 21:04:56 +00:00
ld a , [ wEnemyPartyCount ] ; wEnemyPartyCount
2014-05-22 22:13:20 +00:00
ld b , a
xor a
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMON1HP ; wd8a5
2014-05-22 22:13:20 +00:00
ld de , $ 2 c
.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)
2014-05-26 21:04:56 +00:00
ld hl , wcf1e
2014-05-22 22:13:20 +00:00
ld e , $ 30
call GetBattleHealthBarColor
callab DrawEnemyPokeballs
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr nz , .asm_3c687
call Func_3d605
2014-05-26 21:04:56 +00:00
ld a , [ wcc3e ]
2014-05-22 22:13:20 +00:00
cp $ f
ret z
call LoadScreenTilesFromBuffer1
.asm_3c687
call EnemySendOut
xor a
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMOVENUM ], a ; W_ENEMYMOVENUM
ld [ wcd6a ], a
ld [ wccd5 ], a
2014-05-22 22:13:20 +00:00
inc a
ret
TrainerBattleVictory: ; 3c696 (f:4696)
call Func_3c643
ld b , MUSIC_DEFEATED_GYM_LEADER
2014-05-26 21:04:56 +00:00
ld a , [ W_GYMLEADERNO ] ; W_GYMLEADERNO
2014-05-22 22:13:20 +00:00
and a
jr nz , .gymleader
ld b , MUSIC_DEFEATED_TRAINER
.gymleader
2014-05-26 21:04:56 +00:00
ld a , [ W_TRAINERCLASS ] ; wd031
2014-05-22 22:13:20 +00:00
cp SONY3 ; final battle against rival
jr nz , .notrival
ld b , MUSIC_DEFEATED_GYM_LEADER
ld hl , W_FLAGS_D733
set 1 , [ hl ]
.notrival
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
ld a , b
call nz , PlayBattleVictoryMusic
ld hl , TrainerDefeatedText
call PrintText
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
ret z
call ScrollTrainerPicAfterBattle
ld c , $ 28
call DelayFrames
call Func_3381
ld hl , MoneyForWinningText
call PrintText
2014-05-26 21:04:56 +00:00
ld de , wPlayerMoney + 2 ; wd349
ld hl , wd07b
2014-05-22 22:13:20 +00:00
ld c , $ 3
2014-05-26 00:27:02 +00:00
ld a , $ b ; AddBCDPredef
jp Predef
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wc0ee ], a
2014-05-22 22:13:20 +00:00
call PlaySoundWaitForCurrent
ld c , BANK ( Music_DefeatedTrainer )
pop af
call PlayMusic
jp Delay3
HandlePlayerMonFainted: ; 3c700 (f:4700)
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wccf0 ], a
2014-05-22 22:13:20 +00:00
call Func_3c741
call AnyPlayerPokemonAliveCheck ; test if any more mons are alive
ld a , d
and a
jp z , HandlePlayerBlackOut
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
or [ hl ]
jr nz , .enemyMonNotFainted
call FaintEnemyPokemon
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
call Func_3c664
jp z , asm_3c202
xor a
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
jp MainInBattleLoop
Func_3c741: ; 3c741 (f:4741)
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld c , a
ld hl , W_PLAYERMONSALIVEFLAGS ; clear fainted mon's alive flag
ld b , $ 0
2014-05-25 17:09:39 +00:00
ld a , $ 10 ; FlagActionPredef
call Predef
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 2 , [ hl ] ; reset "attacking multiple times" flag
2014-05-26 21:04:56 +00:00
ld a , [ wd083 ]
2014-05-22 22:13:20 +00:00
bit 7 , a ; skip sound flag (red bar (?))
jr z , .skipWaitForSound
ld a , $ ff
2014-05-26 21:04:56 +00:00
ld [ wd083 ], a
2014-05-22 22:13:20 +00:00
call WaitForSoundToFinish
.skipWaitForSound
2014-05-26 21:04:56 +00:00
ld hl , wcd05
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ W_PLAYERMONSTATUS ], a ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
call ReadPlayerMonCurHPAndStatus
2014-05-26 21:04:56 +00:00
FuncCoord 9 , 7
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 50 b
call Cl earScreenArea
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 10
2014-05-22 22:13:20 +00:00
ld hl , Coord
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 11
2014-05-22 22:13:20 +00:00
ld de , Coord
call Func_3c893
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcf0b ], a
ld a , [ wccf0 ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
and a
dec a
ret nz
ld hl , UseNextMonText
call PrintText
.asm_3c7ad
2014-05-26 21:04:56 +00:00
FuncCoord 13 , 9
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ a0e
ld a , $ 14
2014-05-26 21:04:56 +00:00
ld [ wd125 ], a
2014-05-22 22:13:20 +00:00
call Di sp layTextBoxID
2014-05-26 21:04:56 +00:00
ld a , [ wd12e ]
2014-05-22 22:13:20 +00:00
cp $ 2
jr z , .asm_3c7c4
and a
ret
.asm_3c7c4
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3c7ad
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_SPEED ; wd193
2014-05-22 22:13:20 +00:00
ld de , W_ENEMYMONSPEED
jp Func_3cab9
UseNextMonText: ; 3c7d3 (f:47d3)
TX_FAR _UseNextMonText
db "@"
Func_3c7d8: ; 3c7d8 (f:47d8)
ld a , $ 2
2014-05-26 21:04:56 +00:00
ld [ wd07d ], a
2014-05-22 22:13:20 +00:00
call Di sp layPartyMenu
.asm_3c7e0
jr nc , .asm_3c7e7
.asm_3c7e2
call GoBackToPartyMenu
jr .asm_3c7e0
.asm_3c7e7
call Func_3ca97
jr z , .asm_3c7e2
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr nz , .asm_3c7fa
inc a
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
call Func_3d605
.asm_3c7fa
xor a
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-23 22:34:35 +00:00
call Cl earSprites
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
ld [ wPlayerMonNumber ], a ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld c , a
ld hl , W_PLAYERMONSALIVEFLAGS
ld b , $ 1
push bc
2014-05-25 17:09:39 +00:00
ld a , $ 10 ; FlagActionPredef
call Predef
2014-05-22 22:13:20 +00:00
pop bc
2014-05-26 21:04:56 +00:00
ld hl , wccf5
2014-05-25 17:09:39 +00:00
ld a , $ 10 ; FlagActionPredef
call Predef
2014-05-22 22:13:20 +00:00
call Func_3cba6
call GBPalWhiteOut
call Func_3ee5b
call LoadScreenTilesFromBuffer1
call GoPAL_SET_CF1C
call GBPalNormal
call Func_3cc91
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr z , .notSony1Battle
2014-05-26 21:04:56 +00:00
ld a , [ W_CUROPPONENT ] ; wd059
2014-05-22 22:13:20 +00:00
cp $ c8 + SONY1
jr nz , .notSony1Battle
ld hl , wTileMap ; sony 1 battle
ld bc , $ 815
call Cl earScreenArea
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr nz , .noLinkBattle
ld hl , LinkBattleLostText
.noLinkBattle
call PrintText
2014-05-26 21:04:56 +00:00
ld a , [ wd732 ]
2014-05-22 22:13:20 +00:00
res 5 , a
2014-05-26 21:04:56 +00:00
ld [ wd732 ], a
2014-05-22 22:13:20 +00:00
call Cl earScreen
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)
2014-05-26 21:04:56 +00:00
ld a , [ wd730 ]
2014-05-22 22:13:20 +00:00
push af
set 6 , a
2014-05-26 21:04:56 +00:00
ld [ wd730 ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wd730 ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a ,[ wPlayerMonNumber ]
2014-05-22 22:13:20 +00:00
ld c , a
ld b , 1
push bc
ld a , $ 10
call Predef
2014-05-26 21:04:56 +00:00
ld hl , wccf5
2014-05-22 22:13:20 +00:00
xor a
ld [ hl ], a
pop bc
ld a , $ 10
call Predef
Func_3c92a: ; 3c92a (f:492a)
xor a
2014-05-26 21:04:56 +00:00
ld hl , wd065
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hli ], a
ld [ hli ], a
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYDISABLEDMOVE ], a
ld [ wccef ], a
ld [ wccf3 ], a
ld hl , wccf1
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hl ], a
dec a
ld [ wAICount ], a
ld hl , W_PLAYERBATTSTATUS1
res 5 ,[ hl ]
2014-05-26 21:04:56 +00:00
FuncCoord 18 , 0
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld a , 8
call Func_3c8df
call Func_3ee94
call SaveScreenTilesToBuffer1
2014-05-26 21:04:56 +00:00
ld a ,[ W_ISLINKBATTLE ]
2014-05-22 22:13:20 +00:00
cp 4
jr nz , .next
2014-05-26 21:04:56 +00:00
ld a ,[ wcc3e ]
2014-05-22 22:13:20 +00:00
sub 4
ld [ wWhichPokemon ], a
jr .next3
.next
ld b , $ FF
.next2
inc b
2014-05-26 21:04:56 +00:00
ld a ,[ W_ENEMYMONNUMBER ]
2014-05-22 22:13:20 +00:00
cp b
jr z , .next2
2014-05-26 21:04:56 +00:00
ld hl , wEnemyMon1Species
2014-05-22 22:13:20 +00:00
ld a , b
ld [ wWhichPokemon ], a
push bc
ld bc , $ 2 C
call AddNTimes
pop bc
inc hl
ld a ,[ hli ]
ld c , a
ld a ,[ hl ]
or c
jr z , .next2
.next3
ld a ,[ wWhichPokemon ]
2014-05-26 21:04:56 +00:00
ld hl , wd8c5
2014-05-22 22:13:20 +00:00
ld bc , $ 2 C
call AddNTimes
ld a ,[ hl ]
2014-05-26 21:04:56 +00:00
ld [ W_CURENEMYLVL ], a
2014-05-22 22:13:20 +00:00
ld a ,[ wWhichPokemon ]
inc a
2014-05-26 21:04:56 +00:00
ld hl , wEnemyPartyCount
2014-05-22 22:13:20 +00:00
ld c , a
ld b , 0
add hl , bc
ld a ,[ hl ]
ld [ W_ENEMYMONID ], a
2014-05-26 21:04:56 +00:00
ld [ wcf91 ], a
2014-05-22 22:13:20 +00:00
call Func_3eb01
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a ,[ hli ]
2014-05-26 21:04:56 +00:00
ld [ wcce3 ], a
2014-05-22 22:13:20 +00:00
ld a ,[ hl ]
2014-05-26 21:04:56 +00:00
ld [ wcce4 ], a
2014-05-22 22:13:20 +00:00
ld a , 1
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a
ld a ,[ wd11d ]
2014-05-22 22:13:20 +00:00
dec a
jr z , .next4
ld a ,[ W_NUMINPARTY ]
dec a
jr z , .next4
2014-05-26 21:04:56 +00:00
ld a ,[ W_ISLINKBATTLE ]
2014-05-22 22:13:20 +00:00
cp 4
jr z , .next4
2014-05-26 21:04:56 +00:00
ld a ,[ W_OPTIONS ]
2014-05-22 22:13:20 +00:00
bit 6 , a
jr nz , .next4
ld hl , TrainerAboutToUseText
call PrintText
2014-05-26 21:04:56 +00:00
FuncCoord 0 , 7
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 0801
ld a , $ 14
2014-05-26 21:04:56 +00:00
ld [ wd125 ], a
2014-05-22 22:13:20 +00:00
call Di sp layTextBoxID
2014-05-26 21:04:56 +00:00
ld a ,[ wCurrentMenuItem ]
2014-05-22 22:13:20 +00:00
and a
jr nz , .next4
ld a , 2
2014-05-26 21:04:56 +00:00
ld [ wd07d ], a
2014-05-22 22:13:20 +00:00
call Di sp layPartyMenu
.next9
ld a , 1
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a
2014-05-22 22:13:20 +00:00
jr c , .next7
2014-05-26 21:04:56 +00:00
ld hl , wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld a ,[ wWhichPokemon ]
cp [ hl ]
jr nz , .next6
ld hl , Al readyOutText
call PrintText
.next8
call GoBackToPartyMenu
jr .next9
.next6
call Func_3ca97
jr z , .next8
xor a
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a
2014-05-22 22:13:20 +00:00
.next7
call GBPalWhiteOut
call Func_3ee5b
call LoadScreenTilesFromBuffer1
.next4
2014-05-23 22:34:35 +00:00
call Cl earSprites
2014-05-22 22:13:20 +00:00
ld hl , wTileMap
ld bc , $ 040 B
call Cl earScreenArea
ld b , 1
call GoPAL_SET
call GBPalNormal
ld hl , TrainerSentOutText
call PrintText
ld a ,[ W_ENEMYMONID ]
2014-05-26 21:04:56 +00:00
ld [ wcf91 ], a
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
2014-05-29 08:31:46 +00:00
ld de , vFrontPic
2014-05-22 22:13:20 +00:00
call LoadMonFrontSprite
ld a , $ CF
ld [ $ FFE1 ], a
2014-05-26 21:04:56 +00:00
FuncCoord 15 , 6
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld a , 2
call Predef
ld a ,[ W_ENEMYMONID ]
call PlayCry
call Func_3cdec
2014-05-26 21:04:56 +00:00
ld a ,[ wCurrentMenuItem ]
2014-05-22 22:13:20 +00:00
and a
ret nz
xor a
ld [ W_PLAYERMONSALIVEFLAGS ], a
2014-05-26 21:04:56 +00:00
ld [ wccf5 ], a
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ W_NUMINPARTY ] ; W_NUMINPARTY
2014-05-22 22:13:20 +00:00
ld e , a
xor a
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_HP ; wd16c
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
ld hl , W_PARTYMON1_HP ; wd16c
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
call AddNTimes
ld a , [ hli ]
or [ hl ]
ret nz
2014-05-26 21:04:56 +00:00
ld a , [ wd11d ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2
jp z , .asm_3cb5c
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jp z , .asm_3cb5c
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr nz , .asm_3cb4c
2014-05-26 21:04:56 +00:00
ld a , [ wd120 ]
2014-05-22 22:13:20 +00:00
inc a
2014-05-26 21:04:56 +00:00
ld [ wd120 ], a
2014-05-22 22:13:20 +00:00
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 Di vide
ld a , [ $ ff97 ]
and a
jr nz , .asm_3cb5c
2014-05-26 21:04:56 +00:00
ld a , [ wd120 ]
2014-05-22 22:13:20 +00:00
ld c , a
.asm_3cb2b
dec c
jr z , .asm_3cb39
ld b , $ 1 e
ld a , [ $ ff98 ]
add b
ld [ $ ff98 ], a
jr c , .asm_3cb5c
jr .asm_3cb2b
.asm_3cb39
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
ld b , a
ld a , [ $ ff98 ]
cp b
jr nc , .asm_3cb5c
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
ld hl , CantEscapeText
jr .asm_3cb4f
.asm_3cb4c
ld hl , NoRunningText
.asm_3cb4f
call PrintText
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wd11f ], a
2014-05-22 22:13:20 +00:00
call SaveScreenTilesToBuffer1
and a
ret
.asm_3cb5c
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
ld a , $ 2
jr nz , .asm_3cb81
call SaveScreenTilesToBuffer1
xor a
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
ld a , $ f
2014-05-26 21:04:56 +00:00
ld [ wPlayerMoveListIndex ], a ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
call Func_3d605
call LoadScreenTilesFromBuffer1
2014-05-26 21:04:56 +00:00
ld a , [ wcc3e ]
2014-05-22 22:13:20 +00:00
cp $ f
ld a , $ 2
jr z , .asm_3cb81
dec a
.asm_3cb81
2014-05-26 21:04:56 +00:00
ld [ wcf0b ], a
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_NUM ; W_PARTYMON1_NUM (aliases: W_PARTYMON1DATA)
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
ld bc , $ 4
call CopyData
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
ld bc , $ b
call CopyData
2014-05-26 21:04:56 +00:00
ld a , [ wcfd9 ]
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1NAME ; W_PARTYMON1NAME
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
call SkipFixedLengthTextEntries
ld de , W_PLAYERMONNAME
ld bc , $ b
call CopyData
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL
ld de , wcd0f
2014-05-22 22:13:20 +00:00
ld bc , $ b
call CopyData
call Func_3ed1a
call Func_3ee19
ld a , $ 7
ld b , $ 8
2014-05-26 21:04:56 +00:00
ld hl , wPlayerMonAttackMod ; wcd1a
2014-05-22 22:13:20 +00:00
.asm_3cc0e
ld [ hli ], a
dec b
jr nz , .asm_3cc0e
ret
Func_3cc13: ; 3cc13 (f:4c13)
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
2014-05-26 21:04:56 +00:00
ld hl , wEnemyMons ; wEnemyMon1Species
2014-05-22 22:13:20 +00:00
call AddNTimes
2014-05-26 21:04:56 +00:00
ld de , wcfe5
2014-05-22 22:13:20 +00:00
ld bc , $ c
call CopyData
ld bc , $ f
add hl , bc
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMONATKDEFIV
2014-05-22 22:13:20 +00:00
ld bc , $ 2
call CopyData
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMONPP ; wcffe
2014-05-22 22:13:20 +00:00
ld bc , $ 4
call CopyData
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
2014-05-22 22:13:20 +00:00
ld bc , $ b
call CopyData
2014-05-26 21:04:56 +00:00
ld a , [ wcfe5 ]
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMON1NAME
ld a , [ wWhichPokemon ] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
call SkipFixedLengthTextEntries
ld de , W_ENEMYMONNAME
ld bc , $ b
call CopyData
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
ld de , wcd23
2014-05-22 22:13:20 +00:00
ld bc , $ b
call CopyData
call Func_3ed1e
ld hl , W_MONHBASESTATS
2014-05-26 21:04:56 +00:00
ld de , wd002
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , wEnemyMonStatMods ; wcd2e
2014-05-22 22:13:20 +00:00
.asm_3cc86
ld [ hli ], a
dec b
jr nz , .asm_3cc86
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
ld [ W_ENEMYMONNUMBER ], a ; W_ENEMYMONNUMBER
2014-05-22 22:13:20 +00:00
ret
Func_3cc91: ; 3cc91 (f:4c91)
callab SendOutMon
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , wcc2d
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
ld [ wd05b ], a
ld [ W_PLAYERMOVENUM ], a ; wcfd2
ld hl , wccf1
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld hl , wd060
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hli ], a
ld [ hli ], a
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ W_PLAYERDISABLEDMOVE ], a ; W_PLAYERDISABLEDMOVE
ld [ wccee ], a
ld [ wccf7 ], a
2014-05-22 22:13:20 +00:00
ld b , $ 1
call GoPAL_SET
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 5 , [ hl ]
ld a , $ 1
ld [ H_WHOSETURN ], a ; $fff3
ld a , POOF_ANIM
call PlayMoveAnimation
2014-05-26 21:04:56 +00:00
FuncCoord 4 , 11
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld a , $ 2
call Predef ; indirect jump to Func_3f073 (3f073 (f:7073))
2014-05-26 21:04:56 +00:00
ld a , [ wcf91 ]
2014-05-22 22:13:20 +00:00
call PlayCry
call Func_3ee94
jp SaveScreenTilesToBuffer1
Func_3ccfa: ; 3ccfa (f:4cfa)
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 5
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 707
call Cl earScreenArea
2014-05-26 21:04:56 +00:00
FuncCoord 3 , 7
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 505
xor a
2014-05-26 21:04:56 +00:00
ld [ wcd6c ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
FuncCoord 4 , 9
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 303
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcd6c ], a
2014-05-22 22:13:20 +00:00
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 , $ 4 c
2014-05-26 21:04:56 +00:00
FuncCoord 5 , 11
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
Func_3cd3a: ; 3cd3a (f:4d3a)
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 5
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 707
jp Cl earScreenArea
; reads player's current mon's HP into W_PLAYERMONCURHP
ReadPlayerMonCurHPAndStatus: ; 3cd43 (f:4d43)
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
ld hl , W_PARTYMON1_HP ; wd16c
2014-05-22 22:13:20 +00:00
ld bc , W_PARTYMON2DATA - W_PARTYMON1DATA
call AddNTimes
ld d , h
ld e , l
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
FuncCoord 9 , 7
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 50 b
call Cl earScreenArea
callab PlacePlayerHUDTiles
2014-05-26 21:04:56 +00:00
FuncCoord 18 , 9
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld [ hl ], $ 73
ld de , W_PLAYERMONNAME
2014-05-26 21:04:56 +00:00
FuncCoord 10 , 7
2014-05-22 22:13:20 +00:00
ld hl , Coord
call Func_3ce9c
call PlaceString
ld hl , W_PLAYERMONID
2014-05-26 21:04:56 +00:00
ld de , wcf98
2014-05-22 22:13:20 +00:00
ld bc , $ c
call CopyData
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL
ld de , wcfb9
2014-05-22 22:13:20 +00:00
ld bc , $ b
call CopyData
2014-05-26 21:04:56 +00:00
FuncCoord 14 , 8
2014-05-22 22:13:20 +00:00
ld hl , Coord
push hl
inc hl
2014-05-26 21:04:56 +00:00
ld de , wcf9c
2014-05-22 22:13:20 +00:00
call PrintStatusConditionNotFainted
pop hl
jr nz , .asm_3cdae
call PrintLevel
.asm_3cdae
2014-05-26 21:04:56 +00:00
ld a , [ wcf98 ]
ld [ wcf91 ], a
FuncCoord 10 , 9
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld a , $ 5 f
call Predef ; indirect jump to Func_128ef (128ef (4:68ef))
ld a , $ 1
ld [ H_AUTOBGTRANSFERENABLED ], a ; $ffba
2014-05-26 21:04:56 +00:00
ld hl , wcf1d
2014-05-22 22:13:20 +00:00
call GetBattleHealthBarColor
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
or [ hl ]
jr z , .asm_3cdd9
2014-05-26 21:04:56 +00:00
ld a , [ wccf6 ]
2014-05-22 22:13:20 +00:00
and a
ret nz
2014-05-26 21:04:56 +00:00
ld a , [ wcf1d ]
2014-05-22 22:13:20 +00:00
cp $ 2
jr z , .asm_3cde6
.asm_3cdd9
2014-05-26 21:04:56 +00:00
ld hl , wd083
2014-05-22 22:13:20 +00:00
bit 7 , [ hl ]
ld [ hl ], $ 0
ret z
xor a
2014-05-26 21:04:56 +00:00
ld [ wc02a ], a
2014-05-22 22:13:20 +00:00
ret
.asm_3cde6
2014-05-26 21:04:56 +00:00
ld hl , wd083
2014-05-22 22:13:20 +00:00
set 7 , [ hl ]
ret
Func_3cdec: ; 3cdec (f:4dec)
xor a
ld [ H_AUTOBGTRANSFERENABLED ], a ; $ffba
ld hl , wTileMap
ld bc , $ 40 c
call Cl earScreenArea
callab PlaceEnemyHUDTiles
ld de , W_ENEMYMONNAME
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 0
2014-05-22 22:13:20 +00:00
ld hl , Coord
call Func_3ce9c
call PlaceString
2014-05-26 21:04:56 +00:00
FuncCoord 4 , 1
2014-05-22 22:13:20 +00:00
ld hl , Coord
push hl
inc hl
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMONSTATUS ; wcfe9
2014-05-22 22:13:20 +00:00
call PrintStatusConditionNotFainted
pop hl
jr nz , .asm_3ce23
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONLEVEL ] ; W_ENEMYMONLEVEL
ld [ wcfb9 ], a
2014-05-22 22:13:20 +00:00
call PrintLevel
.asm_3ce23
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONMAXHP ; W_ENEMYMONMAXHP
2014-05-22 22:13:20 +00:00
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 Di vide
ld a , [ $ ff98 ]
ld e , a
ld a , $ 6
ld d , a
ld c , a
Func_3ce7f: ; 3ce7f (f:4e7f)
xor a
2014-05-26 21:04:56 +00:00
ld [ wListMenuID ], a ; wListMenuID
FuncCoord 2 , 2
2014-05-22 22:13:20 +00:00
ld hl , Coord
call DrawHPBar
ld a , $ 1
ld [ H_AUTOBGTRANSFERENABLED ], a ; $ffba
2014-05-26 21:04:56 +00:00
ld hl , wcf1e
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
and a
jr nz , .nonstandardbattle
call Func_3cd5a ; redraw names and HP bars?
call Func_3ee94
call SaveScreenTilesToBuffer1
.nonstandardbattle
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2 ; safari
ld a , $ b ; safari menu id
jr nz , .menuselected
ld a , $ 1b ; regular menu id
.menuselected
2014-05-26 21:04:56 +00:00
ld [ wd125 ], a
2014-05-22 22:13:20 +00:00
call Di sp layTextBoxID
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
dec a
jp nz , RegularBattleMenu ; regular battle
; the following happens for the old man tutorial
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERNAME ; wd158
ld de , W_GRASSRATE ; W_GRASSRATE
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERNAME ; wd158
2014-05-22 22:13:20 +00:00
ld bc , $ b
call CopyData
; the following simulates the keystrokes by drawing menus on screen
2014-05-26 21:04:56 +00:00
FuncCoord 9 , 14
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld [ hl ], "▶"
ld c , $ 50
call DelayFrames
ld [ hl ], $ 7 f
2014-05-26 21:04:56 +00:00
FuncCoord 9 , 16
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wcc2d ]
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
ld [ wLastMenuItem ], a ; wLastMenuItem
2014-05-22 22:13:20 +00:00
sub $ 2
jr c , .leftcolumn
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
ld [ wLastMenuItem ], a ; wLastMenuItem
2014-05-22 22:13:20 +00:00
jr .rightcolumn
.leftcolumn
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2
ld a , " "
jr z , .safaribattle
2014-05-26 21:04:56 +00:00
FuncCoord 15 , 14
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
2014-05-26 21:04:56 +00:00
FuncCoord 15 , 16
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
ld b , $ 9
jr .notsafari
.safaribattle
2014-05-26 21:04:56 +00:00
FuncCoord 13 , 14
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
2014-05-26 21:04:56 +00:00
FuncCoord 13 , 16
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
2014-05-26 21:04:56 +00:00
FuncCoord 7 , 14
2014-05-22 22:13:20 +00:00
ld hl , Coord
2014-05-26 21:04:56 +00:00
ld de , W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS
2014-05-22 22:13:20 +00:00
ld bc , $ 102
call PrintNumber
ld b , $ 1
.notsafari
2014-05-26 21:04:56 +00:00
ld hl , wTopMenuItemY ; wTopMenuItemY
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2
ld a , " "
jr z , .safarirightcolumn
2014-05-26 21:04:56 +00:00
FuncCoord 9 , 14
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
2014-05-26 21:04:56 +00:00
FuncCoord 9 , 16
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
ld b , $ f
jr .notsafarirightcolumn
.safarirightcolumn
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 14
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 16
2014-05-22 22:13:20 +00:00
ld [ Coord ], a
2014-05-26 21:04:56 +00:00
FuncCoord 7 , 14
2014-05-22 22:13:20 +00:00
ld hl , Coord
2014-05-26 21:04:56 +00:00
ld de , W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS
2014-05-22 22:13:20 +00:00
ld bc , $ 102
call PrintNumber
ld b , $ d
.notsafarirightcolumn
2014-05-26 21:04:56 +00:00
ld hl , wTopMenuItemY ; wTopMenuItemY
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
add $ 2 ; if we're in the right column, the actual id is +2
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
.selection
call PlaceUnfilledArrowMenuCursor
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
ld [ wcc2d ], a
2014-05-22 22:13:20 +00:00
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...
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2
jr z , .safari1
xor a
2014-05-26 21:04:56 +00:00
ld [ wd120 ], a
2014-05-22 22:13:20 +00:00
jp LoadScreenTilesFromBuffer1 ; restore saved screen and return??
.safari1 ; safari first option??
ld a , SAFARI_BALL
2014-05-26 21:04:56 +00:00
ld [ wcf91 ], a
2014-05-22 22:13:20 +00:00
jr asm_3d05f
Func_3cfe8: ; 3cfe8 (f:4fe8)
cp $ 2
jp nz , Func_3d0ca
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr nz , .asm_3cffd
ld hl , ItemsCantBeUsedHereText
call PrintText
jp InitBattleMenu
.asm_3cffd ; bag?
call SaveScreenTilesToBuffer2 ; copy bg?
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2
jr nz , asm_3d00e
ld a , SAFARI_BAIT
2014-05-26 21:04:56 +00:00
ld [ wcf91 ], a
2014-05-22 22:13:20 +00:00
jr asm_3d05f
asm_3d00e: ; 3d00e (f:500e)
call LoadScreenTilesFromBuffer1
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3d01a
call Func_3cd5a
.asm_3d01a
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
dec a
jr nz , Func_3d031
ld hl , OldManItemList
ld a , l
2014-05-26 21:04:56 +00:00
ld [ wcf8b ], a
2014-05-22 22:13:20 +00:00
ld a , h
2014-05-26 21:04:56 +00:00
ld [ wcf8c ], a
2014-05-22 22:13:20 +00:00
jr Func_3d03c
OldManItemList: ; 3d02d (f:502d)
db $ 01 , POKE_BALL , 50 , $ ff
Func_3d031
2014-05-26 21:04:56 +00:00
ld hl , wNumBagItems ; wNumBagItems
2014-05-22 22:13:20 +00:00
ld a , l
2014-05-26 21:04:56 +00:00
ld [ wcf8b ], a
2014-05-22 22:13:20 +00:00
ld a , h
2014-05-26 21:04:56 +00:00
ld [ wcf8c ], a
2014-05-22 22:13:20 +00:00
Func_3d03c
xor a
2014-05-26 21:04:56 +00:00
ld [ wcf93 ], a
2014-05-22 22:13:20 +00:00
ld a , $ 3
2014-05-26 21:04:56 +00:00
ld [ wListMenuID ], a ; wListMenuID
ld a , [ wcc2c ]
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
call Di sp layListMenuID
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
ld [ wcc2c ], a
2014-05-22 22:13:20 +00:00
ld a , $ 0
2014-05-26 21:04:56 +00:00
ld [ wcc37 ], a
ld [ wcc35 ], a
2014-05-22 22:13:20 +00:00
jp c , InitBattleMenu
asm_3d05f: ; 3d05f (f:505f)
2014-05-26 21:04:56 +00:00
ld a , [ wcf91 ]
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
call GetItemName
call CopyStringToCF4B ; copy name
xor a
2014-05-26 21:04:56 +00:00
ld [ wd152 ], a
2014-05-22 22:13:20 +00:00
call UseItem
call Func_3ee5b
2014-05-23 22:34:35 +00:00
call Cl earSprites
2014-05-22 22:13:20 +00:00
xor a
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2
jr z , .asm_3d09c
2014-05-26 21:04:56 +00:00
ld a , [ wcd6a ]
2014-05-22 22:13:20 +00:00
and a
jp z , asm_3d00e
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERBATTSTATUS1 ] ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
bit 5 , a
jr z , .asm_3d09c
2014-05-26 21:04:56 +00:00
ld hl , wd06a
2014-05-22 22:13:20 +00:00
dec [ hl ]
jr nz , .asm_3d09c
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 5 , [ hl ]
.asm_3d09c
2014-05-26 21:04:56 +00:00
ld a , [ wd11c ]
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3d0b7
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wd11c ], a
2014-05-22 22:13:20 +00:00
ld a , $ 2
2014-05-26 21:04:56 +00:00
ld [ wcf0b ], a
2014-05-22 22:13:20 +00:00
scf
ret
ItemsCantBeUsedHereText: ; 3d0c5 (f:50c5)
TX_FAR _ItemsCantBeUsedHereText
db "@"
Func_3d0ca: ; 3d0ca (f:50ca)
dec a
jp nz , Func_3d1fa
call SaveScreenTilesToBuffer2
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
cp $ 2
jr nz , Func_3d0e0
ld a , SAFARI_ROCK
2014-05-26 21:04:56 +00:00
ld [ wcf91 ], a
2014-05-22 22:13:20 +00:00
jp asm_3d05f
Func_3d0e0: ; 3d0e0 (f:50e0)
call LoadScreenTilesFromBuffer1
xor a
2014-05-26 21:04:56 +00:00
ld [ wd07d ], a
ld [ wcc35 ], a
2014-05-22 22:13:20 +00:00
call Di sp layPartyMenu
asm_3d0ed: ; 3d0ed (f:50ed)
jp nc , Func_3d119
asm_3d0f0: ; 3d0f0 (f:50f0)
2014-05-23 22:34:35 +00:00
call Cl earSprites
2014-05-22 22:13:20 +00:00
call GBPalWhiteOut
call Func_3ee5b
call LoadScreenTilesFromBuffer2
call GoPAL_SET_CF1C
call GBPalNormal
jp InitBattleMenu
Func_3d105: ; 3d105 (f:5105)
2014-05-26 21:04:56 +00:00
FuncCoord 11 , 11
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 81
ld a , $ 7 f
call FillMemory
xor a
2014-05-26 21:04:56 +00:00
ld [ wd07d ], a
2014-05-22 22:13:20 +00:00
call GoBackToPartyMenu
jr asm_3d0ed
Func_3d119: ; 3d119 (f:5119)
ld a , $ c
2014-05-26 21:04:56 +00:00
ld [ wd125 ], a
2014-05-22 22:13:20 +00:00
call Di sp layTextBoxID
2014-05-26 21:04:56 +00:00
ld hl , wTopMenuItemY ; wTopMenuItemY
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
cp $ 2
jr z , asm_3d0f0
and a
jr z , .asm_3d18a
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc49 ], a
ld hl , W_PARTYMON1_NUM ; W_PARTYMON1_NUM (aliases: W_PARTYMON1DATA)
2014-05-23 22:34:35 +00:00
call Cl earSprites
2014-05-22 22:13:20 +00:00
ld a , $ 36
call Predef ; indirect jump to StatusScreen (12953 (4:6953))
ld a , $ 37
call Predef ; indirect jump to StatusScreen2 (12b57 (4:6b57))
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYBATTSTATUS2 ] ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
bit 4 , a
ld hl , AnimationSubstitute
jr nz , .asm_3d182
2014-05-26 21:04:56 +00:00
ld a , [ wccf3 ]
2014-05-22 22:13:20 +00:00
and a
ld hl , AnimationMinimizeMon
jr nz , .asm_3d182
2014-05-26 21:04:56 +00:00
ld a , [ wcfe5 ]
ld [ wcf91 ], a
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
2014-05-29 08:31:46 +00:00
ld de , vFrontPic
2014-05-22 22:13:20 +00:00
call LoadMonFrontSprite
jr .asm_3d187
.asm_3d182
ld b , BANK ( AnimationSubstitute ) ; BANK(AnimationMinimizeMon)
call Bankswitch
.asm_3d187
jp Func_3d0e0
.asm_3d18a
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld d , a
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
cp d
jr nz , .asm_3d19d
ld hl , Al readyOutText
call PrintText
jp Func_3d105
.asm_3d19d
call Func_3ca97
jp z , Func_3d105
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
call GBPalWhiteOut
2014-05-23 22:34:35 +00:00
call Cl earSprites
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
ld [ wPlayerMonNumber ], a ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld c , a
ld b , $ 1
push bc
ld hl , W_PLAYERMONSALIVEFLAGS
2014-05-25 17:09:39 +00:00
ld a , $ 10 ; FlagActionPredef
call Predef
2014-05-22 22:13:20 +00:00
pop bc
2014-05-26 21:04:56 +00:00
ld hl , wccf5
2014-05-25 17:09:39 +00:00
ld a , $ 10 ; FlagActionPredef
call Predef
2014-05-22 22:13:20 +00:00
call Func_3cba6
call Func_3cc91
call SaveScreenTilesToBuffer1
ld a , $ 2
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
and a
ret
AlreadyOutText: ; 3d1f5 (f:51f5)
TX_FAR _AlreadyOutText
db "@"
Func_3d1fa: ; 3d1fa (f:51fa)
call LoadScreenTilesFromBuffer1
ld a , $ 3
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld hl , W_PLAYERMONSPEED
ld de , W_ENEMYMONSPEED
call Func_3cab9
ld a , $ 0
2014-05-26 21:04:56 +00:00
ld [ wd11f ], a
2014-05-22 22:13:20 +00:00
ret c
2014-05-26 21:04:56 +00:00
ld a , [ wcd6a ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld de , wd0dc
2014-05-22 22:13:20 +00:00
ld bc , $ 4
call CopyData
callab Func_39b87
ret
.writemoves
2014-05-26 21:04:56 +00:00
ld de , wd0e1
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
FuncCoord 4 , 12
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld b , $ 4
ld c , $ e
di
call TextBoxBorder
2014-05-26 21:04:56 +00:00
FuncCoord 4 , 12
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld [ hl ], $ 7 a
2014-05-26 21:04:56 +00:00
FuncCoord 10 , 12
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld [ hl ], $ 7 e
ei
2014-05-26 21:04:56 +00:00
FuncCoord 6 , 13
2014-05-22 22:13:20 +00:00
ld hl , Coord
call .writemoves
ld b , $ 5
ld a , $ c
jr .menuset
.mimicmenu
ld hl , W_ENEMYMONMOVES
call .loadmoves
2014-05-26 21:04:56 +00:00
FuncCoord 0 , 7
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld b , $ 4
ld c , $ e
call TextBoxBorder
2014-05-26 21:04:56 +00:00
FuncCoord 2 , 8
2014-05-22 22:13:20 +00:00
ld hl , Coord
call .writemoves
ld b , $ 1
ld a , $ 7
jr .menuset
.relearnmenu
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
ld hl , W_PARTYMON1_MOVE1 ; W_PARTYMON1_MOVE1
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
call AddNTimes
call .loadmoves
2014-05-26 21:04:56 +00:00
FuncCoord 4 , 7
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld b , $ 4
ld c , $ e
call TextBoxBorder
2014-05-26 21:04:56 +00:00
FuncCoord 6 , 8
2014-05-22 22:13:20 +00:00
ld hl , Coord
call .writemoves
ld b , $ 5
ld a , $ 7
.menuset
2014-05-26 21:04:56 +00:00
ld hl , wTopMenuItemY ; wTopMenuItemY
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld a , b
ld [ hli ], a ; wTopMenuItemX
ld a , [ wMoveMenuType ]
cp $ 1
jr z , .selectedmoveknown
ld a , $ 1
jr nc , .selectedmoveknown
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerMoveListIndex ] ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
inc a
.selectedmoveknown
ld [ hli ], a ; wCurrentMenuItem
inc hl ; wTileBehindCursor untouched
2014-05-26 21:04:56 +00:00
ld a , [ wcd6c ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerMoveListIndex ] ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 14
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wcc35 ]
2014-05-22 22:13:20 +00:00
and a
jr z , .select
2014-05-26 21:04:56 +00:00
FuncCoord 5 , 13
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcc35 ], a
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
dec a
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld b , a
ld a , [ wMoveMenuType ]
dec a ; if not mimic
jr nz , .nob
pop af
ret
.nob
dec a
ld a , b
2014-05-26 21:04:56 +00:00
ld [ wPlayerMoveListIndex ], a ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
jr nz , .moveselected
pop af
ret
.moveselected
pop af
ret nz
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONPP ; W_PLAYERMONPP
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c , a
ld b , $ 0
add hl , bc
ld a , [ hl ]
and $ 3 f
jr z , .nopp
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERDISABLEDMOVE ] ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
swap a
and $ f
dec a
cp c
jr z , .disabled
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERBATTSTATUS3 ] ; W_PLAYERBATTSTATUS3
2014-05-22 22:13:20 +00:00
bit 3 , a ; transformed
jr nz , .dummy ; game freak derp
.dummy
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld hl , W_PLAYERMONMOVES
ld c , a
ld b , $ 0
add hl , bc
ld a , [ hl ]
2014-05-26 21:04:56 +00:00
ld [ wPlayerSelectedMove ], a ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
and a
jp nz , Func_3d2fe
call EraseMenuCursor
2014-05-26 21:04:56 +00:00
ld a , [ wcd6c ]
2014-05-22 22:13:20 +00:00
inc a
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
jp Func_3d2fe
Func_3d3dd: ; 3d3dd (f:53dd)
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ wcd6c ]
2014-05-22 22:13:20 +00:00
inc a
inc a
cp b
jp nz , Func_3d2fe
call EraseMenuCursor
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
jp Func_3d2fe
Func_3d3f5: ; 3d3f5 (f:53f5)
ld a , $ a5
2014-05-26 21:04:56 +00:00
ld [ wPlayerSelectedMove ], a ; wPlayerSelectedMove
ld a , [ W_PLAYERDISABLEDMOVE ] ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
and a
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
jr nz , .asm_3d40e
ld a , [ hli ]
or [ hl ]
inc hl
or [ hl ]
inc hl
or [ hl ]
and $ 3 f
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 , $ 3 c
call DelayFrames
xor a
ret
NoMovesLeftText: ; 3d430 (f:5430)
TX_FAR _NoMovesLeftText
db "@"
Func_3d435: ; 3d435 (f:5435)
2014-05-26 21:04:56 +00:00
ld a , [ wcc35 ]
2014-05-22 22:13:20 +00:00
and a
jr z , asm_3d4ad
ld hl , W_PLAYERMONMOVES
call Func_3d493
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
call Func_3d493
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERDISABLEDMOVE ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
swap a
and $ f
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
cp b
jr nz , .asm_3d463
ld a , [ hl ]
and $ f
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ wcc35 ]
2014-05-22 22:13:20 +00:00
swap a
add b
ld [ hl ], a
jr .asm_3d474
.asm_3d463
2014-05-26 21:04:56 +00:00
ld a , [ wcc35 ]
2014-05-22 22:13:20 +00:00
cp b
jr nz , .asm_3d474
ld a , [ hl ]
and $ f
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
swap a
add b
ld [ hl ], a
.asm_3d474
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_MOVE1 ; W_PARTYMON1_MOVE1
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
call AddNTimes
push hl
call Func_3d493
pop hl
ld bc , $ 15
add hl , bc
call Func_3d493
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc35 ], a
2014-05-22 22:13:20 +00:00
jp MoveSelectionMenu
Func_3d493: ; 3d493 (f:5493)
push hl
2014-05-26 21:04:56 +00:00
ld a , [ wcc35 ]
2014-05-22 22:13:20 +00:00
dec a
ld c , a
ld b , $ 0
add hl , bc
ld d , h
ld e , l
pop hl
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
ld [ wcc35 ], a
2014-05-22 22:13:20 +00:00
jp MoveSelectionMenu
Func_3d4b6: ; 3d4b6 (f:54b6)
xor a
ld [ H_AUTOBGTRANSFERENABLED ], a ; $ffba
2014-05-26 21:04:56 +00:00
FuncCoord 0 , 8
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld b , $ 3
ld c , $ 9
call TextBoxBorder
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERDISABLEDMOVE ] ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3d4df
swap a
and $ f
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
cp b
jr nz , .asm_3d4df
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 10
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld de , Di sabledText
call PlaceString
jr .asm_3d54e
.asm_3d4df
2014-05-26 21:04:56 +00:00
ld hl , wCurrentMenuItem ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
dec [ hl ]
xor a
ld [ H_WHOSETURN ], a ; $fff3
ld hl , W_PLAYERMONMOVES
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c , a
ld b , $ 0
add hl , bc
ld a , [ hl ]
2014-05-26 21:04:56 +00:00
ld [ wPlayerSelectedMove ], a ; wPlayerSelectedMove
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
ld [ wWhichPokemon ], a ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld a , $ 4
2014-05-26 21:04:56 +00:00
ld [ wcc49 ], a
2014-05-22 22:13:20 +00:00
callab GetMaxPP
2014-05-26 21:04:56 +00:00
ld hl , wCurrentMenuItem ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c , [ hl ]
inc [ hl ]
ld b , $ 0
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
add hl , bc
ld a , [ hl ]
and $ 3 f
2014-05-26 21:04:56 +00:00
ld [ wcd6d ], a
FuncCoord 1 , 9
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld de , TypeText
call PlaceString
2014-05-26 21:04:56 +00:00
FuncCoord 7 , 11
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld [ hl ], "/"
2014-05-26 21:04:56 +00:00
FuncCoord 5 , 9
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld [ hl ], "/"
2014-05-26 21:04:56 +00:00
FuncCoord 5 , 11
2014-05-22 22:13:20 +00:00
ld hl , Coord
2014-05-26 21:04:56 +00:00
ld de , wcd6d
2014-05-22 22:13:20 +00:00
ld bc , $ 102
call PrintNumber
2014-05-26 21:04:56 +00:00
FuncCoord 8 , 11
2014-05-22 22:13:20 +00:00
ld hl , Coord
2014-05-26 21:04:56 +00:00
ld de , wd11e
2014-05-22 22:13:20 +00:00
ld bc , $ 102
call PrintNumber
call GetCurrentMove
2014-05-26 21:04:56 +00:00
FuncCoord 2 , 10
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld a , $ 5 d
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
2014-05-26 21:04:56 +00:00
ld a , [ wcc3e ]
2014-05-22 22:13:20 +00:00
cp $ e
jp z , .asm_3d601
cp $ d
jr z , .unableToMove
cp $ 4
ret nc
2014-05-26 21:04:56 +00:00
ld [ wEnemyMoveListIndex ], a
2014-05-22 22:13:20 +00:00
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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
ld b , $ 1
cp $ 3 f ; select move 1 in [0,3e] (63/256 chance)
jr c , .moveChosen
inc hl
inc b
cp $ 7 f ; 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
2014-05-26 21:04:56 +00:00
ld [ wcc3e ], a
ld a , [ wPlayerMoveListIndex ] ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
cp $ f
jr z , .asm_3d630
2014-05-26 21:04:56 +00:00
ld a , [ wcd6a ]
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3d629
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerSelectedMove ] ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
cp $ a5
ld b , $ e
jr z , .asm_3d62f
dec b
inc a
jr z , .asm_3d62f
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerMoveListIndex ] ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
jr .asm_3d630
.asm_3d629
2014-05-26 21:04:56 +00:00
ld a , [ wWhichPokemon ] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
add $ 4
ld b , a
.asm_3d62f
ld a , b
.asm_3d630
2014-05-26 21:04:56 +00:00
ld [ wcc42 ], a
2014-05-22 22:13:20 +00:00
callab PrintWaitingText
.asm_3d63b
call Func_22c3
call DelayFrame
2014-05-26 21:04:56 +00:00
ld a , [ wcc3e ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerSelectedMove ] ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
inc a
jp z , Func_3d80a
xor a
2014-05-26 21:04:56 +00:00
ld [ W_MOVEMISSED ], a ; W_MOVEMISSED
ld [ wcced ], a
ld [ wccf4 ], a
2014-05-22 22:13:20 +00:00
ld a , $ a
2014-05-26 21:04:56 +00:00
ld [ wd05b ], a
ld a , [ wcd6a ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
bit 4 , [ hl ]
jr nz , asm_3d6a9
call Func_3dc88
jp z , Func_3d80a
Func_3d69a: ; 3d69a (f:569a)
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMOVEEFFECT ] ; wcfd3
2014-05-22 22:13:20 +00:00
cp CH ARGE_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
2014-05-26 21:04:56 +00:00
ld de , wPlayerSelectedMove ; pointer to the move just used
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
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 , $ 1 E
call DelayFrames
ld a ,[ W_PLAYERMOVEEFFECT ]
cp a , FLY_EFFECT
jr z , .next5
cp a , CH ARGE_EFFECT
jr z , .next5
jr asm_3d766
.next5
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcced ], a
2014-05-22 22:13:20 +00:00
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 Di sp layEffectiveness
ld a , 1
2014-05-26 21:04:56 +00:00
ld [ wccf4 ], a
2014-05-22 22:13:20 +00:00
.next9
ld a ,[ W_PLAYERMOVEEFFECT ]
ld hl , EffectsArray4
ld de , 1
call IsInArray
call c , Func_3f132
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a ,[ hli ]
ld b ,[ hl ]
or b
ret z
call HandleBuildingRage
ld hl , W_PLAYERBATTSTATUS1
bit 2 ,[ hl ]
jr z , .next10 ; 57EF
2014-05-26 21:04:56 +00:00
ld a ,[ wd06a ]
2014-05-22 22:13:20 +00:00
dec a
2014-05-26 21:04:56 +00:00
ld [ wd06a ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcd6a ], a
2014-05-22 22:13:20 +00:00
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 ] ; player’ s turn
and a , SLP | ( 1 << FRZ )
ret nz
ld hl , ScaredText
call PrintText
xor a
ret
.Ghost ; ghost’ s turn
ld hl , GetOutText
call PrintText
xor a
ret
ScaredText: ; 3d830 (f:5830)
TX_FAR _ScaredText
db "@"
GetOutText: ; 3d835 (f:5835)
TX_FAR _GetOutText
db "@"
IsGhostBattle: ; 3d83a (f:583a)
ld a ,[ W_ISINBATTLE ]
dec a
ret nz
ld a ,[ W_CURMAP ]
cp a , POKEMONTOWER_1
jr c , .next
cp a , LAVENDER_HOUSE_1
jr nc , .next
ld b , SI LPH_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
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , SLP_ANIM - 1
call PlayMoveAnimation
ld hl , FastAsleepText
call PrintText
jr .sleepDone
.WakeUp
ld hl , WokeUpText
call PrintText
.sleepDone
xor a
2014-05-26 21:04:56 +00:00
ld [ wccf1 ], a
2014-05-22 22:13:20 +00:00
ld hl , Func_3d80a
jp Func_3da37
.FrozenCheck
bit FRZ ,[ hl ] ; frozen?
jr z , .HeldInPlaceCheck ; to 5898
ld hl , IsFrozenText
call PrintText
xor a
2014-05-26 21:04:56 +00:00
ld [ wccf1 ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
ld a ,[ hl ]
and a
jr z , .next2 ; 58EE
dec a
ld [ hl ], a
and a , $ F
jr nz , .next2
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ wccee ], a
2014-05-22 22:13:20 +00:00
ld hl , Di sabledNoMoreText
call PrintText
.next2
ld a ,[ W_PLAYERBATTSTATUS1 ]
add a
jr nc , .next3 ; 5929
2014-05-26 21:04:56 +00:00
ld hl , wd06b
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , CONF_ANIM - 1
call PlayMoveAnimation
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a ,[ wccee ]
2014-05-22 22:13:20 +00:00
and a
jr z , .ParalysisCheck ; 593E
2014-05-26 21:04:56 +00:00
ld hl , wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp a , $ 3 F
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 , CH ARGE_EFFECT
jr z , .next8
jr .next9 ; 596F
.next8
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_DAMAGE
2014-05-22 22:13:20 +00:00
ld a ,[ hli ]
ld b , a
ld c ,[ hl ]
2014-05-26 21:04:56 +00:00
ld hl , wd075
2014-05-22 22:13:20 +00:00
ld a ,[ hl ]
add c
ld [ hld ], a
ld a ,[ hl ]
adc b
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld hl , wd06a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ W_PLAYERMOVEPOWER ], a
ld hl , wd075
2014-05-22 22:13:20 +00:00
ld a ,[ hld ]
add a
ld b , a
2014-05-26 21:04:56 +00:00
ld [ wd0d8 ], a
2014-05-22 22:13:20 +00:00
ld a ,[ hl ]
rl a
2014-05-26 21:04:56 +00:00
ld [ W_DAMAGE ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , wd06a
2014-05-22 22:13:20 +00:00
dec [ hl ]
ld hl , asm_3d6dc ; $56dc
jp nz , Func_3da37
push hl
ld hl , W_PLAYERBATTSTATUS1
res 1 ,[ hl ]
set 7 ,[ hl ]
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
and a , 3
inc a
inc a
2014-05-26 21:04:56 +00:00
ld [ wd06b ], a
2014-05-22 22:13:20 +00:00
pop hl
jp Func_3da37
.next13
bit 5 ,[ hl ]
jp z , Func_3da1a
ld hl , AttackContinuesText
call PrintText
2014-05-26 21:04:56 +00:00
ld a ,[ wd06a ]
2014-05-22 22:13:20 +00:00
dec a
2014-05-26 21:04:56 +00:00
ld [ wd06a ], a
2014-05-22 22:13:20 +00:00
ld hl , asm_3d714 ; $5714
jp nz , Func_3da37
jp Func_3da37
Func_3da1a: ; 3da1a (f:5a1a)
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERBATTSTATUS2 ] ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
bit 6 , a
jp z , Func_3da39
ld a , RAGE
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
call GetMoveName
call CopyStringToCF4B
xor a
2014-05-26 21:04:56 +00:00
ld [ W_PLAYERMOVEEFFECT ], a ; wcfd3
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , wPlayerSelectedMove ; wPlayerSelectedMove
ld de , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3da97
inc hl
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
.asm_3da97
ld a , [ de ]
res 4 , a
ld [ de ], a
ld a , [ hl ]
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
call GetMoveName
ld hl , MoveIsDisabledText
jp PrintText
MoveIsDisabledText: ; 3daa8 (f:5aa8)
TX_FAR _MoveIsDisabledText
db "@"
PrintHurtItselfText: ; 3daad (f:5aad)
ld hl , HurtItselfText
call PrintText
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONDEFENSE ; wcff8
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
push af
ld a , [ hld ]
push af
ld a , [ W_PLAYERMONDEF ]
ld [ hli ], a
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONDEF + 1 ]
2014-05-22 22:13:20 +00:00
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
push hl
ld a , [ hl ]
push af
xor a
ld [ hli ], a
2014-05-26 21:04:56 +00:00
ld [ wd05e ], a
2014-05-22 22:13:20 +00:00
ld a , $ 28
ld [ hli ], a
xor a
ld [ hl ], a
call CalculateDamage
call MoreCalculateDamage
pop af
pop hl
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONDEFENSE + 1
2014-05-22 22:13:20 +00:00
pop af
ld [ hld ], a
pop af
ld [ hl ], a
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMOVENUM ] ; wcfd2
ld hl , wccf1
2014-05-22 22:13:20 +00:00
jr z , .asm_3db11
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
ld hl , wccf2
2014-05-22 22:13:20 +00:00
.asm_3db11
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
call Func_3db85
2014-05-26 21:04:56 +00:00
ld a , [ wcced ]
2014-05-22 22:13:20 +00:00
and a
ld hl , Used2Text
ret nz
2014-05-26 21:04:56 +00:00
ld a , [ wd11e ]
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wcced ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wd11e ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wd11e ] ; move number
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
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 , SI NG , PECK , COUNTER
db STRENGTH , ABSORB , STRING_SHOT , EARTHQUAKE , FISSURE , DI G , TOXIC , SCREECH , HARDEN
db MINIMIZE , WITHDRAW , DEFENSE_CURL , METRONOME , LICK , CL AMP , CONSTRICT , POISON_GAS
db LEECH_LIFE , BUBBLE , FLASH , SP LASH , ACID_ARMOR , FURY_SWIPES , REST , SHARPEN , SLASH , SUBSTITUTE
db $ 00
db $ FF ; terminator
PrintMoveFailureText: ; 3dbe2 (f:5be2)
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3dbed
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3dbed
ld hl , DoesntAffectMonText ; $5c57
2014-05-26 21:04:56 +00:00
ld a , [ wd05b ]
2014-05-22 22:13:20 +00:00
and $ 7 f
jr z , .asm_3dc04
ld hl , AttackMissedText ; $5c42
2014-05-26 21:04:56 +00:00
ld a , [ wd05e ]
2014-05-22 22:13:20 +00:00
cp $ ff
jr nz , .asm_3dc04
ld hl , UnaffectedText ; $5c4c
.asm_3dc04
push de
call PrintText
xor a
2014-05-26 21:04:56 +00:00
ld [ wd05e ], a
2014-05-22 22:13:20 +00:00
pop de
ld a , [ de ]
cp JUMP_KICK_EFFECT
ret nz
; if you get here, the mon used hi jump kick and missed
2014-05-26 21:04:56 +00:00
ld hl , W_DAMAGE ; W_DAMAGE
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wd05e ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wd05e ], a
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld [ wcced ], a
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr nz , .asm_3dc97
ld a , $ 1
and a
ret
.asm_3dc97
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_OTID ; W_PARTYMON1_OTID
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
call AddNTimes
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerID ] ; wPlayerID
2014-05-22 22:13:20 +00:00
cp [ hl ]
jr nz , .asm_3dcb1
inc hl
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerID + 1 ] ; wd35a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONLEVEL ] ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
swap a
cp b
jr nc , .asm_3dcdf
cp c
jp c , Func_3ddb0
.asm_3dceb
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp b
jr nc , .asm_3dceb
cp c
jr c , .asm_3dd3f
ld a , d
sub c
ld b , a
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
add a
swap a
and $ 7
jr z , .asm_3dd0e
2014-05-26 21:04:56 +00:00
ld [ W_PLAYERMONSTATUS ], a ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
ld hl , BeganToNapText
jr .asm_3dd3a
.asm_3dd20
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONMOVES + 1 ]
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3dd20
2014-05-26 21:04:56 +00:00
ld a , [ wccee ]
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3dd20
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerSelectedMove ] ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
cp $ a5
jr z , .asm_3dd20
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
push hl
ld a , [ hli ]
and $ 3 f
ld b , a
ld a , [ hli ]
and $ 3 f
add b
ld b , a
ld a , [ hli ]
and $ 3 f
add b
ld b , a
ld a , [ hl ]
and $ 3 f
add b
pop hl
push af
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c , a
ld b , $ 0
add hl , bc
ld a , [ hl ]
and $ 3 f
ld b , a
pop af
cp b
jr z , .asm_3dd20
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcced ], a
ld a , [ wMaxMenuItem ] ; wMaxMenuItem
2014-05-22 22:13:20 +00:00
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c , a
.asm_3dd86
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
and $ 3
cp b
jr nc , .asm_3dd86
cp c
jr z , .asm_3dd86
2014-05-26 21:04:56 +00:00
ld [ wCurrentMenuItem ], a ; wCurrentMenuItem
ld hl , W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
ld e , a
ld d , $ 0
add hl , de
ld a , [ hl ]
and a
jr z , .asm_3dd86
2014-05-26 21:04:56 +00:00
ld a , [ wCurrentMenuItem ] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c , a
ld b , $ 0
ld hl , W_PLAYERMONMOVES
add hl , bc
ld a , [ hl ]
2014-05-26 21:04:56 +00:00
ld [ wPlayerSelectedMove ], a ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wd05e ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_ATACK
2014-05-22 22:13:20 +00:00
ld a , [ wPlayerMonNumber ]
ld bc , $ 002 c
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
2014-05-26 21:04:56 +00:00
ld a , [ wd05e ] ;XXX
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_SPECIAL
2014-05-22 22:13:20 +00:00
ld a , [ wPlayerMonNumber ]
ld bc , $ 002 c
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]
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONLEVEL ] ;*E = level
2014-05-22 22:13:20 +00:00
ld e , a
2014-05-26 21:04:56 +00:00
ld a , [ wd05e ] ;critical hit?
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_DAMAGE ; W_DAMAGE
2014-05-22 22:13:20 +00:00
xor a
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMOVEPOWER ; wcfce
2014-05-22 22:13:20 +00:00
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 ]
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERBATTSTATUS3 ] ; W_PLAYERBATTSTATUS3
2014-05-22 22:13:20 +00:00
bit 2 , a
jr z , .asm_3de98
sla c
rl b
.asm_3de98
ld hl , W_ENEMYMONATTACK
2014-05-26 21:04:56 +00:00
ld a , [ wd05e ]
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3deef
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_DEFENSE ; wd191
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
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 ]
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERBATTSTATUS3 ] ; W_PLAYERBATTSTATUS3
2014-05-22 22:13:20 +00:00
bit 1 , a
jr z , .asm_3decd
sla c
rl b
.asm_3decd
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONSPECIAL ; wcffc
ld a , [ wd05e ]
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3deef
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_SPECIAL ; W_PARTYMON1_SPECIAL
ld a , [ wPlayerMonNumber ] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONLEVEL ] ; W_ENEMYMONLEVEL
2014-05-22 22:13:20 +00:00
ld e , a
2014-05-26 21:04:56 +00:00
ld a , [ wd05e ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr nz , .asm_3df40
2014-05-26 21:04:56 +00:00
ld hl , wd8c6
2014-05-22 22:13:20 +00:00
dec c
sla c
ld b , $ 0
add hl , bc
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONNUMBER ] ; W_ENEMYMONNUMBER
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
call AddNTimes
ld a , [ hli ]
ld [ $ ff97 ], a
ld a , [ hl ]
ld [ $ ff98 ], a
pop bc
pop de
ret
.asm_3df40
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONLEVEL ] ; W_ENEMYMONLEVEL
ld [ W_CURENEMYLVL ], a ; W_CURENEMYLVL
ld a , [ wcfe5 ]
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONATKDEFIV
ld de , wcfaf
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
ld [ de ], a
inc de
ld a , [ hl ]
ld [ de ], a
pop bc
ld b , $ 0
2014-05-26 21:04:56 +00:00
ld hl , wcfa4
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ]
2014-05-22 22:13:20 +00:00
.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 , $ 1 e
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 Di vide
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 Di vide
; Divide by 50
ld [ hl ], 50
ld b , 4
call Di vide
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
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wd05e ], a
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
2014-05-26 21:04:56 +00:00
ld a , [ wcfe5 ]
2014-05-22 22:13:20 +00:00
jr nz , .asm_3e032
ld a , [ W_PLAYERMONID ]
.asm_3e032
2014-05-26 21:04:56 +00:00
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
ld a , [ W_MONHBASESPEED ]
ld b , a
srl b ; (effective (base speed/2))
ld a , [ H_WHOSETURN ] ; $fff3
and a
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMOVEPOWER ; W_PLAYERMOVEPOWER
ld de , W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
jr z , .calcCriticalHitProbability
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMOVEPOWER ; wcfce
ld de , W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
.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
2014-05-24 18:40:38 +00:00
call BattleRandom ; generates a random value, in "a"
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wd05e ], a ; set critical hit flag
2014-05-22 22:13:20 +00:00
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 , SP ECIAL_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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
FuncCoord 2 , 2
2014-05-22 22:13:20 +00:00
ld hl , Coord
xor a
2014-05-26 21:04:56 +00:00
ld [ wListMenuID ], a
2014-05-22 22:13:20 +00:00
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 , SP ECIAL_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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
FuncCoord 10 , 9
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld a , $ 01
2014-05-26 21:04:56 +00:00
ld [ wListMenuID ], a
2014-05-22 22:13:20 +00:00
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 , $ 0 d ; 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
2014-05-26 21:04:56 +00:00
ld a ,[ wccf2 ]
2014-05-22 22:13:20 +00:00
ld hl , wPlayerSelectedMove
ld de , W_PLAYERMOVENUM
jr z , .next
; values for enemy turn
2014-05-26 21:04:56 +00:00
ld a ,[ wccf1 ]
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld de , wd8c1 ; enemy party pokemon 1 PP
2014-05-22 22:13:20 +00:00
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 , $ 002 c
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 ]
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
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 ]
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
.next
2014-05-26 21:04:56 +00:00
ld a ,[ wd11e ] ; move type
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , wd05b
2014-05-22 22:13:20 +00:00
set 7 ,[ hl ]
.skipSameTypeAttackBonus
2014-05-26 21:04:56 +00:00
ld a ,[ wd11e ]
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a ,[ wd05b ]
2014-05-22 22:13:20 +00:00
and a , $ 80
ld b , a
ld a ,[ hl ] ; a = damage multiplier
ld [ H_MULTIPLIER ], a
add b
2014-05-26 21:04:56 +00:00
ld [ wd05b ], a
2014-05-22 22:13:20 +00:00
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 Di vide
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)
2014-05-26 21:04:56 +00:00
; the result is stored in [wd11e]
2014-05-22 22:13:20 +00:00
; ($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
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a ; initialize [wd11e] to neutral effectiveness
2014-05-22 22:13:20 +00:00
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 ]
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a ; store damage multiplier
2014-05-22 22:13:20 +00:00
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 Ch eckTargetSubstitute ; 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 , $ 3 a
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 , $ 3 a
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%
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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 , $ 0 e
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 Di vide
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)
2014-05-26 21:04:56 +00:00
ld hl , W_DAMAGE ; W_DAMAGE
2014-05-22 22:13:20 +00:00
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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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 Di vide
ld a , [ $ ff97 ]
2014-05-26 21:04:56 +00:00
ld hl , W_DAMAGE ; W_DAMAGE
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld a , [ $ ff98 ]
ld [ hl ], a
ret
Func_3e6bc: ; 3e6bc (f:66bc)
2014-05-26 21:04:56 +00:00
ld a , [ wEnemySelectedMove ] ; wccdd
2014-05-22 22:13:20 +00:00
inc a
jp z , Func_3e88c
call PrintGhostText
jp z , Func_3e88c
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr nz , .asm_3e6dc
ld b , $ 1
2014-05-26 21:04:56 +00:00
ld a , [ wcc3e ]
2014-05-22 22:13:20 +00:00
cp $ e
jr z , .asm_3e6dc
cp $ 4
ret nc
.asm_3e6dc
2014-05-26 21:04:56 +00:00
ld hl , wccd5
2014-05-22 22:13:20 +00:00
inc [ hl ]
xor a
2014-05-26 21:04:56 +00:00
ld [ W_MOVEMISSED ], a ; W_MOVEMISSED
ld [ wccf4 ], a
2014-05-22 22:13:20 +00:00
ld a , $ a
2014-05-26 21:04:56 +00:00
ld [ wd05b ], a
2014-05-22 22:13:20 +00:00
call Func_3e88f
jr nz , .asm_3e6f2
jp [ hl ]
.asm_3e6f2
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
bit 4 , [ hl ]
jr nz , asm_3e70b
call GetCurrentMove
Func_3e6fc: ; 3e6fc (f:66fc)
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
cp CH ARGE_EFFECT
jp z , Func_3f132
cp FLY_EFFECT
jp z , Func_3f132
jr asm_3e72b
asm_3e70b: ; 3e70b (f:670b)
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 4 , [ hl ] ; no longer charging up for attack
res 6 , [ hl ] ; no longer invulnerable to typcial attacks
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
ld a , $ 2 c
2014-05-26 21:04:56 +00:00
ld [ wPredefBank ], a
2014-05-22 22:13:20 +00:00
ld a , MOVE_NAME
ld [ W_LISTTYPE ], a
call GetName
2014-05-26 21:04:56 +00:00
ld de , wcd6d
2014-05-22 22:13:20 +00:00
call CopyStringToCF4B
asm_3e72b: ; 3e72b (f:672b)
xor a
2014-05-26 21:04:56 +00:00
ld [ wcced ], a
2014-05-22 22:13:20 +00:00
call PrintMonName1Text
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
ld hl , EffectsArray1 ; $4000
ld de , $ 1
call IsInArray
jp c , Func_3f132
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
ld hl , EffectsArray5B ; $4049
ld de , $ 1
call IsInArray
call c , Func_3f132
asm_3e750: ; 3e750 (f:6750)
call Func_3ec81
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3e791
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
cp EXPLODE_EFFECT
jr z , asm_3e7a0
jr Func_3e7d1
.asm_3e791
call Func_3ec81
Func_3e794: ; 3e794 (f:6794)
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYBATTSTATUS2 ] ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
bit 4 , a ; does mon have a substitute?
ld hl , Func_79747
ld b , BANK ( Func_79747 )
call nz , Bankswitch
pop af
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
call PlayMoveAnimation
call Func_3eed3
call Func_3cdec
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYBATTSTATUS2 ] ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
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 , $ 1 e
call DelayFrames
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
cp FLY_EFFECT
jr z , .asm_3e7e6
cp CH ARGE_EFFECT
jr z , .asm_3e7e6
jr asm_3e7ef
.asm_3e7e6
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , STATUS_AFFECTED_ANIM
call PlayMoveAnimation
asm_3e7ef: ; 3e7ef (f:67ef)
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
ld hl , EffectsArray3 ; $4014
ld de , $ 1
call IsInArray
jp c , Func_3f132
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3e82b
call PrintMoveFailureText
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
cp EXPLODE_EFFECT
jr z , .asm_3e83e
jp Func_3e88c
.asm_3e82b
call ApplyAttackToPlayerPokemon
call Func_3dc5c
callab Di sp layEffectiveness
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wccf4 ], a
2014-05-22 22:13:20 +00:00
.asm_3e83e
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
ld hl , EffectsArray4 ; $4030
ld de , $ 1
call IsInArray
call c , Func_3f132
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
ld b , [ hl ]
or b
ret z
call HandleBuildingRage
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
bit 2 , [ hl ] ; is mon hitting multiple times? (example: double kick)
jr z , .asm_3e873
push hl
2014-05-26 21:04:56 +00:00
ld hl , wd06f
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcd05 ], a
2014-05-22 22:13:20 +00:00
.asm_3e873
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONSTATUS ; wcfe9
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
and $ 7
jr z , .asm_3e8bf
dec a
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMONSTATUS ], a ; wcfe9
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3e8af
ld hl , FastAsleepText
call PrintText
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , SLP_ANIM
call PlayMoveAnimation
jr .asm_3e8b5
.asm_3e8af
ld hl , WokeUpText
call PrintText
.asm_3e8b5
xor a
2014-05-26 21:04:56 +00:00
ld [ wccf2 ], a
2014-05-22 22:13:20 +00:00
ld hl , Func_3e88c ; $688c
jp Func_3eab8
.asm_3e8bf
bit 5 , [ hl ]
jr z , .asm_3e8d3
ld hl , IsFrozenText
call PrintText
xor a
2014-05-26 21:04:56 +00:00
ld [ wccf2 ], a
2014-05-22 22:13:20 +00:00
ld hl , Func_3e88c ; $688c
jp Func_3eab8
.asm_3e8d3
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERBATTSTATUS1 ] ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYDISABLEDMOVE ; W_ENEMYDISABLEDMOVE
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
and a
jr z , .asm_3e929
dec a
ld [ hl ], a
and $ f
jr nz , .asm_3e929
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ wccef ], a
2014-05-22 22:13:20 +00:00
ld hl , Di sabledNoMoreText
call PrintText
.asm_3e929
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYBATTSTATUS1 ] ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
add a
jp nc , Func_3e9aa
2014-05-26 21:04:56 +00:00
ld hl , wd070
2014-05-22 22:13:20 +00:00
dec [ hl ]
jr nz , .asm_3e944
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 7 , [ hl ]
ld hl , ConfusedNoMoreText
call PrintText
jp Func_3e9aa
.asm_3e944
ld hl , IsConfusedText
call PrintText
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , CONF_ANIM
call PlayMoveAnimation
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $ 80
jr c , Func_3e9aa
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONDEFENSE ] ; wcff8
2014-05-22 22:13:20 +00:00
ld [ hli ], a
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONDEFENSE + 1 ]
2014-05-22 22:13:20 +00:00
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
push hl
ld a , [ hl ]
push af
xor a
ld [ hli ], a
2014-05-26 21:04:56 +00:00
ld [ wd05e ], a
2014-05-22 22:13:20 +00:00
ld a , $ 28
ld [ hli ], a
xor a
ld [ hl ], a
call Func_3de75
call MoreCalculateDamage
pop af
pop hl
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONDEF + 1
2014-05-22 22:13:20 +00:00
pop af
ld [ hld ], a
pop af
ld [ hl ], a
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wccef ]
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3e9bf
2014-05-26 21:04:56 +00:00
ld hl , wEnemySelectedMove ; wccdd
2014-05-22 22:13:20 +00:00
cp [ hl ]
jr nz , .asm_3e9bf
call PrintMoveIsDisabledText
ld hl , Func_3e88c ; $688c
jp Func_3eab8
.asm_3e9bf
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONSTATUS ; wcfe9
2014-05-22 22:13:20 +00:00
bit 6 , [ hl ]
jr z , asm_3e9f6
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $ 3 f
jr nc , asm_3e9f6
ld hl , FullyParalyzedText
call PrintText
asm_3e9d3: ; 3e9d3 (f:69d3)
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
and $ cc
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
cp FLY_EFFECT
jr z , .asm_3e9e7
cp CH ARGE_EFFECT
jr z , .asm_3e9e7
jr .asm_3e9f0
.asm_3e9e7
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , STATUS_AFFECTED_ANIM
call PlayMoveAnimation
.asm_3e9f0
ld hl , Func_3e88c ; $688c
jp Func_3eab8
asm_3e9f6: ; 3e9f6 (f:69f6)
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
bit 0 , [ hl ] ; is mon using bide?
jr z , .asm_3ea54
xor a
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMOVENUM ], a ; W_ENEMYMOVENUM
ld hl , W_DAMAGE ; W_DAMAGE
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
ld b , a
ld c , [ hl ]
2014-05-26 21:04:56 +00:00
ld hl , wcd06
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
add c
ld [ hld ], a
ld a , [ hl ]
adc b
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld hl , wd06f
2014-05-22 22:13:20 +00:00
dec [ hl ]
jr z , .asm_3ea1c
ld hl , Func_3e88c ; $688c
jp Func_3eab8
.asm_3ea1c
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 0 , [ hl ]
ld hl , UnleashedEnergyText
call PrintText
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMOVEPOWER ], a ; wcfce
ld hl , wcd06
2014-05-22 22:13:20 +00:00
ld a , [ hld ]
add a
ld b , a
2014-05-26 21:04:56 +00:00
ld [ wd0d8 ], a
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
rl a
2014-05-26 21:04:56 +00:00
ld [ W_DAMAGE ], a ; W_DAMAGE
2014-05-22 22:13:20 +00:00
or b
jr nz , .asm_3ea43
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ W_MOVEMISSED ], a ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
.asm_3ea43
xor a
ld [ hli ], a
ld [ hl ], a
ld a , BIDE
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMOVENUM ], a ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMOVENUM ], a ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
ld hl , ThrashingAboutText
call PrintText
2014-05-26 21:04:56 +00:00
ld hl , wd06f
2014-05-22 22:13:20 +00:00
dec [ hl ]
ld hl , asm_3e750 ; $6750
jp nz , Func_3eab8
push hl
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 1 , [ hl ] ; mon is no longer using thrash or petal dance
set 7 , [ hl ] ; mon is now confused
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
and $ 3
inc a
inc a
2014-05-26 21:04:56 +00:00
ld [ wd070 ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , wd06f
2014-05-22 22:13:20 +00:00
dec [ hl ]
ld hl , Func_3e794 ; $6794
jp nz , Func_3eab8
jp Func_3eab8
Func_3ea9b: ; 3ea9b (f:6a9b)
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYBATTSTATUS2 ] ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
bit 6 , a ; is mon using rage?
jp z , Func_3eaba
ld a , RAGE
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
call GetMoveName
call CopyStringToCF4B
xor a
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMOVEEFFECT ], a ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMOVENUM ; W_ENEMYMOVENUM
ld a , [ wEnemySelectedMove ] ; wccdd
2014-05-22 22:13:20 +00:00
jr .selected
.player
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERMOVENUM ; wcfd2
2014-05-22 22:13:20 +00:00
ld a , [ W_FLAGS_D733 ]
bit 0 , a
2014-05-26 21:04:56 +00:00
ld a , [ wccd9 ]
2014-05-22 22:13:20 +00:00
jr nz , .selected
2014-05-26 21:04:56 +00:00
ld a , [ wPlayerSelectedMove ] ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
.selected
2014-05-26 21:04:56 +00:00
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
dec a
ld hl , Moves ; $4000
ld bc , $ 6
call AddNTimes
ld a , BANK ( Moves )
call FarCopyData
ld a , $ 2 c
2014-05-26 21:04:56 +00:00
ld [ wPredefBank ], a
2014-05-22 22:13:20 +00:00
ld a , $ 2
ld [ W_LISTTYPE ], a ; list type 2 = move name
call GetName
2014-05-26 21:04:56 +00:00
ld de , wcd6d
2014-05-22 22:13:20 +00:00
jp CopyStringToCF4B
Func_3eb01: ; 3eb01 (f:6b01)
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jp z , Func_3cc13
ld a , [ W_ENEMYMONID ]
2014-05-26 21:04:56 +00:00
ld [ wcfe5 ], a
ld [ wd0b5 ], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYBATTSTATUS3 ] ; W_ENEMYBATTSTATUS3
2014-05-22 22:13:20 +00:00
bit 3 , a
2014-05-26 21:04:56 +00:00
ld hl , wcceb
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
ld b , [ hl ]
jr nz , .asm_3eb33
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
cp $ 2
ld a , $ 98
ld b , $ 88
jr z , .asm_3eb33
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
ld b , a
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
.asm_3eb33
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONATKDEFIV
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hl ], b
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
ld a , [ W_CURENEMYLVL ] ; W_CURENEMYLVL
2014-05-22 22:13:20 +00:00
ld [ de ], a
inc de
ld b , $ 0
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
push hl
call CalcStats
pop hl
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
cp $ 2
jr z , .asm_3eb65
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYBATTSTATUS3 ] ; W_ENEMYBATTSTATUS3
2014-05-22 22:13:20 +00:00
bit 3 , a
jr nz , .asm_3eb86
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONMAXHP ] ; W_ENEMYMONMAXHP
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld a , [ W_ENEMYMONMAXHP + 1 ]
ld [ hli ], a
xor a
inc hl
ld [ hl ], a
jr .asm_3eb86
.asm_3eb65
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMON1HP ; wd8a5 (aliases: W_WATERMONS)
ld a , [ wWhichPokemon ] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
call AddNTimes
ld a , [ hli ]
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMONCURHP ], a ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a , [ hli ]
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMONCURHP + 1 ], a
ld a , [ wWhichPokemon ] ; wWhichPokemon
ld [ W_ENEMYMONNUMBER ], a ; W_ENEMYMONNUMBER
2014-05-22 22:13:20 +00:00
inc hl
ld a , [ hl ]
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMONSTATUS ], a ; wcfe9
2014-05-22 22:13:20 +00:00
jr .asm_3eb86
.asm_3eb86
ld hl , W_MONHTYPES
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMONTYPES ; wcfea
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
cp $ 2
jr nz , .asm_3ebb0
2014-05-26 21:04:56 +00:00
ld hl , wd8ac
ld a , [ wWhichPokemon ] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld bc , $ 2 c
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
2014-05-26 21:04:56 +00:00
ld [ wHPBarMaxHP ], a
2014-05-22 22:13:20 +00:00
ld a , $ 3 e
call Predef ; indirect jump to WriteMonMoves (3afb8 (e:6fb8))
.asm_3ebca
ld hl , W_ENEMYMONMOVES
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMONSPECIAL + 1
2014-05-22 22:13:20 +00:00
ld a , $ 5 e
call Predef ; indirect jump to LoadMovePPs (f473 (3:7473))
ld hl , W_MONHBASESTATS
2014-05-26 21:04:56 +00:00
ld de , wd002
2014-05-22 22:13:20 +00:00
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 ]
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
call GetMonName
2014-05-26 21:04:56 +00:00
ld hl , wcd6d
2014-05-22 22:13:20 +00:00
ld de , W_ENEMYMONNAME
ld bc , $ b
call CopyData
ld a , [ W_ENEMYMONID ]
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
ld a , $ 3 a
call Predef ; indirect jump to IndexToPokedex (41010 (10:5010))
2014-05-26 21:04:56 +00:00
ld a , [ wd11e ]
2014-05-22 22:13:20 +00:00
dec a
ld c , a
ld b , $ 1
2014-05-26 21:04:56 +00:00
ld hl , wPokedexSeen ; wd30a
2014-05-25 17:09:39 +00:00
ld a , $ 10 ; FlagActionPredef
call Predef
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
ld de , wcd23
2014-05-22 22:13:20 +00:00
ld bc , $ b
call CopyData
ld a , $ 7
ld b , $ 8
2014-05-26 21:04:56 +00:00
ld hl , wEnemyMonStatMods ; wcd2e
2014-05-22 22:13:20 +00:00
.asm_3ec2d
ld [ hli ], a
dec b
jr nz , .asm_3ec2d
ret
Func_3ec32: ; 3ec32 (f:6c32)
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr nz , .asm_3ec4d
xor a
2014-05-26 21:04:56 +00:00
ld [ wMenuJoypadPollCount ], a ; wMenuJoypadPollCount
2014-05-22 22:13:20 +00:00
callab Func_372d6
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcfcb ], a
2014-05-22 22:13:20 +00:00
call Cl earScreen
.asm_3ec4d
call DelayFrame
ld a , $ 30
2014-05-29 18:21:41 +00:00
call Predef ; indirect jump to BattleTransition (7096d (1c:496d))
2014-05-22 22:13:20 +00:00
callab Func_3ee58
ld a , $ 1
ld [ H_AUTOBGTRANSFERENABLED ], a ; $ffba
ld a , $ ff
2014-05-26 21:04:56 +00:00
ld [ wcfcb ], a
2014-05-23 22:34:35 +00:00
call Cl earSprites
2014-05-22 22:13:20 +00:00
call Cl earScreen
xor a
ld [ H_AUTOBGTRANSFERENABLED ], a ; $ffba
ld [ $ ffb0 ], a
ld [ rWY ], a ; $ff4a
ld [ $ ffd7 ], a
2014-05-26 21:04:56 +00:00
ld hl , wd060
2014-05-22 22:13:20 +00:00
ld [ hli ], a
ld [ hli ], a
ld [ hli ], a
ld [ hli ], a
ld [ hl ], a
2014-05-26 21:04:56 +00:00
ld [ W_PLAYERDISABLEDMOVE ], a ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
ret
Func_3ec81: ; 3ec81 (f:6c81)
push bc
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONLEVEL ] ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONLEVEL ] ; W_ENEMYMONLEVEL
ld [ W_PLAYERMONLEVEL ], a ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
ld a , b
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMONLEVEL ], a ; W_ENEMYMONLEVEL
2014-05-22 22:13:20 +00:00
pop bc
ret
Func_3ec92: ; 3ec92 (f:6c92)
2014-05-26 21:04:56 +00:00
ld a , [ W_BATTLETYPE ] ; wd05a
2014-05-22 22:13:20 +00:00
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
2014-05-29 08:31:46 +00:00
ld de , vBackPic
2014-05-22 22:13:20 +00:00
call InterlaceMergeSpriteBuffers
ld a , $ a
ld [ $ 0 ], a
xor a
ld [ $ 4000 ], a
2014-05-29 08:31:46 +00:00
ld hl , vSprites
2014-05-22 22:13:20 +00:00
ld de , S_SPRITEBUFFER1
ld a , [ H_LOADEDROMBANK ]
ld b , a
2014-05-29 08:31:46 +00:00
ld c , 7 * 7
2014-05-22 22:13:20 +00:00
call CopyVideoData
xor a
ld [ $ 0 ], a
ld a , $ 31
ld [ $ ffe1 ], a
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 5
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONSTATUS ] ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
and $ 40
ret z
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONSPEED + 1
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONSTATUS ] ; wcfe9
2014-05-22 22:13:20 +00:00
and $ 40
ret z
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONSPEED + 1
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONSTATUS ] ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
and $ 10
ret z
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONATK + 1
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMONSTATUS ] ; wcfe9
2014-05-22 22:13:20 +00:00
and $ 10
ret z
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONATTACK + 1
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ wd11e ]
2014-05-22 22:13:20 +00:00
and a
ld a , c
ld hl , W_PLAYERMONATK
2014-05-26 21:04:56 +00:00
ld de , wcd12
ld bc , wPlayerMonAttackMod ; wcd1a
2014-05-22 22:13:20 +00:00
jr z , .asm_3edc0
ld hl , W_ENEMYMONATTACK
2014-05-26 21:04:56 +00:00
ld de , wcd26
ld bc , wEnemyMonStatMods ; wcd2e
2014-05-22 22:13:20 +00:00
.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 Di vide
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
2014-05-29 08:31:46 +00:00
ld de , vChars2 + $ 6 d0
2014-05-22 22:13:20 +00:00
ld bc , $ 18
ld a , BANK ( BattleHudTiles1 )
call FarCopyDataDouble
ld hl , BattleHudTiles2 ; $6098
2014-05-29 08:31:46 +00:00
ld de , vChars2 + $ 730
2014-05-22 22:13:20 +00:00
ld bc , $ 30
ld a , BANK ( BattleHudTiles2 )
jp FarCopyDataDouble
.asm_3ee7c
ld de , BattleHudTiles1 ; $6080
2014-05-29 08:31:46 +00:00
ld hl , vChars2 + $ 6 d0
2014-05-22 22:13:20 +00:00
ld bc , ( BANK ( BattleHudTiles1 ) << 8 ) + $ 03
call CopyVideoDataDouble
ld de , BattleHudTiles2 ; $6098
2014-05-29 08:31:46 +00:00
ld hl , vChars2 + $ 730
2014-05-22 22:13:20 +00:00
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 "@"
2014-05-24 18:40:38 +00:00
BattleRandom:
; Link battles use a shared PRNG.
2014-05-22 22:13:20 +00:00
ld a , [ W_ISLINKBATTLE ]
cp $ 4
2014-05-24 18:40:38 +00:00
jp nz , Random
2014-05-22 22:13:20 +00:00
push hl
push bc
2014-05-26 21:04:56 +00:00
ld a , [ wccde ]
2014-05-22 22:13:20 +00:00
ld c , a
2014-05-24 18:40:38 +00:00
ld b , 0
2014-05-26 21:04:56 +00:00
ld hl , wd148
2014-05-22 22:13:20 +00:00
add hl , bc
inc a
2014-05-26 21:04:56 +00:00
ld [ wccde ], a
2014-05-24 18:40:38 +00:00
cp 9
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
pop bc
pop hl
ret c
2014-05-24 18:40:38 +00:00
2014-05-22 22:13:20 +00:00
push hl
push bc
push af
2014-05-24 18:40:38 +00:00
2014-05-22 22:13:20 +00:00
xor a
2014-05-26 21:04:56 +00:00
ld [ wccde ], a
2014-05-24 18:40:38 +00:00
2014-05-26 21:04:56 +00:00
ld hl , wd148
2014-05-24 18:40:38 +00:00
ld b , 9
.loop
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
ld c , a
add a
add a
add c
inc a
ld [ hli ], a
dec b
2014-05-24 18:40:38 +00:00
jr nz , .loop
2014-05-22 22:13:20 +00:00
pop af
pop bc
pop hl
ret
2014-05-24 18:40:38 +00:00
2014-05-22 22:13:20 +00:00
Func_3eed3: ; 3eed3 (f:6ed3)
ld a , [ H_WHOSETURN ] ; $fff3
and a
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONTYPE1 ; wcfea (aliases: W_ENEMYMONTYPES)
ld de , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld a , [ W_PLAYERMOVENUM ] ; wcfd2
2014-05-22 22:13:20 +00:00
jr z , .asm_3eeea
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONTYPE1 ; wd019 (aliases: W_PLAYERMONTYPES)
ld de , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
ret nz
ld a , MEGA_PUNCH
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
PlayMoveAnimation: ; 3ef07 (f:6f07)
2014-05-26 21:04:56 +00:00
ld [ W_ANIMATIONID ], a
2014-05-22 22:13:20 +00:00
call Delay3
PREDEF_JUMP MoveAnimationPredef ; predef 8
InitBattle: ; 3ef12 (f:6f12)
2014-05-26 21:04:56 +00:00
ld a , [ W_CUROPPONENT ] ; wd059
2014-05-22 22:13:20 +00:00
and a
jr z , asm_3ef23
InitOpponent: ; 3ef18 (f:6f18)
2014-05-26 21:04:56 +00:00
ld a , [ W_CUROPPONENT ] ; wd059
ld [ wcf91 ], a
2014-05-22 22:13:20 +00:00
ld [ W_ENEMYMONID ], a
jr asm_3ef3d
asm_3ef23: ; 3ef23 (f:6f23)
2014-05-26 21:04:56 +00:00
ld a , [ wd732 ]
2014-05-22 22:13:20 +00:00
bit 1 , a
jr z , .asm_3ef2f
2014-05-25 17:51:53 +00:00
ld a , [ hJoyHeld ]
2014-05-22 22:13:20 +00:00
bit 1 , a
ret nz
.asm_3ef2f
2014-05-26 21:04:56 +00:00
ld a , [ wd13c ]
2014-05-22 22:13:20 +00:00
and a
ret nz
callab Func_13870
ret nz
asm_3ef3d: ; 3ef3d (f:6f3d)
2014-05-26 21:04:56 +00:00
ld a , [ wd35d ]
2014-05-22 22:13:20 +00:00
push af
2014-05-26 21:04:56 +00:00
ld hl , wd358
2014-05-22 22:13:20 +00:00
ld a , [ hl ]
push af
res 1 , [ hl ]
callab Func_525af
ld a , [ W_ENEMYMONID ]
sub $ c8
jp c , InitWildBattle
2014-05-26 21:04:56 +00:00
ld [ W_TRAINERCLASS ], a ; wd031
2014-05-22 22:13:20 +00:00
call GetTrainerInformation
callab ReadTrainer
call Func_3ec32
call _LoadTrainerPic
xor a
ld [ W_ENEMYMONID ], a
ld [ $ ffe1 ], a
dec a
2014-05-26 21:04:56 +00:00
ld [ wAICount ], a ; wccdf
FuncCoord 12 , 0
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld a , $ 1
call Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6))
ld a , $ ff
2014-05-26 21:04:56 +00:00
ld [ W_ENEMYMONNUMBER ], a ; W_ENEMYMONNUMBER
2014-05-22 22:13:20 +00:00
ld a , $ 2
2014-05-26 21:04:56 +00:00
ld [ W_ISINBATTLE ], a ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
jp Func_3efeb
InitWildBattle: ; 3ef8b (f:6f8b)
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ W_ISINBATTLE ], a ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
call Func_3eb01
call Func_3ec32
2014-05-26 21:04:56 +00:00
ld a , [ W_CUROPPONENT ] ; wd059
2014-05-22 22:13:20 +00:00
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 ], "@"
2014-05-26 21:04:56 +00:00
ld a , [ wcf91 ]
2014-05-22 22:13:20 +00:00
push af
ld a , MON_GHOST
2014-05-26 21:04:56 +00:00
ld [ wcf91 ], a
2014-05-29 08:31:46 +00:00
ld de , vFrontPic
2014-05-22 22:13:20 +00:00
call LoadMonFrontSprite ; load ghost sprite
pop af
2014-05-26 21:04:56 +00:00
ld [ wcf91 ], a
2014-05-22 22:13:20 +00:00
jr .spriteLoaded
.isNoGhost
2014-05-29 08:31:46 +00:00
ld de , vFrontPic
2014-05-22 22:13:20 +00:00
call LoadMonFrontSprite ; load mon sprite
.spriteLoaded
xor a
2014-05-26 21:04:56 +00:00
ld [ W_TRAINERCLASS ], a ; wd031
2014-05-22 22:13:20 +00:00
ld [ $ ffe1 ], a
2014-05-26 21:04:56 +00:00
FuncCoord 12 , 0
2014-05-22 22:13:20 +00:00
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 Cl earScreen
ld a , $ 98
ld [ $ ffbd ], a
ld a , $ 1
ld [ H_AUTOBGTRANSFERENABLED ], a ; $ffba
call Delay3
ld a , $ 9 c
ld [ $ ffbd ], a
call LoadScreenTilesFromBuffer1
2014-05-26 21:04:56 +00:00
FuncCoord 9 , 7
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 50 a
call Cl earScreenArea
2014-05-26 21:04:56 +00:00
FuncCoord 1 , 0
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld bc , $ 40 a
call Cl earScreenArea
2014-05-23 22:34:35 +00:00
call Cl earSprites
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
call z , Func_3cdec
call Func_3c11e
callab Func_137aa
pop af
2014-05-26 21:04:56 +00:00
ld [ wd358 ], a
2014-05-22 22:13:20 +00:00
pop af
2014-05-26 21:04:56 +00:00
ld [ wd35d ], a
ld a , [ wd0d4 ]
2014-05-22 22:13:20 +00:00
ld [ $ ffd7 ], a
scf
ret
TerminatorText_3f04a: ; 3f04a (f:704a)
db "@"
_LoadTrainerPic: ; 3f04b (f:704b)
2014-05-26 21:04:56 +00:00
; wd033-wd034 contain pointer to pic
ld a , [ wd033 ]
2014-05-22 22:13:20 +00:00
ld e , a
2014-05-26 21:04:56 +00:00
ld a , [ wd034 ]
2014-05-22 22:13:20 +00:00
ld d , a ; de contains pointer to trainer pic
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
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
2014-05-29 08:31:46 +00:00
ld de , vFrontPic
2014-05-22 22:13:20 +00:00
ld a , $ 77
ld c , a
jp LoadUncompressedSpriteData
Func_3f069: ; 3f069 (f:7069)
xor a
2014-05-26 21:04:56 +00:00
ld [ wc0f1 ], a
ld [ wc0f2 ], a
2014-05-22 22:13:20 +00:00
jp PlaySound
Func_3f073: ; 3f073 (f:7073)
2014-05-26 21:04:56 +00:00
ld a , [ wPredefRegisters ]
2014-05-22 22:13:20 +00:00
ld h , a
2014-05-26 21:04:56 +00:00
ld a , [ wPredefRegisters + 1 ]
2014-05-22 22:13:20 +00:00
ld l , a
ld a , [ $ ffe1 ]
ld [ H_DOWNARROWBLINKCNT1 ], a ; $ff8b
ld b , $ 4 c
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
and a
jr z , .asm_3f0bc
add b
ld [ hl ], a
call Delay3
ld bc , $ ffd7
add hl , bc
ld a , $ 1
2014-05-26 21:04:56 +00:00
ld [ wcd6c ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wcd6c ], a
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wPredefRegisters ]
2014-05-22 22:13:20 +00:00
ld h , a
2014-05-26 21:04:56 +00:00
ld a , [ wPredefRegisters + 1 ]
2014-05-22 22:13:20 +00:00
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
2014-05-29 08:31:46 +00:00
LoadMonBackSprite:
; Assumes the monster's attributes have
; been loaded with GetMonHeader.
2014-05-26 21:04:56 +00:00
ld a , [ wcfd9 ]
ld [ wcf91 ], a
FuncCoord 1 , 5
2014-05-22 22:13:20 +00:00
ld hl , Coord
ld b , $ 7
ld c , $ 8
call Cl earScreenArea
ld hl , W_MONHBACKSPRITE - W_MONHEADER
call UncompressMonSprite
ld a , $ 3
call Predef ; indirect jump to ScaleSpriteByTwo (2fe40 (b:7e40))
2014-05-29 08:31:46 +00:00
ld de , vBackPic
2014-05-22 22:13:20 +00:00
call InterlaceMergeSpriteBuffers ; combine the two buffers to a single 2bpp sprite
2014-05-29 08:31:46 +00:00
ld hl , vSprites
ld de , vBackPic
2014-05-22 22:13:20 +00:00
ld c , ( 2 * SP RITEBUFFERSIZE ) / 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 Ch argeEffect ; CHARGE_EFFECT
dw $ 0000 ; SUPER_FANG_EFFECT
dw $ 0000 ; SPECIAL_DAMAGE_EFFECT
dw TrappingEffect ; TRAPPING_EFFECT
dw Ch argeEffect ; 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 Sp lashEffect ; SPLASH_EFFECT
dw Di sableEffect ; DISABLE_EFFECT
SleepEffect: ; 3f1fc (f:71fc)
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYMONSTATUS ; wcfe9
ld bc , W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jp z , .asm_3f20e
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS
ld bc , W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
.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 , Al readyAsleepText
jp PrintText
.asm_3f222
ld a , b
and a
jr nz , .asm_3f242
push de
call MoveHitTest
pop de
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3f242
.asm_3f231
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONSTATUS ; wcfe9
ld de , W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f260
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS
ld de , W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3f260
call Ch eckTargetSubstitute
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
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3f2d7
jr .asm_3f295
.asm_3f290
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS3 ; W_PLAYERBATTSTATUS3
2014-05-22 22:13:20 +00:00
ld a , [ de ]
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERTOXICCOUNTER ; wd06c
2014-05-22 22:13:20 +00:00
jr nz , .asm_3f2b0
ld b , $ a9
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS3 ; W_ENEMYBATTSTATUS3
ld de , W_ENEMYTOXICCOUNTER ; wd071
2014-05-22 22:13:20 +00:00
.asm_3f2b0
cp $ 5 c
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)
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONCURHP ; wd015
ld de , W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f302
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONCURHP ; W_ENEMYMONCURHP
ld de , W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
call Ch eckTargetSubstitute ;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 , Ch eckDefrost
;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 , $ 1 a ;[1A-1]/100 or [26-1]/256 = 9.8%~ chance
jr c , .next1 ;branch ahead if this is a 10% chance effect..
ld b , $ 4 d ;..or use [4D-1]/100 or [76-1]/256 = 29.7%~ chance
sub a , $ 1 e ;subtract $1E to map to equivalent 10% chance effects
.next1
push af ;push effect...
2014-05-24 18:40:38 +00:00
call BattleRandom ;get random 8bit value for probability test
2014-05-22 22:13:20 +00:00
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 , Ch eckDefrost
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 , $ 1 a
jr c , .next1
ld b , $ 4 d
sub a , $ 1 e
.next1
push af
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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]
2014-05-26 21:04:56 +00:00
ld hl , wd8a8 ;status of first opponent monster in their roster
2014-05-22 22:13:20 +00:00
ld a , [ W_ENEMYMONNUMBER ]
ld bc , $ 002 c ;$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
2014-05-26 21:04:56 +00:00
ld hl , W_PARTYMON1_STATUS
2014-05-22 22:13:20 +00:00
ld a , [ wPlayerMonNumber ]
ld bc , $ 002 c
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)
2014-05-26 21:04:56 +00:00
ld hl , wPlayerMonStatMods ; wcd1a
ld de , W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f439
2014-05-26 21:04:56 +00:00
ld hl , wEnemyMonStatMods ; wcd2e
ld de , W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONATK + 1
ld de , wcd12
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f472
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONATTACK + 1
ld de , wcd26
2014-05-22 22:13:20 +00:00
.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 Di vide
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
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
ld de , W_PLAYERMOVENUM ; wcfd2
ld bc , wccf7
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f4e6
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
ld de , W_ENEMYMOVENUM ; W_ENEMYMOVENUM
ld bc , wccf3
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMOVEEFFECT ] ; wcfd3
2014-05-22 22:13:20 +00:00
jr z , .asm_3f53b
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3f53b
cp ATTACK_DOWN1_EFFECT
ret nc
ld hl , RoseText
ret
GreatlyRoseText: ; 3f542 (f:7542)
db $ 0 a
TX_FAR _GreatlyRoseText
RoseText: ; 3f547 (f:7547)
TX_FAR _RoseText
db "@"
StatModifierDownEffect: ; 3f54c (f:754c)
2014-05-26 21:04:56 +00:00
ld hl , wEnemyMonStatMods ; wcd2e
ld de , W_PLAYERMOVEEFFECT ; wcfd3
ld bc , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f572
2014-05-26 21:04:56 +00:00
ld hl , wPlayerMonStatMods ; wcd1a
ld de , W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
ld bc , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
jr z , .asm_3f572
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $ 40
jp c , Func_3f65a
.asm_3f572
call Ch eckTargetSubstitute
jp nz , Func_3f65a
ld a , [ de ]
cp ATTACK_DOWN_SIDE_EFFECT
jr c , .asm_3f58a
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp SP LASH_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
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONATTACK + 1
ld de , wcd26
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f5d8
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONATK + 1
ld de , wcd12
2014-05-22 22:13:20 +00:00
.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 Di vide
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
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMOVEEFFECT ] ; wcfd3
2014-05-22 22:13:20 +00:00
jr z , .asm_3f674
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3f674
cp $ 1 a
ret c
cp $ 44
ret nc
ld hl , GreatlyFellText
ret
GreatlyFellText: ; 3f67e (f:767e)
db $ 0 a
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
2014-05-26 21:04:56 +00:00
ld de , wcf4b
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld bc , wd06a
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ]
and a
jr z , .asm_3f6fc
ld hl , W_ENEMYBATTSTATUS1
2014-05-26 21:04:56 +00:00
ld de , wcd05
ld bc , wd06f
2014-05-22 22:13:20 +00:00
.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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
and $ 1
inc a
inc a
ld [ bc ], a
ld a , [ H_WHOSETURN ]
add $ ae
jp Func_3fb96
ThrashPetalDanceEffect: ; 3f717 (f:7717)
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld de , wd06a
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f728
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de , wd06f
2014-05-22 22:13:20 +00:00
.asm_3f728
set 1 , [ hl ] ; mon is now using thrash/petal dance
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr nz , .asm_3f77e
2014-05-26 21:04:56 +00:00
ld a , [ W_CURENEMYLVL ] ; W_CURENEMYLVL
2014-05-22 22:13:20 +00:00
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONLEVEL ] ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
cp b
jr nc , .asm_3f76e
add b
ld c , a
inc c
.asm_3f751
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp c
jr nc , .asm_3f751
srl b
srl b
cp b
jr nc , .asm_3f76e
ld c , $ 32
call DelayFrames
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMOVENUM ] ; wcfd2
2014-05-22 22:13:20 +00:00
cp TELEPORT
jp nz , PrintDidntAffectText
jp PrintButItFailedText_
.asm_3f76e
call ReadPlayerMonCurHPAndStatus
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
inc a
2014-05-26 21:04:56 +00:00
ld [ wd078 ], a
ld a , [ W_PLAYERMOVENUM ] ; wcfd2
2014-05-22 22:13:20 +00:00
jr .asm_3f7e4
.asm_3f77e
ld c , $ 32
call DelayFrames
ld hl , IsUnaffectedText
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMOVENUM ] ; wcfd2
2014-05-22 22:13:20 +00:00
cp TELEPORT
jp nz , PrintText
jp PrintButItFailedText_
.asm_3f791
2014-05-26 21:04:56 +00:00
ld a , [ W_ISINBATTLE ] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr nz , .asm_3f7d1
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMONLEVEL ] ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
ld b , a
2014-05-26 21:04:56 +00:00
ld a , [ W_CURENEMYLVL ] ; W_CURENEMYLVL
2014-05-22 22:13:20 +00:00
cp b
jr nc , .asm_3f7c1
add b
ld c , a
inc c
.asm_3f7a4
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp c
jr nc , .asm_3f7a4
srl b
srl b
cp b
jr nc , .asm_3f7c1
ld c , $ 32
call DelayFrames
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
cp TELEPORT
jp nz , PrintDidntAffectText
jp PrintButItFailedText_
.asm_3f7c1
call ReadPlayerMonCurHPAndStatus
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
inc a
2014-05-26 21:04:56 +00:00
ld [ wd078 ], a
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
jr .asm_3f7e4
.asm_3f7d1
ld c , $ 32
call DelayFrames
ld hl , IsUnaffectedText
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld de , wd06a
ld bc , W_NUMHITS ; wd074
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f828
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de , wd06f
ld bc , wcd05
2014-05-22 22:13:20 +00:00
.asm_3f828
bit 2 , [ hl ] ; is mon attacking multiple times?
ret nz
set 2 , [ hl ] ; mon is now attacking multiple times
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f838
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3f838
ld a , [ hl ]
cp TWINEEDLE_EFFECT
jr z , .asm_3f856
cp ATTACK_TWICE_EFFECT
ld a , $ 2
jr z , .asm_3f853
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
and $ 3
cp $ 2
jr c , .asm_3f851
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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 Ch eckTargetSubstitute
ret nz
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de , W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f870
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld de , W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3f870
ld a , [ de ]
cp FLINCH_SIDE_EFFECT1
ld b , $ 1 a ; ~10% chance of flinch
jr z , .asm_3f879
ld b , $ 4 d ; ~30% chance of flinch
.asm_3f879
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld de , W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
ld b , $ ae
jr z , .asm_3f8a1
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de , W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
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 DI G
jr nz , .asm_3f8b6
set 6 , [ hl ] ; mon is now invulnerable to typical attacks (fly/dig)
ld b , $ c0
.asm_3f8b6
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , b
call Func_3fbb9
ld a , [ de ]
2014-05-26 21:04:56 +00:00
ld [ wWhichTrade ], a ; wWhichTrade
2014-05-22 22:13:20 +00:00
ld hl , Ch argeMoveEffectText ; $78c8
jp PrintText
ChargeMoveEffectText: ; 3f8c8 (f:78c8)
TX_FAR _ChargeMoveEffectText
db $ 08 ; asm
2014-05-26 21:04:56 +00:00
ld a , [ wWhichTrade ] ; wWhichTrade
2014-05-22 22:13:20 +00:00
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 DI G
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)
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld de , wd06a
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f928
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld de , wd06f
2014-05-22 22:13:20 +00:00
.asm_3f928
bit 5 , [ hl ]
ret nz
call Func_3f9cf
set 5 , [ hl ]
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
and $ 3
cp $ 2
jr c , .asm_3f93e
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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)
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $ 19
ret nc
jr Func_3f96f
ConfusionEffect: ; 3f961 (f:7961)
call Ch eckTargetSubstitute
jr nz , Func_3f9a6
call MoveHitTest
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr nz , Func_3f9a6
Func_3f96f: ; 3f96f (f:796f)
ld a , [ H_WHOSETURN ] ; $fff3
and a
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld bc , wd070
ld a , [ W_PLAYERMOVEEFFECT ] ; wcfd3
2014-05-22 22:13:20 +00:00
jr z , .asm_3f986
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld bc , wd06b
ld a , [ W_ENEMYMOVEEFFECT ] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3f986
bit 7 , [ hl ] ; is mon confused?
jr nz , Func_3f9a6
set 7 , [ hl ] ; mon is now confused
push af
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f9cc
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
.asm_3f9cc
set 5 , [ hl ] ; mon now needs to recharge
ret
Func_3f9cf: ; 3f9cf (f:79cf)
push hl
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3f9db
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
.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
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
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
2014-05-26 21:04:56 +00:00
ld a , [ W_MOVEMISSED ] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr nz , .asm_3fb06
2014-05-26 21:04:56 +00:00
ld de , W_ENEMYDISABLEDMOVE ; W_ENEMYDISABLEDMOVE
2014-05-22 22:13:20 +00:00
ld hl , W_ENEMYMONMOVES
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr z , .asm_3faa4
2014-05-26 21:04:56 +00:00
ld de , W_PLAYERDISABLEDMOVE ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
ld hl , W_PLAYERMONMOVES
.asm_3faa4
ld a , [ de ]
and a
jr nz , .asm_3fb06
.asm_3faa8
push hl
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
and $ 3
ld c , a
ld b , $ 0
add hl , bc
ld a , [ hl ]
pop hl
and a
jr z , .asm_3faa8
2014-05-26 21:04:56 +00:00
ld [ wd11e ], a
2014-05-22 22:13:20 +00:00
push hl
ld a , [ H_WHOSETURN ] ; $fff3
and a
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
jr nz , .asm_3facf
2014-05-26 21:04:56 +00:00
ld a , [ W_ISLINKBATTLE ] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $ 4
pop hl
jr nz , .asm_3fae1
push hl
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYMONPP ; wcffe
2014-05-22 22:13:20 +00:00
.asm_3facf
push hl
ld a , [ hli ]
or [ hl ]
inc hl
or [ hl ]
inc hl
or [ hl ]
and $ 3 f
pop hl
jr z , .asm_3fb05
add hl , bc
ld a , [ hl ]
pop hl
and a
jr z , .asm_3faa8
.asm_3fae1
2014-05-24 18:40:38 +00:00
call BattleRandom
2014-05-22 22:13:20 +00:00
and $ 7
inc a
inc c
swap c
add c
ld [ de ], a
call Func_3fb89
2014-05-26 21:04:56 +00:00
ld hl , wccee
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
jr nz , .asm_3faf8
inc hl
.asm_3faf8
2014-05-26 21:04:56 +00:00
ld a , [ wd11e ]
2014-05-22 22:13:20 +00:00
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)
2014-05-26 21:04:56 +00:00
ld a , [ wccf4 ]
2014-05-22 22:13:20 +00:00
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 , Di dntAffectText
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
2014-05-26 21:04:56 +00:00
ld hl , W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a , [ $ fff3 ] ;whose turn?
and a
jr z , .next1
2014-05-26 21:04:56 +00:00
ld hl , W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
.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
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMOVENUM ] ; wcfd2
2014-05-22 22:13:20 +00:00
jr z , .asm_3fb94
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
.asm_3fb94
and a
ret z
Func_3fb96: ; 3fb96 (f:7b96)
2014-05-26 21:04:56 +00:00
ld [ W_ANIMATIONID ], a ; W_ANIMATIONID
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
ld a , $ 6
jr z , .asm_3fba2
ld a , $ 3
.asm_3fba2
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
jp Func_3fbbc
Func_3fba8: ; 3fba8 (f:7ba8)
xor a
2014-05-26 21:04:56 +00:00
ld [ wcc5b ], a
2014-05-22 22:13:20 +00:00
ld a , [ H_WHOSETURN ] ; $fff3
and a
2014-05-26 21:04:56 +00:00
ld a , [ W_PLAYERMOVENUM ] ; wcfd2
2014-05-22 22:13:20 +00:00
jr z , .asm_3fbb7
2014-05-26 21:04:56 +00:00
ld a , [ W_ENEMYMOVENUM ] ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
.asm_3fbb7
and a
ret z
Func_3fbb9: ; 3fbb9 (f:7bb9)
2014-05-26 21:04:56 +00:00
ld [ W_ANIMATIONID ], a ; W_ANIMATIONID
2014-05-22 22:13:20 +00:00
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