diff options
author | pikalaxalt <PikalaxALT@gmail.com> | 2016-06-05 14:54:57 -0400 |
---|---|---|
committer | pikalaxalt <PikalaxALT@gmail.com> | 2016-06-05 14:54:57 -0400 |
commit | 2f0305d80a0f64c093eabceb434a2fd0c122caa2 (patch) | |
tree | 7b5d7d54ed3ce4cebd9b3e2809c5ce54e8eaddfd | |
parent | e123bdf9784f752bda939a9040b6cc39e0ce014e (diff) |
This looks like Gen 2's object animation engine
-rwxr-xr-x | constants/oam_constants.asm | 15 | ||||
-rwxr-xr-x | engine/animated_objects_3e.asm | 394 | ||||
-rw-r--r-- | engine/bank3e.asm | 801 | ||||
-rwxr-xr-x | wram.asm | 42 |
4 files changed, 693 insertions, 559 deletions
diff --git a/constants/oam_constants.asm b/constants/oam_constants.asm index ddf95648..8e855fc9 100755 --- a/constants/oam_constants.asm +++ b/constants/oam_constants.asm @@ -7,3 +7,18 @@ OAMFLAG_VFLIPPED EQU %00100000 ; OAM flag flips the sprite vertically. ; OAM attribute flags OAM_HFLIP EQU %00100000 ; horizontal flip OAM_VFLIP EQU %01000000 ; vertical flip + +frame: MACRO + db \1 +x = \2 +REPT _NARG +- 2 +x = x | (\3 << 1) + shift +endr + db x + endm + +delanim EQUS "db $fc" +dorepeat EQUS "db $fd," +dorestart EQUS "db $fe" +endanim EQUS "db $ff" diff --git a/engine/animated_objects_3e.asm b/engine/animated_objects_3e.asm new file mode 100755 index 00000000..9d21ff8b --- /dev/null +++ b/engine/animated_objects_3e.asm @@ -0,0 +1,394 @@ +ClearObjectAnimationBuffers: ; fbb5a (3e:7b5a) + ld hl, wAnimatedObjectsData + ld bc, wAnimatedObjectsDataEnd - wAnimatedObjectsData + xor a + call FillMemory + ret + +RunObjectAnimations: + ld hl, wAnimatedObjectDataStructs + ld e, 10 +.loop + ld a, [hl] + and a + jr z, .next + ld c, l + ld b, h + push hl + push de + call ExecuteCurrentAnimatedObjectCallback + call UpdateCurrentAnimatedObjectFrame + pop de + pop hl + jr c, .quit +.next + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ld a, [wCurrentAnimatedObjectOAMBufferOffset] + ld l, a + ld h, wOAMBuffer / $100 +.deinit_unused_oam_loop + ld a, l + cp wOAMBufferEnd % $100 + jr nc, .quit + xor a + ld [hli], a + jr .deinit_unused_oam_loop + +.quit + ret + +SpawnAnimatedObject: + push de + push af + ld hl, wAnimatedObjectDataStructs + ld e, 10 +.loop + ld a, [hl] + and a + jr z, .init + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + pop af + pop de + scf + ret + +.init + pop af + ld c, l + ld b, h + ld hl, wNumLoadedAnimatedObjects + inc [hl] + ld e, a + ld d, $0 + ld a, [wAnimatedObjectSpawnStateDataPointer] + ld l, a + ld a, [wAnimatedObjectSpawnStateDataPointer + 1] + ld h, a + add hl, de + add hl, de + add hl, de + ld e, l + ld d, h + ld hl, $0 + add hl, bc + ld a, [wNumLoadedAnimatedObjects] + ld [hli], a + ld a, [de] + ld [hli], a + inc de + ld a, [de] + ld [hli], a + inc de + xor a + ld [hli], a + pop de + ld hl, $4 + add hl, bc + ld a, e + ld [hli], a + ld a, d + ld [hli], a + xor a + ld [hli], a + ld [hli], a + xor a + ld [hli], a + ld [hli], a + dec a + ld [hli], a + xor a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ret + +MaskCurrentAnimatedObjectStruct: + ld hl, $0 + add hl, bc + ld [hl], $0 + ret + +MaskAllAnimatedObjectStructs: + ld hl, wAnimatedObjectDataStructs + ld e, 10 +.loop + ld [hl], $0 + ld bc, $10 + add hl, bc + dec e + jr nz, .loop + ret + +UpdateCurrentAnimatedObjectFrame: + xor a + ld [wCurAnimatedObjectOAMAttributes], a + ld hl, $3 + add hl, bc + ld a, [hli] + ld [wCurrentAnimatedObjectVTileOffset], a + ld a, [hli] + ld [wCurrentAnimatedObjectXCoord], a + ld a, [hli] + ld [wCurrentAnimatedObjectYCoord], a + ld a, [hli] + ld [wCurrentAnimatedObjectXOffset], a + ld a, [hl] + ld [wCurrentAnimatedObjectYOffset], a + call UpdateDurationTimerAndFrameStateForCurrentAnimatedObject + cp $fd + jr z, .finish + cp $fc + jr z, .delete_animation + call GetCurrentAnimatedObjectOAMDataPointer + ld a, [wCurrentAnimatedObjectVTileOffset] + add [hl] + ld [wCurrentAnimatedObjectVTileOffset], a + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + push bc + ld a, [wCurrentAnimatedObjectOAMBufferOffset] + ld e, a + ld d, wOAMBuffer / $100 + ld a, [hli] + ld c, a +.loop + ld a, [wCurrentAnimatedObjectYCoord] + ld b, a + ld a, [wCurrentAnimatedObjectYOffset] + add b + ld b, a + ld a, [wAnimatedObjectGlobalYOffset] + add b + ld b, a + call GetCurrentAnimatedObjectTileYCoordinate + add b + ld [de], a + inc hl + inc de + ld a, [wCurrentAnimatedObjectXCoord] + ld b, a + ld a, [wCurrentAnimatedObjectXOffset] + add b + ld b, a + ld a, [wAnimatedObjectGlobalXOffset] + add b + ld b, a + call GetCurrentAnimatedObjectTileXCoordinate + add b + ld [de], a + inc hl + inc de + ld a, [wCurrentAnimatedObjectVTileOffset] + add [hl] + ld [de], a + inc hl + inc de + call SetCurrentAnimatedObjectOAMAttributes + ld b, a + ld a, [wc634] + cp $7 + ld a, b + jr z, .skip_load + ld [de], a +.skip_load + inc hl + inc de + ld a, e + ld [wCurrentAnimatedObjectOAMBufferOffset], a + cp wOAMBufferEnd % $100 + jr nc, .oam_is_full + dec c + jr nz, .loop + pop bc + jr .finish + +.delete_animation + call MaskCurrentAnimatedObjectStruct +.finish + and a + ret + +.oam_is_full + pop bc + scf + ret + +GetCurrentAnimatedObjectTileYCoordinate: + push hl + ld a, [hl] + ld hl, wCurAnimatedObjectOAMAttributes + bit 6, [hl] + jr z, .no_flip + add $8 + xor $ff + inc a +.no_flip + pop hl + ret + +GetCurrentAnimatedObjectTileXCoordinate: + push hl + ld a, [hl] + ld hl, wCurAnimatedObjectOAMAttributes + bit 5, [hl] + jr z, .no_flip + add $8 + xor $ff + inc a +.no_flip + pop hl + ret + +SetCurrentAnimatedObjectOAMAttributes: + ld a, [wCurAnimatedObjectOAMAttributes] + ld b, a + ld a, [hl] + xor b + and $e0 + ld b, a + ld a, [hl] + and $10 + or b + bit 4, a + ret z + or $4 + ret + +GetCurrentAnimatedObjectOAMDataPointer: + ld e, a + ld d, $0 + ld a, [wAnimatedObjectOAMDataPointer] + ld l, a + ld a, [wAnimatedObjectOAMDataPointer + 1] + ld h, a + add hl, de + add hl, de + add hl, de + ret + +SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters: + ld hl, $1 + add hl, bc + ld [hl], a + ld hl, $8 + add hl, bc + ld [hl], $0 + ld hl, $9 + add hl, bc + ld [hl], $0 + ld hl, $a + add hl, bc + ld [hl], $ff + ret + +UpdateDurationTimerAndFrameStateForCurrentAnimatedObject: +.loop + ld hl, $8 + add hl, bc + ld a, [hl] + and a + jr z, .next_frame + dec [hl] + call GetPointerToCurrentAnimatedObjectFrameScript + ld a, [hli] + push af + jr .finish + +.next_frame + ld hl, $a + add hl, bc + inc [hl] + call GetPointerToCurrentAnimatedObjectFrameScript + ld a, [hli] + cp $fe + jr z, .restart_anim + cp $ff + jr z, .hold_last_frame_state + push af + ld a, [hl] + push hl + and $3f + ld hl, $9 + add hl, bc + add [hl] + ld hl, $8 + add hl, bc + ld [hl], a + pop hl +.finish + ld a, [hl] + and $c0 + srl a + ld [wCurAnimatedObjectOAMAttributes], a + pop af + ret + +.hold_last_frame_state + xor a + ld hl, $8 + add hl, bc + ld [hl], a + ld hl, $a + add hl, bc + dec [hl] + dec [hl] + jr .loop + +.restart_anim + xor a + ld hl, $8 + add hl, bc + ld [hl], a + dec a + ld hl, $a + add hl, bc + ld [hl], a + jr .loop + +GetPointerToCurrentAnimatedObjectFrameScript: + ld hl, $1 + add hl, bc + ld e, [hl] + ld d, $0 + ld a, [wAnimatedObjectFramesDataPointer] + ld l, a + ld a, [wAnimatedObjectFramesDataPointer + 1] + ld h, a + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $a + add hl, bc + ld l, [hl] + ld h, $0 + add hl, hl + add hl, de + ret + +ExecuteCurrentAnimatedObjectCallback: + ld hl, $2 + add hl, bc + ld e, [hl] + ld d, $0 + ld a, [wAnimatedObjectJumptablePointer] + ld l, a + ld a, [wAnimatedObjectJumptablePointer + 1] + ld h, a + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp [hl] diff --git a/engine/bank3e.asm b/engine/bank3e.asm index 44fdee42..023f9b20 100644 --- a/engine/bank3e.asm +++ b/engine/bank3e.asm @@ -32,7 +32,7 @@ SurfingPikachuMinigame: call UpdateGBCPal_BGP call UpdateGBCPal_OBP0 call UpdateGBCPal_OBP1 - call Func_fbb5a + call ClearObjectAnimationBuffers call ClearSprites xor a ld [hLCDCPointer], a @@ -73,8 +73,8 @@ Func_f807a: ret nz call Func_f8282 ld a, $3c - ld [wc5bd], a - call Func_fbb65 + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations call Func_f8848 call Func_f80a8 call Func_f80c4 @@ -172,7 +172,7 @@ Func_f8116: call FillMemory xor a ld [H_AUTOBGTRANSFERENABLED], a - call Func_fbb5a + call ClearObjectAnimationBuffers ld hl, SurfingPikachu1Graphics ld de, $9000 @@ -187,22 +187,22 @@ Func_f8116: call FarCopyData ld a, Unkn_f93d3 % $100 - ld [wc5c0], a + ld [wAnimatedObjectSpawnStateDataPointer], a ld a, Unkn_f93d3 / $100 - ld [wc5c0 + 1], a - ld a, Unkn_f93fa % $100 - ld [wc5c4], a - ld a, Unkn_f93fa / $100 - ld [wc5c4 + 1], a + ld [wAnimatedObjectSpawnStateDataPointer + 1], a + ld a, Jumptable_f93fa % $100 + ld [wAnimatedObjectJumptablePointer], a + ld a, Jumptable_f93fa / $100 + ld [wAnimatedObjectJumptablePointer + 1], a ld a, Unkn_f9507 % $100 - ld [wc5c6], a + ld [wAnimatedObjectOAMDataPointer], a ld a, Unkn_f9507 / $100 - ld [wc5c6 + 1], a + ld [wAnimatedObjectOAMDataPointer + 1], a ld a, Unkn_f9405 % $100 - ld [wc5c2], a + ld [wAnimatedObjectFramesDataPointer], a ld a, Unkn_f9405 / $100 - ld [wc5c2 + 1], a - ld hl, $9800 + ld [wAnimatedObjectFramesDataPointer + 1], a + ld hl, vBGMap0 ld bc, $800 ld a, $0 call FillMemory @@ -212,7 +212,7 @@ Func_f8116: call FillMemory ld a, $1 lb de, $74, $58 - call Func_fbb93 + call SpawnAnimatedObject ld a, $74 ld [wc5ea], a call Func_f9223 @@ -391,7 +391,7 @@ Jumptable_f8291: Func_f82ab: ld a, $2 lb de, $48, $e0 - call Func_fbb93 + call SpawnAnimatedObject ld hl, wc5d1 inc [hl] ld a, $1 @@ -438,7 +438,7 @@ Func_f8300: ld [wc631], a ld a, $b lb de, $88, $58 - call Func_fbb93 + call SpawnAnimatedObject ld hl, $7 add hl, bc ld [hl], $80 @@ -740,7 +740,7 @@ Func_f84e2: ld a, $60 ld [wc5e1], a ld a, $10 - call Func_fbcd4 + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters xor a ld [wChannelSoundIDs + CH7], a ld a, $93 @@ -793,7 +793,7 @@ Func_f8545: ld a, $0 ld [wc5d2], a ld a, $4 - call Func_fbcd4 + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters ret Func_f8561: @@ -806,7 +806,7 @@ Func_f8561: Func_f856d: ld a, $f - call Func_fbcd4 + call SetCurrentAnimatedObjectCallbackAndResetFrameStateRegisters ld hl, $c add hl, bc ld [hl], $0 @@ -1194,7 +1194,7 @@ Func_f87b5: ld e, [hl] ld a, $a push bc - call Func_fbb93 + call SpawnAnimatedObject pop bc ret @@ -1243,7 +1243,7 @@ Func_f87fb: ret Func_f8807: - call Func_fbbe8 + call MaskCurrentAnimatedObjectStruct ret Func_f880b: @@ -1288,7 +1288,7 @@ Func_f882b: .asm_f883f ld a, $1 ld [wc633], a - call Func_fbbe8 + call MaskCurrentAnimatedObjectStruct ret Func_f8848: @@ -1325,7 +1325,7 @@ Func_f886b: srl e srl e ld d, $0 - ld hl, $9800 + ld hl, vBGMap0 add hl, de ld a, [wc5ea] srl a @@ -1768,7 +1768,7 @@ Func_f8bed: ld a, [wc5d9] add $3 push bc - call Func_fbb93 + call SpawnAnimatedObject pop bc ret @@ -1794,7 +1794,7 @@ Func_f8bed: ld e, [hl] ld a, $9 push bc - call Func_fbb93 + call SpawnAnimatedObject pop bc ret @@ -1817,7 +1817,7 @@ Func_f8bed: ld e, [hl] ld a, $8 push bc - call Func_fbb93 + call SpawnAnimatedObject pop bc ret @@ -1913,7 +1913,7 @@ Func_f8cc7: srl a ld e, a ld d, $0 - ld hl, $9800 + ld hl, vBGMap0 add hl, de ld a, l ld [hRedrawRowOrColumnDest], a @@ -2305,31 +2305,31 @@ Func_f8fb3: call DisableLCD xor a ld [H_AUTOBGTRANSFERENABLED], a - call Func_fbb5a + call ClearObjectAnimationBuffers ld hl, $6324 ld de, $8800 ld bc, $900 ld a, $20 call FarCopyData ld a, Unkn_f93d3 % $100 - ld [wc5c0], a + ld [wAnimatedObjectSpawnStateDataPointer], a ld a, Unkn_f93d3 / $100 - ld [wc5c0 + 1], a - ld a, Unkn_f93fa % $100 - ld [wc5c4], a - ld a, Unkn_f93fa / $100 - ld [wc5c4 + 1], a + ld [wAnimatedObjectSpawnStateDataPointer + 1], a + ld a, Jumptable_f93fa % $100 + ld [wAnimatedObjectJumptablePointer], a + ld a, Jumptable_f93fa / $100 + ld [wAnimatedObjectJumptablePointer + 1], a ld a, Unkn_f9507 % $100 - ld [wc5c6], a + ld [wAnimatedObjectOAMDataPointer], a ld a, Unkn_f9507 / $100 - ld [wc5c6 + 1], a + ld [wAnimatedObjectOAMDataPointer + 1], a ld a, Unkn_f9405 % $100 - ld [wc5c2], a + ld [wAnimatedObjectFramesDataPointer], a ld a, Unkn_f9405 / $100 - ld [wc5c2 + 1], a + ld [wAnimatedObjectFramesDataPointer + 1], a ld a, $c lb de, $74, $58 - call Func_fbb93 + call SpawnAnimatedObject call Func_f9053 xor a ld [hSCX], a @@ -2363,8 +2363,8 @@ Func_f8fb3: and a ret nz ld a, $0 - ld [wc5bd], a - call Func_fbb65 + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations call DelayFrame jr .asm_f9041 @@ -2721,7 +2721,7 @@ Unkn_f93d3: db $13, $03, $00 db $1b, $04, $00 -Unkn_f93fa: +Jumptable_f93fa: dw Func_f9404 dw Func_f8470 dw Func_f87fb @@ -2762,89 +2762,175 @@ Unkn_f9405: dw Unkn_f94fe Unkn_f943d: - db $00,$20 - db $ff + frame $00, 32 + endanim + Unkn_f9440: - db $01,$08, $02,$08 - db $fe + frame $01, 8 + frame $02, 8 + dorestart + Unkn_f9445: - db $03,$08, $04,$08 - db $fe + frame $03, 8 + frame $04, 8 + dorestart + Unkn_f944a: - db $05,$08, $06,$08 - db $fe + frame $05, 8 + frame $06, 8 + dorestart + Unkn_f944f: - db $07,$08, $08,$08 - db $fe + frame $07, 8 + frame $08, 8 + dorestart + Unkn_f9454: - db $09,$08, $0a,$08 - db $fe + frame $09, 8 + frame $0a, 8 + dorestart + Unkn_f9459: - db $0b,$08, $0c,$08 - db $fe + frame $0b, 8 + frame $0c, 8 + dorestart + Unkn_f945e: - db $0d,$08, $0e,$08 - db $fe + frame $0d, 8 + frame $0e, 8 + dorestart + Unkn_f9463: - db $01,$c8, $02,$c8 - db $fe + frame $01, 8, OAM_HFLIP, OAM_VFLIP + frame $02, 8, OAM_HFLIP, OAM_VFLIP + dorestart + Unkn_f9468: - db $03,$c8, $04,$c8 - db $fe + frame $03, 8, OAM_HFLIP, OAM_VFLIP + frame $04, 8, OAM_HFLIP, OAM_VFLIP + dorestart + Unkn_f946d: - db $05,$c8, $06,$c8 - db $fe + frame $05, 8, OAM_HFLIP, OAM_VFLIP + frame $06, 8, OAM_HFLIP, OAM_VFLIP + dorestart + Unkn_f9472: - db $07,$c8, $08,$c8 - db $fe + frame $07, 8, OAM_HFLIP, OAM_VFLIP + frame $08, 8, OAM_HFLIP, OAM_VFLIP + dorestart + Unkn_f9477: - db $09,$c8, $0a,$c8 - db $fe + frame $09, 8, OAM_HFLIP, OAM_VFLIP + frame $0a, 8, OAM_HFLIP, OAM_VFLIP + dorestart + Unkn_f947c: - db $0b,$c8, $0c,$c8 - db $fe + frame $0b, 8, OAM_HFLIP, OAM_VFLIP + frame $0c, 8, OAM_HFLIP, OAM_VFLIP + dorestart + Unkn_f9481: - db $0d,$c8, $0e,$c8 - db $fe + frame $0d, 8, OAM_HFLIP, OAM_VFLIP + frame $0e, 8, OAM_HFLIP, OAM_VFLIP + dorestart + Unkn_f9486: - db $11,$07, $12,$07 - db $fe + frame $11, 7 + frame $12, 7 + dorestart + Unkn_f948b: - db $13,$02, $14,$02, $fd,$08, $15,$02 - db $ff + frame $13, 2 + frame $14, 2 + dorepeat 8 + frame $15, 2 + endanim + Unkn_f9494: - db $16,$20, $16,$20 - db $fc + frame $16, 32 + frame $16, 32 + delanim + Unkn_f9499: - db $17,$20, $17,$20 - db $fc + frame $17, 32 + frame $17, 32 + delanim + Unkn_f949e: - db $18,$20 - db $ff + frame $18, 32 + endanim + Unkn_f94a1: - db $1a,$04, $fd,$01, $1a,$03, $fd,$01, $1a,$02, $fd,$01, $1a,$01 - db $fc + frame $1a, 4 + dorepeat 1 + frame $1a, 3 + dorepeat 1 + frame $1a, 2 + dorepeat 1 + frame $1a, 1 + delanim + Unkn_f94b0: - db $1b,$04, $fd,$01, $1b,$03, $fd,$01, $1b,$02, $fd,$01, $1b,$01 - db $fc + frame $1b, 4 + dorepeat 1 + frame $1b, 3 + dorepeat 1 + frame $1b, 2 + dorepeat 1 + frame $1b, 1 + delanim + Unkn_f94bf: - db $1c,$04, $fd,$01, $1c,$03, $fd,$01, $1c,$02, $fd,$01, $1c,$01 - db $fc + frame $1c, 4 + dorepeat 1 + frame $1c, 3 + dorepeat 1 + frame $1c, 2 + dorepeat 1 + frame $1c, 1 + delanim + Unkn_f94ce: - db $1d,$04, $fd,$01, $1d,$03, $fd,$01, $1d,$02, $fd,$01, $1d,$01 - db $fc + frame $1d, 4 + dorepeat 1 + frame $1d, 3 + dorepeat 1 + frame $1d, 2 + dorepeat 1 + frame $1d, 1 + delanim + Unkn_f94dd: - db $1e,$04, $fd,$01, $1e,$03, $fd,$01, $1e,$02, $fd,$01, $1e,$01 - db $fc + frame $1e, 4 + dorepeat 1 + frame $1e, 3 + dorepeat 1 + frame $1e, 2 + dorepeat 1 + frame $1e, 1 + delanim + Unkn_f94ec: - db $1f,$04, $fd,$01, $1f,$03, $fd,$01, $1f,$02, $fd,$01, $1f,$01 - db $fc + frame $1f, 4 + dorepeat 1 + frame $1f, 3 + dorepeat 1 + frame $1f, 2 + dorepeat 1 + frame $1f, 1 + delanim + Unkn_f94fb: - db $19,$01 - db $fc + frame $19, 1 + delanim + Unkn_f94fe: - db $20,$07, $21,$07, $22,$07, $23,$07 - db $fe + frame $20, 7 + frame $21, 7 + frame $22, 7 + frame $23, 7 + dorestart Unkn_f9507: dbw $00, Unkn_f9573 @@ -3119,8 +3205,8 @@ PlayIntroScene: jr nz, .asm_f986e call Func_f98fc ld a, $0 - ld [wc5bd], a - call Func_fbb65 + ld [wCurrentAnimatedObjectOAMBufferOffset], a + call RunObjectAnimations ld a, [wc634] cp $7 call z, Func_f98a2 @@ -3140,7 +3226,7 @@ PlayIntroScene: ld [rIE], a ld a, $90 ld [hWY], a - call Func_fbb5a + call ClearObjectAnimationBuffers ld hl, wTileMap ld bc, SCREEN_WIDTH * SCREEN_HEIGHT xor a @@ -3263,13 +3349,13 @@ Func_f996a: call UpdateMusicCTimes xor a ld [hLCDCPointer], a - ld hl, $9800 + ld hl, vBGMap0 ld bc, $400 xor a call Func_f9fb3 call Func_f9996 - ld de, $58b8 - ld a, $4 + lb de, $58, $b8 ; overloaded + ld a, $4 ; overloaded call Func_f99d2 ld a, $1 call Func_f9e9a @@ -3334,7 +3420,7 @@ Func_f99d2: push hl push af ld a, $8 - call Func_fbb93 + call SpawnAnimatedObject pop af ld hl, $b add hl, bc @@ -3366,7 +3452,7 @@ Func_f9a08: ret .asm_f9a17 - call Func_fbbef + call MaskAllAnimatedObjectStructs call Func_f992a ret @@ -3423,7 +3509,7 @@ Func_f9a6b: ld a, $42 ld [hLCDCPointer], a call Func_f9ec4 - ld hl, $9800 + ld hl, vBGMap0 ld bc, $60 xor a call Func_f9fb3 @@ -3506,11 +3592,11 @@ Func_f9b04: call UpdateMusicCTimes xor a ld [hLCDCPointer], a - ld hl, $9800 + ld hl, vBGMap0 ld bc, $400 xor a call Func_f9fb3 - ld hl, $9800 + ld hl, vBGMap0 ld bc, $100 ld a, $2 call Func_f9fb3 @@ -3598,7 +3684,7 @@ Func_f9cac: call UpdateMusicCTimes xor a ld [hLCDCPointer], a - ld hl, $9800 + ld hl, vBGMap0 ld bc, $80 ld a, $1 call Func_f9fb3 @@ -3647,7 +3733,7 @@ Func_f9d12: ret nc lb de, $68, $58 ld a, $a - call Func_fbb93 + call SpawnAnimatedObject call Func_f992a ret @@ -3665,7 +3751,7 @@ Func_f9d22: ret .asm_f9d3c - call Func_fbbef + call MaskAllAnimatedObjectStructs call Func_f9fbe ld hl, wTileMap ld bc, $50 @@ -3765,7 +3851,7 @@ Func_f9e12: ret Func_f9e1d: - call Func_fbb93 + call SpawnAnimatedObject ld a, c ld [wc636], a ld a, b @@ -3777,7 +3863,7 @@ Func_f9e29: ld c, a ld a, [wc636 + 1] ld b, a - call Func_fbbe8 + call MaskCurrentAnimatedObjectStruct ret Func_f9e35: @@ -3821,7 +3907,7 @@ Func_f9e4d: ret Func_f9e5f: - ld hl, $9800 + ld hl, vBGMap0 ld bc, $80 ld a, $1 call Func_f9fb3 @@ -3932,7 +4018,7 @@ Func_f9f0d: ld hl, $9000 ld bc, $3e80 call CopyVideoData - call Func_fbb5a + call ClearObjectAnimationBuffers call Func_f9f75 ld b, $8 call RunPaletteCommand @@ -3949,21 +4035,21 @@ Func_f9f0d: Func_f9f75: ld a, Unkn_f9fda % $100 - ld [wc5c0], a + ld [wAnimatedObjectSpawnStateDataPointer], a ld a, Unkn_f9fda / $100 - ld [wc5c0 + 1], a + ld [wAnimatedObjectSpawnStateDataPointer + 1], a ld a, Jumptable_f9ffb % $100 - ld [wc5c4], a + ld [wAnimatedObjectJumptablePointer], a ld a, Jumptable_f9ffb / $100 - ld [wc5c4 + 1], a + ld [wAnimatedObjectJumptablePointer + 1], a ld a, Unkn_fa13d % $100 - ld [wc5c6], a + ld [wAnimatedObjectOAMDataPointer], a ld a, Unkn_fa13d / $100 - ld [wc5c6 + 1], a + ld [wAnimatedObjectOAMDataPointer + 1], a ld a, Unkn_fa0ea % $100 - ld [wc5c2], a + ld [wAnimatedObjectFramesDataPointer], a ld a, Unkn_fa0ea / $100 - ld [wc5c2 + 1], a + ld [wAnimatedObjectFramesDataPointer + 1], a ret Func_f9f9e: @@ -4184,38 +4270,62 @@ Unkn_fa0ea: dw Unkn_fa138 Unkn_fa100: - db $00,$20 - db $ff + frame $00, 32 + endanim + Unkn_fa103: - db $01,$04, $02,$04, $03,$04 - db $fe + frame $01, 4 + frame $02, 4 + frame $03, 4 + dorestart + Unkn_fa10a: - db $04,$04, $05,$04, $06,$04 - db $fe + frame $04, 4 + frame $05, 4 + frame $06, 4 + dorestart + Unkn_fa111: - db $07,$04, $08,$04, $09,$04 - db $fe + frame $07, 4 + frame $08, 4 + frame $09, 4 + dorestart + Unkn_fa118: - db $0a,$20 - db $ff + frame $0a, 32 + endanim + Unkn_fa11b: - db $0b,$20 - db $ff + frame $0b, 32 + endanim + Unkn_fa11e: - db $0c,$20 - db $ff + frame $0c, 32 + endanim + Unkn_fa121: - db $0d,$20 - db $ff + frame $0d, 32 + endanim + Unkn_fa124: - db $0e,$20 - db $ff + frame $0e, 32 + endanim + Unkn_fa127: - db $0f,$1f, $11,$02, $0f,$02, $11,$02, $0f,$1f, $11,$02, $0f,$17, $10,$20 - db $ff + frame $0f, 31 + frame $11, 2 + frame $0f, 2 + frame $11, 2 + frame $0f, 31 + frame $11, 2 + frame $0f, 23 + frame $10, 32 + endanim + Unkn_fa138: - db $12,$04, $13,$04 - db $fe + frame $12, 4 + frame $13, 4 + dorestart Unkn_fa13d: dbw $00, Unkn_fa179 @@ -4383,399 +4493,6 @@ Unkn_fa329: db $00, $18, $11, $30 db $00, $20, $10, $30 - YellowIntroGraphics: INCBIN "gfx/yellow_intro.2bpp" -Func_fbb5a: ; fbb5a (3e:7b5a) - ld hl, wTileMapBackup - ld bc, 10 * SCREEN_WIDTH - xor a - call FillMemory - ret - -Func_fbb65: - ld hl, wc51c - ld e, $a -.asm_fbb6a - ld a, [hl] - and a - jr z, .asm_fbb7c - ld c, l - ld b, h - push hl - push de - call Func_fbd61 - call Func_fbbfe - pop de - pop hl - jr c, .asm_fbb92 -.asm_fbb7c - ld bc, $10 - add hl, bc - dec e - jr nz, .asm_fbb6a - ld a, [wc5bd] - ld l, a - ld h, $c3 -.asm_fbb89 - ld a, l - cp $a0 - jr nc, .asm_fbb92 - xor a - ld [hli], a - jr .asm_fbb89 - -.asm_fbb92 - ret - -Func_fbb93: - push de - push af - ld hl, wc51c - ld e, $a -.asm_fbb9a - ld a, [hl] - and a - jr z, .asm_fbba9 - ld bc, $10 - add hl, bc - dec e - jr nz, .asm_fbb9a - pop af - pop de - scf - ret - -.asm_fbba9 - pop af - ld c, l - ld b, h - ld hl, wc5bc - inc [hl] - ld e, a - ld d, $0 - ld a, [wc5c0] - ld l, a - ld a, [wc5c0 + 1] - ld h, a - add hl, de - add hl, de - add hl, de - ld e, l - ld d, h - ld hl, $0 - add hl, bc - ld a, [wc5bc] - ld [hli], a - ld a, [de] - ld [hli], a - inc de - ld a, [de] - ld [hli], a - inc de - xor a - ld [hli], a - pop de - ld hl, $4 - add hl, bc - ld a, e - ld [hli], a - ld a, d - ld [hli], a - xor a - ld [hli], a - ld [hli], a - xor a - ld [hli], a - ld [hli], a - dec a - ld [hli], a - xor a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ret - -Func_fbbe8: - ld hl, $0 - add hl, bc - ld [hl], $0 - ret - -Func_fbbef: - ld hl, wc51c - ld e, $a -.asm_fbbf4 - ld [hl], $0 - ld bc, $10 - add hl, bc - dec e - jr nz, .asm_fbbf4 - ret - -Func_fbbfe: - xor a - ld [wc5c8], a - ld hl, $3 - add hl, bc - ld a, [hli] - ld [wc5c9], a - ld a, [hli] - ld [wc5ca], a - ld a, [hli] - ld [wc5cb], a - ld a, [hli] - ld [wc5cc], a - ld a, [hl] - ld [wc5cd], a - call Func_fbcec - cp $fd - jr z, .asm_fbc8d - cp $fc - jr z, .asm_fbc8a - call Func_fbcc5 - ld a, [wc5c9] - add [hl] - ld [wc5c9], a - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - push bc - ld a, [wc5bd] - ld e, a - ld d, $c3 - ld a, [hli] - ld c, a -.asm_fbc3c - ld a, [wc5cb] - ld b, a - ld a, [wc5cd] - add b - ld b, a - ld a, [wc5ce] - add b - ld b, a - call Func_fbc92 - add b - ld [de], a - inc hl - inc de - ld a, [wc5ca] - ld b, a - ld a, [wc5cc] - add b - ld b, a - ld a, [wc5cf] - add b - ld b, a - call Func_fbca2 - add b - ld [de], a - inc hl - inc de - ld a, [wc5c9] - add [hl] - ld [de], a - inc hl - inc de - call Func_fbcb2 - ld b, a - ld a, [wc634] - cp $7 - ld a, b - jr z, .asm_fbc7a - ld [de], a -.asm_fbc7a - inc hl - inc de - ld a, e - ld [wc5bd], a - cp $a0 - jr nc, .asm_fbc8f - dec c - jr nz, .asm_fbc3c - pop bc - jr .asm_fbc8d - -.asm_fbc8a - call Func_fbbe8 -.asm_fbc8d - and a - ret - -.asm_fbc8f - pop bc - scf - ret - -Func_fbc92: - push hl - ld a, [hl] - ld hl, wc5c8 - bit 6, [hl] - jr z, .asm_fbca0 - add $8 - xor $ff - inc a -.asm_fbca0 - pop hl - ret - -Func_fbca2: - push hl - ld a, [hl] - ld hl, wc5c8 - bit 5, [hl] - jr z, .asm_fbcb0 - add $8 - xor $ff - inc a -.asm_fbcb0 - pop hl - ret - -Func_fbcb2: - ld a, [wc5c8] - ld b, a - ld a, [hl] - xor b - and $e0 - ld b, a - ld a, [hl] - and $10 - or b - bit 4, a - ret z - or $4 - ret - -Func_fbcc5: - ld e, a - ld d, $0 - ld a, [wc5c6] - ld l, a - ld a, [wc5c6 + 1] - ld h, a - add hl, de - add hl, de - add hl, de - ret - -Func_fbcd4: - ld hl, $1 - add hl, bc - ld [hl], a - ld hl, $8 - add hl, bc - ld [hl], $0 - ld hl, $9 - add hl, bc - ld [hl], $0 - ld hl, $a - add hl, bc - ld [hl], $ff - ret - -Func_fbcec: - ld hl, $8 - add hl, bc - ld a, [hl] - and a - jr z, .asm_fbcfc - dec [hl] - call Func_fbd43 - ld a, [hli] - push af - jr .asm_fbd1d - -.asm_fbcfc - ld hl, $a - add hl, bc - inc [hl] - call Func_fbd43 - ld a, [hli] - cp $fe - jr z, .asm_fbd35 - cp $ff - jr z, .asm_fbd27 - push af - ld a, [hl] - push hl - and $3f - ld hl, $9 - add hl, bc - add [hl] - ld hl, $8 - add hl, bc - ld [hl], a - pop hl -.asm_fbd1d - ld a, [hl] - and $c0 - srl a - ld [wc5c8], a - pop af - ret - -.asm_fbd27 - xor a - ld hl, $8 - add hl, bc - ld [hl], a - ld hl, $a - add hl, bc - dec [hl] - dec [hl] - jr Func_fbcec - -.asm_fbd35 - xor a - ld hl, $8 - add hl, bc - ld [hl], a - dec a - ld hl, $a - add hl, bc - ld [hl], a - jr Func_fbcec - -Func_fbd43: - ld hl, $1 - add hl, bc - ld e, [hl] - ld d, $0 - ld a, [wc5c2] - ld l, a - ld a, [wc5c2 + 1] - ld h, a - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld hl, $a - add hl, bc - ld l, [hl] - ld h, $0 - add hl, hl - add hl, de - ret - -Func_fbd61: - ld hl, $2 - add hl, bc - ld e, [hl] - ld d, $0 - ld a, [wc5c4] - ld l, a - ld a, [wc5c4 + 1] - ld h, a - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp [hl] +INCLUDE "engine/animated_objects_3e.asm" @@ -263,6 +263,7 @@ SECTION "OAM Buffer", WRAM0[$c300] wOAMBuffer:: ; c300 ; buffer for OAM data. Copied to OAM by DMA ds 4 * 40 +wOAMBufferEnd:: wTileMap:: ; c3a0 ; buffer for tiles that are visible on screen (20 columns by 18 rows) @@ -275,37 +276,44 @@ wTileMapBackup:: ; c508 ; buffer for temporarily saving and restoring current screen's tiles ; (e.g. if menus are drawn on top) ; ds 20 * 18 - ds 20 -wc51c:: ; c51c - ds 160 -wc5bc:: ; c5bc + +wAnimatedObjectsData:: +; Used by functions in BANK 3E +; This looks similar to the address structure for Gen 2 OAM animations. + +wAnimatedObjectStartTileOffsets:: + ds 10 * 2 +wAnimatedObjectDataStructs:: ; c51c + ds 10 * $10 +wNumLoadedAnimatedObjects:: ; c5bc ds 1 -wc5bd:: ; c5bd +wCurrentAnimatedObjectOAMBufferOffset:: ; c5bd ds 3 -wc5c0:: ; c5c0 +wAnimatedObjectSpawnStateDataPointer:: ; c5c0 dw -wc5c2:: ; c5c2 +wAnimatedObjectFramesDataPointer:: ; c5c2 dw -wc5c4:: ; c5c4 +wAnimatedObjectJumptablePointer:: ; c5c4 dw -wc5c6:: ; c5c6 +wAnimatedObjectOAMDataPointer:: ; c5c6 dw -wc5c8:: ; c5c8 +wCurAnimatedObjectOAMAttributes:: ; c5c8 ds 1 -wc5c9:: ; c5c9 +wCurrentAnimatedObjectVTileOffset:: ; c5c9 ds 1 -wc5ca:: ; c5ca +wCurrentAnimatedObjectXCoord:: ; c5ca ds 1 -wc5cb:: ; c5cb +wCurrentAnimatedObjectYCoord:: ; c5cb ds 1 -wc5cc:: ; c5cc +wCurrentAnimatedObjectXOffset:: ; c5cc ds 1 -wc5cd:: ; c5cd +wCurrentAnimatedObjectYOffset:: ; c5cd ds 1 -wc5ce:: ; c5ce +wAnimatedObjectGlobalYOffset:: ; c5ce ds 1 -wc5cf:: ; c5cf +wAnimatedObjectGlobalXOffset:: ; c5cf ds 1 +wAnimatedObjectsDataEnd:: wSerialEnemyMonsPatchList:: ; c5d0 ; list of indexes to patch with SERIAL_NO_DATA_BYTE after transfer |