Finish battle_anim_mon_movement

This commit is contained in:
PikalaxALT 2019-06-22 14:05:30 -04:00
parent 374ea9ec62
commit 43d2563704
4 changed files with 367 additions and 1191 deletions

File diff suppressed because it is too large Load Diff

View File

@ -64,6 +64,8 @@ extern u8 gBattleAnimTarget;
extern u16 gAnimSpeciesByBanks[BATTLE_BANKS_COUNT];
extern u8 gUnknown_02038440;
extern u8 gBattlerSpriteIds[MAX_BATTLERS_COUNT];
extern u16 gUnknown_2037EEC;
extern s32 gUnknown_2037EE8;
void ClearBattleAnimationVars(void);
void DoMoveAnim(u16 move);
@ -127,5 +129,10 @@ u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 bank, u32 arg2, u8 ballId);
void sub_8074DC4(struct Sprite * sprite);
void sub_8074E14(struct Sprite * sprite);
void sub_80754B8(struct Sprite * sprite);
void sub_80758E0(u8 spriteId, u8 b);
void sub_8075980(u8 spriteId);
void obj_id_set_rotscale(u8 spriteId, s16 xScale, s16 yScale, u16 rotation);
bool8 sub_8073788(void);
void sub_80759DC(u8 spriteId);
#endif // GUARD_BATTLE_ANIM_H

View File

