mirror of
https://github.com/pret/pokefirered.git
synced 2026-05-09 12:35:23 -05:00
432 lines
12 KiB
C
432 lines
12 KiB
C
#include "global.h"
|
|
#include "battle_anim.h"
|
|
#include "scanline_effect.h"
|
|
#include "task.h"
|
|
#include "trig.h"
|
|
|
|
static void sub_80B725C(struct Sprite *sprite);
|
|
static void sub_80B741C(struct Sprite *sprite);
|
|
static void sub_80B73AC(struct Sprite *sprite);
|
|
static void sub_80B7448(struct Sprite *sprite);
|
|
static void sub_80B77E4(struct Sprite *sprite);
|
|
static void sub_80B74D8(struct Sprite *sprite);
|
|
static void sub_80B76B0(u8 taskId);
|
|
static void sub_80B776C(struct Task *task);
|
|
static void sub_80B7894(struct Sprite *sprite);
|
|
|
|
static EWRAM_DATA u16 gUnknown_20399A4[7] = {0};
|
|
|
|
static const union AnimCmd gUnknown_83E7710[] =
|
|
{
|
|
ANIMCMD_FRAME(0, 4),
|
|
ANIMCMD_FRAME(16, 4),
|
|
ANIMCMD_FRAME(32, 4),
|
|
ANIMCMD_FRAME(48, 4),
|
|
ANIMCMD_FRAME(64, 4),
|
|
ANIMCMD_JUMP(0),
|
|
};
|
|
|
|
static const union AnimCmd *const gUnknown_83E7728[] =
|
|
{
|
|
gUnknown_83E7710,
|
|
};
|
|
|
|
const struct SpriteTemplate gUnknown_83E772C =
|
|
{
|
|
.tileTag = ANIM_TAG_SMALL_EMBER,
|
|
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
|
.oam = &gOamData_83AC9D8,
|
|
.anims = gUnknown_83E7728,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = sub_80B725C,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_83E7744[] =
|
|
{
|
|
ANIMCMD_FRAME(16, 3),
|
|
ANIMCMD_FRAME(32, 3),
|
|
ANIMCMD_FRAME(48, 3),
|
|
ANIMCMD_JUMP(0),
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_83E7754[] =
|
|
{
|
|
ANIMCMD_FRAME(16, 3, .vFlip = TRUE, .hFlip = TRUE),
|
|
ANIMCMD_FRAME(32, 3, .vFlip = TRUE, .hFlip = TRUE),
|
|
ANIMCMD_FRAME(48, 3, .vFlip = TRUE, .hFlip = TRUE),
|
|
ANIMCMD_JUMP(0),
|
|
};
|
|
|
|
static const union AnimCmd *const gUnknown_83E7764[] =
|
|
{
|
|
gUnknown_83E7744,
|
|
gUnknown_83E7754,
|
|
};
|
|
|
|
static const union AffineAnimCmd gUnknown_83E776C[] =
|
|
{
|
|
AFFINEANIMCMD_FRAME(0x50, 0x50, 127, 0),
|
|
AFFINEANIMCMD_FRAME(0xD, 0xD, 0, 100),
|
|
AFFINEANIMCMD_END,
|
|
};
|
|
|
|
static const union AffineAnimCmd gUnknown_83E7784[] =
|
|
{
|
|
AFFINEANIMCMD_FRAME(0x50, 0x50, 0, 0),
|
|
AFFINEANIMCMD_FRAME(0xD, 0xD, 0, 100),
|
|
AFFINEANIMCMD_END,
|
|
};
|
|
|
|
static const union AffineAnimCmd *const gUnknown_83E779C[] =
|
|
{
|
|
gUnknown_83E776C,
|
|
gUnknown_83E7784,
|
|
};
|
|
|
|
const struct SpriteTemplate gUnknown_83E77A4 =
|
|
{
|
|
.tileTag = ANIM_TAG_SMALL_EMBER,
|
|
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
|
.oam = &gOamData_83ACA98,
|
|
.anims = gUnknown_83E7764,
|
|
.images = NULL,
|
|
.affineAnims = gUnknown_83E779C,
|
|
.callback = sub_80B741C,
|
|
};
|
|
|
|
const union AnimCmd gUnknown_83E77BC[] =
|
|
{
|
|
ANIMCMD_FRAME(0, 5),
|
|
ANIMCMD_FRAME(16, 5),
|
|
ANIMCMD_FRAME(32, 5),
|
|
ANIMCMD_FRAME(48, 5),
|
|
ANIMCMD_FRAME(64, 5),
|
|
ANIMCMD_END,
|
|
};
|
|
|
|
static const union AnimCmd *const gUnknown_83E77D4[] =
|
|
{
|
|
gUnknown_83E77BC,
|
|
};
|
|
|
|
const struct SpriteTemplate gUnknown_83E77D8 =
|
|
{
|
|
.tileTag = ANIM_TAG_FIRE_PLUME,
|
|
.paletteTag = ANIM_TAG_FIRE_PLUME,
|
|
.oam = &gOamData_83AC9D8,
|
|
.anims = gUnknown_83E77D4,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = sub_80B73AC,
|
|
};
|
|
|
|
static const union AnimCmd gUnknown_83E77F0[] =
|
|
{
|
|
ANIMCMD_FRAME(16, 3),
|
|
ANIMCMD_FRAME(32, 3),
|
|
ANIMCMD_FRAME(48, 3),
|
|
ANIMCMD_JUMP(0),
|
|
};
|
|
|
|
static const union AnimCmd *const gUnknown_83E7800[] =
|
|
{
|
|
gUnknown_83E77F0,
|
|
gUnknown_83E77F0,
|
|
};
|
|
|
|
static const union AffineAnimCmd gUnknown_83E7808[] =
|
|
{
|
|
AFFINEANIMCMD_FRAME(0x64, 0x64, 127, 1),
|
|
AFFINEANIMCMD_END,
|
|
};
|
|
|
|
static const union AffineAnimCmd gUnknown_83E7818[] =
|
|
{
|
|
AFFINEANIMCMD_FRAME(0x64, 0x64, 0, 1),
|
|
AFFINEANIMCMD_END,
|
|
};
|
|
|
|
static const union AffineAnimCmd *const gUnknown_83E7828[] =
|
|
{
|
|
gUnknown_83E7808,
|
|
gUnknown_83E7818,
|
|
};
|
|
|
|
const struct SpriteTemplate gUnknown_83E7830 =
|
|
{
|
|
.tileTag = ANIM_TAG_SMALL_EMBER,
|
|
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
|
.oam = &gOamData_83ACA98,
|
|
.anims = gUnknown_83E7800,
|
|
.images = NULL,
|
|
.affineAnims = gUnknown_83E7828,
|
|
.callback = sub_80B741C,
|
|
};
|
|
|
|
const struct SpriteTemplate gUnknown_83E7848 =
|
|
{
|
|
.tileTag = ANIM_TAG_HOLLOW_ORB,
|
|
.paletteTag = ANIM_TAG_HOLLOW_ORB,
|
|
.oam = &gOamData_83AC9D0,
|
|
.anims = gDummySpriteAnimTable,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = sub_80B7448,
|
|
};
|
|
|
|
const struct SpriteTemplate gUnknown_83E7860 =
|
|
{
|
|
.tileTag = ANIM_TAG_SMALL_EMBER,
|
|
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
|
.oam = &gOamData_83AC9D8,
|
|
.anims = gUnknown_83E7728,
|
|
.images = NULL,
|
|
.affineAnims = gDummySpriteAffineAnimTable,
|
|
.callback = sub_80B77E4,
|
|
};
|
|
|
|
static void sub_80B725C(struct Sprite *sprite)
|
|
{
|
|
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
|
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
|
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
|
{
|
|
sprite->pos1.x -= gBattleAnimArgs[0];
|
|
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
|
|
gBattleAnimArgs[4] = -gBattleAnimArgs[4];
|
|
}
|
|
else
|
|
{
|
|
sprite->pos1.x += gBattleAnimArgs[0];
|
|
}
|
|
sprite->pos1.y += gBattleAnimArgs[1];
|
|
sprite->data[0] = gBattleAnimArgs[2];
|
|
sprite->data[1] = gBattleAnimArgs[3];
|
|
sprite->data[3] = gBattleAnimArgs[4];
|
|
sprite->data[5] = gBattleAnimArgs[5];
|
|
sprite->invisible = TRUE;
|
|
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
|
sprite->callback = TranslateSpriteLinearAndFlicker;
|
|
}
|
|
|
|
static void sub_80B72F8(struct Sprite *sprite)
|
|
{
|
|
SetSpriteCoordsToAnimAttackerCoords(sprite);
|
|
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
|
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
|
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
|
{
|
|
sprite->pos1.x -= gBattleAnimArgs[1];
|
|
sprite->pos1.y += gBattleAnimArgs[1];
|
|
sprite->data[2] -= gBattleAnimArgs[2];
|
|
sprite->data[4] += gBattleAnimArgs[3];
|
|
}
|
|
else
|
|
{
|
|
sprite->pos1.x += gBattleAnimArgs[0];
|
|
sprite->pos1.y += gBattleAnimArgs[1];
|
|
sprite->data[2] += gBattleAnimArgs[2];
|
|
sprite->data[4] += gBattleAnimArgs[3];
|
|
StartSpriteAnim(sprite, 1);
|
|
}
|
|
sprite->data[0] = gBattleAnimArgs[4];
|
|
sprite->callback = StartAnimLinearTranslation;
|
|
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
|
}
|
|
|
|
static void sub_80B73AC(struct Sprite *sprite)
|
|
{
|
|
if (gBattleAnimArgs[0] == 0)
|
|
{
|
|
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0);
|
|
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1);
|
|
}
|
|
else
|
|
{
|
|
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
|
|
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
|
|
}
|
|
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[1]);
|
|
sprite->pos1.y += gBattleAnimArgs[2];
|
|
sprite->callback = RunStoredCallbackWhenAnimEnds;
|
|
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
|
}
|
|
|
|
static void sub_80B741C(struct Sprite *sprite)
|
|
{
|
|
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
|
StartSpriteAffineAnim(sprite, 1);
|
|
sub_80B72F8(sprite);
|
|
}
|
|
|
|
static void sub_80B7448(struct Sprite *sprite)
|
|
{
|
|
u16 r5;
|
|
u16 r0;
|
|
|
|
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
|
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
|
sprite->data[4] = 0;
|
|
sprite->data[5] = 1;
|
|
sprite->data[6] = gBattleAnimArgs[0];
|
|
r5 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_HEIGHT);
|
|
r0 = GetBattlerSpriteCoordAttr(gBattlerAttacker, BATTLER_COORD_ATTR_WIDTH);
|
|
if (r5 > r0)
|
|
sprite->data[7] = r5 / 2;
|
|
else
|
|
sprite->data[7] = r0 / 2;
|
|
sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]);
|
|
sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]);
|
|
sprite->callback = sub_80B74D8;
|
|
}
|
|
|
|
static void sub_80B74D8(struct Sprite *sprite)
|
|
{
|
|
switch (sprite->data[0])
|
|
{
|
|
case 0:
|
|
sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF;
|
|
sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]);
|
|
sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]);
|
|
if (++sprite->data[4] > 5)
|
|
{
|
|
sprite->data[4] = 0;
|
|
if (sprite->data[5] <= 15 && ++sprite->data[5] > 15)
|
|
sprite->data[5] = 16;
|
|
}
|
|
if (++sprite->data[3] > 0x3C)
|
|
{
|
|
sprite->data[3] = 0;
|
|
++sprite->data[0];
|
|
}
|
|
break;
|
|
case 1:
|
|
sprite->data[6] = (sprite->data[6] - sprite->data[5]) & 0xFF;
|
|
if (sprite->data[7] <= 0x95 && (sprite->data[7] += 8) > 0x95)
|
|
sprite->data[7] = 0x96;
|
|
sprite->pos2.x = Cos(sprite->data[6], sprite->data[7]);
|
|
sprite->pos2.y = Sin(sprite->data[6], sprite->data[7]);
|
|
if (++sprite->data[4] > 5)
|
|
{
|
|
sprite->data[4] = 0;
|
|
if (sprite->data[5] <= 15 && ++sprite->data[5] > 15)
|
|
sprite->data[5] = 16;
|
|
}
|
|
if (++sprite->data[3] > 20)
|
|
DestroyAnimSprite(sprite);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void sub_80B75E0(u8 taskId)
|
|
{
|
|
struct ScanlineEffectParams sp;
|
|
struct Task *task = &gTasks[taskId];
|
|
u16 i;
|
|
u8 r1;
|
|
|
|
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
|
|
{
|
|
sp.dmaDest = ®_BG1HOFS;
|
|
task->data[2] = gBattle_BG1_X;
|
|
}
|
|
else
|
|
{
|
|
sp.dmaDest = ®_BG2HOFS;
|
|
task->data[2] = gBattle_BG2_X;
|
|
}
|
|
sp.dmaControl = 0xA2600001;
|
|
sp.initState = 1;
|
|
sp.unused9 = 0;
|
|
r1 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
|
|
task->data[3] = r1 - 32;
|
|
task->data[4] = r1 + 32;
|
|
if (task->data[3] < 0)
|
|
task->data[3] = 0;
|
|
for (i = task->data[3]; i <= task->data[4]; ++i)
|
|
{
|
|
gScanlineEffectRegBuffers[0][i] = task->data[2];
|
|
gScanlineEffectRegBuffers[1][i] = task->data[2];
|
|
}
|
|
ScanlineEffect_SetParams(sp);
|
|
task->func = sub_80B76B0;
|
|
}
|
|
|
|
static void sub_80B76B0(u8 taskId)
|
|
{
|
|
struct Task *task = &gTasks[taskId];
|
|
|
|
switch (task->data[0])
|
|
{
|
|
case 0:
|
|
if (++task->data[7] > 1)
|
|
{
|
|
task->data[7] = 0;
|
|
if (++task->data[6] == 3)
|
|
++task->data[0];
|
|
}
|
|
sub_80B776C(task);
|
|
break;
|
|
case 1:
|
|
if (++task->data[1] > 0x3C)
|
|
++task->data[0];
|
|
sub_80B776C(task);
|
|
break;
|
|
case 2:
|
|
if (++task->data[7] > 1)
|
|
{
|
|
task->data[7] = 0;
|
|
if (--task->data[6] == 0)
|
|
++task->data[0];
|
|
}
|
|
sub_80B776C(task);
|
|
break;
|
|
case 3:
|
|
gScanlineEffect.state = 3;
|
|
++task->data[0];
|
|
break;
|
|
case 4:
|
|
DestroyAnimVisualTask(taskId);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void sub_80B776C(struct Task *task)
|
|
{
|
|
u16 i, r3 = task->data[5];
|
|
|
|
for (i = task->data[3]; i <= task->data[4]; ++i)
|
|
{
|
|
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = ((gSineTable[r3] * task->data[6]) >> 7) + task->data[2];
|
|
r3 = (r3 + 8) & 0xFF;
|
|
}
|
|
task->data[5] = (task->data[5] + 9) & 0xFF;
|
|
}
|
|
|
|
static void sub_80B77E4(struct Sprite *sprite)
|
|
{
|
|
s32 i, r6 = (gBattleAnimArgs[2] * 3) / 5;
|
|
|
|
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
|
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[4];
|
|
sprite->data[1] = Cos(gBattleAnimArgs[1], gBattleAnimArgs[2]);
|
|
sprite->data[2] = Sin(gBattleAnimArgs[1], r6);
|
|
sprite->pos1.x += sprite->data[1] * gBattleAnimArgs[0];
|
|
sprite->pos1.y += sprite->data[2] * gBattleAnimArgs[0];
|
|
sprite->data[3] = gBattleAnimArgs[3];
|
|
sprite->callback = sub_80B7894;
|
|
for (i = 0; i < 7; ++i)
|
|
gUnknown_20399A4[i] = sprite->data[i];
|
|
}
|
|
|
|
static void sub_80B7894(struct Sprite *sprite)
|
|
{
|
|
sprite->data[4] += sprite->data[1];
|
|
sprite->data[5] += sprite->data[2];
|
|
sprite->pos2.x = sprite->data[4] / 10;
|
|
sprite->pos2.y = sprite->data[5] / 10;
|
|
if (++sprite->data[0] > sprite->data[3])
|
|
DestroyAnimSprite(sprite);
|
|
}
|