Added actor collision checking
authorLukas Krickl <lukas@krickl.dev>
Tue, 10 Dec 2024 16:59:39 +0000 (17:59 +0100)
committerLukas Krickl <lukas@krickl.dev>
Tue, 10 Dec 2024 16:59:39 +0000 (17:59 +0100)
The bat actor now correctly checks for walls and doors and will
refuse to leave the screen.

src/actor.s
src/map.s
src/wram.s

index 80f55a89cadb5bd9666d16f0c713a9728f3485d3..bc946ce889a154803c10636353ebadf8429b8365 100644 (file)
@@ -49,6 +49,26 @@ actor_anim_table_bat:
 .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:
@@ -63,6 +83,13 @@ actor_up:
   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:
@@ -74,6 +101,13 @@ actor_down:
   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:
@@ -85,6 +119,13 @@ actor_left:
   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:
@@ -96,6 +137,13 @@ actor_right:
   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
@@ -103,13 +151,24 @@ actor_right:
   ; clear anim memory if check fails 
   ; inputs: 
   ;   bc: actor ptr
+  ;  anim_target_y/x: target position
 actor_anim_verify:
-  inc bc ; bc = y/x 
-  ld a, [bc]
+  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 
+  call room_get_flag_masked
 
-  dec bc
+  pop bc
+  
+  ret z
+  call anim_clear
   ret
 
 ; function ptrs for each actor type 
@@ -155,6 +214,9 @@ actor_update_bat:
   call anim_clear
   jr @skip REL ; darw update 
 @no_anim:
+  ; set up movement 
+  call actor_ld_anim_target
+
   ; move bat in random direction
   call rand
   and a, 0b11 ; rnadom direction 0-3
@@ -351,6 +413,8 @@ anim_clear:
   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
 
   ; advance to the next actor if end_turn != 0
index ce43c6980f7002cdd30180a94846f8bcdd657746..3e95fa0720da6ce2627bcb1ad6b95748eb781f97 100644 (file)
--- a/src/map.s
+++ b/src/map.s
@@ -278,6 +278,7 @@ room_unset_flag:
   ; ct_mask: bit mask for flag to check (tile & mask)
   ; returns:
   ;   a: masked flag
+  ;   z-flag is set
 room_get_flag_masked:
   ld b, a ; b = mask
   call room_get_flag_ptr
index 96b3396f1ef0f966ec329e07a2c469ed7610a1b7..91635ff03a2d96d0afdb55cc0e60523fbdc85539 100644 (file)
@@ -168,7 +168,7 @@ act: .adv 1
 #define ANIM_MOVE_TILE_SIZE 16
 
   ; -TILE_SIZE
-#define ANIM_MOVE_TILE_SIZE_N 0xFF - ANIM_MOVE_TILE_SIZE  +1
+#define ANIM_MOVE_TILE_SIZE_N 0xFF - ANIM_MOVE_TILE_SIZE 1
 #define ANIM_STEP_DOWN 1
 #define ANIM_STEP_LEFT 0xFF
 #define ANIM_STEP_UP 0xFF