Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/engine/overworld/toggleable_objects.asm
2018 views
1
MarkTownVisitedAndLoadToggleableObjects::
2
ld a, [wCurMap]
3
cp FIRST_ROUTE_MAP
4
jr nc, .notInTown
5
ld c, a
6
ld b, FLAG_SET
7
ld hl, wTownVisitedFlag ; mark town as visited (for flying)
8
predef FlagActionPredef
9
.notInTown
10
ld hl, ToggleableObjectMapPointers
11
ld a, [wCurMap]
12
ld b, $0
13
ld c, a
14
add hl, bc
15
add hl, bc
16
ld a, [hli] ; load toggleable objects pointer in hl
17
ld h, [hl]
18
ld l, a
19
push hl
20
ld de, ToggleableObjectStates ; calculate difference between out pointer and the base pointer
21
ld a, l
22
sub e
23
jr nc, .noCarry
24
dec h
25
.noCarry
26
ld l, a
27
ld a, h
28
sub d
29
ld h, a
30
; divide difference by 3, resulting in the global offset (number of toggleable items before ours)
31
ld a, h
32
ldh [hDividend], a
33
ld a, l
34
ldh [hDividend+1], a
35
xor a
36
ldh [hDividend+2], a
37
ldh [hDividend+3], a
38
ld a, $3
39
ldh [hDivisor], a
40
ld b, $2
41
call Divide
42
ld a, [wCurMap]
43
ld b, a
44
ldh a, [hDividend+3]
45
ld c, a ; store global offset in c
46
ld de, wToggleableObjectList
47
pop hl
48
.writeToggleableObjectsListLoop
49
ld a, [hli]
50
cp -1
51
jr z, .done ; end of list
52
cp b
53
jr nz, .done ; not for current map anymore
54
ld a, [hli]
55
inc hl
56
ld [de], a ; write (map-local) sprite ID
57
inc de
58
ld a, c
59
inc c
60
ld [de], a ; write (global) toggleable object index
61
inc de
62
jr .writeToggleableObjectsListLoop
63
.done
64
ld a, -1
65
ld [de], a ; write sentinel
66
ret
67
68
InitializeToggleableObjectsFlags:
69
ld hl, wToggleableObjectFlags
70
ld bc, wToggleableObjectFlagsEnd - wToggleableObjectFlags
71
xor a
72
call FillMemory ; clear toggleable objects flags
73
ld hl, ToggleableObjectStates
74
xor a
75
ld [wToggleableObjectCounter], a
76
.toggleableObjectsLoop
77
ld a, [hli]
78
cp -1 ; end of list
79
ret z
80
push hl
81
inc hl
82
ld a, [hl]
83
cp OFF
84
jr nz, .skip
85
ld hl, wToggleableObjectFlags
86
ld a, [wToggleableObjectCounter]
87
ld c, a
88
ld b, FLAG_SET
89
call ToggleableObjectFlagAction ; set flag if object is toggled off
90
.skip
91
ld hl, wToggleableObjectCounter
92
inc [hl]
93
pop hl
94
inc hl
95
inc hl
96
jr .toggleableObjectsLoop
97
98
; tests if current object is toggled off/has been hidden
99
IsObjectHidden:
100
ldh a, [hCurrentSpriteOffset]
101
swap a
102
ld b, a
103
ld hl, wToggleableObjectList
104
.loop
105
ld a, [hli]
106
cp -1
107
jr z, .notHidden ; not toggleable -> not hidden
108
cp b
109
ld a, [hli]
110
jr nz, .loop
111
ld c, a
112
ld b, FLAG_TEST
113
ld hl, wToggleableObjectFlags
114
call ToggleableObjectFlagAction
115
ld a, c
116
and a
117
jr nz, .hidden
118
.notHidden
119
xor a
120
.hidden
121
ldh [hIsToggleableObjectOff], a
122
ret
123
124
; adds toggleable object (items, leg. pokemon, etc.) to the map
125
; [wToggleableObjectIndex]: index of the toggleable object to be added (global index)
126
ShowObject:
127
ShowObject2:
128
ld hl, wToggleableObjectFlags
129
ld a, [wToggleableObjectIndex]
130
ld c, a
131
ld b, FLAG_RESET
132
call ToggleableObjectFlagAction ; reset "removed" flag
133
jp UpdateSprites
134
135
; removes toggleable object (items, leg. pokemon, etc.) from the map
136
; [wToggleableObjectIndex]: index of the toggleable object to be removed (global index)
137
HideObject:
138
ld hl, wToggleableObjectFlags
139
ld a, [wToggleableObjectIndex]
140
ld c, a
141
ld b, FLAG_SET
142
call ToggleableObjectFlagAction ; set "removed" flag
143
jp UpdateSprites
144
145
ToggleableObjectFlagAction:
146
; identical to FlagAction
147
148
push hl
149
push de
150
push bc
151
152
; bit
153
ld a, c
154
ld d, a
155
and 7
156
ld e, a
157
158
; byte
159
ld a, d
160
srl a
161
srl a
162
srl a
163
add l
164
ld l, a
165
jr nc, .ok
166
inc h
167
.ok
168
169
; d = 1 << e (bitmask)
170
inc e
171
ld d, 1
172
.shift
173
dec e
174
jr z, .shifted
175
sla d
176
jr .shift
177
.shifted
178
179
ld a, b
180
and a
181
jr z, .reset
182
cp FLAG_TEST
183
jr z, .read
184
185
; set
186
ld a, [hl]
187
ld b, a
188
ld a, d
189
or b
190
ld [hl], a
191
jr .done
192
193
.reset
194
ld a, [hl]
195
ld b, a
196
ld a, d
197
xor $ff
198
and b
199
ld [hl], a
200
jr .done
201
202
.read
203
ld a, [hl]
204
ld b, a
205
ld a, d
206
and b
207
208
.done
209
pop bc
210
pop de
211
pop hl
212
ld c, a
213
ret
214
215