pokecrystal-board/engine/sprites.asm

792 lines
14 KiB
NASM
Raw Normal View History

ClearSpriteAnims: ; 8cf53
ld hl, wSpriteAnimDict
ld bc, wSpriteAnimsEnd - wSpriteAnimDict
2015-11-12 21:49:27 -08:00
.loop
ld [hl], $0
inc hl
dec bc
ld a, c
or b
jr nz, .loop
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8cf62
2015-11-04 17:20:14 -08:00
2015-12-10 19:26:31 -08:00
PlaySpriteAnimationsAndDelayFrame: ; 8cf62
call PlaySpriteAnimations
2015-11-12 21:49:27 -08:00
call DelayFrame
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8cf69
2015-11-04 17:20:14 -08:00
PlaySpriteAnimations: ; 8cf69
2015-11-12 21:49:27 -08:00
push hl
push de
push bc
2015-11-04 17:20:14 -08:00
push af
2015-12-10 19:26:31 -08:00
ld a, Sprites % $100
2015-12-05 12:38:25 -08:00
ld [wCurrSpriteOAMAddr], a
call DoNextFrameForAllSprites
2015-11-12 21:49:27 -08:00
2015-11-04 17:20:14 -08:00
pop af
2015-11-12 21:49:27 -08:00
pop bc
pop de
pop hl
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8cf7a
2015-11-04 17:20:14 -08:00
DoNextFrameForAllSprites: ; 8cf7a
ld hl, wSpriteAnimationStructs
2015-11-12 21:49:27 -08:00
ld e, 10 ; There are 10 structs here.
2015-11-04 17:20:14 -08:00
.loop
2015-11-12 21:49:27 -08: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-26 18:59:03 -08:00
call DoAnimFrame ; Uses a massive dw
2015-12-05 12:38:25 -08:00
call UpdateAnimFrame
2015-11-12 21:49:27 -08:00
pop de
pop hl
jr c, .done
.next
ld bc, $10
add hl, bc
dec e
2015-11-04 17:20:14 -08:00
jr nz, .loop
2015-12-05 12:38:25 -08:00
ld a, [wCurrSpriteOAMAddr]
2015-11-12 21:49:27 -08:00
ld l, a
2015-12-10 19:26:31 -08:00
ld h, Sprites / $100
2015-11-04 17:20:14 -08:00
2015-12-05 12:38:25 -08:00
.loop2 ; Clear (Sprites + [wCurrSpriteOAMAddr] --> SpritesEnd)
2015-11-12 21:49:27 -08:00
ld a, l
cp SpritesEnd % $100
jr nc, .done
xor a
ld [hli], a
jr .loop2
2015-11-04 17:20:14 -08:00
2015-11-12 21:49:27 -08:00
.done
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8cfa8
2015-11-04 17:20:14 -08:00
DoNextFrameForFirst16Sprites: ; 8cfa8 (23:4fa8)
ld hl, wSpriteAnimationStructs
2015-11-12 21:49:27 -08:00
ld e, 10
.loop
ld a, [hl]
and a
jr z, .next
ld c, l
ld b, h
push hl
push de
2015-12-26 18:59:03 -08:00
call DoAnimFrame ; Uses a massive dw
2015-12-05 12:38:25 -08:00
call UpdateAnimFrame
2015-11-12 21:49:27 -08:00
pop de
pop hl
jr c, .done
2015-11-04 17:20:14 -08:00
2015-11-12 21:49:27 -08:00
.next
ld bc, $10
add hl, bc
dec e
jr nz, .loop
2015-11-04 17:20:14 -08:00
2015-12-05 12:38:25 -08:00
ld a, [wCurrSpriteOAMAddr]
2015-11-12 21:49:27 -08:00
ld l, a
ld h, (Sprites + $40) / $100
2015-11-04 17:20:14 -08:00
2015-12-05 12:38:25 -08:00
.loop2 ; Clear (Sprites + [wCurrSpriteOAMAddr] --> Sprites + $40)
2015-11-12 21:49:27 -08:00
ld a, l
cp (Sprites + 16 * 4) % $100
2015-11-12 21:49:27 -08:00
jr nc, .done
xor a
ld [hli], a
jr .loop2
2015-11-04 17:20:14 -08:00
2015-11-12 21:49:27 -08:00
.done
2015-11-04 17:20:14 -08:00
ret
2015-11-13 07:48:49 -08:00
InitSpriteAnimStruct:: ; 8cfd6
2015-12-04 05:46:11 -08: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-12 21:49:27 -08:00
push de
2015-11-04 17:20:14 -08:00
push af
ld hl, wSpriteAnimationStructs
2015-11-12 21:49:27 -08:00
ld e, 10
.loop
2015-11-04 17:20:14 -08:00
ld a, [hl]
2015-11-12 21:49:27 -08:00
and a
jr z, .found
ld bc, $10
add hl, bc
dec e
2015-11-04 17:20:14 -08:00
jr nz, .loop
2015-11-12 21:49:27 -08:00
; We've reached the end. There is no more room here.
; Return carry.
pop af
pop de
scf
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
.found
; Back up the structure address to bc.
ld c, l
ld b, h
2015-12-10 19:26:31 -08:00
; Value [wSpriteAnimCount] is initially set to -1. Set it to
2015-11-12 21:49:27 -08:00
; the number of objects loaded into this array.
2015-12-10 19:26:31 -08:00
ld hl, wSpriteAnimCount
2015-11-12 21:49:27 -08:00
inc [hl]
ld a, [hl]
and a
jr nz, .initialized
inc [hl]
2015-11-04 17:20:14 -08:00
2015-11-12 21:49:27 -08:00
.initialized
2015-12-05 12:38:25 -08:00
; Get row a of SpriteAnimSeqData, copy the pointer into de
2015-11-12 21:49:27 -08:00
pop af
ld e, a
ld d, 0
2015-12-05 12:38:25 -08:00
ld hl, SpriteAnimSeqData
2015-11-12 21:49:27 -08:00
add hl, de
add hl, de
add hl, de
2015-11-12 21:49:27 -08:00
ld e, l
ld d, h
; Set hl to the first field (field 0) in the current structure.
2015-12-04 05:46:11 -08:00
ld hl, SPRITEANIMSTRUCT_INDEX
2015-11-12 21:49:27 -08:00
add hl, bc
; Load the index.
2015-12-10 19:26:31 -08:00
ld a, [wSpriteAnimCount]
2015-11-12 21:49:27 -08: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-10 19:26:31 -08:00
; Look up the third field from the table in the wSpriteAnimDict array (10x2).
; Take the value and load it in
2015-11-12 21:49:27 -08:00
ld a, [de]
2015-12-04 05:46:11 -08:00
call GetSpriteAnimVTile
2015-11-12 21:49:27 -08:00
ld [hli], a
pop de
2015-12-04 05:46:11 -08:00
; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here.
ld hl, SPRITEANIMSTRUCT_XCOORD
2015-11-04 17:20:14 -08:00
add hl, bc
2015-11-12 21:49:27 -08: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-26 18:59:03 -08:00
ld [hli], a
2015-11-12 21:49:27 -08:00
xor a
ld [hli], a
2015-12-26 18:59:03 -08:00
ld [hli], a
2015-11-12 21:49:27 -08: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 05:46:11 -08:00
; back up the address of the first field to wSpriteAnimAddrBackup
2015-11-12 21:49:27 -08:00
ld a, c
2015-12-04 05:46:11 -08:00
ld [wSpriteAnimAddrBackup], a
2015-11-12 21:49:27 -08:00
ld a, b
2015-12-04 05:46:11 -08:00
ld [wSpriteAnimAddrBackup + 1], a
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8d036
2015-11-04 17:20:14 -08:00
2015-12-04 05:46:11 -08:00
DeinitializeSprite: ; 8d036
2015-11-12 21:49:27 -08:00
; Clear the index field of the struct in bc.
ld hl, SPRITEANIMSTRUCT_INDEX
2015-11-12 21:49:27 -08:00
add hl, bc
ld [hl], $0
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8d03d
2015-11-04 17:20:14 -08:00
2015-12-04 05:46:11 -08:00
DeinitializeAllSprites: ; 8d03d (23:503d)
; Clear the index field of every struct in the wSpriteAnimationStructs array.
ld hl, wSpriteAnimationStructs
2015-11-12 21:49:27 -08:00
ld bc, $10
ld e, 10
xor a
.loop
ld [hl], a
add hl, bc
dec e
jr nz, .loop
2015-11-04 17:20:14 -08:00
ret
2015-12-05 12:38:25 -08:00
UpdateAnimFrame: ; 8d04c
2015-12-04 05:46:11 -08:00
call InitSpriteAnimBuffer ; init WRAM
2015-12-05 12:38:25 -08:00
call GetSpriteAnimFrame ; read from a memory array
2015-11-12 21:49:27 -08:00
cp -3
jr z, .done
cp -4
jr z, .delete
2015-12-05 12:38:25 -08:00
call GetFrameOAMPointer
; add byte to [wCurrAnimVTile]
ld a, [wCurrAnimVTile]
2015-11-12 21:49:27 -08:00
add [hl]
ld [wCurrAnimVTile], a
2015-11-12 21:49:27 -08:00
inc hl
; load pointer into hl
2015-11-04 17:20:14 -08:00
ld a, [hli]
2015-11-12 21:49:27 -08:00
ld h, [hl]
ld l, a
push bc
2015-12-05 12:38:25 -08:00
ld a, [wCurrSpriteOAMAddr]
2015-11-04 17:20:14 -08:00
ld e, a
2015-11-12 21:49:27 -08:00
ld d, Sprites / $100
2015-11-04 17:20:14 -08:00
ld a, [hli]
ld c, a ; number of objects
2015-11-12 21:49:27 -08:00
.loop
; first byte: y (px)
2015-12-04 05:46:11 -08:00
; [de] = [wCurrAnimYCoord] + [wCurrAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl])
ld a, [wCurrAnimYCoord]
2015-11-12 21:49:27 -08:00
ld b, a
ld a, [wCurrAnimYOffset]
2015-11-12 21:49:27 -08:00
add b
ld b, a
2015-12-02 14:59:05 -08:00
ld a, [wGlobalAnimYOffset]
2015-11-12 21:49:27 -08:00
add b
ld b, a
2015-12-04 05:46:11 -08:00
call AddOrSubtractY
2015-11-12 21:49:27 -08:00
add b
ld [de], a
inc hl
inc de
; second byte: x (px)
2015-12-04 05:46:11 -08:00
; [de] = [wCurrAnimXCoord] + [wCurrAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl])
ld a, [wCurrAnimXCoord]
2015-11-12 21:49:27 -08:00
ld b, a
ld a, [wCurrAnimXOffset]
2015-11-12 21:49:27 -08:00
add b
ld b, a
2015-12-02 14:59:05 -08:00
ld a, [wGlobalAnimXOffset]
2015-11-12 21:49:27 -08:00
add b
ld b, a
2015-12-04 05:46:11 -08:00
call AddOrSubtractX
2015-11-12 21:49:27 -08:00
add b
ld [de], a
inc hl
inc de
; third byte: vtile
; [de] = [wCurrAnimVTile] + [hl]
ld a, [wCurrAnimVTile]
2015-11-12 21:49:27 -08:00
add [hl]
ld [de], a
inc hl
inc de
; fourth byte: attributes
2015-12-05 12:38:25 -08:00
; [de] = GetSpriteOAMAttr([hl])
call GetSpriteOAMAttr
2015-11-12 21:49:27 -08:00
ld [de], a
inc hl
inc de
ld a, e
2015-12-05 12:38:25 -08:00
ld [wCurrSpriteOAMAddr], a
2015-11-12 21:49:27 -08:00
cp SpritesEnd % $100
jr nc, .reached_the_end
2015-11-12 21:49:27 -08:00
dec c
jr nz, .loop
pop bc
jr .done
2015-11-04 17:20:14 -08:00
.delete
2015-12-04 05:46:11 -08:00
call DeinitializeSprite
2015-11-12 21:49:27 -08:00
.done
2015-11-04 17:20:14 -08:00
and a
ret
.reached_the_end
2015-11-12 21:49:27 -08:00
pop bc
2015-11-04 17:20:14 -08:00
scf
ret
2015-11-12 21:49:27 -08:00
; 8d0be
2015-11-04 17:20:14 -08:00
2015-12-04 05:46:11 -08:00
AddOrSubtractY: ; 8d0be
2015-11-12 21:49:27 -08:00
push hl
2015-11-04 17:20:14 -08:00
ld a, [hl]
2015-12-04 05:46:11 -08:00
ld hl, wCurrSpriteAddSubFlags
2015-11-12 21:49:27 -08:00
bit 6, [hl]
jr z, .ok
2015-12-04 05:46:11 -08:00
; 8 - a
2015-11-12 21:49:27 -08:00
add $8
xor $ff
inc a
2015-11-04 17:20:14 -08:00
2015-11-12 21:49:27 -08:00
.ok
pop hl
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8d0ce
2015-11-04 17:20:14 -08:00
2015-12-04 05:46:11 -08:00
AddOrSubtractX: ; 8d0ce
2015-11-04 17:20:14 -08:00
push hl
ld a, [hl]
2015-12-04 05:46:11 -08:00
ld hl, wCurrSpriteAddSubFlags
bit 5, [hl] ; x flip
2015-11-12 21:49:27 -08:00
jr z, .ok
2015-12-04 05:46:11 -08:00
; 8 - a
2015-11-12 21:49:27 -08:00
add $8
xor $ff
inc a
2015-11-04 17:20:14 -08:00
2015-11-12 21:49:27 -08:00
.ok
pop hl
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8d0de
2015-11-04 17:20:14 -08:00
2015-12-05 12:38:25 -08:00
GetSpriteOAMAttr: ; 8d0de
2015-12-04 05:46:11 -08:00
ld a, [wCurrSpriteAddSubFlags]
2015-11-12 21:49:27 -08:00
ld b, a
ld a, [hl]
xor b
and $e0
ld b, a
ld a, [hl]
and $1f
or b
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8d0ec
2015-11-04 17:20:14 -08:00
2015-12-04 05:46:11 -08:00
InitSpriteAnimBuffer: ; 8d0ec
2015-11-04 17:20:14 -08:00
xor a
2015-12-04 05:46:11 -08:00
ld [wCurrSpriteAddSubFlags], a
ld hl, SPRITEANIMSTRUCT_TILE_ID
2015-11-12 21:49:27 -08:00
add hl, bc
ld a, [hli]
ld [wCurrAnimVTile], a
2015-11-12 21:49:27 -08:00
ld a, [hli]
ld [wCurrAnimXCoord], a
2015-11-12 21:49:27 -08:00
ld a, [hli]
ld [wCurrAnimYCoord], a
2015-11-12 21:49:27 -08:00
ld a, [hli]
ld [wCurrAnimXOffset], a
2015-11-12 21:49:27 -08:00
ld a, [hli]
ld [wCurrAnimYOffset], a
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8d109
2015-11-04 17:20:14 -08:00
2015-12-04 05:46:11 -08:00
GetSpriteAnimVTile: ; 8d109
2015-11-19 15:07:20 -08:00
; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else 0
2015-12-04 05:46:11 -08:00
; VTiles offset
2015-11-04 17:20:14 -08:00
push hl
push bc
2015-11-19 15:07:20 -08:00
ld hl, wSpriteAnimDict
2015-11-04 17:20:14 -08:00
ld b, a
2015-11-12 21:49:27 -08:00
ld c, 10
2015-11-04 17:20:14 -08:00
.loop
2015-11-12 21:49:27 -08:00
ld a, [hli]
2015-11-04 17:20:14 -08:00
cp b
2015-11-12 21:49:27 -08:00
jr z, .ok
2015-11-04 17:20:14 -08:00
inc hl
dec c
jr nz, .loop
2015-11-12 21:49:27 -08:00
xor a
jr .done
2015-11-04 17:20:14 -08:00
2015-11-12 21:49:27 -08:00
.ok
ld a, [hl]
2015-11-04 17:20:14 -08:00
2015-11-12 21:49:27 -08:00
.done
2015-11-04 17:20:14 -08:00
pop bc
pop hl
ret
2015-11-12 21:49:27 -08:00
; 8d120
2015-11-04 17:20:14 -08:00
2015-12-05 12:38:25 -08:00
_ReinitSpriteAnimFrame:: ; 8d120
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
2015-11-12 21:49:27 -08:00
add hl, bc
ld [hl], a
2015-12-02 14:59:05 -08:00
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-12 21:49:27 -08:00
add hl, bc
2015-12-02 14:59:05 -08:00
ld [hl], 0
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-12 21:49:27 -08:00
add hl, bc
2015-12-02 14:59:05 -08:00
ld [hl], -1
2015-11-04 17:20:14 -08:00
ret
2015-11-12 21:49:27 -08:00
; 8d132
2015-11-04 17:20:14 -08:00
2015-12-05 12:38:25 -08:00
GetSpriteAnimFrame: ; 8d132
2015-11-04 17:20:14 -08:00
.loop
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-12 21:49:27 -08:00
add hl, bc
ld a, [hl]
2015-11-04 17:20:14 -08:00
and a
jr z, .next_frame ; finished the current sequence
2015-11-12 21:49:27 -08:00
dec [hl]
2015-12-23 14:10:50 -08:00
call .GetPointer ; load pointer from SpriteAnimFrameData
2015-11-12 21:49:27 -08:00
ld a, [hli]
push af
jr .okay
2015-11-12 21:49:27 -08:00
.next_frame
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-12 21:49:27 -08:00
add hl, bc
inc [hl]
2015-12-23 14:10:50 -08:00
call .GetPointer ; load pointer from SpriteAnimFrameData
2015-11-12 21:49:27 -08:00
ld a, [hli]
cp -2
2015-12-05 12:38:25 -08:00
jr z, .restart
cp -1
2015-12-05 12:38:25 -08:00
jr z, .repeat_last
2015-11-12 21:49:27 -08:00
push af
ld a, [hl]
2015-11-04 17:20:14 -08:00
push hl
2015-11-12 21:49:27 -08:00
and $3f
2015-12-04 05:46:11 -08:00
ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET
2015-11-12 21:49:27 -08:00
add hl, bc
add [hl]
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-12 21:49:27 -08:00
add hl, bc
ld [hl], a
2015-11-04 17:20:14 -08:00
pop hl
.okay
2015-11-12 21:49:27 -08:00
ld a, [hl]
and $c0
srl a
2015-12-04 05:46:11 -08:00
ld [wCurrSpriteAddSubFlags], a
2015-11-12 21:49:27 -08:00
pop af
2015-11-04 17:20:14 -08:00
ret
2015-12-05 12:38:25 -08:00
.repeat_last
2015-11-12 21:49:27 -08:00
xor a
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-12 21:49:27 -08:00
add hl, bc
ld [hl], a
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-12 21:49:27 -08:00
add hl, bc
dec [hl]
2015-12-26 18:59:03 -08:00
dec [hl]
2015-11-12 21:49:27 -08:00
jr .loop
2015-11-04 17:20:14 -08:00
2015-12-05 12:38:25 -08:00
.restart
2015-11-12 21:49:27 -08:00
xor a
ld hl, SPRITEANIMSTRUCT_DURATION
2015-11-12 21:49:27 -08:00
add hl, bc
ld [hl], a
2015-11-12 21:49:27 -08:00
dec a
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-12 21:49:27 -08:00
add hl, bc
ld [hl], a
jr .loop
; 8d189
2015-12-23 14:10:50 -08:00
.GetPointer: ; 8d189
; Get the data for the current frame for the current animation sequence
2015-12-05 12:38:25 -08:00
; SpriteAnimFrameData[SpriteAnim[SPRITEANIMSTRUCT_FRAMESET_ID]][SpriteAnim[SPRITEANIMSTRUCT_FRAME]]
ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
2015-11-12 21:49:27 -08:00
add hl, bc
ld e, [hl]
ld d, 0
2015-12-05 12:38:25 -08:00
ld hl, SpriteAnimFrameData
2015-11-12 21:49:27 -08:00
add hl, de
2015-12-26 18:59:03 -08:00
add hl, de
2015-11-12 21:49:27 -08:00
ld e, [hl]
inc hl
ld d, [hl]
ld hl, SPRITEANIMSTRUCT_FRAME
2015-11-12 21:49:27 -08:00
add hl, bc
ld l, [hl]
ld h, 0
add hl, hl
add hl, de
ret
; 8d1a2
2015-11-04 17:20:14 -08:00
2015-12-05 12:38:25 -08:00
GetFrameOAMPointer: ; 8d1a2
; Load OAM data pointer
2015-11-12 21:49:27 -08:00
ld e, a
ld d, 0
2015-12-05 12:38:25 -08:00
ld hl, SpriteAnimOAMData
2015-11-12 21:49:27 -08:00
add hl, de
add hl, de
add hl, de
2015-11-12 21:49:27 -08:00
ret
; 8d1ac
2015-11-04 17:20:14 -08:00
2015-12-10 19:26:31 -08:00
BrokenGetStdGraphics: ; 8d1ac
; dummied out
2015-11-12 21:49:27 -08:00
push hl
ld l, a
ld h, 0
add hl, hl
2015-12-26 18:59:03 -08:00
add hl, hl
2015-12-10 19:26:31 -08:00
ld de, BrokenStdGFXPointers ; broken 2bpp pointers
2015-11-12 21:49:27 -08: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
; 8d1c4
2015-12-05 12:38:25 -08:00
SpriteAnimSeqData: ; 8d1c4
; entries correspond to SPRITE_ANIM_INDEX_* constants
2015-12-10 19:26:31 -08:00
; frameset sequence, tile
; SPRITE_ANIM_INDEX_PARTY_MON
db SPRITE_ANIM_FRAMESET_PARTY_MON, SPRITE_ANIM_SEQ_PARTY_MON, $00
; SPRITE_ANIM_INDEX_01
db SPRITE_ANIM_FRAMESET_07, SPRITE_ANIM_SEQ_04, $00
; SPRITE_ANIM_INDEX_NAMING_SCREEN_CURSOR
db SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR, SPRITE_ANIM_SEQ_NAMING_SCREEN_CURSOR, $05
; SPRITE_ANIM_INDEX_GAMEFREAK_LOGO
db SPRITE_ANIM_FRAMESET_GAMEFREAK_LOGO, SPRITE_ANIM_SEQ_GAMEFREAK_LOGO, $00
; SPRITE_ANIM_INDEX_GS_INTRO_STAR
db SPRITE_ANIM_FRAMESET_GS_INTRO_STAR, SPRITE_ANIM_SEQ_GS_INTRO_STAR, $06
; SPRITE_ANIM_INDEX_GS_INTRO_SPARKLE
db SPRITE_ANIM_FRAMESET_GS_INTRO_SPARKLE, SPRITE_ANIM_SEQ_GS_INTRO_SPARKLE, $06
; SPRITE_ANIM_INDEX_SLOTS_GOLEM
db SPRITE_ANIM_FRAMESET_SLOTS_GOLEM, SPRITE_ANIM_SEQ_SLOTS_GOLEM, $07
; SPRITE_ANIM_INDEX_SLOTS_CHANSEY
db SPRITE_ANIM_FRAMESET_SLOTS_CHANSEY, SPRITE_ANIM_SEQ_SLOTS_CHANSEY, $07
; SPRITE_ANIM_INDEX_SLOTS_EGG
db SPRITE_ANIM_FRAMESET_SLOTS_EGG, SPRITE_ANIM_SEQ_SLOTS_EGG, $07
; SPRITE_ANIM_INDEX_COMPOSE_MAIL_CURSOR
db SPRITE_ANIM_FRAMESET_TEXT_ENTRY_CURSOR, SPRITE_ANIM_SEQ_MAIL_CURSOR, $05
; SPRITE_ANIM_INDEX_RED_WALK
db SPRITE_ANIM_FRAMESET_RED_WALK, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_0B
db SPRITE_ANIM_FRAMESET_STILL_CURSOR, SPRITE_ANIM_SEQ_0D, $08
; SPRITE_ANIM_INDEX_DUMMY_GAME
db SPRITE_ANIM_FRAMESET_STILL_CURSOR, SPRITE_ANIM_SEQ_0E, $08
; SPRITE_ANIM_INDEX_0D
db SPRITE_ANIM_FRAMESET_STILL_CURSOR, SPRITE_ANIM_SEQ_0F, $08
; SPRITE_ANIM_INDEX_TRADE_POKE_BALL
db SPRITE_ANIM_FRAMESET_TRADE_POKE_BALL, SPRITE_ANIM_SEQ_TRADE_POKE_BALL, $00
; SPRITE_ANIM_INDEX_TRADE_POOF
db SPRITE_ANIM_FRAMESET_TRADE_POOF, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE
db SPRITE_ANIM_FRAMESET_TRADE_TUBE_BULGE, SPRITE_ANIM_SEQ_TRADE_TUBE_BULGE, $00
; SPRITE_ANIM_INDEX_TRADEMON_ICON
db SPRITE_ANIM_FRAMESET_TRADEMON_ICON, SPRITE_ANIM_SEQ_TRADEMON_IN_TUBE, $00
; SPRITE_ANIM_INDEX_TRADEMON_BUBBLE
db SPRITE_ANIM_FRAMESET_TRADEMON_BUBBLE, SPRITE_ANIM_SEQ_TRADEMON_IN_TUBE, $00
; SPRITE_ANIM_INDEX_EVOLUTION_BALL_OF_LIGHT
db SPRITE_ANIM_FRAMESET_EVOLUTION_BALL_OF_LIGHT, SPRITE_ANIM_SEQ_REVEAL_NEW_MON, $00
; SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB
db SPRITE_ANIM_FRAMESET_RADIO_TUNING_KNOB, SPRITE_ANIM_SEQ_RADIO_TUNING_KNOB, $00
; SPRITE_ANIM_INDEX_MAGNET_TRAIN_RED
db SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_RED, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_LEAF
db SPRITE_ANIM_FRAMESET_LEAF, SPRITE_ANIM_SEQ_CUT_LEAVES, $00
; SPRITE_ANIM_INDEX_CUT_TREE
db SPRITE_ANIM_FRAMESET_CUT_TREE, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_FLY_LEAF
db SPRITE_ANIM_FRAMESET_LEAF, SPRITE_ANIM_SEQ_FLY_LEAF, $00
; SPRITE_ANIM_INDEX_EGG_CRACK
db SPRITE_ANIM_FRAMESET_EGG_CRACK, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_1A
db SPRITE_ANIM_FRAMESET_24, SPRITE_ANIM_SEQ_19, $00
; SPRITE_ANIM_INDEX_HEADBUTT
db SPRITE_ANIM_FRAMESET_HEADBUTT, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_EGG_HATCH
db SPRITE_ANIM_FRAMESET_EGG_HATCH, SPRITE_ANIM_SEQ_REVEAL_NEW_MON, $00
; SPRITE_ANIM_INDEX_1D
db SPRITE_ANIM_FRAMESET_26, SPRITE_ANIM_SEQ_1A, $00
; SPRITE_ANIM_INDEX_BLUE_WALK
db SPRITE_ANIM_FRAMESET_BLUE_WALK, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_MAGNET_TRAIN_BLUE
db SPRITE_ANIM_FRAMESET_MAGNET_TRAIN_BLUE, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_20
db SPRITE_ANIM_FRAMESET_2F, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_21
db SPRITE_ANIM_FRAMESET_30, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_22
db SPRITE_ANIM_FRAMESET_31, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_23
db SPRITE_ANIM_FRAMESET_32, SPRITE_ANIM_SEQ_1B, $00
; SPRITE_ANIM_INDEX_24
db SPRITE_ANIM_FRAMESET_33, SPRITE_ANIM_SEQ_1C, $00
; SPRITE_ANIM_INDEX_25
db SPRITE_ANIM_FRAMESET_34, SPRITE_ANIM_SEQ_NULL, $00
; SPRITE_ANIM_INDEX_INTRO_SUICUNE
db SPRITE_ANIM_FRAMESET_INTRO_SUICUNE, SPRITE_ANIM_SEQ_INTRO_SUICUNE, $00
; SPRITE_ANIM_INDEX_INTRO_PICHU
db SPRITE_ANIM_FRAMESET_INTRO_PICHU, SPRITE_ANIM_SEQ_INTRO_PICHU_WOOPER, $00
; SPRITE_ANIM_INDEX_INTRO_WOOPER
db SPRITE_ANIM_FRAMESET_INTRO_WOOPER, SPRITE_ANIM_SEQ_INTRO_PICHU_WOOPER, $00
; SPRITE_ANIM_INDEX_INTRO_UNOWN
db SPRITE_ANIM_FRAMESET_INTRO_UNOWN_1, SPRITE_ANIM_SEQ_INTRO_UNOWN, $00
; SPRITE_ANIM_INDEX_INTRO_UNOWN_F
db SPRITE_ANIM_FRAMESET_INTRO_UNOWN_F, SPRITE_ANIM_SEQ_INTRO_UNOWN_F, $00
; SPRITE_ANIM_INDEX_INTRO_SUICUNE_AWAY
db SPRITE_ANIM_FRAMESET_INTRO_SUICUNE_AWAY, SPRITE_ANIM_SEQ_INTRO_SUICUNE_AWAY, $00
; SPRITE_ANIM_INDEX_CELEBI
db SPRITE_ANIM_FRAMESET_CELEBI_LEFT, SPRITE_ANIM_SEQ_NULL, $00 ; 2c
2015-11-12 21:49:27 -08:00
; 8d24b
INCLUDE "engine/sprite_anims.asm" ; DoAnimFrame
2015-11-12 21:49:27 -08:00
INCLUDE "data/sprite_engine.asm"
2015-12-05 12:38:25 -08:00
; SpriteAnimFrameData
; SpriteAnimOAMData
2015-11-12 21:49:27 -08:00
Sprites_Cosine: ; 8e72a
2015-11-12 21:49:27 -08:00
add $10
Sprites_Sine: ; 8e72c
2015-12-05 12:38:25 -08:00
; floor(d * sin(a * pi/32))
2015-11-12 21:49:27 -08:00
and $3f
cp $20
jr nc, .negative
call .ApplySineWave
2015-11-12 21:49:27 -08:00
ld a, h
ret
.negative
2015-11-12 21:49:27 -08:00
and $1f
call .ApplySineWave
2015-11-12 21:49:27 -08:00
ld a, h
xor $ff ; cpl
inc a
ret
; 8e741
.ApplySineWave: ; 8e741
2015-11-12 21:49:27 -08:00
ld e, a
ld a, d
ld d, 0
ld hl, .sinewave
2015-11-12 21:49:27 -08:00
add hl, de
2015-12-26 18:59:03 -08:00
add hl, de
2015-11-12 21:49:27 -08:00
ld e, [hl]
inc hl
ld d, [hl]
ld hl, 0
.multiply
2015-11-12 21:49:27 -08:00
srl a
jr nc, .even
2015-11-12 21:49:27 -08:00
add hl, de
.even
2015-11-12 21:49:27 -08:00
sla e
rl d
2015-11-04 17:20:14 -08:00
and a
jr nz, .multiply
2015-11-12 21:49:27 -08:00
ret
; 8e75d
.sinewave ; 8e75d
2015-11-12 21:49:27 -08:00
sine_wave $100
2015-11-19 15:07:20 -08:00
AnimateEndOfExpBar: ; 8e79d
2015-11-19 15:07:20 -08:00
ld a, [hSGB]
ld de, EndOfExpBarGFX
2015-11-19 15:07:20 -08:00
and a
jr z, .load
ld de, SGBEndOfExpBarGFX
2015-11-19 15:07:20 -08:00
.load
ld hl, VTiles0 tile $00
lb bc, BANK(EndOfExpBarGFX), 1
2015-11-19 15:07:20 -08:00
call Request2bpp
2015-12-05 12:38:25 -08:00
ld c, 8
ld d, 0
.loop
2015-11-19 15:07:20 -08:00
push bc
call .AnimateFrame
2015-11-19 15:07:20 -08:00
call DelayFrame
pop bc
inc d
2015-12-26 18:59:03 -08:00
inc d
2015-11-19 15:07:20 -08:00
dec c
jr nz, .loop
2015-11-19 15:07:20 -08:00
call ClearSprites
ret
; 8e7c6
.AnimateFrame: ; 8e7c6
2015-11-19 15:07:20 -08:00
ld hl, Sprites
ld c, $8
.anim_loop
2015-11-19 15:07:20 -08:00
ld a, c
and a
ret z
dec c
ld a, c
2015-12-05 12:38:25 -08:00
; multiply by 8
2015-11-19 15:07:20 -08:00
sla a
sla a
sla a
push af
2015-11-19 15:07:20 -08:00
push de
push hl
call Sprites_Sine
2015-11-19 15:07:20 -08:00
pop hl
pop de
add 13 * 8
2015-11-19 15:07:20 -08:00
ld [hli], a
2015-11-19 15:07:20 -08:00
pop af
push de
push hl
call Sprites_Cosine
2015-11-19 15:07:20 -08:00
pop hl
pop de
add 10 * 8 + 4
2015-11-19 15:07:20 -08:00
ld [hli], a
2015-11-19 15:07:20 -08:00
ld a, $0
ld [hli], a
ld a, $6 ; OBJ 6
2015-11-19 15:07:20 -08:00
ld [hli], a
jr .anim_loop
2015-11-19 15:07:20 -08:00
; 8e7f4
EndOfExpBarGFX: ; 8e7f4
INCBIN "gfx/battle/expbarend.2bpp"
SGBEndOfExpBarGFX: ; 8e804
INCBIN "gfx/battle/expbarend_sgb.2bpp"
2015-11-19 15:07:20 -08:00
ClearSpriteAnims2: ; 8e814
2015-11-19 15:07:20 -08:00
push hl
push de
push bc
push af
ld hl, wSpriteAnimDict
ld bc, wSpriteAnimsEnd - wSpriteAnimDict
.loop
ld [hl], $0
inc hl
dec bc
ld a, c
or b
jr nz, .loop
pop af
pop bc
pop de
pop hl
ret
; 8e82b