From: Lukas Krickl Date: Sat, 31 May 2025 16:11:40 +0000 (+0200) Subject: unit: Added basic collision check to move code X-Git-Url: https://git.krickl.dev/?a=commitdiff_plain;h=6f773d40a16326dcac3977f99e38861ac2288474;p=gbrg%2F.git unit: Added basic collision check to move code This change introduces a bug that prevents a unit from moving to the very last tile of a map :^) --- diff --git a/maps/default_map.s b/maps/default_map.s index 0276542..2459b06 100644 --- a/maps/default_map.s +++ b/maps/default_map.s @@ -8,7 +8,7 @@ default_map_bg: .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0 -.db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0 +.db 0x64,0x0, 0x64,0x0, 0x6b,0x1, 0x6b,0x1, 0x6b,0x1, 0x64,0x0, 0x64,0x0, 0x64,0x0 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0 .db 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0, 0x64,0x0 diff --git a/src/unit.s b/src/unit.s index 5fbc10e..f9fab6e 100644 --- a/src/unit.s +++ b/src/unit.s @@ -193,6 +193,23 @@ unit_handle_inputs: ldnull bc ret + ; performs a generic collision test + ; before a move is attempted + ; ret on nz + ; inputs: + ; $1: dec/inc instruction + ; $2: collision mask for tile +#macro unit_test_collision + ; perform tile collision check + push de + call unit_get_pos + $1 + call map_get_tile + and a, $2 + pop de + ret nz +#endmacro + ; moves a unit up ; moves are aborted ; if no more initiative is left @@ -207,6 +224,9 @@ unit_try_move_up: call unit_use_move ret z + ; y - 1 + unit_test_collision dec b, CF_COLLISION + ld hl, act_pos_y add hl, de ; hl = actor y @@ -222,6 +242,9 @@ unit_try_move_up: unit_try_move_down: call unit_use_move ret z + + ; y + 1 + unit_test_collision inc b, CF_COLLISION ld hl, act_pos_y add hl, de @@ -237,6 +260,9 @@ unit_try_move_down: unit_try_move_left: call unit_use_move ret z + + ; x - 1 + unit_test_collision dec c, CF_COLLISION ld hl, act_pos_x add hl, de @@ -252,6 +278,9 @@ unit_try_move_left: unit_try_move_right: call unit_use_move ret z + + ; x + 1 + unit_test_collision inc c, CF_COLLISION ld hl, act_pos_x add hl, de @@ -626,16 +655,15 @@ unit_resume_objs: ; inputs: ; de: unit ; returns: - ; a: flags - ; b: tile index -unit_get_tile: + ; bc: y/x +unit_get_pos: ld hl, act_pos_y add hl, de ; hl = pos y ld a, [hl+] ld b, a ; b = y ld a, [hl] ld c, a ; c = x - jp map_get_tile + ret unit_demo_1: st_def 0x00, unit_demo_1_init, st_unit_idle @@ -651,7 +679,7 @@ unit_demo_1: unit_demo_2: st_def 0x00, unit_demo_1_init, st_unit_idle act_def ACT_T_DEMO_1, 0, 3, 3, 0 - act_stat_def 1, 2, 3, 0, 0, 0, 1, 5 + act_stat_def 1, 2, 3, 0, 0, 0, 0, 5 act_inventory_empty act_equipment_empty act_effects_empty