1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
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
|