aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAstatin <[email protected]>2024-09-17 18:14:17 +0900
committerAstatin <astatin@redacted>2024-09-17 18:14:17 +0900
commitfa37dcacf1ff0de66f5c4eed7b89be6006d6d77b (patch)
treee47ab067c67fa760434dd4d63fbd4bd9e8a7d060
parent9e420f33a1d42db70df96c3c14d932216df637c0 (diff)
Add entities collisions
-rw-r--r--Makefile2
-rw-r--r--bunny.gbasm85
-rw-r--r--definitions.gbasm8
-rw-r--r--entities.gbasm155
-rw-r--r--map/generation.gbasm2
-rw-r--r--map/loading.gbasm2
6 files changed, 192 insertions, 62 deletions
diff --git a/Makefile b/Makefile
index 002e53b..525d037 100644
--- a/Makefile
+++ b/Makefile
@@ -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)