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:
DavidJCobb
2025-04-28 05:39:52 -04:00
parent 66c07f9c33
commit 35b33a46e9
3 changed files with 172 additions and 89 deletions
+61 -34
View File
@@ -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