@ -139,7 +139,6 @@ SECTIONS {
asm/map_name_popup.o(.text);
src/item_menu_icons.o(.text);
src/battle_anim_mon_movement.o(.text);
asm/battle_anim_mon_movement.o(.text);
src/item.o(.text);
asm/shop.o(.text);
src/berry.o(.text);

View File

@ -4,6 +4,8 @@
#include "task.h"
#include "trig.h"
#define abs(x) ((x) < 0 ? -(x) : (x))
void sub_8098A6C(u8 taskId);
void sub_8098C08(u8 taskId);
void sub_8098D54(u8 taskId);
@ -18,6 +20,13 @@ void sub_8099270(struct Sprite * sprite);
void sub_80992E0(struct Sprite * sprite);
void sub_8099394(struct Sprite * sprite);
void sub_809946C(struct Sprite * sprite);
void sub_8099530(u8 taskId);
void sub_8099594(u8 taskId);
void sub_80996B8(u8 taskId);
void sub_8099788(u8 taskId);
void sub_8099908(u8 taskId);
void sub_8099B54(u8 taskId);
void sub_8099CB8(u8 taskId);
const struct SpriteTemplate gUnknown_83D4E4C[] = {
{
@ -447,3 +456,354 @@ void sub_809946C(struct Sprite * sprite)
gSprites[sprite->data[5]].pos2.y = 0;
DestroyAnimSprite(sprite);
}
void sub_809949C(u8 taskId)
{
u16 r7 = 0x8000 / gBattleAnimArgs[3];
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
gBattleAnimArgs[5] = -gBattleAnimArgs[5];
}
gTasks[taskId].data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]);
gTasks[taskId].data[1] = gBattleAnimArgs[1] * 256 / gBattleAnimArgs[3];
gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3];
gTasks[taskId].data[4] = gBattleAnimArgs[4];
gTasks[taskId].data[5] = gBattleAnimArgs[5] * 256 / gBattleAnimArgs[6];
gTasks[taskId].data[6] = gBattleAnimArgs[6];
gTasks[taskId].data[7] = r7;
gTasks[taskId].func = sub_8099530;
}
void sub_8099530(u8 taskId)
{
u8 spriteId = gTasks[taskId].data[0];
gTasks[taskId].data[11] += gTasks[taskId].data[1];
gSprites[spriteId].pos2.x = gTasks[taskId].data[11] >> 8;
gSprites[spriteId].pos2.y = Sin((u8)(gTasks[taskId].data[10] >> 8), gTasks[taskId].data[2]);
gTasks[taskId].data[10] += gTasks[taskId].data[7];
if (--gTasks[taskId].data[3] == 0)
gTasks[taskId].func = sub_8099594;
}
void sub_8099594(u8 taskId)
{
u8 spriteId;
if (gTasks[taskId].data[4] > 0)
gTasks[taskId].data[4]--;
else
{
spriteId = gTasks[taskId].data[0];
gTasks[taskId].data[12] += gTasks[taskId].data[5];
gSprites[spriteId].pos2.x = (gTasks[taskId].data[12] >> 8) + (gTasks[taskId].data[11] >> 8);
if (--gTasks[taskId].data[6] == 0)
DestroyAnimVisualTask(taskId);
}
}
void sub_80995FC(u8 taskId)
{
u8 spriteId;
switch (gBattleAnimArgs[0])
{
case 0:
case 1:
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
break;
case 2:
if (!sub_8072DF0(gBattleAnimAttacker ^ BIT_FLANK))
{
DestroyAnimVisualTask(taskId);
return;
}
spriteId = gBattlerSpriteIds[gBattleAnimAttacker ^ BIT_FLANK];
break;
case 3:
if (!sub_8072DF0(gBattleAnimTarget ^ BIT_FLANK))
{
DestroyAnimVisualTask(taskId);
return;
}
spriteId = gBattlerSpriteIds[gBattleAnimTarget ^ BIT_FLANK];
break;
default:
DestroyAnimVisualTask(taskId);
return;
}
gTasks[taskId].data[0] = spriteId;
if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
gTasks[taskId].data[1] = gBattleAnimArgs[1];
else
gTasks[taskId].data[1] = -gBattleAnimArgs[1];
gTasks[taskId].func = sub_80996B8;
}
void sub_80996B8(u8 taskId)
{
u8 spriteId = gTasks[taskId].data[0];
gSprites[spriteId].pos2.x += gTasks[taskId].data[1];
if (gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x < -0x20 || gSprites[spriteId].pos2.x + gSprites[spriteId].pos1.x > 0x110)
DestroyAnimVisualTask(taskId);
}
void sub_8099704(u8 taskId)
{
u8 spriteId;
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]);
gTasks[taskId].data[0] = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[3];
gTasks[taskId].data[4] = spriteId;
if (gBattleAnimArgs[4] == 0)
gTasks[taskId].data[5] = gBattleAnimAttacker;
else
gTasks[taskId].data[5] = gBattleAnimTarget;
gTasks[taskId].data[12] = 1;
gTasks[taskId].func = sub_8099788;
}
void sub_8099788(u8 taskId)
{
u8 spriteId;
u32 r8;
s16 r5;
u16 tmp;
spriteId = gTasks[taskId].data[4];
tmp = gTasks[taskId].data[10] + gTasks[taskId].data[2];
gTasks[taskId].data[10] = tmp;
r8 = tmp >> 8;
r5 = Sin(r8, gTasks[taskId].data[1]);
if (gTasks[taskId].data[0] == 0)
{
gSprites[spriteId].pos2.x = r5;
}
else if (GetBattlerSide(gTasks[taskId].data[5]) == B_SIDE_PLAYER)
{
gSprites[spriteId].pos2.y = abs(r5);
}
else
gSprites[spriteId].pos2.y = -abs(r5);
if ((r8 > 0x7F && gTasks[taskId].data[11] == 0 && gTasks[taskId].data[12] == 1) || (r8 < 0x7F && gTasks[taskId].data[11] == 1 && gTasks[taskId].data[12] == 0))
{
gTasks[taskId].data[11] ^= 1;
gTasks[taskId].data[12] ^= 1;
if (--gTasks[taskId].data[3] == 0)
{
gSprites[spriteId].pos2.x = 0;
gSprites[spriteId].pos2.y = 0;
DestroyAnimVisualTask(taskId);
}
}
}
void sub_80998B0(u8 taskId)
{
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
sub_80758E0(spriteId, gBattleAnimArgs[4]);
gTasks[taskId].data[0] = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].data[3] = gBattleAnimArgs[2];
gTasks[taskId].data[4] = spriteId;
gTasks[taskId].data[10] = 0x100;
gTasks[taskId].data[11] = 0x100;
gTasks[taskId].func = sub_8099908;
}
void sub_8099908(u8 taskId)
{
u8 spriteId;
gTasks[taskId].data[10] += gTasks[taskId].data[0];
gTasks[taskId].data[11] += gTasks[taskId].data[1];
spriteId = gTasks[taskId].data[4];
obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[11], 0);
if (--gTasks[taskId].data[2] == 0)
{
if (gTasks[taskId].data[3] > 0)
{
gTasks[taskId].data[0] = -gTasks[taskId].data[0];
gTasks[taskId].data[1] = -gTasks[taskId].data[1];
gTasks[taskId].data[2] = gTasks[taskId].data[3];
gTasks[taskId].data[3] = 0;
}
else
{
sub_8075980(spriteId);
DestroyAnimVisualTask(taskId);
}
}
}
void sub_8099980(u8 taskId)
{
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
sub_80758E0(spriteId, 0);
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = gBattleAnimArgs[0];
if (gBattleAnimArgs[3] != 1)
gTasks[taskId].data[3] = 0;
else
gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
gTasks[taskId].data[4] = gBattleAnimArgs[1];
gTasks[taskId].data[5] = spriteId;
gTasks[taskId].data[6] = gBattleAnimArgs[3];
if (sub_8073788())
gTasks[taskId].data[7] = 1;
else
{
if (gBattleAnimArgs[2] == 0)
gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER ? 1 : 0;
else
gTasks[taskId].data[7] = GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER ? 1 : 0;
}
if (gTasks[taskId].data[7] && !sub_8073788())
{
s16 tmp;
tmp = gTasks[taskId].data[3];
gTasks[taskId].data[3] = -tmp;
tmp = gTasks[taskId].data[4];
gTasks[taskId].data[4] = -tmp;
}
gTasks[taskId].func = sub_8099B54;
}
void sub_8099A78(u8 taskId)
{
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
sub_80758E0(spriteId, 0);
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = gBattleAnimArgs[0];
if (gBattleAnimArgs[2] == 0)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
}
else
{
if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
}
if (gBattleAnimArgs[3] != 1)
gTasks[taskId].data[3] = 0;
else
gTasks[taskId].data[3] = gBattleAnimArgs[0] * gBattleAnimArgs[1];
gTasks[taskId].data[4] = gBattleAnimArgs[1];
gTasks[taskId].data[5] = spriteId;
gTasks[taskId].data[6] = gBattleAnimArgs[3];
gTasks[taskId].data[7] = 1;
if (gTasks[taskId].data[7] )
{
s16 tmp;
tmp = gTasks[taskId].data[3];
gTasks[taskId].data[3] = -tmp;
tmp = gTasks[taskId].data[4];
gTasks[taskId].data[4] = -tmp;
}
gTasks[taskId].func = sub_8099B54;
}
void sub_8099B54(u8 taskId)
{
s16 tmp;
gTasks[taskId].data[3] += gTasks[taskId].data[4];
obj_id_set_rotscale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
if (gTasks[taskId].data[7])
sub_80759DC(gTasks[taskId].data[5]);
if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
{
switch (gTasks[taskId].data[6])
{
case 1:
sub_8075980(gTasks[taskId].data[5]);
// fallthrough
case 0:
default:
DestroyAnimVisualTask(taskId);
break;
case 2:
gTasks[taskId].data[1] = 0;
tmp = gTasks[taskId].data[4];
gTasks[taskId].data[4] = -tmp;
gTasks[taskId].data[6] = 1;
break;
}
}
}
void sub_8099BD4(u8 taskId)
{
if (gBattleAnimArgs[0] == 0)
{
gTasks[taskId].data[15] = gUnknown_2037EEC / 12;
if (gTasks[taskId].data[15] < 1)
gTasks[taskId].data[15] = 1;
if (gTasks[taskId].data[15] > 16)
gTasks[taskId].data[15] = 16;
}
else
{
gTasks[taskId].data[15] = gUnknown_2037EE8 / 12;
if (gTasks[taskId].data[15] < 1)
gTasks[taskId].data[15] = 1;
if (gTasks[taskId].data[15] > 16)
gTasks[taskId].data[15] = 16;
}
gTasks[taskId].data[14] = gTasks[taskId].data[15] / 2;
gTasks[taskId].data[13] = gTasks[taskId].data[14] + (gTasks[taskId].data[15] & 1);
gTasks[taskId].data[12] = 0;
gTasks[taskId].data[10] = gBattleAnimArgs[3];
gTasks[taskId].data[11] = gBattleAnimArgs[4];
gTasks[taskId].data[7] = GetAnimBankSpriteId(1);
gTasks[taskId].data[8] = gSprites[gTasks[taskId].data[7]].pos2.x;
gTasks[taskId].data[9] = gSprites[gTasks[taskId].data[7]].pos2.y;
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = gBattleAnimArgs[1];
gTasks[taskId].data[2] = gBattleAnimArgs[2];
gTasks[taskId].func = sub_8099CB8;
}
void sub_8099CB8(u8 taskId)
{
struct Task *task = &gTasks[taskId];
if (++task->data[0] > task->data[1])
{
task->data[0] = 0;
task->data[12] = (task->data[12] + 1) & 1;
if (task->data[10])
{
if (task->data[12])
{
gSprites[task->data[7]].pos2.x = task->data[8] + task->data[13];
}
else
{
gSprites[task->data[7]].pos2.x = task->data[8] - task->data[14];
}
}
if (task->data[11])
{
if (task->data[12])
{
gSprites[task->data[7]].pos2.y = task->data[15];
}
else
{
gSprites[task->data[7]].pos2.y = 0;
}
}
if (!--task->data[2])
{
gSprites[task->data[7]].pos2.x = 0;
gSprites[task->data[7]].pos2.y = 0;
DestroyAnimVisualTask(taskId);
return;
}
}
}