summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authornullableVoidPtr <30564701+nullableVoidPtr@users.noreply.github.com>2018-12-21 16:44:49 +0800
committernullableVoidPtr <30564701+nullableVoidPtr@users.noreply.github.com>2018-12-21 16:44:49 +0800
commit80de1483c6d4b2e42fc2d71195cff1c6fddfac5a (patch)
treef739f2861c46e5b325275fb5f23d52452d1d1360 /src
parente8b149e80e7b1411ce7a128e36ebc5d5490133e1 (diff)
Port water.s from pokeemerald
Diffstat (limited to 'src')
-rw-r--r--src/battle/anim/fire_2.c2
-rw-r--r--src/battle/anim/ghost.c2
-rw-r--r--src/battle/anim/lunge.c6
-rw-r--r--src/battle/anim/shadow_enlarge.c2
-rw-r--r--src/battle/anim/shadow_minimize.c2
-rw-r--r--src/battle/anim/silhouette.c2
-rw-r--r--src/battle/anim/water.c1557
-rw-r--r--src/battle/anim/withdraw.c2
-rw-r--r--src/battle/battle_anim_80A7E7C.c6
-rw-r--r--src/battle/battle_anim_812C144.c10
-rwxr-xr-xsrc/battle/battle_anim_813F0F4.c4
-rw-r--r--src/rom_8077ABC.c4
12 files changed, 1577 insertions, 22 deletions
diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c
index 53d7038cb..7ebd7dd87 100644
--- a/src/battle/anim/fire_2.c
+++ b/src/battle/anim/fire_2.c
@@ -355,7 +355,7 @@ void sub_80D5470(u8 taskId) // initialize animation task for Move_ERUPTION?
task->data[5] = GetBattlerSide(gBattleAnimAttacker);
task->data[6] = 0;
- sub_8078E70(task->data[15], 0);
+ PrepareBattlerSpriteForRotScale(task->data[15], 0);
task->func = sub_80D54E0;
}
diff --git a/src/battle/anim/ghost.c b/src/battle/anim/ghost.c
index f67035ac7..6ff44ed15 100644
--- a/src/battle/anim/ghost.c
+++ b/src/battle/anim/ghost.c
@@ -349,7 +349,7 @@ void sub_80DDDF0(u8 taskId)
REG_BLDCNT = 0x3F40;
REG_BLDALPHA = 0x1000;
spriteId = GetAnimBattlerSpriteId(0);
- sub_8078E70(spriteId, 1);
+ PrepareBattlerSpriteForRotScale(spriteId, 1);
obj_id_set_rotscale(spriteId, 128, 128, 0);
gSprites[spriteId].invisible = FALSE;
gTasks[taskId].data[0] = 128;
diff --git a/src/battle/anim/lunge.c b/src/battle/anim/lunge.c
index ce6aa58f4..381392e71 100644
--- a/src/battle/anim/lunge.c
+++ b/src/battle/anim/lunge.c
@@ -83,7 +83,7 @@ static void sub_80CD81C(struct Sprite* sprite)
if (sprite->data[0] == 0)
{
sprite->data[3] = gBankSpriteIds[gBattleAnimAttacker];
- sub_8078E70(sprite->data[3], 0);
+ PrepareBattlerSpriteForRotScale(sprite->data[3], 0);
sprite->data[4] = (sprite->data[6] = GetBattlerSide(gBattleAnimAttacker)) ? 0x300 : 0xFFFFFD00;
sprite->data[5] = 0;
}
@@ -166,7 +166,7 @@ static void sub_80CD9D4(struct Sprite* sprite)
sprite->data[3] = GetBattlerSide(gBattleAnimAttacker);
sprite->data[4] = (sprite->data[3] != 0) ? 0x200 : -0x200;
sprite->data[5] = 0;
- sub_8078E70(sprite->data[2], 0);
+ PrepareBattlerSpriteForRotScale(sprite->data[2], 0);
sprite->data[0]++;
case 1:
sprite->data[5] += sprite->data[4];
@@ -247,7 +247,7 @@ void sub_80CDB60(u8 taskId)
task->data[3] = 8;
task->data[4] = 0;
task->data[5] = (task->data[1] == 0) ? -0xC0 : 0xC0;
- sub_8078E70(task->data[0], 0);
+ PrepareBattlerSpriteForRotScale(task->data[0], 0);
task->data[2]++;
}
break;
diff --git a/src/battle/anim/shadow_enlarge.c b/src/battle/anim/shadow_enlarge.c
index ab975914a..3c69aae1c 100644
--- a/src/battle/anim/shadow_enlarge.c
+++ b/src/battle/anim/shadow_enlarge.c
@@ -16,7 +16,7 @@ static void sub_80D0428(u8 taskId);
void sub_80D03C4(u8 taskId)
{
u8 spriteId = GetAnimBattlerSpriteId(1);
- sub_8078E70(spriteId, 1);
+ PrepareBattlerSpriteForRotScale(spriteId, 1);
obj_id_set_rotscale(spriteId, 0xD0, 0xD0, 0);
sub_8079108(gSprites[spriteId].oam.paletteNum + 16, 0);
gTasks[taskId].data[0] = 0x50;
diff --git a/src/battle/anim/shadow_minimize.c b/src/battle/anim/shadow_minimize.c
index e65b4a193..a4589f096 100644
--- a/src/battle/anim/shadow_minimize.c
+++ b/src/battle/anim/shadow_minimize.c
@@ -20,7 +20,7 @@ void sub_80D0488(u8 taskId)
struct Task* task = &gTasks[taskId];
u8 spriteId = GetAnimBattlerSpriteId(0);
task->data[0] = spriteId;
- sub_8078E70(spriteId, 0);
+ PrepareBattlerSpriteForRotScale(spriteId, 0);
task->data[1] = 0;
task->data[2] = 0;
task->data[3] = 0;
diff --git a/src/battle/anim/silhouette.c b/src/battle/anim/silhouette.c
index f61c0913b..34005d7be 100644
--- a/src/battle/anim/silhouette.c
+++ b/src/battle/anim/silhouette.c
@@ -22,7 +22,7 @@ void sub_80CB340(u8 taskId)
}
else
{
- sub_8078E70(spriteId, 1);
+ PrepareBattlerSpriteForRotScale(spriteId, 1);
gTasks[taskId].data[0] = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1];
gTasks[taskId].data[11] = 256;
diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c
index 207e35083..b7074bceb 100644
--- a/src/battle/anim/water.c
+++ b/src/battle/anim/water.c
@@ -1,22 +1,48 @@
#include "global.h"
+#include "battle.h"
#include "battle_anim.h"
+#include "random.h"
#include "rom_8077ABC.h"
+#include "sprite.h"
#include "trig.h"
#include "util.h"
+#include "constants/battle_anim.h"
+extern u8 gAnimVisualTaskCount;
extern s16 gBattleAnimArgs[];
extern u8 gBattleAnimAttacker;
extern u8 gBattleAnimTarget;
+extern u16 gBattlerPartyIndexes[];
+extern const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB4D8;
extern const union AffineAnimCmd *const gSpriteAffineAnimTable_83DA318[];
extern const union AnimCmd *const gSpriteAnimTable_83D9BC8[];
+void PrepareBattlerSpriteForRotScale(u8, u8);
+void sub_8078F40(u8);
+void sub_8079A64(u8);
void sub_80D37FC(struct Sprite *sprite);
void sub_80D3838(struct Sprite *sprite);
void sub_80D4044(struct Sprite *sprite);
+void sub_80D40A8(struct Sprite *);
+void sub_80D4150(u8);
+u8 sub_80D4394(void);
+void sub_80D4418(struct Task *, u8);
void sub_80D452C(struct Sprite *sprite);
+void sub_80D463C(u8);
+void sub_80D472C(struct Task *, u8);
+void sub_80D47D0(struct Sprite *);
+void sub_80D487C(struct Sprite *);
+void sub_80D4988(u8);
+void sub_80D4AD0(struct Task *);
+void sub_80D4B3C(struct Sprite *);
+void sub_80D4BA4(struct Sprite *);
void sub_80D4BF0(struct Sprite *sprite);
+void sub_80D4C18(struct Sprite *);
+void sub_80D4CEC(struct Sprite *);
void sub_80D4C64(struct Sprite *sprite);
+void sub_80D4D64(struct Sprite*, int, int);
+void sub_80E1864(u8);
static void sub_80D3874(struct Sprite *sprite);
const union AnimCmd gSpriteAnim_83D9300[] =
@@ -232,7 +258,7 @@ static void sub_80D3874(struct Sprite *sprite)
}
NAKED
-void sub_80D38BC(u8 taskId)
+void AnimTask_CreateSurfWave(u8 taskId)
{
asm(".syntax unified\n\
.equ REG_BLDCNT, 0x4000050\n\
@@ -549,3 +575,1532 @@ _080D3B38:\n\
_080D3B5C: .4byte sub_80D3B60\n\
.syntax divided\n");
}
+
+#ifdef NONMATCHING
+void sub_80D3B60(u8 taskId)
+{
+ struct UnknownAnimStruct2 unk;
+ u8 i;
+ u16 rgbBuffer;
+ u16 *BGptrX = &gBattle_BG1_X;
+ u16 *BGptrY = &gBattle_BG1_Y;
+ s16 unkUse;
+ u32 palOffset;
+ u16 palNum;
+
+ *BGptrX += gTasks[taskId].data[0];
+ *BGptrY += gTasks[taskId].data[1];
+ sub_80A6B30(&unk);
+ gTasks[taskId].data[2] += gTasks[taskId].data[1];
+ if (++gTasks[taskId].data[5] == 4)
+ {
+ rgbBuffer = gPlttBufferFaded[unk.unk8 * 16 + 7];
+ for (i = 6; i != 0; i--)
+ {
+ palNum = unk.unk8 * 16;
+ palOffset = 1 + i;
+ gPlttBufferFaded[palNum + palOffset] = gPlttBufferFaded[palNum + palOffset - 1];
+ }
+ gPlttBufferFaded[unk.unk8 * 16 + 1] = rgbBuffer;
+ gTasks[taskId].data[5] = 0;
+ }
+ if (++gTasks[taskId].data[6] > 1)
+ {
+ gTasks[taskId].data[6] = 0;
+ unkUse = ++gTasks[taskId].data[3];
+ if (unkUse <= 13)
+ {
+ gTasks[gTasks[taskId].data[15]].data[1] = unkUse | ((16 - unkUse) * 256);
+ gTasks[taskId].data[4]++;
+ }
+ if (gTasks[taskId].data[3] > 54)
+ {
+ unkUse = --gTasks[taskId].data[4];
+ gTasks[gTasks[taskId].data[15]].data[1] = unkUse | ((16 - unkUse) * 256);
+ }
+ }
+ if (!(gTasks[gTasks[taskId].data[15]].data[1] & 0x1F))
+ {
+ gTasks[taskId].data[0] = gTasks[gTasks[taskId].data[15]].data[1] & 0x1F;
+ gTasks[taskId].func = sub_8107CC4;
+ }
+}
+#else
+NAKED
+void sub_80D3B60(u8 taskId)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x18\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ ldr r0, =gTasks\n\
+ lsls r4, r7, 2\n\
+ adds r4, r7\n\
+ lsls r4, 3\n\
+ adds r4, r0\n\
+ ldrh r0, [r4, 0x8]\n\
+ ldr r1, =gBattle_BG1_X\n\
+ ldrh r1, [r1]\n\
+ adds r0, r1\n\
+ ldr r2, =gBattle_BG1_X\n\
+ strh r0, [r2]\n\
+ ldrh r0, [r4, 0xA]\n\
+ ldr r3, =gBattle_BG1_Y\n\
+ ldrh r3, [r3]\n\
+ adds r0, r3\n\
+ ldr r1, =gBattle_BG1_Y\n\
+ strh r0, [r1]\n\
+ add r5, sp, 0x4\n\
+ adds r0, r5, 0\n\
+ bl sub_8078914\n\
+ ldrh r0, [r4, 0xA]\n\
+ ldrh r2, [r4, 0xC]\n\
+ adds r0, r2\n\
+ strh r0, [r4, 0xC]\n\
+ ldrh r0, [r4, 0x12]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x12]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ mov r10, r5\n\
+ cmp r0, 0x4\n\
+ bne _080D3C02\n\
+ ldr r1, =gPlttBufferFaded\n\
+ ldrb r0, [r5, 0x8]\n\
+ lsls r0, 4\n\
+ adds r0, 0x7\n\
+ lsls r0, 1\n\
+ adds r0, r1\n\
+ ldrh r6, [r0]\n\
+ movs r2, 0x6\n\
+ adds r5, r1, 0\n\
+ adds r3, r5, 0\n\
+ mov r4, r10\n\
+_080D3BC8:\n\
+ ldrb r0, [r4, 0x8]\n\
+ lsls r0, 4\n\
+ adds r1, r2, 0x1\n\
+ adds r0, r1\n\
+ lsls r1, r0, 1\n\
+ adds r1, r3\n\
+ subs r0, 0x1\n\
+ lsls r0, 1\n\
+ adds r0, r3\n\
+ ldrh r0, [r0]\n\
+ strh r0, [r1]\n\
+ subs r0, r2, 0x1\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ cmp r2, 0\n\
+ bne _080D3BC8\n\
+ mov r3, r10\n\
+ ldrb r0, [r3, 0x8]\n\
+ lsls r0, 4\n\
+ adds r0, 0x1\n\
+ lsls r0, 1\n\
+ adds r0, r5\n\
+ strh r6, [r0]\n\
+ ldr r1, =gTasks\n\
+ lsls r0, r7, 2\n\
+ adds r0, r7\n\
+ lsls r0, 3\n\
+ adds r0, r1\n\
+ strh r2, [r0, 0x12]\n\
+_080D3C02:\n\
+ ldr r1, =gTasks\n\
+ lsls r2, r7, 2\n\
+ adds r0, r2, r7\n\
+ lsls r0, 3\n\
+ adds r3, r0, r1\n\
+ ldrh r0, [r3, 0x14]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0x14]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ adds r4, r1, 0\n\
+ str r2, [sp, 0x14]\n\
+ cmp r0, 0x1\n\
+ ble _080D3C70\n\
+ movs r0, 0\n\
+ strh r0, [r3, 0x14]\n\
+ ldrh r0, [r3, 0xE]\n\
+ adds r2, r0, 0x1\n\
+ strh r2, [r3, 0xE]\n\
+ lsls r0, r2, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0xD\n\
+ bgt _080D3C4C\n\
+ movs r1, 0x26\n\
+ ldrsh r0, [r3, r1]\n\
+ lsls r1, r0, 2\n\
+ adds r1, r0\n\
+ lsls r1, 3\n\
+ adds r1, r4\n\
+ movs r0, 0x10\n\
+ subs r0, r2\n\
+ lsls r0, 8\n\
+ orrs r2, r0\n\
+ strh r2, [r1, 0xA]\n\
+ ldrh r0, [r3, 0x10]\n\
+ adds r0, 0x1\n\
+ strh r0, [r3, 0x10]\n\
+_080D3C4C:\n\
+ movs r2, 0xE\n\
+ ldrsh r0, [r3, r2]\n\
+ cmp r0, 0x36\n\
+ ble _080D3C70\n\
+ ldrh r2, [r3, 0x10]\n\
+ subs r2, 0x1\n\
+ strh r2, [r3, 0x10]\n\
+ movs r1, 0x26\n\
+ ldrsh r0, [r3, r1]\n\
+ lsls r1, r0, 2\n\
+ adds r1, r0\n\
+ lsls r1, 3\n\
+ adds r1, r4\n\
+ movs r0, 0x10\n\
+ subs r0, r2\n\
+ lsls r0, 8\n\
+ orrs r2, r0\n\
+ strh r2, [r1, 0xA]\n\
+_080D3C70:\n\
+ ldr r2, [sp, 0x14]\n\
+ adds r0, r2, r7\n\
+ lsls r0, 3\n\
+ adds r0, r4\n\
+ movs r3, 0x26\n\
+ ldrsh r1, [r0, r3]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r0, 3\n\
+ adds r0, r4\n\
+ ldrh r1, [r0, 0xA]\n\
+ movs r0, 0x1F\n\
+ ands r0, r1\n\
+ cmp r0, 0\n\
+ bne _080D3D32\n\
+ ldr r2, [sp, 0x4]\n\
+ movs r3, 0x80\n\
+ lsls r3, 6\n\
+ add r6, sp, 0x10\n\
+ movs r5, 0\n\
+ ldr r1, =0x040000d4\n\
+ movs r4, 0x80\n\
+ lsls r4, 5\n\
+ mov r8, r6\n\
+ ldr r0, =0x85000400\n\
+ mov r12, r0\n\
+ movs r0, 0x85\n\
+ lsls r0, 24\n\
+ mov r9, r0\n\
+_080D3CAA:\n\
+ str r5, [sp, 0x10]\n\
+ mov r0, r8\n\
+ str r0, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ mov r0, r12\n\
+ str r0, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ adds r2, r4\n\
+ subs r3, r4\n\
+ cmp r3, r4\n\
+ bhi _080D3CAA\n\
+ str r5, [sp, 0x10]\n\
+ str r6, [r1]\n\
+ str r2, [r1, 0x4]\n\
+ lsrs r0, r3, 2\n\
+ mov r2, r9\n\
+ orrs r0, r2\n\
+ str r0, [r1, 0x8]\n\
+ ldr r0, [r1, 0x8]\n\
+ mov r0, sp\n\
+ movs r1, 0\n\
+ strb r1, [r0]\n\
+ strb r1, [r0]\n\
+ mov r3, r10\n\
+ ldr r1, [r3, 0x4]\n\
+ movs r4, 0\n\
+ str r4, [sp, 0x10]\n\
+ ldr r0, =0x040000d4\n\
+ str r6, [r0]\n\
+ str r1, [r0, 0x4]\n\
+ ldr r1, =0x85000400\n\
+ str r1, [r0, 0x8]\n\
+ ldr r0, [r0, 0x8]\n\
+ bl IsContest\n\
+ lsls r0, 24\n\
+ cmp r0, 0\n\
+ bne _080D3D02\n\
+ ldr r2, =0x0400000a\n\
+ ldrb r1, [r2]\n\
+ movs r0, 0xD\n\
+ negs r0, r0\n\
+ ands r0, r1\n\
+ strb r0, [r2]\n\
+_080D3D02:\n\
+ ldr r0,=gBattle_BG1_X\n\
+ strh r4, [r0]\n\
+ ldr r1, =gBattle_BG1_Y\n\
+ strh r4, [r1]\n\
+ ldr r0, =0x04000050\n\
+ strh r4, [r0]\n\
+ adds r0, 0x2\n\
+ strh r4, [r0]\n\
+ ldr r2, =gTasks\n\
+ ldr r3, [sp, 0x14]\n\
+ adds r0, r3, r7\n\
+ lsls r0, 3\n\
+ adds r0, r2\n\
+ movs r3, 0x26\n\
+ ldrsh r1, [r0, r3]\n\
+ lsls r0, r1, 2\n\
+ adds r0, r1\n\
+ lsls r0, 3\n\
+ adds r0, r2\n\
+ ldr r1, =0x0000ffff\n\
+ strh r1, [r0, 0x26]\n\
+ adds r0, r7, 0\n\
+ bl DestroyAnimVisualTask\n\
+_080D3D32:\n\
+ add sp, 0x18\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+ .pool");
+}
+#endif
+
+#ifdef NONMATCHING
+void sub_80D3D68(u8 taskId)
+{
+ s16 i;
+ struct ScanlineEffectParams params;
+ struct Task *task = &gTasks[taskId];
+ // u16 *scanlineBuffer;
+
+ switch (task->data[0])
+ {
+ case 0:
+ for (i = 0; i < task->data[4]; i++)
+ {
+ /* scanlineBuffer = &gScanlineEffectRegBuffers[0][i];
+ *(u16 *)(&gScanlineEffect) = task->data[2];
+ *scanlineBuffer = task->data[2] & -1; */
+ gScanlineEffectRegBuffers[1][i] = task->data[2];
+ gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[2] & 0xFFFF));
+ }
+ for (i = task->data[4]; i < task->data[5]; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = task->data[1];
+ gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[1] & 0xFFFF));
+ }
+ for (i = task->data[5]; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[1][i] = task->data[2];
+ gScanlineEffectRegBuffers[0][i] = (u16)((int)(task->data[2] & 0xFFFF));
+ }
+ if (task->data[4] == 0)
+ {
+ gScanlineEffectRegBuffers[1][i] = task->data[1];
+ gScanlineEffectRegBuffers[0][i] = task->data[1];
+ }
+ else
+ {
+ gScanlineEffectRegBuffers[1][i] = task->data[2];
+ gScanlineEffectRegBuffers[0][i] = task->data[2];
+ }
+ params.dmaDest = (vu16 *)REG_ADDR_BLDALPHA;
+ params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ params.initState = 1;
+ params.unused9 = 0;
+ ScanlineEffect_SetParams(params);
+ task->data[0]++;
+ break;
+ case 1:
+ if (task->data[3] == 0)
+ {
+ if (--task->data[4] <= 0)
+ {
+ task->data[4] = 0;
+ task->data[0]++;
+ }
+ }
+ else if (++task->data[5] > 111)
+ {
+ task->data[0]++;
+ }
+ for (i = 0; i < task->data[4]; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2];
+ }
+ for (i = task->data[4]; i < task->data[5]; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[1];
+ }
+ for (i = task->data[5]; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2];
+ }
+ break;
+ case 2:
+ for (i = 0; i < task->data[4]; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2];
+ }
+ for (i = task->data[4]; i < task->data[5]; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[1];
+ }
+ for (i = task->data[5]; i < 160; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[2];
+ }
+ if (task->data[15] == -1)
+ {
+ ScanlineEffect_Stop();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+#else
+NAKED
+void sub_80D3D68(u8 taskId)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ sub sp, 0xC\n\
+ lsls r0, 24\n\
+ lsrs r7, r0, 24\n\
+ lsls r0, r7, 2\n\
+ adds r0, r7\n\
+ lsls r0, 3\n\
+ ldr r1, =gTasks\n\
+ adds r4, r0, r1\n\
+ movs r1, 0x8\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0x1\n\
+ bne _080D3D84\n\
+ b _080D3EBC\n\
+_080D3D84:\n\
+ cmp r0, 0x1\n\
+ bgt _080D3D94\n\
+ cmp r0, 0\n\
+ beq _080D3D9C\n\
+ b _080D4032\n\
+ .align 2, 0\n\
+ .pool\n\
+_080D3D94:\n\
+ cmp r0, 0x2\n\
+ bne _080D3D9A\n\
+ b _080D3F88\n\
+_080D3D9A:\n\
+ b _080D4032\n\
+_080D3D9C:\n\
+ movs r3, 0\n\
+ movs r2, 0x10\n\
+ ldrsh r0, [r4, r2]\n\
+ ldr r1, =gScanlineEffectRegBuffers\n\
+ mov r12, r1\n\
+ cmp r3, r0\n\
+ bge _080D3DDA\n\
+ mov r7, r12\n\
+ movs r5, 0xF0\n\
+ lsls r5, 3\n\
+ add r5, r12\n\
+ ldr r6, =0x0000ffff\n\
+_080D3DB4:\n\
+ lsls r2, r3, 16\n\
+ asrs r2, 16\n\
+ lsls r1, r2, 1\n\
+ adds r3, r1, r7\n\
+ adds r1, r5\n\
+ ldrh r0, [r4, 0xC]\n\
+ strh r0, [r1]\n\
+ ldrh r1, [r4, 0xC]\n\
+ adds r0, r6, 0\n\
+ ands r0, r1\n\
+ strh r0, [r3]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ lsrs r3, r2, 16\n\
+ asrs r2, 16\n\
+ movs r1, 0x10\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r2, r0\n\
+ blt _080D3DB4\n\
+_080D3DDA:\n\
+ ldrh r3, [r4, 0x10]\n\
+ lsls r2, r3, 16\n\
+ asrs r1, r2, 16\n\
+ movs r3, 0x12\n\
+ ldrsh r0, [r4, r3]\n\
+ cmp r1, r0\n\
+ bge _080D3E14\n\
+ ldr r5, =gScanlineEffectRegBuffers\n\
+ movs r0, 0xF0\n\
+ lsls r0, 3\n\
+ adds r6, r5, r0\n\
+ ldr r7, =0x0000ffff\n\
+_080D3DF2:\n\
+ asrs r2, 16\n\
+ lsls r1, r2, 1\n\
+ adds r3, r1, r5\n\
+ adds r1, r6\n\
+ ldrh r0, [r4, 0xA]\n\
+ strh r0, [r1]\n\
+ ldrh r1, [r4, 0xA]\n\
+ adds r0, r7, 0\n\
+ ands r0, r1\n\
+ strh r0, [r3]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ asrs r1, r2, 16\n\
+ movs r3, 0x12\n\
+ ldrsh r0, [r4, r3]\n\
+ cmp r1, r0\n\
+ blt _080D3DF2\n\
+_080D3E14:\n\
+ ldrh r3, [r4, 0x12]\n\
+ lsls r2, r3, 16\n\
+ asrs r0, r2, 16\n\
+ cmp r0, 0x9F\n\
+ bgt _080D3E4A\n\
+ ldr r5, =gScanlineEffectRegBuffers\n\
+ movs r0, 0xF0\n\
+ lsls r0, 3\n\
+ adds r6, r5, r0\n\
+ ldr r7, =0x0000ffff\n\
+_080D3E28:\n\
+ asrs r2, 16\n\
+ lsls r1, r2, 1\n\
+ adds r3, r1, r5\n\
+ adds r1, r6\n\
+ ldrh r0, [r4, 0xC]\n\
+ strh r0, [r1]\n\
+ ldrh r1, [r4, 0xC]\n\
+ adds r0, r7, 0\n\
+ ands r0, r1\n\
+ strh r0, [r3]\n\
+ adds r2, 0x1\n\
+ lsls r2, 16\n\
+ lsrs r3, r2, 16\n\
+ lsls r2, r3, 16\n\
+ asrs r0, r2, 16\n\
+ cmp r0, 0x9F\n\
+ ble _080D3E28\n\
+_080D3E4A:\n\
+ movs r1, 0x10\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r0, 0\n\
+ bne _080D3E74\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 15\n\
+ mov r3, r12\n\
+ adds r2, r0, r3\n\
+ movs r1, 0xF0\n\
+ lsls r1, 3\n\
+ add r1, r12\n\
+ adds r0, r1\n\
+ ldrh r1, [r4, 0xA]\n\
+ strh r1, [r0]\n\
+ ldrh r0, [r4, 0xA]\n\
+ b _080D3E8A\n\
+ .align 2, 0\n\
+ .pool\n\
+_080D3E74:\n\
+ lsls r0, r3, 16\n\
+ asrs r0, 15\n\
+ mov r1, r12\n\
+ adds r2, r0, r1\n\
+ movs r1, 0xF0\n\
+ lsls r1, 3\n\
+ add r1, r12\n\
+ adds r0, r1\n\
+ ldrh r1, [r4, 0xC]\n\
+ strh r1, [r0]\n\
+ ldrh r0, [r4, 0xC]\n\
+_080D3E8A:\n\
+ strh r0, [r2]\n\
+ ldr r0, =0x04000052\n\
+ str r0, [sp]\n\
+ ldr r0, =0xa2600001\n\
+ str r0, [sp, 0x4]\n\
+ mov r1, sp\n\
+ movs r2, 0\n\
+ movs r0, 0x1\n\
+ strb r0, [r1, 0x8]\n\
+ mov r0, sp\n\
+ strb r2, [r0, 0x9]\n\
+ ldr r0, [sp]\n\
+ ldr r1, [sp, 0x4]\n\
+ ldr r2, [sp, 0x8]\n\
+ bl ScanlineEffect_SetParams\n\
+ ldrh r0, [r4, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x8]\n\
+ b _080D4032\n\
+ .align 2, 0\n\
+ .pool\n\
+_080D3EBC:\n\
+ movs r2, 0xE\n\
+ ldrsh r1, [r4, r2]\n\
+ cmp r1, 0\n\
+ bne _080D3ED4\n\
+ ldrh r0, [r4, 0x10]\n\
+ subs r0, 0x1\n\
+ strh r0, [r4, 0x10]\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ bgt _080D3EE8\n\
+ strh r1, [r4, 0x10]\n\
+ b _080D3EE2\n\
+_080D3ED4:\n\
+ ldrh r0, [r4, 0x12]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x12]\n\
+ lsls r0, 16\n\
+ asrs r0, 16\n\
+ cmp r0, 0x6F\n\
+ ble _080D3EE8\n\
+_080D3EE2:\n\
+ ldrh r0, [r4, 0x8]\n\
+ adds r0, 0x1\n\
+ strh r0, [r4, 0x8]\n\
+_080D3EE8:\n\
+ movs r3, 0\n\
+ movs r1, 0x10\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r3, r0\n\
+ bge _080D3F1C\n\
+ ldr r6, =gScanlineEffectRegBuffers\n\
+ ldr r5, =gScanlineEffect\n\
+_080D3EF6:\n\
+ lsls r1, r3, 16\n\
+ asrs r1, 16\n\
+ lsls r3, r1, 1\n\
+ ldrb r2, [r5, 0x14]\n\
+ lsls r0, r2, 4\n\
+ subs r0, r2\n\
+ lsls r0, 7\n\
+ adds r3, r0\n\
+ adds r3, r6\n\
+ ldrh r0, [r4, 0xC]\n\
+ strh r0, [r3]\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r3, r1, 16\n\
+ asrs r1, 16\n\
+ movs r2, 0x10\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r1, r0\n\
+ blt _080D3EF6\n\
+_080D3F1C:\n\
+ ldrh r3, [r4, 0x10]\n\
+ lsls r2, r3, 16\n\
+ asrs r1, r2, 16\n\
+ movs r3, 0x12\n\
+ ldrsh r0, [r4, r3]\n\
+ cmp r1, r0\n\
+ bge _080D3F50\n\
+ ldr r6, =gScanlineEffectRegBuffers\n\
+ ldr r5, =gScanlineEffect\n\
+_080D3F2E:\n\
+ asrs r3, r2, 16\n\
+ lsls r2, r3, 1\n\
+ ldrb r1, [r5, 0x14]\n\
+ lsls r0, r1, 4\n\
+ subs r0, r1\n\
+ lsls r0, 7\n\
+ adds r2, r0\n\
+ adds r2, r6\n\
+ ldrh r0, [r4, 0xA]\n\
+ strh r0, [r2]\n\
+ adds r3, 0x1\n\
+ lsls r2, r3, 16\n\
+ asrs r1, r2, 16\n\
+ movs r3, 0x12\n\
+ ldrsh r0, [r4, r3]\n\
+ cmp r1, r0\n\
+ blt _080D3F2E\n\
+_080D3F50:\n\
+ ldrh r3, [r4, 0x12]\n\
+ lsls r1, r3, 16\n\
+ asrs r0, r1, 16\n\
+ cmp r0, 0x9F\n\
+ bgt _080D4032\n\
+ ldr r6, =gScanlineEffectRegBuffers\n\
+ ldr r5, =gScanlineEffect\n\
+_080D3F5E:\n\
+ asrs r3, r1, 16\n\
+ lsls r2, r3, 1\n\
+ ldrb r1, [r5, 0x14]\n\
+ lsls r0, r1, 4\n\
+ subs r0, r1\n\
+ lsls r0, 7\n\
+ adds r2, r0\n\
+ adds r2, r6\n\
+ ldrh r0, [r4, 0xC]\n\
+ strh r0, [r2]\n\
+ adds r3, 0x1\n\
+ lsls r1, r3, 16\n\
+ asrs r0, r1, 16\n\
+ cmp r0, 0x9F\n\
+ ble _080D3F5E\n\
+ b _080D4032\n\
+ .align 2, 0\n\
+ .pool\n\
+_080D3F88:\n\
+ movs r3, 0\n\
+ movs r1, 0x10\n\
+ ldrsh r0, [r4, r1]\n\
+ cmp r3, r0\n\
+ bge _080D3FBC\n\
+ ldr r6, =gScanlineEffectRegBuffers\n\
+ ldr r5, =gScanlineEffect\n\
+_080D3F96:\n\
+ lsls r1, r3, 16\n\
+ asrs r1, 16\n\
+ lsls r3, r1, 1\n\
+ ldrb r2, [r5, 0x14]\n\
+ lsls r0, r2, 4\n\
+ subs r0, r2\n\
+ lsls r0, 7\n\
+ adds r3, r0\n\
+ adds r3, r6\n\
+ ldrh r0, [r4, 0xC]\n\
+ strh r0, [r3]\n\
+ adds r1, 0x1\n\
+ lsls r1, 16\n\
+ lsrs r3, r1, 16\n\
+ asrs r1, 16\n\
+ movs r2, 0x10\n\
+ ldrsh r0, [r4, r2]\n\
+ cmp r1, r0\n\
+ blt _080D3F96\n\
+_080D3FBC:\n\
+ ldrh r3, [r4, 0x10]\n\
+ lsls r2, r3, 16\n\
+ asrs r1, r2, 16\n\
+ movs r3, 0x12\n\
+ ldrsh r0, [r4, r3]\n\
+ cmp r1, r0\n\
+ bge _080D3FF0\n\
+ ldr r6, =gScanlineEffectRegBuffers\n\
+ ldr r5, =gScanlineEffect\n\
+_080D3FCE:\n\
+ asrs r3, r2, 16\n\
+ lsls r2, r3, 1\n\
+ ldrb r1, [r5, 0x14]\n\
+ lsls r0, r1, 4\n\
+ subs r0, r1\n\
+ lsls r0, 7\n\
+ adds r2, r0\n\
+ adds r2, r6\n\
+ ldrh r0, [r4, 0xA]\n\
+ strh r0, [r2]\n\
+ adds r3, 0x1\n\
+ lsls r2, r3, 16\n\
+ asrs r1, r2, 16\n\
+ movs r3, 0x12\n\
+ ldrsh r0, [r4, r3]\n\
+ cmp r1, r0\n\
+ blt _080D3FCE\n\
+_080D3FF0:\n\
+ ldrh r3, [r4, 0x12]\n\
+ lsls r1, r3, 16\n\
+ asrs r0, r1, 16\n\
+ cmp r0, 0x9F\n\
+ bgt _080D401C\n\
+ ldr r6, =gScanlineEffectRegBuffers\n\
+ ldr r5, =gScanlineEffect\n\
+_080D3FFE:\n\
+ asrs r3, r1, 16\n\
+ lsls r2, r3, 1\n\
+ ldrb r1, [r5, 0x14]\n\
+ lsls r0, r1, 4\n\
+ subs r0, r1\n\
+ lsls r0, 7\n\
+ adds r2, r0\n\
+ adds r2, r6\n\
+ ldrh r0, [r4, 0xC]\n\
+ strh r0, [r2]\n\
+ adds r3, 0x1\n\
+ lsls r1, r3, 16\n\
+ asrs r0, r1, 16\n\
+ cmp r0, 0x9F\n\
+ ble _080D3FFE\n\
+_080D401C:\n\
+ movs r0, 0x26\n\
+ ldrsh r1, [r4, r0]\n\
+ movs r0, 0x1\n\
+ negs r0, r0\n\
+ cmp r1, r0\n\
+ bne _080D4032\n\
+ bl ScanlineEffect_Stop\n\
+ adds r0, r7, 0\n\
+ bl DestroyTask\n\
+_080D4032:\n\
+ add sp, 0xC\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+ .pool\n");
+}
+#endif
+
+void sub_80D4044(struct Sprite *sprite)
+{
+ s16 randData;
+ s16 randData2;
+
+ sprite->oam.tileNum += 8;
+ sub_8078764(sprite, TRUE);
+ randData = (Random() & 0xFF) | 256;
+ randData2 = (Random() & 0x1FF);
+ if (randData2 > 255)
+ randData2 = 256 - randData2;
+ sprite->data[1] = randData;
+ sprite->data[2] = randData2;
+ sprite->callback = sub_80D40A8;
+}
+
+void sub_80D40A8(struct Sprite *sprite)
+{
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ if (sprite->data[1] & 1)
+ sprite->pos2.x = -(sprite->data[3] >> 8);
+ else
+ sprite->pos2.x = sprite->data[3] >> 8;
+ sprite->pos2.y = sprite->data[4] >> 8;
+ if (++sprite->data[0] == 21)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D40F4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[15] = GetAnimBattlerSpriteId(ANIM_BATTLER_ATTACKER);
+ task->data[5] = gSprites[task->data[15]].pos1.y;
+ task->data[1] = sub_80D4394();
+ PrepareBattlerSpriteForRotScale(task->data[15], ST_OAM_OBJ_NORMAL);
+ task->func = sub_80D4150;
+}
+
+void sub_80D4150(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_8079C08(task, task->data[15], 0x100, 0x100, 224, 0x200, 32);
+ task->data[0]++;
+ case 1:
+ if (++task->data[3] > 1)
+ {
+ task->data[3] = 0;
+ if (++task->data[4] & 1)
+ {
+ gSprites[task->data[15]].pos2.x = 3;
+ gSprites[task->data[15]].pos1.y++;
+ }
+ else
+ {
+ gSprites[task->data[15]].pos2.x = -3;
+ }
+ }
+ if (sub_8079C74(task) == 0)
+ {
+ sub_8079A64(task->data[15]);
+ gSprites[task->data[15]].pos2.x = 0;
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ if (++task->data[3] > 4)
+ {
+ sub_8079C08(task, task->data[15], 224, 0x200, 384, 224, 8);
+ task->data[3] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 3:
+ if (sub_8079C74(task) == 0)
+ {
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 4:
+ sub_80D4418(task, taskId);
+ task->data[0]++;
+ case 5:
+ if (++task->data[3] > 1)
+ {
+ task->data[3] = 0;
+ if (++task->data[4] & 1)
+ gSprites[task->data[15]].pos2.y += 2;
+ else
+ gSprites[task->data[15]].pos2.y -= 2;
+ if (task->data[4] == 10)
+ {
+ sub_8079C08(task, task->data[15], 384, 224, 0x100, 0x100, 8);
+ task->data[3] = 0;
+ task->data[4] = 0;
+ task->data[0]++;
+ }
+ }
+ break;
+ case 6:
+ gSprites[task->data[15]].pos1.y--;
+ if (sub_8079C74(task) == 0)
+ {
+ sub_8078F40(task->data[15]);
+ gSprites[task->data[15]].pos1.y = task->data[5];
+ task->data[4] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 7:
+ if (task->data[2] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+u8 sub_80D4394(void)
+{
+ u8 i;
+ u16 hp;
+ u16 maxhp;
+ u16 partyIndex;
+ struct Pokemon *slot;
+
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker];
+ slot = &gPlayerParty[partyIndex];
+ maxhp = GetMonData(slot, MON_DATA_MAX_HP);
+ hp = GetMonData(slot, MON_DATA_HP);
+ maxhp /= 4;
+ }
+ else
+ {
+ partyIndex = gBattlerPartyIndexes[gBattleAnimAttacker];
+ slot = &gEnemyParty[partyIndex];
+ maxhp = GetMonData(slot, MON_DATA_MAX_HP);
+ hp = GetMonData(slot, MON_DATA_HP);
+ maxhp /= 4;
+ }
+ for (i = 0; i < 3; i++)
+ {
+ if (hp < maxhp * (i + 1))
+ return i;
+ }
+ return 3;
+}
+
+void sub_80D4418(struct Task *task, u8 taskId)
+{
+ s16 i;
+ s16 attackerCoordX = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
+ s16 attackerCoordY = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
+ s16 trigIndex = 172;
+ u8 subpriority = GetBattlerSubpriority(gBattleAnimAttacker) - 1;
+ s16 increment = 4 - task->data[1];
+ u8 spriteId;
+
+ if (increment <= 0)
+ increment = 1;
+ for (i = 0; i < 20; i += increment)
+ {
+ spriteId = CreateSprite(&gSpriteTemplate_83D9378, attackerCoordX, attackerCoordY, subpriority);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[1] = i;
+ gSprites[spriteId].data[2] = attackerCoordX * 16;
+ gSprites[spriteId].data[3] = attackerCoordY * 16;
+ gSprites[spriteId].data[4] = Cos(trigIndex, 64);
+ gSprites[spriteId].data[5] = Sin(trigIndex, 64);
+ gSprites[spriteId].data[6] = taskId;
+ gSprites[spriteId].data[7] = 2;
+ if (task->data[2] & 1)
+ sub_80D452C(&gSprites[spriteId]);
+ task->data[2]++;
+ }
+ trigIndex = (trigIndex + increment * 2);
+ trigIndex &= 0xFF;
+ }
+}
+
+void sub_80D452C(struct Sprite *sprite)
+{
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->data[4] += (sprite->data[1] % 6) * 3;
+ sprite->data[5] += (sprite->data[1] % 3) * 3;
+ sprite->data[0]++;
+ case 1:
+ sprite->data[2] += sprite->data[4];
+ sprite->data[3] += sprite->data[5];
+ sprite->pos1.x = sprite->data[2] >> 4;
+ sprite->pos1.y = sprite->data[3] >> 4;
+ if (sprite->pos1.x < -8 || sprite->pos1.x > 248 || sprite->pos1.y < -8 || sprite->pos1.y > 120)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ DestroySprite(sprite);
+ }
+ break;
+ }
+}
+
+void sub_80D45D8(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[1] = sub_80D4394();
+ if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
+ {
+ task->data[4] = 136;
+ task->data[6] = 40;
+ }
+ else
+ {
+ task->data[4] = 16;
+ task->data[6] = 80;
+ }
+ task->data[5] = 98;
+ task->data[7] = task->data[4] + 49;
+ task->data[12] = task->data[1] * 5 + 5;
+ task->func = sub_80D463C;
+}
+
+void sub_80D463C(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+ u8 taskId2;
+
+ switch (task->data[0])
+ {
+ case 0:
+ if (++task->data[2] > 2)
+ {
+ task->data[2] = 0;
+ sub_80D472C(task, taskId);
+ }
+ if (task->data[10] != 0 && task->data[13] == 0)
+ {
+ gBattleAnimArgs[0] = 1;
+ gBattleAnimArgs[1] = 0;
+ gBattleAnimArgs[2] = 12;
+ taskId2 = CreateTask(sub_80E1864, 80);
+ if (taskId2 != 0xFF)
+ {
+ gTasks[taskId2].func(taskId2);
+ gAnimVisualTaskCount++;
+ }
+ gBattleAnimArgs[0] = 3;
+ taskId2 = CreateTask(sub_80E1864, 80);
+ if (taskId2 != 0xFF)
+ {
+ gTasks[taskId2].func(taskId2);
+ gAnimVisualTaskCount++;
+ }
+ task->data[13] = 1;
+ }
+ if (task->data[11] >= task->data[12])
+ task->data[0]++;
+ break;
+ case 1:
+ if (task->data[9] == 0)
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80D472C(struct Task *task, u8 taskId)
+{
+ u16 yPosArg = ((gSineTable[task->data[8]] + 3) >> 4) + task->data[6];
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83D9378, task->data[7], 0, 0);
+
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].callback = sub_80D47D0;
+ gSprites[spriteId].data[5] = yPosArg;
+ gSprites[spriteId].data[6] = taskId;
+ gSprites[spriteId].data[7] = 9;
+ task->data[9]++;
+ }
+ task->data[11]++;
+ task->data[8] = (task->data[8] + 39) & 0xFF;
+ task->data[7] = ((task->data[7] * 0x41c64e6d + 0x3039) % task->data[5]) + task->data[4];
+}
+
+void sub_80D47D0(struct Sprite *sprite)
+{
+ if (sprite->data[0] == 0)
+ {
+ sprite->pos1.y += 8;
+ if (sprite->pos1.y >= sprite->data[5])
+ {
+ gTasks[sprite->data[6]].data[10] = 1;
+ sprite->data[1] = CreateSprite(&gBattleAnimSpriteTemplate_83DB4D8, sprite->pos1.x, sprite->pos1.y, 1);
+ if (sprite->data[1] != MAX_SPRITES)
+ {
+ StartSpriteAffineAnim(&gSprites[sprite->data[1]], 3);
+ gSprites[sprite->data[1]].data[6] = sprite->data[6];
+ gSprites[sprite->data[1]].data[7] = sprite->data[7];
+ gSprites[sprite->data[1]].callback = sub_80D487C;
+ }
+ DestroySprite(sprite);
+ }
+ }
+}
+
+void sub_80D487C(struct Sprite *sprite)
+{
+ if (++sprite->data[1] > 1)
+ {
+ sprite->data[1] = 0;
+ sprite->invisible ^= 1;
+ if (++sprite->data[2] == 12)
+ {
+ gTasks[sprite->data[6]].data[sprite->data[7]]--;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ DestroySprite(sprite);
+ }
+ }
+}
+
+void sub_80D48F4(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[3] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
+ task->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
+ task->data[7] = (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) ? 1 : -1;
+ if (IsContest())
+ task->data[7] *= -1;
+ task->data[5] = task->data[3] + task->data[7] * 8;
+ task->data[6] = task->data[4] - task->data[7] * 8;
+ task->data[9] = -32;
+ task->data[1] = 0;
+ task->data[0] = 0;
+ task->func = sub_80D4988;
+}
+
+void sub_80D4988(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ sub_80D4AD0(task);
+ if (task->data[10] != 0)
+ task->data[0]++;
+ break;
+ case 1:
+ sub_80D4AD0(task);
+ if (++task->data[1] > 16)
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 2:
+ sub_80D4AD0(task);
+ task->data[5] += task->data[7] * 6;
+ if (!(task->data[5] >= -16 && task->data[5] <= 256))
+ {
+ if (++task->data[12] > 2)
+ {
+ task->data[13] = 1;
+ task->data[0] = 6;
+ task->data[1] = 0;
+ }
+ else
+ {
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ }
+ break;
+ case 3:
+ sub_80D4AD0(task);
+ task->data[6] -= task->data[7] * 2;
+ if (++task->data[1] > 7)
+ task->data[0]++;
+ break;
+ case 4:
+ sub_80D4AD0(task);
+ task->data[5] -= task->data[7] * 6;
+ if (!(task->data[5] >= -16 && task->data[5] <= 256))
+ {
+ task->data[12]++;
+ task->data[1] = 0;
+ task->data[0]++;
+ }
+ break;
+ case 5:
+ sub_80D4AD0(task);
+ task->data[6] -= task->data[7] * 2;
+ if (++task->data[1] > 7)
+ task->data[0] = 2;
+ break;
+ case 6:
+ if (task->data[8] == 0)
+ task->data[0]++;
+ break;
+ default:
+ DestroyAnimVisualTask(taskId);
+ break;
+ }
+}
+
+void sub_80D4AD0(struct Task *task)
+{
+ u8 spriteId;
+
+ if (++task->data[2] > 1)
+ {
+ task->data[2] = 0;
+ spriteId = CreateSprite(&gSpriteTemplate_83D9378, task->data[3], task->data[4], 10);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].data[0] = 16;
+ gSprites[spriteId].data[2] = task->data[5];
+ gSprites[spriteId].data[4] = task->data[6];
+ gSprites[spriteId].data[5] = task->data[9];
+ InitAnimArcTranslation(&gSprites[spriteId]);
+ gSprites[spriteId].callback = sub_80D4B3C;
+ task->data[8]++;
+ }
+ }
+}
+
+void sub_80D4B3C(struct Sprite *sprite)
+{
+ if (TranslateAnimArc(sprite))
+ {
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->data[0] = 6;
+ sprite->data[2] = (Random() & 0x1F) - 16 + sprite->pos1.x;
+ sprite->data[4] = (Random() & 0x1F) - 16 + sprite->pos1.y;
+ sprite->data[5] = ~(Random() & 7);
+ InitAnimArcTranslation(sprite);
+ sprite->callback = sub_80D4BA4;
+ }
+}
+
+void sub_80D4BA4(struct Sprite *sprite)
+{
+ u16 i;
+
+ if (TranslateAnimArc(sprite))
+ {
+ for (i = 0; i < NUM_TASKS; i++)
+ {
+ if (gTasks[i].func == sub_80D4988)
+ {
+ gTasks[i].data[10] = 1;
+ gTasks[i].data[8]--;
+ DestroySprite(sprite);
+ }
+ }
+ }
+}
+
+void sub_80D4BF0(struct Sprite *sprite)
+{
+ sprite->pos1.x = gBattleAnimArgs[0];
+ sprite->pos1.y = gBattleAnimArgs[1];
+ sprite->data[0] = gBattleAnimArgs[2];
+ sprite->data[1] = gBattleAnimArgs[3];
+ sprite->data[2] = gBattleAnimArgs[4];
+ sprite->data[3] = gBattleAnimArgs[5];
+ sprite->callback = sub_80D4C18;
+}
+
+void sub_80D4C18(struct Sprite *sprite)
+{
+ sprite->data[4] -= sprite->data[0];
+ sprite->pos2.y = sprite->data[4] / 10;
+ sprite->data[5] = (sprite->data[5] + sprite->data[1]) & 0xFF;
+ sprite->pos2.x = Sin(sprite->data[5], sprite->data[2]);
+ if (--sprite->data[3] == 0)
+ DestroyAnimSprite(sprite);
+}
+
+void sub_80D4C64(struct Sprite *sprite)
+{
+ sprite->data[3] += sprite->data[1];
+ sprite->data[4] += sprite->data[2];
+ sprite->pos2.x = sprite->data[3] >> 7;
+ sprite->pos2.y = sprite->data[4] >> 7;
+ if (--sprite->data[0] == 0)
+ {
+ FreeSpriteOamMatrix(sprite);
+ DestroySprite(sprite);
+ }
+}
+
+void sub_80D4CA4(struct Sprite *sprite)
+{
+ InitAnimSpritePos(sprite, TRUE);
+ sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
+ sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
+ sprite->data[3] = gBattleAnimArgs[2];
+ sprite->data[4] = gBattleAnimArgs[3];
+ sprite->callback = sub_80D4CEC;
+}
+
+void sub_80D4CEC(struct Sprite *sprite)
+{
+ int xDiff = sprite->data[1] - sprite->pos1.x;
+ int yDiff = sprite->data[2] - sprite->pos1.y;
+
+ sprite->pos2.x = (sprite->data[0] * xDiff) / sprite->data[3];
+ sprite->pos2.y = (sprite->data[0] * yDiff) / sprite->data[3];
+ if (++sprite->data[5] == sprite->data[4])
+ {
+ sprite->data[5] = 0;
+ sub_80D4D64(sprite, xDiff, yDiff);
+ }
+ if (sprite->data[3] == sprite->data[0])
+ DestroyAnimSprite(sprite);
+ sprite->data[0]++;
+}
+
+#ifdef NONMATCHING
+void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff)
+{
+ s16 something = sprite->data[0] / 2;
+ s16 combinedX = sprite->pos1.x + sprite->pos2.x;
+ s16 combinedY = sprite->pos1.y + sprite->pos2.y;
+ s16 randomSomethingY = yDiff + (Random2() % 10) - 5;
+ s16 randomSomethingX = -xDiff + (Random2() % 10) - 5;
+ s16 i;
+ u8 spriteId;
+
+ for (i = 0; i <= 0; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_08595310, combinedX, combinedY + something, 130);
+ gSprites[spriteId].data[0] = 20;
+ gSprites[spriteId].data[1] = randomSomethingY;
+ gSprites[spriteId].subpriority = GetBattlerSubpriority(gBattleAnimAttacker) - 1;
+ if (randomSomethingX < 0)
+ gSprites[spriteId].data[2] = -randomSomethingX;
+ else
+ gSprites[spriteId].data[2] = randomSomethingX;
+ }
+ for (i = 0; i <= 0; i++)
+ {
+ spriteId = CreateSprite(&gUnknown_08595310, combinedX, combinedY - something, 130);
+ gSprites[spriteId].data[0] = 20;
+ gSprites[spriteId].data[1] = randomSomethingY;
+ gSprites[spriteId].subpriority = GetBattlerSubpriority(gBattleAnimAttacker) - 1;
+ if (randomSomethingX > 0)
+ gSprites[spriteId].data[2] = -randomSomethingX;
+ else
+ gSprites[spriteId].data[2] = randomSomethingX;
+ }
+}
+#else
+NAKED
+void sub_80D4D64(struct Sprite *sprite, int xDiff, int yDiff)
+{
+ asm_unified("push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x18\n\
+ adds r4, r1, 0\n\
+ adds r5, r2, 0\n\
+ movs r2, 0x2E\n\
+ ldrsh r1, [r0, r2]\n\
+ lsrs r2, r1, 31\n\
+ adds r1, r2\n\
+ lsls r1, 15\n\
+ lsrs r1, 16\n\
+ str r1, [sp]\n\
+ ldrh r1, [r0, 0x24]\n\
+ ldrh r3, [r0, 0x20]\n\
+ adds r1, r3\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ mov r8, r1\n\
+ ldrh r1, [r0, 0x26]\n\
+ ldrh r0, [r0, 0x22]\n\
+ adds r1, r0\n\
+ lsls r1, 16\n\
+ lsrs r1, 16\n\
+ mov r10, r1\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0xA\n\
+ bl __umodsi3\n\
+ adds r0, r5, r0\n\
+ subs r0, 0x5\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ mov r9, r0\n\
+ bl Random\n\
+ negs r4, r4\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0xA\n\
+ bl __umodsi3\n\
+ adds r4, r0\n\
+ subs r4, 0x5\n\
+ lsls r4, 16\n\
+ lsrs r7, r4, 16\n\
+ movs r6, 0\n\
+ mov r0, r8\n\
+ lsls r0, 16\n\
+ mov r8, r0\n\
+ mov r1, r10\n\
+ lsls r1, 16\n\
+ str r1, [sp, 0xC]\n\
+ ldr r2, [sp]\n\
+ lsls r2, 16\n\
+ str r2, [sp, 0x10]\n\
+ asrs r1, 16\n\
+ lsls r0, r7, 16\n\
+ asrs r5, r0, 16\n\
+ str r0, [sp, 0x14]\n\
+ negs r3, r5\n\
+ str r3, [sp, 0x4]\n\
+ asrs r0, r2, 16\n\
+ adds r1, r0\n\
+ lsls r1, 16\n\
+ mov r10, r1\n\
+_080D4DF2:\n\
+ ldr r0, =gSpriteTemplate_83D9420\n\
+ mov r2, r8\n\
+ asrs r1, r2, 16\n\
+ mov r3, r10\n\
+ asrs r2, r3, 16\n\
+ movs r3, 0x82\n\
+ bl CreateSprite\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ ldr r1, =gSprites\n\
+ lsls r0, r2, 4\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ adds r4, r0, r1\n\
+ movs r0, 0x14\n\
+ strh r0, [r4, 0x2E]\n\
+ mov r0, r9\n\
+ strh r0, [r4, 0x30]\n\
+ ldr r0, =gBattleAnimAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSubpriority\n\
+ subs r0, 0x1\n\
+ adds r1, r4, 0\n\
+ adds r1, 0x43\n\
+ strb r0, [r1]\n\
+ cmp r5, 0\n\
+ bge _080D4E40\n\
+ mov r1, sp\n\
+ ldrh r1, [r1, 0x4]\n\
+ strh r1, [r4, 0x32]\n\
+ b _080D4E42\n\
+ .align 2, 0\n\
+ .pool\n\
+_080D4E40:\n\
+ strh r7, [r4, 0x32]\n\
+_080D4E42:\n\
+ lsls r0, r6, 16\n\
+ movs r2, 0x80\n\
+ lsls r2, 9\n\
+ adds r0, r2\n\
+ lsrs r6, r0, 16\n\
+ cmp r0, 0\n\
+ ble _080D4DF2\n\
+ movs r6, 0\n\
+ ldr r3, [sp, 0xC]\n\
+ asrs r1, r3, 16\n\
+ ldr r0, [sp, 0x14]\n\
+ asrs r5, r0, 16\n\
+ negs r2, r5\n\
+ str r2, [sp, 0x8]\n\
+ ldr r3, [sp, 0x10]\n\
+ asrs r0, r3, 16\n\
+ subs r1, r0\n\
+ lsls r1, 16\n\
+ mov r10, r1\n\
+_080D4E68:\n\
+ ldr r0, =gSpriteTemplate_83D9420\n\
+ mov r2, r8\n\
+ asrs r1, r2, 16\n\
+ mov r3, r10\n\
+ asrs r2, r3, 16\n\
+ movs r3, 0x82\n\
+ bl CreateSprite\n\
+ lsls r0, 24\n\
+ lsrs r2, r0, 24\n\
+ ldr r1, =gSprites\n\
+ lsls r0, r2, 4\n\
+ adds r0, r2\n\
+ lsls r0, 2\n\
+ adds r4, r0, r1\n\
+ movs r0, 0x14\n\
+ strh r0, [r4, 0x2E]\n\
+ mov r0, r9\n\
+ strh r0, [r4, 0x30]\n\
+ ldr r0, =gBattleAnimAttacker\n\
+ ldrb r0, [r0]\n\
+ bl GetBattlerSubpriority\n\
+ subs r0, 0x1\n\
+ adds r1, r4, 0\n\
+ adds r1, 0x43\n\
+ strb r0, [r1]\n\
+ cmp r5, 0\n\
+ ble _080D4EB8\n\
+ mov r1, sp\n\
+ ldrh r1, [r1, 0x8]\n\
+ strh r1, [r4, 0x32]\n\
+ b _080D4EBA\n\
+ .align 2, 0\n\
+ .pool\n\
+_080D4EB8:\n\
+ strh r7, [r4, 0x32]\n\
+_080D4EBA:\n\
+ lsls r0, r6, 16\n\
+ movs r2, 0x80\n\
+ lsls r2, 9\n\
+ adds r0, r2\n\
+ lsrs r6, r0, 16\n\
+ cmp r0, 0\n\
+ ble _080D4E68\n\
+ add sp, 0x18\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n");
+}
+#endif
diff --git a/src/battle/anim/withdraw.c b/src/battle/anim/withdraw.c
index a1de45d15..f5babd361 100644
--- a/src/battle/anim/withdraw.c
+++ b/src/battle/anim/withdraw.c
@@ -17,7 +17,7 @@ static void sub_80CF514(u8 taskId);
void sub_80CF4D8(u8 taskId)
{
- sub_8078E70(gBankSpriteIds[gBattleAnimAttacker], 0);
+ PrepareBattlerSpriteForRotScale(gBankSpriteIds[gBattleAnimAttacker], 0);
gTasks[taskId].func = sub_80CF514;
}
diff --git a/src/battle/battle_anim_80A7E7C.c b/src/battle/battle_anim_80A7E7C.c
index 7b3e197d7..5e713a3a7 100644
--- a/src/battle/battle_anim_80A7E7C.c
+++ b/src/battle/battle_anim_80A7E7C.c
@@ -847,7 +847,7 @@ void AnimTask_ScaleMonAndRestore(u8 taskId)
{
u8 spriteId;
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[3]);
- sub_8078E70(spriteId, gBattleAnimArgs[4]);
+ PrepareBattlerSpriteForRotScale(spriteId, gBattleAnimArgs[4]);
TASK.data[0] = gBattleAnimArgs[0];
TASK.data[1] = gBattleAnimArgs[1];
TASK.data[2] = gBattleAnimArgs[2];
@@ -887,7 +887,7 @@ void sub_80A8E04(u8 taskId)
{
u8 spriteId;
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
- sub_8078E70(spriteId, 0);
+ PrepareBattlerSpriteForRotScale(spriteId, 0);
TASK.data[1] = 0;
TASK.data[2] = gBattleAnimArgs[0];
if (gBattleAnimArgs[3] != 1)
@@ -931,7 +931,7 @@ void sub_80A8EFC(u8 taskId)
{
u8 spriteId;
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
- sub_8078E70(spriteId, 0);
+ PrepareBattlerSpriteForRotScale(spriteId, 0);
TASK.data[1] = 0;
TASK.data[2] = gBattleAnimArgs[0];
if (gBattleAnimArgs[2] == 0)
diff --git a/src/battle/battle_anim_812C144.c b/src/battle/battle_anim_812C144.c
index bae4eef1d..4a5533dce 100644
--- a/src/battle/battle_anim_812C144.c
+++ b/src/battle/battle_anim_812C144.c
@@ -2070,7 +2070,7 @@ static void sub_812D3AC(struct Sprite *sprite)
case 0:
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
- sub_8078E70(spriteId, 0);
+ PrepareBattlerSpriteForRotScale(spriteId, 0);
sprite->data[1] = 256;
sprite->data[2] = 256;
sprite->data[0]++;
@@ -2753,7 +2753,7 @@ void sub_812E568(u8 taskId)
task->data[5] *= -1;
}
- sub_8078E70(task->data[15], 0);
+ PrepareBattlerSpriteForRotScale(task->data[15], 0);
task->func = sub_812E638;
}
@@ -2867,7 +2867,7 @@ void sub_812E860(u8 taskId)
task->data[14] = 0x800;
task->data[15] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
- sub_8078E70(task->data[15], 0);
+ PrepareBattlerSpriteForRotScale(task->data[15], 0);
task->func = sub_812E8B4;
}
@@ -2989,7 +2989,7 @@ void sub_812EB10(u8 taskId)
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
gTasks[taskId].data[10] = spriteId;
- sub_8078E70(spriteId, 0);
+ PrepareBattlerSpriteForRotScale(spriteId, 0);
switch (gBattleAnimArgs[1])
{
@@ -4945,7 +4945,7 @@ void sub_81312E4(u8 taskId)
if (gTasks[taskId].data[0] == 0)
{
- sub_8078E70(spriteId, 0);
+ PrepareBattlerSpriteForRotScale(spriteId, 0);
gTasks[taskId].data[1] = 0x100;
gTasks[taskId].data[2] = 0x100;
gTasks[taskId].data[0]++;
diff --git a/src/battle/battle_anim_813F0F4.c b/src/battle/battle_anim_813F0F4.c
index ed3e6d642..9ea0585d1 100755
--- a/src/battle/battle_anim_813F0F4.c
+++ b/src/battle/battle_anim_813F0F4.c
@@ -569,7 +569,7 @@ void sub_813F798(u8 taskId)
switch (gTasks[taskId].data[0])
{
case 0:
- sub_8078E70(spriteId, 0);
+ PrepareBattlerSpriteForRotScale(spriteId, 0);
gTasks[taskId].data[10] = 0x100;
gTasks[taskId].data[0]++;
break;
@@ -829,7 +829,7 @@ static void sub_813FEC8(struct Sprite *sprite)
switch (gTasks[taskId].data[0])
{
case 0:
- sub_8078E70(spriteId, 0);
+ PrepareBattlerSpriteForRotScale(spriteId, 0);
gTasks[taskId].data[10] = 256;
gUnknown_03005F0C = 28;
gUnknown_03005F14 = (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) - (sprite->pos1.y + sprite->pos2.y);
diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c
index 31bf4612d..1f73b64b1 100644
--- a/src/rom_8077ABC.c
+++ b/src/rom_8077ABC.c
@@ -1159,7 +1159,7 @@ bool8 sub_8078E38()
return FALSE;
}
-void sub_8078E70(u8 sprite, u8 objMode)
+void PrepareBattlerSpriteForRotScale(u8 sprite, u8 objMode)
{
u8 r7 = gSprites[sprite].data[0];
@@ -1647,7 +1647,7 @@ void sub_80798F4(struct Task *task, u8 a2, const void *a3)
task->data[11] = 0x100;
task->data[12] = 0;
sub_8079BF4(&task->data[13], &task->data[14], a3);
- sub_8078E70(a2, 0);
+ PrepareBattlerSpriteForRotScale(a2, 0);
}
bool8 sub_807992C(struct Task *task)