@@ -92,7 +92,7 @@ const struct SpriteTemplate gUnknown_83D4EB4 =
|
||||
// arg 4: frame delay
|
||||
void AnimTask_ShakeMon(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
if (spriteId == 0xFF)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
@@ -150,7 +150,7 @@ void AnimTask_ShakeMon2(u8 taskId)
|
||||
|
||||
if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT)
|
||||
{
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
if (spriteId == 0xFF)
|
||||
abort = TRUE;
|
||||
}
|
||||
@@ -228,7 +228,7 @@ static void AnimTask_ShakeMon2Step(u8 taskId)
|
||||
// arg 4: delay
|
||||
void AnimTask_ShakeMonInPlace(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
if (spriteId == 0xFF)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
@@ -290,7 +290,7 @@ static void AnimTask_ShakeMonInPlaceStep(u8 taskId)
|
||||
// arg 4: duration
|
||||
void AnimTask_ShakeAndSinkMon(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
|
||||
gSprites[spriteId].pos2.x = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
@@ -331,7 +331,7 @@ void AnimTask_TranslateMonElliptical(u8 taskId)
|
||||
{
|
||||
u8 wavePeriod = 1;
|
||||
u8 i;
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
if (gBattleAnimArgs[4] > 5)
|
||||
gBattleAnimArgs[4] = 5;
|
||||
for (i = 0; i < gBattleAnimArgs[4]; i++)
|
||||
@@ -414,7 +414,7 @@ static void DoVerticalDip(struct Sprite * sprite)
|
||||
{
|
||||
u8 spriteId;
|
||||
sprite->invisible = TRUE;
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
|
||||
sprite->data[0] = gBattleAnimArgs[0];
|
||||
sprite->data[1] = 0;
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
@@ -581,7 +581,7 @@ void AnimTask_WindUpLunge(u8 taskId)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[5] = -gBattleAnimArgs[5];
|
||||
}
|
||||
gTasks[taskId].data[0] = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
gTasks[taskId].data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1] * 256 / gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
@@ -627,7 +627,7 @@ void sub_80995FC(u8 taskId)
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[0]);
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
break;
|
||||
case 2:
|
||||
if (!IsBattlerSpriteVisible(gBattleAnimAttacker ^ BIT_FLANK))
|
||||
@@ -678,7 +678,7 @@ void AnimTask_SwayMon(u8 taskId)
|
||||
u8 spriteId;
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
spriteId = GetAnimBankSpriteId(gBattleAnimArgs[4]);
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[4]);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
@@ -735,7 +735,7 @@ static void AnimTask_SwayMonStep(u8 taskId)
|
||||
// arg 4: sprite object mode
|
||||
void AnimTask_ScaleMonAndRestore(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[3]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[3]);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, gBattleAnimArgs[4]);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
@@ -773,7 +773,7 @@ static void AnimTask_ScaleMonAndRestoreStep(u8 taskId)
|
||||
|
||||
void sub_8099980(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, 0);
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
@@ -806,7 +806,7 @@ void sub_8099980(u8 taskId)
|
||||
|
||||
void sub_8099A78(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBankSpriteId(gBattleAnimArgs[2]);
|
||||
u8 spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[2]);
|
||||
PrepareBattlerSpriteForRotScale(spriteId, 0);
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
@@ -844,7 +844,7 @@ static void sub_8099B54(u8 taskId)
|
||||
gTasks[taskId].data[3] += gTasks[taskId].data[4];
|
||||
SetSpriteRotScale(gTasks[taskId].data[5], 0x100, 0x100, gTasks[taskId].data[3]);
|
||||
if (gTasks[taskId].data[7])
|
||||
sub_80759DC(gTasks[taskId].data[5]);
|
||||
SetBattlerSpriteYOffsetFromRotation(gTasks[taskId].data[5]);
|
||||
if (++gTasks[taskId].data[1] >= gTasks[taskId].data[2])
|
||||
{
|
||||
switch (gTasks[taskId].data[6])
|
||||
@@ -888,7 +888,7 @@ void sub_8099BD4(u8 taskId)
|
||||
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[7] = GetAnimBattlerSpriteId(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;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,313 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "battle_anim.h"
|
||||
#include "sound.h"
|
||||
#include "task.h"
|
||||
#include "constants/battle_anim.h"
|
||||
#include "constants/species.h"
|
||||
|
||||
static void sub_80DCE78(u8 taskId);
|
||||
static void sub_80DCEE4(u8 taskId);
|
||||
static void sub_80DCFE8(u8 taskId);
|
||||
static void sub_80DD270(u8 taskId);
|
||||
static void sub_80DD390(u8 taskId);
|
||||
static void sub_80DD4D4(u8 taskId);
|
||||
|
||||
void sub_80DCE10(u8 taskId)
|
||||
{
|
||||
s8 pan1, pan2, panIncrement;
|
||||
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
pan1 = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
pan2 = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
|
||||
panIncrement = CalculatePanIncrement(pan1, pan2, 2);
|
||||
gTasks[taskId].data[2] = pan1;
|
||||
gTasks[taskId].data[3] = pan2;
|
||||
gTasks[taskId].data[4] = panIncrement;
|
||||
gTasks[taskId].data[10] = 10;
|
||||
gTasks[taskId].func = sub_80DCE78;
|
||||
}
|
||||
|
||||
static void sub_80DCE78(u8 taskId)
|
||||
{
|
||||
s16 pan = gTasks[taskId].data[2];
|
||||
s8 panIncrement = gTasks[taskId].data[4];
|
||||
|
||||
if (++gTasks[taskId].data[11] == 111)
|
||||
{
|
||||
gTasks[taskId].data[10] = 5;
|
||||
gTasks[taskId].data[11] = 0;
|
||||
gTasks[taskId].func = sub_80DCEE4;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (++gTasks[taskId].data[10] == 11)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
PlaySE12WithPanning(gTasks[taskId].data[0], pan);
|
||||
}
|
||||
pan += panIncrement;
|
||||
gTasks[taskId].data[2] = KeepPanInRange(pan, panIncrement);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80DCEE4(u8 taskId)
|
||||
{
|
||||
if (++gTasks[taskId].data[10] == 6)
|
||||
{
|
||||
s8 pan;
|
||||
|
||||
gTasks[taskId].data[10] = 0;
|
||||
pan = BattleAnimAdjustPanning(SOUND_PAN_TARGET);
|
||||
PlaySE12WithPanning(gTasks[taskId].data[1], pan);
|
||||
if (++gTasks[taskId].data[11] == 2)
|
||||
DestroyAnimSoundTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void mas_80DCF38(u8 taskId)
|
||||
{
|
||||
u16 songId = gBattleAnimArgs[0];
|
||||
s8 targetPan = gBattleAnimArgs[2];
|
||||
s8 panIncrement = gBattleAnimArgs[3];
|
||||
u8 r10 = gBattleAnimArgs[4];
|
||||
u8 r7 = gBattleAnimArgs[5];
|
||||
u8 r9 = gBattleAnimArgs[6];
|
||||
s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
|
||||
|
||||
targetPan = BattleAnimAdjustPanning(targetPan);
|
||||
panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
|
||||
gTasks[taskId].data[0] = songId;
|
||||
gTasks[taskId].data[1] = sourcePan;
|
||||
gTasks[taskId].data[2] = targetPan;
|
||||
gTasks[taskId].data[3] = panIncrement;
|
||||
gTasks[taskId].data[4] = r10;
|
||||
gTasks[taskId].data[5] = r7;
|
||||
gTasks[taskId].data[6] = r9;
|
||||
gTasks[taskId].data[10] = 0;
|
||||
gTasks[taskId].data[11] = sourcePan;
|
||||
gTasks[taskId].data[12] = r9;
|
||||
gTasks[taskId].func = sub_80DCFE8;
|
||||
sub_80DCFE8(taskId);
|
||||
}
|
||||
|
||||
static void sub_80DCFE8(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6])
|
||||
{
|
||||
gTasks[taskId].data[12] = 0;
|
||||
PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[11]);
|
||||
if (--gTasks[taskId].data[4] == 0)
|
||||
{
|
||||
DestroyAnimSoundTask(taskId);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])
|
||||
{
|
||||
u16 dPan, oldPan;
|
||||
|
||||
gTasks[taskId].data[10] = 0;
|
||||
dPan = gTasks[taskId].data[3];
|
||||
oldPan = gTasks[taskId].data[11] ;
|
||||
gTasks[taskId].data[11] = dPan + oldPan;
|
||||
gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80DD06C(u8 taskId)
|
||||
{
|
||||
u16 species = SPECIES_NONE;
|
||||
u8 battlerId;
|
||||
s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
|
||||
// Get wanted battler.
|
||||
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
|
||||
battlerId = gBattleAnimAttacker;
|
||||
else if (gBattleAnimArgs[0] == ANIM_TARGET)
|
||||
battlerId = gBattleAnimTarget;
|
||||
else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)
|
||||
battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
|
||||
else
|
||||
battlerId = BATTLE_PARTNER(gBattleAnimTarget);
|
||||
// Check if battler is visible.
|
||||
if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER)
|
||||
&& !IsBattlerSpriteVisible(battlerId))
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
}
|
||||
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
|
||||
if (species != SPECIES_NONE)
|
||||
PlayCry3(species, pan, 3);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80DD148(u8 taskId)
|
||||
{
|
||||
u16 species = SPECIES_NONE;
|
||||
u8 battlerId;
|
||||
s8 pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
|
||||
// Get wanted battler.
|
||||
if (gBattleAnimArgs[0] == ANIM_ATTACKER)
|
||||
battlerId = gBattleAnimAttacker;
|
||||
else if (gBattleAnimArgs[0] == ANIM_TARGET)
|
||||
battlerId = gBattleAnimTarget;
|
||||
else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER)
|
||||
battlerId = BATTLE_PARTNER(gBattleAnimAttacker);
|
||||
else
|
||||
battlerId = BATTLE_PARTNER(gBattleAnimTarget);
|
||||
// Check if battler is visible.
|
||||
if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER)
|
||||
&& !IsBattlerSpriteVisible(battlerId))
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
return;
|
||||
}
|
||||
if (GetBattlerSide(battlerId) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES);
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[1] = species;
|
||||
gTasks[taskId].data[2] = pan;
|
||||
if (species != SPECIES_NONE)
|
||||
{
|
||||
if (gBattleAnimArgs[1] == TASK_NONE)
|
||||
PlayCry3(species, pan, 9);
|
||||
else
|
||||
PlayCry3(species, pan, 7);
|
||||
gTasks[taskId].func = sub_80DD270;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80DD270(u8 taskId)
|
||||
{
|
||||
u16 species = gTasks[taskId].data[1];
|
||||
s8 pan = gTasks[taskId].data[2];
|
||||
|
||||
if (gTasks[taskId].data[9] < 2)
|
||||
{
|
||||
++gTasks[taskId].data[9];
|
||||
}
|
||||
else if (gTasks[taskId].data[0] == TASK_NONE)
|
||||
{
|
||||
if (!IsCryPlaying())
|
||||
{
|
||||
PlayCry3(species, pan, 10);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else if (!IsCryPlaying())
|
||||
{
|
||||
PlayCry3(species, pan, 8);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80DD2F4(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[9] < 2)
|
||||
++gTasks[taskId].data[9];
|
||||
else if (!IsCryPlaying())
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80DD334(u8 taskId)
|
||||
{
|
||||
u16 species;
|
||||
s8 pan;
|
||||
|
||||
pan = BattleAnimAdjustPanning(SOUND_PAN_ATTACKER);
|
||||
species = gAnimBattlerSpecies[gBattleAnimAttacker];
|
||||
gTasks[taskId].data[1] = species;
|
||||
gTasks[taskId].data[2] = pan;
|
||||
if (species != SPECIES_NONE)
|
||||
{
|
||||
PlayCry3(species, pan, 4);
|
||||
gTasks[taskId].func = sub_80DD390;
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80DD390(u8 taskId)
|
||||
{
|
||||
|
||||
if (gTasks[taskId].data[9] < 2)
|
||||
{
|
||||
++gTasks[taskId].data[9];
|
||||
}
|
||||
else if (!IsCryPlaying())
|
||||
{
|
||||
u16 species = gTasks[taskId].data[1];
|
||||
s8 pan = gTasks[taskId].data[2];
|
||||
|
||||
PlayCry3(species, pan, 6);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80DD3DC(u8 taskId)
|
||||
{
|
||||
u16 songId = gBattleAnimArgs[0];
|
||||
s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
|
||||
|
||||
PlaySE1WithPanning(songId, pan);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80DD410(u8 taskId)
|
||||
{
|
||||
u16 songId = gBattleAnimArgs[0];
|
||||
s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]);
|
||||
|
||||
PlaySE2WithPanning(songId, pan);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80DD444(u8 taskId)
|
||||
{
|
||||
s8 targetPan = gBattleAnimArgs[1];
|
||||
s8 panIncrement = gBattleAnimArgs[2];
|
||||
u16 r9 = gBattleAnimArgs[3];
|
||||
s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[0]);
|
||||
|
||||
targetPan = BattleAnimAdjustPanning(targetPan);
|
||||
panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement);
|
||||
gTasks[taskId].data[1] = sourcePan;
|
||||
gTasks[taskId].data[2] = targetPan;
|
||||
gTasks[taskId].data[3] = panIncrement;
|
||||
gTasks[taskId].data[5] = r9;
|
||||
gTasks[taskId].data[10] = 0;
|
||||
gTasks[taskId].data[11] = sourcePan;
|
||||
gTasks[taskId].func = sub_80DD4D4;
|
||||
sub_80DD4D4(taskId);
|
||||
}
|
||||
|
||||
static void sub_80DD4D4(u8 taskId)
|
||||
{
|
||||
u16 oldPan, panIncrement = gTasks[taskId].data[3];
|
||||
|
||||
if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5])
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
oldPan = gTasks[taskId].data[11];
|
||||
gTasks[taskId].data[11] = panIncrement + oldPan;
|
||||
gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11], oldPan);
|
||||
}
|
||||
gUnknown_2037F24 = gTasks[taskId].data[11];
|
||||
if (gTasks[taskId].data[11] == gTasks[taskId].data[2])
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
@@ -0,0 +1,946 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "battle_anim.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "graphics.h"
|
||||
#include "malloc.h"
|
||||
#include "palette.h"
|
||||
#include "sound.h"
|
||||
#include "sprite.h"
|
||||
#include "task.h"
|
||||
#include "util.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
struct AnimStatsChangeData
|
||||
{
|
||||
u8 battler1;
|
||||
u8 battler2;
|
||||
u8 higherPriority;
|
||||
s16 data[8];
|
||||
u16 species;
|
||||
};
|
||||
|
||||
static void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes);
|
||||
static void AnimTask_BlendSpriteColor_Step2(u8 taskId);
|
||||
static void sub_80BAB78(u8 taskId);
|
||||
static void sub_80BABD0(u8 taskId);
|
||||
static void sub_80BACA8(struct Sprite *sprite);
|
||||
static void sub_80BAF38(u8 taskId);
|
||||
static void sub_80BB0D8(u8 taskId);
|
||||
static void sub_80BB2A0(u8 taskId);
|
||||
static void sub_80BB4B8(u8 taskId);
|
||||
static void sub_80BB6CC(u8 taskId);
|
||||
static void sub_80BB790(u32 selectedPalettes, u16 color);
|
||||
static void sub_80BB8A4(u8 taskId);
|
||||
static void sub_80BBC2C(u8 taskId);
|
||||
static void sub_80BC19C(u8 taskId);
|
||||
|
||||
static EWRAM_DATA struct AnimStatsChangeData *sAnimStatsChangeData = NULL;
|
||||
|
||||
static const u16 gUnknown_83E7CC8[] = { RGB(31, 31, 31) };
|
||||
const u8 gUnknown_83E7CCA[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT };
|
||||
const u8 gUnknown_83E7CCE[] = { REG_OFFSET_BG0CNT, REG_OFFSET_BG1CNT, REG_OFFSET_BG2CNT, REG_OFFSET_BG3CNT };
|
||||
|
||||
void sub_80BA7F8(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]);
|
||||
|
||||
selectedPalettes |= sub_8075CB8((gBattleAnimArgs[0] >> 7) & 1,
|
||||
(gBattleAnimArgs[0] >> 8) & 1,
|
||||
(gBattleAnimArgs[0] >> 9) & 1,
|
||||
(gBattleAnimArgs[0] >> 10) & 1);
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
void sub_80BA83C(u8 taskId)
|
||||
{
|
||||
u8 battler;
|
||||
u32 selectedPalettes;
|
||||
u8 animBattlers[2];
|
||||
|
||||
animBattlers[1] = 0xFF;
|
||||
selectedPalettes = UnpackSelectedBattleAnimPalettes(1);
|
||||
switch (gBattleAnimArgs[0])
|
||||
{
|
||||
case 2:
|
||||
selectedPalettes = 0;
|
||||
// fall through
|
||||
case 0:
|
||||
animBattlers[0] = gBattleAnimAttacker;
|
||||
break;
|
||||
case 3:
|
||||
selectedPalettes = 0;
|
||||
// fall through
|
||||
case 1:
|
||||
animBattlers[0] = gBattleAnimTarget;
|
||||
break;
|
||||
case 4:
|
||||
animBattlers[0] = gBattleAnimAttacker;
|
||||
animBattlers[1] = gBattleAnimTarget;
|
||||
break;
|
||||
case 5:
|
||||
animBattlers[0] = 0xFF;
|
||||
break;
|
||||
case 6:
|
||||
selectedPalettes = 0;
|
||||
animBattlers[0] = BATTLE_PARTNER(gBattleAnimAttacker);
|
||||
break;
|
||||
case 7:
|
||||
selectedPalettes = 0;
|
||||
animBattlers[0] = BATTLE_PARTNER(gBattleAnimTarget);
|
||||
break;
|
||||
}
|
||||
for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)
|
||||
{
|
||||
if (battler != animBattlers[0]
|
||||
&& battler != animBattlers[1]
|
||||
&& IsBattlerSpriteVisible(battler))
|
||||
selectedPalettes |= 0x10000 << sub_8075D80(battler);
|
||||
}
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
void AnimTask_SetCamouflageBlend(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]);
|
||||
|
||||
switch (gBattleTerrain)
|
||||
{
|
||||
case BATTLE_TERRAIN_GRASS:
|
||||
gBattleAnimArgs[4] = RGB(12, 24, 2);
|
||||
break;
|
||||
case BATTLE_TERRAIN_LONG_GRASS:
|
||||
gBattleAnimArgs[4] = RGB(0, 15, 2);
|
||||
break;
|
||||
case BATTLE_TERRAIN_SAND:
|
||||
gBattleAnimArgs[4] = RGB(30, 24, 11);
|
||||
break;
|
||||
case BATTLE_TERRAIN_UNDERWATER:
|
||||
gBattleAnimArgs[4] = RGB(0, 0, 18);
|
||||
break;
|
||||
case BATTLE_TERRAIN_WATER:
|
||||
gBattleAnimArgs[4] = RGB(11, 22, 31);
|
||||
break;
|
||||
case BATTLE_TERRAIN_POND:
|
||||
gBattleAnimArgs[4] = RGB(11, 22, 31);
|
||||
break;
|
||||
case BATTLE_TERRAIN_MOUNTAIN:
|
||||
gBattleAnimArgs[4] = RGB(22, 16, 10);
|
||||
break;
|
||||
case BATTLE_TERRAIN_CAVE:
|
||||
gBattleAnimArgs[4] = RGB(14, 9, 3);
|
||||
break;
|
||||
case BATTLE_TERRAIN_BUILDING:
|
||||
gBattleAnimArgs[4] = RGB(31, 31, 31);
|
||||
break;
|
||||
case BATTLE_TERRAIN_PLAIN:
|
||||
gBattleAnimArgs[4] = RGB(31, 31, 31);
|
||||
break;
|
||||
}
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
void AnimTask_BlendParticle(u8 taskId)
|
||||
{
|
||||
u8 paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]);
|
||||
u32 selectedPalettes = 1 << (paletteIndex + 16);
|
||||
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
static void StartBlendAnimSpriteColor(u8 taskId, u32 selectedPalettes)
|
||||
{
|
||||
gTasks[taskId].data[0] = selectedPalettes;
|
||||
gTasks[taskId].data[1] = selectedPalettes >> 16;
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[10] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].func = AnimTask_BlendSpriteColor_Step2;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
|
||||
static void AnimTask_BlendSpriteColor_Step2(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
u16 singlePaletteMask = 0;
|
||||
|
||||
if (gTasks[taskId].data[9] == gTasks[taskId].data[2])
|
||||
{
|
||||
gTasks[taskId].data[9] = 0;
|
||||
selectedPalettes = gTasks[taskId].data[0] | (gTasks[taskId].data[1] << 16);
|
||||
while (selectedPalettes)
|
||||
{
|
||||
if (selectedPalettes & 1)
|
||||
BlendPalette(singlePaletteMask, 16, gTasks[taskId].data[10], gTasks[taskId].data[5]);
|
||||
singlePaletteMask += 0x10;
|
||||
selectedPalettes >>= 1;
|
||||
}
|
||||
if (gTasks[taskId].data[10] < gTasks[taskId].data[4])
|
||||
++gTasks[taskId].data[10];
|
||||
else if (gTasks[taskId].data[10] > gTasks[taskId].data[4])
|
||||
--gTasks[taskId].data[10];
|
||||
else
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
++gTasks[taskId].data[9];
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BAB38(u8 taskId)
|
||||
{
|
||||
BeginHardwarePaletteFade(gBattleAnimArgs[0],
|
||||
gBattleAnimArgs[1],
|
||||
gBattleAnimArgs[2],
|
||||
gBattleAnimArgs[3],
|
||||
gBattleAnimArgs[4]);
|
||||
gTasks[taskId].func = sub_80BAB78;
|
||||
}
|
||||
|
||||
static void sub_80BAB78(u8 taskId)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BAB98(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
task->data[0] = gBattleAnimArgs[0];
|
||||
task->data[1] = 0;
|
||||
task->data[2] = gBattleAnimArgs[1];
|
||||
task->data[3] = gBattleAnimArgs[2];
|
||||
task->data[4] = gBattleAnimArgs[3];
|
||||
task->data[5] = 0;
|
||||
task->func = sub_80BABD0;
|
||||
}
|
||||
static void sub_80BABD0(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (task->data[4])
|
||||
{
|
||||
if (task->data[1])
|
||||
{
|
||||
--task->data[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[6] = CloneBattlerSpriteWithBlend(task->data[0]);
|
||||
if (task->data[6] >= 0)
|
||||
{
|
||||
gSprites[task->data[6]].oam.priority = task->data[0] ? 1 : 2;
|
||||
gSprites[task->data[6]].data[0] = task->data[3];
|
||||
gSprites[task->data[6]].data[1] = taskId;
|
||||
gSprites[task->data[6]].data[2] = 5;
|
||||
gSprites[task->data[6]].callback = sub_80BACA8;
|
||||
++task->data[5];
|
||||
}
|
||||
--task->data[4];
|
||||
task->data[1] = task->data[2];
|
||||
}
|
||||
}
|
||||
else if (task->data[5] == 0)
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BACA8(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0])
|
||||
{
|
||||
--sprite->data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
--gTasks[sprite->data[1]].data[sprite->data[2]];
|
||||
obj_delete_but_dont_free_vram(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BACEC(u8 taskId)
|
||||
{
|
||||
u16 species;
|
||||
s32 newSpriteId;
|
||||
u16 var0;
|
||||
u16 bg1Cnt;
|
||||
u8 spriteId;
|
||||
struct BattleAnimBgData animBgData;
|
||||
|
||||
var0 = 0;
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12));
|
||||
bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);
|
||||
((struct BgCnt *)&bg1Cnt)->priority = 0;
|
||||
((struct BgCnt *)&bg1Cnt)->screenSize = 0;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
if (!IsContest())
|
||||
{
|
||||
((struct BgCnt *)&bg1Cnt)->charBaseBlock = 1;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
}
|
||||
if (IsDoubleBattle() && !IsContest())
|
||||
{
|
||||
if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT
|
||||
|| GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT)
|
||||
{
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority -= 1;
|
||||
((struct BgCnt *)&bg1Cnt)->priority = 1;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
var0 = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
|
||||
spriteId = GetAnimBattlerSpriteId(0);
|
||||
newSpriteId = sub_8076E34(gBattleAnimAttacker, spriteId, species);
|
||||
sub_80752A0(&animBgData);
|
||||
AnimLoadCompressedBgTilemap(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_tilemap);
|
||||
if (IsContest())
|
||||
sub_80730C0(animBgData.paletteId, animBgData.bgTilemap, 0, 0);
|
||||
AnimLoadCompressedBgGfx(animBgData.bgId, gFile_graphics_battle_anims_masks_curse_sheet, animBgData.tilesOffset);
|
||||
LoadPalette(gUnknown_83E7CC8, animBgData.paletteId * 16 + 1, 2);
|
||||
gBattle_BG1_X = -gSprites[spriteId].pos1.x + 32;
|
||||
gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32;
|
||||
gTasks[taskId].data[0] = newSpriteId;
|
||||
gTasks[taskId].data[6] = var0;
|
||||
gTasks[taskId].func = sub_80BAF38;
|
||||
}
|
||||
|
||||
static void sub_80BAF38(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBgData;
|
||||
struct Sprite *sprite;
|
||||
u16 bg1Cnt;
|
||||
|
||||
gTasks[taskId].data[10] += 4;
|
||||
gBattle_BG1_Y -= 4;
|
||||
if (gTasks[taskId].data[10] == 64)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
gBattle_BG1_Y += 64;
|
||||
if (++gTasks[taskId].data[11] == 4)
|
||||
{
|
||||
sub_8073128(0);
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
if (!IsContest())
|
||||
{
|
||||
bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);
|
||||
((struct BgCnt *)&bg1Cnt)->charBaseBlock = 0;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
}
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
sprite = &gSprites[GetAnimBattlerSpriteId(0)]; // unused
|
||||
sprite = &gSprites[gTasks[taskId].data[0]];
|
||||
DestroySprite(sprite);
|
||||
sub_80752A0(&animBgData);
|
||||
sub_8075358(animBgData.bgId);
|
||||
if (gTasks[taskId].data[6] == 1)
|
||||
++gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority;
|
||||
gBattle_BG1_Y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BB088(u8 taskId)
|
||||
{
|
||||
u8 i;
|
||||
|
||||
sAnimStatsChangeData = AllocZeroed(sizeof(struct AnimStatsChangeData));
|
||||
for (i = 0; i < 8; ++i)
|
||||
sAnimStatsChangeData->data[i] = gBattleAnimArgs[i];
|
||||
gTasks[taskId].func = sub_80BB0D8;
|
||||
}
|
||||
|
||||
static void sub_80BB0D8(u8 taskId)
|
||||
{
|
||||
if (sAnimStatsChangeData->data[2] == 0)
|
||||
sAnimStatsChangeData->battler1 = gBattleAnimAttacker;
|
||||
else
|
||||
sAnimStatsChangeData->battler1 = gBattleAnimTarget;
|
||||
sAnimStatsChangeData->battler2 = BATTLE_PARTNER(sAnimStatsChangeData->battler1);
|
||||
if (IsContest() || (sAnimStatsChangeData->data[3] && !IsBattlerSpriteVisible(sAnimStatsChangeData->battler2)))
|
||||
sAnimStatsChangeData->data[3] = 0;
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);
|
||||
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
|
||||
if (IsDoubleBattle() && sAnimStatsChangeData->data[3] == 0)
|
||||
{
|
||||
if (GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_OPPONENT_RIGHT
|
||||
|| GetBattlerPosition(sAnimStatsChangeData->battler1) == B_POSITION_PLAYER_LEFT)
|
||||
{
|
||||
if (IsBattlerSpriteVisible(sAnimStatsChangeData->battler2) == TRUE)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[sAnimStatsChangeData->battler2]].oam.priority -= 1;
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
|
||||
sAnimStatsChangeData->higherPriority = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (GetBattlerSide(sAnimStatsChangeData->battler1) != B_SIDE_PLAYER)
|
||||
sAnimStatsChangeData->species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES);
|
||||
else
|
||||
sAnimStatsChangeData->species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[sAnimStatsChangeData->battler1]], MON_DATA_SPECIES);
|
||||
gTasks[taskId].func = sub_80BB2A0;
|
||||
}
|
||||
|
||||
static void sub_80BB2A0(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBgData;
|
||||
u8 spriteId, newSpriteId = 0;
|
||||
u8 battlerSpriteId;
|
||||
|
||||
battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler1];
|
||||
spriteId = sub_8076E34(sAnimStatsChangeData->battler1, battlerSpriteId, sAnimStatsChangeData->species);
|
||||
if (sAnimStatsChangeData->data[3])
|
||||
{
|
||||
battlerSpriteId = gBattlerSpriteIds[sAnimStatsChangeData->battler2];
|
||||
newSpriteId = sub_8076E34(sAnimStatsChangeData->battler2, battlerSpriteId, sAnimStatsChangeData->species);
|
||||
}
|
||||
sub_80752A0(&animBgData);
|
||||
if (sAnimStatsChangeData->data[0] == 0)
|
||||
AnimLoadCompressedBgTilemap(animBgData.bgId, gBattleStatMask1_Tilemap);
|
||||
else
|
||||
AnimLoadCompressedBgTilemap(animBgData.bgId, gBattleStatMask2_Tilemap);
|
||||
if (IsContest())
|
||||
sub_80730C0(animBgData.paletteId, animBgData.bgTilemap, 0, 0);
|
||||
AnimLoadCompressedBgGfx(animBgData.bgId, gBattleStatMask_Gfx, animBgData.tilesOffset);
|
||||
switch (sAnimStatsChangeData->data[1])
|
||||
{
|
||||
case 0:
|
||||
LoadCompressedPalette(gBattleStatMask2_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 1:
|
||||
LoadCompressedPalette(gBattleStatMask1_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 2:
|
||||
LoadCompressedPalette(gBattleStatMask3_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 3:
|
||||
LoadCompressedPalette(gBattleStatMask4_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 4:
|
||||
LoadCompressedPalette(gBattleStatMask6_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 5:
|
||||
LoadCompressedPalette(gBattleStatMask7_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
case 6:
|
||||
LoadCompressedPalette(gBattleStatMask8_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
default:
|
||||
LoadCompressedPalette(gBattleStatMask5_Pal, animBgData.paletteId * 16, 32);
|
||||
break;
|
||||
}
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
if (sAnimStatsChangeData->data[0] == 1)
|
||||
{
|
||||
gBattle_BG1_X = 64;
|
||||
gTasks[taskId].data[1] = -3;
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[1] = 3;
|
||||
}
|
||||
|
||||
if (sAnimStatsChangeData->data[4] == 0)
|
||||
{
|
||||
gTasks[taskId].data[4] = 10;
|
||||
gTasks[taskId].data[5] = 20;
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[4] = 13;
|
||||
gTasks[taskId].data[5] = 30;
|
||||
}
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[2] = sAnimStatsChangeData->data[3];
|
||||
gTasks[taskId].data[3] = newSpriteId;
|
||||
gTasks[taskId].data[6] = sAnimStatsChangeData->higherPriority;
|
||||
gTasks[taskId].data[7] = gBattlerSpriteIds[sAnimStatsChangeData->battler2];
|
||||
gTasks[taskId].func = sub_80BB4B8;
|
||||
if (sAnimStatsChangeData->data[0] == 0)
|
||||
PlaySE12WithPanning(SE_W287, BattleAnimAdjustPanning2(PAN_SIDE_PLAYER));
|
||||
else
|
||||
PlaySE12WithPanning(SE_W287B, BattleAnimAdjustPanning2(PAN_SIDE_PLAYER));
|
||||
}
|
||||
|
||||
static void sub_80BB4B8(u8 taskId)
|
||||
{
|
||||
gBattle_BG1_Y += gTasks[taskId].data[1];
|
||||
switch (gTasks[taskId].data[15])
|
||||
{
|
||||
case 0:
|
||||
if (gTasks[taskId].data[11]++ > 0)
|
||||
{
|
||||
gTasks[taskId].data[11] = 0;
|
||||
++gTasks[taskId].data[12];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
|
||||
if (gTasks[taskId].data[12] == gTasks[taskId].data[4])
|
||||
++gTasks[taskId].data[15];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++gTasks[taskId].data[10] == gTasks[taskId].data[5])
|
||||
++gTasks[taskId].data[15];
|
||||
break;
|
||||
case 2:
|
||||
if (gTasks[taskId].data[11]++ > 0)
|
||||
{
|
||||
gTasks[taskId].data[11] = 0;
|
||||
--gTasks[taskId].data[12];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
|
||||
if (gTasks[taskId].data[12] == 0)
|
||||
{
|
||||
sub_8073128(0);
|
||||
++gTasks[taskId].data[15];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[0]]);
|
||||
if (gTasks[taskId].data[2])
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[3]]);
|
||||
if (gTasks[taskId].data[6] == 1)
|
||||
++gSprites[gTasks[taskId].data[7]].oam.priority;
|
||||
Free(sAnimStatsChangeData);
|
||||
sAnimStatsChangeData = NULL;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BB660(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes = sub_8075CB8(1, 1, 1, 1);
|
||||
|
||||
sub_80BB790(selectedPalettes, 0);
|
||||
gTasks[taskId].data[14] = selectedPalettes >> 16;
|
||||
selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
|
||||
sub_80BB790(selectedPalettes, 0xFFFF);
|
||||
gTasks[taskId].data[15] = selectedPalettes;
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[1] = 0;
|
||||
gTasks[taskId].func = sub_80BB6CC;
|
||||
}
|
||||
|
||||
static void sub_80BB6CC(u8 taskId)
|
||||
{
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[1] > 6)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
task->data[2] = 16;
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
--task->data[2];
|
||||
for (i = 0; i < 16; ++i)
|
||||
{
|
||||
if ((task->data[15] >> i) & 1)
|
||||
{
|
||||
u16 paletteOffset = i * 16;
|
||||
BlendPalette(paletteOffset, 16, task->data[2], 0xFFFF);
|
||||
}
|
||||
|
||||
if ((task->data[14] >> i) & 1)
|
||||
{
|
||||
u16 paletteOffset = i * 16 + 0x100;
|
||||
BlendPalette(paletteOffset, 16, task->data[2], 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (task->data[2] == 0)
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BB790(u32 selectedPalettes, u16 color)
|
||||
{
|
||||
u16 i, curOffset, paletteOffset;
|
||||
|
||||
for (i = 0; i < 32; selectedPalettes >>= 1, ++i)
|
||||
if (selectedPalettes & 1)
|
||||
for (curOffset = i * 16, paletteOffset = curOffset; curOffset < paletteOffset + 16; ++curOffset)
|
||||
gPlttBufferFaded[curOffset] = color;
|
||||
}
|
||||
|
||||
void sub_80BB7DC(u8 taskId)
|
||||
{
|
||||
s32 j;
|
||||
u32 battler, selectedPalettes = 0;
|
||||
|
||||
for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)
|
||||
if (gBattleAnimAttacker != battler)
|
||||
selectedPalettes |= 1 << (battler + 16);
|
||||
for (j = 5; j != 0; --j)
|
||||
gBattleAnimArgs[j] = gBattleAnimArgs[j - 1];
|
||||
StartBlendAnimSpriteColor(taskId, selectedPalettes);
|
||||
}
|
||||
|
||||
void sub_80BB82C(u8 taskId)
|
||||
{
|
||||
u8 newTaskId;
|
||||
|
||||
sub_8075458(0);
|
||||
newTaskId = CreateTask(sub_80BB8A4, 5);
|
||||
if (gBattleAnimArgs[2] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
}
|
||||
gTasks[newTaskId].data[1] = gBattleAnimArgs[0];
|
||||
gTasks[newTaskId].data[2] = gBattleAnimArgs[1];
|
||||
gTasks[newTaskId].data[3] = gBattleAnimArgs[3];
|
||||
++gTasks[newTaskId].data[0];
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
static void sub_80BB8A4(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[10] += gTasks[taskId].data[1];
|
||||
gTasks[taskId].data[11] += gTasks[taskId].data[2];
|
||||
gBattle_BG3_X += gTasks[taskId].data[10] >> 8;
|
||||
gBattle_BG3_Y += gTasks[taskId].data[11] >> 8;
|
||||
gTasks[taskId].data[10] &= 0xFF;
|
||||
gTasks[taskId].data[11] &= 0xFF;
|
||||
if (gBattleAnimArgs[7] == gTasks[taskId].data[3])
|
||||
{
|
||||
gBattle_BG3_X = 0;
|
||||
gBattle_BG3_Y = 0;
|
||||
sub_8075458(1);
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void AnimTask_GetAttackerSide(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[7] = GetBattlerSide(gBattleAnimAttacker);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void AnimTask_GetTargetSide(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[7] = GetBattlerSide(gBattleAnimTarget);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void AnimTask_GetTargetIsAttackerPartner(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[7] = BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BB9B0(u8 taskId)
|
||||
{
|
||||
u16 battler;
|
||||
|
||||
for (battler = 0; battler < MAX_BATTLERS_COUNT; ++battler)
|
||||
if (battler != gBattleAnimAttacker && IsBattlerSpriteVisible(battler))
|
||||
gSprites[gBattlerSpriteIds[battler]].invisible = gBattleAnimArgs[0];
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBA20(u8 taskId, s32 unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u32 *gfx, const u32 *tilemap, const u32 *palette)
|
||||
{
|
||||
u16 species;
|
||||
u8 spriteId, newSpriteId = 0;
|
||||
u16 bg1Cnt;
|
||||
struct BattleAnimBgData animBgData;
|
||||
u8 battler2 = BATTLE_PARTNER(battler1);
|
||||
|
||||
if (IsContest() || (arg4 && !IsBattlerSpriteVisible(battler2)))
|
||||
arg4 = 0;
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
|
||||
bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);
|
||||
((vBgCnt *)&bg1Cnt)->priority = 0;
|
||||
((vBgCnt *)&bg1Cnt)->screenSize = 0;
|
||||
((vBgCnt *)&bg1Cnt)->areaOverflowMode = 1;
|
||||
if (!IsContest())
|
||||
((vBgCnt *)&bg1Cnt)->charBaseBlock = 1;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
if (GetBattlerSide(battler1) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES);
|
||||
spriteId = sub_8076E34(battler1, gBattlerSpriteIds[battler1], species);
|
||||
if (arg4)
|
||||
newSpriteId = sub_8076E34(battler2, gBattlerSpriteIds[battler2], species);
|
||||
sub_80752A0(&animBgData);
|
||||
AnimLoadCompressedBgTilemap(animBgData.bgId, tilemap);
|
||||
if (IsContest())
|
||||
sub_80730C0(animBgData.paletteId, animBgData.bgTilemap, 0, 0);
|
||||
AnimLoadCompressedBgGfx(animBgData.bgId, gfx, animBgData.tilesOffset);
|
||||
LoadCompressedPalette(palette, animBgData.paletteId * 16, 32);
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
gTasks[taskId].data[1] = arg2;
|
||||
gTasks[taskId].data[4] = arg5;
|
||||
gTasks[taskId].data[5] = arg7;
|
||||
gTasks[taskId].data[6] = arg6;
|
||||
gTasks[taskId].data[0] = spriteId;
|
||||
gTasks[taskId].data[2] = arg4;
|
||||
gTasks[taskId].data[3] = newSpriteId;
|
||||
gTasks[taskId].func = sub_80BBC2C;
|
||||
}
|
||||
|
||||
static void sub_80BBC2C(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[13] += gTasks[taskId].data[1] < 0 ? -gTasks[taskId].data[1] : gTasks[taskId].data[1];
|
||||
if (gTasks[taskId].data[1] < 0)
|
||||
gBattle_BG1_Y -= gTasks[taskId].data[13] >> 8;
|
||||
else
|
||||
gBattle_BG1_Y += gTasks[taskId].data[13] >> 8;
|
||||
gTasks[taskId].data[13] &= 0xFF;
|
||||
switch (gTasks[taskId].data[15])
|
||||
{
|
||||
case 0:
|
||||
if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6])
|
||||
{
|
||||
gTasks[taskId].data[11] = 0;
|
||||
++gTasks[taskId].data[12];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
|
||||
if (gTasks[taskId].data[12] == gTasks[taskId].data[4])
|
||||
++gTasks[taskId].data[15];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++gTasks[taskId].data[10] == gTasks[taskId].data[5])
|
||||
++gTasks[taskId].data[15];
|
||||
break;
|
||||
case 2:
|
||||
if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6])
|
||||
{
|
||||
gTasks[taskId].data[11] = 0;
|
||||
--gTasks[taskId].data[12];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[12], 16 - gTasks[taskId].data[12]));
|
||||
if (gTasks[taskId].data[12] == 0)
|
||||
{
|
||||
sub_8073128(0);
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR
|
||||
| WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR
|
||||
| WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
if (!IsContest())
|
||||
{
|
||||
u16 bg1Cnt = GetGpuReg(REG_OFFSET_BG1CNT);
|
||||
((vBgCnt *)&bg1Cnt)->charBaseBlock = 0;
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, bg1Cnt);
|
||||
}
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[0]]);
|
||||
if (gTasks[taskId].data[2])
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[3]]);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void AnimTask_GetBattleTerrain(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[0] = gBattleTerrain;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBE10(u8 taskId)
|
||||
{
|
||||
gMonSpritesGfxPtr->field_17C = AllocZeroed(0x2000);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBE3C(u8 taskId)
|
||||
{
|
||||
FREE_AND_SET_NULL(gMonSpritesGfxPtr->field_17C);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBE6C(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
s32 paletteIndex = 0;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
for (selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
|
||||
(selectedPalettes & 1) == 0;
|
||||
++paletteIndex)
|
||||
selectedPalettes >>= 1;
|
||||
else if (gBattleAnimArgs[0] == 1)
|
||||
paletteIndex = gBattleAnimAttacker + 16;
|
||||
else if (gBattleAnimArgs[0] == 2)
|
||||
paletteIndex = gBattleAnimTarget + 16;
|
||||
memcpy(&gMonSpritesGfxPtr->field_17C[gBattleAnimArgs[1] * 16], &gPlttBufferUnfaded[paletteIndex * 16], 32);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBF08(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
s32 paletteIndex = 0;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
for (selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
|
||||
(selectedPalettes & 1) == 0;
|
||||
++paletteIndex)
|
||||
selectedPalettes >>= 1;
|
||||
else if (gBattleAnimArgs[0] == 1)
|
||||
paletteIndex = gBattleAnimAttacker + 16;
|
||||
else if (gBattleAnimArgs[0] == 2)
|
||||
paletteIndex = gBattleAnimTarget + 16;
|
||||
memcpy(&gPlttBufferUnfaded[paletteIndex * 16], &gMonSpritesGfxPtr->field_17C[gBattleAnimArgs[1] * 16], 32);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BBFA4(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
s32 paletteIndex = 0;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
for (selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
|
||||
(selectedPalettes & 1) == 0;
|
||||
++paletteIndex)
|
||||
selectedPalettes >>= 1;
|
||||
else if (gBattleAnimArgs[0] == 1)
|
||||
paletteIndex = gBattleAnimAttacker + 16;
|
||||
else if (gBattleAnimArgs[0] == 2)
|
||||
paletteIndex = gBattleAnimTarget + 16;
|
||||
memcpy(&gPlttBufferUnfaded[paletteIndex * 16], &gPlttBufferFaded[paletteIndex * 16], 32);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void AnimTask_IsContest(u8 taskId)
|
||||
{
|
||||
if (IsContest())
|
||||
gBattleAnimArgs[7] = 1;
|
||||
else
|
||||
gBattleAnimArgs[7] = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BC060(u8 taskId)
|
||||
{
|
||||
gBattleAnimAttacker = gBattlerTarget;
|
||||
gBattleAnimTarget = gEffectBattler;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void AnimTask_IsTargetSameSide(u8 taskId)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
|
||||
gBattleAnimArgs[7] = 1;
|
||||
else
|
||||
gBattleAnimArgs[7] = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BC0DC(u8 taskId)
|
||||
{
|
||||
gBattleAnimTarget = gBattlerTarget;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BC0FC(u8 taskId)
|
||||
{
|
||||
gBattleAnimAttacker = gBattlerAttacker;
|
||||
gBattleAnimTarget = gEffectBattler;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80BC12C(u8 taskId)
|
||||
{
|
||||
if (IsContest())
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[0] = gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible;
|
||||
gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = 1;
|
||||
gTasks[taskId].func = sub_80BC19C;
|
||||
--gAnimVisualTaskCount;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BC19C(u8 taskId)
|
||||
{
|
||||
if (gBattleAnimArgs[7] == 0x1000)
|
||||
{
|
||||
gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].invisible = (u8)gTasks[taskId].data[0] & 1;
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
}
|
||||
@@ -1191,7 +1191,7 @@ static void sub_80303A8(u8 taskId)
|
||||
{
|
||||
s16 *data = gTasks[taskId].data;
|
||||
u8 battlerId = tExpTask_battler;
|
||||
u16 v5 = sub_80768B0(battlerId);
|
||||
u16 v5 = GetBattlerSpriteBGPriorityRank(battlerId);
|
||||
bool32 v6 = ((v5 ^ BIT_SIDE)) != B_SIDE_PLAYER;
|
||||
struct Sprite *sprite = &gSprites[gBattlerSpriteIds[battlerId]];
|
||||
|
||||
@@ -1222,7 +1222,7 @@ static void sub_80303A8(u8 taskId)
|
||||
u32 battlerIdAlt = battlerId;
|
||||
bool32 v6Alt = v6;
|
||||
|
||||
sub_8072E48(battlerIdAlt, v6Alt);
|
||||
MoveBattlerSpriteToBG(battlerIdAlt, v6Alt);
|
||||
}
|
||||
++data[15];
|
||||
break;
|
||||
|
||||
@@ -0,0 +1,495 @@
|
||||
#include "global.h"
|
||||
#include "battle.h"
|
||||
#include "battle_anim.h"
|
||||
#include "battle_setup.h"
|
||||
#include "bg.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "main.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
#include "constants/trainers.h"
|
||||
|
||||
static EWRAM_DATA u16 sBgCnt = 0;
|
||||
|
||||
extern const u8 gUnknown_83E7CCA[];
|
||||
extern const u8 gUnknown_83E7CCE[];
|
||||
|
||||
static void BattleIntroSlide1(u8 taskId);
|
||||
static void BattleIntroSlide2(u8 taskId);
|
||||
static void BattleIntroSlide3(u8 taskId);
|
||||
static void BattleIntroSlideLink(u8 taskId);
|
||||
|
||||
static const TaskFunc sBattleIntroSlideFuncs[] =
|
||||
{
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_GRASS
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_LONG_GRASS
|
||||
BattleIntroSlide2, // BATTLE_TERRAIN_SAND
|
||||
BattleIntroSlide2, // BATTLE_TERRAIN_UNDERWATER
|
||||
BattleIntroSlide2, // BATTLE_TERRAIN_WATER
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_POND
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_MOUNTAIN
|
||||
BattleIntroSlide1, // BATTLE_TERRAIN_CAVE
|
||||
BattleIntroSlide3, // BATTLE_TERRAIN_BUILDING
|
||||
BattleIntroSlide3, // BATTLE_TERRAIN_PLAIN
|
||||
};
|
||||
|
||||
void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value)
|
||||
{
|
||||
if (bgId < 4)
|
||||
{
|
||||
sBgCnt = GetGpuReg(gUnknown_83E7CCA[bgId]);
|
||||
switch (attributeId)
|
||||
{
|
||||
case BG_ANIM_SCREEN_SIZE:
|
||||
((struct BgCnt *)&sBgCnt)->screenSize = value;
|
||||
break;
|
||||
case BG_ANIM_AREA_OVERFLOW_MODE:
|
||||
((struct BgCnt *)&sBgCnt)->areaOverflowMode = value;
|
||||
break;
|
||||
case BG_ANIM_MOSAIC:
|
||||
((struct BgCnt *)&sBgCnt)->mosaic = value;
|
||||
break;
|
||||
case BG_ANIM_CHAR_BASE_BLOCK:
|
||||
((struct BgCnt *)&sBgCnt)->charBaseBlock = value;
|
||||
break;
|
||||
case BG_ANIM_PRIORITY:
|
||||
((struct BgCnt *)&sBgCnt)->priority = value;
|
||||
break;
|
||||
case BG_ANIM_PALETTES_MODE:
|
||||
((struct BgCnt *)&sBgCnt)->palettes = value;
|
||||
break;
|
||||
case BG_ANIM_SCREEN_BASE_BLOCK:
|
||||
((struct BgCnt *)&sBgCnt)->screenBaseBlock = value;
|
||||
break;
|
||||
}
|
||||
SetGpuReg(gUnknown_83E7CCA[bgId], sBgCnt);
|
||||
}
|
||||
}
|
||||
|
||||
s32 GetAnimBgAttribute(u8 bgId, u8 attributeId)
|
||||
{
|
||||
u16 bgCnt;
|
||||
|
||||
if (bgId < 4)
|
||||
{
|
||||
bgCnt = GetGpuReg(gUnknown_83E7CCE[bgId]);
|
||||
switch (attributeId)
|
||||
{
|
||||
case BG_ANIM_SCREEN_SIZE:
|
||||
return ((struct BgCnt *)&bgCnt)->screenSize;
|
||||
case BG_ANIM_AREA_OVERFLOW_MODE:
|
||||
return ((struct BgCnt *)&bgCnt)->areaOverflowMode;
|
||||
case BG_ANIM_MOSAIC:
|
||||
return ((struct BgCnt *)&bgCnt)->mosaic;
|
||||
case BG_ANIM_CHAR_BASE_BLOCK:
|
||||
return ((struct BgCnt *)&bgCnt)->charBaseBlock;
|
||||
case BG_ANIM_PRIORITY:
|
||||
return ((struct BgCnt *)&bgCnt)->priority;
|
||||
case BG_ANIM_PALETTES_MODE:
|
||||
return ((struct BgCnt *)&bgCnt)->palettes;
|
||||
case BG_ANIM_SCREEN_BASE_BLOCK:
|
||||
return ((struct BgCnt *)&bgCnt)->screenBaseBlock;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void HandleIntroSlide(u8 terrain)
|
||||
{
|
||||
u8 taskId;
|
||||
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
taskId = CreateTask(BattleIntroSlideLink, 0);
|
||||
}
|
||||
else if ((gBattleTypeFlags & BATTLE_TYPE_KYOGRE_GROUDON) && gGameVersion != VERSION_RUBY)
|
||||
{
|
||||
terrain = BATTLE_TERRAIN_UNDERWATER;
|
||||
taskId = CreateTask(BattleIntroSlide2, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
taskId = CreateTask(sBattleIntroSlideFuncs[terrain], 0);
|
||||
}
|
||||
gTasks[taskId].data[0] = 0;
|
||||
gTasks[taskId].data[1] = terrain;
|
||||
gTasks[taskId].data[2] = 0;
|
||||
gTasks[taskId].data[3] = 0;
|
||||
gTasks[taskId].data[4] = 0;
|
||||
gTasks[taskId].data[5] = 0;
|
||||
gTasks[taskId].data[6] = 0;
|
||||
}
|
||||
|
||||
void sub_80BC41C(u8 taskId)
|
||||
{
|
||||
DestroyTask(taskId);
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
gBattle_BG2_X = 0;
|
||||
gBattle_BG2_Y = 0;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR);
|
||||
}
|
||||
|
||||
static void BattleIntroSlide1(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
gBattle_BG1_X += 6;
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
gTasks[taskId].data[2] = 16;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[2] = 1;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_WIN0V -= 0xFF;
|
||||
if ((gBattle_WIN0V & 0xFF00) == 0x3000)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = 240;
|
||||
gTasks[taskId].data[3] = 32;
|
||||
gIntroSlideFlags &= ~1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gTasks[taskId].data[3])
|
||||
{
|
||||
--gTasks[taskId].data[3];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gTasks[taskId].data[1] == 1)
|
||||
{
|
||||
if (gBattle_BG1_Y != 0xFFB0)
|
||||
gBattle_BG1_Y -= 2;
|
||||
}
|
||||
else if (gBattle_BG1_Y != 0xFFC8)
|
||||
{
|
||||
gBattle_BG1_Y -= 1;
|
||||
}
|
||||
}
|
||||
if (gBattle_WIN0V & 0xFF00)
|
||||
gBattle_WIN0V -= 0x3FC;
|
||||
if (gTasks[taskId].data[2])
|
||||
gTasks[taskId].data[2] -= 2;
|
||||
// Scanline settings have already been set in CB2_InitBattleInternal
|
||||
for (i = 0; i < 80; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];
|
||||
while (i < 160)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];
|
||||
if (!gTasks[taskId].data[2])
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++gTasks[taskId].data[0];
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
|
||||
SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sub_80BC41C(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void BattleIntroSlide2(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
switch (gTasks[taskId].data[1])
|
||||
{
|
||||
case 2:
|
||||
case 4:
|
||||
gBattle_BG1_X += 8;
|
||||
break;
|
||||
case 3:
|
||||
gBattle_BG1_X += 6;
|
||||
break;
|
||||
}
|
||||
if (gTasks[taskId].data[1] == 4)
|
||||
{
|
||||
gBattle_BG1_Y = Cos2(gTasks[taskId].data[6]) / 512 - 8;
|
||||
if (gTasks[taskId].data[6] < 180)
|
||||
gTasks[taskId].data[6] += 4;
|
||||
else
|
||||
gTasks[taskId].data[6] += 6;
|
||||
if (gTasks[taskId].data[6] == 360)
|
||||
gTasks[taskId].data[6] = 0;
|
||||
}
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
gTasks[taskId].data[4] = 16;
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
gTasks[taskId].data[2] = 16;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[2] = 1;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_WIN0V -= 0xFF;
|
||||
if ((gBattle_WIN0V & 0xFF00) == 0x3000)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = 240;
|
||||
gTasks[taskId].data[3] = 32;
|
||||
gTasks[taskId].data[5] = 1;
|
||||
gIntroSlideFlags &= ~1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gTasks[taskId].data[3])
|
||||
{
|
||||
if (--gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(15, 0));
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
}
|
||||
}
|
||||
else if ((gTasks[taskId].data[4] & 0x1F) && --gTasks[taskId].data[5] == 0)
|
||||
{
|
||||
gTasks[taskId].data[4] += 0xFF;
|
||||
gTasks[taskId].data[5] = 4;
|
||||
}
|
||||
if (gBattle_WIN0V & 0xFF00)
|
||||
gBattle_WIN0V -= 0x3FC;
|
||||
|
||||
if (gTasks[taskId].data[2])
|
||||
gTasks[taskId].data[2] -= 2;
|
||||
// Scanline settings have already been set in CB2_InitBattleInternal()
|
||||
for (i = 0; i < 80; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];
|
||||
while (i < 160)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];
|
||||
if (!gTasks[taskId].data[2])
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++gTasks[taskId].data[0];
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
|
||||
SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sub_80BC41C(taskId);
|
||||
break;
|
||||
}
|
||||
if (gTasks[taskId].data[0] != 4)
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0));
|
||||
}
|
||||
|
||||
static void BattleIntroSlide3(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
gBattle_BG1_X += 8;
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 8));
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
gTasks[taskId].data[4] = BLDALPHA_BLEND(8, 8);
|
||||
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
|
||||
{
|
||||
gTasks[taskId].data[2] = 16;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
gTasks[taskId].data[2] = 1;
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_WIN0V -= 0xFF;
|
||||
if ((gBattle_WIN0V & 0xFF00) == 0x3000)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = 240;
|
||||
gTasks[taskId].data[3] = 32;
|
||||
gTasks[taskId].data[5] = 1;
|
||||
gIntroSlideFlags &= ~1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gTasks[taskId].data[3])
|
||||
{
|
||||
--gTasks[taskId].data[3];
|
||||
}
|
||||
else if ((gTasks[taskId].data[4] & 0xF) && --gTasks[taskId].data[5] == 0)
|
||||
{
|
||||
gTasks[taskId].data[4] += 0xFF;
|
||||
gTasks[taskId].data[5] = 6;
|
||||
}
|
||||
if (gBattle_WIN0V & 0xFF00)
|
||||
gBattle_WIN0V -= 0x3FC;
|
||||
if (gTasks[taskId].data[2])
|
||||
gTasks[taskId].data[2] -= 2;
|
||||
// Scanline settings have already been set in CB2_InitBattleInternal()
|
||||
for (i = 0; i < 80; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];
|
||||
while (i < 160)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];
|
||||
if (!gTasks[taskId].data[2])
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++gTasks[taskId].data[0];
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
|
||||
SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sub_80BC41C(taskId);
|
||||
break;
|
||||
}
|
||||
if (gTasks[taskId].data[0] != 4)
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[4], 0));
|
||||
}
|
||||
|
||||
static void BattleIntroSlideLink(u8 taskId)
|
||||
{
|
||||
s32 i;
|
||||
|
||||
if (gTasks[taskId].data[0] > 1 && !gTasks[taskId].data[4])
|
||||
{
|
||||
u16 var0 = gBattle_BG1_X & 0x8000;
|
||||
|
||||
if (var0 || gBattle_BG1_X < 80)
|
||||
{
|
||||
gBattle_BG1_X += 3;
|
||||
gBattle_BG2_X -= 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(28), BG_SCREEN_SIZE);
|
||||
CpuFill32(0, (void *)BG_SCREEN_ADDR(30), BG_SCREEN_SIZE);
|
||||
gTasks[taskId].data[4] = 1;
|
||||
}
|
||||
}
|
||||
switch (gTasks[taskId].data[0])
|
||||
{
|
||||
case 0:
|
||||
gTasks[taskId].data[2] = 32;
|
||||
++gTasks[taskId].data[0];
|
||||
break;
|
||||
case 1:
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gSprites[gBattleStruct->linkBattleVsSpriteId_V].oam.objMode = ST_OAM_OBJ_WINDOW;
|
||||
gSprites[gBattleStruct->linkBattleVsSpriteId_V].callback = sub_801182C;
|
||||
gSprites[gBattleStruct->linkBattleVsSpriteId_S].oam.objMode = ST_OAM_OBJ_WINDOW;
|
||||
gSprites[gBattleStruct->linkBattleVsSpriteId_S].callback = sub_801182C;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_WIN0V -= 0xFF;
|
||||
if ((gBattle_WIN0V & 0xFF00) == 0x3000)
|
||||
{
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = 240;
|
||||
gTasks[taskId].data[3] = 32;
|
||||
gIntroSlideFlags &= ~1;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
if (gBattle_WIN0V & 0xFF00)
|
||||
gBattle_WIN0V -= 0x3FC;
|
||||
if (gTasks[taskId].data[2])
|
||||
gTasks[taskId].data[2] -= 2;
|
||||
// Scanline settings have already been set in CB2_InitBattleInternal()
|
||||
for (i = 0; i < 80; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gTasks[taskId].data[2];
|
||||
while (i < 160)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i++] = -gTasks[taskId].data[2];
|
||||
if (!gTasks[taskId].data[2])
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++gTasks[taskId].data[0];
|
||||
SetBgAttribute(1, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetBgAttribute(2, BG_ATTR_CHARBASEINDEX, 0);
|
||||
SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(28) | BGCNT_TXT256x512);
|
||||
SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_PRIORITY(0) | BGCNT_CHARBASE(0) | BGCNT_16COLOR | BGCNT_SCREENBASE(30) | BGCNT_TXT512x256);
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
sub_80BC41C(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BCEF4(s32 bgId, u8 arg1, u8 arg2, u8 battlerPosition, u8 arg4, u8 *arg5, u16 *arg6, u16 tilesOffset)
|
||||
{
|
||||
s32 i, j;
|
||||
u8 battler = GetBattlerAtPosition(battlerPosition);
|
||||
s32 offset = tilesOffset;
|
||||
|
||||
CpuCopy16(gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * gBattleMonForms[battler], arg5, BG_SCREEN_SIZE);
|
||||
LoadBgTiles(bgId, arg5, 0x1000, tilesOffset);
|
||||
for (i = arg2; i < arg2 + 8; ++i)
|
||||
for (j = arg1; j < arg1 + 8; ++j)
|
||||
arg6[i * 32 + j] = offset++ | (arg4 << 12);
|
||||
LoadBgTilemap(bgId, arg6, BG_SCREEN_SIZE, 0);
|
||||
}
|
||||
|
||||
// not used
|
||||
static void sub_80BCFCC(u8 arg0, u8 arg1, u8 battlerPosition, u8 arg3, u8 arg4, u16 arg5, u8 arg6, u8 arg7)
|
||||
{
|
||||
s32 i, j, offset;
|
||||
|
||||
DmaCopy16(3, gMonSpritesGfxPtr->sprites[battlerPosition] + BG_SCREEN_SIZE * arg3, (void *)BG_SCREEN_ADDR(0) + arg5, BG_SCREEN_SIZE);
|
||||
offset = (arg5 >> 5) - (arg7 << 9);
|
||||
for (i = arg1; i < arg1 + 8; ++i)
|
||||
for (j = arg0; j < arg0 + 8; ++j)
|
||||
*((u16 *)(BG_VRAM) + (i * 32) + (j + (arg6 << 10))) = offset++ | (arg4 << 12);
|
||||
}
|
||||
+40
-42
@@ -857,14 +857,14 @@ static bool8 BT_Phase2BigPokeball_Init(struct Task *task)
|
||||
task->tEva = 0;
|
||||
task-> tTheta = 0;
|
||||
task-> tAmplitude = 0x4000;
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->winOut = 0;
|
||||
sTransitionStructPtr->win0H = 240;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->win0H = WIN_RANGE(0, 0xF0);
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
sTransitionStructPtr->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD;
|
||||
sTransitionStructPtr->bldAlpha = (task->tEvb << 8) | task->tEva;
|
||||
for (i = 0; i < 160; ++i)
|
||||
gScanlineEffectRegBuffers[1][i] = 240;
|
||||
gScanlineEffectRegBuffers[1][i] = 0xF0;
|
||||
SetVBlankCallback(VBCB_BT_Phase2BigPokeball1);
|
||||
BT_GetBg0TilemapAndTilesetBase(&tilemapAddr, &tilesetAddr);
|
||||
CpuFill16(0, tilemapAddr, 0x800);
|
||||
@@ -897,7 +897,7 @@ static bool8 BT_Phase2BigPokeball_UpdateWave1IncEva(struct Task *task)
|
||||
++task->tEva;
|
||||
task->tInterval = 1; // Broken logic. This makes the condition always TRUE.
|
||||
}
|
||||
sTransitionStructPtr->bldAlpha = (task->tEvb << 8) | task->tEva;
|
||||
sTransitionStructPtr->bldAlpha = BLDALPHA_BLEND(task->tEva, task->tEvb);
|
||||
// Increment eva until it reaches 50% coeff
|
||||
if (task->tEva > 15)
|
||||
++task->tState;
|
||||
@@ -1148,13 +1148,11 @@ static bool8 BT_Phase2ClockwiseBlackFade_Init(struct Task *task)
|
||||
BT_InitCtrlBlk();
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->winIn = 0;
|
||||
sTransitionStructPtr->winOut = 0x3F;
|
||||
sTransitionStructPtr->win0H = 0xF0F1;
|
||||
sTransitionStructPtr->win0V = 0x00A0;
|
||||
sTransitionStructPtr->winOut = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
|
||||
sTransitionStructPtr->win0H = WIN_RANGE(0xF0, 0xF1);
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[1][i] = 0xF3F4;
|
||||
}
|
||||
gScanlineEffectRegBuffers[1][i] = WIN_RANGE(0xF3, 0xF4);
|
||||
SetVBlankCallback(VBCB_BT_Phase2ClockwiseBlackFade);
|
||||
sTransitionStructPtr->trEndPtX = 120;
|
||||
++task->tState;
|
||||
@@ -1167,7 +1165,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step1(struct Task *task)
|
||||
BT_DiagonalSegment_InitParams(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->trEndPtX, -1, 1, 1);
|
||||
do
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = (sTransitionStructPtr->trCurrentPtX + 1) | 0x7800;
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = WIN_RANGE(0x78, sTransitionStructPtr->trCurrentPtX + 1);
|
||||
}
|
||||
while (!BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE));
|
||||
|
||||
@@ -1197,7 +1195,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step2(struct Task *task)
|
||||
left = sTransitionStructPtr->trCurrentPtX;
|
||||
right = 240;
|
||||
}
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
if (finished)
|
||||
break;
|
||||
finished = BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE);
|
||||
@@ -1211,7 +1209,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step2(struct Task *task)
|
||||
else
|
||||
{
|
||||
while (sTransitionStructPtr->trCurrentPtY < sTransitionStructPtr->trEndPtY)
|
||||
gScanlineEffectRegBuffers[0][++sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][++sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
}
|
||||
++sTransitionStructPtr->vblankDma;
|
||||
return FALSE;
|
||||
@@ -1265,7 +1263,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step4(struct Task *task)
|
||||
left = 120;
|
||||
right = sTransitionStructPtr->trCurrentPtX;
|
||||
}
|
||||
win0H = right | (left << 8);
|
||||
win0H = WIN_RANGE2(left, right);
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = win0H;
|
||||
if (finished)
|
||||
break;
|
||||
@@ -1280,7 +1278,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step4(struct Task *task)
|
||||
else
|
||||
{
|
||||
while (sTransitionStructPtr->trCurrentPtY > sTransitionStructPtr->trEndPtY)
|
||||
gScanlineEffectRegBuffers[0][--sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][--sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
}
|
||||
++sTransitionStructPtr->vblankDma;
|
||||
return FALSE;
|
||||
@@ -1301,7 +1299,7 @@ static bool8 BT_Phase2ClockwiseBlackFade_Step5(struct Task *task)
|
||||
left = 0;
|
||||
right = 240;
|
||||
}
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
}
|
||||
while (!BT_DiagonalSegment_ComputePointOnSegment(sTransitionStructPtr->data, TRUE, TRUE));
|
||||
sTransitionStructPtr->trEndPtX += 32;
|
||||
@@ -1431,12 +1429,12 @@ static bool8 BT_Phase2BlackWaveToRight_Init(struct Task *task)
|
||||
|
||||
BT_InitCtrlBlk();
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->winOut = 0;
|
||||
sTransitionStructPtr->win0H = 240;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->win0H = WIN_RANGE(0, 0xF0);
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
gScanlineEffectRegBuffers[1][i] = 242;
|
||||
gScanlineEffectRegBuffers[1][i] = WIN_RANGE(0, 0xF2);
|
||||
SetVBlankCallback(VBCB_BT_Phase2BlackWaveToRight);
|
||||
++task->tState;
|
||||
return TRUE;
|
||||
@@ -1460,7 +1458,7 @@ static bool8 BT_Phase2BlackWaveToRight_UpdateWave(struct Task *task)
|
||||
left = 0;
|
||||
if (left > 240)
|
||||
left = 240;
|
||||
*winVal = (left << 8) | (0xF1);
|
||||
*winVal = WIN_RANGE(left, 0xF1);
|
||||
if (left < 240)
|
||||
nextFunc = FALSE;
|
||||
}
|
||||
@@ -2529,10 +2527,10 @@ static bool8 BT_Phase2AntiClockwiseSpiral_Init(struct Task *task)
|
||||
BT_InitCtrlBlk();
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->winIn = 0;
|
||||
sTransitionStructPtr->winOut = 0x3F;
|
||||
sTransitionStructPtr->win0H = 0x7878;
|
||||
sTransitionStructPtr->win0V = 0x3070;
|
||||
sTransitionStructPtr->win1V = 0x1090;
|
||||
sTransitionStructPtr->winOut = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->win0H = WIN_RANGE(0x78, 0x78);
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0x30, 0x70);
|
||||
sTransitionStructPtr->win1V = WIN_RANGE(0x10, 0x90);
|
||||
sTransitionStructPtr->counter = 0;
|
||||
sub_80D1F64(0, 0, FALSE);
|
||||
sub_80D1F64(0, 0, TRUE);
|
||||
@@ -2665,11 +2663,11 @@ static bool8 BT_Phase2Mugshot_Init(struct Task *task)
|
||||
task->tTheta = 0;
|
||||
task->tbg0HOfsOpponent = 1;
|
||||
task->tbg0HOfsPlayer = 239;
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winOut = 0x3E;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->winOut = WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
gScanlineEffectRegBuffers[1][i] = 0xF0F1;
|
||||
gScanlineEffectRegBuffers[1][i] = WIN_RANGE(0xF0, 0xF1);
|
||||
SetVBlankCallback(VBCB_BT_Phase2Mugshot1_Slide);
|
||||
++task->tState;
|
||||
return FALSE;
|
||||
@@ -2784,7 +2782,7 @@ static bool8 BT_Phase2Mugshot_WaitForPlayerInPlace(struct Task *task)
|
||||
DmaStop(0);
|
||||
memset(gScanlineEffectRegBuffers[0], 0, 320);
|
||||
memset(gScanlineEffectRegBuffers[1], 0, 320);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
|
||||
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 0xF0));
|
||||
SetGpuReg(REG_OFFSET_BLDY, 0);
|
||||
++task->tState;
|
||||
task->tCounter = 0;
|
||||
@@ -3026,9 +3024,9 @@ static bool8 BT_Phase2SlicedScreen_Init(struct Task *task)
|
||||
ScanlineEffect_Clear();
|
||||
task->tAcc = 256;
|
||||
task->tJerk = 1;
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->winOut = 0;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->bg123HOfs;
|
||||
@@ -3065,7 +3063,7 @@ static bool8 BT_Phase2SlicedScreen_UpdateOffsets(struct Task *task)
|
||||
else
|
||||
{
|
||||
*ofsBuffer = sTransitionStructPtr->bg123HOfs - task->tSpeed;
|
||||
*win0HBuffer = (task->tSpeed << 8) | 0xF1;
|
||||
*win0HBuffer = WIN_RANGE(task->tSpeed, 0xF1);
|
||||
}
|
||||
}
|
||||
if (task->tSpeed > 0xEF)
|
||||
@@ -3126,9 +3124,9 @@ static bool8 BT_Phase2WhiteFadeInStripes_Init(struct Task *task)
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_LIGHTEN;
|
||||
sTransitionStructPtr->bldY = 0;
|
||||
sTransitionStructPtr->winIn = 0x1E;
|
||||
sTransitionStructPtr->winOut = 0x3F;
|
||||
sTransitionStructPtr->win0V = 160;
|
||||
sTransitionStructPtr->winIn = WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ;
|
||||
sTransitionStructPtr->winOut = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[1][i] = 0;
|
||||
@@ -3180,7 +3178,7 @@ static bool8 BT_Phase2WhiteFadeInStripes_Stop(struct Task *task)
|
||||
sTransitionStructPtr->win0H = 240;
|
||||
sTransitionStructPtr->bldY = 0;
|
||||
sTransitionStructPtr->bldCnt = BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD | BLDCNT_EFFECT_DARKEN;
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WININ_WIN0_CLR;
|
||||
sTransitionStructPtr->counter = 0;
|
||||
SetVBlankCallback(VBCB_BT_Phase2WhiteFadeInStripes2);
|
||||
++task->tState;
|
||||
@@ -3351,11 +3349,11 @@ static bool8 BT_Phase2BlackDoodles_Init(struct Task *task)
|
||||
|
||||
BT_InitCtrlBlk();
|
||||
ScanlineEffect_Clear();
|
||||
sTransitionStructPtr->winIn = 0x3F;
|
||||
sTransitionStructPtr->winIn = WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR;
|
||||
sTransitionStructPtr->winOut = 0;
|
||||
sTransitionStructPtr->win0V = 0xA0;
|
||||
sTransitionStructPtr->win0V = WIN_RANGE(0, 0xA0);
|
||||
for (i = 0; i < 160; ++i)
|
||||
gScanlineEffectRegBuffers[0][i] = 0x00F0;
|
||||
gScanlineEffectRegBuffers[0][i] = WIN_RANGE(0, 0xF0);
|
||||
CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 160);
|
||||
SetVBlankCallback(VBCB_BT_Phase2BlackDoodles);
|
||||
++task->tState;
|
||||
@@ -3394,7 +3392,7 @@ static bool8 BT_Phase2BlackDoodles_DrawSingleBrush(struct Task *task)
|
||||
if (right <= left)
|
||||
right = left;
|
||||
}
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = right | (left << 8);
|
||||
gScanlineEffectRegBuffers[0][sTransitionStructPtr->trCurrentPtY] = WIN_RANGE2(left, right);
|
||||
if (nextFunc)
|
||||
{
|
||||
++task->tState;
|
||||
|
||||
@@ -0,0 +1,462 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "trig.h"
|
||||
|
||||
static void sub_80B3FAC(struct Sprite *sprite);
|
||||
static void sub_80B407C(struct Sprite *sprite);
|
||||
static void AnimTranslateWebThread(struct Sprite *sprite);
|
||||
static void sub_80B41F8(struct Sprite *sprite);
|
||||
static void sub_80B42C0(struct Sprite *sprite);
|
||||
static void AnimTranslateStinger(struct Sprite *sprite);
|
||||
static void AnimMissileArc(struct Sprite *sprite);
|
||||
static void sub_80B45D8(struct Sprite *sprite);
|
||||
static void sub_80B41C0(struct Sprite *sprite);
|
||||
static void sub_80B4274(struct Sprite *sprite);
|
||||
static void sub_80B42E8(struct Sprite *sprite);
|
||||
static void sub_80B4344(struct Sprite *sprite);
|
||||
static void AnimMissileArcStep(struct Sprite *sprite);
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E71E8[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 30, 0),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E71F8[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, -99, 0),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7208[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x100, 0x100, 94, 0),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7218[] =
|
||||
{
|
||||
gUnknown_83E71E8,
|
||||
gUnknown_83E71F8,
|
||||
gUnknown_83E7208,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7224 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_HORN_HIT_2,
|
||||
.paletteTag = ANIM_TAG_HORN_HIT_2,
|
||||
.oam = &gOamData_83ACAB8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7218,
|
||||
.callback = sub_80B3FAC,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E723C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -33, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E724C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 96, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E725C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -96, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E726C[] =
|
||||
{
|
||||
gUnknown_83E723C,
|
||||
gUnknown_83E724C,
|
||||
gUnknown_83E725C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7278 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_NEEDLE,
|
||||
.paletteTag = ANIM_TAG_NEEDLE,
|
||||
.oam = &gOamData_83ACA30,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E726C,
|
||||
.callback = sub_80B407C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gWebThreadSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_WEB_THREAD,
|
||||
.paletteTag = ANIM_TAG_WEB_THREAD,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimTranslateWebThread,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E72A8 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_STRING,
|
||||
.paletteTag = ANIM_TAG_STRING,
|
||||
.oam = &gOamData_83ACA00,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B41F8,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E72C0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x6, 0x6, 0, 1),
|
||||
AFFINEANIMCMD_JUMP(1),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E72D8[] =
|
||||
{
|
||||
gUnknown_83E72C0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gSpiderWebSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SPIDER_WEB,
|
||||
.paletteTag = ANIM_TAG_SPIDER_WEB,
|
||||
.oam = &gOamData_83ACBC0,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E72D8,
|
||||
.callback = sub_80B42C0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gLinearStingerSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_NEEDLE,
|
||||
.paletteTag = ANIM_TAG_NEEDLE,
|
||||
.oam = &gOamData_83ACA30,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimTranslateStinger,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gPinMissileSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_NEEDLE,
|
||||
.paletteTag = ANIM_TAG_NEEDLE,
|
||||
.oam = &gOamData_83ACA30,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimMissileArc,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gIcicleSpearSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ICICLE_SPEAR,
|
||||
.paletteTag = ANIM_TAG_ICICLE_SPEAR,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimMissileArc,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E733C[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 18),
|
||||
AFFINEANIMCMD_LOOP(0),
|
||||
AFFINEANIMCMD_FRAME(0xFFFB, 0xFFFB, 0, 8),
|
||||
AFFINEANIMCMD_FRAME(0x5, 0x5, 0, 8),
|
||||
AFFINEANIMCMD_LOOP(5),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7374[] =
|
||||
{
|
||||
gUnknown_83E733C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7378 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_CIRCLE_OF_LIGHT,
|
||||
.paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT,
|
||||
.oam = &gOamData_83ACB60,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7374,
|
||||
.callback = sub_80B45D8,
|
||||
};
|
||||
|
||||
static void sub_80B3FAC(struct Sprite *sprite)
|
||||
{
|
||||
if (IsContest())
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, 2);
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
}
|
||||
else if (!GetBattlerSide(gBattleAnimTarget))
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
}
|
||||
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimTarget, 2) + gBattleAnimArgs[0];
|
||||
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimTarget, 3) + gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
static void sub_80B407C(struct Sprite *sprite)
|
||||
{
|
||||
if (IsContest())
|
||||
{
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
StartSpriteAffineAnim(sprite, 2);
|
||||
}
|
||||
else if (!GetBattlerSide(gBattleAnimTarget))
|
||||
{
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
|
||||
}
|
||||
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimTarget, 2) + gBattleAnimArgs[0];
|
||||
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimTarget, 3) + gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Creates a single web thread that travels from attacker to target.
|
||||
// Used by MOVE_STRING_SHOT and MOVE_SPIDER_WEB in their first move phase.
|
||||
// arg 0: x
|
||||
// arg 1: y
|
||||
// arg 2: controls the left-to-right movement
|
||||
// arg 3: amplitude
|
||||
// arg 4: if targets both opponents
|
||||
static void AnimTranslateWebThread(struct Sprite *sprite)
|
||||
{
|
||||
if (IsContest())
|
||||
gBattleAnimArgs[2] /= 2;
|
||||
InitSpritePosToAnimAttacker(sprite, TRUE);
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->data[1] = sprite->pos1.x;
|
||||
sprite->data[3] = sprite->pos1.y;
|
||||
if (!gBattleAnimArgs[4])
|
||||
{
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
|
||||
}
|
||||
sub_8075678(sprite);
|
||||
sprite->data[5] = gBattleAnimArgs[3];
|
||||
sprite->callback = sub_80B41C0;
|
||||
}
|
||||
|
||||
static void sub_80B41C0(struct Sprite *sprite)
|
||||
{
|
||||
if (AnimTranslateLinear(sprite))
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
return;
|
||||
}
|
||||
sprite->pos2.x += Sin(sprite->data[6], sprite->data[5]);
|
||||
sprite->data[6] = (sprite->data[6] + 13) & 0xFF;
|
||||
}
|
||||
|
||||
static void sub_80B41F8(struct Sprite *sprite)
|
||||
{
|
||||
SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
|
||||
if (GetBattlerSide(gBattleAnimAttacker))
|
||||
sprite->pos1.x -= gBattleAnimArgs[0];
|
||||
else
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
if (!GetBattlerSide(gBattleAnimTarget))
|
||||
sprite->pos1.y += 8;
|
||||
sprite->callback = sub_80B4274;
|
||||
}
|
||||
|
||||
static void sub_80B4274(struct Sprite *sprite)
|
||||
{
|
||||
if (++sprite->data[0] == 3)
|
||||
{
|
||||
sprite->data[0] = 0;
|
||||
sprite->invisible ^= 1;
|
||||
}
|
||||
if (++sprite->data[1] == 51)
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B42C0(struct Sprite *sprite)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
|
||||
sprite->data[0] = 16;
|
||||
sprite->callback = sub_80B42E8;
|
||||
}
|
||||
|
||||
static void sub_80B42E8(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[2] < 20)
|
||||
{
|
||||
++sprite->data[2];
|
||||
}
|
||||
else if (sprite->data[1]++ & 1)
|
||||
{
|
||||
--sprite->data[0];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[0], 16 - sprite->data[0]));
|
||||
|
||||
if (sprite->data[0] == 0)
|
||||
{
|
||||
sprite->invisible = TRUE;
|
||||
sprite->callback = sub_80B4344;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B4344(struct Sprite *sprite)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
// Translates a stinger sprite linearly to a destination location. The sprite is
|
||||
// initially rotated so that it appears to be traveling in a straight line.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: target x pixel offset
|
||||
// arg 3: target y pixel offset
|
||||
// arg 4: duration
|
||||
static void AnimTranslateStinger(struct Sprite *sprite)
|
||||
{
|
||||
s16 lVarX, lVarY;
|
||||
u16 rot;
|
||||
|
||||
if (IsContest())
|
||||
{
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
}
|
||||
else if (GetBattlerSide(gBattleAnimAttacker))
|
||||
{
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
|
||||
}
|
||||
if (!IsContest() && GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
|
||||
{
|
||||
if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT
|
||||
|| GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT)
|
||||
{
|
||||
s16 temp1, temp2;
|
||||
|
||||
temp1 = gBattleAnimArgs[2];
|
||||
gBattleAnimArgs[2] = -temp1;
|
||||
|
||||
temp2 = gBattleAnimArgs[0];
|
||||
gBattleAnimArgs[0] = -temp2;
|
||||
}
|
||||
}
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
|
||||
lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
|
||||
rot = ArcTan2Neg(lVarX - sprite->pos1.x, lVarY - sprite->pos1.y);
|
||||
rot += 0xC000;
|
||||
TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot);
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = lVarX;
|
||||
sprite->data[4] = lVarY;
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Rotates sprite and moves it in an arc, so that it appears like a missle or arrow traveling.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: target x pixel offset
|
||||
// arg 3: target y pixel offset
|
||||
// arg 4: duration
|
||||
// arg 5: wave amplitude
|
||||
static void AnimMissileArc(struct Sprite *sprite)
|
||||
{
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
if (GetBattlerSide(gBattleAnimAttacker))
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
|
||||
sprite->data[5] = gBattleAnimArgs[5];
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = AnimMissileArcStep;
|
||||
sprite->invisible = TRUE;
|
||||
}
|
||||
|
||||
static void AnimMissileArcStep(struct Sprite *sprite)
|
||||
{
|
||||
sprite->invisible = FALSE;
|
||||
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
else
|
||||
{
|
||||
s16 tempData[8];
|
||||
u16 *data = sprite->data;
|
||||
u16 x1 = sprite->pos1.x;
|
||||
s16 x2 = sprite->pos2.x;
|
||||
u16 y1 = sprite->pos1.y;
|
||||
s16 y2 = sprite->pos2.y;
|
||||
s32 i;
|
||||
|
||||
for (i = 0; i < 8; ++i)
|
||||
tempData[i] = data[i];
|
||||
x2 += x1;
|
||||
y2 += y1;
|
||||
if (!TranslateAnimHorizontalArc(sprite))
|
||||
{
|
||||
u16 rotation = ArcTan2Neg(sprite->pos1.x + sprite->pos2.x - x2,
|
||||
sprite->pos1.y + sprite->pos2.y - y2);
|
||||
|
||||
rotation += 0xC000;
|
||||
TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation);
|
||||
for (i = 0; i < 8; ++i)
|
||||
data[i] = tempData[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B45D8(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + 18;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + 18;
|
||||
}
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
}
|
||||
+921
@@ -0,0 +1,921 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "graphics.h"
|
||||
#include "palette.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "trig.h"
|
||||
#include "util.h"
|
||||
|
||||
static void sub_80B7ACC(struct Sprite *sprite);
|
||||
static void sub_80B7BD4(struct Sprite *sprite);
|
||||
static void sub_80B7C88(struct Sprite *sprite);
|
||||
static void sub_80B86B0(struct Sprite *sprite);
|
||||
static void sub_80B7954(u8 taskId);
|
||||
static void sub_80B7A14(u8 taskId);
|
||||
static void sub_80B7B48(struct Sprite *sprite);
|
||||
static void sub_80B7C10(struct Sprite *sprite);
|
||||
static void sub_80B7C50(struct Sprite *sprite);
|
||||
static void sub_80B7D88(struct Sprite *sprite);
|
||||
static void sub_80B856C(u8 priority);
|
||||
static void sub_80B7F58(u8 taskId);
|
||||
static void sub_80B843C(struct Task *task);
|
||||
static void sub_80B82C0(u8 taskId);
|
||||
static void sub_80B8920(u8 taskId);
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7878 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_TIED_BAG,
|
||||
.paletteTag = ANIM_TAG_TIED_BAG,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B7ACC,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7890[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78A0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 32, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78B0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 64, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78C0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 96, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78D0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -128, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78E0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -96, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E78F0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -64, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7900[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -32, 1),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7910[] =
|
||||
{
|
||||
gUnknown_83E7890,
|
||||
gUnknown_83E78A0,
|
||||
gUnknown_83E78B0,
|
||||
gUnknown_83E78C0,
|
||||
gUnknown_83E78D0,
|
||||
gUnknown_83E78E0,
|
||||
gUnknown_83E78F0,
|
||||
gUnknown_83E7900,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7930 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SHARP_TEETH,
|
||||
.paletteTag = ANIM_TAG_SHARP_TEETH,
|
||||
.oam = &gOamData_83ACB60,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7910,
|
||||
.callback = sub_80B7BD4,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7948 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_CLAMP,
|
||||
.paletteTag = ANIM_TAG_CLAMP,
|
||||
.oam = &gOamData_83ACB60,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7910,
|
||||
.callback = sub_80B7BD4,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7960[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xC0, 0xC0, 80, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -2, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7978[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xC0, 0xC0, -80, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7990[] =
|
||||
{
|
||||
gUnknown_83E7960,
|
||||
gUnknown_83E7978,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7998 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SMALL_BUBBLES,
|
||||
.paletteTag = ANIM_TAG_SMALL_BUBBLES,
|
||||
.oam = &gOamData_83ACA30,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7990,
|
||||
.callback = sub_80B7C88,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E79B0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 4),
|
||||
ANIMCMD_FRAME(16, 4),
|
||||
ANIMCMD_FRAME(32, 4),
|
||||
ANIMCMD_FRAME(48, 4),
|
||||
ANIMCMD_FRAME(64, 4),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E79C8[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(48, 4, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(64, 4, .hFlip = TRUE),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E79E0[] =
|
||||
{
|
||||
gUnknown_83E79B0,
|
||||
gUnknown_83E79C8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E79E8 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_CLAW_SLASH,
|
||||
.paletteTag = ANIM_TAG_CLAW_SLASH,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E79E0,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B86B0,
|
||||
};
|
||||
|
||||
void sub_80B78E0(u8 taskId)
|
||||
{
|
||||
s32 battler;
|
||||
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
battler = gBattleAnimAttacker;
|
||||
gTasks[taskId].data[1] = 16;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0));
|
||||
if (GetBattlerSpriteBGPriorityRank(battler) == 1)
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
else
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
|
||||
gTasks[taskId].func = sub_80B7954;
|
||||
}
|
||||
|
||||
static void sub_80B7954(u8 taskId)
|
||||
{
|
||||
u8 blendA = gTasks[taskId].data[1] >> 8;
|
||||
u8 blendB = gTasks[taskId].data[1];
|
||||
|
||||
if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0])
|
||||
{
|
||||
++blendA;
|
||||
--blendB;
|
||||
gTasks[taskId].data[1] = BLDALPHA_BLEND(blendB, blendA);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
|
||||
gTasks[taskId].data[2] = 0;
|
||||
if (blendA == 16)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = TRUE;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
++gTasks[taskId].data[2];
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B79DC(u8 taskId)
|
||||
{
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[1] = BLDALPHA_BLEND(0, 16);
|
||||
gTasks[taskId].func = sub_80B7A14;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
|
||||
}
|
||||
|
||||
static void sub_80B7A14(u8 taskId)
|
||||
{
|
||||
u8 blendA = gTasks[taskId].data[1] >> 8;
|
||||
u8 blendB = gTasks[taskId].data[1];
|
||||
|
||||
if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0])
|
||||
{
|
||||
--blendA;
|
||||
++blendB;
|
||||
gTasks[taskId].data[1] = (blendA << 8) | blendB;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]);
|
||||
gTasks[taskId].data[2] = 0;
|
||||
if (blendA == 0)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
++gTasks[taskId].data[2];
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B7A80(u8 taskId)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
|
||||
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
else
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B7ACC(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[1] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
|
||||
sprite->data[3] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
|
||||
sprite->data[0] = 0x7E;
|
||||
InitSpriteDataForLinearTranslation(sprite);
|
||||
sprite->data[3] = -sprite->data[1];
|
||||
sprite->data[4] = -sprite->data[2];
|
||||
sprite->data[6] = 0xFFD8;
|
||||
sprite->callback = sub_80B7B48;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B7B48(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->pos2.x = sprite->data[3] >> 8;
|
||||
sprite->pos2.y = sprite->data[4] >> 8;
|
||||
if (sprite->data[7] == 0)
|
||||
{
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->pos2.x = sprite->data[3] >> 8;
|
||||
sprite->pos2.y = sprite->data[4] >> 8;
|
||||
--sprite->data[0];
|
||||
}
|
||||
sprite->pos2.y += Sin(sprite->data[5], sprite->data[6]);
|
||||
sprite->data[5] = (sprite->data[5] + 3) & 0xFF;
|
||||
if (sprite->data[5] > 0x7F)
|
||||
{
|
||||
sprite->data[5] = 0;
|
||||
sprite->data[6] += 20;
|
||||
++sprite->data[7];
|
||||
}
|
||||
if (--sprite->data[0] == 0)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B7BD4(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
|
||||
sprite->data[0] = gBattleAnimArgs[3];
|
||||
sprite->data[1] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = gBattleAnimArgs[5];
|
||||
sprite->callback = sub_80B7C10;
|
||||
}
|
||||
|
||||
static void sub_80B7C10(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[4] += sprite->data[0];
|
||||
sprite->data[5] += sprite->data[1];
|
||||
sprite->pos2.x = sprite->data[4] >> 8;
|
||||
sprite->pos2.y = sprite->data[5] >> 8;
|
||||
if (++sprite->data[3] == sprite->data[2])
|
||||
sprite->callback = sub_80B7C50;
|
||||
}
|
||||
|
||||
static void sub_80B7C50(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[4] -= sprite->data[0];
|
||||
sprite->data[5] -= sprite->data[1];
|
||||
sprite->pos2.x = sprite->data[4] >> 8;
|
||||
sprite->pos2.y = sprite->data[5] >> 8;
|
||||
if (--sprite->data[3] == 0)
|
||||
DestroySpriteAndMatrix(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B7C88(struct Sprite *sprite)
|
||||
{
|
||||
u8 battler;
|
||||
s8 xOffset;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
battler = gBattleAnimAttacker;
|
||||
else
|
||||
battler = gBattleAnimTarget;
|
||||
xOffset = 20;
|
||||
sprite->oam.tileNum += 4;
|
||||
switch (gBattleAnimArgs[1])
|
||||
{
|
||||
case 0:
|
||||
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 8;
|
||||
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8;
|
||||
break;
|
||||
case 1:
|
||||
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) - 14;
|
||||
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16;
|
||||
break;
|
||||
case 2:
|
||||
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 8;
|
||||
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 8;
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
xOffset = -20;
|
||||
break;
|
||||
case 3:
|
||||
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) + 14;
|
||||
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP) + 16;
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
xOffset = -20;
|
||||
break;
|
||||
}
|
||||
sprite->data[0] = 32;
|
||||
sprite->data[2] = sprite->pos1.x + xOffset;
|
||||
sprite->data[4] = sprite->pos1.y + 12;
|
||||
sprite->data[5] = -12;
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = sub_80B7D88;
|
||||
}
|
||||
|
||||
static void sub_80B7D88(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
DestroySpriteAndMatrix(sprite);
|
||||
}
|
||||
|
||||
void sub_80B7DA4(u8 taskId)
|
||||
{
|
||||
struct ScanlineEffectParams scanlineParams;
|
||||
struct BattleAnimBgData animBg;
|
||||
u16 i;
|
||||
u8 pos;
|
||||
s32 var0;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 31;
|
||||
task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_TOP) - 7;
|
||||
task->data[5] = task->data[7];
|
||||
task->data[4] = task->data[6];
|
||||
task->data[13] = (task->data[7] - task->data[6]) << 8;
|
||||
pos = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
|
||||
task->data[14] = pos - 32;
|
||||
task->data[15] = pos + 32;
|
||||
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
|
||||
task->data[8] = -12;
|
||||
else
|
||||
task->data[8] = -64;
|
||||
task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
|
||||
if (task->data[3] == 1)
|
||||
{
|
||||
sub_80752A0(&animBg);
|
||||
task->data[10] = gBattle_BG1_Y;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
FillPalette(0, animBg.paletteId * 16, 32);
|
||||
scanlineParams.dmaDest = ®_BG1VOFS;
|
||||
var0 = WINOUT_WIN01_BG1;
|
||||
if (!IsContest())
|
||||
gBattle_BG2_X += 240;
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[10] = gBattle_BG2_Y;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
|
||||
FillPalette(0, 144, 32);
|
||||
scanlineParams.dmaDest = ®_BG2VOFS;
|
||||
var0 = WINOUT_WIN01_BG2;
|
||||
if (!IsContest())
|
||||
gBattle_BG1_X += 240;
|
||||
}
|
||||
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
|
||||
scanlineParams.initState = 1;
|
||||
scanlineParams.unused9 = 0;
|
||||
task->data[11] = 0;
|
||||
task->data[12] = 16;
|
||||
task->data[0] = 0;
|
||||
task->data[1] = 0;
|
||||
task->data[2] = 0;
|
||||
sub_80B856C(3);
|
||||
for (i = 0; i < 112; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][i] = task->data[10];
|
||||
gScanlineEffectRegBuffers[1][i] = task->data[10];
|
||||
}
|
||||
ScanlineEffect_SetParams(scanlineParams);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR)));
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
|
||||
gBattle_WIN0V = 160;
|
||||
|
||||
task->func = sub_80B7F58;
|
||||
}
|
||||
|
||||
static void sub_80B7F58(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
if (++task->data[2] & 1)
|
||||
{
|
||||
if (task->data[11] != 12)
|
||||
++task->data[11];
|
||||
}
|
||||
else if (task->data[12] != 8)
|
||||
{
|
||||
--task->data[12];
|
||||
}
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12]));
|
||||
if (task->data[11] == 12 && task->data[12] == 8)
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
task->data[4] -= 8;
|
||||
sub_80B843C(task);
|
||||
if (task->data[4] < task->data[8])
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
task->data[4] -= 8;
|
||||
sub_80B843C(task);
|
||||
task->data[14] += 4;
|
||||
task->data[15] -= 4;
|
||||
if (task->data[14] >= task->data[15])
|
||||
task->data[14] = task->data[15];
|
||||
gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
|
||||
if (task->data[14] == task->data[15])
|
||||
++task->data[0];
|
||||
break;
|
||||
case 3:
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B8070(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBg;
|
||||
struct ScanlineEffectParams scanlineParams;
|
||||
u8 x;
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (IsContest() == TRUE)
|
||||
{
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimTarget);
|
||||
if (task->data[3] == 1)
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
gBattle_BG2_X += 240;
|
||||
}
|
||||
else
|
||||
{
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2);
|
||||
gBattle_BG1_X += 240;
|
||||
}
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (task->data[3] == 1)
|
||||
{
|
||||
sub_80752A0(&animBg);
|
||||
task->data[10] = gBattle_BG1_Y;
|
||||
FillPalette(0, animBg.paletteId * 16, 32);
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[10] = gBattle_BG2_Y;
|
||||
FillPalette(0, 9 * 16, 32);
|
||||
}
|
||||
sub_80B856C(3);
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 31;
|
||||
task->data[6] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_TOP) - 7;
|
||||
task->data[13] = (task->data[7] - task->data[6]) << 8;
|
||||
x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
|
||||
task->data[14] = x - 4;
|
||||
task->data[15] = x + 4;
|
||||
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
|
||||
task->data[8] = -12;
|
||||
else
|
||||
task->data[8] = -64;
|
||||
task->data[4] = task->data[8];
|
||||
task->data[5] = task->data[8];
|
||||
task->data[11] = 12;
|
||||
task->data[12] = 8;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 3:
|
||||
if (task->data[3] == 1)
|
||||
scanlineParams.dmaDest = ®_BG1VOFS;
|
||||
else
|
||||
scanlineParams.dmaDest = ®_BG2VOFS;
|
||||
for (i = 0; i < 112; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i);
|
||||
gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i);
|
||||
}
|
||||
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
|
||||
scanlineParams.initState = 1;
|
||||
scanlineParams.unused9 = 0;
|
||||
ScanlineEffect_SetParams(scanlineParams);
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
if (task->data[3] == 1)
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
else
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
|
||||
gBattle_WIN0V = 160;
|
||||
task->data[0] = 0;
|
||||
task->data[1] = 0;
|
||||
task->data[2] = 0;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(12, 8));
|
||||
task->func = sub_80B82C0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B82C0(u8 taskId)
|
||||
{
|
||||
u8 pos;
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[5] += 8;
|
||||
if (task->data[5] >= task->data[7])
|
||||
task->data[5] = task->data[7];
|
||||
sub_80B843C(task);
|
||||
if (task->data[5] == task->data[7])
|
||||
++task->data[0];
|
||||
break;
|
||||
case 1:
|
||||
if (task->data[15] - task->data[14] < 0x40)
|
||||
{
|
||||
task->data[14] -= 4;
|
||||
task->data[15] += 4;
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[1] = 1;
|
||||
}
|
||||
gBattle_WIN0H = (task->data[14] << 8) | task->data[15];
|
||||
task->data[4] += 8;
|
||||
if (task->data[4] >= task->data[6])
|
||||
task->data[4] = task->data[6];
|
||||
sub_80B843C(task);
|
||||
if (task->data[4] == task->data[6] && task->data[1])
|
||||
{
|
||||
task->data[1] = 0;
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
++task->data[2];
|
||||
if (task->data[2] & 1)
|
||||
{
|
||||
if (task->data[11])
|
||||
--task->data[11];
|
||||
}
|
||||
else if (task->data[12] < 16)
|
||||
{
|
||||
++task->data[12];
|
||||
}
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12]));
|
||||
if (task->data[11] == 0 && task->data[12] == 16)
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B843C(struct Task *task)
|
||||
{
|
||||
s32 var0, var1, var4;
|
||||
s16 var2, i;
|
||||
|
||||
var2 = task->data[5] - task->data[4];
|
||||
if (var2 != 0)
|
||||
{
|
||||
var0 = task->data[13] / var2;
|
||||
var1 = task->data[6] << 8;
|
||||
for (i = 0; i < task->data[4]; ++i)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159);
|
||||
for (i = task->data[4]; i <= task->data[5]; ++i)
|
||||
{
|
||||
if (i >= 0)
|
||||
{
|
||||
s16 var3 = (var1 >> 8) - i;
|
||||
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10];
|
||||
}
|
||||
var1 += var0;
|
||||
}
|
||||
var4 = task->data[10] - (i - 159);
|
||||
for (; i < task->data[7]; ++i)
|
||||
if (i >= 0)
|
||||
gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4--;
|
||||
}
|
||||
else
|
||||
{
|
||||
var4 = task->data[10] + 159;
|
||||
for (i = 0; i < 112; ++i)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][i] = var4;
|
||||
gScanlineEffectRegBuffers[1][i] = var4;
|
||||
--var4;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B856C(u8 priority)
|
||||
{
|
||||
u16 i;
|
||||
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; ++i)
|
||||
{
|
||||
u8 spriteId = GetAnimBattlerSpriteId(i);
|
||||
|
||||
if (spriteId != 0xFF)
|
||||
gSprites[spriteId].oam.priority = priority;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B85B8(u8 taskId)
|
||||
{
|
||||
u8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? 1 : 0;
|
||||
|
||||
MoveBattlerSpriteToBG(gBattleAnimAttacker, toBG2);
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = FALSE;
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
|
||||
{
|
||||
MoveBattlerSpriteToBG(gBattleAnimAttacker ^ 2, toBG2 ^ 1);
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker ^ 2]].invisible = FALSE;
|
||||
}
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B8664(u8 taskId)
|
||||
{
|
||||
u8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? 1 : 0;
|
||||
|
||||
sub_8073128(toBG2);
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)))
|
||||
sub_8073128(toBG2 ^ 1);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B86B0(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[2]);
|
||||
sprite->callback = RunStoredCallbackWhenAnimEnds;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Makes the attacker metallic and shining.
|
||||
// Used by MOVE_HARDEN and MOVE_IRON_DEFENSE.
|
||||
// arg0: if true won't change battler's palette back
|
||||
// arg1: if true, use custom color
|
||||
// arg2: custom color
|
||||
// Custom color argument is used in MOVE_POISON_TAIL to make the mon turn purplish/pinkish as if became cloaked in poison.
|
||||
void AnimTask_MetallicShine(u8 taskId)
|
||||
{
|
||||
u16 species;
|
||||
u8 spriteId, newSpriteId;
|
||||
u16 paletteNum;
|
||||
struct BattleAnimBgData animBg;
|
||||
bool32 priorityChanged = FALSE;
|
||||
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(8, 12));
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 0);
|
||||
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
|
||||
if (IsDoubleBattle() && !IsContest())
|
||||
{
|
||||
if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT)
|
||||
{
|
||||
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker)) == TRUE)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority--;
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
|
||||
priorityChanged = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
|
||||
else
|
||||
species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES);
|
||||
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
|
||||
newSpriteId = sub_8076E34(gBattleAnimAttacker, spriteId, species);
|
||||
sub_80752A0(&animBg);
|
||||
AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap);
|
||||
AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset);
|
||||
LoadCompressedPalette(gMetalShinePalette, animBg.paletteId * 16, 32);
|
||||
gBattle_BG1_X = -gSprites[spriteId].pos1.x + 96;
|
||||
gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32;
|
||||
paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
|
||||
if (gBattleAnimArgs[1] == 0)
|
||||
SetGreyscaleOrOriginalPalette(paletteNum, FALSE);
|
||||
else
|
||||
BlendPalette(paletteNum * 16, 16, 11, gBattleAnimArgs[2]);
|
||||
gTasks[taskId].data[0] = newSpriteId;
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[6] = priorityChanged;
|
||||
gTasks[taskId].func = sub_80B8920;
|
||||
}
|
||||
|
||||
static void sub_80B8920(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBg;
|
||||
u16 paletteNum;
|
||||
u8 spriteId;
|
||||
|
||||
gTasks[taskId].data[10] += 4;
|
||||
gBattle_BG1_X -= 4;
|
||||
if (gTasks[taskId].data[10] == 128)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
gBattle_BG1_X += 128;
|
||||
gTasks[taskId].data[11]++;
|
||||
if (gTasks[taskId].data[11] == 2)
|
||||
{
|
||||
spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER);
|
||||
paletteNum = 16 + gSprites[spriteId].oam.paletteNum;
|
||||
if (gTasks[taskId].data[1] == 0)
|
||||
SetGreyscaleOrOriginalPalette(paletteNum, 1);
|
||||
DestroySprite(&gSprites[gTasks[taskId].data[0]]);
|
||||
sub_80752A0(&animBg);
|
||||
sub_8075358(animBg.bgId);
|
||||
if (gTasks[taskId].data[6] == 1)
|
||||
gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++;
|
||||
}
|
||||
else if (gTasks[taskId].data[11] == 3)
|
||||
{
|
||||
gBattle_WIN0H = 0;
|
||||
gBattle_WIN0V = 0;
|
||||
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR);
|
||||
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
|
||||
SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON);
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Changes battler's palette to either greyscale or original.
|
||||
// arg0: which battler
|
||||
// arg1: 0 grayscale, 1 original
|
||||
void AnimTask_SetGreyscaleOrOriginalPal(u8 taskId)
|
||||
{
|
||||
u8 spriteId, battler;
|
||||
bool8 calcSpriteId = FALSE;
|
||||
u8 position = B_POSITION_PLAYER_LEFT;
|
||||
|
||||
switch (gBattleAnimArgs[0])
|
||||
{
|
||||
case 0:
|
||||
case 1:
|
||||
case 2:
|
||||
case 3:
|
||||
spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
break;
|
||||
case 4:
|
||||
position = B_POSITION_PLAYER_LEFT;
|
||||
calcSpriteId = TRUE;
|
||||
break;
|
||||
case 5:
|
||||
position = B_POSITION_PLAYER_RIGHT;
|
||||
calcSpriteId = TRUE;
|
||||
break;
|
||||
case 6:
|
||||
position = B_POSITION_OPPONENT_LEFT;
|
||||
calcSpriteId = TRUE;
|
||||
break;
|
||||
case 7:
|
||||
position = B_POSITION_OPPONENT_RIGHT;
|
||||
calcSpriteId = TRUE;
|
||||
break;
|
||||
default:
|
||||
spriteId = 0xFF;
|
||||
break;
|
||||
}
|
||||
if (calcSpriteId)
|
||||
{
|
||||
battler = GetBattlerAtPosition(position);
|
||||
if (IsBattlerSpriteVisible(battler))
|
||||
spriteId = gBattlerSpriteIds[battler];
|
||||
else
|
||||
spriteId = 0xFF;
|
||||
}
|
||||
if (spriteId != 0xFF)
|
||||
SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B8B38(u8 taskId)
|
||||
{
|
||||
if (gAnimMoveTurn < 2)
|
||||
gBattleAnimArgs[7] = 0;
|
||||
if (gAnimMoveTurn == 2)
|
||||
gBattleAnimArgs[7] = 1;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
+2
-2
@@ -2087,7 +2087,7 @@ struct UnkStruct_82349CC
|
||||
u8 field_3;
|
||||
};
|
||||
|
||||
extern const struct UnkStruct_82349CC gUnknown_82349CC[NUM_SPECIES];
|
||||
extern const struct UnkStruct_82349CC gMonFrontPicCoords[NUM_SPECIES];
|
||||
|
||||
static void SpriteCB_Egg_2(struct Sprite* sprite)
|
||||
{
|
||||
@@ -2101,7 +2101,7 @@ static void SpriteCB_Egg_2(struct Sprite* sprite)
|
||||
sprite->data[0] = 0;
|
||||
species = GetMonData(&gPlayerParty[sEggHatchData->eggPartyID], MON_DATA_SPECIES);
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos2.x = 0;
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos2.y = gUnknown_82349CC[species].field_1;
|
||||
gSprites[sEggHatchData->pokeSpriteID].pos2.y = gMonFrontPicCoords[species].field_1;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+431
@@ -0,0 +1,431 @@
|
||||
#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);
|
||||
}
|
||||
+1289
File diff suppressed because it is too large
Load Diff
+1484
File diff suppressed because it is too large
Load Diff
+724
@@ -0,0 +1,724 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "random.h"
|
||||
#include "scanline_effect.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
|
||||
static void AnimBonemerangProjectile(struct Sprite *sprite);
|
||||
static void AnimBoneHitProjectile(struct Sprite *sprite);
|
||||
static void AnimDirtScatter(struct Sprite *sprite);
|
||||
static void AnimMudSportDirt(struct Sprite *sprite);
|
||||
static void AnimFissureDirtPlumeParticle(struct Sprite *sprite);
|
||||
static void AnimDigDirtMound(struct Sprite *sprite);
|
||||
static void AnimBonemerangProjectileStep(struct Sprite *sprite);
|
||||
static void AnimBonemerangProjectileEnd(struct Sprite *sprite);
|
||||
static void AnimMudSportDirtRising(struct Sprite *sprite);
|
||||
static void AnimMudSportDirtFalling(struct Sprite *sprite);
|
||||
static void sub_80B8ED4(u8 taskId);
|
||||
static void sub_80B908C(u8 taskId);
|
||||
static void sub_80B92B8(u8 useBg1, s16 y, s16 endY);
|
||||
static void sub_80B912C(u8 taskId);
|
||||
static void sub_80B91B0(u8 taskId);
|
||||
static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite);
|
||||
static void sub_80B9584(u8 taskId);
|
||||
static void sub_80B967C(u8 taskId);
|
||||
static void sub_80B9760(struct Task *task);
|
||||
static void sub_80B98A8(u8 taskId);
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7A00[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 15, 1),
|
||||
AFFINEANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7A10[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 20, 1),
|
||||
AFFINEANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7A20[] =
|
||||
{
|
||||
gUnknown_83E7A00,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7A24[] =
|
||||
{
|
||||
gUnknown_83E7A10,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A28 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_BONE,
|
||||
.paletteTag = ANIM_TAG_BONE,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7A20,
|
||||
.callback = AnimBonemerangProjectile,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A40 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_BONE,
|
||||
.paletteTag = ANIM_TAG_BONE,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7A24,
|
||||
.callback = AnimBoneHitProjectile,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A58 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimDirtScatter,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7A70[] =
|
||||
{
|
||||
ANIMCMD_FRAME(1, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7A78[] =
|
||||
{
|
||||
gUnknown_83E7A70,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A7C =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gUnknown_83E7A78,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimDirtScatter,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7A94 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimMudSportDirt,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7AAC =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimFissureDirtPlumeParticle,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7AC4 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_DIRT_MOUND,
|
||||
.paletteTag = ANIM_TAG_DIRT_MOUND,
|
||||
.oam = &gOamData_83AC9F8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimDigDirtMound,
|
||||
};
|
||||
|
||||
// Moves a bone projectile towards the target mon, which moves like
|
||||
// a boomerang. After hitting the target mon, it comes back to the user.
|
||||
static void AnimBonemerangProjectile(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
||||
sprite->data[0] = 20;
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
|
||||
sprite->data[5] = -40;
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = AnimBonemerangProjectileStep;
|
||||
}
|
||||
|
||||
static void AnimBonemerangProjectileStep(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
{
|
||||
sprite->pos1.x += sprite->pos2.x;
|
||||
sprite->pos1.y += sprite->pos2.y;
|
||||
sprite->pos2.y = 0;
|
||||
sprite->pos2.x = 0;
|
||||
sprite->data[0] = 20;
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
|
||||
sprite->data[5] = 40;
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = AnimBonemerangProjectileEnd;
|
||||
}
|
||||
}
|
||||
|
||||
static void AnimBonemerangProjectileEnd(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
// Moves a bone projectile towards the target mon, starting right next to
|
||||
// the target mon.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: target x pixel offset
|
||||
// arg 3: target y pixel offset
|
||||
// arg 4: duration
|
||||
static void AnimBoneHitProjectile(struct Sprite *sprite)
|
||||
{
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[2];
|
||||
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[3];
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
// Moves a small dirt projectile towards the target mon.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: duration
|
||||
// arg 3: target x pixel offset
|
||||
// arg 4: target y pixel offset
|
||||
static void AnimDirtScatter(struct Sprite *sprite)
|
||||
{
|
||||
u8 targetXPos, targetYPos;
|
||||
s16 xOffset, yOffset;
|
||||
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
targetXPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 2);
|
||||
targetYPos = GetBattlerSpriteCoord2(gBattleAnimTarget, 3);
|
||||
xOffset = Random() & 0x1F;
|
||||
yOffset = Random() & 0x1F;
|
||||
if (xOffset > 16)
|
||||
xOffset = 16 - xOffset;
|
||||
if (yOffset > 16)
|
||||
yOffset = 16 - yOffset;
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->data[2] = targetXPos + xOffset;
|
||||
sprite->data[4] = targetYPos + yOffset;
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
}
|
||||
|
||||
// Moves a particle of dirt in the Mud Sport animation.
|
||||
// The dirt can either be rising upward, or falling down.
|
||||
// arg 0: 0 = dirt is rising into the air, 1 = dirt is falling down
|
||||
// arg 1: initial x pixel offset
|
||||
// arg 2: initial y pixel offset
|
||||
static void AnimMudSportDirt(struct Sprite *sprite)
|
||||
{
|
||||
++sprite->oam.tileNum;
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1];
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2];
|
||||
sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1;
|
||||
sprite->callback = AnimMudSportDirtRising;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x = gBattleAnimArgs[1];
|
||||
sprite->pos1.y = gBattleAnimArgs[2];
|
||||
sprite->pos2.y = -gBattleAnimArgs[2];
|
||||
sprite->callback = AnimMudSportDirtFalling;
|
||||
}
|
||||
}
|
||||
|
||||
static void AnimMudSportDirtRising(struct Sprite *sprite)
|
||||
{
|
||||
if (++sprite->data[1] > 1)
|
||||
{
|
||||
sprite->data[1] = 0;
|
||||
sprite->pos1.x += sprite->data[0];
|
||||
}
|
||||
sprite->pos1.y -= 4;
|
||||
if (sprite->pos1.y < -4)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
static void AnimMudSportDirtFalling(struct Sprite *sprite)
|
||||
{
|
||||
switch (sprite->data[0])
|
||||
{
|
||||
case 0:
|
||||
sprite->pos2.y += 4;
|
||||
if (sprite->pos2.y >= 0)
|
||||
{
|
||||
sprite->pos2.y = 0;
|
||||
++sprite->data[0];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++sprite->data[1] > 0)
|
||||
{
|
||||
sprite->data[1] = 0;
|
||||
sprite->invisible ^= 1;
|
||||
if (++sprite->data[2] == 10)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B8E94(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
task->func = sub_80B8ED4;
|
||||
else
|
||||
task->func = sub_80B908C;
|
||||
task->func(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B8ED4(u8 taskId)
|
||||
{
|
||||
u8 var0;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[10] = GetAnimBattlerSpriteId(0);
|
||||
task->data[11] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
|
||||
if (task->data[11] == 1)
|
||||
{
|
||||
task->data[12] = gBattle_BG1_X;
|
||||
task->data[13] = gBattle_BG1_Y;
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[12] = gBattle_BG2_X;
|
||||
task->data[13] = gBattle_BG2_Y;
|
||||
}
|
||||
var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
|
||||
task->data[14] = var0 - 32;
|
||||
task->data[15] = var0 + 32;
|
||||
if (task->data[14] < 0)
|
||||
task->data[14] = 0;
|
||||
gSprites[task->data[10]].invisible = TRUE;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 1:
|
||||
sub_80B92B8(task->data[11], task->data[14], task->data[15]);
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
task->data[2] = (task->data[2] + 6) & 0x7F;
|
||||
if (++task->data[4] > 2)
|
||||
{
|
||||
task->data[4] = 0;
|
||||
++task->data[3];
|
||||
}
|
||||
task->data[5] = task->data[3] + (gSineTable[task->data[2]] >> 4);
|
||||
if (task->data[11] == 1)
|
||||
gBattle_BG1_Y = task->data[13] - task->data[5];
|
||||
else
|
||||
gBattle_BG2_Y = task->data[13] - task->data[5];
|
||||
|
||||
if (task->data[5] > 63)
|
||||
{
|
||||
task->data[5] = 120 - task->data[14];
|
||||
if (task->data[11] == 1)
|
||||
gBattle_BG1_Y = task->data[13] - task->data[5];
|
||||
else
|
||||
gBattle_BG2_Y = task->data[13] - task->data[5];
|
||||
|
||||
gSprites[task->data[10]].pos2.x = 272 - gSprites[task->data[10]].pos1.x;
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 4:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
gSprites[task->data[10]].invisible = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B908C(u8 taskId)
|
||||
{
|
||||
u8 spriteId = GetAnimBattlerSpriteId(0);
|
||||
|
||||
gSprites[spriteId].invisible = TRUE;
|
||||
gSprites[spriteId].pos2.x = 0;
|
||||
gSprites[spriteId].pos2.y = 0;
|
||||
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
|
||||
gBattle_BG1_Y = 0;
|
||||
else
|
||||
gBattle_BG2_Y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B90EC(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
task->func = sub_80B912C;
|
||||
else
|
||||
task->func = sub_80B91B0;
|
||||
|
||||
task->func(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B912C(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[10] = GetAnimBattlerSpriteId(0);
|
||||
gSprites[task->data[10]].invisible = FALSE;
|
||||
gSprites[task->data[10]].pos2.x = 0;
|
||||
gSprites[task->data[10]].pos2.y = 160 - gSprites[task->data[10]].pos1.y;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 1:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B91B0(u8 taskId)
|
||||
{
|
||||
u8 var0;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[10] = GetAnimBattlerSpriteId(0);
|
||||
task->data[11] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker);
|
||||
if (task->data[11] == 1)
|
||||
task->data[12] = gBattle_BG1_X;
|
||||
else
|
||||
task->data[12] = gBattle_BG2_X;
|
||||
|
||||
var0 = GetBattlerYCoordWithElevation(gBattleAnimAttacker);
|
||||
task->data[14] = var0 - 32;
|
||||
task->data[15] = var0 + 32;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 1:
|
||||
sub_80B92B8(task->data[11], 0, task->data[15]);
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
gSprites[task->data[10]].pos2.y = 96;
|
||||
++task->data[0];
|
||||
break;
|
||||
case 3:
|
||||
gSprites[task->data[10]].pos2.y -= 8;
|
||||
if (gSprites[task->data[10]].pos2.y == 0)
|
||||
{
|
||||
gScanlineEffect.state = 3;
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B92B8(u8 useBG1, s16 y, s16 endY)
|
||||
{
|
||||
s16 bgX;
|
||||
struct ScanlineEffectParams scanlineParams;
|
||||
|
||||
if (useBG1 == 1)
|
||||
{
|
||||
bgX = gBattle_BG1_X;
|
||||
scanlineParams.dmaDest = ®_BG1HOFS;
|
||||
}
|
||||
else
|
||||
{
|
||||
bgX = gBattle_BG2_X;
|
||||
scanlineParams.dmaDest = ®_BG2HOFS;
|
||||
}
|
||||
if (y < 0)
|
||||
y = 0;
|
||||
while (y < endY)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][y] = bgX;
|
||||
gScanlineEffectRegBuffers[1][y] = bgX;
|
||||
++y;
|
||||
}
|
||||
while (y < 160)
|
||||
{
|
||||
gScanlineEffectRegBuffers[0][y] = bgX + 240;
|
||||
gScanlineEffectRegBuffers[1][y] = bgX + 240;
|
||||
++y;
|
||||
}
|
||||
scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
|
||||
scanlineParams.initState = 1;
|
||||
scanlineParams.unused9 = 0;
|
||||
ScanlineEffect_SetParams(scanlineParams);
|
||||
}
|
||||
|
||||
// Moves a particle of dirt in a plume of dirt. Used in Fissure and Dig.
|
||||
// arg 0: which mon (0 = attacker, 1 = target)
|
||||
// arg 1: which side of mon (0 = left, 1 = right)
|
||||
// arg 2: target x offset
|
||||
// arg 3: target y offset
|
||||
// arg 4: wave amplitude
|
||||
// arg 5: duration
|
||||
static void AnimFissureDirtPlumeParticle(struct Sprite *sprite)
|
||||
{
|
||||
s8 battler;
|
||||
s16 xOffset;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
battler = gBattleAnimAttacker;
|
||||
else
|
||||
battler = gBattleAnimTarget;
|
||||
xOffset = 24;
|
||||
if (gBattleAnimArgs[1] == 1)
|
||||
{
|
||||
xOffset *= -1;
|
||||
gBattleAnimArgs[2] *= -1;
|
||||
}
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(battler, 2) + xOffset;
|
||||
sprite->pos1.y = GetBattlerYCoordWithElevation(battler) + 30;
|
||||
sprite->data[0] = gBattleAnimArgs[5];
|
||||
sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
|
||||
sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3];
|
||||
sprite->data[5] = gBattleAnimArgs[4];
|
||||
InitAnimArcTranslation(sprite);
|
||||
sprite->callback = AnimFissureDirtPlumeParticleStep;
|
||||
}
|
||||
|
||||
static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
// Displays the dirt mound seen in the move Dig for set duration.
|
||||
// The dirt mound image is too large for a single sprite, so two
|
||||
// sprites are lined up next to each other.
|
||||
// arg 0: which mon (0 = attacker, 1 = target)
|
||||
// arg 1: oam tile num (0 = left half of image, 1 = right half of image)
|
||||
// arg 2: duration
|
||||
static void AnimDigDirtMound(struct Sprite *sprite)
|
||||
{
|
||||
s8 battler;
|
||||
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
battler = gBattleAnimAttacker;
|
||||
else
|
||||
battler = gBattleAnimTarget;
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(battler, 0) - 16 + (gBattleAnimArgs[1] * 32);
|
||||
sprite->pos1.y = GetBattlerYCoordWithElevation(battler) + 32;
|
||||
sprite->oam.tileNum += gBattleAnimArgs[1] * 8;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
sprite->callback = WaitAnimForDuration;
|
||||
}
|
||||
|
||||
void sub_80B94B4(u8 taskId)
|
||||
{
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (gBattleAnimArgs[1])
|
||||
task->data[14] = task->data[15] = gBattleAnimArgs[1] + 3;
|
||||
else
|
||||
task->data[14] = task->data[15] = (gAnimMovePower / 10) + 3;
|
||||
|
||||
task->data[3] = gBattleAnimArgs[2];
|
||||
switch (gBattleAnimArgs[0])
|
||||
{
|
||||
case 5:
|
||||
task->data[13] = gBattle_BG3_X;
|
||||
task->func = sub_80B9584;
|
||||
break;
|
||||
case 4:
|
||||
task->data[13] = 0;
|
||||
for (i = 0; i < MAX_BATTLERS_COUNT; ++i)
|
||||
{
|
||||
if (IsBattlerSpriteVisible(i))
|
||||
{
|
||||
task->data[task->data[13] + 9] = gBattlerSpriteIds[i];
|
||||
++task->data[13];
|
||||
}
|
||||
}
|
||||
task->func = sub_80B967C;
|
||||
break;
|
||||
default:
|
||||
task->data[9] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
if (task->data[9] == 0xFF)
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[13] = 1;
|
||||
task->func = sub_80B967C;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B9584(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
if ((task->data[2] & 1) == 0)
|
||||
gBattle_BG3_X = task->data[13] + task->data[15];
|
||||
else
|
||||
gBattle_BG3_X = task->data[13] - task->data[15];
|
||||
|
||||
if (++task->data[2] == task->data[3])
|
||||
{
|
||||
task->data[2] = 0;
|
||||
--task->data[14];
|
||||
++task->data[0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
if ((task->data[2] & 1) == 0)
|
||||
gBattle_BG3_X = task->data[13] + task->data[14];
|
||||
else
|
||||
gBattle_BG3_X = task->data[13] - task->data[14];
|
||||
|
||||
if (++task->data[2] == 4)
|
||||
{
|
||||
task->data[2] = 0;
|
||||
if (--task->data[14] == 0)
|
||||
++task->data[0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
gBattle_BG3_X = task->data[13];
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B967C(u8 taskId)
|
||||
{
|
||||
u16 i;
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
sub_80B9760(task);
|
||||
if (++task->data[2] == task->data[3])
|
||||
{
|
||||
task->data[2] = 0;
|
||||
--task->data[14];
|
||||
++task->data[0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++task->data[1] > 1)
|
||||
{
|
||||
task->data[1] = 0;
|
||||
sub_80B9760(task);
|
||||
if (++task->data[2] == 4)
|
||||
{
|
||||
task->data[2] = 0;
|
||||
if (--task->data[14] == 0)
|
||||
++task->data[0];
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
for (i = 0; i < task->data[13]; ++i)
|
||||
gSprites[task->data[9 + i]].pos2.x = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B9760(struct Task *task)
|
||||
{
|
||||
u16 i, xOffset;
|
||||
|
||||
if ((task->data[2] & 1) == 0)
|
||||
xOffset = (task->data[14] / 2) + (task->data[14] & 1);
|
||||
else
|
||||
xOffset = -(task->data[14] / 2);
|
||||
for (i = 0; i < task->data[13]; ++i)
|
||||
gSprites[task->data[9 + i]].pos2.x = xOffset;
|
||||
}
|
||||
|
||||
void AnimTask_IsPowerOver99(u8 taskId)
|
||||
{
|
||||
gBattleAnimArgs[15] = gAnimMovePower > 99;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B9800(u8 taskId)
|
||||
{
|
||||
struct Task *newTask;
|
||||
u8 battler = (gBattleAnimArgs[0] & 1) ? gBattleAnimTarget : gBattleAnimAttacker;
|
||||
|
||||
if (gBattleAnimArgs[0] > 1)
|
||||
battler ^= BIT_FLANK;
|
||||
newTask = &gTasks[CreateTask(sub_80B98A8, gBattleAnimArgs[1])];
|
||||
newTask->data[1] = (32 - GetBattlerSpriteCoord(battler, 2)) & 0x1FF;
|
||||
newTask->data[2] = (64 - GetBattlerSpriteCoord(battler, 3)) & 0xFF;
|
||||
gBattle_BG3_X = newTask->data[1];
|
||||
gBattle_BG3_Y = newTask->data[2];
|
||||
newTask->data[3] = gBattleAnimArgs[2];
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
static void sub_80B98A8(u8 taskId)
|
||||
{
|
||||
struct Task *task = &gTasks[taskId];
|
||||
|
||||
if (gBattleAnimArgs[7] == task->data[3])
|
||||
{
|
||||
gBattle_BG3_X = 0;
|
||||
gBattle_BG3_Y = 0;
|
||||
DestroyTask(taskId);
|
||||
}
|
||||
else
|
||||
{
|
||||
gBattle_BG3_X = task->data[1];
|
||||
gBattle_BG3_Y = task->data[2];
|
||||
}
|
||||
}
|
||||
+916
@@ -0,0 +1,916 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "palette.h"
|
||||
#include "random.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
|
||||
static void AnimConfusionDuck(struct Sprite *sprite);
|
||||
static void AnimSimplePaletteBlend(struct Sprite *sprite);
|
||||
static void sub_80B9A7C(struct Sprite *sprite);
|
||||
static void sub_80B9B8C(struct Sprite *sprite);
|
||||
static void sub_80BA27C(struct Sprite *sprite);
|
||||
static void sub_80BA560(struct Sprite *sprite);
|
||||
static void sub_80BA5F8(struct Sprite *sprite);
|
||||
static void sub_80BA630(struct Sprite *sprite);
|
||||
static void sub_80BA6C8(struct Sprite *sprite);
|
||||
static void sub_80BA738(struct Sprite *sprite);
|
||||
static void sub_80BA780(struct Sprite *sprite);
|
||||
static void sub_80BA5A8(struct Sprite *sprite);
|
||||
static void AnimConfusionDuckStep(struct Sprite *sprite);
|
||||
static void AnimSimplePaletteBlendStep(struct Sprite *sprite);
|
||||
static void sub_80B9AD0(struct Sprite *sprite);
|
||||
static void sub_80B9B5C(struct Sprite *sprite);
|
||||
static void sub_80B9C2C(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
|
||||
static void sub_80B9C7C(u8 taskId);
|
||||
static void sub_80B9DA0(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
|
||||
static void sub_80B9DF0(u8 taskId);
|
||||
static void sub_80B9EA8(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount);
|
||||
static void sub_80B9F04(u8 taskId);
|
||||
static void sub_80B9FD8(u8 taskId);
|
||||
static void sub_80BA090(u8 taskId);
|
||||
static void sub_80BA3CC(void);
|
||||
static void sub_80BA320(struct Sprite *sprite);
|
||||
static void sub_80BA4D0(u8 taskId);
|
||||
static void sub_80BA7BC(struct Sprite *sprite);
|
||||
|
||||
|
||||
static const union AnimCmd gUnknown_83E7ADC[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 8),
|
||||
ANIMCMD_FRAME(4, 8),
|
||||
ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(8, 8),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7AF0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 8, .hFlip = TRUE),
|
||||
ANIMCMD_FRAME(4, 8),
|
||||
ANIMCMD_FRAME(0, 8),
|
||||
ANIMCMD_FRAME(8, 8),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7B04[] =
|
||||
{
|
||||
gUnknown_83E7ADC,
|
||||
gUnknown_83E7AF0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gConfusionDuckSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_DUCK,
|
||||
.paletteTag = ANIM_TAG_DUCK,
|
||||
.oam = &gOamData_83AC9D0,
|
||||
.anims = gUnknown_83E7B04,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimConfusionDuck,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gSimplePaletteBlendSpriteTemplate =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimSimplePaletteBlend,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gComplexPaletteBlendSpriteTemplate =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B9A7C,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7B54[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 3),
|
||||
ANIMCMD_FRAME(16, 3),
|
||||
ANIMCMD_FRAME(32, 3),
|
||||
ANIMCMD_FRAME(48, 3),
|
||||
ANIMCMD_FRAME(64, 3),
|
||||
ANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E7B6C[] =
|
||||
{
|
||||
gUnknown_83E7B54,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7B70 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SPARKLE_4,
|
||||
.paletteTag = ANIM_TAG_SPARKLE_4,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E7B6C,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B9B8C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7B88 =
|
||||
{
|
||||
.tileTag = 0,
|
||||
.paletteTag = 0,
|
||||
.oam = &gDummyOamData,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80BA27C,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7BA0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7BB0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xD8, 0xD8, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7BC8[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7BE0[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x80, 0x80, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 8),
|
||||
AFFINEANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7BF8[] =
|
||||
{
|
||||
gUnknown_83E7BA0,
|
||||
gUnknown_83E7BB0,
|
||||
gUnknown_83E7BC8,
|
||||
gUnknown_83E7BE0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gBasicHitSplatSpriteTemplate =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA560,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C20 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA5F8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C38 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_WATER_IMPACT,
|
||||
.paletteTag = ANIM_TAG_WATER_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA560,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C50 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA630,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C68 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA6C8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C80 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_CROSS_IMPACT,
|
||||
.paletteTag = ANIM_TAG_CROSS_IMPACT,
|
||||
.oam = &gOamData_83ACAF8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80BA738,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7C98 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA780,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7CB0 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_IMPACT,
|
||||
.paletteTag = ANIM_TAG_IMPACT,
|
||||
.oam = &gOamData_83ACB58,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7BF8,
|
||||
.callback = sub_80BA5A8,
|
||||
};
|
||||
|
||||
// Moves a spinning duck around the mon's head.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: initial wave offset
|
||||
// arg 3: wave period (higher means faster wave)
|
||||
// arg 4: duration
|
||||
static void AnimConfusionDuck(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[2];
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
sprite->data[1] = -gBattleAnimArgs[3];
|
||||
sprite->data[4] = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[1] = gBattleAnimArgs[3];
|
||||
sprite->data[4] = 0;
|
||||
StartSpriteAnim(sprite, 1);
|
||||
}
|
||||
sprite->data[3] = gBattleAnimArgs[4];
|
||||
sprite->callback = AnimConfusionDuckStep;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
static void AnimConfusionDuckStep(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos2.x = Cos(sprite->data[0], 30);
|
||||
sprite->pos2.y = Sin(sprite->data[0], 10);
|
||||
if ((u16)sprite->data[0] < 128)
|
||||
sprite->oam.priority = 1;
|
||||
else
|
||||
sprite->oam.priority = 3;
|
||||
sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;
|
||||
if (++sprite->data[2] == sprite->data[3])
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
// Performs a simple color blend on a specified sprite.
|
||||
// arg 0: palette selector
|
||||
// arg 1: delay
|
||||
// arg 2: start blend amount
|
||||
// arg 3: end blend amount
|
||||
// arg 4: blend color
|
||||
static void AnimSimplePaletteBlend(struct Sprite *sprite)
|
||||
{
|
||||
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]);
|
||||
|
||||
BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]);
|
||||
sprite->invisible = TRUE;
|
||||
sprite->callback = AnimSimplePaletteBlendStep;
|
||||
}
|
||||
|
||||
// Unpacks a bitfield and returns a bitmask of its selected palettes.
|
||||
// Bits 0-6 of the selector parameter result in the following palettes being selected:
|
||||
// 0: battle background palettes (BG palettes 1, 2, and 3)
|
||||
// 1: gBattleAnimAttacker OBJ palette
|
||||
// 2: gBattleAnimTarget OBJ palette
|
||||
// 3: gBattleAnimAttacker partner OBJ palette
|
||||
// 4: gBattleAnimTarget partner OBJ palette
|
||||
// 5: BG palette 4
|
||||
// 6: BG palette 5
|
||||
u32 UnpackSelectedBattleAnimPalettes(s16 selector)
|
||||
{
|
||||
u8 battleBackground = selector & 1;
|
||||
u8 attacker = (selector >> 1) & 1;
|
||||
u8 target = (selector >> 2) & 1;
|
||||
u8 attackerPartner = (selector >> 3) & 1;
|
||||
u8 targetPartner = (selector >> 4) & 1;
|
||||
u8 arg5 = (selector >> 5) & 1;
|
||||
u8 arg6 = (selector >> 6) & 1;
|
||||
|
||||
return sub_8075BE8(battleBackground, attacker, target, attackerPartner, targetPartner, arg5, arg6);
|
||||
}
|
||||
|
||||
static void AnimSimplePaletteBlendStep(struct Sprite *sprite)
|
||||
{
|
||||
if (!gPaletteFade.active)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B9A7C(struct Sprite *sprite)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
sprite->data[0] = gBattleAnimArgs[1];
|
||||
sprite->data[1] = gBattleAnimArgs[1];
|
||||
sprite->data[2] = gBattleAnimArgs[2];
|
||||
sprite->data[3] = gBattleAnimArgs[3];
|
||||
sprite->data[4] = gBattleAnimArgs[4];
|
||||
sprite->data[5] = gBattleAnimArgs[5];
|
||||
sprite->data[6] = gBattleAnimArgs[6];
|
||||
sprite->data[7] = gBattleAnimArgs[0];
|
||||
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
|
||||
BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]);
|
||||
sprite->invisible = TRUE;
|
||||
sprite->callback = sub_80B9AD0;
|
||||
}
|
||||
|
||||
static void sub_80B9AD0(struct Sprite *sprite)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
if (sprite->data[0] > 0)
|
||||
{
|
||||
--sprite->data[0];
|
||||
return;
|
||||
}
|
||||
if (gPaletteFade.active)
|
||||
return;
|
||||
if (sprite->data[2] == 0)
|
||||
{
|
||||
sprite->callback = sub_80B9B5C;
|
||||
return;
|
||||
}
|
||||
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
|
||||
if (sprite->data[1] & 0x100)
|
||||
BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]);
|
||||
else
|
||||
BlendPalettes(selectedPalettes, sprite->data[6], sprite->data[5]);
|
||||
sprite->data[1] ^= 0x100;
|
||||
sprite->data[0] = sprite->data[1] & 0xFF;
|
||||
--sprite->data[2];
|
||||
}
|
||||
|
||||
static void sub_80B9B5C(struct Sprite *sprite)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]);
|
||||
BlendPalettes(selectedPalettes, 0, 0);
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B9B8C(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[0] = 0;
|
||||
sprite->data[1] = 10;
|
||||
sprite->data[2] = 8;
|
||||
sprite->data[3] = 40;
|
||||
sprite->data[4] = 112;
|
||||
sprite->data[5] = 0;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = TranslateSpriteInGrowingCircleOverDuration;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
void sub_80B9BDC(u8 taskId)
|
||||
{
|
||||
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] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[8] = 0;
|
||||
sub_80B9C2C(taskId, 0, gTasks[taskId].data[4]);
|
||||
gTasks[taskId].func = sub_80B9C7C;
|
||||
}
|
||||
|
||||
static void sub_80B9C2C(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount)
|
||||
{
|
||||
u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gTasks[taskId].data[0]);
|
||||
|
||||
BeginNormalPaletteFade(selectedPalettes,
|
||||
gTasks[taskId].data[1],
|
||||
initialBlendAmount,
|
||||
targetBlendAmount,
|
||||
gTasks[taskId].data[5]);
|
||||
--gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[8] ^= 1;
|
||||
}
|
||||
|
||||
static void sub_80B9C7C(u8 taskId)
|
||||
{
|
||||
u8 initialBlendAmount, targetBlendAmount;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (gTasks[taskId].data[2] > 0)
|
||||
{
|
||||
if (gTasks[taskId].data[8] == 0)
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[3];
|
||||
targetBlendAmount = gTasks[taskId].data[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[4];
|
||||
targetBlendAmount = gTasks[taskId].data[3];
|
||||
}
|
||||
if (gTasks[taskId].data[2] == 1)
|
||||
targetBlendAmount = 0;
|
||||
sub_80B9C2C(taskId, initialBlendAmount, targetBlendAmount);
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B9CE4(u8 taskId)
|
||||
{
|
||||
s32 battler;
|
||||
u32 selectedPalettes = 0;
|
||||
|
||||
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] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[8] = 0;
|
||||
for (battler = 0; battler < gBattlersCount; ++battler)
|
||||
if (battler != gBattleAnimAttacker && battler != gBattleAnimTarget)
|
||||
selectedPalettes |= 1 << (battler + 16);
|
||||
if (gBattleAnimArgs[0] == 1)
|
||||
selectedPalettes |= 0xE;
|
||||
gTasks[taskId].data[9] = selectedPalettes >> 16;
|
||||
gTasks[taskId].data[10] = selectedPalettes & 0xFF;
|
||||
sub_80B9DA0(taskId, 0, gTasks[taskId].data[4]);
|
||||
gTasks[taskId].func = sub_80B9DF0;
|
||||
}
|
||||
|
||||
static void sub_80B9DA0(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount)
|
||||
{
|
||||
u32 selectedPalettes = ((u16)gTasks[taskId].data[9] << 16) | (u16)gTasks[taskId].data[10];
|
||||
|
||||
BeginNormalPaletteFade(selectedPalettes,
|
||||
gTasks[taskId].data[1],
|
||||
initialBlendAmount,
|
||||
targetBlendAmount,
|
||||
gTasks[taskId].data[5]);
|
||||
--gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[8] ^= 1;
|
||||
}
|
||||
|
||||
static void sub_80B9DF0(u8 taskId)
|
||||
{
|
||||
u8 initialBlendAmount, targetBlendAmount;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (gTasks[taskId].data[2] > 0)
|
||||
{
|
||||
if (gTasks[taskId].data[8] == 0)
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[3];
|
||||
targetBlendAmount = gTasks[taskId].data[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[4];
|
||||
targetBlendAmount = gTasks[taskId].data[3];
|
||||
}
|
||||
|
||||
if (gTasks[taskId].data[2] == 1)
|
||||
targetBlendAmount = 0;
|
||||
sub_80B9DA0(taskId, initialBlendAmount, targetBlendAmount);
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B9E58(u8 taskId)
|
||||
{
|
||||
u8 paletteIndex;
|
||||
|
||||
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] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[8] = 0;
|
||||
sub_80B9EA8(taskId, 0, gTasks[taskId].data[4]);
|
||||
gTasks[taskId].func = sub_80B9F04;
|
||||
}
|
||||
|
||||
static void sub_80B9EA8(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount)
|
||||
{
|
||||
u8 paletteIndex = IndexOfSpritePaletteTag(gTasks[taskId].data[0]);
|
||||
|
||||
BeginNormalPaletteFade(1 << (paletteIndex + 16),
|
||||
gTasks[taskId].data[1],
|
||||
initialBlendAmount,
|
||||
targetBlendAmount,
|
||||
gTasks[taskId].data[5]);
|
||||
--gTasks[taskId].data[2];
|
||||
gTasks[taskId].data[8] ^= 1;
|
||||
}
|
||||
|
||||
static void sub_80B9F04(u8 taskId)
|
||||
{
|
||||
u8 initialBlendAmount, targetBlendAmount;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
if (gTasks[taskId].data[2] > 0)
|
||||
{
|
||||
if (gTasks[taskId].data[8] == 0)
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[3];
|
||||
targetBlendAmount = gTasks[taskId].data[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
initialBlendAmount = gTasks[taskId].data[4];
|
||||
targetBlendAmount = gTasks[taskId].data[3];
|
||||
}
|
||||
|
||||
if (gTasks[taskId].data[2] == 1)
|
||||
targetBlendAmount = 0;
|
||||
sub_80B9EA8(taskId, initialBlendAmount, targetBlendAmount);
|
||||
}
|
||||
else
|
||||
{
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80B9F6C(u8 taskId)
|
||||
{
|
||||
u8 paletteIndex;
|
||||
|
||||
gTasks[taskId].data[0] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[6];
|
||||
gTasks[taskId].data[7] = gBattleAnimArgs[0];
|
||||
paletteIndex = IndexOfSpritePaletteTag(gBattleAnimArgs[0]);
|
||||
BeginNormalPaletteFade(1 << (paletteIndex + 16),
|
||||
0,
|
||||
gBattleAnimArgs[4],
|
||||
gBattleAnimArgs[4],
|
||||
gBattleAnimArgs[3]);
|
||||
gTasks[taskId].func = sub_80B9FD8;
|
||||
}
|
||||
|
||||
static void sub_80B9FD8(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
if (gTasks[taskId].data[0] > 0)
|
||||
{
|
||||
--gTasks[taskId].data[0];
|
||||
return;
|
||||
}
|
||||
if (gPaletteFade.active)
|
||||
return;
|
||||
if (gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
gTasks[taskId].func = sub_80BA090;
|
||||
return;
|
||||
}
|
||||
selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16);
|
||||
if (gTasks[taskId].data[1] & 0x100)
|
||||
BeginNormalPaletteFade(selectedPalettes,
|
||||
0,
|
||||
gTasks[taskId].data[4],
|
||||
gTasks[taskId].data[4],
|
||||
gTasks[taskId].data[3]);
|
||||
else
|
||||
BeginNormalPaletteFade(selectedPalettes,
|
||||
0,
|
||||
gTasks[taskId].data[6],
|
||||
gTasks[taskId].data[6],
|
||||
gTasks[taskId].data[5]);
|
||||
gTasks[taskId].data[1] ^= 0x100;
|
||||
gTasks[taskId].data[0] = gTasks[taskId].data[1] & 0xFF;
|
||||
--gTasks[taskId].data[2];
|
||||
}
|
||||
|
||||
static void sub_80BA090(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes;
|
||||
|
||||
if (!gPaletteFade.active)
|
||||
{
|
||||
selectedPalettes = 1 << (IndexOfSpritePaletteTag(gTasks[taskId].data[7]) + 16);
|
||||
BeginNormalPaletteFade(selectedPalettes, 0, 0, 0, RGB(0, 0, 0));
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BA0E8(u8 taskId)
|
||||
{
|
||||
u32 selectedPalettes = 0;
|
||||
u8 attackerBattler = gBattleAnimAttacker;
|
||||
u8 targetBattler = gBattleAnimTarget;
|
||||
|
||||
if (gBattleAnimArgs[0] & 0x100)
|
||||
selectedPalettes = sub_8075BE8(1, 0, 0, 0, 0, 0, 0);
|
||||
if (gBattleAnimArgs[1] & 0x100)
|
||||
selectedPalettes |= (0x10000 << attackerBattler);
|
||||
if (gBattleAnimArgs[2] & 0x100)
|
||||
selectedPalettes |= (0x10000 << targetBattler);
|
||||
InvertPlttBuffer(selectedPalettes);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
// not used
|
||||
static void sub_80BA16C(u8 taskId)
|
||||
{
|
||||
u8 attackerBattler;
|
||||
u8 targetBattler;
|
||||
u8 paletteIndex;
|
||||
u32 selectedPalettes = 0;
|
||||
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
gTasks[taskId].data[2] = gBattleAnimArgs[0];
|
||||
gTasks[taskId].data[3] = gBattleAnimArgs[1];
|
||||
gTasks[taskId].data[4] = gBattleAnimArgs[2];
|
||||
gTasks[taskId].data[1] = gBattleAnimArgs[3];
|
||||
gTasks[taskId].data[5] = gBattleAnimArgs[4];
|
||||
gTasks[taskId].data[6] = gBattleAnimArgs[5];
|
||||
gTasks[taskId].data[7] = gBattleAnimArgs[6];
|
||||
}
|
||||
++gTasks[taskId].data[0];
|
||||
attackerBattler = gBattleAnimAttacker;
|
||||
targetBattler = gBattleAnimTarget;
|
||||
if (gTasks[taskId].data[2] & 0x100)
|
||||
selectedPalettes = 0x0000FFFF;
|
||||
if (gTasks[taskId].data[2] & 0x1)
|
||||
{
|
||||
paletteIndex = IndexOfSpritePaletteTag(gSprites[gHealthboxSpriteIds[attackerBattler]].template->paletteTag);
|
||||
selectedPalettes |= (1 << paletteIndex) << 16;
|
||||
}
|
||||
if (gTasks[taskId].data[3] & 0x100)
|
||||
selectedPalettes |= (1 << attackerBattler) << 16;
|
||||
if (gTasks[taskId].data[4] & 0x100)
|
||||
selectedPalettes |= (1 << targetBattler) << 16;
|
||||
TintPlttBuffer(selectedPalettes, gTasks[taskId].data[5], gTasks[taskId].data[6], gTasks[taskId].data[7]);
|
||||
if (gTasks[taskId].data[0] == gTasks[taskId].data[1])
|
||||
{
|
||||
UnfadePlttBuffer(selectedPalettes);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BA27C(struct Sprite *sprite)
|
||||
{
|
||||
u16 var0;
|
||||
|
||||
sprite->invisible = TRUE;
|
||||
sprite->data[0] = -gBattleAnimArgs[0];
|
||||
sprite->data[1] = gBattleAnimArgs[1];
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
sprite->data[3] = gBattleAnimArgs[2];
|
||||
|
||||
switch (gBattleAnimArgs[3])
|
||||
{
|
||||
case 0:
|
||||
StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_X);
|
||||
break;
|
||||
case 1:
|
||||
StoreSpriteCallbackInData6(sprite, (void *)&gBattle_BG3_Y);
|
||||
break;
|
||||
case 2:
|
||||
StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetX);
|
||||
break;
|
||||
default:
|
||||
StoreSpriteCallbackInData6(sprite, (void *)&gSpriteCoordOffsetY);
|
||||
break;
|
||||
}
|
||||
sprite->data[4] = *(u16 *)(sprite->data[6] | (sprite->data[7] << 16));
|
||||
sprite->data[5] = gBattleAnimArgs[3];
|
||||
var0 = sprite->data[5] - 2;
|
||||
if (var0 < 2)
|
||||
sub_80BA3CC();
|
||||
sprite->callback = sub_80BA320;
|
||||
}
|
||||
|
||||
static void sub_80BA320(struct Sprite *sprite)
|
||||
{
|
||||
u8 i;
|
||||
u16 var0;
|
||||
|
||||
if (sprite->data[3] > 0)
|
||||
{
|
||||
--sprite->data[3];
|
||||
if (sprite->data[1] > 0)
|
||||
{
|
||||
--sprite->data[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[1] = sprite->data[2];
|
||||
*(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) += sprite->data[0];
|
||||
sprite->data[0] = -sprite->data[0];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
*(u16 *)(sprite->data[6] | (sprite->data[7] << 16)) = sprite->data[4];
|
||||
var0 = sprite->data[5] - 2;
|
||||
if (var0 < 2)
|
||||
for (i = 0; i < gBattlersCount; ++i)
|
||||
gSprites[gBattlerSpriteIds[i]].coordOffsetEnabled = 0;
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BA3CC(void)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 0;
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 0;
|
||||
if (gBattleAnimArgs[4] == 2)
|
||||
{
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 1;
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gBattleAnimArgs[4] == 0)
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].coordOffsetEnabled = 1;
|
||||
else
|
||||
gSprites[gBattlerSpriteIds[gBattleAnimTarget]].coordOffsetEnabled = 1;
|
||||
}
|
||||
}
|
||||
|
||||
void sub_80BA47C(u8 taskId)
|
||||
{
|
||||
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[8] = gBattleAnimArgs[3];
|
||||
gBattle_BG3_X = gBattleAnimArgs[0];
|
||||
gBattle_BG3_Y = gBattleAnimArgs[1];
|
||||
gTasks[taskId].func = sub_80BA4D0;
|
||||
gTasks[taskId].func(taskId);
|
||||
}
|
||||
|
||||
static void sub_80BA4D0(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[3] == 0)
|
||||
{
|
||||
if (gBattle_BG3_X == gTasks[taskId].data[0])
|
||||
gBattle_BG3_X = -gTasks[taskId].data[0];
|
||||
else
|
||||
gBattle_BG3_X = gTasks[taskId].data[0];
|
||||
|
||||
if (gBattle_BG3_Y == -gTasks[taskId].data[1])
|
||||
gBattle_BG3_Y = 0;
|
||||
else
|
||||
gBattle_BG3_Y = -gTasks[taskId].data[1];
|
||||
|
||||
gTasks[taskId].data[3] = gTasks[taskId].data[8];
|
||||
if (--gTasks[taskId].data[2] == 0)
|
||||
{
|
||||
gBattle_BG3_X = 0;
|
||||
gBattle_BG3_Y = 0;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
--gTasks[taskId].data[3];
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80BA560(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
static void sub_80BA5A8(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
StoreSpriteCallbackInData6(sprite, sub_80B1D3C);
|
||||
}
|
||||
|
||||
static void sub_80BA5F8(struct Sprite *sprite)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER && !IsContest())
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
sub_80BA560(sprite);
|
||||
}
|
||||
|
||||
static void sub_80BA630(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[1] == -1)
|
||||
gBattleAnimArgs[1] = Random() & 3;
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]);
|
||||
if (gBattleAnimArgs[0] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 0);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, FALSE);
|
||||
sprite->pos2.x += (Random() % 48) - 24;
|
||||
sprite->pos2.y += (Random() % 24) - 12;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
}
|
||||
|
||||
static void sub_80BA6C8(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[0] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]);
|
||||
sprite->pos1.x = gSprites[sprite->data[0]].pos1.x + gSprites[sprite->data[0]].pos2.x;
|
||||
sprite->pos1.y = gSprites[sprite->data[0]].pos1.y + gSprites[sprite->data[0]].pos2.y;
|
||||
sprite->pos2.x = gBattleAnimArgs[1];
|
||||
sprite->pos2.y = gBattleAnimArgs[2];
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
|
||||
}
|
||||
|
||||
static void sub_80BA738(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
sprite->data[0] = gBattleAnimArgs[3];
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
sprite->callback = WaitAnimForDuration;
|
||||
}
|
||||
|
||||
static void sub_80BA780(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]);
|
||||
if (gBattleAnimArgs[2] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 1);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, TRUE);
|
||||
sprite->callback = sub_80BA7BC;
|
||||
}
|
||||
|
||||
static void sub_80BA7BC(struct Sprite *sprite)
|
||||
{
|
||||
sprite->invisible ^= 1;
|
||||
if (sprite->data[0]++ > 12)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
@@ -13,7 +13,6 @@
|
||||
#include "event_data.h"
|
||||
#include "util.h"
|
||||
#include "pokemon_storage_system.h"
|
||||
#include "data.h"
|
||||
#include "battle_gfx_sfx_util.h"
|
||||
#include "battle_controllers.h"
|
||||
#include "evolution_scene.h"
|
||||
|
||||
+1083
File diff suppressed because it is too large
Load Diff
+830
@@ -0,0 +1,830 @@
|
||||
#include "global.h"
|
||||
#include "battle_anim.h"
|
||||
#include "gpu_regs.h"
|
||||
#include "graphics.h"
|
||||
#include "palette.h"
|
||||
#include "sound.h"
|
||||
#include "task.h"
|
||||
#include "trig.h"
|
||||
#include "constants/songs.h"
|
||||
|
||||
static void sub_80B4634(struct Sprite *sprite);
|
||||
static void sub_80B46F8(struct Sprite *sprite);
|
||||
static void AnimDirtParticleAcrossScreen(struct Sprite *sprite);
|
||||
static void AnimRaiseSprite(struct Sprite *sprite);
|
||||
static void sub_80B4D00(u8 taskId);
|
||||
static void sub_80B4F78(struct Sprite *sprite);
|
||||
static void sub_80B4FE4(struct Sprite *sprite);
|
||||
static void sub_80B5074(struct Sprite *sprite);
|
||||
static void sub_80B50A0(struct Sprite *sprite);
|
||||
static void sub_80B477C(struct Sprite *sprite);
|
||||
static void sub_80B46B4(struct Sprite *sprite);
|
||||
static void sub_80B47C4(struct Sprite *sprite);
|
||||
static void sub_80B490C(u8 taskId);
|
||||
static void sub_80B4E70(struct Task *task);
|
||||
static u8 sub_80B4FB8(void);
|
||||
static void sub_80B5024(struct Sprite *sprite);
|
||||
static void sub_80B50F8(struct Sprite *sprite);
|
||||
|
||||
static const union AnimCmd gUnknown_83E7390[] =
|
||||
{
|
||||
ANIMCMD_FRAME(32, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7398[] =
|
||||
{
|
||||
ANIMCMD_FRAME(48, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E73A0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(64, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E73A8[] =
|
||||
{
|
||||
gUnknown_83E7390,
|
||||
gUnknown_83E7398,
|
||||
gUnknown_83E73A0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E73B4 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E73A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B4634,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E73CC =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E73A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B46F8,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E73E4 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B477C,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E73FC[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0xC0, 0xC0, 0, 0),
|
||||
AFFINEANIMCMD_FRAME(0x2, 0xFFFD, 0, 5),
|
||||
AFFINEANIMCMD_FRAME(0xFFFE, 0x3, 0, 5),
|
||||
AFFINEANIMCMD_JUMP(1),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E741C[] =
|
||||
{
|
||||
gUnknown_83E73FC,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7420 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_WATER_ORB,
|
||||
.paletteTag = ANIM_TAG_WATER_ORB,
|
||||
.oam = &gOamData_83ACB50,
|
||||
.anims = gUnknown_83E5958,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E741C,
|
||||
.callback = sub_80B477C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7438 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_SMALL_EMBER,
|
||||
.paletteTag = ANIM_TAG_SMALL_EMBER,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E5D48,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B477C,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7450 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_FLYING_DIRT,
|
||||
.paletteTag = ANIM_TAG_FLYING_DIRT,
|
||||
.oam = &gOamData_83AC9F8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimDirtParticleAcrossScreen,
|
||||
};
|
||||
|
||||
static const struct Subsprite gUnknown_83E7468[] =
|
||||
{
|
||||
{
|
||||
.x = -16,
|
||||
.y = 0,
|
||||
.shape = ST_OAM_H_RECTANGLE,
|
||||
.size = 2,
|
||||
.tileOffset = 0,
|
||||
.priority = 1,
|
||||
},
|
||||
{
|
||||
.x = 16,
|
||||
.y = 0,
|
||||
.shape = ST_OAM_H_RECTANGLE,
|
||||
.size = 2,
|
||||
.tileOffset = 8,
|
||||
.priority = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct SubspriteTable gUnknown_83E7470[] =
|
||||
{
|
||||
{ ARRAY_COUNT(gUnknown_83E7468), gUnknown_83E7468 },
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7478[] =
|
||||
{
|
||||
ANIMCMD_FRAME(0, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7480[] =
|
||||
{
|
||||
ANIMCMD_FRAME(16, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7488[] =
|
||||
{
|
||||
ANIMCMD_FRAME(32, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7490[] =
|
||||
{
|
||||
ANIMCMD_FRAME(48, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E7498[] =
|
||||
{
|
||||
ANIMCMD_FRAME(64, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd gUnknown_83E74A0[] =
|
||||
{
|
||||
ANIMCMD_FRAME(80, 1),
|
||||
ANIMCMD_END,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E74A8[] =
|
||||
{
|
||||
gUnknown_83E7478,
|
||||
gUnknown_83E7480,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E74B0[] =
|
||||
{
|
||||
gUnknown_83E7488,
|
||||
gUnknown_83E7490,
|
||||
};
|
||||
|
||||
static const union AnimCmd *const gUnknown_83E74B8[] =
|
||||
{
|
||||
gUnknown_83E7498,
|
||||
gUnknown_83E74A0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E74C0 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E74A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = AnimRaiseSprite,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E74D8 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_MUD_SAND,
|
||||
.paletteTag = ANIM_TAG_MUD_SAND,
|
||||
.oam = &gOamData_83AC9C8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B4F78,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E74F0 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gDummySpriteAnimTable,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B4F78,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7508 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E74A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gDummySpriteAffineAnimTable,
|
||||
.callback = sub_80B4FE4,
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7520[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, -5, 5),
|
||||
AFFINEANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd gUnknown_83E7530[] =
|
||||
{
|
||||
AFFINEANIMCMD_FRAME(0x0, 0x0, 5, 5),
|
||||
AFFINEANIMCMD_JUMP(0),
|
||||
};
|
||||
|
||||
static const union AffineAnimCmd *const gUnknown_83E7540[] =
|
||||
{
|
||||
gUnknown_83E7520,
|
||||
gUnknown_83E7530,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7548 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gUnknown_83E74A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7540,
|
||||
.callback = sub_80B5074,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7560 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gUnknown_83E74A8,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7540,
|
||||
.callback = sub_80B50A0,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7578 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83AC9D8,
|
||||
.anims = gUnknown_83E74B8,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7540,
|
||||
.callback = AnimMoveTwisterParticle,
|
||||
};
|
||||
|
||||
const struct SpriteTemplate gUnknown_83E7590 =
|
||||
{
|
||||
.tileTag = ANIM_TAG_ROCKS,
|
||||
.paletteTag = ANIM_TAG_ROCKS,
|
||||
.oam = &gOamData_83ACA38,
|
||||
.anims = gUnknown_83E74B0,
|
||||
.images = NULL,
|
||||
.affineAnims = gUnknown_83E7540,
|
||||
.callback = sub_8077350,
|
||||
};
|
||||
|
||||
static void sub_80B4634(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[3] != 0)
|
||||
SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->pos1.x, &sprite->pos1.y);
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += 14;
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[1]);
|
||||
AnimateSprite(sprite);
|
||||
sprite->data[0] = 0;
|
||||
sprite->data[1] = 0;
|
||||
sprite->data[2] = 4;
|
||||
sprite->data[3] = 16;
|
||||
sprite->data[4] = -70;
|
||||
sprite->data[5] = gBattleAnimArgs[2];
|
||||
StoreSpriteCallbackInData6(sprite, sub_80B46B4);
|
||||
sprite->callback = TranslateSpriteInEllipseOverDuration;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B46B4(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x += sprite->data[5];
|
||||
sprite->data[0] = 192;
|
||||
sprite->data[1] = sprite->data[5];
|
||||
sprite->data[2] = 4;
|
||||
sprite->data[3] = 32;
|
||||
sprite->data[4] = -24;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
sprite->callback = TranslateSpriteInEllipseOverDuration;
|
||||
sprite->callback(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B46F8(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[5]);
|
||||
AnimateSprite(sprite);
|
||||
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
sprite->pos1.x -= gBattleAnimArgs[0];
|
||||
else
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[0] = gBattleAnimArgs[4];
|
||||
sprite->data[1] = sprite->pos1.x;
|
||||
sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2];
|
||||
sprite->data[3] = sprite->pos1.y;
|
||||
sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3];
|
||||
InitSpriteDataForLinearTranslation(sprite);
|
||||
sprite->data[3] = 0;
|
||||
sprite->data[4] = 0;
|
||||
sprite->callback = TranslateSpriteLinearFixedPoint;
|
||||
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
|
||||
}
|
||||
|
||||
static void sub_80B477C(struct Sprite *sprite)
|
||||
{
|
||||
if (gBattleAnimArgs[6] == 0)
|
||||
InitSpritePosToAnimAttacker(sprite, 0);
|
||||
else
|
||||
InitSpritePosToAnimTarget(sprite, FALSE);
|
||||
sprite->data[0] = gBattleAnimArgs[3];
|
||||
sprite->data[1] = gBattleAnimArgs[2];
|
||||
sprite->data[2] = gBattleAnimArgs[4];
|
||||
sprite->data[3] = gBattleAnimArgs[5];
|
||||
sprite->callback = sub_80B47C4;
|
||||
}
|
||||
|
||||
static void sub_80B47C4(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[4] += sprite->data[1];
|
||||
sprite->pos2.y = -(sprite->data[4] >> 8);
|
||||
sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]);
|
||||
sprite->data[5] = (sprite->data[5] + sprite->data[2]) & 0xFF;
|
||||
if (--sprite->data[0] == -1)
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
void AnimTask_LoadSandstormBackground(u8 taskId)
|
||||
{
|
||||
s32 var0;
|
||||
struct BattleAnimBgData animBg;
|
||||
|
||||
var0 = 0;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG1 | BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16));
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
|
||||
SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0);
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1);
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
SetGpuReg(REG_OFFSET_BG1HOFS, gBattle_BG1_X);
|
||||
SetGpuReg(REG_OFFSET_BG1VOFS, gBattle_BG1_Y);
|
||||
sub_80752A0(&animBg);
|
||||
AnimLoadCompressedBgTilemap(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_tilemap);
|
||||
AnimLoadCompressedBgGfx(animBg.bgId, gFile_graphics_battle_anims_backgrounds_sandstorm_brew_sheet, animBg.tilesOffset);
|
||||
LoadCompressedPalette(gBattleAnimSpritePal_FlyingDirt, animBg.paletteId * 16, 32);
|
||||
if (IsContest())
|
||||
sub_80730C0(animBg.paletteId, animBg.bgTilemap, 0, 0);
|
||||
if (gBattleAnimArgs[0] && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
var0 = 1;
|
||||
gTasks[taskId].data[0] = var0;
|
||||
gTasks[taskId].func = sub_80B490C;
|
||||
}
|
||||
|
||||
static void sub_80B490C(u8 taskId)
|
||||
{
|
||||
struct BattleAnimBgData animBg;
|
||||
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
gBattle_BG1_X += -6;
|
||||
else
|
||||
gBattle_BG1_X += 6;
|
||||
gBattle_BG1_Y += -1;
|
||||
switch (gTasks[taskId].data[12])
|
||||
{
|
||||
case 0:
|
||||
if (++gTasks[taskId].data[10] == 4)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
++gTasks[taskId].data[11];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
|
||||
if (gTasks[taskId].data[11] == 7)
|
||||
{
|
||||
++gTasks[taskId].data[12];
|
||||
gTasks[taskId].data[11] = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++gTasks[taskId].data[11] == 101)
|
||||
{
|
||||
gTasks[taskId].data[11] = 7;
|
||||
++gTasks[taskId].data[12];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (++gTasks[taskId].data[10] == 4)
|
||||
{
|
||||
gTasks[taskId].data[10] = 0;
|
||||
--gTasks[taskId].data[11];
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
|
||||
if (gTasks[taskId].data[11] == 0)
|
||||
{
|
||||
++gTasks[taskId].data[12];
|
||||
gTasks[taskId].data[11] = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
sub_80752A0(&animBg);
|
||||
sub_8075358(animBg.bgId);
|
||||
++gTasks[taskId].data[12];
|
||||
break;
|
||||
case 4:
|
||||
if (!IsContest())
|
||||
SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0);
|
||||
gBattle_BG1_X = 0;
|
||||
gBattle_BG1_Y = 0;
|
||||
SetGpuReg(REG_OFFSET_BLDCNT, 0);
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
|
||||
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Animates the sprites that fly diagonally across the screen
|
||||
// in Sandstorm and Heat Wave.
|
||||
// arg 0: initial y pixel offset
|
||||
// arg 1: projectile speed
|
||||
// arg 2: y pixel drop
|
||||
// arg 3: ??? unknown (possibly a color bit)
|
||||
static void AnimDirtParticleAcrossScreen(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] == 0)
|
||||
{
|
||||
if (gBattleAnimArgs[3] != 0 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
sprite->pos1.x = 304;
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
sprite->data[5] = 1;
|
||||
sprite->oam.matrixNum = ST_OAM_HFLIP;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->pos1.x = -64;
|
||||
}
|
||||
sprite->pos1.y = gBattleAnimArgs[0];
|
||||
SetSubspriteTables(sprite, gUnknown_83E7470);
|
||||
sprite->data[1] = gBattleAnimArgs[1];
|
||||
sprite->data[2] = gBattleAnimArgs[2];
|
||||
++sprite->data[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->pos2.x += (sprite->data[3] >> 8);
|
||||
sprite->pos2.y += (sprite->data[4] >> 8);
|
||||
sprite->data[3] &= 0xFF;
|
||||
sprite->data[4] &= 0xFF;
|
||||
if (sprite->data[5] == 0)
|
||||
{
|
||||
if (sprite->pos1.x + sprite->pos2.x > 272)
|
||||
{
|
||||
sprite->callback = DestroyAnimSprite;
|
||||
}
|
||||
}
|
||||
else if (sprite->pos1.x + sprite->pos2.x < -32)
|
||||
{
|
||||
sprite->callback = DestroyAnimSprite;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Animates the rising rocks in Ancient Power.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
// arg 2: terminal y offset
|
||||
// arg 3: duration
|
||||
// arg 4: sprite size [1,5]
|
||||
static void AnimRaiseSprite(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[4]);
|
||||
InitSpritePosToAnimAttacker(sprite, 0);
|
||||
sprite->data[0] = gBattleAnimArgs[3];
|
||||
sprite->data[2] = sprite->pos1.x;
|
||||
sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2];
|
||||
sprite->callback = StartAnimLinearTranslation;
|
||||
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
|
||||
}
|
||||
|
||||
void sub_80B4BD0(u8 taskId)
|
||||
{
|
||||
u16 var0, var1, var2, var3;
|
||||
u8 var4;
|
||||
s32 var5;
|
||||
s16 pan1, pan2;
|
||||
struct Task *task;
|
||||
|
||||
task = &gTasks[taskId];
|
||||
var0 = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
|
||||
var1 = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 24;
|
||||
var2 = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
|
||||
var3 = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + 24;
|
||||
if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)
|
||||
var3 = var1;
|
||||
var4 = sub_80B4FB8();
|
||||
if (var4 == 1)
|
||||
task->data[8] = 32;
|
||||
else
|
||||
task->data[8] = 48 - (var4 * 8);
|
||||
task->data[0] = 0;
|
||||
task->data[11] = 0;
|
||||
task->data[9] = 0;
|
||||
task->data[12] = 1;
|
||||
var5 = task->data[8];
|
||||
if (var5 < 0)
|
||||
var5 += 7;
|
||||
task->data[10] = (var5 >> 3) - 1;
|
||||
task->data[2] = var0 * 8;
|
||||
task->data[3] = var1 * 8;
|
||||
task->data[4] = ((var2 - var0) * 8) / task->data[8];
|
||||
task->data[5] = ((var3 - var1) * 8) / task->data[8];
|
||||
task->data[6] = 0;
|
||||
task->data[7] = 0;
|
||||
pan1 = BattleAnimAdjustPanning(PAN_SIDE_PLAYER);
|
||||
pan2 = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT);
|
||||
task->data[13] = pan1;
|
||||
task->data[14] = (pan2 - pan1) / task->data[8];
|
||||
task->data[1] = var4;
|
||||
task->data[15] = GetAnimBattlerSpriteId(0);
|
||||
task->func = sub_80B4D00;
|
||||
}
|
||||
|
||||
static void sub_80B4D00(u8 taskId)
|
||||
{
|
||||
struct Task *task;
|
||||
|
||||
task = &gTasks[taskId];
|
||||
switch (task->data[0])
|
||||
{
|
||||
case 0:
|
||||
task->data[6] -= task->data[4];
|
||||
task->data[7] -= task->data[5];
|
||||
gSprites[task->data[15]].pos2.x = task->data[6] >> 3;
|
||||
gSprites[task->data[15]].pos2.y = task->data[7] >> 3;
|
||||
if (++task->data[9] == 10)
|
||||
{
|
||||
task->data[11] = 20;
|
||||
++task->data[0];
|
||||
}
|
||||
PlaySE12WithPanning(SE_W029, task->data[13]);
|
||||
break;
|
||||
case 1:
|
||||
if (--task->data[11] == 0)
|
||||
++task->data[0];
|
||||
break;
|
||||
case 2:
|
||||
if (--task->data[9] != 0)
|
||||
{
|
||||
task->data[6] += task->data[4];
|
||||
task->data[7] += task->data[5];
|
||||
}
|
||||
else
|
||||
{
|
||||
task->data[6] = 0;
|
||||
task->data[7] = 0;
|
||||
++task->data[0];
|
||||
}
|
||||
gSprites[task->data[15]].pos2.x = task->data[6] >> 3;
|
||||
gSprites[task->data[15]].pos2.y = task->data[7] >> 3;
|
||||
break;
|
||||
case 3:
|
||||
task->data[2] += task->data[4];
|
||||
task->data[3] += task->data[5];
|
||||
if (++task->data[9] >= task->data[10])
|
||||
{
|
||||
task->data[9] = 0;
|
||||
sub_80B4E70(task);
|
||||
task->data[13] += task->data[14];
|
||||
PlaySE12WithPanning(SE_W091, task->data[13]);
|
||||
}
|
||||
if (--task->data[8] == 0)
|
||||
{
|
||||
++task->data[0];
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
if (task->data[11] == 0)
|
||||
DestroyAnimVisualTask(taskId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B4E70(struct Task *task)
|
||||
{
|
||||
const struct SpriteTemplate *spriteTemplate;
|
||||
s32 var0;
|
||||
u16 x, y;
|
||||
u8 spriteId;
|
||||
|
||||
switch (task->data[1])
|
||||
{
|
||||
case 1:
|
||||
spriteTemplate = &gUnknown_83E74D8;
|
||||
var0 = 0;
|
||||
break;
|
||||
case 2:
|
||||
case 3:
|
||||
spriteTemplate = &gUnknown_83E74F0;
|
||||
var0 = 80;
|
||||
break;
|
||||
case 4:
|
||||
spriteTemplate = &gUnknown_83E74F0;
|
||||
var0 = 64;
|
||||
break;
|
||||
case 5:
|
||||
spriteTemplate = &gUnknown_83E74F0;
|
||||
var0 = 48;
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
x = task->data[2] >> 3;
|
||||
y = task->data[3] >> 3;
|
||||
x += (task->data[12] * 4);
|
||||
spriteId = CreateSprite(spriteTemplate, x, y, 35);
|
||||
if (spriteId != MAX_SPRITES)
|
||||
{
|
||||
gSprites[spriteId].data[0] = 18;
|
||||
gSprites[spriteId].data[2] = ((task->data[12] * 20) + x) + (task->data[1] * 3);
|
||||
gSprites[spriteId].data[4] = y;
|
||||
gSprites[spriteId].data[5] = -16 - (task->data[1] * 2);
|
||||
gSprites[spriteId].oam.tileNum += var0;
|
||||
InitAnimArcTranslation(&gSprites[spriteId]);
|
||||
++task->data[11];
|
||||
}
|
||||
task->data[12] *= -1;
|
||||
}
|
||||
|
||||
static void sub_80B4F78(struct Sprite *sprite)
|
||||
{
|
||||
if (TranslateAnimHorizontalArc(sprite))
|
||||
{
|
||||
u8 taskId = FindTaskIdByFunc(sub_80B4D00);
|
||||
|
||||
if (taskId != TASK_NONE)
|
||||
--gTasks[taskId].data[11];
|
||||
DestroySprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static u8 sub_80B4FB8(void)
|
||||
{
|
||||
u8 retVal = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer;
|
||||
u8 var0 = retVal - 1;
|
||||
|
||||
if (var0 > 4)
|
||||
retVal = 1;
|
||||
return retVal;
|
||||
}
|
||||
|
||||
static void sub_80B4FE4(struct Sprite *sprite)
|
||||
{
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[4]);
|
||||
sprite->pos2.x = gBattleAnimArgs[0];
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
sprite->data[3] -= gBattleAnimArgs[2];
|
||||
sprite->data[0] = 3;
|
||||
sprite->data[1] = gBattleAnimArgs[3];
|
||||
sprite->callback = sub_80B5024;
|
||||
sprite->invisible = TRUE;
|
||||
}
|
||||
|
||||
static void sub_80B5024(struct Sprite *sprite)
|
||||
{
|
||||
sprite->invisible = FALSE;
|
||||
if (sprite->data[3] != 0)
|
||||
{
|
||||
sprite->pos2.y = sprite->data[2] + sprite->data[3];
|
||||
sprite->data[3] += sprite->data[0];
|
||||
++sprite->data[0];
|
||||
if (sprite->data[3] > 0)
|
||||
{
|
||||
sprite->data[3] = 0;
|
||||
}
|
||||
}
|
||||
else if (--sprite->data[1] == 0)
|
||||
{
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
}
|
||||
|
||||
static void sub_80B5074(struct Sprite *sprite)
|
||||
{
|
||||
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
|
||||
StartSpriteAffineAnim(sprite, 1);
|
||||
TranslateAnimSpriteToTargetMonLocation(sprite);
|
||||
}
|
||||
|
||||
static void sub_80B50A0(struct Sprite *sprite)
|
||||
{
|
||||
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
|
||||
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
|
||||
sprite->pos1.x += gBattleAnimArgs[0];
|
||||
sprite->pos1.y += gBattleAnimArgs[1];
|
||||
sprite->data[1] = gBattleAnimArgs[0];
|
||||
sprite->data[2] = gBattleAnimArgs[1];
|
||||
sprite->data[5] = gBattleAnimArgs[2];
|
||||
StartSpriteAnim(sprite, gBattleAnimArgs[3]);
|
||||
sprite->callback = sub_80B50F8;
|
||||
}
|
||||
|
||||
static void sub_80B50F8(struct Sprite *sprite)
|
||||
{
|
||||
sprite->data[0] += 8;
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->pos2.x += sprite->data[3] / 40;
|
||||
sprite->pos2.y -= Sin(sprite->data[0], sprite->data[5]);
|
||||
if (sprite->data[0] > 140)
|
||||
DestroyAnimSprite(sprite);
|
||||
}
|
||||
|
||||
void AnimTask_GetSeismicTossDamageLevel(u8 taskId)
|
||||
{
|
||||
if (gAnimMoveDmg < 33)
|
||||
gBattleAnimArgs[7] = 0;
|
||||
if ((u32)gAnimMoveDmg - 33 < 33)
|
||||
gBattleAnimArgs[7] = 1;
|
||||
if (gAnimMoveDmg > 65)
|
||||
gBattleAnimArgs[7] = 2;
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
|
||||
void sub_80B5188(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
sub_8075458(0);
|
||||
gTasks[taskId].data[1] = 200;
|
||||
}
|
||||
gBattle_BG3_Y += gTasks[taskId].data[1] / 10;
|
||||
gTasks[taskId].data[1] -= 3;
|
||||
if (gTasks[taskId].data[0] == 120)
|
||||
{
|
||||
sub_8075458(1);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
++gTasks[taskId].data[0];
|
||||
}
|
||||
|
||||
void sub_80B51EC(u8 taskId)
|
||||
{
|
||||
if (gTasks[taskId].data[0] == 0)
|
||||
{
|
||||
sub_8075458(0);
|
||||
++gTasks[taskId].data[0];
|
||||
gTasks[taskId].data[2] = gBattle_BG3_Y;
|
||||
}
|
||||
gTasks[taskId].data[1] += 80;
|
||||
gTasks[taskId].data[1] &= 0xFF;
|
||||
gBattle_BG3_Y = gTasks[taskId].data[2] + Cos(4, gTasks[taskId].data[1]);
|
||||
if (gBattleAnimArgs[7] == 0xFFF)
|
||||
{
|
||||
gBattle_BG3_Y = 0;
|
||||
sub_8075458(1);
|
||||
DestroyAnimVisualTask(taskId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user