summaryrefslogtreecommitdiff
path: root/engine/gfx/sprites.asm
diff options
context:
space:
mode:
Diffstat (limited to 'engine/gfx/sprites.asm')
-rwxr-xr-xengine/gfx/sprites.asm1220
1 files changed, 607 insertions, 613 deletions
diff --git a/engine/gfx/sprites.asm b/engine/gfx/sprites.asm
index b9267d66..824ceac4 100755
--- a/engine/gfx/sprites.asm
+++ b/engine/gfx/sprites.asm
@@ -1,645 +1,639 @@
-ClearAnimatedObjects: ; 8d174
- ld hl, $c508 ; 23:5174
- ld bc, $c1 ; 23:5177
+ClearSpriteAnims:
+ ld hl, wSpriteAnimDict
+ ld bc, wSpriteAnimsEnd - wSpriteAnimDict
.loop
- ld [hl], $0 ; 23:517a
- inc hl ; 23:517c
- dec bc ; 23:517d
- ld a, c ; 23:517e
- or b ; 23:517f
- jr nz, .loop ; 23:5180
- ret ; 23:5182
-
-PlayAnimatedObjectationsAndDelayFrame: ; 8d182
- call PlayAnimatedObjectations ; 23:5183
- call $32e ; DelayFrame ; 23:5186
- ret ; 23:5189
-
-PlayAnimatedObjectations: ; 8d189
- push hl ; 23:518a
- push de ; 23:518b
- push bc ; 23:518c
- push af ; 23:518d
-
- ld a, $0 ; 23:518e
- ld [$c5bd], a ; 23:5190
- call DoNextFrameForAllSprites ; 23:5193
-
- pop af ; 23:5196
- pop bc ; 23:5197
- pop de ; 23:5198
- pop hl ; 23:5199
- ret ; 23:519a
-
-DoNextFrameForAllSprites: ; 8d19b
- ld hl, $c51c ; 23:519b
- ld e, $a ; 23:519e
+ ld [hl], 0
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ ret
+
+PlaySpriteAnimationsAndDelayFrame:
+ call PlaySpriteAnimations
+ call DelayFrame
+ ret
+
+PlaySpriteAnimations:
+ push hl
+ push de
+ push bc
+ push af
+
+ ld a, LOW(wVirtualOAM)
+ ld [wCurSpriteOAMAddr], a
+ call DoNextFrameForAllSprites
+
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+DoNextFrameForAllSprites:
+ ld hl, wSpriteAnimationStructs
+ ld e, NUM_SPRITE_ANIM_STRUCTS
+
.loop
- ld a, [hl] ; 23:51a0
- and a ; 23:51a1
- jr z, .skip_capacity_check ; 23:51a2
- ld c, l ; 23:51a4
- ld b, h ; 23:51a5
- push hl ; 23:51a6
- push de ; 23:51a7
- call DoAnimFrame ; 23:51a8
- call UpdateAnimFrame ; 23:51ab
- pop de ; 23:51ae
- pop hl ; 23:51af
- jr c, .cancel ; 23:51b0
-.skip_capacity_check
- ld bc, $10 ; 23:51b2
- add hl, bc ; 23:51b5
- dec e ; 23:51b6
- jr nz, .loop ; 23:51b7
- ld a, [$c5bd] ; 23:51b9
- ld l, a ; 23:51bc
- ld h, $c3 ; 23:51bd
-.loop2
- ld a, l ; 23:51bf
- cp $a0 ; 23:51c0
- jr nc, .cancel ; 23:51c2
- xor a ; 23:51c4
- ld [hli], a ; 23:51c5
- jr .loop2 ; 23:51c6
-
-.cancel
- ret ; 23:51c8
-
-DoNextFrameForFirst16Sprites: ; 8d1c9
- ld hl, $c51c ; 23:51c9
- ld e, $a ; 23:51cc
+ ld a, [hl]
+ and a
+ jr z, .next ; This struct is deinitialized.
+ ld c, l
+ ld b, h
+ push hl
+ push de
+ call DoAnimFrame ; Uses a massive dw
+ call UpdateAnimFrame
+ pop de
+ pop hl
+ jr c, .done
+
+.next
+ ld bc, SPRITEANIMSTRUCT_LENGTH
+ add hl, bc
+ dec e
+ jr nz, .loop
+
+ ld a, [wCurSpriteOAMAddr]
+ ld l, a
+ ld h, HIGH(wVirtualOAM)
+
+.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> wVirtualOAMEnd)
+ ld a, l
+ cp LOW(wVirtualOAMEnd)
+ jr nc, .done
+ xor a
+ ld [hli], a
+ jr .loop2
+
+.done
+ ret
+
+DoNextFrameForFirst16Sprites:
+ ld hl, wSpriteAnimationStructs
+ ld e, NUM_SPRITE_ANIM_STRUCTS
+
.loop
- ld a, [hl] ; 23:51ce
- and a ; 23:51cf
- jr z, .skip_capacity_check ; 23:51d0
- ld c, l ; 23:51d2
- ld b, h ; 23:51d3
- push hl ; 23:51d4
- push de ; 23:51d5
- call DoAnimFrame ; 23:51d6
- call UpdateAnimFrame ; 23:51d9
- pop de ; 23:51dc
- pop hl ; 23:51dd
- jr c, .cancel ; 23:51de
-.skip_capacity_check
- ld bc, $10 ; 23:51e0
- add hl, bc ; 23:51e3
- dec e ; 23:51e4
- jr nz, .loop ; 23:51e5
- ld a, [$c5bd] ; 23:51e7
- ld l, a ; 23:51ea
- ld h, $c3 ; 23:51eb
-.loop2
- ld a, l ; 23:51ed
- cp $40 ; 23:51ee
- jr nc, .cancel ; 23:51f0
- xor a ; 23:51f2
- ld [hli], a ; 23:51f3
- jr .loop2 ; 23:51f4
-
-.cancel
- ret ; 23:51f6
-
-_InitSpriteAnimStruct:: ; 8d1f7
- push de ; 23:51f7
- push af ; 23:51f8
- ld hl, $c51c ; 23:51f9
- ld e, $a ; 23:51fc
+ ld a, [hl]
+ and a
+ jr z, .next
+ ld c, l
+ ld b, h
+ push hl
+ push de
+ call DoAnimFrame ; Uses a massive dw
+ call UpdateAnimFrame
+ pop de
+ pop hl
+ jr c, .done
+
+.next
+ ld bc, SPRITEANIMSTRUCT_LENGTH
+ add hl, bc
+ dec e
+ jr nz, .loop
+
+ ld a, [wCurSpriteOAMAddr]
+ ld l, a
+ ld h, HIGH(wVirtualOAMSprite16)
+
+.loop2 ; Clear (wVirtualOAM + [wCurSpriteOAMAddr] --> Sprites + $40)
+ ld a, l
+ cp LOW(wVirtualOAMSprite16)
+ jr nc, .done
+ xor a
+ ld [hli], a
+ jr .loop2
+
+.done
+ ret
+
+_InitSpriteAnimStruct::
+; Initialize animation a at pixel x=e, y=d
+; Find if there's any room in the wSpriteAnimationStructs array, which is 10x16
+ push de
+ push af
+ ld hl, wSpriteAnimationStructs
+ ld e, NUM_SPRITE_ANIM_STRUCTS
.loop
- ld a, [hl] ; 23:51fe
- and a ; 23:51ff
- jr z, .found ; 23:5200
- ld bc, $10 ; 23:5202
- add hl, bc ; 23:5205
- dec e ; 23:5206
- jr nz, .loop ; 23:5207
- pop af ; 23:5209
- pop de ; 23:520a
- scf ; 23:520b
- ret ; 23:520c
-
-.found ; 8d20d
- ld c, l ; 23:520d
- ld b, h ; 23:520e
- ld hl, $c5bc ; 23:520f
- inc [hl] ; 23:5212
- ld a, [hl] ; 23:5213
- and a ; 23:5214
- jr nz, .initialized ; 23:5215
- inc [hl] ; 23:5217
+ ld a, [hl]
+ and a
+ jr z, .found
+ ld bc, SPRITEANIMSTRUCT_LENGTH
+ add hl, bc
+ dec e
+ jr nz, .loop
+; We've reached the end. There is no more room here.
+; Return carry.
+ pop af
+ pop de
+ scf
+ ret
+
+.found
+; Back up the structure address to bc.
+ ld c, l
+ ld b, h
+; Value [wSpriteAnimCount] is initially set to -1. Set it to
+; the number of objects loaded into this array.
+ ld hl, wSpriteAnimCount
+ inc [hl]
+ ld a, [hl]
+ and a
+ jr nz, .initialized
+ inc [hl]
+
.initialized
- pop af ; 23:5218
- ld e, a ; 23:5219
- ld d, $0 ; 23:521a
- ld hl, AnimatedObjectSeqData ; 23:521c
- add hl, de ; 23:521f
- add hl, de ; 23:5220
- add hl, de ; 23:5221
- ld e, l ; 23:5222
- ld d, h ; 23:5223
- ld hl, $0 ; 23:5224
- add hl, bc ; 23:5227
- ld a, [$c5bc] ; 23:5228
- ld [hli], a ; 23:522b
- ld a, [de] ; 23:522c
- ld [hli], a ; 23:522d
- inc de ; 23:522e
- ld a, [de] ; 23:522f
- ld [hli], a ; 23:5230
- inc de ; 23:5231
- ld a, [de] ; 23:5232
- call GetAnimatedObjectVTile ; 23:5233
- ld [hli], a ; 23:5236
- pop de ; 23:5237
- ld hl, $4 ; 23:5238
- add hl, bc ; 23:523b
- ld a, e ; 23:523c
- ld [hli], a ; 23:523d
- ld a, d ; 23:523e
- ld [hli], a ; 23:523f
- xor a ; 23:5240
- ld [hli], a ; 23:5241
- ld [hli], a ; 23:5242
- xor a ; 23:5243
- ld [hli], a ; 23:5244
- ld [hli], a ; 23:5245
- dec a ; 23:5246
- ld [hli], a ; 23:5247
- xor a ; 23:5248
- ld [hli], a ; 23:5249
- ld [hli], a ; 23:524a
- ld [hli], a ; 23:524b
- ld [hli], a ; 23:524c
- ld [hl], a ; 23:524d
- ld a, c ; 23:524e
- ld [$c5c0], a ; 23:524f
- ld a, b ; 23:5252
- ld [$c5c1], a ; 23:5253
- ret ; 23:5256
-
-DeinitializeSprite: ; 8d257
- ld hl, $0 ; 23:5257
- add hl, bc ; 23:525a
- ld [hl], $0 ; 23:525b
- ret ; 23:525d
-
-UpdateAnimFrame: ; 8d25e
- call InitAnimatedObjectBuffer ; 23:525e
- call GetAnimatedObjectFrame ; 23:5261
- cp $fd ; 23:5264
- jr z, .done ; 23:5266
- cp $fc ; 23:5268
- jr z, .delete ; 23:526a
- call GetFrameOAMPointer ; 23:526c
- ld a, [$c5c2] ; 23:526f
- add [hl] ; 23:5272
- ld [$c5c2], a ; 23:5273
- inc hl ; 23:5276
- ld a, [hli] ; 23:5277
- ld h, [hl] ; 23:5278
- ld l, a ; 23:5279
- push bc ; 23:527a
- ld a, [$c5bd] ; 23:527b
- ld e, a ; 23:527e
- ld d, $c3 ; 23:527f
- ld a, [hli] ; 23:5281
- ld c, a ; 23:5282
+; Get row a of SpriteAnimSeqData, copy the pointer into de
+ pop af
+ ld e, a
+ ld d, 0
+ ld hl, SpriteAnimSeqData
+ add hl, de
+ add hl, de
+ add hl, de
+ ld e, l
+ ld d, h
+; Set hl to the first field (field 0) in the current structure.
+ ld hl, SPRITEANIMSTRUCT_INDEX
+ add hl, bc
+; Load the index.
+ ld a, [wSpriteAnimCount]
+ 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
+; Look up the third field from the table in the wSpriteAnimDict array (10x2).
+; Take the value and load it in
+ ld a, [de]
+ call GetSpriteAnimVTile
+ ld [hli], a
+ pop de
+; Set hl to field 4 (X coordinate). Kinda pointless, because we're presumably already here.
+ ld hl, SPRITEANIMSTRUCT_XCOORD
+ add hl, bc
+; 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
+ ld [hli], a
+ xor a
+ ld [hli], a
+ ld [hli], a
+; 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
+; back up the address of the first field to wSpriteAnimAddrBackup
+ ld a, c
+ ld [wSpriteAnimAddrBackup], a
+ ld a, b
+ ld [wSpriteAnimAddrBackup + 1], a
+ ret
+
+DeinitializeSprite:
+; Clear the index field of the struct in bc.
+ ld hl, SPRITEANIMSTRUCT_INDEX
+ add hl, bc
+ ld [hl], 0
+ ret
+
+UpdateAnimFrame:
+ call InitSpriteAnimBuffer ; init WRAM
+ call GetSpriteAnimFrame ; read from a memory array
+ cp -3
+ jr z, .done
+ cp -4
+ jr z, .delete
+ call GetFrameOAMPointer
+ ; add byte to [wCurAnimVTile]
+ ld a, [wCurAnimVTile]
+ add [hl]
+ ld [wCurAnimVTile], a
+ inc hl
+ ; load pointer into hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ push bc
+ ld a, [wCurSpriteOAMAddr]
+ ld e, a
+ ld d, HIGH(wVirtualOAM)
+ ld a, [hli]
+ ld c, a ; number of objects
.loop
- ld a, [$c5c4] ; 23:5283
- ld b, a ; 23:5286
- ld a, [$c5c6] ; 23:5287
- add b ; 23:528a
- ld b, a ; 23:528b
- ld a, [$c5c7] ; 23:528c
- add b ; 23:528f
- ld b, a ; 23:5290
- call AddOrSubtractX ; 23:5291
- add b ; 23:5294
- ld [de], a ; 23:5295
- inc hl ; 23:5296
- inc de ; 23:5297
- ld a, [$c5c3] ; 23:5298
- ld b, a ; 23:529b
- ld a, [$c5c5] ; 23:529c
- add b ; 23:529f
- ld b, a ; 23:52a0
- ld a, [$c5c8] ; 23:52a1
- add b ; 23:52a4
- ld b, a ; 23:52a5
- call AddOrSubtractY ; 23:52a6
- add b ; 23:52a9
- ld [de], a ; 23:52aa
- inc hl ; 23:52ab
- inc de ; 23:52ac
- ld a, [$c5c2] ; 23:52ad
- add [hl] ; 23:52b0
- ld [de], a ; 23:52b1
- inc hl ; 23:52b2
- inc de ; 23:52b3
- call GetSpriteOAMAttr ; 23:52b4
- ld [de], a ; 23:52b7
- inc hl ; 23:52b8
- inc de ; 23:52b9
- ld a, e ; 23:52ba
- ld [$c5bd], a ; 23:52bb
- cp $a0 ; 23:52be
- jr nc, reached_the_end ; 23:52c0
- dec c ; 23:52c2
- jr nz, .loop ; 23:52c3
- pop bc ; 23:52c5
- jr .done ; 23:52c6
+ ; first byte: y (px)
+ ; [de] = [wCurAnimYCoord] + [wCurAnimYOffset] + [wGlobalAnimYOffset] + AddOrSubtractY([hl])
+ ld a, [wCurAnimYCoord]
+ ld b, a
+ ld a, [wCurAnimYOffset]
+ add b
+ ld b, a
+ ld a, [wGlobalAnimYOffset]
+ add b
+ ld b, a
+ call AddOrSubtractY
+ add b
+ ld [de], a
+ inc hl
+ inc de
+ ; second byte: x (px)
+ ; [de] = [wCurAnimXCoord] + [wCurAnimXOffset] + [wGlobalAnimXOffset] + AddOrSubtractX([hl])
+ ld a, [wCurAnimXCoord]
+ ld b, a
+ ld a, [wCurAnimXOffset]
+ add b
+ ld b, a
+ ld a, [wGlobalAnimXOffset]
+ add b
+ ld b, a
+ call AddOrSubtractX
+ add b
+ ld [de], a
+ inc hl
+ inc de
+ ; third byte: vtile
+ ; [de] = [wCurAnimVTile] + [hl]
+ ld a, [wCurAnimVTile]
+ add [hl]
+ ld [de], a
+ inc hl
+ inc de
+ ; fourth byte: attributes
+ ; [de] = GetSpriteOAMAttr([hl])
+ call GetSpriteOAMAttr
+ ld [de], a
+ inc hl
+ inc de
+ ld a, e
+ ld [wCurSpriteOAMAddr], a
+ cp LOW(wVirtualOAMEnd)
+ jr nc, .reached_the_end
+ dec c
+ jr nz, .loop
+ pop bc
+ jr .done
.delete
- call DeinitializeSprite ; 23:52c8
+ call DeinitializeSprite
.done
- and a ; 23:52cb
- ret ; 23:52cc
-
-reached_the_end
- pop bc ; 23:52cd
- scf ; 23:52ce
- ret ; 23:52cf
-
-AddOrSubtractX: ; 8d2d0
- push hl ; 23:52d0
- ld a, [hl] ; 23:52d1
- ld hl, $c5c0 ; 23:52d2
- bit 6, [hl] ; 23:52d5
- jr z, .ok ; 23:52d7
- add a, $8 ; 23:52d9
- xor $ff ; 23:52db
- inc a ; 23:52dd
+ and a
+ ret
+
+.reached_the_end
+ pop bc
+ scf
+ ret
+
+AddOrSubtractY:
+ push hl
+ ld a, [hl]
+ ld hl, wCurSpriteOAMFlags
+ bit OAM_Y_FLIP, [hl]
+ jr z, .ok
+ ; -8 - a
+ add $8
+ xor $ff
+ inc a
+
.ok
- pop hl ; 23:52de
- ret ; 23:52df
-
-AddOrSubtractY: ; 8d2e0
- push hl ; 23:52e0
- ld a, [hl] ; 23:52e1
- ld hl, $c5c0 ; 23:52e2
- bit 5, [hl] ; 23:52e5
- jr z, .ok ; 23:52e7
- add a, $8 ; 23:52e9
- xor $ff ; 23:52eb
- inc a ; 23:52ed
+ pop hl
+ ret
+
+AddOrSubtractX:
+ push hl
+ ld a, [hl]
+ ld hl, wCurSpriteOAMFlags
+ bit OAM_X_FLIP, [hl]
+ jr z, .ok
+ ; -8 - a
+ add 8
+ xor $ff
+ inc a
+
.ok
- pop hl ; 23:52ee
- ret ; 23:52ef
-
-GetSpriteOAMAttr: ; 8d2f0
- ld a, [$c5c0] ; 23:52f0
- ld b, a ; 23:52f3
- ld a, [hl] ; 23:52f4
- xor b ; 23:52f5
- and $e0 ; 23:52f6
- ld b, a ; 23:52f8
- ld a, [hl] ; 23:52f9
- and $1f ; 23:52fa
- or b ; 23:52fc
- ret ; 23:52fd
-
-InitAnimatedObjectBuffer: ; 8d2fe
- xor a ; 23:52fe
- ld [$c5c0], a ; 23:52ff
- ld hl, $3 ; 23:5302
- add hl, bc ; 23:5305
- ld a, [hli] ; 23:5306
- ld [$c5c2], a ; 23:5307
- ld a, [hli] ; 23:530a
- ld [$c5c3], a ; 23:530b
- ld a, [hli] ; 23:530e
- ld [$c5c4], a ; 23:530f
- ld a, [hli] ; 23:5312
- ld [$c5c5], a ; 23:5313
- ld a, [hli] ; 23:5316
- ld [$c5c6], a ; 23:5317
- ret ; 23:531a
-
-GetAnimatedObjectVTile: ; 8d31b
- push hl ; 23:531b
- push bc ; 23:531c
- ld hl, $c508 ; 23:531d
- ld b, a ; 23:5320
- ld c, $a ; 23:5321
+ pop hl
+ ret
+
+GetSpriteOAMAttr:
+ ld a, [wCurSpriteOAMFlags]
+ ld b, a
+ ld a, [hl]
+ xor b
+ and PRIORITY | Y_FLIP | X_FLIP
+ ld b, a
+ ld a, [hl]
+ and $ff ^ (PRIORITY | Y_FLIP | X_FLIP)
+ or b
+ ret
+
+InitSpriteAnimBuffer:
+ xor a
+ ld [wCurSpriteOAMFlags], a
+ ld hl, SPRITEANIMSTRUCT_TILE_ID
+ add hl, bc
+ ld a, [hli]
+ ld [wCurAnimVTile], a
+ ld a, [hli]
+ ld [wCurAnimXCoord], a
+ ld a, [hli]
+ ld [wCurAnimYCoord], a
+ ld a, [hli]
+ ld [wCurAnimXOffset], a
+ ld a, [hli]
+ ld [wCurAnimYOffset], a
+ ret
+
+GetSpriteAnimVTile:
+; a = wSpriteAnimDict[a] if a in wSpriteAnimDict else 0
+; vTiles offset
+ push hl
+ push bc
+ ld hl, wSpriteAnimDict
+ ld b, a
+ ld c, NUM_SPRITE_ANIM_STRUCTS
.loop
- ld a, [hli] ; 23:5323
- cp b ; 23:5324
- jr z, .ok ; 23:5325
- inc hl ; 23:5327
- dec c ; 23:5328
- jr nz, .loop ; 23:5329
- xor a ; 23:532b
- jr .done ; 23:532c
+ ld a, [hli]
+ cp b
+ jr z, .ok
+ inc hl
+ dec c
+ jr nz, .loop
+ xor a
+ jr .done
.ok
- ld a, [hl] ; 23:532e
+ ld a, [hl]
+
.done
- pop bc ; 23:532f
- pop hl ; 23:5330
- ret ; 23:5331
-
-Function8d332: ; 8d332
- ld hl, $1 ; 23:5332
- add hl, bc ; 23:5335
- ld [hl], a ; 23:5336
- ld hl, $8 ; 23:5337
- add hl, bc ; 23:533a
- ld [hl], $0 ; 23:533b
- ld hl, $a ; 23:533d
- add hl, bc ; 23:5340
- ld [hl], $ff ; 23:5341
- ret ; 23:5343
-
-GetAnimatedObjectFrame: ; 8d344
+ pop bc
+ pop hl
+ ret
+
+_ReinitSpriteAnimFrame::
+ ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
+ add hl, bc
+ ld [hl], a
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld [hl], 0
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ ld [hl], -1
+ ret
+
+GetSpriteAnimFrame:
.loop
- ld hl, $8 ; 23:5344
- add hl, bc ; 23:5347
- ld a, [hl] ; 23:5348
- and a ; 23:5349
- jr z, .next_frame ; 23:534a
- dec [hl] ; 23:534c
- call .GetPointer ; 23:534d
- ld a, [hli] ; 23:5350
- push af ; 23:5351
- jr .okay ; 23:5352
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld a, [hl]
+ and a
+ jr z, .next_frame ; finished the current sequence
+ dec [hl]
+ call .GetPointer ; load pointer from SpriteAnimFrameData
+ ld a, [hli]
+ push af
+ jr .okay
.next_frame
- ld hl, $a ; 23:5354
- add hl, bc ; 23:5357
- inc [hl] ; 23:5358
- call .GetPointer ; 23:5359
- ld a, [hli] ; 23:535c
- cp $fe ; 23:535d
- jr z, .restart ; 23:535f
- cp $ff ; 23:5361
- jr z, .repeat_last ; 23:5363
- push af ; 23:5365
- ld a, [hl] ; 23:5366
- push hl ; 23:5367
- and $3f ; 23:5368
- ld hl, $9 ; 23:536a
- add hl, bc ; 23:536d
- add [hl] ; 23:536e
- ld hl, $8 ; 23:536f
- add hl, bc ; 23:5372
- ld [hl], a ; 23:5373
- pop hl ; 23:5374
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ inc [hl]
+ call .GetPointer ; load pointer from SpriteAnimFrameData
+ ld a, [hli]
+ cp dorestart_command
+ jr z, .restart
+ cp endanim_command
+ jr z, .repeat_last
+
+ push af
+ ld a, [hl]
+ push hl
+ and $ff ^ (Y_FLIP << 1 | X_FLIP << 1)
+ ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET
+ add hl, bc
+ add [hl]
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld [hl], a
+ pop hl
.okay
- ld a, [hl] ; 23:5375
- and $c0 ; 23:5376
- srl a ; 23:5378
- ld [$c5c0], a ; 23:537a
- pop af ; 23:537d
- ret ; 23:537e
-
-.repeat_last ; 8d37f
- xor a ; 23:537f
- ld hl, $8 ; 23:5380
- add hl, bc ; 23:5383
- ld [hl], a ; 23:5384
- ld hl, $a ; 23:5385
- add hl, bc ; 23:5388
- dec [hl] ; 23:5389
- dec [hl] ; 23:538a
- jr .loop ; 23:538b
+ ld a, [hl]
+ and Y_FLIP << 1 | X_FLIP << 1 ; The << 1 is compensated in the "frame" macro
+ srl a
+ ld [wCurSpriteOAMFlags], a
+ pop af
+ ret
+
+.repeat_last
+ xor a
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld [hl], a
+
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ dec [hl]
+ dec [hl]
+ jr .loop
.restart
- xor a ; 23:538d
- ld hl, $8 ; 23:538e
- add hl, bc ; 23:5391
- ld [hl], a ; 23:5392
- dec a ; 23:5393
- ld hl, $a ; 23:5394
- add hl, bc ; 23:5397
- ld [hl], a ; 23:5398
- jr .loop ; 23:5399
-
-.GetPointer
- ld hl, $1 ; 23:539b
- add hl, bc ; 23:539e
- ld e, [hl] ; 23:539f
- ld d, $0 ; 23:53a0
- ld hl, AnimatedObjectFrameData ; 23:53a2
- add hl, de ; 23:53a5
- add hl, de ; 23:53a6
- ld e, [hl] ; 23:53a7
- inc hl ; 23:53a8
- ld d, [hl] ; 23:53a9
- ld hl, $a ; 23:53aa
- add hl, bc ; 23:53ad
- ld l, [hl] ; 23:53ae
- ld h, $0 ; 23:53af
- add hl, hl ; 23:53b1
- add hl, de ; 23:53b2
- ret ; 23:53b3
-
-GetFrameOAMPointer: ; 8d3b4
- ld e, a ; 23:53b4
- ld d, $0 ; 23:53b5
- ld hl, AnimatedObjectOAMData ; 23:53b7
- add hl, de ; 23:53ba
- add hl, de ; 23:53bb
- add hl, de ; 23:53bc
- ret ; 23:53bd
-
-BrokenGetStdGraphics: ; 8d3be
- push hl ; 23:53be
- ld l, a ; 23:53bf
- ld h, $0 ; 23:53c0
- add hl, hl ; 23:53c2
- add hl, hl ; 23:53c3
- ld de, $6666 ; 23:53c4
- add hl, de ; 23:53c7
- ld c, [hl] ; 23:53c8
- inc hl ; 23:53c9
- ld b, [hl] ; 23:53ca
- inc hl ; 23:53cb
- ld e, [hl] ; 23:53cc
- inc hl ; 23:53cd
- ld d, [hl] ; 23:53ce
- pop hl ; 23:53cf
- push bc ; 23:53d0
- call $dfe ; Request2bpp ; 23:53d1
- pop bc ; 23:53d4
- ret ; 23:53d5
-
-AnimatedObjectSeqData: ; 8d3d6
- db $01, $01, $00
- db $04, $04, $00
- db $05, $05, $00
- db $06, $06, $00
- db $07, $07, $00
- db $08, $08, $00
- db $09, $09, $01
- db $0a, $09, $01
- db $0b, $0a, $01
- db $0d, $0b, $01
- db $10, $0c, $01
- db $12, $0d, $02
- db $13, $0e, $02
- db $14, $0f, $02
- db $15, $0e, $02
- db $16, $10, $00
- db $0d, $11, $01
- db $10, $12, $01
- db $09, $13, $01
- db $0b, $14, $01
- db $1a, $15, $05
- db $1c, $16, $06
- db $1d, $17, $06
- db $1e, $18, $06
- db $1f, $19, $07
- db $20, $1a, $07
- db $22, $1b, $07
- db $1a, $1c, $05
- db $23, $00, $00
- db $24, $1d, $08
- db $24, $1e, $08
- db $24, $1f, $08
- db $25, $20, $00
- db $27, $00, $00
- db $28, $21, $00
- db $29, $22, $00
- db $2a, $22, $00
- db $2b, $23, $00
- db $2c, $24, $00
- db $2d, $00, $00
- db $2f, $25, $00
- db $30, $00, $00
- db $2f, $27, $00
- db $31, $00, $00
- db $36, $29, $00
- db $37, $00, $00
- db $32, $23, $00
-
-INCLUDE "engine/sprite_anims.asm"
-INCLUDE "data/sprite_engine.asm"
+ xor a
+ ld hl, SPRITEANIMSTRUCT_DURATION
+ add hl, bc
+ ld [hl], a
+
+ dec a
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ ld [hl], a
+ jr .loop
+
+.GetPointer:
+ ; Get the data for the current frame for the current animation sequence
+
+ ; SpriteAnimFrameData[SpriteAnim[SPRITEANIMSTRUCT_FRAMESET_ID]][SpriteAnim[SPRITEANIMSTRUCT_FRAME]]
+ ld hl, SPRITEANIMSTRUCT_FRAMESET_ID
+ add hl, bc
+ ld e, [hl]
+ ld d, 0
+ ld hl, SpriteAnimFrameData
+ add hl, de
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, SPRITEANIMSTRUCT_FRAME
+ add hl, bc
+ ld l, [hl]
+ ld h, 0
+ add hl, hl
+ add hl, de
+ ret
+
+GetFrameOAMPointer:
+; Load OAM data pointer
+ ld e, a
+ ld d, 0
+ ld hl, SpriteAnimOAMData
+ add hl, de
+ add hl, de
+ add hl, de
+ ret
+
+Unreferenced_BrokenGetStdGraphics:
+ push hl
+ ld l, a
+ ld h, 0
+ add hl, hl
+ add hl, hl
+ ld de, BrokenStdGFXPointers ; broken 2bpp pointers
+ 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"
+
+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
Sprites_Cosine:
- add a, $10 ; 23:668a
+; a = d * cos(a * pi/32)
+ add %010000 ; cos(x) = sin(x + pi/2)
+ ; fallthrough
Sprites_Sine:
- and $3f ; 23:668c
- cp $20 ; 23:668e
- jr nc, .negative ; 23:6690
- call .ApplySineWave ; 23:6692
- ld a, h ; 23:6695
- ret ; 23:6696
-
-.negative
- and $1f ; 23:6697
- call .ApplySineWave ; 23:6699
- ld a, h ; 23:669c
- xor $ff ; 23:669d
- inc a ; 23:669f
- ret ; 23:66a0
-
-.ApplySineWave:
- ld e, a ; 23:66a1
- ld a, d ; 23:66a2
- ld d, $0 ; 23:66a3
- ld hl, .sinewave ; 23:66a5
- add hl, de ; 23:66a8
- add hl, de ; 23:66a9
- ld e, [hl] ; 23:66aa
- inc hl ; 23:66ab
- ld d, [hl] ; 23:66ac
- ld hl, $0 ; 23:66ad
-.multiply
- srl a ; 23:66b0
- jr nc, .even ; 23:66b2
- add hl, de ; 23:66b4
-.even
- sla e ; 23:66b5
- rl d ; 23:66b7
- and a ; 23:66b9
- jr nz, .multiply ; 23:66ba
- ret ; 23:66bc
-
-.sinewave ; 8e75d
- sine_wave $100
+; a = d * sin(a * pi/32)
+ calc_sine_wave .SineWave
+
+.SineWave:
+ sine_table 256
AnimateEndOfExpBar:
- ldh a, [$ffe9] ; 23:66fd
- ld de, EndOfExpBarGFX ; 23:66ff
- and a ; 23:6702
- jr z, .got_gfx ; 23:6703
- ld de, SGBEndOfExpBarGFX ; 23:6705
-.got_gfx
- ld hl, VTiles0 tile $00 ; 23:6708
- lb bc, BANK(EndOfExpBarGFX), 1 ; 23:670b
- call $dfe ; Request2bpp ; 23:670e
- ld c, $8 ; 23:6711
- ld d, $0 ; 23:6713
+ ldh a, [hSGB]
+ ld de, EndOfExpBarGFX
+ and a
+ jr z, .load
+ ld de, SGBEndOfExpBarGFX
+
+.load
+ ld hl, vTiles0 tile $00
+ lb bc, BANK(EndOfExpBarGFX), 1
+ call Request2bpp
+ ld c, 8
+ ld d, 0
.loop
- push bc ; 23:6715
- call .AnimateFrame ; 23:6716
- call $32e ; DelayFrame ; 23:6719
- pop bc ; 23:671c
- inc d ; 23:671d
- inc d ; 23:671e
- dec c ; 23:671f
- jr nz, .loop ; 23:6720
- call $30ff ; ClearSprites ; 23:6722
- ret ; 23:6725
-
-.AnimateFrame
- ld hl, $c300 ; 23:6726
- ld c, $8 ; 23:6729
+ push bc
+ call .AnimateFrame
+ call DelayFrame
+ pop bc
+ inc d
+ inc d
+ dec c
+ jr nz, .loop
+ call ClearSprites
+ ret
+
+.AnimateFrame:
+ ld hl, wVirtualOAMSprite00
+ ld c, 8 ; number of animated circles
.anim_loop
- ld a, c ; 23:672b
- and a ; 23:672c
- ret z ; 23:672d
- dec c ; 23:672e
- ld a, c ; 23:672f
- sla a ; 23:6730
- sla a ; 23:6732
- sla a ; 23:6734
- push af ; 23:6736
- push de ; 23:6737
- push hl ; 23:6738
- call Sprites_Sine ; 23:6739
- pop hl ; 23:673c
- pop de ; 23:673d
- add a, $68 ; 23:673e
- ld [hli], a ; 23:6740
- pop af ; 23:6741
- push de ; 23:6742
- push hl ; 23:6743
- call Sprites_Cosine ; 23:6744
- pop hl ; 23:6747
- pop de ; 23:6748
- add a, $54 ; 23:6749
- ld [hli], a ; 23:674b
- ld a, $0 ; 23:674c
- ld [hli], a ; 23:674e
- ld a, $6 ; 23:674f
- ld [hli], a ; 23:6751
- jr .anim_loop ; 23:6752
+ ld a, c
+ and a
+ ret z
+ dec c
+ ld a, c
+; multiply by 8
+ sla a
+ sla a
+ sla a
+ push af
+
+ push de
+ push hl
+ call Sprites_Sine
+ pop hl
+ pop de
+ add 13 * TILE_WIDTH
+ ld [hli], a ; y
+
+ pop af
+ push de
+ push hl
+ call Sprites_Cosine
+ pop hl
+ pop de
+ add 10 * TILE_WIDTH + 4
+ ld [hli], a ; x
+
+ ld a, $0
+ ld [hli], a ; tile id
+ ld a, PAL_BATTLE_OB_BLUE
+ ld [hli], a ; attributes
+ jr .anim_loop
EndOfExpBarGFX:
- dr $8e754, $8e764
-
+INCBIN "gfx/battle/expbarend.2bpp"
SGBEndOfExpBarGFX:
- dr $8e764, $8e774
-
-ClearAnimatedObjects2
- push hl ; 23:6774
- push de ; 23:6775
- push bc ; 23:6776
- push af ; 23:6777
- ld hl, $c508 ; 23:6778
- ld bc, $c1 ; 23:677b
+INCBIN "gfx/battle/expbarend_sgb.2bpp"
+
+ClearSpriteAnims2:
+ push hl
+ push de
+ push bc
+ push af
+ ld hl, wSpriteAnimDict
+ ld bc, wSpriteAnimsEnd - wSpriteAnimDict
.loop
- ld [hl], $0 ; 23:677e
- inc hl ; 23:6780
- dec bc ; 23:6781
- ld a, c ; 23:6782
- or b ; 23:6783
- jr nz, .loop ; 23:6784
- pop af ; 23:6786
- pop bc ; 23:6787
- pop de ; 23:6788
- pop hl ; 23:6789
- ret ; 23:678a
-; 8e78a
+ ld [hl], 0
+ inc hl
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret