;---------------- ; Animation Subs ;---------------- struct Actor bytes 1, YPos bytes 1, XPos bytes 1, GFXCounter bytes 1, GFXState words 1, GFXData bytes 1, TileData end_struct SECTION "Actor STructs", WRAM0 dstruct Actor, Player SECTION "Animation Variables", HRAM hCameraX: dw hCameraY: dw hWorkingX: dw hWorkingY: dw hWorkingScreenX: db hWorkingScreenY: db hWorkingState: db hWorkingCounter: db hWorkingData: dw hWorkingTile: db hWorkingEnd: SECTION "Animations Subs", ROM0 ; RenderActor: ; takes a pointer to an actor struct ; and renders it to shadow OAM, advancinc ; the animation frame and constructing ; each frame as needed. ; initial input: ; [hl] <- start of Actor Struct in WRAM ; output: ; an oam object for each line in the frame data, ; copied to shadowOAM (wShadowOAM) RenderActor:: ; @input: hl <- Player ; @input: de <- ShadowOAM place ld a, [hli] ; a <- YPos ldh [hWorkingScreenY], a ld a, [hli] ; a <- XPos ldh [hWorkingScreenX], a push hl ld a, [hli] ; a <- GFXCounter ldh [hWorkingCounter], a 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 ldh [hWorkingTile], a ; fin loading data ld a, [hWorkingData] 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 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 a, [hWorkingCounter] inc a ld c, a ld a, b ld b, c 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 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 a, [hli] ld b, a ; b <- sprite counter .spriteLoop ; load Y position, then offset by -16 ld a, [hli] ld c, a ld a, [hWorkingScreenY] add c ld c, 16 add c ld [de], a ; store YPos in shadowOAM inc de ; load X position, then offset by -8 ld a, [hli] ld c, a ld a, [hWorkingScreenX] add c ld c, 8 add c ld [de], a ; store YPos in shadowOAM inc de ; load tile offset, and add to base tile pointer ld a, [hli] ld c, a ld a, [hWorkingTile] add c ld [de], a inc de ; load attributes and xor them ld a, [hli] ld c, a ld a, 0 ; TO DO: set base attributes xor c ld [de], a inc de ; end of single sprite dec b jr nz, .spriteLoop ret BUFFER EQU 160 TRUE EQU $42 FALSE EQU $69