ref: 4d93741a54172754aa7ac4d0162343bc0121849d
dir: /engine/battle/move_effects/baton_pass.asm/
BattleCommand_BatonPass: ; 379c9 ; batonpass ld a, [hBattleTurn] and a jp nz, .Enemy ; Need something to switch to call CheckAnyOtherAlivePartyMons jp z, FailedBatonPass call UpdateBattleMonInParty call AnimateCurrentMove ld c, 50 call DelayFrames ; Transition into switchmon menu call LoadStandardMenuHeader farcall SetUpBattlePartyMenu_NoLoop farcall ForcePickSwitchMonInBattle ; Return to battle scene call ClearPalettes farcall _LoadBattleFontsHPBar call CloseWindow call ClearSprites hlcoord 1, 0 lb bc, 4, 10 call ClearBox ld b, SCGB_BATTLE_COLORS call GetSGBLayout call SetPalettes call BatonPass_LinkPlayerSwitch ; Mobile link battles handle entrances differently farcall CheckMobileBattleError jp c, EndMoveEffect ld hl, PassedBattleMonEntrance call CallBattleCore call ResetBatonPassStatus ret .Enemy: ; Wildmons don't have anything to switch to ld a, [wBattleMode] dec a ; WILDMON jp z, FailedBatonPass call CheckAnyOtherAliveEnemyMons jp z, FailedBatonPass call UpdateEnemyMonInParty call AnimateCurrentMove call BatonPass_LinkEnemySwitch ; Mobile link battles handle entrances differently farcall CheckMobileBattleError jp c, EndMoveEffect ; Passed enemy PartyMon entrance xor a ld [wEnemySwitchMonIndex], a ld hl, EnemySwitch_SetMode call CallBattleCore ld hl, ResetBattleParticipants call CallBattleCore ld a, 1 ld [wTypeMatchup], a ld hl, ApplyStatLevelMultiplierOnAllStats call CallBattleCore ld hl, SpikesDamage call CallBattleCore jr ResetBatonPassStatus ; 37a67 BatonPass_LinkPlayerSwitch: ; 37a67 ld a, [wLinkMode] and a ret z ld a, 1 ld [wPlayerAction], a call LoadStandardMenuHeader ld hl, LinkBattleSendReceiveAction call CallBattleCore call CloseWindow xor a ld [wPlayerAction], a ret ; 37a82 BatonPass_LinkEnemySwitch: ; 37a82 ld a, [wLinkMode] and a ret z call 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 .baton_pass ld a, [CurOTMon] add BATTLEACTION_SWITCH1 ld [wBattleAction], a .switch jp CloseWindow ; 37aab FailedBatonPass: ; 37aab call AnimateFailedMove jp PrintButItFailed ; 37ab1 ResetBatonPassStatus: ; 37ab1 ; Reset status changes that aren't passed by Baton Pass. ; Nightmare isn't passed. ld a, BATTLE_VARS_STATUS call GetBattleVar and SLP jr nz, .ok ld a, BATTLE_VARS_SUBSTATUS1 call GetBattleVarAddr res SUBSTATUS_NIGHTMARE, [hl] .ok ; Disable isn't passed. call ResetActorDisable ; Attraction isn't passed. ld hl, PlayerSubStatus1 res SUBSTATUS_IN_LOVE, [hl] ld hl, EnemySubStatus1 res SUBSTATUS_IN_LOVE, [hl] ld hl, PlayerSubStatus5 ld a, BATTLE_VARS_SUBSTATUS5 call GetBattleVarAddr res SUBSTATUS_TRANSFORMED, [hl] res SUBSTATUS_ENCORED, [hl] ; New mon hasn't used a move yet. ld a, BATTLE_VARS_LAST_MOVE call GetBattleVarAddr ld [hl], 0 xor a ld [wPlayerWrapCount], a ld [wEnemyWrapCount], a ret ; 37ae9 CheckAnyOtherAlivePartyMons: ; 37ae9 ld hl, PartyMon1HP ld a, [PartyCount] ld d, a ld a, [CurBattleMon] ld e, a jr CheckAnyOtherAliveMons ; 37af6 CheckAnyOtherAliveEnemyMons: ; 37af6 ld hl, OTPartyMon1HP ld a, [OTPartyCount] ld d, a ld a, [CurOTMon] ld e, a ; fallthrough ; 37b01 CheckAnyOtherAliveMons: ; 37b01 ; Check for nonzero HP starting from partymon ; HP at hl for d partymons, besides current mon e. ; Return nz if any are alive. xor a ld b, a ld c, a .loop ld a, c cp d jr z, .done cp e jr z, .next ld a, [hli] or b ld b, a ld a, [hld] or b ld b, a .next push bc ld bc, PARTYMON_STRUCT_LENGTH add hl, bc pop bc inc c jr .loop .done ld a, b and a ret ; 37b1d