diff options
Diffstat (limited to 'engine/gfx/sprites.asm')
-rwxr-xr-x | engine/gfx/sprites.asm | 1220 |
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 |