pokecrystal-board/battle/effect_commands.asm

10056 lines
141 KiB
NASM
Raw Normal View History

2013-03-26 17:39:44 -07:00
DoPlayerTurn: ; 34000
call SetPlayerTurn
2015-12-17 14:51:32 -08:00
ld a, [wPlayerAction]
2013-03-26 17:39:44 -07:00
and a
ret nz
jr DoTurn
2013-03-26 17:39:44 -07:00
; 3400a
DoEnemyTurn: ; 3400a
call SetEnemyTurn
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
jr z, DoTurn
ld a, [wBattleAction]
cp BATTLEACTION_E
2013-03-26 17:39:44 -07:00
jr z, DoTurn
cp BATTLEACTION_SWITCH1
2013-03-26 17:39:44 -07:00
ret nc
; fallthrough
; 3401d
DoTurn: ; 3401d
; Read in and execute the user's move effects for this turn.
xor a
2015-11-09 13:41:09 -08:00
ld [wTurnEnded], a
2013-03-26 17:39:44 -07:00
; Effect command checkturn is called for every move.
2013-03-26 17:39:44 -07:00
call CheckTurn
2015-11-09 13:41:09 -08:00
ld a, [wTurnEnded]
2013-03-26 17:39:44 -07:00
and a
ret nz
call UpdateMoveData
; 3402c
DoMove: ; 3402c
; Get the user's move effect.
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld c, a
ld b, 0
ld hl, MoveEffectsPointers
add hl, bc
2015-12-26 18:59:03 -08:00
add hl, bc
2013-03-26 17:39:44 -07:00
ld a, BANK(MoveEffectsPointers)
call GetFarHalfword
ld de, BattleScriptBuffer
.GetMoveEffect:
2013-03-26 17:39:44 -07:00
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:
2013-03-26 17:39:44 -07:00
; 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
2013-03-26 17:39:44 -07:00
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
add hl, bc
2015-12-26 18:59:03 -08:00
add hl, bc
2013-03-26 17:39:44 -07:00
pop bc
ld a, BANK(BattleCommandPointers)
call GetFarHalfword
call .DoMoveEffectCommand
jr .ReadMoveEffectCommand
.DoMoveEffectCommand:
2013-03-26 17:39:44 -07:00
jp [hl]
2013-03-26 17:39:44 -07:00
; 34084
CheckTurn:
BattleCommand_CheckTurn: ; 34084
2013-03-26 17:39:44 -07:00
; checkturn
; Repurposed as hardcoded turn handling. Useless as a command.
; Move $ff immediately ends the turn.
ld a, BATTLE_VARS_MOVE
call GetBattleVar
2013-03-26 17:39:44 -07:00
inc a
2015-11-09 13:41:09 -08:00
jp z, EndTurn
2013-03-26 17:39:44 -07:00
xor a
ld [AttackMissed], a
2013-06-13 13:10:39 -07:00
ld [EffectFailed], a
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2013-03-26 17:39:44 -07:00
ld [AlreadyDisobeyed], a
ld [AlreadyFailed], a
2016-01-09 13:28:22 -08:00
ld [wSomeoneIsRampaging], a
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
res SUBSTATUS_RECHARGE, [hl]
2013-03-26 17:39:44 -07:00
ld hl, MustRechargeText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.no_recharge
2013-03-26 17:39:44 -07:00
ld hl, BattleMonStatus
ld a, [hl]
and SLP
jr z, .not_asleep
2013-03-26 17:39:44 -07:00
dec a
ld [BattleMonStatus], a
and SLP
jr z, .woke_up
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-12-19 01:47:39 -08:00
ld de, ANIM_SLP
2013-03-26 17:39:44 -07:00
call FarPlayBattleAnimation
jr .fast_asleep
2013-03-26 17:39:44 -07:00
.woke_up
2013-03-26 17:39:44 -07:00
ld hl, WokeUpText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2013-05-02 21:22:28 -07:00
call UpdateBattleMonInParty
ld hl, UpdatePlayerHUD
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-03-26 17:39:44 -07:00
ld hl, PlayerSubStatus1
res SUBSTATUS_NIGHTMARE, [hl]
jr .not_asleep
2013-03-26 17:39:44 -07:00
.fast_asleep
2013-03-26 17:39:44 -07:00
ld hl, FastAsleepText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
; Snore and Sleep Talk bypass sleep.
2013-03-26 17:39:44 -07:00
ld a, [CurPlayerMove]
cp SNORE
jr z, .not_asleep
2013-03-26 17:39:44 -07:00
cp SLEEP_TALK
jr z, .not_asleep
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_asleep
2013-03-26 17:39:44 -07:00
ld hl, BattleMonStatus
bit FRZ, [hl]
jr z, .not_frozen
2013-03-26 17:39:44 -07:00
; Flame Wheel and Sacred Fire thaw the user.
2013-03-26 17:39:44 -07:00
ld a, [CurPlayerMove]
cp FLAME_WHEEL
jr z, .not_frozen
2013-03-26 17:39:44 -07:00
cp SACRED_FIRE
jr z, .not_frozen
2013-03-26 17:39:44 -07:00
ld hl, FrozenSolidText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_frozen
2013-03-26 17:39:44 -07:00
ld hl, PlayerSubStatus3
bit SUBSTATUS_FLINCHED, [hl]
jr z, .not_flinched
2013-03-26 17:39:44 -07:00
res SUBSTATUS_FLINCHED, [hl]
2013-03-26 17:39:44 -07:00
ld hl, FlinchedText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_flinched
2013-03-26 17:39:44 -07:00
ld hl, PlayerDisableCount
ld a, [hl]
and a
jr z, .not_disabled
2013-03-26 17:39:44 -07:00
dec a
ld [hl], a
and $f
jr nz, .not_disabled
2013-03-26 17:39:44 -07:00
ld [hl], a
ld [DisabledMove], a
ld hl, DisabledNoMoreText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
.not_disabled
2013-03-26 17:39:44 -07:00
ld a, [PlayerSubStatus3]
add a
jr nc, .not_confused
2013-03-26 17:39:44 -07:00
ld hl, PlayerConfuseCount
dec [hl]
jr nz, .confused
2013-03-26 17:39:44 -07:00
ld hl, PlayerSubStatus3
res SUBSTATUS_CONFUSED, [hl]
2013-03-26 17:39:44 -07:00
ld hl, ConfusedNoMoreText
call StdBattleTextBox
jr .not_confused
2013-03-26 17:39:44 -07:00
.confused
2013-03-26 17:39:44 -07:00
ld hl, IsConfusedText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
ld de, ANIM_CONFUSED
call FarPlayBattleAnimation
; 50% chance of hitting itself
call BattleRandom
2013-03-26 17:39:44 -07:00
cp $80
jr nc, .not_confused
2013-03-26 17:39:44 -07:00
2015-09-09 14:05:19 -07:00
; clear confusion-dependent substatus
2013-03-26 17:39:44 -07:00
ld hl, PlayerSubStatus3
ld a, [hl]
and 1 << SUBSTATUS_CONFUSED
2013-03-26 17:39:44 -07:00
ld [hl], a
call HitConfusion
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_confused
2013-03-26 17:39:44 -07:00
ld a, [PlayerSubStatus1]
add a ; bit SUBSTATUS_ATTRACT
jr nc, .not_infatuated
2013-03-26 17:39:44 -07:00
ld hl, InLoveWithText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-12-19 01:47:39 -08:00
ld de, ANIM_IN_LOVE
2013-03-26 17:39:44 -07:00
call FarPlayBattleAnimation
; 50% chance of infatuation
call BattleRandom
2013-03-26 17:39:44 -07:00
cp $80
jr c, .not_infatuated
2013-03-26 17:39:44 -07:00
ld hl, InfatuationText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_infatuated
2013-03-26 17:39:44 -07:00
; We can't disable a move that doesn't exist.
2013-03-26 17:39:44 -07:00
ld a, [DisabledMove]
and a
jr z, .no_disabled_move
2013-03-26 17:39:44 -07:00
; Are we using the disabled move?
2013-03-26 17:39:44 -07:00
ld hl, CurPlayerMove
cp [hl]
jr nz, .no_disabled_move
2013-03-26 17:39:44 -07:00
call MoveDisabled
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.no_disabled_move
2013-03-26 17:39:44 -07:00
ld hl, BattleMonStatus
bit PAR, [hl]
2013-03-26 17:39:44 -07:00
ret z
; 25% chance to be fully paralyzed
call BattleRandom
2013-03-26 17:39:44 -07:00
cp $3f
ret nc
ld hl, FullyParalyzedText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
; 341f0
CantMove: ; 341f0
ld a, BATTLE_VARS_SUBSTATUS1
call GetBattleVarAddr
res SUBSTATUS_ROLLOUT, [hl]
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld a, [hl]
and $ff ^ (1<<SUBSTATUS_BIDE + 1<<SUBSTATUS_RAMPAGE + 1<<SUBSTATUS_CHARGED)
2013-03-26 17:39:44 -07:00
ld [hl], a
call ResetFuryCutterCount
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp FLY
2015-11-06 19:36:06 -08:00
jr z, .fly_dig
2013-03-26 17:39:44 -07:00
cp DIG
2013-03-26 17:39:44 -07:00
ret nz
2015-11-06 19:36:06 -08:00
.fly_dig
res SUBSTATUS_UNDERGROUND, [hl]
res SUBSTATUS_FLYING, [hl]
2015-11-09 13:41:09 -08:00
jp AppearUserRaiseSub
2013-03-26 17:39:44 -07:00
; 34216
2015-11-06 19:36:06 -08:00
OpponentCantMove: ; 34216
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
call CantMove
2015-10-10 04:45:39 -07:00
jp BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
; 3421f
CheckEnemyTurn: ; 3421f
ld hl, EnemySubStatus4
bit SUBSTATUS_RECHARGE, [hl]
jr z, .no_recharge
2013-03-26 17:39:44 -07:00
res SUBSTATUS_RECHARGE, [hl]
2013-03-26 17:39:44 -07:00
ld hl, MustRechargeText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.no_recharge
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonStatus
ld a, [hl]
and SLP
jr z, .not_asleep
2013-03-26 17:39:44 -07:00
dec a
ld [EnemyMonStatus], a
and a
jr z, .woke_up
2013-03-26 17:39:44 -07:00
ld hl, FastAsleepText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-12-19 01:47:39 -08:00
ld de, ANIM_SLP
2013-03-26 17:39:44 -07:00
call FarPlayBattleAnimation
jr .fast_asleep
2013-03-26 17:39:44 -07:00
.woke_up
2013-03-26 17:39:44 -07:00
ld hl, WokeUpText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2013-05-02 21:22:28 -07:00
call UpdateEnemyMonInParty
ld hl, UpdateEnemyHUD
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-03-26 17:39:44 -07:00
ld hl, EnemySubStatus1
res SUBSTATUS_NIGHTMARE, [hl]
jr .not_asleep
2013-03-26 17:39:44 -07:00
.fast_asleep
; Snore and Sleep Talk bypass sleep.
2013-03-26 17:39:44 -07:00
ld a, [CurEnemyMove]
cp SNORE
jr z, .not_asleep
2013-03-26 17:39:44 -07:00
cp SLEEP_TALK
jr z, .not_asleep
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_asleep
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonStatus
bit FRZ, [hl]
jr z, .not_frozen
2013-03-26 17:39:44 -07:00
ld a, [CurEnemyMove]
cp FLAME_WHEEL
jr z, .not_frozen
cp SACRED_FIRE
jr z, .not_frozen
2013-03-26 17:39:44 -07:00
ld hl, FrozenSolidText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_frozen
2013-03-26 17:39:44 -07:00
ld hl, EnemySubStatus3
bit SUBSTATUS_FLINCHED, [hl]
jr z, .not_flinched
2013-03-26 17:39:44 -07:00
res SUBSTATUS_FLINCHED, [hl]
2013-03-26 17:39:44 -07:00
ld hl, FlinchedText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_flinched
2013-03-26 17:39:44 -07:00
2013-05-02 22:29:57 -07:00
ld hl, EnemyDisableCount
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
jr z, .not_disabled
2013-03-26 17:39:44 -07:00
dec a
ld [hl], a
and $f
jr nz, .not_disabled
2013-03-26 17:39:44 -07:00
ld [hl], a
ld [EnemyDisabledMove], a
2013-03-26 17:39:44 -07:00
ld hl, DisabledNoMoreText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
.not_disabled
2013-03-26 17:39:44 -07:00
ld a, [EnemySubStatus3]
add a ; bit SUBSTATUS_CONFUSED
jr nc, .not_confused
2013-03-26 17:39:44 -07:00
ld hl, EnemyConfuseCount
2013-03-26 17:39:44 -07:00
dec [hl]
jr nz, .confused
2013-03-26 17:39:44 -07:00
ld hl, EnemySubStatus3
res SUBSTATUS_CONFUSED, [hl]
2013-03-26 17:39:44 -07:00
ld hl, ConfusedNoMoreText
call StdBattleTextBox
jr .not_confused
2013-03-26 17:39:44 -07:00
.confused
2013-03-26 17:39:44 -07:00
ld hl, IsConfusedText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
ld de, ANIM_CONFUSED
call FarPlayBattleAnimation
; 50% chance of hitting itself
call BattleRandom
2015-11-09 13:41:09 -08:00
cp 1 + 50 percent
jr nc, .not_confused
2013-03-26 17:39:44 -07:00
; clear confusion-dependent substatus
2013-03-26 17:39:44 -07:00
ld hl, EnemySubStatus3
ld a, [hl]
and 1 << SUBSTATUS_CONFUSED
2013-03-26 17:39:44 -07:00
ld [hl], a
ld hl, HurtItselfText
call StdBattleTextBox
2015-11-09 13:41:09 -08:00
call HitSelfInConfusion
call BattleCommand_DamageCalc
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
; Flicker the monster pic unless flying or underground.
ld de, ANIM_HIT_CONFUSION
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVar
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2013-03-26 17:39:44 -07:00
call z, PlayFXAnimID
ld c, $1
2015-11-09 13:41:09 -08:00
call EnemyHurtItself
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_confused
2013-03-26 17:39:44 -07:00
ld a, [EnemySubStatus1]
add a ; bit SUBSTATUS_ATTRACT
jr nc, .not_infatuated
2013-03-26 17:39:44 -07:00
ld hl, InLoveWithText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-12-19 01:47:39 -08:00
ld de, ANIM_IN_LOVE
2013-03-26 17:39:44 -07:00
call FarPlayBattleAnimation
; 50% chance of infatuation
call BattleRandom
2015-11-09 13:41:09 -08:00
cp 1 + 50 percent
jr c, .not_infatuated
2013-03-26 17:39:44 -07:00
ld hl, InfatuationText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.not_infatuated
2013-03-26 17:39:44 -07:00
; We can't disable a move that doesn't exist.
ld a, [EnemyDisabledMove]
2013-03-26 17:39:44 -07:00
and a
jr z, .no_disabled_move
2013-03-26 17:39:44 -07:00
; Are we using the disabled move?
2013-03-26 17:39:44 -07:00
ld hl, CurEnemyMove
cp [hl]
jr nz, .no_disabled_move
2013-03-26 17:39:44 -07:00
call MoveDisabled
call CantMove
2015-11-09 13:41:09 -08:00
jp EndTurn
2013-03-26 17:39:44 -07:00
.no_disabled_move
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonStatus
bit PAR, [hl]
2013-03-26 17:39:44 -07:00
ret z
; 25% chance to be fully paralyzed
call BattleRandom
2013-03-26 17:39:44 -07:00
cp $3f
ret nc
ld hl, FullyParalyzedText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call CantMove
; fallthrough
; 34385
2015-11-09 13:41:09 -08:00
EndTurn: ; 34385
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-09 13:41:09 -08:00
ld [wTurnEnded], a
2013-03-26 17:39:44 -07:00
jp ResetDamage
2013-03-26 17:39:44 -07:00
; 3438d
MoveDisabled: ; 3438d
; Make sure any charged moves fail
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
res SUBSTATUS_CHARGED, [hl]
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE
call GetBattleVar
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-05-02 23:43:44 -07:00
call GetMoveName
2013-03-26 17:39:44 -07:00
ld hl, DisabledMoveText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 343a5
HitConfusion: ; 343a5
ld hl, HurtItselfText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
xor a
ld [CriticalHit], a
2015-11-09 13:41:09 -08:00
call HitSelfInConfusion
call BattleCommand_DamageCalc
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
; Flicker the monster pic unless flying or underground.
ld de, ANIM_HIT_CONFUSION
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVar
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2013-03-26 17:39:44 -07:00
call z, PlayFXAnimID
ld hl, UpdatePlayerHUD
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-03-26 17:39:44 -07:00
ld c, $1
2015-11-09 13:41:09 -08:00
call PlayerHurtItself
2015-11-06 13:42:38 -08:00
jp BattleCommand_RaiseSub
2013-03-26 17:39:44 -07:00
; 343db
BattleCommand_CheckObedience: ; 343db
2013-03-26 17:39:44 -07:00
; checkobedience
; Enemy can't disobey
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ret nz
2015-11-09 13:41:09 -08:00
call CheckUserIsCharging
2013-03-26 17:39:44 -07:00
ret nz
; If we've already checked this turn
2013-03-26 17:39:44 -07:00
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]
2013-03-26 17:39:44 -07:00
and a
ret nz
2015-09-04 13:30:40 -07:00
ld a, [InBattleTowerBattle]
2013-03-26 17:39:44 -07:00
and a
ret nz
; If the monster's id doesn't match the player's,
; some conditions need to be met.
ld a, MON_ID
2013-03-26 17:39:44 -07:00
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:
2013-03-26 17:39:44 -07:00
ld hl, JohtoBadges
; risingbadge
2015-11-07 18:04:54 -08:00
bit RISINGBADGE, [hl]
ld a, MAX_LEVEL + 1
2013-03-26 17:39:44 -07:00
jr nz, .getlevel
; stormbadge
2015-11-07 18:04:54 -08:00
bit STORMBADGE, [hl]
2013-03-26 17:39:44 -07:00
ld a, 70
jr nz, .getlevel
; fogbadge
2015-11-07 18:04:54 -08:00
bit FOGBADGE, [hl]
2013-03-26 17:39:44 -07:00
ld a, 50
jr nz, .getlevel
; hivebadge
2015-11-07 18:04:54 -08:00
bit HIVEBADGE, [hl]
2013-03-26 17:39:44 -07:00
ld a, 30
jr nz, .getlevel
; no badges
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
call HitConfusion
jp .EndDisobedience
2013-03-26 17:39:44 -07:00
.Nap:
call BattleRandom
2013-03-26 17:39:44 -07:00
add a
swap a
and SLP
2013-03-26 17:39:44 -07:00
jr z, .Nap
ld [BattleMonStatus], a
ld hl, BeganToNapText
jr .Print
.DoNothing:
call BattleRandom
2013-03-26 17:39:44 -07:00
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 .EndDisobedience
2013-03-26 17:39:44 -07:00
.UseInstead:
2013-03-26 17:39:44 -07:00
; Can't use another move if the monster only has one!
ld a, [BattleMonMoves + 1]
2013-03-26 17:39:44 -07:00
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:
2013-03-26 17:39:44 -07:00
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:
2013-03-26 17:39:44 -07:00
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, [w2DMenuNumRows]
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
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
.EndDisobedience:
2013-03-26 17:39:44 -07:00
xor a
ld [LastPlayerMove], a
ld [LastEnemyCounterMove], a
; Break Encore too.
2013-03-26 17:39:44 -07:00
ld hl, PlayerSubStatus5
res SUBSTATUS_ENCORED, [hl]
2013-03-26 17:39:44 -07:00
xor a
ld [PlayerEncoreCount], a
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 3451f
IgnoreSleepOnly: ; 3451f
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp SNORE
jr z, .CheckSleep
cp SLEEP_TALK
jr z, .CheckSleep
and a
ret
.CheckSleep:
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVar
and SLP
2013-03-26 17:39:44 -07:00
ret z
; 'ignored orders…sleeping!'
2013-03-27 14:07:00 -07:00
ld hl, IgnoredSleepingText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
call EndMoveEffect
scf
ret
2013-03-26 17:39:44 -07:00
; 34541
BattleCommand_UsedMoveText: ; 34541
2013-03-26 17:39:44 -07:00
; usedmovetext
callba DisplayUsedMoveText
ret
2013-03-26 17:39:44 -07:00
; 34548
2015-11-09 13:41:09 -08:00
CheckUserIsCharging: ; 34548
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-07 18:04:54 -08:00
ld a, [wPlayerCharging] ; player
2013-03-26 17:39:44 -07:00
jr z, .end
2015-11-07 18:04:54 -08:00
ld a, [wEnemyCharging] ; enemy
2013-03-26 17:39:44 -07:00
.end
and a
ret
2013-03-26 17:39:44 -07:00
; 34555
BattleCommand_DoTurn: ; 34555
2015-11-09 13:41:09 -08:00
call CheckUserIsCharging
2013-03-26 17:39:44 -07:00
ret nz
ld hl, BattleMonPP
ld de, PlayerSubStatus3
ld bc, PlayerTurnsTaken
ld a, [hBattleTurn]
and a
jr z, .proceed
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonPP
ld de, EnemySubStatus3
ld bc, EnemyTurnsTaken
.proceed
2013-03-26 17:39:44 -07:00
; 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
2013-03-26 17:39:44 -07:00
cp STRUGGLE
ret z
ld a, [de]
and 1 << SUBSTATUS_IN_LOOP | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE
2013-03-26 17:39:44 -07:00
ret nz
2015-11-06 17:55:16 -08:00
call .consume_pp
2013-03-26 17:39:44 -07:00
ld a, b
and a
jp nz, EndMoveEffect
; SubStatus5
2013-03-26 17:39:44 -07:00
inc de
2015-12-26 18:59:03 -08:00
inc de
2013-03-26 17:39:44 -07:00
ld a, [de]
bit SUBSTATUS_TRANSFORMED, a
2013-03-26 17:39:44 -07:00
ret nz
ld a, [hBattleTurn]
and a
ld hl, PartyMon1PP
ld a, [CurBattleMon]
2015-11-06 17:55:16 -08:00
jr z, .player
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
; mimic this part entirely if wildbattle
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
2015-11-06 17:55:16 -08:00
jr z, .wild
2013-03-26 17:39:44 -07:00
ld hl, OTPartyMon1PP
ld a, [CurOTMon]
2015-11-06 17:55:16 -08:00
.player
2013-03-26 17:39:44 -07:00
call GetPartyLocation
push hl
2015-11-09 13:41:09 -08:00
call CheckMimicUsed
2013-03-26 17:39:44 -07:00
pop hl
ret c
2015-11-06 17:55:16 -08:00
.consume_pp
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld a, [CurMoveNum]
jr z, .okay
2013-03-26 17:39:44 -07:00
ld a, [CurEnemyMoveNum]
.okay
2013-03-26 17:39:44 -07:00
ld c, a
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld a, [hl]
and $3f
2015-11-09 13:41:09 -08:00
jr z, .out_of_pp
2013-03-26 17:39:44 -07:00
dec [hl]
ld b, 0
2013-03-26 17:39:44 -07:00
ret
2015-11-06 17:55:16 -08:00
.wild
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonMoves
ld a, [CurEnemyMoveNum]
ld c, a
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld a, [hl]
cp MIMIC
jr z, .mimic
2015-11-09 13:41:09 -08:00
ld hl, wWildMonMoves
2013-03-26 17:39:44 -07:00
add hl, bc
ld a, [hl]
cp MIMIC
ret z
.mimic
2015-11-09 13:41:09 -08:00
ld hl, wWildMonPP
2015-11-06 17:55:16 -08:00
call .consume_pp
2013-03-26 17:39:44 -07:00
ret
2015-11-09 13:41:09 -08:00
.out_of_pp
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
; get move effect
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-03-26 17:39:44 -07:00
; continuous?
ld hl, .continuousmoves
2013-03-27 13:19:51 -07:00
ld de, 1
2013-03-26 17:39:44 -07:00
call IsInArray
; 'has no pp left for [move]'
2013-03-27 14:07:00 -07:00
ld hl, HasNoPPLeftText
2013-03-26 17:39:44 -07:00
jr c, .print
; 'but no pp is left for the move'
2013-03-27 14:07:00 -07:00
ld hl, NoPPLeftText
2013-03-26 17:39:44 -07:00
.print
call StdBattleTextBox
2013-04-27 14:12:23 -07:00
ld b, 1
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 34602
.continuousmoves ; 34602
2013-04-27 14:12:23 -07:00
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
2013-03-26 17:39:44 -07:00
; 3460b
2015-11-09 13:41:09 -08:00
CheckMimicUsed: ; 3460b
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld a, [CurMoveNum]
2015-11-06 17:55:16 -08:00
jr z, .player
2013-03-26 17:39:44 -07:00
ld a, [CurEnemyMoveNum]
2015-11-06 17:55:16 -08:00
.player
2013-03-26 17:39:44 -07:00
ld c, a
2015-11-09 13:41:09 -08:00
ld a, MON_MOVES
2013-05-02 23:43:44 -07:00
call UserPartyAttr
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp MIMIC
2015-11-09 13:41:09 -08:00
jr z, .mimic
;
2013-03-26 17:39:44 -07:00
ld b, 0
add hl, bc
ld a, [hl]
cp MIMIC
2015-11-09 13:41:09 -08:00
jr nz, .mimic
2013-03-26 17:39:44 -07:00
scf
ret
2015-11-09 13:41:09 -08:00
.mimic
2013-03-26 17:39:44 -07:00
and a
ret
2013-03-26 17:39:44 -07:00
; 34631
BattleCommand_Critical: ; 34631
2013-03-26 17:39:44 -07:00
; critical
; Determine whether this attack's hit will be critical.
xor a
ld [CriticalHit], a
ld a, BATTLE_VARS_MOVE_POWER
call GetBattleVar
2013-03-26 17:39:44 -07:00
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:
2013-03-26 17:39:44 -07:00
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:
2013-03-26 17:39:44 -07:00
cp FARFETCH_D
jr nz, .FocusEnergy
ld a, [hl]
cp STICK
jr nz, .FocusEnergy
; +2 critical level
ld c, 2
jr .Tally
.FocusEnergy:
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVar
bit SUBSTATUS_FOCUS_ENERGY, a
2013-03-26 17:39:44 -07:00
jr z, .CheckCritical
; +1 critical level
inc c
.CheckCritical:
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld de, 1
ld hl, .Criticals
push bc
call IsInArray
pop bc
jr nc, .ScopeLens
; +2 critical level
inc c
2015-12-26 18:59:03 -08:00
inc c
2013-03-26 17:39:44 -07:00
.ScopeLens:
2013-03-26 17:39:44 -07:00
push bc
call GetUserItem
ld a, b
cp HELD_CRITICAL_UP ; Increased critical chance. Only Scope Lens has this.
2013-03-26 17:39:44 -07:00
pop bc
jr nz, .Tally
; +1 critical level
inc c
.Tally:
2013-03-26 17:39:44 -07:00
ld hl, .Chances
ld b, 0
add hl, bc
call BattleRandom
2013-03-26 17:39:44 -07:00
cp [hl]
ret nc
ld a, 1
ld [CriticalHit], a
ret
.Criticals:
2013-03-26 17:39:44 -07:00
db KARATE_CHOP, RAZOR_WIND, RAZOR_LEAF, CRABHAMMER, SLASH, AEROBLAST, CROSS_CHOP, $ff
.Chances:
2013-03-26 17:39:44 -07:00
; 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
BattleCommand_TripleKick: ; 346b2
2013-03-26 22:52:04 -07:00
; triplekick
2015-11-06 17:55:16 -08:00
ld a, [wKickCounter]
2013-03-26 17:39:44 -07:00
ld b, a
inc b
ld hl, CurDamage + 1
ld a, [hld]
ld e, a
ld a, [hli]
ld d, a
2015-11-06 17:55:16 -08:00
.next_kick
2013-03-26 17:39:44 -07:00
dec b
ret z
ld a, [hl]
add e
ld [hld], a
ld a, [hl]
adc d
ld [hli], a
2013-03-26 22:52:04 -07:00
; No overflow.
2015-11-06 17:55:16 -08:00
jr nc, .next_kick
2013-03-26 17:39:44 -07:00
ld a, $ff
ld [hld], a
ld [hl], a
ret
2013-03-26 17:39:44 -07:00
; 346cd
BattleCommand_KickCounter: ; 346cd
2013-03-26 22:52:04 -07:00
; kickcounter
2015-11-06 17:55:16 -08:00
ld hl, wKickCounter
2013-03-26 17:39:44 -07:00
inc [hl]
ret
2013-03-26 17:39:44 -07:00
; 346d2
BattleCommand_Stab: ; 346d2
2015-09-09 16:27:07 -07:00
; STAB = Same Type Attack Bonus
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
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]
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-09-09 16:27:07 -07:00
jr z, .go ; Who Attacks and who Defends
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_TYPE
call GetBattleVarAddr
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
2013-03-26 17:39:44 -07:00
push hl
push de
push bc
callba DoWeatherModifiers
2013-03-26 17:39:44 -07:00
pop bc
pop de
pop hl
push de
push bc
callba DoBadgeTypeBoosts
2013-03-26 17:39:44 -07:00
pop bc
pop de
2015-11-06 17:55:16 -08:00
ld a, [wTypeMatchup]
2013-03-26 17:39:44 -07:00
cp b
jr z, .stab
2013-03-26 17:39:44 -07:00
cp c
jr z, .stab
jr .SkipStab
2013-03-26 17:39:44 -07:00
.stab
2013-03-26 17:39:44 -07:00
ld hl, CurDamage + 1
ld a, [hld]
ld h, [hl]
ld l, a
2013-03-26 17:39:44 -07:00
ld b, h
ld c, l
srl b
rr c
add hl, bc
2013-03-26 17:39:44 -07:00
ld a, h
ld [CurDamage], a
ld a, l
ld [CurDamage + 1], a
2013-03-26 17:39:44 -07:00
ld hl, TypeModifier
set 7, [hl]
.SkipStab:
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_TYPE
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld b, a
ld hl, TypeMatchup
.TypesLoop:
2013-03-26 17:39:44 -07:00
ld a, [hli]
2013-03-26 17:39:44 -07:00
cp $ff
jr z, .end
; foresight
2013-03-26 17:39:44 -07:00
cp $fe
jr nz, .SkipForesightCheck
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS1_OPP
call GetBattleVar
bit SUBSTATUS_IDENTIFIED, a
jr nz, .end
jr .TypesLoop
.SkipForesightCheck:
2013-03-26 17:39:44 -07:00
cp b
jr nz, .SkipType
2013-03-26 17:39:44 -07:00
ld a, [hl]
cp d
jr z, .GotMatchup
2013-03-26 17:39:44 -07:00
cp e
jr z, .GotMatchup
jr .SkipType
.GotMatchup:
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
jr nz, .NotImmune
2013-03-26 17:39:44 -07:00
inc a
ld [AttackMissed], a
xor a
.NotImmune:
ld [hMultiplier], a
2013-03-26 17:39:44 -07:00
add b
ld [TypeModifier], a
2013-03-26 17:39:44 -07:00
xor a
ld [hMultiplicand + 0], a
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hli]
ld [hMultiplicand + 1], a
2013-03-26 17:39:44 -07:00
ld a, [hld]
ld [hMultiplicand + 2], a
2013-05-02 23:43:44 -07:00
call Multiply
ld a, [hProduct + 1]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [hProduct + 2]
2013-03-26 17:39:44 -07:00
or b
ld b, a
ld a, [hProduct + 3]
2013-03-26 17:39:44 -07:00
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
2013-05-02 23:43:44 -07:00
call Divide
ld a, [hQuotient + 1]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
or b
jr nz, .ok
ld a, 1
ld [hMultiplicand + 2], a
.ok
ld a, [hMultiplicand + 1]
2013-03-26 17:39:44 -07:00
ld [hli], a
ld a, [hMultiplicand + 2]
2013-03-26 17:39:44 -07:00
ld [hl], a
pop bc
pop hl
.SkipType:
2013-03-26 17:39:44 -07:00
inc hl
2015-12-26 18:59:03 -08:00
inc hl
jr .TypesLoop
.end
2015-11-06 17:55:16 -08:00
call BattleCheckTypeMatchup
ld a, [wTypeMatchup]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [TypeModifier]
2015-11-06 17:55:16 -08:00
and %10000000
2013-03-26 17:39:44 -07:00
or b
ld [TypeModifier], a
ret
2013-03-26 17:39:44 -07:00
; 347c8
2015-11-06 17:55:16 -08:00
BattleCheckTypeMatchup: ; 347c8
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonType1
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, CheckTypeMatchup
2013-03-26 17:39:44 -07:00
ld hl, BattleMonType1
2015-11-06 17:55:16 -08:00
CheckTypeMatchup: ; 347d3
2013-03-26 17:39:44 -07:00
push hl
push de
push bc
2013-05-02 23:43:44 -07:00
ld a, BATTLE_VARS_MOVE_TYPE
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld d, a
ld b, [hl]
inc hl
ld c, [hl]
ld a, 10 ; 1.0
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
2013-03-26 17:39:44 -07:00
ld hl, TypeMatchup
.TypesLoop:
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp $ff
jr z, .End
2013-03-26 17:39:44 -07:00
cp $fe
jr nz, .Next
2013-05-02 23:43:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS1_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_IDENTIFIED, a
jr nz, .End
jr .TypesLoop
.Next:
2013-03-26 17:39:44 -07:00
cp d
jr nz, .Nope
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
jr z, .Yup
2013-03-26 17:39:44 -07:00
cp c
jr z, .Yup
jr .Nope2
.Nope:
2013-03-26 17:39:44 -07:00
inc hl
.Nope2:
2013-03-26 17:39:44 -07:00
inc hl
jr .TypesLoop
.Yup:
2013-03-26 17:39:44 -07:00
xor a
ld [hDividend + 0], a
ld [hMultiplicand + 0], a
ld [hMultiplicand + 1], a
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [hMultiplicand + 2], a
2015-11-06 17:55:16 -08:00
ld a, [wTypeMatchup]
ld [hMultiplier], a
2013-03-26 17:39:44 -07:00
call Multiply
ld a, 10
ld [hDivisor], a
2013-03-26 17:39:44 -07:00
push bc
ld b, 4
2013-03-26 17:39:44 -07:00
call Divide
pop bc
ld a, [hQuotient + 2]
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
jr .TypesLoop
.End:
2013-03-26 17:39:44 -07:00
pop bc
pop de
pop hl
ret
2013-03-26 17:39:44 -07:00
; 34833
BattleCommand_ResetTypeMatchup: ; 34833
; Reset the type matchup multiplier to 1.0, if the type matchup is not 0.
; If there is immunity in play, the move automatically misses.
2015-11-06 17:55:16 -08:00
call BattleCheckTypeMatchup
ld a, [wTypeMatchup]
2013-03-26 17:39:44 -07:00
and a
ld a, 10 ; 1.0
jr nz, .reset
2013-03-26 17:39:44 -07:00
call ResetDamage
xor a
ld [TypeModifier], a
inc a
ld [AttackMissed], a
ret
2015-11-06 17:55:16 -08:00
.reset
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 3484e
INCLUDE "battle/ai/switch.asm"
2013-03-26 17:39:44 -07:00
TypeMatchup: ; 34bb1
INCLUDE "battle/type_matchup.asm"
; 34cfd
BattleCommand_DamageVariation: ; 34cfd
2013-03-26 17:39:44 -07:00
; 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
2013-03-26 17:39:44 -07:00
dec hl
ld a, [hli]
ld [hMultiplicand + 1], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [hMultiplicand + 2], a
2013-03-26 17:39:44 -07:00
; Multiply by 85-100%...
.loop
call BattleRandom
2013-03-26 17:39:44 -07:00
rrca
cp $d9 ; 85%
jr c, .loop
ld [hMultiplier], a
2013-03-26 17:39:44 -07:00
call Multiply
; ...divide by 100%...
ld a, $ff ; 100%
ld [hDivisor], a
2013-03-26 17:39:44 -07:00
ld b, $4
call Divide
; ...to get .85-1.00x damage.
ld a, [hQuotient + 1]
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld [hli], a
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
ld [hl], a
ret
2013-03-26 17:39:44 -07:00
; 34d32
BattleCommand_CheckHit: ; 34d32
2013-03-26 17:39:44 -07:00
; 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
2013-03-26 17:39:44 -07:00
ret nz
; Perfect-accuracy moves
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 23:43:44 -07:00
cp EFFECT_ALWAYS_HIT
2013-03-26 17:39:44 -07:00
ret z
call .StatModifiers
ld a, [wPlayerMoveStruct + MOVE_ACC]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [hBattleTurn]
and a
jr z, .BrightPowder
ld a, [wEnemyMoveStruct + MOVE_ACC]
2013-03-26 17:39:44 -07:00
ld b, a
.BrightPowder:
2013-03-26 17:39:44 -07:00
push bc
call GetOpponentItem
ld a, b
2013-05-02 22:29:57 -07:00
cp HELD_BRIGHTPOWDER
2013-03-26 17:39:44 -07:00
ld a, c ; % miss
pop bc
jr nz, .skip_brightpowder
2013-03-26 17:39:44 -07:00
ld c, a
ld a, b
sub c
ld b, a
jr nc, .skip_brightpowder
2013-03-26 17:39:44 -07:00
ld b, 0
.skip_brightpowder
2013-03-26 17:39:44 -07:00
ld a, b
cp $ff
jr z, .Hit
call BattleRandom
2013-03-26 17:39:44 -07:00
cp b
jr nc, .Miss
.Hit:
2013-03-26 17:39:44 -07:00
ret
.Miss:
2013-03-26 17:39:44 -07:00
; Keep the damage value intact if we're using (Hi) Jump Kick.
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 23:43:44 -07:00
cp EFFECT_JUMP_KICK
2013-03-26 17:39:44 -07:00
jr z, .Missed
call ResetDamage
.Missed:
2013-03-26 17:39:44 -07:00
ld a, 1
ld [AttackMissed], a
ret
.DreamEater:
2013-03-26 17:39:44 -07:00
; 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
2013-05-02 23:43:44 -07:00
cp EFFECT_DREAM_EATER
2013-03-26 17:39:44 -07:00
ret nz
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
and SLP
2013-03-26 17:39:44 -07:00
ret
.Protect:
2013-03-26 17:39:44 -07:00
; Return nz if the opponent is protected.
ld a, BATTLE_VARS_SUBSTATUS1_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_PROTECT, a
2013-03-26 17:39:44 -07:00
ret z
ld c, 40
call DelayFrames
; 'protecting itself!'
2013-03-27 14:07:00 -07:00
ld hl, ProtectingItselfText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
ld c, 40
call DelayFrames
ld a, 1
and a
ret
.LockOn:
2013-03-26 17:39:44 -07:00
; 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
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_LOCK_ON, [hl]
res SUBSTATUS_LOCK_ON, [hl]
2013-03-26 17:39:44 -07:00
ret z
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_FLYING, a
2013-03-26 17:39:44 -07:00
jr z, .LockedOn
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp EARTHQUAKE
ret z
cp FISSURE
ret z
cp MAGNITUDE
ret z
.LockedOn:
2013-03-26 17:39:44 -07:00
ld a, 1
and a
ret
.DrainSub:
2013-03-26 17:39:44 -07:00
; Return z if using an HP drain move on a substitute.
2013-05-02 23:43:44 -07:00
call CheckSubstituteOpp
jr z, .not_draining_sub
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-03-26 17:39:44 -07:00
2013-05-02 23:43:44 -07:00
cp EFFECT_LEECH_HIT
2013-03-26 17:39:44 -07:00
ret z
2013-05-02 23:43:44 -07:00
cp EFFECT_DREAM_EATER
2013-03-26 17:39:44 -07:00
ret z
.not_draining_sub
2013-03-26 17:39:44 -07:00
ld a, 1
and a
ret
.FlyDigMoves:
2013-03-26 17:39:44 -07:00
; 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
2013-05-02 23:43:44 -07:00
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2013-03-26 17:39:44 -07:00
ret z
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_FLYING, a
2013-03-26 17:39:44 -07:00
jr z, .DigMoves
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp GUST
ret z
cp WHIRLWIND
ret z
cp THUNDER
ret z
cp TWISTER
ret
.DigMoves:
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp EARTHQUAKE
ret z
cp FISSURE
ret z
cp MAGNITUDE
ret
.ThunderRain:
2013-03-26 17:39:44 -07:00
; Return z if the current move always hits in rain, and it is raining.
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 23:43:44 -07:00
cp EFFECT_THUNDER
2013-03-26 17:39:44 -07:00
ret nz
ld a, [Weather]
cp WEATHER_RAIN
ret
.XAccuracy:
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVar
bit SUBSTATUS_X_ACCURACY, a
2013-03-26 17:39:44 -07:00
ret
.StatModifiers:
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2016-01-17 21:39:01 -08:00
; load the user's accuracy into b and the opponent's evasion into c.
ld hl, wPlayerMoveStruct + MOVE_ACC
2013-03-26 17:39:44 -07:00
ld a, [PlayerAccLevel]
ld b, a
ld a, [EnemyEvaLevel]
ld c, a
jr z, .got_acc_eva
2013-03-26 17:39:44 -07:00
ld hl, wEnemyMoveStruct + MOVE_ACC
2013-03-26 17:39:44 -07:00
ld a, [EnemyAccLevel]
ld b, a
ld a, [PlayerEvaLevel]
ld c, a
.got_acc_eva
2013-03-26 17:39:44 -07:00
cp b
2016-01-17 21:39:01 -08:00
jr c, .skip_foresight_check
2013-03-26 17:39:44 -07:00
2016-01-17 21:39:01 -08:00
; if the target's evasion is greater than the user's accuracy,
; check the target's foresight status
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS1_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_IDENTIFIED, a
2013-03-26 17:39:44 -07:00
ret nz
2016-01-17 21:39:01 -08:00
.skip_foresight_check
; subtract evasion from 14
ld a, 14
2013-03-26 17:39:44 -07:00
sub c
ld c, a
2016-01-17 21:39:01 -08:00
; store the base move accuracy for math ops
2013-03-26 17:39:44 -07:00
xor a
ld [hMultiplicand + 0], a
ld [hMultiplicand + 1], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [hMultiplicand + 2], a
2013-03-26 17:39:44 -07:00
push hl
2016-01-17 21:39:01 -08:00
ld d, 2 ; do this twice, once for the user's accuracy and once for the target's evasion
2013-03-26 17:39:44 -07:00
.accuracy_loop
2016-01-17 21:39:01 -08:00
; look up the multiplier from the table
2013-03-26 17:39:44 -07:00
push bc
ld hl, .AccProb
dec b
sla b
ld c, b
ld b, 0
add hl, bc
pop bc
2016-01-17 21:39:01 -08:00
; multiply by the first byte in that row...
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [hMultiplier], a
2013-03-26 17:39:44 -07:00
call Multiply
2016-01-17 21:39:01 -08:00
; ... and divide by the second byte
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [hDivisor], a
ld b, 4
2013-03-26 17:39:44 -07:00
call Divide
2016-01-17 21:39:01 -08:00
; minimum accuracy is $0001
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [hQuotient + 1]
2013-03-26 17:39:44 -07:00
or b
jr nz, .min_accuracy
ld [hQuotient + 1], a
2016-01-17 21:39:01 -08:00
ld a, 1
ld [hQuotient + 2], a
2013-03-26 17:39:44 -07:00
.min_accuracy
2016-01-17 21:39:01 -08:00
; do the same thing to the target's evasion
2013-03-26 17:39:44 -07:00
ld b, c
dec d
jr nz, .accuracy_loop
2013-03-26 17:39:44 -07:00
2016-01-17 21:39:01 -08:00
; if the result is more than 2 bytes, max out at 100%
ld a, [hQuotient + 1]
2013-03-26 17:39:44 -07:00
and a
ld a, [hQuotient + 2]
jr z, .finish_accuracy
2013-03-26 17:39:44 -07:00
ld a, $ff
.finish_accuracy
2013-03-26 17:39:44 -07:00
pop hl
ld [hl], a
ret
.AccProb:
2013-03-26 17:39:44 -07:00
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
BattleCommand_EffectChance: ; 34ecc
2013-03-26 22:52:04 -07:00
; effectchance
2013-03-26 17:39:44 -07:00
xor a
2013-06-13 13:10:39 -07:00
ld [EffectFailed], a
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
2013-03-26 22:52:04 -07:00
jr nz, .failed
2013-03-26 17:39:44 -07:00
push hl
ld hl, wPlayerMoveStruct + MOVE_CHANCE
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_move_chance
ld hl, wEnemyMoveStruct + MOVE_CHANCE
.got_move_chance
2013-03-26 22:52:04 -07:00
call BattleRandom
2013-03-26 17:39:44 -07:00
cp [hl]
pop hl
ret c
2013-03-26 22:52:04 -07:00
.failed
ld a, 1
2013-06-13 13:10:39 -07:00
ld [EffectFailed], a
2013-03-26 17:39:44 -07:00
and a
ret
2013-03-26 17:39:44 -07:00
; 34eee
2015-11-06 13:42:38 -08:00
BattleCommand_LowerSub: ; 34eee
; lowersub
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_SUBSTITUTE, a
2013-03-26 17:39:44 -07:00
ret z
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_CHARGED, a
2015-11-06 13:42:38 -08:00
jr nz, .already_charged
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-27 14:12:23 -07:00
cp EFFECT_RAZOR_WIND
2015-11-06 13:42:38 -08:00
jr z, .charge_turn
2013-04-27 14:12:23 -07:00
cp EFFECT_SKY_ATTACK
2015-11-06 13:42:38 -08:00
jr z, .charge_turn
2013-04-27 14:12:23 -07:00
cp EFFECT_SKULL_BASH
2015-11-06 13:42:38 -08:00
jr z, .charge_turn
2013-04-27 14:12:23 -07:00
cp EFFECT_SOLARBEAM
2015-11-06 13:42:38 -08:00
jr z, .charge_turn
2013-04-27 14:12:23 -07:00
cp EFFECT_FLY
2015-11-06 13:42:38 -08:00
jr z, .charge_turn
2013-03-26 17:39:44 -07:00
2015-11-06 13:42:38 -08:00
.already_charged
2013-03-26 17:39:44 -07:00
call .Rampage
2015-11-06 13:42:38 -08:00
jr z, .charge_turn
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
call CheckUserIsCharging
2013-03-26 17:39:44 -07:00
ret nz
2015-11-06 13:42:38 -08:00
.charge_turn
2015-11-06 19:36:06 -08:00
call _CheckBattleScene
2015-11-09 13:41:09 -08:00
jr c, .mimic_anims
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
ld [FXAnimIDHi], a
inc a
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
ld a, SUBSTITUTE
2015-11-09 13:41:09 -08:00
jp LoadAnim
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.mimic_anims
2015-11-06 19:36:06 -08:00
call BattleCommand_LowerSubNoAnim
jp BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
.Rampage:
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-27 14:12:23 -07:00
cp EFFECT_ROLLOUT
2015-11-06 13:42:38 -08:00
jr z, .rollout_rampage
2013-04-27 14:12:23 -07:00
cp EFFECT_RAMPAGE
2015-11-06 13:42:38 -08:00
jr z, .rollout_rampage
2013-03-26 17:39:44 -07:00
ld a, 1
and a
ret
2015-11-06 13:42:38 -08:00
.rollout_rampage
2016-01-09 13:28:22 -08:00
ld a, [wSomeoneIsRampaging]
2013-03-26 17:39:44 -07:00
and a
ld a, 0
2016-01-09 13:28:22 -08:00
ld [wSomeoneIsRampaging], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 34f57
BattleCommand_HitTarget: ; 34f57
2013-03-26 17:39:44 -07:00
; hittarget
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2015-11-06 17:55:16 -08:00
call BattleCommand_HitTargetNoSub
2015-11-06 13:42:38 -08:00
jp BattleCommand_RaiseSub
2013-03-26 17:39:44 -07:00
; 34f60
2015-11-06 17:55:16 -08:00
BattleCommand_HitTargetNoSub: ; 34f60
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jp nz, BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld de, PlayerRolloutCount
2015-11-09 13:41:09 -08:00
ld a, BATTLEANIM_ENEMY_DAMAGE
jr z, .got_rollout_count
ld de, EnemyRolloutCount
2015-11-09 13:41:09 -08:00
ld a, BATTLEANIM_PLAYER_DAMAGE
2013-03-26 17:39:44 -07:00
.got_rollout_count
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-25 01:26:37 -07:00
cp EFFECT_MULTI_HIT
2015-11-07 18:04:54 -08:00
jr z, .multihit
2013-04-25 01:26:37 -07:00
cp EFFECT_CONVERSION
2015-11-07 18:04:54 -08:00
jr z, .conversion
2013-04-25 01:26:37 -07:00
cp EFFECT_DOUBLE_HIT
2015-11-07 18:04:54 -08:00
jr z, .doublehit
2013-04-25 01:26:37 -07:00
cp EFFECT_TWINEEDLE
2015-11-07 18:04:54 -08:00
jr z, .twineedle
2013-04-25 01:26:37 -07:00
cp EFFECT_TRIPLE_KICK
2015-11-06 13:42:38 -08:00
jr z, .triplekick
2013-03-26 17:39:44 -07:00
xor a
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2013-03-26 17:39:44 -07:00
2015-11-06 13:42:38 -08:00
.triplekick
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld e, a
ld d, 0
call PlayFXAnimID
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp FLY
2015-11-06 13:42:38 -08:00
jr z, .fly_dig
2013-03-26 17:39:44 -07:00
cp DIG
ret nz
2015-11-06 13:42:38 -08:00
.fly_dig
2013-03-26 17:39:44 -07:00
; clear sprite
2015-11-09 13:41:09 -08:00
jp AppearUserLowerSub
2015-11-07 18:04:54 -08:00
.multihit
.conversion
.doublehit
.twineedle
2015-11-06 17:55:16 -08:00
ld a, [wKickCounter]
2013-05-02 23:43:44 -07:00
and 1
xor 1
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2013-03-26 17:39:44 -07:00
ld a, [de]
cp $1
push af
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld e, a
2013-05-02 23:43:44 -07:00
ld d, 0
2013-03-26 17:39:44 -07:00
pop af
jp z, PlayFXAnimID
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
jp PlayFXAnimID
2013-03-26 17:39:44 -07:00
; 34fd1
2015-11-06 13:42:38 -08:00
BattleCommand_StatUpAnim: ; 34fd1
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jp nz, BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
xor a
2015-11-06 13:42:38 -08:00
jr BattleCommand_StatUpDownAnim
2013-03-26 17:39:44 -07:00
; 34fdb
2015-11-06 13:42:38 -08:00
BattleCommand_StatDownAnim: ; 34fdb
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jp nz, BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
ld a, BATTLEANIM_ENEMY_STAT_DOWN
2015-11-06 13:42:38 -08:00
jr z, BattleCommand_StatUpDownAnim
2015-11-09 13:41:09 -08:00
ld a, BATTLEANIM_WOBBLE
2013-03-26 17:39:44 -07:00
; fallthrough
; 34feb
2015-11-06 13:42:38 -08:00
BattleCommand_StatUpDownAnim: ; 34feb
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
xor a
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld e, a
ld d, 0
jp PlayFXAnimID
2013-03-26 17:39:44 -07:00
; 34ffd
2015-10-10 04:45:39 -07:00
BattleCommand_SwitchTurn: ; 34ffd
2013-03-26 22:52:04 -07:00
; switchturn
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
2013-03-26 22:52:04 -07:00
xor 1
2013-03-26 17:39:44 -07:00
ld [hBattleTurn], a
ret
2013-03-26 17:39:44 -07:00
; 35004
2015-11-06 13:42:38 -08:00
BattleCommand_RaiseSub: ; 35004
; raisesub
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_SUBSTITUTE, a
2013-03-26 17:39:44 -07:00
ret z
2013-03-26 22:52:04 -07:00
2015-11-06 19:36:06 -08:00
call _CheckBattleScene
jp c, BattleCommand_RaiseSubNoAnim
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
ld [FXAnimIDHi], a
ld a, $2
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
ld a, SUBSTITUTE
2015-11-09 13:41:09 -08:00
jp LoadAnim
2013-03-26 17:39:44 -07:00
; 35023
2015-11-09 13:41:09 -08:00
BattleCommand_FailureText: ; 35023
; failuretext
; If the move missed or failed, load the appropriate
; text, and end the effects of multi-turn or multi-
; hit moves.
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
ret z
2013-03-26 22:52:04 -07:00
2015-11-09 13:41:09 -08:00
call GetFailureResultText
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVarAddr
2013-03-26 22:52:04 -07:00
cp FLY
2015-11-09 13:41:09 -08:00
jr z, .fly_dig
2013-03-26 22:52:04 -07:00
cp DIG
2015-11-09 13:41:09 -08:00
jr z, .fly_dig
2013-03-26 22:52:04 -07:00
; Move effect:
2013-03-26 17:39:44 -07:00
inc hl
ld a, [hl]
2013-03-26 22:52:04 -07:00
2013-04-27 14:12:23 -07:00
cp EFFECT_MULTI_HIT
2015-11-09 13:41:09 -08:00
jr z, .multihit
2013-04-27 14:12:23 -07:00
cp EFFECT_DOUBLE_HIT
2015-11-09 13:41:09 -08:00
jr z, .multihit
2013-04-27 14:12:23 -07:00
cp EFFECT_TWINEEDLE
2015-11-09 13:41:09 -08:00
jr z, .multihit
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 22:52:04 -07:00
2015-11-09 13:41:09 -08:00
.multihit
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 22:52:04 -07:00
2015-11-09 13:41:09 -08:00
.fly_dig
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
2013-05-02 23:43:44 -07:00
res SUBSTATUS_UNDERGROUND, [hl]
res SUBSTATUS_FLYING, [hl]
2015-11-09 13:41:09 -08:00
call AppearUserRaiseSub
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 3505e
BattleCommand_CheckFaint: ; 3505e
2013-03-27 14:07:00 -07:00
; checkfaint
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS1_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_ENDURE, a
2015-11-09 13:41:09 -08:00
jr z, .not_enduring
call BattleCommand_FalseSwipe
2013-03-26 17:39:44 -07:00
ld b, $0
2015-11-09 13:41:09 -08:00
jr nc, .okay
2013-03-26 17:39:44 -07:00
ld b, $1
2015-11-09 13:41:09 -08:00
jr .okay
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.not_enduring
2013-03-26 17:39:44 -07:00
call GetOpponentItem
ld a, b
2013-05-02 22:29:57 -07:00
cp HELD_FOCUS_BAND
2013-03-26 17:39:44 -07:00
ld b, $0
2015-11-09 13:41:09 -08:00
jr nz, .okay
call BattleRandom
2013-03-26 17:39:44 -07:00
cp c
2015-11-09 13:41:09 -08:00
jr nc, .okay
call BattleCommand_FalseSwipe
2013-03-26 17:39:44 -07:00
ld b, $0
2015-11-09 13:41:09 -08:00
jr nc, .okay
2013-03-26 17:39:44 -07:00
ld b, $2
2015-11-09 13:41:09 -08:00
.okay
2013-03-26 17:39:44 -07:00
push bc
2015-11-09 13:41:09 -08:00
call .check_sub
2013-03-26 17:39:44 -07:00
ld c, $0
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
jr nz, .damage_player
call EnemyHurtItself
jr .done_damage
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.damage_player
call PlayerHurtItself
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.done_damage
2013-03-26 17:39:44 -07:00
pop bc
ld a, b
and a
ret z
dec a
2015-11-09 13:41:09 -08:00
jr nz, .not_enduring2
2013-03-27 14:07:00 -07:00
ld hl, EnduredText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.not_enduring2
2013-03-26 17:39:44 -07:00
call GetOpponentItem
ld a, [hl]
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-05-02 22:29:57 -07:00
call GetItemName
2013-03-27 14:07:00 -07:00
ld hl, HungOnText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.check_sub
2013-05-02 22:29:57 -07:00
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVar
2013-05-02 22:29:57 -07:00
bit SUBSTATUS_SUBSTITUTE, a
2013-03-26 17:39:44 -07:00
ret nz
2013-05-02 22:29:57 -07:00
ld de, PlayerDamageTaken + 1
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
jr nz, .damage_taken
2013-05-02 22:29:57 -07:00
ld de, EnemyDamageTaken + 1
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.damage_taken
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
; 350e4
2015-11-09 13:41:09 -08:00
GetFailureResultText: ; 350e4
2013-03-27 14:07:00 -07:00
ld hl, DoesntAffectText
ld de, DoesntAffectText
2013-03-26 17:39:44 -07:00
ld a, [TypeModifier]
and $7f
2015-11-09 13:41:09 -08:00
jr z, .got_text
2013-05-02 23:43:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 23:43:44 -07:00
cp EFFECT_FUTURE_SIGHT
2013-03-27 14:07:00 -07:00
ld hl, ButItFailedText
ld de, ItFailedText
2015-11-09 13:41:09 -08:00
jr z, .got_text
2013-03-27 14:07:00 -07:00
ld hl, AttackMissedText
ld de, AttackMissed2Text
2013-03-26 17:39:44 -07:00
ld a, [CriticalHit]
cp $ff
2015-11-09 13:41:09 -08:00
jr nz, .got_text
2013-03-27 14:07:00 -07:00
ld hl, UnaffectedText
2015-11-09 13:41:09 -08:00
.got_text
call FailText_CheckOpponentProtect
2013-03-26 17:39:44 -07:00
xor a
ld [CriticalHit], a
2013-05-02 23:43:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 23:43:44 -07:00
cp EFFECT_JUMP_KICK
2013-03-26 17:39:44 -07:00
ret nz
2015-11-09 13:41:09 -08:00
2013-03-26 17:39:44 -07:00
ld a, [TypeModifier]
and $7f
ret z
2015-11-09 13:41:09 -08:00
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hli]
ld b, [hl]
rept 3
2013-03-26 17:39:44 -07:00
srl a
rr b
endr
2013-03-26 17:39:44 -07:00
ld [hl], b
dec hl
ld [hli], a
or b
2015-11-09 13:41:09 -08:00
jr nz, .do_at_least_1_damage
2013-03-26 17:39:44 -07:00
inc a
ld [hl], a
2015-11-09 13:41:09 -08:00
.do_at_least_1_damage
2013-03-27 14:07:00 -07:00
ld hl, CrashedText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2015-11-09 13:41:09 -08:00
call LoadMoveAnim
2013-03-26 17:39:44 -07:00
ld c, $1
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
jp nz, EnemyHurtItself
jp PlayerHurtItself
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
FailText_CheckOpponentProtect: ; 35157
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS1_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_PROTECT, a
2015-11-09 13:41:09 -08:00
jr z, .not_protected
2013-03-26 17:39:44 -07:00
ld h, d
ld l, e
2015-11-09 13:41:09 -08:00
.not_protected
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 35165
BattleCommanda5: ; 35165
ld a, [AttackMissed]
and a
ret z
ld a, [TypeModifier]
and $7f
jp z, PrintDoesntAffect
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 35175
BattleCommand_CriticalText: ; 35175
2013-03-26 17:39:44 -07:00
; 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
2013-03-26 17:39:44 -07:00
ld b, 0
ld c, a
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
xor a
ld [CriticalHit], a
.wait
ld c, 20
jp DelayFrames
.texts
dw CriticalHitText
dw OneHitKOText
2013-03-26 17:39:44 -07:00
; 35197
BattleCommand_StartLoop: ; 35197
2013-03-26 22:52:04 -07:00
; startloop
ld hl, PlayerRolloutCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .ok
ld hl, EnemyRolloutCount
.ok
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
ret
2013-03-26 17:39:44 -07:00
; 351a5
BattleCommand_SuperEffectiveLoopText: ; 351a5
2013-03-26 22:52:04 -07:00
; supereffectivelooptext
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
bit SUBSTATUS_IN_LOOP, a
2013-03-26 17:39:44 -07:00
ret nz
; fallthrough
; 351ad
BattleCommand_SuperEffectiveText: ; 351ad
2013-03-26 22:52:04 -07:00
; supereffectivetext
2013-03-26 17:39:44 -07:00
ld a, [TypeModifier]
and $7f
cp 10 ; 1.0
ret z
ld hl, SuperEffectiveText
2013-03-26 17:39:44 -07:00
jr nc, .print
ld hl, NotVeryEffectiveText
2013-03-26 17:39:44 -07:00
.print
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 351c0
BattleCommand_CheckDestinyBond: ; 351c0
2013-03-26 22:52:04 -07:00
; checkdestinybond
; Faint the user if it fainted an opponent using Destiny Bond.
ld hl, EnemyMonHP
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_hp
2013-03-26 17:39:44 -07:00
ld hl, BattleMonHP
2013-03-26 22:52:04 -07:00
.got_hp
2013-03-26 17:39:44 -07:00
ld a, [hli]
or [hl]
ret nz
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_DESTINY_BOND, a
jr z, .no_dbond
2013-03-26 22:52:04 -07:00
2013-03-27 14:07:00 -07:00
ld hl, TookDownWithItText
call StdBattleTextBox
2013-04-27 14:12:23 -07:00
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2013-04-27 14:12:23 -07:00
ld hl, EnemyMonMaxHP + 1
bccoord 2, 2 ; hp bar
ld a, 0
jr nz, .got_max_hp
2013-04-27 14:12:23 -07:00
ld hl, BattleMonMaxHP + 1
bccoord 10, 9 ; hp bar
ld a, 1
.got_max_hp
ld [wWhichHPBar], a
2013-03-26 17:39:44 -07:00
ld a, [hld]
ld [Buffer1], a
2013-03-26 17:39:44 -07:00
ld a, [hld]
ld [Buffer2], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer3], a
2013-03-26 17:39:44 -07:00
xor a
ld [hld], a
ld a, [hl]
ld [Buffer4], a
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
ld [Buffer5], a
ld [Buffer6], a
2013-03-26 17:39:44 -07:00
ld h, b
ld l, c
predef AnimateHPBar
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
2013-03-26 22:52:04 -07:00
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
ld [FXAnimIDHi], a
inc a
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
ld a, DESTINY_BOND
2015-11-09 13:41:09 -08:00
call LoadAnim
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 22:52:04 -07:00
jr .finish
2013-03-26 22:52:04 -07:00
.no_dbond
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-27 14:12:23 -07:00
cp EFFECT_MULTI_HIT
jr z, .multiple_hit_raise_sub
2013-04-27 14:12:23 -07:00
cp EFFECT_DOUBLE_HIT
jr z, .multiple_hit_raise_sub
2013-04-27 14:12:23 -07:00
cp EFFECT_TWINEEDLE
jr z, .multiple_hit_raise_sub
2013-04-27 14:12:23 -07:00
cp EFFECT_TRIPLE_KICK
jr z, .multiple_hit_raise_sub
2013-04-27 14:12:23 -07:00
cp EFFECT_BEAT_UP
jr nz, .finish
2013-03-26 22:52:04 -07:00
.multiple_hit_raise_sub
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
2013-03-26 22:52:04 -07:00
.finish
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 35250
BattleCommand_BuildOpponentRage: ; 35250
2013-03-26 22:52:04 -07:00
; buildopponentrage
2013-03-26 17:39:44 -07:00
jp .start
2013-03-26 17:39:44 -07:00
.start
ld a, [AttackMissed]
and a
ret nz
2013-03-26 22:52:04 -07:00
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_RAGE, a
2013-03-26 17:39:44 -07:00
ret z
2013-03-26 22:52:04 -07:00
2015-11-05 16:13:09 -08:00
ld de, wEnemyRageCounter
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-05 16:13:09 -08:00
jr z, .player
ld de, wPlayerRageCounter
.player
2013-03-26 17:39:44 -07:00
ld a, [de]
inc a
ret z
ld [de], a
2013-03-26 22:52:04 -07:00
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-27 14:07:00 -07:00
ld hl, RageBuildingText
call StdBattleTextBox
2015-10-10 04:45:39 -07:00
jp BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
; 3527b
BattleCommand_RageDamage: ; 3527b
2013-03-26 22:52:04 -07:00
; ragedamage
2013-03-26 17:39:44 -07:00
ld a, [CurDamage]
ld h, a
ld b, a
ld a, [CurDamage + 1]
ld l, a
ld c, a
ld a, [hBattleTurn]
and a
2015-11-05 16:13:09 -08:00
ld a, [wPlayerRageCounter]
jr z, .rage_loop
2015-11-05 16:13:09 -08:00
ld a, [wEnemyRageCounter]
.rage_loop
2013-03-26 17:39:44 -07:00
and a
jr z, .done
2013-03-26 17:39:44 -07:00
dec a
add hl, bc
jr nc, .rage_loop
ld hl, -1
.done
2013-03-26 17:39:44 -07:00
ld a, h
ld [CurDamage], a
ld a, l
ld [CurDamage + 1], a
ret
2013-03-26 17:39:44 -07:00
; 352a3
EndMoveEffect: ; 352a3
ld a, [BattleScriptBufferLoc]
ld l, a
ld a, [BattleScriptBufferLoc + 1]
ld h, a
ld a, $ff
ld [hli], a
2015-12-26 18:59:03 -08:00
ld [hli], a
2013-03-26 17:39:44 -07:00
ld [hl], a
ret
2013-03-26 17:39:44 -07:00
; 352b1
DittoMetalPowder: ; 352b1
ld a, MON_SPECIES
2013-03-26 17:39:44 -07:00
call BattlePartyAttr
ld a, [hBattleTurn]
and a
ld a, [hl]
jr nz, .Ditto
ld a, [TempEnemyMonSpecies]
.Ditto:
2013-03-26 17:39:44 -07:00
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, .done
2013-03-26 17:39:44 -07:00
inc b
.done
2013-03-26 17:39:44 -07:00
scf
rr c
ret
2013-03-26 17:39:44 -07:00
; 352dc
BattleCommand_DamageStats: ; 352dc
; damagestats
2013-03-26 17:39:44 -07:00
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.
2013-03-26 17:39:44 -07:00
call ResetDamage
ld hl, wPlayerMoveStructPower
2013-03-26 17:39:44 -07:00
ld a, [hli]
and a
ld d, a
ret z
2013-03-26 17:39:44 -07:00
ld a, [hl]
2014-01-05 05:24:27 -08:00
cp SPECIAL
jr nc, .special
.physical
ld hl, EnemyMonDefense
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld b, a
ld c, [hl]
2013-04-19 23:57:11 -07:00
ld a, [EnemyScreens]
bit SCREENS_REFLECT, a
jr z, .physicalcrit
2013-03-26 17:39:44 -07:00
sla c
rl b
.physicalcrit
ld hl, BattleMonAttack
2013-03-26 17:39:44 -07:00
call GetDamageStatsCritical
jr c, .thickclub
2016-05-15 18:50:31 -07:00
ld hl, EnemyDefense
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld b, a
ld c, [hl]
2016-05-15 18:50:31 -07:00
ld hl, PlayerAttack
jr .thickclub
.special
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonSpclDef
ld a, [hli]
ld b, a
ld c, [hl]
2013-04-19 23:57:11 -07:00
ld a, [EnemyScreens]
bit SCREENS_LIGHT_SCREEN, a
jr z, .specialcrit
2013-03-26 17:39:44 -07:00
sla c
rl b
.specialcrit
2013-03-26 17:39:44 -07:00
ld hl, BattleMonSpclAtk
call GetDamageStatsCritical
jr c, .lightball
2016-05-15 18:50:31 -07:00
ld hl, EnemySpDef
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld b, a
ld c, [hl]
2016-05-15 18:50:31 -07:00
ld hl, PlayerSpAtk
.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
2015-11-09 13:41:09 -08:00
call TruncateHL_BC
2013-03-26 17:39:44 -07:00
ld a, [BattleMonLevel]
ld e, a
call DittoMetalPowder
2013-03-26 17:39:44 -07:00
ld a, 1
and a
ret
; 3534d
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
TruncateHL_BC: ; 3534d
.loop
; Truncate 16-bit values hl and bc to 8-bit values b and c respectively.
; b = hl, c = bc
2013-03-26 17:39:44 -07:00
ld a, h
or b
2015-11-09 13:41:09 -08:00
jr z, .finish
2013-03-26 17:39:44 -07:00
srl b
rr c
srl b
rr c
2013-03-26 17:39:44 -07:00
ld a, c
or b
2015-11-09 13:41:09 -08:00
jr nz, .done_bc
2013-03-26 17:39:44 -07:00
inc c
2015-11-09 13:41:09 -08:00
.done_bc
2013-03-26 17:39:44 -07:00
srl h
rr l
srl h
rr l
2013-03-26 17:39:44 -07:00
ld a, l
or h
2015-11-09 13:41:09 -08:00
jr nz, .finish
2013-03-26 17:39:44 -07:00
inc l
2015-11-09 13:41:09 -08:00
.finish
ld a, [wLinkMode]
cp 3
jr z, .done
; If we go back to the loop point,
; it's the same as doing this exact
; same check twice.
2013-03-26 17:39:44 -07:00
ld a, h
or b
2015-11-09 13:41:09 -08:00
jr nz, .loop
.done
2013-03-26 17:39:44 -07:00
ld b, l
ret
2013-03-26 17:39:44 -07:00
; 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, [wPlayerMoveStructType]
2014-01-05 05:24:27 -08:00
cp SPECIAL
2013-03-26 17:39:44 -07:00
; 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, [wEnemyMoveStructType]
2014-01-05 05:24:27 -08:00
cp SPECIAL
2013-03-26 17:39:44 -07:00
; 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
2013-03-26 17:39:44 -07:00
; 353b5
ThickClubBoost: ; 353b5
2013-04-19 23:29:39 -07:00
; Return in hl the stat value at hl.
2013-03-26 17:39:44 -07:00
; If the attacking monster is Cubone or Marowak and
2013-04-19 23:29:39 -07:00
; it's holding a Thick Club, double it.
2013-03-26 17:39:44 -07:00
push bc
push de
ld b, CUBONE
ld c, MAROWAK
ld d, THICK_CLUB
call SpeciesItemBoost
pop de
pop bc
ret
2013-03-26 17:39:44 -07:00
; 353c3
LightBallBoost: ; 353c3
2013-04-19 23:29:39 -07:00
; Return in hl the stat value at hl.
2013-03-26 17:39:44 -07:00
; If the attacking monster is Pikachu and it's
2013-04-19 23:29:39 -07:00
; holding a Light Ball, double it.
2013-03-26 17:39:44 -07:00
push bc
push de
ld b, PIKACHU
ld c, PIKACHU
ld d, LIGHT_BALL
call SpeciesItemBoost
pop de
pop bc
ret
2013-03-26 17:39:44 -07:00
; 353d1
SpeciesItemBoost: ; 353d1
2013-04-19 23:29:39 -07:00
; Return in hl the stat value at hl.
2013-03-26 17:39:44 -07:00
; If the attacking monster is species b or c and
2013-04-19 23:29:39 -07:00
; it's holding item d, double it.
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld l, [hl]
ld h, a
push hl
ld a, MON_SPECIES
2013-03-26 17:39:44 -07:00
call BattlePartyAttr
ld a, [hBattleTurn]
and a
ld a, [hl]
jr z, .CompareSpecies
ld a, [TempEnemyMonSpecies]
.CompareSpecies:
2013-03-26 17:39:44 -07:00
pop hl
cp b
jr z, .GetItemHeldEffect
2013-03-26 17:39:44 -07:00
cp c
ret nz
.GetItemHeldEffect:
2013-03-26 17:39:44 -07:00
push hl
call GetUserItem
ld a, [hl]
pop hl
cp d
ret nz
; Double the stat
sla l
rl h
ret
2013-03-26 17:39:44 -07:00
; 353f6
EnemyAttackDamage: ; 353f6
call ResetDamage
; No damage dealt with 0 power.
ld hl, wEnemyMoveStructPower
ld a, [hli] ; hl = wEnemyMoveStructType
2013-03-26 17:39:44 -07:00
ld d, a
and a
ret z
ld a, [hl]
2014-01-05 05:24:27 -08:00
cp SPECIAL
2013-03-26 17:39:44 -07:00
jr nc, .Special
.physical
ld hl, BattleMonDefense
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld b, a
ld c, [hl]
ld a, [PlayerScreens]
bit SCREENS_REFLECT, a
jr z, .physicalcrit
2013-03-26 17:39:44 -07:00
sla c
rl b
.physicalcrit
ld hl, EnemyMonAttack
2013-03-26 17:39:44 -07:00
call GetDamageStatsCritical
jr c, .thickclub
2013-03-26 17:39:44 -07:00
2016-05-15 18:50:31 -07:00
ld hl, PlayerDefense
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld b, a
ld c, [hl]
2016-05-15 18:50:31 -07:00
ld hl, EnemyAttack
jr .thickclub
2013-03-26 17:39:44 -07:00
.Special:
2013-03-26 17:39:44 -07:00
ld hl, BattleMonSpclDef
ld a, [hli]
ld b, a
ld c, [hl]
ld a, [PlayerScreens]
bit SCREENS_LIGHT_SCREEN, a
jr z, .specialcrit
2013-03-26 17:39:44 -07:00
sla c
rl b
.specialcrit
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonSpclAtk
call GetDamageStatsCritical
jr c, .lightball
2016-05-15 18:50:31 -07:00
ld hl, PlayerSpDef
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld b, a
ld c, [hl]
2016-05-15 18:50:31 -07:00
ld hl, EnemySpAtk
2013-03-26 17:39:44 -07:00
.lightball
call LightBallBoost
jr .done
2013-03-26 17:39:44 -07:00
.thickclub
call ThickClubBoost
2013-03-26 17:39:44 -07:00
.done
2015-11-09 13:41:09 -08:00
call TruncateHL_BC
2013-03-26 17:39:44 -07:00
ld a, [EnemyMonLevel]
ld e, a
call DittoMetalPowder
2013-03-26 17:39:44 -07:00
ld a, 1
and a
ret
2013-03-26 17:39:44 -07:00
; 35461
BattleCommand_BeatUp: ; 35461
2013-03-26 17:39:44 -07:00
; beatup
call ResetDamage
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jp nz, .enemy_beats_up
2013-03-26 17:39:44 -07:00
ld a, [PlayerSubStatus3]
bit SUBSTATUS_IN_LOOP, a
2015-11-06 17:55:16 -08:00
jr nz, .next_mon
ld c, 20
2013-03-26 17:39:44 -07:00
call DelayFrames
xor a
ld [PlayerRolloutCount], a
2015-11-10 16:51:13 -08:00
ld [wd002], a
2016-01-12 09:46:18 -08:00
ld [wBeatUpHitAtLeastOnce], a
2015-11-06 17:55:16 -08:00
jr .got_mon
.next_mon
ld a, [PlayerRolloutCount]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [PartyCount]
sub b
2015-11-10 16:51:13 -08:00
ld [wd002], a
2015-11-06 17:55:16 -08:00
.got_mon
2015-11-10 16:51:13 -08:00
ld a, [wd002]
ld hl, PartyMonNicknames
2013-12-31 01:09:00 -08:00
call GetNick
2015-11-06 17:55:16 -08:00
ld a, MON_HP
call GetBeatupMonLocation
2013-03-26 17:39:44 -07:00
ld a, [hli]
or [hl]
2015-11-06 17:55:16 -08:00
jp z, .beatup_fail ; fainted
2015-11-10 16:51:13 -08:00
ld a, [wd002]
2013-03-26 17:39:44 -07:00
ld c, a
ld a, [CurBattleMon]
cp [hl]
ld hl, BattleMonStatus
2015-11-06 17:55:16 -08:00
jr z, .active_mon
ld a, MON_STATUS
call GetBeatupMonLocation
.active_mon
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
2015-11-06 17:55:16 -08:00
jp nz, .beatup_fail
2013-03-26 17:39:44 -07:00
ld a, $1
2016-01-12 09:46:18 -08:00
ld [wBeatUpHitAtLeastOnce], a
2013-03-26 17:39:44 -07:00
ld hl, BeatUpAttackText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
ld a, [EnemyMonSpecies]
ld [CurSpecies], a
2013-12-31 01:09:00 -08:00
call GetBaseData
ld a, [BaseDefense]
2013-03-26 17:39:44 -07:00
ld c, a
push bc
2015-11-06 17:55:16 -08:00
ld a, MON_SPECIES
call GetBeatupMonLocation
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [CurSpecies], a
2013-12-31 01:09:00 -08:00
call GetBaseData
ld a, [BaseAttack]
2013-03-26 17:39:44 -07:00
pop bc
ld b, a
push bc
2015-11-06 17:55:16 -08:00
ld a, MON_LEVEL
call GetBeatupMonLocation
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld e, a
pop bc
ld a, [wPlayerMoveStructPower]
2013-03-26 17:39:44 -07:00
ld d, a
ret
2015-11-06 17:55:16 -08:00
.enemy_beats_up
2013-03-26 17:39:44 -07:00
ld a, [EnemySubStatus3]
bit SUBSTATUS_IN_LOOP, a
2015-11-06 17:55:16 -08:00
jr nz, .not_first_enemy_beatup
2013-03-26 17:39:44 -07:00
xor a
ld [EnemyRolloutCount], a
2015-11-10 16:51:13 -08:00
ld [wd002], a
2016-01-12 09:46:18 -08:00
ld [wBeatUpHitAtLeastOnce], a
2015-11-06 17:55:16 -08:00
jr .enemy_continue
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.not_first_enemy_beatup
ld a, [EnemyRolloutCount]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [OTPartyCount]
sub b
2015-11-10 16:51:13 -08:00
ld [wd002], a
2015-11-06 17:55:16 -08:00
.enemy_continue
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
2015-11-06 17:55:16 -08:00
jr z, .wild
2013-03-26 17:39:44 -07:00
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
2015-11-06 17:55:16 -08:00
jr nz, .link_or_tower
2013-03-26 17:39:44 -07:00
2015-09-04 13:30:40 -07:00
ld a, [InBattleTowerBattle]
2013-03-26 17:39:44 -07:00
and a
2015-11-06 17:55:16 -08:00
jr nz, .link_or_tower
2013-03-26 17:39:44 -07:00
2015-11-10 16:51:13 -08:00
ld a, [wd002]
2013-03-26 17:39:44 -07:00
ld c, a
ld b, 0
2013-03-26 17:39:44 -07:00
ld hl, OTPartySpecies
add hl, bc
ld a, [hl]
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-12-31 01:09:00 -08:00
call GetPokemonName
2015-11-06 17:55:16 -08:00
jr .got_enemy_nick
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.link_or_tower
2015-11-10 16:51:13 -08:00
ld a, [wd002]
ld hl, OTPartyMonNicknames
ld bc, NAME_LENGTH
2013-03-26 17:39:44 -07:00
call AddNTimes
ld de, StringBuffer1
call CopyBytes
2015-11-06 17:55:16 -08:00
.got_enemy_nick
ld a, MON_HP
call GetBeatupMonLocation
2013-03-26 17:39:44 -07:00
ld a, [hli]
or [hl]
2015-11-06 17:55:16 -08:00
jp z, .beatup_fail
2015-11-10 16:51:13 -08:00
ld a, [wd002]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [CurOTMon]
cp b
ld hl, EnemyMonStatus
2015-11-06 17:55:16 -08:00
jr z, .active_enemy
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
ld a, MON_STATUS
call GetBeatupMonLocation
.active_enemy
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
2015-11-06 17:55:16 -08:00
jr nz, .beatup_fail
2013-03-26 17:39:44 -07:00
ld a, $1
2016-01-12 09:46:18 -08:00
ld [wBeatUpHitAtLeastOnce], a
2015-11-06 17:55:16 -08:00
jr .finish_beatup
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.wild
2013-03-26 17:39:44 -07:00
ld a, [EnemyMonSpecies]
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-12-31 01:09:00 -08:00
call GetPokemonName
2013-03-26 17:39:44 -07:00
ld hl, BeatUpAttackText
call StdBattleTextBox
jp EnemyAttackDamage
2015-11-06 17:55:16 -08:00
.finish_beatup
2013-03-26 17:39:44 -07:00
ld hl, BeatUpAttackText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
ld a, [BattleMonSpecies]
ld [CurSpecies], a
2013-04-29 12:08:13 -07:00
call GetBaseData
ld a, [BaseDefense]
2013-03-26 17:39:44 -07:00
ld c, a
push bc
2015-11-06 17:55:16 -08:00
ld a, MON_SPECIES
call GetBeatupMonLocation
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [CurSpecies], a
2013-04-29 12:08:13 -07:00
call GetBaseData
ld a, [BaseAttack]
2013-03-26 17:39:44 -07:00
pop bc
ld b, a
push bc
2015-11-06 17:55:16 -08:00
ld a, MON_LEVEL
call GetBeatupMonLocation
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld e, a
pop bc
ld a, [wEnemyMoveStructPower]
2013-03-26 17:39:44 -07:00
ld d, a
ret
; 355b0
2013-03-26 17:39:44 -07:00
.beatup_fail ; 355b0
ld b, buildopponentrage_command
2013-03-26 22:52:04 -07:00
jp SkipToBattleCommand
2013-03-26 17:39:44 -07:00
; 355b5
BattleCommanda8: ; 355b5
2016-01-12 09:46:18 -08:00
ld a, [wBeatUpHitAtLeastOnce]
2013-03-26 17:39:44 -07:00
and a
ret nz
2015-09-09 16:27:07 -07:00
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 355bd
2015-11-06 17:55:16 -08:00
GetBeatupMonLocation: ; 355bd
2013-03-26 17:39:44 -07:00
push bc
ld c, a
ld b, 0
ld a, [hBattleTurn]
and a
ld hl, PartyMon1Species
jr z, .got_species
2013-04-07 23:15:08 -07:00
ld hl, OTPartyMon1Species
2013-03-26 17:39:44 -07:00
.got_species
2015-11-10 16:51:13 -08:00
ld a, [wd002]
2013-03-26 17:39:44 -07:00
add hl, bc
call GetPartyLocation
pop bc
ret
BattleCommand_ClearMissDamage: ; 355d5
2013-03-26 22:52:04 -07:00
; clearmissdamage
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
ret z
2015-09-09 16:27:07 -07:00
2013-03-26 17:39:44 -07:00
jp ResetDamage
2013-03-26 17:39:44 -07:00
; 355dd
2015-11-09 13:41:09 -08:00
HitSelfInConfusion: ; 355dd
2013-03-26 17:39:44 -07:00
call ResetDamage
ld a, [hBattleTurn]
and a
ld hl, BattleMonDefense
2013-03-26 17:39:44 -07:00
ld de, PlayerScreens
ld a, [BattleMonLevel]
2015-11-09 13:41:09 -08:00
jr z, .got_it
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonDefense
2013-04-19 23:57:11 -07:00
ld de, EnemyScreens
2013-03-26 17:39:44 -07:00
ld a, [EnemyMonLevel]
2015-11-09 13:41:09 -08:00
.got_it
2013-03-26 17:39:44 -07:00
push af
ld a, [hli]
ld b, a
ld c, [hl]
ld a, [de]
bit SCREENS_REFLECT, a
2015-11-09 13:41:09 -08:00
jr z, .mimic_screen
2013-03-26 17:39:44 -07:00
sla c
rl b
2015-11-09 13:41:09 -08:00
.mimic_screen
2013-03-26 17:39:44 -07:00
dec hl
dec hl
dec hl
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld l, [hl]
ld h, a
2015-11-09 13:41:09 -08:00
call TruncateHL_BC
ld d, 40
2013-03-26 17:39:44 -07:00
pop af
ld e, a
ret
2013-03-26 17:39:44 -07:00
; 35612
BattleCommand_DamageCalc: ; 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.
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
; Selfdestruct and Explosion halve defense.
2013-04-25 01:26:37 -07:00
cp EFFECT_EXPLOSION
jr nz, .dont_explode
2013-03-26 17:39:44 -07:00
srl c
jr nz, .dont_explode
2013-03-26 17:39:44 -07:00
inc c
.dont_explode
; Variable-hit moves and Conversion can have a power of 0.
2013-04-25 01:26:37 -07:00
cp EFFECT_MULTI_HIT
jr z, .skip_zero_damage_check
2013-04-25 01:26:37 -07:00
cp EFFECT_CONVERSION
jr z, .skip_zero_damage_check
; No damage if move power is 0.
2013-03-26 17:39:44 -07:00
ld a, d
and a
ret z
.skip_zero_damage_check
; Minimum defense value is 1.
2013-03-26 17:39:44 -07:00
ld a, c
and a
jr nz, .not_dividing_by_zero
ld c, 1
.not_dividing_by_zero
2013-03-26 17:39:44 -07:00
xor a
ld hl, hDividend
2013-03-26 17:39:44 -07:00
ld [hli], a
2015-12-26 18:59:03 -08:00
ld [hli], a
2013-03-26 17:39:44 -07:00
ld [hl], a
; Level * 2
2013-03-26 17:39:44 -07:00
ld a, e
add a
jr nc, .level_not_overflowing
2013-03-26 17:39:44 -07:00
ld [hl], $1
.level_not_overflowing
2013-03-26 17:39:44 -07:00
inc hl
ld [hli], a
; / 5
ld a, 5
2013-03-26 17:39:44 -07:00
ld [hld], a
push bc
ld b, $4
call Divide
2013-03-26 17:39:44 -07:00
pop bc
; + 2
2013-03-26 17:39:44 -07:00
inc [hl]
2015-12-26 18:59:03 -08:00
inc [hl]
; * bp
2013-03-26 17:39:44 -07:00
inc hl
ld [hl], d
call Multiply
; * Attack
2013-03-26 17:39:44 -07:00
ld [hl], b
call Multiply
; / Defense
2013-03-26 17:39:44 -07:00
ld [hl], c
ld b, $4
call Divide
; / 50
ld [hl], 50
2013-03-26 17:39:44 -07:00
ld b, $4
call Divide
; Item boosts
2013-03-26 17:39:44 -07:00
call GetUserItem
2013-03-26 17:39:44 -07:00
ld a, b
and a
jr z, .DoneItem
2013-03-26 17:39:44 -07:00
ld hl, TypeBoostItems
.NextItem:
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp $ff
jr z, .DoneItem
; Item effect
2013-03-26 17:39:44 -07:00
cp b
ld a, [hli]
jr nz, .NextItem
; Type
2013-03-26 17:39:44 -07:00
ld b, a
ld a, BATTLE_VARS_MOVE_TYPE
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp b
jr nz, .DoneItem
; * 100 + item effect amount
2013-03-26 17:39:44 -07:00
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).
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld b, [hl]
ld a, [hProduct + 3]
2013-03-26 17:39:44 -07:00
add b
ld [hProduct + 3], a
jr nc, .dont_cap_1
ld a, [hProduct + 2]
2013-03-26 17:39:44 -07:00
inc a
ld [hProduct + 2], a
2013-03-26 17:39:44 -07:00
and a
jr z, .Cap
.dont_cap_1
ld a, [hProduct]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [hProduct + 1]
2013-03-26 17:39:44 -07:00
or a
jr nz, .Cap
ld a, [hProduct + 2]
cp 998 / $100
jr c, .dont_cap_2
cp 998 / $100 + 1
jr nc, .Cap
ld a, [hProduct + 3]
cp 998 % $100
jr nc, .Cap
.dont_cap_2
2013-03-26 17:39:44 -07:00
inc hl
ld a, [hProduct + 3]
2013-03-26 17:39:44 -07:00
ld b, [hl]
add b
ld [hld], a
ld a, [hProduct + 2]
2013-03-26 17:39:44 -07:00
ld b, [hl]
adc b
ld [hl], a
jr c, .Cap
2013-03-26 17:39:44 -07:00
ld a, [hl]
cp 998 / $100
jr c, .dont_cap_3
cp 998 / $100 + 1
jr nc, .Cap
2013-03-26 17:39:44 -07:00
inc hl
ld a, [hld]
cp 998 % $100
jr c, .dont_cap_3
.Cap:
ld a, 997 / $100
2013-03-26 17:39:44 -07:00
ld [hli], a
ld a, 997 % $100
2013-03-26 17:39:44 -07:00
ld [hld], a
.dont_cap_3
; Minimum neutral damage is 2 (bringing the cap to 999).
2013-03-26 17:39:44 -07:00
inc hl
ld a, [hl]
add 2
2013-03-26 17:39:44 -07:00
ld [hld], a
jr nc, .dont_floor
2013-03-26 17:39:44 -07:00
inc [hl]
.dont_floor
ld a, 1
2013-03-26 17:39:44 -07:00
and a
ret
.CriticalMultiplier:
2013-03-26 17:39:44 -07:00
ld a, [CriticalHit]
and a
ret z
; x2
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
add a
ld [hProduct + 3], a
ld a, [hQuotient + 1]
2013-03-26 17:39:44 -07:00
rl a
ld [hProduct + 2], a
; Cap at $ffff.
2013-03-26 17:39:44 -07:00
ret nc
ld a, $ff
ld [hProduct + 2], a
ld [hProduct + 3], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 35703
TypeBoostItems: ; 35703
2013-05-02 23:43:44 -07:00
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
2013-03-26 17:39:44 -07:00
db $ff
; 35726
BattleCommand_ConstantDamage: ; 35726
2013-03-26 22:52:04 -07:00
; constantdamage
2013-03-26 17:39:44 -07:00
ld hl, BattleMonLevel
ld a, [hBattleTurn]
and a
jr z, .got_turn
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonLevel
.got_turn
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 23:43:44 -07:00
cp EFFECT_LEVEL_DAMAGE
2013-03-26 17:39:44 -07:00
ld b, [hl]
ld a, 0
jr z, .got_power
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 23:43:44 -07:00
cp EFFECT_PSYWAVE
jr z, .psywave
2013-03-26 17:39:44 -07:00
2013-05-02 23:43:44 -07:00
cp EFFECT_SUPER_FANG
jr z, .super_fang
2013-03-26 17:39:44 -07:00
2013-05-02 23:43:44 -07:00
cp EFFECT_REVERSAL
jr z, .reversal
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_POWER
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld b, a
ld a, $0
jr .got_power
2013-03-26 17:39:44 -07:00
.psywave
2013-03-26 17:39:44 -07:00
ld a, b
srl a
add b
ld b, a
.psywave_loop
call BattleRandom
2013-03-26 17:39:44 -07:00
and a
jr z, .psywave_loop
2013-03-26 17:39:44 -07:00
cp b
jr nc, .psywave_loop
2013-03-26 17:39:44 -07:00
ld b, a
ld a, $0
jr .got_power
.super_fang
ld hl, EnemyMonHP
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_hp
2013-03-26 17:39:44 -07:00
ld hl, BattleMonHP
.got_hp
2013-03-26 17:39:44 -07:00
ld a, [hli]
srl a
ld b, a
ld a, [hl]
rr a
push af
ld a, b
pop bc
and a
jr nz, .got_power
2013-03-26 17:39:44 -07:00
or b
ld a, $0
jr nz, .got_power
2013-03-26 17:39:44 -07:00
ld b, $1
jr .got_power
.got_power
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld [hli], a
ld [hl], b
ret
.reversal
2013-03-26 17:39:44 -07:00
ld hl, BattleMonHP
ld a, [hBattleTurn]
and a
jr z, .reversal_got_hp
ld hl, EnemyMonHP
.reversal_got_hp
2013-03-26 17:39:44 -07:00
xor a
ld [hDividend], a
ld [hMultiplicand + 0], a
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [hMultiplicand + 1], a
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [hMultiplicand + 2], a
2013-03-26 17:39:44 -07:00
ld a, $30
ld [hMultiplier], a
2013-05-02 23:43:44 -07:00
call Multiply
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld b, a
ld a, [hl]
ld [hDivisor], a
2013-03-26 17:39:44 -07:00
ld a, b
and a
jr z, .skip_to_divide
2013-03-26 17:39:44 -07:00
ld a, [hProduct + 4]
2013-03-26 17:39:44 -07:00
srl b
rr a
srl b
rr a
ld [hDivisor], a
ld a, [hProduct + 2]
2013-03-26 17:39:44 -07:00
ld b, a
srl b
ld a, [hProduct + 3]
2013-03-26 17:39:44 -07:00
rr a
srl b
rr a
ld [hDividend + 3], a
2013-03-26 17:39:44 -07:00
ld a, b
ld [hDividend + 2], a
2013-03-26 17:39:44 -07:00
.skip_to_divide
2013-03-26 17:39:44 -07:00
ld b, $4
2013-05-02 23:43:44 -07:00
call Divide
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
ld b, a
2013-05-02 23:43:44 -07:00
ld hl, .FlailPower
2013-03-26 17:39:44 -07:00
.reversal_loop
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
jr nc, .break_loop
2013-03-26 17:39:44 -07:00
inc hl
jr .reversal_loop
2013-03-26 17:39:44 -07:00
.break_loop
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld a, [hl]
2015-09-09 16:27:07 -07:00
jr nz, .notPlayersTurn
2013-03-26 17:39:44 -07:00
ld hl, wPlayerMoveStructPower
2013-03-26 17:39:44 -07:00
ld [hl], a
push hl
call PlayerAttackDamage
2015-09-09 16:27:07 -07:00
jr .notEnemysTurn
2013-03-26 17:39:44 -07:00
2015-09-09 16:27:07 -07:00
.notPlayersTurn
ld hl, wEnemyMoveStructPower
2013-03-26 17:39:44 -07:00
ld [hl], a
push hl
call EnemyAttackDamage
2015-09-09 16:27:07 -07:00
.notEnemysTurn
call BattleCommand_DamageCalc
2013-03-26 17:39:44 -07:00
pop hl
ld [hl], 1
ret
.FlailPower:
2013-05-02 23:43:44 -07:00
; px, bp
db 1, 200
db 4, 150
db 9, 100
db 16, 80
db 32, 40
db 48, 20
2013-03-26 17:39:44 -07:00
; 35813
BattleCommand_Counter: ; 35813
2013-03-26 22:52:04 -07:00
; counter
2014-01-05 05:24:27 -08:00
ld a, 1
2013-03-26 17:39:44 -07:00
ld [AttackMissed], a
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
and a
ret z
2014-01-05 05:24:27 -08:00
ld b, a
2013-12-30 20:32:37 -08:00
callab GetMoveEffect
2013-03-26 17:39:44 -07:00
ld a, b
2014-01-05 05:24:27 -08:00
cp EFFECT_COUNTER
2013-03-26 17:39:44 -07:00
ret z
2014-01-05 05:24:27 -08:00
call BattleCommand_ResetTypeMatchup
2015-11-06 17:55:16 -08:00
ld a, [wTypeMatchup]
2013-03-26 17:39:44 -07:00
and a
ret z
2014-01-05 05:24:27 -08:00
2015-11-09 13:41:09 -08:00
call CheckOpponentWentFirst
2013-03-26 17:39:44 -07:00
ret z
2014-01-05 05:24:27 -08:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
dec a
ld de, StringBuffer1
call GetMoveData
2014-01-05 05:24:27 -08:00
ld a, [StringBuffer1 + 2]
2013-03-26 17:39:44 -07:00
and a
ret z
2014-01-05 05:24:27 -08:00
ld a, [StringBuffer1 + 3]
2014-01-05 05:24:27 -08:00
cp SPECIAL
2013-03-26 17:39:44 -07:00
ret nc
2014-01-05 05:24:27 -08:00
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hli]
or [hl]
ret z
2014-01-05 05:24:27 -08:00
2013-03-26 17:39:44 -07:00
ld a, [hl]
add a
ld [hld], a
ld a, [hl]
adc a
ld [hl], a
2014-01-05 05:24:27 -08:00
jr nc, .capped
2013-03-26 17:39:44 -07:00
ld a, $ff
ld [hli], a
ld [hl], a
2014-01-05 05:24:27 -08:00
.capped
2013-03-26 17:39:44 -07:00
xor a
ld [AttackMissed], a
ret
2013-03-26 17:39:44 -07:00
; 35864
BattleCommand_Encore: ; 35864
2013-03-26 22:52:04 -07:00
; encore
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonMoves
2013-05-02 22:29:57 -07:00
ld de, EnemyEncoreCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .ok
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMoves
ld de, PlayerEncoreCount
.ok
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
and a
jp z, .failed
cp STRUGGLE
jp z, .failed
cp ENCORE
jp z, .failed
cp MIRROR_MOVE
jp z, .failed
2013-03-26 17:39:44 -07:00
ld b, a
.got_move
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
jr nz, .got_move
ld bc, BattleMonPP - BattleMonMoves - 1
2013-03-26 17:39:44 -07:00
add hl, bc
ld a, [hl]
and $3f
jp z, .failed
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jp nz, .failed
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5_OPP
call GetBattleVarAddr
bit SUBSTATUS_ENCORED, [hl]
jp nz, .failed
set SUBSTATUS_ENCORED, [hl]
call BattleRandom
2013-03-26 17:39:44 -07:00
and $3
inc a
inc a
inc a
2013-03-26 17:39:44 -07:00
ld [de], a
2015-11-09 13:41:09 -08:00
call CheckOpponentWentFirst
jr nz, .finish_move
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .force_last_enemy_move
2013-03-26 17:39:44 -07:00
push hl
ld a, [LastPlayerMove]
ld b, a
ld c, 0
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMoves
.find_player_move
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
jr z, .got_player_move
2013-03-26 17:39:44 -07:00
inc c
ld a, c
cp NUM_MOVES
jr c, .find_player_move
2013-03-26 17:39:44 -07:00
pop hl
res SUBSTATUS_ENCORED, [hl]
2013-03-26 17:39:44 -07:00
xor a
ld [de], a
jr .failed
.got_player_move
2013-03-26 17:39:44 -07:00
pop hl
ld a, c
ld [CurMoveNum], a
ld a, b
ld [CurPlayerMove], a
dec a
ld de, wPlayerMoveStruct
2013-03-26 17:39:44 -07:00
call GetMoveData
jr .finish_move
.force_last_enemy_move
2013-03-26 17:39:44 -07:00
push hl
ld a, [LastEnemyMove]
ld b, a
ld c, 0
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonMoves
.find_enemy_move
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
jr z, .got_enemy_move
2013-03-26 17:39:44 -07:00
inc c
ld a, c
cp NUM_MOVES
jr c, .find_enemy_move
2013-03-26 17:39:44 -07:00
pop hl
res SUBSTATUS_ENCORED, [hl]
2013-03-26 17:39:44 -07:00
xor a
ld [de], a
jr .failed
.got_enemy_move
pop hl
2013-03-26 17:39:44 -07:00
ld a, c
ld [CurEnemyMoveNum], a
ld a, b
ld [CurEnemyMove], a
dec a
ld de, wEnemyMoveStruct
2013-03-26 17:39:44 -07:00
call GetMoveData
.finish_move
call AnimateCurrentMove
2013-03-27 14:07:00 -07:00
ld hl, GotAnEncoreText
jp StdBattleTextBox
.failed
2013-03-26 17:39:44 -07:00
jp PrintDidntAffect2
2013-03-26 17:39:44 -07:00
; 35926
BattleCommand_PainSplit: ; 35926
2013-03-26 22:52:04 -07:00
; painsplit
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jp nz, .ButItFailed
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
jp nz, .ButItFailed
call AnimateCurrentMove
ld hl, BattleMonMaxHP + 1
ld de, EnemyMonMaxHP + 1
2015-11-09 13:41:09 -08:00
call .PlayerShareHP
2013-03-26 17:39:44 -07:00
ld a, $1
ld [wWhichHPBar], a
hlcoord 10, 9
predef AnimateHPBar
ld hl, EnemyMonHP
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [Buffer4], a
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [Buffer3], a
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [Buffer2], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer1], a
2015-11-09 13:41:09 -08:00
call .EnemyShareHP
2013-03-26 17:39:44 -07:00
xor a
ld [wWhichHPBar], a
2013-03-26 17:39:44 -07:00
call ResetDamage
hlcoord 2, 2
predef AnimateHPBar
2015-11-09 13:41:09 -08:00
callba _UpdateBattleHUDs
2013-03-27 14:07:00 -07:00
ld hl, SharedPainText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
.PlayerShareHP:
2013-03-26 17:39:44 -07:00
ld a, [hld]
ld [Buffer1], a
2013-03-26 17:39:44 -07:00
ld a, [hld]
ld [Buffer2], a
2013-03-26 17:39:44 -07:00
ld a, [hld]
ld b, a
ld [Buffer3], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer4], a
2013-03-26 17:39:44 -07:00
dec de
2015-12-26 18:59:03 -08:00
dec de
2013-03-26 17:39:44 -07:00
ld a, [de]
dec de
add b
ld [CurDamage + 1], a
2013-03-26 17:39:44 -07:00
ld b, [hl]
ld a, [de]
adc b
srl a
ld [CurDamage], a
ld a, [CurDamage + 1]
2013-03-26 17:39:44 -07:00
rr a
ld [CurDamage + 1], a
2013-03-26 17:39:44 -07:00
inc hl
inc hl
inc hl
inc de
inc de
2013-03-26 17:39:44 -07:00
inc de
2015-11-09 13:41:09 -08:00
.EnemyShareHP: ; 359ac
2013-03-26 17:39:44 -07:00
ld c, [hl]
dec hl
ld a, [CurDamage + 1]
2013-03-26 17:39:44 -07:00
sub c
ld b, [hl]
dec hl
ld a, [CurDamage]
sbc b
2015-11-09 13:41:09 -08:00
jr nc, .skip
2013-03-26 17:39:44 -07:00
ld a, [CurDamage]
ld b, a
ld a, [CurDamage + 1]
2013-03-26 17:39:44 -07:00
ld c, a
2015-11-09 13:41:09 -08:00
.skip
2013-03-26 17:39:44 -07:00
ld a, c
ld [hld], a
ld [Buffer5], a
2013-03-26 17:39:44 -07:00
ld a, b
ld [hli], a
ld [Buffer6], a
2013-03-26 17:39:44 -07:00
ret
; 359cd
2013-03-26 17:39:44 -07:00
.ButItFailed:
jp PrintDidntAffect2
2013-03-26 17:39:44 -07:00
; 359d0
BattleCommand_Snore: ; 359d0
2013-03-26 22:52:04 -07:00
; snore
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVar
2013-05-02 23:43:44 -07:00
and SLP
2013-03-26 17:39:44 -07:00
ret nz
call ResetDamage
ld a, $1
ld [AttackMissed], a
2015-11-09 13:41:09 -08:00
call FailSnore
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 359e6
BattleCommand_Conversion2: ; 359e6
2013-03-26 22:52:04 -07:00
; conversion2
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jr nz, .failed
2013-03-26 17:39:44 -07:00
ld hl, BattleMonType1
ld a, [hBattleTurn]
and a
jr z, .got_type
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonType1
.got_type
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
and a
jr z, .failed
2013-03-26 17:39:44 -07:00
push hl
dec a
ld hl, Moves + MOVE_TYPE
2013-03-27 13:19:51 -07:00
call GetMoveAttr
2013-03-26 17:39:44 -07:00
ld d, a
pop hl
2013-05-02 23:43:44 -07:00
cp CURSE_T
jr z, .failed
call AnimateCurrentMove
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
.loop
call BattleRandom
2013-03-26 17:39:44 -07:00
and $1f
cp UNUSED_TYPES
jr c, .okay
cp UNUSED_TYPES_END
jr c, .loop
cp TYPES_END
jr nc, .loop
.okay
2013-03-26 17:39:44 -07:00
ld [hli], a
ld [hld], a
push hl
ld a, BATTLE_VARS_MOVE_TYPE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
push af
push hl
ld a, d
ld [hl], a
2015-11-06 17:55:16 -08:00
call BattleCheckTypeMatchup
2013-03-26 17:39:44 -07:00
pop hl
pop af
ld [hl], a
pop hl
2015-11-06 17:55:16 -08:00
ld a, [wTypeMatchup]
cp 10
jr nc, .loop
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
ld a, [hl]
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
predef GetTypeName
2014-01-05 04:28:55 -08:00
ld hl, TransformedTypeText
jp StdBattleTextBox
.failed
2015-11-09 13:41:09 -08:00
jp FailConversion2
2013-03-26 17:39:44 -07:00
; 35a53
BattleCommand_LockOn: ; 35a53
2013-03-26 22:52:04 -07:00
; lockon
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
2015-11-09 13:41:09 -08:00
jr nz, .fail
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
2015-11-09 13:41:09 -08:00
jr nz, .fail
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5_OPP
call GetBattleVarAddr
2013-05-02 23:43:44 -07:00
set SUBSTATUS_LOCK_ON, [hl]
call AnimateCurrentMove
2013-03-27 14:07:00 -07:00
ld hl, TookAimText
jp StdBattleTextBox
2013-03-27 14:07:00 -07:00
2015-11-09 13:41:09 -08:00
.fail
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
jp PrintDidntAffect
2013-03-26 17:39:44 -07:00
; 35a74
BattleCommand_Sketch: ; 35a74
2013-03-26 22:52:04 -07:00
; sketch
2015-11-09 13:41:09 -08:00
call ClearLastMove
; Don't sketch during a link battle
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
2015-11-09 13:41:09 -08:00
jr z, .not_linked
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
jp PrintNothingHappened
2015-11-09 13:41:09 -08:00
.not_linked
; If the opponent has a substitute up, fail.
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
2015-11-09 13:41:09 -08:00
jp nz, .fail
; If the opponent is transformed, fail.
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5_OPP
call GetBattleVarAddr
bit SUBSTATUS_TRANSFORMED, [hl]
2015-11-09 13:41:09 -08:00
jp nz, .fail
; Get the user's moveset in its party struct.
; This move replacement shall be permanent.
; Pointer will be in de.
ld a, MON_MOVES
2013-05-02 23:43:44 -07:00
call UserPartyAttr
2013-03-26 17:39:44 -07:00
ld d, h
ld e, l
2015-11-09 13:41:09 -08:00
; Get the battle move structs.
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMoves
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
jr z, .get_last_move
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonMoves
2015-11-09 13:41:09 -08:00
.get_last_move
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
2013-03-26 17:39:44 -07:00
ld b, a
2015-11-09 13:41:09 -08:00
; Fail if move is invalid or is Struggle.
2013-03-26 17:39:44 -07:00
and a
2015-11-09 13:41:09 -08:00
jr z, .fail
2013-05-02 23:43:44 -07:00
cp STRUGGLE
2015-11-09 13:41:09 -08:00
jr z, .fail
; Fail if user already knows that move
ld c, NUM_MOVES
2015-11-09 13:41:09 -08:00
.does_user_already_know_move
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
2015-11-09 13:41:09 -08:00
jr z, .fail
2013-03-26 17:39:44 -07:00
dec c
2015-11-09 13:41:09 -08:00
jr nz, .does_user_already_know_move
; Find Sketch in the user's moveset.
; Pointer in hl, and index in c.
2013-03-26 17:39:44 -07:00
dec hl
ld c, NUM_MOVES
2015-11-09 13:41:09 -08:00
.find_sketch
2013-03-26 17:39:44 -07:00
dec c
ld a, [hld]
2013-05-02 23:43:44 -07:00
cp SKETCH
2015-11-09 13:41:09 -08:00
jr nz, .find_sketch
2013-03-26 17:39:44 -07:00
inc hl
2015-11-09 13:41:09 -08:00
; The Sketched move is loaded to that slot.
2013-03-26 17:39:44 -07:00
ld a, b
ld [hl], a
2015-11-09 13:41:09 -08:00
; Copy the base PP from that move.
2013-03-26 17:39:44 -07:00
push bc
push hl
dec a
ld hl, Moves + MOVE_PP
2013-03-27 13:19:51 -07:00
call GetMoveAttr
2013-03-26 17:39:44 -07:00
pop hl
ld bc, BattleMonPP - BattleMonMoves
2013-03-26 17:39:44 -07:00
add hl, bc
ld [hl], a
pop bc
2015-11-09 13:41:09 -08:00
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
jr z, .user_trainer
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
2015-11-09 13:41:09 -08:00
jr nz, .user_trainer
; wildmon
2013-03-26 17:39:44 -07:00
ld a, [hl]
push bc
2015-11-09 13:41:09 -08:00
ld hl, wWildMonPP
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld [hl], a
2015-11-09 13:41:09 -08:00
ld hl, wWildMonMoves
2013-03-26 17:39:44 -07:00
add hl, bc
pop bc
ld [hl], b
2015-11-09 13:41:09 -08:00
jr .done_copy
.user_trainer
2013-03-26 17:39:44 -07:00
ld a, [hl]
push af
ld l, c
ld h, 0
2013-03-26 17:39:44 -07:00
add hl, de
ld a, b
ld [hl], a
pop af
2015-11-09 13:41:09 -08:00
ld de, MON_PP - MON_MOVES
2013-03-26 17:39:44 -07:00
add hl, de
ld [hl], a
2015-11-09 13:41:09 -08:00
.done_copy
2013-05-02 23:43:44 -07:00
call GetMoveName
call AnimateCurrentMove
2013-03-27 14:07:00 -07:00
ld hl, SketchedText
jp StdBattleTextBox
2013-03-27 14:07:00 -07:00
2015-11-09 13:41:09 -08:00
.fail
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
jp PrintDidntAffect
2013-03-26 17:39:44 -07:00
; 35b16
BattleCommand_DefrostOpponent: ; 35b16
2013-03-26 22:52:04 -07:00
; defrostopponent
; Thaw the opponent if frozen, and
; raise the user's Attack one stage.
2013-03-26 22:52:04 -07:00
call AnimateCurrentMove
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
2013-03-26 22:52:04 -07:00
call Defrost
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld a, [hl]
push hl
push af
2013-03-26 22:52:04 -07:00
ld a, EFFECT_ATTACK_UP
2013-03-26 17:39:44 -07:00
ld [hl], a
call BattleCommand_StatUp
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
pop af
pop hl
ld [hl], a
ret
2013-03-26 17:39:44 -07:00
; 35b33
BattleCommand_SleepTalk: ; 35b33
2013-03-26 22:52:04 -07:00
; sleeptalk
2015-11-09 13:41:09 -08:00
call ClearLastMove
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
2015-11-09 13:41:09 -08:00
jr nz, .fail
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld hl, BattleMonMoves + 1
2013-03-26 17:39:44 -07:00
ld a, [DisabledMove]
ld d, a
jr z, .got_moves
ld hl, EnemyMonMoves + 1
ld a, [EnemyDisabledMove]
2013-03-26 17:39:44 -07:00
ld d, a
.got_moves
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVar
and SLP
2015-11-09 13:41:09 -08:00
jr z, .fail
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
2015-11-09 13:41:09 -08:00
jr z, .fail
call .safely_check_has_usable_move
2015-11-09 13:41:09 -08:00
jr c, .fail
2013-03-26 17:39:44 -07:00
dec hl
.sample_move
2013-03-26 17:39:44 -07:00
push hl
call BattleRandom
and 3 ; TODO factor in NUM_MOVES
2013-03-26 17:39:44 -07:00
ld c, a
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld a, [hl]
pop hl
and a
jr z, .sample_move
2013-03-26 17:39:44 -07:00
ld e, a
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp e
jr z, .sample_move
2013-03-26 17:39:44 -07:00
ld a, e
cp d
jr z, .sample_move
call .check_two_turn_move
jr z, .sample_move
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld a, e
ld [hl], a
2015-11-09 13:41:09 -08:00
call CheckUserIsCharging
jr nz, .charging
2015-11-06 17:55:16 -08:00
ld a, [wKickCounter]
2013-03-26 17:39:44 -07:00
push af
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2013-03-26 17:39:44 -07:00
pop af
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2015-11-09 13:41:09 -08:00
.charging
call LoadMoveAnim
2013-03-26 17:39:44 -07:00
call UpdateMoveData
jp ResetTurn
2015-11-09 13:41:09 -08:00
.fail
call AnimateFailedMove
jp TryPrintButItFailed
2013-03-26 17:39:44 -07:00
.safely_check_has_usable_move
2013-03-26 17:39:44 -07:00
push hl
push de
push bc
call .check_has_usable_move
2013-03-26 17:39:44 -07:00
pop bc
pop de
pop hl
ret
.check_has_usable_move
2013-03-26 22:52:04 -07:00
ld a, [hBattleTurn]
2013-03-26 17:39:44 -07:00
and a
ld a, [DisabledMove]
jr z, .got_move_2
2013-03-26 17:39:44 -07:00
ld a, [EnemyDisabledMove]
.got_move_2
2013-03-26 17:39:44 -07:00
ld b, a
ld a, BATTLE_VARS_MOVE
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld c, a
dec hl
ld d, NUM_MOVES
.loop2
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
jr z, .carry
2013-03-26 17:39:44 -07:00
cp c
jr z, .nope
2013-03-26 17:39:44 -07:00
cp b
jr z, .nope
2013-03-26 17:39:44 -07:00
call .check_two_turn_move
jr nz, .no_carry
2013-03-26 17:39:44 -07:00
.nope
2013-03-26 17:39:44 -07:00
inc hl
dec d
jr nz, .loop2
2013-03-26 17:39:44 -07:00
.carry
2013-03-26 17:39:44 -07:00
scf
ret
.no_carry
2013-03-26 17:39:44 -07:00
and a
ret
.check_two_turn_move
2013-03-26 17:39:44 -07:00
push hl
push de
push bc
ld b, a
2013-12-30 20:32:37 -08:00
callab GetMoveEffect
2013-03-26 17:39:44 -07:00
ld a, b
pop bc
pop de
pop hl
cp EFFECT_SKULL_BASH
2013-03-26 17:39:44 -07:00
ret z
cp EFFECT_RAZOR_WIND
2013-03-26 17:39:44 -07:00
ret z
cp EFFECT_SKY_ATTACK
2013-03-26 17:39:44 -07:00
ret z
cp EFFECT_SOLARBEAM
2013-03-26 17:39:44 -07:00
ret z
cp EFFECT_FLY
2013-03-26 17:39:44 -07:00
ret z
cp EFFECT_BIDE
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 35bff
BattleCommand_DestinyBond: ; 35bff
2013-03-26 22:52:04 -07:00
; destinybond
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5
call GetBattleVarAddr
set SUBSTATUS_DESTINY_BOND, [hl]
call AnimateCurrentMove
2013-03-27 14:07:00 -07:00
ld hl, DestinyBondEffectText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 35c0f
BattleCommand_Spite: ; 35c0f
2013-03-26 22:52:04 -07:00
; spite
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jp nz, .failed
ld bc, PARTYMON_STRUCT_LENGTH ; ????
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonMoves
ld a, [hBattleTurn]
and a
jr z, .got_moves
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMoves
.got_moves
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
and a
jr z, .failed
cp STRUGGLE
jr z, .failed
2013-03-26 17:39:44 -07:00
ld b, a
ld c, -1
.loop
2013-03-26 17:39:44 -07:00
inc c
ld a, [hli]
cp b
jr nz, .loop
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
2013-03-26 17:39:44 -07:00
dec hl
ld b, 0
2013-03-26 17:39:44 -07:00
push bc
ld c, BattleMonPP - BattleMonMoves
2013-03-26 17:39:44 -07:00
add hl, bc
pop bc
ld a, [hl]
and $3f
jr z, .failed
2013-03-26 17:39:44 -07:00
push bc
2013-05-02 23:43:44 -07:00
call GetMoveName
call BattleRandom
and 3
2013-03-26 17:39:44 -07:00
inc a
2015-12-26 18:59:03 -08:00
inc a
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [hl]
and $3f
cp b
jr nc, .deplete_pp
2013-03-26 17:39:44 -07:00
ld b, a
.deplete_pp
2013-03-26 17:39:44 -07:00
ld a, [hl]
sub b
ld [hl], a
push af
ld a, MON_PP
2013-05-02 23:43:44 -07:00
call OpponentPartyAttr
2013-03-26 17:39:44 -07:00
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, .transformed
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr nz, .not_wildmon
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
jr nz, .not_wildmon
ld hl, wWildMonPP
2013-03-26 17:39:44 -07:00
add hl, bc
.not_wildmon
2013-03-26 17:39:44 -07:00
ld [hl], e
.transformed
2013-03-26 17:39:44 -07:00
push de
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
pop de
ld a, d
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
2013-03-27 14:07:00 -07:00
ld hl, SpiteEffectText
jp StdBattleTextBox
.failed
2013-03-26 17:39:44 -07:00
jp PrintDidntAffect2
2013-03-26 17:39:44 -07:00
; 35c94
BattleCommand_FalseSwipe: ; 35c94
2013-03-26 22:52:04 -07:00
; falseswipe
ld hl, EnemyMonHP
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_hp
2013-03-26 17:39:44 -07:00
ld hl, BattleMonHP
.got_hp
2013-03-26 17:39:44 -07:00
ld de, CurDamage
ld c, 2
2013-03-26 17:39:44 -07:00
push hl
push de
call StringCmp
pop de
pop hl
jr c, .done
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
dec a
ld [de], a
inc a
jr nz, .okay
2013-03-26 17:39:44 -07:00
dec de
ld a, [de]
dec a
ld [de], a
.okay
2013-03-26 17:39:44 -07:00
ld a, [CriticalHit]
cp $2
jr nz, .carry
2013-03-26 17:39:44 -07:00
xor a
ld [CriticalHit], a
.carry
2013-03-26 17:39:44 -07:00
scf
ret
.done
2013-03-26 17:39:44 -07:00
and a
ret
2013-03-26 17:39:44 -07:00
; 35cc9
BattleCommand_HealBell: ; 35cc9
2013-03-26 22:52:04 -07:00
; healbell
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS1
call GetBattleVarAddr
res SUBSTATUS_NIGHTMARE, [hl]
2013-03-26 17:39:44 -07:00
ld de, PartyMon1Status
ld a, [hBattleTurn]
and a
jr z, .got_status
2013-03-26 17:39:44 -07:00
ld de, OTPartyMon1Status
.got_status
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
ld h, d
ld l, e
ld bc, PARTYMON_STRUCT_LENGTH
ld d, PARTY_LENGTH
.loop
2013-03-26 17:39:44 -07:00
ld [hl], a
add hl, bc
dec d
jr nz, .loop
call AnimateCurrentMove
2013-03-27 14:07:00 -07:00
ld hl, BellChimedText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jp z, CalcPlayerStats
jp CalcEnemyStats
2013-03-26 17:39:44 -07:00
; 35d00
FarPlayBattleAnimation: ; 35d00
; play animation de
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVar
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2013-03-26 17:39:44 -07:00
ret nz
; fallthrough
; 35d08
PlayFXAnimID: ; 35d08
ld a, e
ld [FXAnimIDLo], a
ld a, d
ld [FXAnimIDHi], a
ld c, 3
call DelayFrames
2013-12-03 21:44:45 -08:00
callab PlayBattleAnim
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 35d1c
2015-11-09 13:41:09 -08:00
EnemyHurtItself: ; 35d1c
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hli]
ld b, a
ld a, [hl]
or b
2015-11-09 13:41:09 -08:00
jr z, .did_no_damage
2013-03-26 17:39:44 -07:00
ld a, c
and a
2015-11-09 13:41:09 -08:00
jr nz, .mimic_sub_check
2013-03-26 17:39:44 -07:00
ld a, [EnemySubStatus4]
bit SUBSTATUS_SUBSTITUTE, a
2015-11-09 13:41:09 -08:00
jp nz, SelfInflictDamageToSubstitute
.mimic_sub_check
2013-03-26 17:39:44 -07:00
ld a, [hld]
ld b, a
ld a, [EnemyMonHP + 1]
ld [Buffer3], a
2013-03-26 17:39:44 -07:00
sub b
ld [EnemyMonHP + 1], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld b, a
ld a, [EnemyMonHP]
ld [Buffer4], a
2013-03-26 17:39:44 -07:00
sbc b
ld [EnemyMonHP], a
2015-11-09 13:41:09 -08:00
jr nc, .mimic_faint
2013-03-26 17:39:44 -07:00
ld a, [Buffer4]
2013-03-26 17:39:44 -07:00
ld [hli], a
ld a, [Buffer3]
2013-03-26 17:39:44 -07:00
ld [hl], a
2013-03-26 17:39:44 -07:00
xor a
ld hl, EnemyMonHP
2013-03-26 17:39:44 -07:00
ld [hli], a
ld [hl], a
2015-11-09 13:41:09 -08:00
.mimic_faint
ld hl, EnemyMonMaxHP
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [Buffer2], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer1], a
ld hl, EnemyMonHP
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [Buffer6], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer5], a
hlcoord 2, 2
2013-03-26 17:39:44 -07:00
xor a
ld [wWhichHPBar], a
predef AnimateHPBar
2015-11-09 13:41:09 -08:00
.did_no_damage
2013-05-02 21:22:28 -07:00
jp RefreshBattleHuds
2013-03-26 17:39:44 -07:00
; 35d7e
2015-11-09 13:41:09 -08:00
PlayerHurtItself: ; 35d7e
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hli]
ld b, a
ld a, [hl]
or b
2015-11-09 13:41:09 -08:00
jr z, .did_no_damage
2013-03-26 17:39:44 -07:00
ld a, c
and a
2015-11-09 13:41:09 -08:00
jr nz, .mimic_sub_check
2013-03-26 17:39:44 -07:00
ld a, [PlayerSubStatus4]
bit SUBSTATUS_SUBSTITUTE, a
2015-11-09 13:41:09 -08:00
jp nz, SelfInflictDamageToSubstitute
.mimic_sub_check
2013-03-26 17:39:44 -07:00
ld a, [hld]
ld b, a
ld a, [BattleMonHP + 1]
ld [Buffer3], a
2013-03-26 17:39:44 -07:00
sub b
ld [BattleMonHP + 1], a
ld [Buffer5], a
2013-03-26 17:39:44 -07:00
ld b, [hl]
ld a, [BattleMonHP]
ld [Buffer4], a
2013-03-26 17:39:44 -07:00
sbc b
ld [BattleMonHP], a
ld [Buffer6], a
2015-11-09 13:41:09 -08:00
jr nc, .mimic_faint
2013-03-26 17:39:44 -07:00
ld a, [Buffer4]
2013-03-26 17:39:44 -07:00
ld [hli], a
ld a, [Buffer3]
2013-03-26 17:39:44 -07:00
ld [hl], a
xor a
2013-03-26 17:39:44 -07:00
ld hl, BattleMonHP
ld [hli], a
ld [hl], a
ld hl, Buffer5
2013-03-26 17:39:44 -07:00
ld [hli], a
ld [hl], a
2015-11-09 13:41:09 -08:00
.mimic_faint
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMaxHP
ld a, [hli]
ld [Buffer2], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer1], a
hlcoord 10, 9
2013-03-26 17:39:44 -07:00
ld a, $1
ld [wWhichHPBar], a
predef AnimateHPBar
2015-11-09 13:41:09 -08:00
.did_no_damage
2013-05-02 21:22:28 -07:00
jp RefreshBattleHuds
2013-03-26 17:39:44 -07:00
; 35de0
2015-11-09 13:41:09 -08:00
SelfInflictDamageToSubstitute: ; 35de0
2013-03-27 14:07:00 -07:00
ld hl, SubTookDamageText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
ld de, EnemySubstituteHP
2013-03-26 22:52:04 -07:00
ld a, [hBattleTurn]
2013-03-26 17:39:44 -07:00
and a
jr z, .got_hp
ld de, PlayerSubstituteHP
.got_hp
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hli]
and a
jr nz, .broke
2013-03-26 17:39:44 -07:00
ld a, [de]
sub [hl]
ld [de], a
jr z, .broke
jr nc, .done
2013-03-26 17:39:44 -07:00
.broke
2013-05-02 22:29:57 -07:00
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVarAddr
res SUBSTATUS_SUBSTITUTE, [hl]
2013-03-26 22:52:04 -07:00
2013-03-27 14:07:00 -07:00
ld hl, SubFadedText
call StdBattleTextBox
2013-03-26 22:52:04 -07:00
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2015-11-06 19:36:06 -08:00
call BattleCommand_LowerSubNoAnim
2013-05-02 22:29:57 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVar
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2015-11-09 13:41:09 -08:00
call z, AppearUserLowerSub
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 22:52:04 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVarAddr
2013-05-02 22:29:57 -07:00
cp EFFECT_MULTI_HIT
jr z, .ok
2013-05-02 22:29:57 -07:00
cp EFFECT_DOUBLE_HIT
jr z, .ok
2013-05-02 22:29:57 -07:00
cp EFFECT_TWINEEDLE
jr z, .ok
2013-05-02 22:29:57 -07:00
cp EFFECT_TRIPLE_KICK
jr z, .ok
2013-05-02 22:29:57 -07:00
cp EFFECT_BEAT_UP
jr z, .ok
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
.ok
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
.done
2013-03-26 17:39:44 -07:00
jp ResetDamage
2013-03-26 17:39:44 -07:00
; 35e40
UpdateMoveData: ; 35e40
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld d, h
ld e, l
ld a, BATTLE_VARS_MOVE
call GetBattleVar
2015-11-06 17:55:16 -08:00
ld [CurMove], a
ld [wNamedObjectIndexBuffer], a
2013-03-26 17:39:44 -07:00
dec a
call GetMoveData
call GetMoveName
jp CopyName1
2013-03-26 17:39:44 -07:00
; 35e5c
BattleCommand_SleepTarget: ; 35e5c
2013-03-26 17:39:44 -07:00
; sleeptarget
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
call GetOpponentItem
ld a, b
cp HELD_PREVENT_SLEEP
2015-11-06 19:36:06 -08:00
jr nz, .not_protected_by_item
2013-03-26 17:39:44 -07:00
ld a, [hl]
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-05-02 22:29:57 -07:00
call GetItemName
2013-03-27 14:07:00 -07:00
ld hl, ProtectedByText
2015-11-06 19:36:06 -08:00
jr .fail
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
.not_protected_by_item
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld d, h
ld e, l
ld a, [de]
and SLP
2013-03-27 14:07:00 -07:00
ld hl, AlreadyAsleepText
2015-11-06 19:36:06 -08:00
jr nz, .fail
2013-03-27 14:07:00 -07:00
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jp nz, PrintDidntAffect2
2013-03-27 14:07:00 -07:00
ld hl, DidntAffect1Text
2015-11-06 19:36:06 -08:00
call .CheckAIRandomFail
jr c, .fail
2013-03-27 14:07:00 -07:00
2013-03-26 17:39:44 -07:00
ld a, [de]
and a
2015-11-06 19:36:06 -08:00
jr nz, .fail
2013-03-27 14:07:00 -07:00
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
2015-11-06 19:36:06 -08:00
jr nz, .fail
2013-03-27 14:07:00 -07:00
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld b, $7
2015-09-04 13:30:40 -07:00
ld a, [InBattleTowerBattle]
2013-03-26 17:39:44 -07:00
and a
2015-11-06 19:36:06 -08:00
jr z, .random_loop
2013-03-26 17:39:44 -07:00
ld b, $3
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
.random_loop
call BattleRandom
2013-03-26 17:39:44 -07:00
and b
2015-11-06 19:36:06 -08:00
jr z, .random_loop
2013-03-27 14:07:00 -07:00
cp 7
2015-11-06 19:36:06 -08:00
jr z, .random_loop
2013-03-26 17:39:44 -07:00
inc a
ld [de], a
2013-05-02 21:22:28 -07:00
call UpdateOpponentInParty
call RefreshBattleHuds
2013-03-27 14:07:00 -07:00
ld hl, FellAsleepText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
callba UseHeldStatusHealingItem
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
jp z, OpponentCantMove
2013-03-26 17:39:44 -07:00
ret
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
.fail
2013-03-26 17:39:44 -07:00
push hl
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
pop hl
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 35ece
2015-11-06 19:36:06 -08:00
.CheckAIRandomFail: ; 35ece
; Enemy turn
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 19:36:06 -08:00
jr z, .dont_fail
2013-03-26 17:39:44 -07:00
; Not in link battle
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
2015-11-06 19:36:06 -08:00
jr nz, .dont_fail
2013-03-26 17:39:44 -07:00
2015-09-04 13:30:40 -07:00
ld a, [InBattleTowerBattle]
2013-03-26 17:39:44 -07:00
and a
2015-11-06 19:36:06 -08:00
jr nz, .dont_fail
2013-03-26 17:39:44 -07:00
; Not locked-on by the enemy
2013-03-26 17:39:44 -07:00
ld a, [PlayerSubStatus5]
bit SUBSTATUS_LOCK_ON, a
2015-11-06 19:36:06 -08:00
jr nz, .dont_fail
2013-03-26 17:39:44 -07:00
call BattleRandom
2015-11-06 19:36:06 -08:00
cp $40 ; 25%
2013-03-26 17:39:44 -07:00
ret c
2015-11-06 19:36:06 -08:00
.dont_fail
2013-03-26 17:39:44 -07:00
xor a
ret
2013-03-26 17:39:44 -07:00
; 35eee
BattleCommand_PoisonTarget: ; 35eee
2013-03-26 22:52:04 -07:00
; poisontarget
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
ret nz
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
and a
ret nz
ld a, [TypeModifier]
and $7f
ret z
2015-11-06 19:36:06 -08:00
call CheckIfTargetIsPoisonType
2013-03-26 17:39:44 -07:00
ret z
call GetOpponentItem
ld a, b
cp HELD_PREVENT_POISON
2013-03-26 17:39:44 -07:00
ret z
2013-06-13 13:10:39 -07:00
ld a, [EffectFailed]
2013-03-26 17:39:44 -07:00
and a
ret nz
2015-11-06 19:36:06 -08:00
call SafeCheckSafeguard
2013-03-26 17:39:44 -07:00
ret nz
2015-11-06 19:36:06 -08:00
call PoisonOpponent
ld de, ANIM_PSN
2015-11-06 17:55:16 -08:00
call PlayOpponentBattleAnim
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
2013-03-27 14:07:00 -07:00
ld hl, WasPoisonedText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
callba UseHeldStatusHealingItem
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 35f2c
BattleCommand_Poison: ; 35f2c
2013-03-26 22:52:04 -07:00
; poison
2013-03-27 14:07:00 -07:00
ld hl, DoesntAffectText
2013-03-26 17:39:44 -07:00
ld a, [TypeModifier]
and $7f
2015-11-06 19:36:06 -08:00
jp z, .failed
2015-11-06 19:36:06 -08:00
call CheckIfTargetIsPoisonType
jp z, .failed
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld b, a
2013-03-27 14:07:00 -07:00
ld hl, AlreadyPoisonedText
and 1 << PSN
2015-11-06 19:36:06 -08:00
jp nz, .failed
2013-03-26 17:39:44 -07:00
call GetOpponentItem
ld a, b
cp HELD_PREVENT_POISON
2015-11-06 19:36:06 -08:00
jr nz, .do_poison
2013-03-26 17:39:44 -07:00
ld a, [hl]
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-05-02 22:29:57 -07:00
call GetItemName
2013-03-27 14:07:00 -07:00
ld hl, ProtectedByText
2015-11-06 19:36:06 -08:00
jr .failed
2015-11-06 19:36:06 -08:00
.do_poison
2013-03-27 14:07:00 -07:00
ld hl, DidntAffect1Text
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
and a
2015-11-06 19:36:06 -08:00
jr nz, .failed
2015-09-04 13:30:40 -07:00
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
jr z, .mimic_random
2015-09-04 13:30:40 -07:00
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
2015-11-09 13:41:09 -08:00
jr nz, .mimic_random
2015-09-04 13:30:40 -07:00
ld a, [InBattleTowerBattle]
2013-03-26 17:39:44 -07:00
and a
2015-11-09 13:41:09 -08:00
jr nz, .mimic_random
2015-09-04 13:30:40 -07:00
2013-03-26 17:39:44 -07:00
ld a, [PlayerSubStatus5]
bit SUBSTATUS_LOCK_ON, a
2015-11-09 13:41:09 -08:00
jr nz, .mimic_random
2015-09-04 13:30:40 -07:00
call BattleRandom
2015-11-06 19:36:06 -08:00
cp $40 ; 25% chance AI fails
jr c, .failed
2015-11-09 13:41:09 -08:00
.mimic_random
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
2015-11-06 19:36:06 -08:00
jr nz, .failed
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
2015-11-06 19:36:06 -08:00
jr nz, .failed
call .check_toxic
jr z, .toxic
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
call .apply_poison
2013-03-27 14:07:00 -07:00
ld hl, WasPoisonedText
call StdBattleTextBox
2015-11-06 19:36:06 -08:00
jr .finished
2015-11-06 19:36:06 -08:00
.toxic
set SUBSTATUS_TOXIC, [hl]
2013-03-26 17:39:44 -07:00
xor a
ld [de], a
2015-11-06 19:36:06 -08:00
call .apply_poison
2013-03-27 14:07:00 -07:00
ld hl, BadlyPoisonedText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
.finished
callba UseHeldStatusHealingItem
2013-03-26 17:39:44 -07:00
ret
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
.failed
2013-03-26 17:39:44 -07:00
push hl
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
pop hl
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 35fc0
.apply_poison ; 35fc0
call AnimateCurrentMove
2015-11-06 19:36:06 -08:00
call PoisonOpponent
2013-05-02 21:22:28 -07:00
jp RefreshBattleHuds
2013-03-26 17:39:44 -07:00
; 35fc9
.check_toxic ; 35fc9
2013-05-02 22:29:57 -07:00
ld a, BATTLE_VARS_SUBSTATUS5_OPP
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld de, EnemyToxicCount
jr z, .ok
ld de, PlayerToxicCount
.ok
2013-05-02 22:29:57 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 22:29:57 -07:00
cp EFFECT_TOXIC
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 35fe1
2015-11-06 19:36:06 -08:00
CheckIfTargetIsPoisonType: ; 35fe1
2013-03-26 17:39:44 -07:00
ld de, EnemyMonType1
ld a, [hBattleTurn]
and a
jr z, .ok
2013-03-26 17:39:44 -07:00
ld de, BattleMonType1
.ok
2013-03-26 17:39:44 -07:00
ld a, [de]
inc de
2013-05-02 22:29:57 -07:00
cp POISON
2013-03-26 17:39:44 -07:00
ret z
ld a, [de]
2013-05-02 22:29:57 -07:00
cp POISON
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 35ff5
2015-11-06 19:36:06 -08:00
PoisonOpponent: ; 35ff5
2013-05-02 22:29:57 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
2013-05-02 22:29:57 -07:00
set PSN, [hl]
2013-05-02 21:22:28 -07:00
jp UpdateOpponentInParty
2013-03-26 17:39:44 -07:00
; 35fff
BattleCommand_DrainTarget: ; 35fff
2013-03-27 14:07:00 -07:00
; draintarget
2015-11-06 19:36:06 -08:00
call SapHealth
2013-03-27 14:07:00 -07:00
ld hl, SuckedHealthText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 36008
BattleCommand_EatDream: ; 36008
2013-03-27 14:07:00 -07:00
; eatdream
2015-11-06 19:36:06 -08:00
call SapHealth
2013-03-27 14:07:00 -07:00
ld hl, DreamEatenText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 36011
2015-11-06 19:36:06 -08:00
SapHealth: ; 36011
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hli]
srl a
2015-11-06 19:36:06 -08:00
ld [hDividend], a
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [hl]
rr a
2015-11-06 19:36:06 -08:00
ld [hDividend + 1], a
2013-03-26 17:39:44 -07:00
or b
jr nz, .ok1
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-06 19:36:06 -08:00
ld [hDividend + 1], a
.ok1
2013-03-26 17:39:44 -07:00
ld hl, BattleMonHP
ld de, BattleMonMaxHP
ld a, [hBattleTurn]
and a
jr z, .battlemonhp
ld hl, EnemyMonHP
ld de, EnemyMonMaxHP
2015-11-06 19:36:06 -08:00
.battlemonhp
ld bc, Buffer4
2013-03-26 17:39:44 -07:00
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
2015-11-06 19:36:06 -08:00
ld a, [hDividend + 1]
2013-03-26 17:39:44 -07:00
ld b, [hl]
add b
ld [hld], a
ld [Buffer5], a
2015-11-06 19:36:06 -08:00
ld a, [hDividend]
2013-03-26 17:39:44 -07:00
ld b, [hl]
adc b
ld [hli], a
ld [Buffer6], a
jr c, .okay2
2013-03-26 17:39:44 -07:00
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, .okay3
2015-11-06 19:36:06 -08:00
.okay2
2013-03-26 17:39:44 -07:00
ld a, [de]
ld [hld], a
ld [Buffer5], a
2013-03-26 17:39:44 -07:00
dec de
ld a, [de]
ld [hli], a
ld [Buffer6], a
2013-03-26 17:39:44 -07:00
inc de
2015-11-06 19:36:06 -08:00
.okay3
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
hlcoord 10, 9
2013-03-26 17:39:44 -07:00
ld a, $1
jr z, .hp_bar
hlcoord 2, 2
2013-03-26 17:39:44 -07:00
xor a
2015-11-06 19:36:06 -08:00
.hp_bar
ld [wWhichHPBar], a
predef AnimateHPBar
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
jp UpdateBattleMonInParty
2013-03-26 17:39:44 -07:00
; 3608c
BattleCommand_BurnTarget: ; 3608c
2013-03-26 22:52:04 -07:00
; burntarget
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
ret nz
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
and a
2013-03-26 22:52:04 -07:00
jp nz, Defrost
2013-03-26 17:39:44 -07:00
ld a, [TypeModifier]
and $7f
ret z
2015-11-09 13:41:09 -08:00
call CheckMoveTypeMatchesTarget ; Don't burn a Fire-type
2013-03-26 17:39:44 -07:00
ret z
call GetOpponentItem
ld a, b
cp HELD_PREVENT_BURN
2013-03-26 17:39:44 -07:00
ret z
2013-06-13 13:10:39 -07:00
ld a, [EffectFailed]
2013-03-26 17:39:44 -07:00
and a
ret nz
2015-11-06 19:36:06 -08:00
call SafeCheckSafeguard
2013-03-26 17:39:44 -07:00
ret nz
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
set BRN, [hl]
2013-05-02 21:22:28 -07:00
call UpdateOpponentInParty
2015-11-06 17:55:16 -08:00
ld hl, ApplyBrnEffectOnAttack
2013-12-31 00:25:38 -08:00
call CallBattleCore
ld de, ANIM_BRN
2015-11-06 17:55:16 -08:00
call PlayOpponentBattleAnim
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
2013-03-27 14:07:00 -07:00
ld hl, WasBurnedText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
callba UseHeldStatusHealingItem
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 360dd
2013-03-26 22:52:04 -07:00
Defrost: ; 360dd
2013-03-26 17:39:44 -07:00
ld a, [hl]
and 1 << FRZ
2013-03-26 17:39:44 -07:00
ret z
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld a, [CurOTMon]
ld hl, OTPartyMon1Status
2013-03-26 22:52:04 -07:00
jr z, .ok
2013-03-26 17:39:44 -07:00
ld hl, PartyMon1Status
ld a, [CurBattleMon]
2013-03-26 22:52:04 -07:00
.ok
2013-03-26 17:39:44 -07:00
call GetPartyLocation
xor a
ld [hl], a
2013-05-02 21:22:28 -07:00
call UpdateOpponentInParty
2013-03-27 14:07:00 -07:00
ld hl, DefrostedOpponentText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 36102
BattleCommand_FreezeTarget: ; 36102
2013-03-26 22:52:04 -07:00
; freezetarget
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
ret nz
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
and a
ret nz
ld a, [TypeModifier]
and $7f
ret z
ld a, [Weather]
cp WEATHER_SUN
2013-03-26 17:39:44 -07:00
ret z
2015-11-09 13:41:09 -08:00
call CheckMoveTypeMatchesTarget ; Don't freeze an Ice-type
2013-03-26 17:39:44 -07:00
ret z
call GetOpponentItem
ld a, b
cp HELD_PREVENT_FREEZE
2013-03-26 17:39:44 -07:00
ret z
2013-06-13 13:10:39 -07:00
ld a, [EffectFailed]
2013-03-26 17:39:44 -07:00
and a
ret nz
2015-11-06 19:36:06 -08:00
call SafeCheckSafeguard
2013-03-26 17:39:44 -07:00
ret nz
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
set FRZ, [hl]
2013-05-02 21:22:28 -07:00
call UpdateOpponentInParty
ld de, ANIM_FRZ
2015-11-06 17:55:16 -08:00
call PlayOpponentBattleAnim
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
2013-03-27 14:07:00 -07:00
ld hl, WasFrozenText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
2015-11-06 19:36:06 -08:00
callba UseHeldStatusHealingItem
2013-03-26 17:39:44 -07:00
ret nz
2015-11-06 19:36:06 -08:00
call OpponentCantMove
2013-03-26 17:39:44 -07:00
call EndRechargeOpp
ld hl, wEnemyJustGotFrozen
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 19:36:06 -08:00
jr z, .finish
ld hl, wPlayerJustGotFrozen
2015-11-06 19:36:06 -08:00
.finish
2013-03-26 17:39:44 -07:00
ld [hl], $1
ret
2013-03-26 17:39:44 -07:00
; 36165
BattleCommand_ParalyzeTarget: ; 36165
2013-03-26 22:52:04 -07:00
; paralyzetarget
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
ret nz
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
and a
ret nz
ld a, [TypeModifier]
and $7f
ret z
call GetOpponentItem
ld a, b
cp HELD_PREVENT_PARALYZE
2013-03-26 17:39:44 -07:00
ret z
2013-06-13 13:10:39 -07:00
ld a, [EffectFailed]
2013-03-26 17:39:44 -07:00
and a
ret nz
2015-11-06 19:36:06 -08:00
call SafeCheckSafeguard
2013-03-26 17:39:44 -07:00
ret nz
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
set PAR, [hl]
2013-05-02 21:22:28 -07:00
call UpdateOpponentInParty
2015-11-06 17:55:16 -08:00
ld hl, ApplyPrzEffectOnSpeed
2013-12-31 00:25:38 -08:00
call CallBattleCore
ld de, ANIM_PAR
2015-11-06 17:55:16 -08:00
call PlayOpponentBattleAnim
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
2013-03-26 17:39:44 -07:00
call PrintParalyze
2015-11-06 19:36:06 -08:00
ld hl, UseHeldStatusHealingItem
2013-12-31 00:25:38 -08:00
jp CallBattleCore
2013-03-26 17:39:44 -07:00
; 361ac
BattleCommand_AttackUp: ; 361ac
2013-03-26 17:39:44 -07:00
; attackup
2015-11-06 17:55:16 -08:00
ld b, ATTACK
jr BattleCommand_StatUp
BattleCommand_DefenseUp: ; 361b0
2013-03-26 17:39:44 -07:00
; defenseup
2015-11-06 17:55:16 -08:00
ld b, DEFENSE
jr BattleCommand_StatUp
BattleCommand_SpeedUp: ; 361b4
2013-03-26 17:39:44 -07:00
; speedup
2015-11-06 17:55:16 -08:00
ld b, SPEED
jr BattleCommand_StatUp
BattleCommand_SpecialAttackUp: ; 361b8
2013-03-26 17:39:44 -07:00
; specialattackup
2015-11-06 17:55:16 -08:00
ld b, SP_ATTACK
jr BattleCommand_StatUp
BattleCommand_SpecialDefenseUp: ; 361bc
2013-03-26 17:39:44 -07:00
; specialdefenseup
2015-11-06 17:55:16 -08:00
ld b, SP_DEFENSE
jr BattleCommand_StatUp
BattleCommand_AccuracyUp: ; 361c0
2013-03-26 17:39:44 -07:00
; accuracyup
2015-11-06 17:55:16 -08:00
ld b, ACCURACY
jr BattleCommand_StatUp
BattleCommand_EvasionUp: ; 361c4
2013-03-26 17:39:44 -07:00
; evasionup
2015-11-06 17:55:16 -08:00
ld b, EVASION
jr BattleCommand_StatUp
BattleCommand_AttackUp2: ; 361c8
2013-03-26 17:39:44 -07:00
; attackup2
2015-11-06 17:55:16 -08:00
ld b, $10 | ATTACK
jr BattleCommand_StatUp
BattleCommand_DefenseUp2: ; 361cc
2013-03-26 17:39:44 -07:00
; defenseup2
2015-11-06 17:55:16 -08:00
ld b, $10 | DEFENSE
jr BattleCommand_StatUp
BattleCommand_SpeedUp2: ; 361d0
2013-03-26 17:39:44 -07:00
; speedup2
2015-11-06 17:55:16 -08:00
ld b, $10 | SPEED
jr BattleCommand_StatUp
BattleCommand_SpecialAttackUp2: ; 361d4
2013-03-26 17:39:44 -07:00
; specialattackup2
2015-11-06 17:55:16 -08:00
ld b, $10 | SP_ATTACK
jr BattleCommand_StatUp
BattleCommand_SpecialDefenseUp2: ; 361d8
2013-03-26 17:39:44 -07:00
; specialdefenseup2
2015-11-06 17:55:16 -08:00
ld b, $10 | SP_DEFENSE
jr BattleCommand_StatUp
BattleCommand_AccuracyUp2: ; 361dc
2013-03-26 17:39:44 -07:00
; accuracyup2
2015-11-06 17:55:16 -08:00
ld b, $10 | ACCURACY
jr BattleCommand_StatUp
BattleCommand_EvasionUp2: ; 361e0
2013-03-26 17:39:44 -07:00
; evasionup2
2015-11-06 17:55:16 -08:00
ld b, $10 | EVASION
jr BattleCommand_StatUp
BattleCommand_StatUp: ; 361e4
2013-03-26 17:39:44 -07:00
; statup
call CheckIfStatCanBeRaised
2013-06-13 13:10:39 -07:00
ld a, [FailedMessage]
2013-03-26 17:39:44 -07:00
and a
ret nz
2015-11-09 13:41:09 -08:00
jp StatUpAnimation
2013-03-26 17:39:44 -07:00
; 361ef
CheckIfStatCanBeRaised: ; 361ef
2013-03-26 17:39:44 -07:00
ld a, b
2013-06-13 13:10:39 -07:00
ld [LoweredStat], a
2013-03-26 17:39:44 -07:00
ld hl, PlayerStatLevels
ld a, [hBattleTurn]
and a
jr z, .got_stat_levels
2013-03-26 17:39:44 -07:00
ld hl, EnemyStatLevels
2015-11-06 17:55:16 -08:00
.got_stat_levels
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
2015-11-06 17:55:16 -08:00
jp nz, .stat_raise_failed
2013-06-13 13:10:39 -07:00
ld a, [EffectFailed]
2013-03-26 17:39:44 -07:00
and a
2015-11-06 17:55:16 -08:00
jp nz, .stat_raise_failed
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f
ld c, a
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld b, [hl]
inc b
ld a, $d
cp b
2015-11-06 17:55:16 -08:00
jp c, .cant_raise_stat
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f0
jr z, .got_num_stages
2013-03-26 17:39:44 -07:00
inc b
ld a, $d
cp b
jr nc, .got_num_stages
2013-03-26 17:39:44 -07:00
ld b, a
2015-11-06 17:55:16 -08:00
.got_num_stages
2013-03-26 17:39:44 -07:00
ld [hl], b
push hl
ld a, c
cp $5
jr nc, .done_calcing_stats
ld hl, BattleMonStats + 1
2013-06-13 13:10:39 -07:00
ld de, PlayerStats
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_stats_pointer
ld hl, EnemyMonStats + 1
2013-06-13 13:10:39 -07:00
ld de, EnemyStats
2015-11-06 17:55:16 -08:00
.got_stats_pointer
2013-03-26 17:39:44 -07:00
push bc
sla c
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld a, c
add e
ld e, a
jr nc, .no_carry
2013-03-26 17:39:44 -07:00
inc d
2015-11-06 17:55:16 -08:00
.no_carry
2013-03-26 17:39:44 -07:00
pop bc
ld a, [hld]
sub 999 % $100
jr nz, .not_already_max
2013-03-26 17:39:44 -07:00
ld a, [hl]
sbc 999 / $100
2015-11-06 17:55:16 -08:00
jp z, .stats_already_max
.not_already_max
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .calc_player_stats
2015-11-06 17:55:16 -08:00
call CalcEnemyStats
jr .done_calcing_stats
2015-11-06 17:55:16 -08:00
.calc_player_stats
call CalcPlayerStats
.done_calcing_stats
2013-03-26 17:39:44 -07:00
pop hl
xor a
2013-06-13 13:10:39 -07:00
ld [FailedMessage], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 3626e
.stats_already_max ; 3626e
2013-03-26 17:39:44 -07:00
pop hl
dec [hl]
; fallthrough
; 36270
.cant_raise_stat ; 36270
2013-03-26 17:39:44 -07:00
ld a, $2
2013-06-13 13:10:39 -07:00
ld [FailedMessage], a
2013-03-26 17:39:44 -07:00
ld a, $1
ld [AttackMissed], a
ret
2013-03-26 17:39:44 -07:00
; 3627b
.stat_raise_failed ; 3627b
2013-03-26 17:39:44 -07:00
ld a, $1
2013-06-13 13:10:39 -07:00
ld [FailedMessage], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 36281
2015-11-09 13:41:09 -08:00
StatUpAnimation: ; 36281
ld bc, wPlayerMinimized
2015-12-23 17:46:23 -08:00
ld hl, DropPlayerSub
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .do_player
ld bc, wEnemyMinimized
2015-12-23 17:46:23 -08:00
ld hl, DropEnemySub
2015-11-06 17:55:16 -08:00
.do_player
2014-01-05 04:28:55 -08:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2014-01-05 04:28:55 -08:00
cp MINIMIZE
2013-03-26 17:39:44 -07:00
ret nz
2015-11-06 17:55:16 -08:00
2013-03-26 17:39:44 -07:00
ld a, $1
ld [bc], a
2015-11-06 19:36:06 -08:00
call _CheckBattleScene
2013-03-26 17:39:44 -07:00
ret nc
2015-11-06 17:55:16 -08:00
2013-03-26 17:39:44 -07:00
xor a
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
call WaitBGMap
jp BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
; 362ad
BattleCommand_AttackDown: ; 362ad
2013-03-26 17:39:44 -07:00
; attackdown
ld a, ATTACK
jr BattleCommand_StatDown
BattleCommand_DefenseDown: ; 362b1
2013-03-26 17:39:44 -07:00
; defensedown
ld a, DEFENSE
jr BattleCommand_StatDown
BattleCommand_SpeedDown: ; 362b5
2013-03-26 17:39:44 -07:00
; speeddown
ld a, SPEED
jr BattleCommand_StatDown
BattleCommand_SpecialAttackDown: ; 362b9
2013-03-26 17:39:44 -07:00
; specialattackdown
ld a, SP_ATTACK
jr BattleCommand_StatDown
BattleCommand_SpecialDefenseDown: ; 362bd
2013-03-26 17:39:44 -07:00
; specialdefensedown
ld a, SP_DEFENSE
jr BattleCommand_StatDown
BattleCommand_AccuracyDown: ; 362c1
2013-03-26 17:39:44 -07:00
; accuracydown
ld a, ACCURACY
jr BattleCommand_StatDown
BattleCommand_EvasionDown: ; 362c5
2013-03-26 17:39:44 -07:00
; evasiondown
ld a, EVASION
jr BattleCommand_StatDown
BattleCommand_AttackDown2: ; 362c9
2013-03-26 17:39:44 -07:00
; attackdown2
ld a, $10 | ATTACK
jr BattleCommand_StatDown
BattleCommand_DefenseDown2: ; 362cd
2013-03-26 17:39:44 -07:00
; defensedown2
ld a, $10 | DEFENSE
jr BattleCommand_StatDown
BattleCommand_SpeedDown2: ; 362d1
2013-03-26 17:39:44 -07:00
; speeddown2
ld a, $10 | SPEED
jr BattleCommand_StatDown
BattleCommand_SpecialAttackDown2: ; 362d5
2013-03-26 17:39:44 -07:00
; specialattackdown2
ld a, $10 | SP_ATTACK
jr BattleCommand_StatDown
BattleCommand_SpecialDefenseDown2: ; 362d9
2013-03-26 17:39:44 -07:00
; specialdefensedown2
ld a, $10 | SP_DEFENSE
jr BattleCommand_StatDown
BattleCommand_AccuracyDown2: ; 362dd
2013-03-26 17:39:44 -07:00
; accuracydown2
ld a, $10 | ACCURACY
jr BattleCommand_StatDown
BattleCommand_EvasionDown2: ; 362e1
2013-03-26 17:39:44 -07:00
; evasiondown2
ld a, $10 | EVASION
2013-03-26 17:39:44 -07:00
BattleCommand_StatDown: ; 362e3
2013-03-26 17:39:44 -07:00
; statdown
2013-06-13 13:10:39 -07:00
ld [LoweredStat], a
2015-11-06 17:55:16 -08:00
call CheckMist
2013-06-13 13:10:39 -07:00
jp nz, .Mist
2013-03-26 17:39:44 -07:00
ld hl, EnemyStatLevels
ld a, [hBattleTurn]
and a
2013-06-13 13:10:39 -07:00
jr z, .GetStatLevel
2013-03-26 17:39:44 -07:00
ld hl, PlayerStatLevels
2013-06-13 13:10:39 -07:00
.GetStatLevel:
2013-06-13 13:10:39 -07:00
; Attempt to lower the stat.
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f
ld c, a
2013-06-13 13:10:39 -07:00
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld b, [hl]
dec b
2013-06-13 13:10:39 -07:00
jp z, .CantLower
; Sharply lower the stat if applicable.
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f0
2013-06-13 13:10:39 -07:00
jr z, .ComputerMiss
2013-03-26 17:39:44 -07:00
dec b
2013-06-13 13:10:39 -07:00
jr nz, .ComputerMiss
2013-03-26 17:39:44 -07:00
inc b
2013-06-13 13:10:39 -07:00
.ComputerMiss:
2013-06-13 13:10:39 -07:00
; Computer opponents have a 1/4 chance of failing.
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2013-06-13 13:10:39 -07:00
jr z, .DidntMiss
2015-09-04 13:30:40 -07:00
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
2013-06-13 13:10:39 -07:00
jr nz, .DidntMiss
2015-09-04 13:30:40 -07:00
ld a, [InBattleTowerBattle]
2013-03-26 17:39:44 -07:00
and a
2013-06-13 13:10:39 -07:00
jr nz, .DidntMiss
; Lock-On still always works.
2013-03-26 17:39:44 -07:00
ld a, [PlayerSubStatus5]
2013-06-13 13:10:39 -07:00
bit SUBSTATUS_LOCK_ON, a
jr nz, .DidntMiss
; Attacking moves that also lower accuracy are unaffected.
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-06-13 13:10:39 -07:00
cp EFFECT_ACCURACY_DOWN_HIT
jr z, .DidntMiss
call BattleRandom
2013-03-26 17:39:44 -07:00
cp $40
2013-06-13 13:10:39 -07:00
jr c, .Failed
.DidntMiss:
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
2013-06-13 13:10:39 -07:00
jr nz, .Failed
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
2013-06-13 13:10:39 -07:00
jr nz, .Failed
ld a, [EffectFailed]
2013-03-26 17:39:44 -07:00
and a
2013-06-13 13:10:39 -07:00
jr nz, .Failed
2013-03-26 17:39:44 -07:00
call CheckHiddenOpponent
2013-06-13 13:10:39 -07:00
jr nz, .Failed
; Accuracy/Evasion reduction don't involve stats.
2013-03-26 17:39:44 -07:00
ld [hl], b
ld a, c
2013-06-13 13:10:39 -07:00
cp ACCURACY
jr nc, .Hit
2013-03-26 17:39:44 -07:00
push hl
ld hl, EnemyMonAttack + 1
2013-06-13 13:10:39 -07:00
ld de, EnemyStats
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, .do_enemy
ld hl, BattleMonAttack + 1
2013-06-13 13:10:39 -07:00
ld de, PlayerStats
2015-11-06 17:55:16 -08:00
.do_enemy
call TryLowerStat
2013-03-26 17:39:44 -07:00
pop hl
2013-06-13 13:10:39 -07:00
jr z, .CouldntLower
.Hit:
2013-03-26 17:39:44 -07:00
xor a
2013-06-13 13:10:39 -07:00
ld [FailedMessage], a
2013-03-26 17:39:44 -07:00
ret
2013-06-13 13:10:39 -07:00
.CouldntLower:
2013-03-26 17:39:44 -07:00
inc [hl]
.CantLower:
2013-06-13 13:10:39 -07:00
ld a, 3
ld [FailedMessage], a
ld a, 1
2013-03-26 17:39:44 -07:00
ld [AttackMissed], a
ret
2013-06-13 13:10:39 -07:00
.Failed:
2013-06-13 13:10:39 -07:00
ld a, 1
ld [FailedMessage], a
2013-03-26 17:39:44 -07:00
ld [AttackMissed], a
ret
.Mist:
2013-06-13 13:10:39 -07:00
ld a, 2
ld [FailedMessage], a
ld a, 1
2013-03-26 17:39:44 -07:00
ld [AttackMissed], a
ret
2013-03-26 17:39:44 -07:00
; 36391
2015-11-06 17:55:16 -08:00
CheckMist: ; 36391
2013-05-02 22:29:57 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-05-02 22:29:57 -07:00
cp EFFECT_ATTACK_DOWN
2015-11-06 17:55:16 -08:00
jr c, .dont_check_mist
2013-05-02 22:29:57 -07:00
cp EFFECT_EVASION_DOWN + 1
2015-11-06 17:55:16 -08:00
jr c, .check_mist
2013-05-02 22:29:57 -07:00
cp EFFECT_ATTACK_DOWN_2
2015-11-06 17:55:16 -08:00
jr c, .dont_check_mist
2013-05-02 22:29:57 -07:00
cp EFFECT_EVASION_DOWN_2 + 1
2015-11-06 17:55:16 -08:00
jr c, .check_mist
2013-05-02 22:29:57 -07:00
cp EFFECT_ATTACK_DOWN_HIT
2015-11-06 17:55:16 -08:00
jr c, .dont_check_mist
2013-05-02 22:29:57 -07:00
cp EFFECT_EVASION_DOWN_HIT + 1
2015-11-06 17:55:16 -08:00
jr c, .check_mist
.dont_check_mist
2013-03-26 17:39:44 -07:00
xor a
ret
2015-11-06 17:55:16 -08:00
.check_mist
2013-05-02 22:29:57 -07:00
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVar
2013-05-02 22:29:57 -07:00
bit SUBSTATUS_MIST, a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 363b8
2015-11-06 17:55:16 -08:00
BattleCommand_StatUpMessage: ; 363b8
2013-06-13 13:10:39 -07:00
ld a, [FailedMessage]
2013-03-26 17:39:44 -07:00
and a
ret nz
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f
ld b, a
inc b
call GetStatName
2013-03-26 17:39:44 -07:00
ld hl, .stat
jp BattleTextBox
.stat
text_jump UnknownText_0x1c0cc6
2013-03-26 17:39:44 -07:00
start_asm
ld hl, .up
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f0
ret z
ld hl, .wayup
ret
.wayup
text_jump UnknownText_0x1c0cd0
2013-03-26 17:39:44 -07:00
db "@"
.up
text_jump UnknownText_0x1c0ce0
2013-03-26 17:39:44 -07:00
db "@"
; 363e9
2015-11-06 17:55:16 -08:00
BattleCommand_StatDownMessage: ; 363e9
2013-06-13 13:10:39 -07:00
ld a, [FailedMessage]
2013-03-26 17:39:44 -07:00
and a
ret nz
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f
ld b, a
inc b
call GetStatName
2013-03-26 17:39:44 -07:00
ld hl, .stat
jp BattleTextBox
.stat
text_jump UnknownText_0x1c0ceb
2013-03-26 17:39:44 -07:00
start_asm
ld hl, .fell
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f0
ret z
ld hl, .sharplyfell
ret
.sharplyfell
text_jump UnknownText_0x1c0cf5
2013-03-26 17:39:44 -07:00
db "@"
.fell
text_jump UnknownText_0x1c0d06
2013-03-26 17:39:44 -07:00
db "@"
; 3641a
2015-11-06 17:55:16 -08:00
TryLowerStat: ; 3641a
2013-06-13 13:10:39 -07:00
; Lower stat c from stat struct hl (buffer de).
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
push bc
sla c
2013-03-26 22:52:04 -07:00
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
2013-06-13 13:10:39 -07:00
; add de, c
2013-03-26 17:39:44 -07:00
ld a, c
add e
ld e, a
2015-11-06 17:55:16 -08:00
jr nc, .no_carry
2013-03-26 17:39:44 -07:00
inc d
2015-11-06 17:55:16 -08:00
.no_carry
2013-03-26 17:39:44 -07:00
pop bc
2013-06-13 13:10:39 -07:00
; The lowest possible stat is 1.
2013-03-26 17:39:44 -07:00
ld a, [hld]
2013-03-26 22:52:04 -07:00
sub 1
2015-11-06 17:55:16 -08:00
jr nz, .not_min
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
ret z
2013-03-26 22:52:04 -07:00
2015-11-06 17:55:16 -08:00
.not_min
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2013-06-13 13:10:39 -07:00
jr z, .Player
2013-03-26 22:52:04 -07:00
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2015-11-06 17:55:16 -08:00
call CalcPlayerStats
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-06-13 13:10:39 -07:00
jr .end
2013-03-26 22:52:04 -07:00
.Player:
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2015-11-06 17:55:16 -08:00
call CalcEnemyStats
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-06-13 13:10:39 -07:00
.end
ld a, 1
2013-03-26 17:39:44 -07:00
and a
ret
2013-03-26 17:39:44 -07:00
; 3644c
BattleCommand_StatUpFailText: ; 3644c
2013-03-26 22:52:04 -07:00
; statupfailtext
2013-06-13 13:10:39 -07:00
ld a, [FailedMessage]
2013-03-26 17:39:44 -07:00
and a
ret z
push af
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
pop af
dec a
jp z, TryPrintButItFailed
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f
ld b, a
inc b
call GetStatName
2013-03-27 14:07:00 -07:00
ld hl, WontRiseAnymoreText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 3646a
BattleCommand_StatDownFailText: ; 3646a
2013-03-26 22:52:04 -07:00
; statdownfailtext
2013-06-13 13:10:39 -07:00
ld a, [FailedMessage]
2013-03-26 17:39:44 -07:00
and a
ret z
push af
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
pop af
dec a
jp z, TryPrintButItFailed
2013-03-26 17:39:44 -07:00
dec a
2013-03-26 22:52:04 -07:00
ld hl, ProtectedByMistText
jp z, StdBattleTextBox
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f
ld b, a
inc b
call GetStatName
2013-03-27 14:07:00 -07:00
ld hl, WontDropAnymoreText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 3648f
GetStatName: ; 3648f
ld hl, .names
ld c, "@"
.CheckName:
2013-03-26 17:39:44 -07:00
dec b
jr z, .Copy
.GetName:
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp c
jr z, .CheckName
jr .GetName
.Copy:
2013-03-26 17:39:44 -07:00
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
2015-11-06 17:55:16 -08:00
StatLevelMultipliers: ; 364e6
db 25, 100 ; 0.25x
db 28, 100 ; 0.28x
db 33, 100 ; 0.33x
db 40, 100 ; 0.40x
db 50, 100 ; 0.50x
db 66, 100 ; 0.66x
db 1, 1 ; 1.00x
db 15, 10 ; 1.50x
db 2, 1 ; 2.00x
db 25, 10 ; 2.50x
db 3, 1 ; 3.00x
db 35, 10 ; 3.50x
db 4, 1 ; 4.00x
2013-03-26 17:39:44 -07:00
; 36500
BattleCommand_AllStatsUp: ; 36500
; allstatsup
; Attack
2013-03-26 17:39:44 -07:00
call ResetMiss
call BattleCommand_AttackUp
2015-11-06 17:55:16 -08:00
call BattleCommand_StatUpMessage
2013-03-26 17:39:44 -07:00
; Defense
2013-03-26 17:39:44 -07:00
call ResetMiss
call BattleCommand_DefenseUp
2015-11-06 17:55:16 -08:00
call BattleCommand_StatUpMessage
2013-03-26 17:39:44 -07:00
; Speed
2013-03-26 17:39:44 -07:00
call ResetMiss
call BattleCommand_SpeedUp
2015-11-06 17:55:16 -08:00
call BattleCommand_StatUpMessage
2013-03-26 17:39:44 -07:00
; Special Attack
2013-03-26 17:39:44 -07:00
call ResetMiss
call BattleCommand_SpecialAttackUp
2015-11-06 17:55:16 -08:00
call BattleCommand_StatUpMessage
2013-03-26 17:39:44 -07:00
; Special Defense
2013-03-26 17:39:44 -07:00
call ResetMiss
call BattleCommand_SpecialDefenseUp
2015-11-06 17:55:16 -08:00
jp BattleCommand_StatUpMessage
2013-03-26 17:39:44 -07:00
; 3652d
ResetMiss: ; 3652d
xor a
ld [AttackMissed], a
ret
2013-03-26 17:39:44 -07:00
; 36532
2015-11-06 17:55:16 -08:00
LowerStat: ; 36532
2013-06-13 13:10:39 -07:00
ld [LoweredStat], a
2013-03-26 17:39:44 -07:00
ld hl, PlayerStatLevels
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, .got_target
2013-03-26 17:39:44 -07:00
ld hl, EnemyStatLevels
2015-11-06 17:55:16 -08:00
.got_target
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f
ld c, a
ld b, 0
add hl, bc
ld b, [hl]
dec b
2015-11-06 17:55:16 -08:00
jr z, .cant_lower_anymore
2013-03-26 17:39:44 -07:00
2013-06-13 13:10:39 -07:00
ld a, [LoweredStat]
2013-03-26 17:39:44 -07:00
and $f0
2015-11-06 17:55:16 -08:00
jr z, .got_num_stages
2013-03-26 17:39:44 -07:00
dec b
2015-11-06 17:55:16 -08:00
jr nz, .got_num_stages
2013-03-26 17:39:44 -07:00
inc b
2015-11-06 17:55:16 -08:00
.got_num_stages
2013-03-26 17:39:44 -07:00
ld [hl], b
ld a, c
cp 5
2015-11-06 17:55:16 -08:00
jr nc, .accuracy_evasion
2013-03-26 17:39:44 -07:00
push hl
ld hl, BattleMonStats + 1
2013-06-13 13:10:39 -07:00
ld de, PlayerStats
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, .got_target_2
ld hl, EnemyMonStats + 1
2013-06-13 13:10:39 -07:00
ld de, EnemyStats
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.got_target_2
call TryLowerStat
2013-03-26 17:39:44 -07:00
pop hl
2015-11-06 17:55:16 -08:00
jr z, .failed
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.accuracy_evasion
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, .player
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
call CalcEnemyStats
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
jr .finish
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.player
call CalcPlayerStats
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.finish
2013-03-26 17:39:44 -07:00
xor a
2013-06-13 13:10:39 -07:00
ld [FailedMessage], a
2013-03-26 17:39:44 -07:00
ret
2015-11-06 17:55:16 -08:00
.failed
2013-03-26 17:39:44 -07:00
inc [hl]
2015-11-06 17:55:16 -08:00
.cant_lower_anymore
2013-03-26 17:39:44 -07:00
ld a, 2
2013-06-13 13:10:39 -07:00
ld [FailedMessage], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 3658f
BattleCommand_TriStatusChance: ; 3658f
2013-03-26 22:52:04 -07:00
; tristatuschance
call BattleCommand_EffectChance
2013-03-26 17:39:44 -07:00
2013-03-26 22:52:04 -07:00
; 1/3 chance of each status
2013-03-26 17:39:44 -07:00
.loop
call BattleRandom
2013-03-26 17:39:44 -07:00
swap a
2013-03-26 22:52:04 -07:00
and 3
2013-03-26 17:39:44 -07:00
jr z, .loop
; jump
dec a
ld hl, .ptrs
2013-07-04 12:42:01 -07:00
rst JumpTable
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
.ptrs
dw BattleCommand_ParalyzeTarget ; paralyze
dw BattleCommand_FreezeTarget ; freeze
dw BattleCommand_BurnTarget ; burn
2013-03-26 17:39:44 -07:00
; 365a7
BattleCommand_Curl: ; 365a7
2013-03-26 22:52:04 -07:00
; curl
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS2
call GetBattleVarAddr
set SUBSTATUS_CURLED, [hl]
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 365af
2015-11-06 19:36:06 -08:00
BattleCommand_RaiseSubNoAnim: ; 365af
ld hl, GetMonBackpic
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .PlayerTurn
2015-11-06 13:42:38 -08:00
ld hl, GetMonFrontpic
.PlayerTurn:
2013-03-26 17:39:44 -07:00
xor a
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-12-01 11:19:57 -08:00
jp WaitBGMap
2013-03-26 17:39:44 -07:00
; 365c3
2015-11-06 19:36:06 -08:00
BattleCommand_LowerSubNoAnim: ; 365c3
2015-12-23 17:46:23 -08:00
ld hl, DropPlayerSub
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .PlayerTurn
2015-12-23 17:46:23 -08:00
ld hl, DropEnemySub
.PlayerTurn:
2013-03-26 17:39:44 -07:00
xor a
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-12-01 11:19:57 -08:00
jp WaitBGMap
2013-03-26 17:39:44 -07:00
; 365d7
2015-11-06 17:55:16 -08:00
CalcPlayerStats: ; 365d7
2013-03-26 17:39:44 -07:00
ld hl, PlayerAtkLevel
2013-06-13 13:10:39 -07:00
ld de, PlayerStats
ld bc, BattleMonAttack
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
ld a, 5
call CalcStats
2013-03-26 17:39:44 -07:00
2013-07-29 10:58:20 -07:00
ld hl, BadgeStatBoosts
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
ld hl, ApplyPrzEffectOnSpeed
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
ld hl, ApplyBrnEffectOnAttack
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
2015-10-10 04:45:39 -07:00
jp BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
; 365fd
2015-11-06 17:55:16 -08:00
CalcEnemyStats: ; 365fd
2013-03-26 17:39:44 -07:00
ld hl, EnemyAtkLevel
2013-06-13 13:10:39 -07:00
ld de, EnemyStats
ld bc, EnemyMonAttack
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
ld a, 5
call CalcStats
2013-03-26 17:39:44 -07:00
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
ld hl, ApplyPrzEffectOnSpeed
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
ld hl, ApplyBrnEffectOnAttack
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
2015-10-10 04:45:39 -07:00
jp BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
; 3661d
2015-11-06 17:55:16 -08:00
CalcStats: ; 3661d
.loop
2013-03-26 17:39:44 -07:00
push af
ld a, [hli]
push hl
push bc
2013-12-01 11:19:57 -08:00
2013-03-26 17:39:44 -07:00
ld c, a
dec c
ld b, 0
2015-11-06 17:55:16 -08:00
ld hl, StatLevelMultipliers
2013-03-26 17:39:44 -07:00
add hl, bc
2015-12-26 18:59:03 -08:00
add hl, bc
2013-12-01 11:19:57 -08:00
2013-03-26 17:39:44 -07:00
xor a
ld [hMultiplicand + 0], a
2013-03-26 17:39:44 -07:00
ld a, [de]
2013-12-01 11:19:57 -08:00
ld [hMultiplicand + 1], a
2013-03-26 17:39:44 -07:00
inc de
ld a, [de]
2013-12-01 11:19:57 -08:00
ld [hMultiplicand + 2], a
2013-03-26 17:39:44 -07:00
inc de
2013-12-01 11:19:57 -08:00
2013-03-26 17:39:44 -07:00
ld a, [hli]
2013-12-01 11:19:57 -08:00
ld [hMultiplier], a
2013-03-26 17:39:44 -07:00
call Multiply
ld a, [hl]
2013-12-01 11:19:57 -08:00
ld [hDivisor], a
ld b, 4
2013-03-26 17:39:44 -07:00
call Divide
2013-12-01 11:19:57 -08:00
ld a, [hQuotient + 1]
2013-03-26 17:39:44 -07:00
ld b, a
2013-12-01 11:19:57 -08:00
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
or b
2015-11-06 17:55:16 -08:00
jr nz, .check_maxed_out
2013-03-26 17:39:44 -07:00
2013-12-01 11:19:57 -08:00
ld a, 1
ld [hQuotient + 2], a
2015-11-06 17:55:16 -08:00
jr .not_maxed_out
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.check_maxed_out
2013-12-01 11:19:57 -08:00
ld a, [hQuotient + 2]
cp 999 % $100
2013-03-26 17:39:44 -07:00
ld a, b
2013-12-01 11:19:57 -08:00
sbc 999 / $100
2015-11-06 17:55:16 -08:00
jr c, .not_maxed_out
2013-03-26 17:39:44 -07:00
2013-12-01 11:19:57 -08:00
ld a, 999 % $100
ld [hQuotient + 2], a
2013-12-01 11:19:57 -08:00
ld a, 999 / $100
ld [hQuotient + 1], a
2013-12-01 11:19:57 -08:00
2015-11-06 17:55:16 -08:00
.not_maxed_out
2013-03-26 17:39:44 -07:00
pop bc
ld a, [hQuotient + 1]
2013-03-26 17:39:44 -07:00
ld [bc], a
inc bc
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
ld [bc], a
inc bc
pop hl
pop af
dec a
2015-11-06 17:55:16 -08:00
jr nz, .loop
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 36671
BattleCommand_StoreEnergy: ; 36671
2013-03-26 22:52:04 -07:00
; storeenergy
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVar
bit SUBSTATUS_BIDE, a
2013-03-26 17:39:44 -07:00
ret z
ld hl, PlayerRolloutCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, .check_still_storing_energy
ld hl, EnemyRolloutCount
2015-11-06 17:55:16 -08:00
.check_still_storing_energy
2013-03-26 17:39:44 -07:00
dec [hl]
2015-11-06 17:55:16 -08:00
jr nz, .still_storing
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
res SUBSTATUS_BIDE, [hl]
2013-03-27 14:07:00 -07:00
ld hl, UnleashedEnergyText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_POWER
call GetBattleVarAddr
2013-05-02 22:29:57 -07:00
ld a, 1
2013-03-26 17:39:44 -07:00
ld [hl], a
2013-05-02 22:29:57 -07:00
ld hl, PlayerDamageTaken + 1
2015-11-07 18:04:54 -08:00
ld de, wPlayerCharging ; player
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, .player
2013-05-02 22:29:57 -07:00
ld hl, EnemyDamageTaken + 1
2015-11-07 18:04:54 -08:00
ld de, wEnemyCharging ; enemy
2015-11-06 17:55:16 -08:00
.player
2013-03-26 17:39:44 -07:00
ld a, [hld]
add a
ld b, a
ld [CurDamage + 1], a
ld a, [hl]
rl a
ld [CurDamage], a
2015-11-06 17:55:16 -08:00
jr nc, .not_maxed
2013-03-26 17:39:44 -07:00
ld a, $ff
ld [CurDamage], a
ld [CurDamage + 1], a
2015-11-06 17:55:16 -08:00
.not_maxed
2013-03-26 17:39:44 -07:00
or b
2015-11-06 17:55:16 -08:00
jr nz, .built_up_something
2013-05-02 22:29:57 -07:00
ld a, 1
2013-03-26 17:39:44 -07:00
ld [AttackMissed], a
2015-11-06 17:55:16 -08:00
.built_up_something
2013-03-26 17:39:44 -07:00
xor a
ld [hli], a
ld [hl], a
ld [de], a
2013-05-02 22:29:57 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVarAddr
2013-05-02 22:29:57 -07:00
ld a, BIDE
2013-03-26 17:39:44 -07:00
ld [hl], a
2013-03-26 22:52:04 -07:00
ld b, unleashenergy_command
2013-03-26 22:52:04 -07:00
jp SkipToBattleCommand
2015-11-06 17:55:16 -08:00
.still_storing
2013-03-27 14:07:00 -07:00
ld hl, StoringEnergyText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 366e5
BattleCommand_UnleashEnergy: ; 366e5
2013-03-26 22:52:04 -07:00
; unleashenergy
ld de, PlayerDamageTaken
ld bc, PlayerRolloutCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_damage
ld de, EnemyDamageTaken
ld bc, EnemyRolloutCount
.got_damage
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
set SUBSTATUS_BIDE, [hl]
2013-03-26 17:39:44 -07:00
xor a
ld [de], a
inc de
ld [de], a
ld [wPlayerMoveStructEffect], a
ld [wEnemyMoveStructEffect], a
call BattleRandom
and 1
2013-03-26 17:39:44 -07:00
inc a
2015-12-26 18:59:03 -08:00
inc a
2013-03-26 17:39:44 -07:00
ld [bc], a
ld a, 1
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 3671a
BattleCommand_CheckRampage: ; 3671a
2013-03-26 22:52:04 -07:00
; checkrampage
ld de, PlayerRolloutCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .player
ld de, EnemyRolloutCount
2015-11-06 17:55:16 -08:00
.player
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
2015-11-06 17:55:16 -08:00
bit SUBSTATUS_RAMPAGE, [hl]
2013-03-26 17:39:44 -07:00
ret z
ld a, [de]
dec a
ld [de], a
jr nz, .continue_rampage
2015-11-06 17:55:16 -08:00
res SUBSTATUS_RAMPAGE, [hl]
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2015-11-06 19:36:06 -08:00
call SafeCheckSafeguard
2013-03-26 17:39:44 -07:00
push af
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
pop af
jr nz, .continue_rampage
2015-11-06 17:55:16 -08:00
set SUBSTATUS_CONFUSED, [hl]
call BattleRandom
2015-11-06 17:55:16 -08:00
and %00000001
2013-03-26 17:39:44 -07:00
inc a
2015-12-26 18:59:03 -08:00
inc a
2015-11-06 17:55:16 -08:00
inc de ; ConfuseCount
2013-03-26 17:39:44 -07:00
ld [de], a
2015-11-06 17:55:16 -08:00
.continue_rampage
ld b, rampage_command
2013-03-26 22:52:04 -07:00
jp SkipToBattleCommand
2013-03-26 17:39:44 -07:00
; 36751
BattleCommand_Rampage: ; 36751
2013-03-26 22:52:04 -07:00
; rampage
; No rampage during Sleep Talk.
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVar
and SLP
2013-03-26 17:39:44 -07:00
ret nz
2013-03-26 22:52:04 -07:00
ld de, PlayerRolloutCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .ok
ld de, EnemyRolloutCount
.ok
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
set SUBSTATUS_RAMPAGE, [hl]
2015-11-06 17:55:16 -08:00
; Rampage for 1 or 2 more turns
call BattleRandom
2015-11-06 17:55:16 -08:00
and %00000001
2013-03-26 17:39:44 -07:00
inc a
ld [de], a
ld a, 1
2016-01-09 13:28:22 -08:00
ld [wSomeoneIsRampaging], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 36778
BattleCommand_Teleport: ; 36778
2013-03-26 22:52:04 -07:00
; teleport
2013-03-26 17:39:44 -07:00
ld a, [BattleType]
2013-05-02 23:43:44 -07:00
cp BATTLETYPE_SHINY
jr z, .failed
cp BATTLETYPE_TRAP
jr z, .failed
cp BATTLETYPE_CELEBI
jr z, .failed
2013-05-02 23:43:44 -07:00
cp BATTLETYPE_SUICUNE
jr z, .failed
2013-05-02 23:43:44 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5_OPP
call GetBattleVar
2013-05-02 23:43:44 -07:00
bit SUBSTATUS_CANT_RUN, a
jr nz, .failed
2015-11-06 17:55:16 -08:00
; Only need to check these next things if it's your turn
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr nz, .enemy_turn
; Can't teleport from a trainer battle
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
jr nz, .failed
2015-11-06 17:55:16 -08:00
; If your level is greater than the opponent's, you run without fail.
ld a, [CurPartyLevel]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [BattleMonLevel]
cp b
2015-11-06 17:55:16 -08:00
jr nc, .run_away
; Generate a number between 0 and (YourLevel + TheirLevel).
2013-03-26 17:39:44 -07:00
add b
ld c, a
inc c
2015-11-06 17:55:16 -08:00
.loop_player
call BattleRandom
2013-03-26 17:39:44 -07:00
cp c
jr nc, .loop_player
2015-11-06 17:55:16 -08:00
; If that number is greater than 4 times your level, run away.
2013-03-26 17:39:44 -07:00
srl b
srl b
cp b
jr nc, .run_away
2013-03-26 17:39:44 -07:00
.failed
call AnimateFailedMove
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.enemy_turn
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
jr nz, .failed
2013-03-26 17:39:44 -07:00
ld a, [BattleMonLevel]
ld b, a
ld a, [CurPartyLevel]
2013-03-26 17:39:44 -07:00
cp b
jr nc, .run_away
2013-03-26 17:39:44 -07:00
add b
ld c, a
inc c
2015-11-06 17:55:16 -08:00
.loop_enemy
call BattleRandom
2013-03-26 17:39:44 -07:00
cp c
jr nc, .loop_enemy
2013-03-26 17:39:44 -07:00
srl b
srl b
cp b
jr nc, .run_away
2015-11-06 17:55:16 -08:00
.run_away
2013-05-02 21:22:28 -07:00
call UpdateBattleMonInParty
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
inc a
2015-11-08 16:09:36 -08:00
ld [wForcedSwitch], a
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
call SetBattleDraw
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2015-11-09 13:41:09 -08:00
call LoadMoveAnim
2013-05-02 23:43:44 -07:00
ld c, 20
2013-03-26 17:39:44 -07:00
call DelayFrames
2015-11-06 17:55:16 -08:00
call SetBattleDraw
2013-03-27 14:07:00 -07:00
ld hl, FledFromBattleText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 36804
2015-11-06 17:55:16 -08:00
SetBattleDraw: ; 36804
2015-10-24 07:34:19 -07:00
ld a, [wBattleResult]
2013-03-26 17:39:44 -07:00
and $c0
or $2
2015-10-24 07:34:19 -07:00
ld [wBattleResult], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 3680f
BattleCommand_ForceSwitch: ; 3680f
2013-03-26 22:52:04 -07:00
; forceswitch
2013-03-26 17:39:44 -07:00
ld a, [BattleType]
2013-05-02 23:43:44 -07:00
cp BATTLETYPE_SHINY
2015-11-07 06:48:32 -08:00
jp z, .fail
2015-09-09 16:27:07 -07:00
cp BATTLETYPE_TRAP
2015-11-07 06:48:32 -08:00
jp z, .fail
cp BATTLETYPE_CELEBI
2015-11-07 06:48:32 -08:00
jp z, .fail
2013-05-02 23:43:44 -07:00
cp BATTLETYPE_SUICUNE
2015-11-07 06:48:32 -08:00
jp z, .fail
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-07 06:48:32 -08:00
jp nz, .force_player_switch
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jr nz, .missed
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
jr nz, .trainer
ld a, [CurPartyLevel]
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [BattleMonLevel]
cp b
jr nc, .wild_force_flee
2013-03-26 17:39:44 -07:00
add b
ld c, a
inc c
2015-11-07 06:48:32 -08:00
.random_loop_wild
call BattleRandom
2013-03-26 17:39:44 -07:00
cp c
jr nc, .random_loop_wild
2013-03-26 17:39:44 -07:00
srl b
srl b
cp b
jr nc, .wild_force_flee
2015-11-07 06:48:32 -08:00
.missed
jp .fail
.wild_force_flee
2013-05-02 21:22:28 -07:00
call UpdateBattleMonInParty
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
inc a
2015-11-08 16:09:36 -08:00
ld [wForcedSwitch], a
2015-11-06 17:55:16 -08:00
call SetBattleDraw
ld a, [wPlayerMoveStructAnimation]
2015-11-07 06:48:32 -08:00
jp .succeed
.trainer
2015-11-08 16:09:36 -08:00
call FindAliveEnemyMons
jr c, .switch_fail
2015-11-08 16:09:36 -08:00
ld a, [wEnemyGoesFirst]
2013-03-26 17:39:44 -07:00
and a
jr z, .switch_fail
2013-05-02 21:22:28 -07:00
call UpdateEnemyMonInParty
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld c, $14
call DelayFrames
hlcoord 1, 0
lb bc, 4, 10
2013-03-26 17:39:44 -07:00
call ClearBox
2015-11-07 06:48:32 -08:00
ld c, 20
2013-03-26 17:39:44 -07:00
call DelayFrames
ld a, [OTPartyCount]
ld b, a
ld a, [CurOTMon]
ld c, a
2015-11-07 06:48:32 -08:00
; select a random enemy mon to switch to
.random_loop_trainer
call BattleRandom
2013-03-26 17:39:44 -07:00
and $7
cp b
jr nc, .random_loop_trainer
2013-03-26 17:39:44 -07:00
cp c
jr z, .random_loop_trainer
2013-03-26 17:39:44 -07:00
push af
push bc
ld hl, OTPartyMon1HP
2013-03-26 17:39:44 -07:00
call GetPartyLocation
ld a, [hli]
or [hl]
pop bc
pop de
jr z, .random_loop_trainer
2013-03-26 17:39:44 -07:00
ld a, d
inc a
2015-11-08 16:09:36 -08:00
ld [wEnemySwitchMonIndex], a
2015-11-10 16:51:13 -08:00
callab ForceEnemySwitch
2013-03-27 14:07:00 -07:00
ld hl, DraggedOutText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
ld hl, SpikesDamage
2013-12-31 00:25:38 -08:00
jp CallBattleCore
2013-03-27 14:07:00 -07:00
2015-11-07 06:48:32 -08:00
.switch_fail
jp .fail
2013-03-26 17:39:44 -07:00
2015-11-07 06:48:32 -08:00
.force_player_switch
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
2015-11-07 06:48:32 -08:00
jr nz, .player_miss
2013-03-26 17:39:44 -07:00
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
2015-11-07 06:48:32 -08:00
jr nz, .vs_trainer
2013-03-26 17:39:44 -07:00
ld a, [BattleMonLevel]
ld b, a
ld a, [CurPartyLevel]
2013-03-26 17:39:44 -07:00
cp b
2015-11-07 06:48:32 -08:00
jr nc, .wild_succeed_playeristarget
2013-03-26 17:39:44 -07:00
add b
ld c, a
inc c
2015-11-07 06:48:32 -08:00
.wild_random_loop_playeristarget
call BattleRandom
2013-03-26 17:39:44 -07:00
cp c
2015-11-07 06:48:32 -08:00
jr nc, .wild_random_loop_playeristarget
2013-03-26 17:39:44 -07:00
srl b
srl b
cp b
2015-11-07 06:48:32 -08:00
jr nc, .wild_succeed_playeristarget
2013-03-26 17:39:44 -07:00
2015-11-07 06:48:32 -08:00
.player_miss
jr .fail
2013-03-26 17:39:44 -07:00
2015-11-07 06:48:32 -08:00
.wild_succeed_playeristarget
2013-05-02 21:22:28 -07:00
call UpdateBattleMonInParty
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
inc a
2015-11-08 16:09:36 -08:00
ld [wForcedSwitch], a
2015-11-06 17:55:16 -08:00
call SetBattleDraw
ld a, [wEnemyMoveStructAnimation]
2015-11-07 06:48:32 -08:00
jr .succeed
2013-03-26 17:39:44 -07:00
2015-11-07 06:48:32 -08:00
.vs_trainer
call CheckPlayerHasMonToSwitchTo
jr c, .fail
2013-03-26 17:39:44 -07:00
2015-11-08 16:09:36 -08:00
ld a, [wEnemyGoesFirst]
2013-03-26 17:39:44 -07:00
cp $1
2015-11-07 06:48:32 -08:00
jr z, .switch_fail
2013-03-26 17:39:44 -07:00
2013-05-02 21:22:28 -07:00
call UpdateBattleMonInParty
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
call AnimateCurrentMove
2015-11-07 06:48:32 -08:00
ld c, 20
2013-03-26 17:39:44 -07:00
call DelayFrames
hlcoord 9, 7
lb bc, 5, 11
2013-12-31 01:09:00 -08:00
call ClearBox
2015-11-07 06:48:32 -08:00
ld c, 20
2013-03-26 17:39:44 -07:00
call DelayFrames
ld a, [PartyCount]
ld b, a
ld a, [CurBattleMon]
ld c, a
2015-11-07 06:48:32 -08:00
.random_loop_trainer_playeristarget
call BattleRandom
2013-03-26 17:39:44 -07:00
and $7
cp b
2015-11-07 06:48:32 -08:00
jr nc, .random_loop_trainer_playeristarget
2013-03-26 17:39:44 -07:00
cp c
2015-11-07 06:48:32 -08:00
jr z, .random_loop_trainer_playeristarget
2013-03-26 17:39:44 -07:00
push af
push bc
ld hl, PartyMon1HP
2013-03-26 17:39:44 -07:00
call GetPartyLocation
ld a, [hli]
or [hl]
pop bc
pop de
2015-11-07 06:48:32 -08:00
jr z, .random_loop_trainer_playeristarget
2013-03-26 17:39:44 -07:00
ld a, d
ld [CurPartyMon], a
2015-11-07 06:48:32 -08:00
ld hl, SwitchPlayerMon
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-27 14:07:00 -07:00
ld hl, DraggedOutText
call StdBattleTextBox
2013-03-27 14:07:00 -07:00
ld hl, SpikesDamage
2013-12-31 00:25:38 -08:00
jp CallBattleCore
2013-03-27 14:07:00 -07:00
2015-11-07 06:48:32 -08:00
.fail
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
call BattleCommand_MoveDelay
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
jp PrintButItFailed
2013-03-27 14:07:00 -07:00
2015-11-07 06:48:32 -08:00
.succeed
2013-03-26 17:39:44 -07:00
push af
2015-11-06 17:55:16 -08:00
call SetBattleDraw
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
call AnimateCurrentMove
2015-11-07 06:48:32 -08:00
ld c, 20
2013-03-26 17:39:44 -07:00
call DelayFrames
pop af
2013-03-27 14:07:00 -07:00
ld hl, FledInFearText
2015-11-07 06:48:32 -08:00
cp ROAR
jr z, .do_text
2013-03-27 14:07:00 -07:00
ld hl, BlownAwayText
2015-11-07 06:48:32 -08:00
.do_text
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 36994
2015-11-07 06:48:32 -08:00
CheckPlayerHasMonToSwitchTo: ; 36994
2013-03-26 17:39:44 -07:00
ld a, [PartyCount]
ld d, a
ld e, 0
ld bc, PARTYMON_STRUCT_LENGTH
2015-11-07 06:48:32 -08:00
.loop
2013-03-26 17:39:44 -07:00
ld a, [CurBattleMon]
cp e
2015-11-07 06:48:32 -08:00
jr z, .next
2013-03-26 17:39:44 -07:00
ld a, e
ld hl, PartyMon1HP
2013-03-26 17:39:44 -07:00
call AddNTimes
ld a, [hli]
or [hl]
2015-11-07 06:48:32 -08:00
jr nz, .not_fainted
2013-03-26 17:39:44 -07:00
2015-11-07 06:48:32 -08:00
.next
2013-03-26 17:39:44 -07:00
inc e
dec d
2015-11-07 06:48:32 -08:00
jr nz, .loop
2013-03-26 17:39:44 -07:00
scf
ret
2015-11-07 06:48:32 -08:00
.not_fainted
2013-03-26 17:39:44 -07:00
and a
ret
2013-03-26 17:39:44 -07:00
; 369b6
BattleCommand_EndLoop: ; 369b6
2013-03-26 22:52:04 -07:00
; endloop
; Loop back to the command before 'critical'.
ld de, PlayerRolloutCount
ld bc, PlayerDamageTaken
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_addrs
ld de, EnemyRolloutCount
ld bc, EnemyDamageTaken
.got_addrs
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
bit SUBSTATUS_IN_LOOP, [hl]
jp nz, .in_loop
set SUBSTATUS_IN_LOOP, [hl]
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld a, [hl]
2013-04-27 14:12:23 -07:00
cp EFFECT_TWINEEDLE
jr z, .twineedle
2013-04-27 14:12:23 -07:00
cp EFFECT_DOUBLE_HIT
ld a, 1
jr z, .double_hit
2013-03-26 17:39:44 -07:00
ld a, [hl]
2013-04-27 14:12:23 -07:00
cp EFFECT_BEAT_UP
jr z, .beat_up
2013-04-27 14:12:23 -07:00
cp EFFECT_TRIPLE_KICK
jr nz, .not_triple_kick
.reject_triple_kick_sample
call BattleRandom
2013-03-26 17:39:44 -07:00
and $3
jr z, .reject_triple_kick_sample
2013-03-26 17:39:44 -07:00
dec a
jr nz, .double_hit
ld a, 1
2013-03-26 17:39:44 -07:00
ld [bc], a
jr .done_loop
.beat_up
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr nz, .check_ot_beat_up
2013-03-26 17:39:44 -07:00
ld a, [PartyCount]
cp 1
jp z, .only_one_beatup
2013-03-26 17:39:44 -07:00
dec a
jr .double_hit
.check_ot_beat_up
ld a, [wBattleMode]
cp WILD_BATTLE
jp z, .only_one_beatup
2013-03-26 17:39:44 -07:00
ld a, [OTPartyCount]
cp 1
jp z, .only_one_beatup
2013-03-26 17:39:44 -07:00
dec a
jr .double_hit
.only_one_beatup
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
res SUBSTATUS_IN_LOOP, [hl]
call BattleCommanda8
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
.not_triple_kick
call BattleRandom
2013-03-26 17:39:44 -07:00
and $3
cp 2
jr c, .got_number_hits
call BattleRandom
2013-03-26 17:39:44 -07:00
and $3
.got_number_hits
2013-03-26 17:39:44 -07:00
inc a
.double_hit
2013-03-26 17:39:44 -07:00
ld [de], a
inc a
ld [bc], a
jr .loop_back_to_critical
.twineedle
ld a, 1
jr .double_hit
2013-05-02 23:43:44 -07:00
.in_loop
2013-03-26 17:39:44 -07:00
ld a, [de]
dec a
ld [de], a
jr nz, .loop_back_to_critical
.done_loop
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
res SUBSTATUS_IN_LOOP, [hl]
2013-03-27 14:07:00 -07:00
ld hl, PlayerHitTimesText
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_hit_n_times_text
2013-03-27 14:07:00 -07:00
ld hl, EnemyHitTimesText
.got_hit_n_times_text
2013-03-27 14:07:00 -07:00
2013-03-26 17:39:44 -07:00
push bc
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-27 14:12:23 -07:00
cp EFFECT_BEAT_UP
jr z, .beat_up_2
call StdBattleTextBox
.beat_up_2
2013-03-27 14:07:00 -07:00
2013-03-26 17:39:44 -07:00
pop bc
xor a
ld [bc], a
ret
2013-03-26 22:52:04 -07:00
; Loop back to the command before 'critical'.
.loop_back_to_critical
2013-03-26 17:39:44 -07:00
ld a, [BattleScriptBufferLoc + 1]
ld h, a
ld a, [BattleScriptBufferLoc]
ld l, a
.not_critical
2013-03-26 17:39:44 -07:00
ld a, [hld]
cp critical_command
jr nz, .not_critical
2013-03-26 17:39:44 -07:00
inc hl
ld a, h
ld [BattleScriptBufferLoc + 1], a
ld a, l
ld [BattleScriptBufferLoc], a
ret
2013-03-26 17:39:44 -07:00
; 36a82
BattleCommand_FakeOut: ; 36a82
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
ret nz
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
2015-11-09 13:41:09 -08:00
jr nz, .fail
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVar
and 1 << FRZ | SLP
2015-11-09 13:41:09 -08:00
jr nz, .fail
2015-11-09 13:41:09 -08:00
call CheckOpponentWentFirst
jr z, FlinchTarget
2015-11-09 13:41:09 -08:00
.fail
2013-03-26 17:39:44 -07:00
ld a, 1
ld [AttackMissed], a
ret
2013-03-26 17:39:44 -07:00
; 36aa0
BattleCommand_FlinchTarget: ; 36aa0
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
ret nz
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVar
and 1 << FRZ | SLP
2013-03-26 17:39:44 -07:00
ret nz
2015-11-09 13:41:09 -08:00
call CheckOpponentWentFirst
2013-03-26 17:39:44 -07:00
ret nz
2013-06-13 13:10:39 -07:00
ld a, [EffectFailed]
2013-03-26 17:39:44 -07:00
and a
ret nz
; fallthrough
; 36ab5
2015-11-09 13:41:09 -08:00
FlinchTarget: ; 36ab5
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVarAddr
set SUBSTATUS_FLINCHED, [hl]
2013-03-26 17:39:44 -07:00
jp EndRechargeOpp
2013-03-26 17:39:44 -07:00
; 36abf
2015-11-09 13:41:09 -08:00
CheckOpponentWentFirst: ; 36abf
; Returns a=0, z if user went first
; Returns a=1, nz if opponent went first
2013-03-26 17:39:44 -07:00
push bc
2015-11-09 13:41:09 -08:00
ld a, [wEnemyGoesFirst] ; 0 if player went first
2013-03-26 17:39:44 -07:00
ld b, a
2015-11-09 13:41:09 -08:00
ld a, [hBattleTurn] ; 0 if it's the player's turn
xor b ; 1 if opponent went first
2013-03-26 17:39:44 -07:00
pop bc
ret
2013-03-26 17:39:44 -07:00
; 36ac9
BattleCommand_KingsRock: ; 36ac9
2013-03-26 22:52:04 -07:00
; kingsrock
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
ret nz
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
call GetUserItem
ld a, b
cp HELD_TRADE_EVOLVE ; Only King's Rock has this effect
2013-03-26 17:39:44 -07:00
ret nz
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
ret nz
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld d, h
ld e, l
call GetUserItem
call BattleRandom
2013-03-26 17:39:44 -07:00
cp c
ret nc
call EndRechargeOpp
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVarAddr
set SUBSTATUS_FLINCHED, [hl]
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 36af3
BattleCommand_OHKO: ; 36af3
2013-03-26 22:52:04 -07:00
; ohko
2013-03-26 17:39:44 -07:00
call ResetDamage
ld a, [TypeModifier]
and $7f
jr z, .no_effect
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonLevel
ld de, BattleMonLevel
ld bc, wPlayerMoveStruct + MOVE_ACC
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_move_accuracy
2013-03-26 17:39:44 -07:00
push hl
ld h, d
ld l, e
pop de
ld bc, wEnemyMoveStruct + MOVE_ACC
.got_move_accuracy
2013-03-26 17:39:44 -07:00
ld a, [de]
sub [hl]
jr c, .no_effect
2013-03-26 17:39:44 -07:00
add a
ld e, a
ld a, [bc]
add e
jr nc, .finish_ohko
2013-03-26 17:39:44 -07:00
ld a, $ff
.finish_ohko
2013-03-26 17:39:44 -07:00
ld [bc], a
call BattleCommand_CheckHit
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, $ff
ld [hli], a
ld [hl], a
ld a, $2
ld [CriticalHit], a
ret
.no_effect
2013-03-26 17:39:44 -07:00
ld a, $ff
ld [CriticalHit], a
ld a, $1
ld [AttackMissed], a
ret
2013-03-26 17:39:44 -07:00
; 36b3a
BattleCommand_CheckCharge: ; 36b3a
2013-03-26 22:52:04 -07:00
; checkcharge
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
bit SUBSTATUS_CHARGED, [hl]
2013-03-26 17:39:44 -07:00
ret z
res SUBSTATUS_CHARGED, [hl]
res SUBSTATUS_UNDERGROUND, [hl]
res SUBSTATUS_FLYING, [hl]
ld b, charge_command
2013-03-26 22:52:04 -07:00
jp SkipToBattleCommand
2013-03-26 17:39:44 -07:00
; 36b4d
BattleCommand_Charge: ; 36b4d
2013-03-26 22:52:04 -07:00
; charge
call BattleCommand_ClearText
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVar
and SLP
2015-11-09 13:41:09 -08:00
jr z, .awake
2013-03-27 14:07:00 -07:00
call BattleCommand_MoveDelay
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
call PrintButItFailed
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-27 14:07:00 -07:00
2015-11-09 13:41:09 -08:00
.awake
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
set SUBSTATUS_CHARGED, [hl]
2013-03-27 14:07:00 -07:00
ld hl, IgnoredOrders2Text
2013-03-26 17:39:44 -07:00
ld a, [AlreadyDisobeyed]
and a
call nz, StdBattleTextBox
2013-03-27 14:07:00 -07:00
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
inc a
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2015-11-09 13:41:09 -08:00
call LoadMoveAnim
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
cp FLY
2015-11-09 13:41:09 -08:00
jr z, .flying
cp DIG
2015-11-09 13:41:09 -08:00
jr z, .flying
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
2015-11-09 13:41:09 -08:00
jr .not_flying
2015-11-09 13:41:09 -08:00
.flying
call DisappearUser
.not_flying
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld b, a
cp FLY
2015-11-09 13:41:09 -08:00
jr z, .set_flying
cp DIG
2015-11-09 13:41:09 -08:00
jr nz, .dont_set_digging
set SUBSTATUS_UNDERGROUND, [hl]
2015-11-09 13:41:09 -08:00
jr .dont_set_digging
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.set_flying
set SUBSTATUS_FLYING, [hl]
2013-03-26 17:39:44 -07:00
2015-11-09 13:41:09 -08:00
.dont_set_digging
call CheckUserIsCharging
jr nz, .mimic
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld [hl], b
ld a, BATTLE_VARS_LAST_MOVE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld [hl], b
2015-11-09 13:41:09 -08:00
.mimic
2013-03-26 17:39:44 -07:00
call ResetDamage
ld hl, .UsedText
2013-03-26 17:39:44 -07:00
call BattleTextBox
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-27 14:12:23 -07:00
cp EFFECT_SKULL_BASH
ld b, endturn_command
2013-03-26 22:52:04 -07:00
jp z, SkipToBattleCommand
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
.UsedText:
text_jump UnknownText_0x1c0d0e ; "[USER]"
2013-03-26 17:39:44 -07:00
start_asm
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
cp RAZOR_WIND
ld hl, .RazorWind
jr z, .done
2013-03-26 17:39:44 -07:00
cp SOLARBEAM
ld hl, .Solarbeam
jr z, .done
2013-03-26 17:39:44 -07:00
cp SKULL_BASH
ld hl, .SkullBash
jr z, .done
2013-03-26 17:39:44 -07:00
cp SKY_ATTACK
ld hl, .SkyAttack
jr z, .done
2013-03-26 17:39:44 -07:00
cp FLY
ld hl, .Fly
jr z, .done
2013-03-26 17:39:44 -07:00
cp DIG
ld hl, .Dig
.done
2013-03-26 17:39:44 -07:00
ret
.RazorWind:
2013-03-26 17:39:44 -07:00
; 'made a whirlwind!'
text_jump UnknownText_0x1c0d12
2013-03-26 17:39:44 -07:00
db "@"
.Solarbeam:
2013-03-26 17:39:44 -07:00
; 'took in sunlight!'
text_jump UnknownText_0x1c0d26
2013-03-26 17:39:44 -07:00
db "@"
.SkullBash:
2013-03-26 17:39:44 -07:00
; 'lowered its head!'
text_jump UnknownText_0x1c0d3a
2013-03-26 17:39:44 -07:00
db "@"
.SkyAttack:
2013-03-26 17:39:44 -07:00
; 'is glowing!'
text_jump UnknownText_0x1c0d4e
2013-03-26 17:39:44 -07:00
db "@"
.Fly:
2013-03-26 17:39:44 -07:00
; 'flew up high!'
text_jump UnknownText_0x1c0d5c
2013-03-26 17:39:44 -07:00
db "@"
.Dig:
2013-03-26 17:39:44 -07:00
; 'dug a hole!'
text_jump UnknownText_0x1c0d6c
2013-03-26 17:39:44 -07:00
db "@"
; 36c2c
BattleCommand3c: ; 36c2c
; unused
ret
2013-03-26 17:39:44 -07:00
; 36c2d
BattleCommand_TrapTarget: ; 36c2d
2013-03-26 22:52:04 -07:00
; traptarget
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
ret nz
2015-11-08 10:27:26 -08:00
ld hl, wEnemyWrapCount
ld de, wEnemyTrappingMove
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_trap
2015-11-08 10:27:26 -08:00
ld hl, wPlayerWrapCount
ld de, wPlayerTrappingMove
2013-03-26 17:39:44 -07:00
.got_trap
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
ret nz
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVar
bit SUBSTATUS_SUBSTITUTE, a
2013-03-26 17:39:44 -07:00
ret nz
call BattleRandom
2013-03-26 17:39:44 -07:00
and 3
inc a
inc a
inc a
2013-03-26 17:39:44 -07:00
ld [hl], a
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld [de], a
ld b, a
ld hl, .Traps
.find_trap_text
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
jr z, .found_trap_text
2013-03-26 17:39:44 -07:00
inc hl
2015-12-26 18:59:03 -08:00
inc hl
jr .find_trap_text
2013-03-26 17:39:44 -07:00
.found_trap_text
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld h, [hl]
ld l, a
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
.Traps:
2013-03-26 17:39:44 -07:00
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
BattleCommand_Mist: ; 36c7e
2013-03-26 22:52:04 -07:00
; mist
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVarAddr
bit SUBSTATUS_MIST, [hl]
jr nz, .already_mist
set SUBSTATUS_MIST, [hl]
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, MistText
jp StdBattleTextBox
.already_mist
call AnimateFailedMove
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 36c98
BattleCommand_FocusEnergy: ; 36c98
2013-03-26 22:52:04 -07:00
; focusenergy
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVarAddr
bit SUBSTATUS_FOCUS_ENERGY, [hl]
jr nz, .already_pumped
set SUBSTATUS_FOCUS_ENERGY, [hl]
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, GettingPumpedText
jp StdBattleTextBox
.already_pumped
call AnimateFailedMove
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 36cb2
BattleCommand_Recoil: ; 36cb2
2013-03-26 22:52:04 -07:00
; recoil
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMaxHP
ld a, [hBattleTurn]
and a
jr z, .got_hp
ld hl, EnemyMonMaxHP
.got_hp
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld d, a
; get 1/4 damage or 1 HP, whichever is higher
2013-03-26 17:39:44 -07:00
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, .min_damage
2013-03-26 17:39:44 -07:00
inc c
.min_damage
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [Buffer2], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer1], a
2013-03-26 17:39:44 -07:00
dec hl
2015-12-26 18:59:03 -08:00
dec hl
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer3], a
2013-03-26 17:39:44 -07:00
sub c
ld [hld], a
ld [Buffer5], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [Buffer4], a
2013-03-26 17:39:44 -07:00
sbc b
ld [hl], a
ld [Buffer6], a
jr nc, .dont_ko
2013-03-26 17:39:44 -07:00
xor a
ld [hli], a
ld [hl], a
ld hl, Buffer5
2013-03-26 17:39:44 -07:00
ld [hli], a
ld [hl], a
.dont_ko
hlcoord 10, 9
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld a, 1
jr z, .animate_hp_bar
hlcoord 2, 2
2013-03-26 17:39:44 -07:00
xor a
.animate_hp_bar
ld [wWhichHPBar], a
predef AnimateHPBar
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
2013-03-26 17:39:44 -07:00
ld hl, RecoilText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 36d1d
BattleCommand_ConfuseTarget: ; 36d1d
2013-03-26 22:52:04 -07:00
; confusetarget
2013-03-26 17:39:44 -07:00
call GetOpponentItem
ld a, b
cp HELD_PREVENT_CONFUSE
2013-03-26 17:39:44 -07:00
ret z
2013-06-13 13:10:39 -07:00
ld a, [EffectFailed]
2013-03-26 17:39:44 -07:00
and a
ret nz
2015-11-06 19:36:06 -08:00
call SafeCheckSafeguard
2013-03-26 17:39:44 -07:00
ret nz
call CheckSubstituteOpp
ret nz
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVarAddr
bit SUBSTATUS_CONFUSED, [hl]
2013-03-26 17:39:44 -07:00
ret nz
jr BattleCommand_FinishConfusingTarget
2013-03-26 17:39:44 -07:00
2013-03-26 22:52:04 -07:00
BattleCommand_Confuse: ; 36d3b
2013-03-26 22:52:04 -07:00
; confuse
2013-03-26 17:39:44 -07:00
call GetOpponentItem
ld a, b
cp HELD_PREVENT_CONFUSE
jr nz, .no_item_protection
2013-03-26 17:39:44 -07:00
ld a, [hl]
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-05-02 22:29:57 -07:00
call GetItemName
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
ld hl, ProtectedByText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
.no_item_protection
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVarAddr
bit SUBSTATUS_CONFUSED, [hl]
jr z, .not_already_confused
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
ld hl, AlreadyConfusedText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
.not_already_confused
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit
BattleCommand_FinishConfusingTarget: ; 36d70
2013-04-27 14:12:23 -07:00
ld bc, EnemyConfuseCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_confuse_count
2013-03-26 17:39:44 -07:00
ld bc, PlayerConfuseCount
2013-04-27 14:12:23 -07:00
.got_confuse_count
set SUBSTATUS_CONFUSED, [hl]
call BattleRandom
2013-04-27 14:12:23 -07:00
and 3
2013-03-26 17:39:44 -07:00
inc a
2015-12-26 18:59:03 -08:00
inc a
2013-03-26 17:39:44 -07:00
ld [bc], a
2013-04-27 14:12:23 -07:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-27 14:12:23 -07:00
cp EFFECT_CONFUSE_HIT
jr z, .got_effect
2013-04-27 14:12:23 -07:00
cp EFFECT_SNORE
jr z, .got_effect
2013-04-27 14:12:23 -07:00
cp EFFECT_SWAGGER
jr z, .got_effect
call AnimateCurrentMove
2013-04-27 14:12:23 -07:00
.got_effect
ld de, ANIM_CONFUSED
2015-11-06 17:55:16 -08:00
call PlayOpponentBattleAnim
2013-04-27 14:12:23 -07:00
2013-03-26 17:39:44 -07:00
ld hl, BecameConfusedText
call StdBattleTextBox
2013-04-27 14:12:23 -07:00
2013-03-26 17:39:44 -07:00
call GetOpponentItem
ld a, b
cp HELD_HEAL_STATUS
jr z, .heal_confusion
cp HELD_HEAL_CONFUSION
2013-03-26 17:39:44 -07:00
ret nz
.heal_confusion
ld hl, UseConfusionHealingItem
2013-12-31 00:25:38 -08:00
jp CallBattleCore
2013-03-26 17:39:44 -07:00
; 36db6
BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit: ; 36db6
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-27 14:12:23 -07:00
cp EFFECT_CONFUSE_HIT
2013-03-26 17:39:44 -07:00
ret z
2013-04-27 14:12:23 -07:00
cp EFFECT_SNORE
2013-03-26 17:39:44 -07:00
ret z
2013-04-27 14:12:23 -07:00
cp EFFECT_SWAGGER
2013-03-26 17:39:44 -07:00
ret z
jp PrintDidntAffect2
2013-03-26 17:39:44 -07:00
; 36dc7
BattleCommand_Paralyze: ; 36dc7
2013-03-26 22:52:04 -07:00
; paralyze
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVar
bit PAR, a
jr nz, .paralyzed
2013-03-26 17:39:44 -07:00
ld a, [TypeModifier]
and $7f
jr z, .didnt_affect
2013-03-26 17:39:44 -07:00
call GetOpponentItem
ld a, b
cp HELD_PREVENT_PARALYZE
jr nz, .no_item_protection
2013-03-26 17:39:44 -07:00
ld a, [hl]
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-05-02 22:29:57 -07:00
call GetItemName
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
ld hl, ProtectedByText
jp StdBattleTextBox
.no_item_protection
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .dont_sample_failure
2015-09-04 13:30:40 -07:00
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
jr nz, .dont_sample_failure
2015-09-04 13:30:40 -07:00
ld a, [InBattleTowerBattle]
2013-03-26 17:39:44 -07:00
and a
jr nz, .dont_sample_failure
2015-09-04 13:30:40 -07:00
2013-03-26 17:39:44 -07:00
ld a, [PlayerSubStatus5]
bit SUBSTATUS_LOCK_ON, a
jr nz, .dont_sample_failure
2015-09-04 13:30:40 -07:00
call BattleRandom
cp 1 + 25 percent
jr c, .failed
2015-09-04 13:30:40 -07:00
.dont_sample_failure
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
and a
jr nz, .failed
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jr nz, .failed
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
jr nz, .failed
ld c, 30
2013-03-26 17:39:44 -07:00
call DelayFrames
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld a, $1
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS_OPP
call GetBattleVarAddr
set PAR, [hl]
2013-05-02 21:22:28 -07:00
call UpdateOpponentInParty
2015-11-06 17:55:16 -08:00
ld hl, ApplyPrzEffectOnSpeed
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-05-02 21:22:28 -07:00
call UpdateBattleHuds
2013-03-26 17:39:44 -07:00
call PrintParalyze
2015-11-06 19:36:06 -08:00
ld hl, UseHeldStatusHealingItem
2013-12-31 00:25:38 -08:00
jp CallBattleCore
.paralyzed
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
ld hl, AlreadyParalyzedText
jp StdBattleTextBox
.failed
2013-03-26 17:39:44 -07:00
jp PrintDidntAffect2
.didnt_affect
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
jp PrintDoesntAffect
2013-03-26 17:39:44 -07:00
; 36e5b
2015-11-09 13:41:09 -08:00
CheckMoveTypeMatchesTarget: ; 36e5b
; Compare move type to opponent type.
; Return z if matching the opponent type,
; unless the move is Normal (Tri Attack).
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
; 36e7c
BattleCommand_Substitute: ; 36e7c
2013-03-26 22:52:04 -07:00
; substitute
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMaxHP
ld de, PlayerSubstituteHP
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_hp
ld hl, EnemyMonMaxHP
ld de, EnemySubstituteHP
.got_hp
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVar
bit SUBSTATUS_SUBSTITUTE, a
2015-11-06 17:55:16 -08:00
jr nz, .already_has_sub
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld b, [hl]
srl a
rr b
srl a
rr b
dec hl
2015-12-26 18:59:03 -08:00
dec hl
2013-03-26 17:39:44 -07:00
ld a, b
ld [de], a
ld a, [hld]
sub b
ld e, a
ld a, [hl]
sbc 0
2013-03-26 17:39:44 -07:00
ld d, a
2015-11-06 17:55:16 -08:00
jr c, .too_weak_to_sub
2013-03-26 17:39:44 -07:00
ld a, d
or e
2015-11-06 17:55:16 -08:00
jr z, .too_weak_to_sub
2013-03-26 17:39:44 -07:00
ld [hl], d
inc hl
ld [hl], e
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVarAddr
set SUBSTATUS_SUBSTITUTE, [hl]
2015-11-08 10:27:26 -08:00
ld hl, wPlayerWrapCount
ld de, wPlayerTrappingMove
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, .player
2015-11-08 10:27:26 -08:00
ld hl, wEnemyWrapCount
ld de, wEnemyTrappingMove
2015-11-06 17:55:16 -08:00
.player
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
ld [de], a
2015-11-06 19:36:06 -08:00
call _CheckBattleScene
2016-03-27 09:47:28 -07:00
jr c, .no_anim
2013-03-26 17:39:44 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-26 17:39:44 -07:00
ld [FXAnimIDHi], a
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
ld a, SUBSTITUTE
2015-11-09 13:41:09 -08:00
call LoadAnim
2015-11-06 17:55:16 -08:00
jr .finish
2016-03-27 09:47:28 -07:00
.no_anim
2015-11-06 19:36:06 -08:00
call BattleCommand_RaiseSubNoAnim
2015-11-06 17:55:16 -08:00
.finish
2013-03-26 17:39:44 -07:00
ld hl, MadeSubstituteText
call StdBattleTextBox
2013-05-02 21:22:28 -07:00
jp RefreshBattleHuds
2015-11-06 17:55:16 -08:00
.already_has_sub
2015-11-09 13:41:09 -08:00
call CheckUserIsCharging
2015-11-06 13:42:38 -08:00
call nz, BattleCommand_RaiseSub
2013-03-26 17:39:44 -07:00
ld hl, HasSubstituteText
2015-11-06 17:55:16 -08:00
jr .jp_stdbattletextbox
2015-11-06 17:55:16 -08:00
.too_weak_to_sub
2015-11-09 13:41:09 -08:00
call CheckUserIsCharging
2015-11-06 13:42:38 -08:00
call nz, BattleCommand_RaiseSub
2013-03-26 17:39:44 -07:00
ld hl, TooWeakSubText
2015-11-06 17:55:16 -08:00
.jp_stdbattletextbox
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 36f0b
BattleCommand_RechargeNextTurn: ; 36f0b
2013-03-26 22:52:04 -07:00
; rechargenextturn
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVarAddr
set SUBSTATUS_RECHARGE, [hl]
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 36f13
EndRechargeOpp: ; 36f13
push hl
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVarAddr
res SUBSTATUS_RECHARGE, [hl]
2013-03-26 17:39:44 -07:00
pop hl
ret
2013-03-26 17:39:44 -07:00
; 36f1d
BattleCommand_Rage: ; 36f1d
2013-03-26 22:52:04 -07:00
; rage
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVarAddr
set SUBSTATUS_RAGE, [hl]
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 36f25
BattleCommand_DoubleFlyingDamage: ; 36f25
2013-03-26 22:52:04 -07:00
; doubleflyingdamage
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVar
2013-07-29 10:58:20 -07:00
bit SUBSTATUS_FLYING, a
2013-03-26 17:39:44 -07:00
ret z
2013-03-26 22:52:04 -07:00
jr DoubleDamage
2013-03-26 17:39:44 -07:00
; 36f2f
BattleCommand_DoubleUndergroundDamage: ; 36f2f
2013-03-26 22:52:04 -07:00
; doubleundergrounddamage
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVar
2013-07-29 10:58:20 -07:00
bit SUBSTATUS_UNDERGROUND, a
2013-03-26 17:39:44 -07:00
ret z
; fallthrough
; 36f37
2013-03-26 22:52:04 -07:00
DoubleDamage: ; 36f37
2013-03-26 17:39:44 -07:00
ld hl, CurDamage + 1
sla [hl]
dec hl
rl [hl]
jr nc, .quit
ld a, $ff
ld [hli], a
ld [hl], a
.quit
ret
2013-03-26 17:39:44 -07:00
; 36f46
BattleCommand_Mimic: ; 36f46
2013-03-26 22:52:04 -07:00
; mimic
2015-11-09 13:41:09 -08:00
call ClearLastMove
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
2015-11-09 13:41:09 -08:00
jr nz, .fail
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMoves
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
jr z, .player_turn
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonMoves
2015-11-09 13:41:09 -08:00
.player_turn
2013-03-26 17:39:44 -07:00
call CheckHiddenOpponent
2015-11-09 13:41:09 -08:00
jr nz, .fail
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
and a
2015-11-09 13:41:09 -08:00
jr z, .fail
cp STRUGGLE
2015-11-09 13:41:09 -08:00
jr z, .fail
2013-03-26 17:39:44 -07:00
ld b, a
ld c, NUM_MOVES
2015-11-09 13:41:09 -08:00
.check_already_knows_move
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
2015-11-09 13:41:09 -08:00
jr z, .fail
2013-03-26 17:39:44 -07:00
dec c
2015-11-09 13:41:09 -08:00
jr nz, .check_already_knows_move
2013-03-26 17:39:44 -07:00
dec hl
2015-11-09 13:41:09 -08:00
.find_mimic
2013-03-26 17:39:44 -07:00
ld a, [hld]
cp MIMIC
2015-11-09 13:41:09 -08:00
jr nz, .find_mimic
2013-03-26 17:39:44 -07:00
inc hl
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld [hl], a
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
ld bc, BattleMonPP - BattleMonMoves
2013-03-26 17:39:44 -07:00
add hl, bc
ld [hl], 5
2013-05-02 23:43:44 -07:00
call GetMoveName
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, LearnedMoveText
jp StdBattleTextBox
2015-11-09 13:41:09 -08:00
.fail
jp FailMimic
2013-03-26 17:39:44 -07:00
; 36f9d
BattleCommand_LeechSeed: ; 36f9d
2013-03-26 17:39:44 -07:00
; leechseed
ld a, [AttackMissed]
and a
jr nz, .evaded
2013-03-26 17:39:44 -07:00
call CheckSubstituteOpp
jr nz, .evaded
2013-03-26 17:39:44 -07:00
ld de, EnemyMonType1
ld a, [hBattleTurn]
and a
jr z, .ok
2013-03-26 17:39:44 -07:00
ld de, BattleMonType1
.ok
2013-03-26 17:39:44 -07:00
ld a, [de]
cp GRASS
jr z, .grass
2013-03-26 17:39:44 -07:00
inc de
ld a, [de]
cp GRASS
jr z, .grass
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVarAddr
bit SUBSTATUS_LEECH_SEED, [hl]
jr nz, .evaded
set SUBSTATUS_LEECH_SEED, [hl]
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, WasSeededText
jp StdBattleTextBox
.grass
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
jp PrintDoesntAffect
.evaded
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
ld hl, EvadedText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 36fe1
BattleCommand_Splash: ; 36fe1
call AnimateCurrentMove
2015-10-24 07:34:19 -07:00
callba MobileFn_1060e5
2013-03-26 17:39:44 -07:00
jp PrintNothingHappened
2013-03-26 17:39:44 -07:00
; 36fed
BattleCommand_Disable: ; 36fed
2013-03-26 17:39:44 -07:00
; disable
ld a, [AttackMissed]
and a
jr nz, .failed
2013-05-02 22:29:57 -07:00
ld de, EnemyDisableCount
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonMoves
ld a, [hBattleTurn]
and a
jr z, .got_moves
2013-03-26 17:39:44 -07:00
ld de, PlayerDisableCount
ld hl, BattleMonMoves
.got_moves
2013-03-26 17:39:44 -07:00
ld a, [de]
and a
jr nz, .failed
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
and a
jr z, .failed
cp STRUGGLE
jr z, .failed
2013-03-26 17:39:44 -07:00
ld b, a
ld c, $ff
.loop
2013-03-26 17:39:44 -07:00
inc c
ld a, [hli]
cp b
jr nz, .loop
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld hl, EnemyMonPP
jr z, .got_pp
2013-03-26 17:39:44 -07:00
ld hl, BattleMonPP
.got_pp
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld a, [hl]
and a
jr z, .failed
.loop2
call BattleRandom
and 7
jr z, .loop2
2013-03-26 17:39:44 -07:00
inc a
inc c
swap c
add c
ld [de], a
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, DisabledMove
ld a, [hBattleTurn]
and a
jr nz, .got_disabled_move_pointer
2013-03-26 17:39:44 -07:00
inc hl
.got_disabled_move_pointer
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld [hl], a
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-05-02 23:43:44 -07:00
call GetMoveName
2013-03-26 17:39:44 -07:00
ld hl, WasDisabledText
jp StdBattleTextBox
.failed
2015-11-09 13:41:09 -08:00
jp FailDisable
2013-03-26 17:39:44 -07:00
; 3705c
BattleCommand_PayDay: ; 3705c
2013-03-26 22:52:04 -07:00
; payday
2013-03-26 17:39:44 -07:00
xor a
ld hl, StringBuffer1
ld [hli], a
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
ld a, [BattleMonLevel]
jr z, .ok
2013-03-26 17:39:44 -07:00
ld a, [EnemyMonLevel]
.ok
2013-03-26 17:39:44 -07:00
add a
ld hl, wPayDayMoney + 2
2013-03-26 17:39:44 -07:00
add [hl]
ld [hld], a
jr nc, .done
2013-03-26 17:39:44 -07:00
inc [hl]
dec hl
jr nz, .done
2013-03-26 17:39:44 -07:00
inc [hl]
.done
2013-03-26 17:39:44 -07:00
ld hl, CoinsScatteredText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 3707f
BattleCommand_Conversion: ; 3707f
2013-03-26 22:52:04 -07:00
; conversion
2013-03-26 17:39:44 -07:00
ld hl, BattleMonMoves
ld de, BattleMonType1
ld a, [hBattleTurn]
and a
jr z, .got_moves
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonMoves
ld de, EnemyMonType1
.got_moves
2013-03-26 17:39:44 -07:00
push de
ld c, 0
2013-03-26 17:39:44 -07:00
ld de, StringBuffer1
.loop
2013-03-26 17:39:44 -07:00
push hl
ld b, 0
2013-03-26 17:39:44 -07:00
add hl, bc
ld a, [hl]
pop hl
and a
jr z, .okay
2013-03-26 17:39:44 -07:00
push hl
push bc
dec a
ld hl, Moves + MOVE_TYPE
2013-03-27 13:19:51 -07:00
call GetMoveAttr
2013-03-26 17:39:44 -07:00
ld [de], a
inc de
pop bc
pop hl
inc c
ld a, c
cp NUM_MOVES
jr c, .loop
.okay
2013-03-26 17:39:44 -07:00
ld a, $ff
ld [de], a
inc de
ld [de], a
inc de
ld [de], a
pop de
ld hl, StringBuffer1
.loop2
2013-03-26 17:39:44 -07:00
ld a, [hl]
cp -1
jr z, .fail
cp CURSE_T
jr z, .next
2013-03-26 17:39:44 -07:00
ld a, [de]
cp [hl]
jr z, .next
2013-03-26 17:39:44 -07:00
inc de
ld a, [de]
dec de
cp [hl]
jr nz, .done
.next
2013-03-26 17:39:44 -07:00
inc hl
jr .loop2
.fail
call AnimateFailedMove
jp PrintButItFailed
.done
.loop3
call BattleRandom
and 3 ; TODO factor in NUM_MOVES
2013-03-26 17:39:44 -07:00
ld c, a
ld b, 0
2013-03-26 17:39:44 -07:00
ld hl, StringBuffer1
add hl, bc
ld a, [hl]
cp -1
jr z, .loop3
cp CURSE_T
jr z, .loop3
2013-03-26 17:39:44 -07:00
ld a, [de]
cp [hl]
jr z, .loop3
2013-03-26 17:39:44 -07:00
inc de
ld a, [de]
dec de
cp [hl]
jr z, .loop3
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [de], a
inc de
ld [de], a
2015-11-06 17:55:16 -08:00
ld [wNamedObjectIndexBuffer], a
2013-10-01 17:47:54 -07:00
callba GetTypeName
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, TransformedTypeText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 3710e
BattleCommand_ResetStats: ; 3710e
2013-03-26 17:39:44 -07:00
; resetstats
2013-03-26 22:52:04 -07:00
2013-03-26 17:39:44 -07:00
ld a, 7 ; neutral
ld hl, PlayerStatLevels
call .Fill
ld hl, EnemyStatLevels
call .Fill
ld a, [hBattleTurn]
push af
call SetPlayerTurn
2015-11-06 17:55:16 -08:00
call CalcPlayerStats
2013-03-26 17:39:44 -07:00
call SetEnemyTurn
2015-11-06 17:55:16 -08:00
call CalcEnemyStats
2013-03-26 17:39:44 -07:00
pop af
ld [hBattleTurn], a
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, EliminatedStatsText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
.Fill:
2013-03-26 17:39:44 -07:00
ld b, PlayerStatLevelsEnd - PlayerStatLevels
.next
2013-03-26 17:39:44 -07:00
ld [hli], a
dec b
jr nz, .next
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 3713e
BattleCommand_Heal: ; 3713e
2013-03-26 22:52:04 -07:00
; heal
2013-03-26 17:39:44 -07:00
ld de, BattleMonHP
ld hl, BattleMonMaxHP
ld a, [hBattleTurn]
and a
jr z, .got_hp
ld de, EnemyMonHP
ld hl, EnemyMonMaxHP
.got_hp
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld b, a
push hl
push de
push bc
ld c, 2
2013-03-26 17:39:44 -07:00
call StringCmp
pop bc
pop de
pop hl
jp z, .hp_full
2013-03-26 17:39:44 -07:00
ld a, b
cp REST
jr nz, .not_rest
2013-03-26 17:39:44 -07:00
push hl
push de
push af
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5
call GetBattleVarAddr
res SUBSTATUS_TOXIC, [hl]
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
ld [hl], REST_TURNS + 1
2013-03-26 17:39:44 -07:00
ld hl, WentToSleepText
jr z, .no_status_to_heal
2013-03-26 17:39:44 -07:00
ld hl, RestedText
.no_status_to_heal
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr nz, .calc_enemy_stats
2015-11-06 17:55:16 -08:00
call CalcPlayerStats
jr .got_stats
.calc_enemy_stats
2015-11-06 17:55:16 -08:00
call CalcEnemyStats
.got_stats
2013-03-26 17:39:44 -07:00
pop af
pop de
pop hl
.not_rest
jr z, .restore_full_hp
2013-12-31 01:09:00 -08:00
ld hl, GetHalfMaxHP
2013-12-31 00:25:38 -08:00
call CallBattleCore
jr .finish
.restore_full_hp
2013-12-31 01:09:00 -08:00
ld hl, GetMaxHP
2013-12-31 00:25:38 -08:00
call CallBattleCore
.finish
call AnimateCurrentMove
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2015-11-06 19:36:06 -08:00
ld hl, RestoreHP
2013-12-31 00:25:38 -08:00
call CallBattleCore
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-05-02 21:22:28 -07:00
call UpdateUserInParty
call RefreshBattleHuds
2013-03-26 17:39:44 -07:00
ld hl, RegainedHealthText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
.hp_full
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
ld hl, HPIsFullText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 371cd
2016-01-17 21:39:01 -08:00
INCLUDE "battle/effects/transform.asm"
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
; 372d2
BattleEffect_ButItFailed: ; 372d2
call AnimateFailedMove
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 372d8
2015-11-09 13:41:09 -08:00
ClearLastMove: ; 372d8
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
ld a, BATTLE_VARS_LAST_MOVE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
ret
2013-03-26 17:39:44 -07:00
; 372e7
ResetActorDisable: ; 372e7
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .player
xor a
2013-05-02 22:29:57 -07:00
ld [EnemyDisableCount], a
ld [EnemyDisabledMove], a
2013-03-26 17:39:44 -07:00
ret
.player
xor a
ld [PlayerDisableCount], a
ld [DisabledMove], a
ret
2013-03-26 17:39:44 -07:00
; 372fc
BattleCommand_Screen: ; 372fc
2013-03-26 22:52:04 -07:00
; screen
2013-03-26 17:39:44 -07:00
ld hl, PlayerScreens
ld bc, PlayerLightScreenCount
ld a, [hBattleTurn]
and a
jr z, .got_screens_pointer
2013-04-19 23:57:11 -07:00
ld hl, EnemyScreens
2013-04-27 14:12:23 -07:00
ld bc, EnemyLightScreenCount
.got_screens_pointer
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_EFFECT
call GetBattleVar
2013-04-27 14:12:23 -07:00
cp EFFECT_LIGHT_SCREEN
jr nz, .Reflect
bit SCREENS_LIGHT_SCREEN, [hl]
jr nz, .failed
set SCREENS_LIGHT_SCREEN, [hl]
ld a, 5
2013-03-26 17:39:44 -07:00
ld [bc], a
2013-03-27 14:07:00 -07:00
ld hl, LightScreenEffectText
jr .good
2013-03-27 14:07:00 -07:00
.Reflect:
bit SCREENS_REFLECT, [hl]
jr nz, .failed
set SCREENS_REFLECT, [hl]
2013-04-27 14:12:23 -07:00
; LightScreenCount -> ReflectCount
2013-03-26 17:39:44 -07:00
inc bc
2013-04-27 14:12:23 -07:00
ld a, 5
2013-03-26 17:39:44 -07:00
ld [bc], a
2013-03-27 14:07:00 -07:00
ld hl, ReflectEffectText
.good
call AnimateCurrentMove
jp StdBattleTextBox
2013-03-27 14:07:00 -07:00
.failed
call AnimateFailedMove
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 3733d
PrintDoesntAffect: ; 3733d
; 'it doesn't affect'
ld hl, DoesntAffectText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37343
PrintNothingHappened: ; 37343
; 'but nothing happened!'
ld hl, NothingHappenedText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37349
TryPrintButItFailed: ; 37349
ld a, [AlreadyFailed]
2013-03-26 17:39:44 -07:00
and a
ret nz
; fallthrough
; 3734e
PrintButItFailed: ; 3734e
2013-03-26 17:39:44 -07:00
; 'but it failed!'
ld hl, ButItFailedText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37354
2015-11-09 13:41:09 -08:00
FailSnore:
FailDisable:
FailConversion2:
FailAttract:
FailForesight:
FailSpikes:
call AnimateFailedMove
; fallthrough
; 37357
2015-11-09 13:41:09 -08:00
FailMimic: ; 37357
2013-03-26 17:39:44 -07:00
ld hl, ButItFailedText ; 'but it failed!'
ld de, ItFailedText ; 'it failed!'
2015-11-09 13:41:09 -08:00
jp FailText_CheckOpponentProtect
2013-03-26 17:39:44 -07:00
; 37360
PrintDidntAffect: ; 37360
2013-03-26 17:39:44 -07:00
; 'it didn't affect'
ld hl, DidntAffect1Text
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37366
PrintDidntAffect2: ; 37366
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
ld hl, DidntAffect1Text ; 'it didn't affect'
ld de, DidntAffect2Text ; 'it didn't affect'
2015-11-09 13:41:09 -08:00
jp FailText_CheckOpponentProtect
2013-03-26 17:39:44 -07:00
; 37372
PrintParalyze: ; 37372
; 'paralyzed! maybe it can't attack!'
ld hl, ParalyzedText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37378
CheckSubstituteOpp: ; 37378
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVar
bit SUBSTATUS_SUBSTITUTE, a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 37380
BattleCommand_SelfDestruct: ; 37380
2015-10-24 07:34:19 -07:00
callba MobileFn_10610d
2015-11-09 13:41:09 -08:00
ld a, BATTLEANIM_PLAYER_DAMAGE
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2015-11-09 13:41:09 -08:00
ld c, 3
2013-03-26 17:39:44 -07:00
call DelayFrames
ld a, BATTLE_VARS_STATUS
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
xor a
ld [hli], a
inc hl
ld [hli], a
ld [hl], a
ld a, $1
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2015-11-09 13:41:09 -08:00
call LoadMoveAnim
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVarAddr
res SUBSTATUS_LEECH_SEED, [hl]
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5_OPP
call GetBattleVarAddr
res SUBSTATUS_DESTINY_BOND, [hl]
2015-11-06 19:36:06 -08:00
call _CheckBattleScene
2013-03-26 17:39:44 -07:00
ret nc
2013-10-01 17:47:54 -07:00
callba DrawPlayerHUD
callba DrawEnemyHUD
2013-12-01 11:19:57 -08:00
call WaitBGMap
2013-05-02 21:22:28 -07:00
jp RefreshBattleHuds
2013-03-26 17:39:44 -07:00
; 373c9
2013-12-01 11:19:57 -08:00
INCLUDE "battle/effects/mirror_move.asm"
2013-03-26 17:39:44 -07:00
2013-12-01 11:19:57 -08:00
INCLUDE "battle/effects/metronome.asm"
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
; 3747b
ResetTurn: ; 3747b
2015-11-07 18:04:54 -08:00
ld hl, wPlayerCharging
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 17:55:16 -08:00
jr z, .player
2015-11-07 18:04:54 -08:00
ld hl, wEnemyCharging
2013-03-26 17:39:44 -07:00
2015-11-06 17:55:16 -08:00
.player
2013-03-26 17:39:44 -07:00
ld [hl], 1
xor a
ld [AlreadyDisobeyed], a
call DoMove
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 37492
2013-12-01 11:19:57 -08:00
INCLUDE "battle/effects/thief.asm"
2013-03-26 17:39:44 -07:00
BattleCommand_ArenaTrap: ; 37517
2013-03-26 17:39:44 -07:00
; arenatrap
2013-09-08 19:44:20 -07:00
; Doesn't work on an absent opponent.
2013-03-26 17:39:44 -07:00
call CheckHiddenOpponent
2013-09-08 19:44:20 -07:00
jr nz, .failed
; Don't trap if the opponent is already trapped.
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_SUBSTATUS5
call GetBattleVarAddr
2013-09-08 19:44:20 -07:00
bit SUBSTATUS_CANT_RUN, [hl]
jr nz, .failed
; Otherwise trap the opponent.
set SUBSTATUS_CANT_RUN, [hl]
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, CantEscapeNowText
jp StdBattleTextBox
2013-09-08 19:44:20 -07:00
.failed
call AnimateFailedMove
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 37536
2013-12-01 11:19:57 -08:00
INCLUDE "battle/effects/nightmare.asm"
2013-03-26 17:39:44 -07:00
BattleCommand_Defrost: ; 37563
2013-03-26 17:39:44 -07:00
; defrost
2013-09-08 19:30:10 -07:00
; Thaw the user.
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVarAddr
2013-09-08 19:30:10 -07:00
bit FRZ, [hl]
2013-03-26 17:39:44 -07:00
ret z
2013-09-08 19:30:10 -07:00
res FRZ, [hl]
; Don't update the enemy's party struct in a wild battle.
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2013-09-08 19:30:10 -07:00
jr z, .party
ld a, [wBattleMode]
2013-03-26 17:39:44 -07:00
dec a
2013-09-08 19:30:10 -07:00
jr z, .done
.party
ld a, MON_STATUS
2013-05-02 23:43:44 -07:00
call UserPartyAttr
2013-09-08 19:30:10 -07:00
res FRZ, [hl]
.done
2013-05-02 21:22:28 -07:00
call RefreshBattleHuds
2013-03-26 17:39:44 -07:00
ld hl, WasDefrostedText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37588
INCLUDE "battle/effects/curse.asm"
2013-03-26 17:39:44 -07:00
INCLUDE "battle/effects/protect.asm"
2013-03-26 17:39:44 -07:00
INCLUDE "battle/effects/endure.asm"
2013-03-26 17:39:44 -07:00
INCLUDE "battle/effects/spikes.asm"
2013-03-26 17:39:44 -07:00
2013-12-01 11:19:57 -08:00
INCLUDE "battle/effects/foresight.asm"
2013-03-26 17:39:44 -07:00
2013-12-01 11:19:57 -08:00
INCLUDE "battle/effects/perish_song.asm"
2013-03-26 17:39:44 -07:00
2013-12-01 11:19:57 -08:00
INCLUDE "battle/effects/sandstorm.asm"
2013-03-26 17:39:44 -07:00
2013-12-01 11:19:57 -08:00
INCLUDE "battle/effects/rollout.asm"
2013-03-26 17:39:44 -07:00
BattleCommand5d: ; 37791
; unused
ret
2013-03-26 17:39:44 -07:00
; 37792
BattleCommand_FuryCutter: ; 37792
2013-03-26 17:39:44 -07:00
; furycutter
ld hl, PlayerFuryCutterCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .go
ld hl, EnemyFuryCutterCount
.go
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
jp nz, ResetFuryCutterCount
2013-03-26 17:39:44 -07:00
inc [hl]
; Damage capped at 5 turns' worth (16x).
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld b, a
cp 6
jr c, .checkdouble
ld b, 5
.checkdouble
2013-03-26 17:39:44 -07:00
dec b
ret z
; Double the damage
2013-03-26 17:39:44 -07:00
ld hl, CurDamage + 1
sla [hl]
dec hl
rl [hl]
jr nc, .checkdouble
; No overflow
2013-03-26 17:39:44 -07:00
ld a, $ff
ld [hli], a
ld [hl], a
ret
2013-03-26 17:39:44 -07:00
; 377be
ResetFuryCutterCount: ; 377be
2013-03-26 17:39:44 -07:00
push hl
ld hl, PlayerFuryCutterCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .reset
ld hl, EnemyFuryCutterCount
2013-03-26 17:39:44 -07:00
.reset
2013-03-26 17:39:44 -07:00
xor a
ld [hl], a
pop hl
ret
2013-03-26 17:39:44 -07:00
; 377ce
2015-11-06 19:36:06 -08:00
INCLUDE "battle/effects/attract.asm"
2013-03-26 17:39:44 -07:00
BattleCommand_HappinessPower: ; 3784b
2013-03-26 22:52:04 -07:00
; happinesspower
2013-03-26 17:39:44 -07:00
push bc
ld hl, BattleMonHappiness
ld a, [hBattleTurn]
and a
jr z, .ok
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonHappiness
.ok
2013-03-26 17:39:44 -07:00
xor a
ld [hMultiplicand + 0], a
ld [hMultiplicand + 1], a
2013-03-26 17:39:44 -07:00
ld a, [hl]
ld [hMultiplicand + 2], a
ld a, 10
ld [hMultiplier], a
2013-05-02 23:43:44 -07:00
call Multiply
ld a, 25
ld [hDivisor], a
ld b, 4
2013-05-02 23:43:44 -07:00
call Divide
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
ld d, a
pop bc
ret
2013-03-26 17:39:44 -07:00
; 37874
2015-11-06 19:36:06 -08:00
INCLUDE "battle/effects/present.asm"
2013-03-26 17:39:44 -07:00
BattleCommand_FrustrationPower: ; 3790e
2013-03-26 22:52:04 -07:00
; frustrationpower
2013-03-26 17:39:44 -07:00
push bc
ld hl, BattleMonHappiness
ld a, [hBattleTurn]
and a
jr z, .got_happiness
2013-03-26 17:39:44 -07:00
ld hl, EnemyMonHappiness
.got_happiness
2013-03-26 17:39:44 -07:00
ld a, $ff
sub [hl]
ld [hMultiplicand + 2], a
2013-03-26 17:39:44 -07:00
xor a
ld [hMultiplicand + 0], a
ld [hMultiplicand + 1], a
ld a, 10
ld [hMultiplier], a
2013-05-02 23:43:44 -07:00
call Multiply
ld a, 25
ld [hDivisor], a
ld b, 4
2013-05-02 23:43:44 -07:00
call Divide
ld a, [hQuotient + 2]
2013-03-26 17:39:44 -07:00
ld d, a
pop bc
ret
2013-03-26 17:39:44 -07:00
; 37939
BattleCommand_Safeguard: ; 37939
2013-03-26 17:39:44 -07:00
; safeguard
ld hl, PlayerScreens
ld de, PlayerSafeguardCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .ok
2013-04-19 23:57:11 -07:00
ld hl, EnemyScreens
ld de, EnemySafeguardCount
.ok
bit SCREENS_SAFEGUARD, [hl]
jr nz, .failed
set SCREENS_SAFEGUARD, [hl]
ld a, 5
2013-03-26 17:39:44 -07:00
ld [de], a
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, CoveredByVeilText
jp StdBattleTextBox
.failed
call AnimateFailedMove
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 37962
2015-11-06 19:36:06 -08:00
SafeCheckSafeguard: ; 37962
2013-03-26 17:39:44 -07:00
push hl
2013-04-19 23:57:11 -07:00
ld hl, EnemyScreens
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2015-11-06 19:36:06 -08:00
jr z, .got_turn
2013-03-26 17:39:44 -07:00
ld hl, PlayerScreens
2015-11-06 19:36:06 -08:00
.got_turn
bit SCREENS_SAFEGUARD, [hl]
2013-03-26 17:39:44 -07:00
pop hl
ret
2013-03-26 17:39:44 -07:00
; 37972
BattleCommand_CheckSafeguard: ; 37972
2013-03-26 22:52:04 -07:00
; checksafeguard
2013-04-19 23:57:11 -07:00
ld hl, EnemyScreens
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_turn
2013-03-26 17:39:44 -07:00
ld hl, PlayerScreens
2015-11-06 19:36:06 -08:00
.got_turn
bit SCREENS_SAFEGUARD, [hl]
2013-03-26 17:39:44 -07:00
ret z
ld a, 1
2013-03-26 17:39:44 -07:00
ld [AttackMissed], a
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
ld hl, SafeguardProtectText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 37991
BattleCommand_GetMagnitude: ; 37991
2013-03-26 17:39:44 -07:00
; getmagnitude
push bc
call BattleRandom
2013-03-26 17:39:44 -07:00
ld b, a
ld hl, .Magnitudes
.loop
2013-03-26 17:39:44 -07:00
ld a, [hli]
cp b
jr nc, .ok
2013-03-26 17:39:44 -07:00
inc hl
2015-12-26 18:59:03 -08:00
inc hl
jr .loop
.ok
2013-03-26 17:39:44 -07:00
ld d, [hl]
push de
inc hl
ld a, [hl]
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
ld hl, MagnitudeText
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
pop de
pop bc
ret
.Magnitudes:
2013-03-26 17:39:44 -07:00
; /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
BattleCommand_BatonPass: ; 379c9
2013-03-26 17:39:44 -07:00
; batonpass
ld a, [hBattleTurn]
and a
jp nz, .Enemy
; Need something to switch to
call CheckAnyOtherAlivePartyMons
jp z, FailedBatonPass
2013-03-26 17:39:44 -07:00
2013-05-02 21:22:28 -07:00
call UpdateBattleMonInParty
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld c, 50
call DelayFrames
; Transition into switchmon menu
2015-11-11 13:11:08 -08:00
call LoadStandardMenuDataHeader
callba SetUpBattlePartyMenu_NoLoop
callba ForcePickSwitchMonInBattle
; Return to battle scene
call ClearPalettes
2015-11-10 16:51:13 -08:00
callba _LoadBattleFontsHPBar
call CloseWindow
call ClearSprites
2013-12-31 01:09:00 -08:00
hlcoord 1, 0
lb bc, 4, 10
2013-03-26 17:39:44 -07:00
call ClearBox
2015-12-28 07:57:04 -08:00
ld b, SCGB_BATTLE_COLORS
call GetSGBLayout
2015-09-09 16:27:07 -07:00
call SetPalettes
2014-01-05 04:28:55 -08:00
call BatonPass_LinkPlayerSwitch
2013-03-26 17:39:44 -07:00
; Mobile link battles handle entrances differently
2015-11-08 16:09:36 -08:00
callba CheckMobileBattleError
2013-03-26 17:39:44 -07:00
jp c, EndMoveEffect
ld hl, PassedBattleMonEntrance
2013-12-31 00:25:38 -08:00
call CallBattleCore
call ResetBatonPassStatus
2013-03-26 17:39:44 -07:00
ret
.Enemy:
; Wildmons don't have anything to switch to
ld a, [wBattleMode]
2014-01-05 04:28:55 -08:00
dec a ; WILDMON
jp z, FailedBatonPass
2013-03-26 17:39:44 -07:00
call CheckAnyOtherAliveEnemyMons
jp z, FailedBatonPass
2013-03-26 17:39:44 -07:00
2013-05-02 21:22:28 -07:00
call UpdateEnemyMonInParty
call AnimateCurrentMove
2014-01-05 04:28:55 -08:00
call BatonPass_LinkEnemySwitch
2013-03-26 17:39:44 -07:00
; Mobile link battles handle entrances differently
2015-11-08 16:09:36 -08:00
callba CheckMobileBattleError
jp c, EndMoveEffect
2013-03-26 17:39:44 -07:00
; Passed enemy PartyMon entrance
2013-03-26 17:39:44 -07:00
xor a
2015-11-08 16:09:36 -08:00
ld [wEnemySwitchMonIndex], a
2015-11-07 18:04:54 -08:00
ld hl, EnemySwitch_SetMode
2013-12-31 00:25:38 -08:00
call CallBattleCore
2015-11-07 18:04:54 -08:00
ld hl, ResetBattleParticipants
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
ld a, 1
2015-11-06 17:55:16 -08:00
ld [wTypeMatchup], a
2015-09-09 16:27:07 -07:00
ld hl, ApplyStatLevelMultiplierOnAllStats
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
ld hl, SpikesDamage
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
jr ResetBatonPassStatus
; 37a67
2013-03-26 17:39:44 -07:00
2014-01-05 04:28:55 -08:00
BatonPass_LinkPlayerSwitch: ; 37a67
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
ret z
ld a, 1
2015-12-17 14:51:32 -08:00
ld [wPlayerAction], a
2013-03-26 17:39:44 -07:00
2015-11-11 13:11:08 -08:00
call LoadStandardMenuDataHeader
2015-11-23 13:04:53 -08:00
ld hl, LinkBattleSendReceiveAction
2013-12-31 00:25:38 -08:00
call CallBattleCore
call CloseWindow
2013-03-26 17:39:44 -07:00
xor a
2015-12-17 14:51:32 -08:00
ld [wPlayerAction], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 37a82
2014-01-05 04:28:55 -08:00
BatonPass_LinkEnemySwitch: ; 37a82
ld a, [wLinkMode]
2013-03-26 17:39:44 -07:00
and a
ret z
2015-11-11 13:11:08 -08:00
call LoadStandardMenuDataHeader
2015-11-23 13:04:53 -08:00
ld hl, LinkBattleSendReceiveAction
2013-12-31 00:25:38 -08:00
call CallBattleCore
2013-03-26 17:39:44 -07:00
ld a, [OTPartyCount]
add BATTLEACTION_SWITCH1
2013-03-26 17:39:44 -07:00
ld b, a
ld a, [wBattleAction]
cp BATTLEACTION_SWITCH1
jr c, .baton_pass
2013-03-26 17:39:44 -07:00
cp b
jr c, .switch
2013-03-26 17:39:44 -07:00
.baton_pass
2013-03-26 17:39:44 -07:00
ld a, [CurOTMon]
add BATTLEACTION_SWITCH1
ld [wBattleAction], a
.switch
jp CloseWindow
; 37aab
FailedBatonPass: ; 37aab
call AnimateFailedMove
jp PrintButItFailed
; 37ab1
2013-03-26 17:39:44 -07:00
ResetBatonPassStatus: ; 37ab1
; Reset status changes that aren't passed by Baton Pass.
; Nightmare isn't passed.
2013-03-26 22:52:04 -07:00
ld a, BATTLE_VARS_STATUS
call GetBattleVar
and SLP
jr nz, .ok
2013-03-26 22:52:04 -07:00
ld a, BATTLE_VARS_SUBSTATUS1
call GetBattleVarAddr
res SUBSTATUS_NIGHTMARE, [hl]
.ok
2013-03-26 17:39:44 -07:00
; Disable isn't passed.
call ResetActorDisable
; Attraction isn't passed.
2013-03-26 17:39:44 -07:00
ld hl, PlayerSubStatus1
res SUBSTATUS_IN_LOVE, [hl]
2013-03-26 17:39:44 -07:00
ld hl, EnemySubStatus1
res SUBSTATUS_IN_LOVE, [hl]
2013-03-26 17:39:44 -07:00
ld hl, PlayerSubStatus5
2013-03-26 22:52:04 -07:00
ld a, BATTLE_VARS_SUBSTATUS5
call GetBattleVarAddr
res SUBSTATUS_TRANSFORMED, [hl]
res SUBSTATUS_ENCORED, [hl]
; New mon hasn't used a move yet.
2013-03-26 22:52:04 -07:00
ld a, BATTLE_VARS_LAST_MOVE
call GetBattleVarAddr
2013-03-26 22:52:04 -07:00
ld [hl], 0
2013-03-26 17:39:44 -07:00
xor a
2015-11-08 10:27:26 -08:00
ld [wPlayerWrapCount], a
ld [wEnemyWrapCount], a
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 37ae9
CheckAnyOtherAlivePartyMons: ; 37ae9
ld hl, PartyMon1HP
2013-03-26 17:39:44 -07:00
ld a, [PartyCount]
ld d, a
ld a, [CurBattleMon]
ld e, a
jr CheckAnyOtherAliveMons
; 37af6
2013-03-26 17:39:44 -07:00
CheckAnyOtherAliveEnemyMons: ; 37af6
ld hl, OTPartyMon1HP
2013-03-26 17:39:44 -07:00
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.
2013-03-26 17:39:44 -07:00
xor a
ld b, a
ld c, a
.loop
2013-03-26 17:39:44 -07:00
ld a, c
cp d
jr z, .done
2013-03-26 17:39:44 -07:00
cp e
jr z, .next
2013-03-26 17:39:44 -07:00
ld a, [hli]
or b
ld b, a
ld a, [hld]
or b
ld b, a
.next
2013-03-26 17:39:44 -07:00
push bc
ld bc, PARTYMON_STRUCT_LENGTH
2013-03-26 17:39:44 -07:00
add hl, bc
pop bc
inc c
jr .loop
2013-03-26 17:39:44 -07:00
.done
2013-03-26 17:39:44 -07:00
ld a, b
and a
ret
2013-03-26 17:39:44 -07:00
; 37b1d
BattleCommand_Pursuit: ; 37b1d
; pursuit
; Double damage if the opponent is switching.
ld hl, wEnemyIsSwitching
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .ok
ld hl, wPlayerIsSwitching
.ok
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
ret z
2013-03-26 17:39:44 -07:00
ld hl, CurDamage + 1
sla [hl]
dec hl
rl [hl]
ret nc
2013-03-26 17:39:44 -07:00
ld a, $ff
ld [hli], a
ld [hl], a
ret
2013-03-26 17:39:44 -07:00
; 37b39
BattleCommand_ClearHazards: ; 37b39
2013-03-26 17:39:44 -07:00
; clearhazards
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVarAddr
bit SUBSTATUS_LEECH_SEED, [hl]
jr z, .not_leeched
res SUBSTATUS_LEECH_SEED, [hl]
2013-03-26 17:39:44 -07:00
ld hl, ShedLeechSeedText
call StdBattleTextBox
.not_leeched
2013-03-26 17:39:44 -07:00
ld hl, PlayerScreens
2015-11-08 10:27:26 -08:00
ld de, wPlayerWrapCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .got_screens_wrap
2013-04-19 23:57:11 -07:00
ld hl, EnemyScreens
2015-11-08 10:27:26 -08:00
ld de, wEnemyWrapCount
.got_screens_wrap
bit SCREENS_SPIKES, [hl]
jr z, .no_spikes
res SCREENS_SPIKES, [hl]
2013-03-26 17:39:44 -07:00
ld hl, BlewSpikesText
push de
call StdBattleTextBox
2013-03-26 17:39:44 -07:00
pop de
.no_spikes
2013-03-26 17:39:44 -07:00
ld a, [de]
and a
ret z
xor a
ld [de], a
ld hl, ReleasedByText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37b74
BattleCommand_HealMorn: ; 37b74
2013-03-26 17:39:44 -07:00
; healmorn
ld b, MORN
2015-12-23 17:46:23 -08:00
jr BattleCommand_TimeBasedHealContinue
2013-03-26 17:39:44 -07:00
; 37b78
BattleCommand_HealDay: ; 37b78
2013-03-26 17:39:44 -07:00
; healday
ld b, DAY
2015-12-23 17:46:23 -08:00
jr BattleCommand_TimeBasedHealContinue
2013-03-26 17:39:44 -07:00
; 37b7c
BattleCommand_HealNite: ; 37b7c
2013-03-26 17:39:44 -07:00
; healnite
ld b, NITE
; fallthrough
; 37b7e
2015-12-23 17:46:23 -08:00
BattleCommand_TimeBasedHealContinue: ; 37b7e
2013-03-26 17:39:44 -07:00
; 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]
2013-03-26 17:39:44 -07:00
and a
jr nz, .Weather
ld a, [TimeOfDay]
cp b
jr z, .Weather
2015-12-23 17:46:23 -08:00
dec c ; double
2013-03-26 17:39:44 -07:00
.Weather:
2013-03-26 17:39:44 -07:00
ld a, [Weather]
and a
jr z, .Heal
; x2 in sun
; /2 in rain/sandstorm
inc c
cp WEATHER_SUN
jr z, .Heal
dec c
2015-12-26 18:59:03 -08:00
dec c
2013-03-26 17:39:44 -07:00
.Heal:
2013-03-26 17:39:44 -07:00
ld b, 0
ld hl, .Multipliers
add hl, bc
2015-12-26 18:59:03 -08:00
add hl, bc
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld h, [hl]
ld l, a
ld a, BANK(GetMaxHP)
rst FarCall
call AnimateCurrentMove
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-26 17:39:44 -07:00
2015-11-06 19:36:06 -08:00
callab RestoreHP
2013-03-26 17:39:44 -07:00
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-05-02 21:22:28 -07:00
call UpdateUserInParty
2013-03-26 17:39:44 -07:00
; 'regained health!'
ld hl, RegainedHealthText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
.Full:
call AnimateFailedMove
2013-03-26 17:39:44 -07:00
; 'hp is full!'
ld hl, HPIsFullText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
.Multipliers:
2013-03-26 17:39:44 -07:00
dw GetEighthMaxHP
dw GetQuarterMaxHP
dw GetHalfMaxHP
dw GetMaxHP
; 37be8
BattleCommand_HiddenPower: ; 37be8
2013-03-26 22:52:04 -07:00
; hiddenpower
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
ret nz
2014-01-05 04:49:35 -08:00
callba HiddenPowerDamage
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 37bf4
BattleCommand_StartRain: ; 37bf4
2013-03-26 17:39:44 -07:00
; startrain
ld a, WEATHER_RAIN
ld [Weather], a
ld a, 5
ld [WeatherCount], a
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, DownpourText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37c07
BattleCommand_StartSun: ; 37c07
2013-03-26 17:39:44 -07:00
; startsun
ld a, WEATHER_SUN
ld [Weather], a
ld a, 5
ld [WeatherCount], a
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, SunGotBrightText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37c1a
BattleCommand_BellyDrum: ; 37c1a
2013-03-26 17:39:44 -07:00
; bellydrum
2015-11-09 13:41:09 -08:00
; This command is buggy because it raises the user's attack
; before checking that it has enough HP to use the move.
; Swap the order of these two blocks to fix.
call BattleCommand_AttackUp2
2013-03-26 17:39:44 -07:00
ld a, [AttackMissed]
and a
2015-11-09 13:41:09 -08:00
jr nz, .failed
2013-10-01 17:47:54 -07:00
callab GetHalfMaxHP
2015-11-09 13:41:09 -08:00
callab CheckUserHasEnoughHP
jr nc, .failed
2013-03-26 17:39:44 -07:00
push bc
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
pop bc
2015-11-06 17:55:16 -08:00
callab SubtractHPFromUser
2013-05-02 21:22:28 -07:00
call UpdateUserInParty
ld a, 5
2015-11-09 13:41:09 -08:00
.max_attack_loop
2013-03-26 17:39:44 -07:00
push af
call BattleCommand_AttackUp2
2013-03-26 17:39:44 -07:00
pop af
dec a
2015-11-09 13:41:09 -08:00
jr nz, .max_attack_loop
2013-03-26 17:39:44 -07:00
ld hl, BellyDrumText
jp StdBattleTextBox
2015-11-09 13:41:09 -08:00
.failed
call AnimateFailedMove
jp PrintButItFailed
2013-03-26 17:39:44 -07:00
; 37c55
BattleCommand_PsychUp: ; 37c55
2013-03-26 17:39:44 -07:00
; psychup
ld hl, EnemyStatLevels
ld de, PlayerStatLevels
ld a, [hBattleTurn]
and a
jr z, .pointers_correct
2015-11-09 13:41:09 -08:00
; It's the enemy's turn, so swap the pointers.
2013-03-26 17:39:44 -07:00
push hl
ld h, d
ld l, e
pop de
2015-11-09 13:41:09 -08:00
.pointers_correct
2013-03-26 17:39:44 -07:00
push hl
2015-11-09 13:41:09 -08:00
ld b, NUM_LEVEL_STATS
; If any of the enemy's stats is modified from its base level,
; the move succeeds. Otherwise, it fails.
.loop
2013-03-26 17:39:44 -07:00
ld a, [hli]
2015-11-09 13:41:09 -08:00
cp BASE_STAT_LEVEL
jr nz, .break
2013-03-26 17:39:44 -07:00
dec b
jr nz, .loop
2013-03-26 17:39:44 -07:00
pop hl
call AnimateFailedMove
jp PrintButItFailed
2015-11-09 13:41:09 -08:00
.break
2013-03-26 17:39:44 -07:00
pop hl
2015-11-09 13:41:09 -08:00
ld b, NUM_LEVEL_STATS
.loop2
2013-03-26 17:39:44 -07:00
ld a, [hli]
ld [de], a
inc de
dec b
jr nz, .loop2
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr nz, .calc_enemy_stats
2015-11-06 17:55:16 -08:00
call CalcPlayerStats
jr .merge
2015-11-09 13:41:09 -08:00
.calc_enemy_stats
2015-11-06 17:55:16 -08:00
call CalcEnemyStats
2015-11-09 13:41:09 -08:00
.merge
call AnimateCurrentMove
2013-03-26 17:39:44 -07:00
ld hl, CopiedStatsText
jp StdBattleTextBox
2013-03-26 17:39:44 -07:00
; 37c95
BattleCommand_MirrorCoat: ; 37c95
2013-03-26 17:39:44 -07:00
; mirrorcoat
2014-01-05 05:24:27 -08:00
ld a, 1
2013-03-26 17:39:44 -07:00
ld [AttackMissed], a
2014-01-05 05:24:27 -08:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
and a
ret z
2014-01-05 05:24:27 -08:00
2013-03-26 17:39:44 -07:00
ld b, a
2013-12-30 20:32:37 -08:00
callab GetMoveEffect
2013-03-26 17:39:44 -07:00
ld a, b
2014-01-05 05:24:27 -08:00
cp EFFECT_MIRROR_COAT
2013-03-26 17:39:44 -07:00
ret z
2014-01-05 05:24:27 -08:00
call BattleCommand_ResetTypeMatchup
2015-11-06 17:55:16 -08:00
ld a, [wTypeMatchup]
2013-03-26 17:39:44 -07:00
and a
ret z
2014-01-05 05:24:27 -08:00
2015-11-09 13:41:09 -08:00
call CheckOpponentWentFirst
2013-03-26 17:39:44 -07:00
ret z
2014-01-05 05:24:27 -08:00
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP
call GetBattleVar
2013-03-26 17:39:44 -07:00
dec a
ld de, StringBuffer1
call GetMoveData
2014-01-05 05:24:27 -08:00
ld a, [StringBuffer1 + 2]
2013-03-26 17:39:44 -07:00
and a
ret z
2014-01-05 05:24:27 -08:00
ld a, [StringBuffer1 + 3]
2014-01-05 05:24:27 -08:00
cp SPECIAL
2013-03-26 17:39:44 -07:00
ret c
2014-01-05 05:24:27 -08:00
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hli]
or [hl]
ret z
2014-01-05 05:24:27 -08:00
2013-03-26 17:39:44 -07:00
ld a, [hl]
add a
ld [hld], a
ld a, [hl]
adc a
ld [hl], a
2014-01-05 05:24:27 -08:00
jr nc, .capped
2013-03-26 17:39:44 -07:00
ld a, $ff
ld [hli], a
ld [hl], a
2014-01-05 05:24:27 -08:00
.capped
2013-03-26 17:39:44 -07:00
xor a
ld [AttackMissed], a
ret
2013-03-26 17:39:44 -07:00
; 37ce6
BattleCommand_DoubleMinimizeDamage: ; 37ce6
2013-03-26 22:52:04 -07:00
; doubleminimizedamage
2013-03-26 17:39:44 -07:00
ld hl, wEnemyMinimized
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .ok
ld hl, wPlayerMinimized
.ok
2013-03-26 17:39:44 -07:00
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
2013-03-26 17:39:44 -07:00
; 37d02
BattleCommand_SkipSunCharge: ; 37d02
2015-11-09 13:41:09 -08:00
; mimicsuncharge
2013-03-26 17:39:44 -07:00
ld a, [Weather]
cp WEATHER_SUN
ret nz
ld b, charge_command
2013-03-26 22:52:04 -07:00
jp SkipToBattleCommand
2013-03-26 17:39:44 -07:00
; 37d0d
BattleCommand_CheckFutureSight: ; 37d0d
2013-03-26 22:52:04 -07:00
; checkfuturesight
2015-11-08 10:27:26 -08:00
ld hl, wPlayerFutureSightCount
ld de, wPlayerFutureSightDamage
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
2013-03-26 22:52:04 -07:00
jr z, .ok
2015-11-08 10:27:26 -08:00
ld hl, wEnemyFutureSightCount
ld de, wEnemyFutureSightDamage
2013-03-26 22:52:04 -07:00
.ok
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
ret z
2013-03-26 22:52:04 -07:00
cp 1
2013-03-26 17:39:44 -07:00
ret nz
2013-03-26 22:52:04 -07:00
ld [hl], 0
2013-03-26 17:39:44 -07:00
ld a, [de]
inc de
ld [CurDamage], a
ld a, [de]
ld [CurDamage + 1], a
ld b, futuresight_command
2013-03-26 22:52:04 -07:00
jp SkipToBattleCommand
2013-03-26 17:39:44 -07:00
; 37d34
BattleCommand_FutureSight: ; 37d34
2013-03-26 17:39:44 -07:00
; futuresight
2015-11-09 13:41:09 -08:00
call CheckUserIsCharging
jr nz, .AlreadyChargingFutureSight
2013-03-26 17:39:44 -07:00
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-26 17:39:44 -07:00
ld b, a
ld a, BATTLE_VARS_LAST_COUNTER_MOVE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld [hl], b
ld a, BATTLE_VARS_LAST_MOVE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
ld [hl], b
.AlreadyChargingFutureSight:
2015-11-08 10:27:26 -08:00
ld hl, wPlayerFutureSightCount
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .GotFutureSightCount
2015-11-08 10:27:26 -08:00
ld hl, wEnemyFutureSightCount
.GotFutureSightCount:
2013-03-26 17:39:44 -07:00
ld a, [hl]
and a
jr nz, .failed
ld a, 4
2013-03-26 17:39:44 -07:00
ld [hl], a
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
call BattleCommand_MoveDelay
2013-03-26 17:39:44 -07:00
ld hl, ForesawAttackText
call StdBattleTextBox
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
ld de, wPlayerFutureSightDamage
2013-03-26 17:39:44 -07:00
ld a, [hBattleTurn]
and a
jr z, .StoreDamage
ld de, wEnemyFutureSightDamage
.StoreDamage:
2013-03-26 17:39:44 -07:00
ld hl, CurDamage
ld a, [hl]
ld [de], a
ld [hl], 0
2013-03-26 17:39:44 -07:00
inc hl
inc de
ld a, [hl]
ld [de], a
ld [hl], 0
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
.failed
2013-03-26 17:39:44 -07:00
pop bc
call ResetDamage
call AnimateFailedMove
call PrintButItFailed
2013-03-26 17:39:44 -07:00
jp EndMoveEffect
2013-03-26 17:39:44 -07:00
; 37d94
BattleCommand_ThunderAccuracy: ; 37d94
2013-03-26 17:39:44 -07:00
; thunderaccuracy
ld a, BATTLE_VARS_MOVE_TYPE
call GetBattleVarAddr
2013-03-26 17:39:44 -07:00
inc hl
ld a, [Weather]
cp WEATHER_RAIN
jr z, .rain
2013-03-26 17:39:44 -07:00
cp WEATHER_SUN
ret nz
ld [hl], 50 percent + 1
2013-03-26 17:39:44 -07:00
ret
.rain
ld [hl], 100 percent
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 37daa
CheckHiddenOpponent: ; 37daa
ld a, BATTLE_VARS_SUBSTATUS3_OPP
call GetBattleVar
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
2013-03-26 17:39:44 -07:00
ret
2013-03-26 17:39:44 -07:00
; 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 GetItemHeldEffect
2013-03-26 17:39:44 -07:00
; 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 GetItemHeldEffect
2013-03-26 17:39:44 -07:00
; 37dd0
GetItemHeldEffect: ; 37dd0
2013-03-26 17:39:44 -07:00
; Return the effect of item b in bc.
ld a, b
and a
ret z
push hl
2013-04-29 23:01:54 -07:00
ld hl, ItemAttributes + 2
2013-03-26 17:39:44 -07:00
dec a
ld c, a
ld b, 0
2013-04-29 23:01:54 -07:00
ld a, Item2Attributes - Item1Attributes
2013-03-26 17:39:44 -07:00
call AddNTimes
2013-04-29 23:01:54 -07:00
ld a, BANK(ItemAttributes)
2013-03-26 17:39:44 -07:00
call GetFarHalfword
ld b, l
ld c, h
pop hl
ret
2013-03-26 17:39:44 -07:00
; 37de9
2015-11-06 17:55:16 -08:00
AnimateCurrentMoveEitherSide: ; 37de9
2013-03-27 13:19:51 -07:00
push hl
push de
push bc
2015-11-06 17:55:16 -08:00
ld a, [wKickCounter]
2013-03-27 13:19:51 -07:00
push af
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2013-03-27 13:19:51 -07:00
pop af
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2015-11-09 13:41:09 -08:00
call PlayDamageAnim
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
2013-03-27 13:19:51 -07:00
pop bc
pop de
pop hl
ret
2013-03-27 13:19:51 -07:00
; 37e01
AnimateCurrentMove: ; 37e01
2013-03-27 13:19:51 -07:00
push hl
push de
push bc
2015-11-06 17:55:16 -08:00
ld a, [wKickCounter]
2013-03-27 13:19:51 -07:00
push af
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
2013-03-27 13:19:51 -07:00
pop af
2015-11-06 17:55:16 -08:00
ld [wKickCounter], a
2015-11-09 13:41:09 -08:00
call LoadMoveAnim
2015-11-06 13:42:38 -08:00
call BattleCommand_RaiseSub
2013-03-27 13:19:51 -07:00
pop bc
pop de
pop hl
ret
2013-03-27 13:19:51 -07:00
; 37e19
2015-11-09 13:41:09 -08:00
PlayDamageAnim: ; 37e19
2013-03-27 13:19:51 -07:00
xor a
ld [FXAnimIDHi], a
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-27 13:19:51 -07:00
and a
ret z
ld [FXAnimIDLo], a
ld a, [hBattleTurn]
and a
2015-11-09 13:41:09 -08:00
ld a, BATTLEANIM_ENEMY_DAMAGE
2015-11-06 17:55:16 -08:00
jr z, .player
2015-11-09 13:41:09 -08:00
ld a, BATTLEANIM_PLAYER_DAMAGE
2013-03-27 13:19:51 -07:00
2015-11-06 17:55:16 -08:00
.player
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-27 13:19:51 -07:00
2015-11-06 17:55:16 -08:00
jp PlayUserBattleAnim
2013-03-27 13:19:51 -07:00
; 37e36
2015-11-09 13:41:09 -08:00
LoadMoveAnim: ; 37e36
2013-03-27 13:19:51 -07:00
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-27 13:19:51 -07:00
ld [FXAnimIDHi], a
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
2013-03-27 13:19:51 -07:00
and a
ret z
; fallthrough
; 37e44
2015-11-09 13:41:09 -08:00
LoadAnim: ; 37e44
2013-03-27 13:19:51 -07:00
ld [FXAnimIDLo], a
; fallthrough
; 37e47
2015-11-06 17:55:16 -08:00
PlayUserBattleAnim: ; 37e47
2013-03-27 13:19:51 -07:00
push hl
push de
push bc
2013-12-03 21:44:45 -08:00
callab PlayBattleAnim
2013-03-27 13:19:51 -07:00
pop bc
pop de
pop hl
ret
2013-03-27 13:19:51 -07:00
; 37e54
2015-11-06 17:55:16 -08:00
PlayOpponentBattleAnim: ; 37e54
2013-03-27 13:19:51 -07:00
ld a, e
ld [FXAnimIDLo], a
ld a, d
ld [FXAnimIDHi], a
xor a
2015-12-23 11:00:29 -08:00
ld [wNumHits], a
2013-03-27 13:19:51 -07:00
push hl
push de
push bc
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-27 13:19:51 -07:00
2013-12-03 21:44:45 -08:00
callab PlayBattleAnim
2013-03-27 13:19:51 -07:00
2015-10-10 04:45:39 -07:00
call BattleCommand_SwitchTurn
2013-03-27 13:19:51 -07:00
pop bc
pop de
pop hl
ret
2013-03-27 13:19:51 -07:00
; 37e73
2013-12-31 00:25:38 -08:00
CallBattleCore: ; 37e73
ld a, BANK(BattleCore)
2013-03-27 13:19:51 -07:00
rst FarCall
ret
2013-03-27 13:19:51 -07:00
; 37e77
AnimateFailedMove: ; 37e77
2015-11-06 13:42:38 -08:00
call BattleCommand_LowerSub
call BattleCommand_MoveDelay
2015-11-06 13:42:38 -08:00
jp BattleCommand_RaiseSub
2013-03-27 13:19:51 -07:00
; 37e80
2013-03-26 17:39:44 -07:00
BattleCommand_MoveDelay: ; 37e80
; movedelay
2013-03-26 17:39:44 -07:00
; Wait 40 frames.
ld c, 40
jp DelayFrames
2013-03-26 17:39:44 -07:00
; 37e85
BattleCommand_ClearText: ; 37e85
2013-03-26 22:52:04 -07:00
; cleartext
2013-03-26 17:39:44 -07:00
; Used in multi-hit moves.
ld hl, .text
jp BattleTextBox
2013-03-26 17:39:44 -07:00
.text
db "@"
; 37e8c
2013-03-26 22:52:04 -07:00
SkipToBattleCommand: ; 37e8c
; Skip over commands until reaching command b.
ld a, [BattleScriptBufferLoc + 1]
ld h, a
ld a, [BattleScriptBufferLoc]
ld l, a
2015-11-09 13:41:09 -08:00
.loop
2013-03-26 22:52:04 -07:00
ld a, [hli]
cp b
2015-11-09 13:41:09 -08:00
jr nz, .loop
2013-03-26 22:52:04 -07:00
ld a, h
ld [BattleScriptBufferLoc + 1], a
ld a, l
ld [BattleScriptBufferLoc], a
ret
2013-03-26 22:52:04 -07:00
; 37ea1
2013-03-27 13:19:51 -07:00
GetMoveAttr: ; 37ea1
; Assuming hl = Moves + x, return attribute x of move a.
push bc
ld bc, MOVE_LENGTH
2013-03-27 13:19:51 -07:00
call AddNTimes
call GetMoveByte
pop bc
ret
2013-03-27 13:19:51 -07:00
; 37ead
2013-03-26 17:39:44 -07:00
GetMoveData: ; 37ead
2013-03-27 13:19:51 -07:00
; Copy move struct a to de.
2013-03-26 17:39:44 -07:00
ld hl, Moves
ld bc, MOVE_LENGTH
2013-03-26 17:39:44 -07:00
call AddNTimes
ld a, Bank(Moves)
jp FarCopyBytes
2013-03-26 17:39:44 -07:00
; 37ebb
2013-03-27 13:19:51 -07:00
GetMoveByte: ; 37ebb
ld a, BANK(Moves)
jp GetFarByte
2013-03-27 13:19:51 -07:00
; 37ec0
2015-11-09 13:41:09 -08:00
DisappearUser: ; 37ec0
callba _DisappearUser
2013-03-27 13:19:51 -07:00
ret
2013-03-27 13:19:51 -07:00
; 37ec7
2015-11-09 13:41:09 -08:00
AppearUserLowerSub: ; 37ec7
callba _AppearUserLowerSub
2013-03-27 13:19:51 -07:00
ret
2013-03-27 13:19:51 -07:00
; 37ece
2015-11-09 13:41:09 -08:00
AppearUserRaiseSub: ; 37ece
callba _AppearUserRaiseSub
2013-03-27 13:19:51 -07:00
ret
2013-03-27 13:19:51 -07:00
; 37ed5
2015-11-06 19:36:06 -08:00
_CheckBattleScene: ; 37ed5
; Checks the options. Returns carry if battle animations are disabled.
2013-03-27 13:19:51 -07:00
push hl
push de
push bc
2013-12-09 13:20:19 -08:00
callba CheckBattleScene
2013-03-27 13:19:51 -07:00
pop bc
pop de
pop hl
ret
2013-03-27 13:19:51 -07:00
; 37ee2