From 5842b0ac6b81efbba26614dd45fe199d70ae502b Mon Sep 17 00:00:00 2001 From: Lukas Krickl Date: Thu, 11 Dec 2025 05:41:15 +0100 Subject: [PATCH] collision: moved collision data to hram --- src/actor.s | 5 +++-- src/hram.s | 43 ++++++++++++++++++++++++++++++++++--------- src/player.s | 36 ++++++++++++++++++------------------ src/wram.s | 35 ----------------------------------- 4 files changed, 55 insertions(+), 64 deletions(-) diff --git a/src/actor.s b/src/actor.s index a4d4b6c..6d581bd 100644 --- a/src/actor.s +++ b/src/actor.s @@ -105,14 +105,15 @@ act_test_tile_collision: ret ; loads a collision point into bc + ; point must be in hram ; inputs: ; $1: point name ; returns: ; b/c: y/x tile position #macro _act_col_load_pt - ld a, [$1] + ldh a, [$1] ld b, a - ld a, [$1+1] + ldh a, [$1+1] ld c, a #endmacro diff --git a/src/hram.s b/src/hram.s index d4eada2..6def120 100644 --- a/src/hram.s +++ b/src/hram.s @@ -1,14 +1,39 @@ #define HRAM 0xFF80 ; 0x80 - 0x90 are used by dma routines -.org 0x90 +.org 0xFF90 - ; shadow registers -a2: .adv 1 -b2: .adv 1 -c2: .adv 1 -d2: .adv 1 -e2: .adv 1 -h2: .adv 1 -l2: .adv 1 + ; corner points + ; used for actor -> actor center collision + ; should form a rectangle + ; also used for tile collision + ; + ; top left, top right + ; bottom left, bottom right +col_point_tl: .adv 2 +col_point_tr: .adv 2 +col_point_bl: .adv 2 +col_point_br: .adv 2 + + ; mid points + ; top, bottom, left, right center + ; used for tile collision +col_point_tc: .adv 2 +col_point_bc: .adv 2 +col_point_lc: .adv 2 +col_point_rc: .adv 2 + ; center point of the actor + ; this is used to check for actor -> actor collision +col_point_ct: .adv 2 + + + ; direction the movement is happening + ; in. this is required so that the collision code + ; can handle pushbacks in case of wall collision +col_direction: .adv 2 + ; holds tile collision direction result +col_tile_collided_with: .adv 1 + + ; y/x previous position +col_prev_pos: .adv 2 diff --git a/src/player.s b/src/player.s index 493c84a..62836a7 100644 --- a/src/player.s +++ b/src/player.s @@ -27,75 +27,75 @@ player_col_write_points: ; top left point ld a, b add a, 2 - ld [col_point_tl], a + ldh [col_point_tl], a ld a, c add a, 2 - ld [col_point_tl+1], a + ldh [col_point_tl+1], a ; top right point ld a, b add a, 2 - ld [col_point_tr], a + ldh [col_point_tr], a ld a, c add a, 12 - ld [col_point_tr+1], a + ldh [col_point_tr+1], a ; bottom left point ld a, b add a, 14 - ld [col_point_bl], a + ldh [col_point_bl], a ld a, c add a, 2 - ld [col_point_bl+1], a + ldh [col_point_bl+1], a ; bottom right points ld a, b add a, 14 - ld [col_point_br], a + ldh [col_point_br], a ld a, c add a, 12 - ld [col_point_br+1], a + ldh [col_point_br+1], a ; center point ld a, b add a, 8 - ld [col_point_ct], a + ldh [col_point_ct], a ld a, c add a, 7 - ld [col_point_ct+1], a + ldh [col_point_ct+1], a ; top center point ld a, b add a, 2 - ld [col_point_tc], a + ldh [col_point_tc], a ld a, c add a, 7 - ld [col_point_tc+1], a + ldh [col_point_tc+1], a ; bottom center point ld a, b add a, 14 - ld [col_point_bc], a + ldh [col_point_bc], a ld a, c add a, 7 - ld [col_point_bc+1], a + ldh [col_point_bc+1], a ; left center point ld a, b add a, 8 - ld [col_point_lc], a + ldh [col_point_lc], a ld a, c add a, 2 - ld [col_point_lc+1], a + ldh [col_point_lc+1], a ; right center point ld a, b add a, 8 - ld [col_point_rc], a + ldh [col_point_rc], a ld a, c add a, 12 - ld [col_point_rc+1], a + ldh [col_point_rc+1], a ret diff --git a/src/wram.s b/src/wram.s index 860e24d..8f47d3c 100644 --- a/src/wram.s +++ b/src/wram.s @@ -97,41 +97,6 @@ tiles_end: .adv 0 ; collision related data ; y/x positions - - ; corner points - ; used for actor -> actor center collision - ; should form a rectangle - ; also used for tile collision - ; - ; top left, top right - ; bottom left, bottom right -col_point_tl: .adv 2 -col_point_tr: .adv 2 -col_point_bl: .adv 2 -col_point_br: .adv 2 - - ; mid points - ; top, bottom, left, right center - ; used for tile collision -col_point_tc: .adv 2 -col_point_bc: .adv 2 -col_point_lc: .adv 2 -col_point_rc: .adv 2 - - ; center point of the actor - ; this is used to check for actor -> actor collision -col_point_ct: .adv 2 - - - ; direction the movement is happening - ; in. this is required so that the collision code - ; can handle pushbacks in case of wall collision -col_direction: .adv 2 - ; holds tile collision direction result -col_tile_collided_with: .adv 1 - - ; y/x previous position -col_prev_pos: .adv 2 ; space for 1 tile id -- 2.30.2