actor: collision now uses pre-computed points for the source rectangle
authorLukas Krickl <lukas@krickl.dev>
Fri, 26 Sep 2025 08:11:11 +0000 (10:11 +0200)
committerLukas Krickl <lukas@krickl.dev>
Fri, 26 Sep 2025 08:11:11 +0000 (10:11 +0200)
src/actor.s
src/wram.s

index aa7fad3791673363b01331fc82df19b93588bff3..e13760acab9d27b28b31f9d772b69bb65b0a6eb6 100644 (file)
@@ -173,25 +173,29 @@ actor_write_default_collider:
        ; performs a single test case
        ; inputs:
        ;               tmp_rect: new target rect
+       ;               de: ptr to 2 coordinates (y/x) e.g. tmp_rect_points
        ;               $1: rect_bl/tl/br/tr call
        ;               hl: rectangle to compare to
-       ;       preserves all registers
-       ; jumps to $2 on collision
+       ; jumps to $1 on collision
+       ;       returns:
+       ;               de: de+=2
+       ; preserves: hl
 #macro actor_test_movement_corner      
-               push_all
-
+               ld a, [de]
+               inc de
+               ld b, a
+               ld a, [de]
+               inc de
+               ld c, a
+               ; bc = point
+               
                push hl
-               ld hl, tmp_rect
-               call $1 ; bc = bottom left point
                push de
-               pop bc
-               pop hl ; hl = test rect
-
                call rect_point_test
+               pop de
+               pop hl
                cp a, 1
-               jp z, $2
-
-               pop_all
+               jp z, $1
 #endmacro
 
        ; tests movement against all collision rectangles
@@ -341,62 +345,34 @@ actor_test_movement_write_points:
        ;               tmp_act_direction: direction
        ;               tmp_rect: new collision rectangle
        ;         tmp_rect_mask: mask to test agains
+       ;               tmp_rect_points: 2 rectangle points base don tmp_rect and the 
+       ;                                                                                chosen direction
        ;   hl: rectangle to test
        ;       returns:
        ;               a: 1 collision
        ;                       a: 0 no collision
+       ;       preserves: all registers 
 actor_test_rect:
+       push_all
+
        ; pre-filter rectangle mask
        ld a, [tmp_rect_mask]
        call rect_test_mask
-       ret z
+       jp z, @no_collision
        
-       ld a, [tmp_act_direction]
-       cp a, DIRUP
-       jp z, @up
-       cp a, DIRDOWN
-       jp z, @down
-       cp a, DIRLEFT
-       jp z, @left
-       cp a, DIRRIGHT
-       jp z, @right
-
-       ; default: test all corners of tmp_rect 
-
-       actor_test_movement_corner rect_bl, @rect_collision
-       actor_test_movement_corner rect_br, @rect_collision
-       actor_test_movement_corner rect_tl, @rect_collision
-       actor_test_movement_corner rect_tr, @rect_collision
+       ; test the first 2 points in tmp_rect_points
+       ld de, tmp_rect_points
+       actor_test_movement_corner @rect_collision
+       actor_test_movement_corner @rect_collision
 
 @no_collision:
+       pop_all
        xor a, a
        ret
 @rect_collision:
-       ; actor_test_movement does not pop all when the check 
-       ; passes
        pop_all
        ld a, 1
        ret
-@up:
-       actor_test_movement_corner rect_tl, @rect_collision
-       actor_test_movement_corner rect_tr, @rect_collision
-       xor a, a
-       ret
-@down:
-       actor_test_movement_corner rect_bl, @rect_collision
-       actor_test_movement_corner rect_br, @rect_collision
-       xor a, a
-       ret
-@right:
-       actor_test_movement_corner rect_br, @rect_collision
-       actor_test_movement_corner rect_tr, @rect_collision
-       xor a, a
-       ret
-@left:
-       actor_test_movement_corner rect_bl, @rect_collision
-       actor_test_movement_corner rect_tl, @rect_collision
-       xor a, a
-       ret
        
        ; calls collision resolution 
        ; inputs:
index 5ba82e9cf02df72d8bf255601296bbe02f9fd029..048107ad60d5d47bdc57f872385b9b853733c883 100644 (file)
@@ -87,7 +87,7 @@ tmp_rect_mask: .adv 1
        ; temporary points 
        ; has enough space for 4 points
        ; store pre-calculated points here for collision checking
-tmp_rect_points: .adv 4 * 2
+tmp_rect_points: .adv 
        
        ; temporary actor direction mask
 tmp_act_direction: .adv 1