summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlibjet <libj3t@gmail.com>2020-06-05 17:14:55 +0100
committerlibjet <libj3t@gmail.com>2020-06-05 17:14:55 +0100
commit8ccc59b89445976e9e9bdc77ba797b51290a1e8f (patch)
tree766e95b767ba7525debe381c9c0bfba84c130f8c
parentdf30cbf05bb10dd3d770746a570e58e445683374 (diff)
Add engine/battle_anims/anim_commands.asm
-rw-r--r--constants/battle_anim_constants.asm2
-rwxr-xr-xengine/battle_anims/anim_commands.asm1358
-rwxr-xr-xgfx/battle/minimize.2bppbin0 -> 16 bytes
-rwxr-xr-xgfx/battle/minimize.pngbin0 -> 85 bytes
-rw-r--r--main.asm26
5 files changed, 1374 insertions, 12 deletions
diff --git a/constants/battle_anim_constants.asm b/constants/battle_anim_constants.asm
index 1b57b240..57bbfcc8 100644
--- a/constants/battle_anim_constants.asm
+++ b/constants/battle_anim_constants.asm
@@ -807,6 +807,8 @@ BATTLEANIM_BASE_TILE EQU 7 * 7 ; Maximum size of a pokemon picture
const ANIM_GFX_ANGELS
const ANIM_GFX_WAVE
const ANIM_GFX_AEROBLAST
+ const ANIM_GFX_PLAYERHEAD
+ const ANIM_GFX_ENEMYFEET
; battle_bg_effect struct members (see macros/wram.asm)
const_def
diff --git a/engine/battle_anims/anim_commands.asm b/engine/battle_anims/anim_commands.asm
new file mode 100755
index 00000000..6ec670d0
--- /dev/null
+++ b/engine/battle_anims/anim_commands.asm
@@ -0,0 +1,1358 @@
+; Battle animation command interpreter.
+
+PlayBattleAnim:
+ ld c, 6
+.wait
+ call BattleAnimDelayFrame
+ dec c
+ jr nz, .wait
+
+ call BattleAnimAssignPals
+ call BattleAnimRequestPals
+ call BattleAnimDelayFrame
+
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+
+ ld [hl], 1
+ call BattleAnimRunScript
+
+ pop af
+ ldh [hVBlank], a
+
+ ld a, 1
+ ldh [hBGMapMode], a
+
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call WaitSFX
+ ret
+
+BattleAnimRunScript:
+ ld a, [wFXAnimID + 1]
+ and a
+ jr nz, .hi_byte
+
+ ld a, [wOptions]
+ bit 7, a
+ jr nz, .disabled
+
+ call BattleAnimClearHud
+ call RunBattleAnimScript
+
+ call BattleAnimAssignPals
+ call BattleAnimRequestPals
+
+ xor a
+ ldh [hSCX], a
+ ldh [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 [wFXAnimID], a
+ ld a, h
+ ld [wFXAnimID + 1], a
+
+.hi_byte
+ call WaitSFX
+ call PlayHitSound
+ call RunBattleAnimScript
+
+.done
+ call BattleAnim_RevertPals
+ ret
+
+RunBattleAnimScript:
+ call ClearBattleAnims
+
+.playframe
+ call RunBattleAnimCommand
+ call _ExecuteBGEffects
+ call BattleAnim_UpdateOAM_All
+ call PushLYOverrides
+ call BattleAnimRequestPals
+
+; Speed up Rollout's animation.
+ ld a, [wFXAnimID + 1]
+ or a
+ jr nz, .not_rollout
+
+ ld a, [wFXAnimID]
+ cp ROLLOUT
+ jr nz, .not_rollout
+
+ ld a, ANIM_BG_2D
+ ld b, NUM_BG_EFFECTS
+ ld de, BG_EFFECT_STRUCT_LENGTH
+ ld hl, wBGEffect1Function
+.find
+ cp [hl]
+ jr z, .done
+ add hl, de
+ dec b
+ jr nz, .find
+
+.not_rollout
+ call BattleAnimDelayFrame
+
+.done
+ ld a, [wBattleAnimFlags]
+ bit BATTLEANIM_STOP_F, a
+ jr z, .playframe
+
+ call BattleAnim_ClearOAM
+ ret
+
+BattleAnimClearHud:
+ call BattleAnimDelayFrame
+ call WaitTop
+ call ClearActorHud
+ ld a, $1
+ ldh [hBGMapMode], a
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call WaitTop
+ ret
+
+BattleAnimRestoreHuds:
+ call BattleAnimDelayFrame
+ call WaitTop
+
+ ld hl, UpdateBattleHuds
+ ld a, BANK(UpdatePlayerHUD)
+ rst FarCall
+
+ ld a, $1
+ ldh [hBGMapMode], a
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call BattleAnimDelayFrame
+ call WaitTop
+ ret
+
+BattleAnimRequestPals:
+ ldh a, [hCGB]
+ and a
+ ret z
+
+ ldh a, [rBGP]
+ ld b, a
+ ld a, [wBGP]
+ cp b
+ call nz, BattleAnim_SetBGPals
+
+ ldh a, [rOBP0]
+ ld b, a
+ ld a, [wOBP0]
+ cp b
+ call nz, BattleAnim_SetOBPals
+ ret
+
+BattleAnimDelayFrame:
+; Like DelayFrame but wastes battery life.
+
+ ld a, 1
+ ld [wVBlankOccurred], a
+.wait
+ ld a, [wVBlankOccurred]
+ and a
+ jr nz, .wait
+ ret
+
+ClearActorHud:
+ ldh 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
+
+Unreferenced_Functioncc1ff:
+ xor a
+ ldh [hBGMapMode], a
+ ld a, LOW(vBGMap0 tile $28)
+ ldh [hBGMapAddress], a
+ ld a, HIGH(vBGMap0 tile $28)
+ ldh [hBGMapAddress + 1], a
+ call WaitBGMap2
+ ld a, $60
+ ldh [hWY], a
+ xor a ; LOW(vBGMap0)
+ ldh [hBGMapAddress], a
+ ld a, HIGH(vBGMap0)
+ ldh [hBGMapAddress + 1], a
+ call BattleAnimDelayFrame
+ ret
+
+BattleAnim_ClearOAM:
+ ld a, [wBattleAnimFlags]
+ bit BATTLEANIM_KEEPSPRITES_F, a
+ jr z, .delete
+
+ ; Instead of deleting the sprites, make them all use PAL_BATTLE_OB_ENEMY
+ ld hl, wVirtualOAMSprite00Attributes
+ ld c, NUM_SPRITE_OAM_STRUCTS
+.loop
+ ld a, [hl]
+ and $ff ^ (PALETTE_MASK | VRAM_BANK_1) ; PAL_BATTLE_OB_ENEMY (0)
+ ld [hli], a
+rept SPRITEOAMSTRUCT_LENGTH - 1
+ inc hl
+endr
+ dec c
+ jr nz, .loop
+ ret
+
+.delete
+ ld hl, wVirtualOAM
+ ld c, wVirtualOAMEnd - wVirtualOAM
+ xor a
+.loop2
+ ld [hli], a
+ dec c
+ jr nz, .loop2
+ ret
+
+RunBattleAnimCommand:
+ call .CheckTimer
+ ret nc
+ call .RunScript
+ ret
+
+.CheckTimer:
+ ld a, [wBattleAnimDelay]
+ and a
+ jr z, .done
+
+ dec a
+ ld [wBattleAnimDelay], a
+ and a
+ ret
+
+.done
+ scf
+ ret
+
+.RunScript:
+.loop
+ call GetBattleAnimByte
+
+ cp anim_ret_command
+ jr nz, .not_done_with_anim
+
+; Return from a subroutine.
+ ld hl, wBattleAnimFlags
+ bit BATTLEANIM_IN_SUBROUTINE_F, [hl]
+ jr nz, .do_anim
+
+ set BATTLEANIM_STOP_F, [hl]
+ ret
+
+.not_done_with_anim
+ cp anim_obj_command
+ jr nc, .do_anim
+
+ ld [wBattleAnimDelay], a
+ ret
+
+.do_anim
+ call .DoCommand
+
+ jr .loop
+
+.DoCommand:
+; Execute battle animation command in [wBattleAnimByte].
+ ld a, [wBattleAnimByte]
+ sub anim_obj_command
+
+ 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
+
+BattleAnimCommands::
+; entries correspond to macros/scripts/battle_anims.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_BattlerGFX_1Row
+ dw BattleAnimCmd_BattlerGFX_2Row
+ 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_E8
+ dw BattleAnimCmd_E9
+ 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_KeepSprites
+ 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_E8:
+BattleAnimCmd_E9:
+BattleAnimCmd_EA:
+BattleAnimCmd_EB:
+BattleAnimCmd_EC:
+BattleAnimCmd_ED:
+ ret
+
+BattleAnimCmd_Ret:
+ ld hl, wBattleAnimFlags
+ res BATTLEANIM_IN_SUBROUTINE_F, [hl]
+ ld hl, wBattleAnimParent
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, wBattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_Call:
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ push de
+ ld hl, wBattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, wBattleAnimParent
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ pop de
+ ld hl, wBattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, wBattleAnimFlags
+ set BATTLEANIM_IN_SUBROUTINE_F, [hl]
+ ret
+
+BattleAnimCmd_Jump:
+ call GetBattleAnimByte
+ ld e, a
+ call GetBattleAnimByte
+ ld d, a
+ ld hl, wBattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_Loop:
+ call GetBattleAnimByte
+ ld hl, wBattleAnimFlags
+ bit BATTLEANIM_IN_LOOP_F, [hl]
+ jr nz, .continue_loop
+ and a
+ jr z, .perpetual
+ dec a
+ set BATTLEANIM_IN_LOOP_F, [hl]
+ ld [wBattleAnimLoops], a
+.continue_loop
+ ld hl, wBattleAnimLoops
+ 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, wBattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+.return_from_loop
+ ld hl, wBattleAnimFlags
+ res BATTLEANIM_IN_LOOP_F, [hl]
+ ld hl, wBattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+BattleAnimCmd_JumpUntil:
+ 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, wBattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+.dont_jump
+ ld hl, wBattleAnimAddress
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ret
+
+BattleAnimCmd_SetVar:
+ call GetBattleAnimByte
+ ld [wBattleAnimVar], a
+ ret
+
+BattleAnimCmd_IncVar:
+ ld hl, wBattleAnimVar
+ inc [hl]
+ ret
+
+BattleAnimCmd_IfVarEqual:
+ call GetBattleAnimByte
+ ld hl, wBattleAnimVar
+ cp [hl]
+ jr z, .jump
+
+ ld hl, wBattleAnimAddress
+ 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, wBattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_IfParamEqual:
+ call GetBattleAnimByte
+ ld hl, wBattleAnimParam
+ cp [hl]
+ jr z, .jump
+
+ ld hl, wBattleAnimAddress
+ 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, wBattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+
+BattleAnimCmd_IfParamAnd:
+ call GetBattleAnimByte
+ ld e, a
+ ld a, [wBattleAnimParam]
+ and e
+ jr nz, .jump
+
+ ld hl, wBattleAnimAddress
+ 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, wBattleAnimAddress
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ret
+
+BattleAnimCmd_Obj:
+; index, x, y, param
+ call GetBattleAnimByte
+ ld [wBattleObjectTempID], a
+ call GetBattleAnimByte
+ ld [wBattleObjectTempXCoord], a
+ call GetBattleAnimByte
+ ld [wBattleObjectTempYCoord], a
+ call GetBattleAnimByte
+ ld [wBattleObjectTempParam], a
+ call QueueBattleAnimation
+ ret
+
+BattleAnimCmd_BGEffect:
+ 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:
+ call GetBattleAnimByte
+ ld [wBGP], a
+ ret
+
+BattleAnimCmd_OBP0:
+ call GetBattleAnimByte
+ ld [wOBP0], a
+ ret
+
+BattleAnimCmd_OBP1:
+ call GetBattleAnimByte
+ ld [wOBP1], a
+ ret
+
+BattleAnimCmd_ResetObp0:
+ ldh a, [hSGB]
+ and a
+ ld a, $e0
+ jr z, .not_sgb
+ ld a, $f0
+.not_sgb
+ ld [wOBP0], a
+ ret
+
+BattleAnimCmd_ClearObjs:
+; BUG: This function only clears the first 6⅔ objects
+ ld hl, wActiveAnimObjects
+ ld a, $a0 ; should be NUM_ANIM_OBJECTS * BATTLEANIMSTRUCT_LENGTH
+.loop
+ ld [hl], 0
+ inc hl
+ dec a
+ jr nz, .loop
+ ret
+
+BattleAnimCmd_1GFX:
+BattleAnimCmd_2GFX:
+BattleAnimCmd_3GFX:
+BattleAnimCmd_4GFX:
+BattleAnimCmd_5GFX:
+ ld a, [wBattleAnimByte]
+ and $f
+ ld c, a
+ ld hl, wBattleAnimTileDict
+ xor a
+ ld [wBattleAnimTemp0], a
+.loop
+ ld a, [wBattleAnimTemp0]
+ cp (vTiles1 - vTiles0) / LEN_2BPP_TILE - BATTLEANIM_BASE_TILE
+ 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 BATTLEANIM_BASE_TILE
+ add hl, de
+ ld a, [wBattleAnimByte]
+ call LoadBattleAnimGFX
+ ld a, [wBattleAnimTemp0]
+ add c
+ ld [wBattleAnimTemp0], a
+ pop hl
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+
+BattleAnimCmd_IncObj:
+ call GetBattleAnimByte
+ ld e, NUM_ANIM_OBJECTS
+ ld bc, wActiveAnimObjects
+.loop
+ ld hl, BATTLEANIMSTRUCT_INDEX
+ add hl, bc
+ ld d, [hl]
+ ld a, [wBattleAnimByte]
+ 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:
+ call GetBattleAnimByte
+ ld e, NUM_BG_EFFECTS
+ ld bc, wBGEffect1Function
+.loop
+ ld hl, $0
+ add hl, bc
+ ld d, [hl]
+ ld a, [wBattleAnimByte]
+ 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:
+ call GetBattleAnimByte
+ ld e, NUM_ANIM_OBJECTS
+ ld bc, wActiveAnimObjects
+.loop
+ ld hl, BATTLEANIMSTRUCT_INDEX
+ add hl, bc
+ ld d, [hl]
+ ld a, [wBattleAnimByte]
+ 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_BattlerGFX_1Row:
+ ld hl, wBattleAnimTileDict
+.loop
+ ld a, [hl]
+ and a
+ jr z, .okay
+ inc hl
+ inc hl
+ jr .loop
+
+.okay
+ ld a, ANIM_GFX_PLAYERHEAD
+ ld [hli], a
+ ld a, ($80 - 6 - 7) - BATTLEANIM_BASE_TILE
+ ld [hli], a
+ ld a, ANIM_GFX_ENEMYFEET
+ ld [hli], a
+ ld a, ($80 - 6) - BATTLEANIM_BASE_TILE
+ ld [hl], a
+
+ ld hl, vTiles0 tile ($80 - 6 - 7)
+ ld de, vTiles2 tile $06 ; Enemy feet start tile
+ ld a, 7 tiles ; Enemy pic height
+ ld [wBattleAnimTemp0], a
+ ld a, 7 ; Copy 7x1 tiles
+ call .LoadFeet
+ ld de, vTiles2 tile $31 ; Player head start tile
+ ld a, 6 tiles ; Player pic height
+ ld [wBattleAnimTemp0], a
+ ld a, 6 ; Copy 6x1 tiles
+ call .LoadFeet
+ ret
+
+.LoadFeet:
+ push af
+ push hl
+ push de
+ lb bc, BANK(@), 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, .LoadFeet
+ ret
+
+BattleAnimCmd_BattlerGFX_2Row:
+ ld hl, wBattleAnimTileDict
+.loop
+ ld a, [hl]
+ and a
+ jr z, .okay
+ inc hl
+ inc hl
+ jr .loop
+
+.okay
+ ld a, ANIM_GFX_PLAYERHEAD
+ ld [hli], a
+ ld a, ($80 - 6 * 2 - 7 * 2) - BATTLEANIM_BASE_TILE
+ ld [hli], a
+ ld a, ANIM_GFX_ENEMYFEET
+ ld [hli], a
+ ld a, ($80 - 6 * 2) - BATTLEANIM_BASE_TILE
+ ld [hl], a
+
+ ld hl, vTiles0 tile ($80 - 6 * 2 - 7 * 2)
+ ld de, vTiles2 tile $05 ; Enemy feet start tile
+ ld a, 7 tiles ; Enemy pic height
+ ld [wBattleAnimTemp0], a
+ ld a, 7 ; Copy 7x2 tiles
+ call .LoadHead
+ ld de, vTiles2 tile $31 ; Player head start tile
+ ld a, 6 tiles ; Player pic height
+ ld [wBattleAnimTemp0], a
+ ld a, 6 ; Copy 6x2 tiles
+ call .LoadHead
+ ret
+
+.LoadHead:
+ push af
+ push hl
+ push de
+ lb bc, BANK(@), 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:
+ callfar GetPokeBallWobble
+ ld a, c
+ ld [wBattleAnimVar], a
+ ret
+
+BattleAnimCmd_E7:
+ ret
+
+BattleAnimCmd_Transform:
+ ld a, [wCurPartySpecies]
+ push af
+
+ ldh a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ ld a, [wTempBattleMonSpecies] ; TempBattleMonSpecies
+ ld [wCurPartySpecies], a ; CurPartySpecies
+ ld hl, wBattleMonDVs ; BattleMonDVs
+ predef GetUnownLetter
+ ld de, vTiles2 tile $00
+ predef GetMonFrontpic
+ jr .done
+
+.player
+ ld a, [wTempEnemyMonSpecies] ; TempEnemyMonSpecies
+ ld [wCurPartySpecies], a ; CurPartySpecies
+ ld hl, wEnemyMonDVs ; EnemyMonDVs
+ predef GetUnownLetter
+ ld de, vTiles2 tile $31
+ predef GetMonBackpic
+
+.done
+ pop af
+ ld [wCurPartySpecies], a
+ ret
+
+BattleAnimCmd_RaiseSub:
+ xor a
+ call OpenSRAM
+
+GetSubstitutePic: ; used only for BANK(GetSubstitutePic)
+ ld hl, sScratch
+ ld bc, (7 * 7) tiles
+.loop
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+
+ ldh 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
+ ret
+
+.CopyTile:
+ ld bc, 1 tiles
+ ld a, BANK(MonsterSpriteGFX)
+ call FarCopyBytes
+ ret
+
+BattleAnimCmd_MinimizeOpp:
+ xor a
+ call OpenSRAM
+
+GetMinimizePic:
+ ld hl, sScratch
+ ld bc, (7 * 7) tiles
+.loop
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+
+ ldh 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), 7 * 7
+ call Request2bpp
+ jr .done
+
+.player
+ ld de, sScratch + $160
+ call CopyMinimizePic
+ ld hl, vTiles2 tile $31
+ ld de, sScratch
+ lb bc, BANK(GetMinimizePic), 6 * 6
+ call Request2bpp
+
+.done
+ call CloseSRAM
+ ret
+
+CopyMinimizePic:
+ ld hl, MinimizePic
+ ld bc, $10
+ ld a, BANK(MinimizePic)
+ call FarCopyBytes
+ ret
+
+MinimizePic:
+INCBIN "gfx/battle/minimize.2bpp"
+
+BattleAnimCmd_DropSub:
+ ld a, [wCurPartySpecies]
+ push af
+ ldh a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ callfar DropEnemySub
+ jr .done
+
+.player
+ callfar DropPlayerSub
+
+.done
+ pop af
+ ld [wCurPartySpecies], a
+ ret
+
+BattleAnimCmd_BeatUp:
+ ld a, [wCurPartySpecies]
+ push af
+
+ ld a, [wBattleAnimParam]
+ ld [wCurPartySpecies], a
+
+ ldh a, [hBattleTurn]
+ and a
+ jr z, .player
+
+ ld hl, wBattleMonDVs
+ predef GetUnownLetter
+ ld de, vTiles2 tile $00
+ predef GetMonFrontpic
+ jr .done
+
+.player
+ ld hl, wEnemyMonDVs
+ predef GetUnownLetter
+ ld de, vTiles2 tile $31
+ predef GetMonBackpic
+
+.done
+ pop af
+ ld [wCurPartySpecies], a ; CurPartySpecies
+ ld b, SCGB_BATTLE_COLORS
+ call GetSGBLayout
+ ret
+
+BattleAnimCmd_OAMOn:
+ ret
+
+BattleAnimCmd_OAMOff:
+ ret
+
+BattleAnimCmd_KeepSprites:
+ ld hl, wBattleAnimFlags
+ set BATTLEANIM_KEEPSPRITES_F, [hl]
+ ret
+
+BattleAnimCmd_F5:
+ ret
+
+BattleAnimCmd_F6:
+ ret
+
+BattleAnimCmd_F7:
+ ret
+
+BattleAnimCmd_Sound:
+ call GetBattleAnimByte
+ ld e, a
+ srl a
+ srl a
+ ld [wSFXDuration], a
+ call .GetCryTrack
+ maskbits NUM_NOISE_CHANS
+ ld [wCryTracks], a
+
+ 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
+
+.GetPanning:
+ db $f0, $0f, $f0, $0f
+
+.GetCryTrack:
+ ldh a, [hBattleTurn]
+ and a
+ jr nz, .enemy
+
+ ld a, e
+ ret
+
+.enemy
+ ld a, e
+ xor 1
+ ret
+
+BattleAnimCmd_Cry:
+ call GetBattleAnimByte
+ maskbits NUM_NOISE_CHANS
+ ld e, a
+ ld d, 0
+ ld hl, .CryData
+rept 4
+ add hl, de
+endr
+
+ ldh a, [hBattleTurn]
+ and a
+ jr nz, .enemy
+
+ ld a, $f0
+ ld [wCryTracks], a
+ ld a, [wBattleMonSpecies]
+ jr .done_cry_tracks
+
+.enemy
+ ld a, $0f
+ ld [wCryTracks], a
+ ld a, [wEnemyMonSpecies]
+
+.done_cry_tracks
+ push hl
+ call LoadCry
+ pop hl
+ jr c, .done
+
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+
+ push hl
+ ld hl, wCryPitch
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, bc
+ ld a, l
+ ld [wCryPitch], a
+ ld a, h
+ ld [wCryPitch + 1], a
+ pop hl
+
+ ld a, [hli]
+ ld c, a
+ ld b, [hl]
+ ld hl, wCryLength
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ add hl, bc
+
+ ld a, l
+ ld [wCryLength], a
+ ld a, h
+ ld [wCryLength + 1], a
+ ld a, 1
+ ld [wStereoPanningMask], a
+
+ callfar _PlayCry
+
+.done
+ ret
+
+.CryData:
+; +pitch, +length
+ dw $0000, $00c0
+ dw $0000, $0040
+ dw $0000, $0000
+ dw $0000, $0000
+
+PlayHitSound:
+ ld a, [wNumHits]
+ cp $1
+ jr z, .okay
+ cp $4
+ ret nz
+
+.okay
+ ld a, [wTypeModifier]
+ and $7f
+ ret z
+
+ cp EFFECTIVE
+ 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
+
+BattleAnimAssignPals:
+ ldh a, [hCGB]
+ and a
+ jr nz, .cgb
+ ldh 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
+
+ClearBattleAnims::
+; Clear animation block
+ ld hl, wLYOverrides
+ ld bc, wBattleAnimEnd - wLYOverrides
+.loop
+ ld [hl], 0
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+
+ ld hl, wFXAnimID
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, BattleAnimations
+ add hl, de
+ add hl, de
+ call GetBattleAnimPointer
+ call BattleAnimAssignPals
+ call BattleAnimDelayFrame
+ ret
+
+BattleAnim_RevertPals:
+ call WaitTop
+ ld a, %11100100
+ ld [wBGP], a
+ ld [wOBP0], a
+ ld [wOBP1], a
+ call DmgToCgbBGPals
+ lb de, %11100100, %11100100
+ call DmgToCgbObjPals
+ xor a
+ ldh [hSCX], a
+ ldh [hSCY], a
+ call BattleAnimDelayFrame
+ ld a, $1
+ ldh [hBGMapMode], a
+ ret
+
+BattleAnim_SetBGPals:
+ ldh [rBGP], a
+ ldh a, [hCGB]
+ and a
+ ret z
+ ld hl, wBGPals2
+ ld de, wBGPals1
+ ldh a, [rBGP]
+ ld b, a
+ ld c, 7
+ call CopyPals
+ ld hl, wOBPals2
+ ld de, wOBPals1
+ ldh a, [rBGP]
+ ld b, a
+ ld c, 2
+ call CopyPals
+ ld a, $1
+ ldh [hCGBPalUpdate], a
+ ret
+
+BattleAnim_SetOBPals:
+ ldh [rOBP0], a
+ ldh a, [hCGB]
+ and a
+ ret z
+ ld hl, wOBPals2 palette PAL_BATTLE_OB_GRAY
+ ld de, wOBPals1 palette PAL_BATTLE_OB_GRAY
+ ldh a, [rOBP0]
+ ld b, a
+ ld c, 2
+ call CopyPals
+ ld a, $1
+ ldh [hCGBPalUpdate], a
+ ret
+
+BattleAnim_UpdateOAM_All:
+ ld a, 0
+ ld [wBattleAnimOAMPointerLo], a
+ ld hl, wActiveAnimObjects
+ ld e, NUM_ANIM_OBJECTS
+.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(wVirtualOAM)
+.loop2
+ ld a, l
+ cp LOW(wVirtualOAMEnd)
+ jr nc, .done
+ xor a
+ ld [hli], a
+ jr .loop2
+
+.done
+ ret
diff --git a/gfx/battle/minimize.2bpp b/gfx/battle/minimize.2bpp
new file mode 100755
index 00000000..66b554de
--- /dev/null
+++ b/gfx/battle/minimize.2bpp
Binary files differ
diff --git a/gfx/battle/minimize.png b/gfx/battle/minimize.png
new file mode 100755
index 00000000..95502f19
--- /dev/null
+++ b/gfx/battle/minimize.png
Binary files differ
diff --git a/main.asm b/main.asm
index cf5e0f3a..721bc5bd 100644
--- a/main.asm
+++ b/main.asm
@@ -298,24 +298,26 @@ INCBIN "gfx/credits/theend.2bpp"
SECTION "Move Animations", ROMX
INCLUDE "engine/events/bug_contest/display_stats.asm"
+INCLUDE "engine/battle_anims/anim_commands.asm"
-PlayBattleAnim::
- dr $cc0d7, $cc283
-BattleAnimCommands::
- dr $cc283, $cc5f7
-BattleAnimCmd_RaiseSub::
- dr $cc5f7, $cc67c
-BattleAnimCmd_MinimizeOpp::
- dr $cc67c, $cc836
-ClearBattleAnims::
- dr $cc836, $cc8f0
QueueBattleAnimation::
- dr $cc8f0, $ce6aa
+ dr $cc8f0, $cc958
+BattleAnimOAMUpdate::
+ dr $cc958, $cca97
+_ExecuteBGEffects::
+ dr $cca97, $cca9e
+_QueueBGEffect::
+ dr $cca9e, $ccf0d
+DoBattleAnimFrame::
+ dr $ccf0d, $ce6aa
BattleAnim_Sine_e::
dr $ce6aa, $ce6b0
BattleAnim_Cosine_e::
- dr $ce6b0, $cfce3
+ dr $ce6b0, $ce78b
+
+LoadBattleAnimGFX::
+ dr $ce78b, $cfce3
SECTION "Font Inversed", ROMX