diff options
Diffstat (limited to 'entity/collisions.gbasm')
-rw-r--r-- | entity/collisions.gbasm | 120 |
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 |