|
|
@@ -7,8 +7,8 @@ |
|
|
|
bytes 1, XPos |
|
|
|
bytes 1, GFXCounter |
|
|
|
bytes 1, GFXState |
|
|
|
words 1, GFXData |
|
|
|
bytes 1, TileData |
|
|
|
words 1, GFXData |
|
|
|
end_struct |
|
|
|
|
|
|
|
SECTION "Actor STructs", WRAM0 |
|
|
@@ -28,7 +28,6 @@ hWorkingState: db |
|
|
|
hWorkingCounter: db |
|
|
|
hWorkingData: dw |
|
|
|
hWorkingTile: db |
|
|
|
hWorkingEnd: |
|
|
|
|
|
|
|
SECTION "Animations Subs", ROM0 |
|
|
|
|
|
|
@@ -47,117 +46,105 @@ SECTION "Animations Subs", ROM0 |
|
|
|
RenderActor:: |
|
|
|
; @input: hl <- Player |
|
|
|
; @input: de <- ShadowOAM place |
|
|
|
ld a, [hli] ; a <- YPos |
|
|
|
; clobbers af, bc, de, hl |
|
|
|
|
|
|
|
ld a, [hli] ; a <- YPos |
|
|
|
ldh [hWorkingScreenY], a |
|
|
|
ld a, [hli] ; a <- XPos |
|
|
|
ld a, [hli] ; a <- XPos |
|
|
|
ldh [hWorkingScreenX], a |
|
|
|
push hl |
|
|
|
ld a, [hli] ; a <- GFXCounter |
|
|
|
push hl ; save counter pointer on stack |
|
|
|
ld a, [hli] ; a <- GFXCounter |
|
|
|
ldh [hWorkingCounter], a |
|
|
|
ld a, [hli] ; a <- GFXState |
|
|
|
ld a, [hli] ; a <- GFXState |
|
|
|
ldh [hWorkingState], a |
|
|
|
ld a, [hli] ; a <- GFXData(Low) |
|
|
|
ldh [hWorkingData+1], a |
|
|
|
ld a, [hli] ; a <- GFXData (High) |
|
|
|
ldh [hWorkingData], a |
|
|
|
ld a, [hl] ; a <- TileData |
|
|
|
ld a, [hli] ; a <- TileData |
|
|
|
ldh [hWorkingTile], a |
|
|
|
; fin loading data |
|
|
|
ld a, [hWorkingData] |
|
|
|
ld a, [hli] ; a <- GFXData(Low) |
|
|
|
ld h, [hl] ; a <- GFXData (High) |
|
|
|
ld l, a |
|
|
|
ld a, [hWorkingData+1] |
|
|
|
ld h, a |
|
|
|
; add actor struct offset saved in wWorkingState |
|
|
|
ld a, [hWorkingState] |
|
|
|
rlca ; double state offset because of word length |
|
|
|
|
|
|
|
ld a, [hWorkingState] ; add actor struct offset saved in wWorkingState |
|
|
|
rlca ; double state offset because of word length |
|
|
|
add a, l |
|
|
|
ld l, a |
|
|
|
adc a, h |
|
|
|
sub l |
|
|
|
ld h, a ; hl contains state struct pointer |
|
|
|
ld a, [hli] |
|
|
|
ld b, a |
|
|
|
ld a, [hl] |
|
|
|
ld l, b |
|
|
|
ld h, a |
|
|
|
ld a, [hli] ; a <- state frame limit |
|
|
|
ld b, a |
|
|
|
ld h, a ; hl contains state struct pointer |
|
|
|
|
|
|
|
ld a, [hli] ; |
|
|
|
ld h, [hl] ; derefence [hl] |
|
|
|
ld l, a ; |
|
|
|
|
|
|
|
ld a, [hWorkingCounter] |
|
|
|
inc a |
|
|
|
ld c, a |
|
|
|
ld a, b |
|
|
|
ld b, c |
|
|
|
ld b, a |
|
|
|
ld a, [hli] ; a <- state frame limit |
|
|
|
cp b |
|
|
|
ld a, b |
|
|
|
jr nc, .continueAnimation |
|
|
|
xor a |
|
|
|
.continueAnimation |
|
|
|
; TODO: make counter 0 indexed so doesnt skip first frame |
|
|
|
ldh [hWorkingCounter], a |
|
|
|
ld b, h |
|
|
|
ld c, l |
|
|
|
pop hl |
|
|
|
ld [hl], a |
|
|
|
ld h, b |
|
|
|
ld l, c |
|
|
|
.loopFrameFind |
|
|
|
ld b, a ; b <- current frame count |
|
|
|
ld a, [hli] ; a <- next frame block |
|
|
|
ld c, a |
|
|
|
ld a, b |
|
|
|
ld b, c |
|
|
|
sub b |
|
|
|
jr z, .foundFrame |
|
|
|
jr c, .foundFrame |
|
|
|
ld b, h ; |
|
|
|
ld c, l ; save current hl |
|
|
|
pop hl ; restore counter wram pointer |
|
|
|
ld [hl], a ; |
|
|
|
ld h, b ; restore hl |
|
|
|
ld l, c ; |
|
|
|
|
|
|
|
ld c, a ; save current frame in c |
|
|
|
xor a ; set a = 0 |
|
|
|
.loopFrameFind ; |
|
|
|
ld b, a ; b <- current total |
|
|
|
ld a, [hli] ; a <- next frame tick limit |
|
|
|
add b ; add to limit |
|
|
|
cp c ; compare to limit |
|
|
|
jr nc, .foundFrame ; if no carry, cum total > current frame |
|
|
|
inc hl |
|
|
|
inc hl |
|
|
|
jr .loopFrameFind |
|
|
|
|
|
|
|
.foundFrame |
|
|
|
ld a, [hli] |
|
|
|
ld b, a |
|
|
|
ld a, [hl] |
|
|
|
ld h, a |
|
|
|
ld l, b ; hl <- pointer to frame data |
|
|
|
ld h, [hl] |
|
|
|
ld l, a ; hl <- pointer to frame data |
|
|
|
ld a, [hli] |
|
|
|
ld b, a ; b <- sprite counter |
|
|
|
ld b, a ; b <- sprite counter |
|
|
|
|
|
|
|
.spriteLoop |
|
|
|
; load Y position, then offset by -16 |
|
|
|
ld a, [hli] |
|
|
|
|
|
|
|
ld a, [hli] ; load Y position, then offset by -16 |
|
|
|
ld c, a |
|
|
|
ld a, [hWorkingScreenY] |
|
|
|
add c |
|
|
|
ld c, 16 |
|
|
|
add c |
|
|
|
ld [de], a ; store YPos in shadowOAM |
|
|
|
ld [de], a ; store YPos in shadowOAM |
|
|
|
inc de |
|
|
|
; load X position, then offset by -8 |
|
|
|
ld a, [hli] |
|
|
|
|
|
|
|
ld a, [hli] ; load X position, then offset by -8 |
|
|
|
ld c, a |
|
|
|
ld a, [hWorkingScreenX] |
|
|
|
add c |
|
|
|
ld c, 8 |
|
|
|
add c |
|
|
|
ld [de], a ; store YPos in shadowOAM |
|
|
|
ld [de], a ; store XPos in shadowOAM |
|
|
|
inc de |
|
|
|
; load tile offset, and add to base tile pointer |
|
|
|
ld a, [hli] |
|
|
|
|
|
|
|
ld a, [hli] ; load tile offset, and add to base tile pointer |
|
|
|
ld c, a |
|
|
|
ld a, [hWorkingTile] |
|
|
|
add c |
|
|
|
ld [de], a |
|
|
|
inc de |
|
|
|
; load attributes and xor them |
|
|
|
ld a, [hli] |
|
|
|
|
|
|
|
ld a, [hli] ; load attributes and xor them |
|
|
|
ld c, a |
|
|
|
ld a, 0 ; TO DO: set base attributes |
|
|
|
ld a, 0 ; TO DO: set base attributes |
|
|
|
xor c |
|
|
|
ld [de], a |
|
|
|
inc de |
|
|
|
; end of single sprite |
|
|
|
dec b |
|
|
|
|
|
|
|
dec b ; end of single sprite |
|
|
|
jr nz, .spriteLoop |
|
|
|
ret |
|
|
|
|
|
|
|
BUFFER EQU 160 |
|
|
|
TRUE EQU $42 |
|
|
|
FALSE EQU $69 |