aboutsummaryrefslogtreecommitdiff
path: root/entity/collisions.gbasm
diff options
context:
space:
mode:
Diffstat (limited to 'entity/collisions.gbasm')
-rw-r--r--entity/collisions.gbasm120
1 files changed, 120 insertions, 0 deletions
diff --git a/entity/collisions.gbasm b/entity/collisions.gbasm
new file mode 100644
index 0000000..186af65
--- /dev/null
+++ b/entity/collisions.gbasm
@@ -0,0 +1,120 @@
+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
+
+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