diff options
author | Astatin <[email protected]> | 2024-09-17 18:14:17 +0900 |
---|---|---|
committer | Astatin <astatin@redacted> | 2024-09-17 18:14:17 +0900 |
commit | fa37dcacf1ff0de66f5c4eed7b89be6006d6d77b (patch) | |
tree | e47ab067c67fa760434dd4d63fbd4bd9e8a7d060 | |
parent | 9e420f33a1d42db70df96c3c14d932216df637c0 (diff) |
Add entities collisions
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | bunny.gbasm | 85 | ||||
-rw-r--r-- | definitions.gbasm | 8 | ||||
-rw-r--r-- | entities.gbasm | 155 | ||||
-rw-r--r-- | map/generation.gbasm | 2 | ||||
-rw-r--r-- | map/loading.gbasm | 2 |
6 files changed, 192 insertions, 62 deletions
@@ -10,7 +10,7 @@ build/main.rom: main.gbasm tileset.gbasm gbasm $< $@ run: build/main.rom - gb $< + gb -s 2 $< sameboy: build/main.rom sameboy build/main.rom diff --git a/bunny.gbasm b/bunny.gbasm index 1386f01..d19b161 100644 --- a/bunny.gbasm +++ b/bunny.gbasm @@ -1,5 +1,5 @@ Initialize_Bunny: - LD HL, $mem_entites_list + LD HL, $mem_entities_list LD A, $01 LD (HL+), A @@ -194,11 +194,11 @@ Fix_Bunny_screen: RET Move_Bunny: - ; IF HL IS EVER USED, IT SHOULD BE PUSHED HERE + PUSH HL LD C, $00 ; (bit 0 = has_scrolled, bit 1 = has ended movement) LD A, $mem_bunny_direction BIT 3, A - JR NZ, =Move_Bunny.check_direction + JR NZ, =Move_Bunny.check_collision LD A, $mem_button_direction CP $00 @@ -206,6 +206,40 @@ Move_Bunny: SET 3, A LD $mem_bunny_direction, A + Move_Bunny.check_collision: + LD A, $mem_moving_animation_step + CP $00 + JR NZ, =Move_Bunny.check_collision.end + + ; THIS ASSUMES THAT THE BUNNY IS ALWAYS THE FIRST ENTITY IN THE LIST + LD HL, $mem_entities_list + LD A, $mem_bunny_direction + + PUSH BC + CALL =Get_Position_After_Move + LD A, C + CALL =Is_Collisionable + + PUSH AF + PUSH HL + LD HL, $9ba0 + CALL =Print_8bit + POP HL + + CALL =Carve_Entity_Collision_Map + POP AF + POP BC + CP $00 + JR Z, =Move_Bunny.check_collision.end + + Move_Bunny.check_collision.collision: + LD A, $mem_bunny_direction + RES 3, A + LD $mem_bunny_direction, A + JP =Move_Bunny.end + + Move_Bunny.check_collision.end: + Move_Bunny.check_direction: LD A, $mem_bunny_direction @@ -218,58 +252,20 @@ Move_Bunny: Move_Bunny.check_direction_end: BIT 1, A - JR NZ, =Move_Bunny.vertical_move - - Move_Bunny.horizontal_move: - Move_Bunny.horizontal_move.check_collision: - LD D, B - LD A, $mem_bunny_y - LD B, A - LD A, $mem_bunny_x + JR NZ, =Move_Bunny.vertical_viewport_move - ADD D - - CALL =Is_Solid - - CP $00 - JR NZ, =Move_Bunny.collision - - LD B, D - - Move_Bunny.horizontal_px_move: + Move_Bunny.horizontal_viewport_move: SET 0, C LD A, $reg_viewport_x ADD B LD $reg_viewport_x, A JP =Move_Bunny.check_end_of_movement - Move_Bunny.vertical_move: - Move_Bunny.vertical_move.check_collision: - LD D, B - LD A, $mem_bunny_y - ADD D - LD B, A - LD A, $mem_bunny_x - - CALL =Is_Solid - - CP $00 - JR NZ, =Move_Bunny.collision - - LD B, D - - Move_Bunny.vertical_px_move: + Move_Bunny.vertical_viewport_move: SET 0, C LD A, $reg_viewport_y ADD B LD $reg_viewport_y, A - JP =Move_Bunny.check_end_of_movement - - Move_Bunny.collision: - LD A, $mem_bunny_direction - RES 3, A - LD $mem_bunny_direction, A - JP =Move_Bunny.end Move_Bunny.check_end_of_movement: LD A, $mem_moving_animation_step @@ -313,4 +309,5 @@ Move_Bunny: Move_Bunny.end: LD A, C LD $mem_map_loading_flags, A + POP HL RET diff --git a/definitions.gbasm b/definitions.gbasm index 7342611..d44be40 100644 --- a/definitions.gbasm +++ b/definitions.gbasm @@ -45,7 +45,13 @@ ; y: u8, ; } +; a bit of 1 is equivalent to an entity being on the tile +.DEFINE mem_entities_collisions $c780 ; Takes the memory from c780 to c7ff + +; a bit of 1 is equivalent to the tile being free .DEFINE mem_dungeon_map $c800 ; Takes the memory from c800 to c87f +.DEFINE mem_dungeon_map_high $c8 + .DEFINE mem_room_list $c880 ; Takes the memory from c880 to c89f .DEFINE mem_number_of_rooms ($c8a0) ; struct room { @@ -64,7 +70,7 @@ ; _padding: u24 ; } -.DEFINE mem_entites_list $c980 ; Until c9ff +.DEFINE mem_entities_list $c980 ; Until c9ff ; struct entity { ; sprite: u8, ; x: u8, diff --git a/entities.gbasm b/entities.gbasm index 3c279be..28df2d8 100644 --- a/entities.gbasm +++ b/entities.gbasm @@ -1,7 +1,7 @@ Prepare_Entities: LD A, $00 LD $tmp_var_1, A - LD HL, $mem_entites_list + LD HL, $mem_entities_list CALL =Prepare_Entity CALL =Prepare_Entity CALL =Prepare_Entity @@ -39,7 +39,6 @@ Prepare_Entity: LD A, (HL+) LD E, A - CP $00 JP Z, =Prepare_Entity.skip @@ -285,7 +284,9 @@ Prepare_Entity: RET Entities_Behaviours: - LD HL, $mem_entites_list + CALL =Reset_Entities_Collision_Map + + LD HL, $mem_entities_list CALL =Entity_Behaviour CALL =Entity_Behaviour CALL =Entity_Behaviour @@ -340,9 +341,49 @@ Entity_Behaviour: LD L, A RET -Entity_collision: ; entity (whatever alignement) in HL, direction to test in A, Result in A - PUSH HL +Carve_Entity_Collision_Map: ; X in C, Y in B PUSH BC + PUSH HL + PUSH AF + + LD A, C + AND $e0 + JR NZ, =Carve_Entity_Collision_Map.end + + LD A, B + AND $e0 + JR NZ, =Carve_Entity_Collision_Map.end + + LD A, C + + LD H, $00 + CP $10 + RL B + AND $0f + CP $08 + RL B + AND $07 + LD L, A + + LD A, B + LD BC, $mem_entities_collisions + OR C + LD C, A + LD A, (BC) + + OR (HL) + LD (BC), A + + Carve_Entity_Collision_Map.end: + + POP AF + POP HL + POP BC + RET + + +Get_Position_After_Move: ; entity (whatever alignement) in HL, direction to test in A, X Result in C, Y result in B + PUSH HL PUSH AF LD A, L @@ -357,6 +398,9 @@ Entity_collision: ; entity (whatever alignement) in HL, direction to test in A, LD B, A POP AF + BIT 3, A + JR Z, =Get_Position_After_Move.direction_end + PUSH BC DEC A @@ -367,24 +411,21 @@ Entity_collision: ; entity (whatever alignement) in HL, direction to test in A, DEC A BIT 1, B - JR NZ, =Entity_collision.vertical + JR NZ, =Get_Position_After_Move.vertical - Entity_collision.horizontal: + Get_Position_After_Move.horizontal: POP BC ADD C LD C, A - JR =Entity_collision.direction_end + JR =Get_Position_After_Move.direction_end - Entity_collision.vertical: + Get_Position_After_Move.vertical: POP BC ADD B LD B, A - Entity_collision.direction_end: - LD A, C - CALL =Is_Solid + Get_Position_After_Move.direction_end: - POP BC POP HL RET @@ -458,7 +499,12 @@ Fox_AI: OR $08 LD B, A - CALL =Entity_collision + PUSH BC + CALL =Get_Position_After_Move + LD A, C + CALL =Is_Collisionable + CALL =Carve_Entity_Collision_Map + POP BC CP $00 JR Z, =Fox_AI.change_direction @@ -471,3 +517,84 @@ Fox_AI: POP HL RET + +Is_Collisionable: ; X in A, Y in B, Result A + PUSH BC + PUSH HL + + CP $20 + JR NC, =Is_Collisionable.Solid + + LD C, A + LD A, B + CP $20 + JR NC, =Is_Collisionable.Solid + LD A, C + + LD H, $00 + CP $10 + RL B + AND $0f + CP $08 + RL B + AND $07 + LD L, A + + LD C, B + LD B, $mem_dungeon_map_high + LD A, (BC) + PUSH AF + LD A, C + LD BC, $mem_entities_collisions + OR C + LD C, A + LD A, (BC) + XOR $ff ; 1 in the dungeon map means walkable, 1 in the entity map means unwalkable, we need to invert it. + LD B, A + POP AF + AND B + + AND (HL) + CP $01 + LD A, $00 + RL A + + POP HL + POP BC + RET + + Is_Collisionable.Solid: + LD A, $01 + POP HL + POP BC + + RET + +Reset_Entities_Collision_Map: + LD A, $mem_moving_animation_step + CP $02 + JR NZ, =Reset_Entities_Collision_Map.end + + LD HL, $mem_entities_collisions + LD BC, $0080 + CALL =bzero + + LD HL, $mem_entities_list + Reset_Entities_Collision_Map.loop: + INC L + INC L + INC L + + LD A, (HL) + CALL =Get_Position_After_Move + CALL =Carve_Entity_Collision_Map + + LD A, L + AND $f8 + ADD $08 + LD L, A + CP $00 + JR NZ, =Reset_Entities_Collision_Map.loop + + Reset_Entities_Collision_Map.end: + RET diff --git a/map/generation.gbasm b/map/generation.gbasm index a08b539..dba1678 100644 --- a/map/generation.gbasm +++ b/map/generation.gbasm @@ -22,7 +22,7 @@ Carve_Map: ; X in C, Y in B LD L, A LD C, B - LD B, $c8 + LD B, $mem_dungeon_map_high LD A, (BC) OR (HL) diff --git a/map/loading.gbasm b/map/loading.gbasm index be4c8a4..7c4a0e9 100644 --- a/map/loading.gbasm +++ b/map/loading.gbasm @@ -316,7 +316,7 @@ Is_Solid: ; X in A, Y in B, Result A LD L, A LD C, B - LD B, $c8 + LD B, $mem_dungeon_map_high LD A, (BC) AND (HL) |