pokecrystal/engine/gfx/sprites.asm

650 lines
9.9 KiB
NASM
Raw Normal View History

2018-06-24 14:09:41 +00:00
ClearSpriteAnims:
ld hl, wSpriteAnimDict
ld bc, wSpriteAnimsEnd - wSpriteAnimDict
2015-11-13 05:49:27 +00:00
.loop
ld [hl], $0
inc hl
dec bc
ld a, c
or b
jr nz, .loop
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
PlaySpriteAnimationsAndDelayFrame:
call PlaySpriteAnimations
2015-11-13 05:49:27 +00:00
call DelayFrame
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
PlaySpriteAnimations:
2015-11-13 05:49:27 +00:00
push hl
push de
push bc
2015-11-05 01:20:14 +00:00
push af
ld a, LOW(wVirtualOAM)
2018-09-09 19:09:51 +00:00
ld [wCurSpriteOAMAddr], a
call DoNextFrameForAllSprites
2015-11-13 05:49:27 +00:00
2015-11-05 01:20:14 +00:00
pop af
2015-11-13 05:49:27 +00:00
pop bc
pop de
pop hl
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
DoNextFrameForAllSprites:
ld hl, wSpriteAnimationStructs
2018-01-03 01:35:57 +00:00
ld e, NUM_SPRITE_ANIM_STRUCTS
2015-11-05 01:20:14 +00:00
.loop
2015-11-13 05:49:27 +00:00
ld a, [hl]
and a
jr z, .next ; This struct is deinitialized.
ld c, l
ld b, h
push hl
push de
2015-12-27 02:59:03 +00:00
call DoAnimFrame ; Uses a massive dw
2015-12-05 20:38:25 +00:00
call UpdateAnimFrame
2015-11-13 05:49:27 +00:00
pop de
pop hl
jr c, .done
.next
2018-01-03 01:35:57 +00:00
ld bc, SPRITEANIMSTRUCT_LENGTH
2015-11-13 05:49:27 +00:00
add hl, bc
dec e
2015-11-05 01:20:14 +00:00
jr nz, .loop
2018-09-09 19:09:51 +00:00
ld a, [wCurSpriteOAMAddr]
2015-11-13 05:49:27 +00:00
ld l, a
ld h, HIGH(wVirtualOAM)
2015-11-05 01:20:14 +00:00
2018-09-09 19:09:51 +00:00
.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> wVirtualOAMEnd)
2015-11-13 05:49:27 +00:00
ld a, l
2018-01-30 19:55:20 +00:00
cp LOW(wVirtualOAMEnd)
2015-11-13 05:49:27 +00:00
jr nc, .done
xor a
ld [hli], a
jr .loop2
2015-11-05 01:20:14 +00:00
2015-11-13 05:49:27 +00:00
.done
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
DoNextFrameForFirst16Sprites:
ld hl, wSpriteAnimationStructs
2018-01-03 01:35:57 +00:00
ld e, NUM_SPRITE_ANIM_STRUCTS
2015-11-13 05:49:27 +00:00
.loop
ld a, [hl]
and a
jr z, .next
ld c, l
ld b, h
push hl
push de
2015-12-27 02:59:03 +00:00
call DoAnimFrame ; Uses a massive dw
2015-12-05 20:38:25 +00:00
call UpdateAnimFrame
2015-11-13 05:49:27 +00:00
pop de
pop hl
jr c, .done
2015-11-05 01:20:14 +00:00
2015-11-13 05:49:27 +00:00
.next
2018-01-03 01:35:57 +00:00
ld bc, SPRITEANIMSTRUCT_LENGTH
2015-11-13 05:49:27 +00:00
add hl, bc
dec e
jr nz, .loop
2015-11-05 01:20:14 +00:00
2018-09-09 19:09:51 +00:00
ld a, [wCurSpriteOAMAddr]
2015-11-13 05:49:27 +00:00
ld l, a
2018-01-30 19:52:46 +00:00
ld h, HIGH(wVirtualOAMSprite16)
2015-11-05 01:20:14 +00:00
2018-09-09 19:09:51 +00:00
.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> Sprites + $40)
2015-11-13 05:49:27 +00:00
ld a, l
2018-01-30 19:52:46 +00:00
cp LOW(wVirtualOAMSprite16)
2015-11-13 05:49:27 +00:00
jr nc, .done
xor a
ld [hli], a
jr .loop2
2015-11-05 01:20:14 +00:00
2015-11-13 05:49:27 +00:00
.done
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
InitSpriteAnimStruct::
2015-12-04 13:46:11 +00:00
; Initialize animation a at pixel x=e, y=d
; Find if there's any room in the wSpriteAnimationStructs array, which is 10x16
2015-11-13 05:49:27 +00:00
push de
2015-11-05 01:20:14 +00:00
push af
ld hl, wSpriteAnimationStructs
2018-01-03 01:35:57 +00:00
ld e, NUM_SPRITE_ANIM_STRUCTS
2015-11-13 05:49:27 +00:00
.loop
2015-11-05 01:20:14 +00:00
ld a, [hl]
2015-11-13 05:49:27 +00:00
and a
jr z, .found
2018-01-03 01:35:57 +00:00
ld bc, SPRITEANIMSTRUCT_LENGTH
2015-11-13 05:49:27 +00:00
add hl, bc
dec e
2015-11-05 01:20:14 +00:00
jr nz, .loop
2015-11-13 05:49:27 +00:00
; We've reached the end. There is no more room here.
; Return carry.
pop af
pop de
scf
2015-11-05 01:20:14 +00:00
ret
2015-11-13 05:49:27 +00:00
.found
; Back up the structure address to bc.
ld c, l
ld b, h
2015-12-11 03:26:31 +00:00
; Value [wSpriteAnimCount] is initially set to -1. Set it to
2015-11-13 05:49:27 +00:00
; the number of objects loaded into this array.
2015-12-11 03:26:31 +00:00
ld hl, wSpriteAnimCount
2015-11-13 05:49:27 +00:00
inc [hl]
ld a, [hl]
and a
jr nz, .initialized
inc [hl]
2015-11-05 01:20:14 +00:00
2015-11-13 05:49:27 +00:00
.initialized
2015-12-05 20:38:25 +00:00
; Get row a of SpriteAnimSeqData, copy the pointer into de
2015-11-13 05:49:27 +00:00
pop af
ld e, a
ld d, 0
2015-12-05 20:38:25 +00:00
ld hl, SpriteAnimSeqData
2015-11-13 05:49:27 +00:00
add hl, de
add hl, de
add hl, de
2015-11-13 05:49:27 +00:00
ld e, l
ld d, h
; Set hl to the first field (field 0) in the current structure.
2015-12-04 13:46:11 +00:00
ld hl, SPRITEANIMSTRUCT_INDEX
2015-11-13 05:49:27 +00:00
add hl, bc
; Load the index.
2015-12-11 03:26:31 +00:00
ld a, [wSpriteAnimCount]
2015-11-13 05:49:27 +00:00
ld [hli], a
; Copy the table entry to the next two fields.
ld a, [de]
ld [hli], a
inc de
ld a, [de]
ld [hli], a
inc de
2015-12-11 03:26:31 +00:00
; Look up the third field from the table in the wSpriteAnimDict array (10x2).
; Take the value and load it in
2015-11-13 05:49:27 +00:00
ld a, [de]
2015-12-04 13:46:11 +00:00
call GetSpriteAnimVTile
2015-11-13 05:49:27 +00:00
ld [hli], a
pop de
2015-12-04 13:46:11 +00:00
; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here.
ld hl, SPRITEANIMSTRUCT_XCOORD
2015-11-05 01:20:14 +00:00
add hl, bc
2015-11-13 05:49:27 +00:00
; Load the original value of de into here.
ld a, e
ld [hli], a
ld a, d
ld [hli], a
; load 0 into the next four fields
xor a
ld [hli], a
2015-12-27 02:59:03 +00:00
ld [hli], a
2015-11-13 05:49:27 +00:00
xor a
ld [hli], a
2015-12-27 02:59:03 +00:00
ld [hli], a
2015-11-13 05:49:27 +00:00
; load -1 into the next field
dec a
ld [hli], a
; load 0 into the last five fields
xor a
rept 4
ld [hli], a
endr
ld [hl], a
2015-12-04 13:46:11 +00:00
; back up the address of the first field to wSpriteAnimAddrBackup
2015-11-13 05:49:27 +00:00
ld a, c
2015-12-04 13:46:11 +00:00
ld [wSpriteAnimAddrBackup], a
2015-11-13 05:49:27 +00:00
ld a, b
2015-12-04 13:46:11 +00:00
ld [wSpriteAnimAddrBackup + 1], a
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
DeinitializeSprite:
2015-11-13 05:49:27 +00:00
; Clear the index field of the struct in bc.
ld hl, SPRITEANIMSTRUCT_INDEX
2015-11-13 05:49:27 +00:00
add hl, bc
ld [hl], $0
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
DeinitializeAllSprites:
; Clear the index field of every struct in the wSpriteAnimationStructs array.
ld hl, wSpriteAnimationStructs
2018-01-03 01:35:57 +00:00
ld bc, SPRITEANIMSTRUCT_LENGTH
ld e, NUM_SPRITE_ANIM_STRUCTS
2015-11-13 05:49:27 +00:00
xor a
.loop
ld [hl], a
add hl, bc
dec e
jr nz, .loop
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
UpdateAnimFrame:
2015-12-04 13:46:11 +00:00
call InitSpriteAnimBuffer ; init WRAM
2015-12-05 20:38:25 +00:00
call GetSpriteAnimFrame ; read from a memory array
2015-11-13 05:49:27 +00:00
cp -3
jr z, .done
cp -4
jr z, .delete
2015-12-05 20:38:25 +00:00
call GetFrameOAMPointer
2018-09-09 19:09:51 +00:00
; add byte to [wCurAnimVTile]
ld a, [wCurAnimVTile]
2015-11-13 05:49:27 +00:00
add [hl]
2018-09-09 19:09:51 +00:00
ld [wCurAnimVTile], a
2015-11-13 05:49:27 +00:00
inc hl
; load pointer into hl
2015-11-05 01:20:14 +00:00
ld a, [hli]
2015-11-13 05:49:27 +00:00
ld h, [hl]
ld l, a
push bc
2018-09-09 19:09:51 +00:00
ld a, [wCurSpriteOAMAddr]
2015-11-05 01:20:14 +00:00
ld e, a
ld d, HIGH(wVirtualOAM)
2015-11-05 01:20:14 +00:00
ld a, [hli]
ld c, a ; number of objects
2015-11-13 05:49:27 +00:00
.loop
; first byte: y (px)
2018-09-09 19:09:51 +00:00
; [de] = [wCurAnimYCoord] + [wCurAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl])
ld a, [wCurAnimYCoord]
2015-11-13 05:49:27 +00:00
ld b, a
2018-09-09 19:09:51 +00:00
ld a, [wCurAnimYOffset]
2015-11-13 05:49:27 +00:00
add b
ld b, a
2015-12-02 22:59:05 +00:00
ld a, [wGlobalAnimYOffset]
2015-11-13 05:49:27 +00:00
add b
ld b, a
2015-12-04 13:46:11 +00:00
call AddOrSubtractY
2015-11-13 05:49:27 +00:00
add b
ld [de], a
inc hl
inc de
; second byte: x (px)
2018-09-09 19:09:51 +00:00
; [de] = [wCurAnimXCoord] + [wCurAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl])
ld a, [wCurAnimXCoord]
2015-11-13 05:49:27 +00:00
ld b, a
2018-09-09 19:09:51 +00:00
ld a, [wCurAnimXOffset]
2015-11-13 05:49:27 +00:00
add b
ld b, a
2015-12-02 22:59:05 +00:00
ld a, [wGlobalAnimXOffset]
2015-11-13 05:49:27 +00:00
add b
ld b, a
2015-12-04 13:46:11 +00:00
call AddOrSubtractX
2015-11-13 05:49:27 +00:00
add b
ld [de], a
inc hl
inc de
; third byte: vtile
2018-09-09 19:09:51 +00:00
; [de] = [wCurAnimVTile] + [hl]
ld a, [wCurAnimVTile]
2015-11-13 05:49:27 +00:00
add [hl]
ld [de], a
inc hl
inc de
; fourth byte: attributes
2015-12-05 20:38:25 +00:00
; [de] = GetSpriteOAMAttr([hl])
call GetSpriteOAMAttr
2015-11-13 05:49:27 +00:00
ld [de], a
inc hl
inc de
ld a, e
2018-09-09 19:09:51 +00:00
ld [wCurSpriteOAMAddr], a
2018-01-30 19:55:20 +00:00
cp LOW(wVirtualOAMEnd)
jr nc, .reached_the_end
2015-11-13 05:49:27 +00:00
dec c
jr nz, .loop
pop bc
jr .done
2015-11-05 01:20:14 +00:00
.delete
2015-12-04 13:46:11 +00:00
call DeinitializeSprite
2015-11-13 05:49:27 +00:00
.done
2015-11-05 01:20:14 +00:00
and a
ret
.reached_the_end
2015-11-13 05:49:27 +00:00
pop bc
2015-11-05 01:20:14 +00:00
scf
ret
2018-06-24 14:09:41 +00:00
AddOrSubtractY:
2015-11-13 05:49:27 +00:00
push hl
2015-11-05 01:20:14 +00:00
ld a, [hl]
2018-09-09 19:09:51 +00:00
ld hl, wCurSpriteAddSubFlags
2015-11-13 05:49:27 +00:00
bit 6, [hl]
jr z, .ok
2015-12-04 13:46:11 +00:00
; 8 - a
2015-11-13 05:49:27 +00:00
add $8
xor $ff
inc a
2015-11-05 01:20:14 +00:00
2015-11-13 05:49:27 +00:00
.ok
pop hl
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
AddOrSubtractX:
2015-11-05 01:20:14 +00:00
push hl
ld a, [hl]
2018-09-09 19:09:51 +00:00
ld hl, wCurSpriteAddSubFlags
bit 5, [hl] ; x flip
2015-11-13 05:49:27 +00:00
jr z, .ok
2015-12-04 13:46:11 +00:00
; 8 - a
2015-11-13 05:49:27 +00:00
add $8
xor $ff
inc a
2015-11-05 01:20:14 +00:00
2015-11-13 05:49:27 +00:00
.ok
pop hl
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
GetSpriteOAMAttr:
2018-09-09 19:09:51 +00:00
ld a, [wCurSpriteAddSubFlags]
2015-11-13 05:49:27 +00:00
ld b, a
ld a, [hl]
xor b
and $e0
ld b, a
ld a, [hl]
and $1f
or b
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
InitSpriteAnimBuffer:
2015-11-05 01:20:14 +00:00
xor a
2018-09-09 19:09:51 +00:00
ld [wCurSpriteAddSubFlags], a
ld hl, SPRITEANIMSTRUCT_TILE_ID
2015-11-13 05:49:27 +00:00
add hl, bc
ld a, [hli]
2018-09-09 19:09:51 +00:00
ld [wCurAnimVTile], a
2015-11-13 05:49:27 +00:00
ld a, [hli]
2018-09-09 19:09:51 +00:00
ld [wCurAnimXCoord], a
2015-11-13 05:49:27 +00:00
ld a, [hli]
2018-09-09 19:09:51 +00:00
ld [wCurAnimYCoord], a
2015-11-13 05:49:27 +00:00
ld a, [hli]
2018-09-09 19:09:51 +00:00
ld [wCurAnimXOffset], a
2015-11-13 05:49:27 +00:00
ld a, [hli]
2018-09-09 19:09:51 +00:00
ld [wCurAnimYOffset], a
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
GetSpriteAnimVTile:
2015-11-19 23:07:20 +00:00
; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else 0
2017-12-28 12:32:33 +00:00
; vTiles offset
2015-11-05 01:20:14 +00:00
push hl
push bc
2015-11-19 23:07:20 +00:00
ld hl, wSpriteAnimDict
2015-11-05 01:20:14 +00:00
ld b, a
2018-01-03 01:35:57 +00:00
ld c, NUM_SPRITE_ANIM_STRUCTS
2015-11-05 01:20:14 +00:00
.loop
2015-11-13 05:49:27 +00:00
ld a, [hli]
2015-11-05 01:20:14 +00:00
cp b
2015-11-13 05:49:27 +00:00
jr z, .ok
2015-11-05 01:20:14 +00:00
inc hl
dec c
jr nz, .loop
2015-11-13 05:49:27 +00:00
xor a
jr .done
2015-11-05 01:20:14 +00:00
2015-11-13 05:49:27 +00:00
.ok
ld a, [hl]
2015-11-05 01:20:14 +00:00
2015-11-13 05:49:27 +00:00
.done
2015-11-05 01:20:14 +00:00
pop bc
pop hl
ret
2018-06-24 14:09:41 +00:00
_ReinitSpriteAnimFrame::
2015-12-05 20:38:25 +00:00
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
2015-11-13 05:49:27 +00:00
add hl, bc
ld [hl], a
2015-12-02 22:59:05 +00:00
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-13 05:49:27 +00:00
add hl, bc
2015-12-02 22:59:05 +00:00
ld [hl], 0
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-13 05:49:27 +00:00
add hl, bc
2015-12-02 22:59:05 +00:00
ld [hl], -1
2015-11-05 01:20:14 +00:00
ret
2018-06-24 14:09:41 +00:00
GetSpriteAnimFrame:
2015-11-05 01:20:14 +00:00
.loop
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-13 05:49:27 +00:00
add hl, bc
ld a, [hl]
2015-11-05 01:20:14 +00:00
and a
jr z, .next_frame ; finished the current sequence
2015-11-13 05:49:27 +00:00
dec [hl]
2015-12-23 22:10:50 +00:00
call .GetPointer ; load pointer from SpriteAnimFrameData
2015-11-13 05:49:27 +00:00
ld a, [hli]
push af
jr .okay
2015-11-13 05:49:27 +00:00
.next_frame
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-13 05:49:27 +00:00
add hl, bc
inc [hl]
2015-12-23 22:10:50 +00:00
call .GetPointer ; load pointer from SpriteAnimFrameData
2015-11-13 05:49:27 +00:00
ld a, [hli]
cp dorestart_command
2015-12-05 20:38:25 +00:00
jr z, .restart
cp endanim_command
2015-12-05 20:38:25 +00:00
jr z, .repeat_last
2015-11-13 05:49:27 +00:00
push af
ld a, [hl]
2015-11-05 01:20:14 +00:00
push hl
2015-11-13 05:49:27 +00:00
and $3f
2015-12-04 13:46:11 +00:00
ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET
2015-11-13 05:49:27 +00:00
add hl, bc
add [hl]
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-13 05:49:27 +00:00
add hl, bc
ld [hl], a
2015-11-05 01:20:14 +00:00
pop hl
.okay
2015-11-13 05:49:27 +00:00
ld a, [hl]
and $c0
srl a
2018-09-09 19:09:51 +00:00
ld [wCurSpriteAddSubFlags], a
2015-11-13 05:49:27 +00:00
pop af
2015-11-05 01:20:14 +00:00
ret
2015-12-05 20:38:25 +00:00
.repeat_last
2015-11-13 05:49:27 +00:00
xor a
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-13 05:49:27 +00:00
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-13 05:49:27 +00:00
add hl, bc
dec [hl]
2015-12-27 02:59:03 +00:00
dec [hl]
2015-11-13 05:49:27 +00:00
jr .loop
2015-11-05 01:20:14 +00:00
2015-12-05 20:38:25 +00:00
.restart
2015-11-13 05:49:27 +00:00
xor a
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-13 05:49:27 +00:00
add hl, bc
ld [hl], a
2015-11-13 05:49:27 +00:00
dec a
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-13 05:49:27 +00:00
add hl, bc
ld [hl], a
jr .loop
2018-06-24 14:09:41 +00:00
.GetPointer:
; Get the data for the current frame for the current animation sequence
2015-12-05 20:38:25 +00:00
; SpriteAnimFrameData[SpriteAnim[SPRITEANIMSTRUCT_FRAMESET_ID]][SpriteAnim[SPRITEANIMSTRUCT_FRAME]]
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
2015-11-13 05:49:27 +00:00
add hl, bc
ld e, [hl]
ld d, 0
2015-12-05 20:38:25 +00:00
ld hl, SpriteAnimFrameData
2015-11-13 05:49:27 +00:00
add hl, de
2015-12-27 02:59:03 +00:00
add hl, de
2015-11-13 05:49:27 +00:00
ld e, [hl]
inc hl
ld d, [hl]
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-13 05:49:27 +00:00
add hl, bc
ld l, [hl]
ld h, 0
add hl, hl
add hl, de
ret
2015-11-05 01:20:14 +00:00
2018-06-24 14:09:41 +00:00
GetFrameOAMPointer:
; Load OAM data pointer
2015-11-13 05:49:27 +00:00
ld e, a
ld d, 0
2015-12-05 20:38:25 +00:00
ld hl, SpriteAnimOAMData
2015-11-13 05:49:27 +00:00
add hl, de
add hl, de
add hl, de
2015-11-13 05:49:27 +00:00
ret
2015-11-05 01:20:14 +00:00
2018-06-24 14:09:41 +00:00
Unreferenced_BrokenGetStdGraphics:
2015-11-13 05:49:27 +00:00
push hl
ld l, a
ld h, 0
add hl, hl
2015-12-27 02:59:03 +00:00
add hl, hl
2015-12-11 03:26:31 +00:00
ld de, BrokenStdGFXPointers ; broken 2bpp pointers
2015-11-13 05:49:27 +00:00
add hl, de
ld c, [hl]
inc hl
ld b, [hl]
inc hl
ld e, [hl]
inc hl
ld d, [hl]
pop hl
push bc
call Request2bpp
pop bc
ret
INCLUDE "data/sprite_anims/sequences.asm"
2015-11-13 05:49:27 +00:00
INCLUDE "engine/gfx/sprite_anims.asm"
INCLUDE "data/sprite_anims/framesets.asm"
INCLUDE "data/sprite_anims/oam.asm"
BrokenStdGFXPointers:
; tile count, bank, pointer
; (all pointers were dummied out to .deleted)
dbbw 128, $01, .deleted
dbbw 128, $01, .deleted
dbbw 128, $01, .deleted
dbbw 128, $01, .deleted
dbbw 16, $37, .deleted
dbbw 16, $11, .deleted
dbbw 16, $39, .deleted
dbbw 16, $24, .deleted
dbbw 16, $21, .deleted
.deleted
2015-11-13 05:49:27 +00:00
2018-06-24 14:09:41 +00:00
Sprites_Cosine:
2018-01-09 21:39:36 +00:00
; a = d * cos(a * pi/32)
add %010000 ; cos(x) = sin(x + pi/2)
; fallthrough
2018-06-24 14:09:41 +00:00
Sprites_Sine:
2018-01-09 21:39:36 +00:00
; a = d * sin(a * pi/32)
calc_sine_wave
2015-11-19 23:07:20 +00:00
2018-06-24 14:09:41 +00:00
AnimateEndOfExpBar:
ldh a, [hSGB]
ld de, EndOfExpBarGFX
2015-11-19 23:07:20 +00:00
and a
jr z, .load
ld de, SGBEndOfExpBarGFX
2015-11-19 23:07:20 +00:00
.load
2017-12-28 12:32:33 +00:00
ld hl, vTiles0 tile $00
lb bc, BANK(EndOfExpBarGFX), 1
2015-11-19 23:07:20 +00:00
call Request2bpp
2015-12-05 20:38:25 +00:00
ld c, 8
ld d, 0
.loop
2015-11-19 23:07:20 +00:00
push bc
call .AnimateFrame
2015-11-19 23:07:20 +00:00
call DelayFrame
pop bc
inc d
2015-12-27 02:59:03 +00:00
inc d
2015-11-19 23:07:20 +00:00
dec c
jr nz, .loop
2015-11-19 23:07:20 +00:00
call ClearSprites
ret
2018-06-24 14:09:41 +00:00
.AnimateFrame:
2018-01-30 19:52:46 +00:00
ld hl, wVirtualOAMSprite00
2018-01-10 18:47:57 +00:00
ld c, 8 ; number of animated circles
.anim_loop
2015-11-19 23:07:20 +00:00
ld a, c
and a
ret z
dec c
ld a, c
2015-12-05 20:38:25 +00:00
; multiply by 8
2015-11-19 23:07:20 +00:00
sla a
sla a
sla a
push af
2015-11-19 23:07:20 +00:00
push de
push hl
call Sprites_Sine
2015-11-19 23:07:20 +00:00
pop hl
pop de
2018-01-10 18:47:57 +00:00
add 13 * TILE_WIDTH
ld [hli], a ; y
2015-11-19 23:07:20 +00:00
pop af
push de
push hl
call Sprites_Cosine
2015-11-19 23:07:20 +00:00
pop hl
pop de
2018-01-10 18:47:57 +00:00
add 10 * TILE_WIDTH + 4
ld [hli], a ; x
2015-11-19 23:07:20 +00:00
ld a, $0
2018-01-10 18:47:57 +00:00
ld [hli], a ; tile id
2018-01-01 09:40:30 +00:00
ld a, PAL_BATTLE_OB_BLUE
2018-01-10 18:47:57 +00:00
ld [hli], a ; attributes
jr .anim_loop
2015-11-19 23:07:20 +00:00
2018-06-24 14:09:41 +00:00
EndOfExpBarGFX:
INCBIN "gfx/battle/expbarend.2bpp"
2018-06-24 14:09:41 +00:00
SGBEndOfExpBarGFX:
INCBIN "gfx/battle/expbarend_sgb.2bpp"
2015-11-19 23:07:20 +00:00
2018-06-24 14:09:41 +00:00
ClearSpriteAnims2:
2015-11-19 23:07:20 +00:00
push hl
push de
push bc
push af
ld hl, wSpriteAnimDict
ld bc, wSpriteAnimsEnd - wSpriteAnimDict
.loop
2018-01-01 09:40:30 +00:00
ld [hl], 0
2015-11-19 23:07:20 +00:00
inc hl
dec bc
ld a, c
or b
jr nz, .loop
pop af
pop bc
pop de
pop hl
ret