diff --git a/battle/effect_commands.asm b/battle/effect_commands.asm index 1ae8976ae..996634376 100644 --- a/battle/effect_commands.asm +++ b/battle/effect_commands.asm @@ -9544,104 +9544,9 @@ BattleCommand53: ; 37563 INCLUDE "battle/effects/curse.asm" +INCLUDE "battle/effects/protect.asm" -BattleCommand55: ; 37618 -; protect - call ProtectChance - ret c - - ld a, BATTLE_VARS_SUBSTATUS1 - call GetBattleVarPair - set SUBSTATUS_PROTECT, [hl] - - call Function0x37e01 - - ld hl, ProtectedItselfText - jp StdBattleTextBox -; 3762c - - -ProtectChance: ; 3762c - - ld de, PlayerProtectCount - ld a, [hBattleTurn] - and a - jr z, .asm_37637 - ld de, EnemyProtectCount -.asm_37637 - - call Function0x36abf - jr nz, .failed - -; Can't have a substitute. - - ld a, BATTLE_VARS_SUBSTATUS4 - call CleanGetBattleVarPair - bit SUBSTATUS_SUBSTITUTE, a - jr nz, .failed - -; Halve the chance of a successful Protect for each consecutive use. - - ld b, $ff - ld a, [de] - ld c, a -.loop - ld a, c - and a - jr z, .done - dec c - - srl b - ld a, b - and a - jr nz, .loop - jr .failed -.done - -.rand - call BattleRandom - and a - jr z, .rand - - dec a - cp b - jr nc, .failed - -; Another consecutive Protect use. - - ld a, [de] - inc a - ld [de], a - - and a - ret - - -.failed - xor a - ld [de], a - call Function0x37e77 - call PrintButItFailed - scf - ret -; 3766f - - -BattleCommand5a: ; 3766f -; endure - - call ProtectChance - ret c - - ld a, BATTLE_VARS_SUBSTATUS1 - call GetBattleVarPair - set SUBSTATUS_ENDURE, [hl] - - call Function0x37e01 - - ld hl, BracedItselfText - jp StdBattleTextBox -; 37683 +INCLUDE "battle/effects/endure.asm" BattleCommand56: ; 37683 diff --git a/battle/effects/endure.asm b/battle/effects/endure.asm new file mode 100644 index 000000000..b6ae9358e --- /dev/null +++ b/battle/effects/endure.asm @@ -0,0 +1,16 @@ +BattleCommand5a: ; 3766f +; endure + + call ProtectChance + ret c + + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + set SUBSTATUS_ENDURE, [hl] + + call Function0x37e01 + + ld hl, BracedItselfText + jp StdBattleTextBox +; 37683 + diff --git a/battle/effects/protect.asm b/battle/effects/protect.asm new file mode 100644 index 000000000..80edc0d85 --- /dev/null +++ b/battle/effects/protect.asm @@ -0,0 +1,81 @@ +BattleCommand55: ; 37618 +; protect + call ProtectChance + ret c + + ld a, BATTLE_VARS_SUBSTATUS1 + call GetBattleVarPair + set SUBSTATUS_PROTECT, [hl] + + call Function0x37e01 + + ld hl, ProtectedItselfText + jp StdBattleTextBox +; 3762c + + +ProtectChance: ; 3762c + + ld de, PlayerProtectCount + ld a, [hBattleTurn] + and a + jr z, .asm_37637 + ld de, EnemyProtectCount +.asm_37637 + + call Function0x36abf + jr nz, .failed + +; Can't have a substitute. + + ld a, BATTLE_VARS_SUBSTATUS4 + call CleanGetBattleVarPair + bit SUBSTATUS_SUBSTITUTE, a + jr nz, .failed + +; Halve the chance of a successful Protect for each consecutive use. + + ld b, $ff + ld a, [de] + ld c, a +.loop + ld a, c + and a + jr z, .done + dec c + + srl b + ld a, b + and a + jr nz, .loop + jr .failed +.done + +.rand + call BattleRandom + and a + jr z, .rand + + dec a + cp b + jr nc, .failed + +; Another consecutive Protect use. + + ld a, [de] + inc a + ld [de], a + + and a + ret + + +.failed + xor a + ld [de], a + call Function0x37e77 + call PrintButItFailed + scf + ret +; 3766f +