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 $f0 ADD $10 LD L, A CP $00 JR NZ, =Reset_Entities_Collision_Map.loop Reset_Entities_Collision_Map.end: RET