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
|
#include "global.h"
#include "battle_anim.h"
#include "rom_8077ABC.h"
extern s16 gBattleAnimArgs[8];
extern u8 gAnimBankAttacker;
extern u8 gAnimBankTarget;
extern u16 gBattleTypeFlags;
void sub_80D59B0(struct Sprite *);
static void sub_80D5A74(struct Sprite *);
// heated_rock (moves heated rock sprites)
// Used in Eruption.
void sub_80D58FC(struct Sprite *sprite)
{
sub_80D59B0(sprite);
if (sprite->invisible)
{
gTasks[sprite->data[6]].data[sprite->data[7]]--;
DestroySprite(sprite);
}
}
u16 sub_80D5940(u8 spriteId)
{
u16 var1 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y + gSprites[spriteId].centerToCornerVecY;
if (GetBankSide(gAnimBankAttacker) == 0)
{
var1 = ((var1 << 16) + 0x4A0000) >> 16;
}
else
{
var1 = ((var1 << 16) + 0x2C0000) >> 16;
}
return var1;
}
void sub_80D5994(struct Sprite *sprite, s16 x, s16 y)
{
sprite->data[0] = 0;
sprite->data[1] = 0;
sprite->data[2] = (u16)sprite->pos1.x * 8;
sprite->data[3] = (u16)sprite->pos1.y * 8;
sprite->data[4] = x * 8;
sprite->data[5] = y * 8;
}
#ifdef NONMATCHING
void sub_80D59B0(struct Sprite *sprite)
{
int var1;
int var2;
if (++sprite->data[0] > 2)
{
sprite->data[0] = 0;
++sprite->data[1];
sprite->data[3] += ((u16)sprite->data[1] * (u16)sprite->data[1]);
}
var1 = (u16)sprite->data[4] + (u16)sprite->data[2];
sprite->data[2] = var1;
var1 = (s16)var1 >> 3;
sprite->pos1.x = var1;
var2 = (u16)sprite->data[5] + (u16)sprite->data[3];
sprite->data[3] = var2;
var2 = (s16)var2 >> 3;
sprite->pos1.y = var2;
if ((u32)((var1 + 8) << 16) > 0x1000000 || var2 < -8 || var2 > 120)
{
sprite->invisible = 1;
}
}
#else
__attribute__((naked))
void sub_80D59B0(struct Sprite *sprite)
{
asm(".syntax unified\n\
push {lr}\n\
adds r2, r0, 0\n\
ldrh r0, [r2, 0x2E]\n\
adds r0, 0x1\n\
strh r0, [r2, 0x2E]\n\
lsls r0, 16\n\
asrs r0, 16\n\
cmp r0, 0x2\n\
ble _080D59DA\n\
movs r0, 0\n\
strh r0, [r2, 0x2E]\n\
ldrh r0, [r2, 0x30]\n\
adds r0, 0x1\n\
strh r0, [r2, 0x30]\n\
ldrh r0, [r2, 0x30]\n\
adds r1, r0, 0\n\
muls r1, r0\n\
adds r0, r1, 0\n\
ldrh r3, [r2, 0x34]\n\
adds r0, r3\n\
strh r0, [r2, 0x34]\n\
_080D59DA:\n\
ldrh r0, [r2, 0x36]\n\
ldrh r1, [r2, 0x32]\n\
adds r0, r1\n\
strh r0, [r2, 0x32]\n\
lsls r0, 16\n\
asrs r0, 19\n\
strh r0, [r2, 0x20]\n\
ldrh r1, [r2, 0x38]\n\
ldrh r3, [r2, 0x34]\n\
adds r1, r3\n\
strh r1, [r2, 0x34]\n\
lsls r1, 16\n\
asrs r3, r1, 19\n\
strh r3, [r2, 0x22]\n\
adds r0, 0x8\n\
lsls r0, 16\n\
movs r1, 0x80\n\
lsls r1, 17\n\
cmp r0, r1\n\
bhi _080D5A10\n\
adds r1, r3, 0\n\
movs r0, 0x8\n\
negs r0, r0\n\
cmp r1, r0\n\
blt _080D5A10\n\
cmp r1, 0x78\n\
ble _080D5A1C\n\
_080D5A10:\n\
adds r0, r2, 0\n\
adds r0, 0x3E\n\
ldrb r1, [r0]\n\
movs r2, 0x4\n\
orrs r1, r2\n\
strb r1, [r0]\n\
_080D5A1C:\n\
pop {r0}\n\
bx r0\n\
.syntax divided\n");
}
#endif // NONMATCHING
void sub_80D5A20(struct Sprite *sprite)
{
sprite->pos1.x = gBattleAnimArgs[0];
sprite->pos1.y = gBattleAnimArgs[1];
sprite->data[0] = 0;
sprite->data[1] = 0;
sprite->data[2] = 0;
sprite->data[6] = gBattleAnimArgs[2];
sprite->data[7] = gBattleAnimArgs[3];
sprite->oam.tileNum += gBattleAnimArgs[4] * 16;
sprite->callback = sub_80D5A74;
}
static void sub_80D5A74(struct Sprite *sprite)
{
switch (sprite->data[0])
{
case 0:
if (sprite->data[6] != 0)
{
sprite->data[6]--;
return;
}
sprite->data[0]++;
// fall through
case 1:
sprite->pos1.y += 8;
if (sprite->pos1.y >= sprite->data[7])
{
sprite->pos1.y = sprite->data[7];
sprite->data[0]++;
}
break;
case 2:
if (++sprite->data[1] > 1)
{
sprite->data[1] = 0;
if ((++sprite->data[2] & 1) != 0)
{
sprite->pos2.y = -3;
}
else
{
sprite->pos2.y = 3;
}
}
if (++sprite->data[3] > 16)
{
DestroyAnimSprite(sprite);
}
break;
}
}
|