aboutsummaryrefslogtreecommitdiff
path: root/entity/collisions.gbasm
blob: d19bf080b230bb0bf4ff90456c8632f448576a0e (plain)
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