; 1) save registers
push hl
push de
-
+
; 2) hl = player_y already
; 3) load correct collision points
ld de, $1
; actor table
; inputs:
; hl: pointer to player memory
-player_update:
+player_update:
; update
ld a, [who]
cp a, WHO_PLAYER
ld a, RF_WALL
ld [ct_mask], a
+ ; tmp = y movement offset
+ ; tmp+1 = x movement offset
+ ; load tmp and +1 with the current position by
+ ; default
+ ld a, [hl+]
+ ld [tmp], a
+ ld a, [hl]
+ dec hl
+ ld [tmp+1], a
; input handling
input_held BTNDOWN
ld [anim_move_y], a
ld a, ANIM_STEP_DOWN
ld [anim_step_y], a
+
+ ; set expected offset
+ ld a, ANIM_MOVE_TILE_SIZE
+ add a, [hl]
+ ld [tmp], a
@notdown:
input_held BTNUP
ld [anim_move_y], a
ld a, ANIM_STEP_UP
ld [anim_step_y], a
+
+ ; set expected offset
+ ld a, 0xFF - ANIM_MOVE_TILE_SIZE + 1
+ add a, [hl]
+ ld [tmp], a
@notup:
ld [anim_move_x], a
ld a, ANIM_STEP_LEFT
ld [anim_step_x], a
+
+ ; set expected offset
+ ld a, 0xFF - ANIM_MOVE_TILE_SIZE + 1
+ inc hl
+ add a, [hl]
+ dec hl
+ ld [tmp+1], a
@notleft:
input_held BTNRIGHT
ld [anim_move_x], a
ld a, ANIM_STEP_RIGHT
ld [anim_step_x], a
+
+ ; set expected offset
+ ld a, ANIM_MOVE_TILE_SIZE
+ inc hl
+ add a, [hl]
+ dec hl
+ ld [tmp+1], a
@notright:
@action_buttons:
ld a, [hl]
ld e, a
+ ; if any collision happens now
+ ; we stop the animation
+ push hl ; need to save hl
+ ld a, [tmp]
+ add a, 8
+ ld d, a ; d = target y + 8 to center on tile
+ ld a, [tmp+1]
+ add a, 8
+ ld e, a ; e = target x + 8 to center on tile
+ call collision_tile
+ pop hl
+ jr z, @no_collision REL
+ ; clear anim memory
+ xor a, a
+ ld [anim_move_y], a
+ ld [anim_move_x], a
+ ld [anim_step_y], a
+ ld [anim_step_x], a
+@no_collision:
+
@skip_input:
; hl should be player_y here