INCLUDE "hardware.inc"
|
|
INCLUDE "input.inc"
|
|
INCLUDE "oam.inc"
|
|
|
|
Section "Player Data", WRAM0
|
|
|
|
playerWorldX: dw
|
|
playerWorldY: dw
|
|
|
|
; player data
|
|
PLAYER_X:: db
|
|
PLAYER_Y:: db
|
|
PLAYER_DIR:: db
|
|
|
|
Section "Player Code", ROM0
|
|
|
|
spriteData:
|
|
INCBIN "png/sprite/player.2bpp"
|
|
|
|
DEF SPRITE_OAM_IDX EQU 0
|
|
DEF SPRITE_IDX EQU 32 ; tile index, rename later
|
|
DEF SPRITE_WIDTH EQU 2
|
|
DEF SPRITE_HEIGHT EQU 2
|
|
|
|
Player_Init::
|
|
; clear player data
|
|
ld hl, PLAYER_X
|
|
ld [hl], 0
|
|
inc hl
|
|
ld [hl], 144-32
|
|
inc hl
|
|
ld [hl], 0
|
|
|
|
ld a, 8
|
|
ld hl, _OAM + 1
|
|
ld [hl], a
|
|
|
|
ld bc, _VRAM8000 + SPRITE_IDX * 16
|
|
ld hl, spriteData
|
|
ld d, 16 * (SPRITE_WIDTH * SPRITE_HEIGHT)
|
|
call memcpy
|
|
|
|
OAM_set SPRITE_OAM_IDX + 0, 8, 144-8-8, SPRITE_IDX, 0
|
|
OAM_set SPRITE_OAM_IDX + 1, 16, 144-8-8, SPRITE_IDX + 1, 0
|
|
OAM_set SPRITE_OAM_IDX + 2, 8, 144-8, SPRITE_IDX + 2, 0
|
|
OAM_set SPRITE_OAM_IDX + 3, 16, 144-8, SPRITE_IDX + 3, 0
|
|
|
|
ld bc, _OAMRAM
|
|
ld hl, _OAM
|
|
ld d, 4 * (SPRITE_WIDTH * SPRITE_HEIGHT)
|
|
call memcpy
|
|
|
|
ret
|
|
|
|
Player_Update::
|
|
; Only update every 2 frames
|
|
ld hl, frame
|
|
ld a, [hl]
|
|
and %1
|
|
cp %1
|
|
ret nz
|
|
|
|
ld hl, keys
|
|
ld b, [hl]
|
|
|
|
; check for move right
|
|
ld a, b
|
|
and BTN_RIGHT
|
|
jr z, .left
|
|
|
|
; check for right boundary
|
|
ld hl, PLAYER_X
|
|
ld a, [hl]
|
|
add 16
|
|
cp SCRN_X
|
|
jr nc, .left
|
|
|
|
inc [hl]
|
|
|
|
call player_bg_collides
|
|
jr z, .right_rollback
|
|
|
|
ld hl, PLAYER_DIR
|
|
ld [hl], 0
|
|
|
|
call update_oam
|
|
ret
|
|
|
|
.right_rollback:
|
|
ld hl, PLAYER_X
|
|
dec [hl]
|
|
ret
|
|
|
|
.left:
|
|
; check for left button
|
|
ld a, b
|
|
and BTN_LEFT
|
|
ret z
|
|
|
|
; check for left boundary
|
|
ld hl, PLAYER_X
|
|
ld a, [hl]
|
|
or a
|
|
ret z
|
|
|
|
dec [hl]
|
|
|
|
call player_bg_collides
|
|
jr z, .left_rollback
|
|
|
|
ld hl, PLAYER_DIR
|
|
ld [hl], $ff
|
|
|
|
call update_oam
|
|
ret
|
|
|
|
.left_rollback:
|
|
ld hl, PLAYER_X
|
|
dec [hl]
|
|
ret
|
|
|
|
; Update player metasprite with positional data
|
|
update_oam:
|
|
ld hl, PLAYER_DIR
|
|
ld a, [hl-] ; dir (0 = right , $ff = left)
|
|
and OAMF_XFLIP
|
|
ld c, a
|
|
|
|
ld a, [hl-] ; y
|
|
add 16
|
|
|
|
ld d, a
|
|
ld a, [hl] ; x
|
|
add 8
|
|
ld b, a
|
|
ld a, d
|
|
|
|
ld_OAM_y hl, SPRITE_OAM_IDX
|
|
|
|
; top left sprite
|
|
ld [hli], a
|
|
ld [hl], b
|
|
inc hl
|
|
ld [hl], SPRITE_IDX
|
|
inc hl
|
|
ld [hl], c
|
|
inc hl
|
|
|
|
; top right
|
|
ld d, a
|
|
ld a, b
|
|
add 8
|
|
ld b, a
|
|
ld a, d
|
|
|
|
ld [hli], a
|
|
ld [hl], b
|
|
inc hl
|
|
ld [hl], SPRITE_IDX + 1
|
|
inc hl
|
|
ld [hl], c
|
|
inc hl
|
|
|
|
; bottom left
|
|
add 8
|
|
ld d, a
|
|
ld a, b
|
|
sub 8
|
|
ld b, a
|
|
ld a, d
|
|
|
|
ld [hli], a
|
|
ld [hl], b
|
|
inc hl
|
|
ld [hl], SPRITE_IDX + 2
|
|
inc hl
|
|
ld [hl], c
|
|
inc hl
|
|
|
|
; bottom right
|
|
ld d, a
|
|
ld a, b
|
|
add 8
|
|
ld b, a
|
|
ld a, d
|
|
|
|
ld [hli], a
|
|
ld [hl], b
|
|
inc hl
|
|
ld [hl], SPRITE_IDX + 3
|
|
inc hl
|
|
ld [hl], c
|
|
|
|
; flip tile indices if necessary
|
|
ld a, c
|
|
or c
|
|
jr z, .done
|
|
|
|
ld_OAM_tile hl, SPRITE_OAM_IDX
|
|
ld [hl], SPRITE_IDX + 1
|
|
|
|
ld_OAM_tile hl, SPRITE_OAM_IDX + 1
|
|
ld [hl], SPRITE_IDX
|
|
|
|
ld_OAM_tile hl, SPRITE_OAM_IDX + 2
|
|
ld [hl], SPRITE_IDX + 3
|
|
|
|
ld_OAM_tile hl, SPRITE_OAM_IDX + 3
|
|
ld [hl], SPRITE_IDX + 2
|
|
|
|
.done:
|
|
ret
|