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