From 3e6c37fe5242d78ba915192a03e183dfbf031110 Mon Sep 17 00:00:00 2001 From: yenatch Date: Tue, 26 Mar 2013 20:39:44 -0400 Subject: [PATCH] Move effect commands dump --- battle/effect_command_pointers.asm | 177 + battle/effect_commands.asm | 10511 +++++++++++++++++++++++++++ main.asm | 550 +- wram.asm | 4 +- 4 files changed, 11222 insertions(+), 20 deletions(-) create mode 100644 battle/effect_command_pointers.asm create mode 100644 battle/effect_commands.asm diff --git a/battle/effect_command_pointers.asm b/battle/effect_command_pointers.asm new file mode 100644 index 000000000..a8f382693 --- /dev/null +++ b/battle/effect_command_pointers.asm @@ -0,0 +1,177 @@ +; 3fd28 + dw BattleCommand01 ; 34084 + dw BattleCommand02 ; 343db + dw BattleCommand03 ; 34541 + dw BattleCommand04 ; 34555 + dw BattleCommand05 ; 34631 + dw BattleCommand06 ; 352dc + dw BattleCommand07 ; 346d2 + dw BattleCommand08 ; 34cfd + dw BattleCommand09 ; 34d32 + dw BattleCommand0a ; 34eee + dw BattleCommand0b ; 34f60 + dw BattleCommand0c ; 35004 + dw BattleCommand0d ; 35023 + dw BattleCommand0e ; 3505e + dw BattleCommand0f ; 35175 + dw BattleCommand10 ; 351ad + dw BattleCommand11 ; 351c0 + dw BattleCommand12 ; 35250 + dw BattleCommand13 ; 35eee + dw BattleCommand14 ; 35e5c + dw BattleCommand15 ; 35fff + dw BattleCommand16 ; 36008 + dw BattleCommand17 ; 3608c + dw BattleCommand18 ; 36102 + dw BattleCommand19 ; 36165 + dw BattleCommand1a ; 37380 + dw BattleCommand1b ; 373c9 + dw BattleCommand1c ; 361e4 + dw BattleCommand1d ; 362e3 + dw BattleCommand1e ; 3705c + dw BattleCommand1f ; 3707f + dw BattleCommand20 ; 3710e + dw BattleCommand21 ; 36671 + dw BattleCommand22 ; 366e5 + dw BattleCommand23 ; 3680f + dw BattleCommand24 ; 369b6 + dw BattleCommand25 ; 36aa0 + dw BattleCommand26 ; 36af3 + dw BattleCommand27 ; 36cb2 + dw BattleCommand28 ; 36c7e + dw BattleCommand29 ; 36c98 + dw BattleCommand2a ; 36d3b + dw BattleCommand2b ; 36d1d + dw BattleCommand2c ; 3713e + dw BattleCommand2d ; 371cd + dw BattleCommand2e ; 372fc + dw BattleCommand2f ; 35f2c + dw BattleCommand30 ; 36dc7 + dw BattleCommand31 ; 36e7c + dw BattleCommand32 ; 36f0b + dw BattleCommand33 ; 36f46 + dw BattleCommand34 ; 37418 + dw BattleCommand35 ; 36f9d + dw BattleCommand36 ; 36fe1 + dw BattleCommand37 ; 36fed + dw BattleCommand38 ; 37e85 + dw BattleCommand39 ; 36b4d + dw BattleCommand3a ; 36b3a + dw BattleCommand3b ; 36c2d + dw BattleCommand3c ; 36c2c + dw BattleCommand3d ; 36751 + dw BattleCommand3e ; 3671a + dw BattleCommand3f ; 35726 + dw BattleCommand40 ; 35813 + dw BattleCommand41 ; 35864 + dw BattleCommand42 ; 35926 + dw BattleCommand43 ; 359d0 + dw BattleCommand44 ; 359e6 + dw BattleCommand45 ; 35a53 + dw BattleCommand46 ; 35a74 + dw BattleCommand47 ; 35b16 + dw BattleCommand48 ; 35b33 + dw BattleCommand49 ; 35bff + dw BattleCommand4a ; 35c0f + dw BattleCommand4b ; 35c94 + dw BattleCommand4c ; 35cc9 + dw BattleCommand4d ; 36ac9 + dw BattleCommand4e ; 346b2 + dw BattleCommand4f ; 346cd + dw BattleCommand50 ; 37492 + dw BattleCommand51 ; 37517 + dw BattleCommand52 ; 37536 + dw BattleCommand53 ; 37563 + dw BattleCommand54 ; 37588 + dw BattleCommand55 ; 37618 + dw BattleCommand56 ; 37683 + dw BattleCommand57 ; 376a0 + dw BattleCommand58 ; 376c2 + dw BattleCommand59 ; 376f8 + dw BattleCommand5a ; 3766f + dw BattleCommand5b ; 37718 + dw BattleCommand5c ; 37734 + dw BattleCommand5d ; 37791 + dw BattleCommand5e ; 37792 + dw BattleCommand5f ; 377ce + dw BattleCommand60 ; 3784b + dw BattleCommand61 ; 37874 + dw BattleCommand62 ; 35612 + dw BattleCommand63 ; 3790e + dw BattleCommand64 ; 37939 + dw BattleCommand65 ; 37972 + dw BattleCommand66 ; 37991 + dw BattleCommand67 ; 379c9 + dw BattleCommand68 ; 37b1d + dw BattleCommand69 ; 37b39 + dw BattleCommand6a ; 37b74 + dw BattleCommand6b ; 37b78 + dw BattleCommand6c ; 37b7c + dw BattleCommand6d ; 37be8 + dw BattleCommand6e ; 37bf4 + dw BattleCommand6f ; 37c07 + dw BattleCommand70 ; 361ac + dw BattleCommand71 ; 361b0 + dw BattleCommand72 ; 361b4 + dw BattleCommand73 ; 361b8 + dw BattleCommand74 ; 361bc + dw BattleCommand75 ; 361c0 + dw BattleCommand76 ; 361c4 + dw BattleCommand77 ; 361c8 + dw BattleCommand78 ; 361cc + dw BattleCommand79 ; 361d0 + dw BattleCommand7a ; 361d4 + dw BattleCommand7b ; 361d8 + dw BattleCommand7c ; 361dc + dw BattleCommand7d ; 361e0 + dw BattleCommand7e ; 362ad + dw BattleCommand7f ; 362b1 + dw BattleCommand80 ; 362b5 + dw BattleCommand81 ; 362b9 + dw BattleCommand82 ; 362bd + dw BattleCommand83 ; 362c1 + dw BattleCommand84 ; 362c5 + dw BattleCommand85 ; 362c9 + dw BattleCommand86 ; 362cd + dw BattleCommand87 ; 362d1 + dw BattleCommand88 ; 362d5 + dw BattleCommand89 ; 362d9 + dw BattleCommand8a ; 362dd + dw BattleCommand8b ; 362e1 + dw BattleCommand8c ; 363b8 + dw BattleCommand8d ; 363e9 + dw BattleCommand8e ; 3644c + dw BattleCommand8f ; 3646a + dw BattleCommand90 ; 34ecc + dw BattleCommand91 ; 34fdb + dw BattleCommand92 ; 34fd1 + dw BattleCommand93 ; 34ffd + dw BattleCommand94 ; 36a82 + dw BattleCommand95 ; 37c1a + dw BattleCommand96 ; 37c55 + dw BattleCommand97 ; 36f1d + dw BattleCommand98 ; 36f25 + dw BattleCommand99 ; 36f2f + dw BattleCommand9a ; 37c95 + dw BattleCommand9b ; 37d0d + dw BattleCommand9c ; 37d34 + dw BattleCommand9d ; 37ce6 + dw BattleCommand9e ; 37d02 + dw BattleCommand9f ; 37d94 + dw BattleCommanda0 ; 36778 + dw BattleCommanda1 ; 35461 + dw BattleCommanda2 ; 3527b + dw BattleCommanda3 ; 34833 + dw BattleCommanda4 ; 36500 + dw BattleCommanda5 ; 35165 + dw BattleCommanda6 ; 365af + dw BattleCommanda7 ; 365c3 + dw BattleCommanda8 ; 355b5 + dw BattleCommanda9 ; 355d5 + dw BattleCommandaa ; 37e80 + dw BattleCommandab ; 34f57 + dw BattleCommandac ; 3658f + dw BattleCommandad ; 351a5 + dw BattleCommandae ; 35197 + dw BattleCommandaf ; 365a7 +; 3fe86 diff --git a/battle/effect_commands.asm b/battle/effect_commands.asm new file mode 100644 index 000000000..69d2f9084 --- /dev/null +++ b/battle/effect_commands.asm @@ -0,0 +1,10511 @@ +DoPlayerTurn: ; 34000 + call SetPlayerTurn + + ld a, [$d0ec] + and a + ret nz + + jr DoTurn +; 3400a + + +DoEnemyTurn: ; 3400a + call SetEnemyTurn + + ld a, [InLinkBattle] + and a + jr z, DoTurn + + ld a, [$d430] + cp $e + jr z, DoTurn + cp $4 + ret nc + + ; fallthrough +; 3401d + + +DoTurn: ; 3401d +; Read in and execute the user's move effects for this turn. + + xor a + ld [$c6b4], a + +; Effect command checkturn is called for every move. + call CheckTurn + + ld a, [$c6b4] + and a + ret nz + + call UpdateMoveData +; 3402c + + +DoMove: ; 3402c +; Get the user's move effect. + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + 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 [BattleScriptBufferLoc], a + ld a, h + ld [BattleScriptBufferLoc + 1], a + +.ReadMoveEffectCommand + +; ld a, [BattleScriptBufferLoc++] + ld a, [BattleScriptBufferLoc] + ld l, a + ld a, [BattleScriptBufferLoc + 1] + ld h, a + + ld a, [hli] + + push af + ld a, l + ld [BattleScriptBufferLoc], a + ld a, h + ld [BattleScriptBufferLoc + 1], a + pop af + +; $fe is used to terminate branches without ending the read cycle. + cp $fe + 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: +BattleCommand01: ; 34084 +; checkturn + +; Repurposed as hardcoded turn handling. Useless as a command. + +; Move $ff immediately ends the turn. + ld a, BATTLE_VARS_MOVE + call CleanGetBattleVarPair + inc a + jp z, Function0x34385 + + xor a + ld [AttackMissed], a + ld [$c70d], a + ld [$c689], a + ld [AlreadyDisobeyed], a + ld [$c6fb], a + ld [$c73e], a + + ld a, 10 ; 1.0 + ld [TypeModifier], a + + ld a, [hBattleTurn] + and a + jp nz, CheckEnemyTurn + + +CheckPlayerTurn: + +; check recharge + ld hl, PlayerSubStatus4 + bit 5, [hl] + jr z, .CheckSleep + res 5, [hl] + +; 'must recharge!' + ld hl, MustRechargeText + call FarBattleTextBox + + call CantMove + jp Function0x34385 + + +.CheckSleep + ld hl, BattleMonStatus + ld a, [hl] + and $7 + jr z, .CheckFrozen + dec a + ld [BattleMonStatus], a + and $7 + jr z, .WokeUp + xor a + ld [$cfca], a + ld de, ANIM_SLEEP + call FarPlayBattleAnimation + jr .FastAsleep + + +.WokeUp +; 'woke up!' + ld hl, WokeUpText + call FarBattleTextBox + + call CantMove + call $399c + ld hl, $5f48 + call $7e73 + ld a, $1 + ld [$ffd4], a + ld hl, PlayerSubStatus1 + res 0, [hl] + jr .CheckFrozen + + +.FastAsleep +; 'fast asleep!' + ld hl, FastAsleepText + call FarBattleTextBox + +; Snore and Sleep Talk bypass sleep. + ld a, [CurPlayerMove] + cp SNORE + jr z, .CheckFrozen + cp SLEEP_TALK + jr z, .CheckFrozen + call CantMove + jp Function0x34385 + + +.CheckFrozen + ld hl, BattleMonStatus + bit 5, [hl] + jr z, .CheckFlinch + +; Flame Wheel and Sacred Fire thaw the user. + ld a, [CurPlayerMove] + cp FLAME_WHEEL + jr z, .CheckFlinch + cp SACRED_FIRE + jr z, .CheckFlinch + +; 'frozen solid!' + ld hl, FrozenSolidText + call FarBattleTextBox + + call CantMove + jp Function0x34385 + + +.CheckFlinch + ld hl, PlayerSubStatus3 + bit 3, [hl] ; flinch + jr z, .CheckDisabled + + res 3, [hl] + +; 'flinched!' + ld hl, FlinchedText + call FarBattleTextBox + + call CantMove + jp Function0x34385 + + +.CheckDisabled + ld hl, PlayerDisableCount + ld a, [hl] + and a + jr z, .CheckConfused + dec a + ld [hl], a + and $f + jr nz, .CheckConfused + ld [hl], a + ld [DisabledMove], a + +; 'disabled no more!' + ld hl, DisabledNoMoreText + call FarBattleTextBox + + +.CheckConfused + ld a, [PlayerSubStatus3] + add a + jr nc, .CheckAttract + ld hl, PlayerConfuseCount + dec [hl] + jr nz, .Confused + + ld hl, PlayerSubStatus3 + res 7, [hl] + +; 'confused no more!' + ld hl, ConfusedNoMoreText + call FarBattleTextBox + + jr .CheckAttract + + +.Confused +; 'confused!' + ld hl, IsConfusedText + call FarBattleTextBox + + xor a + ld [$cfca], a + ld de, ANIM_CONFUSED + call FarPlayBattleAnimation + +; 50% chance of hitting itself + call FarBattleRNG + cp $80 + jr nc, .CheckAttract + + ld hl, PlayerSubStatus3 + ld a, [hl] + and $80 + ld [hl], a + + call HitConfusion + + call CantMove + jp Function0x34385 + + +.CheckAttract + ld a, [PlayerSubStatus1] + add a ; check bit 7 + jr nc, .CheckDisabledMove + +; 'in love with' + ld hl, InLoveWithText + call FarBattleTextBox + + xor a + ld [$cfca], a + + ld de, ANIM_INLOVE + call FarPlayBattleAnimation + +; 50% chance of infatuation + call FarBattleRNG + cp $80 + jr c, .CheckDisabledMove + +; 'infatuation kept it from attacking!' + ld hl, InfatuationText + call FarBattleTextBox + + call CantMove + jp Function0x34385 + + +.CheckDisabledMove +; We can't disable a move that doesn't exist. + ld a, [DisabledMove] + and a + jr z, .CheckParalyzed + +; Are we using the disabled move? + ld hl, CurPlayerMove + cp [hl] + jr nz, .CheckParalyzed + + call MoveDisabled + call CantMove + jp Function0x34385 + + +.CheckParalyzed + ld hl, BattleMonStatus + bit 6, [hl] + ret z + +; 25% chance to be fully paralyzed + call FarBattleRNG + cp $3f + ret nc + +; 'fully paralyzed!' + ld hl, FullyParalyzedText + call FarBattleTextBox + call CantMove + jp Function0x34385 +; 341f0 + + +CantMove: ; 341f0 + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + res 6, [hl] + + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + ld a, [hl] + and $ec + ld [hl], a + + call Function0x377be + + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + cp FLY + jr z, .asm_3420f + + cp $5b + ret nz + +.asm_3420f + res 5, [hl] + res 6, [hl] + jp $7ece +; 34216 + + + +Function0x34216: ; 34216 + call $4ffd + call CantMove + jp $4ffd +; 3421f + + + +CheckEnemyTurn: ; 3421f + +; check recharge + ld hl, EnemySubStatus4 + bit 5, [hl] + jr z, .CheckSleep + res 5, [hl] + +; 'must recharge!' + ld hl, MustRechargeText + call FarBattleTextBox + call CantMove + jp Function0x34385 + + +.CheckSleep + ld hl, EnemyMonStatus + ld a, [hl] + and $7 + jr z, .CheckFrozen + dec a + ld [EnemyMonStatus], a + and a + jr z, .WokeUp + +; 'fast asleep!' + ld hl, FastAsleepText + call FarBattleTextBox + xor a + ld [$cfca], a + ld de, ANIM_SLEEP + call FarPlayBattleAnimation + jr .FastAsleep + + +.WokeUp +; 'woke up!' + ld hl, WokeUpText + call FarBattleTextBox + call CantMove + call $39b0 + ld hl, $6036 + call $7e73 + ld a, $1 + ld [$ffd4], a + ld hl, EnemySubStatus1 + res 0, [hl] + jr .CheckFrozen + + +.FastAsleep +; Snore and Sleep Talk bypass sleep. + ld a, [CurEnemyMove] + cp SNORE + jr z, .CheckFrozen + cp SLEEP_TALK + jr z, .CheckFrozen + call CantMove + jp Function0x34385 + + +.CheckFrozen + ld hl, EnemyMonStatus + bit 5, [hl] + jr z, .CheckFlinch + ld a, [CurEnemyMove] + cp $ac + jr z, .CheckFlinch + cp $dd + jr z, .CheckFlinch + +; 'frozen solid!' + ld hl, FrozenSolidText + call FarBattleTextBox + call CantMove + jp Function0x34385 + + +.CheckFlinch + ld hl, EnemySubStatus3 + bit 3, [hl] + jr z, .CheckDisabled + + res 3, [hl] + +; 'flinched!' + ld hl, FlinchedText + call FarBattleTextBox + + call CantMove + jp Function0x34385 + + +.CheckDisabled + ld hl, EnemyEncoreCount + ld a, [hl] + and a + jr z, .CheckConfused + + dec a + ld [hl], a + and $f + jr nz, .CheckConfused + + ld [hl], a + ld [EnemyEncoredMove], a + +; 'disabled no more!' + ld hl, DisabledNoMoreText + call FarBattleTextBox + + +.CheckConfused + ld a, [EnemySubStatus3] + add a + jr nc, .CheckAttract + + ld hl, $c67b + dec [hl] + jr nz, .Confused + + ld hl, EnemySubStatus3 + res 7, [hl] + +; 'confused no more!' + ld hl, ConfusedNoMoreText + call FarBattleTextBox + + jr .CheckAttract + + +.Confused +; 'confused!' + ld hl, IsConfusedText + call FarBattleTextBox + + xor a + ld [$cfca], a + ld de, ANIM_CONFUSED + call FarPlayBattleAnimation + +; 50% chance of hitting itself + call FarBattleRNG + cp $80 + jr nc, .CheckAttract + + ld hl, EnemySubStatus3 + ld a, [hl] + and %10000000 + ld [hl], a + +; 'hurt itself in its confusion!' + ld hl, HurtItselfText + call FarBattleTextBox + + call Function0x355dd + + call $5612 + + call BattleCommand0a + + xor a + ld [$cfca], a + +; Flicker the monster pic unless flying or underground. + ld de, $0115 + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call CleanGetBattleVarPair + and $60 + call z, PlayFXAnimID + + ld c, $1 + call Function0x35d1c + + call $5004 + + call CantMove + jp Function0x34385 + + +.CheckAttract + ld a, [EnemySubStatus1] + add a ; check bit 7 + jr nc, .CheckDisabledMove + +; 'in love with' + ld hl, InLoveWithText + call FarBattleTextBox + + xor a + ld [$cfca], a + + ld de, ANIM_INLOVE + call FarPlayBattleAnimation + +; 50% chance of infatuation + call FarBattleRNG + cp $80 + jr c, .CheckDisabledMove + +; 'infatuation kept it from attacking!' + ld hl, InfatuationText + call FarBattleTextBox + + call CantMove + jp Function0x34385 + + +.CheckDisabledMove +; We can't disable a move that doesn't exist. + ld a, [EnemyEncoredMove] + and a + jr z, .CheckParalyzed + +; Are we using the disabled move? + ld hl, CurEnemyMove + cp [hl] + jr nz, .CheckParalyzed + + call MoveDisabled + + call CantMove + jp Function0x34385 + + +.CheckParalyzed + ld hl, EnemyMonStatus + bit 6, [hl] + ret z + +; 25% chance to be fully paralyzed + call FarBattleRNG + cp $3f + ret nc + +; 'fully paralyzed!' + ld hl, FullyParalyzedText + call FarBattleTextBox + + call CantMove + + ; fallthrough +; 34385 + + +Function0x34385: ; 34385 + ld a, $1 + ld [$c6b4], a + jp ResetDamage +; 3438d + + +MoveDisabled: ; 3438d + +; Make sure any charged moves fail + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + res 4, [hl] + + ld a, BATTLE_VARS_MOVE + call CleanGetBattleVarPair + ld [$d265], a + call $34f8 + +; 'disabled!' + ld hl, DisabledMoveText + jp FarBattleTextBox +; 343a5 + + +HitConfusion: ; 343a5 + +; 'hurt itself in its confusion!' + ld hl, HurtItselfText + call FarBattleTextBox + + xor a + ld [CriticalHit], a + + call Function0x355dd + + call $5612 + + call BattleCommand0a + + xor a + ld [$cfca], a + +; Flicker the monster pic unless flying or underground. + ld de, $0115 + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call CleanGetBattleVarPair + and $60 + call z, PlayFXAnimID + + ld hl, $5f48 + call $7e73 + + ld a, $1 + ld [$ffd4], a + + ld c, $1 + call Function0x35d7e + + jp $5004 +; 343db + + +BattleCommand02: ; 343db +; checkobedience + +; Enemy can't disobey + ld a, [hBattleTurn] + and a + ret nz + + call Function0x34548 + 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, [InLinkBattle] + and a + ret nz + + ld a, [$cfc0] + and a + ret nz + +; If the monster's id doesn't match the player's, +; some conditions need to be met. + ld a, PartyMon1ID - PartyMon1 + call BattlePartyAttr + + ld a, [PlayerID] + cp [hl] + jr nz, .obeylevel + inc hl + ld a, [PlayerID + 1] + cp [hl] + ret z + + +.obeylevel +; The maximum obedience level is constrained by owned badges: + ld hl, JohtoBadges + +; risingbadge + bit 7, [hl] + ld a, 101 + jr nz, .getlevel + +; stormbadge + bit 5, [hl] + ld a, 70 + jr nz, .getlevel + +; fogbadge + bit 3, [hl] + ld a, 50 + jr nz, .getlevel + +; hivebadge + bit 1, [hl] + ld a, 30 + jr nz, .getlevel + +; no badges + ld a, 10 + + +.getlevel +; c = obedience level +; d = monster level +; b = c + d + + ld b, a + ld c, a + + ld a, [BattleMonLevel] + ld d, a + + add b + ld b, a + +; No overflow (this should never happen) + jr nc, .checklevel + ld b, $ff + + +.checklevel +; If the monster's level is lower than the obedience level, it will obey. + ld a, c + cp d + ret nc + + +; Random number from 0 to obedience level + monster level +.rand1 + call FarBattleRNG + 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 FarBattleRNG + 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 FarBattleRNG + swap a + sub b + jr c, .Nap + +; The chance of not hitting itself is the same. + cp b + jr nc, .DoNothing + +; 'won't obey!' + ld hl, WontObeyText + call FarBattleTextBox + + call HitConfusion + + jp $450c + + +.Nap + call FarBattleRNG + add a + swap a + and 7 + jr z, .Nap + + ld [BattleMonStatus], a + +; 'began to nap!' + ld hl, BeganToNapText + jr .Print + + +.DoNothing + call FarBattleRNG + and 3 + +; 'loafing around!' + ld hl, LoafingAroundText + and a + jr z, .Print + +; 'won't obey!' + ld hl, WontObeyText + dec a + jr z, .Print + +; 'turned away!' + ld hl, TurnedAwayText + dec a + jr z, .Print + +; 'ignored orders!' + ld hl, IgnoredOrdersText + +.Print + call FarBattleTextBox + jp $450c + + +.UseInstead + +; Can't use another move if the monster only has one! + ld a, [BattleMonMove2] + 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, [$cfa3] + ld b, a + +; Save the move we originally picked for afterward. + ld a, [CurMoveNum] + ld c, a + push af + + +.RandomMove + call FarBattleRNG + and 3 + + 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 + + xor a + ld [LastPlayerMove], a + ld [LastEnemyCounterMove], a + + ld hl, PlayerSubStatus5 + res 4, [hl] + +; Break encore too. + xor a + ld [PlayerEncoreCount], a + + jp EndMoveEffect +; 3451f + + +IgnoreSleepOnly: ; 3451f + + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + + cp SNORE + jr z, .CheckSleep + cp SLEEP_TALK + jr z, .CheckSleep + and a + ret + +.CheckSleep + ld a, BATTLE_VARS_STATUS + call CleanGetBattleVarPair + and 7 + ret z + +; 'ignored orders…sleeping!' + ld hl, $4f7b + call FarBattleTextBox + + call EndMoveEffect + + scf + ret +; 34541 + + +BattleCommand03: ; 34541 +; usedmovetext + callba DisplayUsedMoveText + ret +; 34548 + + +Function0x34548: ; 34548 + + ld a, [hBattleTurn] + and a + ld a, [$c732] ; player + jr z, .end + ld a, [$c733] ; enemy +.end + and a + ret +; 34555 + + +BattleCommand04: ; 34555 + call Function0x34548 + ret nz + + ld hl, BattleMonPP + ld de, PlayerSubStatus3 + ld bc, PlayerTurnsTaken + + ld a, [hBattleTurn] + and a + jr z, .asm_34570 + + ld hl, EnemyMonPP + ld de, EnemySubStatus3 + ld bc, EnemyTurnsTaken + +.asm_34570 +; 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 CleanGetBattleVarPair + cp STRUGGLE + ret z + + ld a, [de] + and %111 ; rollout | bide | ??? + ret nz + + call .asm_345ad + ld a, b + and a + jp nz, EndMoveEffect + +; SubStatus5 + inc de + inc de + + ld a, [de] + bit 3, a + ret nz + + ld a, [hBattleTurn] + and a + + ld hl, PartyMon1PP + ld a, [CurBattleMon] + jr z, .asm_345a4 + +; skip this part entirely if wildbattle + ld a, [IsInBattle] + dec a + jr z, .asm_345c5 + + ld hl, OTPartyMon1PP + ld a, [CurOTMon] + +.asm_345a4 + call GetPartyLocation + push hl + call Function0x3460b + pop hl + ret c + +.asm_345ad + ld a, [hBattleTurn] + and a + ld a, [CurMoveNum] + jr z, .asm_345b8 + ld a, [CurEnemyMoveNum] + +.asm_345b8 + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + and $3f + jr z, .asm_345e3 + dec [hl] + ld b, $0 + ret + +.asm_345c5 + ld hl, EnemyMonMoves + ld a, [CurEnemyMoveNum] + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + cp MIMIC + jr z, .asm_345dc + ld hl, $c735 + add hl, bc + ld a, [hl] + cp MIMIC + ret z + +.asm_345dc + ld hl, $c739 + call .asm_345ad + ret + +.asm_345e3 + call $7e80 +; get move effect + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair +; continuous? + ld hl, .continuousmoves + ld de, $0001 ; don't skip + call IsInArray + +; 'has no pp left for [move]' + ld hl, $4fba + jr c, .print +; 'but no pp is left for the move' + ld hl, $4f99 +.print + call FarBattleTextBox + ld b, $1 + ret +; 34602 + +.continuousmoves ; 34602 + db $27 ; RAZOR_WIND + db $4b ; SKY_ATTACK + db $91 ; SKULL_BASH + db $97 ; SOLARBEAM + db $9b ; FLY, DIG + db $75 ; ROLLOUT + db $1a ; BIDE + db $1b ; THRASH, PETAL_DANCE, OUTRAGE + db $ff ; end +; 3460b + +Function0x3460b: ; 3460b + ld a, [hBattleTurn] + and a + ld a, [CurMoveNum] + jr z, .asm_34616 + ld a, [CurEnemyMoveNum] + +.asm_34616 + ld c, a + ld a, 2 + call $3945 + + ld a, BATTLE_VARS_MOVE + call CleanGetBattleVarPair + cp MIMIC + jr z, .asm_3462f + + ld b, 0 + add hl, bc + ld a, [hl] + cp MIMIC + jr nz, .asm_3462f + + scf + ret + +.asm_3462f + and a + ret +; 34631 + + +BattleCommand05: ; 34631 +; critical + +; Determine whether this attack's hit will be critical. + + xor a + ld [CriticalHit], a + + ld a, BATTLE_VARS_MOVE_POWER + call CleanGetBattleVarPair + 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 CleanGetBattleVarPair + bit 2, a + jr z, .CheckCritical + +; +1 critical level + inc c + +.CheckCritical + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + 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 $49 ; 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 FarBattleRNG + cp [hl] + ret nc + ld a, 1 + ld [CriticalHit], a + ret + +.Criticals + db KARATE_CHOP, RAZOR_WIND, RAZOR_LEAF, CRABHAMMER, SLASH, AEROBLAST, CROSS_CHOP, $ff +.Chances + ; 6.25% 12.1% 24.6% 33.2% 49.6% 49.6% 49.6% + db $11, $20, $40, $55, $80, $80, $80 + ; 0 1 2 3 4 5 6 +; 346b2 + + +BattleCommand4e: ; 346b2 + ld a, [$c689] + ld b, a + inc b + ld hl, CurDamage + 1 + ld a, [hld] + ld e, a + ld a, [hli] + ld d, a +.asm_346be + dec b + ret z + ld a, [hl] + add e + ld [hld], a + ld a, [hl] + adc d + ld [hli], a + jr nc, .asm_346be ; 346c6 $f6 + ld a, $ff + ld [hld], a + ld [hl], a + ret +; 346cd + + +BattleCommand4f: ; 346cd + ld hl, $c689 + inc [hl] + ret +; 346d2 + + +BattleCommand07: ; 346d2 + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + 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, .asm_346f7 + + ld hl, EnemyMonType1 + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, BattleMonType1 + ld a, [hli] + ld d, a + ld e, [hl] + +.asm_346f7 + ld a, BATTLE_VARS_MOVE_TYPE + call GetBattleVarPair + ld [$d265], a + + push hl + push de + push bc + ld a, $3e + ld hl, $7da4 + rst FarCall + pop bc + pop de + pop hl + + push de + push bc + ld a, $3e + ld hl, $7e24 + rst FarCall + pop bc + pop de + + ld a, [$d265] + cp b + jr z, .asm_34720 + cp c + jr z, .asm_34720 + jr .asm_3473a + +.asm_34720 + 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] +.asm_3473a + ld a, BATTLE_VARS_MOVE_TYPE + call CleanGetBattleVarPair + ld b, a + ld hl, TypeMatchup +.asm_34743 + ld a, [hli] + cp $ff + jr z, .asm_347b7 ; 34746 $6f + cp $fe + jr nz, .asm_34757 ; 3474a $b + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call CleanGetBattleVarPair + bit 3, a + jr nz, .asm_347b7 ; 34753 $62 + jr .asm_34743 ; 34755 $ec +.asm_34757 + cp b + jr nz, .asm_347b3 ; 34758 $59 + ld a, [hl] + cp d + jr z, .asm_34763 ; 3475c $5 + cp e + jr z, .asm_34763 ; 3475f $2 + jr .asm_347b3 ; 34761 $50 +.asm_34763 + push hl + push bc + inc hl + ld a, [TypeModifier] + and %10000000 + ld b, a + ld a, [hl] + and a + jr nz, .asm_34775 ; 3476e $5 + inc a + ld [AttackMissed], a + xor a +.asm_34775 + ld [$ffb7], a + add b + ld [TypeModifier], a + xor a + ld [$ffb4], a + ld hl, CurDamage + ld a, [hli] + ld [$ffb5], a + ld a, [hld] + ld [$ffb6], a + call $3119 + ld a, [$ffb4] + ld b, a + ld a, [$ffb5] + or b + ld b, a + ld a, [$ffb6] + or b + jr z, .asm_347ab ; 34794 $15 + ld a, $a + ld [$ffb7], a + ld b, $4 + call $3124 + ld a, [$ffb5] + ld b, a + ld a, [$ffb6] + or b + jr nz, .asm_347ab ; 347a5 $4 + ld a, $1 + ld [$ffb6], a +.asm_347ab + ld a, [$ffb5] + ld [hli], a + ld a, [$ffb6] + ld [hl], a + pop bc + pop hl +.asm_347b3 + inc hl + inc hl + jr .asm_34743 ; 347b5 $8c +.asm_347b7 + call Function0x347c8 + ld a, [$d265] + ld b, a + ld a, [TypeModifier] + and $80 + or b + ld [TypeModifier], a + ret +; 347c8 + + +Function0x347c8: ; 347c8 + ld hl, EnemyMonType1 + ld a, [hBattleTurn] + and a + jr z, .asm_347d3 ; 0x347ce $3 + ld hl, BattleMonType1 +.asm_347d3 + push hl + push de + push bc + ld a, $f + call CleanGetBattleVarPair + ld d, a + ld b, [hl] + inc hl + ld c, [hl] + ld a, $a + ld [$d265], a + ld hl, TypeMatchup +.asm_347e7 + ld a, [hli] + cp $ff + jr z, .asm_3482f ; 0x347ea $43 + cp $fe + jr nz, .asm_347fb ; 0x347ee $b + ld a, $5 + call CleanGetBattleVarPair + bit 3, a + jr nz, .asm_3482f ; 0x347f7 $36 + jr .asm_347e7 ; 0x347f9 $ec +.asm_347fb + cp d + jr nz, .asm_34807 ; 0x347fc $9 + ld a, [hli] + cp b + jr z, .asm_3480b ; 0x34800 $9 + cp c + jr z, .asm_3480b ; 0x34803 $6 + jr .asm_34808 ; 0x34805 $1 +.asm_34807 + inc hl +.asm_34808 + inc hl + jr .asm_347e7 ; 0x34809 $dc +.asm_3480b + xor a + ld [$ffb3], a + ld [$ffb4], a + ld [$ffb5], a + ld a, [hli] + ld [$ffb6], a + ld a, [$d265] + ld [$ffb7], a + call Multiply + ld a, $a + ld [$ffb7], a + push bc + ld b, $4 + call Divide + pop bc + ld a, [$ffb6] + ld [$d265], a + jr .asm_347e7 ; 0x3482d $b8 +.asm_3482f + pop bc + pop de + pop hl + ret +; 34833 + + +BattleCommanda3: ; 34833 + call Function0x347c8 + ld a, [$d265] + and a + ld a, $a + jr nz, .asm_3484a ; 3483c $c + call ResetDamage + xor a + ld [TypeModifier], a + inc a + ld [AttackMissed], a + ret +.asm_3484a + ld [$d265], a + ret +; 3484e + + +; 3484e + push hl + push de + push bc + ld a, $a + ld [$c716], a + ld hl, PlayerUsedMoves + ld a, [hl] + and a + jr z, .asm_348b0 ; 0x3485b $53 + ld d, $4 + ld e, $0 +.asm_34861 + ld a, [hli] + and a + jr z, .asm_3489f ; 0x34863 $3a + push hl + dec a + ld hl, $5afd + call $7ea1 + and a + jr z, .asm_3489b ; 0x3486e $2b + inc hl + call $7ebb + ld hl, EnemyMonType1 + call $47d3 + ld a, [$d265] + cp $b + jr nc, .asm_34895 ; 0x3487f $14 + and a + jr z, .asm_3489b ; 0x34882 $17 + cp $a + jr nc, .asm_34891 ; 0x34886 $9 + ld a, e + cp $1 + jr nc, .asm_3489b ; 0x3488b $e + ld e, $1 + jr .asm_3489b ; 0x3488f $a +.asm_34891 + ld e, $2 + jr .asm_3489b ; 0x34893 $6 +.asm_34895 + call $4931 + pop hl + jr .asm_348d7 ; 0x34899 $3c +.asm_3489b + pop hl + dec d + jr nz, .asm_34861 ; 0x3489d $c2 +.asm_3489f + ld a, e + cp $2 + jr z, .asm_348d7 ; 0x348a2 $33 + call $4939 + ld a, e + and a + jr nz, .asm_348d7 ; 0x348a9 $2c + call $4939 + jr .asm_348d7 ; 0x348ae $27 +.asm_348b0 + ld a, [BattleMonType1] + ld b, a + ld hl, EnemyMonType1 + call $47d3 + ld a, [$d265] + cp $b + jr c, .asm_348c4 ; 0x348bf $3 + call $4931 +.asm_348c4 + ld a, [BattleMonType2] + cp b + jr z, .asm_348d7 ; 0x348c8 $d + call $47d3 + ld a, [$d265] + cp $b + jr c, .asm_348d7 ; 0x348d2 $3 + call $4931 +.asm_348d7 + call $48de + pop bc + pop de + pop hl + ret +; 348de + + +; 348de + ld de, EnemyMonMove1 + ld b, 5 + ld c, 0 + + ld a, [$d265] + push af + +.loop + dec b + jr z, .exit + + ld a, [de] + and a + jr z, .exit + + inc de + dec a + ld hl, $5afd + call $7ea1 + and a + jr z, .loop + + inc hl + call $7ebb + ld hl, BattleMonType1 + call $47d3 + ld a, [$d265] + and a + jr z, .loop + + inc c + cp $a + jr c, .loop + + inc c + inc c + inc c + inc c + inc c + + cp $a + jr z, .loop + + ld c, $64 + jr .loop +.exit + + pop af + ld [$d265], a + + ld a, c + and a + jr z, .doubledown + cp $5 + jr c, .down + cp $64 + ret c + jr .up + +.doubledown + call .down + +.down + ld a, [$c716] + dec a + ld [$c716], a + ret + +.up + ld a, [$c716] + inc a + ld [$c716], a + ret +; 34941 + + +; 34941 + xor a + ld [$c717], a + call $49f4 + ret c + + ld a, [EnemySubStatus1] + bit 4, a + jr z, .asm_34986 + + ld a, [$c67f] + cp $1 + jr nz, .asm_34986 + + call $49f4 + call $4b77 + call $4b20 + call $4a85 + ld a, e + cp $2 + jr nz, .asm_34971 + + ld a, [$c716] + add $30 + ld [$c717], a + ret + +.asm_34971 + call $49f4 + sla c + sla c + ld b, $ff + +.asm_3497a + inc b + sla c + jr nc, .asm_3497a + + ld a, b + add $30 + ld [$c717], a + ret + +.asm_34986 + call $484e + ld a, [$c716] + cp $b + ret nc + + ld a, [LastEnemyCounterMove] + and a + jr z, .asm_349d2 + + call $4a2a + ld a, [$c716] + and a + jr z, .asm_349d2 + + ld c, a + call $4aa7 + ld a, [$c716] + cp $ff + ret z + + ld b, a + ld a, e + cp $2 + jr z, .asm_349be + + call $484e + ld a, [$c716] + cp $a + ret nc + + ld a, b + add $10 + ld [$c717], a + ret + +.asm_349be + ld c, $10 + call $484e + ld a, [$c716] + cp $a + jr nc, .asm_349cc + ld c, $20 + +.asm_349cc + ld a, b + add c + ld [$c717], a + ret + +.asm_349d2 + call $484e + ld a, [$c716] + cp $a + ret nc + + call $49f4 + call $4b77 + call $4b20 + call $4a85 + + ld a, e + cp $2 + ret nz + + ld a, [$c716] + add $10 + ld [$c717], a + ret +; 349f4 + + +; 349f4 + ld a, [OTPartyCount] + cp $2 + jr c, .asm_34a26 + + ld d, a + ld e, $0 + ld b, $20 + ld c, $0 + ld hl, OTPartyMon1CurHP + +.asm_34a05 + ld a, [CurOTMon] + cp e + jr z, .asm_34a16 + + push bc + ld b, [hl] + inc hl + ld a, [hld] + or b + pop bc + jr z, .asm_34a16 + + ld a, c + or b + ld c, a +.asm_34a16 + srl b + push bc + ld bc, $0030 + add hl, bc + pop bc + inc e + dec d + jr nz, .asm_34a05 + + ld a, c + and a + jr nz, .asm_34a28 + +.asm_34a26 + scf + ret + +.asm_34a28 + and a + ret +; 34a2a + + +; 34a2a + ld hl, OTPartyMon1Species2 + ld a, [OTPartyCount] + ld b, a + ld c, $20 + ld d, 0 + xor a + ld [$c716], a + +.asm_34a39 + ld a, [CurOTMon] + cp d + push hl + jr z, .asm_34a77 + + push hl + push bc + ld bc, $0022 + add hl, bc + pop bc + ld a, [hli] + or [hl] + pop hl + jr z, .asm_34a77 + + ld a, [hl] + ld [CurSpecies], a + call GetBaseStats + ld a, [LastEnemyCounterMove] + dec a + ld hl, $5afd + call $7ea1 + and a + jr z, .asm_34a77 + + inc hl + call $7ebb + ld hl, $d23d + call $47d3 + ld a, [$d265] + and a + jr nz, .asm_34a77 + + ld a, [$c716] + or c + ld [$c716], a +.asm_34a77 + pop hl + dec b + ret z + + push bc + ld bc, $30 + add hl, bc + pop bc + + inc d + srl c + jr .asm_34a39 + + push bc + ld a, [OTPartyCount] + ld e, a + ld hl, OTPartyMon1CurHP + ld b, $20 + ld c, $0 +.asm_34a91 + ld a, [hli] + or [hl] + jr z, .asm_34a98 + + ld a, b + or c + ld c, a +.asm_34a98 + srl b + push bc + ld bc, $002f + add hl, bc + pop bc + dec e + jr nz, .asm_34a91 + + ld a, c + pop bc + + and c + ld c, a + ld a, $ff + ld [$c716], a + ld hl, OTPartyMon1Move1 + ld b, $20 + ld d, $0 + ld e, $0 +.asm_34ab5 + ld a, b + and c + jr z, .asm_34b00 + + push hl + push bc + ld b, $4 + ld c, $0 +.asm_34abf + ld a, [hli] + and a + push hl + jr z, .asm_34aef + + dec a + ld hl, $5afd + call $7ea1 + and a + jr z, .asm_34ae9 + + inc hl + call $7ebb + ld hl, BattleMonType1 + call $47d3 + ld a, [$d265] + cp $a + jr c, .asm_34ae9 + + ld e, $1 + cp $b + jr c, .asm_34ae9 + + ld e, $2 + jr .asm_34aef + +.asm_34ae9 + pop hl + dec b + jr nz, .asm_34abf + + jr .asm_34af0 + +.asm_34aef + pop hl +.asm_34af0 + ld a, e + pop bc + pop hl + cp $2 + jr z, .asm_34b0e + + cp $1 + jr nz, .asm_34b00 + + ld a, d + or b + ld d, a + jr .asm_34b00 + +.asm_34b00 + push bc + ld bc, $0030 + add hl, bc + pop bc + srl b + jr nc, .asm_34ab5 + + ld a, d + ld b, a + and a + ret z + +.asm_34b0e + push bc + sla b + sla b + ld c, $ff +.asm_34b15 + inc c + sla b + jr nc, .asm_34b15 + + ld a, c + ld [$c716], a + pop bc + ret +; 34b20 + + +; 34b20 + push bc + ld hl, OTPartySpecies + ld b, $20 + ld c, $0 + +.asm_34b28 + ld a, [hli] + cp $ff + jr z, .asm_34b72 + + push hl + ld [CurSpecies], a + call GetBaseStats + ld a, [LastEnemyCounterMove] + and a + jr z, .asm_34b4a + + dec a + ld hl, $5afd + call $7ea1 + and a + jr z, .asm_34b4a + + inc hl + call $7ebb + jr .asm_34b5d + +.asm_34b4a + ld a, [BattleMonType1] + ld hl, $d23d + call $47d3 + ld a, [$d265] + cp $b + jr nc, .asm_34b6d + ld a, [BattleMonType2] + +.asm_34b5d + ld hl, $d23d + call $47d3 + ld a, [$d265] + cp $b + jr nc, .asm_34b6d + + ld a, b + or c + ld c, a + +.asm_34b6d + srl b + pop hl + jr .asm_34b28 + +.asm_34b72 + ld a, c + pop bc + and c + ld c, a + ret +; 34b77 + + +; 34b77 + push bc + ld de, OTPartySpecies + ld b, $20 + ld c, $0 + ld hl, OTPartyMon1CurHP + +.asm_34b82 + ld a, [de] + inc de + cp $ff + jr z, .asm_34bac + + push hl + push bc + ld b, [hl] + inc hl + ld c, [hl] + inc hl + inc hl + srl c + rl b + srl c + rl b + ld a, [hld] + cp c + ld a, [hl] + sbc b + pop bc + jr nc, .asm_34ba1 + + ld a, b + or c + ld c, a + +.asm_34ba1 + srl b + pop hl + push bc + ld bc, $0030 + add hl, bc + pop bc + jr .asm_34b82 + +.asm_34bac + ld a, c + pop bc + and c + ld c, a + ret +; 34bb1 + + +TypeMatchup: ; 34bb1 +INCLUDE "battle/type_matchup.asm" +; 34cfd + + +BattleCommand08: ; 34cfd +; damagevariation + +; Modify the damage spread between 85% and 100%. + +; Because of the method of division the probability distribution +; is not consistent. This makes the highest damage multipliers +; rarer than normal. + + +; No point in reducing 1 or 0 damage. + ld hl, CurDamage + ld a, [hli] + and a + jr nz, .go + ld a, [hl] + cp 2 + ret c + +.go +; Start with the maximum damage. + xor a + ld [$ffb4], a + dec hl + ld a, [hli] + ld [$ffb5], a + ld a, [hl] + ld [$ffb6], a + +; Multiply by 85-100%... +.loop + call FarBattleRNG + rrca + cp $d9 ; 85% + jr c, .loop + + ld [$ffb7], a + call Multiply + +; ...divide by 100%... + ld a, $ff ; 100% + ld [$ffb7], a + ld b, $4 + call Divide + +; ...to get .85-1.00x damage. + ld a, [$ffb5] + ld hl, CurDamage + ld [hli], a + ld a, [$ffb6] + ld [hl], a + ret +; 34d32 + + +BattleCommand09: ; 34d32 +; checkhit + + call .DreamEater + jp z, .Miss + + call .Protect + jp nz, .Miss + + call .DrainSub + jp z, .Miss + + call .LockOn + ret nz + + call .FlyDigMoves + jp nz, .Miss + + call .ThunderRain + ret z + + call .UnleashedEnergy + ret nz + +; Perfect-accuracy moves + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $11 + ret z + + call .StatModifiers + + ld a, [PlayerMoveAccuracy] + ld b, a + ld a, [hBattleTurn] + and a + jr z, .BrightPowder + ld a, [EnemyMoveAccuracy] + ld b, a + +.BrightPowder + push bc + call GetOpponentItem + ld a, b + cp $4d ; brightpowder + ld a, c ; % miss + pop bc + jr nz, .asm_34d81 + + ld c, a + ld a, b + sub c + ld b, a + jr nc, .asm_34d81 + ld b, 0 + +.asm_34d81 + ld a, b + cp $ff + jr z, .Hit + + call FarBattleRNG + 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 CleanGetBattleVarPair + cp $2d + 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 CleanGetBattleVarPair + cp $8 + ret nz + + ld a, BATTLE_VARS_STATUS_OPP + call CleanGetBattleVarPair + and 7 ; sleep + ret + + +.Protect +; Return nz if the opponent is protected. + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call CleanGetBattleVarPair + bit 2, a + ret z + + ld c, 40 + call DelayFrames + +; 'protecting itself!' + ld hl, BattleText_0x8167a + call FarBattleTextBox + + 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 GetBattleVarPair + bit 5, [hl] + res 5, [hl] + ret z + + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call CleanGetBattleVarPair + bit 6, a ; flying + jr z, .LockedOn + + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + + 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 ; CheckOpponentSub + jr z, .asm_34e00 + + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + + cp $3 ; drain + ret z + cp $8 ; dream eater + ret z + +.asm_34e00 + ld a, 1 + and a + ret + + +.FlyDigMoves +; Check for moves that can hit underground/flying opponents. +; Return z if the current move can hit the opponent. + + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call CleanGetBattleVarPair + and $60 ; fly | dig + ret z + + bit 6, a + jr z, .DigMoves + + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + + cp GUST + ret z + cp WHIRLWIND + ret z + cp THUNDER + ret z + cp TWISTER + ret + +.DigMoves + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + + 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 CleanGetBattleVarPair + cp $98 + ret nz + + ld a, [Weather] + cp WEATHER_RAIN + ret + + +.UnleashedEnergy +; Return nz if unleashing energy from Bide. + ld a, BATTLE_VARS_SUBSTATUS4 + call CleanGetBattleVarPair + bit 0, a + ret + + +.StatModifiers + + ld a, [hBattleTurn] + and a + + ld hl, PlayerMoveAccuracy + ld a, [PlayerAccLevel] + ld b, a + ld a, [EnemyEvaLevel] + ld c, a + + jr z, .asm_34e60 + + ld hl, EnemyMoveAccuracy + ld a, [EnemyAccLevel] + ld b, a + ld a, [PlayerEvaLevel] + ld c, a + +.asm_34e60 + cp b + jr c, .asm_34e6b + + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call CleanGetBattleVarPair + bit 3, a + ret nz + +.asm_34e6b + ld a, $e + sub c + ld c, a + xor a + ld [$ffb4], a + ld [$ffb5], a + ld a, [hl] + ld [$ffb6], a + push hl + ld d, $2 + +.asm_34e7a + push bc + ld hl, .AccProb + dec b + sla b + ld c, b + ld b, 0 + add hl, bc + pop bc + ld a, [hli] + ld [$ffb7], a + call Multiply + ld a, [hl] + ld [$ffb7], a + ld b, $4 + call Divide + ld a, [$ffb6] + ld b, a + ld a, [$ffb5] + or b + jr nz, .asm_34ea2 + ld [$ffb5], a + ld a, $1 + ld [$ffb6], a + +.asm_34ea2 + ld b, c + dec d + jr nz, .asm_34e7a + + ld a, [$ffb5] + and a + ld a, [$ffb6] + jr z, .asm_34eaf + ld a, $ff + +.asm_34eaf + pop hl + ld [hl], a + ret + +.AccProb + db 33, 100 ; 33% -6 + db 36, 100 ; 36% -5 + db 43, 100 ; 43% -4 + db 50, 100 ; 50% -3 + db 60, 100 ; 60% -2 + db 75, 100 ; 75% -1 + db 1, 1 ; 100% 0 + db 133, 100 ; 133% +1 + db 166, 100 ; 166% +2 + db 2, 1 ; 200% +3 + db 233, 100 ; 233% +4 + db 133, 50 ; 266% +5 + db 3, 1 ; 300% +6 + +; 34ecc + + +BattleCommand90: ; 34ecc + xor a + ld [$c70d], a + call CheckSubstituteOpp + jr nz, .asm_34ee7 ; 34ed3 $12 + push hl + ld hl, PlayerMoveEffectChance + ld a, [hBattleTurn] + and a + jr z, .asm_34ee1 ; 34edc $3 + ld hl, EnemyMoveEffectChance +.asm_34ee1 + call FarBattleRNG + cp [hl] + pop hl + ret c +.asm_34ee7 + ld a, $1 + ld [$c70d], a + and a + ret +; 34eee + + +BattleCommand0a: ; 34eee + ld a, BATTLE_VARS_SUBSTATUS4 + call CleanGetBattleVarPair + bit 4, a + ret z + + ld a, BATTLE_VARS_SUBSTATUS3 + call CleanGetBattleVarPair + bit 4, a + jr nz, .asm_34f18 + + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $27 ; razor wind + jr z, .asm_34f21 + cp $4b ; sky attack + jr z, .asm_34f21 + cp $91 ; skull bash + jr z, .asm_34f21 + cp $97 ; solarbeam + jr z, .asm_34f21 + cp $9b ; fly / dig + jr z, .asm_34f21 + +.asm_34f18 + call .Rampage + jr z, .asm_34f21 + + call Function0x34548 + ret nz + +.asm_34f21 + call $7ed5 + jr c, .asm_34f36 + + xor a + ld [$cfca], a + ld [FXAnimIDHi], a + inc a + ld [$c689], a + ld a, $a4 + jp $7e44 + +.asm_34f36 + call $65c3 + jp $7e80 + +.Rampage + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $75 ; rollout + jr z, .asm_34f4d + cp $1b ; rampage + jr z, .asm_34f4d + + ld a, 1 + and a + ret + +.asm_34f4d + ld a, [$c73e] + and a + ld a, 0 + ld [$c73e], a + ret +; 34f57 + + +BattleCommandab: ; 34f57 +; hittarget + call BattleCommand0a + call BattleCommand0b + jp BattleCommand0c +; 34f60 + + +BattleCommand0b: ; 34f60 + ld a, [AttackMissed] + and a + jp nz, $7e80 + + ld a, [hBattleTurn] + and a + ld de, $c672 + ld a, 1 + jr z, .asm_34f76 + ld de, $c67a + ld a, 4 + +.asm_34f76 + ld [$cfca], a + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $1d ; multihit + jr z, .asm_34fb0 + cp $1e ; conversion + jr z, .asm_34fb0 + cp $2c ; double kick / bonemerang + jr z, .asm_34fb0 + cp $4d ; twineedle + jr z, .asm_34fb0 + cp $68 ; triple kick + jr z, .asm_34f96 + xor a + ld [$c689], a + +.asm_34f96 + + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + ld e, a + ld d, 0 + call PlayFXAnimID + + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + cp FLY + jr z, .asm_34fad + cp DIG + ret nz + +.asm_34fad +; clear sprite + jp $7ec7 +.asm_34fb0 + ld a, [$c689] + and $1 + xor $1 + ld [$c689], a + ld a, [de] + cp $1 + push af + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + ld e, a + ld d, $0 + pop af + jp z, PlayFXAnimID + xor a + ld [$cfca], a + jp PlayFXAnimID +; 34fd1 + + +BattleCommand92: ; 34fd1 + ld a, [AttackMissed] + and a + jp nz, $7e80 + + xor a + jr BattleCommand91_92 +; 34fdb + + +BattleCommand91: ; 34fdb + ld a, [AttackMissed] + and a + jp nz, $7e80 + + ld a, [hBattleTurn] + and a + ld a, 2 + jr z, BattleCommand91_92 + ld a, 5 + + ; fallthrough +; 34feb + + +BattleCommand91_92: ; 34feb + ld [$cfca], a + xor a + ld [$c689], a + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + ld e, a + ld d, 0 + jp PlayFXAnimID +; 34ffd + + +BattleCommand93: ; 34ffd + ld a, [hBattleTurn] + xor $1 + ld [hBattleTurn], a + ret +; 35004 + + +BattleCommand0c: ; 35004 + ld a, BATTLE_VARS_SUBSTATUS4 + call CleanGetBattleVarPair + bit 4, a + ret z + call $7ed5 + jp c, BattleCommanda6 + xor a + ld [$cfca], a + ld [FXAnimIDHi], a + ld a, $2 + ld [$c689], a + ld a, $a4 + jp $7e44 +; 35023 + + +BattleCommand0d: ; 35023 + ld a, [AttackMissed] + and a + ret z + call $50e4 + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVarPair + cp $13 + jr z, .asm_3504f ; 35032 $1b + cp $5b + jr z, .asm_3504f ; 35036 $17 + inc hl + ld a, [hl] + cp $1d + jr z, .asm_35049 ; 3503c $b + cp $2c + jr z, .asm_35049 ; 35040 $7 + cp $4d + jr z, .asm_35049 ; 35044 $3 + jp EndMoveEffect +.asm_35049 + call BattleCommand0c + jp EndMoveEffect +.asm_3504f + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + res 5, [hl] + res 6, [hl] + call $7ece + jp EndMoveEffect +; 3505e + + +BattleCommand0e: ; 3505e + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call CleanGetBattleVarPair + bit 5, a + jr z, .asm_35072 ; 35065 $b + call $5c94 + ld b, $0 + jr nc, .asm_3508b ; 3506c $1d + ld b, $1 + jr .asm_3508b ; 35070 $19 + +.asm_35072 + call GetOpponentItem + ld a, b + cp $4f + ld b, $0 + jr nz, .asm_3508b ; 3507a $f + call FarBattleRNG + cp c + jr nc, .asm_3508b ; 35080 $9 + call $5c94 + ld b, $0 + jr nc, .asm_3508b ; 35087 $2 + ld b, $2 +.asm_3508b + push bc + call .asm_50bb + ld c, $0 + ld a, [hBattleTurn] + and a + jr nz, .asm_3509b + call Function0x35d1c + jr .asm_3509e + +.asm_3509b + call Function0x35d7e + +.asm_3509e + pop bc + ld a, b + and a + ret z + dec a + jr nz, .asm_350ab ; 350a3 $6 + ld hl, $4eb0 + jp FarBattleTextBox + +.asm_350ab + call GetOpponentItem + ld a, [hl] + ld [$d265], a + call $3468 + ld hl, $4e99 + jp FarBattleTextBox + +.asm_50bb + ld a, $8 + call CleanGetBattleVarPair + bit 4, a + ret nz + ld de, EnemyDamageTaken + ld a, [hBattleTurn] + and a + jr nz, .asm_350ce ; 0x350c9 $3 + ld de, $c685 + +.asm_350ce + ld a, [CurDamage + 1] + ld b, a + ld a, [de] + add b + ld [de], a + dec de + ld a, [CurDamage] + ld b, a + ld a, [de] + adc b + ld [de], a + ret nc + ld a, $ff + ld [de], a + inc de + ld [de], a + ret +; 350e4 + + +; 350e4 + ld hl, $5071 + ld de, $5071 + ld a, [TypeModifier] + and $7f + jr z, .asm_35110 ; 0x350ef $1f + ld a, $d + call CleanGetBattleVarPair + cp $94 + ld hl, $54f0 + ld de, $5500 + jr z, .asm_35110 ; 0x350fe $10 + ld hl, $5020 + ld de, $5033 + ld a, [CriticalHit] + cp $ff + jr nz, .asm_35110 ; 0x3510b $3 + ld hl, $5061 +.asm_35110 + call Function0x35157 + xor a + ld [CriticalHit], a + ld a, $d + call CleanGetBattleVarPair + cp $2d + ret nz + ld a, [TypeModifier] + and $7f + ret z + ld hl, CurDamage + ld a, [hli] + ld b, [hl] + srl a + rr b + srl a + rr b + srl a + rr b + ld [hl], b + dec hl + ld [hli], a + or b + jr nz, .asm_3513e ; 0x3513a $2 + inc a + ld [hl], a +.asm_3513e + ld hl, $5046 + call FarBattleTextBox + ld a, $1 + ld [$c689], a + call $7e36 + ld c, $1 + ld a, [hBattleTurn] + and a + jp nz, Function0x35d1c + jp Function0x35d7e + +Function0x35157: ; 35157 + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call CleanGetBattleVarPair + bit 2, a ; protect + jr z, .asm_35162 + ld h, d + ld l, e +.asm_35162 + jp FarBattleTextBox +; 35165 + + +BattleCommanda5: ; 35165 + ld a, [AttackMissed] + and a + ret z + + ld a, [TypeModifier] + and $7f + jp z, PrintDoesntAffect + jp $734e +; 35175 + + +BattleCommand0f: ; 35175 +; criticaltext +; Prints the message for critical hits or one-hit KOs. + +; If there is no message to be printed, wait 20 frames. + ld a, [CriticalHit] + and a + jr z, .wait + + dec a + add a + ld hl, .ptrs + ld b, 0 + ld c, a + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + call FarBattleTextBox + + xor a + ld [CriticalHit], a + +.wait + ld c, 20 + jp DelayFrames + +.ptrs + dw BattleText_0x81086 ; 'critical hit' + dw BattleText_0x81097 ; 'one-hit ko' +; 35197 + + +BattleCommandae: ; 35197 +; player + ld hl, $c672 + ld a, [hBattleTurn] + and a + jr z, .asm_351a2 +; enemy + ld hl, $c67a + +.asm_351a2 + xor a + ld [hl], a + ret +; 351a5 + + +BattleCommandad: ; 351a5 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + bit 2, a + ret nz + + ; fallthrough +; 351ad + + +BattleCommand10: ; 351ad + ld a, [TypeModifier] + and $7f + cp 10 ; 1.0 + ret z + ld hl, BattleText_0x810aa ; 'super-effective' + jr nc, .print + ld hl, BattleText_0x810c1 ; 'not very effective' +.print + jp FarBattleTextBox +; 351c0 + + +BattleCommand11: ; 351c0 + ld hl, EnemyMonHPHi + ld a, [hBattleTurn] + and a + jr z, .asm_351cb + ld hl, BattleMonHP +.asm_351cb + ld a, [hli] + or [hl] + ret nz + ld a, BATTLE_VARS_SUBSTATUS5_OPP + call CleanGetBattleVarPair + bit 6, a + jr z, .asm_35231 ; 351d5 $5a + ld hl, $50da + call FarBattleTextBox + ld a, [hBattleTurn] + and a + ld hl, EnemyMonMaxHPLo + ld bc, $c4ca + ld a, $0 + jr nz, .asm_351f2 ; 351e8 $8 + ld hl, $c63f + ld bc, $c55e + ld a, $1 +.asm_351f2 + ld [$d10a], a + ld a, [hld] + ld [$d1ea], a + ld a, [hld] + ld [$d1eb], a + ld a, [hl] + ld [$d1ec], a + xor a + ld [hld], a + ld a, [hl] + ld [$d1ed], a + xor a + ld [hl], a + ld [$d1ee], a + ld [$d1ef], a + ld h, b + ld l, c + ld a, $b + call $2d83 + call $39c9 + call $4ffd + xor a + ld [$cfca], a + ld [FXAnimIDHi], a + inc a + ld [$c689], a + ld a, $c2 + call $7e44 + call $4ffd + jr .asm_3524d ; 3522f $1c +.asm_35231 + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $1d + jr z, .asm_3524a ; 35238 $10 + cp $2c + jr z, .asm_3524a ; 3523c $c + cp $4d + jr z, .asm_3524a ; 35240 $8 + cp $68 + jr z, .asm_3524a ; 35244 $4 + cp $9a + jr nz, .asm_3524d ; 35248 $3 +.asm_3524a + call BattleCommand0c +.asm_3524d + jp EndMoveEffect +; 35250 + + +BattleCommand12: ; 35250 + jp .start +.start + ld a, [AttackMissed] + and a + ret nz + ld a, $8 + call CleanGetBattleVarPair + bit 6, a + ret z + ld de, $c72c + ld a, [hBattleTurn] + and a + jr z, .asm_3526b + ld de, $c72b +.asm_3526b + ld a, [de] + inc a + ret z + ld [de], a + call $4ffd + ld hl, $50f3 + call FarBattleTextBox + jp $4ffd +; 3527b + + +BattleCommanda2: ; 3527b + 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, [$c72b] + jr z, .asm_35290 ; 3528b $3 + ld a, [$c72c] +.asm_35290 + and a + jr z, .asm_3529a ; 35291 $7 + dec a + add hl, bc + jr nc, .asm_35290 ; 35295 $f9 + ld hl, $ffff +.asm_3529a + ld a, h + ld [CurDamage], a + ld a, l + ld [CurDamage + 1], a + ret +; 352a3 + + +EndMoveEffect: ; 352a3 + ld a, [BattleScriptBufferLoc] + ld l, a + ld a, [BattleScriptBufferLoc + 1] + ld h, a + ld a, $ff + ld [hli], a + ld [hli], a + ld [hl], a + ret +; 352b1 + + +DittoMetalPowder: ; 352b1 + ld a, PartyMon1Species - PartyMon1 + call BattlePartyAttr + ld a, [hBattleTurn] + and a + ld a, [hl] + jr nz, .Ditto + ld a, [TempEnemyMonSpecies] + +.Ditto + cp DITTO + ret nz + + push bc + call GetOpponentItem + ld a, [hl] + cp METAL_POWDER + pop bc + ret nz + + ld a, c + srl a + add c + ld c, a + ret nc + + srl b + ld a, b + and a + jr nz, .asm_352d8 + inc b +.asm_352d8 + scf + rr c + ret +; 352dc + + +BattleCommand06: ; 352dc +; damagecalc + + ld a, [hBattleTurn] + and a + jp nz, EnemyAttackDamage + + ; fallthrough +; 352e2 + + +PlayerAttackDamage: ; 352e2 + + call ResetDamage + ld hl, PlayerMovePower + ld a, [hli] + and a + ld d, a + ret z + ld a, [hl] + cp $14 + jr nc, .asm_35315 ; 352ef $24 + ld hl, EnemyMonDef + ld a, [hli] + ld b, a + ld c, [hl] + ld a, [$c700] + bit 4, a + jr z, .asm_35302 ; 352fc $4 + sla c + rl b +.asm_35302 + ld hl, BattleMonAtk + call GetDamageStatsCritical + jr c, .asm_3533c ; 35308 $32 + ld hl, $c6c3 + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, $c6b6 + jr .asm_3533c ; 35313 $27 +.asm_35315 + ld hl, EnemyMonSpclDef + ld a, [hli] + ld b, a + ld c, [hl] + ld a, [$c700] + bit 3, a + jr z, .asm_35326 ; 35320 $4 + sla c + rl b +.asm_35326 + ld hl, BattleMonSpclAtk + call GetDamageStatsCritical + jr c, .asm_35337 ; 3532c $9 + ld hl, $c6c9 + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, $c6bc +.asm_35337 + call $53c3 + jr .asm_3533f ; 3533a $3 +.asm_3533c + call $53b5 +.asm_3533f + call .asm_3534d + ld a, [BattleMonLevel] + ld e, a + call DittoMetalPowder + ld a, 1 + and a + ret + +.asm_3534d + ld a, h + or b + jr z, .asm_3536b ; 0x3534f $1a + srl b + rr c + srl b + rr c + ld a, c + or b + jr nz, .asm_3535e ; 0x3535b $1 + inc c +.asm_3535e + srl h + rr l + srl h + rr l + ld a, l + or h + jr nz, .asm_3536b ; 0x35368 $1 + inc l +.asm_3536b + ld a, [InLinkBattle] + cp $3 + jr z, .asm_35376 ; 0x35370 $4 + ld a, h + or b + jr nz, .asm_3534d ; 0x35374 $d7 +.asm_35376 + 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, [PlayerMoveType] + cp FIRE +; 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, [EnemyMoveType] + cp FIRE +; 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 +; If the attacking monster is Cubone or Marowak and +; it's holding a Thick Club, double stat value hl. + push bc + push de + ld b, CUBONE + ld c, MAROWAK + ld d, THICK_CLUB + call SpeciesItemBoost + pop de + pop bc + ret +; 353c3 + + +LightBallBoost: ; 353c3 +; If the attacking monster is Pikachu and it's +; holding a Light Ball, double stat value hl. + push bc + push de + ld b, PIKACHU + ld c, PIKACHU + ld d, LIGHT_BALL + call SpeciesItemBoost + pop de + pop bc + ret +; 353d1 + + +SpeciesItemBoost: ; 353d1 +; If the attacking monster is species b or c and +; it's holding item d, double stat value hl. + + ld a, [hli] + ld l, [hl] + ld h, a + + push hl + ld a, PartyMon1Species - PartyMon1 + call BattlePartyAttr + + ld a, [hBattleTurn] + and a + ld a, [hl] + jr z, .CompareSpecies + ld a, [TempEnemyMonSpecies] +.CompareSpecies + pop hl + + cp b + jr z, .GetItem + cp c + ret nz + +.GetItem + push hl + call GetUserItem + ld a, [hl] + pop hl + cp d + ret nz + +; Double the stat + sla l + rl h + ret +; 353f6 + + +EnemyAttackDamage: ; 353f6 + call ResetDamage + +; No damage dealt with 0 power. + ld hl, EnemyMovePower + ld a, [hli] ; hl = EnemyMoveType + ld d, a + and a + ret z + + ld a, [hl] + cp FIRE + jr nc, .Special + + +; Physical + ld hl, BattleMonDef + ld a, [hli] + ld b, a + ld c, [hl] + +; Reflect + ld a, [PlayerScreens] + bit 4, a + jr z, .asm_35416 + sla c + rl b + +.asm_35416 + ld hl, EnemyMonAtk + call GetDamageStatsCritical + jr c, .asm_35450 + + ld hl, $c6b8 + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, $c6c1 + jr .asm_35450 + + +.Special + ld hl, BattleMonSpclDef + ld a, [hli] + ld b, a + ld c, [hl] + +; Light Screen + ld a, [PlayerScreens] + bit 3, a + jr z, .asm_3543a + sla c + rl b + +.asm_3543a + ld hl, EnemyMonSpclAtk + call GetDamageStatsCritical + jr c, .asm_3544b + ld hl, $c6be + ld a, [hli] + ld b, a + ld c, [hl] + ld hl, $c6c7 + +.asm_3544b + call $53c3 + jr .asm_35453 + +.asm_35450 + call $53b5 + +.asm_35453 + call $534d + ld a, [EnemyMonLevel] + ld e, a + call $52b1 + ld a, 1 + and a + ret +; 35461 + + +BattleCommanda1: ; 35461 +; beatup + + call ResetDamage + ld a, [hBattleTurn] + and a + jp nz, .asm_354ef + ld a, [PlayerSubStatus3] + bit 2, a + jr nz, .asm_35482 ; 3546f $11 + ld c, $14 + call DelayFrames + xor a + ld [$c672], a + ld [DefaultFlypoint], a + ld [$c72d], a + jr .asm_3548d ; 35480 $b +.asm_35482 + ld a, [$c672] + ld b, a + ld a, [PartyCount] + sub b + ld [DefaultFlypoint], a +.asm_3548d + ld a, [DefaultFlypoint] + ld hl, PartyMon1Nickname + call $38a2 + ld a, $22 + call Function0x355bd + ld a, [hli] + or [hl] + jp z, $55b0 + ld a, [DefaultFlypoint] + ld c, a + ld a, [CurBattleMon] + cp [hl] + ld hl, BattleMonStatus + jr z, .asm_354b2 ; 354ab $5 + ld a, $20 + call Function0x355bd +.asm_354b2 + ld a, [hl] + and a + jp nz, $55b0 + ld a, $1 + ld [$c72d], a + ld hl, BeatUpAttackText + call FarBattleTextBox + ld a, [EnemyMonSpecies] + ld [CurSpecies], a + call $3856 + ld a, [$d239] + ld c, a + push bc + ld a, $0 + call Function0x355bd + ld a, [hl] + ld [CurSpecies], a + call $3856 + ld a, [$d238] + pop bc + ld b, a + push bc + ld a, $1f + call Function0x355bd + ld a, [hl] + ld e, a + pop bc + ld a, [PlayerMovePower] + ld d, a + ret + +.asm_354ef + ld a, [EnemySubStatus3] + bit 2, a + jr nz, .asm_35502 + + xor a + ld [$c67a], a + ld [DefaultFlypoint], a + ld [$c72d], a + jr .asm_3550d + +.asm_35502 + ld a, [$c67a] + ld b, a + ld a, [OTPartyCount] + sub b + ld [DefaultFlypoint], a +.asm_3550d + ld a, [IsInBattle] + dec a + jr z, .asm_3556b + + ld a, [InLinkBattle] + and a + jr nz, .asm_35532 + + ld a, [$cfc0] + and a + jr nz, .asm_35532 + + ld a, [DefaultFlypoint] + ld c, a + ld b, $0 + ld hl, OTPartySpecies + add hl, bc + ld a, [hl] + ld [$d265], a + call $343b + jr .asm_35544 + +.asm_35532 + ld a, [DefaultFlypoint] + ld hl, OTPartyMon1Nickname + ld bc, $000b + call AddNTimes + ld de, StringBuffer1 + call CopyBytes +.asm_35544 + ld a, $22 + call Function0x355bd + ld a, [hli] + or [hl] + jp z, $55b0 + ld a, [DefaultFlypoint] + ld b, a + ld a, [CurOTMon] + cp b + ld hl, EnemyMonStatus + jr z, .asm_35560 + + ld a, $20 + call Function0x355bd +.asm_35560 + ld a, [hl] + and a + jr nz, .asm_355b0 + + ld a, $1 + ld [$c72d], a + jr .asm_3557d + +.asm_3556b + ld a, [EnemyMonSpecies] + ld [$d265], a + call $343b + ld hl, BeatUpAttackText + call FarBattleTextBox + jp $53f6 +.asm_3557d + ld hl, BeatUpAttackText + call FarBattleTextBox + ld a, [BattleMonSpecies] + ld [CurSpecies], a + call GetBaseStats + ld a, [$d239] + ld c, a + push bc + ld a, $0 + call Function0x355bd + ld a, [hl] + ld [CurSpecies], a + call GetBaseStats + ld a, [$d238] + pop bc + ld b, a + push bc + ld a, $1f + call Function0x355bd + ld a, [hl] + ld e, a + pop bc + ld a, [EnemyMovePower] + ld d, a + ret + +.asm_355b0 + ld b, $12 + jp $7e8c +; 355b5 + + +BattleCommanda8: ; 355b5 + ld a, [$c72d] + and a + ret nz + jp $734e +; 355bd + + +Function0x355bd: ; 355bd + push bc + ld c, a + ld b, 0 + ld a, [hBattleTurn] + and a + ld hl, PartyMon1Species + jr z, .asm_355cc + + ld hl, OTPartyMon1Species2 +.asm_355cc + ld a, [DefaultFlypoint] + add hl, bc + call GetPartyLocation + pop bc + ret +; 355d5 + + +BattleCommanda9: ; 355d5 + ld a, [AttackMissed] + and a + ret z + jp ResetDamage +; 355dd + + +Function0x355dd: ; 355dd + call ResetDamage + ld a, [hBattleTurn] + and a + ld hl, BattleMonDef + ld de, PlayerScreens + ld a, [BattleMonLevel] + jr z, .asm_355f7 + + ld hl, EnemyMonDef + ld de, $c700 + ld a, [EnemyMonLevel] +.asm_355f7 + push af + ld a, [hli] + ld b, a + ld c, [hl] + ld a, [de] + bit 4, a + jr z, .asm_35604 + + sla c + rl b +.asm_35604 + dec hl + dec hl + dec hl + ld a, [hli] + ld l, [hl] + ld h, a + call $534d + ld d, $28 + pop af + ld e, a + ret +; 35612 + + +BattleCommand62: ; 35612 + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $7 + jr nz, .asm_35620 ; 35619 $5 + srl c + jr nz, .asm_35620 ; 3561d $1 + inc c +.asm_35620 + cp $1d + jr z, .asm_3562b ; 35622 $7 + cp $1e + jr z, .asm_3562b ; 35626 $3 + ld a, d + and a + ret z +.asm_3562b + ld a, c + and a + jr nz, .asm_35631 ; 3562d $2 + ld c, $1 +.asm_35631 + xor a + ld hl, $ffb3 + ld [hli], a + ld [hli], a + ld [hl], a + ld a, e + add a + jr nc, .asm_3563e ; 3563a $2 + ld [hl], $1 +.asm_3563e + inc hl + ld [hli], a + ld a, $5 + ld [hld], a + push bc + ld b, $4 + call $3124 + pop bc + inc [hl] + inc [hl] + inc hl + ld [hl], d + call $3119 + ld [hl], b + call $3119 + ld [hl], c + ld b, $4 + call $3124 + ld [hl], $32 + ld b, $4 + call $3124 + call GetUserItem + ld a, b + and a + jr z, .asm_3568f ; 35667 $26 + ld hl, TypeBoostItems +.asm_3566c + ld a, [hli] + cp $ff + jr z, .asm_3568f ; 3566f $1e + cp b + ld a, [hli] + jr nz, .asm_3566c ; 35673 $f7 + ld b, a + ld a, BATTLE_VARS_MOVE_TYPE + call CleanGetBattleVarPair + cp b + jr nz, .asm_3568f ; 3567c $11 + ld a, c + add $64 + ld [$ffb7], a + call $3119 + ld a, $64 + ld [$ffb7], a + ld b, $4 + call $3124 +.asm_3568f + call Function0x356eb + ld hl, CurDamage + ld b, [hl] + ld a, [$ffb6] + add b + ld [$ffb6], a + jr nc, .asm_356a5 ; 3569b $8 + ld a, [$ffb5] + inc a + ld [$ffb5], a + and a + jr z, .asm_356d9 ; 356a3 $34 +.asm_356a5 + ld a, [$ffb3] + ld b, a + ld a, [$ffb4] + or a + jr nz, .asm_356d9 ; 356ab $2c + ld a, [$ffb5] + cp $3 + jr c, .asm_356bd ; 356b1 $a + cp $4 + jr nc, .asm_356d9 ; 356b5 $22 + ld a, [$ffb6] + cp $e6 + jr nc, .asm_356d9 ; 356bb $1c +.asm_356bd + inc hl + ld a, [$ffb6] + ld b, [hl] + add b + ld [hld], a + ld a, [$ffb5] + ld b, [hl] + adc b + ld [hl], a + jr c, .asm_356d9 ; 356c8 $f + ld a, [hl] + cp $3 + jr c, .asm_356df ; 356cd $10 + cp $4 + jr nc, .asm_356d9 ; 356d1 $6 + inc hl + ld a, [hld] + cp $e6 + jr c, .asm_356df ; 356d7 $6 +.asm_356d9 + ld a, $3 + ld [hli], a + ld a, $e5 + ld [hld], a +.asm_356df + inc hl + ld a, [hl] + add $2 + ld [hld], a + jr nc, .asm_356e7 ; 356e4 $1 + inc [hl] +.asm_356e7 + ld a, $1 + and a + ret +; 356eb + + +Function0x356eb: ; 356eb + ld a, [CriticalHit] + and a + ret z + + ld a, [$ffb6] + add a + ld [$ffb6], a + ld a, [$ffb5] + rl a + ld [$ffb5], a + ret nc + + ld a, $ff + ld [$ffb5], a + ld [$ffb6], a + ret +; 35703 + + +TypeBoostItems: ; 35703 + db $32, NORMAL ; Pink/Polkadot Bow + db $33, FIGHTING ; Blackbelt + db $34, FLYING ; Sharp Beak + db $35, POISON ; Poison Barb + db $36, GROUND ; Soft Sand + db $37, ROCK ; Hard Stone + db $38, BUG ; Silverpowder + db $39, GHOST ; Spell Tag + db $3a, FIRE ; Charcoal + db $3b, WATER ; Mystic Water + db $3c, GRASS ; Miracle Seed + db $3d, ELECTRIC ; Magnet + db $3e, PSYCHIC ; Twistedspoon + db $3f, ICE ; Nevermeltice + db $40, DRAGON ; Dragon Scale + db $41, DARK ; Blackglasses + db $42, STEEL ; Metal Coat + db $ff +; 35726 + + +BattleCommand3f: ; 35726 + + ld hl, BattleMonLevel + ld a, [hBattleTurn] + and a + jr z, .asm_35731 + ld hl, EnemyMonLevel + +.asm_35731 + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $57 + ld b, [hl] + ld a, 0 + jr z, .asm_3578c + + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $58 + jr z, .asm_35758 + + cp $28 + jr z, .asm_3576b + + cp $63 + jr z, .asm_35792 + + ld a, BATTLE_VARS_MOVE_POWER + call CleanGetBattleVarPair + ld b, a + ld a, $0 + jr .asm_3578c + +.asm_35758 + ld a, b + srl a + add b + ld b, a +.asm_3575d + call FarBattleRNG + and a + jr z, .asm_3575d ; 35761 $fa + cp b + jr nc, .asm_3575d ; 35764 $f7 + ld b, a + ld a, $0 + jr .asm_3578c ; 35769 $21 +.asm_3576b + ld hl, EnemyMonHPHi + ld a, [hBattleTurn] + and a + jr z, .asm_35776 ; 35771 $3 + ld hl, BattleMonHP +.asm_35776 + ld a, [hli] + srl a + ld b, a + ld a, [hl] + rr a + push af + ld a, b + pop bc + and a + jr nz, .asm_3578c ; 35781 $9 + or b + ld a, $0 + jr nz, .asm_3578c ; 35786 $4 + ld b, $1 + jr .asm_3578c ; 3578a $0 +.asm_3578c + ld hl, CurDamage + ld [hli], a + ld [hl], b + ret +.asm_35792 + ld hl, BattleMonHP + ld a, [hBattleTurn] + and a + jr z, .asm_3579d ; 35798 $3 + ld hl, EnemyMonHPHi +.asm_3579d + xor a + ld [$ffb3], a + ld [$ffb4], a + ld a, [hli] + ld [$ffb5], a + ld a, [hli] + ld [$ffb6], a + ld a, $30 + ld [$ffb7], a + call $3119 + ld a, [hli] + ld b, a + ld a, [hl] + ld [$ffb7], a + ld a, b + and a + jr z, .asm_357d6 + + ld a, [$ffb7] + srl b + rr a + srl b + rr a + ld [$ffb7], a + ld a, [$ffb5] + ld b, a + srl b + ld a, [$ffb6] + rr a + srl b + rr a + ld [$ffb6], a + ld a, b + ld [$ffb5], a + +.asm_357d6 + ld b, $4 + call $3124 + ld a, [$ffb6] + ld b, a + ld hl, .table_35807 + +.asm_357e1 + ld a, [hli] + cp b + jr nc, .asm_357e8 + inc hl + jr .asm_357e1 + +.asm_357e8 + ld a, [hBattleTurn] + and a + ld a, [hl] + jr nz, .asm_357f8 + + ld hl, PlayerMovePower + ld [hl], a + push hl + call PlayerAttackDamage + jr .asm_35800 + +.asm_357f8 + ld hl, EnemyMovePower + ld [hl], a + push hl + call EnemyAttackDamage + +.asm_35800 + call $5612 + pop hl + ld [hl], 1 + ret + +.table_35807 + db 1, $c8 + db 4, $96 + db 9, $64 + db 16, $50 + db 32, $28 + db 48, $14 +; 35813 + + +BattleCommand40: ; 35813 + ld a, $1 + ld [AttackMissed], a + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + and a + ret z + ld b, a + ld hl, $45ec + ld a, $f + rst FarCall + ld a, b + cp $59 + ret z + call $4833 + ld a, [$d265] + and a + ret z + call Function0x36abf + ret z + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + dec a + ld de, StringBuffer1 + call GetMoveData + ld a, [$d075] + and a + ret z + ld a, [$d076] + cp $14 + 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, .asm_3585f ; 35859 $4 + ld a, $ff + ld [hli], a + ld [hl], a +.asm_3585f + xor a + ld [AttackMissed], a + ret +; 35864 + + +BattleCommand41: ; 35864 + ld hl, EnemyMonMoves + ld de, EnemyPerishCount + ld a, [hBattleTurn] + and a + jr z, .asm_35875 ; 3586d $6 + ld hl, BattleMonMoves + ld de, PlayerEncoreCount +.asm_35875 + ld a, BATTLE_VARS_LAST_MOVE_OPP + call CleanGetBattleVarPair + and a + jp z, $5923 + cp $a5 + jp z, $5923 + cp $e3 + jp z, $5923 + cp $77 + jp z, $5923 + ld b, a +.asm_3588e + ld a, [hli] + cp b + jr nz, .asm_3588e ; 35890 $fc + ld bc, $0005 + add hl, bc + ld a, [hl] + and $3f + jp z, $5923 + ld a, [AttackMissed] + and a + jp nz, $5923 + ld a, BATTLE_VARS_SUBSTATUS5_OPP + call GetBattleVarPair + bit 4, [hl] + jp nz, $5923 + set 4, [hl] + call FarBattleRNG + and $3 + inc a + inc a + inc a + ld [de], a + call Function0x36abf + jr nz, .asm_3591a ; 358bb $5d + ld a, [hBattleTurn] + and a + jr z, .asm_358ef ; 358c0 $2d + push hl + ld a, [LastPlayerMove] + ld b, a + ld c, $0 + ld hl, BattleMonMoves +.asm_358cc + ld a, [hli] + cp b + jr z, .asm_358dd ; 358ce $d + inc c + ld a, c + cp $4 + jr c, .asm_358cc ; 358d4 $f6 + pop hl + res 4, [hl] + xor a + ld [de], a + jr .asm_35923 ; 358db $46 +.asm_358dd + pop hl + ld a, c + ld [CurMoveNum], a + ld a, b + ld [CurPlayerMove], a + dec a + ld de, PlayerMoveStruct + call GetMoveData + jr .asm_3591a ; 358ed $2b +.asm_358ef + push hl + ld a, [LastEnemyMove] + ld b, a + ld c, $0 + ld hl, EnemyMonMoves +.asm_358f9 + ld a, [hli] + cp b + jr z, .asm_3590a ; 358fb $d + inc c + ld a, c + cp $4 + jr c, .asm_358f9 ; 35901 $f6 + pop hl + res 4, [hl] + xor a + ld [de], a + jr .asm_35923 ; 35908 $19 +.asm_3590a + pop hl + ld a, c + ld [CurEnemyMoveNum], a + ld a, b + ld [CurEnemyMove], a + dec a + ld de, EnemyMoveStruct + call GetMoveData +.asm_3591a + call $7e01 + ld hl, $5109 + jp FarBattleTextBox +.asm_35923 + jp PrintDidntAffect2 +; 35926 + + +BattleCommand42: ; 35926 + ld a, [AttackMissed] + and a + jp nz, .asm_359cd + call CheckSubstituteOpp + jp nz, .asm_359cd + call $7e01 + ld hl, $c63f + ld de, EnemyMonMaxHPLo + call .asm_3597d + ld a, $1 + ld [$d10a], a + ld hl, $c55e + ld a, $b + call $2d83 + ld hl, EnemyMonHPHi + ld a, [hli] + ld [$d1ed], a + ld a, [hli] + ld [$d1ec], a + ld a, [hli] + ld [$d1eb], a + ld a, [hl] + ld [$d1ea], a + call $59ac + xor a + ld [$d10a], a + call ResetDamage + ld hl, $c4ca + ld a, $b + call $2d83 + ld a, $5e + ld hl, $4000 + rst FarCall + ld hl, $511b + jp FarBattleTextBox + +.asm_3597d + ld a, [hld] + ld [$d1ea], a + ld a, [hld] + ld [$d1eb], a + ld a, [hld] + ld b, a + ld [$d1ec], a + ld a, [hl] + ld [$d1ed], a + dec de + dec de + ld a, [de] + dec de + add b + ld [$d257], a + ld b, [hl] + ld a, [de] + adc b + srl a + ld [CurDamage], a + ld a, [$d257] + rr a + ld [$d257], a + inc hl + inc hl + inc hl + inc de + inc de + inc de + ld c, [hl] + dec hl + ld a, [$d257] + sub c + ld b, [hl] + dec hl + ld a, [CurDamage] + sbc b + jr nc, .asm_359c2 + + ld a, [CurDamage] + ld b, a + ld a, [$d257] + ld c, a +.asm_359c2 + ld a, c + ld [hld], a + ld [$d1ee], a + ld a, b + ld [hli], a + ld [$d1ef], a + ret + +.asm_359cd + jp $7366 +; 359d0 + + +BattleCommand43: ; 359d0 + ld a, BATTLE_VARS_STATUS + call CleanGetBattleVarPair + and $7 + ret nz + call ResetDamage + ld a, $1 + ld [AttackMissed], a + call Function0x37354 + jp EndMoveEffect +; 359e6 + + +BattleCommand44: ; 359e6 + ld a, [AttackMissed] + and a + jr nz, .asm_35a50 ; 359ea $64 + ld hl, BattleMonType1 + ld a, [hBattleTurn] + and a + jr z, .asm_359f7 ; 359f2 $3 + ld hl, EnemyMonType1 +.asm_359f7 + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + and a + jr z, .asm_35a50 ; 359fd $51 + push hl + dec a + ld hl, $5afe + call $7ea1 + ld d, a + pop hl + cp $13 + jr z, .asm_35a50 ; 35a0b $43 + call $7e01 + call $4ffd +.asm_35a13 + call FarBattleRNG + and $1f + cp $a + jr c, .asm_35a24 ; 35a1a $8 + cp $14 + jr c, .asm_35a13 ; 35a1e $f3 + cp $1c + jr nc, .asm_35a13 ; 35a22 $ef +.asm_35a24 + ld [hli], a + ld [hld], a + push hl + ld a, BATTLE_VARS_MOVE_TYPE + call GetBattleVarPair + push af + push hl + ld a, d + ld [hl], a + call Function0x347c8 + pop hl + pop af + ld [hl], a + pop hl + ld a, [$d265] + cp $a + jr nc, .asm_35a13 ; 35a3c $d5 + call $4ffd + ld a, [hl] + ld [$d265], a + ld a, $29 + call $2d83 + ld hl, $5452 + jp FarBattleTextBox +.asm_35a50 + jp Function0x37354 +; 35a53 + + +BattleCommand45: ; 35a53 + call CheckSubstituteOpp + jr nz, .asm_35a6e ; 35a56 $16 + ld a, [AttackMissed] + and a + jr nz, .asm_35a6e ; 35a5c $10 + ld a, BATTLE_VARS_SUBSTATUS5_OPP + call GetBattleVarPair + set 5, [hl] + call $7e01 + ld hl, $5136 + jp FarBattleTextBox +.asm_35a6e + call $7e77 + jp PrintDidntAffect +; 35a74 + + +BattleCommand46: ; 35a74 + call Function0x372d8 + ld a, [InLinkBattle] + and a + jr z, .asm_35a83 ; 35a7b $6 + call $7e77 + jp PrintNothingHappened +.asm_35a83 + call CheckSubstituteOpp + jp nz, $5b10 + ld a, BATTLE_VARS_SUBSTATUS5_OPP + call GetBattleVarPair + bit 3, [hl] + jp nz, $5b10 + ld a, $2 + call $3945 + ld d, h + ld e, l + ld hl, BattleMonMoves + ld a, [hBattleTurn] + and a + jr z, .asm_35aa5 ; 35aa0 $3 + ld hl, EnemyMonMoves +.asm_35aa5 + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + ld [$d265], a + ld b, a + and a + jr z, .asm_35b10 ; 35aaf $5f + cp $a5 + jr z, .asm_35b10 ; 35ab3 $5b + ld c, $4 +.asm_35ab7 + ld a, [hli] + cp b + jr z, .asm_35b10 ; 35ab9 $55 + dec c + jr nz, .asm_35ab7 ; 35abc $f9 + dec hl + ld c, $4 +.asm_35ac1 + dec c + ld a, [hld] + cp $a6 + jr nz, .asm_35ac1 ; 35ac5 $fa + inc hl + ld a, b + ld [hl], a + push bc + push hl + dec a + ld hl, $5b00 + call $7ea1 + pop hl + ld bc, $0006 + add hl, bc + ld [hl], a + pop bc + ld a, [hBattleTurn] + and a + jr z, .asm_35af6 ; 35add $17 + ld a, [IsInBattle] + dec a + jr nz, .asm_35af6 ; 35ae3 $11 + ld a, [hl] + push bc + ld hl, $c739 + ld b, $0 + add hl, bc + ld [hl], a + ld hl, $c735 + add hl, bc + pop bc + ld [hl], b + jr .asm_35b04 ; 35af4 $e +.asm_35af6 + ld a, [hl] + push af + ld l, c + ld h, $0 + add hl, de + ld a, b + ld [hl], a + pop af + ld de, $0015 + add hl, de + ld [hl], a +.asm_35b04 + call $34f8 + call $7e01 + ld hl, $5143 + jp FarBattleTextBox +.asm_35b10 + call $7e77 + jp PrintDidntAffect +; 35b16 + + +BattleCommand47: ; 35b16 + call $7e01 + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + call Function0x360dd + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVarPair + ld a, [hl] + push hl + push af + ld a, $a + ld [hl], a + call BattleCommand1c + pop af + pop hl + ld [hl], a + ret +; 35b33 + + +BattleCommand48: ; 35b33 + call Function0x372d8 + ld a, [AttackMissed] + and a + jr nz, .asm_35ba3 ; 35b3a $67 + ld a, [hBattleTurn] + and a + ld hl, BattleMonMove2 + ld a, [DisabledMove] + ld d, a + jr z, .asm_35b4f ; 35b46 $7 + ld hl, EnemyMonMove2 + ld a, [EnemyEncoredMove] + ld d, a +.asm_35b4f + ld a, BATTLE_VARS_STATUS + call CleanGetBattleVarPair + and $7 + jr z, .asm_35ba3 ; 35b56 $4b + ld a, [hl] + and a + jr z, .asm_35ba3 ; 35b5a $47 + call .asm_35ba9 + jr c, .asm_35ba3 ; 35b5f $42 + dec hl +.asm_35b62 + push hl + call FarBattleRNG + and $3 + ld c, a + ld b, $0 + add hl, bc + ld a, [hl] + pop hl + and a + jr z, .asm_35b62 ; 35b6f $f1 + ld e, a + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + cp e + jr z, .asm_35b62 ; 35b78 $e8 + ld a, e + cp d + jr z, .asm_35b62 ; 35b7c $e4 + call .asm_35bdf + jr z, .asm_35b62 ; 35b81 $df + ld a, BATTLE_VARS_MOVE + call GetBattleVarPair + ld a, e + ld [hl], a + call Function0x34548 + jr nz, .asm_35b9a ; 35b8d $b + ld a, [$c689] + push af + call BattleCommand0a + pop af + ld [$c689], a +.asm_35b9a + call $7e36 + call UpdateMoveData + jp ResetTurn +.asm_35ba3 + call $7e77 + jp $7349 + +.asm_35ba9 + push hl + push de + push bc + call .asm_35bb3 + pop bc + pop de + pop hl + ret + +.asm_35bb3 + ld a, [$ffe4] + and a + ld a, [DisabledMove] + jr z, .asm_35bbe + + ld a, [EnemyEncoredMove] +.asm_35bbe + ld b, a + ld a, $10 + call CleanGetBattleVarPair + ld c, a + dec hl + ld d, $4 +.asm_35bc8 + ld a, [hl] + and a + jr z, .asm_35bdb + + cp c + jr z, .asm_35bd7 + + cp b + jr z, .asm_35bd7 + + call .asm_35bdf + jr nz, .asm_35bdd + +.asm_35bd7 + inc hl + dec d + jr nz, .asm_35bc8 + +.asm_35bdb + scf + ret + +.asm_35bdd + and a + ret + +.asm_35bdf + push hl + push de + push bc + + ld b, a + ld hl, $45ec + ld a, $f + rst $8 + ld a, b + + pop bc + pop de + pop hl + + cp $91 + ret z + + cp $27 + ret z + + cp $4b + ret z + + cp $97 + ret z + + cp $9b + ret z + + cp $1a + ret +; 35bff + + +BattleCommand49: ; 35bff + ld a, BATTLE_VARS_SUBSTATUS5 + call GetBattleVarPair + set 6, [hl] + call $7e01 + ld hl, $5156 + jp FarBattleTextBox +; 35c0f + + +BattleCommand4a: ; 35c0f + ld a, [AttackMissed] + and a + jp nz, $5c91 + ld bc, $0030 + ld hl, EnemyMonMoves + ld a, [hBattleTurn] + and a + jr z, .asm_35c24 ; 35c1f $3 + ld hl, BattleMonMoves +.asm_35c24 + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + and a + jr z, .asm_35c91 ; 35c2a $65 + cp $a5 + jr z, .asm_35c91 ; 35c2e $61 + ld b, a + ld c, $ff +.asm_35c33 + inc c + ld a, [hli] + cp b + jr nz, .asm_35c33 ; 35c36 $fb + ld [$d265], a + dec hl + ld b, $0 + push bc + ld c, $6 + add hl, bc + pop bc + ld a, [hl] + and $3f + jr z, .asm_35c91 ; 35c46 $49 + push bc + call $34f8 + call FarBattleRNG + and $3 + inc a + inc a + ld b, a + ld a, [hl] + and $3f + cp b + jr nc, .asm_35c5b ; 35c58 $1 + ld b, a +.asm_35c5b + ld a, [hl] + sub b + ld [hl], a + push af + ld a, $17 + call $3951 + ld d, b + pop af + pop bc + add hl, bc + ld e, a + ld a, BATTLE_VARS_SUBSTATUS5_OPP + call CleanGetBattleVarPair + bit 3, a + jr nz, .asm_35c82 ; 35c70 $10 + ld a, [hBattleTurn] + and a + jr nz, .asm_35c81 ; 35c75 $a + ld a, [IsInBattle] + dec a + jr nz, .asm_35c81 ; 35c7b $4 + ld hl, $c739 + add hl, bc +.asm_35c81 + ld [hl], e +.asm_35c82 + push de + call $7e01 + pop de + ld a, d + ld [$d265], a + ld hl, $517f + jp FarBattleTextBox +.asm_35c91 + jp PrintDidntAffect2 +; 35c94 + + +BattleCommand4b: ; 35c94 + ld hl, EnemyMonHPHi + ld a, [hBattleTurn] + and a + jr z, .asm_35c9f ; 35c9a $3 + ld hl, BattleMonHP +.asm_35c9f + ld de, CurDamage + ld c, $2 + push hl + push de + call StringCmp + pop de + pop hl + jr c, .asm_35cc7 ; 35cab $1a + ld a, [hli] + ld [de], a + inc de + ld a, [hl] + dec a + ld [de], a + inc a + jr nz, .asm_35cba ; 35cb4 $4 + dec de + ld a, [de] + dec a + ld [de], a +.asm_35cba + ld a, [CriticalHit] + cp $2 + jr nz, .asm_35cc5 ; 35cbf $4 + xor a + ld [CriticalHit], a +.asm_35cc5 + scf + ret +.asm_35cc7 + and a + ret +; 35cc9 + + +BattleCommand4c: ; 35cc9 + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + res 0, [hl] + ld de, PartyMon1Status + ld a, [hBattleTurn] + and a + jr z, .asm_35cdb ; 35cd6 $3 + ld de, OTPartyMon1Status +.asm_35cdb + ld a, BATTLE_VARS_STATUS + call GetBattleVarPair + xor a + ld [hl], a + ld h, d + ld l, e + ld bc, $0030 + ld d, $6 +.asm_35ce9 + ld [hl], a + add hl, bc + dec d + jr nz, .asm_35ce9 ; 35cec $fb + call $7e01 + ld hl, $51a0 + call FarBattleTextBox + ld a, [hBattleTurn] + and a + jp z, Function0x365d7 + jp Function0x365fd +; 35d00 + + +FarPlayBattleAnimation: ; 35d00 +; play animation de + +; battle animations disabled? + ld a, BATTLE_VARS_SUBSTATUS3 + call CleanGetBattleVarPair + and $60 ; bit 6 | 5 + ret nz + + ; fallthrough +; 35d08 + +PlayFXAnimID: ; 35d08 + ld a, e + ld [FXAnimIDLo], a + ld a, d + ld [FXAnimIDHi], a + + ld c, 3 + call DelayFrames + + ld hl, $40d6 + ld a, $33 + rst FarCall ; callab SafePlayBattleAnimation + + ret +; 35d1c + + +Function0x35d1c: ; 35d1c + ld hl, CurDamage + ld a, [hli] + ld b, a + ld a, [hl] + or b + jr z, .asm_35d7b + + ld a, c + and a + jr nz, .asm_35d31 + + ld a, [EnemySubStatus4] + bit 4, a + jp nz, Function0x35de0 +.asm_35d31 + ld a, [hld] + ld b, a + ld a, [EnemyMonHPLo] + ld [$d1ec], a + sub b + ld [EnemyMonHPLo], a + ld a, [hl] + ld b, a + ld a, [EnemyMonHPHi] + ld [$d1ed], a + sbc b + ld [EnemyMonHPHi], a + jr nc, .asm_35d59 + + ld a, [$d1ed] + ld [hli], a + ld a, [$d1ec] + ld [hl], a + xor a + ld hl, EnemyMonHPHi + ld [hli], a + ld [hl], a +.asm_35d59 + ld hl, EnemyMonMaxHPHi + ld a, [hli] + ld [$d1eb], a + ld a, [hl] + ld [$d1ea], a + ld hl, EnemyMonHPHi + ld a, [hli] + ld [$d1ef], a + ld a, [hl] + ld [$d1ee], a + ld hl, $c4ca + xor a + ld [$d10a], a + ld a, $b + call Predef +.asm_35d7b + jp $39c9 +; 35d7e + + +Function0x35d7e: ; 35d7e + ld hl, CurDamage + ld a, [hli] + ld b, a + ld a, [hl] + or b + jr z, .asm_35ddd + + ld a, c + and a + jr nz, .asm_35d93 + + ld a, [PlayerSubStatus4] + bit 4, a + jp nz, Function0x35de0 +.asm_35d93 + ld a, [hld] + ld b, a + ld a, [$c63d] + ld [$d1ec], a + sub b + ld [$c63d], a + ld [$d1ee], a + ld b, [hl] + ld a, [BattleMonHP] + ld [$d1ed], a + sbc b + ld [BattleMonHP], a + ld [$d1ef], a + jr nc, .asm_35dc5 + + ld a, [$d1ed] + ld [hli], a + ld a, [$d1ec] + ld [hl], a + xor a + ld hl, BattleMonHP + ld [hli], a + ld [hl], a + ld hl, $d1ee + ld [hli], a + ld [hl], a +.asm_35dc5 + ld hl, BattleMonMaxHP + ld a, [hli] + ld [$d1eb], a + ld a, [hl] + ld [$d1ea], a + ld hl, $c55e + ld a, $1 + ld [$d10a], a + ld a, $b + call Predef +.asm_35ddd + jp $39c9 +; 35de0 + + +Function0x35de0: ; 35de0 + ld hl, $53ad + call FarBattleTextBox + ld de, $c6e0 + ld a, [$ffe4] + and a + jr z, .asm_35df1 + + ld de, $c6df +.asm_35df1 + ld hl, CurDamage + ld a, [hli] + and a + jr nz, .asm_35dff + + ld a, [de] + sub [hl] + ld [de], a + jr z, .asm_35dff + + jr nc, .asm_35e3d + +.asm_35dff + ld a, $8 + call GetBattleVarPair + res 4, [hl] + ld hl, $53d0 + call FarBattleTextBox + call $4ffd + call $65c3 + ld a, $2 + call CleanGetBattleVarPair + and $60 + call z, $7ec7 + call $4ffd + ld a, $d + call GetBattleVarPair + cp $1d + jr z, .asm_35e3a + + cp $2c + jr z, .asm_35e3a + + cp $4d + jr z, .asm_35e3a + + cp $68 + jr z, .asm_35e3a + + cp $9a + jr z, .asm_35e3a + + xor a + ld [hl], a +.asm_35e3a + call $39c9 +.asm_35e3d + jp ResetDamage +; 35e40 + + +UpdateMoveData: ; 35e40 + + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVarPair + ld d, h + ld e, l + + ld a, BATTLE_VARS_MOVE + call CleanGetBattleVarPair + ld [$cf60], a ; not CurSpecies + ld [$d265], a + + dec a + call GetMoveData + call GetMoveName + jp CopyName1 +; 35e5c + + +BattleCommand14: ; 35e5c +; sleeptarget + call GetOpponentItem + ld a, b + cp $17 + jr nz, .asm_35e70 ; 35e62 $c + ld a, [hl] + ld [$d265], a + call $3468 + ld hl, $55a9 + jr .asm_35ec6 ; 35e6e $56 +.asm_35e70 + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + ld d, h + ld e, l + ld a, [de] + and $7 + ld hl, $51c1 + jr nz, .asm_35ec6 ; 35e7d $47 + ld a, [AttackMissed] + and a + jp nz, PrintDidntAffect2 + ld hl, $550c + call Function0x35ece + jr c, .asm_35ec6 ; 35e8c $38 + ld a, [de] + and a + jr nz, .asm_35ec6 ; 35e90 $34 + call CheckSubstituteOpp + jr nz, .asm_35ec6 ; 35e95 $2f + call $7e01 + ld b, $7 + ld a, [$cfc0] + and a + jr z, .asm_35ea4 ; 35ea0 $2 + ld b, $3 +.asm_35ea4 + call FarBattleRNG + and b + jr z, .asm_35ea4 ; 35ea8 $fa + cp $7 + jr z, .asm_35ea4 ; 35eac $f6 + inc a + ld [de], a + call $398e + call $39c9 + ld hl, $51b1 + call FarBattleTextBox + ld a, $f + ld hl, $5de9 + rst FarCall + jp z, $4216 + ret +.asm_35ec6 + push hl + call $7e77 + pop hl + jp FarBattleTextBox +; 35ece + + +Function0x35ece: ; 35ece +; Enemy turn + ld a, [hBattleTurn] + and a + jr z, .asm_35eec + +; Not in link battle + ld a, [InLinkBattle] + and a + jr nz, .asm_35eec + + + ld a, [$cfc0] + and a + jr nz, .asm_35eec + +; Not locked-on by the enemy + ld a, [PlayerSubStatus5] + bit 5, a + jr nz, .asm_35eec + + call FarBattleRNG + cp $40 + ret c + +.asm_35eec + xor a + ret +; 35eee + + +BattleCommand13: ; 35eee + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + and a + ret nz + ld a, [TypeModifier] + and $7f + ret z + call Function0x35fe1 + ret z + call GetOpponentItem + ld a, b + cp $14 + ret z + ld a, [$c70d] + and a + ret nz + call Function0x37962 + ret nz + call Function0x35ff5 + ld de, $0106 + call $7e54 + call $39c9 + ld hl, $51d5 + call FarBattleTextBox + ld a, $f + ld hl, $5de9 + rst FarCall + ret +; 35f2c + + +BattleCommand2f: ; 35f2c + ld hl, $5071 + ld a, [TypeModifier] + and $7f + jp z, $5fb8 + call Function0x35fe1 + jp z, $5fb8 + ld a, BATTLE_VARS_STATUS_OPP + call CleanGetBattleVarPair + ld b, a + ld hl, $51fa + and $8 + jp nz, $5fb8 + call GetOpponentItem + ld a, b + cp $14 + jr nz, .asm_35f5f ; 35f51 $c + ld a, [hl] + ld [$d265], a + call $3468 + ld hl, $55a9 + jr .asm_35fb8 ; 35f5d $59 +.asm_35f5f + ld hl, $550c + ld a, BATTLE_VARS_STATUS_OPP + call CleanGetBattleVarPair + and a + jr nz, .asm_35fb8 ; 35f68 $4e + ld a, [hBattleTurn] + and a + jr z, .asm_35f89 ; 35f6d $1a + ld a, [InLinkBattle] + and a + jr nz, .asm_35f89 ; 35f73 $14 + ld a, [$cfc0] + and a + jr nz, .asm_35f89 ; 35f79 $e + ld a, [PlayerSubStatus5] + bit 5, a + jr nz, .asm_35f89 ; 35f80 $7 + call FarBattleRNG + cp $40 + jr c, .asm_35fb8 ; 35f87 $2f +.asm_35f89 + call CheckSubstituteOpp + jr nz, .asm_35fb8 ; 35f8c $2a + ld a, [AttackMissed] + and a + jr nz, .asm_35fb8 ; 35f92 $24 + call Function0x35fc9 + jr z, .asm_35fa4 ; 35f97 $b + call Function0x35fc0 + ld hl, $51d5 + call FarBattleTextBox + jr .asm_35fb1 ; 35fa2 $d +.asm_35fa4 + set 0, [hl] + xor a + ld [de], a + call Function0x35fc0 + ld hl, $51e6 + call FarBattleTextBox +.asm_35fb1 + ld a, $f + ld hl, $5de9 + rst FarCall + ret +.asm_35fb8 + push hl + call $7e77 + pop hl + jp FarBattleTextBox +; 35fc0 + + +Function0x35fc0: ; 35fc0 + call $7e01 + call Function0x35ff5 + jp $39c9 +; 35fc9 + + +Function0x35fc9: ; 35fc9 + ld a, $9 + call $39e7 + ld a, [hBattleTurn] + and a + ld de, $c67c + jr z, .asm_35fd9 ; 0x35fd4 $3 + ld de, $c674 +.asm_35fd9 + ld a, $d + call CleanGetBattleVarPair + cp $21 + ret +; 35fe1 + + +Function0x35fe1: ; 35fe1 + ld de, EnemyMonType1 + ld a, [hBattleTurn] + and a + jr z, .asm_35fec ; 0x35fe7 $3 + ld de, BattleMonType1 +.asm_35fec + ld a, [de] + inc de + cp $3 + ret z + ld a, [de] + cp $3 + ret +; 35ff5 + + +Function0x35ff5: ; 35ff5 + ld a, $b + call $39e7 + set 3, [hl] + jp $398e +; 35fff + + +BattleCommand15: ; 35fff + call Function0x36011 + ld hl, $5210 + jp FarBattleTextBox +; 36008 + + +BattleCommand16: ; 36008 + call Function0x36011 + ld hl, $5227 + jp FarBattleTextBox +; 36011 + + +Function0x36011: ; 36011 + ld hl, CurDamage + ld a, [hli] + srl a + ld [$ffb3], a + ld b, a + ld a, [hl] + rr a + ld [$ffb4], a + or b + jr nz, .asm_36026 ; 0x36020 $4 + ld a, $1 + ld [$ffb4], a +.asm_36026 + ld hl, BattleMonHP + ld de, BattleMonMaxHP + ld a, [hBattleTurn] + and a + jr z, .asm_36037 ; 0x3602f $6 + ld hl, EnemyMonHPHi + ld de, EnemyMonMaxHPHi +.asm_36037 + ld bc, $d1ed + ld a, [hli] + ld [bc], a + ld a, [hl] + dec bc + ld [bc], a + ld a, [de] + dec bc + ld [bc], a + inc de + ld a, [de] + dec bc + ld [bc], a + ld a, [$ffb4] + ld b, [hl] + add b + ld [hld], a + ld [$d1ee], a + ld a, [$ffb3] + ld b, [hl] + adc b + ld [hli], a + ld [$d1ef], a + jr c, .asm_36064 ; 0x36056 $c + ld a, [hld] + ld b, a + ld a, [de] + dec de + sub b + ld a, [hli] + ld b, a + ld a, [de] + inc de + sbc b + jr nc, .asm_36070 ; 0x36062 $c +.asm_36064 + ld a, [de] + ld [hld], a + ld [$d1ee], a + dec de + ld a, [de] + ld [hli], a + ld [$d1ef], a + inc de +.asm_36070 + ld a, [hBattleTurn] + and a + ld hl, $c55e + ld a, $1 + jr z, .asm_3607e ; 0x36078 $4 + ld hl, $c4ca + xor a +.asm_3607e + ld [$d10a], a + ld a, $b + call Predef + call $39c9 + jp $399c +; 3608c + + +BattleCommand17: ; 3608c + xor a + ld [$cfca], a + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + and a + jp nz, Function0x360dd + ld a, [TypeModifier] + and $7f + ret z + call Function0x36e5b + ret z + call GetOpponentItem + ld a, b + cp $15 + ret z + ld a, [$c70d] + and a + ret nz + call Function0x37962 + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + set 4, [hl] + call $398e + ld hl, $6c76 + call $7e73 + ld de, $0105 + call $7e54 + call $39c9 + ld hl, $523c + call FarBattleTextBox + ld a, $f + ld hl, $5de9 + rst FarCall + ret +; 360dd + + +Function0x360dd: ; 360dd + ld a, [hl] + and $20 + ret z + xor a + ld [hl], a + ld a, [hBattleTurn] + and a + ld a, [CurOTMon] + ld hl, OTPartyMon1Status + jr z, .asm_360f4 ; 0x360ec $6 + ld hl, PartyMon1Status + ld a, [CurBattleMon] +.asm_360f4 + call GetPartyLocation + xor a + ld [hl], a + call $398e + ld hl, $524b + jp FarBattleTextBox +; 36102 + + +BattleCommand18: ; 36102 + xor a + ld [$cfca], a + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + and a + ret nz + ld a, [TypeModifier] + and $7f + ret z + ld a, [Weather] + cp $2 + ret z + call Function0x36e5b + ret z + call GetOpponentItem + ld a, b + cp $16 + ret z + ld a, [$c70d] + and a + ret nz + call Function0x37962 + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + set 5, [hl] + call $398e + ld de, $0108 + call $7e54 + call $39c9 + ld hl, $525d + call FarBattleTextBox + ld a, $f + ld hl, $5de9 + rst FarCall + ret nz + call $4216 + call EndRechargeOpp + ld hl, $c740 + ld a, [hBattleTurn] + and a + jr z, .asm_36162 ; 3615d $3 + ld hl, $c73f +.asm_36162 + ld [hl], $1 + ret +; 36165 + + +BattleCommand19: ; 36165 + xor a + ld [$cfca], a + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + and a + ret nz + ld a, [TypeModifier] + and $7f + ret z + call GetOpponentItem + ld a, b + cp $18 + ret z + ld a, [$c70d] + and a + ret nz + call Function0x37962 + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + set 6, [hl] + call $398e + ld hl, $6c39 + call $7e73 + ld de, $0109 + call $7e54 + call $39c9 + call PrintParalyze + ld hl, $5de9 + jp $7e73 +; 361ac + + +BattleCommand70: ; 361ac +; attackup + ld b, $0 + jr BattleCommand1c +BattleCommand71: ; 361b0 +; defenseup + ld b, $1 + jr BattleCommand1c +BattleCommand72: ; 361b4 +; speedup + ld b, $2 + jr BattleCommand1c +BattleCommand73: ; 361b8 +; specialattackup + ld b, $3 + jr BattleCommand1c +BattleCommand74: ; 361bc +; specialdefenseup + ld b, $4 + jr BattleCommand1c +BattleCommand75: ; 361c0 +; accuracyup + ld b, $5 + jr BattleCommand1c +BattleCommand76: ; 361c4 +; evasionup + ld b, $6 + jr BattleCommand1c +BattleCommand77: ; 361c8 +; attackup2 + ld b, $10 + jr BattleCommand1c +BattleCommand78: ; 361cc +; defenseup2 + ld b, $11 + jr BattleCommand1c +BattleCommand79: ; 361d0 +; speedup2 + ld b, $12 + jr BattleCommand1c +BattleCommand7a: ; 361d4 +; specialattackup2 + ld b, $13 + jr BattleCommand1c +BattleCommand7b: ; 361d8 +; specialdefenseup2 + ld b, $14 + jr BattleCommand1c +BattleCommand7c: ; 361dc +; accuracyup2 + ld b, $15 + jr BattleCommand1c +BattleCommand7d: ; 361e0 +; evasionup2 + ld b, $16 + jr BattleCommand1c +BattleCommand1c: ; 361e4 +; statup + call Function0x361ef + ld a, [$c70e] + and a + ret nz + jp Function0x36281 +; 361ef + + +Function0x361ef: ; 361ef + ld a, b + ld [$c70c], a + ld hl, PlayerStatLevels + ld a, [hBattleTurn] + and a + jr z, .asm_361fe ; 0x361f9 $3 + ld hl, EnemyStatLevels +.asm_361fe + ld a, [AttackMissed] + and a + jp nz, Function0x3627b + ld a, [$c70d] + and a + jp nz, Function0x3627b + ld a, [$c70c] + and $f + ld c, a + ld b, $0 + add hl, bc + ld b, [hl] + inc b + ld a, $d + cp b + jp c, $6270 + ld a, [$c70c] + and $f0 + jr z, .asm_3622b ; 0x36222 $7 + inc b + ld a, $d + cp b + jr nc, .asm_3622b ; 0x36228 $1 + ld b, a +.asm_3622b + ld [hl], b + push hl + ld a, c + cp $5 + jr nc, .asm_36268 ; 0x36230 $36 + ld hl, $c641 + ld de, $c6b6 + ld a, [hBattleTurn] + and a + jr z, .asm_36243 ; 0x3623b $6 + ld hl, $d21b + ld de, $c6c1 +.asm_36243 + push bc + sla c + ld b, $0 + add hl, bc + ld a, c + add e + ld e, a + jr nc, .asm_3624f ; 0x3624c $1 + inc d +.asm_3624f + pop bc + ld a, [hld] + sub $e7 + jr nz, .asm_3625b ; 0x36253 $6 + ld a, [hl] + sbc $3 + jp z, Function0x3626e +.asm_3625b + ld a, [hBattleTurn] + and a + jr z, .asm_36265 ; 0x3625e $5 + call Function0x365fd + jr .asm_36268 ; 0x36263 $3 +.asm_36265 + call Function0x365d7 +.asm_36268 + pop hl + xor a + ld [$c70e], a + ret +; 3626e + +Function0x3626e: ; 3626e + pop hl + dec [hl] + ld a, $2 + ld [$c70e], a + ld a, $1 + ld [AttackMissed], a + ret +; 3627b + +Function0x3627b: ; 3627b + ld a, $1 + ld [$c70e], a + ret +; 36281 + +Function0x36281: ; 36281 + ld bc, $c6fe + ld hl, $7447 + ld a, [hBattleTurn] + and a + jr z, .asm_36292 ; 0x3628a $6 + ld bc, $c6fa + ld hl, $7486 +.asm_36292 + ld a, $c + call CleanGetBattleVarPair + cp $6b + ret nz + ld a, $1 + ld [bc], a + call $7ed5 + ret nc + xor a + ld [$ffd4], a + call $7e73 + call WaitBGMap + jp $7e80 +; 362ad + + +BattleCommand7e: ; 362ad +; attackdown + ld a, $0 + jr BattleCommand1d +BattleCommand7f: ; 362b1 +; defensedown + ld a, $1 + jr BattleCommand1d +BattleCommand80: ; 362b5 +; speeddown + ld a, $2 + jr BattleCommand1d +BattleCommand81: ; 362b9 +; specialattackdown + ld a, $3 + jr BattleCommand1d +BattleCommand82: ; 362bd +; specialdefensedown + ld a, $4 + jr BattleCommand1d +BattleCommand83: ; 362c1 +; accuracydown + ld a, $5 + jr BattleCommand1d +BattleCommand84: ; 362c5 +; evasiondown + ld a, $6 + jr BattleCommand1d +BattleCommand85: ; 362c9 +; attackdown2 + ld a, $10 + jr BattleCommand1d +BattleCommand86: ; 362cd +; defensedown2 + ld a, $11 + jr BattleCommand1d +BattleCommand87: ; 362d1 +; speeddown2 + ld a, $12 + jr BattleCommand1d +BattleCommand88: ; 362d5 +; specialattackdown2 + ld a, $13 + jr BattleCommand1d +BattleCommand89: ; 362d9 +; specialdefensedown2 + ld a, $14 + jr BattleCommand1d +BattleCommand8a: ; 362dd +; accuracydown2 + ld a, $15 + jr BattleCommand1d +BattleCommand8b: ; 362e1 +; evasiondown2 + ld a, $16 + +BattleCommand1d: ; 362e3 +; statdown + ld [$c70c], a + call Function0x36391 + jp nz, Function0x36386 + ld hl, EnemyStatLevels + ld a, [hBattleTurn] + and a + jr z, .asm_362f7 ; 362f2 $3 + ld hl, PlayerStatLevels +.asm_362f7 + ld a, [$c70c] + and $f + ld c, a + ld b, $0 + add hl, bc + ld b, [hl] + dec b + jp z, $6372 + ld a, [$c70c] + and $f0 + jr z, .asm_36310 ; 3630a $4 + dec b + jr nz, .asm_36310 ; 3630d $1 + inc b +.asm_36310 + ld a, [hBattleTurn] + and a + jr z, .asm_36338 ; 36313 $23 + ld a, [InLinkBattle] + and a + jr nz, .asm_36338 ; 36319 $1d + ld a, [$cfc0] + and a + jr nz, .asm_36338 ; 3631f $17 + ld a, [PlayerSubStatus5] + bit 5, a + jr nz, .asm_36338 ; 36326 $10 + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $49 + jr z, .asm_36338 ; 3632f $7 + call FarBattleRNG + cp $40 + jr c, .asm_3637d ; 36336 $45 +.asm_36338 + call CheckSubstituteOpp + jr nz, .asm_3637d ; 3633b $40 + ld a, [AttackMissed] + and a + jr nz, .asm_3637d ; 36341 $3a + ld a, [$c70d] + and a + jr nz, .asm_3637d ; 36347 $34 + call CheckHiddenOpponent + jr nz, .asm_3637d ; 3634c $2f + ld [hl], b + ld a, c + cp $5 + jr nc, .asm_3636c ; 36352 $18 + push hl + ld hl, $d21b + ld de, $c6c1 + ld a, [hBattleTurn] + and a + jr z, .asm_36366 ; 3635e $6 + ld hl, $c641 + ld de, $c6b6 +.asm_36366 + call Function0x3641a + pop hl + jr z, .asm_36371 ; 3636a $5 +.asm_3636c + xor a + ld [$c70e], a + ret +.asm_36371 + inc [hl] + ld a, $3 + ld [$c70e], a + ld a, $1 + ld [AttackMissed], a + ret +.asm_3637d + ld a, $1 + ld [$c70e], a + ld [AttackMissed], a + ret +; 36386 + + +Function0x36386: ; 36386 + ld a, $2 + ld [$c70e], a + ld a, $1 + ld [AttackMissed], a + ret +; 36391 + + +Function0x36391: ; 36391 + ld a, $d + call CleanGetBattleVarPair + cp $12 + jr c, .asm_363ae ; 0x36398 $14 + cp $19 + jr c, .asm_363b0 ; 0x3639c $12 + cp $3a + jr c, .asm_363ae ; 0x363a0 $c + cp $41 + jr c, .asm_363b0 ; 0x363a4 $a + cp $44 + jr c, .asm_363ae ; 0x363a8 $4 + cp $4b + jr c, .asm_363b0 ; 0x363ac $2 +.asm_363ae + xor a + ret +.asm_363b0 + ld a, $8 + call CleanGetBattleVarPair + bit 1, a + ret +; 363b8 + + +BattleCommand8c: ; 363b8 + ld a, [$c70e] + and a + ret nz + ld a, [$c70c] + and $f + ld b, a + inc b + call $648f + ld hl, .stat + jp BattleTextBox + +.stat + TX_FAR UnknownText_0x1c0cc6 + start_asm + + ld hl, .up + ld a, [$c70c] + and $f0 + ret z + ld hl, .wayup + ret + +.wayup + TX_FAR UnknownText_0x1c0cd0 + db "@" + +.up + TX_FAR UnknownText_0x1c0ce0 + db "@" + +; 363e9 + + +BattleCommand8d: ; 363e9 + ld a, [$c70e] + and a + ret nz + ld a, [$c70c] + and $f + ld b, a + inc b + call $648f + ld hl, .stat + jp BattleTextBox + +.stat + TX_FAR UnknownText_0x1c0ceb + start_asm + + ld hl, .fell + ld a, [$c70c] + and $f0 + ret z + ld hl, .sharplyfell + ret + +.sharplyfell + TX_FAR UnknownText_0x1c0cf5 + db "@" +.fell + TX_FAR UnknownText_0x1c0d06 + db "@" + +; 3641a + + +Function0x3641a: ; 3641a + push bc + sla c + ld b, $0 + add hl, bc + ld a, c + add e + ld e, a + jr nc, .asm_36426 ; 0x36423 $1 + inc d +.asm_36426 + pop bc + ld a, [hld] + sub $1 + jr nz, .asm_3642f ; 0x3642a $3 + ld a, [hl] + and a + ret z +.asm_3642f + ld a, [hBattleTurn] + and a + jr z, .asm_3643f ; 0x36432 $b + call $4ffd + call Function0x365d7 + call $4ffd + jr .asm_36448 ; 0x3643d $9 +.asm_3643f + call $4ffd + call Function0x365fd + call $4ffd +.asm_36448 + ld a, $1 + and a + ret +; 3644c + + +BattleCommand8e: ; 3644c +; applystatuser + ld a, [$c70e] + and a + ret z + push af + call $7e80 + pop af + dec a + jp z, $7349 + ld a, [$c70c] + and $f + ld b, a + inc b + call $648f + ld hl, $5272 + jp FarBattleTextBox +; 3646a + + +BattleCommand8f: ; 3646a +; applystattarget + ld a, [$c70e] + and a + ret z + push af + call $7e80 + pop af + dec a + jp z, $7349 + dec a + ld hl, $5321 + jp z, FarBattleTextBox + ld a, [$c70c] + and $f + ld b, a + inc b + call $648f + ld hl, $528f + jp FarBattleTextBox +; 3648f + + +GetStatName: ; 3648f + ld hl, .names + ld c, "@" +.CheckName + dec b + jr z, .Copy +.GetName + ld a, [hli] + cp c + jr z, .CheckName + jr .GetName +.Copy + ld de, StringBuffer2 + ld bc, StringBuffer3 - StringBuffer2 + jp CopyBytes + +.names + db "ATTACK@" + db "DEFENSE@" + db "SPEED@" + db "SPCL.ATK@" + db "SPCL.DEF@" + db "ACCURACY@" + db "EVASION@" + db "ABILITY@" +; 364e6 + + +Table0x364e6: ; 364e6 + dw $6419 + dw $641c + dw $6421 + dw $6428 + dw $6432 + dw $6442 +; 364f2 + + +StatLevelMulipliers: ; 364f2 + db 1, 1 ; 1.0x + db 15, 10 ; 1.5x + db 2, 1 ; 2.0x + db 25, 10 ; 2.5x + db 3, 1 ; 3.0x + db 35, 10 ; 3.5x + db 4, 1 ; 4.0x +; 36500 + + +BattleCommanda4: ; 36500 + call ResetMiss + call BattleCommand70 + call $63b8 + + call ResetMiss + call $61b0 + call $63b8 + + call ResetMiss + call $61b4 + call $63b8 + + call ResetMiss + call $61b8 + call $63b8 + + call ResetMiss + call $61bc + jp $63b8 +; 3652d + + +ResetMiss: ; 3652d + xor a + ld [AttackMissed], a + ret +; 36532 + + +Function0x36532: ; 36532 + ld [$c70c], a + + ld hl, PlayerStatLevels + ld a, [hBattleTurn] + and a + jr z, .asm_36540 + ld hl, EnemyStatLevels + +.asm_36540 + ld a, [$c70c] + and $f + ld c, a + ld b, 0 + add hl, bc + ld b, [hl] + dec b + jr z, .asm_36589 + + ld a, [$c70c] + and $f0 + jr z, .asm_36558 + dec b + jr nz, .asm_36558 + inc b + +.asm_36558 + ld [hl], b + ld a, c + cp 5 + jr nc, .asm_36576 + + push hl + ld hl, $c641 + ld de, $c6b6 + ld a, [hBattleTurn] + and a + jr z, .asm_36570 + ld hl, $d21b + ld de, $c6c1 + +.asm_36570 + call $641a + pop hl + jr z, .asm_36588 + +.asm_36576 + ld a, [hBattleTurn] + and a + jr z, .asm_36580 + + call Function0x365fd + + jr .asm_36583 + +.asm_36580 + call Function0x365d7 + +.asm_36583 + xor a + ld [$c70e], a + ret + +.asm_36588 + inc [hl] + +.asm_36589 + ld a, 2 + ld [$c70e], a + ret +; 3658f + + +BattleCommandac: ; 3658f +; + call $4ecc + +; get bit 4-5 +; ensure result is nonzero +; (this makes the chance of each result 1/3) +.loop + call FarBattleRNG + swap a + and %11 + jr z, .loop +; jump + dec a + ld hl, .ptrs + rst $28 + ret +.ptrs + dw $6165 + dw $6102 + dw $608c +; 365a7 + + +BattleCommandaf: ; 365a7 + ld a, BATTLE_VARS_SUBSTATUS2 + call GetBattleVarPair + set 0, [hl] + ret +; 365af + + +BattleCommanda6: ; 365af + ld hl, $743d + ld a, [hBattleTurn] + and a + jr z, .asm_365ba ; 365b5 $3 + ld hl, $747c +.asm_365ba + xor a + ld [$ffd4], a + call $7e73 + jp $31f6 +; 365c3 + + +BattleCommanda7: ; 365c3 + ld hl, $7447 + ld a, [hBattleTurn] + and a + jr z, .asm_365ce ; 365c9 $3 + ld hl, $7486 +.asm_365ce + xor a + ld [$ffd4], a + call $7e73 + jp $31f6 +; 365d7 + + +Function0x365d7: ; 365d7 + ld hl, PlayerAtkLevel + ld de, $c6b6 + ld bc, BattleMonAtk + + ld a, $5 + call Function0x3661d + + ld hl, $6d45 + call $7e73 + + call $4ffd + + ld hl, $6c39 + call $7e73 + + ld hl, $6c76 + call $7e73 + + jp $4ffd +; 365fd + + +Function0x365fd: ; 365fd + ld hl, EnemyAtkLevel + ld de, $c6c1 + ld bc, EnemyMonAtk + + ld a, $5 + call Function0x3661d + + call $4ffd + + ld hl, $6c39 + call $7e73 + + ld hl, $6c76 + call $7e73 + + jp $4ffd +; 3661d + + +Function0x3661d: ; 3661d +.asm_3661d + push af + ld a, [hli] + push hl + push bc + ld c, a + dec c + ld b, 0 + ld hl, Table0x364e6 + add hl, bc + add hl, bc + xor a + ld [$ffb4], a + ld a, [de] + ld [$ffb5], a + inc de + ld a, [de] + ld [$ffb6], a + inc de + ld a, [hli] + ld [$ffb7], a + call Multiply + + ld a, [hl] + ld [$ffb7], a + ld b, $4 + call Divide + + ld a, [$ffb5] + ld b, a + ld a, [$ffb6] + or b + jr nz, .asm_36651 + + ld a, $1 + ld [$ffb6], a + jr .asm_36662 + +.asm_36651 + ld a, [$ffb6] + cp $e7 + ld a, b + sbc $3 + jr c, .asm_36662 + + ld a, $e7 + ld [$ffb6], a + ld a, $3 + ld [$ffb5], a +.asm_36662 + pop bc + ld a, [$ffb5] + ld [bc], a + inc bc + ld a, [$ffb6] + ld [bc], a + inc bc + pop hl + pop af + dec a + jr nz, .asm_3661d + + ret +; 36671 + + +BattleCommand21: ; 36671 + ld a, BATTLE_VARS_SUBSTATUS3 + call CleanGetBattleVarPair + bit 0, a + ret z + ld hl, $c672 + ld a, [hBattleTurn] + and a + jr z, .asm_36684 ; 3667f $3 + ld hl, $c67a +.asm_36684 + dec [hl] + jr nz, .asm_366dc ; 36685 $55 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + res 0, [hl] + ld hl, $4e84 + call FarBattleTextBox + ld a, BATTLE_VARS_MOVE_POWER + call GetBattleVarPair + ld a, $1 + ld [hl], a + ld hl, EnemyDamageTaken + ld de, $c732 + ld a, [hBattleTurn] + and a + jr z, .asm_366ad ; 366a5 $6 + ld hl, $c685 + ld de, $c733 +.asm_366ad + ld a, [hld] + add a + ld b, a + ld [CurDamage + 1], a + ld a, [hl] + rl a + ld [CurDamage], a + jr nc, .asm_366c3 ; 366b9 $8 + ld a, $ff + ld [CurDamage], a + ld [CurDamage + 1], a +.asm_366c3 + or b + jr nz, .asm_366cb ; 366c4 $5 + ld a, $1 + ld [AttackMissed], a +.asm_366cb + xor a + ld [hli], a + ld [hl], a + ld [de], a + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVarPair + ld a, $75 + ld [hl], a + ld b, $22 + jp $7e8c +.asm_366dc + ld hl, $4e6e + call FarBattleTextBox + jp EndMoveEffect +; 366e5 + + +BattleCommand22: ; 366e5 + ld de, $c682 + ld bc, $c672 + ld a, [hBattleTurn] + and a + jr z, .asm_366f6 ; 366ee $6 + ld de, $c684 + ld bc, $c67a +.asm_366f6 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + set 0, [hl] + xor a + ld [de], a + inc de + ld [de], a + ld [PlayerMoveEffect], a + ld [EnemyMoveEffect], a + call FarBattleRNG + and $1 + inc a + inc a + ld [bc], a + ld a, $1 + ld [$c689], a + call $7e01 + jp EndMoveEffect +; 3671a + + +BattleCommand3e: ; 3671a + ld de, $c672 + ld a, [hBattleTurn] + and a + jr z, .asm_36725 ; 36720 $3 + ld de, $c67a +.asm_36725 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + bit 1, [hl] + ret z + ld a, [de] + dec a + ld [de], a + jr nz, .asm_3674c ; 36730 $1a + res 1, [hl] + call $4ffd + call Function0x37962 + push af + call $4ffd + pop af + jr nz, .asm_3674c ; 3673f $b + set 7, [hl] + call FarBattleRNG + and $1 + inc a + inc a + inc de + ld [de], a +.asm_3674c + ld b, $3d + jp $7e8c +; 36751 + + +BattleCommand3d: ; 36751 + ld a, BATTLE_VARS_STATUS + call CleanGetBattleVarPair + and $7 + ret nz + ld de, $c672 + ld a, [hBattleTurn] + and a + jr z, .asm_36764 ; 3675f $3 + ld de, $c67a +.asm_36764 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + set 1, [hl] + call FarBattleRNG + and $1 + inc a + ld [de], a + ld a, $1 + ld [$c73e], a + ret +; 36778 + + +BattleCommanda0: ; 36778 +; run + ld a, [BattleType] + cp $7 ; BATTLE_SHINY + jr z, .asm_367b9 + cp $9 ; ? + jr z, .asm_367b9 + cp $b ; ? + jr z, .asm_367b9 + cp $c ; suicune + jr z, .asm_367b9 + ld a, BATTLE_VARS_SUBSTATUS5_OPP + call CleanGetBattleVarPair + bit 7, a + jr nz, .asm_367b9 + ld a, [hBattleTurn] + and a + jr nz, .asm_367bf + ld a, [IsInBattle] + dec a + jr nz, .asm_367b9 + ld a, [$d143] + ld b, a + ld a, [BattleMonLevel] + cp b + jr nc, .asm_367df + add b + ld c, a + inc c +.asm_367ac + call FarBattleRNG + cp c + jr nc, .asm_367ac ; 367b0 $fa + srl b + srl b + cp b + jr nc, .asm_367df ; 367b7 $26 + +.asm_367b9 + call $7e77 + jp $734e + +.asm_367bf + ld a, [IsInBattle] + dec a + jr nz, .asm_367b9 ; 367c3 $f4 + ld a, [BattleMonLevel] + ld b, a + ld a, [$d143] + cp b + jr nc, .asm_367df ; 367cd $10 + add b + ld c, a + inc c +.asm_367d2 + call FarBattleRNG + cp c + jr nc, .asm_367d2 ; 367d6 $fa + srl b + srl b + cp b + jr nc, .asm_367df ; 367dd $0 +.asm_367df + call $399c + xor a + ld [$cfca], a + inc a + ld [$d232], a + ld [$c689], a + call Function0x36804 + call BattleCommand0a + call $7e36 + ld c, $14 + call DelayFrames + call Function0x36804 + ld hl, $52ac + jp FarBattleTextBox +; 36804 + + +Function0x36804: ; 36804 + ld a, [$d0ee] + and $c0 + or $2 + ld [$d0ee], a + ret +; 3680f + + +BattleCommand23: ; 3680f + ld a, [BattleType] + cp $7 + jp z, $6969 + cp $9 + jp z, $6969 + cp $b + jp z, $6969 + cp $c + jp z, $6969 + ld a, [hBattleTurn] + and a + jp nz, .asm_368cd + ld a, [AttackMissed] + and a + jr nz, .asm_36852 ; 36830 $20 + ld a, [IsInBattle] + dec a + jr nz, .asm_36869 ; 36836 $31 + ld a, [$d143] + ld b, a + ld a, [BattleMonLevel] + cp b + jr nc, .asm_36855 ; 36840 $13 + add b + ld c, a + inc c +.asm_36845 + call FarBattleRNG + cp c + jr nc, .asm_36845 ; 36849 $fa + srl b + srl b + cp b + jr nc, .asm_36855 ; 36850 $3 +.asm_36852 + jp $6969 +.asm_36855 + call $399c + xor a + ld [$cfca], a + inc a + ld [$d232], a + call Function0x36804 + ld a, [PlayerMoveAnimation] + jp $6975 +.asm_36869 + call $49f4 + jr c, .asm_368ca ; 3686c $5c + ld a, [$c70f] + and a + jr z, .asm_368ca ; 36872 $56 + call $39b0 + ld a, $1 + ld [$c689], a + call $7e01 + ld c, $14 + call DelayFrames + ld hl, $c4a1 + ld bc, $040a + call ClearBox + ld c, $14 + call DelayFrames + ld a, [OTPartyCount] + ld b, a + ld a, [CurOTMon] + ld c, a +.asm_3689a + call FarBattleRNG + and $7 + cp b + jr nc, .asm_3689a ; 368a0 $f8 + cp c + jr z, .asm_3689a ; 368a3 $f5 + push af + push bc + ld hl, OTPartyMon1CurHP + call GetPartyLocation + ld a, [hli] + or [hl] + pop bc + pop de + jr z, .asm_3689a ; 368b1 $e7 + ld a, d + inc a + ld [$c718], a + ld hl, $54c3 + ld a, $f + rst FarCall + ld hl, $5544 + call FarBattleTextBox + ld hl, $5c23 + jp $7e73 +.asm_368ca + jp $6969 + +.asm_368cd + ld a, [AttackMissed] + and a + jr nz, .asm_368f3 + + ld a, [IsInBattle] + dec a + jr nz, .asm_36908 + + ld a, [BattleMonLevel] + ld b, a + ld a, [$d143] + cp b + jr nc, .asm_368f5 + + add b + ld c, a + inc c +.asm_368e6 + call FarBattleRNG + cp c + jr nc, .asm_368e6 + + srl b + srl b + cp b + jr nc, .asm_368f5 + +.asm_368f3 + jr .asm_36969 + +.asm_368f5 + call $399c + xor a + ld [$cfca], a + inc a + ld [$d232], a + call $6804 + ld a, [EnemyMoveAnimation] + jr .asm_36975 + +.asm_36908 + call Function0x36994 + jr c, .asm_36969 + + ld a, [$c70f] + cp $1 + jr z, .asm_368ca + + call $399c + ld a, $1 + ld [$c689], a + call $7e01 + ld c, $14 + call DelayFrames + ld hl, $c535 + ld bc, $050b + call $0fb6 + ld c, $14 + call DelayFrames + ld a, [PartyCount] + ld b, a + ld a, [CurBattleMon] + ld c, a +.asm_3693a + call FarBattleRNG + and $7 + cp b + jr nc, .asm_3693a + + cp c + jr z, .asm_3693a + + push af + push bc + ld hl, PartyMon1CurHP + call GetPartyLocation + ld a, [hli] + or [hl] + pop bc + pop de + jr z, .asm_3693a + + ld a, d + ld [CurPartyMon], a + ld hl, $5b32 + call $7e73 + ld hl, $5544 + call FarBattleTextBox + ld hl, $5c23 + jp $7e73 +.asm_36969 + call $4eee + call $7e80 + call $5004 + jp $734e +.asm_36975 + push af + call $6804 + ld a, $1 + ld [$c689], a + call $7e01 + ld c, $14 + call DelayFrames + pop af + ld hl, $52c1 + cp $2e + jr z, .asm_36991 + + ld hl, $52d2 +.asm_36991 + jp FarBattleTextBox +; 36994 + + +Function0x36994: ; 36994 + ld a, [PartyCount] + ld d, a + ld e, 0 + ld bc, $30 +.asm_3699d + ld a, [CurBattleMon] + cp e + jr z, .asm_369ae + + ld a, e + ld hl, PartyMon1CurHP + call AddNTimes + ld a, [hli] + or [hl] + jr nz, .asm_369b4 + +.asm_369ae + inc e + dec d + jr nz, .asm_3699d + + scf + ret + +.asm_369b4 + and a + ret +; 369b6 + + +BattleCommand24: ; 369b6 + ld de, $c672 + ld bc, $c682 + ld a, [hBattleTurn] + and a + jr z, .asm_369c7 ; 369bf $6 + ld de, $c67a + ld bc, $c684 +.asm_369c7 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + bit 2, [hl] + jp nz, $6a43 + set 2, [hl] + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVarPair + ld a, [hl] + cp $4d + jr z, .asm_36a3f ; 369db $62 + cp $2c + ld a, $1 + jr z, .asm_36a3a ; 369e1 $57 + ld a, [hl] + cp $9a + jr z, .asm_369fb ; 369e6 $13 + cp $68 + jr nz, .asm_36a2b ; 369ea $3f +.asm_369ec + call FarBattleRNG + and $3 + jr z, .asm_369ec ; 369f1 $f9 + dec a + jr nz, .asm_36a3a ; 369f4 $44 + ld a, $1 + ld [bc], a + jr .asm_36a48 ; 369f9 $4d +.asm_369fb + ld a, [hBattleTurn] + and a + jr nz, .asm_36a0b ; 369fe $b + ld a, [PartyCount] + cp $1 + jp z, $6a1e + dec a + jr .asm_36a3a ; 36a09 $2f +.asm_36a0b + ld a, [IsInBattle] + cp $1 + jp z, $6a1e + ld a, [OTPartyCount] + cp $1 + jp z, $6a1e + dec a + jr .asm_36a3a ; 36a1c $1c + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + res 2, [hl] + call $55b5 + jp EndMoveEffect +.asm_36a2b + call FarBattleRNG + and $3 + cp $2 + jr c, .asm_36a39 ; 36a32 $5 + call FarBattleRNG + and $3 +.asm_36a39 + inc a +.asm_36a3a + ld [de], a + inc a + ld [bc], a + jr .asm_36a6b ; 36a3d $2c +.asm_36a3f + ld a, $1 + jr .asm_36a3a ; 36a41 $f7 + ld a, [de] + dec a + ld [de], a + jr nz, .asm_36a6b ; 36a46 $23 +.asm_36a48 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + res 2, [hl] + ld hl, $52e5 + ld a, [hBattleTurn] + and a + jr z, .asm_36a5a ; 36a55 $3 + ld hl, $52f8 +.asm_36a5a + push bc + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $9a + jr z, .asm_36a67 ; 36a62 $3 + call FarBattleTextBox +.asm_36a67 + pop bc + xor a + ld [bc], a + ret +.asm_36a6b + ld a, [BattleScriptBufferLoc + 1] + ld h, a + ld a, [BattleScriptBufferLoc] + ld l, a +.asm_36a73 + ld a, [hld] + cp $5 + jr nz, .asm_36a73 ; 36a76 $fb + inc hl + ld a, h + ld [BattleScriptBufferLoc + 1], a + ld a, l + ld [BattleScriptBufferLoc], a + ret +; 36a82 + + +BattleCommand94: ; 36a82 + ld a, [AttackMissed] + and a + ret nz + call CheckSubstituteOpp + jr nz, .asm_36a9a ; 36a8a $e + ld a, BATTLE_VARS_STATUS_OPP + call CleanGetBattleVarPair + and $27 + jr nz, .asm_36a9a ; 36a93 $5 + call Function0x36abf + jr z, Function0x36ab5 ; 36a98 $1b +.asm_36a9a + ld a, 1 + ld [AttackMissed], a + ret +; 36aa0 + + +BattleCommand25: ; 36aa0 + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call CleanGetBattleVarPair + and $27 + ret nz + call Function0x36abf + ret nz + ld a, [$c70d] + and a + ret nz + + ; fallthrough +; 36ab5 + + +Function0x36ab5: ; 36ab5 + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVarPair + set 3, [hl] + jp EndRechargeOpp +; 36abf + + +Function0x36abf: ; 36abf + push bc + ld a, [$c70f] + ld b, a + ld a, [hBattleTurn] + xor b + pop bc + ret +; 36ac9 + + +BattleCommand4d: ; 36ac9 + ld a, [AttackMissed] + and a + ret nz + call GetUserItem + ld a, b + cp $4b + ret nz + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVarPair + ld d, h + ld e, l + call GetUserItem + call FarBattleRNG + cp c + ret nc + call EndRechargeOpp + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVarPair + set 3, [hl] + ret +; 36af3 + + +BattleCommand26: ; 36af3 + call ResetDamage + ld a, [TypeModifier] + and $7f + jr z, .asm_36b2f ; 36afb $32 + ld hl, EnemyMonLevel + ld de, BattleMonLevel + ld bc, PlayerMoveAccuracy + ld a, [hBattleTurn] + and a + jr z, .asm_36b12 ; 36b09 $7 + push hl + ld h, d + ld l, e + pop de + ld bc, EnemyMoveAccuracy +.asm_36b12 + ld a, [de] + sub [hl] + jr c, .asm_36b2f ; 36b14 $19 + add a + ld e, a + ld a, [bc] + add e + jr nc, .asm_36b1e ; 36b1a $2 + ld a, $ff +.asm_36b1e + ld [bc], a + call $4d32 + ld hl, CurDamage + ld a, $ff + ld [hli], a + ld [hl], a + ld a, $2 + ld [CriticalHit], a + ret +.asm_36b2f + ld a, $ff + ld [CriticalHit], a + ld a, $1 + ld [AttackMissed], a + ret +; 36b3a + + +BattleCommand3a: ; 36b3a + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair +; charged? + bit 4, [hl] + ret z +; go to town + res 4, [hl] + res 5, [hl] + res 6, [hl] + ld b, $39 + jp $7e8c +; 36b4d + + +BattleCommand39: ; 36b4d + call $7e85 + ld a, BATTLE_VARS_STATUS + call CleanGetBattleVarPair + and $7 + jr z, .asm_36b65 ; 36b57 $c + call $7e80 + call BattleCommand0c + call $734e + jp EndMoveEffect +.asm_36b65 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + set 4, [hl] + ld hl, $5850 + ld a, [AlreadyDisobeyed] + and a + call nz, FarBattleTextBox + call BattleCommand0a + xor a + ld [$cfca], a + inc a + ld [$c689], a + call $7e36 + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + cp $13 + jr z, .asm_36b96 ; 36b8b $9 + cp $5b + jr z, .asm_36b96 ; 36b8f $5 + call BattleCommand0c + jr .asm_36b99 ; 36b94 $3 +.asm_36b96 + call $7ec0 +.asm_36b99 + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarPair + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + ld b, a + cp $13 + jr z, .asm_36bb0 ; 36ba6 $8 + cp $5b + jr nz, .asm_36bb2 ; 36baa $6 + set 5, [hl] + jr .asm_36bb2 ; 36bae $2 + +.asm_36bb0 + set 6, [hl] + +.asm_36bb2 + call Function0x34548 + jr nz, .asm_36bc3 ; 36bb5 $c + ld a, BATTLE_VARS_LAST_COUNTER_MOVE + call GetBattleVarPair + ld [hl], b + ld a, BATTLE_VARS_LAST_MOVE + call GetBattleVarPair + ld [hl], b + +.asm_36bc3 + call ResetDamage + + ld hl, .text_36bdb + call BattleTextBox + + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $91 ; skull bash + ld b, $fe + jp z, $7e8c + jp EndMoveEffect + +.text_36bdb +; [user] + TX_FAR UnknownText_0x1c0d0e + start_asm + + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + cp RAZOR_WIND + ld hl, .RazorWind + jr z, .asm_36c0d + + cp SOLARBEAM + ld hl, .Solarbeam + jr z, .asm_36c0d + + cp SKULL_BASH + ld hl, .SkullBash + jr z, .asm_36c0d + + cp SKY_ATTACK + ld hl, .SkyAttack + jr z, .asm_36c0d + + cp FLY + ld hl, .Fly + jr z, .asm_36c0d + + cp DIG + ld hl, .Dig + +.asm_36c0d + ret + +.RazorWind +; 'made a whirlwind!' + TX_FAR UnknownText_0x1c0d12 + db "@" + +.Solarbeam +; 'took in sunlight!' + TX_FAR UnknownText_0x1c0d26 + db "@" + +.SkullBash +; 'lowered its head!' + TX_FAR UnknownText_0x1c0d3a + db "@" + +.SkyAttack +; 'is glowing!' + TX_FAR UnknownText_0x1c0d4e + db "@" + +.Fly +; 'flew up high!' + TX_FAR UnknownText_0x1c0d5c + db "@" + +.Dig +; 'dug a hole!' + TX_FAR UnknownText_0x1c0d6c + db "@" +; 36c2c + + +BattleCommand3c: ; 36c2c +; unused + ret +; 36c2d + + +BattleCommand3b: ; 36c2d + ld a, [AttackMissed] + and a + ret nz + ld hl, $c731 + ld de, $c72f + ld a, [hBattleTurn] + and a + jr z, .asm_36c43 + ld hl, $c730 + ld de, $c72e + +.asm_36c43 + ld a, [hl] + and a + ret nz + ld a, BATTLE_VARS_SUBSTATUS4_OPP + call CleanGetBattleVarPair + bit 4, a + ret nz + call FarBattleRNG + and 3 + inc a + inc a + inc a + ld [hl], a + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + ld [de], a + ld b, a + ld hl, .Traps + +.asm_36c61 + ld a, [hli] + cp b + jr z, .asm_36c69 + inc hl + inc hl + jr .asm_36c61 + +.asm_36c69 + ld a, [hli] + ld h, [hl] + ld l, a + jp FarBattleTextBox + +.Traps + dbw BIND, UsedBindText ; 'used BIND on' + dbw WRAP, WrappedByText ; 'was WRAPPED by' + dbw FIRE_SPIN, FireSpinTrapText ; 'was trapped!' + dbw CLAMP, ClampedByText ; 'was CLAMPED by' + dbw WHIRLPOOL, WhirlpoolTrapText ; 'was trapped!' +; 36c7e + + +BattleCommand28: ; 36c7e + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarPair + bit 1, [hl] + jr nz, .asm_36c92 ; 36c85 $b + set 1, [hl] + call $7e01 + ld hl, MistText + jp FarBattleTextBox +.asm_36c92 + call $7e77 + jp $734e +; 36c98 + + +BattleCommand29: ; 36c98 + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarPair + bit 2, [hl] + jr nz, .asm_36cac ; 36c9f $b + set 2, [hl] + call $7e01 + ld hl, GettingPumpedText + jp FarBattleTextBox +.asm_36cac + call $7e77 + jp $734e +; 36cb2 + + +BattleCommand27: ; 36cb2 + ld hl, BattleMonMaxHP + ld a, [hBattleTurn] + and a + jr z, .asm_36cbd ; 36cb8 $3 + ld hl, EnemyMonMaxHPHi +.asm_36cbd + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + ld d, a + ld a, [CurDamage] + ld b, a + ld a, [CurDamage + 1] + ld c, a + srl b + rr c + srl b + rr c + ld a, b + or c + jr nz, .asm_36cd8 ; 36cd5 $1 + inc c +.asm_36cd8 + ld a, [hli] + ld [$d1eb], a + ld a, [hl] + ld [$d1ea], a + dec hl + dec hl + ld a, [hl] + ld [$d1ec], a + sub c + ld [hld], a + ld [$d1ee], a + ld a, [hl] + ld [$d1ed], a + sbc b + ld [hl], a + ld [$d1ef], a + jr nc, .asm_36cfe ; 36cf4 $8 + xor a + ld [hli], a + ld [hl], a + ld hl, $d1ee + ld [hli], a + ld [hl], a +.asm_36cfe + ld hl, $c55e + ld a, [hBattleTurn] + and a + ld a, $1 + jr z, .asm_36d0c ; 36d06 $4 + ld hl, $c4ca + xor a +.asm_36d0c + ld [$d10a], a + ld a, $b + call $2d83 + call $39c9 + ld hl, RecoilText + jp FarBattleTextBox +; 36d1d + + +BattleCommand2b: ; 36d1d +; battleanimation + confuse + call GetOpponentItem + ld a, b + cp $19 + ret z + ld a, [$c70d] + and a + ret nz + call Function0x37962 + ret nz + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVarPair + bit 7, [hl] + ret nz + jr Function0x36d70 + +BattleCommand2a: ; 36d3b + call GetOpponentItem + ld a, b + cp $19 + jr nz, .asm_36d53 + ld a, [hl] + ld [$d265], a + call $3468 + call $7e77 + ld hl, ProtectedByText + jp FarBattleTextBox + +.asm_36d53 + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVarPair + bit 7, [hl] + jr z, .asm_36d65 + call $7e77 + ld hl, AlreadyConfusedText + jp FarBattleTextBox + +.asm_36d65 + call CheckSubstituteOpp + jr nz, Function0x36db6 + ld a, [AttackMissed] + and a + jr nz, Function0x36db6 + + ; fallthrough +; 36d70 + + +Function0x36d70: ; 36d70 + ld bc, $c67b + ld a, [hBattleTurn] + and a + jr z, .asm_36d7b ; 36d76 $3 + ld bc, PlayerConfuseCount +.asm_36d7b + set 7, [hl] + call FarBattleRNG + and $3 + inc a + inc a + ld [bc], a + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $4c + jr z, .asm_36d99 + cp $5c + jr z, .asm_36d99 + cp $76 + jr z, .asm_36d99 + call $7e01 +.asm_36d99 + ld de, $0103 + call $7e54 + ld hl, BecameConfusedText + call FarBattleTextBox + call GetOpponentItem + ld a, b + cp $f + jr z, .asm_36db0 + cp $10 + ret nz +.asm_36db0 + ld hl, $5e51 + jp $7e73 +; 36db6 + +Function0x36db6: ; 36db6 + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $4c + ret z + cp $5c + ret z + cp $76 + ret z + jp PrintDidntAffect2 +; 36dc7 + + +BattleCommand30: ; 36dc7 + ld a, BATTLE_VARS_STATUS_OPP + call CleanGetBattleVarPair + bit 6, a + jr nz, .asm_36e49 ; 36dce $79 + ld a, [TypeModifier] + and $7f + jr z, .asm_36e55 ; 36dd5 $7e + call GetOpponentItem + ld a, b + cp $18 + jr nz, .asm_36def ; 36ddd $10 + ld a, [hl] + ld [$d265], a + call $3468 + call $7e77 + ld hl, ProtectedByText + jp FarBattleTextBox +.asm_36def + ld a, [hBattleTurn] + and a + jr z, .asm_36e0e ; 36df2 $1a + ld a, [InLinkBattle] + and a + jr nz, .asm_36e0e ; 36df8 $14 + ld a, [$cfc0] + and a + jr nz, .asm_36e0e ; 36dfe $e + ld a, [PlayerSubStatus5] + bit 5, a + jr nz, .asm_36e0e ; 36e05 $7 + call FarBattleRNG + cp $40 + jr c, .asm_36e52 ; 36e0c $44 +.asm_36e0e + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + and a + jr nz, .asm_36e52 ; 36e14 $3c + ld a, [AttackMissed] + and a + jr nz, .asm_36e52 ; 36e1a $36 + call CheckSubstituteOpp + jr nz, .asm_36e52 ; 36e1f $31 + ld c, $1e + call DelayFrames + call $7e01 + ld a, $1 + ld [$ffd4], a + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + set 6, [hl] + call $398e + ld hl, $6c39 + call $7e73 + call $39d4 + call PrintParalyze + ld hl, $5de9 + jp $7e73 +.asm_36e49 + call $7e77 + ld hl, AlreadyParalyzedText + jp FarBattleTextBox +.asm_36e52 + jp PrintDidntAffect2 +.asm_36e55 + call $7e77 + jp PrintDoesntAffect +; 36e5b + + +Function0x36e5b: ; 36e5b +; Compare move type to user type. +; Return z if matching the user type (unless the move is Normal). + + push hl + + ld hl, EnemyMonType1 + ld a, [hBattleTurn] + and a + jr z, .ok + ld hl, BattleMonType1 +.ok + + ld a, BATTLE_VARS_MOVE_TYPE + call CleanGetBattleVarPair + cp NORMAL + jr z, .normal + + cp [hl] + jr z, .return + + inc hl + cp [hl] + +.return + pop hl + ret + +.normal + ld a, 1 + and a + pop hl + ret +; 36e7c + + +BattleCommand31: ; 36e7c + call $7e80 + ld hl, BattleMonMaxHP + ld de, $c6df + ld a, [hBattleTurn] + and a + jr z, .asm_36e90 ; 36e88 $6 + ld hl, EnemyMonMaxHPHi + ld de, $c6e0 +.asm_36e90 + ld a, BATTLE_VARS_SUBSTATUS4 + call CleanGetBattleVarPair + bit 4, a + jr nz, .asm_36ef4 ; 36e97 $5b + 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, .asm_36eff ; 36eae $4f + ld a, d + or e + jr z, .asm_36eff ; 36eb2 $4b + ld [hl], d + inc hl + ld [hl], e + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarPair + set 4, [hl] + ld hl, $c730 + ld de, $c72e + ld a, [hBattleTurn] + and a + jr z, .asm_36ecf ; 36ec7 $6 + ld hl, $c731 + ld de, $c72f +.asm_36ecf + xor a + ld [hl], a + ld [de], a + call $7ed5 + jr c, .asm_36ee8 ; 36ed5 $11 + xor a + ld [$cfca], a + ld [FXAnimIDHi], a + ld [$c689], a + ld a, $a4 + call $7e44 + jr .asm_36eeb ; 36ee6 $3 +.asm_36ee8 + call BattleCommanda6 +.asm_36eeb + ld hl, MadeSubstituteText + call FarBattleTextBox + jp $39c9 +.asm_36ef4 + call Function0x34548 + call nz, BattleCommand0c + ld hl, HasSubstituteText + jr .asm_36f08 ; 36efd $9 +.asm_36eff + call Function0x34548 + call nz, BattleCommand0c + ld hl, TooWeakSubText +.asm_36f08 + jp FarBattleTextBox +; 36f0b + +BattleCommand32: ; 36f0b + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarPair + set 5, [hl] + ret +; 36f13 + + +EndRechargeOpp: ; 36f13 + push hl + ld a, BATTLE_VARS_SUBSTATUS4_OPP + call GetBattleVarPair + res 5, [hl] + pop hl + ret +; 36f1d + + +BattleCommand97: ; 36f1d + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarPair + set 6, [hl] + ret +; 36f25 + + +BattleCommand98: ; 36f25 + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call CleanGetBattleVarPair + bit 6, a + ret z + jr BattleCommand9899 +; 36f2f + + +BattleCommand99: ; 36f2f + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call CleanGetBattleVarPair + bit 5, a ; recharge + ret z + + ; fallthrough +; 36f37 + + +BattleCommand9899: ; 36f37 + ld hl, CurDamage + 1 + sla [hl] + dec hl + rl [hl] + jr nc, .quit + + ld a, $ff + ld [hli], a + ld [hl], a +.quit + ret +; 36f46 + + +BattleCommand33: ; 36f46 + call Function0x372d8 + call $7e80 + ld a, [AttackMissed] + and a + jr nz, .asm_36f9a ; 36f50 $48 + ld hl, BattleMonMoves + ld a, [hBattleTurn] + and a + jr z, .asm_36f5d ; 36f58 $3 + ld hl, EnemyMonMoves +.asm_36f5d + call CheckHiddenOpponent + jr nz, .asm_36f9a ; 36f60 $38 + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + and a + jr z, .asm_36f9a ; 36f68 $30 + cp $a5 + jr z, .asm_36f9a ; 36f6c $2c + ld b, a + ld c, $4 +.asm_36f71 + ld a, [hli] + cp b + jr z, .asm_36f9a ; 36f73 $25 + dec c + jr nz, .asm_36f71 ; 36f76 $f9 + dec hl +.asm_36f79 + ld a, [hld] + cp $66 + jr nz, .asm_36f79 ; 36f7c $fb + inc hl + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + ld [hl], a + ld [$d265], a + ld bc, $0006 + add hl, bc + ld [hl], $5 + call $34f8 + call $7e01 + ld hl, LearnedMoveText + jp FarBattleTextBox +.asm_36f9a + jp $7357 +; 36f9d + + +BattleCommand35: ; 36f9d +; leechseed + ld a, [AttackMissed] + and a + jr nz, .asm_36fd8 ; 36fa1 $35 + call CheckSubstituteOpp + jr nz, .asm_36fd8 ; 36fa6 $30 + ld de, EnemyMonType1 + ld a, [hBattleTurn] + and a + jr z, .asm_36fb3 ; 36fae $3 + ld de, BattleMonType1 +.asm_36fb3 + ld a, [de] + cp $16 + jr z, .asm_36fd2 ; 36fb6 $1a + inc de + ld a, [de] + cp $16 + jr z, .asm_36fd2 ; 36fbc $14 + ld a, BATTLE_VARS_SUBSTATUS4_OPP + call GetBattleVarPair + bit 7, [hl] + jr nz, .asm_36fd8 ; 36fc5 $11 + set 7, [hl] + call $7e01 + ld hl, WasSeededText + jp FarBattleTextBox +.asm_36fd2 + call $7e77 + jp PrintDoesntAffect +.asm_36fd8 + call $7e77 + ld hl, EvadedText + jp FarBattleTextBox +; 36fe1 + + +BattleCommand36: ; 36fe1 + call $7e01 + ld a, $41 + ld hl, $60e5 + rst FarCall + jp PrintNothingHappened +; 36fed + + +BattleCommand37: ; 36fed +; disable + + ld a, [AttackMissed] + and a + jr nz, .asm_37059 ; 36ff1 $66 + ld de, EnemyEncoreCount + ld hl, EnemyMonMoves + ld a, [hBattleTurn] + and a + jr z, .asm_37004 ; 36ffc $6 + ld de, PlayerDisableCount + ld hl, BattleMonMoves +.asm_37004 + ld a, [de] + and a + jr nz, .asm_37059 ; 37006 $51 + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + and a + jr z, .asm_37059 ; 3700e $49 + cp $a5 + jr z, .asm_37059 ; 37012 $45 + ld b, a + ld c, $ff +.asm_37017 + inc c + ld a, [hli] + cp b + jr nz, .asm_37017 ; 3701a $fb + ld a, [hBattleTurn] + and a + ld hl, EnemyMonPPMove1 + jr z, .asm_37027 ; 37022 $3 + ld hl, BattleMonPP +.asm_37027 + ld b, $0 + add hl, bc + ld a, [hl] + and a + jr z, .asm_37059 ; 3702c $2b +.asm_3702e + call FarBattleRNG + and $7 + jr z, .asm_3702e ; 37033 $f9 + inc a + inc c + swap c + add c + ld [de], a + call $7e01 + ld hl, DisabledMove + ld a, [hBattleTurn] + and a + jr nz, .asm_37047 ; 37044 $1 + inc hl +.asm_37047 + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + ld [hl], a + ld [$d265], a + call $34f8 + ld hl, WasDisabledText + jp FarBattleTextBox +.asm_37059 + jp Function0x37354 +; 3705c + + +BattleCommand1e: ; 3705c + xor a + ld hl, StringBuffer1 + ld [hli], a + ld a, [hBattleTurn] + and a + ld a, [BattleMonLevel] + jr z, .asm_3706c ; 37067 $3 + ld a, [EnemyMonLevel] +.asm_3706c + add a + ld hl, $c6ee + add [hl] + ld [hld], a + jr nc, .asm_37079 ; 37072 $5 + inc [hl] + dec hl + jr nz, .asm_37079 ; 37076 $1 + inc [hl] +.asm_37079 + ld hl, CoinsScatteredText + jp FarBattleTextBox +; 3707f + + +BattleCommand1f: ; 3707f + ld hl, BattleMonMoves + ld de, BattleMonType1 + ld a, [hBattleTurn] + and a + jr z, .asm_37090 ; 37088 $6 + ld hl, EnemyMonMoves + ld de, EnemyMonType1 +.asm_37090 + push de + ld c, $0 + ld de, StringBuffer1 +.asm_37096 + push hl + ld b, $0 + add hl, bc + ld a, [hl] + pop hl + and a + jr z, .asm_370b2 ; 3709d $13 + push hl + push bc + dec a + ld hl, $5afe + call $7ea1 + ld [de], a + inc de + pop bc + pop hl + inc c + ld a, c + cp $4 + jr c, .asm_37096 ; 370b0 $e4 +.asm_370b2 + ld a, $ff + ld [de], a + inc de + ld [de], a + inc de + ld [de], a + pop de + ld hl, StringBuffer1 +.asm_370bd + ld a, [hl] + cp $ff + jr z, .asm_370d3 ; 370c0 $11 + cp $13 + jr z, .asm_370d0 ; 370c4 $a + ld a, [de] + cp [hl] + jr z, .asm_370d0 ; 370c8 $6 + inc de + ld a, [de] + dec de + cp [hl] + jr nz, .asm_370d9 ; 370ce $9 +.asm_370d0 + inc hl + jr .asm_370bd ; 370d1 $ea +.asm_370d3 + call $7e77 + jp $734e +.asm_370d9 + call FarBattleRNG + and $3 + ld c, a + ld b, $0 + ld hl, StringBuffer1 + add hl, bc + ld a, [hl] + cp $ff + jr z, .asm_370d9 ; 370e8 $ef + cp $13 + jr z, .asm_370d9 ; 370ec $eb + ld a, [de] + cp [hl] + jr z, .asm_370d9 ; 370f0 $e7 + inc de + ld a, [de] + dec de + cp [hl] + jr z, .asm_370d9 ; 370f6 $e1 + ld a, [hl] + ld [de], a + inc de + ld [de], a + ld [$d265], a + ld a, $14 + ld hl, $4964 + rst FarCall + call $7e01 + ld hl, TransformedTypeText + jp FarBattleTextBox +; 3710e + + +BattleCommand20: ; 3710e +; resetstats + ld a, 7 ; neutral + ld hl, PlayerStatLevels + call .Fill + ld hl, EnemyStatLevels + call .Fill + + ld a, [hBattleTurn] + push af + + call SetPlayerTurn + call Function0x365d7 + call SetEnemyTurn + call Function0x365fd + + pop af + ld [hBattleTurn], a + + call $7e01 + + ld hl, EliminatedStatsText + jp FarBattleTextBox + +.Fill + ld b, PlayerStatLevelsEnd - PlayerStatLevels +.asm_37139 + ld [hli], a + dec b + jr nz, .asm_37139 + ret +; 3713e + + +BattleCommand2c: ; 3713e + ld de, BattleMonHP + ld hl, BattleMonMaxHP + ld a, [hBattleTurn] + and a + jr z, .asm_3714f ; 37147 $6 + ld de, EnemyMonHPHi + ld hl, EnemyMonMaxHPHi +.asm_3714f + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + ld b, a + push hl + push de + push bc + ld c, $2 + call StringCmp + pop bc + pop de + pop hl + jp z, .asm_371c4 + ld a, b + cp $9c + jr nz, .asm_37199 ; 37166 $31 + push hl + push de + push af + call $7e80 + ld a, BATTLE_VARS_SUBSTATUS5 + call GetBattleVarPair + res 0, [hl] + ld a, BATTLE_VARS_STATUS + call GetBattleVarPair + ld a, [hl] + and a + ld [hl], $3 + ld hl, WentToSleepText + jr z, .asm_37186 ; 37181 $3 + ld hl, RestedText +.asm_37186 + call FarBattleTextBox + ld a, [hBattleTurn] + and a + jr nz, .asm_37193 ; 3718c $5 + call Function0x365d7 + jr .asm_37196 ; 37191 $3 +.asm_37193 + call Function0x365fd +.asm_37196 + pop af + pop de + pop hl +.asm_37199 + jr z, .asm_371a3 ; 37199 $8 + ld hl, $4c9f + call $7e73 + jr .asm_371a9 ; 371a1 $6 +.asm_371a3 + ld hl, $4cac + call $7e73 +.asm_371a9 + call $7e01 + call $4ffd + ld hl, $4cef + call $7e73 + call $4ffd + call $3995 + call $39c9 + ld hl, RegainedHealthText + jp FarBattleTextBox + +.asm_371c4 + call $7e77 + ld hl, HPIsFullText + jp FarBattleTextBox +; 371cd + + +BattleCommand2d: ; 371cd +; transform + + call Function0x372d8 + ld a, BATTLE_VARS_SUBSTATUS5_OPP + call GetBattleVarPair + bit 3, [hl] + jp nz, Function0x372d2 + call CheckHiddenOpponent + jp nz, Function0x372d2 + xor a + ld [$cfca], a + ld [FXAnimIDHi], a + ld a, $1 + ld [$c689], a + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarPair + bit 4, [hl] + push af + jr z, .asm_37200 ; 371f4 $a + call Function0x34548 + jr nz, .asm_37200 ; 371f9 $5 + ld a, $a4 + call $7e44 +.asm_37200 + ld a, BATTLE_VARS_SUBSTATUS5 + call GetBattleVarPair + set 3, [hl] + call $72e7 + ld hl, BattleMonSpecies + ld de, EnemyMonSpecies + ld a, [hBattleTurn] + and a + jr nz, .asm_3721f ; 37213 $a + ld hl, EnemyMonSpecies + ld de, BattleMonSpecies + xor a + ld [CurMoveNum], a +.asm_3721f + push hl + ld a, [hli] + ld [de], a + inc hl + inc de + inc de + ld bc, $0004 + call $3026 + ld a, [hBattleTurn] + and a + jr z, .asm_3723a ; 3722e $a + ld a, [de] + ld [$c6f2], a + inc de + ld a, [de] + ld [$c6f3], a + dec de +.asm_3723a + ld a, [hli] + ld [de], a + inc de + ld a, [hli] + ld [de], a + inc de + ld bc, $000c + add hl, bc + push hl + ld h, d + ld l, e + add hl, bc + ld d, h + ld e, l + pop hl + ld bc, $000c + call $3026 + ld bc, $ffe2 + add hl, bc + push de + ld d, h + ld e, l + pop hl + ld bc, $ffe8 + add hl, bc + ld b, $4 +.asm_3725f + ld a, [de] + inc de + and a + jr z, .asm_3726c ; 37262 $8 + cp $a6 + ld a, $1 + jr z, .asm_3726c ; 37268 $2 + ld a, $5 +.asm_3726c + ld [hli], a + dec b + jr nz, .asm_3725f ; 3726e $ef + pop hl + ld a, [hl] + ld [$d265], a + call $343b + ld hl, $c6c1 + ld de, $c6b6 + ld bc, $000a + call BattleSideCopy + ld hl, EnemyStatLevels + ld de, PlayerStatLevels + ld bc, $0008 + call BattleSideCopy + call $7ed5 + jr c, .asm_372a8 ; 37293 $13 + ld a, [hBattleTurn] + and a + ld a, [$c6fe] + jr z, .asm_372a0 ; 3729b $3 + ld a, [$c6fa] +.asm_372a0 + and a + jr nz, .asm_372a8 ; 372a1 $5 + call $7e36 + jr .asm_372ae ; 372a6 $6 +.asm_372a8 + call $7e80 + call BattleCommanda6 +.asm_372ae + xor a + ld [$cfca], a + ld [FXAnimIDHi], a + ld a, $2 + ld [$c689], a + pop af + ld a, $a4 + call nz, $7e44 + ld hl, TransformedText + jp FarBattleTextBox +; 372c6 + + +BattleSideCopy: ; 372c6 +; Copy bc bytes from hl to de if it's the player's turn. +; Copy bc bytes from de to hl if it's the enemy's turn. + ld a, [hBattleTurn] + and a + jr z, .copy + +; Swap hl and de + push hl + ld h, d + ld l, e + pop de +.copy + jp CopyBytes +; 372d2 + + +Function0x372d2: ; 372d2 + call $7e77 + jp $734e +; 372d8 + + +Function0x372d8: ; 372d8 + ld a, BATTLE_VARS_LAST_COUNTER_MOVE + call GetBattleVarPair + xor a + ld [hl], a + + ld a, BATTLE_VARS_LAST_MOVE + call GetBattleVarPair + xor a + ld [hl], a + ret +; 372e7 + + +; 372e7 + ld a, [hBattleTurn] + and a + jr z, .player + + xor a + ld [EnemyEncoreCount], a + ld [EnemyEncoredMove], a + ret + +.player + xor a + ld [PlayerDisableCount], a + ld [DisabledMove], a + ret +; 372fc + + +BattleCommand2e: ; 372fc + ld hl, PlayerScreens + ld bc, PlayerLightScreenCount + ld a, [hBattleTurn] + and a + jr z, .asm_3730d ; 37305 $6 + ld hl, $c700 + ld bc, $c706 +.asm_3730d + ld a, BATTLE_VARS_MOVE_EFFECT + call CleanGetBattleVarPair + cp $23 + jr nz, .asm_37324 ; 37314 $e + bit 3, [hl] + jr nz, .asm_37337 ; 37318 $1d + set 3, [hl] + ld a, $5 + ld [bc], a + ld hl, $54b4 + jr .asm_37331 ; 37322 $d +.asm_37324 + bit 4, [hl] + jr nz, .asm_37337 ; 37326 $f + set 4, [hl] + inc bc + ld a, $5 + ld [bc], a + ld hl, $54c7 +.asm_37331 + call $7e01 + jp FarBattleTextBox +.asm_37337 + call $7e77 + jp $734e +; 3733d + + +PrintDoesntAffect: ; 3733d +; 'it doesn't affect' + ld hl, DoesntAffectText + jp FarBattleTextBox +; 37343 + + +PrintNothingHappened: ; 37343 +; 'but nothing happened!' + ld hl, NothingHappenedText + jp FarBattleTextBox +; 37349 + + +PrintButItFailed: ; 37349 + ld a, [$c6fb] + and a + ret nz + +; 'but it failed!' + ld hl, ButItFailedText + jp FarBattleTextBox +; 37354 + + +Function0x37354: ; 37354 + call $7e77 + ld hl, ButItFailedText ; 'but it failed!' + ld de, ItFailedText ; 'it failed!' + jp Function0x35157 +; 37360 + + +PrintDidntAffect; 37360 +; 'it didn't affect' + ld hl, DidntAffect1Text + jp FarBattleTextBox +; 37366 + + +PrintDidntAffect2: ; 37366 + call $7e77 + ld hl, DidntAffect1Text ; 'it didn't affect' + ld de, DidntAffect2Text ; 'it didn't affect' + jp Function0x35157 +; 37372 + + +PrintParalyze: ; 37372 +; 'paralyzed! maybe it can't attack!' + ld hl, ParalyzedText + jp FarBattleTextBox +; 37378 + + +CheckSubstituteOpp: ; 37378 + ld a, BATTLE_VARS_SUBSTATUS4_OPP + call CleanGetBattleVarPair + bit 4, a + ret +; 37380 + + +BattleCommand1a: ; 37380 + ld a, $41 + ld hl, $610d + rst FarCall + ld a, $4 + ld [$cfca], a + ld c, $3 + call DelayFrames + ld a, BATTLE_VARS_STATUS + call GetBattleVarPair + xor a + ld [hli], a + inc hl + ld [hli], a + ld [hl], a + ld a, $1 + ld [$c689], a + call BattleCommand0a + call $7e36 + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarPair + res 7, [hl] + ld a, BATTLE_VARS_SUBSTATUS5_OPP + call GetBattleVarPair + res 6, [hl] + call $7ed5 + ret nc + ld a, $f + ld hl, $5f58 + rst FarCall + ld a, $f + ld hl, $6043 + rst FarCall + call $31f6 + jp $39c9 +; 373c9 + + +BattleCommand1b: ; 373c9 +; mirrormove + + call Function0x372d8 + ld a, BATTLE_VARS_MOVE + call GetBattleVarPair + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + and a + jr z, .asm_373de ; 373d7 $5 + call CheckUserMove + jr nz, .asm_373ea ; 373dc $c +.asm_373de + call $7e77 + ld hl, MirrorMoveFailedText + call FarBattleTextBox + jp EndMoveEffect +.asm_373ea + ld a, b + ld [hl], a + ld [$d265], a + push af + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVarPair + ld d, h + ld e, l + pop af + dec a + call GetMoveData + call $34f8 + call $30d6 + call Function0x34548 + jr nz, .asm_37412 ; 37405 $b + ld a, [$c689] + push af + call BattleCommand0a + pop af + ld [$c689], a +.asm_37412 + call $7e80 + jp ResetTurn +; 37418 + + +BattleCommand34: ; 37418 +; metronome + + call Function0x372d8 + call Function0x34548 + jr nz, .asm_3742b + + ld a, [$c689] + push af + call BattleCommand0a + pop af + ld [$c689], a + +.asm_3742b + call $7e36 + +.GetMove + call FarBattleRNG + +; No invalid moves. + cp BEAT_UP + 1 + jr nc, .GetMove + +; None of the moves in MetronomeExcepts. + push af + ld de, 1 + ld hl, MetronomeExcepts + call IsInArray + pop bc + jr c, .GetMove + +; No moves the user already has. + ld a, b + call CheckUserMove + jr z, .GetMove + + + ld a, BATTLE_VARS_MOVE + call GetBattleVarPair + ld [hl], b + call UpdateMoveData + jp ResetTurn +; 37454 + + +MetronomeExcepts: ; 37454 + db $00 + db METRONOME + db STRUGGLE + db SKETCH + db MIMIC + db COUNTER + db MIRROR_COAT + db PROTECT + db DETECT + db ENDURE + db DESTINY_BOND + db SLEEP_TALK + db THIEF + db $ff +; 37462 + + +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, $c732 + ld a, [hBattleTurn] + and a + jr z, .asm_37486 + ld hl, $c733 + +.asm_37486 + ld [hl], 1 + xor a + ld [AlreadyDisobeyed], a + call $402c + jp $52a3 +; 37492 + + +BattleCommand50: ; 37492 +; thief + + ld a, [hBattleTurn] + and a + jr nz, .asm_374ce ; 37495 $37 + call .asm_37501 + ld a, [hl] + and a + ret nz + call .asm_3750c + ld a, [hl] + and a + ret z + ld [$d265], a + ld d, a + ld a, $2e + ld hl, $5e76 + rst FarCall + ret c + ld a, [$c70d] + and a + ret nz + ld a, [InLinkBattle] + and a + jr z, .asm_374be ; 374b7 $5 + ld a, [IsInBattle] + dec a + ret z +.asm_374be + call .asm_3750c + xor a + ld [hl], a + ld [de], a + call .asm_37501 + ld a, [$d265] + ld [hl], a + ld [de], a + jr .asm_374f8 ; 374cc $2a +.asm_374ce + call .asm_3750c + ld a, [hl] + and a + ret nz + call .asm_37501 + ld a, [hl] + and a + ret z + ld [$d265], a + ld d, a + ld a, $2e + ld hl, $5e76 + rst FarCall + ret c + ld a, [$c70d] + and a + ret nz + call .asm_37501 + xor a + ld [hl], a + ld [de], a + call .asm_3750c + ld a, [$d265] + ld [hl], a + ld [de], a +.asm_374f8 + call $3468 + ld hl, StoleText + jp FarBattleTextBox + +.asm_37501 + ld a, 1 + call BattlePartyAttr + ld d, h + ld e, l + ld hl, BattleMonItem + ret + +.asm_3750c + ld a, 1 + call $396d ; GetOTStat_Battle + ld d, h + ld e, l + ld hl, EnemyMonItem + ret +; 37517 + + +BattleCommand51: ; 37517 +; arenatrap + call CheckHiddenOpponent + jr nz, .asm_37530 ; 3751a $14 + ld a, BATTLE_VARS_SUBSTATUS5 + call GetBattleVarPair + bit 7, [hl] + jr nz, .asm_37530 ; 37523 $b + set 7, [hl] + call $7e01 + ld hl, CantEscapeNowText + jp FarBattleTextBox +.asm_37530 + call $7e77 + jp $734e +; 37536 + + +BattleCommand52: ; 37536 +; nightmare + + call CheckHiddenOpponent + jr nz, .asm_3755d ; 37539 $22 + call CheckSubstituteOpp + jr nz, .asm_3755d ; 3753e $1d + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarPair + and $7 + jr z, .asm_3755d ; 37547 $14 + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call GetBattleVarPair + bit 0, [hl] + jr nz, .asm_3755d ; 37550 $b + set 0, [hl] + call $7e01 + ld hl, StartedNightmareText + jp FarBattleTextBox +.asm_3755d + call $7e77 + jp $734e +; 37563 + + +BattleCommand53: ; 37563 +; defrost + + ld a, BATTLE_VARS_STATUS + call GetBattleVarPair + bit 5, [hl] + ret z + res 5, [hl] + ld a, [hBattleTurn] + and a + jr z, .asm_37578 ; 37570 $6 + ld a, [IsInBattle] + dec a + jr z, .asm_3757f ; 37576 $7 +.asm_37578 + ld a, $20 + call $3945 + res 5, [hl] +.asm_3757f + call $39c9 + ld hl, WasDefrostedText + jp FarBattleTextBox +; 37588 + + +BattleCommand54: ; 37588 +; curse + + ld de, BattleMonType1 + ld bc, PlayerStatLevels + ld a, [hBattleTurn] + and a + jr z, .asm_37599 ; 37591 $6 + ld de, EnemyMonType1 + ld bc, EnemyStatLevels +.asm_37599 + ld a, [de] + cp $8 + jr z, .asm_375d7 ; 3759c $39 + inc de + ld a, [de] + cp $8 + jr z, .asm_375d7 ; 375a2 $33 + ld a, [bc] + cp $d + jr c, .asm_375af ; 375a7 $6 + inc bc + ld a, [bc] + cp $d + jr nc, .asm_3760a ; 375ad $5b +.asm_375af + ld a, $1 + ld [$c689], a + call $7e01 + ld a, $2 + call Function0x36532 + call $4ffd + call $63e9 + call ResetMiss + call $4ffd + call BattleCommand70 + call $63b8 + call ResetMiss + call $61b0 + jp $63b8 +.asm_375d7 + call CheckHiddenOpponent + jr nz, .asm_37604 ; 375da $28 + call CheckSubstituteOpp + jr nz, .asm_37604 ; 375df $23 + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call GetBattleVarPair + bit 1, [hl] + jr nz, .asm_37604 ; 375e8 $1a + set 1, [hl] + call $7e01 + ld hl, $4c9f + call $7e73 + ld hl, $4c3f + call $7e73 + call $3995 + ld hl, PutACurseText + jp FarBattleTextBox +.asm_37604 + call $7e77 + jp $734e +.asm_3760a + ld b, $8 + call $648f + call $7e77 + ld hl, WontRiseAnymoreText + jp FarBattleTextBox +; 37618 + + +BattleCommand55: ; 37618 +; protect + + call Function0x3762c + ret c + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + set 2, [hl] + call $7e01 + ld hl, ProtectedItselfText + jp FarBattleTextBox +; 3762c + + +Function0x3762c: ; 3762c + ld de, $c679 + ld a, [hBattleTurn] + and a + jr z, .asm_37637 + + ld de, PlayerDamageTaken +.asm_37637 + call $6abf + jr nz, .asm_37665 + + ld a, $3 + call CleanGetBattleVarPair + bit 4, a + jr nz, .asm_37665 + + ld b, $ff + ld a, [de] + ld c, a +.asm_37649 + ld a, c + and a + jr z, .asm_37656 + + dec c + srl b + ld a, b + and a + jr nz, .asm_37649 + + jr .asm_37665 + +.asm_37656 + call FarBattleRNG + and a + jr z, .asm_37656 + + dec a + cp b + jr nc, .asm_37665 + + ld a, [de] + inc a + ld [de], a + and a + ret + +.asm_37665 + xor a + ld [de], a + call $7e77 + call $734e + scf + ret +; 3766f + + +BattleCommand5a: ; 3766f +; endure + + call Function0x3762c + ret c +; get substatus1 + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + set 5, [hl] ; endure + call $7e01 + ld hl, BracedItselfText + jp FarBattleTextBox +; 37683 + + +BattleCommand56: ; 37683 +; spikes + + ld hl, $c700 + ld a, [hBattleTurn] + and a + jr z, .asm_3768e ; 37689 $3 + ld hl, PlayerScreens +.asm_3768e + bit 0, [hl] + jr nz, .asm_3769d ; 37690 $b + set 0, [hl] + call $7e01 + ld hl, SpikesText + jp FarBattleTextBox +.asm_3769d + jp Function0x37354 +; 376a0 + + +BattleCommand57: ; 376a0 +; foresight + + ld a, [AttackMissed] + and a + jr nz, .asm_376bf ; 376a4 $19 + call CheckHiddenOpponent + jr nz, .asm_376bf ; 376a9 $14 + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call GetBattleVarPair + bit 3, [hl] + jr nz, .asm_376bf ; 376b2 $b + set 3, [hl] + call $7e01 + ld hl, IdentifiedText + jp FarBattleTextBox +.asm_376bf + jp Function0x37354 +; 376c2 + + +BattleCommand58: ; 376c2 +; perishsong + + ld hl, PlayerSubStatus1 + ld de, EnemySubStatus1 + bit 4, [hl] + jr z, .asm_376d1 ; 376ca $5 + ld a, [de] + bit 4, a + jr nz, .asm_376f2 ; 376cf $21 +.asm_376d1 + bit 4, [hl] + jr nz, .asm_376dc ; 376d3 $7 + set 4, [hl] + ld a, $4 + ld [PlayerPerishCount], a +.asm_376dc + ld a, [de] + bit 4, a + jr nz, .asm_376e9 ; 376df $8 + set 4, a + ld [de], a + ld a, $4 + ld [$c67f], a +.asm_376e9 + call $7e01 + ld hl, StartPerishText + jp FarBattleTextBox +.asm_376f2 + call $7e77 + jp $734e +; 376f8 + + +BattleCommand59: ; 376f8 +; startsandstorm + + ld a, [Weather] + cp WEATHER_SANDSTORM + jr z, .asm_37712 + ld a, WEATHER_SANDSTORM + ld [Weather], a + ld a, 5 + ld [WeatherCount], a + call $7e01 + ld hl, SandstormBrewedText + jp FarBattleTextBox +.asm_37712 + call $7e77 + jp $734e +; 37718 + + +BattleCommand5b: ; 37718 +; checkcurl + + ld de, $c672 + ld a, [hBattleTurn] + and a + jr z, .asm_37723 ; 3771e $3 + ld de, $c67a +.asm_37723 + ld a, BATTLE_VARS_SUBSTATUS1 + call CleanGetBattleVarPair + bit 6, a + jr z, .asm_37731 ; 3772a $5 + ld b, $4 + jp $7e8c +.asm_37731 + xor a + ld [de], a + ret +; 37734 + + +BattleCommand5c: ; 37734 +; rolloutpower + + ld a, BATTLE_VARS_STATUS + call CleanGetBattleVarPair + and $7 + ret nz + ld hl, $c672 + ld a, [hBattleTurn] + and a + jr z, .asm_37747 ; 37742 $3 + ld hl, $c67a +.asm_37747 + ld a, [hl] + and a + jr nz, .asm_37750 ; 37749 $5 + ld a, $1 + ld [$c73e], a +.asm_37750 + ld a, [AttackMissed] + and a + jr z, .asm_3775e ; 37754 $8 + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + res 6, [hl] + ret +.asm_3775e + inc [hl] + ld a, [hl] + ld b, a + cp $5 + jr c, .asm_3776e ; 37763 $9 + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + res 6, [hl] + jr .asm_37775 ; 3776c $7 +.asm_3776e + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + set 6, [hl] +.asm_37775 + ld a, BATTLE_VARS_SUBSTATUS2 + call CleanGetBattleVarPair + bit 0, a + jr z, .asm_3777f ; 3777c $1 + inc b +.asm_3777f + dec b + jr z, .asm_37790 ; 37780 $e + ld hl, CurDamage + 1 + sla [hl] + dec hl + rl [hl] + jr nc, .asm_3777f ; 3778a $f3 + ld a, $ff + ld [hli], a + ld [hl], a +.asm_37790 + ret +; 37791 + + +BattleCommand5d: ; 37791 +; unused + ret +; 37792 + + +BattleCommand5e: ; 37792 +; furycutter + + ld hl, $c678 + ld a, [hBattleTurn] + and a + jr z, .asm_3779d ; 37798 $3 + ld hl, $c680 +.asm_3779d + ld a, [AttackMissed] + and a + jp nz, Function0x377be + inc [hl] + ld a, [hl] + ld b, a + cp $6 + jr c, .asm_377ad ; 377a9 $2 + ld b, $5 +.asm_377ad + dec b + ret z + ld hl, CurDamage + 1 + sla [hl] + dec hl + rl [hl] + jr nc, .asm_377ad ; 377b7 $f4 + ld a, $ff + ld [hli], a + ld [hl], a + ret +; 377be + + +Function0x377be: ; 377be + push hl + + ld hl, $c678 + ld a, [hBattleTurn] + and a + jr z, .asm_377ca + ld hl, $c680 + +.asm_377ca + xor a + ld [hl], a + + pop hl + ret +; 377ce + + +BattleCommand5f: ; 377ce +; attract + ld a, [AttackMissed] + and a + jr nz, .asm_377f2 + call Function0x377f5 + jr c, .asm_377f2 + call CheckHiddenOpponent + jr nz, .asm_377f2 + ld a, BATTLE_VARS_SUBSTATUS1_OPP + call GetBattleVarPair + bit 7, [hl] + jr nz, .asm_377f2 + + set 7, [hl] + call $7e01 + +; 'fell in love!' + ld hl, FellInLoveText + jp FarBattleTextBox + +.asm_377f2 + jp Function0x37354 +; 377f5 + + +Function0x377f5: ; 377f5 + ld a, 0 + call BattlePartyAttr + ld a, [hl] + ld [CurPartySpecies], a + + ld a, [CurBattleMon] + ld [CurPartyMon], a + xor a + ld [MonType], a + + ld a, $14 + ld hl, $4bdd + rst FarCall + jr c, .asm_37849 + + ld b, 1 + jr nz, .asm_37815 + dec b + +.asm_37815 + push bc + ld a, [TempEnemyMonSpecies] + ld [CurPartySpecies], a + ld hl, EnemyMonAtkDefDV + ld a, [EnemySubStatus5] + bit 3, a + jr z, .asm_37829 + ld hl, $c6f2 + +.asm_37829 + ld a, [hli] + ld [$d123], a + ld a, [hl] + ld [$d124], a + ld a, $3 + ld [MonType], a + ld a, $14 + ld hl, $4bdd + rst FarCall + pop bc + jr c, .asm_37849 + + ld a, 1 + jr nz, .asm_37844 + dec a + +.asm_37844 + xor b + jr z, .asm_37849 + + and a + ret + +.asm_37849 + scf + ret +; 3784b + + +BattleCommand60: ; 3784b +; checkhappiness + push bc + ld hl, BattleMonHappiness + ld a, [hBattleTurn] + and a + jr z, .asm_37857 ; 37852 $3 + ld hl, EnemyMonHappiness +.asm_37857 + xor a + ld [$ffb4], a + ld [$ffb5], a + ld a, [hl] + ld [$ffb6], a + ld a, $a + ld [$ffb7], a + call $3119 + ld a, $19 + ld [$ffb7], a + ld b, $4 + call $3124 + ld a, [$ffb6] + ld d, a + pop bc + ret +; 37874 + + +BattleCommand61: ; 37874 +; present + + ld a, [InLinkBattle] + cp $3 + jr z, .asm_3787d ; 37879 $2 + push bc + push de +.asm_3787d + call $46d2 + ld a, [InLinkBattle] + cp $3 + jr z, .asm_37889 ; 37885 $2 + pop de + pop bc +.asm_37889 + ld a, [$d265] + and a + jp z, $7e77 + ld a, [AttackMissed] + and a + jp nz, $7e77 + push bc + call FarBattleRNG + ld b, a + ld hl, .table_37907 + ld c, 0 +.asm_378a1 + ld a, [hli] + cp $ff + jr z, .asm_378b7 ; 378a4 $11 + cp b + jr nc, .asm_378ad ; 378a7 $4 + inc c + inc hl + jr .asm_378a1 ; 378ab $f4 +.asm_378ad + ld a, c + ld [$c689], a + call $7de9 + ld d, [hl] + pop bc + ret +.asm_378b7 + pop bc + ld a, $3 + ld [$c689], a + call $7e01 + call $4ffd + ld hl, $5246 + ld a, [hBattleTurn] + and a + jr z, .asm_378ce ; 378c9 $3 + ld hl, $5251 +.asm_378ce + ld a, $e + rst FarCall + jr c, .asm_378f3 ; 378d1 $20 + ld hl, $4c8e + call $7e73 + call $4ffd + ld hl, $4cef + call $7e73 + call $4ffd + ld hl, RegainedHealthText + call FarBattleTextBox + call $4ffd + call $398e + jr .asm_37904 ; 378f1 $11 +.asm_378f3 + call $4ffd + call $7ed5 + jr nc, .asm_37904 ; 378f9 $9 + call $7e77 + ld hl, RefusedGiftText + call FarBattleTextBox +.asm_37904 + jp EndMoveEffect + +.table_37907 + db $66, 40 + db $b3, 80 + db $cc, 120 + db $ff +; 3790e + + +BattleCommand63: ; 3790e +; checkfrustration + + push bc + ld hl, BattleMonHappiness + ld a, [hBattleTurn] + and a + jr z, .asm_3791a ; 37915 $3 + ld hl, EnemyMonHappiness +.asm_3791a + ld a, $ff + sub [hl] + ld [$ffb6], a + xor a + ld [$ffb4], a + ld [$ffb5], a + ld a, $a + ld [$ffb7], a + call $3119 + ld a, $19 + ld [$ffb7], a + ld b, $4 + call $3124 + ld a, [$ffb6] + ld d, a + pop bc + ret +; 37939 + + +BattleCommand64: ; 37939 +; safeguard + + ld hl, PlayerScreens + ld de, $c701 + ld a, [hBattleTurn] + and a + jr z, .asm_3794a ; 37942 $6 + ld hl, $c700 + ld de, $c705 +.asm_3794a + bit 2, [hl] + jr nz, .asm_3795c ; 3794c $e + set 2, [hl] + ld a, $5 + ld [de], a + call $7e01 + ld hl, CoveredByVeilText + jp FarBattleTextBox +.asm_3795c + call $7e77 + jp $734e +; 37962 + + +Function0x37962: ; 37962 + push hl + ld hl, $c700 + ld a, [hBattleTurn] + and a + jr z, .asm_3796e + ld hl, PlayerScreens + +.asm_3796e + bit 2, [hl] + pop hl + ret +; 37972 + + +BattleCommand65: ; 37972 + ld hl, $c700 + ld a, [hBattleTurn] + and a + jr z, .asm_3797d ; 37978 $3 + ld hl, PlayerScreens +.asm_3797d + bit 2, [hl] + ret z + ld a, $1 + ld [AttackMissed], a + call $7e80 + ld hl, SafeguardProtectText + call FarBattleTextBox + jp EndMoveEffect +; 37991 + + +BattleCommand66: ; 37991 +; getmagnitude + + push bc + call FarBattleRNG + ld b, a + ld hl, .Magnitudes +.asm_37999 + ld a, [hli] + cp b + jr nc, .asm_379a1 ; 3799b $4 + inc hl + inc hl + jr .asm_37999 ; 3799f $f8 +.asm_379a1 + ld d, [hl] + push de + inc hl + ld a, [hl] + ld [$d265], a + call $7e80 + ld hl, MagnitudeText + call FarBattleTextBox + pop de + pop bc + ret + +.Magnitudes + ; /255, BP, magnitude + db 13, 10, 4 + db 38, 30, 5 + db 89, 50, 6 + db 166, 70, 7 + db 217, 90, 8 + db 242, 110, 9 + db 255, 150, 10 +; 379c9 + + +BattleCommand67: ; 379c9 +; batonpass + + ld a, [hBattleTurn] + and a + jp nz, .Enemy + + call Function0x37ae9 + jp z, $7aab + + call $399c + call $7e01 + + ld c, 50 + call DelayFrames + + call $1d6e + + ld a, $f + ld hl, $52f7 + rst FarCall + + ld a, $f + ld hl, $5380 + rst FarCall + + call $3317 + + ld a, $f + ld hl, $6d9f + rst FarCall + + call $1c17 + call $300b + + ld hl, $c4a1 + ld bc, $040a + call ClearBox + + ld b, 1 + call $3340 + call $32f9 + call $7a67 + + ld a, $f + ld hl, $52e0 + rst FarCall + + jp c, EndMoveEffect + + ld hl, $6459 + call $7e73 + call $7ab1 + + ret + +.Enemy + ld a, [IsInBattle] + dec a + jp z, $7aab + + call $7af6 + jp z, $7aab + + call $39b0 + call $7e01 + call $7a82 + + ld a, $f + ld hl, $52e0 + rst FarCall + jp c, $52a3 + + xor a + ld [$c718], a + + ld hl, $5517 + call $7e73 + + ld hl, $557a + call $7e73 + + ld a, 1 + ld [$d265], a + + ld hl, $6cab + call $7e73 + + ld hl, $5c23 + call $7e73 + + jr Function0x37ab1 + + ld a, [InLinkBattle] + and a + ret z + + ld a, 1 + ld [$d0ec], a + + call $1d6e + + ld hl, $68e4 + call $7e73 + + call $1c17 + + xor a + ld [$d0ec], a + + ret +; 37a82 + + ld a, [InLinkBattle] + and a + ret z + + call $1d6e + ld hl, $68e4 + call $7e73 + ld a, [OTPartyCount] + add $4 + ld b, a + ld a, [$d430] + cp $4 + jr c, .asm_37aa0 + + cp b + jr c, .asm_37aa8 + +.asm_37aa0 + ld a, [CurOTMon] + add $4 + ld [$d430], a +.asm_37aa8 + jp $1c17 + call $7e77 + jp $734e + + +Function0x37ab1: ; 37ab1 + ld a, $a + call CleanGetBattleVarPair + and $7 + jr nz, .asm_37ac1 + ld a, $0 + call GetBattleVarPair + res 0, [hl] + +.asm_37ac1 + call $72e7 + ld hl, PlayerSubStatus1 + res 7, [hl] + ld hl, EnemySubStatus1 + res 7, [hl] + ld hl, PlayerSubStatus5 + ld a, $4 + call GetBattleVarPair + res 3, [hl] + res 4, [hl] + ld a, $13 + call GetBattleVarPair + ld [hl], $0 + xor a + ld [$c730], a + ld [$c731], a + ret +; 37ae9 + + +Function0x37ae9: ; 37ae9 + ld hl, PartyMon1CurHP + ld a, [PartyCount] + ld d, a + ld a, [CurBattleMon] + ld e, a + jr .asm_37b01 + + ld hl, OTPartyMon1CurHP + ld a, [OTPartyCount] + ld d, a + ld a, [CurOTMon] + ld e, a +.asm_37b01 + xor a + ld b, a + ld c, a +.asm_37b04 + ld a, c + cp d + jr z, .asm_37b1a + + cp e + jr z, .asm_37b11 + + ld a, [hli] + or b + ld b, a + ld a, [hld] + or b + ld b, a +.asm_37b11 + push bc + ld bc, $0030 + add hl, bc + pop bc + inc c + jr .asm_37b04 + +.asm_37b1a + ld a, b + and a + ret +; 37b1d + + +BattleCommand68: ; 37b1d + ld hl, $c711 + ld a, [hBattleTurn] + and a + jr z, .asm_37b28 ; 37b23 $3 + ld hl, $c710 +.asm_37b28 + ld a, [hl] + and a + ret z + ld hl, CurDamage + 1 + sla [hl] + dec hl + rl [hl] + ret nc + ld a, $ff + ld [hli], a + ld [hl], a + ret +; 37b39 + + +BattleCommand69: ; 37b39 +; clearhazards + + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarPair + bit 7, [hl] + jr z, .asm_37b4a ; 37b40 $8 + res 7, [hl] + ld hl, ShedLeechSeedText + call FarBattleTextBox +.asm_37b4a + ld hl, PlayerScreens + ld de, $c730 + ld a, [hBattleTurn] + and a + jr z, .asm_37b5b ; 37b53 $6 + ld hl, $c700 + ld de, $c731 +.asm_37b5b + bit 0, [hl] + jr z, .asm_37b69 ; 37b5d $a + res 0, [hl] + ld hl, BlewSpikesText + push de + call FarBattleTextBox + pop de +.asm_37b69 + ld a, [de] + and a + ret z + xor a + ld [de], a + ld hl, ReleasedByText + jp FarBattleTextBox +; 37b74 + + +BattleCommand6a: ; 37b74 +; healmorn + ld b, MORN + jr BattleCommand6a6c +; 37b78 + +BattleCommand6b: ; 37b78 +; healday + ld b, DAY + jr BattleCommand6a6c +; 37b7c + +BattleCommand6c: ; 37b7c +; healnite + ld b, NITE + ; fallthrough +; 37b7e + +BattleCommand6a6c: ; 37b7e +; Time- and weather-sensitive heal. + + ld hl, BattleMonMaxHP + ld de, BattleMonHP + ld a, [hBattleTurn] + and a + jr z, .start + ld hl, EnemyMonMaxHP + ld de, EnemyMonHP + +.start +; Index for .Multipliers +; Default restores half max HP. + ld c, 2 + +; Don't bother healing if HP is already full. + push bc + call StringCmp + pop bc + jr z, .Full + +; Don't factor in time of day in link battles. + ld a, [InLinkBattle] + and a + jr nz, .Weather + + ld a, [TimeOfDay] + cp b + jr z, .Weather + dec c + +.Weather + ld a, [Weather] + and a + jr z, .Heal + +; x2 in sun +; /2 in rain/sandstorm + inc c + cp WEATHER_SUN + jr z, .Heal + 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 $7e01 + call $4ffd + + ld hl, $4cef + ld a, $f + rst FarCall ; callab 3ccef + + call $4ffd + call $3995 + +; 'regained health!' + ld hl, RegainedHealthText + jp FarBattleTextBox + +.Full + call $7e77 + +; 'hp is full!' + ld hl, HPIsFullText + jp FarBattleTextBox + +.Multipliers + dw GetEighthMaxHP + dw GetQuarterMaxHP + dw GetHalfMaxHP + dw GetMaxHP +; 37be8 + + +BattleCommand6d: ; 37be8 + ld a, [AttackMissed] + and a + ret nz + + ld a, $3e + ld hl, $7ced + rst FarCall ; callba 3e 7ced + ret +; 37bf4 + + +BattleCommand6e: ; 37bf4 +; startrain + ld a, WEATHER_RAIN + ld [Weather], a + ld a, 5 + ld [WeatherCount], a + call $7e01 + ld hl, DownpourText + jp FarBattleTextBox +; 37c07 + + +BattleCommand6f: ; 37c07 +; startsun + ld a, WEATHER_SUN + ld [Weather], a + ld a, 5 + ld [WeatherCount], a + call $7e01 + ld hl, SunGotBrightText + jp FarBattleTextBox +; 37c1a + + +BattleCommand95: ; 37c1a +; bellydrum + call $61c8 + ld a, [AttackMissed] + and a + jr nz, .asm_37c4f ; 37c21 $2c + ld hl, $4c9f + ld a, $f + rst FarCall + ld hl, $4cde + ld a, $f + rst FarCall + jr nc, .asm_37c4f ; 37c2f $1e + push bc + call $7e01 + pop bc + ld hl, $4c3f + ld a, $f + rst FarCall + call $3995 + ld a, $5 +.asm_37c41 + push af + call $61c8 + pop af + dec a + jr nz, .asm_37c41 ; 37c47 $f8 + ld hl, BellyDrumText + jp FarBattleTextBox +.asm_37c4f + call $7e77 + jp $734e +; 37c55 + + +BattleCommand96: ; 37c55 +; psychup + + ld hl, EnemyStatLevels + ld de, PlayerStatLevels + ld a, [hBattleTurn] + and a + jr z, .asm_37c64 ; 37c5e $4 + push hl + ld h, d + ld l, e + pop de +.asm_37c64 + push hl + ld b, $8 +.asm_37c67 + ld a, [hli] + cp $7 + jr nz, .asm_37c76 ; 37c6a $a + dec b + jr nz, .asm_37c67 ; 37c6d $f8 + pop hl + call $7e77 + jp $734e +.asm_37c76 + pop hl + ld b, $8 +.asm_37c79 + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .asm_37c79 ; 37c7d $fa + ld a, [hBattleTurn] + and a + jr nz, .asm_37c89 ; 37c82 $5 + call Function0x365d7 + jr .asm_37c8c ; 37c87 $3 +.asm_37c89 + call Function0x365fd +.asm_37c8c + call $7e01 + ld hl, CopiedStatsText + jp FarBattleTextBox +; 37c95 + + +BattleCommand9a: ; 37c95 +; mirrorcoat + + ld a, $1 + ld [AttackMissed], a + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + and a + ret z + ld b, a + ld hl, $45ec + ld a, $f + rst FarCall + ld a, b + cp $90 + ret z + call $4833 + ld a, [$d265] + and a + ret z + call Function0x36abf + ret z + ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + call CleanGetBattleVarPair + dec a + ld de, StringBuffer1 + call GetMoveData + ld a, [$d075] + and a + ret z + ld a, [$d076] + cp $14 + 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, .asm_37ce1 ; 37cdb $4 + ld a, $ff + ld [hli], a + ld [hl], a +.asm_37ce1 + xor a + ld [AttackMissed], a + ret +; 37ce6 + + +BattleCommand9d: ; 37ce6 +; checkminimize + + ld hl, $c6fa + ld a, [hBattleTurn] + and a + jr z, .asm_37cf1 ; 37cec $3 + ld hl, $c6fe +.asm_37cf1 + ld a, [hl] + and a + ret z + ld hl, CurDamage + 1 + sla [hl] + dec hl + rl [hl] + ret nc + ld a, $ff + ld [hli], a + ld [hl], a + ret +; 37d02 + + +BattleCommand9e: ; 37d02 +; skipsuncharge + ld a, [Weather] + cp WEATHER_SUN + ret nz + ld b, $39 + jp $7e8c +; 37d0d + + +BattleCommand9b: ; 37d0d + ld hl, $c71d + ld de, $c727 + ld a, [hBattleTurn] + and a + jr z, .asm_37d1e ; 37d16 $6 + ld hl, $c71e + ld de, $c729 +.asm_37d1e + 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, $9c + jp $7e8c +; 37d34 + +BattleCommand9c: ; 37d34 +; futuresight + + call Function0x34548 + jr nz, .asm_37d4b ; 37d37 $12 + ld a, BATTLE_VARS_MOVE_ANIM + call CleanGetBattleVarPair + ld b, a + ld a, BATTLE_VARS_LAST_COUNTER_MOVE + call GetBattleVarPair + ld [hl], b + ld a, BATTLE_VARS_LAST_MOVE + call GetBattleVarPair + ld [hl], b +.asm_37d4b + ld hl, $c71d + ld a, [hBattleTurn] + and a + jr z, .asm_37d56 ; 37d51 $3 + ld hl, $c71e +.asm_37d56 + ld a, [hl] + and a + jr nz, .asm_37d87 ; 37d58 $2d + ld a, $4 + ld [hl], a + call BattleCommand0a + call $7e80 + ld hl, ForesawAttackText + call FarBattleTextBox + call BattleCommand0c + ld de, $c727 + ld a, [hBattleTurn] + and a + jr z, .asm_37d77 ; 37d72 $3 + ld de, $c729 +.asm_37d77 + ld hl, CurDamage + ld a, [hl] + ld [de], a + ld [hl], $0 + inc hl + inc de + ld a, [hl] + ld [de], a + ld [hl], $0 + jp EndMoveEffect +.asm_37d87 + pop bc + call ResetDamage + call $7e77 + call $734e + jp EndMoveEffect +; 37d94 + + +BattleCommand9f: ; 37d94 +; thunderaccuracy + + ld a, BATTLE_VARS_MOVE_TYPE + call GetBattleVarPair + inc hl + ld a, [Weather] + cp WEATHER_RAIN + jr z, .asm_37da7 ; 37d9f $6 + cp WEATHER_SUN + ret nz + ld [hl], $80 + ret +.asm_37da7 + ld [hl], $ff + ret +; 37daa + + +CheckHiddenOpponent: ; 37daa + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call CleanGetBattleVarPair + and $60 ; fly | dig + ret +; 37db2 + + +GetUserItem: ; 37db2 +; Return the effect of the user's item in bc, and its id at hl. + ld hl, BattleMonItem + ld a, [hBattleTurn] + and a + jr z, .go + ld hl, EnemyMonItem +.go + ld b, [hl] + jp GetItem +; 37dc1 + + +GetOpponentItem: ; 37dc1 +; Return the effect of the opponent's item in bc, and its id at hl. + ld hl, EnemyMonItem + ld a, [hBattleTurn] + and a + jr z, .go + ld hl, BattleMonItem +.go + ld b, [hl] + jp GetItem +; 37dd0 + + +GetItem: ; 37dd0 +; Return the effect of item b in bc. + ld a, b + and a + ret z + + push hl + ld hl, $67c3 ; Items + dec a + ld c, a + ld b, 0 + ld a, 7 + call AddNTimes + ld a, $1 ; BANK(Items) + call GetFarHalfword + ld b, l + ld c, h + pop hl + ret +; 37de9 + + +INCBIN "baserom.gbc", $37de9, $37e80 - $37de9 + + +BattleCommandaa: ; 37e80 +; wait +; Wait 40 frames. + ld c, 40 + jp DelayFrames +; 37e85 + + +BattleCommand38: ; 37e85 +; duped out +; Used in multi-hit moves. + ld hl, .text + jp BattleTextBox +.text + db "@" +; 37e8c + + +INCBIN "baserom.gbc", $37e8c, $37ead - $37e8c + + +GetMoveData: ; 37ead +; Get move struct a. + ld hl, Moves + ld bc, Move1 - Move0 + call AddNTimes + ld a, Bank(Moves) + jp FarCopyBytes +; 37ebb + +INCBIN "baserom.gbc", $37ebb, $37ee2 - $37ebb + + + diff --git a/main.asm b/main.asm index f9e181803..a327629cd 100644 --- a/main.asm +++ b/main.asm @@ -1126,14 +1126,34 @@ FarCopyBytesDouble: ; e9b ; 0xeba -INCBIN "baserom.gbc",$eba,$fc8 - $eba +INCBIN "baserom.gbc",$eba,$fb6 - $eba +ClearBox: ; fb6 +; Fill a c*b box at hl with blank tiles. + + ld a, " " +.y + push bc + push hl +.x + ld [hli], a + dec c + jr nz, .x + pop hl + ld bc, 20 ; screen width + add hl, bc + pop bc + dec b + jr nz, .y + ret +; fc8 + ClearTileMap: ; fc8 -; Fill the tile map with blank tiles +; Fill TileMap with blank tiles ld hl, TileMap - ld a, $7f ; blank tile - ld bc, 360 ; length of TileMap + ld a, " " + ld bc, 360 ; screen dimensions 20*18 call ByteFill ; We aren't done if the LCD is on @@ -3271,8 +3291,10 @@ GetNthString: ; 3411 ret ; 0x3420 + INCBIN "baserom.gbc",$3420,$3468 - $3420 + GetItemName: ; 3468 push hl push bc @@ -3291,9 +3313,30 @@ GetItemName: ; 3468 pop bc pop hl ret -; 0x3487 +; 3487 + + +INCBIN "baserom.gbc", $3487, $34f8 - $3487 + + +GetMoveName: ; 34f8 + push hl +; move name + ld a, $2 ; move names + ld [$cf61], a +; move id + ld a, [$d265] + ld [$cf60], a + + call GetName + ld de, StringBuffer1 + pop hl + ret +; 350c + + +INCBIN "baserom.gbc", $350c, $3856 - $350c -INCBIN "baserom.gbc",$3487,$3856 - $3487 GetBaseStats: ; 3856 push bc @@ -3483,7 +3526,26 @@ GetPartyLocation: ; 3927 jp AddNTimes ; 392d -INCBIN "baserom.gbc", $392d, $397d - $392d + +INCBIN "baserom.gbc", $392d, $395d - $392d + + +BattlePartyAttr: ; 395d +; Get attribute a from the active monster's party struct. + push bc + ld c, a + ld b, 0 + ld hl, PartyMons + add hl, bc + ld a, [CurBattleMon] + call GetPartyLocation + pop bc + ret +; 396d + + +INCBIN "baserom.gbc", $396d, $397d - $396d + ResetDamage: ; 397d xor a @@ -5666,7 +5728,15 @@ TrainerClassDVs ; 270d6 db $98, $88 ; mysticalman ; 2715c -INCBIN "baserom.gbc",$2715c,$27a2d - $2715c +INCBIN "baserom.gbc", $2715c, $271f4 - $2715c + +MoveEffectsPointers: ; 271f4 + +INCBIN "baserom.gbc", $271f4, $2732e - $271f4 + +MoveEffects: ; 2732e + +INCBIN "baserom.gbc", $2732e, $27a2d - $2732e SECTION "bankA",DATA,BANK[$A] @@ -6006,13 +6076,7 @@ INCBIN "baserom.gbc",$329ed,$333f0 - $329ed SECTION "bankD",DATA,BANK[$D] -INCBIN "baserom.gbc",$34000,$34bb1 - $34000 - -TypeMatchup: ; 34bb1 -INCLUDE "battle/type_matchup.asm" -; 34cfd - -INCBIN "baserom.gbc",$34cfd,$37ee2 - $34cfd +INCLUDE "battle/effect_commands.asm" SECTION "bankE",DATA,BANK[$E] @@ -6027,7 +6091,91 @@ INCLUDE "trainers/trainers.asm" SECTION "bankF",DATA,BANK[$F] -INCBIN "baserom.gbc",$3C000,$3d123 - $3C000 +INCBIN "baserom.gbc", $3c000, $3cc83 - $3c000 + +GetEighthMaxHP: ; 3cc83 +; output: bc + call GetQuarterMaxHP +; assumes nothing can have 1024 or more hp +; halve result + srl c +; round up + ld a, c + and a + jr nz, .end + inc c +.end + ret +; 3cc8e + + +GetQuarterMaxHP: ; 3cc8e +; output: bc + call GetMaxHP + +; quarter result + srl b + rr c + srl b + rr c + +; assumes nothing can have 1024 or more hp +; round up + ld a, c + and a + jr nz, .end + inc c +.end + ret +; 3cc9f + + +GetHalfMaxHP: ; 3cc9f +; output: bc + call GetMaxHP + +; halve reslut + srl b + rr c + +; floor = 1 + ld a, c + or b + jr nz, .end + inc c +.end + ret +; 3ccac + + +GetMaxHP: ; 3ccac +; output: bc, $d1ea-b + +; player + ld hl, BattleMonMaxHP + +; whose turn? + ld a, [hBattleTurn] + and a + jr z, .gethp + +; enemy + ld hl, EnemyMonMaxHP + +.gethp + ld a, [hli] + ld [$d1eb], a + ld b, a + + ld a, [hl] + ld [$d1ea], a + ld c, a + ret +; 3ccc2 + + +INCBIN "baserom.gbc", $3ccc2, $3d123 - $3ccc2 + ; These functions check if the current opponent is a gym leader or one of a ; few other special trainers. @@ -6894,7 +7042,14 @@ BattleStartMessage: ret ; 0x3fd26 -INCBIN "baserom.gbc",$3fd26,$3fe86 - $3fd26 + + dw $0000 ; padding + + +BattleCommandPointers: ; 3fd28 + +INCLUDE "battle/effect_command_pointers.asm" + SECTION "bank10",DATA,BANK[$10] @@ -14626,7 +14781,366 @@ INCBIN "baserom.gbc",$105688,$105930 - $105688 ; japanese mystery gift gfx INCBIN "gfx/misc/mystery_gift_jp.2bpp" -INCBIN "baserom.gbc",$105db0,$105ef6 - $105db0 + +DisplayUsedMoveText: ; 105db0 +; battle command 03 + ld hl, UsedMoveText + call BattleTextBox + jp WaitBGMap +; 105db9 + + +UsedMoveText: ; 105db9 + +; this is a stream of text and asm from 105db9 to 105ef6 + +; print actor name + text_jump _ActorNameText, BANK(_ActorNameText) + start_asm + +; ???? + ld a, [hBattleTurn] + and a + jr nz, .start + +; append used move list + ld a, [PlayerMoveAnimation] + call UpdateUsedMoves + +.start +; get address for last move + ld a, $13 ; last move + call GetBattleVarPair + ld d, h + ld e, l + +; get address for last counter move + ld a, $11 + call GetBattleVarPair + +; get move animation (id) + ld a, $c ; move animation + call CleanGetBattleVarPair + ld [$d265], a + +; check actor ???? + push hl + callba Function0x34548 + pop hl + jr nz, .grammar + +; update last move + ld a, [$d265] + ld [hl], a + ld [de], a + +.grammar + call GetMoveGrammar +; $d265 now contains MoveGrammar + + +; everything except 'instead' made redundant in localization + +; check obedience + ld a, [$c6f4] + and a + ld hl, UsedMove2Text + ret nz + +; check move grammar + ld a, [$d265] + cp $3 + ld hl, UsedMove2Text + ret c + ld hl, UsedMove1Text + ret +; 105e04 + +UsedMove1Text: ; 105e04 + text_jump _UsedMove1Text, BANK(_UsedMove1Text) + start_asm + jr Function105e10 +; 105e0b + +UsedMove2Text: ; 105e0b + text_jump _UsedMove2Text, BANK(_UsedMove2Text) + start_asm +; 105e10 + +Function105e10: ; 105e10 +; check obedience + ld a, [$c6f4] + and a + jr z, GetMoveNameText +; print "instead," + ld hl, UsedInsteadText + ret +; 105e1a + +UsedInsteadText: ; 105e1a + text_jump _UsedInsteadText, BANK(_UsedInsteadText) + start_asm +; 105e1f + +GetMoveNameText: ; 105e1f + ld hl, MoveNameText + ret +; 105e23 + +MoveNameText: ; 105e23 + text_jump _MoveNameText, BANK(_MoveNameText) + start_asm +; 105e28 + +GetUsedMoveTextEnder: ; 105e28 +; get start address + ld hl, .endusedmovetexts + +; get move id + ld a, [$d265] + +; 2-byte pointer + add a + +; seek + push bc + ld b, $0 + ld c, a + add hl, bc + pop bc + +; get pointer to usedmovetext ender + ld a, [hli] + ld h, [hl] + ld l, a + ret +; 105e39 + +.endusedmovetexts ; 105e39 + dw EndUsedMove1Text + dw EndUsedMove2Text + dw EndUsedMove3Text + dw EndUsedMove4Text + dw EndUsedMove5Text +; 105e43 + +EndUsedMove1Text: ; 105e43 + text_jump _EndUsedMove1Text, BANK(_EndUsedMove1Text) + db "@" +; 105e48 +EndUsedMove2Text: ; 105e48 + text_jump _EndUsedMove2Text, BANK(_EndUsedMove2Text) + db "@" +; 105e4d +EndUsedMove3Text: ; 105e4d + text_jump _EndUsedMove3Text, BANK(_EndUsedMove3Text) + db "@" +; 105e52 +EndUsedMove4Text: ; 105e52 + text_jump _EndUsedMove4Text, BANK(_EndUsedMove4Text) + db "@" +; 105e57 +EndUsedMove5Text: ; 105e57 + text_jump _EndUsedMove5Text, BANK(_EndUsedMove5Text) + db "@" +; 105e5c + + +GetMoveGrammar: ; 105e5c +; store move grammar type in $d265 + + push bc +; c = move id + ld a, [$d265] + ld c, a + ld b, $0 + +; read grammar table + ld hl, MoveGrammar +.loop + ld a, [hli] +; end of table? + cp $ff + jr z, .end +; match? + cp c + jr z, .end +; advance grammar type at $00 + and a + jr nz, .loop +; next grammar type + inc b + jr .loop + +.end +; $d265 now contains move grammar + ld a, b + ld [$d265], a + +; we're done + pop bc + ret +; 105e7a + +MoveGrammar: ; 105e7a +; made redundant in localization +; each move is given an identifier for what usedmovetext to use (0-4): + +; 0 + db SWORDS_DANCE + db GROWTH + db STRENGTH + db HARDEN + db MINIMIZE + db SMOKESCREEN + db WITHDRAW + db DEFENSE_CURL + db EGG_BOMB + db SMOG + db BONE_CLUB + db FLASH + db SPLASH + db ACID_ARMOR + db BONEMERANG + db REST + db SHARPEN + db SUBSTITUTE + db MIND_READER + db SNORE + db PROTECT + db SPIKES + db ENDURE + db ROLLOUT + db SWAGGER + db SLEEP_TALK + db HIDDEN_POWER + db PSYCH_UP + db EXTREMESPEED + db 0 ; end set + +; 1 + db RECOVER + db TELEPORT + db BIDE + db SELFDESTRUCT + db AMNESIA + db FLAIL + db 0 ; end set + +; 2 + db MEDITATE + db AGILITY + db MIMIC + db DOUBLE_TEAM + db BARRAGE + db TRANSFORM + db STRUGGLE + db SCARY_FACE + db 0 ; end set + +; 3 + db POUND + db SCRATCH + db VICEGRIP + db WING_ATTACK + db FLY + db BIND + db SLAM + db HORN_ATTACK + db WRAP + db THRASH + db TAIL_WHIP + db LEER + db BITE + db GROWL + db ROAR + db SING + db PECK + db ABSORB + db STRING_SHOT + db EARTHQUAKE + db FISSURE + db DIG + db TOXIC + db SCREECH + db METRONOME + db LICK + db CLAMP + db CONSTRICT + db POISON_GAS + db BUBBLE + db SLASH + db SPIDER_WEB + db NIGHTMARE + db CURSE + db FORESIGHT + db CHARM + db ATTRACT + db ROCK_SMASH + db 0 ; end set + +; all other moves = 4 + db $ff ; end +; 105ed0 + + +UpdateUsedMoves: ; 105ed0 +; append move a to PlayerUsedMoves unless it has already been used + + push bc +; start of list + ld hl, PlayerUsedMoves +; get move id + ld b, a +; loop count + ld c, NUM_MOVES + +.loop +; get move from the list + ld a, [hli] +; not used yet? + and a + jr z, .add +; already used? + cp b + jr z, .quit +; next byte + dec c + jr nz, .loop + +; if the list is full and the move hasn't already been used +; shift the list back one byte, deleting the first move used +; this can occur with struggle or a new learned move + ld hl, PlayerUsedMoves + 1 +; 1 = 2 + ld a, [hld] + ld [hli], a +; 2 = 3 + inc hl + ld a, [hld] + ld [hli], a +; 3 = 4 + inc hl + ld a, [hld] + ld [hl], a +; 4 = new move + ld a, b + ld [PlayerUsedMoves + 3], a + jr .quit + +.add +; go back to the byte we just inced from + dec hl +; add the new move + ld [hl], b + +.quit +; list updated + pop bc + ret +; 105ef6 + + HallOfFame2: ; 0x105ef6 ret diff --git a/wram.asm b/wram.asm index 2966b480c..104c8b5a1 100644 --- a/wram.asm +++ b/wram.asm @@ -604,7 +604,7 @@ PlayerDamageTaken: ; c682 EnemyDamageTaken: ; c684 ds 2 - ds 4 + ds 5 BattleScriptBuffer: ; c68a ds 40 @@ -612,7 +612,7 @@ BattleScriptBuffer: ; c68a BattleScriptBufferLoc: ; c6b2 ds 2 - ds 25 + ds 24 PlayerStatLevels: ; c6cc ; 07 neutral