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
|