unit: Added basic collision check to move code
authorLukas Krickl <lukas@krickl.dev>
Sat, 31 May 2025 16:11:40 +0000 (18:11 +0200)
committerLukas Krickl <lukas@krickl.dev>
Sat, 31 May 2025 16:11:40 +0000 (18:11 +0200)
This change introduces a bug that prevents a unit from moving to the
very last tile of a map :^)

maps/default_map.s
src/unit.s

index 027654272095a656bf2f6b7d400432fdd2a3e705..2459b06a806f92605cdc741ec47b902843f1d4a1 100644 (file)
@@ -8,7 +8,7 @@ default_map_bg:
 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0
 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0
 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0
-.db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0
+.db 0x64,0x0, 0x64,0x0, 0x6b,0x1, 0x6b,0x1, 0x6b,0x1, 0x64,0x0, 0x64,0x0, 0x64,0x0
 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0
 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0
 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0
index 5fbc10e888c2f57050ee681accc8f4cf84d053e3..f9fab6e4ba3b4f561c71247d41f479f25d315ba2 100644 (file)
@@ -193,6 +193,23 @@ unit_handle_inputs:
   ldnull bc
   ret
 
+  ; performs a generic collision test
+  ; before a move is attempted
+  ; ret on nz
+  ; inputs:
+  ;   $1: dec/inc instruction
+  ;   $2: collision mask for tile
+#macro unit_test_collision
+  ; perform tile collision check
+  push de
+  call unit_get_pos
+  $1 
+  call map_get_tile
+  and a, $2 
+  pop de
+  ret nz 
+#endmacro
+
   ; moves a unit up
   ; moves are aborted 
   ; if no more initiative is left
@@ -207,6 +224,9 @@ unit_try_move_up:
   call unit_use_move
   ret z
 
+  ; y - 1
+  unit_test_collision dec b, CF_COLLISION
+
   ld hl, act_pos_y
   add hl, de
   ; hl = actor y
@@ -222,6 +242,9 @@ unit_try_move_up:
 unit_try_move_down:
   call unit_use_move
   ret z
+  
+  ; y + 1
+  unit_test_collision inc b, CF_COLLISION
 
   ld hl, act_pos_y
   add hl, de
@@ -237,6 +260,9 @@ unit_try_move_down:
 unit_try_move_left:
   call unit_use_move
   ret z
+  
+  ; x - 1
+  unit_test_collision dec c, CF_COLLISION
 
   ld hl, act_pos_x
   add hl, de
@@ -252,6 +278,9 @@ unit_try_move_left:
 unit_try_move_right:
   call unit_use_move
   ret z
+  
+  ; x + 1
+  unit_test_collision inc c, CF_COLLISION
 
   ld hl, act_pos_x
   add hl, de
@@ -626,16 +655,15 @@ unit_resume_objs:
   ; inputs:
   ;   de: unit
   ; returns:
-  ;   a: flags 
-  ;   b: tile index 
-unit_get_tile:
+  ;   bc: y/x
+unit_get_pos:
   ld hl, act_pos_y 
   add hl, de ; hl = pos y
   ld a, [hl+]
   ld b, a ; b = y
   ld a, [hl]
   ld c, a ; c = x
-  jp map_get_tile
+  ret
 
 unit_demo_1:
   st_def 0x00, unit_demo_1_init, st_unit_idle
@@ -651,7 +679,7 @@ unit_demo_1:
 unit_demo_2:
   st_def 0x00, unit_demo_1_init, st_unit_idle
   act_def ACT_T_DEMO_1, 0, 3, 3, 0 
-  act_stat_def 1, 2, 3, 0, 0, 0, 1, 5  
+  act_stat_def 1, 2, 3, 0, 0, 0, 0, 5  
   act_inventory_empty
   act_equipment_empty
   act_effects_empty