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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
|
QueueBattleAnimation:
ld hl, wActiveAnimObjects
ld e, NUM_ANIM_OBJECTS
.loop
ld a, [hl]
and a
jr z, .done
ld bc, BATTLEANIMSTRUCT_LENGTH
add hl, bc
dec e
jr nz, .loop
scf
ret
.done
ld c, l
ld b, h
ld hl, wLastAnimObjectIndex
inc [hl]
call InitBattleAnimation
ret
DeinitBattleAnimation:
ld hl, BATTLEANIMSTRUCT_INDEX
add hl, bc
ld [hl], $0
ret
InitBattleAnimation:
ld a, [wBattleObjectTempID]
ld e, a
ld d, 0
ld hl, BattleAnimObjects
rept BATTLEANIMOBJ_LENGTH
add hl, de
endr
ld e, l
ld d, h
ld hl, BATTLEANIMSTRUCT_INDEX
add hl, bc
ld a, [wLastAnimObjectIndex]
ld [hli], a ; BATTLEANIMSTRUCT_INDEX
ld a, [de]
inc de
ld [hli], a ; BATTLEANIMSTRUCT_OAMFLAGS
ld a, [de]
inc de
ld [hli], a ; BATTLEANIMSTRUCT_FIX_Y
ld a, [de]
inc de
ld [hli], a ; BATTLEANIMSTRUCT_FRAMESET_ID
ld a, [de]
inc de
ld [hli], a ; BATTLEANIMSTRUCT_FUNCTION
ld a, [de]
inc de
ld [hli], a ; BATTLEANIMSTRUCT_PALETTE
ld a, [de]
call GetBattleAnimTileOffset
ld [hli], a ; BATTLEANIMSTRUCT_TILEID
ld a, [wBattleObjectTempXCoord]
ld [hli], a ; BATTLEANIMSTRUCT_XCOORD
ld a, [wBattleObjectTempYCoord]
ld [hli], a ; BATTLEANIMSTRUCT_YCOORD
xor a
ld [hli], a ; BATTLEANIMSTRUCT_XOFFSET
ld [hli], a ; BATTLEANIMSTRUCT_YOFFSET
ld a, [wBattleObjectTempParam]
ld [hli], a ; BATTLEANIMSTRUCT_PARAM
xor a
ld [hli], a ; BATTLEANIMSTRUCT_DURATION
dec a
ld [hli], a ; BATTLEANIMSTRUCT_FRAME
xor a
ld [hli], a ; BATTLEANIMSTRUCT_JUMPTABLE_INDEX
ld [hli], a ; BATTLEANIMSTRUCT_VAR1
ld [hl], a ; BATTLEANIMSTRUCT_VAR2
ret
BattleAnimOAMUpdate:
call InitBattleAnimBuffer
call GetBattleAnimFrame
cp dowait_command
jp z, .done
cp delanim_command
jp z, .delete
push af
ld hl, wBattleAnimTempOAMFlags
ld a, [wBattleAnimTempFrameOAMFlags]
xor [hl]
and PRIORITY | Y_FLIP | X_FLIP
ld [hl], a
pop af
push bc
call GetBattleAnimOAMPointer
ld a, [wBattleAnimTempTileID]
add [hl] ; tile offset
ld [wBattleAnimTempTileID], a
inc hl
ld a, [hli] ; oam data length
ld c, a
ld a, [hli] ; oam data pointer
ld h, [hl]
ld l, a
ld a, [wBattleAnimOAMPointerLo]
ld e, a
ld d, HIGH(wVirtualOAM)
.loop
; Y Coord
ld a, [wBattleAnimTempYCoord]
ld b, a
ld a, [wBattleAnimTempYOffset]
add b
ld b, a
push hl
ld a, [hl]
ld hl, wBattleAnimTempOAMFlags
bit OAM_Y_FLIP, [hl]
jr z, .no_yflip
add $8
xor $ff
inc a
.no_yflip
pop hl
add b
ld [de], a
; X Coord
inc hl
inc de
ld a, [wBattleAnimTempXCoord]
ld b, a
ld a, [wBattleAnimTempXOffset]
add b
ld b, a
push hl
ld a, [hl]
ld hl, wBattleAnimTempOAMFlags
bit OAM_X_FLIP, [hl]
jr z, .no_xflip
add $8
xor $ff
inc a
.no_xflip
pop hl
add b
ld [de], a
; Tile ID
inc hl
inc de
ld a, [wBattleAnimTempTileID]
add BATTLEANIM_BASE_TILE
add [hl]
ld [de], a
; Attributes
inc hl
inc de
ld a, [wBattleAnimTempOAMFlags]
ld b, a
ld a, [hl]
xor b
and PRIORITY | Y_FLIP | X_FLIP
ld b, a
ld a, [hl]
and OBP_NUM
or b
ld b, a
ld a, [wBattleAnimTempPalette]
and PALETTE_MASK | VRAM_BANK_1
or b
ld [de], a
inc hl
inc de
ld a, e
ld [wBattleAnimOAMPointerLo], a
cp LOW(wVirtualOAMEnd)
jr nc, .exit_set_carry
dec c
jr nz, .loop
pop bc
jr .done
.delete
call DeinitBattleAnimation
.done
and a
ret
.exit_set_carry
pop bc
scf
ret
InitBattleAnimBuffer:
ld hl, BATTLEANIMSTRUCT_OAMFLAGS
add hl, bc
ld a, [hl]
and PRIORITY
ld [wBattleAnimTempOAMFlags], a
xor a
ld [wBattleAnimTempFrameOAMFlags], a
ld hl, BATTLEANIMSTRUCT_PALETTE
add hl, bc
ld a, [hl]
ld [wBattleAnimTempPalette], a
ld hl, BATTLEANIMSTRUCT_FIX_Y
add hl, bc
ld a, [hl]
ld [wBattleAnimTempFixY], a
ld hl, BATTLEANIMSTRUCT_TILEID
add hl, bc
ld a, [hli]
ld [wBattleAnimTempTileID], a
ld a, [hli]
ld [wBattleAnimTempXCoord], a
ld a, [hli]
ld [wBattleAnimTempYCoord], a
ld a, [hli]
ld [wBattleAnimTempXOffset], a
ld a, [hli]
ld [wBattleAnimTempYOffset], a
ldh a, [hBattleTurn]
and a
ret z
ld hl, BATTLEANIMSTRUCT_OAMFLAGS
add hl, bc
ld a, [hl]
ld [wBattleAnimTempOAMFlags], a
bit 0, [hl]
ret z
ld hl, BATTLEANIMSTRUCT_XCOORD
add hl, bc
ld a, [hli]
ld d, a
ld a, (-10 * 8) + 4
sub d
ld [wBattleAnimTempXCoord], a
ld a, [hli]
ld d, a
ld a, [wBattleAnimTempFixY]
cp $ff
jr nz, .check_kinesis_softboiled_milkdrink
ld a, 5 * 8
add d
jr .done
.check_kinesis_softboiled_milkdrink
sub d
push af
ld a, [wFXAnimID + 1]
or a
jr nz, .no_sub
ld a, [wFXAnimID]
cp KINESIS
jr z, .do_sub
cp SOFTBOILED
jr z, .do_sub
cp MILK_DRINK
jr nz, .no_sub
.do_sub
pop af
sub 1 * 8
jr .done
.no_sub
pop af
.done
ld [wBattleAnimTempYCoord], a
ld a, [hli]
xor $ff
inc a
ld [wBattleAnimTempXOffset], a
ret
GetBattleAnimTileOffset:
push hl
push bc
ld hl, wBattleAnimTileDict
ld b, a
ld c, NUM_BATTLEANIMTILEDICT_ENTRIES
.loop
ld a, [hli]
cp b
jr z, .load
inc hl
dec c
jr nz, .loop
xor a
jr .done
.load
ld a, [hl]
.done
pop bc
pop hl
ret
_ExecuteBGEffects:
callfar ExecuteBGEffects
ret
_QueueBGEffect:
callfar QueueBGEffect
ret
INCLUDE "data/battle_anims/objects.asm"
|