summaryrefslogtreecommitdiff
path: root/engine/anims/anim_commands.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/anims/anim_commands.asm')
-rw-r--r--engine/anims/anim_commands.asm1514
1 files changed, 1514 insertions, 0 deletions
diff --git a/engine/anims/anim_commands.asm b/engine/anims/anim_commands.asm
new file mode 100644
index 000000000..1977f9112
--- /dev/null
+++ b/engine/anims/anim_commands.asm
@@ -0,0 +1,1514 @@
+; Battle animation command interpreter.
+
+PlayBattleAnim: ; cc0d6
+
+ ld a, [rSVBK]
+ push af
+
+ ld a, 5
+ ld [rSVBK], a
+
+ call _PlayBattleAnim
+
+ pop af
+ ld [rSVBK], a
+ ret
+; cc0e4
+
+_PlayBattleAnim: ; cc0e4
+
+ ld c, 6
+.wait
+ call BattleAnimDelayFrame
+ dec c
+ jr nz, .wait
+
+ call BattleAnimAssignPals
+ call BattleAnimRequestPals
+ call BattleAnimDelayFrame
+
+ ld c, 1
+ ld a, [rKEY1]
+ bit 7, a
+ jr nz, .asm_cc0ff
+ ld c, 3
+
+.asm_cc0ff
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+
+ ld [hl], c
+ call BattleAnimRunScript
+
+ pop af
+ ld [hVBlank], a
+
+ ld a, $1
+ ld [hBGMapMode], a
+
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call WaitSFX
+ ret
+; cc11c
+
+BattleAnimRunScript: ; cc11c
+
+ ld a, [FXAnimID + 1]
+ and a
+ jr nz, .hi_byte
+
+ farcall CheckBattleScene
+ jr c, .disabled
+
+ call BattleAnimClearHud
+ call RunBattleAnimScript
+
+ call BattleAnimAssignPals
+ call BattleAnimRequestPals
+
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ call BattleAnimDelayFrame
+ call BattleAnimRestoreHuds
+
+.disabled
+ ld a, [wNumHits]
+ and a
+ jr z, .done
+
+ ld l, a
+ ld h, 0
+ ld de, ANIM_MISS
+ add hl, de
+ ld a, l
+ ld [FXAnimID], a
+ ld a, h
+ ld [FXAnimID + 1], a
+
+.hi_byte
+ call WaitSFX
+ call PlayHitSound
+ call RunBattleAnimScript
+
+.done
+ call BattleAnim_RevertPals
+ ret
+; cc163
+
+RunBattleAnimScript: ; cc163
+
+ call ClearBattleAnims
+
+.playframe
+ call RunBattleAnimCommand
+ call _ExecuteBGEffects
+ call BattleAnim_UpdateOAM_All
+ call PushLYOverrides
+ call BattleAnimRequestPals
+
+; Speed up Rollout's animation.
+ ld a, [FXAnimID + 1]
+ or a
+ jr nz, .not_rollout
+
+ ld a, [FXAnimID]
+ cp ROLLOUT
+ jr nz, .not_rollout
+
+ ld a, $2e
+ ld b, 5
+ ld de, 4
+ ld hl, ActiveBGEffects
+.find
+ cp [hl]
+ jr z, .done
+ add hl, de
+ dec b
+ jr nz, .find
+
+.not_rollout
+ call BattleAnimDelayFrame
+
+.done
+ ld a, [BattleAnimFlags]
+ bit 0, a
+ jr z, .playframe
+
+ call BattleAnim_ClearCGB_OAMFlags
+ ret
+; cc1a1
+
+BattleAnimClearHud: ; cc1a1
+
+ call BattleAnimDelayFrame
+ call WaitTop
+ call ClearActorHud
+ ld a, $1
+ ld [hBGMapMode], a
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call WaitTop
+ ret
+; cc1bb
+
+BattleAnimRestoreHuds: ; cc1bb
+
+ call BattleAnimDelayFrame
+ call WaitTop
+
+ ld a, [rSVBK]
+ push af
+ ld a, $1
+ ld [rSVBK], a
+
+ ld hl, UpdateBattleHuds
+ ld a, BANK(UpdatePlayerHUD)
+ rst FarCall ; Why not "call UpdateBattleHuds"?
+
+ pop af
+ ld [rSVBK], a
+
+ ld a, $1
+ ld [hBGMapMode], a
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call WaitTop
+ ret
+; cc1e2
+
+BattleAnimRequestPals: ; cc1e2
+
+ ld a, [hCGB]
+ and a
+ ret z
+
+ ld a, [rBGP]
+ ld b, a
+ ld a, [wBGP]
+ cp b
+ call nz, BattleAnim_SetBGPals
+
+ ld a, [rOBP0]
+ ld b, a
+ ld a, [wOBP0]
+ cp b
+ call nz, BattleAnim_SetOBPals
+ ret
+; cc1fb
+
+BattleAnimDelayFrame: ; cc1fb
+; Like DelayFrame but wastes battery life.
+
+ ld a, 1
+ ld [VBlankOccurred], a
+.wait
+ ld a, [VBlankOccurred]
+ and a
+ jr nz, .wait
+ ret
+; cc207
+
+ClearActorHud: ; cc207
+
+ ld a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ hlcoord 1, 0
+ lb bc, 4, 10
+ call ClearBox
+ ret
+
+.player
+ hlcoord 9, 7
+ lb bc, 5, 11
+ call ClearBox
+ ret
+; cc220
+
+Functioncc220: ; cc220
+; Appears to be unused.
+ xor a
+ ld [hBGMapMode], a
+ ld a, LOW(VBGMap0 tile $28)
+ ld [hBGMapAddress], a
+ ld a, HIGH(VBGMap0 tile $28)
+ ld [hBGMapAddress + 1], a
+ call WaitBGMap2
+ ld a, $60
+ ld [hWY], a
+ xor a ; LOW(VBGMap0)
+ ld [hBGMapAddress], a
+ ld a, HIGH(VBGMap0)
+ ld [hBGMapAddress + 1], a
+ call BattleAnimDelayFrame
+ ret
+; cc23d
+
+
+BattleAnim_ClearCGB_OAMFlags: ; cc23d
+
+ ld a, [BattleAnimFlags]
+ bit 3, a
+ jr z, .delete
+
+ ld hl, Sprites + 3
+ ld c, (SpritesEnd - Sprites) / 4
+.loop
+ ld a, [hl]
+ and $f0
+ ld [hli], a
+ inc hl
+ inc hl
+ inc hl
+ dec c
+ jr nz, .loop
+ ret
+
+.delete
+ ld hl, Sprites
+ ld c, SpritesEnd - Sprites
+ xor a
+.loop2
+ ld [hli], a
+ dec c
+ jr nz, .loop2
+ ret
+; cc25f
+
+RunBattleAnimCommand: ; cc25f
+ call .CheckTimer
+ ret nc
+ call .RunScript
+ ret
+; cc267
+
+.CheckTimer: ; cc267
+ ld a, [BattleAnimDuration]
+ and a
+ jr z, .done
+
+ dec a
+ ld [BattleAnimDuration], a
+ and a
+ ret
+
+.done
+ scf
+ ret
+; cc275
+
+.RunScript: ; cc275
+.loop
+ call GetBattleAnimByte
+
+ cp $ff
+ jr nz, .not_done_with_anim
+
+; Return from a subroutine.
+ ld hl, BattleAnimFlags
+ bit 1, [hl]
+ jr nz, .do_anim
+
+ set 0, [hl]
+ ret
+
+.not_done_with_anim
+ cp $d0
+ jr nc, .do_anim
+
+ ld [BattleAnimDuration], a
+ ret
+
+.do_anim
+ call .DoCommand
+
+ jr .loop
+; cc293
+
+.DoCommand: ; cc293
+; Execute battle animation command in [BattleAnimByte].
+ ld a, [BattleAnimByte]
+ sub $d0
+
+ ld e, a
+ ld d, 0
+ ld hl, BattleAnimCommands
+ add hl, de
+ add hl, de
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp hl
+; cc2a4
+
+
+BattleAnimCommands:: ; cc2a4 (33:42a4)
+; entries correspond to macros/move_anim.asm enumeration
+ dw BattleAnimCmd_Obj
+ dw BattleAnimCmd_1GFX
+ dw BattleAnimCmd_2GFX
+ dw BattleAnimCmd_3GFX
+ dw BattleAnimCmd_4GFX
+ dw BattleAnimCmd_5GFX
+ dw BattleAnimCmd_IncObj
+ dw BattleAnimCmd_SetObj
+ dw BattleAnimCmd_IncBGEffect
+ dw BattleAnimCmd_EnemyFeetObj
+ dw BattleAnimCmd_PlayerHeadObj
+ dw BattleAnimCmd_CheckPokeball
+ dw BattleAnimCmd_Transform
+ dw BattleAnimCmd_RaiseSub
+ dw BattleAnimCmd_DropSub
+ dw BattleAnimCmd_ResetObp0
+ dw BattleAnimCmd_Sound
+ dw BattleAnimCmd_Cry
+ dw BattleAnimCmd_MinimizeOpp
+ dw BattleAnimCmd_OAMOn
+ dw BattleAnimCmd_OAMOff
+ dw BattleAnimCmd_ClearObjs
+ dw BattleAnimCmd_BeatUp
+ dw BattleAnimCmd_E7
+ dw BattleAnimCmd_UpdateActorPic
+ dw BattleAnimCmd_Minimize
+ dw BattleAnimCmd_EA ; dummy
+ dw BattleAnimCmd_EB ; dummy
+ dw BattleAnimCmd_EC ; dummy
+ dw BattleAnimCmd_ED ; dummy
+ dw BattleAnimCmd_IfParamAnd
+ dw BattleAnimCmd_JumpUntil
+ dw BattleAnimCmd_BGEffect
+ dw BattleAnimCmd_BGP
+ dw BattleAnimCmd_OBP0
+ dw BattleAnimCmd_OBP1
+ dw BattleAnimCmd_ClearSprites
+ dw BattleAnimCmd_F5
+ dw BattleAnimCmd_F6
+ dw BattleAnimCmd_F7
+ dw BattleAnimCmd_IfParamEqual
+ dw BattleAnimCmd_SetVar
+ dw BattleAnimCmd_IncVar
+ dw BattleAnimCmd_IfVarEqual
+ dw BattleAnimCmd_Jump
+ dw BattleAnimCmd_Loop
+ dw BattleAnimCmd_Call
+ dw BattleAnimCmd_Ret
+
+
+BattleAnimCmd_EA:
+BattleAnimCmd_EB:
+BattleAnimCmd_EC:
+BattleAnimCmd_ED: ; cc304 (33:4304)
+ ret
+
+BattleAnimCmd_Ret: ; cc305 (33:4305)
+ ld hl, BattleAnimFlags
+ res 1, [hl]
+ ld hl, BattleAnimParent
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, BattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_Call: ; cc317 (33:4317)
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ push de
+ ld hl, BattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, BattleAnimParent
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ pop de
+ ld hl, BattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, BattleAnimFlags
+ set 1, [hl]
+ ret
+
+BattleAnimCmd_Jump: ; cc339 (33:4339)
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ ld hl, BattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_Loop: ; cc348 (33:4348)
+ call GetBattleAnimByte
+ ld hl, BattleAnimFlags
+ bit 2, [hl]
+ jr nz, .continue_loop
+ and a
+ jr z, .perpetual
+ dec a
+ set 2, [hl]
+ ld [BattleAnimLoops], a
+.continue_loop
+ ld hl, BattleAnimLoops
+ ld a, [hl]
+ and a
+ jr z, .return_from_loop
+ dec [hl]
+.perpetual
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ ld hl, BattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+.return_from_loop
+ ld hl, BattleAnimFlags
+ res 2, [hl]
+ ld hl, BattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+BattleAnimCmd_JumpUntil: ; cc383 (33:4383)
+ ld hl, wBattleAnimParam
+ ld a, [hl]
+ and a
+ jr z, .dont_jump
+
+ dec [hl]
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ ld hl, BattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+.dont_jump
+ ld hl, BattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+BattleAnimCmd_SetVar: ; cc3a6 (33:43a6)
+ call GetBattleAnimByte
+ ld [BattleAnimVar], a
+ ret
+
+BattleAnimCmd_IncVar: ; cc3ad (33:43ad)
+ ld hl, BattleAnimVar
+ inc [hl]
+ ret
+
+BattleAnimCmd_IfVarEqual: ; cc3b2 (33:43b2)
+ call GetBattleAnimByte
+ ld hl, BattleAnimVar
+ cp [hl]
+ jr z, .jump
+
+ ld hl, BattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+.jump
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ ld hl, BattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_IfParamEqual: ; cc3d6 (33:43d6)
+ call GetBattleAnimByte
+ ld hl, wBattleAnimParam
+ cp [hl]
+ jr z, .jump
+
+ ld hl, BattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+.jump
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ ld hl, BattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_IfParamAnd: ; cc3fa (33:43fa)
+ call GetBattleAnimByte
+ ld e, a
+ ld a, [wBattleAnimParam]
+ and e
+ jr nz, .jump
+
+ ld hl, BattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+.jump
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ ld hl, BattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_Obj: ; cc41f (33:441f)
+; index, x, y, param
+ call GetBattleAnimByte
+ ld [wBattleAnimTemp0], a
+ call GetBattleAnimByte
+ ld [wBattleAnimTemp1], a
+ call GetBattleAnimByte
+ ld [wBattleAnimTemp2], a
+ call GetBattleAnimByte
+ ld [wBattleAnimTemp3], a
+ call QueueBattleAnimation
+ ret
+
+BattleAnimCmd_BGEffect: ; cc43b (33:443b)
+ call GetBattleAnimByte
+ ld [wBattleAnimTemp0], a
+ call GetBattleAnimByte
+ ld [wBattleAnimTemp1], a
+ call GetBattleAnimByte
+ ld [wBattleAnimTemp2], a
+ call GetBattleAnimByte
+ ld [wBattleAnimTemp3], a
+ call _QueueBGEffect
+ ret
+
+BattleAnimCmd_BGP: ; cc457 (33:4457)
+ call GetBattleAnimByte
+ ld [wBGP], a
+ ret
+
+BattleAnimCmd_OBP0: ; cc45e (33:445e)
+ call GetBattleAnimByte
+ ld [wOBP0], a
+ ret
+
+BattleAnimCmd_OBP1: ; cc465 (33:4465)
+ call GetBattleAnimByte
+ ld [wOBP1], a
+ ret
+
+BattleAnimCmd_ResetObp0: ; cc46c (33:446c)
+ ld a, [hSGB]
+ and a
+ ld a, $e0
+ jr z, .not_sgb
+ ld a, $f0
+.not_sgb
+ ld [wOBP0], a
+ ret
+
+BattleAnimCmd_ClearObjs: ; cc479 (33:4479)
+ ld hl, ActiveAnimObjects
+ ld a, $a0
+.loop
+ ld [hl], $0
+ inc hl
+ dec a
+ jr nz, .loop
+ ret
+
+BattleAnimCmd_1GFX:
+BattleAnimCmd_2GFX:
+BattleAnimCmd_3GFX:
+BattleAnimCmd_4GFX:
+BattleAnimCmd_5GFX: ; cc485 (33:4485)
+ ld a, [BattleAnimByte]
+ and $f
+ ld c, a
+ ld hl, wBattleAnimTileDict
+ xor a
+ ld [wBattleAnimTemp0], a
+.loop
+ ld a, [wBattleAnimTemp0]
+ cp (VTiles1 - VTiles0) / $10 - $31
+ ret nc
+ call GetBattleAnimByte
+ ld [hli], a
+ ld a, [wBattleAnimTemp0]
+ ld [hli], a
+ push bc
+ push hl
+ ld l, a
+ ld h, $0
+rept 4
+ add hl, hl
+endr
+ ld de, VTiles0 tile $31
+ add hl, de
+ ld a, [BattleAnimByte]
+ call LoadBattleAnimObj
+ ld a, [wBattleAnimTemp0]
+ add c
+ ld [wBattleAnimTemp0], a
+ pop hl
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+BattleAnimCmd_IncObj: ; cc4c0 (33:44c0)
+ call GetBattleAnimByte
+ ld e, 10
+ ld bc, ActiveAnimObjects
+.loop
+ ld hl, BATTLEANIMSTRUCT_INDEX
+ add hl, bc
+ ld d, [hl]
+ ld a, [BattleAnimByte]
+ cp d
+ jr z, .found
+ ld hl, BATTLEANIMSTRUCT_LENGTH
+ add hl, bc
+ ld c, l
+ ld b, h
+ dec e
+ jr nz, .loop
+ ret
+
+.found
+ ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+ add hl, bc
+ inc [hl]
+ ret
+
+BattleAnimCmd_IncBGEffect: ; cc4e3 (33:44e3)
+ call GetBattleAnimByte
+ ld e, 5
+ ld bc, ActiveBGEffects
+.loop
+ ld hl, $0
+ add hl, bc
+ ld d, [hl]
+ ld a, [BattleAnimByte]
+ cp d
+ jr z, .found
+ ld hl, 4
+ add hl, bc
+ ld c, l
+ ld b, h
+ dec e
+ jr nz, .loop
+ ret
+
+.found
+ ld hl, BG_EFFECT_STRUCT_JT_INDEX
+ add hl, bc
+ inc [hl]
+ ret
+
+BattleAnimCmd_SetObj: ; cc506 (33:4506)
+ call GetBattleAnimByte
+ ld e, 10
+ ld bc, ActiveAnimObjects
+.loop
+ ld hl, BATTLEANIMSTRUCT_INDEX
+ add hl, bc
+ ld d, [hl]
+ ld a, [BattleAnimByte]
+ cp d
+ jr z, .found
+ ld hl, BATTLEANIMSTRUCT_LENGTH
+ add hl, bc
+ ld c, l
+ ld b, h
+ dec e
+ jr nz, .loop
+ ret
+
+.found
+ call GetBattleAnimByte
+ ld hl, BATTLEANIMSTRUCT_ANON_JT_INDEX
+ add hl, bc
+ ld [hl], a
+ ret
+
+BattleAnimCmd_EnemyFeetObj: ; cc52c (33:452c)
+
+ ld hl, wBattleAnimTileDict
+.loop
+ ld a, [hl]
+ and a
+ jr z, .okay
+ inc hl
+ inc hl
+ jr .loop
+
+.okay
+ ld a, $28
+ ld [hli], a
+ ld a, $42
+ ld [hli], a
+ ld a, $29
+ ld [hli], a
+ ld a, $49
+ ld [hl], a
+
+ ld hl, VTiles0 tile $73
+ ld de, VTiles2 tile $06
+ ld a, $70
+ ld [wBattleAnimTemp0], a
+ ld a, $7
+ call .LoadFootprint
+ ld de, VTiles2 tile $31
+ ld a, $60
+ ld [wBattleAnimTemp0], a
+ ld a, $6
+ call .LoadFootprint
+ ret
+
+.LoadFootprint: ; cc561 (33:4561)
+ push af
+ push hl
+ push de
+ lb bc, BANK(BattleAnimCmd_EnemyFeetObj), 1
+ call Request2bpp
+ pop de
+ ld a, [wBattleAnimTemp0]
+ ld l, a
+ ld h, 0
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ ld bc, 1 tiles
+ add hl, bc
+ pop af
+ dec a
+ jr nz, .LoadFootprint
+ ret
+
+BattleAnimCmd_PlayerHeadObj: ; cc57e (33:457e)
+
+ ld hl, wBattleAnimTileDict
+.loop
+ ld a, [hl]
+ and a
+ jr z, .okay
+ inc hl
+ inc hl
+ jr .loop
+
+.okay
+ ld a, $28
+ ld [hli], a
+ ld a, $35
+ ld [hli], a
+ ld a, $29
+ ld [hli], a
+ ld a, $43
+ ld [hl], a
+
+ ld hl, VTiles0 tile $66
+ ld de, VTiles2 tile $05
+ ld a, $70
+ ld [wBattleAnimTemp0], a
+ ld a, $7
+ call .LoadHead
+ ld de, VTiles2 tile $31
+ ld a, $60
+ ld [wBattleAnimTemp0], a
+ ld a, $6
+ call .LoadHead
+ ret
+
+.LoadHead: ; cc5b3 (33:45b3)
+ push af
+ push hl
+ push de
+ lb bc, BANK(BattleAnimCmd_EnemyFeetObj), 2
+ call Request2bpp
+ pop de
+ ld a, [wBattleAnimTemp0]
+ ld l, a
+ ld h, 0
+ add hl, de
+ ld e, l
+ ld d, h
+ pop hl
+ ld bc, 2 tiles
+ add hl, bc
+ pop af
+ dec a
+ jr nz, .LoadHead
+ ret
+
+BattleAnimCmd_CheckPokeball: ; cc5d0 (33:45d0)
+ callfar GetPokeBallWobble
+ ld a, c
+ ld [BattleAnimVar], a
+ ret
+
+BattleAnimCmd_E7: ; cc5db (33:45db)
+ ret
+
+BattleAnimCmd_Transform: ; cc5dc (33:45dc)
+ ld a, [rSVBK]
+ push af
+ ld a, 1
+ ld [rSVBK], a
+ ld a, [CurPartySpecies] ; CurPartySpecies
+ push af
+
+ ld a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ ld a, [TempBattleMonSpecies] ; TempBattleMonSpecies
+ ld [CurPartySpecies], a ; CurPartySpecies
+ ld hl, BattleMonDVs ; BattleMonDVs
+ predef GetUnownLetter
+ ld de, VTiles0 tile $00
+ predef GetMonFrontpic
+ jr .done
+
+.player
+ ld a, [TempEnemyMonSpecies] ; TempEnemyMonSpecies
+ ld [CurPartySpecies], a ; CurPartySpecies
+ ld hl, EnemyMonDVs ; EnemyMonDVs
+ predef GetUnownLetter
+ ld de, VTiles0 tile $00
+ predef GetMonBackpic
+
+.done
+ pop af
+ ld [CurPartySpecies], a ; CurPartySpecies
+ pop af
+ ld [rSVBK], a
+ ret
+
+BattleAnimCmd_UpdateActorPic: ; cc622 (33:4622)
+
+ ld de, VTiles0 tile $00
+ ld a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ ld hl, VTiles2 tile $00
+ ld b, 0
+ ld c, $31
+ call Request2bpp
+ ret
+
+.player
+ ld hl, VTiles2 tile $31
+ ld b, 0
+ ld c, $24
+ call Request2bpp
+ ret
+
+BattleAnimCmd_RaiseSub: ; cc640 (33:4640)
+
+ ld a, [rSVBK]
+ push af
+ ld a, 1
+ ld [rSVBK], a
+ xor a
+ call GetSRAMBank
+
+GetSubstitutePic: ; cc64c
+
+ ld hl, sScratch
+ ld bc, (7 * 7) tiles
+.loop
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+
+ ld a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ ld hl, MonsterSpriteGFX + 0 tiles
+ ld de, sScratch + (2 * 7 + 5) tiles
+ call .CopyTile
+ ld hl, MonsterSpriteGFX + 1 tiles
+ ld de, sScratch + (3 * 7 + 5) tiles
+ call .CopyTile
+ ld hl, MonsterSpriteGFX + 2 tiles
+ ld de, sScratch + (2 * 7 + 6) tiles
+ call .CopyTile
+ ld hl, MonsterSpriteGFX + 3 tiles
+ ld de, sScratch + (3 * 7 + 6) tiles
+ call .CopyTile
+
+ ld hl, VTiles2 tile $00
+ ld de, sScratch
+ lb bc, BANK(GetSubstitutePic), 7 * 7
+ call Request2bpp
+ jr .done
+
+.player
+ ld hl, MonsterSpriteGFX + 4 tiles
+ ld de, sScratch + (2 * 6 + 4) tiles
+ call .CopyTile
+ ld hl, MonsterSpriteGFX + 5 tiles
+ ld de, sScratch + (3 * 6 + 4) tiles
+ call .CopyTile
+ ld hl, MonsterSpriteGFX + 6 tiles
+ ld de, sScratch + (2 * 6 + 5) tiles
+ call .CopyTile
+ ld hl, MonsterSpriteGFX + 7 tiles
+ ld de, sScratch + (3 * 6 + 5) tiles
+ call .CopyTile
+
+ ld hl, VTiles2 tile $31
+ ld de, sScratch
+ lb bc, BANK(GetSubstitutePic), 6 * 6
+ call Request2bpp
+
+.done
+ call CloseSRAM
+ pop af
+ ld [rSVBK], a
+ ret
+
+.CopyTile: ; cc6c6 (33:46c6)
+ ld bc, 1 tiles
+ ld a, BANK(MonsterSpriteGFX)
+ call FarCopyBytes
+ ret
+
+BattleAnimCmd_MinimizeOpp: ; cc6cf (33:46cf)
+ ld a, [rSVBK]
+ push af
+ ld a, $1
+ ld [rSVBK], a
+ xor a
+ call GetSRAMBank
+ call GetMinimizePic
+ call Request2bpp
+ call CloseSRAM
+ pop af
+ ld [rSVBK], a
+ ret
+
+GetMinimizePic: ; cc6e7 (33:46e7)
+ ld hl, sScratch
+ ld bc, $31 tiles
+.loop
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+
+ ld a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ ld de, sScratch + $1a tiles
+ call CopyMinimizePic
+ ld hl, VTiles2 tile $00
+ ld de, sScratch
+ lb bc, BANK(GetMinimizePic), $31
+ ret
+
+.player
+ ld de, sScratch + $160
+ call CopyMinimizePic
+ ld hl, VTiles2 tile $31
+ ld de, sScratch
+ lb bc, BANK(GetMinimizePic), $24
+ ret
+
+CopyMinimizePic: ; cc719 (33:4719)
+ ld hl, MinimizePic
+ ld bc, $10
+ ld a, BANK(MinimizePic)
+ call FarCopyBytes
+ ret
+; cc725 (33:4725)
+
+MinimizePic: ; cc725
+INCBIN "gfx/battle/minimize.2bpp"
+; cc735
+
+BattleAnimCmd_Minimize: ; cc735 (33:4735)
+ ld a, [rSVBK]
+ push af
+ ld a, $1
+ ld [rSVBK], a
+ xor a
+ call GetSRAMBank
+ call GetMinimizePic
+ ld hl, VTiles0 tile $00
+ call Request2bpp
+ call CloseSRAM
+ pop af
+ ld [rSVBK], a
+ ret
+
+BattleAnimCmd_DropSub: ; cc750 (33:4750)
+ ld a, [rSVBK]
+ push af
+ ld a, $1
+ ld [rSVBK], a
+
+ ld a, [CurPartySpecies] ; CurPartySpecies
+ push af
+ ld a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ callfar DropEnemySub
+ jr .done
+
+.player
+ callfar DropPlayerSub
+
+.done
+ pop af
+ ld [CurPartySpecies], a ; CurPartySpecies
+ pop af
+ ld [rSVBK], a
+ ret
+
+BattleAnimCmd_BeatUp: ; cc776 (33:4776)
+ ld a, [rSVBK]
+ push af
+ ld a, $1
+ ld [rSVBK], a
+ ld a, [CurPartySpecies] ; CurPartySpecies
+ push af
+
+ ld a, [wBattleAnimParam]
+ ld [CurPartySpecies], a ; CurPartySpecies
+
+ ld a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ ld hl, BattleMonDVs
+ predef GetUnownLetter
+ ld de, VTiles2 tile $00
+ predef GetMonFrontpic
+ jr .done
+
+.player
+ ld hl, EnemyMonDVs
+ predef GetUnownLetter
+ ld de, VTiles2 tile $31
+ predef GetMonBackpic
+
+.done
+ pop af
+ ld [CurPartySpecies], a ; CurPartySpecies
+ ld b, SCGB_BATTLE_COLORS
+ call GetSGBLayout
+ pop af
+ ld [rSVBK], a
+ ret
+
+BattleAnimCmd_OAMOn: ; cc7bb (33:47bb)
+ xor a
+ ld [hOAMUpdate], a
+ ret
+
+BattleAnimCmd_OAMOff: ; cc7bf (33:47bf)
+ ld a, $1
+ ld [hOAMUpdate], a
+ ret
+
+BattleAnimCmd_ClearSprites: ; cc7c4 (33:47c4)
+ ld hl, BattleAnimFlags
+ set 3, [hl]
+ ret
+
+BattleAnimCmd_F5: ; cc7ca (33:47ca)
+ ret
+
+BattleAnimCmd_F6: ; cc7cb (33:47cb)
+ ret
+
+BattleAnimCmd_F7: ; cc7cc (33:47cc)
+ ret
+
+BattleAnimCmd_Sound: ; cc7cd (33:47cd)
+ call GetBattleAnimByte
+ ld e, a
+ srl a
+ srl a
+ ld [wSFXDuration], a
+ call .GetCryTrack
+ and 3
+ ld [CryTracks], a ; CryTracks
+
+ ld e, a
+ ld d, 0
+ ld hl, .GetPanning
+ add hl, de
+ ld a, [hl]
+ ld [wStereoPanningMask], a
+
+ call GetBattleAnimByte
+ ld e, a
+ ld d, 0
+ callfar PlayStereoSFX
+
+ ret
+; cc7f8 (33:47f8)
+
+.GetPanning: ; cc7f8
+ db $f0, $0f, $f0, $0f
+; cc7fc
+
+.GetCryTrack: ; cc7fc (33:47fc)
+ ld a, [hBattleTurn]
+ and a
+ jr nz, .enemy
+
+ ld a, e
+ ret
+
+.enemy
+ ld a, e
+ xor 1
+ ret
+
+BattleAnimCmd_Cry: ; cc807 (33:4807)
+ call GetBattleAnimByte
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, .CryData
+rept 4
+ add hl, de
+endr
+
+ ld a, [rSVBK]
+ push af
+ ld a, 1
+ ld [rSVBK], a
+
+ ld a, [hBattleTurn]
+ and a
+ jr nz, .enemy
+
+ ld a, $f0
+ ld [CryTracks], a ; CryTracks
+ ld a, [BattleMonSpecies] ; BattleMonSpecies
+ jr .done_cry_tracks
+
+.enemy
+ ld a, $0f
+ ld [CryTracks], a ; CryTracks
+ ld a, [EnemyMonSpecies] ; EnemyMon
+
+.done_cry_tracks
+ push hl
+ call LoadCryHeader
+ pop hl
+ jr c, .done
+
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+
+ push hl
+ ld hl, CryPitch
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, bc
+ ld a, l
+ ld [CryPitch], a
+ ld a, h
+ ld [CryPitch + 1], a
+ pop hl
+
+ ld a, [hli]
+ ld c, a
+ ld b, [hl]
+ ld hl, CryLength ; CryLength
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, bc
+
+ ld a, l
+ ld [CryLength], a ; CryLength
+ ld a, h
+ ld [CryLength + 1], a
+ ld a, 1
+ ld [wStereoPanningMask], a
+
+ callfar _PlayCryHeader
+
+.done
+ pop af
+ ld [rSVBK], a
+ ret
+; cc871 (33:4871)
+
+.CryData: ; cc871
+; +pitch, +length
+ dw $0000, $00c0
+ dw $0000, $0040
+ dw $0000, $0000
+ dw $0000, $0000
+; cc881
+
+
+PlayHitSound: ; cc881
+ ld a, [wNumHits]
+ cp $1
+ jr z, .okay
+ cp $4
+ ret nz
+
+.okay
+ ld a, [TypeModifier]
+ and $7f
+ ret z
+
+ cp 10
+ ld de, SFX_DAMAGE
+ jr z, .play
+
+ ld de, SFX_SUPER_EFFECTIVE
+ jr nc, .play
+
+ ld de, SFX_NOT_VERY_EFFECTIVE
+
+.play
+ call PlaySFX
+ ret
+; cc8a4
+
+BattleAnimAssignPals: ; cc8a4
+ ld a, [hCGB]
+ and a
+ jr nz, .cgb
+ ld a, [hSGB]
+ and a
+ ld a, %11100000
+ jr z, .sgb
+ ld a, %11110000
+
+.sgb
+ ld [wOBP0], a
+ ld a, %11100100
+ ld [wBGP], a
+ ld [wOBP1], a
+ ret
+
+.cgb
+ ld a, %11100100
+ ld [wBGP], a
+ ld [wOBP0], a
+ ld [wOBP1], a
+ call DmgToCgbBGPals
+ lb de, %11100100, %11100100
+ call DmgToCgbObjPals
+ ret
+; cc8d3
+
+ClearBattleAnims: ; cc8d3
+; Clear animation block
+ ld hl, LYOverrides
+ ld bc, wBattleAnimEnd - LYOverrides
+.loop
+ ld [hl], $0
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+
+ ld hl, FXAnimID
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, BattleAnimations
+ add hl, de
+ add hl, de
+ call GetBattleAnimPointer
+ call BattleAnimAssignPals
+ call BattleAnimDelayFrame
+ ret
+; cc8f6
+
+BattleAnim_RevertPals: ; cc8f6
+ call WaitTop
+ ld a, %11100100
+ ld [wBGP], a
+ ld [wOBP0], a
+ ld [wOBP1], a
+ call DmgToCgbBGPals
+ lb de, %11100100, %11100100
+ call DmgToCgbObjPals
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ call BattleAnimDelayFrame
+ ld a, $1
+ ld [hBGMapMode], a
+ ret
+; cc91a
+
+BattleAnim_SetBGPals: ; cc91a
+ ld [rBGP], a
+ ld a, [hCGB]
+ and a
+ ret z
+ ld a, [rSVBK]
+ push af
+ ld a, $5
+ ld [rSVBK], a
+ ld hl, BGPals
+ ld de, UnknBGPals
+ ld a, [rBGP]
+ ld b, a
+ ld c, 7
+ call CopyPals
+ ld hl, OBPals
+ ld de, UnknOBPals
+ ld a, [rBGP]
+ ld b, a
+ ld c, 2
+ call CopyPals
+ pop af
+ ld [rSVBK], a
+ ld a, $1
+ ld [hCGBPalUpdate], a
+ ret
+; cc94b
+
+BattleAnim_SetOBPals: ; cc94b
+ ld [rOBP0], a
+ ld a, [hCGB]
+ and a
+ ret z
+ ld a, [rSVBK]
+ push af
+ ld a, $5
+ ld [rSVBK], a
+ ld hl, OBPals palette PAL_BATTLE_OB_GRAY
+ ld de, UnknOBPals palette PAL_BATTLE_OB_GRAY
+ ld a, [rOBP0]
+ ld b, a
+ ld c, 2
+ call CopyPals
+ pop af
+ ld [rSVBK], a
+ ld a, $1
+ ld [hCGBPalUpdate], a
+ ret
+; cc96e
+
+BattleAnim_UpdateOAM_All: ; cc96e
+ ld a, $0
+ ld [wBattleAnimOAMPointerLo], a
+ ld hl, ActiveAnimObjects
+ ld e, 10
+.loop
+ ld a, [hl]
+ and a
+ jr z, .next
+ ld c, l
+ ld b, h
+ push hl
+ push de
+ call DoBattleAnimFrame
+ call BattleAnimOAMUpdate
+ pop de
+ pop hl
+ jr c, .done
+
+.next
+ ld bc, BATTLEANIMSTRUCT_LENGTH
+ add hl, bc
+ dec e
+ jr nz, .loop
+ ld a, [wBattleAnimOAMPointerLo]
+ ld l, a
+ ld h, HIGH(Sprites)
+.loop2
+ ld a, l
+ cp LOW(SpritesEnd)
+ jr nc, .done
+ xor a
+ ld [hli], a
+ jr .loop2
+
+.done
+ ret
+; cc9a1