.db BAT_TILE_IDLE2
.db BAT_TILE_IDLE2
- ; loads initial actor target positions
- ; inputs:
- ; bc: actor_ptr
- ; returns:
- ; actors current y/x pos in target_y/x
-actor_ld_anim_target:
- ; bc = actor type
-
- inc bc ; bc = y
- ld a, [bc]
- ld [anim_target_y], a
-
- inc bc ; bc = x
- ld a, [bc]
- ld [anim_target_x], a
-
- dec bc
- dec bc ; bc = back to origin
- ret
-
- ; generic actor movement calls
- ; up, down, left, right
- ; inputs:
- ; bc: actor_ptr
- ; actor_soam_ptr: next soam item
-actor_up:
- ld a, ANIM_MOVE_TILE_SIZE
- ld [anim_move_y], a
- ld a, ANIM_STEP_UP
- ld [anim_step_y], a
-
- xor a, a
- ld [anim_step_x], a
- ld [anim_move_x], a
-
- ; calculate target position
- ld d, ANIM_MOVE_TILE_SIZE
- ld a, [anim_target_y]
- sub a, d
- ld [anim_target_y], a
-
- ret
-
-actor_down:
- ld a, ANIM_MOVE_TILE_SIZE
- ld [anim_move_y], a
- ld a, ANIM_STEP_DOWN
- ld [anim_step_y], a
-
- xor a, a
- ld [anim_step_x], a
- ld [anim_move_x], a
-
- ; calculate target position
- ld d, ANIM_MOVE_TILE_SIZE
- ld a, [anim_target_y]
- add a, d
- ld [anim_target_y], a
-
- ret
-
-actor_left:
- ld a, ANIM_MOVE_TILE_SIZE
- ld [anim_move_x], a
- ld a, ANIM_STEP_LEFT
- ld [anim_step_x], a
-
- xor a, a
- ld [anim_step_y], a
- ld [anim_move_y], a
-
- ; calculate target position
- ld d, ANIM_MOVE_TILE_SIZE
- ld a, [anim_target_x]
- sub a, d
- ld [anim_target_x], a
-
- ret
-
-actor_right:
- ld a, ANIM_MOVE_TILE_SIZE
- ld [anim_move_x], a
- ld a, ANIM_STEP_RIGHT
- ld [anim_step_x], a
-
- xor a, a
- ld [anim_step_y], a
- ld [anim_move_y], a
-
- ; calculate target position
- ld d, ANIM_MOVE_TILE_SIZE
- ld a, [anim_target_x]
- add a, d
- ld [anim_target_x], a
-
- ret
-
- ; verify actor animation
- ; by checking for collision
- ; clear anim memory if check fails
- ; inputs:
- ; bc: actor ptr
- ; anim_target_y/x: target position
-actor_anim_verify:
- push bc
-
- ; TODO implement
- ld a, [anim_target_y]
- sub a, ANIM_MOVE_TILE_SIZE / 2 ; -8 to be in center
- ld d, a
- ld a, [anim_target_x]
- sub a, ANIM_MOVE_TILE_SIZE / 2 ; -8 to be in center
- ld e, a
- ld a, RF_WALL | RF_DOOR | RF_ACTOR | RF_PLAYER
- call room_get_flag_masked
-
- pop bc
-
- ret z
- push af
- call anim_clear
- pop af
- ret
-
- ; macro version of actor_tile_update_rf_flag
- ; inputs:
- ; $1: RF FLAG to set / unset
- ; $2: offset / tile
- ; bc: original y/x position ptr
- ; anim_target_y/x: target position
- ; returns:
- ; sets the $1 flag at target_y/x
- ; unsets $1 at [bc] and [bc+1]
- ; preserves registers
-#macro update_rf_flag
- ; first unset existing flags
-
- ; sub 8 to positions to center on tile
- ld a, [bc]
- sub a, ANIM_MOVE_TILE_SIZE / 2 ; -8 to be in center
- ld d, a ; d = y pos
- inc bc ; bc = x pos
- ld a, [bc]
- sub a, ANIM_MOVE_TILE_SIZE / 2 ; -8 to be in center
- ld e, a ; e = x pos
- call room_get_flag_ptr
-
- ; unset flag
- ld a, [hl]
- and a, 0xFF ^ $1
- ld [hl], a
-
-
- ; then set the new position's flag
- ld a, [anim_target_y]
- sub a, ANIM_MOVE_TILE_SIZE / 2 ; -8 to be in center
- ld d, a ; d = y pos
- ld a, [anim_target_x]
- sub a, ANIM_MOVE_TILE_SIZE / 2 ; -8 to be in center
- ld e, a ; e = x pos
- call room_get_flag_ptr
-
- ; set flag
- ld a, [hl]
- or a, $1
- ld [hl], a
-
-@skip:
-#endmacro
-
- ; same as actor_tile_update_rf_flags
- ; but decs hl before calling and
- ; increments again after
-player_tile_update_rf_flags:
- push_all
- update_rf_flag RF_PLAYER
- pop_all
- ret
-
- ; marks the current actor's tile
- ; as occupied by an actor
- ; also removes the flag from the actor's current tile
- ; this only works for the default case of
- ; an acotr needing a single tile.
- ; inputs:
- ; bc: (actor ptr) original y/x position ptr
- ; anim_target_y/x: target position
- ; returns:
- ; sets the RF_ACTOR flag at target_y/x
- ; unsets RF_ACTOR at [bc] and [bc+1]
- ; preserves registers
-actor_tile_update_rf_flags:
- push_all
-
- inc bc ; bc = y pos
-
- update_rf_flag RF_ACTOR
-
- pop_all
- ret
; function ptrs for each actor type
; inputs:
; actor_end_turn
turn_finish
- call anim_clear
jp who_next
; bat actor
ret
- ; simple move animation
- ; moves 1 pixel per frame
- ; inputs:
- ; hl: ptr to y/x positon
- ; anim_move_x/y: y/x offset
- ; anim_step_x/y: y/x step per frame
- ; returns:
- ; a == 0 if both y and x are 0
- ; hl is left unchanged
-anim_move:
- ; y pos
- ld a, [anim_move_y]
- ld b, a ; exit code == b
-
- cp a, 0
- jr z, @no_y REL ; if move is 0 do nothing
-
- dec a
- ld [anim_move_y], a ; a--
-
- ld a, [hl]
- ld b, a
- ld a, [anim_step_y]
- add a, b ; a = y + step
- ld [hl], a
-@no_y:
-
- inc hl
-
- ; x pos
- ld a, [anim_move_x]
- cp a, 0
- jr z, @no_x REL ; if move is 0 do nothing
-
- dec a
- ld [anim_move_x], a ; a--
-
- ld a, [hl]
- ld b, a
- ld a, [anim_step_x]
- add a, b ; a = x + step
- ld [hl], a
-
-@no_x:
- dec hl
- ; exit code
- ld a, b
-
- ret
-
- ; clear anim memory
-anim_clear:
- xor a, a
- ld [anim_move_y], a
- ld [anim_move_x], a
- ld [anim_step_y], a
- ld [anim_step_x], a
- ld [anim_target_y], a
- ld [anim_target_x], a
- ret
; draws cursor at the active actor's location
; inputs: