summaryrefslogtreecommitdiff
path: root/engine/overworld/object_collision.asm
blob: 1e1cc51da39dbf565e3ef71e1bbcadaae01b857b (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
INCLUDE "constants.asm"

SECTION "engine/overworld/object_collision.asm@GetSpritesNextTile", ROMX

; Get the tile that the sprite will walk onto next
GetSpritesNextTile:
	ld hl, OBJECT_NEXT_MAP_X
	add hl, bc
	ld d, [hl]
	ld hl, OBJECT_NEXT_MAP_Y
	add hl, bc
	ld e, [hl]
	push bc
	call GetCoordTile
	pop bc
	ret

; Sets carry flag if the object (bc) next tile is a collision
_IsObjectCollisionTileSolid:
	call GetSpritesNextTile
	ld e, a
	ld d, 0
	ld hl, CollisionTypeTable
	add hl, de
	ld a, BANK(CollisionTypeTable)
	call GetFarByte
	and ALWAYS_SOLID ; also covers SOMETIMES_SOLID
	ret z
	scf
	ret



SECTION "engine/overworld/object_collision.asm@_CheckObjectCollision", ROMX

; returns the carry flag if a sprite is at coords d, e
; will not collide with sprite index stored in hEventCollisionException
_CheckObjectCollision:
	ld bc, wObjectStructs
	xor a
.loop
	ldh [hObjectStructIndexBuffer], a
	ld hl, OBJECT_SPRITE
	add hl, bc
	ld a, [hl]
	and a
	jr z, .next
	ld hl, OBJECT_NEXT_MAP_X
	add hl, bc
	ld a, [hl]
	cp d
	jr nz, .check_last_position
	ld hl, OBJECT_NEXT_MAP_Y
	add hl, bc
	ld a, [hl]
	cp e
	jr nz, .check_last_position
	ldh a, [hEventCollisionException]
	ld l, a
	ldh a, [hObjectStructIndexBuffer]
	cp l
	jr nz, .collision
.check_last_position
	ld hl, OBJECT_MAP_X
	add hl, bc
	ld a, [hl]
	cp d
	jr nz, .next
	ld hl, OBJECT_MAP_Y
	add hl, bc
	ld a, [hl]
	cp e
	jr nz, .next
	ldh a, [hEventCollisionException]
	ld l, a
	ldh a, [hObjectStructIndexBuffer]
	cp l
	jr nz, .collision
.next
	ld hl, OBJECT_LENGTH
	add hl, bc
	ld b, h
	ld c, l
	ldh a, [hObjectStructIndexBuffer]
	inc a
	cp NUM_OBJECT_STRUCTS
	jr nz, .loop
	and a
	ret

.collision
	scf
	ret

SECTION "engine/overworld/object_collision.asm@_CheckPlayerObjectCollision", ROMX

; Sets the carry flag if the player will collide with another sprite's current or next position
_CheckPlayerObjectCollision:
	ld a, [wPlayerNextMapX]
	ld d, a
	ld a, [wPlayerNextMapY]
	ld e, a
	ld bc, wObjectStructs
	xor a

.loop
	ldh [hObjectStructIndexBuffer], a
	ld hl, OBJECT_SPRITE
	add hl, bc
	ld a, [hl]
	and a
	jr z, .next
	ld hl, OBJECT_NEXT_MAP_Y
	add hl, bc
	ld a, [hl]
	cp e
	jr nz, .check_last_position
	ld hl, OBJECT_NEXT_MAP_X
	add hl, bc
	ld a, [hl]
	cp d
	jr nz, .check_last_position

; skip the player sprite
	ldh a, [hObjectStructIndexBuffer]
	cp PLAYER_OBJECT_INDEX
	jr z, .next
	jr .collision

.check_last_position
	ld hl, OBJECT_MAP_Y
	add hl, bc
	ld a, [hl]
	cp e
	jr nz, .next
	ld hl, OBJECT_MAP_X
	add hl, bc
	ld a, [hl]
	cp d
	jr nz, .next
	jr .collision

.next
	ld hl, OBJECT_LENGTH
	add hl, bc
	ld b, h
	ld c, l
	ldh a, [hObjectStructIndexBuffer]
	inc a
	cp NUM_OBJECT_STRUCTS
	jr nz, .loop
	xor a
	ret

.collision
	scf
	ret