ld [hl+], a ; width
ret
+ ; performs a single test case
+ ; inputs:
+ ; tmp_rect: new target rect
+ ; $1: rect_bl/tl/br/tr call
+ ; hl: rectangle to compare to
+ ; preserves all registers
+ ; jumps to $2 on collision
+#macro actor_test_movement_corner
+ push_all
+
+ 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
+ cp a, 1
+ jp z, $2
+
+ pop_all
+#endmacro
+
; tests movement against all collision rectangles
; inputs:
; a: collision mask
jp z, @skip_rect
; test all corners of tmp_rect
- push_all
-
- push hl
- ld hl, tmp_rect
- call rect_bl ; bc = bottom left point
- push de
- pop bc
- pop hl ; hl = test rect
-
- call rect_point_test
- cp a, 1
- jp z, @rect_collision
-
- pop_all
+ 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
@skip_rect:
add hl, de ; next rect (de = r_size)
dec b
ld a, b ; compare y points
cp a, d
- jp nc, @no_collision
+ jp c, @no_collision
ld a, c ; compare x position
cp a, e
- jp nc, @no_collision
+ jp c, @no_collision
; bottom left
push hl
ld a, b ; compare y
cp a, d
- jp c, @no_collision
+ jp nc, @no_collision
ld a, c ; compare x
cp a, e
jp c, @no_collision
call rect_tr
pop hl
+ ld a, b ; compare y
+ cp a, d
+ jp c, @no_collision
+ ld a, c ; compare x position
+ cp a, e
+ jp nc, @no_collision
+
; bottom right
push hl
call rect_br
pop hl
+ ld a, b ; compare y
+ jp c, @no_collision
+ ld a, c ; compare x
+ cp a, e
+ jp nc, @no_collision
@collision:
+ BREAK
ld a, 1
ret
@no_collision: