; 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
; 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: