pokered/engine/battle/core.asm

8555 lines
158 KiB
NASM
Raw Normal View History

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 SPLASH_EFFECT
db -1
EffectsArray2: ; 3c011 (f:4011)
; moves that do damage but not through normal calculations
; e.g., Super Fang, Psywave
db SUPER_FANG_EFFECT
db SPECIAL_DAMAGE_EFFECT
db -1
EffectsArray3: ; 3c014 (f:4014)
; non-damaging, stataffecting or statuscausing moves?
; e.g., Meditate, Bide, Hypnosis
db $01
db ATTACK_UP1_EFFECT
db DEFENSE_UP1_EFFECT
db SPEED_UP1_EFFECT
db SPECIAL_UP1_EFFECT
db ACCURACY_UP1_EFFECT
db EVASION_UP1_EFFECT
db ATTACK_DOWN1_EFFECT
db DEFENSE_DOWN1_EFFECT
db SPEED_DOWN1_EFFECT
db SPECIAL_DOWN1_EFFECT
db ACCURACY_DOWN1_EFFECT
db EVASION_DOWN1_EFFECT
db BIDE_EFFECT
db SLEEP_EFFECT
db ATTACK_UP2_EFFECT
db DEFENSE_UP2_EFFECT
db SPEED_UP2_EFFECT
db SPECIAL_UP2_EFFECT
db ACCURACY_UP2_EFFECT
db EVASION_UP2_EFFECT
db ATTACK_DOWN2_EFFECT
db DEFENSE_DOWN2_EFFECT
db SPEED_DOWN2_EFFECT
db SPECIAL_DOWN2_EFFECT
db ACCURACY_DOWN2_EFFECT
db EVASION_DOWN2_EFFECT
db -1
EffectsArray4: ; 3c030 (f:4030)
; Attacks that aren't finished after they faint the opponent.
db DRAIN_HP_EFFECT
db EXPLODE_EFFECT
db DREAM_EATER_EFFECT
db PAY_DAY_EFFECT
db TWO_TO_FIVE_ATTACKS_EFFECT
db $1E
db ATTACK_TWICE_EFFECT
db RECOIL_EFFECT
db TWINEEDLE_EFFECT
db RAGE_EFFECT
db -1
EffectsArray5: ; 3c03b (f:403b)
db DRAIN_HP_EFFECT
db EXPLODE_EFFECT
db DREAM_EATER_EFFECT
db PAY_DAY_EFFECT
db SWIFT_EFFECT
db TWO_TO_FIVE_ATTACKS_EFFECT
db $1E
db CHARGE_EFFECT
db SUPER_FANG_EFFECT
db SPECIAL_DAMAGE_EFFECT
db FLY_EFFECT
db ATTACK_TWICE_EFFECT
db JUMP_KICK_EFFECT
db RECOIL_EFFECT
; fallthrough to Next EffectsArray
EffectsArray5B: ; 3c049 (f:4049)
; moves that prevent the player from switching moves?
db THRASH_PETAL_DANCE_EFFECT
db TRAPPING_EFFECT
db -1
Func_3c04c: ; 3c04c (f:404c)
call Func_3ec92
ld a, $1
ld [wd125], a
2014-05-22 22:13:20 +00:00
call DisplayTextBoxID
FuncCoord 1, 5
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $307
call ClearScreenArea
call DisableLCD
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, $7f
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
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
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
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
ld [wccf5], a
ld [wcd6a], a
2014-05-22 22:13:20 +00:00
inc a
ld [wd11d], a
ld hl, W_ENEMYMON1HP ; wd8a5
2014-05-22 22:13:20 +00:00
ld bc, $2b
ld d, $3
.asm_3c134
inc d
ld a, [hli]
or [hl]
jr nz, .asm_3c13c
add hl, bc
jr .asm_3c134
.asm_3c13c
ld a, d
ld [wcc3e], a
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
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
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
ld a, [wcd6a]
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3c161
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
ld a, [W_ENEMYMONSPEED + 1]
2014-05-22 22:13:20 +00:00
add a
ld b, a
jp c, asm_3c202
ld a, [wcce9]
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3c194
srl b
srl b
.asm_3c194
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
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
ld [wWhichPokemon], a ; wWhichPokemon
2014-05-22 22:13:20 +00:00
.asm_3c1b1
call Func_3ca97
jr nz, .asm_3c1bc
ld hl, wWhichPokemon ; wWhichPokemon
2014-05-22 22:13:20 +00:00
inc [hl]
jr .asm_3c1b1
.asm_3c1bc
ld a, [wWhichPokemon] ; wWhichPokemon
ld [wPlayerMonNumber], a ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
inc a
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]
ld [wcf91], a
ld [wcfd9], a
2014-05-22 22:13:20 +00:00
call LoadScreenTilesFromBuffer1
FuncCoord 1, 5
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld a, $9
call Func_3c8df
call SaveScreenTilesToBuffer1
ld a, [wWhichPokemon] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld c, a
ld b, $1
push bc
ld hl, W_PLAYERMONSALIVEFLAGS
ld a, $10 ; FlagActionPredef
call Predef
ld hl, wccf5
2014-05-22 22:13:20 +00:00
pop bc
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
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
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
ld hl, W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a, [hli]
or [hl]
jp z, HandleEnemyMonFainted
call SaveScreenTilesToBuffer1
xor a
ld [wd11d], a
ld a, [W_PLAYERBATTSTATUS2]
2014-05-22 22:13:20 +00:00
and $60
jr nz, .asm_3c2a6 ; 0x3c252 $52
ld hl, W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 3, [hl]
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
ld a, [wd078]
2014-05-22 22:13:20 +00:00
and a
ret nz
ld a, [W_PLAYERMONSTATUS]
2014-05-22 22:13:20 +00:00
and $27
jr nz, .asm_3c2a6 ; 0x3c271 $33
ld a, [W_PLAYERBATTSTATUS1]
2014-05-22 22:13:20 +00:00
and $21
jr nz, .asm_3c2a6 ; 0x3c278 $2c
ld a, [W_ENEMYBATTSTATUS1]
2014-05-22 22:13:20 +00:00
bit 5, a
jr z, .asm_3c288 ; 0x3c27f $7
ld a, $ff
ld [wPlayerSelectedMove], a
2014-05-22 22:13:20 +00:00
jr .asm_3c2a6 ; 0x3c286 $1e
.asm_3c288
ld a, [wcd6a]
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3c2a6 ; 0x3c28c $18
ld [wMoveMenuType], a
2014-05-22 22:13:20 +00:00
inc a
ld [W_ANIMATIONID], a
2014-05-22 22:13:20 +00:00
xor a
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
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
ld a, [W_PLAYERBATTSTATUS1]
2014-05-22 22:13:20 +00:00
bit 5, a
jr z, .asm_3c2dd ; 0x3c2c9 $12
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
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $80
jr c, .playerMovesFirst
jr .enemyMovesFirst
.invertOutcome
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
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
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
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
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)
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
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
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
ld de, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .playersTurn2
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
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
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
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
ld hl, W_ENEMYMONMAXHP ; W_ENEMYMONMAXHP
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .playersTurn
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)
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
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
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)
ld a, [wd06a]
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3c51a
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 5, [hl]
.asm_3c51a
ld a, [wd06f]
2014-05-22 22:13:20 +00:00
and a
ret nz
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 5, [hl]
ret
HandleEnemyMonFainted: ; 3c525 (f:4525)
xor a
ld [wccf0], a
2014-05-22 22:13:20 +00:00
call FaintEnemyPokemon
call AnyPlayerPokemonAliveCheck
ld a, d
and a
jp z, HandlePlayerBlackOut
ld hl, W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
ld a, [hli]
or [hl]
call nz, Func_3cd60
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
ret z
call AnyEnemyPokemonAliveCheck
jp z, TrainerBattleVictory
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
ld [wcd6a], a
2014-05-22 22:13:20 +00:00
call Func_3c664
jp z, asm_3c202
xor a
ld [wcd6a], a
2014-05-22 22:13:20 +00:00
jp MainInBattleLoop
FaintEnemyPokemon ; 0x3c567
call ReadPlayerMonCurHPAndStatus
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr z, .wild
ld a, [W_ENEMYMONNUMBER] ; W_ENEMYMONNUMBER
2014-05-22 22:13:20 +00:00
ld hl, W_ENEMYMON1HP
ld bc, $2c ; mon struct len
call AddNTimes
xor a
ld [hli], a
ld [hl], a
.wild
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 2, [hl]
xor a
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
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
FuncCoord 12, 5
2014-05-22 22:13:20 +00:00
ld hl, Coord
FuncCoord 12, 6
2014-05-22 22:13:20 +00:00
ld de, Coord
call Func_3c893
ld hl, wTileMap
ld bc, $40b
call ClearScreenArea
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr z, .wild_win
xor a
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
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
ld hl, W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
ld a, [hli]
or [hl]
jr nz, .playermonnotfaint
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
ld [wcf0b], a
2014-05-22 22:13:20 +00:00
ld b, EXP__ALL
call IsItemInBag
push af
jr z, .no_exp_all
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
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
callab GainExperience
pop af
ret z
ld a, $1
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
ld [wd083], a
ld [wc02a], a
2014-05-22 22:13:20 +00:00
inc a
ld [wccf6], a
2014-05-22 22:13:20 +00:00
ret
AnyEnemyPokemonAliveCheck: ; 3c64f (f:464f)
ld a, [wEnemyPartyCount] ; wEnemyPartyCount
2014-05-22 22:13:20 +00:00
ld b, a
xor a
ld hl, W_ENEMYMON1HP ; wd8a5
2014-05-22 22:13:20 +00:00
ld de, $2c
.asm_3c65a
or [hl]
inc hl
or [hl]
dec hl
add hl, de
dec b
jr nz, .asm_3c65a
and a
ret
Func_3c664: ; 3c664 (f:4664)
ld hl, wcf1e
2014-05-22 22:13:20 +00:00
ld e, $30
call GetBattleHealthBarColor
callab DrawEnemyPokeballs
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jr nz, .asm_3c687
call Func_3d605
ld a, [wcc3e]
2014-05-22 22:13:20 +00:00
cp $f
ret z
call LoadScreenTilesFromBuffer1
.asm_3c687
call EnemySendOut
xor a
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
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
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
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
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
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
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
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
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a, [hli]
or [hl]
jr nz, .enemyMonNotFainted
call FaintEnemyPokemon
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
ld [wcd6a], a
2014-05-22 22:13:20 +00:00
call Func_3c664
jp z, asm_3c202
xor a
ld [wcd6a], a
2014-05-22 22:13:20 +00:00
jp MainInBattleLoop
Func_3c741: ; 3c741 (f:4741)
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
ld a, $10 ; FlagActionPredef
call Predef
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 2, [hl] ; reset "attacking multiple times" flag
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
ld [wd083], a
2014-05-22 22:13:20 +00:00
call WaitForSoundToFinish
.skipWaitForSound
ld hl, wcd05
2014-05-22 22:13:20 +00:00
ld [hli], a
ld [hl], a
ld [W_PLAYERMONSTATUS], a ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
call ReadPlayerMonCurHPAndStatus
FuncCoord 9, 7
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $50b
call ClearScreenArea
FuncCoord 1, 10
2014-05-22 22:13:20 +00:00
ld hl, Coord
FuncCoord 1, 11
2014-05-22 22:13:20 +00:00
ld de, Coord
call Func_3c893
ld a, $1
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
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
FuncCoord 13, 9
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $a0e
ld a, $14
ld [wd125], a
2014-05-22 22:13:20 +00:00
call DisplayTextBoxID
ld a, [wd12e]
2014-05-22 22:13:20 +00:00
cp $2
jr z, .asm_3c7c4
and a
ret
.asm_3c7c4
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3c7ad
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
ld [wd07d], a
2014-05-22 22:13:20 +00:00
call DisplayPartyMenu
.asm_3c7e0
jr nc, .asm_3c7e7
.asm_3c7e2
call GoBackToPartyMenu
jr .asm_3c7e0
.asm_3c7e7
call Func_3ca97
jr z, .asm_3c7e2
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jr nz, .asm_3c7fa
inc a
ld [wcd6a], a
2014-05-22 22:13:20 +00:00
call Func_3d605
.asm_3c7fa
xor a
ld [wcd6a], a
2014-05-23 22:34:35 +00:00
call ClearSprites
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
ld a, $10 ; FlagActionPredef
call Predef
2014-05-22 22:13:20 +00:00
pop bc
ld hl, wccf5
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
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)
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jr z, .notSony1Battle
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 ClearScreenArea
call ScrollTrainerPicAfterBattle
ld c, $28
call DelayFrames
ld hl, Sony1WinText
call PrintText
ld a, [W_CURMAP]
cp OAKS_LAB
ret z ; starter battle in oak's lab: don't black out
.notSony1Battle
ld b, $0
call GoPAL_SET
ld hl, PlayerBlackedOutText2
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jr nz, .noLinkBattle
ld hl, LinkBattleLostText
.noLinkBattle
call PrintText
ld a, [wd732]
2014-05-22 22:13:20 +00:00
res 5, a
ld [wd732], a
2014-05-22 22:13:20 +00:00
call ClearScreen
scf
ret
Sony1WinText: ; 3c884 (f:4884)
TX_FAR _Sony1WinText
db "@"
PlayerBlackedOutText2: ; 3c889 (f:4889)
TX_FAR _PlayerBlackedOutText2
db "@"
LinkBattleLostText: ; 3c88e (f:488e)
TX_FAR _LinkBattleLostText
db "@"
Func_3c893: ; 3c893 (f:4893)
ld a, [wd730]
2014-05-22 22:13:20 +00:00
push af
set 6, a
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
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
ld a,[wPlayerMonNumber]
2014-05-22 22:13:20 +00:00
ld c,a
ld b,1
push bc
ld a,$10
call Predef
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
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
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]
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
ld a,[W_ISLINKBATTLE]
2014-05-22 22:13:20 +00:00
cp 4
jr nz,.next
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
ld a,[W_ENEMYMONNUMBER]
2014-05-22 22:13:20 +00:00
cp b
jr z,.next2
ld hl,wEnemyMon1Species
2014-05-22 22:13:20 +00:00
ld a,b
ld [wWhichPokemon],a
push bc
ld bc,$2C
call AddNTimes
pop bc
inc hl
ld a,[hli]
ld c,a
ld a,[hl]
or c
jr z,.next2
.next3
ld a,[wWhichPokemon]
ld hl,wd8c5
2014-05-22 22:13:20 +00:00
ld bc,$2C
call AddNTimes
ld a,[hl]
ld [W_CURENEMYLVL],a
2014-05-22 22:13:20 +00:00
ld a,[wWhichPokemon]
inc a
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
ld [wcf91],a
2014-05-22 22:13:20 +00:00
call Func_3eb01
ld hl,W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a,[hli]
ld [wcce3],a
2014-05-22 22:13:20 +00:00
ld a,[hl]
ld [wcce4],a
2014-05-22 22:13:20 +00:00
ld a,1
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
ld a,[W_ISLINKBATTLE]
2014-05-22 22:13:20 +00:00
cp 4
jr z,.next4
ld a,[W_OPTIONS]
2014-05-22 22:13:20 +00:00
bit 6,a
jr nz,.next4
ld hl, TrainerAboutToUseText
call PrintText
FuncCoord 0, 7
2014-05-22 22:13:20 +00:00
ld hl,Coord
ld bc,$0801
ld a,$14
ld [wd125],a
2014-05-22 22:13:20 +00:00
call DisplayTextBoxID
ld a,[wCurrentMenuItem]
2014-05-22 22:13:20 +00:00
and a
jr nz,.next4
ld a,2
ld [wd07d],a
2014-05-22 22:13:20 +00:00
call DisplayPartyMenu
.next9
ld a,1
ld [wCurrentMenuItem],a
2014-05-22 22:13:20 +00:00
jr c,.next7
ld hl,wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld a,[wWhichPokemon]
cp [hl]
jr nz,.next6
ld hl,AlreadyOutText
call PrintText
.next8
call GoBackToPartyMenu
jr .next9
.next6
call Func_3ca97
jr z,.next8
xor a
ld [wCurrentMenuItem],a
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 ClearSprites
2014-05-22 22:13:20 +00:00
ld hl,wTileMap
ld bc,$040B
call ClearScreenArea
ld b,1
call GoPAL_SET
call GBPalNormal
ld hl,TrainerSentOutText
call PrintText
ld a,[W_ENEMYMONID]
ld [wcf91],a
ld [wd0b5],a
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
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
ld a,[wCurrentMenuItem]
2014-05-22 22:13:20 +00:00
and a
ret nz
xor a
ld [W_PLAYERMONSALIVEFLAGS],a
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)
ld a, [W_NUMINPARTY] ; W_NUMINPARTY
2014-05-22 22:13:20 +00:00
ld e, a
xor a
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)
ld a, [wWhichPokemon] ; wWhichPokemon
ld hl, W_PARTYMON1_HP ; wd16c
2014-05-22 22:13:20 +00:00
ld bc, $2c
call AddNTimes
ld a, [hli]
or [hl]
ret nz
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
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
cp $2
jp z, .asm_3cb5c
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jp z, .asm_3cb5c
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr nz, .asm_3cb4c
ld a, [wd120]
2014-05-22 22:13:20 +00:00
inc a
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 Divide
ld a, [$ff97]
and a
jr nz, .asm_3cb5c
ld a, [wd120]
2014-05-22 22:13:20 +00:00
ld c, a
.asm_3cb2b
dec c
jr z, .asm_3cb39
ld b, $1e
ld a, [$ff98]
add b
ld [$ff98], a
jr c, .asm_3cb5c
jr .asm_3cb2b
.asm_3cb39
call BattleRandom
2014-05-22 22:13:20 +00:00
ld b, a
ld a, [$ff98]
cp b
jr nc, .asm_3cb5c
ld a, $1
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
ld [wd11f], a
2014-05-22 22:13:20 +00:00
call SaveScreenTilesToBuffer1
and a
ret
.asm_3cb5c
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
ld [wcd6a], a
2014-05-22 22:13:20 +00:00
ld a, $f
ld [wPlayerMoveListIndex], a ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
call Func_3d605
call LoadScreenTilesFromBuffer1
ld a, [wcc3e]
2014-05-22 22:13:20 +00:00
cp $f
ld a, $2
jr z, .asm_3cb81
dec a
.asm_3cb81
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)
ld a, [wWhichPokemon] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld bc, $2c
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
ld de, W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
ld bc, $4
call CopyData
ld de, W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
ld bc, $b
call CopyData
ld a, [wcfd9]
ld [wd0b5], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
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
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
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)
ld a, [wWhichPokemon] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld bc, $2c
ld hl, wEnemyMons ; wEnemyMon1Species
2014-05-22 22:13:20 +00:00
call AddNTimes
ld de, wcfe5
2014-05-22 22:13:20 +00:00
ld bc, $c
call CopyData
ld bc, $f
add hl, bc
ld de, W_ENEMYMONATKDEFIV
2014-05-22 22:13:20 +00:00
ld bc, $2
call CopyData
ld de, W_ENEMYMONPP ; wcffe
2014-05-22 22:13:20 +00:00
ld bc, $4
call CopyData
ld de, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
2014-05-22 22:13:20 +00:00
ld bc, $b
call CopyData
ld a, [wcfe5]
ld [wd0b5], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
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
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
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
ld hl, wEnemyMonStatMods ; wcd2e
2014-05-22 22:13:20 +00:00
.asm_3cc86
ld [hli], a
dec b
jr nz, .asm_3cc86
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
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
ld hl, wcc2d
2014-05-22 22:13:20 +00:00
ld [hli], a
ld [hl], a
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
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
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
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
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))
ld a, [wcf91]
2014-05-22 22:13:20 +00:00
call PlayCry
call Func_3ee94
jp SaveScreenTilesToBuffer1
Func_3ccfa: ; 3ccfa (f:4cfa)
FuncCoord 1, 5
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $707
call ClearScreenArea
FuncCoord 3, 7
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $505
xor a
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
FuncCoord 4, 9
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $303
ld a, $1
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, $4c
FuncCoord 5, 11
2014-05-22 22:13:20 +00:00
ld [Coord], a
Func_3cd3a: ; 3cd3a (f:4d3a)
FuncCoord 1, 5
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $707
jp ClearScreenArea
; reads player's current mon's HP into W_PLAYERMONCURHP
ReadPlayerMonCurHPAndStatus: ; 3cd43 (f:4d43)
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld hl, W_PARTYMON1_HP ; wd16c
2014-05-22 22:13:20 +00:00
ld bc, W_PARTYMON2DATA - W_PARTYMON1DATA
call AddNTimes
ld d, h
ld e, l
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
FuncCoord 9, 7
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $50b
call ClearScreenArea
callab PlacePlayerHUDTiles
FuncCoord 18, 9
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld [hl], $73
ld de, W_PLAYERMONNAME
FuncCoord 10, 7
2014-05-22 22:13:20 +00:00
ld hl, Coord
call Func_3ce9c
call PlaceString
ld hl, W_PLAYERMONID
ld de, wcf98
2014-05-22 22:13:20 +00:00
ld bc, $c
call CopyData
ld hl, W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL
ld de, wcfb9
2014-05-22 22:13:20 +00:00
ld bc, $b
call CopyData
FuncCoord 14, 8
2014-05-22 22:13:20 +00:00
ld hl, Coord
push hl
inc hl
ld de, wcf9c
2014-05-22 22:13:20 +00:00
call PrintStatusConditionNotFainted
pop hl
jr nz, .asm_3cdae
call PrintLevel
.asm_3cdae
ld a, [wcf98]
ld [wcf91], a
FuncCoord 10, 9
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld a, $5f
call Predef ; indirect jump to Func_128ef (128ef (4:68ef))
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld hl, wcf1d
2014-05-22 22:13:20 +00:00
call GetBattleHealthBarColor
ld hl, W_PLAYERMONCURHP ; wd015
2014-05-22 22:13:20 +00:00
ld a, [hli]
or [hl]
jr z, .asm_3cdd9
ld a, [wccf6]
2014-05-22 22:13:20 +00:00
and a
ret nz
ld a, [wcf1d]
2014-05-22 22:13:20 +00:00
cp $2
jr z, .asm_3cde6
.asm_3cdd9
ld hl, wd083
2014-05-22 22:13:20 +00:00
bit 7, [hl]
ld [hl], $0
ret z
xor a
ld [wc02a], a
2014-05-22 22:13:20 +00:00
ret
.asm_3cde6
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, $40c
call ClearScreenArea
callab PlaceEnemyHUDTiles
ld de, W_ENEMYMONNAME
FuncCoord 1, 0
2014-05-22 22:13:20 +00:00
ld hl, Coord
call Func_3ce9c
call PlaceString
FuncCoord 4, 1
2014-05-22 22:13:20 +00:00
ld hl, Coord
push hl
inc hl
ld de, W_ENEMYMONSTATUS ; wcfe9
2014-05-22 22:13:20 +00:00
call PrintStatusConditionNotFainted
pop hl
jr nz, .asm_3ce23
ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL
ld [wcfb9], a
2014-05-22 22:13:20 +00:00
call PrintLevel
.asm_3ce23
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
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 Divide
ld a, [$ff98]
ld e, a
ld a, $6
ld d, a
ld c, a
Func_3ce7f: ; 3ce7f (f:4e7f)
xor a
ld [wListMenuID], a ; wListMenuID
FuncCoord 2, 2
2014-05-22 22:13:20 +00:00
ld hl, Coord
call DrawHPBar
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
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
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
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
ld [wd125], a
2014-05-22 22:13:20 +00:00
call DisplayTextBoxID
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
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
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
FuncCoord 9, 14
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld [hl], "▶"
ld c, $50
call DelayFrames
ld [hl], $7f
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)
ld a, [wcc2d]
ld [wCurrentMenuItem], a ; wCurrentMenuItem
ld [wLastMenuItem], a ; wLastMenuItem
2014-05-22 22:13:20 +00:00
sub $2
jr c, .leftcolumn
ld [wCurrentMenuItem], a ; wCurrentMenuItem
ld [wLastMenuItem], a ; wLastMenuItem
2014-05-22 22:13:20 +00:00
jr .rightcolumn
.leftcolumn
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
cp $2
ld a, " "
jr z, .safaribattle
FuncCoord 15, 14
2014-05-22 22:13:20 +00:00
ld [Coord], a
FuncCoord 15, 16
2014-05-22 22:13:20 +00:00
ld [Coord], a
ld b, $9
jr .notsafari
.safaribattle
FuncCoord 13, 14
2014-05-22 22:13:20 +00:00
ld [Coord], a
FuncCoord 13, 16
2014-05-22 22:13:20 +00:00
ld [Coord], a
FuncCoord 7, 14
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS
2014-05-22 22:13:20 +00:00
ld bc, $102
call PrintNumber
ld b, $1
.notsafari
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
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
cp $2
ld a, " "
jr z, .safarirightcolumn
FuncCoord 9, 14
2014-05-22 22:13:20 +00:00
ld [Coord], a
FuncCoord 9, 16
2014-05-22 22:13:20 +00:00
ld [Coord], a
ld b, $f
jr .notsafarirightcolumn
.safarirightcolumn
FuncCoord 1, 14
2014-05-22 22:13:20 +00:00
ld [Coord], a
FuncCoord 1, 16
2014-05-22 22:13:20 +00:00
ld [Coord], a
FuncCoord 7, 14
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS
2014-05-22 22:13:20 +00:00
ld bc, $102
call PrintNumber
ld b, $d
.notsafarirightcolumn
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
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
ld [wCurrentMenuItem], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
.selection
call PlaceUnfilledArrowMenuCursor
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
cp $2
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...
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
cp $2
jr z, .safari1
xor a
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
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
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?
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
cp $2
jr nz, asm_3d00e
ld a, SAFARI_BAIT
ld [wcf91], a
2014-05-22 22:13:20 +00:00
jr asm_3d05f
asm_3d00e: ; 3d00e (f:500e)
call LoadScreenTilesFromBuffer1
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3d01a
call Func_3cd5a
.asm_3d01a
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
ld [wcf8b], a
2014-05-22 22:13:20 +00:00
ld a, h
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
ld hl, wNumBagItems ; wNumBagItems
2014-05-22 22:13:20 +00:00
ld a, l
ld [wcf8b], a
2014-05-22 22:13:20 +00:00
ld a, h
ld [wcf8c], a
2014-05-22 22:13:20 +00:00
Func_3d03c
xor a
ld [wcf93], a
2014-05-22 22:13:20 +00:00
ld a, $3
ld [wListMenuID], a ; wListMenuID
ld a, [wcc2c]
ld [wCurrentMenuItem], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
call DisplayListMenuID
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
ld [wcc2c], a
2014-05-22 22:13:20 +00:00
ld a, $0
ld [wcc37], a
ld [wcc35], a
2014-05-22 22:13:20 +00:00
jp c, InitBattleMenu
asm_3d05f: ; 3d05f (f:505f)
ld a, [wcf91]
ld [wd11e], a
2014-05-22 22:13:20 +00:00
call GetItemName
call CopyStringToCF4B ; copy name
xor a
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 ClearSprites
2014-05-22 22:13:20 +00:00
xor a
ld [wCurrentMenuItem], a ; wCurrentMenuItem
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
cp $2
jr z, .asm_3d09c
ld a, [wcd6a]
2014-05-22 22:13:20 +00:00
and a
jp z, asm_3d00e
ld a, [W_PLAYERBATTSTATUS1] ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
bit 5, a
jr z, .asm_3d09c
ld hl, wd06a
2014-05-22 22:13:20 +00:00
dec [hl]
jr nz, .asm_3d09c
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
2014-05-22 22:13:20 +00:00
res 5, [hl]
.asm_3d09c
ld a, [wd11c]
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3d0b7
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
ld [wd11c], a
2014-05-22 22:13:20 +00:00
ld a, $2
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
ld a, [W_BATTLETYPE] ; wd05a
2014-05-22 22:13:20 +00:00
cp $2
jr nz, Func_3d0e0
ld a, SAFARI_ROCK
ld [wcf91], a
2014-05-22 22:13:20 +00:00
jp asm_3d05f
Func_3d0e0: ; 3d0e0 (f:50e0)
call LoadScreenTilesFromBuffer1
xor a
ld [wd07d], a
ld [wcc35], a
2014-05-22 22:13:20 +00:00
call DisplayPartyMenu
asm_3d0ed: ; 3d0ed (f:50ed)
jp nc, Func_3d119
asm_3d0f0: ; 3d0f0 (f:50f0)
2014-05-23 22:34:35 +00:00
call ClearSprites
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)
FuncCoord 11, 11
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $81
ld a, $7f
call FillMemory
xor a
ld [wd07d], a
2014-05-22 22:13:20 +00:00
call GoBackToPartyMenu
jr asm_3d0ed
Func_3d119: ; 3d119 (f:5119)
ld a, $c
ld [wd125], a
2014-05-22 22:13:20 +00:00
call DisplayTextBoxID
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
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
ld [wcc49], a
ld hl, W_PARTYMON1_NUM ; W_PARTYMON1_NUM (aliases: W_PARTYMON1DATA)
2014-05-23 22:34:35 +00:00
call ClearSprites
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))
ld a, [W_ENEMYBATTSTATUS2] ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
bit 4, a
ld hl, AnimationSubstitute
jr nz, .asm_3d182
ld a, [wccf3]
2014-05-22 22:13:20 +00:00
and a
ld hl, AnimationMinimizeMon
jr nz, .asm_3d182
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
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld d, a
ld a, [wWhichPokemon] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
cp d
jr nz, .asm_3d19d
ld hl, AlreadyOutText
call PrintText
jp Func_3d105
.asm_3d19d
call Func_3ca97
jp z, Func_3d105
ld a, $1
ld [wcd6a], a
2014-05-22 22:13:20 +00:00
call GBPalWhiteOut
2014-05-23 22:34:35 +00:00
call ClearSprites
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
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
ld a, $10 ; FlagActionPredef
call Predef
2014-05-22 22:13:20 +00:00
pop bc
ld hl, wccf5
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
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
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
ld [wd11f], a
2014-05-22 22:13:20 +00:00
ret c
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
ld de, wd0dc
2014-05-22 22:13:20 +00:00
ld bc, $4
call CopyData
callab Func_39b87
ret
.writemoves
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
FuncCoord 4, 12
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld b, $4
ld c, $e
di
call TextBoxBorder
FuncCoord 4, 12
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld [hl], $7a
FuncCoord 10, 12
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld [hl], $7e
ei
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
FuncCoord 0, 7
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld b, $4
ld c, $e
call TextBoxBorder
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
ld a, [wWhichPokemon] ; wWhichPokemon
ld hl, W_PARTYMON1_MOVE1 ; W_PARTYMON1_MOVE1
2014-05-22 22:13:20 +00:00
ld bc, $2c
call AddNTimes
call .loadmoves
FuncCoord 4, 7
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld b, $4
ld c, $e
call TextBoxBorder
FuncCoord 6, 8
2014-05-22 22:13:20 +00:00
ld hl, Coord
call .writemoves
ld b, $5
ld a, $7
.menuset
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
ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
inc a
.selectedmoveknown
ld [hli], a ; wCurrentMenuItem
inc hl ; wTileBehindCursor untouched
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
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
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
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
ld a, [wcc35]
2014-05-22 22:13:20 +00:00
and a
jr z, .select
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
ld [wcc35], a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
dec a
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
ld [wPlayerMoveListIndex], a ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
jr nz, .moveselected
pop af
ret
.moveselected
pop af
ret nz
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 $3f
jr z, .nopp
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
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
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]
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)
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
and a
jp nz, Func_3d2fe
call EraseMenuCursor
ld a, [wcd6c]
2014-05-22 22:13:20 +00:00
inc a
ld [wCurrentMenuItem], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
jp Func_3d2fe
Func_3d3dd: ; 3d3dd (f:53dd)
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld b, a
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
ld [wCurrentMenuItem], a ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
jp Func_3d2fe
Func_3d3f5: ; 3d3f5 (f:53f5)
ld a, $a5
ld [wPlayerSelectedMove], a ; wPlayerSelectedMove
ld a, [W_PLAYERDISABLEDMOVE] ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
and a
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 $3f
ret nz
jr .asm_3d423
.asm_3d40e
swap a
and $f
ld b, a
ld d, $5
xor a
.asm_3d416
dec d
jr z, .asm_3d421
ld c, [hl]
inc hl
dec b
jr z, .asm_3d416
or c
jr .asm_3d416
.asm_3d421
and a
ret nz
.asm_3d423
ld hl, NoMovesLeftText
call PrintText
ld c, $3c
call DelayFrames
xor a
ret
NoMovesLeftText: ; 3d430 (f:5430)
TX_FAR _NoMovesLeftText
db "@"
Func_3d435: ; 3d435 (f:5435)
ld a, [wcc35]
2014-05-22 22:13:20 +00:00
and a
jr z, asm_3d4ad
ld hl, W_PLAYERMONMOVES
call Func_3d493
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
call Func_3d493
ld hl, W_PLAYERDISABLEDMOVE ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
ld a, [hl]
swap a
and $f
ld b, a
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
ld a, [wcc35]
2014-05-22 22:13:20 +00:00
swap a
add b
ld [hl], a
jr .asm_3d474
.asm_3d463
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
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
swap a
add b
ld [hl], a
.asm_3d474
ld hl, W_PARTYMON1_MOVE1 ; W_PARTYMON1_MOVE1
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld bc, $2c
call AddNTimes
push hl
call Func_3d493
pop hl
ld bc, $15
add hl, bc
call Func_3d493
xor a
ld [wcc35], a
2014-05-22 22:13:20 +00:00
jp MoveSelectionMenu
Func_3d493: ; 3d493 (f:5493)
push hl
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
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)
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
FuncCoord 0, 8
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld b, $3
ld c, $9
call TextBoxBorder
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
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
cp b
jr nz, .asm_3d4df
FuncCoord 1, 10
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld de, DisabledText
call PlaceString
jr .asm_3d54e
.asm_3d4df
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
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c, a
ld b, $0
add hl, bc
ld a, [hl]
ld [wPlayerSelectedMove], a ; wPlayerSelectedMove
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
ld [wWhichPokemon], a ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld a, $4
ld [wcc49], a
2014-05-22 22:13:20 +00:00
callab GetMaxPP
ld hl, wCurrentMenuItem ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c, [hl]
inc [hl]
ld b, $0
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
add hl, bc
ld a, [hl]
and $3f
ld [wcd6d], a
FuncCoord 1, 9
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld de, TypeText
call PlaceString
FuncCoord 7, 11
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld [hl], "/"
FuncCoord 5, 9
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld [hl], "/"
FuncCoord 5, 11
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld de, wcd6d
2014-05-22 22:13:20 +00:00
ld bc, $102
call PrintNumber
FuncCoord 8, 11
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld de, wd11e
2014-05-22 22:13:20 +00:00
ld bc, $102
call PrintNumber
call GetCurrentMove
FuncCoord 2, 10
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld a, $5d
call Predef ; indirect jump to Func_27d98 (27d98 (9:7d98))
.asm_3d54e
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
jp Delay3
DisabledText: ; 3d555 (f:5555)
db "disabled!@"
TypeText: ; 3d55f (f:555f)
db "TYPE@"
SelectEnemyMove: ; 3d564 (f:5564)
ld a, [W_ISLINKBATTLE]
sub $4
jr nz, .noLinkBattle
call SaveScreenTilesToBuffer1
call Func_3d605
call LoadScreenTilesFromBuffer1
ld a, [wcc3e]
2014-05-22 22:13:20 +00:00
cp $e
jp z, .asm_3d601
cp $d
jr z, .unableToMove
cp $4
ret nc
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
call BattleRandom
2014-05-22 22:13:20 +00:00
ld b, $1
cp $3f ; select move 1 in [0,3e] (63/256 chance)
jr c, .moveChosen
inc hl
inc b
cp $7f ; select move 1 in [3f,7e] (64/256 chance)
jr c, .moveChosen
inc hl
inc b
cp $be ; select move 1 in [7f,bd] (63/256 chance)
jr c, .moveChosen
inc hl
inc b ; select move 4 in [be,ff] (66/256 chance)
.moveChosen
ld a, b
dec a
ld [wEnemyMoveListIndex], a
ld a, [W_ENEMYDISABLEDMOVE]
swap a
and $f
cp b
ld a, [hl]
pop hl
jr z, .chooseRandomMove ; move disabled, try again
and a
jr z, .chooseRandomMove ; move non-existant, try again
.done
ld [wEnemySelectedMove], a
ret
.asm_3d601
ld a, $a5
jr .done
Func_3d605: ; 3d605 (f:5605)
ld a, $ff
ld [wcc3e], a
ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
cp $f
jr z, .asm_3d630
ld a, [wcd6a]
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3d629
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
ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex
2014-05-22 22:13:20 +00:00
jr .asm_3d630
.asm_3d629
ld a, [wWhichPokemon] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
add $4
ld b, a
.asm_3d62f
ld a, b
.asm_3d630
ld [wcc42], a
2014-05-22 22:13:20 +00:00
callab PrintWaitingText
.asm_3d63b
call Func_22c3
call DelayFrame
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
ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
inc a
jp z, Func_3d80a
xor a
ld [W_MOVEMISSED], a ; W_MOVEMISSED
ld [wcced], a
ld [wccf4], a
2014-05-22 22:13:20 +00:00
ld a, $a
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
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)
ld a, [W_PLAYERMOVEEFFECT] ; wcfd3
2014-05-22 22:13:20 +00:00
cp CHARGE_EFFECT
jp z, Func_3f132
cp FLY_EFFECT
jp z, Func_3f132
jr asm_3d6b0
; in-battle stuff
asm_3d6a9: ; 3d6a9 (f:56a9)
ld hl,W_PLAYERBATTSTATUS1
res 4,[hl]
res 6,[hl]
asm_3d6b0: ; 3d6b0 (f:56b0)
call PrintMonName1Text
ld hl,DecrementPP
ld de,wPlayerSelectedMove ; pointer to the move just used
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
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,$1E
call DelayFrames
ld a,[W_PLAYERMOVEEFFECT]
cp a,FLY_EFFECT
jr z,.next5
cp a,CHARGE_EFFECT
jr z,.next5
jr asm_3d766
.next5
xor a
ld [wcc5b],a
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
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 DisplayEffectiveness
ld a,1
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
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
ld a,[wd06a]
2014-05-22 22:13:20 +00:00
dec a
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
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] ; players turn
and a,SLP | (1 << FRZ)
ret nz
ld hl,ScaredText
call PrintText
xor a
ret
.Ghost ; ghosts turn
ld hl,GetOutText
call PrintText
xor a
ret
ScaredText: ; 3d830 (f:5830)
TX_FAR _ScaredText
db "@"
GetOutText: ; 3d835 (f:5835)
TX_FAR _GetOutText
db "@"
IsGhostBattle: ; 3d83a (f:583a)
ld a,[W_ISINBATTLE]
dec a
ret nz
ld a,[W_CURMAP]
cp a,POKEMONTOWER_1
jr c,.next
cp a,LAVENDER_HOUSE_1
jr nc,.next
ld b,SILPH_SCOPE
call IsItemInBag ; $3493
ret z
.next
ld a,1
and a
ret
Func_3d854: ; 3d854 (f:5854)
ld hl,W_PLAYERMONSTATUS
ld a,[hl]
and a,SLP
jr z,.FrozenCheck ; to 5884
dec a
ld [W_PLAYERMONSTATUS],a ; decrement sleep count
and a
jr z,.WakeUp ; to 5874
xor a
ld [wcc5b],a
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
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
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
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
ld [wccee],a
2014-05-22 22:13:20 +00:00
ld hl,DisabledNoMoreText
call PrintText
.next2
ld a,[W_PLAYERBATTSTATUS1]
add a
jr nc,.next3 ; 5929
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
ld [wcc5b],a
2014-05-22 22:13:20 +00:00
ld a,CONF_ANIM - 1
call PlayMoveAnimation
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
ld a,[wccee]
2014-05-22 22:13:20 +00:00
and a
jr z,.ParalysisCheck ; 593E
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
call BattleRandom
2014-05-22 22:13:20 +00:00
cp a,$3F
jr nc,.next7
ld hl,FullyParalyzedText
call PrintText
.next5
ld hl,W_PLAYERBATTSTATUS1
ld a,[hl]
and a,$CC
ld [hl],a
ld a,[W_PLAYERMOVEEFFECT]
cp a,FLY_EFFECT
jr z,.next8 ; 5966
cp a,CHARGE_EFFECT
jr z,.next8
jr .next9 ; 596F
.next8
xor a
ld [wcc5b],a
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
ld hl,W_DAMAGE
2014-05-22 22:13:20 +00:00
ld a,[hli]
ld b,a
ld c,[hl]
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
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
ld [W_PLAYERMOVEPOWER],a
ld hl,wd075
2014-05-22 22:13:20 +00:00
ld a,[hld]
add a
ld b,a
ld [wd0d8],a
2014-05-22 22:13:20 +00:00
ld a,[hl]
rl a
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
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]
call BattleRandom
2014-05-22 22:13:20 +00:00
and a,3
inc a
inc a
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
ld a,[wd06a]
2014-05-22 22:13:20 +00:00
dec a
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)
ld a, [W_PLAYERBATTSTATUS2] ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
bit 6, a
jp z, Func_3da39
ld a, RAGE
ld [wd11e], a
2014-05-22 22:13:20 +00:00
call GetMoveName
call CopyStringToCF4B
xor a
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)
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
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]
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
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
ld a, [W_PLAYERMONDEF + 1]
2014-05-22 22:13:20 +00:00
ld [hl], a
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
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
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
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
ld a, [W_PLAYERMOVENUM] ; wcfd2
ld hl, wccf1
2014-05-22 22:13:20 +00:00
jr z, .asm_3db11
ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM
ld hl, wccf2
2014-05-22 22:13:20 +00:00
.asm_3db11
ld [hl], a
ld [wd11e], a
2014-05-22 22:13:20 +00:00
call Func_3db85
ld a, [wcced]
2014-05-22 22:13:20 +00:00
and a
ld hl, Used2Text
ret nz
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)
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
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
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
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, SING, PECK, COUNTER
db STRENGTH, ABSORB, STRING_SHOT, EARTHQUAKE, FISSURE, DIG, TOXIC, SCREECH, HARDEN
db MINIMIZE, WITHDRAW, DEFENSE_CURL, METRONOME, LICK, CLAMP, CONSTRICT, POISON_GAS
db LEECH_LIFE, BUBBLE, FLASH, SPLASH, ACID_ARMOR, FURY_SWIPES, REST, SHARPEN, SLASH, SUBSTITUTE
db $00
db $FF ; terminator
PrintMoveFailureText: ; 3dbe2 (f:5be2)
ld de, W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3dbed
ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3dbed
ld hl, DoesntAffectMonText ; $5c57
ld a, [wd05b]
2014-05-22 22:13:20 +00:00
and $7f
jr z, .asm_3dc04
ld hl, AttackMissedText ; $5c42
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
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
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)
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
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
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
ld hl, W_PARTYMON1_OTID ; W_PARTYMON1_OTID
2014-05-22 22:13:20 +00:00
ld bc, $2c
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
call AddNTimes
ld a, [wPlayerID] ; wPlayerID
2014-05-22 22:13:20 +00:00
cp [hl]
jr nz, .asm_3dcb1
inc hl
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
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
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
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
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
call BattleRandom
2014-05-22 22:13:20 +00:00
add a
swap a
and $7
jr z, .asm_3dd0e
ld [W_PLAYERMONSTATUS], a ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
ld hl, BeganToNapText
jr .asm_3dd3a
.asm_3dd20
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
ld a, [W_PLAYERMONMOVES + 1]
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3dd20
ld a, [wccee]
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3dd20
ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
cp $a5
jr z, .asm_3dd20
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
push hl
ld a, [hli]
and $3f
ld b, a
ld a, [hli]
and $3f
add b
ld b, a
ld a, [hli]
and $3f
add b
ld b, a
ld a, [hl]
and $3f
add b
pop hl
push af
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c, a
ld b, $0
add hl, bc
ld a, [hl]
and $3f
ld b, a
pop af
cp b
jr z, .asm_3dd20
ld a, $1
ld [wcced], a
ld a, [wMaxMenuItem] ; wMaxMenuItem
2014-05-22 22:13:20 +00:00
ld b, a
ld a, [wCurrentMenuItem] ; wCurrentMenuItem
2014-05-22 22:13:20 +00:00
ld c, a
.asm_3dd86
call BattleRandom
2014-05-22 22:13:20 +00:00
and $3
cp b
jr nc, .asm_3dd86
cp c
jr z, .asm_3dd86
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
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]
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
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
ld hl, W_PARTYMON1_ATACK
2014-05-22 22:13:20 +00:00
ld a, [wPlayerMonNumber]
ld bc, $002c
call AddNTimes
pop bc
jr .next3
.specialAttack
ld hl, W_ENEMYMONSPECIAL ;opponent special
ld a, [hli] ;*BC = opponent special defense used later
ld b, a
ld c, [hl]
ld a, [W_ENEMYBATTSTATUS3] ;test for lightscreen
bit 1, a
jr z, .next2
.doubleSpecialDefense
sla c ;x2 special defense if bit1 of D069 set
rl b
.next2
ld hl, W_PLAYERMONSPECIAL
ld a, [wd05e] ;XXX
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
ld hl, W_PARTYMON1_SPECIAL
2014-05-22 22:13:20 +00:00
ld a, [wPlayerMonNumber]
ld bc, $002c
call AddNTimes
pop bc
.next3
ld a, [hli] ;HL: when this was taken
ld l, [hl]
ld h, a ;*HL = attacker attack
or b ;is either attack or defense high byte nonzero?
jr z, .next4
srl b ;[defense] BC /= 4 [this is just so it fits into a single byte, 10bits max]
rr c
srl b
rr c
srl h ;[attack] HL /= 4 [to apply equal scaling]
rr l
srl h
rr l
ld a, l
or h
jr nz, .next4 ;is HL result zero?
inc l ;minimum HL = 1
.next4
ld b, l ;*B = attack [possibly scaled] [C contains defense]
ld a, [W_PLAYERMONLEVEL] ;*E = level
2014-05-22 22:13:20 +00:00
ld e, a
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)
ld hl, W_DAMAGE ; W_DAMAGE
2014-05-22 22:13:20 +00:00
xor a
ld [hli], a
ld [hl], a
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]
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
ld a, [wd05e]
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3deef
ld hl, W_PARTYMON1_DEFENSE ; wd191
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld bc, $2c
call AddNTimes
ld a, [hli]
ld b, a
ld c, [hl]
push bc
ld c, $2
call Func_3df1c
ld hl, $ff97
pop bc
jr .asm_3deef
.asm_3debc
ld hl, W_PLAYERMONSPECIAL
ld a, [hli]
ld b, a
ld c, [hl]
ld a, [W_PLAYERBATTSTATUS3] ; W_PLAYERBATTSTATUS3
2014-05-22 22:13:20 +00:00
bit 1, a
jr z, .asm_3decd
sla c
rl b
.asm_3decd
ld hl, W_ENEMYMONSPECIAL ; wcffc
ld a, [wd05e]
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3deef
ld hl, W_PARTYMON1_SPECIAL ; W_PARTYMON1_SPECIAL
ld a, [wPlayerMonNumber] ; wPlayerMonNumber
2014-05-22 22:13:20 +00:00
ld bc, $2c
call AddNTimes
ld a, [hli]
ld b, a
ld c, [hl]
push bc
ld c, $5
call Func_3df1c
ld hl, $ff97
pop bc
.asm_3deef
ld a, [hli]
ld l, [hl]
ld h, a
or b
jr z, .asm_3df0a
srl b
rr c
srl b
rr c
srl h
rr l
srl h
rr l
ld a, l
or h
jr nz, .asm_3df0a
inc l
.asm_3df0a
ld b, l
ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL
2014-05-22 22:13:20 +00:00
ld e, a
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
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jr nz, .asm_3df40
ld hl, wd8c6
2014-05-22 22:13:20 +00:00
dec c
sla c
ld b, $0
add hl, bc
ld a, [W_ENEMYMONNUMBER] ; W_ENEMYMONNUMBER
2014-05-22 22:13:20 +00:00
ld bc, $2c
call AddNTimes
ld a, [hli]
ld [$ff97], a
ld a, [hl]
ld [$ff98], a
pop bc
pop de
ret
.asm_3df40
ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL
ld [W_CURENEMYLVL], a ; W_CURENEMYLVL
ld a, [wcfe5]
ld [wd0b5], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
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
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
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, $1e
jr z, .skipbp
; Calculate OHKO damage based on remaining HP.
cp a, OHKO_EFFECT
jp z, Func_3e016
; Don't calculate damage for moves that don't do any.
ld a, d ; base power
and a
ret z
.skipbp
xor a
ld hl, H_DIVIDEND
ldi [hl], a
ldi [hl], a
ld [hl], a
; Multiply level by 2
ld a, e ; level
add a
jr nc, .nc
push af
ld a, 1
ld [hl], a
pop af
.nc
inc hl
ldi [hl], a
; Divide by 5
ld a, 5
ldd [hl], a
push bc
ld b, 4
call Divide
pop bc
; Add 2
inc [hl]
inc [hl]
inc hl ; multiplier
; Multiply by attack base power
ld [hl], d
call Multiply
; Multiply by attack stat
ld [hl], b
call Multiply
; Divide by defender's defense stat
ld [hl], c
ld b, 4
call Divide
; Divide by 50
ld [hl], 50
ld b, 4
call Divide
ld hl, W_DAMAGE
ld b, [hl]
ld a, [H_QUOTIENT + 3]
add b
ld [H_QUOTIENT + 3], a
jr nc, .asm_3dfd0
ld a, [H_QUOTIENT + 2]
inc a
ld [H_QUOTIENT + 2], a
and a
jr z, .asm_3e004
.asm_3dfd0
ld a, [H_QUOTIENT]
ld b, a
ld a, [H_QUOTIENT + 1]
or a
jr nz, .asm_3e004
ld a, [H_QUOTIENT + 2]
cp 998 / $100
jr c, .asm_3dfe8
cp 998 / $100 + 1
jr nc, .asm_3e004
ld a, [H_QUOTIENT + 3]
cp 998 % $100
jr nc, .asm_3e004
.asm_3dfe8
inc hl
ld a, [H_QUOTIENT + 3]
ld b, [hl]
add b
ld [hld], a
ld a, [H_QUOTIENT + 2]
ld b, [hl]
adc b
ld [hl], a
jr c, .asm_3e004
ld a, [hl]
cp 998 / $100
jr c, .asm_3e00a
cp 998 / $100 + 1
jr nc, .asm_3e004
inc hl
ld a, [hld]
cp 998 % $100
jr c, .asm_3e00a
.asm_3e004
ld a, 997 / $100
ld [hli], a
ld a, 997 % $100
ld [hld], a
.asm_3e00a
inc hl
ld a, [hl]
add 2
ld [hld], a
jr nc, .done
inc [hl]
.done
ld a, 1
and a
ret
Func_3e016: ; 3e016 (f:6016)
call Func_3f132
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
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
ld [wd05e], a
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
ld a, [wcfe5]
2014-05-22 22:13:20 +00:00
jr nz, .asm_3e032
ld a, [W_PLAYERMONID]
.asm_3e032
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
ld hl, W_PLAYERMOVEPOWER ; W_PLAYERMOVEPOWER
ld de, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
jr z, .calcCriticalHitProbability
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
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
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,SPECIAL_DAMAGE_EFFECT
jr z,.specialDamage
ld a,[W_PLAYERMOVEPOWER]
and a
jp z,ApplyAttackToEnemyPokemonDone
jr ApplyDamageToEnemyPokemon
.superFangEffect
; set the damage to half the target's HP
ld hl,W_ENEMYMONCURHP
ld de,W_DAMAGE
ld a,[hli]
srl a
ld [de],a
inc de
ld b,a
ld a,[hl]
rr a
ld [de],a
or b
jr nz,ApplyDamageToEnemyPokemon
; make sure Super Fang's damage is always at least 1
ld a,$01
ld [de],a
jr ApplyDamageToEnemyPokemon
.specialDamage
ld hl,W_PLAYERMONLEVEL
ld a,[hl]
ld b,a
ld a,[W_PLAYERMOVENUM]
cp a,SEISMIC_TOSS
jr z,.storeDamage
cp a,NIGHT_SHADE
jr z,.storeDamage
ld b,SONICBOOM_DAMAGE
cp a,SONICBOOM
jr z,.storeDamage
ld b,DRAGON_RAGE_DAMAGE
cp a,DRAGON_RAGE
jr z,.storeDamage
; Psywave
ld a,[hl]
ld b,a
srl a
add b
ld b,a ; b = level * 1.5
; loop until a random number in the range [1, b) is found
.loop
call BattleRandom
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
FuncCoord 2, 2
2014-05-22 22:13:20 +00:00
ld hl,Coord
xor a
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,SPECIAL_DAMAGE_EFFECT
jr z,.specialDamage
ld a,[W_ENEMYMOVEPOWER]
and a
jp z,ApplyAttackToPlayerPokemonDone
jr ApplyDamageToPlayerPokemon
.superFangEffect
; set the damage to half the target's HP
ld hl,W_PLAYERMONCURHP
ld de,W_DAMAGE
ld a,[hli]
srl a
ld [de],a
inc de
ld b,a
ld a,[hl]
rr a
ld [de],a
or b
jr nz,ApplyDamageToPlayerPokemon
; make sure Super Fang's damage is always at least 1
ld a,$01
ld [de],a
jr ApplyDamageToPlayerPokemon
.specialDamage
ld hl,W_ENEMYMONLEVEL
ld a,[hl]
ld b,a
ld a,[W_ENEMYMOVENUM]
cp a,SEISMIC_TOSS
jr z,.storeDamage
cp a,NIGHT_SHADE
jr z,.storeDamage
ld b,SONICBOOM_DAMAGE
cp a,SONICBOOM
jr z,.storeDamage
ld b,DRAGON_RAGE_DAMAGE
cp a,DRAGON_RAGE
jr z,.storeDamage
; Psywave
ld a,[hl]
ld b,a
srl a
add b
ld b,a ; b = attacker's level * 1.5
; loop until a random number in the range [0, b) is found
; this differs from the range when the player attacks, which is [1, b)
; it's possible for the enemy to do 0 damage with Psywave, but the player always does at least 1 damage
.loop
call BattleRandom
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
FuncCoord 10, 9
2014-05-22 22:13:20 +00:00
ld hl,Coord
ld a,$01
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,$0d ; maximum stat modifier value
ret z ; return if attack modifier is already maxed
ld a,[H_WHOSETURN]
xor a,$01 ; flip turn for the stat modifier raising function
ld [H_WHOSETURN],a
; change the target pokemon's move to $00 and the effect to the one
; that causes the attack modifier to go up one stage
ld h,b
ld l,c
ld [hl],$00 ; null move number
inc hl
ld [hl],ATTACK_UP1_EFFECT
push hl
ld hl,BuildingRageText
call PrintText
call StatModifierUpEffect ; stat modifier raising function
pop hl
xor a
ldd [hl],a ; null move effect
ld a,RAGE
ld [hl],a ; restore the target pokemon's move number to Rage
ld a,[H_WHOSETURN]
xor a,$01 ; flip turn back to the way it was
ld [H_WHOSETURN],a
ret
BuildingRageText: ; 3e2f8 (f:62f8)
TX_FAR _BuildingRageText
db "@"
; copy last move for Mirror Move
; sets zero flag on failure and unsets zero flag on success
MirrorMoveCopyMove: ; 3e2fd (f:62fd)
ld a,[H_WHOSETURN]
and a
; values for player turn
ld a,[wccf2]
2014-05-22 22:13:20 +00:00
ld hl,wPlayerSelectedMove
ld de,W_PLAYERMOVENUM
jr z,.next
; values for enemy turn
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)
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
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
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
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,$002c
call AddNTimes
inc [hl] ; increment PP in the party memory location
ret
; function to adjust the base damage of an attack to account for type effectiveness
AdjustDamageForMoveType: ; 3e3a5 (f:63a5)
; values for player turn
ld hl,W_PLAYERMONTYPES
ld a,[hli]
ld b,a ; b = type 1 of attacker
ld c,[hl] ; c = type 2 of attacker
ld hl,W_ENEMYMONTYPES
ld a,[hli]
ld d,a ; d = type 1 of defender
ld e,[hl] ; e = type 2 of defender
ld a,[W_PLAYERMOVETYPE]
ld [wd11e],a
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]
ld [wd11e],a
2014-05-22 22:13:20 +00:00
.next
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
ld hl,wd05b
2014-05-22 22:13:20 +00:00
set 7,[hl]
.skipSameTypeAttackBonus
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
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
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 Divide
ld a,[H_QUOTIENT + 2]
ld [hli],a
ld b,a
ld a,[H_QUOTIENT + 3]
ld [hl],a
or b ; is damage 0?
jr nz,.skipTypeImmunity
.typeImmunity
; if damage is 0, make the move miss
inc a
ld [W_MOVEMISSED],a
.skipTypeImmunity
pop bc
pop hl
.nextTypePair
inc hl
inc hl
jp .loop
.done
ret
; function to tell how effective the type of an enemy attack is on the player's current pokemon
; this doesn't take into account the effects that dual types can have
; (e.g. 4x weakness / resistance, weaknesses and resistances canceling)
; the result is stored in [wd11e]
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
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]
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 CheckTargetSubstitute ; substitute check (note that this overwrites a)
jr z,.checkForDigOrFlyStatus
; this code is buggy. it's supposed to prevent HP draining moves from working on substitutes.
; since $7b79 overwrites a with either $00 or $01, it never works.
cp a,DRAIN_HP_EFFECT ; $03
jp z,.moveMissed
cp a,DREAM_EATER_EFFECT ; $08
jp z,.moveMissed
.checkForDigOrFlyStatus
bit 6,[hl]
jp nz,.moveMissed
ld a,[H_WHOSETURN]
and a
jr nz,.enemyTurn
.playerTurn
; this checks if the move effect is disallowed by mist
ld a,[W_PLAYERMOVEEFFECT]
cp a,ATTACK_DOWN1_EFFECT
jr c,.skipEnemyMistCheck
cp a,BIDE_EFFECT
jr c,.enemyMistCheck
cp a,$3a
jr c,.skipEnemyMistCheck
cp a,POISON_EFFECT
jr c,.enemyMistCheck
jr .skipEnemyMistCheck
.enemyMistCheck
; if move effect is from $12 to $19 inclusive or $3a to $41 inclusive
; i.e. the following moves
; GROWL, TAIL WHIP, LEER, STRING SHOT, SAND-ATTACK, SMOKESCREEN, KINESIS,
; FLASH, CONVERSION, HAZE*, SCREECH, LIGHT SCREEN*, REFLECT*
; the moves that are marked with an asterisk are not affected since this
; function is not called when those moves are used
; XXX are there are any others like those three?
ld a,[W_ENEMYBATTSTATUS2]
bit 1,a ; is mon protected by mist?
jp nz,.moveMissed
.skipEnemyMistCheck
ld a,[W_PLAYERBATTSTATUS2]
bit 0,a ; is the player using X Accuracy?
ret nz ; if so, always hit regardless of accuracy/evasion
jr .calcHitChance
.enemyTurn
ld a,[W_ENEMYMOVEEFFECT]
cp a,ATTACK_DOWN1_EFFECT
jr c,.skipPlayerMistCheck
cp a,BIDE_EFFECT
jr c,.playerMistCheck
cp a,$3a
jr c,.skipPlayerMistCheck
cp a,POISON_EFFECT
jr c,.playerMistCheck
jr .skipPlayerMistCheck
.playerMistCheck
; similar to enemy mist check
ld a,[W_PLAYERBATTSTATUS2]
bit 1,a ; is mon protected by mist?
jp nz,.moveMissed
.skipPlayerMistCheck
ld a,[W_ENEMYBATTSTATUS2]
bit 0,a ; is the enemy using X Accuracy?
ret nz ; if so, always hit regardless of accuracy/evasion
.calcHitChance
call CalcHitChance ; scale the move accuracy according to attacker's accuracy and target's evasion
ld a,[W_PLAYERMOVEACCURACY]
ld b,a
ld a,[H_WHOSETURN]
and a
jr z,.doAccuracyCheck
ld a,[W_ENEMYMOVEACCURACY]
ld b,a
.doAccuracyCheck
; if the random number generated is greater than or equal to the scaled accuracy, the move misses
; note that this means that even the highest accuracy is still just a 255/256 chance, not 100%
call BattleRandom
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,$0e
sub c
ld c,a ; c = 14 - EVASIONMOD (this "reflects" the value over 7, so that an increase in the target's evasion decreases the hit chance instead of increasing the hit chance)
; zero the high bytes of the multiplicand
xor a
ld [H_MULTIPLICAND],a
ld [H_MULTIPLICAND + 1],a
ld a,[hl]
ld [H_MULTIPLICAND + 2],a ; set multiplicand to move accuracy
push hl
ld d,$02 ; loop has two iterations
; loop to do the calculations, the first iteration multiplies by the accuracy ratio and the second iteration multiplies by the evasion ratio
.loop
push bc
ld hl, StatModifierRatios ; $76cb ; stat modifier ratios
dec b
sla b
ld c,b
ld b,$00
add hl,bc ; hl = address of stat modifier ratio
pop bc
ld a,[hli]
ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio
call Multiply
ld a,[hl]
ld [H_DIVISOR],a ; set divisor to the the denominator of the ratio (the dividend is the product of the previous multiplication)
ld b,$04 ; number of bytes in the dividend
call Divide
ld a,[H_QUOTIENT + 3]
ld b,a
ld a,[H_QUOTIENT + 2]
or b
jp nz,.nextCalculation
; make sure the result is always at least one
ld [H_QUOTIENT + 2],a
ld a,$01
ld [H_QUOTIENT + 3],a
.nextCalculation
ld b,c
dec d
jr nz,.loop
ld a,[H_QUOTIENT + 2]
and a ; is the calculated hit chance over 0xFF?
ld a,[H_QUOTIENT + 3]
jr z,.storeAccuracy
; if calculated hit chance over 0xFF
ld a,$ff ; set the hit chance to 0xFF
.storeAccuracy
pop hl
ld [hl],a ; store the hit chance in the move accuracy variable
ret
Func_3e687: ; 3e687 (f:6687)
ld hl, W_DAMAGE ; W_DAMAGE
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
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 Divide
ld a, [$ff97]
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)
ld a, [wEnemySelectedMove] ; wccdd
2014-05-22 22:13:20 +00:00
inc a
jp z, Func_3e88c
call PrintGhostText
jp z, Func_3e88c
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jr nz, .asm_3e6dc
ld b, $1
ld a, [wcc3e]
2014-05-22 22:13:20 +00:00
cp $e
jr z, .asm_3e6dc
cp $4
ret nc
.asm_3e6dc
ld hl, wccd5
2014-05-22 22:13:20 +00:00
inc [hl]
xor a
ld [W_MOVEMISSED], a ; W_MOVEMISSED
ld [wccf4], a
2014-05-22 22:13:20 +00:00
ld a, $a
ld [wd05b], a
2014-05-22 22:13:20 +00:00
call Func_3e88f
jr nz, .asm_3e6f2
jp [hl]
.asm_3e6f2
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)
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
cp CHARGE_EFFECT
jp z, Func_3f132
cp FLY_EFFECT
jp z, Func_3f132
jr asm_3e72b
asm_3e70b: ; 3e70b (f:670b)
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
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
ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM
ld [wd0b5], a
2014-05-22 22:13:20 +00:00
ld a, $2c
ld [wPredefBank], a
2014-05-22 22:13:20 +00:00
ld a, MOVE_NAME
ld [W_LISTTYPE], a
call GetName
ld de, wcd6d
2014-05-22 22:13:20 +00:00
call CopyStringToCF4B
asm_3e72b: ; 3e72b (f:672b)
xor a
ld [wcced], a
2014-05-22 22:13:20 +00:00
call PrintMonName1Text
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
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
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)
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3e791
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)
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
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
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
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, $1e
call DelayFrames
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
cp FLY_EFFECT
jr z, .asm_3e7e6
cp CHARGE_EFFECT
jr z, .asm_3e7e6
jr asm_3e7ef
.asm_3e7e6
xor a
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
ld a,STATUS_AFFECTED_ANIM
call PlayMoveAnimation
asm_3e7ef: ; 3e7ef (f:67ef)
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
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
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3e82b
call PrintMoveFailureText
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 DisplayEffectiveness
ld a, $1
ld [wccf4], a
2014-05-22 22:13:20 +00:00
.asm_3e83e
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
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
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
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
ld [wcd05], a
2014-05-22 22:13:20 +00:00
.asm_3e873
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)
ld hl, W_ENEMYMONSTATUS ; wcfe9
2014-05-22 22:13:20 +00:00
ld a, [hl]
and $7
jr z, .asm_3e8bf
dec a
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
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
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
ld [wccf2], a
2014-05-22 22:13:20 +00:00
ld hl, Func_3e88c ; $688c
jp Func_3eab8
.asm_3e8d3
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)
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)
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
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
ld [wccef], a
2014-05-22 22:13:20 +00:00
ld hl, DisabledNoMoreText
call PrintText
.asm_3e929
ld a, [W_ENEMYBATTSTATUS1] ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
add a
jp nc, Func_3e9aa
ld hl, wd070
2014-05-22 22:13:20 +00:00
dec [hl]
jr nz, .asm_3e944
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
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
ld a,CONF_ANIM
call PlayMoveAnimation
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $80
jr c, Func_3e9aa
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
ld a, [W_ENEMYMONDEFENSE] ; wcff8
2014-05-22 22:13:20 +00:00
ld [hli], a
ld a, [W_ENEMYMONDEFENSE + 1]
2014-05-22 22:13:20 +00:00
ld [hl], a
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
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
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
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)
ld a, [wccef]
2014-05-22 22:13:20 +00:00
and a
jr z, .asm_3e9bf
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
ld hl, W_ENEMYMONSTATUS ; wcfe9
2014-05-22 22:13:20 +00:00
bit 6, [hl]
jr z, asm_3e9f6
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $3f
jr nc, asm_3e9f6
ld hl, FullyParalyzedText
call PrintText
asm_3e9d3: ; 3e9d3 (f:69d3)
ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
ld a, [hl]
and $cc
ld [hl], a
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
cp FLY_EFFECT
jr z, .asm_3e9e7
cp CHARGE_EFFECT
jr z, .asm_3e9e7
jr .asm_3e9f0
.asm_3e9e7
xor a
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)
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
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]
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
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
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
ld [W_ENEMYMOVEPOWER], a ; wcfce
ld hl, wcd06
2014-05-22 22:13:20 +00:00
ld a, [hld]
add a
ld b, a
ld [wd0d8], a
2014-05-22 22:13:20 +00:00
ld a, [hl]
rl a
ld [W_DAMAGE], a ; W_DAMAGE
2014-05-22 22:13:20 +00:00
or b
jr nz, .asm_3ea43
ld a, $1
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
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
ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM
2014-05-22 22:13:20 +00:00
ld hl, ThrashingAboutText
call PrintText
ld hl, wd06f
2014-05-22 22:13:20 +00:00
dec [hl]
ld hl, asm_3e750 ; $6750
jp nz, Func_3eab8
push hl
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
call BattleRandom
2014-05-22 22:13:20 +00:00
and $3
inc a
inc a
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
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)
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
ld [wd11e], a
2014-05-22 22:13:20 +00:00
call GetMoveName
call CopyStringToCF4B
xor a
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
ld de, W_ENEMYMOVENUM ; W_ENEMYMOVENUM
ld a, [wEnemySelectedMove] ; wccdd
2014-05-22 22:13:20 +00:00
jr .selected
.player
ld de, W_PLAYERMOVENUM ; wcfd2
2014-05-22 22:13:20 +00:00
ld a, [W_FLAGS_D733]
bit 0, a
ld a, [wccd9]
2014-05-22 22:13:20 +00:00
jr nz, .selected
ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove
2014-05-22 22:13:20 +00:00
.selected
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, $2c
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
ld de, wcd6d
2014-05-22 22:13:20 +00:00
jp CopyStringToCF4B
Func_3eb01: ; 3eb01 (f:6b01)
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jp z, Func_3cc13
ld a, [W_ENEMYMONID]
ld [wcfe5], a
ld [wd0b5], a
2014-05-22 22:13:20 +00:00
call GetMonHeader
ld a, [W_ENEMYBATTSTATUS3] ; W_ENEMYBATTSTATUS3
2014-05-22 22:13:20 +00:00
bit 3, a
ld hl, wcceb
2014-05-22 22:13:20 +00:00
ld a, [hli]
ld b, [hl]
jr nz, .asm_3eb33
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
call BattleRandom
2014-05-22 22:13:20 +00:00
ld b, a
call BattleRandom
2014-05-22 22:13:20 +00:00
.asm_3eb33
ld hl, W_ENEMYMONATKDEFIV
2014-05-22 22:13:20 +00:00
ld [hli], a
ld [hl], b
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
ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
push hl
call CalcStats
pop hl
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
cp $2
jr z, .asm_3eb65
ld a, [W_ENEMYBATTSTATUS3] ; W_ENEMYBATTSTATUS3
2014-05-22 22:13:20 +00:00
bit 3, a
jr nz, .asm_3eb86
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
ld hl, W_ENEMYMON1HP ; wd8a5 (aliases: W_WATERMONS)
ld a, [wWhichPokemon] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld bc, $2c
call AddNTimes
ld a, [hli]
ld [W_ENEMYMONCURHP], a ; W_ENEMYMONCURHP
2014-05-22 22:13:20 +00:00
ld a, [hli]
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]
ld [W_ENEMYMONSTATUS], a ; wcfe9
2014-05-22 22:13:20 +00:00
jr .asm_3eb86
.asm_3eb86
ld hl, W_MONHTYPES
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
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
cp $2
jr nz, .asm_3ebb0
ld hl, wd8ac
ld a, [wWhichPokemon] ; wWhichPokemon
2014-05-22 22:13:20 +00:00
ld bc, $2c
call AddNTimes
ld bc, $4
call CopyData
jr .asm_3ebca
.asm_3ebb0
ld hl, W_MONHMOVES
ld a, [hli]
ld [de], a
inc de
ld a, [hli]
ld [de], a
inc de
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
dec de
dec de
dec de
xor a
ld [wHPBarMaxHP], a
2014-05-22 22:13:20 +00:00
ld a, $3e
call Predef ; indirect jump to WriteMonMoves (3afb8 (e:6fb8))
.asm_3ebca
ld hl, W_ENEMYMONMOVES
ld de, W_ENEMYMONSPECIAL + 1
2014-05-22 22:13:20 +00:00
ld a, $5e
call Predef ; indirect jump to LoadMovePPs (f473 (3:7473))
ld hl, W_MONHBASESTATS
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]
ld [wd11e], a
2014-05-22 22:13:20 +00:00
call GetMonName
ld hl, wcd6d
2014-05-22 22:13:20 +00:00
ld de, W_ENEMYMONNAME
ld bc, $b
call CopyData
ld a, [W_ENEMYMONID]
ld [wd11e], a
2014-05-22 22:13:20 +00:00
ld a, $3a
call Predef ; indirect jump to IndexToPokedex (41010 (10:5010))
ld a, [wd11e]
2014-05-22 22:13:20 +00:00
dec a
ld c, a
ld b, $1
ld hl, wPokedexSeen ; wd30a
ld a, $10 ; FlagActionPredef
call Predef
ld hl, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL
ld de, wcd23
2014-05-22 22:13:20 +00:00
ld bc, $b
call CopyData
ld a, $7
ld b, $8
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)
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jr nz, .asm_3ec4d
xor a
ld [wMenuJoypadPollCount], a ; wMenuJoypadPollCount
2014-05-22 22:13:20 +00:00
callab Func_372d6
ld a, $1
ld [wcfcb], a
2014-05-22 22:13:20 +00:00
call ClearScreen
.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
ld [wcfcb], a
2014-05-23 22:34:35 +00:00
call ClearSprites
2014-05-22 22:13:20 +00:00
call ClearScreen
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
ld [$ffb0], a
ld [rWY], a ; $ff4a
ld [$ffd7], a
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
ld [W_PLAYERDISABLEDMOVE], a ; W_PLAYERDISABLEDMOVE
2014-05-22 22:13:20 +00:00
ret
Func_3ec81: ; 3ec81 (f:6c81)
push bc
ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
ld b, a
ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL
ld [W_PLAYERMONLEVEL], a ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
ld a, b
ld [W_ENEMYMONLEVEL], a ; W_ENEMYMONLEVEL
2014-05-22 22:13:20 +00:00
pop bc
ret
Func_3ec92: ; 3ec92 (f:6c92)
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
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
ld a, [W_PLAYERMONSTATUS] ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
and $40
ret z
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
ld a, [W_ENEMYMONSTATUS] ; wcfe9
2014-05-22 22:13:20 +00:00
and $40
ret z
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
ld a, [W_PLAYERMONSTATUS] ; W_PLAYERMONSTATUS
2014-05-22 22:13:20 +00:00
and $10
ret z
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
ld a, [W_ENEMYMONSTATUS] ; wcfe9
2014-05-22 22:13:20 +00:00
and $10
ret z
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
ld a, [wd11e]
2014-05-22 22:13:20 +00:00
and a
ld a, c
ld hl, W_PLAYERMONATK
ld de, wcd12
ld bc, wPlayerMonAttackMod ; wcd1a
2014-05-22 22:13:20 +00:00
jr z, .asm_3edc0
ld hl, W_ENEMYMONATTACK
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 Divide
pop hl
ld a, [$ff98]
sub $e7
ld a, [$ff97]
sbc $3
jp c, Func_3ee0c
ld a, $3
ld [$ff97], a
ld a, $e7
ld [$ff98], a
Func_3ee0c: ; 3ee0c (f:6e0c)
ld a, [$ff97]
ld [hli], a
ld b, a
ld a, [$ff98]
ld [hl], a
or b
jr nz, .asm_3ee17
inc [hl]
.asm_3ee17
pop bc
ret
Func_3ee19: ; 3ee19 (f:6e19)
ld a, [W_ISLINKBATTLE]
cp $4
ret z
ld a, [W_OBTAINEDBADGES]
ld b, a
ld hl, W_PLAYERMONATK
ld c, $4
.asm_3ee28
srl b
call c, Func_3ee35
inc hl
inc hl
srl b
dec c
jr nz, .asm_3ee28
ret
Func_3ee35: ; 3ee35 (f:6e35)
ld a, [hli]
ld d, a
ld e, [hl]
srl d
rr e
srl d
rr e
srl d
rr e
ld a, [hl]
add e
ld [hld], a
ld a, [hl]
adc d
ld [hli], a
ld a, [hld]
sub $e7
ld a, [hl]
sbc $3
ret c
ld a, $3
ld [hli], a
ld a, $e7
ld [hld], a
ret
Func_3ee58: ; 3ee58 (f:6e58)
call LoadHpBarAndStatusTilePatterns
Func_3ee5b: ; 3ee5b (f:6e5b)
ld a, [rLCDC] ; $ff40
add a
jr c, .asm_3ee7c
ld hl, BattleHudTiles1 ; $6080
2014-05-29 08:31:46 +00:00
ld de, vChars2 + $6d0
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 + $6d0
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 "@"
BattleRandom:
; Link battles use a shared PRNG.
2014-05-22 22:13:20 +00:00
ld a, [W_ISLINKBATTLE]
cp $4
jp nz, Random
2014-05-22 22:13:20 +00:00
push hl
push bc
ld a, [wccde]
2014-05-22 22:13:20 +00:00
ld c, a
ld b, 0
ld hl, wd148
2014-05-22 22:13:20 +00:00
add hl, bc
inc a
ld [wccde], a
cp 9
2014-05-22 22:13:20 +00:00
ld a, [hl]
pop bc
pop hl
ret c
2014-05-22 22:13:20 +00:00
push hl
push bc
push af
2014-05-22 22:13:20 +00:00
xor a
ld [wccde], a
ld hl, wd148
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
jr nz, .loop
2014-05-22 22:13:20 +00:00
pop af
pop bc
pop hl
ret
2014-05-22 22:13:20 +00:00
Func_3eed3: ; 3eed3 (f:6ed3)
ld a, [H_WHOSETURN] ; $fff3
and a
ld hl, W_ENEMYMONTYPE1 ; wcfea (aliases: W_ENEMYMONTYPES)
ld de, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
ld a, [W_PLAYERMOVENUM] ; wcfd2
2014-05-22 22:13:20 +00:00
jr z, .asm_3eeea
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
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
ret nz
ld a, MEGA_PUNCH
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
PlayMoveAnimation: ; 3ef07 (f:6f07)
ld [W_ANIMATIONID],a
2014-05-22 22:13:20 +00:00
call Delay3
PREDEF_JUMP MoveAnimationPredef ; predef 8
InitBattle: ; 3ef12 (f:6f12)
ld a, [W_CUROPPONENT] ; wd059
2014-05-22 22:13:20 +00:00
and a
jr z, asm_3ef23
InitOpponent: ; 3ef18 (f:6f18)
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)
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
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)
ld a, [wd35d]
2014-05-22 22:13:20 +00:00
push af
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
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
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
ld [W_ENEMYMONNUMBER], a ; W_ENEMYMONNUMBER
2014-05-22 22:13:20 +00:00
ld a, $2
ld [W_ISINBATTLE], a ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
jp Func_3efeb
InitWildBattle: ; 3ef8b (f:6f8b)
ld a, $1
ld [W_ISINBATTLE], a ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
call Func_3eb01
call Func_3ec32
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], "@"
ld a, [wcf91]
2014-05-22 22:13:20 +00:00
push af
ld a, MON_GHOST
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
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
ld [W_TRAINERCLASS], a ; wd031
2014-05-22 22:13:20 +00:00
ld [$ffe1], a
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 ClearScreen
ld a, $98
ld [$ffbd], a
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; $ffba
call Delay3
ld a, $9c
ld [$ffbd], a
call LoadScreenTilesFromBuffer1
FuncCoord 9, 7
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $50a
call ClearScreenArea
FuncCoord 1, 0
2014-05-22 22:13:20 +00:00
ld hl, Coord
ld bc, $40a
call ClearScreenArea
2014-05-23 22:34:35 +00:00
call ClearSprites
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
ld [wd358], a
2014-05-22 22:13:20 +00:00
pop af
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)
; wd033-wd034 contain pointer to pic
ld a, [wd033]
2014-05-22 22:13:20 +00:00
ld e, a
ld a, [wd034]
2014-05-22 22:13:20 +00:00
ld d, a ; de contains pointer to trainer pic
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
ld [wc0f1], a
ld [wc0f2], a
2014-05-22 22:13:20 +00:00
jp PlaySound
Func_3f073: ; 3f073 (f:7073)
ld a, [wPredefRegisters]
2014-05-22 22:13:20 +00:00
ld h, a
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, $4c
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
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
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)
ld a, [wPredefRegisters]
2014-05-22 22:13:20 +00:00
ld h, a
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.
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 ClearScreenArea
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*SPRITEBUFFERSIZE)/16 ; count of 16-byte chunks to be copied
ld a, [H_LOADEDROMBANK]
ld b, a
jp CopyVideoData
Func_3f132: ; 3f132 (f:7132)
call JumpMoveEffect
ld b, $1
ret
JumpMoveEffect: ; 3f138 (f:7138)
ld a, [$fff3] ;whose turn?
and a
ld a, [W_PLAYERMOVEEFFECT]
jr z, .next1
ld a, [W_ENEMYMOVEEFFECT]
.next1
dec a ;subtract 1, there is no special effect for 00
add a ;x2, 16bit pointers
ld hl, MoveEffectPointerTable
ld b, 0
ld c, a
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
jp [hl] ;jump to special effect handler
MoveEffectPointerTable: ; 3f150 (f:7150)
dw SleepEffect ; unused effect
dw PoisonEffect ; POISON_SIDE_EFFECT1
dw DrainHPEffect ; DRAIN_HP_EFFECT
dw FreezeBurnParalyzeEffect ; BURN_SIDE_EFFECT1
dw FreezeBurnParalyzeEffect ; FREEZE_SIDE_EFFECT
dw FreezeBurnParalyzeEffect ; PARALYZE_SIDE_EFFECT1
dw ExplodeEffect ; EXPLODE_EFFECT
dw DrainHPEffect ; DREAM_EATER_EFFECT
dw $0000 ; MIRROR_MOVE_EFFECT
dw StatModifierUpEffect ; ATTACK_UP1_EFFECT
dw StatModifierUpEffect ; DEFENSE_UP1_EFFECT
dw StatModifierUpEffect ; SPEED_UP1_EFFECT
dw StatModifierUpEffect ; SPECIAL_UP1_EFFECT
dw StatModifierUpEffect ; ACCURACY_UP1_EFFECT
dw StatModifierUpEffect ; EVASION_UP1_EFFECT
dw PayDayEffect ; PAY_DAY_EFFECT
dw $0000 ; SWIFT_EFFECT
dw StatModifierDownEffect ; ATTACK_DOWN1_EFFECT
dw StatModifierDownEffect ; DEFENSE_DOWN1_EFFECT
dw StatModifierDownEffect ; SPEED_DOWN1_EFFECT
dw StatModifierDownEffect ; SPECIAL_DOWN1_EFFECT
dw StatModifierDownEffect ; ACCURACY_DOWN1_EFFECT
dw StatModifierDownEffect ; EVASION_DOWN1_EFFECT
dw ConversionEffect ; CONVERSION_EFFECT
dw HazeEffect ; HAZE_EFFECT
dw BideEffect ; BIDE_EFFECT
dw ThrashPetalDanceEffect ; THRASH_PETAL_DANCE_EFFECT
dw SwitchAndTeleportEffect ; SWITCH_AND_TELEPORT_EFFECT
dw TwoToFiveAttacksEffect ; TWO_TO_FIVE_ATTACKS_EFFECT
dw TwoToFiveAttacksEffect ; unused effect
dw FlichSideEffect ; FLINCH_SIDE_EFFECT1
dw SleepEffect ; SLEEP_EFFECT
dw PoisonEffect ; POISON_SIDE_EFFECT2
dw FreezeBurnParalyzeEffect ; BURN_SIDE_EFFECT2
dw FreezeBurnParalyzeEffect ; unused effect
dw FreezeBurnParalyzeEffect ; PARALYZE_SIDE_EFFECT2
dw FlichSideEffect ; FLINCH_SIDE_EFFECT2
dw OneHitKOEffect ; OHKO_EFFECT
dw ChargeEffect ; CHARGE_EFFECT
dw $0000 ; SUPER_FANG_EFFECT
dw $0000 ; SPECIAL_DAMAGE_EFFECT
dw TrappingEffect ; TRAPPING_EFFECT
dw ChargeEffect ; FLY_EFFECT
dw TwoToFiveAttacksEffect ; ATTACK_TWICE_EFFECT
dw $0000 ; JUMP_KICK_EFFECT
dw MistEffect ; MIST_EFFECT
dw FocusEnergyEffect ; FOCUS_ENERGY_EFFECT
dw RecoilEffect ; RECOIL_EFFECT
dw ConfusionEffect ; CONFUSION_EFFECT
dw StatModifierUpEffect ; ATTACK_UP2_EFFECT
dw StatModifierUpEffect ; DEFENSE_UP2_EFFECT
dw StatModifierUpEffect ; SPEED_UP2_EFFECT
dw StatModifierUpEffect ; SPECIAL_UP2_EFFECT
dw StatModifierUpEffect ; ACCURACY_UP2_EFFECT
dw StatModifierUpEffect ; EVASION_UP2_EFFECT
dw HealEffect ; HEAL_EFFECT
dw TransformEffect ; TRANSFORM_EFFECT
dw StatModifierDownEffect ; ATTACK_DOWN2_EFFECT
dw StatModifierDownEffect ; DEFENSE_DOWN2_EFFECT
dw StatModifierDownEffect ; SPEED_DOWN2_EFFECT
dw StatModifierDownEffect ; SPECIAL_DOWN2_EFFECT
dw StatModifierDownEffect ; ACCURACY_DOWN2_EFFECT
dw StatModifierDownEffect ; EVASION_DOWN2_EFFECT
dw ReflectLightScreenEffect ; LIGHT_SCREEN_EFFECT
dw ReflectLightScreenEffect ; REFLECT_EFFECT
dw PoisonEffect ; POISON_EFFECT
dw ParalyzeEffect ; PARALYZE_EFFECT
dw StatModifierDownEffect ; ATTACK_DOWN_SIDE_EFFECT
dw StatModifierDownEffect ; DEFENSE_DOWN_SIDE_EFFECT
dw StatModifierDownEffect ; SPEED_DOWN_SIDE_EFFECT
dw StatModifierDownEffect ; SPECIAL_DOWN_SIDE_EFFECT
dw StatModifierDownEffect ; unused effect
dw StatModifierDownEffect ; unused effect
dw StatModifierDownEffect ; unused effect
dw StatModifierDownEffect ; unused effect
dw ConfusionSideEffect ; CONFUSION_SIDE_EFFECT
dw TwoToFiveAttacksEffect ; TWINEEDLE_EFFECT
dw $0000 ; unused effect
dw SubstituteEffect ; SUBSTITUTE_EFFECT
dw HyperBeamEffect ; HYPER_BEAM_EFFECT
dw RageEffect ; RAGE_EFFECT
dw MimicEffect ; MIMIC_EFFECT
dw $0000 ; METRONOME_EFFECT
dw LeechSeedEffect ; LEECH_SEED_EFFECT
dw SplashEffect ; SPLASH_EFFECT
dw DisableEffect ; DISABLE_EFFECT
SleepEffect: ; 3f1fc (f:71fc)
ld de, W_ENEMYMONSTATUS ; wcfe9
ld bc, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jp z, .asm_3f20e
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, AlreadyAsleepText
jp PrintText
.asm_3f222
ld a, b
and a
jr nz, .asm_3f242
push de
call MoveHitTest
pop de
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3f242
.asm_3f231
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)
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
ld hl, W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS
ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3f260
call CheckTargetSubstitute
jr nz, .asm_3f2d3
ld a, [hli]
ld b, a
and a
jr nz, .asm_3f2d3
ld a, [hli]
cp $3
jr z, .asm_3f2d3
ld a, [hld]
cp $3
jr z, .asm_3f2d3
ld a, [de]
cp POISON_SIDE_EFFECT1
ld b, $34 ; ~20% chance of poisoning
jr z, .asm_3f290
cp POISON_SIDE_EFFECT2
ld b, $67 ; ~40% chance of poisoning
jr z, .asm_3f290
push hl
push de
call MoveHitTest
pop de
pop hl
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3f2d7
jr .asm_3f295
.asm_3f290
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
ld hl, W_PLAYERBATTSTATUS3 ; W_PLAYERBATTSTATUS3
2014-05-22 22:13:20 +00:00
ld a, [de]
ld de, W_PLAYERTOXICCOUNTER ; wd06c
2014-05-22 22:13:20 +00:00
jr nz, .asm_3f2b0
ld b, $a9
ld hl, W_ENEMYBATTSTATUS3 ; W_ENEMYBATTSTATUS3
ld de, W_ENEMYTOXICCOUNTER ; wd071
2014-05-22 22:13:20 +00:00
.asm_3f2b0
cp $5c
jr nz, .asm_3f2bd
set 0, [hl]
xor a
ld [de], a
ld hl, BadlyPoisonedText
jr .asm_3f2c0
.asm_3f2bd
ld hl, PoisonedText
.asm_3f2c0
pop de
ld a, [de]
cp POISON_EFFECT
jr z, .asm_3f2cd
ld a, b
call Func_3fb96
jp PrintText
.asm_3f2cd
call Func_3fb89
jp PrintText
.asm_3f2d3
ld a, [de]
cp POISON_EFFECT
ret nz
.asm_3f2d7
ld c, $32
call DelayFrames
jp PrintDidntAffectText
PoisonedText: ; 3f2df (f:72df)
TX_FAR _PoisonedText
db "@"
BadlyPoisonedText: ; 3f2e4 (f:72e4)
TX_FAR _BadlyPoisonedText
db "@"
DrainHPEffect: ; 3f2e9 (f:72e9)
ld hl, DrainHPEffect_
ld b, BANK(DrainHPEffect_)
jp Bankswitch
ExplodeEffect: ; 3f2f1 (f:72f1)
ld hl, W_PLAYERMONCURHP ; wd015
ld de, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f302
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
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
call CheckTargetSubstitute ;test bit 4 of d063/d068 flags [target has substitute flag]
ret nz ;return if they have a substitute, can't effect them
ld a, [$fff3] ;whose turn?
and a
jp nz, opponentAttacker
ld a, [W_ENEMYMONSTATUS]
and a
jp nz, CheckDefrost
;opponent has no existing status
ld a, [W_PLAYERMOVETYPE]
ld b, a
ld a, [W_ENEMYMONTYPE1]
cp b
ret z ;return if they match [can't freeze an ice type etc.]
ld a, [W_ENEMYMONTYPE2]
cp b
ret z ;return..
ld a, [W_PLAYERMOVEEFFECT]
cp a, 7 ;10% status effects are 04, 05, 06 so 07 will set carry for those
ld b, $1a ;[1A-1]/100 or [26-1]/256 = 9.8%~ chance
jr c, .next1 ;branch ahead if this is a 10% chance effect..
ld b, $4d ;..or use [4D-1]/100 or [76-1]/256 = 29.7%~ chance
sub a, $1e ;subtract $1E to map to equivalent 10% chance effects
.next1
push af ;push effect...
call BattleRandom ;get random 8bit value for probability test
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, CheckDefrost
ld a, [W_ENEMYMOVETYPE]
ld b, a
ld a, [W_PLAYERMONTYPE1]
cp b
ret z
ld a, [W_PLAYERMONTYPE2]
cp b
ret z
ld a, [W_ENEMYMOVEEFFECT]
cp a, 7
ld b, $1a
jr c, .next1
ld b, $4d
sub a, $1e
.next1
push af
call BattleRandom
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]
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, $002c ;$2C bytes per roster entry
call AddNTimes
xor a
ld [hl], a ;clear status in roster
ld hl, FireDefrostedText
jr .common
.opponent
ld a, [W_ENEMYMOVETYPE] ;same as above with addresses swapped
sub a, FIRE
ret nz
ld [W_PLAYERMONSTATUS], a
ld hl, W_PARTYMON1_STATUS
2014-05-22 22:13:20 +00:00
ld a, [wPlayerMonNumber]
ld bc, $002c
call AddNTimes
xor a
ld [hl], a
ld hl, FireDefrostedText
.common
jp PrintText
FireDefrostedText: ; 3f423 (f:7423)
TX_FAR _FireDefrostedText
db "@"
StatModifierUpEffect: ; 3f428 (f:7428)
ld hl, wPlayerMonStatMods ; wcd1a
ld de, W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f439
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
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
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 Divide
pop hl
ld a, [$ff98]
sub $e7
ld a, [$ff97]
sbc $3
jp c, Func_3f4c3
ld a, 999 / $100
ld [$ff97], a
ld a, 999 % $100
ld [$ff98], a
Func_3f4c3: ; 3f4c3 (f:74c3)
ld a, [$ff97]
ld [hli], a
ld a, [$ff98]
ld [hl], a
pop hl
asm_3f4ca: ; 3f4ca (f:74ca)
ld b, c
inc b
call Func_3f688
ld hl, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2
ld de, W_PLAYERMOVENUM ; wcfd2
ld bc, wccf7
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f4e6
ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2
ld de, W_ENEMYMOVENUM ; W_ENEMYMOVENUM
ld bc, wccf3
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
ld a, [W_PLAYERMOVEEFFECT] ; wcfd3
2014-05-22 22:13:20 +00:00
jr z, .asm_3f53b
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 $0a
TX_FAR _GreatlyRoseText
RoseText: ; 3f547 (f:7547)
TX_FAR _RoseText
db "@"
StatModifierDownEffect: ; 3f54c (f:754c)
ld hl, wEnemyMonStatMods ; wcd2e
ld de, W_PLAYERMOVEEFFECT ; wcfd3
ld bc, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f572
ld hl, wPlayerMonStatMods ; wcd1a
ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT
ld bc, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
jr z, .asm_3f572
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $40
jp c, Func_3f65a
.asm_3f572
call CheckTargetSubstitute
jp nz, Func_3f65a
ld a, [de]
cp ATTACK_DOWN_SIDE_EFFECT
jr c, .asm_3f58a
call BattleRandom
2014-05-22 22:13:20 +00:00
cp SPLASH_EFFECT
jp nc, Func_3f650
ld a, [de]
sub ATTACK_DOWN_SIDE_EFFECT
jr .asm_3f5a9
.asm_3f58a
push hl
push de
push bc
call MoveHitTest
pop bc
pop de
pop hl
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
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
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
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 Divide
pop hl
ld a, [$ff98]
ld b, a
ld a, [$ff97]
or b
jp nz, Func_3f624
ld [$ff97], a
ld a, $1
ld [$ff98], a
Func_3f624: ; 3f624 (f:7624)
ld a, [$ff97]
ld [hli], a
ld a, [$ff98]
ld [hl], a
pop de
pop hl
asm_3f62c: ; 3f62c (f:762c)
ld b, c
inc b
push de
call Func_3f688
pop de
ld a, [de]
cp $44
jr nc, .asm_3f63b
call Func_3fb89
.asm_3f63b
ld a, [H_WHOSETURN] ; $fff3
and a
call nz, Func_3ee19
ld hl, MonsStatsFellText
call PrintText
call Func_3ed27
jp Func_3ed64
Func_3f64d: ; 3f64d (f:764d)
pop de
pop hl
inc [hl]
Func_3f650: ; 3f650 (f:7650)
ld a, [de]
cp ATTACK_DOWN_SIDE_EFFECT
ret nc
ld hl, NothingHappenedText
jp PrintText
Func_3f65a: ; 3f65a (f:765a)
ld a, [de]
cp $44
ret nc
jp Func_3fb4e
MonsStatsFellText: ; 3f661 (f:7661)
TX_FAR _MonsStatsFellText
db $08 ; asm
ld hl, FellText
ld a, [H_WHOSETURN] ; $fff3
and a
ld a, [W_PLAYERMOVEEFFECT] ; wcfd3
2014-05-22 22:13:20 +00:00
jr z, .asm_3f674
ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT
2014-05-22 22:13:20 +00:00
.asm_3f674
cp $1a
ret c
cp $44
ret nc
ld hl, GreatlyFellText
ret
GreatlyFellText: ; 3f67e (f:767e)
db $0a
TX_FAR _GreatlyFellText
FellText: ; 3f683 (f:7683)
TX_FAR _FellText
db "@"
Func_3f688: ; 3f688 (f:7688)
ld hl, StatsTextStrings
ld c, $50
.asm_3f68d
dec b
jr z, .asm_3f696
.asm_3f690
ld a, [hli]
cp c
jr z, .asm_3f68d
jr .asm_3f690
.asm_3f696
ld de, wcf4b
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
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
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
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)
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
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
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
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr nz, .asm_3f77e
ld a, [W_CURENEMYLVL] ; W_CURENEMYLVL
2014-05-22 22:13:20 +00:00
ld b, a
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
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
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
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
inc a
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
ld a, [W_PLAYERMOVENUM] ; wcfd2
2014-05-22 22:13:20 +00:00
cp TELEPORT
jp nz, PrintText
jp PrintButItFailedText_
.asm_3f791
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
2014-05-22 22:13:20 +00:00
dec a
jr nz, .asm_3f7d1
ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL
2014-05-22 22:13:20 +00:00
ld b, a
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
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
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
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
inc a
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
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)
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
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
ld hl, W_PLAYERMOVEEFFECT ; wcfd3
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f838
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
call BattleRandom
2014-05-22 22:13:20 +00:00
and $3
cp $2
jr c, .asm_3f851
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 CheckTargetSubstitute
ret nz
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
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, $1a ; ~10% chance of flinch
jr z, .asm_3f879
ld b, $4d ; ~30% chance of flinch
.asm_3f879
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)
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
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 DIG
jr nz, .asm_3f8b6
set 6, [hl] ; mon is now invulnerable to typical attacks (fly/dig)
ld b, $c0
.asm_3f8b6
xor a
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
ld a, b
call Func_3fbb9
ld a, [de]
ld [wWhichTrade], a ; wWhichTrade
2014-05-22 22:13:20 +00:00
ld hl, ChargeMoveEffectText ; $78c8
jp PrintText
ChargeMoveEffectText: ; 3f8c8 (f:78c8)
TX_FAR _ChargeMoveEffectText
db $08 ; asm
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 DIG
ld hl, DugAHoleText ; $7912
.asm_3f8f8
ret
MadeWhirlwindText: ; 3f8f9 (f:78f9)
TX_FAR _MadeWhirlwindText
db "@"
TookInSunlightText: ; 3f8fe (f:78fe)
TX_FAR _TookInSunlightText
db "@"
LoweredItsHeadText: ; 3f903 (f:7903)
TX_FAR _LoweredItsHeadText
db "@"
SkyAttackGlowingText: ; 3f908 (f:7908)
TX_FAR _SkyAttackGlowingText
db "@"
FlewUpHighText: ; 3f90d (f:790d)
TX_FAR _FlewUpHighText
db "@"
DugAHoleText: ; 3f912 (f:7912)
TX_FAR _DugAHoleText
db "@"
TrappingEffect: ; 3f917 (f:7917)
ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1
ld de, wd06a
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
jr z, .asm_3f928
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]
call BattleRandom
2014-05-22 22:13:20 +00:00
and $3
cp $2
jr c, .asm_3f93e
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)
call BattleRandom
2014-05-22 22:13:20 +00:00
cp $19
ret nc
jr Func_3f96f
ConfusionEffect: ; 3f961 (f:7961)
call CheckTargetSubstitute
jr nz, Func_3f9a6
call MoveHitTest
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
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
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
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
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)
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
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
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
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
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
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
ld a, [W_MOVEMISSED] ; W_MOVEMISSED
2014-05-22 22:13:20 +00:00
and a
jr nz, .asm_3fb06
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
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
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
ld [wd11e], a
2014-05-22 22:13:20 +00:00
push hl
ld a, [H_WHOSETURN] ; $fff3
and a
ld hl, W_PLAYERMONPP ; W_PLAYERMONPP
2014-05-22 22:13:20 +00:00
jr nz, .asm_3facf
ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE
2014-05-22 22:13:20 +00:00
cp $4
pop hl
jr nz, .asm_3fae1
push hl
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 $3f
pop hl
jr z, .asm_3fb05
add hl, bc
ld a, [hl]
pop hl
and a
jr z, .asm_3faa8
.asm_3fae1
call BattleRandom
2014-05-22 22:13:20 +00:00
and $7
inc a
inc c
swap c
add c
ld [de], a
call Func_3fb89
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
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)
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, DidntAffectText
jp PrintText
DidntAffectText: ; 3fb64 (f:7b64)
TX_FAR _DidntAffectText
db "@"
IsUnaffectedText: ; 3fb69 (f:7b69)
TX_FAR _IsUnaffectedText
db "@"
PrintMayNotAttackText: ; 3fb6e (f:7b6e)
ld hl, ParalyzedMayNotAttackText ; $7b74
jp PrintText
ParalyzedMayNotAttackText: ; 3fb74 (f:7b74)
TX_FAR _ParalyzedMayNotAttackText
db "@"
CheckTargetSubstitute: ; 3fb79 (f:7b79)
push hl
ld hl, W_ENEMYBATTSTATUS2
2014-05-22 22:13:20 +00:00
ld a, [$fff3] ;whose turn?
and a
jr z, .next1
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
ld a, [W_PLAYERMOVENUM] ; wcfd2
2014-05-22 22:13:20 +00:00
jr z, .asm_3fb94
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)
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
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
jp Func_3fbbc
Func_3fba8: ; 3fba8 (f:7ba8)
xor a
ld [wcc5b], a
2014-05-22 22:13:20 +00:00
ld a, [H_WHOSETURN] ; $fff3
and a
ld a, [W_PLAYERMOVENUM] ; wcfd2
2014-05-22 22:13:20 +00:00
jr z, .asm_3fbb7
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)
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