2018-10-25 23:46:23 +02:00
|
|
|
#include "global.h"
|
|
|
|
#include "battle_anim.h"
|
2018-12-09 09:14:07 +01:00
|
|
|
#include "gpu_regs.h"
|
2018-10-25 23:46:23 +02:00
|
|
|
#include "constants/rgb.h"
|
2018-12-09 09:14:07 +01:00
|
|
|
#include "constants/songs.h"
|
|
|
|
#include "sound.h"
|
|
|
|
#include "trig.h"
|
2018-10-25 23:46:23 +02:00
|
|
|
|
2018-12-09 09:14:07 +01:00
|
|
|
static void sub_811160C(struct Sprite *);
|
|
|
|
static void sub_8111674(struct Sprite *);
|
|
|
|
static void sub_81116E8(struct Sprite *);
|
|
|
|
static void sub_8111764(struct Sprite *);
|
|
|
|
static void sub_81117F4(struct Sprite *);
|
|
|
|
static void sub_8111814(struct Sprite *);
|
|
|
|
static void sub_8111914(u8 taskId);
|
|
|
|
static void sub_811196C(u8 taskId);
|
|
|
|
static void InitAnimShadowBall(struct Sprite *);
|
|
|
|
static void AnimShadowBallStep(struct Sprite *);
|
|
|
|
static void sub_8111B9C(struct Sprite *);
|
|
|
|
static void sub_8111BB4(struct Sprite *);
|
2018-10-25 23:46:23 +02:00
|
|
|
extern void sub_8112264(struct Sprite *);
|
|
|
|
extern void sub_81129F0(struct Sprite *);
|
|
|
|
extern void sub_8112B78(struct Sprite *);
|
|
|
|
extern void sub_8112E9C(struct Sprite *);
|
|
|
|
extern void sub_8112F60(struct Sprite *);
|
|
|
|
|
|
|
|
const union AffineAnimCmd gUnknown_08596CF8[] =
|
|
|
|
{
|
|
|
|
AFFINEANIMCMD_FRAME(0x1E, 0x1E, 10, 5),
|
|
|
|
AFFINEANIMCMD_FRAME(0xFFE2, 0xFFE2, 10, 5),
|
|
|
|
AFFINEANIMCMD_JUMP(0),
|
|
|
|
};
|
|
|
|
|
|
|
|
const union AffineAnimCmd *const gUnknown_08596D10[] =
|
|
|
|
{
|
|
|
|
gUnknown_08596CF8,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gUnknown_08596D14 =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_YELLOW_BALL,
|
|
|
|
.paletteTag = ANIM_TAG_YELLOW_BALL,
|
|
|
|
.oam = &gUnknown_085249CC,
|
|
|
|
.anims = gDummySpriteAnimTable,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gUnknown_08596D10,
|
|
|
|
.callback = sub_811160C,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gUnknown_08596D2C =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_YELLOW_BALL,
|
|
|
|
.paletteTag = ANIM_TAG_YELLOW_BALL,
|
|
|
|
.oam = &gUnknown_08524A2C,
|
|
|
|
.anims = gDummySpriteAnimTable,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = sub_81117F4,
|
|
|
|
};
|
|
|
|
|
|
|
|
const union AffineAnimCmd gUnknown_08596D44[] =
|
|
|
|
{
|
|
|
|
AFFINEANIMCMD_FRAME(0x0, 0x0, 10, 1),
|
|
|
|
AFFINEANIMCMD_JUMP(0),
|
|
|
|
};
|
|
|
|
|
|
|
|
const union AffineAnimCmd *const gUnknown_08596D54[] =
|
|
|
|
{
|
|
|
|
gUnknown_08596D44,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gUnknown_08596D58 =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_SHADOW_BALL,
|
|
|
|
.paletteTag = ANIM_TAG_SHADOW_BALL,
|
|
|
|
.oam = &gUnknown_08524974,
|
|
|
|
.anims = gDummySpriteAnimTable,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gUnknown_08596D54,
|
2018-12-09 09:14:07 +01:00
|
|
|
.callback = InitAnimShadowBall,
|
2018-10-25 23:46:23 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
const union AnimCmd gUnknown_08596D70[] =
|
|
|
|
{
|
|
|
|
ANIMCMD_FRAME(0, 2),
|
|
|
|
ANIMCMD_FRAME(8, 2),
|
|
|
|
ANIMCMD_FRAME(16, 2),
|
|
|
|
ANIMCMD_FRAME(24, 2),
|
|
|
|
ANIMCMD_FRAME(32, 2),
|
|
|
|
ANIMCMD_END,
|
|
|
|
};
|
|
|
|
|
|
|
|
const union AnimCmd *const gUnknown_08596D88[] =
|
|
|
|
{
|
|
|
|
gUnknown_08596D70,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gUnknown_08596D8C =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_LICK,
|
|
|
|
.paletteTag = ANIM_TAG_LICK,
|
|
|
|
.oam = &gUnknown_08524954,
|
|
|
|
.anims = gUnknown_08596D88,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = sub_8111B9C,
|
|
|
|
};
|
|
|
|
|
|
|
|
const union AffineAnimCmd gUnknown_08596DA4[] =
|
|
|
|
{
|
|
|
|
AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
|
|
|
|
AFFINEANIMCMD_END,
|
|
|
|
};
|
|
|
|
|
|
|
|
const union AffineAnimCmd *const gUnknown_08596DB4[] =
|
|
|
|
{
|
|
|
|
gUnknown_08596DA4,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gUnknown_08596DB8 =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_WHITE_SHADOW,
|
|
|
|
.paletteTag = ANIM_TAG_WHITE_SHADOW,
|
|
|
|
.oam = &gUnknown_08524A5C,
|
|
|
|
.anims = gDummySpriteAnimTable,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = sub_8112264,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gUnknown_08596DD0 =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_NAIL,
|
|
|
|
.paletteTag = ANIM_TAG_NAIL,
|
|
|
|
.oam = &gUnknown_08524A54,
|
|
|
|
.anims = gDummySpriteAnimTable,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = sub_81129F0,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gBattleAnimSpriteTemplate_8596DE8 =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_GHOSTLY_SPIRIT,
|
|
|
|
.paletteTag = ANIM_TAG_GHOSTLY_SPIRIT,
|
|
|
|
.oam = &gUnknown_08524A34,
|
|
|
|
.anims = gDummySpriteAnimTable,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = sub_8112B78,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gBattleAnimSpriteTemplate_8596E00 =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_DEVIL,
|
|
|
|
.paletteTag = ANIM_TAG_DEVIL,
|
|
|
|
.oam = &gUnknown_08524A34,
|
|
|
|
.anims = gDummySpriteAnimTable,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = sub_8112B78,
|
|
|
|
};
|
|
|
|
|
|
|
|
const union AnimCmd gUnknown_08596E18[] =
|
|
|
|
{
|
|
|
|
ANIMCMD_FRAME(0, 4),
|
|
|
|
ANIMCMD_FRAME(8, 4),
|
|
|
|
ANIMCMD_FRAME(16, 4),
|
|
|
|
ANIMCMD_FRAME(24, 4),
|
|
|
|
ANIMCMD_JUMP(0),
|
|
|
|
};
|
|
|
|
|
|
|
|
const union AnimCmd *const gUnknown_08596E2C[] =
|
|
|
|
{
|
|
|
|
gUnknown_08596E18,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gUnknown_08596E30 =
|
|
|
|
{
|
|
|
|
.tileTag = ANIM_TAG_PURPLE_FLAME,
|
|
|
|
.paletteTag = ANIM_TAG_PURPLE_FLAME,
|
|
|
|
.oam = &gUnknown_08524A74,
|
|
|
|
.anims = gUnknown_08596E2C,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = sub_8112E9C,
|
|
|
|
};
|
|
|
|
|
|
|
|
const struct SpriteTemplate gUnknown_08596E48 =
|
|
|
|
{
|
|
|
|
.tileTag = 0,
|
|
|
|
.paletteTag = 0,
|
|
|
|
.oam = &gDummyOamData,
|
|
|
|
.anims = gDummySpriteAnimTable,
|
|
|
|
.images = NULL,
|
|
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
|
|
.callback = sub_8112F60,
|
|
|
|
};
|
2018-12-09 09:14:07 +01:00
|
|
|
|
|
|
|
static void sub_811160C(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
InitAnimSpritePos(sprite, 1);
|
|
|
|
sprite->data[0] = gBattleAnimArgs[2];
|
|
|
|
sprite->data[1] = sprite->pos1.x;
|
|
|
|
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
|
|
|
sprite->data[3] = sprite->pos1.y;
|
|
|
|
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
|
|
|
sub_80A6FD4(sprite);
|
|
|
|
sprite->callback = sub_8111674;
|
|
|
|
sprite->data[6] = 16;
|
|
|
|
SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40);
|
|
|
|
SetGpuReg(REG_OFFSET_BLDALPHA, sprite->data[6]);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_8111674(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
s16 r0;
|
|
|
|
s16 r2;
|
|
|
|
sub_8111764(sprite);
|
|
|
|
if (TranslateAnimLinear(sprite))
|
|
|
|
{
|
|
|
|
sprite->callback = sub_81116E8;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
sprite->pos2.x += Sin(sprite->data[5], 10);
|
|
|
|
sprite->pos2.y += Cos(sprite->data[5], 15);
|
|
|
|
r2 = sprite->data[5];
|
|
|
|
sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
|
|
|
|
r0 = sprite->data[5];
|
|
|
|
if (r2 != 0 && r2 <= 196)
|
|
|
|
return;
|
|
|
|
if (r0 <= 0)
|
|
|
|
return;
|
|
|
|
PlaySE12WithPanning(SE_W109, gUnknown_02038440);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_81116E8(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
s16 r2;
|
|
|
|
s16 r0;
|
|
|
|
sprite->data[0] = 1;
|
|
|
|
TranslateAnimLinear(sprite);
|
|
|
|
sprite->pos2.x += Sin(sprite->data[5], 10);
|
|
|
|
sprite->pos2.y += Cos(sprite->data[5], 15);
|
|
|
|
|
|
|
|
r2 = sprite->data[5];
|
|
|
|
sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
|
|
|
|
r0 = sprite->data[5];
|
|
|
|
|
|
|
|
if (r2 == 0 || r2 > 196)
|
|
|
|
{
|
|
|
|
if (r0 > 0)
|
|
|
|
PlaySE(SE_W109);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sprite->data[6] == 0)
|
|
|
|
{
|
|
|
|
sprite->invisible = TRUE;
|
|
|
|
sprite->callback = sub_80A67F4;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
sub_8111764(sprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_8111764(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
|
|
|
|
s16 r0;
|
|
|
|
if (sprite->data[6] > 0xFF)
|
|
|
|
{
|
|
|
|
if (++sprite->data[6] == 0x10d)
|
|
|
|
sprite->data[6] = 0;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
r0 = sprite->data[7];
|
|
|
|
sprite->data[7]++;
|
|
|
|
|
|
|
|
if ((r0 & 0xFF) == 0)
|
|
|
|
{
|
|
|
|
sprite->data[7] &= 0xff00;
|
|
|
|
if ((sprite->data[7] & 0x100) != 0)
|
|
|
|
sprite->data[6]++;
|
|
|
|
else
|
|
|
|
sprite->data[6]--;
|
|
|
|
|
|
|
|
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], 16 - sprite->data[6]));
|
|
|
|
if (sprite->data[6] == 0 || sprite->data[6] == 16)
|
|
|
|
sprite->data[7] ^= 0x100;
|
|
|
|
if (sprite->data[6] == 0)
|
|
|
|
sprite->data[6] = 0x100;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_81117F4(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
sub_80A6980(sprite, TRUE);
|
|
|
|
sprite->callback = sub_8111814;
|
|
|
|
sprite->callback(sprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_8111814(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
u16 temp1;
|
|
|
|
sprite->pos2.x = Sin(sprite->data[0], 32);
|
|
|
|
sprite->pos2.y = Cos(sprite->data[0], 8);
|
|
|
|
temp1 = sprite->data[0] - 65;
|
|
|
|
if (temp1 <= 130)
|
|
|
|
sprite->oam.priority = 2;
|
|
|
|
else
|
|
|
|
sprite->oam.priority = 1;
|
|
|
|
sprite->data[0] = (sprite->data[0] + 19) & 0xFF;
|
|
|
|
sprite->data[2] += 80;
|
|
|
|
sprite->pos2.y += sprite->data[2] >> 8;
|
|
|
|
sprite->data[7] += 1;
|
|
|
|
if (sprite->data[7] == 61)
|
|
|
|
DestroyAnimSprite(sprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_811188C(u8 taskId)
|
|
|
|
{
|
|
|
|
u8 spriteId;
|
|
|
|
SetGpuReg(REG_OFFSET_BLDCNT, 0x3F40);
|
|
|
|
SetGpuReg(REG_OFFSET_BLDALPHA, 0x1000);
|
|
|
|
spriteId = GetAnimBattlerSpriteId(0);
|
|
|
|
sub_80A7270(spriteId, 1);
|
|
|
|
obj_id_set_rotscale(spriteId, 128, 128, 0);
|
|
|
|
gSprites[spriteId].invisible = FALSE;
|
|
|
|
gTasks[taskId].data[0] = 128;
|
|
|
|
gTasks[taskId].data[1] = *gBattleAnimArgs;
|
|
|
|
gTasks[taskId].data[2] = 0;
|
|
|
|
gTasks[taskId].data[3] = 16;
|
|
|
|
gTasks[taskId].func = sub_8111914;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_8111914(u8 taskId)
|
|
|
|
{
|
|
|
|
gTasks[taskId].data[10] += 1;
|
|
|
|
if (gTasks[taskId].data[10] == 3)
|
|
|
|
{
|
|
|
|
gTasks[taskId].data[10] = 0;
|
|
|
|
gTasks[taskId].data[2] += 1;
|
|
|
|
gTasks[taskId].data[3] -= 1;
|
|
|
|
SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[3] << 8 | gTasks[taskId].data[2]);
|
|
|
|
if (gTasks[taskId].data[2] != 9)
|
|
|
|
return;
|
|
|
|
|
|
|
|
gTasks[taskId].func = sub_811196C;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_811196C(u8 taskId)
|
|
|
|
{
|
|
|
|
u8 spriteId;
|
|
|
|
if (gTasks[taskId].data[1] > 0)
|
|
|
|
{
|
|
|
|
gTasks[taskId].data[1] -= 1;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
spriteId = GetAnimBattlerSpriteId(0);
|
|
|
|
gTasks[taskId].data[0] += 8;
|
|
|
|
if (gTasks[taskId].data[0] <= 0xFF)
|
|
|
|
{
|
|
|
|
obj_id_set_rotscale(spriteId, gTasks[taskId].data[0], gTasks[taskId].data[0], 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sub_80A7344(spriteId);
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
|
|
|
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Spins a sprite towards the target, pausing in the middle.
|
|
|
|
// Used in Shadow Ball.
|
|
|
|
// arg 0: duration step 1 (attacker -> center)
|
|
|
|
// arg 1: duration step 2 (spin center)
|
|
|
|
// arg 2: duration step 3 (center -> target)
|
|
|
|
static void InitAnimShadowBall(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
u16 r5, r6;
|
|
|
|
r5 = sprite->pos1.x;
|
|
|
|
r6 = sprite->pos1.y;
|
|
|
|
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
|
|
|
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
|
|
|
sprite->data[0] = 0;
|
|
|
|
sprite->data[1] = gBattleAnimArgs[0];
|
|
|
|
sprite->data[2] = gBattleAnimArgs[1];
|
|
|
|
sprite->data[3] = gBattleAnimArgs[2];
|
|
|
|
sprite->data[4] = sprite->pos1.x << 4;
|
|
|
|
sprite->data[5] = sprite->pos1.y << 4;
|
|
|
|
sprite->data[6] = (((s16)r5 - sprite->pos1.x) << 4) / (gBattleAnimArgs[0] << 1);
|
|
|
|
sprite->data[7] = (((s16)r6 - sprite->pos1.y) << 4) / (gBattleAnimArgs[0] << 1);
|
|
|
|
sprite->callback = AnimShadowBallStep;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void AnimShadowBallStep(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
switch (sprite->data[0])
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
sprite->data[4] += sprite->data[6];
|
|
|
|
sprite->data[5] += sprite->data[7];
|
|
|
|
sprite->pos1.x = sprite->data[4] >> 4;
|
|
|
|
sprite->pos1.y = sprite->data[5] >> 4;
|
|
|
|
sprite->data[1] -= 1;
|
|
|
|
if (sprite->data[1] > 0)
|
|
|
|
break;
|
|
|
|
sprite->data[0] += 1;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
sprite->data[2] -= 1;
|
|
|
|
if (sprite->data[2] > 0)
|
|
|
|
break;
|
|
|
|
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
|
|
|
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
|
|
|
sprite->data[4] = sprite->pos1.x << 4;
|
|
|
|
sprite->data[5] = sprite->pos1.y << 4;
|
|
|
|
sprite->data[6] = ((sprite->data[1] - sprite->pos1.x) << 4) / sprite->data[3];
|
|
|
|
sprite->data[7] = ((sprite->data[2] - sprite->pos1.y) << 4) / sprite->data[3];
|
|
|
|
sprite->data[0] += 1;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
sprite->data[4] += sprite->data[6];
|
|
|
|
sprite->data[5] += sprite->data[7];
|
|
|
|
sprite->pos1.x = sprite->data[4] >> 4;
|
|
|
|
sprite->pos1.y = sprite->data[5] >> 4;
|
|
|
|
sprite->data[3] -= 1;
|
|
|
|
if (sprite->data[3] > 0)
|
|
|
|
break;
|
|
|
|
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
|
|
|
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
|
|
|
sprite->data[0] += 1;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
move_anim_8074EE0(sprite);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_8111B9C(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
sub_80A6980(sprite, TRUE);
|
|
|
|
sprite->callback = sub_8111BB4;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_8111BB4(struct Sprite *sprite) {
|
|
|
|
|
|
|
|
s8 r5 = FALSE;
|
|
|
|
bool8 r6 = FALSE;
|
|
|
|
if(sprite->animEnded)
|
|
|
|
{
|
|
|
|
if(!(sprite->invisible))
|
|
|
|
sprite->invisible=TRUE;
|
|
|
|
switch(sprite->data[0])
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
if((sprite->data[1]) != 2)
|
|
|
|
break;
|
|
|
|
goto loc_08111C06;
|
|
|
|
case 1:
|
|
|
|
if((sprite->data[1]) == 4)
|
|
|
|
r5 = TRUE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
r6 = TRUE;
|
|
|
|
}
|
|
|
|
if(r5)
|
|
|
|
{
|
|
|
|
loc_08111C06:
|
|
|
|
sprite->invisible ^= 1;
|
|
|
|
sprite->data[2]++;
|
|
|
|
sprite->data[1] = 0;
|
|
|
|
if(sprite->data[2] == 5)
|
|
|
|
{
|
|
|
|
sprite->data[2] = 0;
|
|
|
|
sprite->data[0]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(r6)
|
|
|
|
DestroyAnimSprite(sprite);
|
|
|
|
else
|
|
|
|
sprite->data[1]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
void sub_80DE1B0(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task;
|
|
|
|
|
|
|
|
task = &gTasks[taskId];
|
|
|
|
task->data[0] = duplicate_obj_of_side_rel2move_in_transparent_mode(1);
|
|
|
|
if (task->data[0] < 0)
|
|
|
|
{
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
task->data[1] = 0;
|
|
|
|
task->data[2] = 15;
|
|
|
|
task->data[3] = 2;
|
|
|
|
task->data[4] = 0;
|
|
|
|
REG_BLDCNT = 0x3F40;
|
|
|
|
REG_BLDALPHA = (task->data[3] << 8) | task->data[2];
|
|
|
|
gSprites[task->data[0]].data[0] = 80;
|
|
|
|
if (GetBattlerSide(gAnimBankTarget) == 0)
|
|
|
|
{
|
|
|
|
gSprites[task->data[0]].data[1] = -144;
|
|
|
|
gSprites[task->data[0]].data[2] = 112;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gSprites[task->data[0]].data[1] = 144;
|
|
|
|
gSprites[task->data[0]].data[2] = -112;
|
|
|
|
}
|
|
|
|
gSprites[task->data[0]].data[3] = 0;
|
|
|
|
gSprites[task->data[0]].data[4] = 0;
|
|
|
|
StoreSpriteCallbackInData(&gSprites[task->data[0]], SpriteCallbackDummy);
|
|
|
|
gSprites[task->data[0]].callback = sub_8078394;
|
|
|
|
task->func = sub_80DE2DC;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DE2DC(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task;
|
|
|
|
|
|
|
|
task = &gTasks[taskId];
|
|
|
|
switch (task->data[4])
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
task->data[1] += 1;
|
|
|
|
task->data[5] = task->data[1] & 3;
|
|
|
|
if (task->data[5] == 1)
|
|
|
|
if (task->data[2] > 0)
|
|
|
|
task->data[2] -= 1;
|
|
|
|
if (task->data[5] == 3)
|
|
|
|
if (task->data[3] <= 15)
|
|
|
|
task->data[3] += 1;
|
|
|
|
REG_BLDALPHA = (task->data[3] << 8) | task->data[2];
|
|
|
|
if (task->data[3] != 16 || task->data[2] != 0)
|
|
|
|
break;
|
|
|
|
if (task->data[1] <= 80)
|
|
|
|
break;
|
|
|
|
obj_delete_but_dont_free_vram(&gSprites[task->data[0]]);
|
|
|
|
task->data[4] = 1;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (++task->data[6] <= 1)
|
|
|
|
break;
|
|
|
|
REG_BLDCNT = 0;
|
|
|
|
REG_BLDALPHA = 0;
|
|
|
|
task->data[4] += 1;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_80DE3AC(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task;
|
|
|
|
|
|
|
|
task = &gTasks[taskId];
|
|
|
|
task->data[15] = 0;
|
|
|
|
task->func = sub_80DE3D4;
|
|
|
|
task->func(taskId);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DE3D4(u8 taskId)
|
|
|
|
{
|
|
|
|
s16 startLine;
|
|
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
u8 position = GetBattlerPosition_permutated(gAnimBankTarget);
|
|
|
|
|
|
|
|
switch (task->data[15])
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
task->data[14] = AllocSpritePalette(0x2771);
|
|
|
|
if (task->data[14] == 0xFF)
|
|
|
|
{
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
task->data[0] = duplicate_obj_of_side_rel2move_in_transparent_mode(1);
|
|
|
|
if (task->data[0] < 0)
|
|
|
|
{
|
|
|
|
FreeSpritePaletteByTag(0x2771);
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gSprites[task->data[0]].oam.paletteNum = task->data[14];
|
|
|
|
gSprites[task->data[0]].oam.objMode = ST_OAM_OBJ_NORMAL;
|
|
|
|
gSprites[task->data[0]].oam.priority = 3;
|
|
|
|
task->data[1] = 0;
|
|
|
|
task->data[2] = 0;
|
|
|
|
task->data[3] = 16;
|
|
|
|
task->data[13] = GetAnimBattlerSpriteId(1);
|
|
|
|
task->data[4] = (gSprites[task->data[13]].oam.paletteNum + 16) * 16;
|
|
|
|
if (position == 1)
|
|
|
|
REG_DISPCNT &= 0xFDFF;
|
|
|
|
else
|
|
|
|
REG_DISPCNT &= 0xFBFF;
|
|
|
|
|
|
|
|
task->data[15]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
task->data[14] = (task->data[14] + 16) * 16;
|
|
|
|
CpuSet(&gPlttBufferUnfaded[task->data[4]], &gPlttBufferFaded[task->data[14]], 0x4000008);
|
|
|
|
BlendPalette(task->data[4], 16, 10, RGB(13, 0, 15));
|
|
|
|
task->data[15]++;
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
startLine = gSprites[task->data[13]].pos1.y + gSprites[task->data[13]].pos2.y - 32;
|
|
|
|
if (startLine < 0)
|
|
|
|
startLine = 0;
|
|
|
|
|
|
|
|
if (position == 1)
|
|
|
|
task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 4, 1);
|
|
|
|
else
|
|
|
|
task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 8, 1);
|
|
|
|
|
|
|
|
task->data[15]++;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
if (position == 1)
|
|
|
|
REG_BLDCNT = 0x3F42;
|
|
|
|
else
|
|
|
|
REG_BLDCNT = 0x3F44;
|
|
|
|
|
|
|
|
REG_BLDALPHA = 0x1000;
|
|
|
|
task->data[15]++;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
if (position == 1)
|
|
|
|
REG_DISPCNT |= DISPCNT_BG1_ON;
|
|
|
|
else
|
|
|
|
REG_DISPCNT |= DISPCNT_BG2_ON;
|
|
|
|
|
|
|
|
task->func = sub_80DE61C;
|
|
|
|
task->data[15]++;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
task->data[15]++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DE61C(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
task->data[1]++;
|
|
|
|
task->data[5] = task->data[1] & 1;
|
|
|
|
if (task->data[5] == 0)
|
|
|
|
task->data[2] = gSineTable[task->data[1]] / 18;
|
|
|
|
|
|
|
|
if (task->data[5] == 1)
|
|
|
|
task->data[3] = 16 - (gSineTable[task->data[1]] / 18);
|
|
|
|
|
|
|
|
REG_BLDALPHA = (task->data[3] << 8) | task->data[2];
|
|
|
|
if (task->data[1] == 128)
|
|
|
|
{
|
|
|
|
task->data[15] = 0;
|
|
|
|
task->func = sub_80DE6B0;
|
|
|
|
task->func(taskId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DE6B0(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
u8 position = GetBattlerPosition_permutated(gAnimBankTarget);
|
|
|
|
|
|
|
|
switch (task->data[15])
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
gScanlineEffect.state = 3;
|
|
|
|
task->data[14] = GetAnimBattlerSpriteId(1);
|
|
|
|
if (position == 1)
|
|
|
|
REG_DISPCNT &= 0xFDFF;
|
|
|
|
else
|
|
|
|
REG_DISPCNT &= 0xFBFF;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
BlendPalette(task->data[4], 16, 0, RGB(13, 0, 15));
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
gSprites[task->data[14]].invisible = 1;
|
|
|
|
obj_delete_but_dont_free_vram(&gSprites[task->data[0]]);
|
|
|
|
FreeSpritePaletteByTag(0x2771);
|
|
|
|
REG_BLDCNT = 0;
|
|
|
|
REG_BLDALPHA = 0;
|
|
|
|
if (position == 1)
|
|
|
|
REG_DISPCNT |= DISPCNT_BG1_ON;
|
|
|
|
else
|
|
|
|
REG_DISPCNT |= DISPCNT_BG2_ON;
|
|
|
|
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
task->data[15]++;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DE7B8(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
s16 battler1X, battler1Y;
|
|
|
|
s16 battler2X, battler2Y;
|
|
|
|
s16 yDiff;
|
|
|
|
|
|
|
|
if (gBattleAnimArgs[0] == 0)
|
|
|
|
{
|
|
|
|
battler1X = GetBattlerSpriteCoord(gAnimBankAttacker, 0);
|
|
|
|
battler1Y = GetBattlerSpriteCoord(gAnimBankAttacker, 1) + 28;
|
|
|
|
battler2X = GetBattlerSpriteCoord(gAnimBankTarget, 0);
|
|
|
|
battler2Y = GetBattlerSpriteCoord(gAnimBankTarget, 1) + 28;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
battler1X = GetBattlerSpriteCoord(gAnimBankTarget, 0);
|
|
|
|
battler1Y = GetBattlerSpriteCoord(gAnimBankTarget, 1) + 28;
|
|
|
|
battler2X = GetBattlerSpriteCoord(gAnimBankAttacker, 0);
|
|
|
|
battler2Y = GetBattlerSpriteCoord(gAnimBankAttacker, 1) + 28;
|
|
|
|
}
|
|
|
|
|
|
|
|
yDiff = battler2Y - battler1Y;
|
|
|
|
sprite->data[0] = battler1X * 16;
|
|
|
|
sprite->data[1] = battler1Y * 16;
|
|
|
|
sprite->data[2] = ((battler2X - battler1X) * 16) / gBattleAnimArgs[1];
|
|
|
|
sprite->data[3] = (yDiff * 16) / gBattleAnimArgs[1];
|
|
|
|
sprite->data[4] = gBattleAnimArgs[1];
|
|
|
|
sprite->data[5] = battler2X;
|
|
|
|
sprite->data[6] = battler2Y;
|
|
|
|
sprite->data[7] = sprite->data[4] / 2;
|
|
|
|
sprite->oam.priority = 2;
|
|
|
|
sprite->pos1.x = battler1X;
|
|
|
|
sprite->pos1.y = battler1Y;
|
|
|
|
sprite->callback = sub_80DE8D8;
|
|
|
|
sprite->invisible = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DE8D8(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
if (sprite->data[4])
|
|
|
|
{
|
|
|
|
sprite->data[0] += sprite->data[2];
|
|
|
|
sprite->data[1] += sprite->data[3];
|
|
|
|
sprite->pos1.x = sprite->data[0] >> 4;
|
|
|
|
sprite->pos1.y = sprite->data[1] >> 4;
|
|
|
|
if (--sprite->data[4] == 0)
|
|
|
|
sprite->data[0] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_80DE918(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task;
|
|
|
|
s16 battler;
|
|
|
|
u8 spriteId;
|
|
|
|
s16 baseX, baseY;
|
|
|
|
s16 x, y;
|
|
|
|
|
|
|
|
task = &gTasks[taskId];
|
|
|
|
REG_BLDCNT = 0x3F40;
|
|
|
|
REG_BLDALPHA = 0x1000;
|
|
|
|
task->data[5] = 0;
|
|
|
|
task->data[6] = 0;
|
|
|
|
task->data[7] = 0;
|
|
|
|
task->data[8] = 0;
|
|
|
|
task->data[9] = 16;
|
|
|
|
task->data[10] = gBattleAnimArgs[0];
|
|
|
|
|
|
|
|
baseX = GetBattlerSpriteCoord(gAnimBankAttacker, 2);
|
|
|
|
baseY = sub_807A100(gAnimBankAttacker, 3);
|
|
|
|
if (!IsContest())
|
|
|
|
{
|
|
|
|
for (battler = 0; battler < 4; battler++)
|
|
|
|
{
|
|
|
|
if (battler != gAnimBankAttacker
|
|
|
|
&& battler != (gAnimBankAttacker ^ 2)
|
|
|
|
&& IsAnimBankSpriteVisible(battler))
|
|
|
|
{
|
|
|
|
spriteId = CreateSprite(&gSpriteTemplate_83DAF08, baseX, baseY, 55);
|
|
|
|
if (spriteId != MAX_SPRITES)
|
|
|
|
{
|
|
|
|
x = GetBattlerSpriteCoord(battler, 2);
|
|
|
|
y = sub_807A100(battler, 3);
|
|
|
|
gSprites[spriteId].data[0] = baseX << 4;
|
|
|
|
gSprites[spriteId].data[1] = baseY << 4;
|
|
|
|
gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1];
|
|
|
|
gSprites[spriteId].data[3] = ((y - baseY) << 4) / gBattleAnimArgs[1];
|
|
|
|
gSprites[spriteId].data[4] = gBattleAnimArgs[1];
|
|
|
|
gSprites[spriteId].data[5] = x;
|
|
|
|
gSprites[spriteId].data[6] = y;
|
|
|
|
gSprites[spriteId].callback = sub_80DE8D8;
|
|
|
|
|
|
|
|
task->data[task->data[12] + 13] = spriteId;
|
|
|
|
task->data[12]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
spriteId = CreateSprite(&gSpriteTemplate_83DAF08, baseX, baseY, 55);
|
|
|
|
if (spriteId != MAX_SPRITES)
|
|
|
|
{
|
|
|
|
x = 48;
|
|
|
|
y = 40;
|
|
|
|
gSprites[spriteId].data[0] = baseX << 4;
|
|
|
|
gSprites[spriteId].data[1] = baseY << 4;
|
|
|
|
gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1];
|
|
|
|
gSprites[spriteId].data[3] = ((y - baseY) << 4) / gBattleAnimArgs[1];
|
|
|
|
gSprites[spriteId].data[4] = gBattleAnimArgs[1];
|
|
|
|
gSprites[spriteId].data[5] = x;
|
|
|
|
gSprites[spriteId].data[6] = y;
|
|
|
|
gSprites[spriteId].callback = sub_80DE8D8;
|
|
|
|
|
|
|
|
task->data[13] = spriteId;
|
|
|
|
task->data[12] = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
task->func = sub_80DEB38;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DEB38(u8 taskId)
|
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
|
|
|
|
switch (task->data[0])
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
if (task->data[6] == 0)
|
|
|
|
{
|
|
|
|
if (++task->data[5] > 1)
|
|
|
|
{
|
|
|
|
task->data[5] = 0;
|
|
|
|
task->data[7]++;
|
|
|
|
if (task->data[7] & 1)
|
|
|
|
{
|
|
|
|
if (task->data[8] < 16)
|
|
|
|
task->data[8]++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (task->data[9])
|
|
|
|
task->data[9]--;
|
|
|
|
}
|
|
|
|
|
|
|
|
REG_BLDALPHA = (task->data[9] << 8) | task->data[8];
|
|
|
|
if (task->data[7] >= 24)
|
|
|
|
{
|
|
|
|
task->data[7] = 0;
|
|
|
|
task->data[6] = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (task->data[10])
|
|
|
|
task->data[10]--;
|
|
|
|
else if (task->data[6])
|
|
|
|
task->data[0]++;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (++task->data[5] > 1)
|
|
|
|
{
|
|
|
|
task->data[5] = 0;
|
|
|
|
task->data[7]++;
|
|
|
|
if (task->data[7] & 1)
|
|
|
|
{
|
|
|
|
if (task->data[8])
|
|
|
|
task->data[8]--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (task->data[9] < 16)
|
|
|
|
task->data[9]++;
|
|
|
|
}
|
|
|
|
|
|
|
|
REG_BLDALPHA = (task->data[9] << 8) | task->data[8];
|
|
|
|
if (task->data[8] == 0 && task->data[9] == 16)
|
|
|
|
{
|
|
|
|
for (i = 0; i < task->data[12]; i++)
|
|
|
|
DestroySprite(&gSprites[task->data[i + 13]]);
|
|
|
|
|
|
|
|
task->data[0]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (++task->data[5] > 0)
|
|
|
|
task->data[0]++;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
REG_BLDCNT = 0;
|
|
|
|
REG_BLDALPHA = 0;
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_80DECB0(u8 taskId)
|
|
|
|
{
|
|
|
|
s16 startX, startY;
|
|
|
|
s16 leftDistance, topDistance, bottomDistance, rightDistance;
|
|
|
|
|
|
|
|
gBattle_WIN0H = 0;
|
|
|
|
gBattle_WIN0V = 0;
|
|
|
|
REG_WININ = 0x3F3F;
|
|
|
|
REG_WINOUT = 0x3F1F;
|
|
|
|
REG_BLDCNT = 0xC8;
|
|
|
|
REG_BLDY = 0x10;
|
|
|
|
|
|
|
|
if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER || IsContest())
|
|
|
|
startX = 40;
|
|
|
|
else
|
|
|
|
startX = 200;
|
|
|
|
|
|
|
|
gBattle_WIN0H = (startX << 8) | startX;
|
|
|
|
startY = 40;
|
|
|
|
gBattle_WIN0V = (startY << 8) | startY;
|
|
|
|
|
|
|
|
leftDistance = startX;
|
|
|
|
rightDistance = 240 - startX;
|
|
|
|
topDistance = startY;
|
|
|
|
bottomDistance = 72;
|
|
|
|
gTasks[taskId].data[1] = leftDistance;
|
|
|
|
gTasks[taskId].data[2] = rightDistance;
|
|
|
|
gTasks[taskId].data[3] = topDistance;
|
|
|
|
gTasks[taskId].data[4] = bottomDistance;
|
|
|
|
gTasks[taskId].data[5] = startX;
|
|
|
|
gTasks[taskId].data[6] = startY;
|
|
|
|
gTasks[taskId].func = sub_80DED60;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DED60(u8 taskId)
|
|
|
|
{
|
|
|
|
s16 step;
|
|
|
|
s16 leftDistance, rightDistance, topDistance, bottomDistance;
|
|
|
|
s16 startX, startY;
|
|
|
|
u16 left, right, top, bottom;
|
|
|
|
u16 selectedPalettes;
|
|
|
|
|
|
|
|
step = gTasks[taskId].data[0];
|
|
|
|
gTasks[taskId].data[0]++;
|
|
|
|
leftDistance = gTasks[taskId].data[1];
|
|
|
|
rightDistance = gTasks[taskId].data[2];
|
|
|
|
topDistance = gTasks[taskId].data[3];
|
|
|
|
bottomDistance = gTasks[taskId].data[4];
|
|
|
|
startX = gTasks[taskId].data[5];
|
|
|
|
startY = gTasks[taskId].data[6];
|
|
|
|
|
|
|
|
if (step < 16)
|
|
|
|
{
|
|
|
|
left = startX - (leftDistance * 0.0625) * step;
|
|
|
|
right = startX + (rightDistance * 0.0625) * step;
|
|
|
|
top = startY - (topDistance * 0.0625) * step;
|
|
|
|
bottom = startY + (bottomDistance * 0.0625) * step;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
left = 0;
|
|
|
|
right = 240;
|
|
|
|
top = 0;
|
|
|
|
bottom = 112;
|
|
|
|
selectedPalettes = sub_80791A8(1, 0, 0, 0, 0, 0, 0);
|
|
|
|
BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0));
|
|
|
|
gTasks[taskId].func = sub_80DEEE8;
|
|
|
|
}
|
|
|
|
|
|
|
|
gBattle_WIN0H = (left << 8) | right;
|
|
|
|
gBattle_WIN0V = (top << 8) | bottom;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DEEE8(u8 taskId)
|
|
|
|
{
|
|
|
|
if (!gPaletteFade.active)
|
|
|
|
{
|
|
|
|
gBattle_WIN0H = 0;
|
|
|
|
gBattle_WIN0V = 0;
|
|
|
|
REG_WININ = 0x3F3F;
|
|
|
|
REG_WINOUT = 0x3F3F;
|
|
|
|
REG_BLDCNT = 0;
|
|
|
|
REG_BLDY = 0;
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DEF3C(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
s16 xDelta;
|
|
|
|
s16 xDelta2;
|
|
|
|
|
|
|
|
InitAnimSpritePos(sprite, 1);
|
|
|
|
if (GetBattlerSide(gAnimBankAttacker) == B_SIDE_PLAYER)
|
|
|
|
{
|
|
|
|
xDelta = 24;
|
|
|
|
xDelta2 = -2;
|
|
|
|
sprite->oam.matrixNum = 8;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
xDelta = -24;
|
|
|
|
xDelta2 = 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
sprite->pos1.x += xDelta;
|
|
|
|
sprite->data[1] = xDelta2;
|
|
|
|
sprite->data[0] = 60;
|
|
|
|
sprite->callback = sub_80DEF98;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DEF98(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
u16 var0;
|
|
|
|
|
|
|
|
if (sprite->data[0] > 0)
|
|
|
|
{
|
|
|
|
sprite->data[0]--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sprite->pos2.x += sprite->data[1];
|
|
|
|
var0 = sprite->pos2.x + 7;
|
|
|
|
if (var0 > 14)
|
|
|
|
{
|
|
|
|
sprite->pos1.x += sprite->pos2.x;
|
|
|
|
sprite->pos2.x = 0;
|
|
|
|
sprite->oam.tileNum += 8;
|
|
|
|
if (++sprite->data[2] == 3)
|
|
|
|
{
|
|
|
|
sprite->data[0] = 30;
|
|
|
|
sprite->callback = WaitAnimForDuration;
|
|
|
|
StoreSpriteCallbackInData(sprite, sub_80DF018);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sprite->data[0] = 40;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DF018(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
if (sprite->data[0] == 0)
|
|
|
|
{
|
|
|
|
REG_BLDCNT = 0x3F40;
|
|
|
|
REG_BLDALPHA = 0x0010;
|
|
|
|
sprite->data[0]++;
|
|
|
|
sprite->data[1] = 0;
|
|
|
|
sprite->data[2] = 0;
|
|
|
|
}
|
|
|
|
else if (sprite->data[1] < 2)
|
|
|
|
{
|
|
|
|
sprite->data[1]++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
sprite->data[1] = 0;
|
|
|
|
sprite->data[2]++;
|
|
|
|
REG_BLDALPHA = (16 - sprite->data[2]) | (sprite->data[2] << 8);
|
|
|
|
if (sprite->data[2] == 16)
|
|
|
|
{
|
|
|
|
sprite->invisible = 1;
|
|
|
|
sprite->callback = sub_80DF090;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DF090(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
REG_BLDCNT = 0;
|
|
|
|
REG_BLDALPHA = 0;
|
|
|
|
gBattle_WIN0H = 0;
|
|
|
|
gBattle_WIN0V = 0;
|
|
|
|
DestroyAnimSprite(sprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DF0B8(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
u16 coeffB;
|
|
|
|
u16 coeffA;
|
|
|
|
|
|
|
|
sprite->pos2.x = Sin(sprite->data[0], 12);
|
|
|
|
if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER)
|
|
|
|
sprite->pos2.x = -sprite->pos2.x;
|
|
|
|
|
|
|
|
sprite->data[0] = (sprite->data[0] + 6) & 0xFF;
|
|
|
|
sprite->data[1] += 0x100;
|
|
|
|
sprite->pos2.y = -(sprite->data[1] >> 8);
|
|
|
|
|
|
|
|
sprite->data[7]++;
|
|
|
|
if (sprite->data[7] == 1)
|
|
|
|
{
|
|
|
|
sprite->data[6] = 0x050B;
|
|
|
|
REG_BLDCNT = 0x3F40;
|
|
|
|
REG_BLDALPHA = sprite->data[6];
|
|
|
|
}
|
|
|
|
else if (sprite->data[7] > 30)
|
|
|
|
{
|
|
|
|
sprite->data[2]++;
|
|
|
|
coeffB = sprite->data[6] >> 8;
|
|
|
|
coeffA = sprite->data[6] & 0xFF;
|
|
|
|
|
|
|
|
if (++coeffB > 16)
|
|
|
|
coeffB = 16;
|
|
|
|
if (--(s16)coeffA < 0)
|
|
|
|
coeffA = 0;
|
|
|
|
|
|
|
|
REG_BLDALPHA = (coeffB << 8) | coeffA;
|
|
|
|
sprite->data[6] = (coeffB << 8) | coeffA;
|
|
|
|
if (coeffB == 16 && coeffA == 0)
|
|
|
|
{
|
|
|
|
sprite->invisible = 1;
|
|
|
|
sprite->callback = sub_80DF18C;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DF18C(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
REG_BLDCNT = 0;
|
|
|
|
REG_BLDALPHA = 0;
|
|
|
|
DestroyAnimSprite(sprite);
|
|
|
|
}
|
|
|
|
|
|
|
|
void sub_80DF1A4(u8 taskId)
|
|
|
|
{
|
|
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
|
|
|
|
task->data[0] = 0;
|
|
|
|
task->data[1] = 16;
|
|
|
|
task->data[9] = GetBattlerSpriteCoord(gAnimBankAttacker, 2);
|
|
|
|
task->data[10] = sub_8077FC0(gAnimBankAttacker);
|
|
|
|
task->data[11] = (sub_807A100(gAnimBankAttacker, 1) / 2) + 8;
|
|
|
|
task->data[7] = 0;
|
|
|
|
task->data[5] = sub_8079ED4(gAnimBankAttacker);
|
|
|
|
task->data[6] = GetBattlerSubpriority(gAnimBankAttacker) - 2;
|
|
|
|
task->data[3] = 0;
|
|
|
|
task->data[4] = 16;
|
|
|
|
REG_BLDCNT = 0x3F40;
|
|
|
|
REG_BLDALPHA = 0x1000;
|
|
|
|
task->data[8] = 0;
|
|
|
|
task->func = sub_80DF24C;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DF24C(u8 taskId)
|
|
|
|
{
|
|
|
|
u16 i;
|
|
|
|
u8 spriteId;
|
|
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
|
|
|
|
switch (task->data[0])
|
|
|
|
{
|
|
|
|
case 0:
|
|
|
|
for (i = 0; i < 6; i++)
|
|
|
|
{
|
|
|
|
spriteId = CreateSprite(&gSpriteTemplate_83DAF80, task->data[9], task->data[10], task->data[6]);
|
|
|
|
if (spriteId != MAX_SPRITES)
|
|
|
|
{
|
|
|
|
gSprites[spriteId].data[0] = taskId;
|
|
|
|
gSprites[spriteId].data[1] = GetBattlerSide(gAnimBankAttacker) == B_SIDE_PLAYER;
|
|
|
|
|
|
|
|
gSprites[spriteId].data[2] = (i * 42) & 0xFF;
|
|
|
|
gSprites[spriteId].data[3] = task->data[11];
|
|
|
|
gSprites[spriteId].data[5] = i * 6;
|
|
|
|
task->data[7]++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
task->data[0]++;
|
|
|
|
break;
|
|
|
|
case 1:
|
|
|
|
if (++task->data[1] & 1)
|
|
|
|
{
|
|
|
|
if (task->data[3] < 14)
|
|
|
|
task->data[3]++;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (task->data[4] > 4)
|
|
|
|
task->data[4]--;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (task->data[3] == 14 && task->data[4] == 4)
|
|
|
|
{
|
|
|
|
task->data[1] = 0;
|
|
|
|
task->data[0]++;
|
|
|
|
}
|
|
|
|
|
|
|
|
REG_BLDALPHA = (task->data[4] << 8) | task->data[3];
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
if (++task->data[1] > 30)
|
|
|
|
{
|
|
|
|
task->data[1] = 0;
|
|
|
|
task->data[0]++;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
if (++task->data[1] & 1)
|
|
|
|
{
|
|
|
|
if (task->data[3] > 0)
|
|
|
|
task->data[3]--;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (task->data[4] < 16)
|
|
|
|
task->data[4]++;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (task->data[3] == 0 && task->data[4] == 16)
|
|
|
|
{
|
|
|
|
task->data[8] = 1;
|
|
|
|
task->data[0]++;
|
|
|
|
}
|
|
|
|
|
|
|
|
REG_BLDALPHA = (task->data[4] << 8) | task->data[3];
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
if (task->data[7] == 0)
|
|
|
|
task->data[0]++;
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
REG_BLDCNT = 0;
|
|
|
|
REG_BLDALPHA = 0;
|
|
|
|
DestroyAnimVisualTask(taskId);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DF3D8(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
u16 index;
|
|
|
|
|
|
|
|
if (sprite->data[1] == 0)
|
|
|
|
sprite->data[2] += 2;
|
|
|
|
else
|
|
|
|
sprite->data[2] -= 2;
|
|
|
|
|
|
|
|
sprite->data[2] &= 0xFF;
|
|
|
|
sprite->pos2.x = Sin(sprite->data[2], sprite->data[3]);
|
|
|
|
|
|
|
|
index = sprite->data[2] - 65;
|
|
|
|
if (index < 127)
|
|
|
|
sprite->oam.priority = gTasks[sprite->data[0]].data[5] + 1;
|
|
|
|
else
|
|
|
|
sprite->oam.priority = gTasks[sprite->data[0]].data[5];
|
|
|
|
|
|
|
|
sprite->data[5]++;
|
|
|
|
sprite->data[6] = (sprite->data[5] * 8) & 0xFF;
|
|
|
|
sprite->pos2.y = Sin(sprite->data[6], 7);
|
|
|
|
if (gTasks[sprite->data[0]].data[8])
|
|
|
|
{
|
|
|
|
gTasks[sprite->data[0]].data[7]--;
|
|
|
|
DestroySprite(sprite);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DF49C(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
sprite->invisible = 1;
|
|
|
|
sprite->data[5] = gBankSpriteIds[gAnimBankAttacker];
|
|
|
|
sprite->data[0] = 128;
|
|
|
|
sprite->data[1] = 10;
|
|
|
|
sprite->data[2] = gBattleAnimArgs[0];
|
|
|
|
sprite->data[3] = gBattleAnimArgs[1];
|
|
|
|
sprite->callback = sub_80DF4F4;
|
|
|
|
|
|
|
|
gSprites[sprite->data[5]].pos1.y += 8;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void sub_80DF4F4(struct Sprite *sprite)
|
|
|
|
{
|
|
|
|
if (sprite->data[3])
|
|
|
|
{
|
|
|
|
sprite->data[3]--;
|
|
|
|
gSprites[sprite->data[5]].pos2.x = Sin(sprite->data[0], sprite->data[1]);
|
|
|
|
gSprites[sprite->data[5]].pos2.y = Cos(sprite->data[0], sprite->data[1]);
|
|
|
|
sprite->data[0] += sprite->data[2];
|
|
|
|
if (sprite->data[0] > 255)
|
|
|
|
sprite->data[0] -= 256;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
gSprites[sprite->data[5]].pos2.x = 0;
|
|
|
|
gSprites[sprite->data[5]].pos2.y = 0;
|
|
|
|
gSprites[sprite->data[5]].pos1.y -= 8;
|
|
|
|
sprite->callback = move_anim_8074EE0;
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
|