Carve_Entity_Collision_Map: ; XY in BC PUSH BC PUSH HL PUSH AF LD A, B LD B, C LD C, A 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: ; XY in BC, Result A PUSH BC PUSH HL LD A, B CP $20 JR NC, =Is_Collisionable.Solid LD A, C CP $20 JR NC, =Is_Collisionable.Solid LD A, B LD B, C LD C, A LD H, $00 CP $10 RL B AND $0f CP $08 RL B AND $07 LD L, A LD C, B LD B, high($mem_dungeon_map) 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 HL, $mem_entities_collisions LD BC, $0080 CALL =bzero LD HL, $mem_entities_list .loop: LD A, (HL) CP $00 JR Z, =.loop.next INC L INC L INC L LD A, (HL) CALL =Get_Position_After_Move CALL =Carve_Entity_Collision_Map .loop.next: LD A, L AND $f0 ADD $10 LD L, A CP $00 JR NZ, =.loop .end: RET