From 0cf4eb68955952659b0e94fbeae0a75fe36255ae Mon Sep 17 00:00:00 2001 From: Rangi Date: Fri, 26 Jan 2018 11:36:00 -0500 Subject: Move-unique effect commands consistently go in engine/battle/move_effects/ --- engine/battle/effect_commands.asm | 7875 +++++++++++++------------------------ 1 file changed, 2690 insertions(+), 5185 deletions(-) (limited to 'engine/battle/effect_commands.asm') diff --git a/engine/battle/effect_commands.asm b/engine/battle/effect_commands.asm index 604d9f2d9..53c8438e5 100644 --- a/engine/battle/effect_commands.asm +++ b/engine/battle/effect_commands.asm @@ -1306,45 +1306,7 @@ INCLUDE "data/battle/critical_hits.asm" ; 346b2 -BattleCommand_TripleKick: ; 346b2 -; triplekick - - ld a, [wKickCounter] - ld b, a - inc b - ld hl, CurDamage + 1 - ld a, [hld] - ld e, a - ld a, [hli] - ld d, a -.next_kick - dec b - ret z - ld a, [hl] - add e - ld [hld], a - ld a, [hl] - adc d - ld [hli], a - -; No overflow. - jr nc, .next_kick - ld a, $ff - ld [hld], a - ld [hl], a - ret - -; 346cd - - -BattleCommand_KickCounter: ; 346cd -; kickcounter - - ld hl, wKickCounter - inc [hl] - ret - -; 346d2 +INCLUDE "engine/battle/move_effects/triple_kick.asm" BattleCommand_Stab: ; 346d2 @@ -1637,10 +1599,12 @@ BattleCommand_ResetTypeMatchup: ; 34833 ; 3484e + INCLUDE "engine/battle/ai/switch.asm" INCLUDE "data/types/type_matchups.asm" + BattleCommand_DamageVariation: ; 34cfd ; damagevariation @@ -2144,20 +2108,19 @@ BattleCommand_HitTargetNoSub: ; 34f60 ld a, BATTLE_VARS_MOVE_EFFECT call GetBattleVar cp EFFECT_MULTI_HIT - jr z, .multihit + jr z, .alternate_anim cp EFFECT_CONVERSION - jr z, .conversion + jr z, .alternate_anim cp EFFECT_DOUBLE_HIT - jr z, .doublehit + jr z, .alternate_anim cp EFFECT_POISON_MULTI_HIT - jr z, .twineedle + jr z, .alternate_anim cp EFFECT_TRIPLE_KICK jr z, .triplekick xor a ld [wKickCounter], a .triplekick - ld a, BATTLE_VARS_MOVE_ANIM call GetBattleVar ld e, a @@ -2167,18 +2130,13 @@ BattleCommand_HitTargetNoSub: ; 34f60 ld a, BATTLE_VARS_MOVE_ANIM call GetBattleVar cp FLY - jr z, .fly_dig + jr z, .clear_sprite cp DIG ret nz - -.fly_dig -; clear sprite +.clear_sprite jp AppearUserLowerSub -.multihit -.conversion -.doublehit -.twineedle +.alternate_anim ld a, [wKickCounter] and 1 xor 1 @@ -3136,225 +3094,7 @@ EnemyAttackDamage: ; 353f6 ; 35461 -BattleCommand_BeatUp: ; 35461 -; beatup - - call ResetDamage - ld a, [hBattleTurn] - and a - jp nz, .enemy_beats_up - ld a, [PlayerSubStatus3] - bit SUBSTATUS_IN_LOOP, a - jr nz, .next_mon - ld c, 20 - call DelayFrames - xor a - ld [PlayerRolloutCount], a - ld [wd002], a - ld [wBeatUpHitAtLeastOnce], a - jr .got_mon - -.next_mon - ld a, [PlayerRolloutCount] - ld b, a - ld a, [PartyCount] - sub b - ld [wd002], a - -.got_mon - ld a, [wd002] - ld hl, PartyMonNicknames - call GetNick - ld a, MON_HP - call GetBeatupMonLocation - ld a, [hli] - or [hl] - jp z, .beatup_fail ; fainted - ld a, [wd002] - ld c, a - ld a, [CurBattleMon] - ; BUG: this can desynchronize link battles - ; Change "cp [hl]" to "cp c" to fix - cp [hl] - ld hl, BattleMonStatus - jr z, .active_mon - ld a, MON_STATUS - call GetBeatupMonLocation -.active_mon - ld a, [hl] - and a - jp nz, .beatup_fail - - ld a, $1 - ld [wBeatUpHitAtLeastOnce], a - ld hl, BeatUpAttackText - call StdBattleTextBox - ld a, [EnemyMonSpecies] - ld [CurSpecies], a - call GetBaseData - ld a, [BaseDefense] - ld c, a - push bc - ld a, MON_SPECIES - call GetBeatupMonLocation - ld a, [hl] - ld [CurSpecies], a - call GetBaseData - ld a, [BaseAttack] - pop bc - ld b, a - push bc - ld a, MON_LEVEL - call GetBeatupMonLocation - ld a, [hl] - ld e, a - pop bc - ld a, [wPlayerMoveStructPower] - ld d, a - ret - -.enemy_beats_up - ld a, [EnemySubStatus3] - bit SUBSTATUS_IN_LOOP, a - jr nz, .not_first_enemy_beatup - - xor a - ld [EnemyRolloutCount], a - ld [wd002], a - ld [wBeatUpHitAtLeastOnce], a - jr .enemy_continue - -.not_first_enemy_beatup - ld a, [EnemyRolloutCount] - ld b, a - ld a, [OTPartyCount] - sub b - ld [wd002], a -.enemy_continue - ld a, [wBattleMode] - dec a - jr z, .wild - - ld a, [wLinkMode] - and a - jr nz, .link_or_tower - - ld a, [InBattleTowerBattle] - and a - jr nz, .link_or_tower - - ld a, [wd002] - ld c, a - ld b, 0 - ld hl, OTPartySpecies - add hl, bc - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - jr .got_enemy_nick - -.link_or_tower - ld a, [wd002] - ld hl, OTPartyMonNicknames - ld bc, NAME_LENGTH - call AddNTimes - ld de, StringBuffer1 - call CopyBytes -.got_enemy_nick - ld a, MON_HP - call GetBeatupMonLocation - ld a, [hli] - or [hl] - jp z, .beatup_fail - ld a, [wd002] - ld b, a - ld a, [CurOTMon] - cp b - ld hl, EnemyMonStatus - jr z, .active_enemy - - ld a, MON_STATUS - call GetBeatupMonLocation -.active_enemy - ld a, [hl] - and a - jr nz, .beatup_fail - - ld a, $1 - ld [wBeatUpHitAtLeastOnce], a - jr .finish_beatup - -.wild - ld a, [EnemyMonSpecies] - ld [wNamedObjectIndexBuffer], a - call GetPokemonName - ld hl, BeatUpAttackText - call StdBattleTextBox - jp EnemyAttackDamage - -.finish_beatup - ld hl, BeatUpAttackText - call StdBattleTextBox - ld a, [BattleMonSpecies] - ld [CurSpecies], a - call GetBaseData - ld a, [BaseDefense] - ld c, a - push bc - ld a, MON_SPECIES - call GetBeatupMonLocation - ld a, [hl] - ld [CurSpecies], a - call GetBaseData - ld a, [BaseAttack] - pop bc - ld b, a - push bc - ld a, MON_LEVEL - call GetBeatupMonLocation - ld a, [hl] - ld e, a - pop bc - ld a, [wEnemyMoveStructPower] - ld d, a - ret - -; 355b0 - - -.beatup_fail ; 355b0 - ld b, buildopponentrage_command - jp SkipToBattleCommand - -; 355b5 - - -BattleCommanda8: ; 355b5 - ld a, [wBeatUpHitAtLeastOnce] - and a - ret nz - - jp PrintButItFailed - -; 355bd - - -GetBeatupMonLocation: ; 355bd - push bc - ld c, a - ld b, 0 - ld a, [hBattleTurn] - and a - ld hl, PartyMon1Species - jr z, .got_species - ld hl, OTPartyMon1Species - -.got_species - ld a, [wd002] - add hl, bc - call GetPartyLocation - pop bc - ret +INCLUDE "engine/battle/move_effects/beat_up.asm" BattleCommand_ClearMissDamage: ; 355d5 @@ -3691,7 +3431,7 @@ BattleCommand_ConstantDamage: ; 35726 cp b jr nc, .psywave_loop ld b, a - ld a, $0 + ld a, 0 jr .got_power .super_fang @@ -3712,9 +3452,9 @@ BattleCommand_ConstantDamage: ; 35726 and a jr nz, .got_power or b - ld a, $0 + ld a, 0 jr nz, .got_power - ld b, $1 + ld b, 1 jr .got_power .got_power @@ -3806,1221 +3546,811 @@ BattleCommand_ConstantDamage: ; 35726 INCLUDE "data/moves/flail_reversal_power.asm" -BattleCommand_Counter: ; 35813 -; counter +INCLUDE "engine/battle/move_effects/counter.asm" - ld a, 1 - ld [AttackMissed], a - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - and a - ret z +INCLUDE "engine/battle/move_effects/encore.asm" - ld b, a - callfar GetMoveEffect - ld a, b - cp EFFECT_COUNTER - ret z +INCLUDE "engine/battle/move_effects/pain_split.asm" - call BattleCommand_ResetTypeMatchup - ld a, [wTypeMatchup] - and a - ret z +INCLUDE "engine/battle/move_effects/snore.asm" - call CheckOpponentWentFirst - ret z +INCLUDE "engine/battle/move_effects/conversion2.asm" - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - dec a - ld de, StringBuffer1 - call GetMoveData +INCLUDE "engine/battle/move_effects/lock_on.asm" - ld a, [StringBuffer1 + MOVE_POWER] - and a - ret z +INCLUDE "engine/battle/move_effects/sketch.asm" - ld a, [StringBuffer1 + MOVE_TYPE] - cp SPECIAL - ret nc - ld hl, CurDamage - ld a, [hli] - or [hl] - ret z +BattleCommand_DefrostOpponent: ; 35b16 +; defrostopponent +; Thaw the opponent if frozen, and +; raise the user's Attack one stage. + call AnimateCurrentMove + + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarAddr + call Defrost + + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVarAddr ld a, [hl] - add a - ld [hld], a - ld a, [hl] - adc a - ld [hl], a - jr nc, .capped - ld a, $ff - ld [hli], a + push hl + push af + + ld a, EFFECT_ATTACK_UP ld [hl], a -.capped + call BattleCommand_StatUp - xor a - ld [AttackMissed], a + pop af + pop hl + ld [hl], a ret -; 35864 +; 35b33 -BattleCommand_Encore: ; 35864 -; encore +INCLUDE "engine/battle/move_effects/sleep_talk.asm" - ld hl, EnemyMonMoves - ld de, EnemyEncoreCount - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, BattleMonMoves - ld de, PlayerEncoreCount -.ok - ld a, BATTLE_VARS_LAST_MOVE_OPP - call GetBattleVar - and a - jp z, .failed - cp STRUGGLE - jp z, .failed - cp ENCORE - jp z, .failed - cp MIRROR_MOVE - jp z, .failed - ld b, a +INCLUDE "engine/battle/move_effects/destiny_bond.asm" -.got_move - ld a, [hli] - cp b - jr nz, .got_move +INCLUDE "engine/battle/move_effects/spite.asm" - ld bc, BattleMonPP - BattleMonMoves - 1 - add hl, bc - ld a, [hl] - and PP_MASK - jp z, .failed - ld a, [AttackMissed] - and a - jp nz, .failed - ld a, BATTLE_VARS_SUBSTATUS5_OPP - call GetBattleVarAddr - bit SUBSTATUS_ENCORED, [hl] - jp nz, .failed - set SUBSTATUS_ENCORED, [hl] - call BattleRandom - and $3 - inc a - inc a - inc a - ld [de], a - call CheckOpponentWentFirst - jr nz, .finish_move - ld a, [hBattleTurn] - and a - jr z, .force_last_enemy_move +INCLUDE "engine/battle/move_effects/false_swipe.asm" - push hl - ld a, [LastPlayerMove] - ld b, a - ld c, 0 - ld hl, BattleMonMoves -.find_player_move - ld a, [hli] - cp b - jr z, .got_player_move - inc c - ld a, c - cp NUM_MOVES - jr c, .find_player_move - pop hl - res SUBSTATUS_ENCORED, [hl] - xor a - ld [de], a - jr .failed +INCLUDE "engine/battle/move_effects/heal_bell.asm" -.got_player_move - pop hl - ld a, c - ld [CurMoveNum], a - ld a, b - ld [CurPlayerMove], a - dec a - ld de, wPlayerMoveStruct - call GetMoveData - jr .finish_move -.force_last_enemy_move - push hl - ld a, [LastEnemyMove] - ld b, a - ld c, 0 - ld hl, EnemyMonMoves -.find_enemy_move - ld a, [hli] - cp b - jr z, .got_enemy_move - inc c - ld a, c - cp NUM_MOVES - jr c, .find_enemy_move - pop hl - res SUBSTATUS_ENCORED, [hl] - xor a - ld [de], a - jr .failed +FarPlayBattleAnimation: ; 35d00 +; play animation de -.got_enemy_move - pop hl - ld a, c - ld [CurEnemyMoveNum], a - ld a, b - ld [CurEnemyMove], a - dec a - ld de, wEnemyMoveStruct - call GetMoveData + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVar + and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND + ret nz -.finish_move - call AnimateCurrentMove - ld hl, GotAnEncoreText - jp StdBattleTextBox + ; fallthrough +; 35d08 -.failed - jp PrintDidntAffect2 +PlayFXAnimID: ; 35d08 + ld a, e + ld [FXAnimID], a + ld a, d + ld [FXAnimID + 1], a -; 35926 + ld c, 3 + call DelayFrames + callfar PlayBattleAnim -BattleCommand_PainSplit: ; 35926 -; painsplit + ret - ld a, [AttackMissed] - and a - jp nz, .ButItFailed - call CheckSubstituteOpp - jp nz, .ButItFailed - call AnimateCurrentMove - ld hl, BattleMonMaxHP + 1 - ld de, EnemyMonMaxHP + 1 - call .PlayerShareHP - ld a, $1 - ld [wWhichHPBar], a - hlcoord 10, 9 - predef AnimateHPBar - ld hl, EnemyMonHP - ld a, [hli] - ld [Buffer4], a +; 35d1c + + +EnemyHurtItself: ; 35d1c + ld hl, CurDamage ld a, [hli] + ld b, a + ld a, [hl] + or b + jr z, .did_no_damage + + ld a, c + and a + jr nz, .mimic_sub_check + + ld a, [EnemySubStatus4] + bit SUBSTATUS_SUBSTITUTE, a + jp nz, SelfInflictDamageToSubstitute + +.mimic_sub_check + ld a, [hld] + ld b, a + ld a, [EnemyMonHP + 1] ld [Buffer3], a + sub b + ld [EnemyMonHP + 1], a + ld a, [hl] + ld b, a + ld a, [EnemyMonHP] + ld [Buffer4], a + sbc b + ld [EnemyMonHP], a + jr nc, .mimic_faint + + ld a, [Buffer4] + ld [hli], a + ld a, [Buffer3] + ld [hl], a + + xor a + ld hl, EnemyMonHP + ld [hli], a + ld [hl], a + +.mimic_faint + ld hl, EnemyMonMaxHP ld a, [hli] ld [Buffer2], a ld a, [hl] ld [Buffer1], a - call .EnemyShareHP + ld hl, EnemyMonHP + ld a, [hli] + ld [Buffer6], a + ld a, [hl] + ld [Buffer5], a + hlcoord 2, 2 xor a ld [wWhichHPBar], a - call ResetDamage - hlcoord 2, 2 predef AnimateHPBar - farcall _UpdateBattleHUDs +.did_no_damage + jp RefreshBattleHuds - ld hl, SharedPainText - jp StdBattleTextBox +; 35d7e -.PlayerShareHP: - ld a, [hld] - ld [Buffer1], a - ld a, [hld] - ld [Buffer2], a - ld a, [hld] + +PlayerHurtItself: ; 35d7e + ld hl, CurDamage + ld a, [hli] ld b, a - ld [Buffer3], a ld a, [hl] - ld [Buffer4], a - dec de - dec de - ld a, [de] - dec de - add b - ld [CurDamage + 1], a - ld b, [hl] - ld a, [de] - adc b - srl a - ld [CurDamage], a - ld a, [CurDamage + 1] - rr a - ld [CurDamage + 1], a - inc hl - inc hl - inc hl - inc de - inc de - inc de + or b + jr z, .did_no_damage -.EnemyShareHP: ; 359ac - ld c, [hl] - dec hl - ld a, [CurDamage + 1] - sub c - ld b, [hl] - dec hl - ld a, [CurDamage] - sbc b - jr nc, .skip + ld a, c + and a + jr nz, .mimic_sub_check - ld a, [CurDamage] + ld a, [PlayerSubStatus4] + bit SUBSTATUS_SUBSTITUTE, a + jp nz, SelfInflictDamageToSubstitute +.mimic_sub_check + ld a, [hld] ld b, a - ld a, [CurDamage + 1] - ld c, a -.skip - ld a, c - ld [hld], a + ld a, [BattleMonHP + 1] + ld [Buffer3], a + sub b + ld [BattleMonHP + 1], a ld [Buffer5], a - ld a, b - ld [hli], a + ld b, [hl] + ld a, [BattleMonHP] + ld [Buffer4], a + sbc b + ld [BattleMonHP], a ld [Buffer6], a - ret - -; 359cd - -.ButItFailed: - jp PrintDidntAffect2 + jr nc, .mimic_faint -; 359d0 + ld a, [Buffer4] + ld [hli], a + ld a, [Buffer3] + ld [hl], a + xor a + ld hl, BattleMonHP + ld [hli], a + ld [hl], a + ld hl, Buffer5 + ld [hli], a + ld [hl], a -BattleCommand_Snore: ; 359d0 -; snore - ld a, BATTLE_VARS_STATUS - call GetBattleVar - and SLP - ret nz - call ResetDamage +.mimic_faint + ld hl, BattleMonMaxHP + ld a, [hli] + ld [Buffer2], a + ld a, [hl] + ld [Buffer1], a + hlcoord 10, 9 ld a, $1 - ld [AttackMissed], a - call FailSnore - jp EndMoveEffect + ld [wWhichHPBar], a + predef AnimateHPBar +.did_no_damage + jp RefreshBattleHuds + +; 35de0 -; 359e6 +SelfInflictDamageToSubstitute: ; 35de0 -BattleCommand_Conversion2: ; 359e6 -; conversion2 + ld hl, SubTookDamageText + call StdBattleTextBox - ld a, [AttackMissed] - and a - jr nz, .failed - ld hl, BattleMonType1 + ld de, EnemySubstituteHP ld a, [hBattleTurn] and a - jr z, .got_type - ld hl, EnemyMonType1 -.got_type - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar + jr z, .got_hp + ld de, PlayerSubstituteHP +.got_hp + + ld hl, CurDamage + ld a, [hli] and a - jr z, .failed - push hl - dec a - ld hl, Moves + MOVE_TYPE - call GetMoveAttr - ld d, a - pop hl - cp CURSE_T - jr z, .failed - call AnimateCurrentMove - call BattleCommand_SwitchTurn + jr nz, .broke -.loop - call BattleRandom - and $1f - cp UNUSED_TYPES - jr c, .okay - cp UNUSED_TYPES_END - jr c, .loop - cp TYPES_END - jr nc, .loop -.okay - ld [hli], a - ld [hld], a - push hl - ld a, BATTLE_VARS_MOVE_TYPE - call GetBattleVarAddr - push af - push hl - ld a, d - ld [hl], a - call BattleCheckTypeMatchup - pop hl - pop af - ld [hl], a - pop hl - ld a, [wTypeMatchup] - cp 10 - jr nc, .loop - call BattleCommand_SwitchTurn + ld a, [de] + sub [hl] + ld [de], a + jr z, .broke + jr nc, .done - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - predef GetTypeName - ld hl, TransformedTypeText - jp StdBattleTextBox +.broke + ld a, BATTLE_VARS_SUBSTATUS4_OPP + call GetBattleVarAddr + res SUBSTATUS_SUBSTITUTE, [hl] -.failed - jp FailConversion2 + ld hl, SubFadedText + call StdBattleTextBox -; 35a53 + call BattleCommand_SwitchTurn + call BattleCommand_LowerSubNoAnim + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVar + and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND + call z, AppearUserLowerSub + call BattleCommand_SwitchTurn + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVarAddr + cp EFFECT_MULTI_HIT + jr z, .ok + cp EFFECT_DOUBLE_HIT + jr z, .ok + cp EFFECT_POISON_MULTI_HIT + jr z, .ok + cp EFFECT_TRIPLE_KICK + jr z, .ok + cp EFFECT_BEAT_UP + jr z, .ok + xor a + ld [hl], a +.ok + call RefreshBattleHuds +.done + jp ResetDamage -BattleCommand_LockOn: ; 35a53 -; lockon +; 35e40 - call CheckSubstituteOpp - jr nz, .fail - ld a, [AttackMissed] - and a - jr nz, .fail +UpdateMoveData: ; 35e40 - ld a, BATTLE_VARS_SUBSTATUS5_OPP + ld a, BATTLE_VARS_MOVE_ANIM call GetBattleVarAddr - set SUBSTATUS_LOCK_ON, [hl] - call AnimateCurrentMove + ld d, h + ld e, l - ld hl, TookAimText - jp StdBattleTextBox + ld a, BATTLE_VARS_MOVE + call GetBattleVar + ld [CurMove], a + ld [wNamedObjectIndexBuffer], a -.fail - call AnimateFailedMove - jp PrintDidntAffect + dec a + call GetMoveData + call GetMoveName + jp CopyName1 -; 35a74 +; 35e5c -BattleCommand_Sketch: ; 35a74 -; sketch +BattleCommand_SleepTarget: ; 35e5c +; sleeptarget - call ClearLastMove -; Don't sketch during a link battle - ld a, [wLinkMode] - and a - jr z, .not_linked - call AnimateFailedMove - jp PrintNothingHappened + call GetOpponentItem + ld a, b + cp HELD_PREVENT_SLEEP + jr nz, .not_protected_by_item -.not_linked -; If the opponent has a substitute up, fail. - call CheckSubstituteOpp - jp nz, .fail -; If the opponent is transformed, fail. - ld a, BATTLE_VARS_SUBSTATUS5_OPP + ld a, [hl] + ld [wNamedObjectIndexBuffer], a + call GetItemName + ld hl, ProtectedByText + jr .fail + +.not_protected_by_item + ld a, BATTLE_VARS_STATUS_OPP call GetBattleVarAddr - bit SUBSTATUS_TRANSFORMED, [hl] - jp nz, .fail -; Get the user's moveset in its party struct. -; This move replacement shall be permanent. -; Pointer will be in de. - ld a, MON_MOVES - call UserPartyAttr ld d, h ld e, l -; Get the battle move structs. - ld hl, BattleMonMoves - ld a, [hBattleTurn] - and a - jr z, .get_last_move - ld hl, EnemyMonMoves -.get_last_move - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - ld [wTypeMatchup], a - ld b, a -; Fail if move is invalid or is Struggle. + ld a, [de] + and SLP + ld hl, AlreadyAsleepText + jr nz, .fail + + ld a, [AttackMissed] and a - jr z, .fail - cp STRUGGLE - jr z, .fail -; Fail if user already knows that move - ld c, NUM_MOVES -.does_user_already_know_move - ld a, [hli] - cp b - jr z, .fail - dec c - jr nz, .does_user_already_know_move -; Find Sketch in the user's moveset. -; Pointer in hl, and index in c. - dec hl - ld c, NUM_MOVES -.find_sketch - dec c - ld a, [hld] - cp SKETCH - jr nz, .find_sketch - inc hl -; The Sketched move is loaded to that slot. - ld a, b - ld [hl], a -; Copy the base PP from that move. - push bc - push hl - dec a - ld hl, Moves + MOVE_PP - call GetMoveAttr - pop hl - ld bc, BattleMonPP - BattleMonMoves - add hl, bc - ld [hl], a - pop bc + jp nz, PrintDidntAffect2 - ld a, [hBattleTurn] + ld hl, DidntAffect1Text + call .CheckAIRandomFail + jr c, .fail + + ld a, [de] and a - jr z, .user_trainer - ld a, [wBattleMode] - dec a - jr nz, .user_trainer -; wildmon - ld a, [hl] - push bc - ld hl, wWildMonPP - ld b, 0 - add hl, bc - ld [hl], a - ld hl, wWildMonMoves - add hl, bc - pop bc - ld [hl], b - jr .done_copy + jr nz, .fail + + call CheckSubstituteOpp + jr nz, .fail -.user_trainer - ld a, [hl] - push af - ld l, c - ld h, 0 - add hl, de - ld a, b - ld [hl], a - pop af - ld de, MON_PP - MON_MOVES - add hl, de - ld [hl], a -.done_copy - call GetMoveName call AnimateCurrentMove + ld b, $7 + ld a, [InBattleTowerBattle] + and a + jr z, .random_loop + ld b, $3 - ld hl, SketchedText - jp StdBattleTextBox +.random_loop + call BattleRandom + and b + jr z, .random_loop + cp 7 + jr z, .random_loop + inc a + ld [de], a + call UpdateOpponentInParty + call RefreshBattleHuds + + ld hl, FellAsleepText + call StdBattleTextBox + + farcall UseHeldStatusHealingItem + + jp z, OpponentCantMove + ret .fail + push hl call AnimateFailedMove - jp PrintDidntAffect + pop hl + jp StdBattleTextBox -; 35b16 +; 35ece -BattleCommand_DefrostOpponent: ; 35b16 -; defrostopponent -; Thaw the opponent if frozen, and -; raise the user's Attack one stage. +.CheckAIRandomFail: ; 35ece + ; Enemy turn + ld a, [hBattleTurn] + and a + jr z, .dont_fail - call AnimateCurrentMove + ; Not in link battle + ld a, [wLinkMode] + and a + jr nz, .dont_fail - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - call Defrost + ld a, [InBattleTowerBattle] + and a + jr nz, .dont_fail - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVarAddr - ld a, [hl] - push hl - push af + ; Not locked-on by the enemy + ld a, [PlayerSubStatus5] + bit SUBSTATUS_LOCK_ON, a + jr nz, .dont_fail - ld a, EFFECT_ATTACK_UP - ld [hl], a - call BattleCommand_StatUp + call BattleRandom + cp 25 percent + 1 ; 25% chance AI fails + ret c - pop af - pop hl - ld [hl], a +.dont_fail + xor a ret -; 35b33 +; 35eee -BattleCommand_SleepTalk: ; 35b33 -; sleeptalk +BattleCommand_PoisonTarget: ; 35eee +; poisontarget - call ClearLastMove - ld a, [AttackMissed] + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarAddr and a - jr nz, .fail - ld a, [hBattleTurn] + ret nz + ld a, [TypeModifier] + and $7f + ret z + call CheckIfTargetIsPoisonType + ret z + call GetOpponentItem + ld a, b + cp HELD_PREVENT_POISON + ret z + ld a, [EffectFailed] and a - ld hl, BattleMonMoves + 1 - ld a, [DisabledMove] - ld d, a - jr z, .got_moves - ld hl, EnemyMonMoves + 1 - ld a, [EnemyDisabledMove] - ld d, a -.got_moves - ld a, BATTLE_VARS_STATUS - call GetBattleVar - and SLP - jr z, .fail - ld a, [hl] - and a - jr z, .fail - call .safely_check_has_usable_move - jr c, .fail - dec hl -.sample_move - push hl - call BattleRandom - maskbits NUM_MOVES - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - pop hl - and a - jr z, .sample_move - ld e, a - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVar - cp e - jr z, .sample_move - ld a, e - cp d - jr z, .sample_move - call .check_two_turn_move - jr z, .sample_move - ld a, BATTLE_VARS_MOVE - call GetBattleVarAddr - ld a, e - ld [hl], a - call CheckUserIsCharging - jr nz, .charging - ld a, [wKickCounter] - push af - call BattleCommand_LowerSub - pop af - ld [wKickCounter], a -.charging - call LoadMoveAnim - call UpdateMoveData - jp ResetTurn + ret nz + call SafeCheckSafeguard + ret nz -.fail - call AnimateFailedMove - jp TryPrintButItFailed + call PoisonOpponent + ld de, ANIM_PSN + call PlayOpponentBattleAnim + call RefreshBattleHuds -.safely_check_has_usable_move - push hl - push de - push bc - call .check_has_usable_move - pop bc - pop de - pop hl + ld hl, WasPoisonedText + call StdBattleTextBox + + farcall UseHeldStatusHealingItem ret -.check_has_usable_move - ld a, [hBattleTurn] - and a - ld a, [DisabledMove] - jr z, .got_move_2 +; 35f2c - ld a, [EnemyDisabledMove] -.got_move_2 - ld b, a - ld a, BATTLE_VARS_MOVE + +BattleCommand_Poison: ; 35f2c +; poison + + ld hl, DoesntAffectText + ld a, [TypeModifier] + and $7f + jp z, .failed + + call CheckIfTargetIsPoisonType + jp z, .failed + + ld a, BATTLE_VARS_STATUS_OPP call GetBattleVar - ld c, a - dec hl - ld d, NUM_MOVES -.loop2 + ld b, a + ld hl, AlreadyPoisonedText + and 1 << PSN + jp nz, .failed + + call GetOpponentItem + ld a, b + cp HELD_PREVENT_POISON + jr nz, .do_poison ld a, [hl] + ld [wNamedObjectIndexBuffer], a + call GetItemName + ld hl, ProtectedByText + jr .failed + +.do_poison + ld hl, DidntAffect1Text + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVar and a - jr z, .carry + jr nz, .failed - cp c - jr z, .nope - cp b - jr z, .nope + ld a, [hBattleTurn] + and a + jr z, .mimic_random - call .check_two_turn_move - jr nz, .no_carry + ld a, [wLinkMode] + and a + jr nz, .mimic_random -.nope - inc hl - dec d - jr nz, .loop2 + ld a, [InBattleTowerBattle] + and a + jr nz, .mimic_random -.carry - scf - ret + ld a, [PlayerSubStatus5] + bit SUBSTATUS_LOCK_ON, a + jr nz, .mimic_random -.no_carry + call BattleRandom + cp 25 percent + 1 ; 25% chance AI fails + jr c, .failed + +.mimic_random + call CheckSubstituteOpp + jr nz, .failed + ld a, [AttackMissed] and a - ret + jr nz, .failed + call .check_toxic + jr z, .toxic -.check_two_turn_move - push hl - push de - push bc + call .apply_poison + ld hl, WasPoisonedText + call StdBattleTextBox + jr .finished - ld b, a - callfar GetMoveEffect - ld a, b +.toxic + set SUBSTATUS_TOXIC, [hl] + xor a + ld [de], a + call .apply_poison - pop bc - pop de - pop hl + ld hl, BadlyPoisonedText + call StdBattleTextBox - cp EFFECT_SKULL_BASH - ret z - cp EFFECT_RAZOR_WIND - ret z - cp EFFECT_SKY_ATTACK - ret z - cp EFFECT_SOLARBEAM - ret z - cp EFFECT_FLY - ret z - cp EFFECT_BIDE +.finished + farcall UseHeldStatusHealingItem ret -; 35bff +.failed + push hl + call AnimateFailedMove + pop hl + jp StdBattleTextBox +; 35fc0 -BattleCommand_DestinyBond: ; 35bff -; destinybond - ld a, BATTLE_VARS_SUBSTATUS5 - call GetBattleVarAddr - set SUBSTATUS_DESTINY_BOND, [hl] +.apply_poison ; 35fc0 call AnimateCurrentMove - ld hl, DestinyBondEffectText - jp StdBattleTextBox - -; 35c0f + call PoisonOpponent + jp RefreshBattleHuds +; 35fc9 -BattleCommand_Spite: ; 35c0f -; spite - ld a, [AttackMissed] - and a - jp nz, .failed - ld bc, PARTYMON_STRUCT_LENGTH ; ???? - ld hl, EnemyMonMoves - ld a, [hBattleTurn] - and a - jr z, .got_moves - ld hl, BattleMonMoves -.got_moves - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - and a - jr z, .failed - cp STRUGGLE - jr z, .failed - ld b, a - ld c, -1 -.loop - inc c - ld a, [hli] - cp b - jr nz, .loop - ld [wTypeMatchup], a - dec hl - ld b, 0 - push bc - ld c, BattleMonPP - BattleMonMoves - add hl, bc - pop bc - ld a, [hl] - and PP_MASK - jr z, .failed - push bc - call GetMoveName - ; lose 2-5 PP - call BattleRandom - and %11 - inc a - inc a - ld b, a - ld a, [hl] - and PP_MASK - cp b - jr nc, .deplete_pp - ld b, a -.deplete_pp - ld a, [hl] - sub b - ld [hl], a - push af - ld a, MON_PP - call OpponentPartyAttr - ld d, b - pop af - pop bc - add hl, bc - ld e, a +.check_toxic ; 35fc9 ld a, BATTLE_VARS_SUBSTATUS5_OPP - call GetBattleVar - bit SUBSTATUS_TRANSFORMED, a - jr nz, .transformed + call GetBattleVarAddr ld a, [hBattleTurn] and a - jr nz, .not_wildmon - ld a, [wBattleMode] - dec a - jr nz, .not_wildmon - ld hl, wWildMonPP - add hl, bc -.not_wildmon - ld [hl], e -.transformed - push de - call AnimateCurrentMove - pop de - ld a, d - ld [wTypeMatchup], a - ld hl, SpiteEffectText - jp StdBattleTextBox - -.failed - jp PrintDidntAffect2 - -; 35c94 + ld de, EnemyToxicCount + jr z, .ok + ld de, PlayerToxicCount +.ok + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVar + cp EFFECT_TOXIC + ret +; 35fe1 -BattleCommand_FalseSwipe: ; 35c94 -; falseswipe - ld hl, EnemyMonHP +CheckIfTargetIsPoisonType: ; 35fe1 + ld de, EnemyMonType1 ld a, [hBattleTurn] and a - jr z, .got_hp - ld hl, BattleMonHP -.got_hp - ld de, CurDamage - ld c, 2 - push hl - push de - call StringCmp - pop de - pop hl - jr c, .done - ld a, [hli] - ld [de], a + jr z, .ok + ld de, BattleMonType1 +.ok + ld a, [de] inc de - ld a, [hl] - dec a - ld [de], a - inc a - jr nz, .okay - dec de + cp POISON + ret z ld a, [de] - dec a - ld [de], a -.okay - ld a, [CriticalHit] - cp 2 - jr nz, .carry - xor a - ld [CriticalHit], a -.carry - scf - ret - -.done - and a + cp POISON ret -; 35cc9 - +; 35ff5 -BattleCommand_HealBell: ; 35cc9 -; healbell - ld a, BATTLE_VARS_SUBSTATUS1 - call GetBattleVarAddr - res SUBSTATUS_NIGHTMARE, [hl] - ld de, PartyMon1Status - ld a, [hBattleTurn] - and a - jr z, .got_status - ld de, OTPartyMon1Status -.got_status - ld a, BATTLE_VARS_STATUS +PoisonOpponent: ; 35ff5 + ld a, BATTLE_VARS_STATUS_OPP call GetBattleVarAddr - xor a - ld [hl], a - ld h, d - ld l, e - ld bc, PARTYMON_STRUCT_LENGTH - ld d, PARTY_LENGTH -.loop - ld [hl], a - add hl, bc - dec d - jr nz, .loop - call AnimateCurrentMove - - ld hl, BellChimedText - call StdBattleTextBox - - ld a, [hBattleTurn] - and a - jp z, CalcPlayerStats - jp CalcEnemyStats - -; 35d00 - - -FarPlayBattleAnimation: ; 35d00 -; play animation de + set PSN, [hl] + jp UpdateOpponentInParty - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVar - and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND - ret nz +; 35fff - ; fallthrough -; 35d08 -PlayFXAnimID: ; 35d08 - ld a, e - ld [FXAnimID], a - ld a, d - ld [FXAnimID + 1], a +BattleCommand_DrainTarget: ; 35fff +; draintarget + call SapHealth + ld hl, SuckedHealthText + jp StdBattleTextBox - ld c, 3 - call DelayFrames +; 36008 - callfar PlayBattleAnim - ret +BattleCommand_EatDream: ; 36008 +; eatdream + call SapHealth + ld hl, DreamEatenText + jp StdBattleTextBox -; 35d1c +; 36011 -EnemyHurtItself: ; 35d1c +SapHealth: ; 36011 ld hl, CurDamage ld a, [hli] + srl a + ld [hDividend], a ld b, a ld a, [hl] + rr a + ld [hDividend + 1], a or b - jr z, .did_no_damage - - ld a, c + jr nz, .ok1 + ld a, $1 + ld [hDividend + 1], a +.ok1 + ld hl, BattleMonHP + ld de, BattleMonMaxHP + ld a, [hBattleTurn] and a - jr nz, .mimic_sub_check - - ld a, [EnemySubStatus4] - bit SUBSTATUS_SUBSTITUTE, a - jp nz, SelfInflictDamageToSubstitute - -.mimic_sub_check + jr z, .battlemonhp + ld hl, EnemyMonHP + ld de, EnemyMonMaxHP +.battlemonhp + ld bc, Buffer4 + ld a, [hli] + ld [bc], a + ld a, [hl] + dec bc + ld [bc], a + ld a, [de] + dec bc + ld [bc], a + inc de + ld a, [de] + dec bc + ld [bc], a + ld a, [hDividend + 1] + ld b, [hl] + add b + ld [hld], a + ld [Buffer5], a + ld a, [hDividend] + ld b, [hl] + adc b + ld [hli], a + ld [Buffer6], a + jr c, .okay2 ld a, [hld] ld b, a - ld a, [EnemyMonHP + 1] - ld [Buffer3], a + ld a, [de] + dec de sub b - ld [EnemyMonHP + 1], a - ld a, [hl] + ld a, [hli] ld b, a - ld a, [EnemyMonHP] - ld [Buffer4], a + ld a, [de] + inc de sbc b - ld [EnemyMonHP], a - jr nc, .mimic_faint - - ld a, [Buffer4] - ld [hli], a - ld a, [Buffer3] - ld [hl], a - - xor a - ld hl, EnemyMonHP + jr nc, .okay3 +.okay2 + ld a, [de] + ld [hld], a + ld [Buffer5], a + dec de + ld a, [de] ld [hli], a - ld [hl], a - -.mimic_faint - ld hl, EnemyMonMaxHP - ld a, [hli] - ld [Buffer2], a - ld a, [hl] - ld [Buffer1], a - ld hl, EnemyMonHP - ld a, [hli] ld [Buffer6], a - ld a, [hl] - ld [Buffer5], a + inc de +.okay3 + ld a, [hBattleTurn] + and a + hlcoord 10, 9 + ld a, $1 + jr z, .hp_bar hlcoord 2, 2 xor a +.hp_bar ld [wWhichHPBar], a predef AnimateHPBar -.did_no_damage - jp RefreshBattleHuds + call RefreshBattleHuds + jp UpdateBattleMonInParty -; 35d7e +; 3608c -PlayerHurtItself: ; 35d7e - ld hl, CurDamage - ld a, [hli] - ld b, a - ld a, [hl] - or b - jr z, .did_no_damage +BattleCommand_BurnTarget: ; 3608c +; burntarget - ld a, c + xor a + ld [wNumHits], a + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarAddr and a - jr nz, .mimic_sub_check + jp nz, Defrost + ld a, [TypeModifier] + and $7f + ret z + call CheckMoveTypeMatchesTarget ; Don't burn a Fire-type + ret z + call GetOpponentItem + ld a, b + cp HELD_PREVENT_BURN + ret z + ld a, [EffectFailed] + and a + ret nz + call SafeCheckSafeguard + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarAddr + set BRN, [hl] + call UpdateOpponentInParty + ld hl, ApplyBrnEffectOnAttack + call CallBattleCore + ld de, ANIM_BRN + call PlayOpponentBattleAnim + call RefreshBattleHuds - ld a, [PlayerSubStatus4] - bit SUBSTATUS_SUBSTITUTE, a - jp nz, SelfInflictDamageToSubstitute -.mimic_sub_check - ld a, [hld] - ld b, a - ld a, [BattleMonHP + 1] - ld [Buffer3], a - sub b - ld [BattleMonHP + 1], a - ld [Buffer5], a - ld b, [hl] - ld a, [BattleMonHP] - ld [Buffer4], a - sbc b - ld [BattleMonHP], a - ld [Buffer6], a - jr nc, .mimic_faint + ld hl, WasBurnedText + call StdBattleTextBox - ld a, [Buffer4] - ld [hli], a - ld a, [Buffer3] - ld [hl], a - xor a - - ld hl, BattleMonHP - ld [hli], a - ld [hl], a - ld hl, Buffer5 - ld [hli], a - ld [hl], a - -.mimic_faint - ld hl, BattleMonMaxHP - ld a, [hli] - ld [Buffer2], a - ld a, [hl] - ld [Buffer1], a - hlcoord 10, 9 - ld a, $1 - ld [wWhichHPBar], a - predef AnimateHPBar -.did_no_damage - jp RefreshBattleHuds + farcall UseHeldStatusHealingItem + ret -; 35de0 +; 360dd -SelfInflictDamageToSubstitute: ; 35de0 +Defrost: ; 360dd + ld a, [hl] + and 1 << FRZ + ret z - ld hl, SubTookDamageText - call StdBattleTextBox + xor a + ld [hl], a - ld de, EnemySubstituteHP ld a, [hBattleTurn] and a - jr z, .got_hp - ld de, PlayerSubstituteHP -.got_hp - - ld hl, CurDamage - ld a, [hli] - and a - jr nz, .broke - - ld a, [de] - sub [hl] - ld [de], a - jr z, .broke - jr nc, .done - -.broke - ld a, BATTLE_VARS_SUBSTATUS4_OPP - call GetBattleVarAddr - res SUBSTATUS_SUBSTITUTE, [hl] - - ld hl, SubFadedText - call StdBattleTextBox - - call BattleCommand_SwitchTurn - call BattleCommand_LowerSubNoAnim - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVar - and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND - call z, AppearUserLowerSub - call BattleCommand_SwitchTurn - - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVarAddr - cp EFFECT_MULTI_HIT - jr z, .ok - cp EFFECT_DOUBLE_HIT - jr z, .ok - cp EFFECT_POISON_MULTI_HIT - jr z, .ok - cp EFFECT_TRIPLE_KICK - jr z, .ok - cp EFFECT_BEAT_UP + ld a, [CurOTMon] + ld hl, OTPartyMon1Status jr z, .ok - xor a - ld [hl], a + ld hl, PartyMon1Status + ld a, [CurBattleMon] .ok - call RefreshBattleHuds -.done - jp ResetDamage - -; 35e40 - - -UpdateMoveData: ; 35e40 - - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVarAddr - ld d, h - ld e, l - - ld a, BATTLE_VARS_MOVE - call GetBattleVar - ld [CurMove], a - ld [wNamedObjectIndexBuffer], a - dec a - call GetMoveData - call GetMoveName - jp CopyName1 - -; 35e5c + call GetPartyLocation + xor a + ld [hl], a + call UpdateOpponentInParty + ld hl, DefrostedOpponentText + jp StdBattleTextBox -BattleCommand_SleepTarget: ; 35e5c -; sleeptarget +; 36102 - call GetOpponentItem - ld a, b - cp HELD_PREVENT_SLEEP - jr nz, .not_protected_by_item - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - call GetItemName - ld hl, ProtectedByText - jr .fail +BattleCommand_FreezeTarget: ; 36102 +; freezetarget -.not_protected_by_item + xor a + ld [wNumHits], a + call CheckSubstituteOpp + ret nz ld a, BATTLE_VARS_STATUS_OPP call GetBattleVarAddr - ld d, h - ld e, l - ld a, [de] - and SLP - ld hl, AlreadyAsleepText - jr nz, .fail - - ld a, [AttackMissed] - and a - jp nz, PrintDidntAffect2 - - ld hl, DidntAffect1Text - call .CheckAIRandomFail - jr c, .fail - - ld a, [de] and a - jr nz, .fail - - call CheckSubstituteOpp - jr nz, .fail - - call AnimateCurrentMove - ld b, $7 - ld a, [InBattleTowerBattle] + ret nz + ld a, [TypeModifier] + and $7f + ret z + ld a, [Weather] + cp WEATHER_SUN + ret z + call CheckMoveTypeMatchesTarget ; Don't freeze an Ice-type + ret z + call GetOpponentItem + ld a, b + cp HELD_PREVENT_FREEZE + ret z + ld a, [EffectFailed] and a - jr z, .random_loop - ld b, $3 - -.random_loop - call BattleRandom - and b - jr z, .random_loop - cp 7 - jr z, .random_loop - inc a - ld [de], a + ret nz + call SafeCheckSafeguard + ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarAddr + set FRZ, [hl] call UpdateOpponentInParty + ld de, ANIM_FRZ + call PlayOpponentBattleAnim call RefreshBattleHuds - ld hl, FellAsleepText + ld hl, WasFrozenText call StdBattleTextBox farcall UseHeldStatusHealingItem + ret nz - jp z, OpponentCantMove - ret - -.fail - push hl - call AnimateFailedMove - pop hl - jp StdBattleTextBox - -; 35ece - - -.CheckAIRandomFail: ; 35ece - ; Enemy turn + call OpponentCantMove + call EndRechargeOpp + ld hl, wEnemyJustGotFrozen ld a, [hBattleTurn] and a - jr z, .dont_fail - - ; Not in link battle - ld a, [wLinkMode] - and a - jr nz, .dont_fail - - ld a, [InBattleTowerBattle] - and a - jr nz, .dont_fail - - ; Not locked-on by the enemy - ld a, [PlayerSubStatus5] - bit SUBSTATUS_LOCK_ON, a - jr nz, .dont_fail - - call BattleRandom - cp 25 percent + 1 ; 25% chance AI fails - ret c - -.dont_fail - xor a + jr z, .finish + ld hl, wPlayerJustGotFrozen +.finish + ld [hl], $1 ret -; 35eee +; 36165 -BattleCommand_PoisonTarget: ; 35eee -; poisontarget +BattleCommand_ParalyzeTarget: ; 36165 +; paralyzetarget + xor a + ld [wNumHits], a call CheckSubstituteOpp ret nz ld a, BATTLE_VARS_STATUS_OPP @@ -5030,768 +4360,356 @@ BattleCommand_PoisonTarget: ; 35eee ld a, [TypeModifier] and $7f ret z - call CheckIfTargetIsPoisonType - ret z call GetOpponentItem ld a, b - cp HELD_PREVENT_POISON + cp HELD_PREVENT_PARALYZE ret z ld a, [EffectFailed] and a ret nz call SafeCheckSafeguard ret nz + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVarAddr + set PAR, [hl] + call UpdateOpponentInParty + ld hl, ApplyPrzEffectOnSpeed + call CallBattleCore + ld de, ANIM_PAR + call PlayOpponentBattleAnim + call RefreshBattleHuds + call PrintParalyze + ld hl, UseHeldStatusHealingItem + jp CallBattleCore - call PoisonOpponent - ld de, ANIM_PSN - call PlayOpponentBattleAnim - call RefreshBattleHuds - - ld hl, WasPoisonedText - call StdBattleTextBox - - farcall UseHeldStatusHealingItem - ret +; 361ac -; 35f2c +BattleCommand_AttackUp: ; 361ac +; attackup + ld b, ATTACK + jr BattleCommand_StatUp -BattleCommand_Poison: ; 35f2c -; poison +BattleCommand_DefenseUp: ; 361b0 +; defenseup + ld b, DEFENSE + jr BattleCommand_StatUp - ld hl, DoesntAffectText - ld a, [TypeModifier] - and $7f - jp z, .failed +BattleCommand_SpeedUp: ; 361b4 +; speedup + ld b, SPEED + jr BattleCommand_StatUp - call CheckIfTargetIsPoisonType - jp z, .failed +BattleCommand_SpecialAttackUp: ; 361b8 +; specialattackup + ld b, SP_ATTACK + jr BattleCommand_StatUp - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVar - ld b, a - ld hl, AlreadyPoisonedText - and 1 << PSN - jp nz, .failed +BattleCommand_SpecialDefenseUp: ; 361bc +; specialdefenseup + ld b, SP_DEFENSE + jr BattleCommand_StatUp - call GetOpponentItem - ld a, b - cp HELD_PREVENT_POISON - jr nz, .do_poison - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - call GetItemName - ld hl, ProtectedByText - jr .failed +BattleCommand_AccuracyUp: ; 361c0 +; accuracyup + ld b, ACCURACY + jr BattleCommand_StatUp -.do_poison - ld hl, DidntAffect1Text - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVar - and a - jr nz, .failed +BattleCommand_EvasionUp: ; 361c4 +; evasionup + ld b, EVASION + jr BattleCommand_StatUp - ld a, [hBattleTurn] - and a - jr z, .mimic_random +BattleCommand_AttackUp2: ; 361c8 +; attackup2 + ld b, $10 | ATTACK + jr BattleCommand_StatUp - ld a, [wLinkMode] - and a - jr nz, .mimic_random +BattleCommand_DefenseUp2: ; 361cc +; defenseup2 + ld b, $10 | DEFENSE + jr BattleCommand_StatUp - ld a, [InBattleTowerBattle] +BattleCommand_SpeedUp2: ; 361d0 +; speedup2 + ld b, $10 | SPEED + jr BattleCommand_StatUp + +BattleCommand_SpecialAttackUp2: ; 361d4 +; specialattackup2 + ld b, $10 | SP_ATTACK + jr BattleCommand_StatUp + +BattleCommand_SpecialDefenseUp2: ; 361d8 +; specialdefenseup2 + ld b, $10 | SP_DEFENSE + jr BattleCommand_StatUp + +BattleCommand_AccuracyUp2: ; 361dc +; accuracyup2 + ld b, $10 | ACCURACY + jr BattleCommand_StatUp + +BattleCommand_EvasionUp2: ; 361e0 +; evasionup2 + ld b, $10 | EVASION + jr BattleCommand_StatUp + +BattleCommand_StatUp: ; 361e4 +; statup + call CheckIfStatCanBeRaised + ld a, [FailedMessage] and a - jr nz, .mimic_random + ret nz + jp StatUpAnimation - ld a, [PlayerSubStatus5] - bit SUBSTATUS_LOCK_ON, a - jr nz, .mimic_random +; 361ef - call BattleRandom - cp 25 percent + 1 ; 25% chance AI fails - jr c, .failed -.mimic_random - call CheckSubstituteOpp - jr nz, .failed +CheckIfStatCanBeRaised: ; 361ef + ld a, b + ld [LoweredStat], a + ld hl, PlayerStatLevels + ld a, [hBattleTurn] + and a + jr z, .got_stat_levels + ld hl, EnemyStatLevels +.got_stat_levels ld a, [AttackMissed] and a - jr nz, .failed - call .check_toxic - jr z, .toxic - - call .apply_poison - ld hl, WasPoisonedText - call StdBattleTextBox - jr .finished + jp nz, .stat_raise_failed + ld a, [EffectFailed] + and a + jp nz, .stat_raise_failed + ld a, [LoweredStat] + and $f + ld c, a + ld b, 0 + add hl, bc + ld b, [hl] + inc b + ld a, $d + cp b + jp c, .cant_raise_stat + ld a, [LoweredStat] + and $f0 + jr z, .got_num_stages + inc b + ld a, $d + cp b + jr nc, .got_num_stages + ld b, a +.got_num_stages + ld [hl], b + push hl + ld a, c + cp $5 + jr nc, .done_calcing_stats + ld hl, BattleMonStats + 1 + ld de, PlayerStats + ld a, [hBattleTurn] + and a + jr z, .got_stats_pointer + ld hl, EnemyMonStats + 1 + ld de, EnemyStats +.got_stats_pointer + push bc + sla c + ld b, 0 + add hl, bc + ld a, c + add e + ld e, a + jr nc, .no_carry + inc d +.no_carry + pop bc + ld a, [hld] + sub LOW(MAX_STAT_VALUE) + jr nz, .not_already_max + ld a, [hl] + sbc HIGH(MAX_STAT_VALUE) + jp z, .stats_already_max +.not_already_max + ld a, [hBattleTurn] + and a + jr z, .calc_player_stats + call CalcEnemyStats + jr .done_calcing_stats -.toxic - set SUBSTATUS_TOXIC, [hl] +.calc_player_stats + call CalcPlayerStats +.done_calcing_stats + pop hl xor a - ld [de], a - call .apply_poison + ld [FailedMessage], a + ret - ld hl, BadlyPoisonedText - call StdBattleTextBox +; 3626e -.finished - farcall UseHeldStatusHealingItem - ret -.failed - push hl - call AnimateFailedMove +.stats_already_max ; 3626e pop hl - jp StdBattleTextBox + dec [hl] + ; fallthrough +; 36270 -; 35fc0 +.cant_raise_stat ; 36270 + ld a, $2 + ld [FailedMessage], a + ld a, $1 + ld [AttackMissed], a + ret -.apply_poison ; 35fc0 - call AnimateCurrentMove - call PoisonOpponent - jp RefreshBattleHuds +; 3627b -; 35fc9 +.stat_raise_failed ; 3627b + ld a, $1 + ld [FailedMessage], a + ret -.check_toxic ; 35fc9 - ld a, BATTLE_VARS_SUBSTATUS5_OPP - call GetBattleVarAddr - ld a, [hBattleTurn] - and a - ld de, EnemyToxicCount - jr z, .ok - ld de, PlayerToxicCount -.ok - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVar - cp EFFECT_TOXIC - ret - -; 35fe1 +; 36281 -CheckIfTargetIsPoisonType: ; 35fe1 - ld de, EnemyMonType1 +StatUpAnimation: ; 36281 + ld bc, wPlayerMinimized + ld hl, DropPlayerSub ld a, [hBattleTurn] and a - jr z, .ok - ld de, BattleMonType1 -.ok - ld a, [de] - inc de - cp POISON - ret z - ld a, [de] - cp POISON - ret - -; 35ff5 + jr z, .do_player + ld bc, wEnemyMinimized + ld hl, DropEnemySub +.do_player + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVar + cp MINIMIZE + ret nz + ld a, $1 + ld [bc], a + call _CheckBattleScene + ret nc -PoisonOpponent: ; 35ff5 - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - set PSN, [hl] - jp UpdateOpponentInParty + xor a + ld [hBGMapMode], a + call CallBattleCore + call WaitBGMap + jp BattleCommand_MoveDelay -; 35fff +; 362ad -BattleCommand_DrainTarget: ; 35fff -; draintarget - call SapHealth - ld hl, SuckedHealthText - jp StdBattleTextBox +BattleCommand_AttackDown: ; 362ad +; attackdown + ld a, ATTACK + jr BattleCommand_StatDown -; 36008 +BattleCommand_DefenseDown: ; 362b1 +; defensedown + ld a, DEFENSE + jr BattleCommand_StatDown +BattleCommand_SpeedDown: ; 362b5 +; speeddown + ld a, SPEED + jr BattleCommand_StatDown -BattleCommand_EatDream: ; 36008 -; eatdream - call SapHealth - ld hl, DreamEatenText - jp StdBattleTextBox +BattleCommand_SpecialAttackDown: ; 362b9 +; specialattackdown + ld a, SP_ATTACK + jr BattleCommand_StatDown -; 36011 +BattleCommand_SpecialDefenseDown: ; 362bd +; specialdefensedown + ld a, SP_DEFENSE + jr BattleCommand_StatDown +BattleCommand_AccuracyDown: ; 362c1 +; accuracydown + ld a, ACCURACY + jr BattleCommand_StatDown -SapHealth: ; 36011 - ld hl, CurDamage - ld a, [hli] - srl a - ld [hDividend], a - ld b, a - ld a, [hl] - rr a - ld [hDividend + 1], a - or b - jr nz, .ok1 - ld a, $1 - ld [hDividend + 1], a -.ok1 - ld hl, BattleMonHP - ld de, BattleMonMaxHP - ld a, [hBattleTurn] - and a - jr z, .battlemonhp - ld hl, EnemyMonHP - ld de, EnemyMonMaxHP -.battlemonhp - ld bc, Buffer4 - ld a, [hli] - ld [bc], a - ld a, [hl] - dec bc - ld [bc], a - ld a, [de] - dec bc - ld [bc], a - inc de - ld a, [de] - dec bc - ld [bc], a - ld a, [hDividend + 1] - ld b, [hl] - add b - ld [hld], a - ld [Buffer5], a - ld a, [hDividend] - ld b, [hl] - adc b - ld [hli], a - ld [Buffer6], a - jr c, .okay2 - ld a, [hld] - ld b, a - ld a, [de] - dec de - sub b - ld a, [hli] - ld b, a - ld a, [de] - inc de - sbc b - jr nc, .okay3 -.okay2 - ld a, [de] - ld [hld], a - ld [Buffer5], a - dec de - ld a, [de] - ld [hli], a - ld [Buffer6], a - inc de -.okay3 - ld a, [hBattleTurn] - and a - hlcoord 10, 9 - ld a, $1 - jr z, .hp_bar - hlcoord 2, 2 - xor a -.hp_bar - ld [wWhichHPBar], a - predef AnimateHPBar - call RefreshBattleHuds - jp UpdateBattleMonInParty +BattleCommand_EvasionDown: ; 362c5 +; evasiondown + ld a, EVASION + jr BattleCommand_StatDown -; 3608c +BattleCommand_AttackDown2: ; 362c9 +; attackdown2 + ld a, $10 | ATTACK + jr BattleCommand_StatDown +BattleCommand_DefenseDown2: ; 362cd +; defensedown2 + ld a, $10 | DEFENSE + jr BattleCommand_StatDown -BattleCommand_BurnTarget: ; 3608c -; burntarget +BattleCommand_SpeedDown2: ; 362d1 +; speeddown2 + ld a, $10 | SPEED + jr BattleCommand_StatDown - xor a - ld [wNumHits], a - call CheckSubstituteOpp - ret nz - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - and a - jp nz, Defrost - ld a, [TypeModifier] - and $7f - ret z - call CheckMoveTypeMatchesTarget ; Don't burn a Fire-type - ret z - call GetOpponentItem - ld a, b - cp HELD_PREVENT_BURN - ret z - ld a, [EffectFailed] - and a - ret nz - call SafeCheckSafeguard - ret nz - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - set BRN, [hl] - call UpdateOpponentInParty - ld hl, ApplyBrnEffectOnAttack - call CallBattleCore - ld de, ANIM_BRN - call PlayOpponentBattleAnim - call RefreshBattleHuds +BattleCommand_SpecialAttackDown2: ; 362d5 +; specialattackdown2 + ld a, $10 | SP_ATTACK + jr BattleCommand_StatDown - ld hl, WasBurnedText - call StdBattleTextBox +BattleCommand_SpecialDefenseDown2: ; 362d9 +; specialdefensedown2 + ld a, $10 | SP_DEFENSE + jr BattleCommand_StatDown - farcall UseHeldStatusHealingItem - ret +BattleCommand_AccuracyDown2: ; 362dd +; accuracydown2 + ld a, $10 | ACCURACY + jr BattleCommand_StatDown -; 360dd +BattleCommand_EvasionDown2: ; 362e1 +; evasiondown2 + ld a, $10 | EVASION +BattleCommand_StatDown: ; 362e3 +; statdown -Defrost: ; 360dd - ld a, [hl] - and 1 << FRZ - ret z + ld [LoweredStat], a - xor a - ld [hl], a + call CheckMist + jp nz, .Mist + ld hl, EnemyStatLevels ld a, [hBattleTurn] and a - ld a, [CurOTMon] - ld hl, OTPartyMon1Status - jr z, .ok - ld hl, PartyMon1Status - ld a, [CurBattleMon] -.ok + jr z, .GetStatLevel + ld hl, PlayerStatLevels - call GetPartyLocation - xor a - ld [hl], a - call UpdateOpponentInParty - - ld hl, DefrostedOpponentText - jp StdBattleTextBox - -; 36102 - - -BattleCommand_FreezeTarget: ; 36102 -; freezetarget - - xor a - ld [wNumHits], a - call CheckSubstituteOpp - ret nz - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - and a - ret nz - ld a, [TypeModifier] - and $7f - ret z - ld a, [Weather] - cp WEATHER_SUN - ret z - call CheckMoveTypeMatchesTarget ; Don't freeze an Ice-type - ret z - call GetOpponentItem - ld a, b - cp HELD_PREVENT_FREEZE - ret z - ld a, [EffectFailed] - and a - ret nz - call SafeCheckSafeguard - ret nz - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - set FRZ, [hl] - call UpdateOpponentInParty - ld de, ANIM_FRZ - call PlayOpponentBattleAnim - call RefreshBattleHuds - - ld hl, WasFrozenText - call StdBattleTextBox - - farcall UseHeldStatusHealingItem - ret nz - - call OpponentCantMove - call EndRechargeOpp - ld hl, wEnemyJustGotFrozen - ld a, [hBattleTurn] - and a - jr z, .finish - ld hl, wPlayerJustGotFrozen -.finish - ld [hl], $1 - ret - -; 36165 - - -BattleCommand_ParalyzeTarget: ; 36165 -; paralyzetarget - - xor a - ld [wNumHits], a - call CheckSubstituteOpp - ret nz - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - and a - ret nz - ld a, [TypeModifier] - and $7f - ret z - call GetOpponentItem - ld a, b - cp HELD_PREVENT_PARALYZE - ret z - ld a, [EffectFailed] - and a - ret nz - call SafeCheckSafeguard - ret nz - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - set PAR, [hl] - call UpdateOpponentInParty - ld hl, ApplyPrzEffectOnSpeed - call CallBattleCore - ld de, ANIM_PAR - call PlayOpponentBattleAnim - call RefreshBattleHuds - call PrintParalyze - ld hl, UseHeldStatusHealingItem - jp CallBattleCore - -; 361ac - - -BattleCommand_AttackUp: ; 361ac -; attackup - ld b, ATTACK - jr BattleCommand_StatUp - -BattleCommand_DefenseUp: ; 361b0 -; defenseup - ld b, DEFENSE - jr BattleCommand_StatUp - -BattleCommand_SpeedUp: ; 361b4 -; speedup - ld b, SPEED - jr BattleCommand_StatUp - -BattleCommand_SpecialAttackUp: ; 361b8 -; specialattackup - ld b, SP_ATTACK - jr BattleCommand_StatUp - -BattleCommand_SpecialDefenseUp: ; 361bc -; specialdefenseup - ld b, SP_DEFENSE - jr BattleCommand_StatUp - -BattleCommand_AccuracyUp: ; 361c0 -; accuracyup - ld b, ACCURACY - jr BattleCommand_StatUp - -BattleCommand_EvasionUp: ; 361c4 -; evasionup - ld b, EVASION - jr BattleCommand_StatUp - -BattleCommand_AttackUp2: ; 361c8 -; attackup2 - ld b, $10 | ATTACK - jr BattleCommand_StatUp - -BattleCommand_DefenseUp2: ; 361cc -; defenseup2 - ld b, $10 | DEFENSE - jr BattleCommand_StatUp - -BattleCommand_SpeedUp2: ; 361d0 -; speedup2 - ld b, $10 | SPEED - jr BattleCommand_StatUp - -BattleCommand_SpecialAttackUp2: ; 361d4 -; specialattackup2 - ld b, $10 | SP_ATTACK - jr BattleCommand_StatUp - -BattleCommand_SpecialDefenseUp2: ; 361d8 -; specialdefenseup2 - ld b, $10 | SP_DEFENSE - jr BattleCommand_StatUp - -BattleCommand_AccuracyUp2: ; 361dc -; accuracyup2 - ld b, $10 | ACCURACY - jr BattleCommand_StatUp - -BattleCommand_EvasionUp2: ; 361e0 -; evasionup2 - ld b, $10 | EVASION - jr BattleCommand_StatUp - -BattleCommand_StatUp: ; 361e4 -; statup - call CheckIfStatCanBeRaised - ld a, [FailedMessage] - and a - ret nz - jp StatUpAnimation - -; 361ef - - -CheckIfStatCanBeRaised: ; 361ef - ld a, b - ld [LoweredStat], a - ld hl, PlayerStatLevels - ld a, [hBattleTurn] - and a - jr z, .got_stat_levels - ld hl, EnemyStatLevels -.got_stat_levels - ld a, [AttackMissed] - and a - jp nz, .stat_raise_failed - ld a, [EffectFailed] - and a - jp nz, .stat_raise_failed +.GetStatLevel: +; Attempt to lower the stat. ld a, [LoweredStat] and $f ld c, a ld b, 0 add hl, bc ld b, [hl] - inc b - ld a, $d - cp b - jp c, .cant_raise_stat + dec b + jp z, .CantLower + +; Sharply lower the stat if applicable. ld a, [LoweredStat] and $f0 - jr z, .got_num_stages + jr z, .ComputerMiss + dec b + jr nz, .ComputerMiss inc b - ld a, $d - cp b - jr nc, .got_num_stages - ld b, a -.got_num_stages - ld [hl], b - push hl - ld a, c - cp $5 - jr nc, .done_calcing_stats - ld hl, BattleMonStats + 1 - ld de, PlayerStats + +.ComputerMiss: +; Computer opponents have a 25% chance of failing. ld a, [hBattleTurn] and a - jr z, .got_stats_pointer - ld hl, EnemyMonStats + 1 - ld de, EnemyStats -.got_stats_pointer - push bc - sla c - ld b, 0 - add hl, bc - ld a, c - add e - ld e, a - jr nc, .no_carry - inc d -.no_carry - pop bc - ld a, [hld] - sub LOW(MAX_STAT_VALUE) - jr nz, .not_already_max - ld a, [hl] - sbc HIGH(MAX_STAT_VALUE) - jp z, .stats_already_max -.not_already_max - ld a, [hBattleTurn] - and a - jr z, .calc_player_stats - call CalcEnemyStats - jr .done_calcing_stats - -.calc_player_stats - call CalcPlayerStats -.done_calcing_stats - pop hl - xor a - ld [FailedMessage], a - ret - -; 3626e - - -.stats_already_max ; 3626e - pop hl - dec [hl] - ; fallthrough -; 36270 - - -.cant_raise_stat ; 36270 - ld a, $2 - ld [FailedMessage], a - ld a, $1 - ld [AttackMissed], a - ret - -; 3627b - - -.stat_raise_failed ; 3627b - ld a, $1 - ld [FailedMessage], a - ret - -; 36281 - - -StatUpAnimation: ; 36281 - ld bc, wPlayerMinimized - ld hl, DropPlayerSub - ld a, [hBattleTurn] - and a - jr z, .do_player - ld bc, wEnemyMinimized - ld hl, DropEnemySub -.do_player - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVar - cp MINIMIZE - ret nz - - ld a, $1 - ld [bc], a - call _CheckBattleScene - ret nc - - xor a - ld [hBGMapMode], a - call CallBattleCore - call WaitBGMap - jp BattleCommand_MoveDelay - -; 362ad - - -BattleCommand_AttackDown: ; 362ad -; attackdown - ld a, ATTACK - jr BattleCommand_StatDown - -BattleCommand_DefenseDown: ; 362b1 -; defensedown - ld a, DEFENSE - jr BattleCommand_StatDown - -BattleCommand_SpeedDown: ; 362b5 -; speeddown - ld a, SPEED - jr BattleCommand_StatDown - -BattleCommand_SpecialAttackDown: ; 362b9 -; specialattackdown - ld a, SP_ATTACK - jr BattleCommand_StatDown - -BattleCommand_SpecialDefenseDown: ; 362bd -; specialdefensedown - ld a, SP_DEFENSE - jr BattleCommand_StatDown - -BattleCommand_AccuracyDown: ; 362c1 -; accuracydown - ld a, ACCURACY - jr BattleCommand_StatDown - -BattleCommand_EvasionDown: ; 362c5 -; evasiondown - ld a, EVASION - jr BattleCommand_StatDown - -BattleCommand_AttackDown2: ; 362c9 -; attackdown2 - ld a, $10 | ATTACK - jr BattleCommand_StatDown - -BattleCommand_DefenseDown2: ; 362cd -; defensedown2 - ld a, $10 | DEFENSE - jr BattleCommand_StatDown - -BattleCommand_SpeedDown2: ; 362d1 -; speeddown2 - ld a, $10 | SPEED - jr BattleCommand_StatDown - -BattleCommand_SpecialAttackDown2: ; 362d5 -; specialattackdown2 - ld a, $10 | SP_ATTACK - jr BattleCommand_StatDown - -BattleCommand_SpecialDefenseDown2: ; 362d9 -; specialdefensedown2 - ld a, $10 | SP_DEFENSE - jr BattleCommand_StatDown - -BattleCommand_AccuracyDown2: ; 362dd -; accuracydown2 - ld a, $10 | ACCURACY - jr BattleCommand_StatDown - -BattleCommand_EvasionDown2: ; 362e1 -; evasiondown2 - ld a, $10 | EVASION - -BattleCommand_StatDown: ; 362e3 -; statdown - - ld [LoweredStat], a - - call CheckMist - jp nz, .Mist - - ld hl, EnemyStatLevels - ld a, [hBattleTurn] - and a - jr z, .GetStatLevel - ld hl, PlayerStatLevels - -.GetStatLevel: -; Attempt to lower the stat. - ld a, [LoweredStat] - and $f - ld c, a - ld b, 0 - add hl, bc - ld b, [hl] - dec b - jp z, .CantLower - -; Sharply lower the stat if applicable. - ld a, [LoweredStat] - and $f0 - jr z, .ComputerMiss - dec b - jr nz, .ComputerMiss - inc b - -.ComputerMiss: -; Computer opponents have a 25% chance of failing. - ld a, [hBattleTurn] - and a - jr z, .DidntMiss - - ld a, [wLinkMode] + jr z, .DidntMiss + + ld a, [wLinkMode] and a jr nz, .DidntMiss @@ -5806,3446 +4724,2317 @@ BattleCommand_StatDown: ; 362e3 ; Attacking moves that also lower accuracy are unaffected. ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVar - cp EFFECT_ACCURACY_DOWN_HIT - jr z, .DidntMiss - - call BattleRandom - cp 25 percent + 1 ; 25% chance AI fails - jr c, .Failed - -.DidntMiss: - call CheckSubstituteOpp - jr nz, .Failed - - ld a, [AttackMissed] - and a - jr nz, .Failed - - ld a, [EffectFailed] - and a - jr nz, .Failed - - call CheckHiddenOpponent - jr nz, .Failed - -; Accuracy/Evasion reduction don't involve stats. - ld [hl], b - ld a, c - cp ACCURACY - jr nc, .Hit - - push hl - ld hl, EnemyMonAttack + 1 - ld de, EnemyStats - ld a, [hBattleTurn] - and a - jr z, .do_enemy - ld hl, BattleMonAttack + 1 - ld de, PlayerStats -.do_enemy - call TryLowerStat - pop hl - jr z, .CouldntLower - -.Hit: - xor a - ld [FailedMessage], a - ret - -.CouldntLower: - inc [hl] -.CantLower: - ld a, 3 - ld [FailedMessage], a - ld a, 1 - ld [AttackMissed], a - ret - -.Failed: - ld a, 1 - ld [FailedMessage], a - ld [AttackMissed], a - ret - -.Mist: - ld a, 2 - ld [FailedMessage], a - ld a, 1 - ld [AttackMissed], a - ret - -; 36391 - - -CheckMist: ; 36391 - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVar - cp EFFECT_ATTACK_DOWN - jr c, .dont_check_mist - cp EFFECT_EVASION_DOWN + 1 - jr c, .check_mist - cp EFFECT_ATTACK_DOWN_2 - jr c, .dont_check_mist - cp EFFECT_EVASION_DOWN_2 + 1 - jr c, .check_mist - cp EFFECT_ATTACK_DOWN_HIT - jr c, .dont_check_mist - cp EFFECT_EVASION_DOWN_HIT + 1 - jr c, .check_mist -.dont_check_mist - xor a - ret - -.check_mist - ld a, BATTLE_VARS_SUBSTATUS4_OPP - call GetBattleVar - bit SUBSTATUS_MIST, a - ret - -; 363b8 - - -BattleCommand_StatUpMessage: ; 363b8 - ld a, [FailedMessage] - and a - ret nz - ld a, [LoweredStat] - and $f - ld b, a - inc b - call GetStatName - ld hl, .stat - jp BattleTextBox - -.stat - text_jump UnknownText_0x1c0cc6 - start_asm - ld hl, .up - ld a, [LoweredStat] - and $f0 - ret z - ld hl, .wayup - ret - -.wayup - text_jump UnknownText_0x1c0cd0 - db "@" - -.up - text_jump UnknownText_0x1c0ce0 - db "@" - -; 363e9 - - -BattleCommand_StatDownMessage: ; 363e9 - ld a, [FailedMessage] - and a - ret nz - ld a, [LoweredStat] - and $f - ld b, a - inc b - call GetStatName - ld hl, .stat - jp BattleTextBox - -.stat - text_jump UnknownText_0x1c0ceb - start_asm - ld hl, .fell - ld a, [LoweredStat] - and $f0 - ret z - ld hl, .sharplyfell - ret - -.sharplyfell - text_jump UnknownText_0x1c0cf5 - db "@" -.fell - text_jump UnknownText_0x1c0d06 - db "@" - -; 3641a - - -TryLowerStat: ; 3641a -; Lower stat c from stat struct hl (buffer de). - - push bc - sla c - ld b, 0 - add hl, bc - ; add de, c - ld a, c - add e - ld e, a - jr nc, .no_carry - inc d -.no_carry - pop bc - -; The lowest possible stat is 1. - ld a, [hld] - sub 1 - jr nz, .not_min - ld a, [hl] - and a - ret z - -.not_min - ld a, [hBattleTurn] - and a - jr z, .Player - - call BattleCommand_SwitchTurn - call CalcPlayerStats - call BattleCommand_SwitchTurn - jr .end - -.Player: - call BattleCommand_SwitchTurn - call CalcEnemyStats - call BattleCommand_SwitchTurn -.end - ld a, 1 - and a - ret - -; 3644c - - -BattleCommand_StatUpFailText: ; 3644c -; statupfailtext - ld a, [FailedMessage] - and a - ret z - push af - call BattleCommand_MoveDelay - pop af - dec a - jp z, TryPrintButItFailed - ld a, [LoweredStat] - and $f - ld b, a - inc b - call GetStatName - ld hl, WontRiseAnymoreText - jp StdBattleTextBox - -; 3646a - - -BattleCommand_StatDownFailText: ; 3646a -; statdownfailtext - ld a, [FailedMessage] - and a - ret z - push af - call BattleCommand_MoveDelay - pop af - dec a - jp z, TryPrintButItFailed - dec a - ld hl, ProtectedByMistText - jp z, StdBattleTextBox - ld a, [LoweredStat] - and $f - ld b, a - inc b - call GetStatName - ld hl, WontDropAnymoreText - jp StdBattleTextBox - -; 3648f - - -GetStatName: ; 3648f - ld hl, StatNames - 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 - -INCLUDE "data/battle/stat_names.asm" - - -INCLUDE "data/battle/stat_multipliers.asm" - - -BattleCommand_AllStatsUp: ; 36500 -; allstatsup - -; Attack - call ResetMiss - call BattleCommand_AttackUp - call BattleCommand_StatUpMessage - -; Defense - call ResetMiss - call BattleCommand_DefenseUp - call BattleCommand_StatUpMessage - -; Speed - call ResetMiss - call BattleCommand_SpeedUp - call BattleCommand_StatUpMessage - -; Special Attack - call ResetMiss - call BattleCommand_SpecialAttackUp - call BattleCommand_StatUpMessage - -; Special Defense - call ResetMiss - call BattleCommand_SpecialDefenseUp - jp BattleCommand_StatUpMessage -; 3652d - - -ResetMiss: ; 3652d - xor a - ld [AttackMissed], a - ret - -; 36532 - - -LowerStat: ; 36532 - ld [LoweredStat], a - - ld hl, PlayerStatLevels - ld a, [hBattleTurn] - and a - jr z, .got_target - ld hl, EnemyStatLevels - -.got_target - ld a, [LoweredStat] - and $f - ld c, a - ld b, 0 - add hl, bc - ld b, [hl] - dec b - jr z, .cant_lower_anymore - - ld a, [LoweredStat] - and $f0 - jr z, .got_num_stages - dec b - jr nz, .got_num_stages - inc b - -.got_num_stages - ld [hl], b - ld a, c - cp 5 - jr nc, .accuracy_evasion - - push hl - ld hl, BattleMonStats + 1 - ld de, PlayerStats - ld a, [hBattleTurn] - and a - jr z, .got_target_2 - ld hl, EnemyMonStats + 1 - ld de, EnemyStats - -.got_target_2 - call TryLowerStat - pop hl - jr z, .failed - -.accuracy_evasion - ld a, [hBattleTurn] - and a - jr z, .player - - call CalcEnemyStats - - jr .finish - -.player - call CalcPlayerStats - -.finish - xor a - ld [FailedMessage], a - ret - -.failed - inc [hl] - -.cant_lower_anymore - ld a, 2 - ld [FailedMessage], a - ret - -; 3658f - - -BattleCommand_TriStatusChance: ; 3658f -; tristatuschance - - call BattleCommand_EffectChance - -.loop - ; 1/3 chance of each status - call BattleRandom - swap a - and %11 - jr z, .loop - dec a - ld hl, .ptrs - rst JumpTable - ret - -.ptrs - dw BattleCommand_ParalyzeTarget ; paralyze - dw BattleCommand_FreezeTarget ; freeze - dw BattleCommand_BurnTarget ; burn -; 365a7 - - -BattleCommand_Curl: ; 365a7 -; curl - ld a, BATTLE_VARS_SUBSTATUS2 - call GetBattleVarAddr - set SUBSTATUS_CURLED, [hl] - ret - -; 365af - - -BattleCommand_RaiseSubNoAnim: ; 365af - ld hl, GetBattleMonBackpic - ld a, [hBattleTurn] - and a - jr z, .PlayerTurn - ld hl, GetEnemyMonFrontpic -.PlayerTurn: - xor a - ld [hBGMapMode], a - call CallBattleCore - jp WaitBGMap - -; 365c3 - - -BattleCommand_LowerSubNoAnim: ; 365c3 - ld hl, DropPlayerSub - ld a, [hBattleTurn] - and a - jr z, .PlayerTurn - ld hl, DropEnemySub -.PlayerTurn: - xor a - ld [hBGMapMode], a - call CallBattleCore - jp WaitBGMap - -; 365d7 - - -CalcPlayerStats: ; 365d7 - ld hl, PlayerAtkLevel - ld de, PlayerStats - ld bc, BattleMonAttack - - ld a, 5 - call CalcStats - - ld hl, BadgeStatBoosts - call CallBattleCore - - call BattleCommand_SwitchTurn - - ld hl, ApplyPrzEffectOnSpeed - call CallBattleCore - - ld hl, ApplyBrnEffectOnAttack - call CallBattleCore - - jp BattleCommand_SwitchTurn - -; 365fd - - -CalcEnemyStats: ; 365fd - ld hl, EnemyAtkLevel - ld de, EnemyStats - ld bc, EnemyMonAttack - - ld a, 5 - call CalcStats - - call BattleCommand_SwitchTurn - - ld hl, ApplyPrzEffectOnSpeed - call CallBattleCore - - ld hl, ApplyBrnEffectOnAttack - call CallBattleCore - - jp BattleCommand_SwitchTurn - -; 3661d - - -CalcStats: ; 3661d -.loop - push af - ld a, [hli] - push hl - push bc - - ld c, a - dec c - ld b, 0 - ld hl, StatLevelMultipliers - add hl, bc - add hl, bc - - xor a - ld [hMultiplicand + 0], a - ld a, [de] - ld [hMultiplicand + 1], a - inc de - ld a, [de] - ld [hMultiplicand + 2], a - inc de - - ld a, [hli] - ld [hMultiplier], a - call Multiply - - ld a, [hl] - ld [hDivisor], a - ld b, 4 - call Divide - - ld a, [hQuotient + 1] - ld b, a - ld a, [hQuotient + 2] - or b - jr nz, .check_maxed_out - - ld a, 1 - ld [hQuotient + 2], a - jr .not_maxed_out - -.check_maxed_out - ld a, [hQuotient + 2] - cp LOW(MAX_STAT_VALUE) - ld a, b - sbc HIGH(MAX_STAT_VALUE) - jr c, .not_maxed_out - - ld a, LOW(MAX_STAT_VALUE) - ld [hQuotient + 2], a - ld a, HIGH(MAX_STAT_VALUE) - ld [hQuotient + 1], a - -.not_maxed_out - pop bc - ld a, [hQuotient + 1] - ld [bc], a - inc bc - ld a, [hQuotient + 2] - ld [bc], a - inc bc - pop hl - pop af - dec a - jr nz, .loop - - ret - -; 36671 - - -BattleCommand_StoreEnergy: ; 36671 -; storeenergy - - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVar - bit SUBSTATUS_BIDE, a - ret z - - ld hl, PlayerRolloutCount - ld a, [hBattleTurn] - and a - jr z, .check_still_storing_energy - ld hl, EnemyRolloutCount -.check_still_storing_energy - dec [hl] - jr nz, .still_storing - - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - res SUBSTATUS_BIDE, [hl] - - ld hl, UnleashedEnergyText - call StdBattleTextBox - - ld a, BATTLE_VARS_MOVE_POWER - call GetBattleVarAddr - ld a, 1 - ld [hl], a - ld hl, PlayerDamageTaken + 1 - ld de, wPlayerCharging ; player - ld a, [hBattleTurn] - and a - jr z, .player - ld hl, EnemyDamageTaken + 1 - ld de, wEnemyCharging ; enemy -.player - ld a, [hld] - add a - ld b, a - ld [CurDamage + 1], a - ld a, [hl] - rl a - ld [CurDamage], a - jr nc, .not_maxed - ld a, $ff - ld [CurDamage], a - ld [CurDamage + 1], a -.not_maxed - or b - jr nz, .built_up_something - ld a, 1 - ld [AttackMissed], a -.built_up_something - xor a - ld [hli], a - ld [hl], a - ld [de], a - - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVarAddr - ld a, BIDE - ld [hl], a - - ld b, unleashenergy_command - jp SkipToBattleCommand - -.still_storing - ld hl, StoringEnergyText - call StdBattleTextBox - jp EndMoveEffect - -; 366e5 - - -BattleCommand_UnleashEnergy: ; 366e5 -; unleashenergy - - ld de, PlayerDamageTaken - ld bc, PlayerRolloutCount - ld a, [hBattleTurn] - and a - jr z, .got_damage - ld de, EnemyDamageTaken - ld bc, EnemyRolloutCount -.got_damage - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - set SUBSTATUS_BIDE, [hl] - xor a - ld [de], a - inc de - ld [de], a - ld [wPlayerMoveStructEffect], a - ld [wEnemyMoveStructEffect], a - call BattleRandom - and 1 - inc a - inc a - ld [bc], a - ld a, 1 - ld [wKickCounter], a - call AnimateCurrentMove - jp EndMoveEffect - -; 3671a - - -BattleCommand_CheckRampage: ; 3671a -; checkrampage - - ld de, PlayerRolloutCount - ld a, [hBattleTurn] - and a - jr z, .player - ld de, EnemyRolloutCount -.player - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - bit SUBSTATUS_RAMPAGE, [hl] - ret z - ld a, [de] - dec a - ld [de], a - jr nz, .continue_rampage - - res SUBSTATUS_RAMPAGE, [hl] - call BattleCommand_SwitchTurn - call SafeCheckSafeguard - push af - call BattleCommand_SwitchTurn - pop af - jr nz, .continue_rampage - - set SUBSTATUS_CONFUSED, [hl] - call BattleRandom - and %00000001 - inc a - inc a - inc de ; ConfuseCount - ld [de], a -.continue_rampage - ld b, rampage_command - jp SkipToBattleCommand - -; 36751 - - -BattleCommand_Rampage: ; 36751 -; rampage - -; No rampage during Sleep Talk. - ld a, BATTLE_VARS_STATUS - call GetBattleVar - and SLP - ret nz - - ld de, PlayerRolloutCount - ld a, [hBattleTurn] - and a - jr z, .ok - ld de, EnemyRolloutCount -.ok - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - set SUBSTATUS_RAMPAGE, [hl] -; Rampage for 1 or 2 more turns - call BattleRandom - and %00000001 - inc a - ld [de], a - ld a, 1 - ld [wSomeoneIsRampaging], a - ret - -; 36778 - - -BattleCommand_Teleport: ; 36778 -; teleport - - ld a, [BattleType] - cp BATTLETYPE_SHINY - jr z, .failed - cp BATTLETYPE_TRAP - jr z, .failed - cp BATTLETYPE_CELEBI - jr z, .failed - cp BATTLETYPE_SUICUNE - jr z, .failed - - ld a, BATTLE_VARS_SUBSTATUS5_OPP - call GetBattleVar - bit SUBSTATUS_CANT_RUN, a - jr nz, .failed -; Only need to check these next things if it's your turn - ld a, [hBattleTurn] - and a - jr nz, .enemy_turn -; Can't teleport from a trainer battle - ld a, [wBattleMode] - dec a - jr nz, .failed -; If your level is greater than the opponent's, you run without fail. - ld a, [CurPartyLevel] - ld b, a - ld a, [BattleMonLevel] - cp b - jr nc, .run_away -; Generate a number between 0 and (YourLevel + TheirLevel). - add b - ld c, a - inc c -.loop_player - call BattleRandom - cp c - jr nc, .loop_player -; If that number is greater than 4 times your level, run away. - srl b - srl b - cp b - jr nc, .run_away - -.failed - call AnimateFailedMove - jp PrintButItFailed - -.enemy_turn - ld a, [wBattleMode] - dec a - jr nz, .failed - ld a, [BattleMonLevel] - ld b, a - ld a, [CurPartyLevel] - cp b - jr nc, .run_away - add b - ld c, a - inc c -.loop_enemy - call BattleRandom - cp c - jr nc, .loop_enemy - srl b - srl b - cp b - ; This does the wrong thing. What was - ; probably intended was jr c, .failed - ; The way this is made makes enemy use - ; of Teleport always succeed if able - jr nc, .run_away -.run_away - call UpdateBattleMonInParty - xor a - ld [wNumHits], a - inc a - ld [wForcedSwitch], a - ld [wKickCounter], a - call SetBattleDraw - call BattleCommand_LowerSub - call LoadMoveAnim - ld c, 20 - call DelayFrames - call SetBattleDraw - - ld hl, FledFromBattleText - jp StdBattleTextBox - -; 36804 - - -SetBattleDraw: ; 36804 - ld a, [wBattleResult] - and $c0 - or $2 - ld [wBattleResult], a - ret - -; 3680f - - -BattleCommand_ForceSwitch: ; 3680f -; forceswitch - - ld a, [BattleType] - cp BATTLETYPE_SHINY - jp z, .fail - cp BATTLETYPE_TRAP - jp z, .fail - cp BATTLETYPE_CELEBI - jp z, .fail - cp BATTLETYPE_SUICUNE - jp z, .fail - ld a, [hBattleTurn] - and a - jp nz, .force_player_switch - ld a, [AttackMissed] - and a - jr nz, .missed - ld a, [wBattleMode] - dec a - jr nz, .trainer - ld a, [CurPartyLevel] - ld b, a - ld a, [BattleMonLevel] - cp b - jr nc, .wild_force_flee - add b - ld c, a - inc c -.random_loop_wild - call BattleRandom - cp c - jr nc, .random_loop_wild - srl b - srl b - cp b - jr nc, .wild_force_flee -.missed - jp .fail - -.wild_force_flee - call UpdateBattleMonInParty - xor a - ld [wNumHits], a - inc a - ld [wForcedSwitch], a - call SetBattleDraw - ld a, [wPlayerMoveStructAnimation] - jp .succeed - -.trainer - call FindAliveEnemyMons - jr c, .switch_fail - ld a, [wEnemyGoesFirst] - and a - jr z, .switch_fail - call UpdateEnemyMonInParty - ld a, $1 - ld [wKickCounter], a - call AnimateCurrentMove - ld c, $14 - call DelayFrames - hlcoord 1, 0 - lb bc, 4, 10 - call ClearBox - ld c, 20 - call DelayFrames - ld a, [OTPartyCount] - ld b, a - ld a, [CurOTMon] - ld c, a -; select a random enemy mon to switch to -.random_loop_trainer - call BattleRandom - and $7 - cp b - jr nc, .random_loop_trainer - cp c - jr z, .random_loop_trainer - push af - push bc - ld hl, OTPartyMon1HP - call GetPartyLocation - ld a, [hli] - or [hl] - pop bc - pop de - jr z, .random_loop_trainer - ld a, d - inc a - ld [wEnemySwitchMonIndex], a - callfar ForceEnemySwitch - - ld hl, DraggedOutText - call StdBattleTextBox - - ld hl, SpikesDamage - jp CallBattleCore - -.switch_fail - jp .fail - -.force_player_switch - ld a, [AttackMissed] - and a - jr nz, .player_miss - - ld a, [wBattleMode] - dec a - jr nz, .vs_trainer - - ld a, [BattleMonLevel] - ld b, a - ld a, [CurPartyLevel] - cp b - jr nc, .wild_succeed_playeristarget - - add b - ld c, a - inc c -.wild_random_loop_playeristarget - call BattleRandom - cp c - jr nc, .wild_random_loop_playeristarget - - srl b - srl b - cp b - jr nc, .wild_succeed_playeristarget - -.player_miss - jr .fail - -.wild_succeed_playeristarget - call UpdateBattleMonInParty - xor a - ld [wNumHits], a - inc a - ld [wForcedSwitch], a - call SetBattleDraw - ld a, [wEnemyMoveStructAnimation] - jr .succeed - -.vs_trainer - call CheckPlayerHasMonToSwitchTo - jr c, .fail - - ld a, [wEnemyGoesFirst] - cp $1 - jr z, .switch_fail - - call UpdateBattleMonInParty - ld a, $1 - ld [wKickCounter], a - call AnimateCurrentMove - ld c, 20 - call DelayFrames - hlcoord 9, 7 - lb bc, 5, 11 - call ClearBox - ld c, 20 - call DelayFrames - ld a, [PartyCount] - ld b, a - ld a, [CurBattleMon] - ld c, a -.random_loop_trainer_playeristarget - call BattleRandom - and $7 - cp b - jr nc, .random_loop_trainer_playeristarget - - cp c - jr z, .random_loop_trainer_playeristarget - - push af - push bc - ld hl, PartyMon1HP - call GetPartyLocation - ld a, [hli] - or [hl] - pop bc - pop de - jr z, .random_loop_trainer_playeristarget - - ld a, d - ld [CurPartyMon], a - ld hl, SwitchPlayerMon - call CallBattleCore - - ld hl, DraggedOutText - call StdBattleTextBox - - ld hl, SpikesDamage - jp CallBattleCore - -.fail - call BattleCommand_LowerSub - call BattleCommand_MoveDelay - call BattleCommand_RaiseSub - jp PrintButItFailed - -.succeed - push af - call SetBattleDraw - ld a, $1 - ld [wKickCounter], a - call AnimateCurrentMove - ld c, 20 - call DelayFrames - pop af - - ld hl, FledInFearText - cp ROAR - jr z, .do_text - ld hl, BlownAwayText -.do_text - jp StdBattleTextBox - -; 36994 - - -CheckPlayerHasMonToSwitchTo: ; 36994 - ld a, [PartyCount] - ld d, a - ld e, 0 - ld bc, PARTYMON_STRUCT_LENGTH -.loop - ld a, [CurBattleMon] - cp e - jr z, .next - - ld a, e - ld hl, PartyMon1HP - call AddNTimes - ld a, [hli] - or [hl] - jr nz, .not_fainted - -.next - inc e - dec d - jr nz, .loop - - scf - ret - -.not_fainted - and a - ret - -; 369b6 - - -BattleCommand_EndLoop: ; 369b6 -; endloop - -; Loop back to the command before 'critical'. - - ld de, PlayerRolloutCount - ld bc, PlayerDamageTaken - ld a, [hBattleTurn] - and a - jr z, .got_addrs - ld de, EnemyRolloutCount - ld bc, EnemyDamageTaken -.got_addrs - - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - bit SUBSTATUS_IN_LOOP, [hl] - jp nz, .in_loop - set SUBSTATUS_IN_LOOP, [hl] - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVarAddr - ld a, [hl] - cp EFFECT_POISON_MULTI_HIT - jr z, .twineedle - cp EFFECT_DOUBLE_HIT - ld a, 1 - jr z, .double_hit - ld a, [hl] - cp EFFECT_BEAT_UP - jr z, .beat_up - cp EFFECT_TRIPLE_KICK - jr nz, .not_triple_kick -.reject_triple_kick_sample - call BattleRandom - and $3 - jr z, .reject_triple_kick_sample - dec a - jr nz, .double_hit - ld a, 1 - ld [bc], a - jr .done_loop - -.beat_up - ld a, [hBattleTurn] - and a - jr nz, .check_ot_beat_up - ld a, [PartyCount] - cp 1 - jp z, .only_one_beatup - dec a - jr .double_hit - -.check_ot_beat_up - ld a, [wBattleMode] - cp WILD_BATTLE - jp z, .only_one_beatup - ld a, [OTPartyCount] - cp 1 - jp z, .only_one_beatup - dec a - jr .double_hit - -.only_one_beatup - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - res SUBSTATUS_IN_LOOP, [hl] - call BattleCommanda8 - jp EndMoveEffect - -.not_triple_kick - call BattleRandom - and $3 - cp 2 - jr c, .got_number_hits - call BattleRandom - and $3 -.got_number_hits - inc a -.double_hit - ld [de], a - inc a - ld [bc], a - jr .loop_back_to_critical - -.twineedle - ld a, 1 - jr .double_hit - -.in_loop - ld a, [de] - dec a - ld [de], a - jr nz, .loop_back_to_critical -.done_loop - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - res SUBSTATUS_IN_LOOP, [hl] - - ld hl, PlayerHitTimesText - ld a, [hBattleTurn] - and a - jr z, .got_hit_n_times_text - ld hl, EnemyHitTimesText -.got_hit_n_times_text - - push bc - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVar - cp EFFECT_BEAT_UP - jr z, .beat_up_2 - call StdBattleTextBox -.beat_up_2 - - pop bc - xor a - ld [bc], a - ret - -; Loop back to the command before 'critical'. -.loop_back_to_critical - ld a, [BattleScriptBufferAddress + 1] - ld h, a - ld a, [BattleScriptBufferAddress] - ld l, a -.not_critical - ld a, [hld] - cp critical_command - jr nz, .not_critical - inc hl - ld a, h - ld [BattleScriptBufferAddress + 1], a - ld a, l - ld [BattleScriptBufferAddress], a - ret + call GetBattleVar + cp EFFECT_ACCURACY_DOWN_HIT + jr z, .DidntMiss -; 36a82 + call BattleRandom + cp 25 percent + 1 ; 25% chance AI fails + jr c, .Failed +.DidntMiss: + call CheckSubstituteOpp + jr nz, .Failed -BattleCommand_FakeOut: ; 36a82 ld a, [AttackMissed] and a - ret nz + jr nz, .Failed - call CheckSubstituteOpp - jr nz, .fail + ld a, [EffectFailed] + and a + jr nz, .Failed - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVar - and 1 << FRZ | SLP - jr nz, .fail + call CheckHiddenOpponent + jr nz, .Failed - call CheckOpponentWentFirst - jr z, FlinchTarget +; Accuracy/Evasion reduction don't involve stats. + ld [hl], b + ld a, c + cp ACCURACY + jr nc, .Hit -.fail + push hl + ld hl, EnemyMonAttack + 1 + ld de, EnemyStats + ld a, [hBattleTurn] + and a + jr z, .do_enemy + ld hl, BattleMonAttack + 1 + ld de, PlayerStats +.do_enemy + call TryLowerStat + pop hl + jr z, .CouldntLower + +.Hit: + xor a + ld [FailedMessage], a + ret + +.CouldntLower: + inc [hl] +.CantLower: + ld a, 3 + ld [FailedMessage], a ld a, 1 ld [AttackMissed], a ret -; 36aa0 - - -BattleCommand_FlinchTarget: ; 36aa0 - call CheckSubstituteOpp - ret nz - - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVar - and 1 << FRZ | SLP - ret nz +.Failed: + ld a, 1 + ld [FailedMessage], a + ld [AttackMissed], a + ret - call CheckOpponentWentFirst - ret nz +.Mist: + ld a, 2 + ld [FailedMessage], a + ld a, 1 + ld [AttackMissed], a + ret - ld a, [EffectFailed] - and a - ret nz +; 36391 - ; fallthrough -; 36ab5 +CheckMist: ; 36391 + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVar + cp EFFECT_ATTACK_DOWN + jr c, .dont_check_mist + cp EFFECT_EVASION_DOWN + 1 + jr c, .check_mist + cp EFFECT_ATTACK_DOWN_2 + jr c, .dont_check_mist + cp EFFECT_EVASION_DOWN_2 + 1 + jr c, .check_mist + cp EFFECT_ATTACK_DOWN_HIT + jr c, .dont_check_mist + cp EFFECT_EVASION_DOWN_HIT + 1 + jr c, .check_mist +.dont_check_mist + xor a + ret -FlinchTarget: ; 36ab5 - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVarAddr - set SUBSTATUS_FLINCHED, [hl] - jp EndRechargeOpp +.check_mist + ld a, BATTLE_VARS_SUBSTATUS4_OPP + call GetBattleVar + bit SUBSTATUS_MIST, a + ret -; 36abf +; 363b8 -CheckOpponentWentFirst: ; 36abf -; Returns a=0, z if user went first -; Returns a=1, nz if opponent went first - push bc - ld a, [wEnemyGoesFirst] ; 0 if player went first +BattleCommand_StatUpMessage: ; 363b8 + ld a, [FailedMessage] + and a + ret nz + ld a, [LoweredStat] + and $f ld b, a - ld a, [hBattleTurn] ; 0 if it's the player's turn - xor b ; 1 if opponent went first - pop bc + inc b + call GetStatName + ld hl, .stat + jp BattleTextBox + +.stat + text_jump UnknownText_0x1c0cc6 + start_asm + ld hl, .up + ld a, [LoweredStat] + and $f0 + ret z + ld hl, .wayup ret -; 36ac9 +.wayup + text_jump UnknownText_0x1c0cd0 + db "@" +.up + text_jump UnknownText_0x1c0ce0 + db "@" -BattleCommand_HeldFlinch: ; 36ac9 -; kingsrock +; 363e9 - ld a, [AttackMissed] - and a - ret nz - call GetUserItem - ld a, b - cp HELD_FLINCH +BattleCommand_StatDownMessage: ; 363e9 + ld a, [FailedMessage] + and a ret nz + ld a, [LoweredStat] + and $f + ld b, a + inc b + call GetStatName + ld hl, .stat + jp BattleTextBox - call CheckSubstituteOpp - ret nz - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVarAddr - ld d, h - ld e, l - call GetUserItem - call BattleRandom - cp c - ret nc - call EndRechargeOpp - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVarAddr - set SUBSTATUS_FLINCHED, [hl] +.stat + text_jump UnknownText_0x1c0ceb + start_asm + ld hl, .fell + ld a, [LoweredStat] + and $f0 + ret z + ld hl, .sharplyfell ret -; 36af3 +.sharplyfell + text_jump UnknownText_0x1c0cf5 + db "@" +.fell + text_jump UnknownText_0x1c0d06 + db "@" +; 3641a -BattleCommand_OHKO: ; 36af3 -; ohko - call ResetDamage - ld a, [TypeModifier] - and $7f - jr z, .no_effect - ld hl, EnemyMonLevel - ld de, BattleMonLevel - ld bc, wPlayerMoveStruct + MOVE_ACC - ld a, [hBattleTurn] - and a - jr z, .got_move_accuracy - push hl - ld h, d - ld l, e - pop de - ld bc, wEnemyMoveStruct + MOVE_ACC -.got_move_accuracy - ld a, [de] - sub [hl] - jr c, .no_effect - add a - ld e, a - ld a, [bc] +TryLowerStat: ; 3641a +; Lower stat c from stat struct hl (buffer de). + + push bc + sla c + ld b, 0 + add hl, bc + ; add de, c + ld a, c add e - jr nc, .finish_ohko - ld a, $ff -.finish_ohko - ld [bc], a - call BattleCommand_CheckHit - ld hl, CurDamage - ld a, $ff - ld [hli], a - ld [hl], a - ld a, $2 - ld [CriticalHit], a - ret + ld e, a + jr nc, .no_carry + inc d +.no_carry + pop bc + +; The lowest possible stat is 1. + ld a, [hld] + sub 1 + jr nz, .not_min + ld a, [hl] + and a + ret z -.no_effect - ld a, $ff - ld [CriticalHit], a - ld a, $1 - ld [AttackMissed], a +.not_min + ld a, [hBattleTurn] + and a + jr z, .Player + + call BattleCommand_SwitchTurn + call CalcPlayerStats + call BattleCommand_SwitchTurn + jr .end + +.Player: + call BattleCommand_SwitchTurn + call CalcEnemyStats + call BattleCommand_SwitchTurn +.end + ld a, 1 + and a ret -; 36b3a +; 3644c -BattleCommand_CheckCharge: ; 36b3a -; checkcharge +BattleCommand_StatUpFailText: ; 3644c +; statupfailtext + ld a, [FailedMessage] + and a + ret z + push af + call BattleCommand_MoveDelay + pop af + dec a + jp z, TryPrintButItFailed + ld a, [LoweredStat] + and $f + ld b, a + inc b + call GetStatName + ld hl, WontRiseAnymoreText + jp StdBattleTextBox - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - bit SUBSTATUS_CHARGED, [hl] +; 3646a + + +BattleCommand_StatDownFailText: ; 3646a +; statdownfailtext + ld a, [FailedMessage] + and a ret z - res SUBSTATUS_CHARGED, [hl] - res SUBSTATUS_UNDERGROUND, [hl] - res SUBSTATUS_FLYING, [hl] - ld b, charge_command - jp SkipToBattleCommand + push af + call BattleCommand_MoveDelay + pop af + dec a + jp z, TryPrintButItFailed + dec a + ld hl, ProtectedByMistText + jp z, StdBattleTextBox + ld a, [LoweredStat] + and $f + ld b, a + inc b + call GetStatName + ld hl, WontDropAnymoreText + jp StdBattleTextBox -; 36b4d +; 3648f -BattleCommand_Charge: ; 36b4d -; charge +GetStatName: ; 3648f + ld hl, StatNames + ld c, "@" +.CheckName: + dec b + jr z, .Copy +.GetName: + ld a, [hli] + cp c + jr z, .CheckName + jr .GetName - call BattleCommand_ClearText - ld a, BATTLE_VARS_STATUS - call GetBattleVar - and SLP - jr z, .awake +.Copy: + ld de, StringBuffer2 + ld bc, StringBuffer3 - StringBuffer2 + jp CopyBytes - call BattleCommand_MoveDelay - call BattleCommand_RaiseSub - call PrintButItFailed - jp EndMoveEffect +INCLUDE "data/battle/stat_names.asm" -.awake - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - set SUBSTATUS_CHARGED, [hl] - ld hl, IgnoredOrders2Text - ld a, [AlreadyDisobeyed] - and a - call nz, StdBattleTextBox +INCLUDE "data/battle/stat_multipliers.asm" - call BattleCommand_LowerSub - xor a - ld [wNumHits], a - inc a - ld [wKickCounter], a - call LoadMoveAnim - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVar - cp FLY - jr z, .flying - cp DIG - jr z, .flying - call BattleCommand_RaiseSub - jr .not_flying -.flying - call DisappearUser -.not_flying - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVar - ld b, a - cp FLY - jr z, .set_flying - cp DIG - jr nz, .dont_set_digging - set SUBSTATUS_UNDERGROUND, [hl] - jr .dont_set_digging +BattleCommand_AllStatsUp: ; 36500 +; allstatsup -.set_flying - set SUBSTATUS_FLYING, [hl] +; Attack + call ResetMiss + call BattleCommand_AttackUp + call BattleCommand_StatUpMessage -.dont_set_digging - call CheckUserIsCharging - jr nz, .mimic - ld a, BATTLE_VARS_LAST_COUNTER_MOVE - call GetBattleVarAddr - ld [hl], b - ld a, BATTLE_VARS_LAST_MOVE - call GetBattleVarAddr - ld [hl], b +; Defense + call ResetMiss + call BattleCommand_DefenseUp + call BattleCommand_StatUpMessage -.mimic - call ResetDamage +; Speed + call ResetMiss + call BattleCommand_SpeedUp + call BattleCommand_StatUpMessage - ld hl, .UsedText - call BattleTextBox +; Special Attack + call ResetMiss + call BattleCommand_SpecialAttackUp + call BattleCommand_StatUpMessage - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVar - cp EFFECT_SKULL_BASH - ld b, endturn_command - jp z, SkipToBattleCommand - jp EndMoveEffect +; Special Defense + call ResetMiss + call BattleCommand_SpecialDefenseUp + jp BattleCommand_StatUpMessage +; 3652d -.UsedText: - text_jump UnknownText_0x1c0d0e ; "[USER]" - start_asm - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVar - cp RAZOR_WIND - ld hl, .RazorWind - jr z, .done - cp SOLARBEAM - ld hl, .Solarbeam - jr z, .done +ResetMiss: ; 3652d + xor a + ld [AttackMissed], a + ret - cp SKULL_BASH - ld hl, .SkullBash - jr z, .done +; 36532 - cp SKY_ATTACK - ld hl, .SkyAttack - jr z, .done - cp FLY - ld hl, .Fly - jr z, .done +LowerStat: ; 36532 + ld [LoweredStat], a - cp DIG - ld hl, .Dig + ld hl, PlayerStatLevels + ld a, [hBattleTurn] + and a + jr z, .got_target + ld hl, EnemyStatLevels -.done - ret +.got_target + ld a, [LoweredStat] + and $f + ld c, a + ld b, 0 + add hl, bc + ld b, [hl] + dec b + jr z, .cant_lower_anymore -.RazorWind: -; 'made a whirlwind!' - text_jump UnknownText_0x1c0d12 - db "@" + ld a, [LoweredStat] + and $f0 + jr z, .got_num_stages + dec b + jr nz, .got_num_stages + inc b + +.got_num_stages + ld [hl], b + ld a, c + cp 5 + jr nc, .accuracy_evasion + + push hl + ld hl, BattleMonStats + 1 + ld de, PlayerStats + ld a, [hBattleTurn] + and a + jr z, .got_target_2 + ld hl, EnemyMonStats + 1 + ld de, EnemyStats + +.got_target_2 + call TryLowerStat + pop hl + jr z, .failed -.Solarbeam: -; 'took in sunlight!' - text_jump UnknownText_0x1c0d26 - db "@" +.accuracy_evasion + ld a, [hBattleTurn] + and a + jr z, .player -.SkullBash: -; 'lowered its head!' - text_jump UnknownText_0x1c0d3a - db "@" + call CalcEnemyStats -.SkyAttack: -; 'is glowing!' - text_jump UnknownText_0x1c0d4e - db "@" + jr .finish -.Fly: -; 'flew up high!' - text_jump UnknownText_0x1c0d5c - db "@" +.player + call CalcPlayerStats -.Dig: -; 'dug a hole!' - text_jump UnknownText_0x1c0d6c - db "@" -; 36c2c +.finish + xor a + ld [FailedMessage], a + ret +.failed + inc [hl] -BattleCommand3c: ; 36c2c -; unused +.cant_lower_anymore + ld a, 2 + ld [FailedMessage], a ret -; 36c2d +; 3658f -BattleCommand_TrapTarget: ; 36c2d -; traptarget +BattleCommand_TriStatusChance: ; 3658f +; tristatuschance - ld a, [AttackMissed] - and a - ret nz - ld hl, wEnemyWrapCount - ld de, wEnemyTrappingMove - ld a, [hBattleTurn] - and a - jr z, .got_trap - ld hl, wPlayerWrapCount - ld de, wPlayerTrappingMove + call BattleCommand_EffectChance -.got_trap - ld a, [hl] - and a - ret nz - ld a, BATTLE_VARS_SUBSTATUS4_OPP - call GetBattleVar - bit SUBSTATUS_SUBSTITUTE, a - ret nz +.loop + ; 1/3 chance of each status call BattleRandom - ; trapped for 2-5 turns + swap a and %11 - inc a - inc a - inc a - ld [hl], a - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVar - ld [de], a - ld b, a - ld hl, .Traps + jr z, .loop + dec a + ld hl, .ptrs + rst JumpTable + ret -.find_trap_text - ld a, [hli] - cp b - jr z, .found_trap_text - inc hl - inc hl - jr .find_trap_text +.ptrs + dw BattleCommand_ParalyzeTarget ; paralyze + dw BattleCommand_FreezeTarget ; freeze + dw BattleCommand_BurnTarget ; burn +; 365a7 -.found_trap_text - ld a, [hli] - ld h, [hl] - ld l, a - jp StdBattleTextBox -.Traps: - dbw BIND, UsedBindText ; 'used BIND on' - dbw WRAP, WrappedByText ; 'was WRAPPED by' - dbw FIRE_SPIN, FireSpinTrapText ; 'was trapped!' - dbw CLAMP, ClampedByText ; 'was CLAMPED by' - dbw WHIRLPOOL, WhirlpoolTrapText ; 'was trapped!' -; 36c7e +BattleCommand_Curl: ; 365a7 +; curl + ld a, BATTLE_VARS_SUBSTATUS2 + call GetBattleVarAddr + set SUBSTATUS_CURLED, [hl] + ret +; 365af -BattleCommand_Mist: ; 36c7e -; mist - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVarAddr - bit SUBSTATUS_MIST, [hl] - jr nz, .already_mist - set SUBSTATUS_MIST, [hl] - call AnimateCurrentMove - ld hl, MistText - jp StdBattleTextBox +BattleCommand_RaiseSubNoAnim: ; 365af + ld hl, GetBattleMonBackpic + ld a, [hBattleTurn] + and a + jr z, .PlayerTurn + ld hl, GetEnemyMonFrontpic +.PlayerTurn: + xor a + ld [hBGMapMode], a + call CallBattleCore + jp WaitBGMap -.already_mist - call AnimateFailedMove - jp PrintButItFailed +; 365c3 -; 36c98 +BattleCommand_LowerSubNoAnim: ; 365c3 + ld hl, DropPlayerSub + ld a, [hBattleTurn] + and a + jr z, .PlayerTurn + ld hl, DropEnemySub +.PlayerTurn: + xor a + ld [hBGMapMode], a + call CallBattleCore + jp WaitBGMap -BattleCommand_FocusEnergy: ; 36c98 -; focusenergy +; 365d7 - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVarAddr - bit SUBSTATUS_FOCUS_ENERGY, [hl] - jr nz, .already_pumped - set SUBSTATUS_FOCUS_ENERGY, [hl] - call AnimateCurrentMove - ld hl, GettingPumpedText - jp StdBattleTextBox -.already_pumped - call AnimateFailedMove - jp PrintButItFailed +CalcPlayerStats: ; 365d7 + ld hl, PlayerAtkLevel + ld de, PlayerStats + ld bc, BattleMonAttack -; 36cb2 + ld a, 5 + call CalcStats + ld hl, BadgeStatBoosts + call CallBattleCore -BattleCommand_Recoil: ; 36cb2 -; recoil + call BattleCommand_SwitchTurn - ld hl, BattleMonMaxHP - ld a, [hBattleTurn] - and a - jr z, .got_hp - ld hl, EnemyMonMaxHP -.got_hp - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVar - ld d, a -; get 1/4 damage or 1 HP, whichever is higher - ld a, [CurDamage] - ld b, a - ld a, [CurDamage + 1] - ld c, a - srl b - rr c - srl b - rr c - ld a, b - or c - jr nz, .min_damage - inc c -.min_damage - ld a, [hli] - ld [Buffer2], a - ld a, [hl] - ld [Buffer1], a - dec hl - dec hl - ld a, [hl] - ld [Buffer3], a - sub c - ld [hld], a - ld [Buffer5], a - ld a, [hl] - ld [Buffer4], a - sbc b - ld [hl], a - ld [Buffer6], a - jr nc, .dont_ko - xor a - ld [hli], a - ld [hl], a - ld hl, Buffer5 - ld [hli], a - ld [hl], a -.dont_ko - hlcoord 10, 9 - ld a, [hBattleTurn] - and a - ld a, 1 - jr z, .animate_hp_bar - hlcoord 2, 2 - xor a -.animate_hp_bar - ld [wWhichHPBar], a - predef AnimateHPBar - call RefreshBattleHuds - ld hl, RecoilText - jp StdBattleTextBox + ld hl, ApplyPrzEffectOnSpeed + call CallBattleCore -; 36d1d + ld hl, ApplyBrnEffectOnAttack + call CallBattleCore + jp BattleCommand_SwitchTurn -BattleCommand_ConfuseTarget: ; 36d1d -; confusetarget +; 365fd - call GetOpponentItem - ld a, b - cp HELD_PREVENT_CONFUSE - ret z - ld a, [EffectFailed] - and a - ret nz - call SafeCheckSafeguard - ret nz - call CheckSubstituteOpp - ret nz - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVarAddr - bit SUBSTATUS_CONFUSED, [hl] - ret nz - jr BattleCommand_FinishConfusingTarget +CalcEnemyStats: ; 365fd + ld hl, EnemyAtkLevel + ld de, EnemyStats + ld bc, EnemyMonAttack + + ld a, 5 + call CalcStats + + call BattleCommand_SwitchTurn -BattleCommand_Confuse: ; 36d3b -; confuse + ld hl, ApplyPrzEffectOnSpeed + call CallBattleCore - call GetOpponentItem - ld a, b - cp HELD_PREVENT_CONFUSE - jr nz, .no_item_protection - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - call GetItemName - call AnimateFailedMove - ld hl, ProtectedByText - jp StdBattleTextBox + ld hl, ApplyBrnEffectOnAttack + call CallBattleCore -.no_item_protection - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVarAddr - bit SUBSTATUS_CONFUSED, [hl] - jr z, .not_already_confused - call AnimateFailedMove - ld hl, AlreadyConfusedText - jp StdBattleTextBox + jp BattleCommand_SwitchTurn -.not_already_confused - call CheckSubstituteOpp - jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit - ld a, [AttackMissed] - and a - jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit -BattleCommand_FinishConfusingTarget: ; 36d70 - ld bc, EnemyConfuseCount - ld a, [hBattleTurn] - and a - jr z, .got_confuse_count - ld bc, PlayerConfuseCount +; 3661d -.got_confuse_count - set SUBSTATUS_CONFUSED, [hl] - ; confused for 2-5 turns - call BattleRandom - and %11 - inc a - inc a - ld [bc], a - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVar - cp EFFECT_CONFUSE_HIT - jr z, .got_effect - cp EFFECT_SNORE - jr z, .got_effect - cp EFFECT_SWAGGER - jr z, .got_effect - call AnimateCurrentMove +CalcStats: ; 3661d +.loop + push af + ld a, [hli] + push hl + push bc -.got_effect - ld de, ANIM_CONFUSED - call PlayOpponentBattleAnim + ld c, a + dec c + ld b, 0 + ld hl, StatLevelMultipliers + add hl, bc + add hl, bc - ld hl, BecameConfusedText - call StdBattleTextBox + xor a + ld [hMultiplicand + 0], a + ld a, [de] + ld [hMultiplicand + 1], a + inc de + ld a, [de] + ld [hMultiplicand + 2], a + inc de - call GetOpponentItem - ld a, b - cp HELD_HEAL_STATUS - jr z, .heal_confusion - cp HELD_HEAL_CONFUSION - ret nz -.heal_confusion - ld hl, UseConfusionHealingItem - jp CallBattleCore + ld a, [hli] + ld [hMultiplier], a + call Multiply -; 36db6 + ld a, [hl] + ld [hDivisor], a + ld b, 4 + call Divide -BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit: ; 36db6 - ld a, BATTLE_VARS_MOVE_EFFECT - call GetBattleVar - cp EFFECT_CONFUSE_HIT - ret z - cp EFFECT_SNORE - ret z - cp EFFECT_SWAGGER - ret z - jp PrintDidntAffect2 + ld a, [hQuotient + 1] + ld b, a + ld a, [hQuotient + 2] + or b + jr nz, .check_maxed_out -; 36dc7 + ld a, 1 + ld [hQuotient + 2], a + jr .not_maxed_out +.check_maxed_out + ld a, [hQuotient + 2] + cp LOW(MAX_STAT_VALUE) + ld a, b + sbc HIGH(MAX_STAT_VALUE) + jr c, .not_maxed_out -BattleCommand_Paralyze: ; 36dc7 -; paralyze + ld a, LOW(MAX_STAT_VALUE) + ld [hQuotient + 2], a + ld a, HIGH(MAX_STAT_VALUE) + ld [hQuotient + 1], a - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVar - bit PAR, a - jr nz, .paralyzed - ld a, [TypeModifier] - and $7f - jr z, .didnt_affect - call GetOpponentItem - ld a, b - cp HELD_PREVENT_PARALYZE - jr nz, .no_item_protection - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - call GetItemName - call AnimateFailedMove - ld hl, ProtectedByText - jp StdBattleTextBox +.not_maxed_out + pop bc + ld a, [hQuotient + 1] + ld [bc], a + inc bc + ld a, [hQuotient + 2] + ld [bc], a + inc bc + pop hl + pop af + dec a + jr nz, .loop -.no_item_protection - ld a, [hBattleTurn] - and a - jr z, .dont_sample_failure + ret - ld a, [wLinkMode] - and a - jr nz, .dont_sample_failure +; 36671 - ld a, [InBattleTowerBattle] - and a - jr nz, .dont_sample_failure - ld a, [PlayerSubStatus5] - bit SUBSTATUS_LOCK_ON, a - jr nz, .dont_sample_failure +INCLUDE "engine/battle/move_effects/bide.asm" - call BattleRandom - cp 1 + 25 percent - jr c, .failed -.dont_sample_failure - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - and a - jr nz, .failed - ld a, [AttackMissed] +BattleCommand_CheckRampage: ; 3671a +; checkrampage + + ld de, PlayerRolloutCount + ld a, [hBattleTurn] and a - jr nz, .failed - call CheckSubstituteOpp - jr nz, .failed - ld c, 30 - call DelayFrames - call AnimateCurrentMove - ld a, $1 - ld [hBGMapMode], a - ld a, BATTLE_VARS_STATUS_OPP + jr z, .player + ld de, EnemyRolloutCount +.player + ld a, BATTLE_VARS_SUBSTATUS3 call GetBattleVarAddr - set PAR, [hl] - call UpdateOpponentInParty - ld hl, ApplyPrzEffectOnSpeed - call CallBattleCore - call UpdateBattleHuds - call PrintParalyze - ld hl, UseHeldStatusHealingItem - jp CallBattleCore - -.paralyzed - call AnimateFailedMove - ld hl, AlreadyParalyzedText - jp StdBattleTextBox + bit SUBSTATUS_RAMPAGE, [hl] + ret z + ld a, [de] + dec a + ld [de], a + jr nz, .continue_rampage -.failed - jp PrintDidntAffect2 + res SUBSTATUS_RAMPAGE, [hl] + call BattleCommand_SwitchTurn + call SafeCheckSafeguard + push af + call BattleCommand_SwitchTurn + pop af + jr nz, .continue_rampage -.didnt_affect - call AnimateFailedMove - jp PrintDoesntAffect + set SUBSTATUS_CONFUSED, [hl] + call BattleRandom + and %00000001 + inc a + inc a + inc de ; ConfuseCount + ld [de], a +.continue_rampage + ld b, rampage_command + jp SkipToBattleCommand -; 36e5b +; 36751 -CheckMoveTypeMatchesTarget: ; 36e5b -; Compare move type to opponent type. -; Return z if matching the opponent type, -; unless the move is Normal (Tri Attack). +BattleCommand_Rampage: ; 36751 +; rampage - push hl +; No rampage during Sleep Talk. + ld a, BATTLE_VARS_STATUS + call GetBattleVar + and SLP + ret nz - ld hl, EnemyMonType1 + ld de, PlayerRolloutCount ld a, [hBattleTurn] and a jr z, .ok - ld hl, BattleMonType1 + ld de, EnemyRolloutCount .ok + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarAddr + set SUBSTATUS_RAMPAGE, [hl] +; Rampage for 1 or 2 more turns + call BattleRandom + and %00000001 + inc a + ld [de], a + ld a, 1 + ld [wSomeoneIsRampaging], a + ret - ld a, BATTLE_VARS_MOVE_TYPE - call GetBattleVar - cp NORMAL - jr z, .normal +; 36778 - cp [hl] - jr z, .return - inc hl - cp [hl] +INCLUDE "engine/battle/move_effects/teleport.asm" -.return - pop hl - ret -.normal - ld a, 1 - and a - pop hl +SetBattleDraw: ; 36804 + ld a, [wBattleResult] + and $c0 + or $2 + ld [wBattleResult], a ret -; 36e7c +; 3680f -BattleCommand_Substitute: ; 36e7c -; substitute +BattleCommand_ForceSwitch: ; 3680f +; forceswitch - call BattleCommand_MoveDelay - ld hl, BattleMonMaxHP - ld de, PlayerSubstituteHP + ld a, [BattleType] + cp BATTLETYPE_SHINY + jp z, .fail + cp BATTLETYPE_TRAP + jp z, .fail + cp BATTLETYPE_CELEBI + jp z, .fail + cp BATTLETYPE_SUICUNE + jp z, .fail ld a, [hBattleTurn] and a - jr z, .got_hp - ld hl, EnemyMonMaxHP - ld de, EnemySubstituteHP -.got_hp + jp nz, .force_player_switch + ld a, [AttackMissed] + and a + jr nz, .missed + ld a, [wBattleMode] + dec a + jr nz, .trainer + ld a, [CurPartyLevel] + ld b, a + ld a, [BattleMonLevel] + cp b + jr nc, .wild_force_flee + add b + ld c, a + inc c +.random_loop_wild + call BattleRandom + cp c + jr nc, .random_loop_wild + srl b + srl b + cp b + jr nc, .wild_force_flee +.missed + jp .fail - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVar - bit SUBSTATUS_SUBSTITUTE, a - jr nz, .already_has_sub +.wild_force_flee + call UpdateBattleMonInParty + xor a + ld [wNumHits], a + inc a + ld [wForcedSwitch], a + call SetBattleDraw + ld a, [wPlayerMoveStructAnimation] + jp .succeed +.trainer + call FindAliveEnemyMons + jr c, .switch_fail + ld a, [wEnemyGoesFirst] + and a + jr z, .switch_fail + call UpdateEnemyMonInParty + ld a, $1 + ld [wKickCounter], a + call AnimateCurrentMove + ld c, $14 + call DelayFrames + hlcoord 1, 0 + lb bc, 4, 10 + call ClearBox + ld c, 20 + call DelayFrames + ld a, [OTPartyCount] + ld b, a + ld a, [CurOTMon] + ld c, a +; select a random enemy mon to switch to +.random_loop_trainer + call BattleRandom + and $7 + cp b + jr nc, .random_loop_trainer + cp c + jr z, .random_loop_trainer + push af + push bc + ld hl, OTPartyMon1HP + call GetPartyLocation ld a, [hli] - ld b, [hl] - srl a - rr b - srl a - rr b - dec hl - dec hl - ld a, b - ld [de], a - ld a, [hld] - sub b - ld e, a - ld a, [hl] - sbc 0 - ld d, a - jr c, .too_weak_to_sub + or [hl] + pop bc + pop de + jr z, .random_loop_trainer ld a, d - or e - jr z, .too_weak_to_sub - ld [hl], d - inc hl - ld [hl], e + inc a + ld [wEnemySwitchMonIndex], a + callfar ForceEnemySwitch - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVarAddr - set SUBSTATUS_SUBSTITUTE, [hl] + ld hl, DraggedOutText + call StdBattleTextBox - ld hl, wPlayerWrapCount - ld de, wPlayerTrappingMove - ld a, [hBattleTurn] + ld hl, SpikesDamage + jp CallBattleCore + +.switch_fail + jp .fail + +.force_player_switch + ld a, [AttackMissed] and a - jr z, .player - ld hl, wEnemyWrapCount - ld de, wEnemyTrappingMove -.player + jr nz, .player_miss - xor a - ld [hl], a - ld [de], a - call _CheckBattleScene - jr c, .no_anim + ld a, [wBattleMode] + dec a + jr nz, .vs_trainer + + ld a, [BattleMonLevel] + ld b, a + ld a, [CurPartyLevel] + cp b + jr nc, .wild_succeed_playeristarget + + add b + ld c, a + inc c +.wild_random_loop_playeristarget + call BattleRandom + cp c + jr nc, .wild_random_loop_playeristarget + + srl b + srl b + cp b + jr nc, .wild_succeed_playeristarget + +.player_miss + jr .fail +.wild_succeed_playeristarget + call UpdateBattleMonInParty xor a ld [wNumHits], a - ld [FXAnimID + 1], a - ld [wKickCounter], a - ld a, SUBSTITUTE - call LoadAnim - jr .finish + inc a + ld [wForcedSwitch], a + call SetBattleDraw + ld a, [wEnemyMoveStructAnimation] + jr .succeed -.no_anim - call BattleCommand_RaiseSubNoAnim -.finish - ld hl, MadeSubstituteText - call StdBattleTextBox - jp RefreshBattleHuds +.vs_trainer + call CheckPlayerHasMonToSwitchTo + jr c, .fail -.already_has_sub - call CheckUserIsCharging - call nz, BattleCommand_RaiseSub - ld hl, HasSubstituteText - jr .jp_stdbattletextbox + ld a, [wEnemyGoesFirst] + cp $1 + jr z, .switch_fail -.too_weak_to_sub - call CheckUserIsCharging - call nz, BattleCommand_RaiseSub - ld hl, TooWeakSubText -.jp_stdbattletextbox - jp StdBattleTextBox + call UpdateBattleMonInParty + ld a, $1 + ld [wKickCounter], a + call AnimateCurrentMove + ld c, 20 + call DelayFrames + hlcoord 9, 7 + lb bc, 5, 11 + call ClearBox + ld c, 20 + call DelayFrames + ld a, [PartyCount] + ld b, a + ld a, [CurBattleMon] + ld c, a +.random_loop_trainer_playeristarget + call BattleRandom + and $7 + cp b + jr nc, .random_loop_trainer_playeristarget -; 36f0b + cp c + jr z, .random_loop_trainer_playeristarget -BattleCommand_RechargeNextTurn: ; 36f0b -; rechargenextturn - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVarAddr - set SUBSTATUS_RECHARGE, [hl] - ret + push af + push bc + ld hl, PartyMon1HP + call GetPartyLocation + ld a, [hli] + or [hl] + pop bc + pop de + jr z, .random_loop_trainer_playeristarget -; 36f13 + ld a, d + ld [CurPartyMon], a + ld hl, SwitchPlayerMon + call CallBattleCore + ld hl, DraggedOutText + call StdBattleTextBox -EndRechargeOpp: ; 36f13 - push hl - ld a, BATTLE_VARS_SUBSTATUS4_OPP - call GetBattleVarAddr - res SUBSTATUS_RECHARGE, [hl] - pop hl - ret + ld hl, SpikesDamage + jp CallBattleCore -; 36f1d +.fail + call BattleCommand_LowerSub + call BattleCommand_MoveDelay + call BattleCommand_RaiseSub + jp PrintButItFailed +.succeed + push af + call SetBattleDraw + ld a, $1 + ld [wKickCounter], a + call AnimateCurrentMove + ld c, 20 + call DelayFrames + pop af -BattleCommand_Rage: ; 36f1d -; rage - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVarAddr - set SUBSTATUS_RAGE, [hl] - ret + ld hl, FledInFearText + cp ROAR + jr z, .do_text + ld hl, BlownAwayText +.do_text + jp StdBattleTextBox -; 36f25 +; 36994 -BattleCommand_DoubleFlyingDamage: ; 36f25 -; doubleflyingdamage - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVar - bit SUBSTATUS_FLYING, a - ret z - jr DoubleDamage +CheckPlayerHasMonToSwitchTo: ; 36994 + ld a, [PartyCount] + ld d, a + ld e, 0 + ld bc, PARTYMON_STRUCT_LENGTH +.loop + ld a, [CurBattleMon] + cp e + jr z, .next -; 36f2f + ld a, e + ld hl, PartyMon1HP + call AddNTimes + ld a, [hli] + or [hl] + jr nz, .not_fainted +.next + inc e + dec d + jr nz, .loop -BattleCommand_DoubleUndergroundDamage: ; 36f2f -; doubleundergrounddamage - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVar - bit SUBSTATUS_UNDERGROUND, a - ret z + scf + ret - ; fallthrough -; 36f37 +.not_fainted + and a + ret +; 369b6 -DoubleDamage: ; 36f37 - ld hl, CurDamage + 1 - sla [hl] - dec hl - rl [hl] - jr nc, .quit - ld a, $ff - ld [hli], a - ld [hl], a -.quit - ret +BattleCommand_EndLoop: ; 369b6 +; endloop -; 36f46 +; Loop back to the command before 'critical'. + ld de, PlayerRolloutCount + ld bc, PlayerDamageTaken + ld a, [hBattleTurn] + and a + jr z, .got_addrs + ld de, EnemyRolloutCount + ld bc, EnemyDamageTaken +.got_addrs -BattleCommand_Mimic: ; 36f46 -; mimic + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarAddr + bit SUBSTATUS_IN_LOOP, [hl] + jp nz, .in_loop + set SUBSTATUS_IN_LOOP, [hl] + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVarAddr + ld a, [hl] + cp EFFECT_POISON_MULTI_HIT + jr z, .twineedle + cp EFFECT_DOUBLE_HIT + ld a, 1 + jr z, .double_hit + ld a, [hl] + cp EFFECT_BEAT_UP + jr z, .beat_up + cp EFFECT_TRIPLE_KICK + jr nz, .not_triple_kick +.reject_triple_kick_sample + call BattleRandom + and $3 + jr z, .reject_triple_kick_sample + dec a + jr nz, .double_hit + ld a, 1 + ld [bc], a + jr .done_loop - call ClearLastMove - call BattleCommand_MoveDelay - ld a, [AttackMissed] - and a - jr nz, .fail - ld hl, BattleMonMoves +.beat_up ld a, [hBattleTurn] and a - jr z, .player_turn - ld hl, EnemyMonMoves -.player_turn - call CheckHiddenOpponent - jr nz, .fail - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - and a - jr z, .fail - cp STRUGGLE - jr z, .fail - ld b, a - ld c, NUM_MOVES -.check_already_knows_move - ld a, [hli] - cp b - jr z, .fail - dec c - jr nz, .check_already_knows_move - dec hl -.find_mimic - ld a, [hld] - cp MIMIC - jr nz, .find_mimic - inc hl - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - ld [hl], a - ld [wNamedObjectIndexBuffer], a - ld bc, BattleMonPP - BattleMonMoves - add hl, bc - ld [hl], 5 - call GetMoveName - call AnimateCurrentMove - ld hl, LearnedMoveText - jp StdBattleTextBox + jr nz, .check_ot_beat_up + ld a, [PartyCount] + cp 1 + jp z, .only_one_beatup + dec a + jr .double_hit -.fail - jp FailMimic +.check_ot_beat_up + ld a, [wBattleMode] + cp WILD_BATTLE + jp z, .only_one_beatup + ld a, [OTPartyCount] + cp 1 + jp z, .only_one_beatup + dec a + jr .double_hit + +.only_one_beatup + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarAddr + res SUBSTATUS_IN_LOOP, [hl] + call BattleCommanda8 + jp EndMoveEffect -; 36f9d +.not_triple_kick + call BattleRandom + and $3 + cp 2 + jr c, .got_number_hits + call BattleRandom + and $3 +.got_number_hits + inc a +.double_hit + ld [de], a + inc a + ld [bc], a + jr .loop_back_to_critical +.twineedle + ld a, 1 + jr .double_hit -BattleCommand_LeechSeed: ; 36f9d -; leechseed - ld a, [AttackMissed] - and a - jr nz, .evaded - call CheckSubstituteOpp - jr nz, .evaded +.in_loop + ld a, [de] + dec a + ld [de], a + jr nz, .loop_back_to_critical +.done_loop + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarAddr + res SUBSTATUS_IN_LOOP, [hl] - ld de, EnemyMonType1 + ld hl, PlayerHitTimesText ld a, [hBattleTurn] and a - jr z, .ok - ld de, BattleMonType1 -.ok + jr z, .got_hit_n_times_text + ld hl, EnemyHitTimesText +.got_hit_n_times_text - ld a, [de] - cp GRASS - jr z, .grass - inc de - ld a, [de] - cp GRASS - jr z, .grass + push bc + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVar + cp EFFECT_BEAT_UP + jr z, .beat_up_2 + call StdBattleTextBox +.beat_up_2 - ld a, BATTLE_VARS_SUBSTATUS4_OPP - call GetBattleVarAddr - bit SUBSTATUS_LEECH_SEED, [hl] - jr nz, .evaded - set SUBSTATUS_LEECH_SEED, [hl] - call AnimateCurrentMove - ld hl, WasSeededText - jp StdBattleTextBox + pop bc + xor a + ld [bc], a + ret -.grass - call AnimateFailedMove - jp PrintDoesntAffect +; Loop back to the command before 'critical'. +.loop_back_to_critical + ld a, [BattleScriptBufferAddress + 1] + ld h, a + ld a, [BattleScriptBufferAddress] + ld l, a +.not_critical + ld a, [hld] + cp critical_command + jr nz, .not_critical + inc hl + ld a, h + ld [BattleScriptBufferAddress + 1], a + ld a, l + ld [BattleScriptBufferAddress], a + ret -.evaded - call AnimateFailedMove - ld hl, EvadedText - jp StdBattleTextBox +; 36a82 -; 36fe1 +BattleCommand_FakeOut: ; 36a82 + ld a, [AttackMissed] + and a + ret nz -BattleCommand_Splash: ; 36fe1 - call AnimateCurrentMove - farcall StubbedTrainerRankings_Splash - jp PrintNothingHappened + call CheckSubstituteOpp + jr nz, .fail -; 36fed + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVar + and 1 << FRZ | SLP + jr nz, .fail + call CheckOpponentWentFirst + jr z, FlinchTarget -BattleCommand_Disable: ; 36fed -; disable +.fail + ld a, 1 + ld [AttackMissed], a + ret - ld a, [AttackMissed] - and a - jr nz, .failed +; 36aa0 - ld de, EnemyDisableCount - ld hl, EnemyMonMoves - ld a, [hBattleTurn] - and a - jr z, .got_moves - ld de, PlayerDisableCount - ld hl, BattleMonMoves -.got_moves - ld a, [de] - and a - jr nz, .failed +BattleCommand_FlinchTarget: ; 36aa0 + call CheckSubstituteOpp + ret nz - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP + ld a, BATTLE_VARS_STATUS_OPP call GetBattleVar - and a - jr z, .failed - cp STRUGGLE - jr z, .failed + and 1 << FRZ | SLP + ret nz - ld b, a - ld c, $ff -.loop - inc c - ld a, [hli] - cp b - jr nz, .loop + call CheckOpponentWentFirst + ret nz - ld a, [hBattleTurn] - and a - ld hl, EnemyMonPP - jr z, .got_pp - ld hl, BattleMonPP -.got_pp - ld b, 0 - add hl, bc - ld a, [hl] - and a - jr z, .failed -.loop2 - call BattleRandom - and 7 - jr z, .loop2 - inc a - inc c - swap c - add c - ld [de], a - call AnimateCurrentMove - ld hl, DisabledMove - ld a, [hBattleTurn] + ld a, [EffectFailed] and a - jr nz, .got_disabled_move_pointer - inc hl -.got_disabled_move_pointer - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - ld [hl], a - ld [wNamedObjectIndexBuffer], a - call GetMoveName - ld hl, WasDisabledText - jp StdBattleTextBox - -.failed - jp FailDisable + ret nz -; 3705c + ; fallthrough +; 36ab5 -BattleCommand_PayDay: ; 3705c -; payday +FlinchTarget: ; 36ab5 + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVarAddr + set SUBSTATUS_FLINCHED, [hl] + jp EndRechargeOpp - xor a - ld hl, StringBuffer1 - ld [hli], a +; 36abf - ld a, [hBattleTurn] - and a - ld a, [BattleMonLevel] - jr z, .ok - ld a, [EnemyMonLevel] -.ok - add a - ld hl, wPayDayMoney + 2 - add [hl] - ld [hld], a - jr nc, .done - inc [hl] - dec hl - jr nz, .done - inc [hl] -.done - ld hl, CoinsScatteredText - jp StdBattleTextBox +CheckOpponentWentFirst: ; 36abf +; Returns a=0, z if user went first +; Returns a=1, nz if opponent went first + push bc + ld a, [wEnemyGoesFirst] ; 0 if player went first + ld b, a + ld a, [hBattleTurn] ; 0 if it's the player's turn + xor b ; 1 if opponent went first + pop bc + ret -; 3707f +; 36ac9 -BattleCommand_Conversion: ; 3707f -; conversion +BattleCommand_HeldFlinch: ; 36ac9 +; kingsrock - ld hl, BattleMonMoves - ld de, BattleMonType1 - ld a, [hBattleTurn] - and a - jr z, .got_moves - ld hl, EnemyMonMoves - ld de, EnemyMonType1 -.got_moves - push de - ld c, 0 - ld de, StringBuffer1 -.loop - push hl - ld b, 0 - add hl, bc - ld a, [hl] - pop hl + ld a, [AttackMissed] and a - jr z, .okay - push hl - push bc - dec a - ld hl, Moves + MOVE_TYPE - call GetMoveAttr - ld [de], a - inc de - pop bc - pop hl - inc c - ld a, c - cp NUM_MOVES - jr c, .loop -.okay - ld a, $ff - ld [de], a - inc de - ld [de], a - inc de - ld [de], a - pop de - ld hl, StringBuffer1 -.loop2 - ld a, [hl] - cp -1 - jr z, .fail - cp CURSE_T - jr z, .next - ld a, [de] - cp [hl] - jr z, .next - inc de - ld a, [de] - dec de - cp [hl] - jr nz, .done -.next - inc hl - jr .loop2 + ret nz -.fail - call AnimateFailedMove - jp PrintButItFailed + call GetUserItem + ld a, b + cp HELD_FLINCH + ret nz -.done -.loop3 + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVarAddr + ld d, h + ld e, l + call GetUserItem call BattleRandom - maskbits NUM_MOVES - ld c, a - ld b, 0 - ld hl, StringBuffer1 - add hl, bc - ld a, [hl] - cp -1 - jr z, .loop3 - cp CURSE_T - jr z, .loop3 - ld a, [de] - cp [hl] - jr z, .loop3 - inc de - ld a, [de] - dec de - cp [hl] - jr z, .loop3 - ld a, [hl] - ld [de], a - inc de - ld [de], a - ld [wNamedObjectIndexBuffer], a - farcall GetTypeName - call AnimateCurrentMove - ld hl, TransformedTypeText - jp StdBattleTextBox + cp c + ret nc + call EndRechargeOpp + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVarAddr + set SUBSTATUS_FLINCHED, [hl] + ret -; 3710e +; 36af3 -BattleCommand_ResetStats: ; 3710e -; resetstats +BattleCommand_OHKO: ; 36af3 +; ohko - ld a, 7 ; neutral - ld hl, PlayerStatLevels - call .Fill - ld hl, EnemyStatLevels - call .Fill + call ResetDamage + ld a, [TypeModifier] + and $7f + jr z, .no_effect + ld hl, EnemyMonLevel + ld de, BattleMonLevel + ld bc, wPlayerMoveStruct + MOVE_ACC + ld a, [hBattleTurn] + and a + jr z, .got_move_accuracy + push hl + ld h, d + ld l, e + pop de + ld bc, wEnemyMoveStruct + MOVE_ACC +.got_move_accuracy + ld a, [de] + sub [hl] + jr c, .no_effect + add a + ld e, a + ld a, [bc] + add e + jr nc, .finish_ohko + ld a, $ff +.finish_ohko + ld [bc], a + call BattleCommand_CheckHit + ld hl, CurDamage + ld a, $ff + ld [hli], a + ld [hl], a + ld a, $2 + ld [CriticalHit], a + ret + +.no_effect + ld a, $ff + ld [CriticalHit], a + ld a, $1 + ld [AttackMissed], a + ret - ld a, [hBattleTurn] - push af +; 36b3a - call SetPlayerTurn - call CalcPlayerStats - call SetEnemyTurn - call CalcEnemyStats - pop af - ld [hBattleTurn], a +BattleCommand_CheckCharge: ; 36b3a +; checkcharge - call AnimateCurrentMove + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarAddr + bit SUBSTATUS_CHARGED, [hl] + ret z + res SUBSTATUS_CHARGED, [hl] + res SUBSTATUS_UNDERGROUND, [hl] + res SUBSTATUS_FLYING, [hl] + ld b, charge_command + jp SkipToBattleCommand - ld hl, EliminatedStatsText - jp StdBattleTextBox +; 36b4d -.Fill: - ld b, PlayerStatLevelsEnd - PlayerStatLevels -.next - ld [hli], a - dec b - jr nz, .next - ret -; 3713e +BattleCommand_Charge: ; 36b4d +; charge + call BattleCommand_ClearText + ld a, BATTLE_VARS_STATUS + call GetBattleVar + and SLP + jr z, .awake -BattleCommand_Heal: ; 3713e -; heal + call BattleCommand_MoveDelay + call BattleCommand_RaiseSub + call PrintButItFailed + jp EndMoveEffect - ld de, BattleMonHP - ld hl, BattleMonMaxHP - ld a, [hBattleTurn] +.awake + ld a, BATTLE_VARS_SUBSTATUS3 + call GetBattleVarAddr + set SUBSTATUS_CHARGED, [hl] + + ld hl, IgnoredOrders2Text + ld a, [AlreadyDisobeyed] and a - jr z, .got_hp - ld de, EnemyMonHP - ld hl, EnemyMonMaxHP -.got_hp + call nz, StdBattleTextBox + + call BattleCommand_LowerSub + xor a + ld [wNumHits], a + inc a + ld [wKickCounter], a + call LoadMoveAnim ld a, BATTLE_VARS_MOVE_ANIM call GetBattleVar - ld b, a - push hl - push de - push bc - ld c, 2 - call StringCmp - pop bc - pop de - pop hl - jp z, .hp_full - ld a, b - cp REST - jr nz, .not_rest + cp FLY + jr z, .flying + cp DIG + jr z, .flying + call BattleCommand_RaiseSub + jr .not_flying - push hl - push de - push af - call BattleCommand_MoveDelay - ld a, BATTLE_VARS_SUBSTATUS5 - call GetBattleVarAddr - res SUBSTATUS_TOXIC, [hl] - ld a, BATTLE_VARS_STATUS +.flying + call DisappearUser +.not_flying + ld a, BATTLE_VARS_SUBSTATUS3 call GetBattleVarAddr - ld a, [hl] - and a - ld [hl], REST_SLEEP_TURNS + 1 - ld hl, WentToSleepText - jr z, .no_status_to_heal - ld hl, RestedText -.no_status_to_heal - call StdBattleTextBox - ld a, [hBattleTurn] - and a - jr nz, .calc_enemy_stats - call CalcPlayerStats - jr .got_stats + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVar + ld b, a + cp FLY + jr z, .set_flying + cp DIG + jr nz, .dont_set_digging + set SUBSTATUS_UNDERGROUND, [hl] + jr .dont_set_digging -.calc_enemy_stats - call CalcEnemyStats -.got_stats - pop af - pop de - pop hl +.set_flying + set SUBSTATUS_FLYING, [hl] -.not_rest - jr z, .restore_full_hp - ld hl, GetHalfMaxHP - call CallBattleCore - jr .finish +.dont_set_digging + call CheckUserIsCharging + jr nz, .mimic + ld a, BATTLE_VARS_LAST_COUNTER_MOVE + call GetBattleVarAddr + ld [hl], b + ld a, BATTLE_VARS_LAST_MOVE + call GetBattleVarAddr + ld [hl], b -.restore_full_hp - ld hl, GetMaxHP - call CallBattleCore -.finish - call AnimateCurrentMove - call BattleCommand_SwitchTurn - ld hl, RestoreHP - call CallBattleCore - call BattleCommand_SwitchTurn - call UpdateUserInParty - call RefreshBattleHuds - ld hl, RegainedHealthText - jp StdBattleTextBox +.mimic + call ResetDamage -.hp_full - call AnimateFailedMove - ld hl, HPIsFullText - jp StdBattleTextBox + ld hl, .UsedText + call BattleTextBox -; 371cd + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVar + cp EFFECT_SKULL_BASH + ld b, endturn_command + jp z, SkipToBattleCommand + jp EndMoveEffect -INCLUDE "engine/battle/effect_commands/transform.asm" +.UsedText: + text_jump UnknownText_0x1c0d0e ; "[USER]" + start_asm + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVar + cp RAZOR_WIND + ld hl, .RazorWind + jr z, .done -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 + cp SOLARBEAM + ld hl, .Solarbeam + jr z, .done -; Swap hl and de - push hl - ld h, d - ld l, e - pop de -.copy - jp CopyBytes + cp SKULL_BASH + ld hl, .SkullBash + jr z, .done -; 372d2 + cp SKY_ATTACK + ld hl, .SkyAttack + jr z, .done + cp FLY + ld hl, .Fly + jr z, .done -BattleEffect_ButItFailed: ; 372d2 - call AnimateFailedMove - jp PrintButItFailed + cp DIG + ld hl, .Dig -; 372d8 +.done + ret +.RazorWind: +; 'made a whirlwind!' + text_jump UnknownText_0x1c0d12 + db "@" -ClearLastMove: ; 372d8 - ld a, BATTLE_VARS_LAST_COUNTER_MOVE - call GetBattleVarAddr - xor a - ld [hl], a +.Solarbeam: +; 'took in sunlight!' + text_jump UnknownText_0x1c0d26 + db "@" - ld a, BATTLE_VARS_LAST_MOVE - call GetBattleVarAddr - xor a - ld [hl], a - ret +.SkullBash: +; 'lowered its head!' + text_jump UnknownText_0x1c0d3a + db "@" -; 372e7 +.SkyAttack: +; 'is glowing!' + text_jump UnknownText_0x1c0d4e + db "@" +.Fly: +; 'flew up high!' + text_jump UnknownText_0x1c0d5c + db "@" -ResetActorDisable: ; 372e7 - ld a, [hBattleTurn] - and a - jr z, .player +.Dig: +; 'dug a hole!' + text_jump UnknownText_0x1c0d6c + db "@" +; 36c2c - xor a - ld [EnemyDisableCount], a - ld [EnemyDisabledMove], a - ret -.player - xor a - ld [PlayerDisableCount], a - ld [DisabledMove], a +BattleCommand3c: ; 36c2c +; unused ret -; 372fc +; 36c2d -BattleCommand_Screen: ; 372fc -; screen +BattleCommand_TrapTarget: ; 36c2d +; traptarget - ld hl, PlayerScreens - ld bc, PlayerLightScreenCount + ld a, [AttackMissed] + and a + ret nz + ld hl, wEnemyWrapCount + ld de, wEnemyTrappingMove ld a, [hBattleTurn] and a - jr z, .got_screens_pointer - ld hl, EnemyScreens - ld bc, EnemyLightScreenCount + jr z, .got_trap + ld hl, wPlayerWrapCount + ld de, wPlayerTrappingMove -.got_screens_pointer - ld a, BATTLE_VARS_MOVE_EFFECT +.got_trap + ld a, [hl] + and a + ret nz + ld a, BATTLE_VARS_SUBSTATUS4_OPP call GetBattleVar - cp EFFECT_LIGHT_SCREEN - jr nz, .Reflect - - bit SCREENS_LIGHT_SCREEN, [hl] - jr nz, .failed - set SCREENS_LIGHT_SCREEN, [hl] - ld a, 5 - ld [bc], a - ld hl, LightScreenEffectText - jr .good - -.Reflect: - bit SCREENS_REFLECT, [hl] - jr nz, .failed - set SCREENS_REFLECT, [hl] - - ; LightScreenCount -> ReflectCount - inc bc + bit SUBSTATUS_SUBSTITUTE, a + ret nz + call BattleRandom + ; trapped for 2-5 turns + and %11 + inc a + inc a + inc a + ld [hl], a + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVar + ld [de], a + ld b, a + ld hl, .Traps - ld a, 5 - ld [bc], a - ld hl, ReflectEffectText +.find_trap_text + ld a, [hli] + cp b + jr z, .found_trap_text + inc hl + inc hl + jr .find_trap_text -.good - call AnimateCurrentMove +.found_trap_text + ld a, [hli] + ld h, [hl] + ld l, a jp StdBattleTextBox -.failed - call AnimateFailedMove - jp PrintButItFailed +.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 -; 3733d +INCLUDE "engine/battle/move_effects/mist.asm" -PrintDoesntAffect: ; 3733d -; 'it doesn't affect' - ld hl, DoesntAffectText - jp StdBattleTextBox +INCLUDE "engine/battle/move_effects/focus_energy.asm" -; 37343 +BattleCommand_Recoil: ; 36cb2 +; recoil -PrintNothingHappened: ; 37343 -; 'but nothing happened!' - ld hl, NothingHappenedText + ld hl, BattleMonMaxHP + ld a, [hBattleTurn] + and a + jr z, .got_hp + ld hl, EnemyMonMaxHP +.got_hp + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVar + ld d, a +; get 1/4 damage or 1 HP, whichever is higher + ld a, [CurDamage] + ld b, a + ld a, [CurDamage + 1] + ld c, a + srl b + rr c + srl b + rr c + ld a, b + or c + jr nz, .min_damage + inc c +.min_damage + ld a, [hli] + ld [Buffer2], a + ld a, [hl] + ld [Buffer1], a + dec hl + dec hl + ld a, [hl] + ld [Buffer3], a + sub c + ld [hld], a + ld [Buffer5], a + ld a, [hl] + ld [Buffer4], a + sbc b + ld [hl], a + ld [Buffer6], a + jr nc, .dont_ko + xor a + ld [hli], a + ld [hl], a + ld hl, Buffer5 + ld [hli], a + ld [hl], a +.dont_ko + hlcoord 10, 9 + ld a, [hBattleTurn] + and a + ld a, 1 + jr z, .animate_hp_bar + hlcoord 2, 2 + xor a +.animate_hp_bar + ld [wWhichHPBar], a + predef AnimateHPBar + call RefreshBattleHuds + ld hl, RecoilText jp StdBattleTextBox -; 37349 +; 36d1d -TryPrintButItFailed: ; 37349 - ld a, [AlreadyFailed] +BattleCommand_ConfuseTarget: ; 36d1d +; confusetarget + + call GetOpponentItem + ld a, b + cp HELD_PREVENT_CONFUSE + ret z + ld a, [EffectFailed] and a ret nz + call SafeCheckSafeguard + ret nz + call CheckSubstituteOpp + ret nz + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVarAddr + bit SUBSTATUS_CONFUSED, [hl] + ret nz + jr BattleCommand_FinishConfusingTarget - ; fallthrough -; 3734e +BattleCommand_Confuse: ; 36d3b +; confuse -PrintButItFailed: ; 3734e -; 'but it failed!' - ld hl, ButItFailedText + call GetOpponentItem + ld a, b + cp HELD_PREVENT_CONFUSE + jr nz, .no_item_protection + ld a, [hl] + ld [wNamedObjectIndexBuffer], a + call GetItemName + call AnimateFailedMove + ld hl, ProtectedByText jp StdBattleTextBox -; 37354 +.no_item_protection + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVarAddr + bit SUBSTATUS_CONFUSED, [hl] + jr z, .not_already_confused + call AnimateFailedMove + ld hl, AlreadyConfusedText + jp StdBattleTextBox +.not_already_confused + call CheckSubstituteOpp + jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit + ld a, [AttackMissed] + and a + jr nz, BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit +BattleCommand_FinishConfusingTarget: ; 36d70 + ld bc, EnemyConfuseCount + ld a, [hBattleTurn] + and a + jr z, .got_confuse_count + ld bc, PlayerConfuseCount -FailSnore: -FailDisable: -FailConversion2: -FailAttract: -FailForesight: -FailSpikes: - call AnimateFailedMove - ; fallthrough -; 37357 +.got_confuse_count + set SUBSTATUS_CONFUSED, [hl] + ; confused for 2-5 turns + call BattleRandom + and %11 + inc a + inc a + ld [bc], a -FailMimic: ; 37357 - ld hl, ButItFailedText ; 'but it failed!' - ld de, ItFailedText ; 'it failed!' - jp FailText_CheckOpponentProtect + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVar + cp EFFECT_CONFUSE_HIT + jr z, .got_effect + cp EFFECT_SNORE + jr z, .got_effect + cp EFFECT_SWAGGER + jr z, .got_effect + call AnimateCurrentMove + +.got_effect + ld de, ANIM_CONFUSED + call PlayOpponentBattleAnim + + ld hl, BecameConfusedText + call StdBattleTextBox + + call GetOpponentItem + ld a, b + cp HELD_HEAL_STATUS + jr z, .heal_confusion + cp HELD_HEAL_CONFUSION + ret nz +.heal_confusion + ld hl, UseConfusionHealingItem + jp CallBattleCore -; 37360 +; 36db6 +BattleCommand_Confuse_CheckSnore_Swagger_ConfuseHit: ; 36db6 + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVar + cp EFFECT_CONFUSE_HIT + ret z + cp EFFECT_SNORE + ret z + cp EFFECT_SWAGGER + ret z + jp PrintDidntAffect2 -PrintDidntAffect: ; 37360 -; 'it didn't affect' - ld hl, DidntAffect1Text - jp StdBattleTextBox +; 36dc7 -; 37366 +BattleCommand_Paralyze: ; 36dc7 +; paralyze -PrintDidntAffect2: ; 37366 + ld a, BATTLE_VARS_STATUS_OPP + call GetBattleVar + bit PAR, a + jr nz, .paralyzed + ld a, [TypeModifier] + and $7f + jr z, .didnt_affect + call GetOpponentItem + ld a, b + cp HELD_PREVENT_PARALYZE + jr nz, .no_item_protection + ld a, [hl] + ld [wNamedObjectIndexBuffer], a + call GetItemName call AnimateFailedMove - ld hl, DidntAffect1Text ; 'it didn't affect' - ld de, DidntAffect2Text ; 'it didn't affect' - jp FailText_CheckOpponentProtect - -; 37372 - - -PrintParalyze: ; 37372 -; 'paralyzed! maybe it can't attack!' - ld hl, ParalyzedText + ld hl, ProtectedByText jp StdBattleTextBox -; 37378 +.no_item_protection + ld a, [hBattleTurn] + and a + jr z, .dont_sample_failure + ld a, [wLinkMode] + and a + jr nz, .dont_sample_failure -CheckSubstituteOpp: ; 37378 - ld a, BATTLE_VARS_SUBSTATUS4_OPP - call GetBattleVar - bit SUBSTATUS_SUBSTITUTE, a - ret + ld a, [InBattleTowerBattle] + and a + jr nz, .dont_sample_failure -; 37380 + ld a, [PlayerSubStatus5] + bit SUBSTATUS_LOCK_ON, a + jr nz, .dont_sample_failure + call BattleRandom + cp 1 + 25 percent + jr c, .failed -BattleCommand_Selfdestruct: ; 37380 - farcall StubbedTrainerRankings_Selfdestruct - ld a, BATTLEANIM_PLAYER_DAMAGE - ld [wNumHits], a - ld c, 3 - call DelayFrames - ld a, BATTLE_VARS_STATUS +.dont_sample_failure + ld a, BATTLE_VARS_STATUS_OPP call GetBattleVarAddr - xor a - ld [hli], a - inc hl - ld [hli], a - ld [hl], a + and a + jr nz, .failed + ld a, [AttackMissed] + and a + jr nz, .failed + call CheckSubstituteOpp + jr nz, .failed + ld c, 30 + call DelayFrames + call AnimateCurrentMove ld a, $1 - ld [wKickCounter], a - call BattleCommand_LowerSub - call LoadMoveAnim - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVarAddr - res SUBSTATUS_LEECH_SEED, [hl] - ld a, BATTLE_VARS_SUBSTATUS5_OPP + ld [hBGMapMode], a + ld a, BATTLE_VARS_STATUS_OPP call GetBattleVarAddr - res SUBSTATUS_DESTINY_BOND, [hl] - call _CheckBattleScene - ret nc - farcall DrawPlayerHUD - farcall DrawEnemyHUD - call WaitBGMap - jp RefreshBattleHuds + set PAR, [hl] + call UpdateOpponentInParty + ld hl, ApplyPrzEffectOnSpeed + call CallBattleCore + call UpdateBattleHuds + call PrintParalyze + ld hl, UseHeldStatusHealingItem + jp CallBattleCore -; 373c9 +.paralyzed + call AnimateFailedMove + ld hl, AlreadyParalyzedText + jp StdBattleTextBox +.failed + jp PrintDidntAffect2 -INCLUDE "engine/battle/effect_commands/mirror_move.asm" +.didnt_affect + call AnimateFailedMove + jp PrintDoesntAffect -INCLUDE "engine/battle/effect_commands/metronome.asm" +; 36e5b -CheckUserMove: ; 37462 -; Return z if the user has move a. - ld b, a - ld de, BattleMonMoves +CheckMoveTypeMatchesTarget: ; 36e5b +; Compare move type to opponent type. +; Return z if matching the opponent type, +; unless the move is Normal (Tri Attack). + + push hl + + ld hl, EnemyMonType1 ld a, [hBattleTurn] and a jr z, .ok - ld de, EnemyMonMoves + ld hl, BattleMonType1 .ok - ld c, NUM_MOVES -.loop - ld a, [de] - inc de - cp b - ret z - - dec c - jr nz, .loop + ld a, BATTLE_VARS_MOVE_TYPE + call GetBattleVar + cp NORMAL + jr z, .normal - ld a, 1 - and a - ret + cp [hl] + jr z, .return -; 3747b + inc hl + cp [hl] +.return + pop hl + ret -ResetTurn: ; 3747b - ld hl, wPlayerCharging - ld a, [hBattleTurn] +.normal + ld a, 1 and a - jr z, .player - ld hl, wEnemyCharging + pop hl + ret -.player - ld [hl], 1 - xor a - ld [AlreadyDisobeyed], a - call DoMove - jp EndMoveEffect +; 36e7c -; 37492 +INCLUDE "engine/battle/move_effects/substitute.asm" -INCLUDE "engine/battle/effect_commands/thief.asm" +BattleCommand_RechargeNextTurn: ; 36f0b +; rechargenextturn + ld a, BATTLE_VARS_SUBSTATUS4 + call GetBattleVarAddr + set SUBSTATUS_RECHARGE, [hl] + ret -BattleCommand_ArenaTrap: ; 37517 -; arenatrap +; 36f13 -; Doesn't work on an absent opponent. - call CheckHiddenOpponent - jr nz, .failed +EndRechargeOpp: ; 36f13 + push hl + ld a, BATTLE_VARS_SUBSTATUS4_OPP + call GetBattleVarAddr + res SUBSTATUS_RECHARGE, [hl] + pop hl + ret -; Don't trap if the opponent is already trapped. +; 36f1d - ld a, BATTLE_VARS_SUBSTATUS5 - call GetBattleVarAddr - bit SUBSTATUS_CANT_RUN, [hl] - jr nz, .failed -; Otherwise trap the opponent. +INCLUDE "engine/battle/move_effects/rage.asm" - set SUBSTATUS_CANT_RUN, [hl] - call AnimateCurrentMove - ld hl, CantEscapeNowText - jp StdBattleTextBox -.failed - call AnimateFailedMove - jp PrintButItFailed +BattleCommand_DoubleFlyingDamage: ; 36f25 +; doubleflyingdamage + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVar + bit SUBSTATUS_FLYING, a + ret z + jr DoubleDamage -; 37536 +; 36f2f -INCLUDE "engine/battle/effect_commands/nightmare.asm" +BattleCommand_DoubleUndergroundDamage: ; 36f2f +; doubleundergrounddamage + ld a, BATTLE_VARS_SUBSTATUS3_OPP + call GetBattleVar + bit SUBSTATUS_UNDERGROUND, a + ret z + ; fallthrough +; 36f37 -BattleCommand_Defrost: ; 37563 -; defrost -; Thaw the user. +DoubleDamage: ; 36f37 + ld hl, CurDamage + 1 + sla [hl] + dec hl + rl [hl] + jr nc, .quit - ld a, BATTLE_VARS_STATUS - call GetBattleVarAddr - bit FRZ, [hl] - ret z - res FRZ, [hl] + ld a, $ff + ld [hli], a + ld [hl], a +.quit + ret -; Don't update the enemy's party struct in a wild battle. +; 36f46 - ld a, [hBattleTurn] - and a - jr z, .party - ld a, [wBattleMode] - dec a - jr z, .done +INCLUDE "engine/battle/move_effects/mimic.asm" -.party - ld a, MON_STATUS - call UserPartyAttr - res FRZ, [hl] +INCLUDE "engine/battle/move_effects/leech_seed.asm" -.done - call RefreshBattleHuds - ld hl, WasDefrostedText - jp StdBattleTextBox +INCLUDE "engine/battle/move_effects/splash.asm" -; 37588 +INCLUDE "engine/battle/move_effects/disable.asm" +INCLUDE "engine/battle/move_effects/pay_day.asm" -INCLUDE "engine/battle/effect_commands/curse.asm" +INCLUDE "engine/battle/move_effects/conversion.asm" -INCLUDE "engine/battle/effect_commands/protect.asm" -INCLUDE "engine/battle/effect_commands/endure.asm" +BattleCommand_ResetStats: ; 3710e +; resetstats -INCLUDE "engine/battle/effect_commands/spikes.asm" + ld a, 7 ; neutral + ld hl, PlayerStatLevels + call .Fill + ld hl, EnemyStatLevels + call .Fill -INCLUDE "engine/battle/effect_commands/foresight.asm" + ld a, [hBattleTurn] + push af -INCLUDE "engine/battle/effect_commands/perish_song.asm" + call SetPlayerTurn + call CalcPlayerStats + call SetEnemyTurn + call CalcEnemyStats -INCLUDE "engine/battle/effect_commands/sandstorm.asm" + pop af + ld [hBattleTurn], a -INCLUDE "engine/battle/effect_commands/rollout.asm" + call AnimateCurrentMove + ld hl, EliminatedStatsText + jp StdBattleTextBox -BattleCommand5d: ; 37791 -; unused +.Fill: + ld b, PlayerStatLevelsEnd - PlayerStatLevels +.next + ld [hli], a + dec b + jr nz, .next ret -; 37792 +; 3713e -BattleCommand_FuryCutter: ; 37792 -; furycutter +BattleCommand_Heal: ; 3713e +; heal - ld hl, PlayerFuryCutterCount + ld de, BattleMonHP + ld hl, BattleMonMaxHP ld a, [hBattleTurn] and a - jr z, .go - ld hl, EnemyFuryCutterCount + jr z, .got_hp + ld de, EnemyMonHP + ld hl, EnemyMonMaxHP +.got_hp + ld a, BATTLE_VARS_MOVE_ANIM + call GetBattleVar + ld b, a + push hl + push de + push bc + ld c, 2 + call StringCmp + pop bc + pop de + pop hl + jp z, .hp_full + ld a, b + cp REST + jr nz, .not_rest -.go - ld a, [AttackMissed] + push hl + push de + push af + call BattleCommand_MoveDelay + ld a, BATTLE_VARS_SUBSTATUS5 + call GetBattleVarAddr + res SUBSTATUS_TOXIC, [hl] + ld a, BATTLE_VARS_STATUS + call GetBattleVarAddr + ld a, [hl] and a - jp nz, ResetFuryCutterCount - - inc [hl] + ld [hl], REST_SLEEP_TURNS + 1 + ld hl, WentToSleepText + jr z, .no_status_to_heal + ld hl, RestedText +.no_status_to_heal + call StdBattleTextBox + ld a, [hBattleTurn] + and a + jr nz, .calc_enemy_stats + call CalcPlayerStats + jr .got_stats -; Damage capped at 5 turns' worth (16x). - ld a, [hl] - ld b, a - cp 6 - jr c, .checkdouble - ld b, 5 +.calc_enemy_stats + call CalcEnemyStats +.got_stats + pop af + pop de + pop hl -.checkdouble - dec b - ret z +.not_rest + jr z, .restore_full_hp + ld hl, GetHalfMaxHP + call CallBattleCore + jr .finish -; Double the damage - ld hl, CurDamage + 1 - sla [hl] - dec hl - rl [hl] - jr nc, .checkdouble +.restore_full_hp + ld hl, GetMaxHP + call CallBattleCore +.finish + call AnimateCurrentMove + call BattleCommand_SwitchTurn + ld hl, RestoreHP + call CallBattleCore + call BattleCommand_SwitchTurn + call UpdateUserInParty + call RefreshBattleHuds + ld hl, RegainedHealthText + jp StdBattleTextBox -; No overflow - ld a, $ff - ld [hli], a - ld [hl], a - ret +.hp_full + call AnimateFailedMove + ld hl, HPIsFullText + jp StdBattleTextBox -; 377be +; 371cd -ResetFuryCutterCount: ; 377be +INCLUDE "engine/battle/move_effects/transform.asm" - push hl - ld hl, PlayerFuryCutterCount +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, .reset - ld hl, EnemyFuryCutterCount + jr z, .copy -.reset - xor a - ld [hl], a +; Swap hl and de + push hl + ld h, d + ld l, e + pop de +.copy + jp CopyBytes - pop hl - ret +; 372d2 -; 377ce +BattleEffect_ButItFailed: ; 372d2 + call AnimateFailedMove + jp PrintButItFailed -INCLUDE "engine/battle/effect_commands/attract.asm" +; 372d8 -BattleCommand_HappinessPower: ; 3784b -; happinesspower - push bc - ld hl, BattleMonHappiness - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, EnemyMonHappiness -.ok - xor a - ld [hMultiplicand + 0], a - ld [hMultiplicand + 1], a - ld a, [hl] - ld [hMultiplicand + 2], a - ld a, 10 - ld [hMultiplier], a - call Multiply - ld a, 25 - ld [hDivisor], a - ld b, 4 - call Divide - ld a, [hQuotient + 2] - ld d, a - pop bc - ret -; 37874 +ClearLastMove: ; 372d8 + ld a, BATTLE_VARS_LAST_COUNTER_MOVE + call GetBattleVarAddr + xor a + ld [hl], a + ld a, BATTLE_VARS_LAST_MOVE + call GetBattleVarAddr + xor a + ld [hl], a + ret -INCLUDE "engine/battle/effect_commands/present.asm" +; 372e7 -BattleCommand_FrustrationPower: ; 3790e -; frustrationpower - push bc - ld hl, BattleMonHappiness +ResetActorDisable: ; 372e7 ld a, [hBattleTurn] and a - jr z, .got_happiness - ld hl, EnemyMonHappiness -.got_happiness - ld a, $ff - sub [hl] - ld [hMultiplicand + 2], a + jr z, .player + xor a - ld [hMultiplicand + 0], a - ld [hMultiplicand + 1], a - ld a, 10 - ld [hMultiplier], a - call Multiply - ld a, 25 - ld [hDivisor], a - ld b, 4 - call Divide - ld a, [hQuotient + 2] - ld d, a - pop bc + ld [EnemyDisableCount], a + ld [EnemyDisabledMove], a ret -; 37939 +.player + xor a + ld [PlayerDisableCount], a + ld [DisabledMove], a + ret + +; 372fc -BattleCommand_Safeguard: ; 37939 -; safeguard +BattleCommand_Screen: ; 372fc +; screen ld hl, PlayerScreens - ld de, PlayerSafeguardCount + ld bc, PlayerLightScreenCount ld a, [hBattleTurn] and a - jr z, .ok + jr z, .got_screens_pointer ld hl, EnemyScreens - ld de, EnemySafeguardCount -.ok - bit SCREENS_SAFEGUARD, [hl] + ld bc, EnemyLightScreenCount + +.got_screens_pointer + ld a, BATTLE_VARS_MOVE_EFFECT + call GetBattleVar + cp EFFECT_LIGHT_SCREEN + jr nz, .Reflect + + bit SCREENS_LIGHT_SCREEN, [hl] + jr nz, .failed + set SCREENS_LIGHT_SCREEN, [hl] + ld a, 5 + ld [bc], a + ld hl, LightScreenEffectText + jr .good + +.Reflect: + bit SCREENS_REFLECT, [hl] jr nz, .failed - set SCREENS_SAFEGUARD, [hl] + set SCREENS_REFLECT, [hl] + + ; LightScreenCount -> ReflectCount + inc bc + ld a, 5 - ld [de], a + ld [bc], a + ld hl, ReflectEffectText + +.good call AnimateCurrentMove - ld hl, CoveredByVeilText jp StdBattleTextBox .failed call AnimateFailedMove jp PrintButItFailed -; 37962 - - -SafeCheckSafeguard: ; 37962 - push hl - ld hl, EnemyScreens - ld a, [hBattleTurn] - and a - jr z, .got_turn - ld hl, PlayerScreens - -.got_turn - bit SCREENS_SAFEGUARD, [hl] - pop hl - ret +; 3733d -; 37972 +PrintDoesntAffect: ; 3733d +; 'it doesn't affect' + ld hl, DoesntAffectText + jp StdBattleTextBox -BattleCommand_CheckSafeguard: ; 37972 -; checksafeguard - ld hl, EnemyScreens - ld a, [hBattleTurn] - and a - jr z, .got_turn - ld hl, PlayerScreens -.got_turn - bit SCREENS_SAFEGUARD, [hl] - ret z - ld a, 1 - ld [AttackMissed], a - call BattleCommand_MoveDelay - ld hl, SafeguardProtectText - call StdBattleTextBox - jp EndMoveEffect +; 37343 -; 37991 +PrintNothingHappened: ; 37343 +; 'but nothing happened!' + ld hl, NothingHappenedText + jp StdBattleTextBox -BattleCommand_GetMagnitude: ; 37991 -; getmagnitude +; 37349 - push bc - call BattleRandom - ld b, a - ld hl, MagnitudePower -.loop - ld a, [hli] - cp b - jr nc, .ok - inc hl - inc hl - jr .loop -.ok - ld d, [hl] - push de - inc hl - ld a, [hl] - ld [wTypeMatchup], a - call BattleCommand_MoveDelay - ld hl, MagnitudeText - call StdBattleTextBox - pop de - pop bc - ret +TryPrintButItFailed: ; 37349 + ld a, [AlreadyFailed] + and a + ret nz -INCLUDE "data/moves/magnitude_power.asm" + ; fallthrough +; 3734e -BattleCommand_BatonPass: ; 379c9 -; batonpass +PrintButItFailed: ; 3734e +; 'but it failed!' + ld hl, ButItFailedText + jp StdBattleTextBox - ld a, [hBattleTurn] - and a - jp nz, .Enemy +; 37354 -; Need something to switch to - call CheckAnyOtherAlivePartyMons - jp z, FailedBatonPass +FailMove: + call AnimateFailedMove + ; fallthrough +; 37357 - call UpdateBattleMonInParty - call AnimateCurrentMove +FailMimic: ; 37357 + ld hl, ButItFailedText ; 'but it failed!' + ld de, ItFailedText ; 'it failed!' + jp FailText_CheckOpponentProtect - ld c, 50 - call DelayFrames +; 37360 -; Transition into switchmon menu - call LoadStandardMenuHeader - farcall SetUpBattlePartyMenu_NoLoop - farcall ForcePickSwitchMonInBattle +PrintDidntAffect: ; 37360 +; 'it didn't affect' + ld hl, DidntAffect1Text + jp StdBattleTextBox -; Return to battle scene - call ClearPalettes - farcall _LoadBattleFontsHPBar - call CloseWindow - call ClearSprites - hlcoord 1, 0 - lb bc, 4, 10 - call ClearBox - ld b, SCGB_BATTLE_COLORS - call GetSGBLayout - call SetPalettes - call BatonPass_LinkPlayerSwitch +; 37366 -; Mobile link battles handle entrances differently - farcall CheckMobileBattleError - jp c, EndMoveEffect - ld hl, PassedBattleMonEntrance - call CallBattleCore +PrintDidntAffect2: ; 37366 + call AnimateFailedMove + ld hl, DidntAffect1Text ; 'it didn't affect' + ld de, DidntAffect2Text ; 'it didn't affect' + jp FailText_CheckOpponentProtect - call ResetBatonPassStatus - ret +; 37372 -.Enemy: +PrintParalyze: ; 37372 +; 'paralyzed! maybe it can't attack!' + ld hl, ParalyzedText + jp StdBattleTextBox -; Wildmons don't have anything to switch to - ld a, [wBattleMode] - dec a ; WILDMON - jp z, FailedBatonPass +; 37378 - call CheckAnyOtherAliveEnemyMons - jp z, FailedBatonPass - call UpdateEnemyMonInParty - call AnimateCurrentMove - call BatonPass_LinkEnemySwitch +CheckSubstituteOpp: ; 37378 + ld a, BATTLE_VARS_SUBSTATUS4_OPP + call GetBattleVar + bit SUBSTATUS_SUBSTITUTE, a + ret -; Mobile link battles handle entrances differently - farcall CheckMobileBattleError - jp c, EndMoveEffect +; 37380 -; Passed enemy PartyMon entrance - xor a - ld [wEnemySwitchMonIndex], a - ld hl, EnemySwitch_SetMode - call CallBattleCore - ld hl, ResetBattleParticipants - call CallBattleCore - ld a, 1 - ld [wTypeMatchup], a - ld hl, ApplyStatLevelMultiplierOnAllStats - call CallBattleCore - ld hl, SpikesDamage - call CallBattleCore +INCLUDE "engine/battle/move_effects/selfdestruct.asm" - jr ResetBatonPassStatus +INCLUDE "engine/battle/move_effects/mirror_move.asm" -; 37a67 +INCLUDE "engine/battle/move_effects/metronome.asm" -BatonPass_LinkPlayerSwitch: ; 37a67 - ld a, [wLinkMode] +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 - ld [wPlayerAction], a + and a + ret - call LoadStandardMenuHeader - ld hl, LinkBattleSendReceiveAction - call CallBattleCore - call CloseWindow +; 3747b + + +ResetTurn: ; 3747b + ld hl, wPlayerCharging + ld a, [hBattleTurn] + and a + jr z, .player + ld hl, wEnemyCharging +.player + ld [hl], 1 xor a - ld [wPlayerAction], a - ret + ld [AlreadyDisobeyed], a + call DoMove + jp EndMoveEffect -; 37a82 +; 37492 -BatonPass_LinkEnemySwitch: ; 37a82 - ld a, [wLinkMode] - and a - ret z +INCLUDE "engine/battle/move_effects/thief.asm" - call LoadStandardMenuHeader - ld hl, LinkBattleSendReceiveAction - call CallBattleCore - ld a, [OTPartyCount] - add BATTLEACTION_SWITCH1 - ld b, a - ld a, [wBattleAction] - cp BATTLEACTION_SWITCH1 - jr c, .baton_pass - cp b - jr c, .switch +BattleCommand_ArenaTrap: ; 37517 +; arenatrap -.baton_pass - ld a, [CurOTMon] - add BATTLEACTION_SWITCH1 - ld [wBattleAction], a -.switch - jp CloseWindow +; Doesn't work on an absent opponent. -; 37aab + call CheckHiddenOpponent + jr nz, .failed + +; Don't trap if the opponent is already trapped. + + ld a, BATTLE_VARS_SUBSTATUS5 + call GetBattleVarAddr + bit SUBSTATUS_CANT_RUN, [hl] + jr nz, .failed + +; Otherwise trap the opponent. + set SUBSTATUS_CANT_RUN, [hl] + call AnimateCurrentMove + ld hl, CantEscapeNowText + jp StdBattleTextBox -FailedBatonPass: ; 37aab +.failed call AnimateFailedMove jp PrintButItFailed -; 37ab1 - +; 37536 -ResetBatonPassStatus: ; 37ab1 -; Reset status changes that aren't passed by Baton Pass. - ; Nightmare isn't passed. - ld a, BATTLE_VARS_STATUS - call GetBattleVar - and SLP - jr nz, .ok +INCLUDE "engine/battle/move_effects/nightmare.asm" - ld a, BATTLE_VARS_SUBSTATUS1 - call GetBattleVarAddr - res SUBSTATUS_NIGHTMARE, [hl] -.ok - ; Disable isn't passed. - call ResetActorDisable +BattleCommand_Defrost: ; 37563 +; defrost - ; Attraction isn't passed. - ld hl, PlayerSubStatus1 - res SUBSTATUS_IN_LOVE, [hl] - ld hl, EnemySubStatus1 - res SUBSTATUS_IN_LOVE, [hl] - ld hl, PlayerSubStatus5 +; Thaw the user. - ld a, BATTLE_VARS_SUBSTATUS5 + ld a, BATTLE_VARS_STATUS call GetBattleVarAddr - res SUBSTATUS_TRANSFORMED, [hl] - res SUBSTATUS_ENCORED, [hl] + bit FRZ, [hl] + ret z + res FRZ, [hl] - ; New mon hasn't used a move yet. - ld a, BATTLE_VARS_LAST_MOVE - call GetBattleVarAddr - ld [hl], 0 +; Don't update the enemy's party struct in a wild battle. - xor a - ld [wPlayerWrapCount], a - ld [wEnemyWrapCount], a - ret + ld a, [hBattleTurn] + and a + jr z, .party -; 37ae9 + ld a, [wBattleMode] + dec a + jr z, .done +.party + ld a, MON_STATUS + call UserPartyAttr + res FRZ, [hl] -CheckAnyOtherAlivePartyMons: ; 37ae9 - ld hl, PartyMon1HP - ld a, [PartyCount] - ld d, a - ld a, [CurBattleMon] - ld e, a - jr CheckAnyOtherAliveMons +.done + call RefreshBattleHuds + ld hl, WasDefrostedText + jp StdBattleTextBox -; 37af6 +; 37588 -CheckAnyOtherAliveEnemyMons: ; 37af6 - ld hl, OTPartyMon1HP - ld a, [OTPartyCount] - ld d, a - ld a, [CurOTMon] - ld e, a +INCLUDE "engine/battle/move_effects/curse.asm" - ; fallthrough -; 37b01 +INCLUDE "engine/battle/move_effects/protect.asm" -CheckAnyOtherAliveMons: ; 37b01 -; Check for nonzero HP starting from partymon -; HP at hl for d partymons, besides current mon e. +INCLUDE "engine/battle/move_effects/endure.asm" -; Return nz if any are alive. +INCLUDE "engine/battle/move_effects/spikes.asm" - xor a - ld b, a - ld c, a -.loop - ld a, c - cp d - jr z, .done - cp e - jr z, .next +INCLUDE "engine/battle/move_effects/foresight.asm" - ld a, [hli] - or b - ld b, a - ld a, [hld] - or b - ld b, a +INCLUDE "engine/battle/move_effects/perish_song.asm" -.next - push bc - ld bc, PARTYMON_STRUCT_LENGTH - add hl, bc - pop bc - inc c - jr .loop +INCLUDE "engine/battle/move_effects/sandstorm.asm" -.done - ld a, b - and a +INCLUDE "engine/battle/move_effects/rollout.asm" + + +BattleCommand5d: ; 37791 +; unused ret -; 37b1d - +; 37792 -BattleCommand_Pursuit: ; 37b1d -; pursuit -; Double damage if the opponent is switching. - ld hl, wEnemyIsSwitching - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, wPlayerIsSwitching -.ok - ld a, [hl] - and a - ret z +INCLUDE "engine/battle/move_effects/fury_cutter.asm" - ld hl, CurDamage + 1 - sla [hl] - dec hl - rl [hl] - ret nc +INCLUDE "engine/battle/move_effects/attract.asm" - ld a, $ff - ld [hli], a - ld [hl], a - ret +INCLUDE "engine/battle/move_effects/return.asm" -; 37b39 +INCLUDE "engine/battle/move_effects/present.asm" +INCLUDE "engine/battle/move_effects/frustration.asm" -BattleCommand_ClearHazards: ; 37b39 -; clearhazards +INCLUDE "engine/battle/move_effects/safeguard.asm" - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVarAddr - bit SUBSTATUS_LEECH_SEED, [hl] - jr z, .not_leeched - res SUBSTATUS_LEECH_SEED, [hl] - ld hl, ShedLeechSeedText - call StdBattleTextBox -.not_leeched - ld hl, PlayerScreens - ld de, wPlayerWrapCount +SafeCheckSafeguard: ; 37962 + push hl + ld hl, EnemyScreens ld a, [hBattleTurn] and a - jr z, .got_screens_wrap - ld hl, EnemyScreens - ld de, wEnemyWrapCount -.got_screens_wrap - bit SCREENS_SPIKES, [hl] - jr z, .no_spikes - res SCREENS_SPIKES, [hl] - ld hl, BlewSpikesText - push de - call StdBattleTextBox - pop de -.no_spikes + jr z, .got_turn + ld hl, PlayerScreens - ld a, [de] +.got_turn + bit SCREENS_SAFEGUARD, [hl] + pop hl + ret + +; 37972 + + +BattleCommand_CheckSafeguard: ; 37972 +; checksafeguard + ld hl, EnemyScreens + ld a, [hBattleTurn] and a + jr z, .got_turn + ld hl, PlayerScreens +.got_turn + bit SCREENS_SAFEGUARD, [hl] ret z - xor a - ld [de], a - ld hl, ReleasedByText - jp StdBattleTextBox + ld a, 1 + ld [AttackMissed], a + call BattleCommand_MoveDelay + ld hl, SafeguardProtectText + call StdBattleTextBox + jp EndMoveEffect + +; 37991 + + +INCLUDE "engine/battle/move_effects/magnitude.asm" + +INCLUDE "engine/battle/move_effects/baton_pass.asm" + +INCLUDE "engine/battle/move_effects/pursuit.asm" -; 37b74 +INCLUDE "engine/battle/move_effects/rapid_spin.asm" BattleCommand_HealMorn: ; 37b74 @@ -9352,196 +7141,17 @@ BattleCommand_TimeBasedHealContinue: ; 37b7e ; 37be8 -BattleCommand_HiddenPower: ; 37be8 -; hiddenpower - - ld a, [AttackMissed] - and a - ret nz - farcall HiddenPowerDamage - ret - -; 37bf4 - - -BattleCommand_StartRain: ; 37bf4 -; startrain - ld a, WEATHER_RAIN - ld [Weather], a - ld a, 5 - ld [WeatherCount], a - call AnimateCurrentMove - ld hl, DownpourText - jp StdBattleTextBox - -; 37c07 - - -BattleCommand_StartSun: ; 37c07 -; startsun - ld a, WEATHER_SUN - ld [Weather], a - ld a, 5 - ld [WeatherCount], a - call AnimateCurrentMove - ld hl, SunGotBrightText - jp StdBattleTextBox - -; 37c1a - - -BattleCommand_BellyDrum: ; 37c1a -; bellydrum -; This command is buggy because it raises the user's attack -; before checking that it has enough HP to use the move. -; Swap the order of these two blocks to fix. - call BattleCommand_AttackUp2 - ld a, [AttackMissed] - and a - jr nz, .failed - - callfar GetHalfMaxHP - callfar CheckUserHasEnoughHP - jr nc, .failed - - push bc - call AnimateCurrentMove - pop bc - callfar SubtractHPFromUser - call UpdateUserInParty - ld a, 5 - -.max_attack_loop - push af - call BattleCommand_AttackUp2 - pop af - dec a - jr nz, .max_attack_loop - - ld hl, BellyDrumText - jp StdBattleTextBox - -.failed - call AnimateFailedMove - jp PrintButItFailed - -; 37c55 - - -BattleCommand_PsychUp: ; 37c55 -; psychup - - ld hl, EnemyStatLevels - ld de, PlayerStatLevels - ld a, [hBattleTurn] - and a - jr z, .pointers_correct -; It's the enemy's turn, so swap the pointers. - push hl - ld h, d - ld l, e - pop de -.pointers_correct - push hl - ld b, NUM_LEVEL_STATS -; If any of the enemy's stats is modified from its base level, -; the move succeeds. Otherwise, it fails. -.loop - ld a, [hli] - cp BASE_STAT_LEVEL - jr nz, .break - dec b - jr nz, .loop - pop hl - call AnimateFailedMove - jp PrintButItFailed - -.break - pop hl - ld b, NUM_LEVEL_STATS -.loop2 - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .loop2 - ld a, [hBattleTurn] - and a - jr nz, .calc_enemy_stats - call CalcPlayerStats - jr .merge - -.calc_enemy_stats - call CalcEnemyStats -.merge - call AnimateCurrentMove - ld hl, CopiedStatsText - jp StdBattleTextBox - -; 37c95 - - -BattleCommand_MirrorCoat: ; 37c95 -; mirrorcoat - - ld a, 1 - ld [AttackMissed], a - - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - and a - ret z - - ld b, a - callfar GetMoveEffect - ld a, b - cp EFFECT_MIRROR_COAT - ret z - - call BattleCommand_ResetTypeMatchup - ld a, [wTypeMatchup] - and a - ret z - - call CheckOpponentWentFirst - ret z - - ld a, BATTLE_VARS_LAST_COUNTER_MOVE_OPP - call GetBattleVar - dec a - ld de, StringBuffer1 - call GetMoveData - - ld a, [StringBuffer1 + 2] - and a - ret z +INCLUDE "engine/battle/move_effects/hidden_power.asm" - ld a, [StringBuffer1 + 3] - cp SPECIAL - ret c +INCLUDE "engine/battle/move_effects/rain_dance.asm" - ld hl, CurDamage - ld a, [hli] - or [hl] - ret z +INCLUDE "engine/battle/move_effects/sunny_day.asm" - ld a, [hl] - add a - ld [hld], a - ld a, [hl] - adc a - ld [hl], a - jr nc, .capped - ld a, $ff - ld [hli], a - ld [hl], a -.capped +INCLUDE "engine/battle/move_effects/belly_drum.asm" - xor a - ld [AttackMissed], a - ret +INCLUDE "engine/battle/move_effects/psych_up.asm" -; 37ce6 +INCLUDE "engine/battle/move_effects/mirror_coat.asm" BattleCommand_DoubleMinimizeDamage: ; 37ce6 @@ -9580,113 +7190,9 @@ BattleCommand_SkipSunCharge: ; 37d02 ; 37d0d -BattleCommand_CheckFutureSight: ; 37d0d -; checkfuturesight - - ld hl, wPlayerFutureSightCount - ld de, wPlayerFutureSightDamage - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, wEnemyFutureSightCount - ld de, wEnemyFutureSightDamage -.ok - - ld a, [hl] - and a - ret z - cp 1 - ret nz - - ld [hl], 0 - ld a, [de] - inc de - ld [CurDamage], a - ld a, [de] - ld [CurDamage + 1], a - ld b, futuresight_command - jp SkipToBattleCommand - -; 37d34 - -BattleCommand_FutureSight: ; 37d34 -; futuresight - - call CheckUserIsCharging - jr nz, .AlreadyChargingFutureSight - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVar - ld b, a - ld a, BATTLE_VARS_LAST_COUNTER_MOVE - call GetBattleVarAddr - ld [hl], b - ld a, BATTLE_VARS_LAST_MOVE - call GetBattleVarAddr - ld [hl], b -.AlreadyChargingFutureSight: - ld hl, wPlayerFutureSightCount - ld a, [hBattleTurn] - and a - jr z, .GotFutureSightCount - ld hl, wEnemyFutureSightCount -.GotFutureSightCount: - ld a, [hl] - and a - jr nz, .failed - ld a, 4 - ld [hl], a - call BattleCommand_LowerSub - call BattleCommand_MoveDelay - ld hl, ForesawAttackText - call StdBattleTextBox - call BattleCommand_RaiseSub - ld de, wPlayerFutureSightDamage - ld a, [hBattleTurn] - and a - jr z, .StoreDamage - ld de, wEnemyFutureSightDamage -.StoreDamage: - ld hl, CurDamage - ld a, [hl] - ld [de], a - ld [hl], 0 - inc hl - inc de - ld a, [hl] - ld [de], a - ld [hl], 0 - jp EndMoveEffect - -.failed - pop bc - call ResetDamage - call AnimateFailedMove - call PrintButItFailed - jp EndMoveEffect - -; 37d94 - - -BattleCommand_ThunderAccuracy: ; 37d94 -; thunderaccuracy - - ld a, BATTLE_VARS_MOVE_TYPE - call GetBattleVarAddr - inc hl - ld a, [Weather] - cp WEATHER_RAIN - jr z, .rain - cp WEATHER_SUN - ret nz - ld [hl], 50 percent + 1 - ret - -.rain - ; Redundant with CheckHit guranteeing hit - ld [hl], 100 percent - ret +INCLUDE "engine/battle/move_effects/future_sight.asm" -; 37daa +INCLUDE "engine/battle/move_effects/thunder.asm" CheckHiddenOpponent: ; 37daa @@ -9828,7 +7334,6 @@ LoadMoveAnim: ; 37e36 LoadAnim: ; 37e44 - ld [FXAnimID], a ; fallthrough -- cgit v1.2.3