blob: 055960f40d342826040b995b1fb48eb19686960e (
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
|
#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;
}
void sub_80D59B0(struct Sprite *sprite)
{
int var1;
if (++sprite->data[0] > 2)
{
sprite->data[0] = 0;
++sprite->data[1];
var1 = (u16)sprite->data[1] * (u16)sprite->data[1];
sprite->data[3] += var1;
}
sprite->data[2] += sprite->data[4];
sprite->pos1.x = sprite->data[2] >> 3;
sprite->data[3] += sprite->data[5];
sprite->pos1.y = sprite->data[3] >> 3;
if (sprite->pos1.x < -8 || sprite->pos1.x > 0xf8 || sprite->pos1.y < -8 || sprite->pos1.y > 120)
sprite->invisible = TRUE;
}
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;
}
}
|