Identified task and sprite fields related to battle weather animations
Named task and sprite fields related to the animations for Hail, Rain Dance, and Sandstorm.
This commit is contained in:
+61
-34
@@ -388,6 +388,11 @@ static void AnimParticleInVortex_Step(struct Sprite *sprite)
|
||||
}
|
||||
}
|
||||
|
||||
#define tBlendTimer data[10]
|
||||
#define tBlend data[11]
|
||||
#define tFullAlphaTimer data[11] // not a typo; this data field is used for multiple purposes
|
||||
#define tState data[12]
|
||||
|
||||
void AnimTask_LoadSandstormBackground(u8 taskId)
|
||||
{
|
||||
int var0;
|
||||
@@ -430,45 +435,45 @@ static void AnimTask_LoadSandstormBackground_Step(u8 taskId)
|
||||
|
||||
gBattle_BG1_Y += -1;
|
||||
|
||||
switch (gTasks[taskId].data[12])
|
||||
switch (gTasks[taskId].tState)
|
||||
{
|
||||
case 0:
|
||||
if (++gTasks[taskId].data[10] == 4)
|
||||
if (++gTasks[taskId].tBlendTimer == 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].tBlendTimer = 0;
|
||||
gTasks[taskId].tBlend++;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlend, 16 - gTasks[taskId].tBlend));
|
||||
if (gTasks[taskId].tBlend == 7)
|
||||
{
|
||||
gTasks[taskId].data[12]++;
|
||||
gTasks[taskId].data[11] = 0;
|
||||
gTasks[taskId].tState++;
|
||||
gTasks[taskId].tFullAlphaTimer = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (++gTasks[taskId].data[11] == 101)
|
||||
if (++gTasks[taskId].tFullAlphaTimer == 101)
|
||||
{
|
||||
gTasks[taskId].data[11] = 7;
|
||||
gTasks[taskId].data[12]++;
|
||||
gTasks[taskId].tBlend = 7;
|
||||
gTasks[taskId].tState++;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (++gTasks[taskId].data[10] == 4)
|
||||
if (++gTasks[taskId].tBlendTimer == 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].tBlendTimer = 0;
|
||||
gTasks[taskId].tBlend--;
|
||||
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlend, 16 - gTasks[taskId].tBlend));
|
||||
if (gTasks[taskId].tBlend == 0)
|
||||
{
|
||||
gTasks[taskId].data[12]++;
|
||||
gTasks[taskId].data[11] = 0;
|
||||
gTasks[taskId].tState++;
|
||||
gTasks[taskId].tFullAlphaTimer = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
GetBattleAnimBg1Data(&animBg);
|
||||
ClearBattleAnimBg(animBg.bgId);
|
||||
gTasks[taskId].data[12]++;
|
||||
gTasks[taskId].tState++;
|
||||
break;
|
||||
case 4:
|
||||
if (!IsContest())
|
||||
@@ -484,21 +489,36 @@ static void AnimTask_LoadSandstormBackground_Step(u8 taskId)
|
||||
}
|
||||
}
|
||||
|
||||
#undef tBlendTimer
|
||||
#undef tBlend
|
||||
#undef tFullAlphaTimer
|
||||
#undef tState
|
||||
|
||||
// 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)
|
||||
|
||||
#define sState data[0]
|
||||
#define sVelocityX data[1] // 256ths of a pixel // init'd from gBattleAnimArgs[1]
|
||||
#define sVelocityY data[2] // 256ths of a pixel // init'd from gBattleAnimArgs[2]
|
||||
#define sFractionalX data[3] // 256ths of a pixel
|
||||
#define sFractionalY data[4] // 256ths of a pixel
|
||||
#define sMirroredX data[5] // init'd from gBattleAnimArgs[3]
|
||||
|
||||
// The fields named "velocity" are arguably more like "acceleration,"
|
||||
// and the fields named "fractional" are arguably more like "velocity."
|
||||
//
|
||||
// ...is what I WOULD say if the "fractional" fields weren't AND'd with
|
||||
// 0xFF after every frame.
|
||||
|
||||
static void AnimFlyingSandCrescent(struct Sprite *sprite)
|
||||
{
|
||||
if (sprite->data[0] == 0)
|
||||
if (sprite->sState == 0)
|
||||
{
|
||||
if (gBattleAnimArgs[3] != 0 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
|
||||
{
|
||||
sprite->x = DISPLAY_WIDTH + 64;
|
||||
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
|
||||
sprite->data[5] = 1;
|
||||
sprite->sMirroredX = 1;
|
||||
sprite->oam.matrixNum = ST_OAM_HFLIP;
|
||||
}
|
||||
else
|
||||
@@ -508,18 +528,18 @@ static void AnimFlyingSandCrescent(struct Sprite *sprite)
|
||||
|
||||
sprite->y = gBattleAnimArgs[0];
|
||||
SetSubspriteTables(sprite, sFlyingSandSubspriteTable);
|
||||
sprite->data[1] = gBattleAnimArgs[1];
|
||||
sprite->data[2] = gBattleAnimArgs[2];
|
||||
sprite->data[0]++;
|
||||
sprite->sVelocityX = gBattleAnimArgs[1];
|
||||
sprite->sVelocityY = gBattleAnimArgs[2];
|
||||
sprite->sState++;
|
||||
}
|
||||
else
|
||||
{
|
||||
sprite->data[3] += sprite->data[1];
|
||||
sprite->data[4] += sprite->data[2];
|
||||
sprite->x2 += (sprite->data[3] >> 8);
|
||||
sprite->y2 += (sprite->data[4] >> 8);
|
||||
sprite->data[3] &= 0xFF;
|
||||
sprite->data[4] &= 0xFF;
|
||||
sprite->sFractionalX += sprite->sVelocityX;
|
||||
sprite->sFractionalY += sprite->sVelocityY;
|
||||
sprite->x2 += (sprite->sFractionalX >> 8);
|
||||
sprite->y2 += (sprite->sFractionalY >> 8);
|
||||
sprite->sFractionalX &= 0xFF;
|
||||
sprite->sFractionalY &= 0xFF;
|
||||
|
||||
if (sprite->data[5] == 0)
|
||||
{
|
||||
@@ -535,6 +555,13 @@ static void AnimFlyingSandCrescent(struct Sprite *sprite)
|
||||
}
|
||||
}
|
||||
|
||||
#undef sState
|
||||
#undef sVelocityX
|
||||
#undef sVelocityY
|
||||
#undef sFractionalX
|
||||
#undef sFractionalY
|
||||
#undef sMirroredX
|
||||
|
||||
// Animates the rising rocks in Ancient Power.
|
||||
// arg 0: initial x pixel offset
|
||||
// arg 1: initial y pixel offset
|
||||
|
||||
Reference in New Issue
Block a user