From 3f65b72fc5c2e382b3ed82ab108861e0b4435371 Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Tue, 10 Dec 2024 17:59:39 +0100 Subject: [PATCH] Added actor collision checking The bat actor now correctly checks for walls and doors and will refuse to leave the screen. --- src/actor.s | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++--- src/map.s | 1 + src/wram.s | 2 +- 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/actor.s b/src/actor.s index 80f55a8..bc946ce 100644 --- a/src/actor.s +++ b/src/actor.s @@ -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 diff --git a/src/map.s b/src/map.s index ce43c69..3e95fa0 100644 --- 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 diff --git a/src/wram.s b/src/wram.s index 96b3396..91635ff 100644 --- a/src/wram.s +++ b/src/wram.s @@ -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 -- 2.30.2