mirror of https://github.com/pret/pokecrystal.git
10719 lines
145 KiB
NASM
10719 lines
145 KiB
NASM
DoPlayerTurn: ; 34000
|
|
call SetPlayerTurn
|
|
|
|
ld a, [wd0ec]
|
|
and a
|
|
ret nz
|
|
|
|
jr DoTurn
|
|
; 3400a
|
|
|
|
|
|
DoEnemyTurn: ; 3400a
|
|
call SetEnemyTurn
|
|
|
|
ld a, [wLinkMode]
|
|
and a
|
|
jr z, DoTurn
|
|
|
|
ld a, [wBattleAction]
|
|
cp $e
|
|
jr z, DoTurn
|
|
cp NUM_MOVES
|
|
ret nc
|
|
|
|
; fallthrough
|
|
; 3401d
|
|
|
|
|
|
DoTurn: ; 3401d
|
|
; Read in and execute the user's move effects for this turn.
|
|
|
|
xor a
|
|
ld [wc6b4], a
|
|
|
|
; Effect command checkturn is called for every move.
|
|
call CheckTurn
|
|
|
|
ld a, [wc6b4]
|
|
and a
|
|
ret nz
|
|
|
|
call UpdateMoveData
|
|
; 3402c
|
|
|
|
|
|
DoMove: ; 3402c
|
|
; Get the user's move effect.
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
ld c, a
|
|
ld b, 0
|
|
ld hl, MoveEffectsPointers
|
|
rept 2
|
|
add hl, bc
|
|
endr
|
|
ld a, BANK(MoveEffectsPointers)
|
|
call GetFarHalfword
|
|
|
|
ld de, BattleScriptBuffer
|
|
|
|
.GetMoveEffect
|
|
ld a, BANK(MoveEffects)
|
|
call GetFarByte
|
|
inc hl
|
|
ld [de], a
|
|
inc de
|
|
cp $ff
|
|
jr nz, .GetMoveEffect
|
|
|
|
; Start at the first command.
|
|
ld hl, BattleScriptBuffer
|
|
ld a, l
|
|
ld [BattleScriptBufferLoc], a
|
|
ld a, h
|
|
ld [BattleScriptBufferLoc + 1], a
|
|
|
|
.ReadMoveEffectCommand
|
|
|
|
; ld a, [BattleScriptBufferLoc++]
|
|
ld a, [BattleScriptBufferLoc]
|
|
ld l, a
|
|
ld a, [BattleScriptBufferLoc + 1]
|
|
ld h, a
|
|
|
|
ld a, [hli]
|
|
|
|
push af
|
|
ld a, l
|
|
ld [BattleScriptBufferLoc], a
|
|
ld a, h
|
|
ld [BattleScriptBufferLoc + 1], a
|
|
pop af
|
|
|
|
; endturn_command (-2) is used to terminate branches without ending the read cycle.
|
|
cp endturn_command
|
|
ret nc
|
|
|
|
; The rest of the commands (01-af) are read from BattleCommandPointers.
|
|
push bc
|
|
dec a
|
|
ld c, a
|
|
ld b, 0
|
|
ld hl, BattleCommandPointers
|
|
rept 2
|
|
add hl, bc
|
|
endr
|
|
pop bc
|
|
|
|
ld a, BANK(BattleCommandPointers)
|
|
call GetFarHalfword
|
|
|
|
call .DoMoveEffectCommand
|
|
|
|
jr .ReadMoveEffectCommand
|
|
|
|
.DoMoveEffectCommand
|
|
jp [hl]
|
|
; 34084
|
|
|
|
|
|
CheckTurn:
|
|
BattleCommand01: ; 34084
|
|
; checkturn
|
|
|
|
; Repurposed as hardcoded turn handling. Useless as a command.
|
|
|
|
; Move $ff immediately ends the turn.
|
|
ld a, BATTLE_VARS_MOVE
|
|
call GetBattleVar
|
|
inc a
|
|
jp z, Function34385
|
|
|
|
xor a
|
|
ld [AttackMissed], a
|
|
ld [EffectFailed], a
|
|
ld [wc689], a
|
|
ld [AlreadyDisobeyed], a
|
|
ld [AlreadyFailed], a
|
|
ld [wc73e], a
|
|
|
|
ld a, 10 ; 1.0
|
|
ld [TypeModifier], a
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jp nz, CheckEnemyTurn
|
|
|
|
|
|
CheckPlayerTurn:
|
|
|
|
ld hl, PlayerSubStatus4
|
|
bit SUBSTATUS_RECHARGE, [hl]
|
|
jr z, .no_recharge
|
|
|
|
res SUBSTATUS_RECHARGE, [hl]
|
|
ld hl, MustRechargeText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.no_recharge
|
|
|
|
|
|
ld hl, BattleMonStatus
|
|
ld a, [hl]
|
|
and SLP
|
|
jr z, .not_asleep
|
|
|
|
dec a
|
|
ld [BattleMonStatus], a
|
|
and SLP
|
|
jr z, .woke_up
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
ld de, ANIM_SLP
|
|
call FarPlayBattleAnimation
|
|
jr .fast_asleep
|
|
|
|
.woke_up
|
|
ld hl, WokeUpText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
call UpdateBattleMonInParty
|
|
ld hl, UpdatePlayerHUD
|
|
call CallBattleCore
|
|
ld a, $1
|
|
ld [$ffd4], a
|
|
ld hl, PlayerSubStatus1
|
|
res SUBSTATUS_NIGHTMARE, [hl]
|
|
jr .not_asleep
|
|
|
|
.fast_asleep
|
|
ld hl, FastAsleepText
|
|
call StdBattleTextBox
|
|
|
|
; Snore and Sleep Talk bypass sleep.
|
|
ld a, [CurPlayerMove]
|
|
cp SNORE
|
|
jr z, .not_asleep
|
|
cp SLEEP_TALK
|
|
jr z, .not_asleep
|
|
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_asleep
|
|
|
|
|
|
ld hl, BattleMonStatus
|
|
bit FRZ, [hl]
|
|
jr z, .not_frozen
|
|
|
|
; Flame Wheel and Sacred Fire thaw the user.
|
|
ld a, [CurPlayerMove]
|
|
cp FLAME_WHEEL
|
|
jr z, .not_frozen
|
|
cp SACRED_FIRE
|
|
jr z, .not_frozen
|
|
|
|
ld hl, FrozenSolidText
|
|
call StdBattleTextBox
|
|
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_frozen
|
|
|
|
|
|
ld hl, PlayerSubStatus3
|
|
bit SUBSTATUS_FLINCHED, [hl]
|
|
jr z, .not_flinched
|
|
|
|
res SUBSTATUS_FLINCHED, [hl]
|
|
ld hl, FlinchedText
|
|
call StdBattleTextBox
|
|
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_flinched
|
|
|
|
|
|
ld hl, PlayerDisableCount
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .not_disabled
|
|
|
|
dec a
|
|
ld [hl], a
|
|
and $f
|
|
jr nz, .not_disabled
|
|
|
|
ld [hl], a
|
|
ld [DisabledMove], a
|
|
ld hl, DisabledNoMoreText
|
|
call StdBattleTextBox
|
|
|
|
.not_disabled
|
|
|
|
|
|
ld a, [PlayerSubStatus3]
|
|
add a
|
|
jr nc, .not_confused
|
|
ld hl, PlayerConfuseCount
|
|
dec [hl]
|
|
jr nz, .confused
|
|
|
|
ld hl, PlayerSubStatus3
|
|
res SUBSTATUS_CONFUSED, [hl]
|
|
ld hl, ConfusedNoMoreText
|
|
call StdBattleTextBox
|
|
jr .not_confused
|
|
|
|
.confused
|
|
ld hl, IsConfusedText
|
|
call StdBattleTextBox
|
|
xor a
|
|
ld [wcfca], a
|
|
ld de, ANIM_CONFUSED
|
|
call FarPlayBattleAnimation
|
|
|
|
; 50% chance of hitting itself
|
|
call BattleRandom
|
|
cp $80
|
|
jr nc, .not_confused
|
|
|
|
; clear confusion-dependent substatus
|
|
ld hl, PlayerSubStatus3
|
|
ld a, [hl]
|
|
and 1 << SUBSTATUS_CONFUSED
|
|
ld [hl], a
|
|
|
|
call HitConfusion
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_confused
|
|
|
|
|
|
ld a, [PlayerSubStatus1]
|
|
add a ; bit SUBSTATUS_ATTRACT
|
|
jr nc, .not_infatuated
|
|
|
|
ld hl, InLoveWithText
|
|
call StdBattleTextBox
|
|
xor a
|
|
ld [wcfca], a
|
|
ld de, ANIM_IN_LOVE
|
|
call FarPlayBattleAnimation
|
|
|
|
; 50% chance of infatuation
|
|
call BattleRandom
|
|
cp $80
|
|
jr c, .not_infatuated
|
|
|
|
ld hl, InfatuationText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_infatuated
|
|
|
|
|
|
; We can't disable a move that doesn't exist.
|
|
ld a, [DisabledMove]
|
|
and a
|
|
jr z, .no_disabled_move
|
|
|
|
; Are we using the disabled move?
|
|
ld hl, CurPlayerMove
|
|
cp [hl]
|
|
jr nz, .no_disabled_move
|
|
|
|
call MoveDisabled
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.no_disabled_move
|
|
|
|
|
|
ld hl, BattleMonStatus
|
|
bit PAR, [hl]
|
|
ret z
|
|
|
|
; 25% chance to be fully paralyzed
|
|
call BattleRandom
|
|
cp $3f
|
|
ret nc
|
|
|
|
ld hl, FullyParalyzedText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
jp Function34385
|
|
; 341f0
|
|
|
|
|
|
CantMove: ; 341f0
|
|
ld a, BATTLE_VARS_SUBSTATUS1
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_ROLLOUT, [hl]
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
ld a, [hl]
|
|
and $ff ^ (1<<SUBSTATUS_BIDE + 1<<SUBSTATUS_RAMPAGE + 1<<SUBSTATUS_CHARGED)
|
|
ld [hl], a
|
|
|
|
call ResetFuryCutterCount
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
cp FLY
|
|
jr z, .asm_3420f
|
|
|
|
cp DIG
|
|
ret nz
|
|
|
|
.asm_3420f
|
|
res SUBSTATUS_UNDERGROUND, [hl]
|
|
res SUBSTATUS_FLYING, [hl]
|
|
jp Function37ece
|
|
; 34216
|
|
|
|
|
|
|
|
Function34216: ; 34216
|
|
call BattleCommand_SwitchTurn
|
|
call CantMove
|
|
jp BattleCommand_SwitchTurn
|
|
; 3421f
|
|
|
|
|
|
|
|
CheckEnemyTurn: ; 3421f
|
|
|
|
ld hl, EnemySubStatus4
|
|
bit SUBSTATUS_RECHARGE, [hl]
|
|
jr z, .no_recharge
|
|
|
|
res SUBSTATUS_RECHARGE, [hl]
|
|
ld hl, MustRechargeText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.no_recharge
|
|
|
|
|
|
ld hl, EnemyMonStatus
|
|
ld a, [hl]
|
|
and SLP
|
|
jr z, .not_asleep
|
|
|
|
dec a
|
|
ld [EnemyMonStatus], a
|
|
and a
|
|
jr z, .woke_up
|
|
|
|
ld hl, FastAsleepText
|
|
call StdBattleTextBox
|
|
xor a
|
|
ld [wcfca], a
|
|
ld de, ANIM_SLP
|
|
call FarPlayBattleAnimation
|
|
jr .fast_asleep
|
|
|
|
.woke_up
|
|
ld hl, WokeUpText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
call UpdateEnemyMonInParty
|
|
ld hl, UpdateEnemyHUD
|
|
call CallBattleCore
|
|
ld a, $1
|
|
ld [$ffd4], a
|
|
ld hl, EnemySubStatus1
|
|
res SUBSTATUS_NIGHTMARE, [hl]
|
|
jr .not_asleep
|
|
|
|
.fast_asleep
|
|
; Snore and Sleep Talk bypass sleep.
|
|
ld a, [CurEnemyMove]
|
|
cp SNORE
|
|
jr z, .not_asleep
|
|
cp SLEEP_TALK
|
|
jr z, .not_asleep
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_asleep
|
|
|
|
|
|
ld hl, EnemyMonStatus
|
|
bit FRZ, [hl]
|
|
jr z, .not_frozen
|
|
ld a, [CurEnemyMove]
|
|
cp FLAME_WHEEL
|
|
jr z, .not_frozen
|
|
cp SACRED_FIRE
|
|
jr z, .not_frozen
|
|
|
|
ld hl, FrozenSolidText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_frozen
|
|
|
|
|
|
ld hl, EnemySubStatus3
|
|
bit SUBSTATUS_FLINCHED, [hl]
|
|
jr z, .not_flinched
|
|
|
|
res SUBSTATUS_FLINCHED, [hl]
|
|
ld hl, FlinchedText
|
|
call StdBattleTextBox
|
|
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_flinched
|
|
|
|
|
|
ld hl, EnemyDisableCount
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .not_disabled
|
|
|
|
dec a
|
|
ld [hl], a
|
|
and $f
|
|
jr nz, .not_disabled
|
|
|
|
ld [hl], a
|
|
ld [EnemyDisabledMove], a
|
|
|
|
ld hl, DisabledNoMoreText
|
|
call StdBattleTextBox
|
|
|
|
.not_disabled
|
|
|
|
|
|
ld a, [EnemySubStatus3]
|
|
add a ; bit SUBSTATUS_CONFUSED
|
|
jr nc, .not_confused
|
|
|
|
ld hl, EnemyConfuseCount
|
|
dec [hl]
|
|
jr nz, .confused
|
|
|
|
ld hl, EnemySubStatus3
|
|
res SUBSTATUS_CONFUSED, [hl]
|
|
ld hl, ConfusedNoMoreText
|
|
call StdBattleTextBox
|
|
jr .not_confused
|
|
|
|
|
|
.confused
|
|
ld hl, IsConfusedText
|
|
call StdBattleTextBox
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
ld de, ANIM_CONFUSED
|
|
call FarPlayBattleAnimation
|
|
|
|
; 50% chance of hitting itself
|
|
call BattleRandom
|
|
cp $80
|
|
jr nc, .not_confused
|
|
|
|
; clear confusion-dependent substatus
|
|
ld hl, EnemySubStatus3
|
|
ld a, [hl]
|
|
and 1 << SUBSTATUS_CONFUSED
|
|
ld [hl], a
|
|
|
|
ld hl, HurtItselfText
|
|
call StdBattleTextBox
|
|
call Function355dd
|
|
call BattleCommand_DamageCalcWithStats
|
|
call BattleCommand0a
|
|
xor a
|
|
ld [wcfca], a
|
|
|
|
; Flicker the monster pic unless flying or underground.
|
|
ld de, ANIM_HIT_CONFUSION
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVar
|
|
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
|
|
call z, PlayFXAnimID
|
|
|
|
ld c, $1
|
|
call Function35d1c
|
|
call BattleCommand0c
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_confused
|
|
|
|
|
|
ld a, [EnemySubStatus1]
|
|
add a ; bit SUBSTATUS_ATTRACT
|
|
jr nc, .not_infatuated
|
|
|
|
ld hl, InLoveWithText
|
|
call StdBattleTextBox
|
|
xor a
|
|
ld [wcfca], a
|
|
ld de, ANIM_IN_LOVE
|
|
call FarPlayBattleAnimation
|
|
|
|
; 50% chance of infatuation
|
|
call BattleRandom
|
|
cp $80
|
|
jr c, .not_infatuated
|
|
|
|
ld hl, InfatuationText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.not_infatuated
|
|
|
|
|
|
; We can't disable a move that doesn't exist.
|
|
ld a, [EnemyDisabledMove]
|
|
and a
|
|
jr z, .no_disabled_move
|
|
|
|
; Are we using the disabled move?
|
|
ld hl, CurEnemyMove
|
|
cp [hl]
|
|
jr nz, .no_disabled_move
|
|
|
|
call MoveDisabled
|
|
|
|
call CantMove
|
|
jp Function34385
|
|
|
|
.no_disabled_move
|
|
|
|
|
|
ld hl, EnemyMonStatus
|
|
bit PAR, [hl]
|
|
ret z
|
|
|
|
; 25% chance to be fully paralyzed
|
|
call BattleRandom
|
|
cp $3f
|
|
ret nc
|
|
|
|
ld hl, FullyParalyzedText
|
|
call StdBattleTextBox
|
|
call CantMove
|
|
|
|
; fallthrough
|
|
; 34385
|
|
|
|
|
|
Function34385: ; 34385
|
|
ld a, $1
|
|
ld [wc6b4], a
|
|
jp ResetDamage
|
|
; 3438d
|
|
|
|
|
|
MoveDisabled: ; 3438d
|
|
|
|
; Make sure any charged moves fail
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_CHARGED, [hl]
|
|
|
|
ld a, BATTLE_VARS_MOVE
|
|
call GetBattleVar
|
|
ld [wd265], a
|
|
call GetMoveName
|
|
|
|
ld hl, DisabledMoveText
|
|
jp StdBattleTextBox
|
|
; 343a5
|
|
|
|
|
|
HitConfusion: ; 343a5
|
|
|
|
ld hl, HurtItselfText
|
|
call StdBattleTextBox
|
|
|
|
xor a
|
|
ld [CriticalHit], a
|
|
|
|
call Function355dd
|
|
call BattleCommand_DamageCalcWithStats
|
|
call BattleCommand0a
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
|
|
; Flicker the monster pic unless flying or underground.
|
|
ld de, ANIM_HIT_CONFUSION
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVar
|
|
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
|
|
call z, PlayFXAnimID
|
|
|
|
ld hl, UpdatePlayerHUD
|
|
call CallBattleCore
|
|
ld a, $1
|
|
ld [$ffd4], a
|
|
ld c, $1
|
|
call Function35d7e
|
|
jp BattleCommand0c
|
|
; 343db
|
|
|
|
|
|
BattleCommand02: ; 343db
|
|
; checkobedience
|
|
|
|
; Enemy can't disobey
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ret nz
|
|
|
|
call Function34548
|
|
ret nz
|
|
|
|
; If we've already checked this turn
|
|
ld a, [AlreadyDisobeyed]
|
|
and a
|
|
ret nz
|
|
|
|
xor a
|
|
ld [AlreadyDisobeyed], a
|
|
|
|
; No obedience in link battles
|
|
; (since no handling exists for enemy)
|
|
ld a, [wLinkMode]
|
|
and a
|
|
ret nz
|
|
|
|
ld a, [InBattleTowerBattle]
|
|
and a
|
|
ret nz
|
|
|
|
; If the monster's id doesn't match the player's,
|
|
; some conditions need to be met.
|
|
ld a, PartyMon1ID - PartyMon1
|
|
call BattlePartyAttr
|
|
|
|
ld a, [PlayerID]
|
|
cp [hl]
|
|
jr nz, .obeylevel
|
|
inc hl
|
|
ld a, [PlayerID + 1]
|
|
cp [hl]
|
|
ret z
|
|
|
|
|
|
.obeylevel
|
|
; The maximum obedience level is constrained by owned badges:
|
|
ld hl, JohtoBadges
|
|
|
|
; risingbadge
|
|
bit 7, [hl]
|
|
ld a, MAX_LEVEL + 1
|
|
jr nz, .getlevel
|
|
|
|
; stormbadge
|
|
bit 5, [hl]
|
|
ld a, 70
|
|
jr nz, .getlevel
|
|
|
|
; fogbadge
|
|
bit 3, [hl]
|
|
ld a, 50
|
|
jr nz, .getlevel
|
|
|
|
; hivebadge
|
|
bit 1, [hl]
|
|
ld a, 30
|
|
jr nz, .getlevel
|
|
|
|
; no badges
|
|
ld a, 10
|
|
|
|
|
|
.getlevel
|
|
; c = obedience level
|
|
; d = monster level
|
|
; b = c + d
|
|
|
|
ld b, a
|
|
ld c, a
|
|
|
|
ld a, [BattleMonLevel]
|
|
ld d, a
|
|
|
|
add b
|
|
ld b, a
|
|
|
|
; No overflow (this should never happen)
|
|
jr nc, .checklevel
|
|
ld b, $ff
|
|
|
|
|
|
.checklevel
|
|
; If the monster's level is lower than the obedience level, it will obey.
|
|
ld a, c
|
|
cp d
|
|
ret nc
|
|
|
|
|
|
; Random number from 0 to obedience level + monster level
|
|
.rand1
|
|
call BattleRandom
|
|
swap a
|
|
cp b
|
|
jr nc, .rand1
|
|
|
|
; The higher above the obedience level the monster is,
|
|
; the more likely it is to disobey.
|
|
cp c
|
|
ret c
|
|
|
|
; Sleep-only moves have separate handling, and a higher chance of
|
|
; being ignored. Lazy monsters like their sleep.
|
|
call IgnoreSleepOnly
|
|
ret c
|
|
|
|
|
|
; Another random number from 0 to obedience level + monster level
|
|
.rand2
|
|
call BattleRandom
|
|
cp b
|
|
jr nc, .rand2
|
|
|
|
; A second chance.
|
|
cp c
|
|
jr c, .UseInstead
|
|
|
|
|
|
; No hope of using a move now.
|
|
|
|
; b = number of levels the monster is above the obedience level
|
|
ld a, d
|
|
sub c
|
|
ld b, a
|
|
|
|
; The chance of napping is the difference out of 256.
|
|
call BattleRandom
|
|
swap a
|
|
sub b
|
|
jr c, .Nap
|
|
|
|
; The chance of not hitting itself is the same.
|
|
cp b
|
|
jr nc, .DoNothing
|
|
|
|
ld hl, WontObeyText
|
|
call StdBattleTextBox
|
|
call HitConfusion
|
|
jp .asm_3450c
|
|
|
|
|
|
.Nap
|
|
call BattleRandom
|
|
add a
|
|
swap a
|
|
and SLP
|
|
jr z, .Nap
|
|
|
|
ld [BattleMonStatus], a
|
|
|
|
ld hl, BeganToNapText
|
|
jr .Print
|
|
|
|
|
|
.DoNothing
|
|
call BattleRandom
|
|
and 3
|
|
|
|
ld hl, LoafingAroundText
|
|
and a
|
|
jr z, .Print
|
|
|
|
ld hl, WontObeyText
|
|
dec a
|
|
jr z, .Print
|
|
|
|
ld hl, TurnedAwayText
|
|
dec a
|
|
jr z, .Print
|
|
|
|
ld hl, IgnoredOrdersText
|
|
|
|
.Print
|
|
call StdBattleTextBox
|
|
jp .asm_3450c
|
|
|
|
|
|
.UseInstead
|
|
|
|
; Can't use another move if the monster only has one!
|
|
ld a, [BattleMonMoves + 1]
|
|
and a
|
|
jr z, .DoNothing
|
|
|
|
; Don't bother trying to handle Disable.
|
|
ld a, [DisabledMove]
|
|
and a
|
|
jr nz, .DoNothing
|
|
|
|
|
|
ld hl, BattleMonPP
|
|
ld de, BattleMonMoves
|
|
ld b, 0
|
|
ld c, NUM_MOVES
|
|
|
|
.GetTotalPP
|
|
ld a, [hli]
|
|
and $3f ; exclude pp up
|
|
add b
|
|
ld b, a
|
|
|
|
dec c
|
|
jr z, .CheckMovePP
|
|
|
|
; Stop at undefined moves.
|
|
inc de
|
|
ld a, [de]
|
|
and a
|
|
jr nz, .GetTotalPP
|
|
|
|
|
|
.CheckMovePP
|
|
ld hl, BattleMonPP
|
|
ld a, [CurMoveNum]
|
|
ld e, a
|
|
ld d, 0
|
|
add hl, de
|
|
|
|
; Can't use another move if only one move has PP.
|
|
ld a, [hl]
|
|
and $3f
|
|
cp b
|
|
jr z, .DoNothing
|
|
|
|
|
|
; Make sure we can actually use the move once we get there.
|
|
ld a, 1
|
|
ld [AlreadyDisobeyed], a
|
|
|
|
ld a, [wcfa3]
|
|
ld b, a
|
|
|
|
; Save the move we originally picked for afterward.
|
|
ld a, [CurMoveNum]
|
|
ld c, a
|
|
push af
|
|
|
|
|
|
.RandomMove
|
|
call BattleRandom
|
|
and 3 ; TODO NUM_MOVES
|
|
|
|
cp b
|
|
jr nc, .RandomMove
|
|
|
|
; Not the move we were trying to use.
|
|
cp c
|
|
jr z, .RandomMove
|
|
|
|
; Make sure it has PP.
|
|
ld [CurMoveNum], a
|
|
ld hl, BattleMonPP
|
|
ld e, a
|
|
ld d, 0
|
|
add hl, de
|
|
ld a, [hl]
|
|
and $3f
|
|
jr z, .RandomMove
|
|
|
|
|
|
; Use it.
|
|
ld a, [CurMoveNum]
|
|
ld c, a
|
|
ld b, 0
|
|
ld hl, BattleMonMoves
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld [CurPlayerMove], a
|
|
|
|
call SetPlayerTurn
|
|
call UpdateMoveData
|
|
call DoMove
|
|
|
|
|
|
; Restore original move choice.
|
|
pop af
|
|
ld [CurMoveNum], a
|
|
|
|
|
|
.asm_3450c
|
|
xor a
|
|
ld [LastPlayerMove], a
|
|
ld [LastEnemyCounterMove], a
|
|
|
|
; Break Encore too.
|
|
ld hl, PlayerSubStatus5
|
|
res SUBSTATUS_ENCORED, [hl]
|
|
xor a
|
|
ld [PlayerEncoreCount], a
|
|
|
|
jp EndMoveEffect
|
|
; 3451f
|
|
|
|
|
|
IgnoreSleepOnly: ; 3451f
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
|
|
cp SNORE
|
|
jr z, .CheckSleep
|
|
cp SLEEP_TALK
|
|
jr z, .CheckSleep
|
|
and a
|
|
ret
|
|
|
|
.CheckSleep
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVar
|
|
and SLP
|
|
ret z
|
|
|
|
; 'ignored orders…sleeping!'
|
|
ld hl, IgnoredSleepingText
|
|
call StdBattleTextBox
|
|
|
|
call EndMoveEffect
|
|
|
|
scf
|
|
ret
|
|
; 34541
|
|
|
|
|
|
BattleCommand03: ; 34541
|
|
; usedmovetext
|
|
callba DisplayUsedMoveText
|
|
ret
|
|
; 34548
|
|
|
|
|
|
Function34548: ; 34548
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [wc732] ; player
|
|
jr z, .end
|
|
ld a, [wc733] ; enemy
|
|
.end
|
|
and a
|
|
ret
|
|
; 34555
|
|
|
|
|
|
BattleCommand04: ; 34555
|
|
call Function34548
|
|
ret nz
|
|
|
|
ld hl, BattleMonPP
|
|
ld de, PlayerSubStatus3
|
|
ld bc, PlayerTurnsTaken
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .proceed
|
|
|
|
ld hl, EnemyMonPP
|
|
ld de, EnemySubStatus3
|
|
ld bc, EnemyTurnsTaken
|
|
|
|
.proceed
|
|
|
|
; If we've gotten this far, this counts as a turn.
|
|
ld a, [bc]
|
|
inc a
|
|
ld [bc], a
|
|
|
|
ld a, BATTLE_VARS_MOVE
|
|
call GetBattleVar
|
|
cp STRUGGLE
|
|
ret z
|
|
|
|
ld a, [de]
|
|
and 1 << SUBSTATUS_IN_LOOP | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE
|
|
ret nz
|
|
|
|
call .asm_345ad
|
|
ld a, b
|
|
and a
|
|
jp nz, EndMoveEffect
|
|
|
|
; SubStatus5
|
|
rept 2
|
|
inc de
|
|
endr
|
|
|
|
ld a, [de]
|
|
bit SUBSTATUS_TRANSFORMED, a
|
|
ret nz
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
|
|
ld hl, PartyMon1PP
|
|
ld a, [CurBattleMon]
|
|
jr z, .asm_345a4
|
|
|
|
; skip this part entirely if wildbattle
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr z, .asm_345c5
|
|
|
|
ld hl, OTPartyMon1PP
|
|
ld a, [CurOTMon]
|
|
|
|
.asm_345a4
|
|
call GetPartyLocation
|
|
push hl
|
|
call Function3460b
|
|
pop hl
|
|
ret c
|
|
|
|
.asm_345ad
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [CurMoveNum]
|
|
jr z, .asm_345b8
|
|
ld a, [CurEnemyMoveNum]
|
|
|
|
.asm_345b8
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and $3f
|
|
jr z, .asm_345e3
|
|
dec [hl]
|
|
ld b, 0
|
|
ret
|
|
|
|
.asm_345c5
|
|
ld hl, EnemyMonMoves
|
|
ld a, [CurEnemyMoveNum]
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp MIMIC
|
|
jr z, .asm_345dc
|
|
ld hl, wc735
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp MIMIC
|
|
ret z
|
|
|
|
.asm_345dc
|
|
ld hl, wc739
|
|
call .asm_345ad
|
|
ret
|
|
|
|
.asm_345e3
|
|
call BattleCommandaa
|
|
; get move effect
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
; continuous?
|
|
ld hl, .continuousmoves
|
|
ld de, 1
|
|
call IsInArray
|
|
|
|
; 'has no pp left for [move]'
|
|
ld hl, HasNoPPLeftText
|
|
jr c, .print
|
|
; 'but no pp is left for the move'
|
|
ld hl, NoPPLeftText
|
|
.print
|
|
call StdBattleTextBox
|
|
ld b, 1
|
|
ret
|
|
; 34602
|
|
|
|
.continuousmoves ; 34602
|
|
db EFFECT_RAZOR_WIND
|
|
db EFFECT_SKY_ATTACK
|
|
db EFFECT_SKULL_BASH
|
|
db EFFECT_SOLARBEAM
|
|
db EFFECT_FLY
|
|
db EFFECT_ROLLOUT
|
|
db EFFECT_BIDE
|
|
db EFFECT_RAMPAGE
|
|
db $ff
|
|
; 3460b
|
|
|
|
Function3460b: ; 3460b
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [CurMoveNum]
|
|
jr z, .asm_34616
|
|
ld a, [CurEnemyMoveNum]
|
|
|
|
.asm_34616
|
|
ld c, a
|
|
ld a, 2
|
|
call UserPartyAttr
|
|
|
|
ld a, BATTLE_VARS_MOVE
|
|
call GetBattleVar
|
|
cp MIMIC
|
|
jr z, .asm_3462f
|
|
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp MIMIC
|
|
jr nz, .asm_3462f
|
|
|
|
scf
|
|
ret
|
|
|
|
.asm_3462f
|
|
and a
|
|
ret
|
|
; 34631
|
|
|
|
|
|
BattleCommand05: ; 34631
|
|
; critical
|
|
|
|
; Determine whether this attack's hit will be critical.
|
|
|
|
xor a
|
|
ld [CriticalHit], a
|
|
|
|
ld a, BATTLE_VARS_MOVE_POWER
|
|
call GetBattleVar
|
|
and a
|
|
ret z
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld hl, EnemyMonItem
|
|
ld a, [EnemyMonSpecies]
|
|
jr nz, .Item
|
|
ld hl, BattleMonItem
|
|
ld a, [BattleMonSpecies]
|
|
|
|
.Item
|
|
ld c, 0
|
|
|
|
cp CHANSEY
|
|
jr nz, .Farfetchd
|
|
ld a, [hl]
|
|
cp LUCKY_PUNCH
|
|
jr nz, .FocusEnergy
|
|
|
|
; +2 critical level
|
|
ld c, 2
|
|
jr .Tally
|
|
|
|
.Farfetchd
|
|
cp FARFETCH_D
|
|
jr nz, .FocusEnergy
|
|
ld a, [hl]
|
|
cp STICK
|
|
jr nz, .FocusEnergy
|
|
|
|
; +2 critical level
|
|
ld c, 2
|
|
jr .Tally
|
|
|
|
.FocusEnergy
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVar
|
|
bit SUBSTATUS_FOCUS_ENERGY, a
|
|
jr z, .CheckCritical
|
|
|
|
; +1 critical level
|
|
inc c
|
|
|
|
.CheckCritical
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld de, 1
|
|
ld hl, .Criticals
|
|
push bc
|
|
call IsInArray
|
|
pop bc
|
|
jr nc, .ScopeLens
|
|
|
|
; +2 critical level
|
|
rept 2
|
|
inc c
|
|
endr
|
|
|
|
.ScopeLens
|
|
push bc
|
|
call GetUserItem
|
|
ld a, b
|
|
cp HELD_CRITICAL_UP ; Increased critical chance. Only Scope Lens has this.
|
|
pop bc
|
|
jr nz, .Tally
|
|
|
|
; +1 critical level
|
|
inc c
|
|
|
|
.Tally
|
|
ld hl, .Chances
|
|
ld b, 0
|
|
add hl, bc
|
|
call BattleRandom
|
|
cp [hl]
|
|
ret nc
|
|
ld a, 1
|
|
ld [CriticalHit], a
|
|
ret
|
|
|
|
.Criticals
|
|
db KARATE_CHOP, RAZOR_WIND, RAZOR_LEAF, CRABHAMMER, SLASH, AEROBLAST, CROSS_CHOP, $ff
|
|
.Chances
|
|
; 6.25% 12.1% 24.6% 33.2% 49.6% 49.6% 49.6%
|
|
db $11, $20, $40, $55, $80, $80, $80
|
|
; 0 1 2 3 4 5 6
|
|
; 346b2
|
|
|
|
|
|
BattleCommand4e: ; 346b2
|
|
; triplekick
|
|
|
|
ld a, [wc689]
|
|
ld b, a
|
|
inc b
|
|
ld hl, CurDamage + 1
|
|
ld a, [hld]
|
|
ld e, a
|
|
ld a, [hli]
|
|
ld d, a
|
|
.asm_346be
|
|
dec b
|
|
ret z
|
|
ld a, [hl]
|
|
add e
|
|
ld [hld], a
|
|
ld a, [hl]
|
|
adc d
|
|
ld [hli], a
|
|
|
|
; No overflow.
|
|
jr nc, .asm_346be
|
|
ld a, $ff
|
|
ld [hld], a
|
|
ld [hl], a
|
|
ret
|
|
; 346cd
|
|
|
|
|
|
BattleCommand4f: ; 346cd
|
|
; kickcounter
|
|
|
|
ld hl, wc689
|
|
inc [hl]
|
|
ret
|
|
; 346d2
|
|
|
|
|
|
BattleCommand_CalcDamageTypeMultiplier: ; 346d2
|
|
; STAB = Same Type Attack Bonus
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
cp STRUGGLE
|
|
ret z
|
|
|
|
ld hl, BattleMonType1
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
ld hl, EnemyMonType1
|
|
ld a, [hli]
|
|
ld d, a
|
|
ld e, [hl]
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .go ; Who Attacks and who Defends
|
|
|
|
ld hl, EnemyMonType1
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
ld hl, BattleMonType1
|
|
ld a, [hli]
|
|
ld d, a
|
|
ld e, [hl]
|
|
|
|
.go
|
|
ld a, BATTLE_VARS_MOVE_TYPE
|
|
call GetBattleVarAddr
|
|
ld [wd265], a
|
|
|
|
push hl
|
|
push de
|
|
push bc
|
|
callba DoWeatherModifiers
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
|
|
push de
|
|
push bc
|
|
callba DoBadgeTypeBoosts
|
|
pop bc
|
|
pop de
|
|
|
|
ld a, [wd265]
|
|
cp b
|
|
jr z, .stab
|
|
cp c
|
|
jr z, .stab
|
|
|
|
jr .SkipStab
|
|
|
|
.stab
|
|
ld hl, CurDamage + 1
|
|
ld a, [hld]
|
|
ld h, [hl]
|
|
ld l, a
|
|
|
|
ld b, h
|
|
ld c, l
|
|
srl b
|
|
rr c
|
|
add hl, bc
|
|
|
|
ld a, h
|
|
ld [CurDamage], a
|
|
ld a, l
|
|
ld [CurDamage + 1], a
|
|
|
|
ld hl, TypeModifier
|
|
set 7, [hl]
|
|
|
|
.SkipStab
|
|
ld a, BATTLE_VARS_MOVE_TYPE
|
|
call GetBattleVar
|
|
ld b, a
|
|
ld hl, TypeMatchup
|
|
|
|
.TypesLoop
|
|
ld a, [hli]
|
|
|
|
cp $ff
|
|
jr z, .end
|
|
|
|
; foresight
|
|
cp $fe
|
|
jr nz, .SkipForesightCheck
|
|
ld a, BATTLE_VARS_SUBSTATUS1_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_IDENTIFIED, a
|
|
jr nz, .end
|
|
|
|
jr .TypesLoop
|
|
|
|
.SkipForesightCheck
|
|
cp b
|
|
jr nz, .SkipType
|
|
ld a, [hl]
|
|
cp d
|
|
jr z, .GotMatchup
|
|
cp e
|
|
jr z, .GotMatchup
|
|
jr .SkipType
|
|
|
|
.GotMatchup
|
|
push hl
|
|
push bc
|
|
inc hl
|
|
ld a, [TypeModifier]
|
|
and %10000000
|
|
ld b, a
|
|
; If the target is immune to the move, treat it as a miss and calculate the damage as 0
|
|
ld a, [hl]
|
|
and a
|
|
jr nz, .NotImmune
|
|
inc a
|
|
ld [AttackMissed], a
|
|
xor a
|
|
.NotImmune
|
|
ld [hMultiplier], a
|
|
add b
|
|
ld [TypeModifier], a
|
|
|
|
xor a
|
|
ld [hMultiplicand + 0], a
|
|
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
ld [hMultiplicand + 1], a
|
|
ld a, [hld]
|
|
ld [hMultiplicand + 2], a
|
|
|
|
call Multiply
|
|
|
|
ld a, [hProduct + 1]
|
|
ld b, a
|
|
ld a, [hProduct + 2]
|
|
or b
|
|
ld b, a
|
|
ld a, [hProduct + 3]
|
|
or b
|
|
jr z, .ok ; This is a very convoluted way to get back that we've essentially dealt no damage.
|
|
|
|
; Take the product and divide it by 10.
|
|
ld a, 10
|
|
ld [hDivisor], a
|
|
ld b, 4
|
|
call Divide
|
|
ld a, [hQuotient + 1]
|
|
ld b, a
|
|
ld a, [hQuotient + 2]
|
|
or b
|
|
jr nz, .ok
|
|
|
|
ld a, 1
|
|
ld [hMultiplicand + 2], a
|
|
|
|
.ok
|
|
ld a, [hMultiplicand + 1]
|
|
ld [hli], a
|
|
ld a, [hMultiplicand + 2]
|
|
ld [hl], a
|
|
pop bc
|
|
pop hl
|
|
|
|
.SkipType
|
|
rept 2
|
|
inc hl
|
|
endr
|
|
jr .TypesLoop
|
|
|
|
.end
|
|
call HowEffectiveIsTheMovetypeAgainstTheEnemyPkmn
|
|
ld a, [wd265]
|
|
ld b, a
|
|
ld a, [TypeModifier]
|
|
and $80
|
|
or b
|
|
ld [TypeModifier], a
|
|
ret
|
|
; 347c8
|
|
|
|
|
|
HowEffectiveIsTheMovetypeAgainstTheEnemyPkmn: ; 347c8
|
|
ld hl, EnemyMonType1
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, Function347d3
|
|
ld hl, BattleMonType1
|
|
|
|
; fallthrough
|
|
; 347d3
|
|
|
|
|
|
Function347d3: ; 347d3
|
|
push hl
|
|
push de
|
|
push bc
|
|
ld a, BATTLE_VARS_MOVE_TYPE
|
|
call GetBattleVar
|
|
ld d, a
|
|
ld b, [hl]
|
|
inc hl
|
|
ld c, [hl]
|
|
ld a, 10 ; 1.0
|
|
ld [wd265], a
|
|
ld hl, TypeMatchup
|
|
.TypesLoop
|
|
ld a, [hli]
|
|
cp $ff
|
|
jr z, .End
|
|
cp $fe
|
|
jr nz, .Next
|
|
ld a, BATTLE_VARS_SUBSTATUS1_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_IDENTIFIED, a
|
|
jr nz, .End
|
|
jr .TypesLoop
|
|
.Next
|
|
cp d
|
|
jr nz, .Nope
|
|
ld a, [hli]
|
|
cp b
|
|
jr z, .Yup
|
|
cp c
|
|
jr z, .Yup
|
|
jr .Nope2
|
|
.Nope
|
|
inc hl
|
|
.Nope2
|
|
inc hl
|
|
jr .TypesLoop
|
|
.Yup
|
|
xor a
|
|
ld [hDividend + 0], a
|
|
ld [hMultiplicand + 0], a
|
|
ld [hMultiplicand + 1], a
|
|
ld a, [hli]
|
|
ld [hMultiplicand + 2], a
|
|
ld a, [wd265]
|
|
ld [hMultiplier], a
|
|
call Multiply
|
|
ld a, 10
|
|
ld [hDivisor], a
|
|
push bc
|
|
ld b, 4
|
|
call Divide
|
|
pop bc
|
|
ld a, [hQuotient + 2]
|
|
ld [wd265], a
|
|
jr .TypesLoop
|
|
|
|
.End
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
; 34833
|
|
|
|
|
|
BattleCommanda3: ; 34833
|
|
call HowEffectiveIsTheMovetypeAgainstTheEnemyPkmn
|
|
ld a, [wd265]
|
|
and a
|
|
ld a, 10 ; 1.0
|
|
jr nz, .skip
|
|
call ResetDamage
|
|
xor a
|
|
ld [TypeModifier], a
|
|
inc a
|
|
ld [AttackMissed], a
|
|
ret
|
|
.skip
|
|
ld [wd265], a
|
|
ret
|
|
; 3484e
|
|
|
|
|
|
Function3484e: ; 3484e
|
|
push hl
|
|
push de
|
|
push bc
|
|
ld a, 10
|
|
ld [wc716], a
|
|
ld hl, PlayerUsedMoves
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .unknown_moves
|
|
|
|
ld d, NUM_MOVES
|
|
ld e, 0
|
|
.loop
|
|
ld a, [hli]
|
|
and a
|
|
jr z, .exit
|
|
push hl
|
|
dec a
|
|
ld hl, Moves + MOVE_POWER
|
|
call GetMoveAttr
|
|
and a
|
|
jr z, .next
|
|
|
|
inc hl
|
|
call GetMoveByte
|
|
ld hl, EnemyMonType
|
|
call Function347d3
|
|
ld a, [wd265]
|
|
cp 10 + 1 ; 1.0 + 0.1
|
|
jr nc, .super_effective
|
|
and a
|
|
jr z, .next
|
|
cp 10 ; 1.0
|
|
jr nc, .neutral
|
|
|
|
.not_very_effective
|
|
ld a, e
|
|
cp 1 ; 0.1
|
|
jr nc, .next
|
|
ld e, 1
|
|
jr .next
|
|
|
|
.neutral
|
|
ld e, 2
|
|
jr .next
|
|
|
|
.super_effective
|
|
call Function34931
|
|
pop hl
|
|
jr .done
|
|
|
|
.next
|
|
pop hl
|
|
dec d
|
|
jr nz, .loop
|
|
|
|
.exit
|
|
ld a, e
|
|
cp 2
|
|
jr z, .done
|
|
call Function34939
|
|
ld a, e
|
|
and a
|
|
jr nz, .done
|
|
call Function34939
|
|
jr .done
|
|
|
|
.unknown_moves
|
|
ld a, [BattleMonType1]
|
|
ld b, a
|
|
ld hl, EnemyMonType1
|
|
call Function347d3
|
|
ld a, [wd265]
|
|
cp 10 + 1 ; 1.0 + 0.1
|
|
jr c, .ok
|
|
call Function34931
|
|
.ok
|
|
ld a, [BattleMonType2]
|
|
cp b
|
|
jr z, .ok2
|
|
call Function347d3
|
|
ld a, [wd265]
|
|
cp 10 + 1 ; 1.0 + 0.1
|
|
jr c, .ok2
|
|
call Function34931
|
|
.ok2
|
|
|
|
.done
|
|
call Function348de
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
; 348de
|
|
|
|
|
|
Function348de: ; 348de
|
|
ld de, EnemyMonMoves
|
|
ld b, NUM_MOVES + 1
|
|
ld c, 0
|
|
|
|
ld a, [wd265]
|
|
push af
|
|
.loop
|
|
dec b
|
|
jr z, .exit
|
|
|
|
ld a, [de]
|
|
and a
|
|
jr z, .exit
|
|
|
|
inc de
|
|
dec a
|
|
ld hl, Moves + MOVE_POWER
|
|
call GetMoveAttr
|
|
and a
|
|
jr z, .loop
|
|
|
|
inc hl
|
|
call GetMoveByte
|
|
ld hl, BattleMonType1
|
|
call Function347d3
|
|
|
|
ld a, [wd265]
|
|
; immune
|
|
and a
|
|
jr z, .loop
|
|
|
|
; not very effective
|
|
inc c
|
|
cp 10
|
|
jr c, .loop
|
|
|
|
; neutral
|
|
rept 5
|
|
inc c
|
|
endr
|
|
cp 10
|
|
jr z, .loop
|
|
|
|
; super effective
|
|
ld c, 100
|
|
jr .loop
|
|
|
|
.exit
|
|
pop af
|
|
ld [wd265], a
|
|
|
|
ld a, c
|
|
and a
|
|
jr z, .doubledown ; double down
|
|
cp 5
|
|
jr c, Function34931 ; down
|
|
cp 100
|
|
ret c
|
|
jr Function34939 ; up
|
|
|
|
.doubledown
|
|
call Function34931
|
|
|
|
; fallthrough
|
|
; 34931
|
|
|
|
|
|
Function34931: ; 34931
|
|
ld a, [wc716]
|
|
dec a
|
|
ld [wc716], a
|
|
ret
|
|
; 34939
|
|
|
|
|
|
Function34939: ; 34939
|
|
ld a, [wc716]
|
|
inc a
|
|
ld [wc716], a
|
|
ret
|
|
; 34941
|
|
|
|
|
|
Function34941: ; 34941
|
|
xor a
|
|
ld [wc717], a
|
|
call CountEnemyAliveMons
|
|
ret c
|
|
|
|
ld a, [EnemySubStatus1]
|
|
bit SUBSTATUS_PERISH, a
|
|
jr z, .no_perish
|
|
|
|
ld a, [EnemyPerishCount]
|
|
cp 1
|
|
jr nz, .no_perish
|
|
|
|
; Perish count is 1
|
|
|
|
call CountEnemyAliveMons
|
|
call Function34b77
|
|
call Function34b20
|
|
call Function34a85
|
|
|
|
ld a, e
|
|
cp 2
|
|
jr nz, .asm_34971
|
|
|
|
ld a, [wc716]
|
|
add $30
|
|
ld [wc717], a
|
|
ret
|
|
|
|
.asm_34971
|
|
call CountEnemyAliveMons
|
|
sla c
|
|
sla c
|
|
ld b, $ff
|
|
|
|
.asm_3497a
|
|
inc b
|
|
sla c
|
|
jr nc, .asm_3497a
|
|
|
|
ld a, b
|
|
add $30
|
|
ld [wc717], a
|
|
ret
|
|
|
|
.no_perish
|
|
|
|
call Function3484e
|
|
ld a, [wc716]
|
|
cp 11
|
|
ret nc
|
|
|
|
ld a, [LastEnemyCounterMove]
|
|
and a
|
|
jr z, .asm_349d2
|
|
|
|
call Function34a2a
|
|
ld a, [wc716]
|
|
and a
|
|
jr z, .asm_349d2
|
|
|
|
ld c, a
|
|
call Function34aa7
|
|
ld a, [wc716]
|
|
cp $ff
|
|
ret z
|
|
|
|
ld b, a
|
|
ld a, e
|
|
cp 2
|
|
jr z, .asm_349be
|
|
|
|
call Function3484e
|
|
ld a, [wc716]
|
|
cp 10
|
|
ret nc
|
|
|
|
ld a, b
|
|
add $10
|
|
ld [wc717], a
|
|
ret
|
|
|
|
.asm_349be
|
|
ld c, $10
|
|
call Function3484e
|
|
ld a, [wc716]
|
|
cp 10
|
|
jr nc, .asm_349cc
|
|
ld c, $20
|
|
|
|
.asm_349cc
|
|
ld a, b
|
|
add c
|
|
ld [wc717], a
|
|
ret
|
|
|
|
.asm_349d2
|
|
call Function3484e
|
|
ld a, [wc716]
|
|
cp 10
|
|
ret nc
|
|
|
|
call CountEnemyAliveMons
|
|
call Function34b77
|
|
call Function34b20
|
|
call Function34a85
|
|
|
|
ld a, e
|
|
cp $2
|
|
ret nz
|
|
|
|
ld a, [wc716]
|
|
add $10
|
|
ld [wc717], a
|
|
ret
|
|
; 349f4
|
|
|
|
|
|
CountEnemyAliveMons: ; 349f4
|
|
ld a, [OTPartyCount]
|
|
cp 2
|
|
jr c, .only_one
|
|
|
|
ld d, a
|
|
ld e, 0
|
|
ld b, 1 << (PARTY_LENGTH - 1)
|
|
ld c, 0
|
|
ld hl, OTPartyMon1HP
|
|
|
|
.loop
|
|
ld a, [CurOTMon]
|
|
cp e
|
|
jr z, .next
|
|
|
|
push bc
|
|
ld b, [hl]
|
|
inc hl
|
|
ld a, [hld]
|
|
or b
|
|
pop bc
|
|
jr z, .next
|
|
|
|
ld a, c
|
|
or b
|
|
ld c, a
|
|
|
|
.next
|
|
srl b
|
|
push bc
|
|
ld bc, PartyMon2 - PartyMon1
|
|
add hl, bc
|
|
pop bc
|
|
inc e
|
|
dec d
|
|
jr nz, .loop
|
|
|
|
ld a, c
|
|
and a
|
|
jr nz, .more_than_one
|
|
|
|
.only_one
|
|
scf
|
|
ret
|
|
|
|
.more_than_one
|
|
and a
|
|
ret
|
|
; 34a2a
|
|
|
|
|
|
Function34a2a: ; 34a2a
|
|
ld hl, OTPartyMon1
|
|
ld a, [OTPartyCount]
|
|
ld b, a
|
|
ld c, 1 << (PARTY_LENGTH - 1)
|
|
ld d, 0
|
|
xor a
|
|
ld [wc716], a
|
|
|
|
.asm_34a39
|
|
ld a, [CurOTMon]
|
|
cp d
|
|
push hl
|
|
jr z, .asm_34a77
|
|
|
|
push hl
|
|
push bc
|
|
ld bc, PartyMon1HP - PartyMon1
|
|
add hl, bc
|
|
pop bc
|
|
ld a, [hli]
|
|
or [hl]
|
|
pop hl
|
|
jr z, .asm_34a77
|
|
|
|
ld a, [hl]
|
|
ld [CurSpecies], a
|
|
call GetBaseData
|
|
ld a, [LastEnemyCounterMove]
|
|
dec a
|
|
ld hl, Moves + MOVE_POWER
|
|
call GetMoveAttr
|
|
and a
|
|
jr z, .asm_34a77
|
|
|
|
inc hl
|
|
call GetMoveByte
|
|
ld hl, BaseType
|
|
call Function347d3
|
|
ld a, [wd265]
|
|
and a
|
|
jr nz, .asm_34a77
|
|
|
|
ld a, [wc716]
|
|
or c
|
|
ld [wc716], a
|
|
.asm_34a77
|
|
pop hl
|
|
dec b
|
|
ret z
|
|
|
|
push bc
|
|
ld bc, PartyMon2 - PartyMon1
|
|
add hl, bc
|
|
pop bc
|
|
|
|
inc d
|
|
srl c
|
|
jr .asm_34a39
|
|
; 34a85
|
|
|
|
|
|
Function34a85: ; 34a85
|
|
push bc
|
|
ld a, [OTPartyCount]
|
|
ld e, a
|
|
ld hl, OTPartyMon1HP
|
|
ld b, 1 << (PARTY_LENGTH - 1)
|
|
ld c, 0
|
|
.asm_34a91
|
|
ld a, [hli]
|
|
or [hl]
|
|
jr z, .asm_34a98
|
|
|
|
ld a, b
|
|
or c
|
|
ld c, a
|
|
|
|
.asm_34a98
|
|
srl b
|
|
push bc
|
|
ld bc, PartyMon2HP - (PartyMon1HP + 1)
|
|
add hl, bc
|
|
pop bc
|
|
dec e
|
|
jr nz, .asm_34a91
|
|
|
|
ld a, c
|
|
pop bc
|
|
|
|
and c
|
|
ld c, a
|
|
|
|
; fallthrough
|
|
; 34aa7
|
|
|
|
Function34aa7: ; 34aa7
|
|
|
|
ld a, $ff
|
|
ld [wc716], a
|
|
ld hl, OTPartyMon1Moves
|
|
ld b, 1 << (PARTY_LENGTH - 1)
|
|
ld d, 0
|
|
ld e, 0
|
|
.asm_34ab5
|
|
ld a, b
|
|
and c
|
|
jr z, .asm_34b00
|
|
|
|
push hl
|
|
push bc
|
|
ld b, NUM_MOVES
|
|
ld c, 0
|
|
.asm_34abf
|
|
ld a, [hli]
|
|
and a
|
|
push hl
|
|
jr z, .asm_34aef
|
|
|
|
dec a
|
|
ld hl, Moves + MOVE_POWER
|
|
call GetMoveAttr
|
|
and a
|
|
jr z, .asm_34ae9
|
|
|
|
inc hl
|
|
call GetMoveByte
|
|
ld hl, BattleMonType1
|
|
call Function347d3
|
|
ld a, [wd265]
|
|
cp 10
|
|
jr c, .asm_34ae9
|
|
|
|
ld e, 1
|
|
cp 11
|
|
jr c, .asm_34ae9
|
|
|
|
ld e, 2
|
|
jr .asm_34aef
|
|
|
|
.asm_34ae9
|
|
pop hl
|
|
dec b
|
|
jr nz, .asm_34abf
|
|
|
|
jr .asm_34af0
|
|
|
|
.asm_34aef
|
|
pop hl
|
|
.asm_34af0
|
|
ld a, e
|
|
pop bc
|
|
pop hl
|
|
cp $2
|
|
jr z, .asm_34b0e
|
|
|
|
cp $1
|
|
jr nz, .asm_34b00
|
|
|
|
ld a, d
|
|
or b
|
|
ld d, a
|
|
jr .asm_34b00
|
|
|
|
.asm_34b00
|
|
push bc
|
|
ld bc, PartyMon2 - PartyMon1
|
|
add hl, bc
|
|
pop bc
|
|
srl b
|
|
jr nc, .asm_34ab5
|
|
|
|
ld a, d
|
|
ld b, a
|
|
and a
|
|
ret z
|
|
|
|
.asm_34b0e
|
|
push bc
|
|
sla b
|
|
sla b
|
|
ld c, $ff
|
|
.asm_34b15
|
|
inc c
|
|
sla b
|
|
jr nc, .asm_34b15
|
|
|
|
ld a, c
|
|
ld [wc716], a
|
|
pop bc
|
|
ret
|
|
; 34b20
|
|
|
|
|
|
Function34b20: ; 34b20
|
|
push bc
|
|
ld hl, OTPartySpecies
|
|
ld b, 1 << (PARTY_LENGTH - 1)
|
|
ld c, 0
|
|
|
|
.asm_34b28
|
|
ld a, [hli]
|
|
cp $ff
|
|
jr z, .asm_34b72
|
|
|
|
push hl
|
|
ld [CurSpecies], a
|
|
call GetBaseData
|
|
ld a, [LastEnemyCounterMove]
|
|
and a
|
|
jr z, .asm_34b4a
|
|
|
|
dec a
|
|
ld hl, Moves + MOVE_POWER
|
|
call GetMoveAttr
|
|
and a
|
|
jr z, .asm_34b4a
|
|
|
|
inc hl
|
|
call GetMoveByte
|
|
jr .asm_34b5d
|
|
|
|
.asm_34b4a
|
|
ld a, [BattleMonType1]
|
|
ld hl, BaseType
|
|
call Function347d3
|
|
ld a, [wd265]
|
|
cp $b
|
|
jr nc, .asm_34b6d
|
|
ld a, [BattleMonType2]
|
|
|
|
.asm_34b5d
|
|
ld hl, BaseType
|
|
call Function347d3
|
|
ld a, [wd265]
|
|
cp $b
|
|
jr nc, .asm_34b6d
|
|
|
|
ld a, b
|
|
or c
|
|
ld c, a
|
|
|
|
.asm_34b6d
|
|
srl b
|
|
pop hl
|
|
jr .asm_34b28
|
|
|
|
.asm_34b72
|
|
ld a, c
|
|
pop bc
|
|
and c
|
|
ld c, a
|
|
ret
|
|
; 34b77
|
|
|
|
|
|
Function34b77: ; 34b77
|
|
push bc
|
|
ld de, OTPartySpecies
|
|
ld b, 1 << (PARTY_LENGTH - 1)
|
|
ld c, 0
|
|
ld hl, OTPartyMon1HP
|
|
|
|
.loop
|
|
ld a, [de]
|
|
inc de
|
|
cp $ff
|
|
jr z, .done
|
|
|
|
push hl
|
|
push bc
|
|
ld b, [hl]
|
|
inc hl
|
|
ld c, [hl]
|
|
rept 2
|
|
inc hl
|
|
endr
|
|
srl c
|
|
rl b
|
|
srl c
|
|
rl b
|
|
ld a, [hld]
|
|
cp c
|
|
ld a, [hl]
|
|
sbc b
|
|
pop bc
|
|
jr nc, .next
|
|
|
|
ld a, b
|
|
or c
|
|
ld c, a
|
|
|
|
.next
|
|
srl b
|
|
pop hl
|
|
push bc
|
|
ld bc, PartyMon2 - PartyMon1
|
|
add hl, bc
|
|
pop bc
|
|
jr .loop
|
|
|
|
.done
|
|
ld a, c
|
|
pop bc
|
|
and c
|
|
ld c, a
|
|
ret
|
|
; 34bb1
|
|
|
|
|
|
TypeMatchup: ; 34bb1
|
|
INCLUDE "battle/type_matchup.asm"
|
|
; 34cfd
|
|
|
|
|
|
BattleCommand08: ; 34cfd
|
|
; damagevariation
|
|
|
|
; Modify the damage spread between 85% and 100%.
|
|
|
|
; Because of the method of division the probability distribution
|
|
; is not consistent. This makes the highest damage multipliers
|
|
; rarer than normal.
|
|
|
|
|
|
; No point in reducing 1 or 0 damage.
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
and a
|
|
jr nz, .go
|
|
ld a, [hl]
|
|
cp 2
|
|
ret c
|
|
|
|
.go
|
|
; Start with the maximum damage.
|
|
xor a
|
|
ld [hMultiplicand + 0], a
|
|
dec hl
|
|
ld a, [hli]
|
|
ld [hMultiplicand + 1], a
|
|
ld a, [hl]
|
|
ld [hMultiplicand + 2], a
|
|
|
|
; Multiply by 85-100%...
|
|
.loop
|
|
call BattleRandom
|
|
rrca
|
|
cp $d9 ; 85%
|
|
jr c, .loop
|
|
|
|
ld [hMultiplier], a
|
|
call Multiply
|
|
|
|
; ...divide by 100%...
|
|
ld a, $ff ; 100%
|
|
ld [hDivisor], a
|
|
ld b, $4
|
|
call Divide
|
|
|
|
; ...to get .85-1.00x damage.
|
|
ld a, [hQuotient + 1]
|
|
ld hl, CurDamage
|
|
ld [hli], a
|
|
ld a, [hQuotient + 2]
|
|
ld [hl], a
|
|
ret
|
|
; 34d32
|
|
|
|
|
|
BattleCommand09: ; 34d32
|
|
; checkhit
|
|
|
|
call .DreamEater
|
|
jp z, .Miss
|
|
|
|
call .Protect
|
|
jp nz, .Miss
|
|
|
|
call .DrainSub
|
|
jp z, .Miss
|
|
|
|
call .LockOn
|
|
ret nz
|
|
|
|
call .FlyDigMoves
|
|
jp nz, .Miss
|
|
|
|
call .ThunderRain
|
|
ret z
|
|
|
|
call .XAccuracy
|
|
ret nz
|
|
|
|
; Perfect-accuracy moves
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_ALWAYS_HIT
|
|
ret z
|
|
|
|
call .StatModifiers
|
|
|
|
ld a, [wPlayerMoveStruct + MOVE_ACC]
|
|
ld b, a
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .BrightPowder
|
|
ld a, [wEnemyMoveStruct + MOVE_ACC]
|
|
ld b, a
|
|
|
|
.BrightPowder
|
|
push bc
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_BRIGHTPOWDER
|
|
ld a, c ; % miss
|
|
pop bc
|
|
jr nz, .asm_34d81
|
|
|
|
ld c, a
|
|
ld a, b
|
|
sub c
|
|
ld b, a
|
|
jr nc, .asm_34d81
|
|
ld b, 0
|
|
|
|
.asm_34d81
|
|
ld a, b
|
|
cp $ff
|
|
jr z, .Hit
|
|
|
|
call BattleRandom
|
|
cp b
|
|
jr nc, .Miss
|
|
|
|
.Hit
|
|
ret
|
|
|
|
|
|
.Miss
|
|
; Keep the damage value intact if we're using (Hi) Jump Kick.
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_JUMP_KICK
|
|
jr z, .Missed
|
|
call ResetDamage
|
|
|
|
.Missed
|
|
ld a, 1
|
|
ld [AttackMissed], a
|
|
ret
|
|
|
|
|
|
.DreamEater
|
|
; Return z if we're trying to eat the dream of
|
|
; a monster that isn't sleeping.
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_DREAM_EATER
|
|
ret nz
|
|
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVar
|
|
and SLP
|
|
ret
|
|
|
|
|
|
.Protect
|
|
; Return nz if the opponent is protected.
|
|
ld a, BATTLE_VARS_SUBSTATUS1_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_PROTECT, a
|
|
ret z
|
|
|
|
ld c, 40
|
|
call DelayFrames
|
|
|
|
; 'protecting itself!'
|
|
ld hl, ProtectingItselfText
|
|
call StdBattleTextBox
|
|
|
|
ld c, 40
|
|
call DelayFrames
|
|
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
|
|
|
|
.LockOn
|
|
; Return nz if we are locked-on and aren't trying to use Earthquake,
|
|
; Fissure or Magnitude on a monster that is flying.
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_LOCK_ON, [hl]
|
|
res SUBSTATUS_LOCK_ON, [hl]
|
|
ret z
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_FLYING, a
|
|
jr z, .LockedOn
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
|
|
cp EARTHQUAKE
|
|
ret z
|
|
cp FISSURE
|
|
ret z
|
|
cp MAGNITUDE
|
|
ret z
|
|
|
|
.LockedOn
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
|
|
|
|
.DrainSub
|
|
; Return z if using an HP drain move on a substitute.
|
|
call CheckSubstituteOpp
|
|
jr z, .asm_34e00
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
|
|
cp EFFECT_LEECH_HIT
|
|
ret z
|
|
cp EFFECT_DREAM_EATER
|
|
ret z
|
|
|
|
.asm_34e00
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
|
|
|
|
.FlyDigMoves
|
|
; Check for moves that can hit underground/flying opponents.
|
|
; Return z if the current move can hit the opponent.
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVar
|
|
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
|
|
ret z
|
|
|
|
bit SUBSTATUS_FLYING, a
|
|
jr z, .DigMoves
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
|
|
cp GUST
|
|
ret z
|
|
cp WHIRLWIND
|
|
ret z
|
|
cp THUNDER
|
|
ret z
|
|
cp TWISTER
|
|
ret
|
|
|
|
.DigMoves
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
|
|
cp EARTHQUAKE
|
|
ret z
|
|
cp FISSURE
|
|
ret z
|
|
cp MAGNITUDE
|
|
ret
|
|
|
|
|
|
.ThunderRain
|
|
; Return z if the current move always hits in rain, and it is raining.
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_THUNDER
|
|
ret nz
|
|
|
|
ld a, [Weather]
|
|
cp WEATHER_RAIN
|
|
ret
|
|
|
|
|
|
.XAccuracy
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVar
|
|
bit SUBSTATUS_X_ACCURACY, a
|
|
ret
|
|
|
|
|
|
.StatModifiers
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
|
|
ld hl, wPlayerMoveStruct + MOVE_ACC
|
|
ld a, [PlayerAccLevel]
|
|
ld b, a
|
|
ld a, [EnemyEvaLevel]
|
|
ld c, a
|
|
|
|
jr z, .asm_34e60
|
|
|
|
ld hl, wEnemyMoveStruct + MOVE_ACC
|
|
ld a, [EnemyAccLevel]
|
|
ld b, a
|
|
ld a, [PlayerEvaLevel]
|
|
ld c, a
|
|
|
|
.asm_34e60
|
|
cp b
|
|
jr c, .asm_34e6b
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS1_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_IDENTIFIED, a
|
|
ret nz
|
|
|
|
.asm_34e6b
|
|
ld a, $e
|
|
sub c
|
|
ld c, a
|
|
xor a
|
|
ld [hMultiplicand + 0], a
|
|
ld [hMultiplicand + 1], a
|
|
ld a, [hl]
|
|
ld [hMultiplicand + 2], a
|
|
push hl
|
|
ld d, $2
|
|
|
|
.asm_34e7a
|
|
push bc
|
|
ld hl, .AccProb
|
|
dec b
|
|
sla b
|
|
ld c, b
|
|
ld b, 0
|
|
add hl, bc
|
|
pop bc
|
|
ld a, [hli]
|
|
ld [hMultiplier], a
|
|
call Multiply
|
|
ld a, [hl]
|
|
ld [hDivisor], a
|
|
ld b, $4
|
|
call Divide
|
|
ld a, [hQuotient + 2]
|
|
ld b, a
|
|
ld a, [hQuotient + 1]
|
|
or b
|
|
jr nz, .asm_34ea2
|
|
ld [$ffb5], a
|
|
ld a, $1
|
|
ld [$ffb6], a
|
|
|
|
.asm_34ea2
|
|
ld b, c
|
|
dec d
|
|
jr nz, .asm_34e7a
|
|
|
|
ld a, [$ffb5]
|
|
and a
|
|
ld a, [$ffb6]
|
|
jr z, .asm_34eaf
|
|
ld a, $ff
|
|
|
|
.asm_34eaf
|
|
pop hl
|
|
ld [hl], a
|
|
ret
|
|
|
|
.AccProb
|
|
db 33, 100 ; 33% -6
|
|
db 36, 100 ; 36% -5
|
|
db 43, 100 ; 43% -4
|
|
db 50, 100 ; 50% -3
|
|
db 60, 100 ; 60% -2
|
|
db 75, 100 ; 75% -1
|
|
db 1, 1 ; 100% 0
|
|
db 133, 100 ; 133% +1
|
|
db 166, 100 ; 166% +2
|
|
db 2, 1 ; 200% +3
|
|
db 233, 100 ; 233% +4
|
|
db 133, 50 ; 266% +5
|
|
db 3, 1 ; 300% +6
|
|
|
|
; 34ecc
|
|
|
|
|
|
BattleCommand90: ; 34ecc
|
|
; effectchance
|
|
|
|
xor a
|
|
ld [EffectFailed], a
|
|
call CheckSubstituteOpp
|
|
jr nz, .failed
|
|
|
|
push hl
|
|
ld hl, wPlayerMoveStruct + MOVE_CHANCE
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_34ee1
|
|
ld hl, wEnemyMoveStruct + MOVE_CHANCE
|
|
.asm_34ee1
|
|
|
|
call BattleRandom
|
|
cp [hl]
|
|
pop hl
|
|
ret c
|
|
|
|
.failed
|
|
ld a, 1
|
|
ld [EffectFailed], a
|
|
and a
|
|
ret
|
|
; 34eee
|
|
|
|
|
|
BattleCommand0a: ; 34eee
|
|
; lowersub
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVar
|
|
bit SUBSTATUS_SUBSTITUTE, a
|
|
ret z
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVar
|
|
bit SUBSTATUS_CHARGED, a
|
|
jr nz, .asm_34f18
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_RAZOR_WIND
|
|
jr z, .asm_34f21
|
|
cp EFFECT_SKY_ATTACK
|
|
jr z, .asm_34f21
|
|
cp EFFECT_SKULL_BASH
|
|
jr z, .asm_34f21
|
|
cp EFFECT_SOLARBEAM
|
|
jr z, .asm_34f21
|
|
cp EFFECT_FLY
|
|
jr z, .asm_34f21
|
|
|
|
.asm_34f18
|
|
call .Rampage
|
|
jr z, .asm_34f21
|
|
|
|
call Function34548
|
|
ret nz
|
|
|
|
.asm_34f21
|
|
call Function37ed5
|
|
jr c, .asm_34f36
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
ld [FXAnimIDHi], a
|
|
inc a
|
|
ld [wc689], a
|
|
ld a, SUBSTITUTE
|
|
jp Function37e44
|
|
|
|
.asm_34f36
|
|
call BattleCommanda7
|
|
jp BattleCommandaa
|
|
|
|
.Rampage
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_ROLLOUT
|
|
jr z, .asm_34f4d
|
|
cp EFFECT_RAMPAGE
|
|
jr z, .asm_34f4d
|
|
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
|
|
.asm_34f4d
|
|
ld a, [wc73e]
|
|
and a
|
|
ld a, 0
|
|
ld [wc73e], a
|
|
ret
|
|
; 34f57
|
|
|
|
|
|
BattleCommandab: ; 34f57
|
|
; hittarget
|
|
call BattleCommand0a
|
|
call BattleCommand0b
|
|
jp BattleCommand0c
|
|
; 34f60
|
|
|
|
|
|
BattleCommand0b: ; 34f60
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, BattleCommandaa
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld de, PlayerRolloutCount
|
|
ld a, 1
|
|
jr z, .asm_34f76
|
|
ld de, EnemyRolloutCount
|
|
ld a, 4
|
|
|
|
.asm_34f76
|
|
ld [wcfca], a
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_MULTI_HIT
|
|
jr z, .asm_34fb0
|
|
cp EFFECT_CONVERSION
|
|
jr z, .asm_34fb0
|
|
cp EFFECT_DOUBLE_HIT
|
|
jr z, .asm_34fb0
|
|
cp EFFECT_TWINEEDLE
|
|
jr z, .asm_34fb0
|
|
cp EFFECT_TRIPLE_KICK
|
|
jr z, .asm_34f96
|
|
xor a
|
|
ld [wc689], a
|
|
|
|
.asm_34f96
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld e, a
|
|
ld d, 0
|
|
call PlayFXAnimID
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
cp FLY
|
|
jr z, .asm_34fad
|
|
cp DIG
|
|
ret nz
|
|
|
|
.asm_34fad
|
|
; clear sprite
|
|
jp Function37ec7
|
|
.asm_34fb0
|
|
ld a, [wc689]
|
|
and 1
|
|
xor 1
|
|
ld [wc689], a
|
|
ld a, [de]
|
|
cp $1
|
|
push af
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld e, a
|
|
ld d, 0
|
|
pop af
|
|
jp z, PlayFXAnimID
|
|
xor a
|
|
ld [wcfca], a
|
|
jp PlayFXAnimID
|
|
; 34fd1
|
|
|
|
|
|
BattleCommand92: ; 34fd1
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, BattleCommandaa
|
|
|
|
xor a
|
|
jr BattleCommand91_92
|
|
; 34fdb
|
|
|
|
|
|
BattleCommand91: ; 34fdb
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, BattleCommandaa
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, 2
|
|
jr z, BattleCommand91_92
|
|
ld a, 5
|
|
|
|
; fallthrough
|
|
; 34feb
|
|
|
|
|
|
BattleCommand91_92: ; 34feb
|
|
ld [wcfca], a
|
|
xor a
|
|
ld [wc689], a
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld e, a
|
|
ld d, 0
|
|
jp PlayFXAnimID
|
|
; 34ffd
|
|
|
|
|
|
BattleCommand_SwitchTurn: ; 34ffd
|
|
; switchturn
|
|
|
|
ld a, [hBattleTurn]
|
|
xor 1
|
|
ld [hBattleTurn], a
|
|
ret
|
|
; 35004
|
|
|
|
|
|
BattleCommand0c: ; 35004
|
|
; raisesub
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVar
|
|
bit SUBSTATUS_SUBSTITUTE, a
|
|
ret z
|
|
|
|
call Function37ed5
|
|
jp c, BattleCommanda6
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
ld [FXAnimIDHi], a
|
|
ld a, $2
|
|
ld [wc689], a
|
|
ld a, SUBSTITUTE
|
|
jp Function37e44
|
|
; 35023
|
|
|
|
|
|
BattleCommand0d: ; 35023
|
|
; resulttext
|
|
ld a, [AttackMissed]
|
|
and a
|
|
ret z
|
|
|
|
call Function350e4
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVarAddr
|
|
|
|
cp FLY
|
|
jr z, .asm_3504f
|
|
cp DIG
|
|
jr z, .asm_3504f
|
|
|
|
; Move effect:
|
|
inc hl
|
|
ld a, [hl]
|
|
|
|
cp EFFECT_MULTI_HIT
|
|
jr z, .asm_35049
|
|
cp EFFECT_DOUBLE_HIT
|
|
jr z, .asm_35049
|
|
cp EFFECT_TWINEEDLE
|
|
jr z, .asm_35049
|
|
jp EndMoveEffect
|
|
|
|
.asm_35049
|
|
call BattleCommand0c
|
|
jp EndMoveEffect
|
|
|
|
.asm_3504f
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_UNDERGROUND, [hl]
|
|
res SUBSTATUS_FLYING, [hl]
|
|
call Function37ece
|
|
jp EndMoveEffect
|
|
; 3505e
|
|
|
|
|
|
BattleCommand0e: ; 3505e
|
|
; checkfaint
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS1_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_ENDURE, a
|
|
jr z, .asm_35072
|
|
call BattleCommand4b
|
|
ld b, $0
|
|
jr nc, .asm_3508b
|
|
ld b, $1
|
|
jr .asm_3508b
|
|
|
|
.asm_35072
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_FOCUS_BAND
|
|
ld b, $0
|
|
jr nz, .asm_3508b
|
|
call BattleRandom
|
|
cp c
|
|
jr nc, .asm_3508b
|
|
call BattleCommand4b
|
|
ld b, $0
|
|
jr nc, .asm_3508b
|
|
ld b, $2
|
|
.asm_3508b
|
|
push bc
|
|
call .asm_50bb
|
|
ld c, $0
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_3509b
|
|
call Function35d1c
|
|
jr .asm_3509e
|
|
|
|
.asm_3509b
|
|
call Function35d7e
|
|
|
|
.asm_3509e
|
|
pop bc
|
|
ld a, b
|
|
and a
|
|
ret z
|
|
dec a
|
|
jr nz, .asm_350ab
|
|
ld hl, EnduredText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_350ab
|
|
call GetOpponentItem
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
call GetItemName
|
|
|
|
ld hl, HungOnText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_50bb
|
|
ld a, BATTLE_VARS_SUBSTATUS4_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_SUBSTITUTE, a
|
|
ret nz
|
|
|
|
ld de, PlayerDamageTaken + 1
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_350ce
|
|
ld de, EnemyDamageTaken + 1
|
|
|
|
.asm_350ce
|
|
ld a, [CurDamage + 1]
|
|
ld b, a
|
|
ld a, [de]
|
|
add b
|
|
ld [de], a
|
|
dec de
|
|
ld a, [CurDamage]
|
|
ld b, a
|
|
ld a, [de]
|
|
adc b
|
|
ld [de], a
|
|
ret nc
|
|
ld a, $ff
|
|
ld [de], a
|
|
inc de
|
|
ld [de], a
|
|
ret
|
|
; 350e4
|
|
|
|
|
|
Function350e4: ; 350e4
|
|
ld hl, DoesntAffectText
|
|
ld de, DoesntAffectText
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
jr z, .asm_35110
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_FUTURE_SIGHT
|
|
ld hl, ButItFailedText
|
|
ld de, ItFailedText
|
|
jr z, .asm_35110
|
|
ld hl, AttackMissedText
|
|
ld de, AttackMissed2Text
|
|
ld a, [CriticalHit]
|
|
cp $ff
|
|
jr nz, .asm_35110
|
|
ld hl, UnaffectedText
|
|
.asm_35110
|
|
call Function35157
|
|
xor a
|
|
ld [CriticalHit], a
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_JUMP_KICK
|
|
ret nz
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
ret z
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
ld b, [hl]
|
|
rept 3
|
|
srl a
|
|
rr b
|
|
endr
|
|
ld [hl], b
|
|
dec hl
|
|
ld [hli], a
|
|
or b
|
|
jr nz, .asm_3513e
|
|
inc a
|
|
ld [hl], a
|
|
.asm_3513e
|
|
ld hl, CrashedText
|
|
call StdBattleTextBox
|
|
ld a, $1
|
|
ld [wc689], a
|
|
call Function37e36
|
|
ld c, $1
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jp nz, Function35d1c
|
|
jp Function35d7e
|
|
|
|
Function35157: ; 35157
|
|
ld a, BATTLE_VARS_SUBSTATUS1_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_PROTECT, a
|
|
jr z, .asm_35162
|
|
ld h, d
|
|
ld l, e
|
|
.asm_35162
|
|
jp StdBattleTextBox
|
|
; 35165
|
|
|
|
|
|
BattleCommanda5: ; 35165
|
|
ld a, [AttackMissed]
|
|
and a
|
|
ret z
|
|
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
jp z, PrintDoesntAffect
|
|
jp PrintButItFailed
|
|
; 35175
|
|
|
|
|
|
BattleCommand0f: ; 35175
|
|
; criticaltext
|
|
; Prints the message for critical hits or one-hit KOs.
|
|
|
|
; If there is no message to be printed, wait 20 frames.
|
|
ld a, [CriticalHit]
|
|
and a
|
|
jr z, .wait
|
|
|
|
dec a
|
|
add a
|
|
ld hl, .texts
|
|
ld b, 0
|
|
ld c, a
|
|
add hl, bc
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
call StdBattleTextBox
|
|
|
|
xor a
|
|
ld [CriticalHit], a
|
|
|
|
.wait
|
|
ld c, 20
|
|
jp DelayFrames
|
|
|
|
.texts
|
|
dw CriticalHitText
|
|
dw OneHitKOText
|
|
; 35197
|
|
|
|
|
|
BattleCommandae: ; 35197
|
|
; startloop
|
|
|
|
ld hl, PlayerRolloutCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld hl, EnemyRolloutCount
|
|
.ok
|
|
xor a
|
|
ld [hl], a
|
|
ret
|
|
; 351a5
|
|
|
|
|
|
BattleCommandad: ; 351a5
|
|
; supereffectivelooptext
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_IN_LOOP, a
|
|
ret nz
|
|
|
|
; fallthrough
|
|
; 351ad
|
|
|
|
|
|
BattleCommand10: ; 351ad
|
|
; supereffectivetext
|
|
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
cp 10 ; 1.0
|
|
ret z
|
|
ld hl, SuperEffectiveText
|
|
jr nc, .print
|
|
ld hl, NotVeryEffectiveText
|
|
.print
|
|
jp StdBattleTextBox
|
|
; 351c0
|
|
|
|
|
|
BattleCommand11: ; 351c0
|
|
; checkdestinybond
|
|
|
|
; Faint the user if it fainted an opponent using Destiny Bond.
|
|
|
|
ld hl, EnemyMonHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_351cb
|
|
ld hl, BattleMonHP
|
|
|
|
.asm_351cb
|
|
ld a, [hli]
|
|
or [hl]
|
|
ret nz
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_DESTINY_BOND, a
|
|
jr z, .asm_35231
|
|
|
|
ld hl, TookDownWithItText
|
|
call StdBattleTextBox
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld hl, EnemyMonMaxHP + 1
|
|
bccoord 2, 2 ; hp bar
|
|
ld a, 0
|
|
jr nz, .asm_351f2
|
|
ld hl, BattleMonMaxHP + 1
|
|
bccoord 10, 9 ; hp bar
|
|
ld a, 1
|
|
|
|
.asm_351f2
|
|
ld [wd10a], a
|
|
ld a, [hld]
|
|
ld [Buffer1], a
|
|
ld a, [hld]
|
|
ld [Buffer2], a
|
|
ld a, [hl]
|
|
ld [wd1ec], a
|
|
xor a
|
|
ld [hld], a
|
|
ld a, [hl]
|
|
ld [wd1ed], a
|
|
xor a
|
|
ld [hl], a
|
|
ld [wd1ee], a
|
|
ld [wd1ef], a
|
|
ld h, b
|
|
ld l, c
|
|
predef Functionc6e0
|
|
call RefreshBattleHuds
|
|
|
|
call BattleCommand_SwitchTurn
|
|
xor a
|
|
ld [wcfca], a
|
|
ld [FXAnimIDHi], a
|
|
inc a
|
|
ld [wc689], a
|
|
ld a, $c2
|
|
call Function37e44
|
|
call BattleCommand_SwitchTurn
|
|
|
|
jr .asm_3524d ; 3522f $1c
|
|
|
|
.asm_35231
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_MULTI_HIT
|
|
jr z, .asm_3524a
|
|
cp EFFECT_DOUBLE_HIT
|
|
jr z, .asm_3524a
|
|
cp EFFECT_TWINEEDLE
|
|
jr z, .asm_3524a
|
|
cp EFFECT_TRIPLE_KICK
|
|
jr z, .asm_3524a
|
|
cp EFFECT_BEAT_UP
|
|
jr nz, .asm_3524d
|
|
|
|
.asm_3524a
|
|
call BattleCommand0c
|
|
|
|
.asm_3524d
|
|
jp EndMoveEffect
|
|
; 35250
|
|
|
|
|
|
BattleCommand12: ; 35250
|
|
; buildopponentrage
|
|
|
|
jp .start
|
|
.start
|
|
ld a, [AttackMissed]
|
|
and a
|
|
ret nz
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_RAGE, a
|
|
ret z
|
|
|
|
ld de, wc72c
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_3526b
|
|
ld de, wc72b
|
|
.asm_3526b
|
|
ld a, [de]
|
|
inc a
|
|
ret z
|
|
ld [de], a
|
|
|
|
call BattleCommand_SwitchTurn
|
|
ld hl, RageBuildingText
|
|
call StdBattleTextBox
|
|
jp BattleCommand_SwitchTurn
|
|
; 3527b
|
|
|
|
|
|
BattleCommanda2: ; 3527b
|
|
; ragedamage
|
|
|
|
ld a, [CurDamage]
|
|
ld h, a
|
|
ld b, a
|
|
ld a, [CurDamage + 1]
|
|
ld l, a
|
|
ld c, a
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [wc72b]
|
|
jr z, .asm_35290
|
|
ld a, [wc72c]
|
|
.asm_35290
|
|
and a
|
|
jr z, .asm_3529a
|
|
dec a
|
|
add hl, bc
|
|
jr nc, .asm_35290
|
|
ld hl, $ffff
|
|
.asm_3529a
|
|
ld a, h
|
|
ld [CurDamage], a
|
|
ld a, l
|
|
ld [CurDamage + 1], a
|
|
ret
|
|
; 352a3
|
|
|
|
|
|
EndMoveEffect: ; 352a3
|
|
ld a, [BattleScriptBufferLoc]
|
|
ld l, a
|
|
ld a, [BattleScriptBufferLoc + 1]
|
|
ld h, a
|
|
ld a, $ff
|
|
rept 2
|
|
ld [hli], a
|
|
endr
|
|
ld [hl], a
|
|
ret
|
|
; 352b1
|
|
|
|
|
|
DittoMetalPowder: ; 352b1
|
|
ld a, PartyMon1Species - PartyMon1
|
|
call BattlePartyAttr
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [hl]
|
|
jr nz, .Ditto
|
|
ld a, [TempEnemyMonSpecies]
|
|
|
|
.Ditto
|
|
cp DITTO
|
|
ret nz
|
|
|
|
push bc
|
|
call GetOpponentItem
|
|
ld a, [hl]
|
|
cp METAL_POWDER
|
|
pop bc
|
|
ret nz
|
|
|
|
ld a, c
|
|
srl a
|
|
add c
|
|
ld c, a
|
|
ret nc
|
|
|
|
srl b
|
|
ld a, b
|
|
and a
|
|
jr nz, .asm_352d8
|
|
inc b
|
|
.asm_352d8
|
|
scf
|
|
rr c
|
|
ret
|
|
; 352dc
|
|
|
|
|
|
BattleCommand06: ; 352dc
|
|
; damagestats
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jp nz, EnemyAttackDamage
|
|
|
|
; fallthrough
|
|
; 352e2
|
|
|
|
|
|
PlayerAttackDamage: ; 352e2
|
|
; Return move power d, player level e, enemy defense c and player attack b.
|
|
|
|
call ResetDamage
|
|
|
|
ld hl, wPlayerMoveStruct + MOVE_POWER
|
|
ld a, [hli]
|
|
and a
|
|
ld d, a
|
|
ret z
|
|
|
|
ld a, [hl]
|
|
cp SPECIAL
|
|
jr nc, .special
|
|
|
|
.physical
|
|
ld hl, EnemyMonDefense
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
|
|
ld a, [EnemyScreens]
|
|
bit SCREENS_REFLECT, a
|
|
jr z, .physicalcrit
|
|
sla c
|
|
rl b
|
|
|
|
.physicalcrit
|
|
ld hl, BattleMonAttack
|
|
call GetDamageStatsCritical
|
|
jr c, .thickclub
|
|
|
|
ld hl, EnemyStats + 2
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
ld hl, PlayerStats
|
|
jr .thickclub
|
|
|
|
.special
|
|
ld hl, EnemyMonSpclDef
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
|
|
ld a, [EnemyScreens]
|
|
bit SCREENS_LIGHT_SCREEN, a
|
|
jr z, .specialcrit
|
|
sla c
|
|
rl b
|
|
|
|
.specialcrit
|
|
ld hl, BattleMonSpclAtk
|
|
call GetDamageStatsCritical
|
|
jr c, .lightball
|
|
|
|
ld hl, EnemyStats + SP_DEFENSE * 2
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
ld hl, PlayerStats + SP_ATTACK * 2
|
|
|
|
.lightball
|
|
; Note: Returns player special attack at hl in hl.
|
|
call LightBallBoost
|
|
jr .done
|
|
|
|
.thickclub
|
|
; Note: Returns player attack at hl in hl.
|
|
call ThickClubBoost
|
|
|
|
.done
|
|
call Function3534d
|
|
|
|
ld a, [BattleMonLevel]
|
|
ld e, a
|
|
call DittoMetalPowder
|
|
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
; 3534d
|
|
|
|
|
|
Function3534d: ; 3534d
|
|
; Truncate 16-bit values hl and bc to 8-bit values b and c respectively.
|
|
; b = hl, c = bc
|
|
|
|
ld a, h
|
|
or b
|
|
jr z, .asm_3536b
|
|
|
|
srl b
|
|
rr c
|
|
srl b
|
|
rr c
|
|
|
|
ld a, c
|
|
or b
|
|
jr nz, .asm_3535e
|
|
inc c
|
|
|
|
.asm_3535e
|
|
srl h
|
|
rr l
|
|
srl h
|
|
rr l
|
|
|
|
ld a, l
|
|
or h
|
|
jr nz, .asm_3536b
|
|
inc l
|
|
|
|
.asm_3536b
|
|
ld a, [wLinkMode]
|
|
cp 3
|
|
jr z, .done
|
|
|
|
ld a, h
|
|
or b
|
|
jr nz, Function3534d
|
|
|
|
.done
|
|
ld b, l
|
|
ret
|
|
; 35378
|
|
|
|
|
|
GetDamageStatsCritical: ; 35378
|
|
; Return carry if non-critical.
|
|
|
|
ld a, [CriticalHit]
|
|
and a
|
|
scf
|
|
ret z
|
|
|
|
; fallthrough
|
|
; 3537e
|
|
|
|
|
|
GetDamageStats: ; 3537e
|
|
; Return the attacker's offensive stat and the defender's defensive
|
|
; stat based on whether the attacking type is physical or special.
|
|
|
|
push hl
|
|
push bc
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .enemy
|
|
ld a, [wPlayerMoveStruct + MOVE_TYPE]
|
|
cp SPECIAL
|
|
; special
|
|
ld a, [PlayerSAtkLevel]
|
|
ld b, a
|
|
ld a, [EnemySDefLevel]
|
|
jr nc, .end
|
|
; physical
|
|
ld a, [PlayerAtkLevel]
|
|
ld b, a
|
|
ld a, [EnemyDefLevel]
|
|
jr .end
|
|
|
|
.enemy
|
|
ld a, [wEnemyMoveStruct + MOVE_TYPE]
|
|
cp SPECIAL
|
|
; special
|
|
ld a, [EnemySAtkLevel]
|
|
ld b, a
|
|
ld a, [PlayerSDefLevel]
|
|
jr nc, .end
|
|
; physical
|
|
ld a, [EnemyAtkLevel]
|
|
ld b, a
|
|
ld a, [PlayerDefLevel]
|
|
.end
|
|
cp b
|
|
pop bc
|
|
pop hl
|
|
ret
|
|
; 353b5
|
|
|
|
|
|
ThickClubBoost: ; 353b5
|
|
; Return in hl the stat value at hl.
|
|
|
|
; If the attacking monster is Cubone or Marowak and
|
|
; it's holding a Thick Club, double it.
|
|
push bc
|
|
push de
|
|
ld b, CUBONE
|
|
ld c, MAROWAK
|
|
ld d, THICK_CLUB
|
|
call SpeciesItemBoost
|
|
pop de
|
|
pop bc
|
|
ret
|
|
; 353c3
|
|
|
|
|
|
LightBallBoost: ; 353c3
|
|
; Return in hl the stat value at hl.
|
|
|
|
; If the attacking monster is Pikachu and it's
|
|
; holding a Light Ball, double it.
|
|
push bc
|
|
push de
|
|
ld b, PIKACHU
|
|
ld c, PIKACHU
|
|
ld d, LIGHT_BALL
|
|
call SpeciesItemBoost
|
|
pop de
|
|
pop bc
|
|
ret
|
|
; 353d1
|
|
|
|
|
|
SpeciesItemBoost: ; 353d1
|
|
; Return in hl the stat value at hl.
|
|
|
|
; If the attacking monster is species b or c and
|
|
; it's holding item d, double it.
|
|
|
|
ld a, [hli]
|
|
ld l, [hl]
|
|
ld h, a
|
|
|
|
push hl
|
|
ld a, PartyMon1Species - PartyMon1
|
|
call BattlePartyAttr
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [hl]
|
|
jr z, .CompareSpecies
|
|
ld a, [TempEnemyMonSpecies]
|
|
.CompareSpecies
|
|
pop hl
|
|
|
|
cp b
|
|
jr z, .GetItem
|
|
cp c
|
|
ret nz
|
|
|
|
.GetItem
|
|
push hl
|
|
call GetUserItem
|
|
ld a, [hl]
|
|
pop hl
|
|
cp d
|
|
ret nz
|
|
|
|
; Double the stat
|
|
sla l
|
|
rl h
|
|
ret
|
|
; 353f6
|
|
|
|
|
|
EnemyAttackDamage: ; 353f6
|
|
call ResetDamage
|
|
|
|
; No damage dealt with 0 power.
|
|
ld hl, wEnemyMoveStruct + MOVE_POWER
|
|
ld a, [hli] ; hl = wEnemyMoveStruct + MOVE_TYPE
|
|
ld d, a
|
|
and a
|
|
ret z
|
|
|
|
ld a, [hl]
|
|
cp SPECIAL
|
|
jr nc, .Special
|
|
|
|
.physical
|
|
ld hl, BattleMonDefense
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
|
|
ld a, [PlayerScreens]
|
|
bit SCREENS_REFLECT, a
|
|
jr z, .physicalcrit
|
|
sla c
|
|
rl b
|
|
|
|
.physicalcrit
|
|
ld hl, EnemyMonAttack
|
|
call GetDamageStatsCritical
|
|
jr c, .thickclub
|
|
|
|
ld hl, PlayerStats + 2
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
ld hl, EnemyStats
|
|
jr .thickclub
|
|
|
|
.Special
|
|
ld hl, BattleMonSpclDef
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
|
|
ld a, [PlayerScreens]
|
|
bit SCREENS_LIGHT_SCREEN, a
|
|
jr z, .specialcrit
|
|
sla c
|
|
rl b
|
|
|
|
.specialcrit
|
|
ld hl, EnemyMonSpclAtk
|
|
call GetDamageStatsCritical
|
|
jr c, .lightball
|
|
ld hl, PlayerStats + 8
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
ld hl, EnemyStats + 6
|
|
|
|
.lightball
|
|
call LightBallBoost
|
|
jr .done
|
|
|
|
.thickclub
|
|
call ThickClubBoost
|
|
|
|
.done
|
|
call Function3534d
|
|
|
|
ld a, [EnemyMonLevel]
|
|
ld e, a
|
|
call DittoMetalPowder
|
|
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
; 35461
|
|
|
|
|
|
BattleCommanda1: ; 35461
|
|
; beatup
|
|
|
|
call ResetDamage
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jp nz, .asm_354ef
|
|
ld a, [PlayerSubStatus3]
|
|
bit SUBSTATUS_IN_LOOP, a
|
|
jr nz, .asm_35482
|
|
ld c, 20
|
|
call DelayFrames
|
|
xor a
|
|
ld [PlayerRolloutCount], a
|
|
ld [DefaultFlypoint], a
|
|
ld [wc72d], a
|
|
jr .asm_3548d
|
|
.asm_35482
|
|
ld a, [PlayerRolloutCount]
|
|
ld b, a
|
|
ld a, [PartyCount]
|
|
sub b
|
|
ld [DefaultFlypoint], a
|
|
.asm_3548d
|
|
ld a, [DefaultFlypoint]
|
|
ld hl, PartyMonNicknames
|
|
call GetNick
|
|
ld a, $22
|
|
call Function355bd
|
|
ld a, [hli]
|
|
or [hl]
|
|
jp z, Function355b0
|
|
ld a, [DefaultFlypoint]
|
|
ld c, a
|
|
ld a, [CurBattleMon]
|
|
cp [hl]
|
|
ld hl, BattleMonStatus
|
|
jr z, .asm_354b2
|
|
ld a, $20
|
|
call Function355bd
|
|
.asm_354b2
|
|
ld a, [hl]
|
|
and a
|
|
jp nz, Function355b0
|
|
ld a, $1
|
|
ld [wc72d], a
|
|
ld hl, BeatUpAttackText
|
|
call StdBattleTextBox
|
|
ld a, [EnemyMonSpecies]
|
|
ld [CurSpecies], a
|
|
call GetBaseData
|
|
ld a, [BaseDefense]
|
|
ld c, a
|
|
push bc
|
|
ld a, $0
|
|
call Function355bd
|
|
ld a, [hl]
|
|
ld [CurSpecies], a
|
|
call GetBaseData
|
|
ld a, [BaseAttack]
|
|
pop bc
|
|
ld b, a
|
|
push bc
|
|
ld a, $1f
|
|
call Function355bd
|
|
ld a, [hl]
|
|
ld e, a
|
|
pop bc
|
|
ld a, [wPlayerMoveStruct + MOVE_POWER]
|
|
ld d, a
|
|
ret
|
|
|
|
.asm_354ef
|
|
ld a, [EnemySubStatus3]
|
|
bit SUBSTATUS_IN_LOOP, a
|
|
jr nz, .asm_35502
|
|
|
|
xor a
|
|
ld [EnemyRolloutCount], a
|
|
ld [DefaultFlypoint], a
|
|
ld [wc72d], a
|
|
jr .asm_3550d
|
|
|
|
.asm_35502
|
|
ld a, [EnemyRolloutCount]
|
|
ld b, a
|
|
ld a, [OTPartyCount]
|
|
sub b
|
|
ld [DefaultFlypoint], a
|
|
.asm_3550d
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr z, .asm_3556b
|
|
|
|
ld a, [wLinkMode]
|
|
and a
|
|
jr nz, .asm_35532
|
|
|
|
ld a, [InBattleTowerBattle]
|
|
and a
|
|
jr nz, .asm_35532
|
|
|
|
ld a, [DefaultFlypoint]
|
|
ld c, a
|
|
ld b, 0
|
|
ld hl, OTPartySpecies
|
|
add hl, bc
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
call GetPokemonName
|
|
jr .asm_35544
|
|
|
|
.asm_35532
|
|
ld a, [DefaultFlypoint]
|
|
ld hl, OTPartyMonNicknames
|
|
ld bc, NAME_LENGTH
|
|
call AddNTimes
|
|
ld de, StringBuffer1
|
|
call CopyBytes
|
|
.asm_35544
|
|
ld a, $22
|
|
call Function355bd
|
|
ld a, [hli]
|
|
or [hl]
|
|
jp z, Function355b0
|
|
ld a, [DefaultFlypoint]
|
|
ld b, a
|
|
ld a, [CurOTMon]
|
|
cp b
|
|
ld hl, EnemyMonStatus
|
|
jr z, .asm_35560
|
|
|
|
ld a, $20
|
|
call Function355bd
|
|
.asm_35560
|
|
ld a, [hl]
|
|
and a
|
|
jr nz, Function355b0
|
|
|
|
ld a, $1
|
|
ld [wc72d], a
|
|
jr .asm_3557d
|
|
|
|
.asm_3556b
|
|
ld a, [EnemyMonSpecies]
|
|
ld [wd265], a
|
|
call GetPokemonName
|
|
ld hl, BeatUpAttackText
|
|
call StdBattleTextBox
|
|
jp EnemyAttackDamage
|
|
.asm_3557d
|
|
ld hl, BeatUpAttackText
|
|
call StdBattleTextBox
|
|
ld a, [BattleMonSpecies]
|
|
ld [CurSpecies], a
|
|
call GetBaseData
|
|
ld a, [BaseDefense]
|
|
ld c, a
|
|
push bc
|
|
ld a, $0
|
|
call Function355bd
|
|
ld a, [hl]
|
|
ld [CurSpecies], a
|
|
call GetBaseData
|
|
ld a, [BaseAttack]
|
|
pop bc
|
|
ld b, a
|
|
push bc
|
|
ld a, $1f
|
|
call Function355bd
|
|
ld a, [hl]
|
|
ld e, a
|
|
pop bc
|
|
ld a, [wEnemyMoveStruct + MOVE_POWER]
|
|
ld d, a
|
|
ret
|
|
; 355b0
|
|
|
|
|
|
Function355b0: ; 355b0
|
|
ld b, buildopponentrage_command
|
|
jp SkipToBattleCommand
|
|
; 355b5
|
|
|
|
|
|
BattleCommanda8: ; 355b5
|
|
ld a, [wc72d]
|
|
and a
|
|
ret nz
|
|
|
|
jp PrintButItFailed
|
|
; 355bd
|
|
|
|
|
|
Function355bd: ; 355bd
|
|
push bc
|
|
ld c, a
|
|
ld b, 0
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld hl, PartyMon1Species
|
|
jr z, .asm_355cc
|
|
ld hl, OTPartyMon1Species
|
|
|
|
.asm_355cc
|
|
ld a, [DefaultFlypoint]
|
|
add hl, bc
|
|
call GetPartyLocation
|
|
pop bc
|
|
ret
|
|
|
|
|
|
BattleCommand_IfAttackMissedResetDamage: ; 355d5
|
|
; clearmissdamage
|
|
ld a, [AttackMissed]
|
|
and a
|
|
ret z
|
|
|
|
jp ResetDamage
|
|
; 355dd
|
|
|
|
|
|
Function355dd: ; 355dd
|
|
call ResetDamage
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld hl, BattleMonDefense
|
|
ld de, PlayerScreens
|
|
ld a, [BattleMonLevel]
|
|
jr z, .asm_355f7
|
|
|
|
ld hl, EnemyMonDefense
|
|
ld de, EnemyScreens
|
|
ld a, [EnemyMonLevel]
|
|
.asm_355f7
|
|
push af
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld c, [hl]
|
|
ld a, [de]
|
|
bit SCREENS_REFLECT, a
|
|
jr z, .asm_35604
|
|
|
|
sla c
|
|
rl b
|
|
.asm_35604
|
|
rept 3
|
|
dec hl
|
|
endr
|
|
ld a, [hli]
|
|
ld l, [hl]
|
|
ld h, a
|
|
call Function3534d
|
|
ld d, $28
|
|
pop af
|
|
ld e, a
|
|
ret
|
|
; 35612
|
|
|
|
|
|
BattleCommand_DamageCalcWithStats: ; 35612
|
|
; damagecalc
|
|
|
|
; Return a damage value for move power d, player level e, enemy defense c and player attack b.
|
|
|
|
; Return 1 if successful, else 0.
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
|
|
; Selfdestruct and Explosion halve defense.
|
|
cp EFFECT_EXPLOSION
|
|
jr nz, .asm_35620
|
|
|
|
srl c
|
|
jr nz, .asm_35620
|
|
inc c
|
|
|
|
.asm_35620
|
|
|
|
; Variable-hit moves and Conversion can have a power of 0.
|
|
cp EFFECT_MULTI_HIT
|
|
jr z, .asm_3562b
|
|
|
|
cp EFFECT_CONVERSION
|
|
jr z, .asm_3562b
|
|
|
|
; No damage if move power is 0.
|
|
ld a, d
|
|
and a
|
|
ret z
|
|
|
|
.asm_3562b
|
|
; Minimum defense value is 1.
|
|
ld a, c
|
|
and a
|
|
jr nz, .asm_35631
|
|
ld c, 1
|
|
.asm_35631
|
|
|
|
xor a
|
|
ld hl, hDividend
|
|
rept 2
|
|
ld [hli], a
|
|
endr
|
|
ld [hl], a
|
|
|
|
; Level * 2
|
|
ld a, e
|
|
add a
|
|
jr nc, .asm_3563e
|
|
ld [hl], $1
|
|
.asm_3563e
|
|
inc hl
|
|
ld [hli], a
|
|
|
|
; / 5
|
|
ld a, 5
|
|
ld [hld], a
|
|
push bc
|
|
ld b, $4
|
|
call Divide
|
|
pop bc
|
|
|
|
; + 2
|
|
rept 2
|
|
inc [hl]
|
|
endr
|
|
|
|
; * bp
|
|
inc hl
|
|
ld [hl], d
|
|
call Multiply
|
|
|
|
; * Attack
|
|
ld [hl], b
|
|
call Multiply
|
|
|
|
; / Defense
|
|
ld [hl], c
|
|
ld b, $4
|
|
call Divide
|
|
|
|
; / 50
|
|
ld [hl], 50
|
|
ld b, $4
|
|
call Divide
|
|
|
|
; Item boosts
|
|
call GetUserItem
|
|
|
|
ld a, b
|
|
and a
|
|
jr z, .DoneItem
|
|
|
|
ld hl, TypeBoostItems
|
|
|
|
.NextItem
|
|
ld a, [hli]
|
|
cp $ff
|
|
jr z, .DoneItem
|
|
|
|
; Item effect
|
|
cp b
|
|
ld a, [hli]
|
|
jr nz, .NextItem
|
|
|
|
; Type
|
|
ld b, a
|
|
ld a, BATTLE_VARS_MOVE_TYPE
|
|
call GetBattleVar
|
|
cp b
|
|
jr nz, .DoneItem
|
|
|
|
; * 100 + item effect amount
|
|
ld a, c
|
|
add 100
|
|
ld [hMultiplier], a
|
|
call Multiply
|
|
|
|
; / 100
|
|
ld a, 100
|
|
ld [hDivisor], a
|
|
ld b, 4
|
|
call Divide
|
|
.DoneItem
|
|
|
|
; Critical hits
|
|
call .CriticalMultiplier
|
|
|
|
|
|
; Update CurDamage (capped at 997).
|
|
ld hl, CurDamage
|
|
ld b, [hl]
|
|
ld a, [hQuotient + 2]
|
|
add b
|
|
ld [$ffb6], a
|
|
jr nc, .asm_356a5
|
|
|
|
ld a, [hQuotient + 1]
|
|
inc a
|
|
ld [$ffb5], a
|
|
and a
|
|
jr z, .Cap
|
|
|
|
.asm_356a5
|
|
ld a, [$ffb3]
|
|
ld b, a
|
|
ld a, [$ffb4]
|
|
or a
|
|
jr nz, .Cap
|
|
|
|
ld a, [$ffb5]
|
|
cp 998 / $100
|
|
jr c, .asm_356bd
|
|
|
|
cp 998 / $100 + 1
|
|
jr nc, .Cap
|
|
|
|
ld a, [$ffb6]
|
|
cp 998 % $100
|
|
jr nc, .Cap
|
|
|
|
.asm_356bd
|
|
inc hl
|
|
|
|
ld a, [$ffb6]
|
|
ld b, [hl]
|
|
add b
|
|
ld [hld], a
|
|
|
|
ld a, [$ffb5]
|
|
ld b, [hl]
|
|
adc b
|
|
ld [hl], a
|
|
jr c, .Cap
|
|
|
|
ld a, [hl]
|
|
cp 998 / $100
|
|
jr c, .asm_356df
|
|
|
|
cp 998 / $100 + 1
|
|
jr nc, .Cap
|
|
|
|
inc hl
|
|
ld a, [hld]
|
|
cp 998 % $100
|
|
jr c, .asm_356df
|
|
|
|
.Cap
|
|
ld a, 997 / $100
|
|
ld [hli], a
|
|
ld a, 997 % $100
|
|
ld [hld], a
|
|
|
|
|
|
.asm_356df
|
|
; Minimum neutral damage is 2 (bringing the cap to 999).
|
|
inc hl
|
|
ld a, [hl]
|
|
add 2
|
|
ld [hld], a
|
|
jr nc, .asm_356e7
|
|
inc [hl]
|
|
.asm_356e7
|
|
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
|
|
|
|
.CriticalMultiplier
|
|
ld a, [CriticalHit]
|
|
and a
|
|
ret z
|
|
|
|
; x2
|
|
ld a, [$ffb6]
|
|
add a
|
|
ld [$ffb6], a
|
|
|
|
ld a, [$ffb5]
|
|
rl a
|
|
ld [$ffb5], a
|
|
|
|
; Cap at $ffff.
|
|
ret nc
|
|
|
|
ld a, $ff
|
|
ld [$ffb5], a
|
|
ld [$ffb6], a
|
|
|
|
ret
|
|
; 35703
|
|
|
|
|
|
TypeBoostItems: ; 35703
|
|
db HELD_NORMAL_BOOST, NORMAL ; Pink/Polkadot Bow
|
|
db HELD_FIGHTING_BOOST, FIGHTING ; Blackbelt
|
|
db HELD_FLYING_BOOST, FLYING ; Sharp Beak
|
|
db HELD_POISON_BOOST, POISON ; Poison Barb
|
|
db HELD_GROUND_BOOST, GROUND ; Soft Sand
|
|
db HELD_ROCK_BOOST, ROCK ; Hard Stone
|
|
db HELD_BUG_BOOST, BUG ; Silverpowder
|
|
db HELD_GHOST_BOOST, GHOST ; Spell Tag
|
|
db HELD_FIRE_BOOST, FIRE ; Charcoal
|
|
db HELD_WATER_BOOST, WATER ; Mystic Water
|
|
db HELD_GRASS_BOOST, GRASS ; Miracle Seed
|
|
db HELD_ELECTRIC_BOOST, ELECTRIC ; Magnet
|
|
db HELD_PSYCHIC_BOOST, PSYCHIC ; Twistedspoon
|
|
db HELD_ICE_BOOST, ICE ; Nevermeltice
|
|
db HELD_DRAGON_BOOST, DRAGON ; Dragon Scale
|
|
db HELD_DARK_BOOST, DARK ; Blackglasses
|
|
db HELD_STEEL_BOOST, STEEL ; Metal Coat
|
|
db $ff
|
|
; 35726
|
|
|
|
|
|
BattleCommand3f: ; 35726
|
|
; constantdamage
|
|
|
|
ld hl, BattleMonLevel
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35731
|
|
ld hl, EnemyMonLevel
|
|
|
|
.asm_35731
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_LEVEL_DAMAGE
|
|
ld b, [hl]
|
|
ld a, 0
|
|
jr z, .asm_3578c
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_PSYWAVE
|
|
jr z, .asm_35758
|
|
|
|
cp EFFECT_SUPER_FANG
|
|
jr z, .asm_3576b
|
|
|
|
cp EFFECT_REVERSAL
|
|
jr z, .asm_35792
|
|
|
|
ld a, BATTLE_VARS_MOVE_POWER
|
|
call GetBattleVar
|
|
ld b, a
|
|
ld a, $0
|
|
jr .asm_3578c
|
|
|
|
.asm_35758
|
|
ld a, b
|
|
srl a
|
|
add b
|
|
ld b, a
|
|
.asm_3575d
|
|
call BattleRandom
|
|
and a
|
|
jr z, .asm_3575d ; 35761 $fa
|
|
cp b
|
|
jr nc, .asm_3575d ; 35764 $f7
|
|
ld b, a
|
|
ld a, $0
|
|
jr .asm_3578c ; 35769 $21
|
|
.asm_3576b
|
|
ld hl, EnemyMonHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35776 ; 35771 $3
|
|
ld hl, BattleMonHP
|
|
.asm_35776
|
|
ld a, [hli]
|
|
srl a
|
|
ld b, a
|
|
ld a, [hl]
|
|
rr a
|
|
push af
|
|
ld a, b
|
|
pop bc
|
|
and a
|
|
jr nz, .asm_3578c ; 35781 $9
|
|
or b
|
|
ld a, $0
|
|
jr nz, .asm_3578c ; 35786 $4
|
|
ld b, $1
|
|
jr .asm_3578c ; 3578a $0
|
|
.asm_3578c
|
|
ld hl, CurDamage
|
|
ld [hli], a
|
|
ld [hl], b
|
|
ret
|
|
.asm_35792
|
|
ld hl, BattleMonHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_3579d ; 35798 $3
|
|
ld hl, EnemyMonHP
|
|
.asm_3579d
|
|
xor a
|
|
ld [$ffb3], a
|
|
ld [hMultiplicand + 0], a
|
|
ld a, [hli]
|
|
ld [hMultiplicand + 1], a
|
|
ld a, [hli]
|
|
ld [hMultiplicand + 2], a
|
|
ld a, $30
|
|
ld [hMultiplier], a
|
|
call Multiply
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld a, [hl]
|
|
ld [hDivisor], a
|
|
ld a, b
|
|
and a
|
|
jr z, .asm_357d6
|
|
|
|
ld a, [$ffb7]
|
|
srl b
|
|
rr a
|
|
srl b
|
|
rr a
|
|
ld [hDivisor], a
|
|
ld a, [hProduct + 2]
|
|
ld b, a
|
|
srl b
|
|
ld a, [hProduct + 3]
|
|
rr a
|
|
srl b
|
|
rr a
|
|
ld [hDividend + 3], a
|
|
ld a, b
|
|
ld [hDividend + 2], a
|
|
|
|
.asm_357d6
|
|
ld b, $4
|
|
call Divide
|
|
ld a, [hQuotient + 2]
|
|
ld b, a
|
|
ld hl, .FlailPower
|
|
|
|
.asm_357e1
|
|
ld a, [hli]
|
|
cp b
|
|
jr nc, .asm_357e8
|
|
inc hl
|
|
jr .asm_357e1
|
|
|
|
.asm_357e8
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [hl]
|
|
jr nz, .notPlayersTurn
|
|
|
|
ld hl, wPlayerMoveStruct + MOVE_POWER
|
|
ld [hl], a
|
|
push hl
|
|
call PlayerAttackDamage
|
|
jr .notEnemysTurn
|
|
|
|
.notPlayersTurn
|
|
ld hl, wEnemyMoveStruct + MOVE_POWER
|
|
ld [hl], a
|
|
push hl
|
|
call EnemyAttackDamage
|
|
|
|
.notEnemysTurn
|
|
call BattleCommand_DamageCalcWithStats
|
|
pop hl
|
|
ld [hl], 1
|
|
ret
|
|
|
|
.FlailPower
|
|
; px, bp
|
|
db 1, 200
|
|
db 4, 150
|
|
db 9, 100
|
|
db 16, 80
|
|
db 32, 40
|
|
db 48, 20
|
|
; 35813
|
|
|
|
|
|
BattleCommand40: ; 35813
|
|
; counter
|
|
|
|
ld a, 1
|
|
ld [AttackMissed], a
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
and a
|
|
ret z
|
|
|
|
ld b, a
|
|
callab GetMoveEffect
|
|
ld a, b
|
|
cp EFFECT_COUNTER
|
|
ret z
|
|
|
|
call BattleCommanda3
|
|
ld a, [wd265]
|
|
and a
|
|
ret z
|
|
|
|
call Function36abf
|
|
ret z
|
|
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
dec a
|
|
ld de, StringBuffer1
|
|
call GetMoveData
|
|
|
|
ld a, [StringBuffer1 + 2]
|
|
and a
|
|
ret z
|
|
|
|
ld a, [StringBuffer1 + 3]
|
|
cp SPECIAL
|
|
ret nc
|
|
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
or [hl]
|
|
ret z
|
|
|
|
ld a, [hl]
|
|
add a
|
|
ld [hld], a
|
|
ld a, [hl]
|
|
adc a
|
|
ld [hl], a
|
|
jr nc, .capped
|
|
ld a, $ff
|
|
ld [hli], a
|
|
ld [hl], a
|
|
.capped
|
|
|
|
xor a
|
|
ld [AttackMissed], a
|
|
ret
|
|
; 35864
|
|
|
|
|
|
BattleCommand41: ; 35864
|
|
; encore
|
|
|
|
ld hl, EnemyMonMoves
|
|
ld de, EnemyEncoreCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld hl, BattleMonMoves
|
|
ld de, PlayerEncoreCount
|
|
.ok
|
|
ld a, BATTLE_VARS_LAST_MOVE_OPP
|
|
call GetBattleVar
|
|
and a
|
|
jp z, .failed
|
|
cp STRUGGLE
|
|
jp z, .failed
|
|
cp ENCORE
|
|
jp z, .failed
|
|
cp MIRROR_MOVE
|
|
jp z, .failed
|
|
ld b, a
|
|
|
|
.asm_3588e
|
|
ld a, [hli]
|
|
cp b
|
|
jr nz, .asm_3588e
|
|
|
|
ld bc, $0005
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and $3f
|
|
jp z, .failed
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, .failed
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_ENCORED, [hl]
|
|
jp nz, .failed
|
|
set SUBSTATUS_ENCORED, [hl]
|
|
call BattleRandom
|
|
and $3
|
|
rept 3
|
|
inc a
|
|
endr
|
|
ld [de], a
|
|
call Function36abf
|
|
jr nz, .asm_3591a
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_358ef
|
|
|
|
push hl
|
|
ld a, [LastPlayerMove]
|
|
ld b, a
|
|
ld c, 0
|
|
ld hl, BattleMonMoves
|
|
.asm_358cc
|
|
ld a, [hli]
|
|
cp b
|
|
jr z, .asm_358dd
|
|
inc c
|
|
ld a, c
|
|
cp NUM_MOVES
|
|
jr c, .asm_358cc
|
|
pop hl
|
|
res SUBSTATUS_ENCORED, [hl]
|
|
xor a
|
|
ld [de], a
|
|
jr .failed
|
|
|
|
.asm_358dd
|
|
pop hl
|
|
|
|
ld a, c
|
|
ld [CurMoveNum], a
|
|
ld a, b
|
|
ld [CurPlayerMove], a
|
|
dec a
|
|
ld de, wPlayerMoveStruct
|
|
call GetMoveData
|
|
jr .asm_3591a
|
|
|
|
.asm_358ef
|
|
push hl
|
|
ld a, [LastEnemyMove]
|
|
ld b, a
|
|
ld c, 0
|
|
ld hl, EnemyMonMoves
|
|
.asm_358f9
|
|
ld a, [hli]
|
|
cp b
|
|
jr z, .asm_3590a
|
|
inc c
|
|
ld a, c
|
|
cp NUM_MOVES
|
|
jr c, .asm_358f9
|
|
pop hl
|
|
res SUBSTATUS_ENCORED, [hl]
|
|
xor a
|
|
ld [de], a
|
|
jr .failed
|
|
.asm_3590a
|
|
pop hl
|
|
|
|
ld a, c
|
|
ld [CurEnemyMoveNum], a
|
|
ld a, b
|
|
ld [CurEnemyMove], a
|
|
dec a
|
|
ld de, wEnemyMoveStruct
|
|
call GetMoveData
|
|
|
|
.asm_3591a
|
|
call AnimateCurrentMove
|
|
ld hl, GotAnEncoreText
|
|
jp StdBattleTextBox
|
|
|
|
.failed
|
|
jp PrintDidntAffect2
|
|
; 35926
|
|
|
|
|
|
BattleCommand42: ; 35926
|
|
; painsplit
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, Function359cd
|
|
call CheckSubstituteOpp
|
|
jp nz, Function359cd
|
|
call AnimateCurrentMove
|
|
ld hl, BattleMonMaxHP + 1
|
|
ld de, EnemyMonMaxHP + 1
|
|
call .asm_3597d
|
|
ld a, $1
|
|
ld [wd10a], a
|
|
hlcoord 10, 9
|
|
predef Functionc6e0
|
|
ld hl, EnemyMonHP
|
|
ld a, [hli]
|
|
ld [wd1ed], a
|
|
ld a, [hli]
|
|
ld [wd1ec], a
|
|
ld a, [hli]
|
|
ld [Buffer2], a
|
|
ld a, [hl]
|
|
ld [Buffer1], a
|
|
call Function359ac
|
|
xor a
|
|
ld [wd10a], a
|
|
call ResetDamage
|
|
hlcoord 2, 2
|
|
predef Functionc6e0
|
|
callba Function178000
|
|
|
|
ld hl, SharedPainText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_3597d
|
|
ld a, [hld]
|
|
ld [Buffer1], a
|
|
ld a, [hld]
|
|
ld [Buffer2], a
|
|
ld a, [hld]
|
|
ld b, a
|
|
ld [wd1ec], a
|
|
ld a, [hl]
|
|
ld [wd1ed], a
|
|
rept 2
|
|
dec de
|
|
endr
|
|
ld a, [de]
|
|
dec de
|
|
add b
|
|
ld [CurDamage + 1], a
|
|
ld b, [hl]
|
|
ld a, [de]
|
|
adc b
|
|
srl a
|
|
ld [CurDamage], a
|
|
ld a, [CurDamage + 1]
|
|
rr a
|
|
ld [CurDamage + 1], a
|
|
rept 3
|
|
inc hl
|
|
endr
|
|
rept 3
|
|
inc de
|
|
endr
|
|
|
|
; fallthrough
|
|
; 359ac
|
|
|
|
|
|
Function359ac: ; 359ac
|
|
ld c, [hl]
|
|
dec hl
|
|
ld a, [CurDamage + 1]
|
|
sub c
|
|
ld b, [hl]
|
|
dec hl
|
|
ld a, [CurDamage]
|
|
sbc b
|
|
jr nc, .asm_359c2
|
|
|
|
ld a, [CurDamage]
|
|
ld b, a
|
|
ld a, [CurDamage + 1]
|
|
ld c, a
|
|
.asm_359c2
|
|
ld a, c
|
|
ld [hld], a
|
|
ld [wd1ee], a
|
|
ld a, b
|
|
ld [hli], a
|
|
ld [wd1ef], a
|
|
ret
|
|
; 359cd
|
|
|
|
Function359cd: ; 359cd
|
|
jp PrintDidntAffect2
|
|
; 359d0
|
|
|
|
|
|
BattleCommand43: ; 359d0
|
|
; snore
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVar
|
|
and SLP
|
|
ret nz
|
|
call ResetDamage
|
|
ld a, $1
|
|
ld [AttackMissed], a
|
|
call Function37354
|
|
jp EndMoveEffect
|
|
; 359e6
|
|
|
|
|
|
BattleCommand44: ; 359e6
|
|
; conversion2
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_35a50
|
|
ld hl, BattleMonType1
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_359f7
|
|
ld hl, EnemyMonType1
|
|
.asm_359f7
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
and a
|
|
jr z, .asm_35a50
|
|
push hl
|
|
dec a
|
|
ld hl, Moves + MOVE_TYPE
|
|
call GetMoveAttr
|
|
ld d, a
|
|
pop hl
|
|
cp CURSE_T
|
|
jr z, .asm_35a50
|
|
call AnimateCurrentMove
|
|
call BattleCommand_SwitchTurn
|
|
|
|
.asm_35a13
|
|
call BattleRandom
|
|
and $1f
|
|
cp UNUSED_TYPES
|
|
jr c, .asm_35a24
|
|
cp UNUSED_TYPES_END
|
|
jr c, .asm_35a13
|
|
cp TYPES_END
|
|
jr nc, .asm_35a13
|
|
.asm_35a24
|
|
ld [hli], a
|
|
ld [hld], a
|
|
push hl
|
|
ld a, BATTLE_VARS_MOVE_TYPE
|
|
call GetBattleVarAddr
|
|
push af
|
|
push hl
|
|
ld a, d
|
|
ld [hl], a
|
|
call HowEffectiveIsTheMovetypeAgainstTheEnemyPkmn
|
|
pop hl
|
|
pop af
|
|
ld [hl], a
|
|
pop hl
|
|
ld a, [wd265]
|
|
cp $a
|
|
jr nc, .asm_35a13
|
|
call BattleCommand_SwitchTurn
|
|
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
predef GetTypeName
|
|
ld hl, TransformedTypeText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_35a50
|
|
jp Function37354
|
|
; 35a53
|
|
|
|
|
|
BattleCommand45: ; 35a53
|
|
; lockon
|
|
|
|
call CheckSubstituteOpp
|
|
jr nz, .asm_35a6e
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_35a6e
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_LOCK_ON, [hl]
|
|
call AnimateCurrentMove
|
|
|
|
ld hl, TookAimText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_35a6e
|
|
call AnimateFailedMove
|
|
jp PrintDidntAffect
|
|
; 35a74
|
|
|
|
|
|
BattleCommand46: ; 35a74
|
|
; sketch
|
|
|
|
call Function372d8
|
|
|
|
ld a, [wLinkMode]
|
|
and a
|
|
jr z, .asm_35a83
|
|
call AnimateFailedMove
|
|
jp PrintNothingHappened
|
|
.asm_35a83
|
|
|
|
call CheckSubstituteOpp
|
|
jp nz, .asm_35b10
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_TRANSFORMED, [hl]
|
|
jp nz, .asm_35b10
|
|
|
|
ld a, PartyMon1Moves - PartyMon1
|
|
call UserPartyAttr
|
|
ld d, h
|
|
ld e, l
|
|
ld hl, BattleMonMoves
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35aa5
|
|
ld hl, EnemyMonMoves
|
|
.asm_35aa5
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
ld [wd265], a
|
|
ld b, a
|
|
and a
|
|
jr z, .asm_35b10
|
|
cp STRUGGLE
|
|
jr z, .asm_35b10
|
|
ld c, NUM_MOVES
|
|
.asm_35ab7
|
|
ld a, [hli]
|
|
cp b
|
|
jr z, .asm_35b10
|
|
dec c
|
|
jr nz, .asm_35ab7
|
|
dec hl
|
|
ld c, NUM_MOVES
|
|
.asm_35ac1
|
|
dec c
|
|
ld a, [hld]
|
|
cp SKETCH
|
|
jr nz, .asm_35ac1
|
|
inc hl
|
|
ld a, b
|
|
ld [hl], a
|
|
push bc
|
|
push hl
|
|
dec a
|
|
ld hl, Moves + MOVE_PP
|
|
call GetMoveAttr
|
|
pop hl
|
|
ld bc, BattleMonPP - BattleMonMoves
|
|
add hl, bc
|
|
ld [hl], a
|
|
pop bc
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35af6
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr nz, .asm_35af6
|
|
ld a, [hl]
|
|
push bc
|
|
ld hl, wc739
|
|
ld b, 0
|
|
add hl, bc
|
|
ld [hl], a
|
|
ld hl, wc735
|
|
add hl, bc
|
|
pop bc
|
|
ld [hl], b
|
|
jr .asm_35b04
|
|
.asm_35af6
|
|
ld a, [hl]
|
|
push af
|
|
ld l, c
|
|
ld h, 0
|
|
add hl, de
|
|
ld a, b
|
|
ld [hl], a
|
|
pop af
|
|
ld de, $0015
|
|
add hl, de
|
|
ld [hl], a
|
|
.asm_35b04
|
|
call GetMoveName
|
|
call AnimateCurrentMove
|
|
|
|
ld hl, SketchedText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_35b10
|
|
call AnimateFailedMove
|
|
jp PrintDidntAffect
|
|
; 35b16
|
|
|
|
|
|
BattleCommand47: ; 35b16
|
|
; defrostopponent
|
|
; Thaw the opponent if frozen, and
|
|
; raise the user's Attack one stage.
|
|
|
|
call AnimateCurrentMove
|
|
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
call Defrost
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVarAddr
|
|
ld a, [hl]
|
|
push hl
|
|
push af
|
|
|
|
ld a, EFFECT_ATTACK_UP
|
|
ld [hl], a
|
|
call BattleCommand1c
|
|
|
|
pop af
|
|
pop hl
|
|
ld [hl], a
|
|
ret
|
|
; 35b33
|
|
|
|
|
|
BattleCommand48: ; 35b33
|
|
; sleeptalk
|
|
|
|
call Function372d8
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_35ba3
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld hl, BattleMonMoves + 1
|
|
ld a, [DisabledMove]
|
|
ld d, a
|
|
jr z, .asm_35b4f
|
|
ld hl, EnemyMonMoves + 1
|
|
ld a, [EnemyDisabledMove]
|
|
ld d, a
|
|
.asm_35b4f
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVar
|
|
and SLP
|
|
jr z, .asm_35ba3
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .asm_35ba3
|
|
call .asm_35ba9
|
|
jr c, .asm_35ba3
|
|
dec hl
|
|
.asm_35b62
|
|
push hl
|
|
call BattleRandom
|
|
and 3 ; TODO factor in NUM_MOVES
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop hl
|
|
and a
|
|
jr z, .asm_35b62
|
|
ld e, a
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
cp e
|
|
jr z, .asm_35b62
|
|
ld a, e
|
|
cp d
|
|
jr z, .asm_35b62
|
|
call .asm_35bdf
|
|
jr z, .asm_35b62
|
|
ld a, BATTLE_VARS_MOVE
|
|
call GetBattleVarAddr
|
|
ld a, e
|
|
ld [hl], a
|
|
call Function34548
|
|
jr nz, .asm_35b9a
|
|
ld a, [wc689]
|
|
push af
|
|
call BattleCommand0a
|
|
pop af
|
|
ld [wc689], a
|
|
.asm_35b9a
|
|
call Function37e36
|
|
call UpdateMoveData
|
|
jp ResetTurn
|
|
.asm_35ba3
|
|
call AnimateFailedMove
|
|
jp TryPrintButItFailed
|
|
|
|
.asm_35ba9
|
|
push hl
|
|
push de
|
|
push bc
|
|
call .asm_35bb3
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
|
|
.asm_35bb3
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [DisabledMove]
|
|
jr z, .asm_35bbe
|
|
|
|
ld a, [EnemyDisabledMove]
|
|
.asm_35bbe
|
|
ld b, a
|
|
ld a, BATTLE_VARS_MOVE
|
|
call GetBattleVar
|
|
ld c, a
|
|
dec hl
|
|
ld d, NUM_MOVES
|
|
.asm_35bc8
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .asm_35bdb
|
|
|
|
cp c
|
|
jr z, .asm_35bd7
|
|
cp b
|
|
jr z, .asm_35bd7
|
|
|
|
call .asm_35bdf
|
|
jr nz, .asm_35bdd
|
|
|
|
.asm_35bd7
|
|
inc hl
|
|
dec d
|
|
jr nz, .asm_35bc8
|
|
|
|
.asm_35bdb
|
|
scf
|
|
ret
|
|
|
|
.asm_35bdd
|
|
and a
|
|
ret
|
|
|
|
.asm_35bdf
|
|
push hl
|
|
push de
|
|
push bc
|
|
|
|
ld b, a
|
|
callab GetMoveEffect
|
|
ld a, b
|
|
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
|
|
cp EFFECT_SKULL_BASH
|
|
ret z
|
|
cp EFFECT_RAZOR_WIND
|
|
ret z
|
|
cp EFFECT_SKY_ATTACK
|
|
ret z
|
|
cp EFFECT_SOLARBEAM
|
|
ret z
|
|
cp EFFECT_FLY
|
|
ret z
|
|
cp EFFECT_BIDE
|
|
ret
|
|
; 35bff
|
|
|
|
|
|
BattleCommand49: ; 35bff
|
|
; destinybond
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS5
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_DESTINY_BOND, [hl]
|
|
call AnimateCurrentMove
|
|
ld hl, DestinyBondEffectText
|
|
jp StdBattleTextBox
|
|
; 35c0f
|
|
|
|
|
|
BattleCommand4a: ; 35c0f
|
|
; spite
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, .asm_35c91
|
|
ld bc, PartyMon2 - PartyMon1 ; ????
|
|
ld hl, EnemyMonMoves
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35c24
|
|
ld hl, BattleMonMoves
|
|
.asm_35c24
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
and a
|
|
jr z, .asm_35c91
|
|
cp STRUGGLE
|
|
jr z, .asm_35c91
|
|
ld b, a
|
|
ld c, -1
|
|
.asm_35c33
|
|
inc c
|
|
ld a, [hli]
|
|
cp b
|
|
jr nz, .asm_35c33
|
|
ld [wd265], a
|
|
dec hl
|
|
ld b, 0
|
|
push bc
|
|
ld c, BattleMonPP - BattleMonMoves
|
|
add hl, bc
|
|
pop bc
|
|
ld a, [hl]
|
|
and $3f
|
|
jr z, .asm_35c91
|
|
push bc
|
|
call GetMoveName
|
|
call BattleRandom
|
|
and 3
|
|
rept 2
|
|
inc a
|
|
endr
|
|
ld b, a
|
|
ld a, [hl]
|
|
and $3f
|
|
cp b
|
|
jr nc, .asm_35c5b
|
|
ld b, a
|
|
.asm_35c5b
|
|
ld a, [hl]
|
|
sub b
|
|
ld [hl], a
|
|
push af
|
|
ld a, PartyMon1PP - PartyMon1
|
|
call OpponentPartyAttr
|
|
ld d, b
|
|
pop af
|
|
pop bc
|
|
add hl, bc
|
|
ld e, a
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_TRANSFORMED, a
|
|
jr nz, .asm_35c82
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_35c81
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr nz, .asm_35c81
|
|
ld hl, wc739
|
|
add hl, bc
|
|
.asm_35c81
|
|
ld [hl], e
|
|
.asm_35c82
|
|
push de
|
|
call AnimateCurrentMove
|
|
pop de
|
|
ld a, d
|
|
ld [wd265], a
|
|
ld hl, SpiteEffectText
|
|
jp StdBattleTextBox
|
|
.asm_35c91
|
|
jp PrintDidntAffect2
|
|
; 35c94
|
|
|
|
|
|
BattleCommand4b: ; 35c94
|
|
; falseswipe
|
|
|
|
ld hl, EnemyMonHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35c9f
|
|
ld hl, BattleMonHP
|
|
.asm_35c9f
|
|
ld de, CurDamage
|
|
ld c, $2
|
|
push hl
|
|
push de
|
|
call StringCmp
|
|
pop de
|
|
pop hl
|
|
jr c, .asm_35cc7
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
ld a, [hl]
|
|
dec a
|
|
ld [de], a
|
|
inc a
|
|
jr nz, .asm_35cba
|
|
dec de
|
|
ld a, [de]
|
|
dec a
|
|
ld [de], a
|
|
.asm_35cba
|
|
ld a, [CriticalHit]
|
|
cp $2
|
|
jr nz, .asm_35cc5
|
|
xor a
|
|
ld [CriticalHit], a
|
|
.asm_35cc5
|
|
scf
|
|
ret
|
|
.asm_35cc7
|
|
and a
|
|
ret
|
|
; 35cc9
|
|
|
|
|
|
BattleCommand4c: ; 35cc9
|
|
; healbell
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS1
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_NIGHTMARE, [hl]
|
|
ld de, PartyMon1Status
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35cdb
|
|
ld de, OTPartyMon1Status
|
|
.asm_35cdb
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVarAddr
|
|
xor a
|
|
ld [hl], a
|
|
ld h, d
|
|
ld l, e
|
|
ld bc, PartyMon2 - PartyMon1
|
|
ld d, PartyEnd - PartySpecies
|
|
.asm_35ce9
|
|
ld [hl], a
|
|
add hl, bc
|
|
dec d
|
|
jr nz, .asm_35ce9
|
|
call AnimateCurrentMove
|
|
|
|
ld hl, BellChimedText
|
|
call StdBattleTextBox
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jp z, Function365d7
|
|
jp Function365fd
|
|
; 35d00
|
|
|
|
|
|
FarPlayBattleAnimation: ; 35d00
|
|
; play animation de
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVar
|
|
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
|
|
ret nz
|
|
|
|
; fallthrough
|
|
; 35d08
|
|
|
|
PlayFXAnimID: ; 35d08
|
|
ld a, e
|
|
ld [FXAnimIDLo], a
|
|
ld a, d
|
|
ld [FXAnimIDHi], a
|
|
|
|
ld c, 3
|
|
call DelayFrames
|
|
|
|
callab PlayBattleAnim
|
|
|
|
ret
|
|
; 35d1c
|
|
|
|
|
|
Function35d1c: ; 35d1c
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld a, [hl]
|
|
or b
|
|
jr z, .asm_35d7b
|
|
|
|
ld a, c
|
|
and a
|
|
jr nz, .asm_35d31
|
|
|
|
ld a, [EnemySubStatus4]
|
|
bit SUBSTATUS_SUBSTITUTE, a
|
|
jp nz, Function35de0
|
|
.asm_35d31
|
|
ld a, [hld]
|
|
ld b, a
|
|
ld a, [EnemyMonHP + 1]
|
|
ld [wd1ec], a
|
|
sub b
|
|
ld [EnemyMonHP + 1], a
|
|
ld a, [hl]
|
|
ld b, a
|
|
ld a, [EnemyMonHP]
|
|
ld [wd1ec + 1], a
|
|
sbc b
|
|
ld [EnemyMonHP], a
|
|
jr nc, .asm_35d59
|
|
|
|
ld a, [wd1ed]
|
|
ld [hli], a
|
|
ld a, [wd1ec]
|
|
ld [hl], a
|
|
|
|
xor a
|
|
ld hl, EnemyMonHP
|
|
ld [hli], a
|
|
ld [hl], a
|
|
|
|
.asm_35d59
|
|
ld hl, EnemyMonMaxHP
|
|
ld a, [hli]
|
|
ld [Buffer2], a
|
|
ld a, [hl]
|
|
ld [Buffer1], a
|
|
ld hl, EnemyMonHP
|
|
ld a, [hli]
|
|
ld [wd1ef], a
|
|
ld a, [hl]
|
|
ld [wd1ee], a
|
|
hlcoord 2, 2
|
|
xor a
|
|
ld [wd10a], a
|
|
predef Functionc6e0
|
|
.asm_35d7b
|
|
jp RefreshBattleHuds
|
|
; 35d7e
|
|
|
|
|
|
Function35d7e: ; 35d7e
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld a, [hl]
|
|
or b
|
|
jr z, .asm_35ddd
|
|
|
|
ld a, c
|
|
and a
|
|
jr nz, .asm_35d93
|
|
|
|
ld a, [PlayerSubStatus4]
|
|
bit SUBSTATUS_SUBSTITUTE, a
|
|
jp nz, Function35de0
|
|
.asm_35d93
|
|
ld a, [hld]
|
|
ld b, a
|
|
ld a, [BattleMonHP + 1]
|
|
ld [wd1ec], a
|
|
sub b
|
|
ld [BattleMonHP + 1], a
|
|
ld [wd1ee], a
|
|
ld b, [hl]
|
|
ld a, [BattleMonHP]
|
|
ld [wd1ec + 1], a
|
|
sbc b
|
|
ld [BattleMonHP], a
|
|
ld [wd1ee + 1], a
|
|
jr nc, .asm_35dc5
|
|
|
|
ld a, [wd1ec + 1]
|
|
ld [hli], a
|
|
ld a, [wd1ec]
|
|
ld [hl], a
|
|
xor a
|
|
|
|
ld hl, BattleMonHP
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ld hl, wd1ee
|
|
ld [hli], a
|
|
ld [hl], a
|
|
|
|
.asm_35dc5
|
|
ld hl, BattleMonMaxHP
|
|
ld a, [hli]
|
|
ld [Buffer2], a
|
|
ld a, [hl]
|
|
ld [Buffer1], a
|
|
hlcoord 10, 9
|
|
ld a, $1
|
|
ld [wd10a], a
|
|
predef Functionc6e0
|
|
.asm_35ddd
|
|
jp RefreshBattleHuds
|
|
; 35de0
|
|
|
|
|
|
Function35de0: ; 35de0
|
|
|
|
ld hl, SubTookDamageText
|
|
call StdBattleTextBox
|
|
|
|
ld de, EnemySubstituteHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .got_hp
|
|
ld de, PlayerSubstituteHP
|
|
.got_hp
|
|
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
and a
|
|
jr nz, .broke
|
|
|
|
ld a, [de]
|
|
sub [hl]
|
|
ld [de], a
|
|
jr z, .broke
|
|
jr nc, .done
|
|
|
|
.broke
|
|
ld a, BATTLE_VARS_SUBSTATUS4_OPP
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_SUBSTITUTE, [hl]
|
|
|
|
ld hl, SubFadedText
|
|
call StdBattleTextBox
|
|
|
|
call BattleCommand_SwitchTurn
|
|
call BattleCommanda7
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVar
|
|
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
|
|
call z, Function37ec7
|
|
call BattleCommand_SwitchTurn
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVarAddr
|
|
cp EFFECT_MULTI_HIT
|
|
jr z, .ok
|
|
cp EFFECT_DOUBLE_HIT
|
|
jr z, .ok
|
|
cp EFFECT_TWINEEDLE
|
|
jr z, .ok
|
|
cp EFFECT_TRIPLE_KICK
|
|
jr z, .ok
|
|
cp EFFECT_BEAT_UP
|
|
jr z, .ok
|
|
xor a
|
|
ld [hl], a
|
|
.ok
|
|
call RefreshBattleHuds
|
|
.done
|
|
jp ResetDamage
|
|
; 35e40
|
|
|
|
|
|
UpdateMoveData: ; 35e40
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVarAddr
|
|
ld d, h
|
|
ld e, l
|
|
|
|
ld a, BATTLE_VARS_MOVE
|
|
call GetBattleVar
|
|
ld [CurSpecies], a ; not CurSpecies
|
|
ld [wd265], a
|
|
|
|
dec a
|
|
call GetMoveData
|
|
call GetMoveName
|
|
jp CopyName1
|
|
; 35e5c
|
|
|
|
|
|
BattleCommand14: ; 35e5c
|
|
; sleeptarget
|
|
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_SLEEP
|
|
jr nz, .asm_35e70
|
|
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
call GetItemName
|
|
ld hl, ProtectedByText
|
|
jr .asm_35ec6
|
|
|
|
.asm_35e70
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
ld d, h
|
|
ld e, l
|
|
ld a, [de]
|
|
and SLP
|
|
ld hl, AlreadyAsleepText
|
|
jr nz, .asm_35ec6
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, PrintDidntAffect2
|
|
|
|
ld hl, DidntAffect1Text
|
|
call Function35ece
|
|
jr c, .asm_35ec6
|
|
|
|
ld a, [de]
|
|
and a
|
|
jr nz, .asm_35ec6
|
|
|
|
call CheckSubstituteOpp
|
|
jr nz, .asm_35ec6
|
|
|
|
call AnimateCurrentMove
|
|
ld b, $7
|
|
ld a, [InBattleTowerBattle]
|
|
and a
|
|
jr z, .asm_35ea4
|
|
ld b, $3
|
|
|
|
.asm_35ea4
|
|
call BattleRandom
|
|
and b
|
|
jr z, .asm_35ea4
|
|
cp 7
|
|
jr z, .asm_35ea4
|
|
inc a
|
|
ld [de], a
|
|
call UpdateOpponentInParty
|
|
call RefreshBattleHuds
|
|
|
|
ld hl, FellAsleepText
|
|
call StdBattleTextBox
|
|
|
|
callba Function3dde9
|
|
|
|
jp z, Function34216
|
|
ret
|
|
|
|
.asm_35ec6
|
|
push hl
|
|
call AnimateFailedMove
|
|
pop hl
|
|
jp StdBattleTextBox
|
|
; 35ece
|
|
|
|
|
|
Function35ece: ; 35ece
|
|
; Enemy turn
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35eec
|
|
|
|
; Not in link battle
|
|
ld a, [wLinkMode]
|
|
and a
|
|
jr nz, .asm_35eec
|
|
|
|
ld a, [InBattleTowerBattle]
|
|
and a
|
|
jr nz, .asm_35eec
|
|
|
|
; Not locked-on by the enemy
|
|
ld a, [PlayerSubStatus5]
|
|
bit SUBSTATUS_LOCK_ON, a
|
|
jr nz, .asm_35eec
|
|
|
|
call BattleRandom
|
|
cp $40
|
|
ret c
|
|
|
|
.asm_35eec
|
|
xor a
|
|
ret
|
|
; 35eee
|
|
|
|
|
|
BattleCommand13: ; 35eee
|
|
; poisontarget
|
|
|
|
call CheckSubstituteOpp
|
|
ret nz
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
and a
|
|
ret nz
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
ret z
|
|
call Function35fe1
|
|
ret z
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_POISON
|
|
ret z
|
|
ld a, [EffectFailed]
|
|
and a
|
|
ret nz
|
|
call Function37962
|
|
ret nz
|
|
call Function35ff5
|
|
ld de, ANIM_PSN
|
|
call Function37e54
|
|
call RefreshBattleHuds
|
|
|
|
ld hl, WasPoisonedText
|
|
call StdBattleTextBox
|
|
|
|
callba Function3dde9
|
|
ret
|
|
; 35f2c
|
|
|
|
|
|
BattleCommand2f: ; 35f2c
|
|
; poison
|
|
|
|
ld hl, DoesntAffectText
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
jp z, .asm_35fb8
|
|
|
|
call Function35fe1
|
|
jp z, .asm_35fb8
|
|
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVar
|
|
ld b, a
|
|
ld hl, AlreadyPoisonedText
|
|
and 1 << PSN
|
|
jp nz, .asm_35fb8
|
|
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_POISON
|
|
jr nz, .asm_35f5f
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
call GetItemName
|
|
ld hl, ProtectedByText
|
|
jr .asm_35fb8
|
|
|
|
.asm_35f5f
|
|
ld hl, DidntAffect1Text
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVar
|
|
and a
|
|
jr nz, .asm_35fb8
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_35f89
|
|
|
|
ld a, [wLinkMode]
|
|
and a
|
|
jr nz, .asm_35f89
|
|
|
|
ld a, [InBattleTowerBattle]
|
|
and a
|
|
jr nz, .asm_35f89
|
|
|
|
ld a, [PlayerSubStatus5]
|
|
bit SUBSTATUS_LOCK_ON, a
|
|
jr nz, .asm_35f89
|
|
|
|
call BattleRandom
|
|
cp $40
|
|
jr c, .asm_35fb8
|
|
|
|
.asm_35f89
|
|
call CheckSubstituteOpp
|
|
jr nz, .asm_35fb8
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_35fb8
|
|
call Function35fc9
|
|
jr z, .asm_35fa4
|
|
|
|
call Function35fc0
|
|
ld hl, WasPoisonedText
|
|
call StdBattleTextBox
|
|
jr .asm_35fb1
|
|
|
|
.asm_35fa4
|
|
set SUBSTATUS_TOXIC, [hl]
|
|
xor a
|
|
ld [de], a
|
|
call Function35fc0
|
|
|
|
ld hl, BadlyPoisonedText
|
|
call StdBattleTextBox
|
|
|
|
.asm_35fb1
|
|
callba Function3dde9
|
|
ret
|
|
|
|
.asm_35fb8
|
|
push hl
|
|
call AnimateFailedMove
|
|
pop hl
|
|
jp StdBattleTextBox
|
|
; 35fc0
|
|
|
|
|
|
Function35fc0: ; 35fc0
|
|
call AnimateCurrentMove
|
|
call Function35ff5
|
|
jp RefreshBattleHuds
|
|
; 35fc9
|
|
|
|
|
|
Function35fc9: ; 35fc9
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVarAddr
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld de, EnemyToxicCount
|
|
jr z, .ok
|
|
ld de, PlayerToxicCount
|
|
.ok
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_TOXIC
|
|
ret
|
|
; 35fe1
|
|
|
|
|
|
Function35fe1: ; 35fe1
|
|
ld de, EnemyMonType1
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld de, BattleMonType1
|
|
.ok
|
|
ld a, [de]
|
|
inc de
|
|
cp POISON
|
|
ret z
|
|
ld a, [de]
|
|
cp POISON
|
|
ret
|
|
; 35ff5
|
|
|
|
|
|
Function35ff5: ; 35ff5
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
set PSN, [hl]
|
|
jp UpdateOpponentInParty
|
|
; 35fff
|
|
|
|
|
|
BattleCommand15: ; 35fff
|
|
; draintarget
|
|
call Function36011
|
|
ld hl, SuckedHealthText
|
|
jp StdBattleTextBox
|
|
; 36008
|
|
|
|
|
|
BattleCommand16: ; 36008
|
|
; eatdream
|
|
call Function36011
|
|
ld hl, DreamEatenText
|
|
jp StdBattleTextBox
|
|
; 36011
|
|
|
|
|
|
Function36011: ; 36011
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
srl a
|
|
ld [$ffb3], a
|
|
ld b, a
|
|
ld a, [hl]
|
|
rr a
|
|
ld [$ffb4], a
|
|
or b
|
|
jr nz, .asm_36026 ; 0x36020 $4
|
|
ld a, $1
|
|
ld [$ffb4], a
|
|
.asm_36026
|
|
ld hl, BattleMonHP
|
|
ld de, BattleMonMaxHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36037 ; 0x3602f $6
|
|
ld hl, EnemyMonHP
|
|
ld de, EnemyMonMaxHP
|
|
.asm_36037
|
|
ld bc, wd1ed
|
|
ld a, [hli]
|
|
ld [bc], a
|
|
ld a, [hl]
|
|
dec bc
|
|
ld [bc], a
|
|
ld a, [de]
|
|
dec bc
|
|
ld [bc], a
|
|
inc de
|
|
ld a, [de]
|
|
dec bc
|
|
ld [bc], a
|
|
ld a, [$ffb4]
|
|
ld b, [hl]
|
|
add b
|
|
ld [hld], a
|
|
ld [wd1ee], a
|
|
ld a, [$ffb3]
|
|
ld b, [hl]
|
|
adc b
|
|
ld [hli], a
|
|
ld [wd1ef], a
|
|
jr c, .asm_36064 ; 0x36056 $c
|
|
ld a, [hld]
|
|
ld b, a
|
|
ld a, [de]
|
|
dec de
|
|
sub b
|
|
ld a, [hli]
|
|
ld b, a
|
|
ld a, [de]
|
|
inc de
|
|
sbc b
|
|
jr nc, .asm_36070 ; 0x36062 $c
|
|
.asm_36064
|
|
ld a, [de]
|
|
ld [hld], a
|
|
ld [wd1ee], a
|
|
dec de
|
|
ld a, [de]
|
|
ld [hli], a
|
|
ld [wd1ef], a
|
|
inc de
|
|
.asm_36070
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
hlcoord 10, 9
|
|
ld a, $1
|
|
jr z, .asm_3607e ; 0x36078 $4
|
|
hlcoord 2, 2
|
|
xor a
|
|
.asm_3607e
|
|
ld [wd10a], a
|
|
predef Functionc6e0
|
|
call RefreshBattleHuds
|
|
jp UpdateBattleMonInParty
|
|
; 3608c
|
|
|
|
|
|
BattleCommand17: ; 3608c
|
|
; burntarget
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
call CheckSubstituteOpp
|
|
ret nz
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
and a
|
|
jp nz, Defrost
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
ret z
|
|
call Function36e5b
|
|
ret z
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_BURN
|
|
ret z
|
|
ld a, [EffectFailed]
|
|
and a
|
|
ret nz
|
|
call Function37962
|
|
ret nz
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
set BRN, [hl]
|
|
call UpdateOpponentInParty
|
|
ld hl, Function3ec76
|
|
call CallBattleCore
|
|
ld de, ANIM_BRN
|
|
call Function37e54
|
|
call RefreshBattleHuds
|
|
|
|
ld hl, WasBurnedText
|
|
call StdBattleTextBox
|
|
|
|
callba Function3dde9
|
|
ret
|
|
; 360dd
|
|
|
|
|
|
Defrost: ; 360dd
|
|
ld a, [hl]
|
|
and 1 << FRZ
|
|
ret z
|
|
|
|
xor a
|
|
ld [hl], a
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [CurOTMon]
|
|
ld hl, OTPartyMon1Status
|
|
jr z, .ok
|
|
ld hl, PartyMon1Status
|
|
ld a, [CurBattleMon]
|
|
.ok
|
|
|
|
call GetPartyLocation
|
|
xor a
|
|
ld [hl], a
|
|
call UpdateOpponentInParty
|
|
|
|
ld hl, DefrostedOpponentText
|
|
jp StdBattleTextBox
|
|
; 36102
|
|
|
|
|
|
BattleCommand18: ; 36102
|
|
; freezetarget
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
call CheckSubstituteOpp
|
|
ret nz
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
and a
|
|
ret nz
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
ret z
|
|
ld a, [Weather]
|
|
cp WEATHER_SUN
|
|
ret z
|
|
call Function36e5b
|
|
ret z
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_FREEZE
|
|
ret z
|
|
ld a, [EffectFailed]
|
|
and a
|
|
ret nz
|
|
call Function37962
|
|
ret nz
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
set FRZ, [hl]
|
|
call UpdateOpponentInParty
|
|
ld de, ANIM_FRZ
|
|
call Function37e54
|
|
call RefreshBattleHuds
|
|
|
|
ld hl, WasFrozenText
|
|
call StdBattleTextBox
|
|
|
|
callba Function3dde9
|
|
ret nz
|
|
call Function34216
|
|
call EndRechargeOpp
|
|
ld hl, wc740
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36162
|
|
ld hl, wc73f
|
|
.asm_36162
|
|
ld [hl], $1
|
|
ret
|
|
; 36165
|
|
|
|
|
|
BattleCommand19: ; 36165
|
|
; paralyzetarget
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
call CheckSubstituteOpp
|
|
ret nz
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
and a
|
|
ret nz
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
ret z
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_PARALYZE
|
|
ret z
|
|
ld a, [EffectFailed]
|
|
and a
|
|
ret nz
|
|
call Function37962
|
|
ret nz
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
set PAR, [hl]
|
|
call UpdateOpponentInParty
|
|
ld hl, Function3ec39
|
|
call CallBattleCore
|
|
ld de, ANIM_PAR
|
|
call Function37e54
|
|
call RefreshBattleHuds
|
|
call PrintParalyze
|
|
ld hl, Function3dde9
|
|
jp CallBattleCore
|
|
; 361ac
|
|
|
|
|
|
BattleCommand70: ; 361ac
|
|
; attackup
|
|
ld b, $0
|
|
jr BattleCommand1c
|
|
BattleCommand71: ; 361b0
|
|
; defenseup
|
|
ld b, $1
|
|
jr BattleCommand1c
|
|
BattleCommand72: ; 361b4
|
|
; speedup
|
|
ld b, $2
|
|
jr BattleCommand1c
|
|
BattleCommand73: ; 361b8
|
|
; specialattackup
|
|
ld b, $3
|
|
jr BattleCommand1c
|
|
BattleCommand74: ; 361bc
|
|
; specialdefenseup
|
|
ld b, $4
|
|
jr BattleCommand1c
|
|
BattleCommand75: ; 361c0
|
|
; accuracyup
|
|
ld b, $5
|
|
jr BattleCommand1c
|
|
BattleCommand76: ; 361c4
|
|
; evasionup
|
|
ld b, $6
|
|
jr BattleCommand1c
|
|
BattleCommand77: ; 361c8
|
|
; attackup2
|
|
ld b, $10
|
|
jr BattleCommand1c
|
|
BattleCommand78: ; 361cc
|
|
; defenseup2
|
|
ld b, $11
|
|
jr BattleCommand1c
|
|
BattleCommand79: ; 361d0
|
|
; speedup2
|
|
ld b, $12
|
|
jr BattleCommand1c
|
|
BattleCommand7a: ; 361d4
|
|
; specialattackup2
|
|
ld b, $13
|
|
jr BattleCommand1c
|
|
BattleCommand7b: ; 361d8
|
|
; specialdefenseup2
|
|
ld b, $14
|
|
jr BattleCommand1c
|
|
BattleCommand7c: ; 361dc
|
|
; accuracyup2
|
|
ld b, $15
|
|
jr BattleCommand1c
|
|
BattleCommand7d: ; 361e0
|
|
; evasionup2
|
|
ld b, $16
|
|
jr BattleCommand1c
|
|
BattleCommand1c: ; 361e4
|
|
; statup
|
|
call CheckIfStatCanBeRaised
|
|
ld a, [FailedMessage]
|
|
and a
|
|
ret nz
|
|
jp Function36281
|
|
; 361ef
|
|
|
|
|
|
CheckIfStatCanBeRaised: ; 361ef
|
|
ld a, b
|
|
ld [LoweredStat], a
|
|
ld hl, PlayerStatLevels
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_361fe ; 0x361f9 $3
|
|
ld hl, EnemyStatLevels
|
|
.asm_361fe
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, Function3627b
|
|
ld a, [EffectFailed]
|
|
and a
|
|
jp nz, Function3627b
|
|
ld a, [LoweredStat]
|
|
and $f
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
ld b, [hl]
|
|
inc b
|
|
ld a, $d
|
|
cp b
|
|
jp c, Function36270
|
|
ld a, [LoweredStat]
|
|
and $f0
|
|
jr z, .asm_3622b ; 0x36222 $7
|
|
inc b
|
|
ld a, $d
|
|
cp b
|
|
jr nc, .asm_3622b ; 0x36228 $1
|
|
ld b, a
|
|
.asm_3622b
|
|
ld [hl], b
|
|
push hl
|
|
ld a, c
|
|
cp $5
|
|
jr nc, .asm_36268 ; 0x36230 $36
|
|
ld hl, BattleMonStats + 1
|
|
ld de, PlayerStats
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36243 ; 0x3623b $6
|
|
ld hl, EnemyMonStats + 1
|
|
ld de, EnemyStats
|
|
.asm_36243
|
|
push bc
|
|
sla c
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, c
|
|
add e
|
|
ld e, a
|
|
jr nc, .asm_3624f ; 0x3624c $1
|
|
inc d
|
|
.asm_3624f
|
|
pop bc
|
|
ld a, [hld]
|
|
sub 999 % $100
|
|
jr nz, .asm_3625b ; 0x36253 $6
|
|
ld a, [hl]
|
|
sbc 999 / $100
|
|
jp z, Function3626e
|
|
.asm_3625b
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36265 ; 0x3625e $5
|
|
call Function365fd
|
|
jr .asm_36268 ; 0x36263 $3
|
|
.asm_36265
|
|
call Function365d7
|
|
.asm_36268
|
|
pop hl
|
|
xor a
|
|
ld [FailedMessage], a
|
|
ret
|
|
; 3626e
|
|
|
|
|
|
Function3626e: ; 3626e
|
|
pop hl
|
|
dec [hl]
|
|
; fallthrough
|
|
; 36270
|
|
|
|
|
|
Function36270: ; 36270
|
|
ld a, $2
|
|
ld [FailedMessage], a
|
|
ld a, $1
|
|
ld [AttackMissed], a
|
|
ret
|
|
; 3627b
|
|
|
|
|
|
Function3627b: ; 3627b
|
|
ld a, $1
|
|
ld [FailedMessage], a
|
|
ret
|
|
; 36281
|
|
|
|
|
|
Function36281: ; 36281
|
|
ld bc, wc6fe
|
|
ld hl, Function3f447
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36292 ; 0x3628a $6
|
|
ld bc, wc6fa
|
|
ld hl, Function3f486
|
|
.asm_36292
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
cp MINIMIZE
|
|
ret nz
|
|
ld a, $1
|
|
ld [bc], a
|
|
call Function37ed5
|
|
ret nc
|
|
xor a
|
|
ld [$ffd4], a
|
|
call CallBattleCore
|
|
call WaitBGMap
|
|
jp BattleCommandaa
|
|
; 362ad
|
|
|
|
|
|
BattleCommand7e: ; 362ad
|
|
; attackdown
|
|
ld a, ATTACK
|
|
jr BattleCommand1d
|
|
BattleCommand7f: ; 362b1
|
|
; defensedown
|
|
ld a, DEFENSE
|
|
jr BattleCommand1d
|
|
BattleCommand80: ; 362b5
|
|
; speeddown
|
|
ld a, SPEED
|
|
jr BattleCommand1d
|
|
BattleCommand81: ; 362b9
|
|
; specialattackdown
|
|
ld a, SP_ATTACK
|
|
jr BattleCommand1d
|
|
BattleCommand82: ; 362bd
|
|
; specialdefensedown
|
|
ld a, SP_DEFENSE
|
|
jr BattleCommand1d
|
|
BattleCommand83: ; 362c1
|
|
; accuracydown
|
|
ld a, ACCURACY
|
|
jr BattleCommand1d
|
|
BattleCommand84: ; 362c5
|
|
; evasiondown
|
|
ld a, EVASION
|
|
jr BattleCommand1d
|
|
BattleCommand85: ; 362c9
|
|
; attackdown2
|
|
ld a, $10 | ATTACK
|
|
jr BattleCommand1d
|
|
BattleCommand86: ; 362cd
|
|
; defensedown2
|
|
ld a, $10 | DEFENSE
|
|
jr BattleCommand1d
|
|
BattleCommand87: ; 362d1
|
|
; speeddown2
|
|
ld a, $10 | SPEED
|
|
jr BattleCommand1d
|
|
BattleCommand88: ; 362d5
|
|
; specialattackdown2
|
|
ld a, $10 | SP_ATTACK
|
|
jr BattleCommand1d
|
|
BattleCommand89: ; 362d9
|
|
; specialdefensedown2
|
|
ld a, $10 | SP_DEFENSE
|
|
jr BattleCommand1d
|
|
BattleCommand8a: ; 362dd
|
|
; accuracydown2
|
|
ld a, $10 | ACCURACY
|
|
jr BattleCommand1d
|
|
BattleCommand8b: ; 362e1
|
|
; evasiondown2
|
|
ld a, $10 | EVASION
|
|
|
|
BattleCommand1d: ; 362e3
|
|
; statdown
|
|
|
|
ld [LoweredStat], a
|
|
|
|
call Function36391
|
|
jp nz, .Mist
|
|
|
|
ld hl, EnemyStatLevels
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .GetStatLevel
|
|
ld hl, PlayerStatLevels
|
|
|
|
.GetStatLevel
|
|
; Attempt to lower the stat.
|
|
ld a, [LoweredStat]
|
|
and $f
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
ld b, [hl]
|
|
dec b
|
|
jp z, .CantLower
|
|
|
|
; Sharply lower the stat if applicable.
|
|
ld a, [LoweredStat]
|
|
and $f0
|
|
jr z, .ComputerMiss
|
|
dec b
|
|
jr nz, .ComputerMiss
|
|
inc b
|
|
|
|
.ComputerMiss
|
|
; Computer opponents have a 1/4 chance of failing.
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .DidntMiss
|
|
|
|
ld a, [wLinkMode]
|
|
and a
|
|
jr nz, .DidntMiss
|
|
|
|
ld a, [InBattleTowerBattle]
|
|
and a
|
|
jr nz, .DidntMiss
|
|
|
|
; Lock-On still always works.
|
|
ld a, [PlayerSubStatus5]
|
|
bit SUBSTATUS_LOCK_ON, a
|
|
jr nz, .DidntMiss
|
|
|
|
; Attacking moves that also lower accuracy are unaffected.
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_ACCURACY_DOWN_HIT
|
|
jr z, .DidntMiss
|
|
|
|
call BattleRandom
|
|
cp $40
|
|
jr c, .Failed
|
|
|
|
.DidntMiss
|
|
call CheckSubstituteOpp
|
|
jr nz, .Failed
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .Failed
|
|
|
|
ld a, [EffectFailed]
|
|
and a
|
|
jr nz, .Failed
|
|
|
|
call CheckHiddenOpponent
|
|
jr nz, .Failed
|
|
|
|
; Accuracy/Evasion reduction don't involve stats.
|
|
ld [hl], b
|
|
ld a, c
|
|
cp ACCURACY
|
|
jr nc, .Hit
|
|
|
|
push hl
|
|
ld hl, EnemyMonAttack + 1
|
|
ld de, EnemyStats
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36366
|
|
ld hl, BattleMonAttack + 1
|
|
ld de, PlayerStats
|
|
.asm_36366
|
|
call Function3641a
|
|
pop hl
|
|
jr z, .CouldntLower
|
|
|
|
.Hit
|
|
xor a
|
|
ld [FailedMessage], a
|
|
ret
|
|
|
|
.CouldntLower
|
|
inc [hl]
|
|
.CantLower
|
|
ld a, 3
|
|
ld [FailedMessage], a
|
|
ld a, 1
|
|
ld [AttackMissed], a
|
|
ret
|
|
|
|
.Failed
|
|
ld a, 1
|
|
ld [FailedMessage], a
|
|
ld [AttackMissed], a
|
|
ret
|
|
|
|
.Mist
|
|
ld a, 2
|
|
ld [FailedMessage], a
|
|
ld a, 1
|
|
ld [AttackMissed], a
|
|
ret
|
|
; 36391
|
|
|
|
|
|
Function36391: ; 36391
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_ATTACK_DOWN
|
|
jr c, .asm_363ae
|
|
cp EFFECT_EVASION_DOWN + 1
|
|
jr c, .asm_363b0
|
|
cp EFFECT_ATTACK_DOWN_2
|
|
jr c, .asm_363ae
|
|
cp EFFECT_EVASION_DOWN_2 + 1
|
|
jr c, .asm_363b0
|
|
cp EFFECT_ATTACK_DOWN_HIT
|
|
jr c, .asm_363ae
|
|
cp EFFECT_EVASION_DOWN_HIT + 1
|
|
jr c, .asm_363b0
|
|
.asm_363ae
|
|
xor a
|
|
ret
|
|
.asm_363b0
|
|
ld a, BATTLE_VARS_SUBSTATUS4_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_MIST, a
|
|
ret
|
|
; 363b8
|
|
|
|
|
|
BattleCommand8c: ; 363b8
|
|
ld a, [FailedMessage]
|
|
and a
|
|
ret nz
|
|
ld a, [LoweredStat]
|
|
and $f
|
|
ld b, a
|
|
inc b
|
|
call GetStatName
|
|
ld hl, .stat
|
|
jp BattleTextBox
|
|
|
|
.stat
|
|
text_jump UnknownText_0x1c0cc6
|
|
start_asm
|
|
|
|
ld hl, .up
|
|
ld a, [LoweredStat]
|
|
and $f0
|
|
ret z
|
|
ld hl, .wayup
|
|
ret
|
|
|
|
.wayup
|
|
text_jump UnknownText_0x1c0cd0
|
|
db "@"
|
|
|
|
.up
|
|
text_jump UnknownText_0x1c0ce0
|
|
db "@"
|
|
|
|
; 363e9
|
|
|
|
|
|
BattleCommand8d: ; 363e9
|
|
ld a, [FailedMessage]
|
|
and a
|
|
ret nz
|
|
ld a, [LoweredStat]
|
|
and $f
|
|
ld b, a
|
|
inc b
|
|
call GetStatName
|
|
ld hl, .stat
|
|
jp BattleTextBox
|
|
|
|
.stat
|
|
text_jump UnknownText_0x1c0ceb
|
|
start_asm
|
|
|
|
ld hl, .fell
|
|
ld a, [LoweredStat]
|
|
and $f0
|
|
ret z
|
|
ld hl, .sharplyfell
|
|
ret
|
|
|
|
.sharplyfell
|
|
text_jump UnknownText_0x1c0cf5
|
|
db "@"
|
|
.fell
|
|
text_jump UnknownText_0x1c0d06
|
|
db "@"
|
|
|
|
; 3641a
|
|
|
|
|
|
Function3641a: ; 3641a
|
|
; Lower stat c from stat struct hl (buffer de).
|
|
|
|
push bc
|
|
sla c
|
|
ld b, 0
|
|
add hl, bc
|
|
; add de, c
|
|
ld a, c
|
|
add e
|
|
ld e, a
|
|
jr nc, .asm_36426
|
|
inc d
|
|
.asm_36426
|
|
pop bc
|
|
|
|
; The lowest possible stat is 1.
|
|
ld a, [hld]
|
|
sub 1
|
|
jr nz, .asm_3642f
|
|
ld a, [hl]
|
|
and a
|
|
ret z
|
|
|
|
.asm_3642f
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .Player
|
|
|
|
call BattleCommand_SwitchTurn
|
|
call Function365d7
|
|
call BattleCommand_SwitchTurn
|
|
jr .end
|
|
|
|
.Player
|
|
call BattleCommand_SwitchTurn
|
|
call Function365fd
|
|
call BattleCommand_SwitchTurn
|
|
.end
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
; 3644c
|
|
|
|
|
|
BattleCommand8e: ; 3644c
|
|
; statupfailtext
|
|
ld a, [FailedMessage]
|
|
and a
|
|
ret z
|
|
push af
|
|
call BattleCommandaa
|
|
pop af
|
|
dec a
|
|
jp z, TryPrintButItFailed
|
|
ld a, [LoweredStat]
|
|
and $f
|
|
ld b, a
|
|
inc b
|
|
call GetStatName
|
|
ld hl, WontRiseAnymoreText
|
|
jp StdBattleTextBox
|
|
; 3646a
|
|
|
|
|
|
BattleCommand8f: ; 3646a
|
|
; statdownfailtext
|
|
ld a, [FailedMessage]
|
|
and a
|
|
ret z
|
|
push af
|
|
call BattleCommandaa
|
|
pop af
|
|
dec a
|
|
jp z, TryPrintButItFailed
|
|
dec a
|
|
ld hl, ProtectedByMistText
|
|
jp z, StdBattleTextBox
|
|
ld a, [LoweredStat]
|
|
and $f
|
|
ld b, a
|
|
inc b
|
|
call GetStatName
|
|
ld hl, WontDropAnymoreText
|
|
jp StdBattleTextBox
|
|
; 3648f
|
|
|
|
|
|
GetStatName: ; 3648f
|
|
ld hl, .names
|
|
ld c, "@"
|
|
.CheckName
|
|
dec b
|
|
jr z, .Copy
|
|
.GetName
|
|
ld a, [hli]
|
|
cp c
|
|
jr z, .CheckName
|
|
jr .GetName
|
|
.Copy
|
|
ld de, StringBuffer2
|
|
ld bc, StringBuffer3 - StringBuffer2
|
|
jp CopyBytes
|
|
|
|
.names
|
|
db "ATTACK@"
|
|
db "DEFENSE@"
|
|
db "SPEED@"
|
|
db "SPCL.ATK@"
|
|
db "SPCL.DEF@"
|
|
db "ACCURACY@"
|
|
db "EVASION@"
|
|
db "ABILITY@"
|
|
; 364e6
|
|
|
|
|
|
Table0x364e6: ; 364e6
|
|
db 25, 100
|
|
db 28, 100
|
|
db 33, 100
|
|
db 40, 100
|
|
db 50, 100
|
|
db 66, 100
|
|
; 364f2
|
|
|
|
|
|
StatLevelMulipliers: ; 364f2
|
|
db 1, 1 ; 1.0x
|
|
db 15, 10 ; 1.5x
|
|
db 2, 1 ; 2.0x
|
|
db 25, 10 ; 2.5x
|
|
db 3, 1 ; 3.0x
|
|
db 35, 10 ; 3.5x
|
|
db 4, 1 ; 4.0x
|
|
; 36500
|
|
|
|
|
|
BattleCommanda4: ; 36500
|
|
; allstatsup
|
|
|
|
; Attack
|
|
call ResetMiss
|
|
call BattleCommand70
|
|
call BattleCommand8c
|
|
|
|
; Defense
|
|
call ResetMiss
|
|
call BattleCommand71
|
|
call BattleCommand8c
|
|
|
|
; Speed
|
|
call ResetMiss
|
|
call BattleCommand72
|
|
call BattleCommand8c
|
|
|
|
; Special Attack
|
|
call ResetMiss
|
|
call BattleCommand73
|
|
call BattleCommand8c
|
|
|
|
; Special Defense
|
|
call ResetMiss
|
|
call BattleCommand74
|
|
jp BattleCommand8c
|
|
; 3652d
|
|
|
|
|
|
ResetMiss: ; 3652d
|
|
xor a
|
|
ld [AttackMissed], a
|
|
ret
|
|
; 36532
|
|
|
|
|
|
Function36532: ; 36532
|
|
ld [LoweredStat], a
|
|
|
|
ld hl, PlayerStatLevels
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36540
|
|
ld hl, EnemyStatLevels
|
|
|
|
.asm_36540
|
|
ld a, [LoweredStat]
|
|
and $f
|
|
ld c, a
|
|
ld b, 0
|
|
add hl, bc
|
|
ld b, [hl]
|
|
dec b
|
|
jr z, .asm_36589
|
|
|
|
ld a, [LoweredStat]
|
|
and $f0
|
|
jr z, .asm_36558
|
|
dec b
|
|
jr nz, .asm_36558
|
|
inc b
|
|
|
|
.asm_36558
|
|
ld [hl], b
|
|
ld a, c
|
|
cp 5
|
|
jr nc, .asm_36576
|
|
|
|
push hl
|
|
ld hl, BattleMonStats + 1
|
|
ld de, PlayerStats
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36570
|
|
ld hl, EnemyMonStats + 1
|
|
ld de, EnemyStats
|
|
|
|
.asm_36570
|
|
call Function3641a
|
|
pop hl
|
|
jr z, .asm_36588
|
|
|
|
.asm_36576
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36580
|
|
|
|
call Function365fd
|
|
|
|
jr .asm_36583
|
|
|
|
.asm_36580
|
|
call Function365d7
|
|
|
|
.asm_36583
|
|
xor a
|
|
ld [FailedMessage], a
|
|
ret
|
|
|
|
.asm_36588
|
|
inc [hl]
|
|
|
|
.asm_36589
|
|
ld a, 2
|
|
ld [FailedMessage], a
|
|
ret
|
|
; 3658f
|
|
|
|
|
|
BattleCommandac: ; 3658f
|
|
; tristatuschance
|
|
|
|
call BattleCommand90
|
|
|
|
; 1/3 chance of each status
|
|
.loop
|
|
call BattleRandom
|
|
swap a
|
|
and 3
|
|
jr z, .loop
|
|
; jump
|
|
dec a
|
|
ld hl, .ptrs
|
|
rst JumpTable
|
|
ret
|
|
.ptrs
|
|
dw BattleCommand19 ; paralyze
|
|
dw BattleCommand18 ; freeze
|
|
dw BattleCommand17 ; burn
|
|
; 365a7
|
|
|
|
|
|
BattleCommandaf: ; 365a7
|
|
; curl
|
|
ld a, BATTLE_VARS_SUBSTATUS2
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_CURLED, [hl]
|
|
ret
|
|
; 365af
|
|
|
|
|
|
BattleCommanda6: ; 365af
|
|
ld hl, Function3f43d
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_365ba ; 365b5 $3
|
|
ld hl, Function3f47c
|
|
.asm_365ba
|
|
xor a
|
|
ld [$ffd4], a
|
|
call CallBattleCore
|
|
jp WaitBGMap
|
|
; 365c3
|
|
|
|
|
|
BattleCommanda7: ; 365c3
|
|
ld hl, Function3f447
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_365ce ; 365c9 $3
|
|
ld hl, Function3f486
|
|
.asm_365ce
|
|
xor a
|
|
ld [$ffd4], a
|
|
call CallBattleCore
|
|
jp WaitBGMap
|
|
; 365d7
|
|
|
|
|
|
Function365d7: ; 365d7
|
|
ld hl, PlayerAtkLevel
|
|
ld de, PlayerStats
|
|
ld bc, BattleMonAttack
|
|
|
|
ld a, $5
|
|
call Function3661d
|
|
|
|
ld hl, BadgeStatBoosts
|
|
call CallBattleCore
|
|
|
|
call BattleCommand_SwitchTurn
|
|
|
|
ld hl, Function3ec39
|
|
call CallBattleCore
|
|
|
|
ld hl, Function3ec76
|
|
call CallBattleCore
|
|
|
|
jp BattleCommand_SwitchTurn
|
|
; 365fd
|
|
|
|
|
|
Function365fd: ; 365fd
|
|
ld hl, EnemyAtkLevel
|
|
ld de, EnemyStats
|
|
ld bc, EnemyMonAttack
|
|
|
|
ld a, $5
|
|
call Function3661d
|
|
|
|
call BattleCommand_SwitchTurn
|
|
|
|
ld hl, Function3ec39
|
|
call CallBattleCore
|
|
|
|
ld hl, Function3ec76
|
|
call CallBattleCore
|
|
|
|
jp BattleCommand_SwitchTurn
|
|
; 3661d
|
|
|
|
|
|
Function3661d: ; 3661d
|
|
.asm_3661d
|
|
push af
|
|
ld a, [hli]
|
|
push hl
|
|
push bc
|
|
|
|
ld c, a
|
|
dec c
|
|
ld b, 0
|
|
ld hl, Table0x364e6
|
|
rept 2
|
|
add hl, bc
|
|
endr
|
|
|
|
xor a
|
|
ld [hMultiplicand + 0], a
|
|
ld a, [de]
|
|
ld [hMultiplicand + 1], a
|
|
inc de
|
|
ld a, [de]
|
|
ld [hMultiplicand + 2], a
|
|
inc de
|
|
|
|
ld a, [hli]
|
|
ld [hMultiplier], a
|
|
call Multiply
|
|
|
|
ld a, [hl]
|
|
ld [hDivisor], a
|
|
ld b, 4
|
|
call Divide
|
|
|
|
ld a, [hQuotient + 1]
|
|
ld b, a
|
|
ld a, [hQuotient + 2]
|
|
or b
|
|
jr nz, .asm_36651
|
|
|
|
ld a, 1
|
|
ld [hQuotient + 2], a
|
|
jr .asm_36662
|
|
|
|
.asm_36651
|
|
ld a, [hQuotient + 2]
|
|
cp 999 % $100
|
|
ld a, b
|
|
sbc 999 / $100
|
|
jr c, .asm_36662
|
|
|
|
ld a, 999 % $100
|
|
ld [$ffb6], a
|
|
ld a, 999 / $100
|
|
ld [$ffb5], a
|
|
|
|
.asm_36662
|
|
pop bc
|
|
ld a, [$ffb5]
|
|
ld [bc], a
|
|
inc bc
|
|
ld a, [$ffb6]
|
|
ld [bc], a
|
|
inc bc
|
|
pop hl
|
|
pop af
|
|
dec a
|
|
jr nz, .asm_3661d
|
|
|
|
ret
|
|
; 36671
|
|
|
|
|
|
BattleCommand21: ; 36671
|
|
; storeenergy
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVar
|
|
bit SUBSTATUS_BIDE, a
|
|
ret z
|
|
|
|
ld hl, PlayerRolloutCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36684
|
|
ld hl, EnemyRolloutCount
|
|
.asm_36684
|
|
dec [hl]
|
|
jr nz, .asm_366dc
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_BIDE, [hl]
|
|
|
|
ld hl, UnleashedEnergyText
|
|
call StdBattleTextBox
|
|
|
|
ld a, BATTLE_VARS_MOVE_POWER
|
|
call GetBattleVarAddr
|
|
ld a, 1
|
|
ld [hl], a
|
|
ld hl, PlayerDamageTaken + 1
|
|
ld de, wc732
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_366ad
|
|
ld hl, EnemyDamageTaken + 1
|
|
ld de, wc733
|
|
.asm_366ad
|
|
ld a, [hld]
|
|
add a
|
|
ld b, a
|
|
ld [CurDamage + 1], a
|
|
ld a, [hl]
|
|
rl a
|
|
ld [CurDamage], a
|
|
jr nc, .asm_366c3
|
|
ld a, $ff
|
|
ld [CurDamage], a
|
|
ld [CurDamage + 1], a
|
|
.asm_366c3
|
|
or b
|
|
jr nz, .asm_366cb
|
|
ld a, 1
|
|
ld [AttackMissed], a
|
|
.asm_366cb
|
|
xor a
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ld [de], a
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVarAddr
|
|
ld a, BIDE
|
|
ld [hl], a
|
|
|
|
ld b, unleashenergy_command
|
|
jp SkipToBattleCommand
|
|
|
|
.asm_366dc
|
|
ld hl, StoringEnergyText
|
|
call StdBattleTextBox
|
|
jp EndMoveEffect
|
|
; 366e5
|
|
|
|
|
|
BattleCommand22: ; 366e5
|
|
; unleashenergy
|
|
|
|
ld de, PlayerDamageTaken
|
|
ld bc, PlayerRolloutCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_366f6
|
|
ld de, EnemyDamageTaken
|
|
ld bc, EnemyRolloutCount
|
|
.asm_366f6
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_BIDE, [hl]
|
|
xor a
|
|
ld [de], a
|
|
inc de
|
|
ld [de], a
|
|
ld [wPlayerMoveStruct + MOVE_EFFECT], a
|
|
ld [wEnemyMoveStruct + MOVE_EFFECT], a
|
|
call BattleRandom
|
|
and 1
|
|
rept 2
|
|
inc a
|
|
endr
|
|
ld [bc], a
|
|
ld a, 1
|
|
ld [wc689], a
|
|
call AnimateCurrentMove
|
|
jp EndMoveEffect
|
|
; 3671a
|
|
|
|
|
|
BattleCommand3e: ; 3671a
|
|
; checkrampage
|
|
|
|
ld de, PlayerRolloutCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36725 ; 36720 $3
|
|
ld de, EnemyRolloutCount
|
|
.asm_36725
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
bit 1, [hl]
|
|
ret z
|
|
ld a, [de]
|
|
dec a
|
|
ld [de], a
|
|
jr nz, .asm_3674c ; 36730 $1a
|
|
res 1, [hl]
|
|
call BattleCommand_SwitchTurn
|
|
call Function37962
|
|
push af
|
|
call BattleCommand_SwitchTurn
|
|
pop af
|
|
jr nz, .asm_3674c ; 3673f $b
|
|
set 7, [hl]
|
|
call BattleRandom
|
|
and $1
|
|
rept 2
|
|
inc a
|
|
endr
|
|
inc de
|
|
ld [de], a
|
|
.asm_3674c
|
|
ld b, rampage_command
|
|
jp SkipToBattleCommand
|
|
; 36751
|
|
|
|
|
|
BattleCommand3d: ; 36751
|
|
; rampage
|
|
|
|
; No rampage during Sleep Talk.
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVar
|
|
and SLP
|
|
ret nz
|
|
|
|
ld de, PlayerRolloutCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld de, EnemyRolloutCount
|
|
.ok
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_RAMPAGE, [hl]
|
|
call BattleRandom
|
|
and 1
|
|
inc a
|
|
ld [de], a
|
|
ld a, 1
|
|
ld [wc73e], a
|
|
ret
|
|
; 36778
|
|
|
|
|
|
BattleCommanda0: ; 36778
|
|
; teleport
|
|
|
|
ld a, [BattleType]
|
|
cp BATTLETYPE_SHINY
|
|
jr z, .failed
|
|
cp BATTLETYPE_TRAP
|
|
jr z, .failed
|
|
cp BATTLETYPE_CELEBI
|
|
jr z, .failed
|
|
cp BATTLETYPE_SUICUNE
|
|
jr z, .failed
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_CANT_RUN, a
|
|
jr nz, .failed
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_367bf
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr nz, .failed
|
|
ld a, [CurPartyLevel]
|
|
ld b, a
|
|
ld a, [BattleMonLevel]
|
|
cp b
|
|
jr nc, .asm_367df
|
|
add b
|
|
ld c, a
|
|
inc c
|
|
.asm_367ac
|
|
call BattleRandom
|
|
cp c
|
|
jr nc, .asm_367ac ; 367b0 $fa
|
|
srl b
|
|
srl b
|
|
cp b
|
|
jr nc, .asm_367df ; 367b7 $26
|
|
|
|
.failed
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
|
|
.asm_367bf
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr nz, .failed
|
|
ld a, [BattleMonLevel]
|
|
ld b, a
|
|
ld a, [CurPartyLevel]
|
|
cp b
|
|
jr nc, .asm_367df ; 367cd $10
|
|
add b
|
|
ld c, a
|
|
inc c
|
|
.asm_367d2
|
|
call BattleRandom
|
|
cp c
|
|
jr nc, .asm_367d2 ; 367d6 $fa
|
|
srl b
|
|
srl b
|
|
cp b
|
|
jr nc, .asm_367df ; 367dd $0
|
|
.asm_367df
|
|
call UpdateBattleMonInParty
|
|
xor a
|
|
ld [wcfca], a
|
|
inc a
|
|
ld [wd232], a
|
|
ld [wc689], a
|
|
call Function36804
|
|
call BattleCommand0a
|
|
call Function37e36
|
|
ld c, 20
|
|
call DelayFrames
|
|
call Function36804
|
|
|
|
ld hl, FledFromBattleText
|
|
jp StdBattleTextBox
|
|
; 36804
|
|
|
|
|
|
Function36804: ; 36804
|
|
ld a, [wBattleResult]
|
|
and $c0
|
|
or $2
|
|
ld [wBattleResult], a
|
|
ret
|
|
; 3680f
|
|
|
|
|
|
BattleCommand23: ; 3680f
|
|
; forceswitch
|
|
|
|
ld a, [BattleType]
|
|
cp BATTLETYPE_SHINY
|
|
jp z, .asm_36969
|
|
cp BATTLETYPE_TRAP
|
|
jp z, .asm_36969
|
|
cp BATTLETYPE_CELEBI
|
|
jp z, .asm_36969
|
|
cp BATTLETYPE_SUICUNE
|
|
jp z, .asm_36969
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jp nz, .asm_368cd
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_36852 ; 36830 $20
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr nz, .asm_36869 ; 36836 $31
|
|
ld a, [CurPartyLevel]
|
|
ld b, a
|
|
ld a, [BattleMonLevel]
|
|
cp b
|
|
jr nc, .asm_36855 ; 36840 $13
|
|
add b
|
|
ld c, a
|
|
inc c
|
|
.asm_36845
|
|
call BattleRandom
|
|
cp c
|
|
jr nc, .asm_36845 ; 36849 $fa
|
|
srl b
|
|
srl b
|
|
cp b
|
|
jr nc, .asm_36855 ; 36850 $3
|
|
.asm_36852
|
|
jp .asm_36969
|
|
.asm_36855
|
|
call UpdateBattleMonInParty
|
|
xor a
|
|
ld [wcfca], a
|
|
inc a
|
|
ld [wd232], a
|
|
call Function36804
|
|
ld a, [wPlayerMoveStruct + MOVE_ANIM]
|
|
jp .asm_36975
|
|
.asm_36869
|
|
call CountEnemyAliveMons
|
|
jr c, .asm_368ca ; 3686c $5c
|
|
ld a, [wc70f]
|
|
and a
|
|
jr z, .asm_368ca ; 36872 $56
|
|
call UpdateEnemyMonInParty
|
|
ld a, $1
|
|
ld [wc689], a
|
|
call AnimateCurrentMove
|
|
ld c, $14
|
|
call DelayFrames
|
|
hlcoord 1, 0
|
|
lb bc, 4, 10
|
|
call ClearBox
|
|
ld c, $14
|
|
call DelayFrames
|
|
ld a, [OTPartyCount]
|
|
ld b, a
|
|
ld a, [CurOTMon]
|
|
ld c, a
|
|
.asm_3689a
|
|
call BattleRandom
|
|
and $7
|
|
cp b
|
|
jr nc, .asm_3689a ; 368a0 $f8
|
|
cp c
|
|
jr z, .asm_3689a ; 368a3 $f5
|
|
push af
|
|
push bc
|
|
ld hl, OTPartyMon1HP
|
|
call GetPartyLocation
|
|
ld a, [hli]
|
|
or [hl]
|
|
pop bc
|
|
pop de
|
|
jr z, .asm_3689a ; 368b1 $e7
|
|
ld a, d
|
|
inc a
|
|
ld [wc718], a
|
|
callab Function3d4c3
|
|
|
|
ld hl, DraggedOutText
|
|
call StdBattleTextBox
|
|
|
|
ld hl, SpikesDamage
|
|
jp CallBattleCore
|
|
|
|
.asm_368ca
|
|
jp .asm_36969
|
|
|
|
.asm_368cd
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_368f3
|
|
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr nz, .asm_36908
|
|
|
|
ld a, [BattleMonLevel]
|
|
ld b, a
|
|
ld a, [CurPartyLevel]
|
|
cp b
|
|
jr nc, .asm_368f5
|
|
|
|
add b
|
|
ld c, a
|
|
inc c
|
|
.asm_368e6
|
|
call BattleRandom
|
|
cp c
|
|
jr nc, .asm_368e6
|
|
|
|
srl b
|
|
srl b
|
|
cp b
|
|
jr nc, .asm_368f5
|
|
|
|
.asm_368f3
|
|
jr .asm_36969
|
|
|
|
.asm_368f5
|
|
call UpdateBattleMonInParty
|
|
xor a
|
|
ld [wcfca], a
|
|
inc a
|
|
ld [wd232], a
|
|
call Function36804
|
|
ld a, [wEnemyMoveStruct + MOVE_ANIM]
|
|
jr .asm_36975
|
|
|
|
.asm_36908
|
|
call Function36994
|
|
jr c, .asm_36969
|
|
|
|
ld a, [wc70f]
|
|
cp $1
|
|
jr z, .asm_368ca
|
|
|
|
call UpdateBattleMonInParty
|
|
ld a, $1
|
|
ld [wc689], a
|
|
call AnimateCurrentMove
|
|
ld c, $14
|
|
call DelayFrames
|
|
hlcoord 9, 7
|
|
lb bc, 5, 11
|
|
call ClearBox
|
|
ld c, $14
|
|
call DelayFrames
|
|
ld a, [PartyCount]
|
|
ld b, a
|
|
ld a, [CurBattleMon]
|
|
ld c, a
|
|
.asm_3693a
|
|
call BattleRandom
|
|
and $7
|
|
cp b
|
|
jr nc, .asm_3693a
|
|
|
|
cp c
|
|
jr z, .asm_3693a
|
|
|
|
push af
|
|
push bc
|
|
ld hl, PartyMon1HP
|
|
call GetPartyLocation
|
|
ld a, [hli]
|
|
or [hl]
|
|
pop bc
|
|
pop de
|
|
jr z, .asm_3693a
|
|
|
|
ld a, d
|
|
ld [CurPartyMon], a
|
|
ld hl, Function3db32
|
|
call CallBattleCore
|
|
|
|
ld hl, DraggedOutText
|
|
call StdBattleTextBox
|
|
|
|
ld hl, SpikesDamage
|
|
jp CallBattleCore
|
|
|
|
.asm_36969
|
|
call BattleCommand0a
|
|
call BattleCommandaa
|
|
call BattleCommand0c
|
|
jp PrintButItFailed
|
|
|
|
.asm_36975
|
|
push af
|
|
call Function36804
|
|
ld a, $1
|
|
ld [wc689], a
|
|
call AnimateCurrentMove
|
|
ld c, $14
|
|
call DelayFrames
|
|
pop af
|
|
|
|
ld hl, FledInFearText
|
|
cp $2e
|
|
jr z, .asm_36991
|
|
ld hl, BlownAwayText
|
|
.asm_36991
|
|
jp StdBattleTextBox
|
|
; 36994
|
|
|
|
|
|
Function36994: ; 36994
|
|
ld a, [PartyCount]
|
|
ld d, a
|
|
ld e, 0
|
|
ld bc, PartyMon2 - PartyMon1
|
|
.asm_3699d
|
|
ld a, [CurBattleMon]
|
|
cp e
|
|
jr z, .asm_369ae
|
|
|
|
ld a, e
|
|
ld hl, PartyMon1HP
|
|
call AddNTimes
|
|
ld a, [hli]
|
|
or [hl]
|
|
jr nz, .asm_369b4
|
|
|
|
.asm_369ae
|
|
inc e
|
|
dec d
|
|
jr nz, .asm_3699d
|
|
|
|
scf
|
|
ret
|
|
|
|
.asm_369b4
|
|
and a
|
|
ret
|
|
; 369b6
|
|
|
|
|
|
BattleCommand24: ; 369b6
|
|
; endloop
|
|
|
|
; Loop back to the command before 'critical'.
|
|
|
|
ld de, PlayerRolloutCount
|
|
ld bc, PlayerDamageTaken
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_369c7
|
|
ld de, EnemyRolloutCount
|
|
ld bc, EnemyDamageTaken
|
|
.asm_369c7
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_IN_LOOP, [hl]
|
|
jp nz, .asm_36a43
|
|
set SUBSTATUS_IN_LOOP, [hl]
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVarAddr
|
|
ld a, [hl]
|
|
cp EFFECT_TWINEEDLE
|
|
jr z, .asm_36a3f
|
|
cp EFFECT_DOUBLE_HIT
|
|
ld a, $1
|
|
jr z, .asm_36a3a
|
|
ld a, [hl]
|
|
cp EFFECT_BEAT_UP
|
|
jr z, .asm_369fb
|
|
cp EFFECT_TRIPLE_KICK
|
|
jr nz, .asm_36a2b
|
|
.asm_369ec
|
|
call BattleRandom
|
|
and $3
|
|
jr z, .asm_369ec
|
|
dec a
|
|
jr nz, .asm_36a3a
|
|
ld a, $1
|
|
ld [bc], a
|
|
jr .asm_36a48
|
|
.asm_369fb
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_36a0b
|
|
ld a, [PartyCount]
|
|
cp $1
|
|
jp z, .asm_36a1e
|
|
dec a
|
|
jr .asm_36a3a
|
|
.asm_36a0b
|
|
ld a, [wBattleMode]
|
|
cp $1
|
|
jp z, .asm_36a1e
|
|
ld a, [OTPartyCount]
|
|
cp $1
|
|
jp z, .asm_36a1e
|
|
dec a
|
|
jr .asm_36a3a
|
|
|
|
.asm_36a1e
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_IN_LOOP, [hl]
|
|
call BattleCommanda8
|
|
jp EndMoveEffect
|
|
.asm_36a2b
|
|
call BattleRandom
|
|
and $3
|
|
cp $2
|
|
jr c, .asm_36a39
|
|
call BattleRandom
|
|
and $3
|
|
.asm_36a39
|
|
inc a
|
|
.asm_36a3a
|
|
ld [de], a
|
|
inc a
|
|
ld [bc], a
|
|
jr .asm_36a6b
|
|
.asm_36a3f
|
|
ld a, $1
|
|
jr .asm_36a3a
|
|
|
|
.asm_36a43
|
|
ld a, [de]
|
|
dec a
|
|
ld [de], a
|
|
jr nz, .asm_36a6b
|
|
.asm_36a48
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_IN_LOOP, [hl]
|
|
|
|
ld hl, PlayerHitTimesText
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36a5a
|
|
ld hl, EnemyHitTimesText
|
|
.asm_36a5a
|
|
|
|
push bc
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_BEAT_UP
|
|
jr z, .asm_36a67
|
|
call StdBattleTextBox
|
|
.asm_36a67
|
|
|
|
pop bc
|
|
xor a
|
|
ld [bc], a
|
|
ret
|
|
|
|
; Loop back to the command before 'critical'.
|
|
.asm_36a6b
|
|
ld a, [BattleScriptBufferLoc + 1]
|
|
ld h, a
|
|
ld a, [BattleScriptBufferLoc]
|
|
ld l, a
|
|
.asm_36a73
|
|
ld a, [hld]
|
|
cp $5 ; critical
|
|
jr nz, .asm_36a73
|
|
inc hl
|
|
ld a, h
|
|
ld [BattleScriptBufferLoc + 1], a
|
|
ld a, l
|
|
ld [BattleScriptBufferLoc], a
|
|
ret
|
|
; 36a82
|
|
|
|
|
|
BattleCommand94: ; 36a82
|
|
ld a, [AttackMissed]
|
|
and a
|
|
ret nz
|
|
|
|
call CheckSubstituteOpp
|
|
jr nz, .asm_36a9a
|
|
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVar
|
|
and 1 << FRZ | SLP
|
|
jr nz, .asm_36a9a
|
|
|
|
call Function36abf
|
|
jr z, Function36ab5
|
|
|
|
.asm_36a9a
|
|
ld a, 1
|
|
ld [AttackMissed], a
|
|
ret
|
|
; 36aa0
|
|
|
|
|
|
BattleCommand25: ; 36aa0
|
|
call CheckSubstituteOpp
|
|
ret nz
|
|
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVar
|
|
and 1 << FRZ | SLP
|
|
ret nz
|
|
|
|
call Function36abf
|
|
ret nz
|
|
|
|
ld a, [EffectFailed]
|
|
and a
|
|
ret nz
|
|
|
|
; fallthrough
|
|
; 36ab5
|
|
|
|
|
|
Function36ab5: ; 36ab5
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_FLINCHED, [hl]
|
|
jp EndRechargeOpp
|
|
; 36abf
|
|
|
|
|
|
Function36abf: ; 36abf
|
|
push bc
|
|
ld a, [wc70f]
|
|
ld b, a
|
|
ld a, [hBattleTurn]
|
|
xor b
|
|
pop bc
|
|
ret
|
|
; 36ac9
|
|
|
|
|
|
BattleCommand4d: ; 36ac9
|
|
; kingsrock
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
ret nz
|
|
|
|
call GetUserItem
|
|
ld a, b
|
|
cp HELD_TRADE_EVOLVE ; Only King's Rock has this effect
|
|
ret nz
|
|
|
|
call CheckSubstituteOpp
|
|
ret nz
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVarAddr
|
|
ld d, h
|
|
ld e, l
|
|
call GetUserItem
|
|
call BattleRandom
|
|
cp c
|
|
ret nc
|
|
call EndRechargeOpp
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_FLINCHED, [hl]
|
|
ret
|
|
; 36af3
|
|
|
|
|
|
BattleCommand26: ; 36af3
|
|
; ohko
|
|
|
|
call ResetDamage
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
jr z, .asm_36b2f
|
|
ld hl, EnemyMonLevel
|
|
ld de, BattleMonLevel
|
|
ld bc, wPlayerMoveStruct + MOVE_ACC
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36b12
|
|
push hl
|
|
ld h, d
|
|
ld l, e
|
|
pop de
|
|
ld bc, wEnemyMoveStruct + MOVE_ACC
|
|
.asm_36b12
|
|
ld a, [de]
|
|
sub [hl]
|
|
jr c, .asm_36b2f
|
|
add a
|
|
ld e, a
|
|
ld a, [bc]
|
|
add e
|
|
jr nc, .asm_36b1e
|
|
ld a, $ff
|
|
.asm_36b1e
|
|
ld [bc], a
|
|
call BattleCommand09
|
|
ld hl, CurDamage
|
|
ld a, $ff
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ld a, $2
|
|
ld [CriticalHit], a
|
|
ret
|
|
.asm_36b2f
|
|
ld a, $ff
|
|
ld [CriticalHit], a
|
|
ld a, $1
|
|
ld [AttackMissed], a
|
|
ret
|
|
; 36b3a
|
|
|
|
|
|
BattleCommand3a: ; 36b3a
|
|
; checkcharge
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_CHARGED, [hl]
|
|
ret z
|
|
res SUBSTATUS_CHARGED, [hl]
|
|
res SUBSTATUS_UNDERGROUND, [hl]
|
|
res SUBSTATUS_FLYING, [hl]
|
|
ld b, charge_command
|
|
jp SkipToBattleCommand
|
|
; 36b4d
|
|
|
|
|
|
BattleCommand39: ; 36b4d
|
|
; charge
|
|
|
|
call BattleCommand38
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVar
|
|
and SLP
|
|
jr z, .asm_36b65
|
|
|
|
call BattleCommandaa
|
|
call BattleCommand0c
|
|
call PrintButItFailed
|
|
jp EndMoveEffect
|
|
|
|
.asm_36b65
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_CHARGED, [hl]
|
|
|
|
ld hl, IgnoredOrders2Text
|
|
ld a, [AlreadyDisobeyed]
|
|
and a
|
|
call nz, StdBattleTextBox
|
|
|
|
call BattleCommand0a
|
|
xor a
|
|
ld [wcfca], a
|
|
inc a
|
|
ld [wc689], a
|
|
call Function37e36
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
cp FLY
|
|
jr z, .asm_36b96
|
|
cp DIG
|
|
jr z, .asm_36b96
|
|
call BattleCommand0c
|
|
jr .asm_36b99
|
|
.asm_36b96
|
|
call Function37ec0
|
|
.asm_36b99
|
|
ld a, BATTLE_VARS_SUBSTATUS3
|
|
call GetBattleVarAddr
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld b, a
|
|
cp FLY
|
|
jr z, .asm_36bb0
|
|
cp DIG
|
|
jr nz, .asm_36bb2
|
|
set SUBSTATUS_UNDERGROUND, [hl]
|
|
jr .asm_36bb2
|
|
|
|
.asm_36bb0
|
|
set SUBSTATUS_FLYING, [hl]
|
|
|
|
.asm_36bb2
|
|
call Function34548
|
|
jr nz, .asm_36bc3
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE
|
|
call GetBattleVarAddr
|
|
ld [hl], b
|
|
ld a, BATTLE_VARS_LAST_MOVE
|
|
call GetBattleVarAddr
|
|
ld [hl], b
|
|
|
|
.asm_36bc3
|
|
call ResetDamage
|
|
|
|
ld hl, .UsedText
|
|
call BattleTextBox
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_SKULL_BASH
|
|
ld b, endturn_command
|
|
jp z, SkipToBattleCommand
|
|
jp EndMoveEffect
|
|
|
|
.UsedText
|
|
text_jump UnknownText_0x1c0d0e ; "[USER]"
|
|
start_asm
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
cp RAZOR_WIND
|
|
ld hl, .RazorWind
|
|
jr z, .done
|
|
|
|
cp SOLARBEAM
|
|
ld hl, .Solarbeam
|
|
jr z, .done
|
|
|
|
cp SKULL_BASH
|
|
ld hl, .SkullBash
|
|
jr z, .done
|
|
|
|
cp SKY_ATTACK
|
|
ld hl, .SkyAttack
|
|
jr z, .done
|
|
|
|
cp FLY
|
|
ld hl, .Fly
|
|
jr z, .done
|
|
|
|
cp DIG
|
|
ld hl, .Dig
|
|
|
|
.done
|
|
ret
|
|
|
|
.RazorWind
|
|
; 'made a whirlwind!'
|
|
text_jump UnknownText_0x1c0d12
|
|
db "@"
|
|
|
|
.Solarbeam
|
|
; 'took in sunlight!'
|
|
text_jump UnknownText_0x1c0d26
|
|
db "@"
|
|
|
|
.SkullBash
|
|
; 'lowered its head!'
|
|
text_jump UnknownText_0x1c0d3a
|
|
db "@"
|
|
|
|
.SkyAttack
|
|
; 'is glowing!'
|
|
text_jump UnknownText_0x1c0d4e
|
|
db "@"
|
|
|
|
.Fly
|
|
; 'flew up high!'
|
|
text_jump UnknownText_0x1c0d5c
|
|
db "@"
|
|
|
|
.Dig
|
|
; 'dug a hole!'
|
|
text_jump UnknownText_0x1c0d6c
|
|
db "@"
|
|
; 36c2c
|
|
|
|
|
|
BattleCommand3c: ; 36c2c
|
|
; unused
|
|
ret
|
|
; 36c2d
|
|
|
|
|
|
BattleCommand3b: ; 36c2d
|
|
; traptarget
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
ret nz
|
|
ld hl, wc731
|
|
ld de, wc72f
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36c43
|
|
ld hl, wc730
|
|
ld de, wc72e
|
|
|
|
.asm_36c43
|
|
ld a, [hl]
|
|
and a
|
|
ret nz
|
|
ld a, BATTLE_VARS_SUBSTATUS4_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_SUBSTITUTE, a
|
|
ret nz
|
|
call BattleRandom
|
|
and 3
|
|
rept 3
|
|
inc a
|
|
endr
|
|
ld [hl], a
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld [de], a
|
|
ld b, a
|
|
ld hl, .Traps
|
|
|
|
.asm_36c61
|
|
ld a, [hli]
|
|
cp b
|
|
jr z, .asm_36c69
|
|
rept 2
|
|
inc hl
|
|
endr
|
|
jr .asm_36c61
|
|
|
|
.asm_36c69
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
jp StdBattleTextBox
|
|
|
|
.Traps
|
|
dbw BIND, UsedBindText ; 'used BIND on'
|
|
dbw WRAP, WrappedByText ; 'was WRAPPED by'
|
|
dbw FIRE_SPIN, FireSpinTrapText ; 'was trapped!'
|
|
dbw CLAMP, ClampedByText ; 'was CLAMPED by'
|
|
dbw WHIRLPOOL, WhirlpoolTrapText ; 'was trapped!'
|
|
; 36c7e
|
|
|
|
|
|
BattleCommand28: ; 36c7e
|
|
; mist
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_MIST, [hl]
|
|
jr nz, .asm_36c92
|
|
set SUBSTATUS_MIST, [hl]
|
|
call AnimateCurrentMove
|
|
ld hl, MistText
|
|
jp StdBattleTextBox
|
|
.asm_36c92
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
; 36c98
|
|
|
|
|
|
BattleCommand29: ; 36c98
|
|
; focusenergy
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_FOCUS_ENERGY, [hl]
|
|
jr nz, .asm_36cac
|
|
set SUBSTATUS_FOCUS_ENERGY, [hl]
|
|
call AnimateCurrentMove
|
|
ld hl, GettingPumpedText
|
|
jp StdBattleTextBox
|
|
.asm_36cac
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
; 36cb2
|
|
|
|
|
|
BattleCommand27: ; 36cb2
|
|
; recoil
|
|
|
|
ld hl, BattleMonMaxHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36cbd
|
|
ld hl, EnemyMonMaxHP
|
|
.asm_36cbd
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld d, a
|
|
ld a, [CurDamage]
|
|
ld b, a
|
|
ld a, [CurDamage + 1]
|
|
ld c, a
|
|
srl b
|
|
rr c
|
|
srl b
|
|
rr c
|
|
ld a, b
|
|
or c
|
|
jr nz, .asm_36cd8
|
|
inc c
|
|
.asm_36cd8
|
|
ld a, [hli]
|
|
ld [Buffer2], a
|
|
ld a, [hl]
|
|
ld [Buffer1], a
|
|
rept 2
|
|
dec hl
|
|
endr
|
|
ld a, [hl]
|
|
ld [wd1ec], a
|
|
sub c
|
|
ld [hld], a
|
|
ld [wd1ee], a
|
|
ld a, [hl]
|
|
ld [wd1ed], a
|
|
sbc b
|
|
ld [hl], a
|
|
ld [wd1ef], a
|
|
jr nc, .asm_36cfe
|
|
xor a
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ld hl, wd1ee
|
|
ld [hli], a
|
|
ld [hl], a
|
|
.asm_36cfe
|
|
hlcoord 10, 9
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, $1
|
|
jr z, .asm_36d0c
|
|
hlcoord 2, 2
|
|
xor a
|
|
.asm_36d0c
|
|
ld [wd10a], a
|
|
predef Functionc6e0
|
|
call RefreshBattleHuds
|
|
ld hl, RecoilText
|
|
jp StdBattleTextBox
|
|
; 36d1d
|
|
|
|
|
|
BattleCommand2b: ; 36d1d
|
|
; confusetarget
|
|
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_CONFUSE
|
|
ret z
|
|
ld a, [EffectFailed]
|
|
and a
|
|
ret nz
|
|
call Function37962
|
|
ret nz
|
|
call CheckSubstituteOpp
|
|
ret nz
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_CONFUSED, [hl]
|
|
ret nz
|
|
jr Function36d70
|
|
|
|
|
|
BattleCommand2a: ; 36d3b
|
|
; confuse
|
|
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_CONFUSE
|
|
jr nz, .asm_36d53
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
call GetItemName
|
|
call AnimateFailedMove
|
|
ld hl, ProtectedByText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_36d53
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_CONFUSED, [hl]
|
|
jr z, .asm_36d65
|
|
call AnimateFailedMove
|
|
ld hl, AlreadyConfusedText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_36d65
|
|
call CheckSubstituteOpp
|
|
jr nz, Function36db6
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, Function36db6
|
|
|
|
; fallthrough
|
|
; 36d70
|
|
|
|
|
|
Function36d70: ; 36d70
|
|
ld bc, EnemyConfuseCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36d7b
|
|
ld bc, PlayerConfuseCount
|
|
|
|
.asm_36d7b
|
|
set SUBSTATUS_CONFUSED, [hl]
|
|
call BattleRandom
|
|
and 3
|
|
rept 2
|
|
inc a
|
|
endr
|
|
ld [bc], a
|
|
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_CONFUSE_HIT
|
|
jr z, .asm_36d99
|
|
cp EFFECT_SNORE
|
|
jr z, .asm_36d99
|
|
cp EFFECT_SWAGGER
|
|
jr z, .asm_36d99
|
|
call AnimateCurrentMove
|
|
|
|
.asm_36d99
|
|
ld de, ANIM_CONFUSED
|
|
call Function37e54
|
|
|
|
ld hl, BecameConfusedText
|
|
call StdBattleTextBox
|
|
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_HEAL_STATUS
|
|
jr z, .asm_36db0
|
|
cp HELD_HEAL_CONFUSION
|
|
ret nz
|
|
.asm_36db0
|
|
ld hl, Function3de51
|
|
jp CallBattleCore
|
|
; 36db6
|
|
|
|
Function36db6: ; 36db6
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_CONFUSE_HIT
|
|
ret z
|
|
cp EFFECT_SNORE
|
|
ret z
|
|
cp EFFECT_SWAGGER
|
|
ret z
|
|
jp PrintDidntAffect2
|
|
; 36dc7
|
|
|
|
|
|
BattleCommand30: ; 36dc7
|
|
; paralyze
|
|
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVar
|
|
bit PAR, a
|
|
jr nz, .asm_36e49
|
|
ld a, [TypeModifier]
|
|
and $7f
|
|
jr z, .asm_36e55
|
|
call GetOpponentItem
|
|
ld a, b
|
|
cp HELD_PREVENT_PARALYZE
|
|
jr nz, .asm_36def
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
call GetItemName
|
|
call AnimateFailedMove
|
|
ld hl, ProtectedByText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_36def
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36e0e
|
|
|
|
ld a, [wLinkMode]
|
|
and a
|
|
jr nz, .asm_36e0e
|
|
|
|
ld a, [InBattleTowerBattle]
|
|
and a
|
|
jr nz, .asm_36e0e
|
|
|
|
ld a, [PlayerSubStatus5]
|
|
bit SUBSTATUS_LOCK_ON, a
|
|
jr nz, .asm_36e0e
|
|
|
|
call BattleRandom
|
|
cp $40
|
|
jr c, .asm_36e52
|
|
|
|
.asm_36e0e
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
and a
|
|
jr nz, .asm_36e52
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_36e52
|
|
call CheckSubstituteOpp
|
|
jr nz, .asm_36e52
|
|
ld c, 30
|
|
call DelayFrames
|
|
call AnimateCurrentMove
|
|
ld a, $1
|
|
ld [$ffd4], a
|
|
ld a, BATTLE_VARS_STATUS_OPP
|
|
call GetBattleVarAddr
|
|
set PAR, [hl]
|
|
call UpdateOpponentInParty
|
|
ld hl, Function3ec39
|
|
call CallBattleCore
|
|
call UpdateBattleHuds
|
|
call PrintParalyze
|
|
ld hl, Function3dde9
|
|
jp CallBattleCore
|
|
.asm_36e49
|
|
call AnimateFailedMove
|
|
ld hl, AlreadyParalyzedText
|
|
jp StdBattleTextBox
|
|
.asm_36e52
|
|
jp PrintDidntAffect2
|
|
.asm_36e55
|
|
call AnimateFailedMove
|
|
jp PrintDoesntAffect
|
|
; 36e5b
|
|
|
|
|
|
Function36e5b: ; 36e5b
|
|
; Compare move type to opponent type.
|
|
; Return z if matching the opponent type,
|
|
; unless the move is Normal (Tri Attack).
|
|
|
|
push hl
|
|
|
|
ld hl, EnemyMonType1
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld hl, BattleMonType1
|
|
.ok
|
|
|
|
ld a, BATTLE_VARS_MOVE_TYPE
|
|
call GetBattleVar
|
|
cp NORMAL
|
|
jr z, .normal
|
|
|
|
cp [hl]
|
|
jr z, .return
|
|
|
|
inc hl
|
|
cp [hl]
|
|
|
|
.return
|
|
pop hl
|
|
ret
|
|
|
|
.normal
|
|
ld a, 1
|
|
and a
|
|
pop hl
|
|
ret
|
|
; 36e7c
|
|
|
|
|
|
BattleCommand31: ; 36e7c
|
|
; substitute
|
|
|
|
call BattleCommandaa
|
|
ld hl, BattleMonMaxHP
|
|
ld de, PlayerSubstituteHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .got_hp
|
|
ld hl, EnemyMonMaxHP
|
|
ld de, EnemySubstituteHP
|
|
.got_hp
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVar
|
|
bit SUBSTATUS_SUBSTITUTE, a
|
|
jr nz, .asm_36ef4
|
|
|
|
ld a, [hli]
|
|
ld b, [hl]
|
|
srl a
|
|
rr b
|
|
srl a
|
|
rr b
|
|
rept 2
|
|
dec hl
|
|
endr
|
|
ld a, b
|
|
ld [de], a
|
|
ld a, [hld]
|
|
sub b
|
|
ld e, a
|
|
ld a, [hl]
|
|
sbc 0
|
|
ld d, a
|
|
jr c, .asm_36eff
|
|
ld a, d
|
|
or e
|
|
jr z, .asm_36eff
|
|
ld [hl], d
|
|
inc hl
|
|
ld [hl], e
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_SUBSTITUTE, [hl]
|
|
|
|
ld hl, wc730
|
|
ld de, wc72e
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36ecf
|
|
ld hl, wc731
|
|
ld de, wc72f
|
|
.asm_36ecf
|
|
|
|
xor a
|
|
ld [hl], a
|
|
ld [de], a
|
|
call Function37ed5
|
|
jr c, .asm_36ee8
|
|
|
|
xor a
|
|
ld [wcfca], a
|
|
ld [FXAnimIDHi], a
|
|
ld [wc689], a
|
|
ld a, SUBSTITUTE
|
|
call Function37e44
|
|
jr .asm_36eeb
|
|
|
|
.asm_36ee8
|
|
call BattleCommanda6
|
|
.asm_36eeb
|
|
ld hl, MadeSubstituteText
|
|
call StdBattleTextBox
|
|
jp RefreshBattleHuds
|
|
|
|
.asm_36ef4
|
|
call Function34548
|
|
call nz, BattleCommand0c
|
|
ld hl, HasSubstituteText
|
|
jr .asm_36f08
|
|
|
|
.asm_36eff
|
|
call Function34548
|
|
call nz, BattleCommand0c
|
|
ld hl, TooWeakSubText
|
|
.asm_36f08
|
|
jp StdBattleTextBox
|
|
; 36f0b
|
|
|
|
BattleCommand32: ; 36f0b
|
|
; rechargenextturn
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_RECHARGE, [hl]
|
|
ret
|
|
; 36f13
|
|
|
|
|
|
EndRechargeOpp: ; 36f13
|
|
push hl
|
|
ld a, BATTLE_VARS_SUBSTATUS4_OPP
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_RECHARGE, [hl]
|
|
pop hl
|
|
ret
|
|
; 36f1d
|
|
|
|
|
|
BattleCommand97: ; 36f1d
|
|
; rage
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_RAGE, [hl]
|
|
ret
|
|
; 36f25
|
|
|
|
|
|
BattleCommand98: ; 36f25
|
|
; doubleflyingdamage
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_FLYING, a
|
|
ret z
|
|
jr DoubleDamage
|
|
; 36f2f
|
|
|
|
|
|
BattleCommand99: ; 36f2f
|
|
; doubleundergrounddamage
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_UNDERGROUND, a
|
|
ret z
|
|
|
|
; fallthrough
|
|
; 36f37
|
|
|
|
|
|
DoubleDamage: ; 36f37
|
|
ld hl, CurDamage + 1
|
|
sla [hl]
|
|
dec hl
|
|
rl [hl]
|
|
jr nc, .quit
|
|
|
|
ld a, $ff
|
|
ld [hli], a
|
|
ld [hl], a
|
|
.quit
|
|
ret
|
|
; 36f46
|
|
|
|
|
|
BattleCommand33: ; 36f46
|
|
; mimic
|
|
|
|
call Function372d8
|
|
call BattleCommandaa
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_36f9a
|
|
ld hl, BattleMonMoves
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_36f5d
|
|
ld hl, EnemyMonMoves
|
|
.asm_36f5d
|
|
call CheckHiddenOpponent
|
|
jr nz, .asm_36f9a
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
and a
|
|
jr z, .asm_36f9a
|
|
cp STRUGGLE
|
|
jr z, .asm_36f9a
|
|
ld b, a
|
|
ld c, NUM_MOVES
|
|
.asm_36f71
|
|
ld a, [hli]
|
|
cp b
|
|
jr z, .asm_36f9a
|
|
dec c
|
|
jr nz, .asm_36f71
|
|
dec hl
|
|
.asm_36f79
|
|
ld a, [hld]
|
|
cp MIMIC
|
|
jr nz, .asm_36f79
|
|
inc hl
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
ld [hl], a
|
|
ld [wd265], a
|
|
ld bc, BattleMonPP - BattleMonMoves
|
|
add hl, bc
|
|
ld [hl], 5
|
|
call GetMoveName
|
|
call AnimateCurrentMove
|
|
ld hl, LearnedMoveText
|
|
jp StdBattleTextBox
|
|
.asm_36f9a
|
|
jp Function37357
|
|
; 36f9d
|
|
|
|
|
|
BattleCommand35: ; 36f9d
|
|
; leechseed
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .evaded
|
|
call CheckSubstituteOpp
|
|
jr nz, .evaded
|
|
|
|
ld de, EnemyMonType1
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld de, BattleMonType1
|
|
.ok
|
|
|
|
ld a, [de]
|
|
cp GRASS
|
|
jr z, .grass
|
|
inc de
|
|
ld a, [de]
|
|
cp GRASS
|
|
jr z, .grass
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4_OPP
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_LEECH_SEED, [hl]
|
|
jr nz, .evaded
|
|
set SUBSTATUS_LEECH_SEED, [hl]
|
|
call AnimateCurrentMove
|
|
ld hl, WasSeededText
|
|
jp StdBattleTextBox
|
|
|
|
.grass
|
|
call AnimateFailedMove
|
|
jp PrintDoesntAffect
|
|
|
|
.evaded
|
|
call AnimateFailedMove
|
|
ld hl, EvadedText
|
|
jp StdBattleTextBox
|
|
; 36fe1
|
|
|
|
|
|
BattleCommand36: ; 36fe1
|
|
call AnimateCurrentMove
|
|
callba MobileFn_1060e5
|
|
jp PrintNothingHappened
|
|
; 36fed
|
|
|
|
|
|
BattleCommand37: ; 36fed
|
|
; disable
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_37059
|
|
|
|
ld de, EnemyDisableCount
|
|
ld hl, EnemyMonMoves
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_37004
|
|
ld de, PlayerDisableCount
|
|
ld hl, BattleMonMoves
|
|
.asm_37004
|
|
|
|
ld a, [de]
|
|
and a
|
|
jr nz, .asm_37059
|
|
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
and a
|
|
jr z, .asm_37059
|
|
cp STRUGGLE
|
|
jr z, .asm_37059
|
|
|
|
ld b, a
|
|
ld c, $ff
|
|
.asm_37017
|
|
inc c
|
|
ld a, [hli]
|
|
cp b
|
|
jr nz, .asm_37017
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld hl, EnemyMonPP
|
|
jr z, .asm_37027
|
|
ld hl, BattleMonPP
|
|
.asm_37027
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, [hl]
|
|
and a
|
|
jr z, .asm_37059
|
|
.asm_3702e
|
|
call BattleRandom
|
|
and 7
|
|
jr z, .asm_3702e
|
|
inc a
|
|
inc c
|
|
swap c
|
|
add c
|
|
ld [de], a
|
|
call AnimateCurrentMove
|
|
ld hl, DisabledMove
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_37047
|
|
inc hl
|
|
.asm_37047
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
ld [hl], a
|
|
ld [wd265], a
|
|
call GetMoveName
|
|
ld hl, WasDisabledText
|
|
jp StdBattleTextBox
|
|
.asm_37059
|
|
jp Function37354
|
|
; 3705c
|
|
|
|
|
|
BattleCommand1e: ; 3705c
|
|
; payday
|
|
|
|
xor a
|
|
ld hl, StringBuffer1
|
|
ld [hli], a
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [BattleMonLevel]
|
|
jr z, .ok
|
|
ld a, [EnemyMonLevel]
|
|
.ok
|
|
|
|
add a
|
|
ld hl, wPayDayMoney + 2
|
|
add [hl]
|
|
ld [hld], a
|
|
jr nc, .done
|
|
inc [hl]
|
|
dec hl
|
|
jr nz, .done
|
|
inc [hl]
|
|
.done
|
|
ld hl, CoinsScatteredText
|
|
jp StdBattleTextBox
|
|
; 3707f
|
|
|
|
|
|
BattleCommand1f: ; 3707f
|
|
; conversion
|
|
|
|
ld hl, BattleMonMoves
|
|
ld de, BattleMonType1
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_37090
|
|
ld hl, EnemyMonMoves
|
|
ld de, EnemyMonType1
|
|
.asm_37090
|
|
push de
|
|
ld c, 0
|
|
ld de, StringBuffer1
|
|
.asm_37096
|
|
push hl
|
|
ld b, 0
|
|
add hl, bc
|
|
ld a, [hl]
|
|
pop hl
|
|
and a
|
|
jr z, .asm_370b2
|
|
push hl
|
|
push bc
|
|
dec a
|
|
ld hl, Moves + MOVE_TYPE
|
|
call GetMoveAttr
|
|
ld [de], a
|
|
inc de
|
|
pop bc
|
|
pop hl
|
|
inc c
|
|
ld a, c
|
|
cp NUM_MOVES
|
|
jr c, .asm_37096
|
|
.asm_370b2
|
|
ld a, $ff
|
|
ld [de], a
|
|
inc de
|
|
ld [de], a
|
|
inc de
|
|
ld [de], a
|
|
pop de
|
|
ld hl, StringBuffer1
|
|
.asm_370bd
|
|
ld a, [hl]
|
|
cp $ff
|
|
jr z, .asm_370d3
|
|
cp CURSE_T
|
|
jr z, .asm_370d0
|
|
ld a, [de]
|
|
cp [hl]
|
|
jr z, .asm_370d0
|
|
inc de
|
|
ld a, [de]
|
|
dec de
|
|
cp [hl]
|
|
jr nz, .asm_370d9_a
|
|
.asm_370d0
|
|
inc hl
|
|
jr .asm_370bd
|
|
.asm_370d3
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
.asm_370d9_a
|
|
.asm_370d9_b
|
|
call BattleRandom
|
|
and 3 ; TODO factor in NUM_MOVES
|
|
ld c, a
|
|
ld b, 0
|
|
ld hl, StringBuffer1
|
|
add hl, bc
|
|
ld a, [hl]
|
|
cp $ff
|
|
jr z, .asm_370d9_b
|
|
cp CURSE_T
|
|
jr z, .asm_370d9_b
|
|
ld a, [de]
|
|
cp [hl]
|
|
jr z, .asm_370d9_b
|
|
inc de
|
|
ld a, [de]
|
|
dec de
|
|
cp [hl]
|
|
jr z, .asm_370d9_b
|
|
ld a, [hl]
|
|
ld [de], a
|
|
inc de
|
|
ld [de], a
|
|
ld [wd265], a
|
|
callba GetTypeName
|
|
call AnimateCurrentMove
|
|
ld hl, TransformedTypeText
|
|
jp StdBattleTextBox
|
|
; 3710e
|
|
|
|
|
|
BattleCommand20: ; 3710e
|
|
; resetstats
|
|
|
|
ld a, 7 ; neutral
|
|
ld hl, PlayerStatLevels
|
|
call .Fill
|
|
ld hl, EnemyStatLevels
|
|
call .Fill
|
|
|
|
ld a, [hBattleTurn]
|
|
push af
|
|
|
|
call SetPlayerTurn
|
|
call Function365d7
|
|
call SetEnemyTurn
|
|
call Function365fd
|
|
|
|
pop af
|
|
ld [hBattleTurn], a
|
|
|
|
call AnimateCurrentMove
|
|
|
|
ld hl, EliminatedStatsText
|
|
jp StdBattleTextBox
|
|
|
|
.Fill
|
|
ld b, PlayerStatLevelsEnd - PlayerStatLevels
|
|
.next
|
|
ld [hli], a
|
|
dec b
|
|
jr nz, .next
|
|
ret
|
|
; 3713e
|
|
|
|
|
|
BattleCommand2c: ; 3713e
|
|
; heal
|
|
|
|
ld de, BattleMonHP
|
|
ld hl, BattleMonMaxHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_3714f
|
|
ld de, EnemyMonHP
|
|
ld hl, EnemyMonMaxHP
|
|
.asm_3714f
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld b, a
|
|
push hl
|
|
push de
|
|
push bc
|
|
ld c, 2
|
|
call StringCmp
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
jp z, .asm_371c4
|
|
ld a, b
|
|
cp REST
|
|
jr nz, .asm_37199
|
|
push hl
|
|
push de
|
|
push af
|
|
call BattleCommandaa
|
|
ld a, BATTLE_VARS_SUBSTATUS5
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_TOXIC, [hl]
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVarAddr
|
|
ld a, [hl]
|
|
and a
|
|
ld [hl], REST_TURNS + 1
|
|
ld hl, WentToSleepText
|
|
jr z, .asm_37186
|
|
ld hl, RestedText
|
|
.asm_37186
|
|
call StdBattleTextBox
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_37193
|
|
call Function365d7
|
|
jr .asm_37196
|
|
.asm_37193
|
|
call Function365fd
|
|
.asm_37196
|
|
pop af
|
|
pop de
|
|
pop hl
|
|
.asm_37199
|
|
jr z, .asm_371a3
|
|
ld hl, GetHalfMaxHP
|
|
call CallBattleCore
|
|
jr .asm_371a9
|
|
.asm_371a3
|
|
ld hl, GetMaxHP
|
|
call CallBattleCore
|
|
.asm_371a9
|
|
call AnimateCurrentMove
|
|
call BattleCommand_SwitchTurn
|
|
ld hl, Function3ccef
|
|
call CallBattleCore
|
|
call BattleCommand_SwitchTurn
|
|
call UpdateUserInParty
|
|
call RefreshBattleHuds
|
|
ld hl, RegainedHealthText
|
|
jp StdBattleTextBox
|
|
|
|
.asm_371c4
|
|
call AnimateFailedMove
|
|
ld hl, HPIsFullText
|
|
jp StdBattleTextBox
|
|
; 371cd
|
|
|
|
|
|
BattleCommand2d: ; 371cd
|
|
; transform
|
|
|
|
call Function372d8
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_TRANSFORMED, [hl]
|
|
jp nz, Function372d2
|
|
call CheckHiddenOpponent
|
|
jp nz, Function372d2
|
|
xor a
|
|
ld [wcfca], a
|
|
ld [FXAnimIDHi], a
|
|
ld a, $1
|
|
ld [wc689], a
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_SUBSTITUTE, [hl]
|
|
push af
|
|
jr z, .asm_37200
|
|
call Function34548
|
|
jr nz, .asm_37200
|
|
ld a, SUBSTITUTE
|
|
call Function37e44
|
|
.asm_37200
|
|
ld a, BATTLE_VARS_SUBSTATUS5
|
|
call GetBattleVarAddr
|
|
set SUBSTATUS_TRANSFORMED, [hl]
|
|
call ResetActorDisable
|
|
ld hl, BattleMonSpecies
|
|
ld de, EnemyMonSpecies
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_3721f
|
|
ld hl, EnemyMonSpecies
|
|
ld de, BattleMonSpecies
|
|
xor a
|
|
ld [CurMoveNum], a
|
|
.asm_3721f
|
|
push hl
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc hl
|
|
rept 2
|
|
inc de
|
|
endr
|
|
ld bc, NUM_MOVES
|
|
call CopyBytes
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_3723a
|
|
ld a, [de]
|
|
ld [wc6f2], a
|
|
inc de
|
|
ld a, [de]
|
|
ld [wc6f2 + 1], a
|
|
dec de
|
|
.asm_3723a
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
ld bc, $000c
|
|
add hl, bc
|
|
push hl
|
|
ld h, d
|
|
ld l, e
|
|
add hl, bc
|
|
ld d, h
|
|
ld e, l
|
|
pop hl
|
|
ld bc, $000c
|
|
call CopyBytes
|
|
ld bc, $ffe2
|
|
add hl, bc
|
|
push de
|
|
ld d, h
|
|
ld e, l
|
|
pop hl
|
|
ld bc, $ffe8
|
|
add hl, bc
|
|
ld b, NUM_MOVES
|
|
.asm_3725f
|
|
ld a, [de]
|
|
inc de
|
|
and a
|
|
jr z, .asm_3726c
|
|
cp SKETCH
|
|
ld a, 1
|
|
jr z, .asm_3726c
|
|
ld a, 5
|
|
.asm_3726c
|
|
ld [hli], a
|
|
dec b
|
|
jr nz, .asm_3725f
|
|
pop hl
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
call GetPokemonName
|
|
ld hl, EnemyStats
|
|
ld de, PlayerStats
|
|
ld bc, $000a
|
|
call BattleSideCopy
|
|
ld hl, EnemyStatLevels
|
|
ld de, PlayerStatLevels
|
|
ld bc, $0008
|
|
call BattleSideCopy
|
|
call Function37ed5
|
|
jr c, .asm_372a8
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, [wc6fe]
|
|
jr z, .asm_372a0
|
|
ld a, [wc6fa]
|
|
.asm_372a0
|
|
and a
|
|
jr nz, .asm_372a8
|
|
call Function37e36
|
|
jr .asm_372ae
|
|
.asm_372a8
|
|
call BattleCommandaa
|
|
call BattleCommanda6
|
|
.asm_372ae
|
|
xor a
|
|
ld [wcfca], a
|
|
ld [FXAnimIDHi], a
|
|
ld a, $2
|
|
ld [wc689], a
|
|
pop af
|
|
ld a, SUBSTITUTE
|
|
call nz, Function37e44
|
|
ld hl, TransformedText
|
|
jp StdBattleTextBox
|
|
; 372c6
|
|
|
|
|
|
BattleSideCopy: ; 372c6
|
|
; Copy bc bytes from hl to de if it's the player's turn.
|
|
; Copy bc bytes from de to hl if it's the enemy's turn.
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .copy
|
|
|
|
; Swap hl and de
|
|
push hl
|
|
ld h, d
|
|
ld l, e
|
|
pop de
|
|
.copy
|
|
jp CopyBytes
|
|
; 372d2
|
|
|
|
|
|
Function372d2: ; 372d2
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
; 372d8
|
|
|
|
|
|
Function372d8: ; 372d8
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE
|
|
call GetBattleVarAddr
|
|
xor a
|
|
ld [hl], a
|
|
|
|
ld a, BATTLE_VARS_LAST_MOVE
|
|
call GetBattleVarAddr
|
|
xor a
|
|
ld [hl], a
|
|
ret
|
|
; 372e7
|
|
|
|
|
|
ResetActorDisable: ; 372e7
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .player
|
|
|
|
xor a
|
|
ld [EnemyDisableCount], a
|
|
ld [EnemyDisabledMove], a
|
|
ret
|
|
|
|
.player
|
|
xor a
|
|
ld [PlayerDisableCount], a
|
|
ld [DisabledMove], a
|
|
ret
|
|
; 372fc
|
|
|
|
|
|
BattleCommand2e: ; 372fc
|
|
; screen
|
|
|
|
ld hl, PlayerScreens
|
|
ld bc, PlayerLightScreenCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_3730d
|
|
ld hl, EnemyScreens
|
|
ld bc, EnemyLightScreenCount
|
|
|
|
.asm_3730d
|
|
ld a, BATTLE_VARS_MOVE_EFFECT
|
|
call GetBattleVar
|
|
cp EFFECT_LIGHT_SCREEN
|
|
jr nz, .Reflect
|
|
|
|
bit SCREENS_LIGHT_SCREEN, [hl]
|
|
jr nz, .failed
|
|
set SCREENS_LIGHT_SCREEN, [hl]
|
|
ld a, 5
|
|
ld [bc], a
|
|
ld hl, LightScreenEffectText
|
|
jr .asm_37331
|
|
|
|
.Reflect
|
|
bit SCREENS_REFLECT, [hl]
|
|
jr nz, .failed
|
|
set SCREENS_REFLECT, [hl]
|
|
|
|
; LightScreenCount -> ReflectCount
|
|
inc bc
|
|
|
|
ld a, 5
|
|
ld [bc], a
|
|
ld hl, ReflectEffectText
|
|
|
|
.asm_37331
|
|
call AnimateCurrentMove
|
|
jp StdBattleTextBox
|
|
|
|
.failed
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
; 3733d
|
|
|
|
|
|
PrintDoesntAffect: ; 3733d
|
|
; 'it doesn't affect'
|
|
ld hl, DoesntAffectText
|
|
jp StdBattleTextBox
|
|
; 37343
|
|
|
|
|
|
PrintNothingHappened: ; 37343
|
|
; 'but nothing happened!'
|
|
ld hl, NothingHappenedText
|
|
jp StdBattleTextBox
|
|
; 37349
|
|
|
|
|
|
TryPrintButItFailed: ; 37349
|
|
ld a, [AlreadyFailed]
|
|
and a
|
|
ret nz
|
|
|
|
; fallthrough
|
|
; 3734e
|
|
|
|
|
|
PrintButItFailed: ; 3734e
|
|
; 'but it failed!'
|
|
ld hl, ButItFailedText
|
|
jp StdBattleTextBox
|
|
; 37354
|
|
|
|
|
|
Function37354: ; 37354
|
|
call AnimateFailedMove
|
|
; fallthrough
|
|
; 37357
|
|
|
|
Function37357: ; 37357
|
|
ld hl, ButItFailedText ; 'but it failed!'
|
|
ld de, ItFailedText ; 'it failed!'
|
|
jp Function35157
|
|
; 37360
|
|
|
|
|
|
PrintDidntAffect: ; 37360
|
|
; 'it didn't affect'
|
|
ld hl, DidntAffect1Text
|
|
jp StdBattleTextBox
|
|
; 37366
|
|
|
|
|
|
PrintDidntAffect2: ; 37366
|
|
call AnimateFailedMove
|
|
ld hl, DidntAffect1Text ; 'it didn't affect'
|
|
ld de, DidntAffect2Text ; 'it didn't affect'
|
|
jp Function35157
|
|
; 37372
|
|
|
|
|
|
PrintParalyze: ; 37372
|
|
; 'paralyzed! maybe it can't attack!'
|
|
ld hl, ParalyzedText
|
|
jp StdBattleTextBox
|
|
; 37378
|
|
|
|
|
|
CheckSubstituteOpp: ; 37378
|
|
ld a, BATTLE_VARS_SUBSTATUS4_OPP
|
|
call GetBattleVar
|
|
bit SUBSTATUS_SUBSTITUTE, a
|
|
ret
|
|
; 37380
|
|
|
|
|
|
BattleCommand1a: ; 37380
|
|
callba MobileFn_10610d
|
|
ld a, $4
|
|
ld [wcfca], a
|
|
ld c, $3
|
|
call DelayFrames
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVarAddr
|
|
xor a
|
|
ld [hli], a
|
|
inc hl
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ld a, $1
|
|
ld [wc689], a
|
|
call BattleCommand0a
|
|
call Function37e36
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_LEECH_SEED, [hl]
|
|
ld a, BATTLE_VARS_SUBSTATUS5_OPP
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_DESTINY_BOND, [hl]
|
|
call Function37ed5
|
|
ret nc
|
|
callba DrawPlayerHUD
|
|
callba DrawEnemyHUD
|
|
call WaitBGMap
|
|
jp RefreshBattleHuds
|
|
; 373c9
|
|
|
|
|
|
INCLUDE "battle/effects/mirror_move.asm"
|
|
|
|
INCLUDE "battle/effects/metronome.asm"
|
|
|
|
|
|
CheckUserMove: ; 37462
|
|
; Return z if the user has move a.
|
|
ld b, a
|
|
ld de, BattleMonMoves
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld de, EnemyMonMoves
|
|
.ok
|
|
|
|
ld c, NUM_MOVES
|
|
.loop
|
|
ld a, [de]
|
|
inc de
|
|
cp b
|
|
ret z
|
|
|
|
dec c
|
|
jr nz, .loop
|
|
|
|
ld a, 1
|
|
and a
|
|
ret
|
|
; 3747b
|
|
|
|
|
|
ResetTurn: ; 3747b
|
|
ld hl, wc732
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_37486
|
|
ld hl, wc733
|
|
|
|
.asm_37486
|
|
ld [hl], 1
|
|
xor a
|
|
ld [AlreadyDisobeyed], a
|
|
call DoMove
|
|
jp EndMoveEffect
|
|
; 37492
|
|
|
|
|
|
INCLUDE "battle/effects/thief.asm"
|
|
|
|
|
|
BattleCommand51: ; 37517
|
|
; arenatrap
|
|
|
|
; Doesn't work on an absent opponent.
|
|
|
|
call CheckHiddenOpponent
|
|
jr nz, .failed
|
|
|
|
; Don't trap if the opponent is already trapped.
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS5
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_CANT_RUN, [hl]
|
|
jr nz, .failed
|
|
|
|
; Otherwise trap the opponent.
|
|
|
|
set SUBSTATUS_CANT_RUN, [hl]
|
|
call AnimateCurrentMove
|
|
ld hl, CantEscapeNowText
|
|
jp StdBattleTextBox
|
|
|
|
.failed
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
; 37536
|
|
|
|
|
|
INCLUDE "battle/effects/nightmare.asm"
|
|
|
|
|
|
BattleCommand53: ; 37563
|
|
; defrost
|
|
|
|
; Thaw the user.
|
|
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVarAddr
|
|
bit FRZ, [hl]
|
|
ret z
|
|
res FRZ, [hl]
|
|
|
|
; Don't update the enemy's party struct in a wild battle.
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .party
|
|
|
|
ld a, [wBattleMode]
|
|
dec a
|
|
jr z, .done
|
|
|
|
.party
|
|
ld a, PartyMon1Status - PartyMon1
|
|
call UserPartyAttr
|
|
res FRZ, [hl]
|
|
|
|
.done
|
|
call RefreshBattleHuds
|
|
ld hl, WasDefrostedText
|
|
jp StdBattleTextBox
|
|
; 37588
|
|
|
|
|
|
INCLUDE "battle/effects/curse.asm"
|
|
|
|
INCLUDE "battle/effects/protect.asm"
|
|
|
|
INCLUDE "battle/effects/endure.asm"
|
|
|
|
INCLUDE "battle/effects/spikes.asm"
|
|
|
|
INCLUDE "battle/effects/foresight.asm"
|
|
|
|
INCLUDE "battle/effects/perish_song.asm"
|
|
|
|
INCLUDE "battle/effects/sandstorm.asm"
|
|
|
|
INCLUDE "battle/effects/rollout.asm"
|
|
|
|
|
|
BattleCommand5d: ; 37791
|
|
; unused
|
|
ret
|
|
; 37792
|
|
|
|
|
|
BattleCommand5e: ; 37792
|
|
; furycutter
|
|
|
|
ld hl, PlayerFuryCutterCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .go
|
|
ld hl, EnemyFuryCutterCount
|
|
|
|
.go
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, ResetFuryCutterCount
|
|
|
|
inc [hl]
|
|
|
|
; Damage capped at 5 turns' worth (16x).
|
|
ld a, [hl]
|
|
ld b, a
|
|
cp 6
|
|
jr c, .checkdouble
|
|
ld b, 5
|
|
|
|
.checkdouble
|
|
dec b
|
|
ret z
|
|
|
|
; Double the damage
|
|
ld hl, CurDamage + 1
|
|
sla [hl]
|
|
dec hl
|
|
rl [hl]
|
|
jr nc, .checkdouble
|
|
|
|
; No overflow
|
|
ld a, $ff
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ret
|
|
; 377be
|
|
|
|
|
|
ResetFuryCutterCount: ; 377be
|
|
|
|
push hl
|
|
|
|
ld hl, PlayerFuryCutterCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .reset
|
|
ld hl, EnemyFuryCutterCount
|
|
|
|
.reset
|
|
xor a
|
|
ld [hl], a
|
|
|
|
pop hl
|
|
ret
|
|
; 377ce
|
|
|
|
|
|
BattleCommand5f: ; 377ce
|
|
; attract
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .failed
|
|
call Function377f5
|
|
jr c, .failed
|
|
call CheckHiddenOpponent
|
|
jr nz, .failed
|
|
ld a, BATTLE_VARS_SUBSTATUS1_OPP
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_IN_LOVE, [hl]
|
|
jr nz, .failed
|
|
|
|
set SUBSTATUS_IN_LOVE, [hl]
|
|
call AnimateCurrentMove
|
|
|
|
; 'fell in love!'
|
|
ld hl, FellInLoveText
|
|
jp StdBattleTextBox
|
|
|
|
.failed
|
|
jp Function37354
|
|
; 377f5
|
|
|
|
|
|
Function377f5: ; 377f5
|
|
ld a, PartyMon1Species - PartyMon1
|
|
call BattlePartyAttr
|
|
ld a, [hl]
|
|
ld [CurPartySpecies], a
|
|
|
|
ld a, [CurBattleMon]
|
|
ld [CurPartyMon], a
|
|
xor a
|
|
ld [MonType], a
|
|
|
|
callba GetGender
|
|
jr c, .asm_37849
|
|
|
|
ld b, 1
|
|
jr nz, .asm_37815
|
|
dec b
|
|
|
|
.asm_37815
|
|
push bc
|
|
ld a, [TempEnemyMonSpecies]
|
|
ld [CurPartySpecies], a
|
|
ld hl, EnemyMonDVs
|
|
ld a, [EnemySubStatus5]
|
|
bit SUBSTATUS_TRANSFORMED, a
|
|
jr z, .asm_37829
|
|
ld hl, wc6f2
|
|
.asm_37829
|
|
ld a, [hli]
|
|
ld [TempMonDVs], a
|
|
ld a, [hl]
|
|
ld [TempMonDVs + 1], a
|
|
ld a, 3
|
|
ld [MonType], a
|
|
callba GetGender
|
|
pop bc
|
|
jr c, .asm_37849
|
|
|
|
ld a, 1
|
|
jr nz, .asm_37844
|
|
dec a
|
|
|
|
.asm_37844
|
|
xor b
|
|
jr z, .asm_37849
|
|
|
|
and a
|
|
ret
|
|
|
|
.asm_37849
|
|
scf
|
|
ret
|
|
; 3784b
|
|
|
|
|
|
BattleCommand60: ; 3784b
|
|
; happinesspower
|
|
push bc
|
|
ld hl, BattleMonHappiness
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld hl, EnemyMonHappiness
|
|
.ok
|
|
xor a
|
|
ld [hMultiplicand + 0], a
|
|
ld [hMultiplicand + 1], a
|
|
ld a, [hl]
|
|
ld [hMultiplicand + 2], a
|
|
ld a, 10
|
|
ld [hMultiplier], a
|
|
call Multiply
|
|
ld a, 25
|
|
ld [hDivisor], a
|
|
ld b, 4
|
|
call Divide
|
|
ld a, [hQuotient + 2]
|
|
ld d, a
|
|
pop bc
|
|
ret
|
|
; 37874
|
|
|
|
|
|
BattleCommand61: ; 37874
|
|
; present
|
|
|
|
ld a, [wLinkMode]
|
|
cp $3
|
|
jr z, .asm_3787d
|
|
push bc
|
|
push de
|
|
.asm_3787d
|
|
|
|
call BattleCommand_CalcDamageTypeMultiplier
|
|
|
|
ld a, [wLinkMode]
|
|
cp $3
|
|
jr z, .asm_37889
|
|
pop de
|
|
pop bc
|
|
.asm_37889
|
|
|
|
ld a, [wd265]
|
|
and a
|
|
jp z, AnimateFailedMove
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jp nz, AnimateFailedMove
|
|
|
|
push bc
|
|
call BattleRandom
|
|
ld b, a
|
|
ld hl, .table_37907
|
|
ld c, 0
|
|
.asm_378a1
|
|
ld a, [hli]
|
|
cp $ff
|
|
jr z, .asm_378b7 ; 378a4 $11
|
|
cp b
|
|
jr nc, .asm_378ad ; 378a7 $4
|
|
inc c
|
|
inc hl
|
|
jr .asm_378a1 ; 378ab $f4
|
|
|
|
.asm_378ad
|
|
ld a, c
|
|
ld [wc689], a
|
|
call Function37de9
|
|
ld d, [hl]
|
|
pop bc
|
|
ret
|
|
|
|
.asm_378b7
|
|
pop bc
|
|
ld a, $3
|
|
ld [wc689], a
|
|
call AnimateCurrentMove
|
|
call BattleCommand_SwitchTurn
|
|
ld hl, AICheckPlayerMaxHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_378ce ; 378c9 $3
|
|
ld hl, AICheckEnemyMaxHP
|
|
.asm_378ce
|
|
ld a, BANK(AICheckPlayerMaxHP)
|
|
rst FarCall
|
|
jr c, .asm_378f3 ; 378d1 $20
|
|
|
|
ld hl, GetQuarterMaxHP
|
|
call CallBattleCore
|
|
call BattleCommand_SwitchTurn
|
|
ld hl, Function3ccef
|
|
call CallBattleCore
|
|
call BattleCommand_SwitchTurn
|
|
ld hl, RegainedHealthText
|
|
call StdBattleTextBox
|
|
call BattleCommand_SwitchTurn
|
|
call UpdateOpponentInParty
|
|
jr .asm_37904 ; 378f1 $11
|
|
|
|
.asm_378f3
|
|
call BattleCommand_SwitchTurn
|
|
call Function37ed5
|
|
jr nc, .asm_37904 ; 378f9 $9
|
|
call AnimateFailedMove
|
|
ld hl, RefusedGiftText
|
|
call StdBattleTextBox
|
|
.asm_37904
|
|
jp EndMoveEffect
|
|
|
|
.table_37907
|
|
db 40 percent, 40
|
|
db 70 percent + 1, 80
|
|
db 80 percent, 120
|
|
db $ff
|
|
; 3790e
|
|
|
|
|
|
BattleCommand63: ; 3790e
|
|
; frustrationpower
|
|
|
|
push bc
|
|
ld hl, BattleMonHappiness
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_3791a ; 37915 $3
|
|
ld hl, EnemyMonHappiness
|
|
.asm_3791a
|
|
ld a, $ff
|
|
sub [hl]
|
|
ld [hMultiplicand + 2], a
|
|
xor a
|
|
ld [hMultiplicand + 0], a
|
|
ld [hMultiplicand + 1], a
|
|
ld a, 10
|
|
ld [hMultiplier], a
|
|
call Multiply
|
|
ld a, 25
|
|
ld [hDivisor], a
|
|
ld b, 4
|
|
call Divide
|
|
ld a, [hQuotient + 2]
|
|
ld d, a
|
|
pop bc
|
|
ret
|
|
; 37939
|
|
|
|
|
|
BattleCommand64: ; 37939
|
|
; safeguard
|
|
|
|
ld hl, PlayerScreens
|
|
ld de, PlayerSafeguardCount
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld hl, EnemyScreens
|
|
ld de, EnemySafeguardCount
|
|
.ok
|
|
bit SCREENS_SAFEGUARD, [hl]
|
|
jr nz, .failed
|
|
set SCREENS_SAFEGUARD, [hl]
|
|
ld a, 5
|
|
ld [de], a
|
|
call AnimateCurrentMove
|
|
ld hl, CoveredByVeilText
|
|
jp StdBattleTextBox
|
|
.failed
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
; 37962
|
|
|
|
|
|
Function37962: ; 37962
|
|
push hl
|
|
ld hl, EnemyScreens
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_3796e
|
|
ld hl, PlayerScreens
|
|
|
|
.asm_3796e
|
|
bit SCREENS_SAFEGUARD, [hl]
|
|
pop hl
|
|
ret
|
|
; 37972
|
|
|
|
|
|
BattleCommand65: ; 37972
|
|
; checksafeguard
|
|
ld hl, EnemyScreens
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_3797d ; 37978 $3
|
|
ld hl, PlayerScreens
|
|
.asm_3797d
|
|
bit SCREENS_SAFEGUARD, [hl]
|
|
ret z
|
|
ld a, 1
|
|
ld [AttackMissed], a
|
|
call BattleCommandaa
|
|
ld hl, SafeguardProtectText
|
|
call StdBattleTextBox
|
|
jp EndMoveEffect
|
|
; 37991
|
|
|
|
|
|
BattleCommand66: ; 37991
|
|
; getmagnitude
|
|
|
|
push bc
|
|
call BattleRandom
|
|
ld b, a
|
|
ld hl, .Magnitudes
|
|
.loop
|
|
ld a, [hli]
|
|
cp b
|
|
jr nc, .ok
|
|
rept 2
|
|
inc hl
|
|
endr
|
|
jr .loop
|
|
.ok
|
|
ld d, [hl]
|
|
push de
|
|
inc hl
|
|
ld a, [hl]
|
|
ld [wd265], a
|
|
call BattleCommandaa
|
|
ld hl, MagnitudeText
|
|
call StdBattleTextBox
|
|
pop de
|
|
pop bc
|
|
ret
|
|
|
|
.Magnitudes
|
|
; /255, BP, magnitude
|
|
db 13, 10, 4
|
|
db 38, 30, 5
|
|
db 89, 50, 6
|
|
db 166, 70, 7
|
|
db 217, 90, 8
|
|
db 242, 110, 9
|
|
db 255, 150, 10
|
|
; 379c9
|
|
|
|
|
|
BattleCommand67: ; 379c9
|
|
; batonpass
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jp nz, .Enemy
|
|
|
|
|
|
; Need something to switch to
|
|
call CheckAnyOtherAlivePartyMons
|
|
jp z, FailedBatonPass
|
|
|
|
call UpdateBattleMonInParty
|
|
call AnimateCurrentMove
|
|
|
|
ld c, 50
|
|
call DelayFrames
|
|
|
|
; Transition into switchmon menu
|
|
call LoadMenuDataHeader_0x1d75
|
|
callba Function3d2f7
|
|
|
|
callba ForcePickSwitchMonInBattle
|
|
|
|
; Return to battle scene
|
|
call ClearPalettes
|
|
callba Function3ed9f
|
|
call WriteBackup
|
|
call ClearSprites
|
|
hlcoord 1, 0
|
|
lb bc, 4, 10
|
|
call ClearBox
|
|
ld b, 1
|
|
call GetSGBLayout
|
|
call SetPalettes
|
|
call BatonPass_LinkPlayerSwitch
|
|
|
|
; Mobile link battles handle entrances differently
|
|
callba Function3d2e0
|
|
jp c, EndMoveEffect
|
|
|
|
ld hl, PassedBattleMonEntrance
|
|
call CallBattleCore
|
|
|
|
call ResetBatonPassStatus
|
|
ret
|
|
|
|
|
|
.Enemy
|
|
|
|
; Wildmons don't have anything to switch to
|
|
ld a, [wBattleMode]
|
|
dec a ; WILDMON
|
|
jp z, FailedBatonPass
|
|
|
|
call CheckAnyOtherAliveEnemyMons
|
|
jp z, FailedBatonPass
|
|
|
|
call UpdateEnemyMonInParty
|
|
call AnimateCurrentMove
|
|
call BatonPass_LinkEnemySwitch
|
|
|
|
; Mobile link battles handle entrances differently
|
|
callba Function3d2e0
|
|
jp c, EndMoveEffect
|
|
|
|
; Passed enemy PartyMon entrance
|
|
xor a
|
|
ld [wc718], a
|
|
ld hl, Function3d517
|
|
call CallBattleCore
|
|
ld hl, Function3d57a
|
|
call CallBattleCore
|
|
ld a, 1
|
|
ld [wd265], a
|
|
ld hl, ApplyStatLevelMultiplierOnAllStats
|
|
call CallBattleCore
|
|
|
|
ld hl, SpikesDamage
|
|
call CallBattleCore
|
|
|
|
jr ResetBatonPassStatus
|
|
; 37a67
|
|
|
|
|
|
BatonPass_LinkPlayerSwitch: ; 37a67
|
|
ld a, [wLinkMode]
|
|
and a
|
|
ret z
|
|
|
|
ld a, 1
|
|
ld [wd0ec], a
|
|
|
|
call LoadMenuDataHeader_0x1d75
|
|
ld hl, Function3e8e4
|
|
call CallBattleCore
|
|
call WriteBackup
|
|
|
|
xor a
|
|
ld [wd0ec], a
|
|
ret
|
|
; 37a82
|
|
|
|
|
|
BatonPass_LinkEnemySwitch: ; 37a82
|
|
ld a, [wLinkMode]
|
|
and a
|
|
ret z
|
|
|
|
call LoadMenuDataHeader_0x1d75
|
|
ld hl, Function3e8e4
|
|
call CallBattleCore
|
|
|
|
ld a, [OTPartyCount]
|
|
add NUM_MOVES
|
|
ld b, a
|
|
ld a, [wBattleAction]
|
|
cp NUM_MOVES
|
|
jr c, .asm_37aa0
|
|
cp b
|
|
jr c, .asm_37aa8
|
|
|
|
.asm_37aa0
|
|
ld a, [CurOTMon]
|
|
add NUM_MOVES
|
|
ld [wBattleAction], a
|
|
.asm_37aa8
|
|
jp WriteBackup
|
|
; 37aab
|
|
|
|
|
|
FailedBatonPass: ; 37aab
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
; 37ab1
|
|
|
|
|
|
ResetBatonPassStatus: ; 37ab1
|
|
; Reset status changes that aren't passed by Baton Pass.
|
|
|
|
; Nightmare isn't passed.
|
|
ld a, BATTLE_VARS_STATUS
|
|
call GetBattleVar
|
|
and SLP
|
|
jr nz, .ok
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS1
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_NIGHTMARE, [hl]
|
|
.ok
|
|
|
|
; Disable isn't passed.
|
|
call ResetActorDisable
|
|
|
|
; Attraction isn't passed.
|
|
ld hl, PlayerSubStatus1
|
|
res SUBSTATUS_IN_LOVE, [hl]
|
|
ld hl, EnemySubStatus1
|
|
res SUBSTATUS_IN_LOVE, [hl]
|
|
ld hl, PlayerSubStatus5
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS5
|
|
call GetBattleVarAddr
|
|
res SUBSTATUS_TRANSFORMED, [hl]
|
|
res SUBSTATUS_ENCORED, [hl]
|
|
|
|
; New mon hasn't used a move yet.
|
|
ld a, BATTLE_VARS_LAST_MOVE
|
|
call GetBattleVarAddr
|
|
ld [hl], 0
|
|
|
|
xor a
|
|
ld [wc730], a
|
|
ld [wc731], a
|
|
ret
|
|
; 37ae9
|
|
|
|
|
|
CheckAnyOtherAlivePartyMons: ; 37ae9
|
|
ld hl, PartyMon1HP
|
|
ld a, [PartyCount]
|
|
ld d, a
|
|
ld a, [CurBattleMon]
|
|
ld e, a
|
|
jr CheckAnyOtherAliveMons
|
|
; 37af6
|
|
|
|
|
|
CheckAnyOtherAliveEnemyMons: ; 37af6
|
|
ld hl, OTPartyMon1HP
|
|
ld a, [OTPartyCount]
|
|
ld d, a
|
|
ld a, [CurOTMon]
|
|
ld e, a
|
|
|
|
; fallthrough
|
|
; 37b01
|
|
|
|
CheckAnyOtherAliveMons: ; 37b01
|
|
; Check for nonzero HP starting from partymon
|
|
; HP at hl for d partymons, besides current mon e.
|
|
|
|
; Return nz if any are alive.
|
|
|
|
xor a
|
|
ld b, a
|
|
ld c, a
|
|
.loop
|
|
ld a, c
|
|
cp d
|
|
jr z, .done
|
|
cp e
|
|
jr z, .next
|
|
|
|
ld a, [hli]
|
|
or b
|
|
ld b, a
|
|
ld a, [hld]
|
|
or b
|
|
ld b, a
|
|
|
|
.next
|
|
push bc
|
|
ld bc, PartyMon2 - PartyMon1
|
|
add hl, bc
|
|
pop bc
|
|
inc c
|
|
jr .loop
|
|
|
|
.done
|
|
ld a, b
|
|
and a
|
|
ret
|
|
; 37b1d
|
|
|
|
|
|
BattleCommand68: ; 37b1d
|
|
; pursuit
|
|
; Double damage if the opponent is switching.
|
|
|
|
ld hl, wEnemyIsSwitching
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld hl, wPlayerIsSwitching
|
|
.ok
|
|
ld a, [hl]
|
|
and a
|
|
ret z
|
|
|
|
ld hl, CurDamage + 1
|
|
sla [hl]
|
|
dec hl
|
|
rl [hl]
|
|
ret nc
|
|
|
|
ld a, $ff
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ret
|
|
; 37b39
|
|
|
|
|
|
BattleCommand69: ; 37b39
|
|
; clearhazards
|
|
|
|
ld a, BATTLE_VARS_SUBSTATUS4
|
|
call GetBattleVarAddr
|
|
bit SUBSTATUS_LEECH_SEED, [hl]
|
|
jr z, .asm_37b4a ; 37b40 $8
|
|
res SUBSTATUS_LEECH_SEED, [hl]
|
|
ld hl, ShedLeechSeedText
|
|
call StdBattleTextBox
|
|
.asm_37b4a
|
|
|
|
ld hl, PlayerScreens
|
|
ld de, wc730
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_37b5b ; 37b53 $6
|
|
ld hl, EnemyScreens
|
|
ld de, wc731
|
|
.asm_37b5b
|
|
bit SCREENS_SPIKES, [hl]
|
|
jr z, .asm_37b69 ; 37b5d $a
|
|
res SCREENS_SPIKES, [hl]
|
|
ld hl, BlewSpikesText
|
|
push de
|
|
call StdBattleTextBox
|
|
pop de
|
|
.asm_37b69
|
|
|
|
ld a, [de]
|
|
and a
|
|
ret z
|
|
xor a
|
|
ld [de], a
|
|
ld hl, ReleasedByText
|
|
jp StdBattleTextBox
|
|
; 37b74
|
|
|
|
|
|
BattleCommand6a: ; 37b74
|
|
; healmorn
|
|
ld b, MORN
|
|
jr BattleCommand6a6c
|
|
; 37b78
|
|
|
|
BattleCommand6b: ; 37b78
|
|
; healday
|
|
ld b, DAY
|
|
jr BattleCommand6a6c
|
|
; 37b7c
|
|
|
|
BattleCommand6c: ; 37b7c
|
|
; healnite
|
|
ld b, NITE
|
|
; fallthrough
|
|
; 37b7e
|
|
|
|
BattleCommand6a6c: ; 37b7e
|
|
; Time- and weather-sensitive heal.
|
|
|
|
ld hl, BattleMonMaxHP
|
|
ld de, BattleMonHP
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .start
|
|
ld hl, EnemyMonMaxHP
|
|
ld de, EnemyMonHP
|
|
|
|
.start
|
|
; Index for .Multipliers
|
|
; Default restores half max HP.
|
|
ld c, 2
|
|
|
|
; Don't bother healing if HP is already full.
|
|
push bc
|
|
call StringCmp
|
|
pop bc
|
|
jr z, .Full
|
|
|
|
; Don't factor in time of day in link battles.
|
|
ld a, [wLinkMode]
|
|
and a
|
|
jr nz, .Weather
|
|
|
|
ld a, [TimeOfDay]
|
|
cp b
|
|
jr z, .Weather
|
|
dec c
|
|
|
|
.Weather
|
|
ld a, [Weather]
|
|
and a
|
|
jr z, .Heal
|
|
|
|
; x2 in sun
|
|
; /2 in rain/sandstorm
|
|
inc c
|
|
cp WEATHER_SUN
|
|
jr z, .Heal
|
|
rept 2
|
|
dec c
|
|
endr
|
|
|
|
.Heal
|
|
ld b, 0
|
|
ld hl, .Multipliers
|
|
rept 2
|
|
add hl, bc
|
|
endr
|
|
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
ld a, BANK(GetMaxHP)
|
|
rst FarCall
|
|
|
|
call AnimateCurrentMove
|
|
call BattleCommand_SwitchTurn
|
|
|
|
callab Function3ccef
|
|
|
|
call BattleCommand_SwitchTurn
|
|
call UpdateUserInParty
|
|
|
|
; 'regained health!'
|
|
ld hl, RegainedHealthText
|
|
jp StdBattleTextBox
|
|
|
|
.Full
|
|
call AnimateFailedMove
|
|
|
|
; 'hp is full!'
|
|
ld hl, HPIsFullText
|
|
jp StdBattleTextBox
|
|
|
|
.Multipliers
|
|
dw GetEighthMaxHP
|
|
dw GetQuarterMaxHP
|
|
dw GetHalfMaxHP
|
|
dw GetMaxHP
|
|
; 37be8
|
|
|
|
|
|
BattleCommand6d: ; 37be8
|
|
; hiddenpower
|
|
|
|
ld a, [AttackMissed]
|
|
and a
|
|
ret nz
|
|
callba HiddenPowerDamage
|
|
ret
|
|
; 37bf4
|
|
|
|
|
|
BattleCommand6e: ; 37bf4
|
|
; startrain
|
|
ld a, WEATHER_RAIN
|
|
ld [Weather], a
|
|
ld a, 5
|
|
ld [WeatherCount], a
|
|
call AnimateCurrentMove
|
|
ld hl, DownpourText
|
|
jp StdBattleTextBox
|
|
; 37c07
|
|
|
|
|
|
BattleCommand6f: ; 37c07
|
|
; startsun
|
|
ld a, WEATHER_SUN
|
|
ld [Weather], a
|
|
ld a, 5
|
|
ld [WeatherCount], a
|
|
call AnimateCurrentMove
|
|
ld hl, SunGotBrightText
|
|
jp StdBattleTextBox
|
|
; 37c1a
|
|
|
|
|
|
BattleCommand95: ; 37c1a
|
|
; bellydrum
|
|
call BattleCommand77
|
|
ld a, [AttackMissed]
|
|
and a
|
|
jr nz, .asm_37c4f
|
|
|
|
callab GetHalfMaxHP
|
|
|
|
callab Function3ccde
|
|
jr nc, .asm_37c4f
|
|
|
|
push bc
|
|
call AnimateCurrentMove
|
|
pop bc
|
|
callab Function3cc3f
|
|
call UpdateUserInParty
|
|
ld a, 5
|
|
|
|
.asm_37c41
|
|
push af
|
|
call BattleCommand77
|
|
pop af
|
|
dec a
|
|
jr nz, .asm_37c41
|
|
|
|
ld hl, BellyDrumText
|
|
jp StdBattleTextBox
|
|
.asm_37c4f
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
; 37c55
|
|
|
|
|
|
BattleCommand96: ; 37c55
|
|
; psychup
|
|
|
|
ld hl, EnemyStatLevels
|
|
ld de, PlayerStatLevels
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_37c64 ; 37c5e $4
|
|
push hl
|
|
ld h, d
|
|
ld l, e
|
|
pop de
|
|
.asm_37c64
|
|
push hl
|
|
ld b, $8
|
|
.asm_37c67
|
|
ld a, [hli]
|
|
cp $7
|
|
jr nz, .asm_37c76 ; 37c6a $a
|
|
dec b
|
|
jr nz, .asm_37c67 ; 37c6d $f8
|
|
pop hl
|
|
call AnimateFailedMove
|
|
jp PrintButItFailed
|
|
.asm_37c76
|
|
pop hl
|
|
ld b, $8
|
|
.asm_37c79
|
|
ld a, [hli]
|
|
ld [de], a
|
|
inc de
|
|
dec b
|
|
jr nz, .asm_37c79 ; 37c7d $fa
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr nz, .asm_37c89 ; 37c82 $5
|
|
call Function365d7
|
|
jr .asm_37c8c ; 37c87 $3
|
|
.asm_37c89
|
|
call Function365fd
|
|
.asm_37c8c
|
|
call AnimateCurrentMove
|
|
ld hl, CopiedStatsText
|
|
jp StdBattleTextBox
|
|
; 37c95
|
|
|
|
|
|
BattleCommand9a: ; 37c95
|
|
; mirrorcoat
|
|
|
|
ld a, 1
|
|
ld [AttackMissed], a
|
|
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
and a
|
|
ret z
|
|
|
|
ld b, a
|
|
callab GetMoveEffect
|
|
ld a, b
|
|
cp EFFECT_MIRROR_COAT
|
|
ret z
|
|
|
|
call BattleCommanda3
|
|
ld a, [wd265]
|
|
and a
|
|
ret z
|
|
|
|
call Function36abf
|
|
ret z
|
|
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
|
|
call GetBattleVar
|
|
dec a
|
|
ld de, StringBuffer1
|
|
call GetMoveData
|
|
|
|
ld a, [StringBuffer1 + 2]
|
|
and a
|
|
ret z
|
|
|
|
ld a, [StringBuffer1 + 3]
|
|
cp SPECIAL
|
|
ret c
|
|
|
|
ld hl, CurDamage
|
|
ld a, [hli]
|
|
or [hl]
|
|
ret z
|
|
|
|
ld a, [hl]
|
|
add a
|
|
ld [hld], a
|
|
ld a, [hl]
|
|
adc a
|
|
ld [hl], a
|
|
jr nc, .capped
|
|
ld a, $ff
|
|
ld [hli], a
|
|
ld [hl], a
|
|
.capped
|
|
|
|
xor a
|
|
ld [AttackMissed], a
|
|
ret
|
|
; 37ce6
|
|
|
|
|
|
BattleCommand9d: ; 37ce6
|
|
; doubleminimizedamage
|
|
|
|
ld hl, wc6fa
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld hl, wc6fe
|
|
.ok
|
|
ld a, [hl]
|
|
and a
|
|
ret z
|
|
ld hl, CurDamage + 1
|
|
sla [hl]
|
|
dec hl
|
|
rl [hl]
|
|
ret nc
|
|
ld a, $ff
|
|
ld [hli], a
|
|
ld [hl], a
|
|
ret
|
|
; 37d02
|
|
|
|
|
|
BattleCommand9e: ; 37d02
|
|
; skipsuncharge
|
|
ld a, [Weather]
|
|
cp WEATHER_SUN
|
|
ret nz
|
|
ld b, charge_command
|
|
jp SkipToBattleCommand
|
|
; 37d0d
|
|
|
|
|
|
BattleCommand9b: ; 37d0d
|
|
; checkfuturesight
|
|
|
|
ld hl, wc71d
|
|
ld de, wc727
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .ok
|
|
ld hl, wc71e
|
|
ld de, wc729
|
|
.ok
|
|
|
|
ld a, [hl]
|
|
and a
|
|
ret z
|
|
cp 1
|
|
ret nz
|
|
|
|
ld [hl], 0
|
|
ld a, [de]
|
|
inc de
|
|
ld [CurDamage], a
|
|
ld a, [de]
|
|
ld [CurDamage + 1], a
|
|
ld b, futuresight_command
|
|
jp SkipToBattleCommand
|
|
; 37d34
|
|
|
|
BattleCommand9c: ; 37d34
|
|
; futuresight
|
|
|
|
call Function34548
|
|
jr nz, .asm_37d4b ; 37d37 $12
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
ld b, a
|
|
ld a, BATTLE_VARS_LAST_COUNTER_MOVE
|
|
call GetBattleVarAddr
|
|
ld [hl], b
|
|
ld a, BATTLE_VARS_LAST_MOVE
|
|
call GetBattleVarAddr
|
|
ld [hl], b
|
|
.asm_37d4b
|
|
ld hl, wc71d
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_37d56 ; 37d51 $3
|
|
ld hl, wc71e
|
|
.asm_37d56
|
|
ld a, [hl]
|
|
and a
|
|
jr nz, .asm_37d87 ; 37d58 $2d
|
|
ld a, $4
|
|
ld [hl], a
|
|
call BattleCommand0a
|
|
call BattleCommandaa
|
|
ld hl, ForesawAttackText
|
|
call StdBattleTextBox
|
|
call BattleCommand0c
|
|
ld de, wc727
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .asm_37d77 ; 37d72 $3
|
|
ld de, wc729
|
|
.asm_37d77
|
|
ld hl, CurDamage
|
|
ld a, [hl]
|
|
ld [de], a
|
|
ld [hl], 0
|
|
inc hl
|
|
inc de
|
|
ld a, [hl]
|
|
ld [de], a
|
|
ld [hl], 0
|
|
jp EndMoveEffect
|
|
.asm_37d87
|
|
pop bc
|
|
call ResetDamage
|
|
call AnimateFailedMove
|
|
call PrintButItFailed
|
|
jp EndMoveEffect
|
|
; 37d94
|
|
|
|
|
|
BattleCommand9f: ; 37d94
|
|
; thunderaccuracy
|
|
|
|
ld a, BATTLE_VARS_MOVE_TYPE
|
|
call GetBattleVarAddr
|
|
inc hl
|
|
ld a, [Weather]
|
|
cp WEATHER_RAIN
|
|
jr z, .rain
|
|
cp WEATHER_SUN
|
|
ret nz
|
|
ld [hl], 50 percent + 1
|
|
ret
|
|
.rain
|
|
ld [hl], 100 percent
|
|
ret
|
|
; 37daa
|
|
|
|
|
|
CheckHiddenOpponent: ; 37daa
|
|
ld a, BATTLE_VARS_SUBSTATUS3_OPP
|
|
call GetBattleVar
|
|
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
|
|
ret
|
|
; 37db2
|
|
|
|
|
|
GetUserItem: ; 37db2
|
|
; Return the effect of the user's item in bc, and its id at hl.
|
|
ld hl, BattleMonItem
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .go
|
|
ld hl, EnemyMonItem
|
|
.go
|
|
ld b, [hl]
|
|
jp GetItem
|
|
; 37dc1
|
|
|
|
|
|
GetOpponentItem: ; 37dc1
|
|
; Return the effect of the opponent's item in bc, and its id at hl.
|
|
ld hl, EnemyMonItem
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
jr z, .go
|
|
ld hl, BattleMonItem
|
|
.go
|
|
ld b, [hl]
|
|
jp GetItem
|
|
; 37dd0
|
|
|
|
|
|
GetItem: ; 37dd0
|
|
; Return the effect of item b in bc.
|
|
ld a, b
|
|
and a
|
|
ret z
|
|
|
|
push hl
|
|
ld hl, ItemAttributes + 2
|
|
dec a
|
|
ld c, a
|
|
ld b, 0
|
|
ld a, Item2Attributes - Item1Attributes
|
|
call AddNTimes
|
|
ld a, BANK(ItemAttributes)
|
|
call GetFarHalfword
|
|
ld b, l
|
|
ld c, h
|
|
pop hl
|
|
ret
|
|
; 37de9
|
|
|
|
|
|
Function37de9: ; 37de9
|
|
push hl
|
|
push de
|
|
push bc
|
|
ld a, [wc689]
|
|
push af
|
|
call BattleCommand0a
|
|
pop af
|
|
ld [wc689], a
|
|
call Function37e19
|
|
call BattleCommand0c
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
; 37e01
|
|
|
|
|
|
AnimateCurrentMove: ; 37e01
|
|
push hl
|
|
push de
|
|
push bc
|
|
ld a, [wc689]
|
|
push af
|
|
call BattleCommand0a
|
|
pop af
|
|
ld [wc689], a
|
|
call Function37e36
|
|
call BattleCommand0c
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
; 37e19
|
|
|
|
|
|
Function37e19: ; 37e19
|
|
xor a
|
|
ld [FXAnimIDHi], a
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
and a
|
|
ret z
|
|
|
|
ld [FXAnimIDLo], a
|
|
|
|
ld a, [hBattleTurn]
|
|
and a
|
|
ld a, 1
|
|
jr z, .asm_37e30
|
|
ld a, 4
|
|
|
|
.asm_37e30
|
|
ld [wcfca], a
|
|
|
|
jp Function37e47
|
|
; 37e36
|
|
|
|
|
|
Function37e36: ; 37e36
|
|
xor a
|
|
ld [wcfca], a
|
|
ld [FXAnimIDHi], a
|
|
|
|
ld a, BATTLE_VARS_MOVE_ANIM
|
|
call GetBattleVar
|
|
and a
|
|
ret z
|
|
|
|
; fallthrough
|
|
; 37e44
|
|
|
|
|
|
Function37e44: ; 37e44
|
|
|
|
ld [FXAnimIDLo], a
|
|
|
|
; fallthrough
|
|
; 37e47
|
|
|
|
|
|
Function37e47: ; 37e47
|
|
push hl
|
|
push de
|
|
push bc
|
|
callab PlayBattleAnim
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
; 37e54
|
|
|
|
|
|
Function37e54: ; 37e54
|
|
ld a, e
|
|
ld [FXAnimIDLo], a
|
|
ld a, d
|
|
ld [FXAnimIDHi], a
|
|
xor a
|
|
ld [wcfca], a
|
|
|
|
push hl
|
|
push de
|
|
push bc
|
|
call BattleCommand_SwitchTurn
|
|
|
|
callab PlayBattleAnim
|
|
|
|
call BattleCommand_SwitchTurn
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
; 37e73
|
|
|
|
|
|
CallBattleCore: ; 37e73
|
|
ld a, BANK(BattleCore)
|
|
rst FarCall
|
|
ret
|
|
; 37e77
|
|
|
|
|
|
AnimateFailedMove: ; 37e77
|
|
call BattleCommand0a
|
|
call BattleCommandaa
|
|
jp BattleCommand0c
|
|
; 37e80
|
|
|
|
|
|
BattleCommandaa: ; 37e80
|
|
; movedelay
|
|
; Wait 40 frames.
|
|
ld c, 40
|
|
jp DelayFrames
|
|
; 37e85
|
|
|
|
|
|
BattleCommand38: ; 37e85
|
|
; cleartext
|
|
|
|
; Used in multi-hit moves.
|
|
ld hl, .text
|
|
jp BattleTextBox
|
|
.text
|
|
db "@"
|
|
; 37e8c
|
|
|
|
|
|
SkipToBattleCommand: ; 37e8c
|
|
; Skip over commands until reaching command b.
|
|
ld a, [BattleScriptBufferLoc + 1]
|
|
ld h, a
|
|
ld a, [BattleScriptBufferLoc]
|
|
ld l, a
|
|
.asm_37e94
|
|
ld a, [hli]
|
|
cp b
|
|
jr nz, .asm_37e94
|
|
|
|
ld a, h
|
|
ld [BattleScriptBufferLoc + 1], a
|
|
ld a, l
|
|
ld [BattleScriptBufferLoc], a
|
|
ret
|
|
; 37ea1
|
|
|
|
|
|
GetMoveAttr: ; 37ea1
|
|
; Assuming hl = Moves + x, return attribute x of move a.
|
|
push bc
|
|
ld bc, MOVE_LENGTH
|
|
call AddNTimes
|
|
call GetMoveByte
|
|
pop bc
|
|
ret
|
|
; 37ead
|
|
|
|
|
|
GetMoveData: ; 37ead
|
|
; Copy move struct a to de.
|
|
ld hl, Moves
|
|
ld bc, MOVE_LENGTH
|
|
call AddNTimes
|
|
ld a, Bank(Moves)
|
|
jp FarCopyBytes
|
|
; 37ebb
|
|
|
|
|
|
GetMoveByte: ; 37ebb
|
|
ld a, BANK(Moves)
|
|
jp GetFarByte
|
|
; 37ec0
|
|
|
|
|
|
Function37ec0: ; 37ec0
|
|
callba Functionfbd54
|
|
ret
|
|
; 37ec7
|
|
|
|
|
|
Function37ec7: ; 37ec7
|
|
callba Functionfbd71
|
|
ret
|
|
; 37ece
|
|
|
|
|
|
Function37ece: ; 37ece
|
|
callba Functionfbd69
|
|
ret
|
|
; 37ed5
|
|
|
|
|
|
Function37ed5: ; 37ed5
|
|
; Related to mobile link battles.
|
|
push hl
|
|
push de
|
|
push bc
|
|
callba CheckBattleScene
|
|
pop bc
|
|
pop de
|
|
pop hl
|
|
ret
|
|
; 37ee2
|