The X and Y flip flags can be applied through the stack consisting of: - Object attributes - Animation frame attributes - OAM Data Each of these negate eachother. Confused yet? The same stack is traversed to obtain the final tile ID, with an added layer on top for the base GFX offset and the offset for the dynamically loaded GFX requested by the object! wBattleAnimDelay is populated with the values passed to `anim_wait`.
1469 lines
21 KiB
NASM
1469 lines
21 KiB
NASM
; Battle animation command interpreter.
|
|
|
|
PlayBattleAnim:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
|
|
ld a, BANK(wActiveAnimObjects)
|
|
ldh [rSVBK], a
|
|
|
|
call _PlayBattleAnim
|
|
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
_PlayBattleAnim:
|
|
ld c, 6
|
|
.wait
|
|
call BattleAnimDelayFrame
|
|
dec c
|
|
jr nz, .wait
|
|
|
|
call BattleAnimAssignPals
|
|
call BattleAnimRequestPals
|
|
call BattleAnimDelayFrame
|
|
|
|
ld c, 1
|
|
ldh 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
|
|
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
|
|
|
|
farcall CheckBattleScene
|
|
jr c, .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, $2e
|
|
ld b, 5
|
|
ld de, 4
|
|
ld hl, wActiveBGEffects
|
|
.find
|
|
cp [hl]
|
|
jr z, .done
|
|
add hl, de
|
|
dec b
|
|
jr nz, .find
|
|
|
|
.not_rollout
|
|
call BattleAnimDelayFrame
|
|
|
|
.done
|
|
ld a, [wBattleAnimFlags]
|
|
bit 0, a
|
|
jr z, .playframe
|
|
|
|
call BattleAnim_ClearCGB_OAMFlags
|
|
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
|
|
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wCurBattleMon) ; alternatively: BANK(wTempMon), BANK(wPartyMon1), several others
|
|
ldh [rSVBK], a
|
|
|
|
ld hl, UpdateBattleHuds
|
|
ld a, BANK(UpdatePlayerHUD)
|
|
rst FarCall ; Why not "call UpdateBattleHuds"?
|
|
|
|
pop af
|
|
ldh [rSVBK], a
|
|
|
|
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_Functioncc220:
|
|
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_ClearCGB_OAMFlags:
|
|
ld a, [wBattleAnimFlags]
|
|
bit 3, a
|
|
jr z, .delete
|
|
|
|
ld hl, wVirtualOAMSprite00Attributes
|
|
ld c, NUM_SPRITE_OAM_STRUCTS
|
|
.loop
|
|
ld a, [hl]
|
|
and $f0
|
|
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 1, [hl]
|
|
jr nz, .do_anim
|
|
|
|
set 0, [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_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:
|
|
ret
|
|
|
|
BattleAnimCmd_Ret:
|
|
ld hl, wBattleAnimFlags
|
|
res 1, [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 1, [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 2, [hl]
|
|
jr nz, .continue_loop
|
|
and a
|
|
jr z, .perpetual
|
|
dec a
|
|
set 2, [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 2, [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:
|
|
ld hl, wActiveAnimObjects
|
|
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:
|
|
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, 10
|
|
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, 5
|
|
ld bc, wActiveBGEffects
|
|
.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, 10
|
|
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:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wCurPartySpecies)
|
|
ldh [rSVBK], a
|
|
ld a, [wCurPartySpecies] ; CurPartySpecies
|
|
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, vTiles0 tile $00
|
|
predef GetMonFrontpic
|
|
jr .done
|
|
|
|
.player
|
|
ld a, [wTempEnemyMonSpecies] ; TempEnemyMonSpecies
|
|
ld [wCurPartySpecies], a ; CurPartySpecies
|
|
ld hl, wEnemyMonDVs ; EnemyMonDVs
|
|
predef GetUnownLetter
|
|
ld de, vTiles0 tile $00
|
|
predef GetMonBackpic
|
|
|
|
.done
|
|
pop af
|
|
ld [wCurPartySpecies], a ; CurPartySpecies
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
BattleAnimCmd_UpdateActorPic:
|
|
ld de, vTiles0 tile $00
|
|
ldh a, [hBattleTurn]
|
|
and a
|
|
jr z, .player
|
|
|
|
ld hl, vTiles2 tile $00
|
|
ld b, 0
|
|
ld c, 7 * 7
|
|
call Request2bpp
|
|
ret
|
|
|
|
.player
|
|
ld hl, vTiles2 tile $31
|
|
ld b, 0
|
|
ld c, 6 * 6
|
|
call Request2bpp
|
|
ret
|
|
|
|
BattleAnimCmd_RaiseSub:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, 1 ; unnecessary bankswitch?
|
|
ldh [rSVBK], a
|
|
xor a ; sScratch
|
|
call GetSRAMBank
|
|
|
|
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
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
.CopyTile:
|
|
ld bc, 1 tiles
|
|
ld a, BANK(MonsterSpriteGFX)
|
|
call FarCopyBytes
|
|
ret
|
|
|
|
BattleAnimCmd_MinimizeOpp:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, 1 ; unnecessary bankswitch?
|
|
ldh [rSVBK], a
|
|
xor a ; sScratch
|
|
call GetSRAMBank
|
|
call GetMinimizePic
|
|
call Request2bpp
|
|
call CloseSRAM
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
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
|
|
ret
|
|
|
|
.player
|
|
ld de, sScratch + $160
|
|
call CopyMinimizePic
|
|
ld hl, vTiles2 tile $31
|
|
ld de, sScratch
|
|
lb bc, BANK(GetMinimizePic), 6 * 6
|
|
ret
|
|
|
|
CopyMinimizePic:
|
|
ld hl, MinimizePic
|
|
ld bc, $10
|
|
ld a, BANK(MinimizePic)
|
|
call FarCopyBytes
|
|
ret
|
|
|
|
MinimizePic:
|
|
INCBIN "gfx/battle/minimize.2bpp"
|
|
|
|
BattleAnimCmd_Minimize:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, 1 ; unnecessary bankswitch?
|
|
ldh [rSVBK], a
|
|
xor a ; sScratch
|
|
call GetSRAMBank
|
|
call GetMinimizePic
|
|
ld hl, vTiles0 tile $00
|
|
call Request2bpp
|
|
call CloseSRAM
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
BattleAnimCmd_DropSub:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wCurPartySpecies)
|
|
ldh [rSVBK], a
|
|
|
|
ld a, [wCurPartySpecies] ; CurPartySpecies
|
|
push af
|
|
ldh a, [hBattleTurn]
|
|
and a
|
|
jr z, .player
|
|
|
|
callfar DropEnemySub
|
|
jr .done
|
|
|
|
.player
|
|
callfar DropPlayerSub
|
|
|
|
.done
|
|
pop af
|
|
ld [wCurPartySpecies], a ; CurPartySpecies
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
BattleAnimCmd_BeatUp:
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wCurPartySpecies)
|
|
ldh [rSVBK], a
|
|
ld a, [wCurPartySpecies] ; CurPartySpecies
|
|
push af
|
|
|
|
ld a, [wBattleAnimParam]
|
|
ld [wCurPartySpecies], a ; CurPartySpecies
|
|
|
|
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
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ret
|
|
|
|
BattleAnimCmd_OAMOn:
|
|
xor a
|
|
ldh [hOAMUpdate], a
|
|
ret
|
|
|
|
BattleAnimCmd_OAMOff:
|
|
ld a, $1
|
|
ldh [hOAMUpdate], a
|
|
ret
|
|
|
|
BattleAnimCmd_ClearSprites:
|
|
ld hl, wBattleAnimFlags
|
|
set 3, [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 ; 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
|
|
|
|
.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, [rSVBK]
|
|
push af
|
|
ld a, BANK(wEnemyMon) ; wBattleMon is in WRAM0, but EnemyMon is in WRAMX
|
|
ldh [rSVBK], a
|
|
|
|
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 ; CryLength
|
|
ld a, [hli]
|
|
ld h, [hl]
|
|
ld l, a
|
|
add hl, bc
|
|
|
|
ld a, l
|
|
ld [wCryLength], a ; CryLength
|
|
ld a, h
|
|
ld [wCryLength + 1], a
|
|
ld a, 1
|
|
ld [wStereoPanningMask], a
|
|
|
|
callfar _PlayCry
|
|
|
|
.done
|
|
pop af
|
|
ldh [rSVBK], a
|
|
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
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wBGPals1)
|
|
ldh [rSVBK], a
|
|
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
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ld a, $1
|
|
ldh [hCGBPalUpdate], a
|
|
ret
|
|
|
|
BattleAnim_SetOBPals:
|
|
ldh [rOBP0], a
|
|
ldh a, [hCGB]
|
|
and a
|
|
ret z
|
|
ldh a, [rSVBK]
|
|
push af
|
|
ld a, BANK(wOBPals1)
|
|
ldh [rSVBK], a
|
|
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
|
|
pop af
|
|
ldh [rSVBK], a
|
|
ld a, $1
|
|
ldh [hCGBPalUpdate], a
|
|
ret
|
|
|
|
BattleAnim_UpdateOAM_All:
|
|
ld a, $0
|
|
ld [wBattleAnimOAMPointerLo], a
|
|
ld hl, wActiveAnimObjects
|
|
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(wVirtualOAM)
|
|
.loop2
|
|
ld a, l
|
|
cp LOW(wVirtualOAMEnd)
|
|
jr nc, .done
|
|
xor a
|
|
ld [hli], a
|
|
jr .loop2
|
|
|
|
.done
|
|
ret
|