expansion sync: battle_anim_ice

This commit is contained in:
cawtds 2025-01-19 23:32:16 +01:00
parent 4b8004d77c
commit 04e482faca
2 changed files with 209 additions and 118 deletions

View File

@ -1,43 +1,48 @@
#include "global.h"
#include "gflib.h"
#include "battle_anim.h"
#include "bg.h"
#include "field_weather.h"
#include "gpu_regs.h"
#include "graphics.h"
#include "main.h"
#include "palette.h"
#include "random.h"
#include "sprite.h"
#include "task.h"
#include "trig.h"
#include "constants/battle_anim.h"
#include "constants/rgb.h"
struct HailStruct
{
struct HailStruct {
s32 x:10;
s32 y:10;
s32 bPosition:8;
s32 unk3:4;
};
static void AnimUnusedIceCrystalThrow(struct Sprite *sprite);
static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite);
static void AnimIcePunchSwirlingParticle(struct Sprite *sprite);
static void AnimIceBeamParticle(struct Sprite *sprite);
static void AnimFlickerIceEffectParticle(struct Sprite *sprite);
static void AnimSwirlingSnowball(struct Sprite *sprite);
static void AnimSwirlingSnowball_Step2(struct Sprite *sprite);
static void AnimSwirlingSnowball_End(struct Sprite *sprite);
static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite);
static void AnimWaveFromCenterOfTarget(struct Sprite *sprite);
static void InitSwirlingFogAnim(struct Sprite *sprite);
static void AnimSwirlingFogAnim(struct Sprite *sprite);
static void InitPoisonGasCloudAnim(struct Sprite *sprite);
static void MovePoisonGasCloud(struct Sprite *sprite);
static void AnimHailBegin(struct Sprite *sprite);
static void AnimHailContinue(struct Sprite *sprite);
static void InitIceBallAnim(struct Sprite *sprite);
static void AnimThrowIceBall(struct Sprite *sprite);
static void InitIceBallParticle(struct Sprite *sprite);
static void AnimIceBallParticle(struct Sprite *sprite);
static void AnimTask_HazeScrollingFog_Step(u8 taskId);
static void AnimTask_MistBallFog_Step(u8 taskId);
static void AnimTask_Hail2(u8 taskId);
static void AnimUnusedIceCrystalThrow(struct Sprite *);
static void AnimUnusedIceCrystalThrow_Step(struct Sprite *);
static void AnimIcePunchSwirlingParticle(struct Sprite *);
static void AnimIceBeamParticle(struct Sprite *);
static void AnimFlickerIceEffectParticle(struct Sprite *);
static void AnimSwirlingSnowball(struct Sprite *);
static void AnimSwirlingSnowball_Step2(struct Sprite *);
static void AnimSwirlingSnowball_End(struct Sprite *);
static void AnimWiggleParticleTowardsTarget(struct Sprite *);
static void AnimWaveFromCenterOfTarget(struct Sprite *);
static void InitSwirlingFogAnim(struct Sprite *);
static void AnimSwirlingFogAnim(struct Sprite *);
static void InitPoisonGasCloudAnim(struct Sprite *);
static void MovePoisonGasCloud(struct Sprite *);
static void AnimHailBegin(struct Sprite *);
static void AnimHailContinue(struct Sprite *);
static void InitIceBallAnim(struct Sprite *);
static void AnimThrowIceBall(struct Sprite *);
static void InitIceBallParticle(struct Sprite *);
static void AnimIceBallParticle(struct Sprite *);
static void AnimTask_HazeScrollingFog_Step(u8);
static void AnimTask_MistBallFog_Step(u8);
static void AnimTask_Hail2(u8);
static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, u8 c);
static void AvalancheAnim_Step(struct Sprite *sprite);
static void AvalancheAnim_Step2(struct Sprite *sprite);
@ -56,6 +61,7 @@ static const union AnimCmd *const sAnims_Unused[] =
sAnim_Unused,
};
// Unused
static const struct SpriteTemplate sUnusedIceCrystalThrowSpriteTemplate =
{
.tileTag = ANIM_TAG_ICE_CRYSTALS,
@ -424,7 +430,7 @@ static const union AffineAnimCmd *const sAffineAnims_WeatherBallIceDown[] =
sAffineAnim_WeatherBallIceDown,
};
static const struct SpriteTemplate sHailParticleSpriteTemplate =
const struct SpriteTemplate gHailParticleSpriteTemplate =
{
.tileTag = ANIM_TAG_HAIL,
.paletteTag = ANIM_TAG_HAIL,
@ -629,15 +635,17 @@ static void AnimUnusedIceCrystalThrow(struct Sprite *sprite)
sprite->data[3] = gBattleAnimArgs[1] + attackerY;
sprite->data[4] = gBattleAnimArgs[3] + targetY;
ConvertPosDataToTranslateLinearData(sprite);
// won't match with while loop
for (; (targetX >= -32 && targetX <= DISPLAY_WIDTH + 32) && (targetY >= -32 && targetY <= DISPLAY_HEIGHT + 32);
targetX += sprite->data[1], targetY += sprite->data[2])
for (;(targetX >= -32 && targetX <= DISPLAY_WIDTH + 32) && (targetY >= -32 && targetY <= DISPLAY_HEIGHT + 32);
targetX += sprite->data[1], targetY += sprite->data[2])
;
sprite->data[1] = -sprite->data[1];
sprite->data[2] = -sprite->data[2];
for (; (attackerX >= -32 && attackerX <= DISPLAY_WIDTH + 32) && (attackerY >= -32 && attackerY <= DISPLAY_HEIGHT + 32);
attackerX += sprite->data[1], attackerY += sprite->data[2])
for (;(attackerX >= -32 && attackerX <= DISPLAY_WIDTH + 32) && (attackerY >= -32 && attackerY <= DISPLAY_HEIGHT + 32);
attackerX += sprite->data[1], attackerY += sprite->data[2])
;
sprite->x = attackerX;
sprite->y = attackerY;
sprite->data[0] = gBattleAnimArgs[4];
@ -662,7 +670,7 @@ static void AnimUnusedIceCrystalThrow_Step(struct Sprite *sprite)
sprite->x2 += Sin(sprite->data[7], sprite->data[3]);
sprite->y2 += Sin(sprite->data[7], sprite->data[3]);
sprite->data[7] = (sprite->data[7] + sprite->data[4]) & 0xFF;
--sprite->data[0];
sprite->data[0]--;
}
else
{
@ -694,10 +702,12 @@ static void AnimIceBeamParticle(struct Sprite *sprite)
{
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
sprite->data[2] -= gBattleAnimArgs[2];
else
sprite->data[2] += gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
sprite->data[0] = gBattleAnimArgs[4];
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
@ -717,12 +727,14 @@ void AnimIceEffectParticle(struct Sprite *sprite)
}
else
{
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->x, &sprite->y);
SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->x, &sprite->y);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1];
}
StoreSpriteCallbackInData6(sprite, AnimFlickerIceEffectParticle);
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
}
@ -730,7 +742,8 @@ void AnimIceEffectParticle(struct Sprite *sprite)
static void AnimFlickerIceEffectParticle(struct Sprite *sprite)
{
sprite->invisible ^= 1;
if (++sprite->data[0] == 20)
sprite->data[0] += 1;
if (sprite->data[0] == 20)
DestroySpriteAndMatrix(sprite);
}
@ -743,13 +756,15 @@ static void AnimFlickerIceEffectParticle(struct Sprite *sprite)
// arg 5: multiple targets? (boolean)
static void AnimSwirlingSnowball(struct Sprite *sprite)
{
s32 i;
int i;
s16 tempDataHolder[8];
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[1] = sprite->x;
sprite->data[3] = sprite->y;
if (!gBattleAnimArgs[5])
{
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
@ -757,32 +772,41 @@ static void AnimSwirlingSnowball(struct Sprite *sprite)
}
else
{
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->data[2], &sprite->data[4]);
}
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
sprite->data[2] -= gBattleAnimArgs[2];
else
sprite->data[2] += gBattleAnimArgs[2];
for (i = 0; i < 8; ++i)
for (i = 0; i < 8; i++)
tempDataHolder[i] = sprite->data[i];
InitAnimFastLinearTranslationWithSpeed(sprite);
sprite->data[1] ^= 1;
sprite->data[2] ^= 1;
while (1)
{
sprite->data[0] = 1;
AnimFastTranslateLinear(sprite);
if (sprite->x + sprite->x2 > DISPLAY_WIDTH + 16
|| sprite->x + sprite->x2 < -16
|| sprite->y + sprite->y2 > DISPLAY_HEIGHT
|| sprite->y + sprite->y2 < -16)
break;
}
sprite->x += sprite->x2;
sprite->y += sprite->y2;
sprite->x2 = sprite->y2 = 0;
for (i = 0; i < 8; ++i)
sprite->y2 = 0;
sprite->x2 = 0;
for (i = 0; i < 8; i++)
sprite->data[i] = tempDataHolder[i];
sprite->callback = InitAnimFastLinearTranslationWithSpeedAndPos;
StoreSpriteCallbackInData6(sprite, AnimSwirlingSnowball_Step1);
}
@ -796,7 +820,9 @@ void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
sprite->y2 = 0;
sprite->x2 = 0;
sprite->data[0] = 128;
tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20;
sprite->data[3] = Sin(sprite->data[0], tempVar);
sprite->data[4] = Cos(sprite->data[0], 0xF);
sprite->data[5] = 0;
@ -806,8 +832,9 @@ void AnimSwirlingSnowball_Step1(struct Sprite *sprite)
static void AnimSwirlingSnowball_Step2(struct Sprite *sprite)
{
s16 tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20;
s16 tempVar;
tempVar = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 20 : -20;
if (sprite->data[5] <= 31)
{
sprite->x2 = Sin(sprite->data[0], tempVar) - sprite->data[3];
@ -819,8 +846,10 @@ static void AnimSwirlingSnowball_Step2(struct Sprite *sprite)
{
sprite->x += sprite->x2;
sprite->y += sprite->y2;
sprite->x2 = sprite->y2 = 0;
sprite->data[3] = sprite->data[4] = 0;
sprite->y2 = 0;
sprite->x2 = 0;
sprite->data[4] = 0;
sprite->data[3] = 0;
sprite->callback = AnimSwirlingSnowball_End;
}
}
@ -829,7 +858,9 @@ static void AnimSwirlingSnowball_End(struct Sprite *sprite)
{
sprite->data[0] = 1;
AnimFastTranslateLinear(sprite);
if ((u32)(sprite->x + sprite->x2 + 16) > 272
if (sprite->x + sprite->x2 > 256
|| sprite->x + sprite->x2 < -16
|| sprite->y + sprite->y2 > 256
|| sprite->y + sprite->y2 < -16)
DestroyAnimSprite(sprite);
@ -847,13 +878,15 @@ static void AnimSwirlingSnowball_End(struct Sprite *sprite)
// arg 7: multiple targets? (boolean)
void AnimMoveParticleBeyondTarget(struct Sprite *sprite)
{
s32 i;
int i;
s16 tempDataHolder[8];
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[4];
sprite->data[1] = sprite->x;
sprite->data[3] = sprite->y;
if (!gBattleAnimArgs[7])
{
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
@ -861,18 +894,22 @@ void AnimMoveParticleBeyondTarget(struct Sprite *sprite)
}
else
{
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->data[2], &sprite->data[4]);
SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->data[2], &sprite->data[4]);
}
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
sprite->data[2] -= gBattleAnimArgs[2];
else
sprite->data[2] += gBattleAnimArgs[2];
sprite->data[4] += gBattleAnimArgs[3];
InitAnimFastLinearTranslationWithSpeed(sprite);
for (i = 0; i < 8; ++i)
for (i = 0; i < 8; i++)
tempDataHolder[i] = sprite->data[i];
sprite->data[1] ^= 1;
sprite->data[2] ^= 1;
while (1)
{
sprite->data[0] = 1;
@ -883,12 +920,15 @@ void AnimMoveParticleBeyondTarget(struct Sprite *sprite)
|| sprite->y + sprite->y2 < -16)
break;
}
sprite->x += sprite->x2;
sprite->y += sprite->y2;
sprite->y2 = 0;
sprite->x2 = 0;
for (i = 0; i < 8; ++i)
for (i = 0; i < 8; i++)
sprite->data[i] = tempDataHolder[i];
sprite->data[5] = gBattleAnimArgs[5];
sprite->data[6] = gBattleAnimArgs[6];
sprite->callback = AnimWiggleParticleTowardsTarget;
@ -900,6 +940,7 @@ static void AnimWiggleParticleTowardsTarget(struct Sprite *sprite)
AnimFastTranslateLinear(sprite);
if (sprite->data[0] == 0)
sprite->data[0] = 1;
sprite->y2 += Sin(sprite->data[7], sprite->data[5]);
sprite->data[7] = (sprite->data[7] + sprite->data[6]) & 0xFF;
if (sprite->data[0] == 1)
@ -926,13 +967,16 @@ static void AnimWaveFromCenterOfTarget(struct Sprite *sprite)
}
else
{
SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y);
SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &sprite->x, &sprite->y);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[0] = -gBattleAnimArgs[0];
sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1];
}
++sprite->data[0];
sprite->data[0]++;
}
else
{
@ -961,13 +1005,15 @@ static void InitSwirlingFogAnim(struct Sprite *sprite)
}
else
{
SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->x, &sprite->y);
SetAverageBattlerPositions(gBattleAnimAttacker, FALSE, &sprite->x, &sprite->y);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
sprite->x -= gBattleAnimArgs[0];
else
sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1];
}
battler = gBattleAnimAttacker;
}
else
@ -978,29 +1024,36 @@ static void InitSwirlingFogAnim(struct Sprite *sprite)
}
else
{
SetAverageBattlerPositions(gBattleAnimTarget, 0, &sprite->x, &sprite->y);
SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &sprite->x, &sprite->y);
if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
sprite->x -= gBattleAnimArgs[0];
else
sprite->x += gBattleAnimArgs[0];
sprite->y += gBattleAnimArgs[1];
}
battler = gBattleAnimTarget;
}
sprite->data[7] = battler;
if (gBattleAnimArgs[5] == 0 || !IsDoubleBattle())
tempVar = 0x20;
else
tempVar = 0x40;
sprite->data[6] = tempVar;
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
sprite->y += 8;
sprite->data[0] = gBattleAnimArgs[3];
sprite->data[1] = sprite->x;
sprite->data[2] = sprite->x;
sprite->data[3] = sprite->y;
sprite->data[4] = sprite->y + gBattleAnimArgs[2];
InitAnimLinearTranslation(sprite);
sprite->data[5] = 64;
sprite->callback = AnimSwirlingFogAnim;
sprite->callback(sprite);
@ -1013,10 +1066,12 @@ static void AnimSwirlingFogAnim(struct Sprite *sprite)
{
sprite->x2 += Sin(sprite->data[5], sprite->data[6]);
sprite->y2 += Cos(sprite->data[5], -6);
if ((u16)(sprite->data[5] - 64) <= 0x7F)
sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]);
else
sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]) + 1;
sprite->data[5] = (sprite->data[5] + 3) & 0xFF;
}
else
@ -1025,7 +1080,7 @@ static void AnimSwirlingFogAnim(struct Sprite *sprite)
}
}
// Fades mons to black and places foggy overlay in Haze.
// Adds moving foggy overlay. Used by Haze.
void AnimTask_HazeScrollingFog(u8 taskId)
{
struct BattleAnimBgData animBg;
@ -1034,18 +1089,20 @@ void AnimTask_HazeScrollingFog(u8 taskId)
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);
GetBattleAnimBg1Data(&animBg);
LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset);
AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimFogTilemap);
AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimFogTilemap, FALSE);
LoadPalette(&gFogPalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);
if (IsContest())
RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);
gTasks[taskId].func = AnimTask_HazeScrollingFog_Step;
}
@ -1054,18 +1111,21 @@ static void AnimTask_HazeScrollingFog_Step(u8 taskId)
struct BattleAnimBgData animBg;
gBattle_BG1_X += -1;
gBattle_BG1_Y += 0;
switch (gTasks[taskId].data[12])
{
case 0:
if (++gTasks[taskId].data[10] == 4)
{
gTasks[taskId].data[10] = 0;
++gTasks[taskId].data[9];
gTasks[taskId].data[9]++;
gTasks[taskId].data[11] = sHazeBlendAmounts[gTasks[taskId].data[9]];
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 16 - gTasks[taskId].data[11]));
if (gTasks[taskId].data[11] == 9)
{
++gTasks[taskId].data[12];
gTasks[taskId].data[12]++;
gTasks[taskId].data[11] = 0;
}
}
@ -1074,31 +1134,33 @@ static void AnimTask_HazeScrollingFog_Step(u8 taskId)
if (++gTasks[taskId].data[11] == 0x51)
{
gTasks[taskId].data[11] = 9;
++gTasks[taskId].data[12];
gTasks[taskId].data[12]++;
}
break;
case 2:
if (++gTasks[taskId].data[10] == 4)
{
gTasks[taskId].data[10] = 0;
--gTasks[taskId].data[11];
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[12]++;
gTasks[taskId].data[11] = 0;
}
}
break;
case 3:
GetBattleAnimBg1Data(&animBg);
InitBattleAnimBg(1);
InitBattleAnimBg(2);
++gTasks[taskId].data[12];
ClearBattleAnimBg(1);
ClearBattleAnimBg(2);
gTasks[taskId].data[12]++;
// fall through
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);
@ -1123,6 +1185,7 @@ void AnimThrowMistBall(struct Sprite *sprite)
sprite->callback = TranslateAnimSpriteToTargetMonLocation;
}
// Displays misty background in Mist Ball.
void AnimTask_MistBallFog(u8 taskId)
{
struct BattleAnimBgData animBg;
@ -1131,18 +1194,20 @@ void AnimTask_MistBallFog(u8 taskId)
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);
GetBattleAnimBg1Data(&animBg);
LoadBgTiles(animBg.bgId, gWeatherFogHorizontalTiles, 0x800, animBg.tilesOffset);
AnimLoadCompressedBgTilemap(animBg.bgId, gBattleAnimFogTilemap);
AnimLoadCompressedBgTilemapHandleContest(&animBg, gBattleAnimFogTilemap, FALSE);
LoadPalette(&gFogPalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP);
if (IsContest())
RelocateBattleBgPal(animBg.paletteId, animBg.bgTilemap, 0, 0);
gTasks[taskId].data[15] = -1;
gTasks[taskId].func = AnimTask_MistBallFog_Step;
}
@ -1152,6 +1217,8 @@ static void AnimTask_MistBallFog_Step(u8 taskId)
struct BattleAnimBgData animBg;
gBattle_BG1_X += gTasks[taskId].data[15];
gBattle_BG1_Y += 0;
switch (gTasks[taskId].data[12])
{
case 0:
@ -1160,7 +1227,7 @@ static void AnimTask_MistBallFog_Step(u8 taskId)
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[11], 17 - gTasks[taskId].data[11]));
if (gTasks[taskId].data[11] == 5)
{
++gTasks[taskId].data[12];
gTasks[taskId].data[12]++;
gTasks[taskId].data[11] = 0;
}
break;
@ -1168,7 +1235,7 @@ static void AnimTask_MistBallFog_Step(u8 taskId)
if (++gTasks[taskId].data[11] == 0x51)
{
gTasks[taskId].data[11] = 5;
++gTasks[taskId].data[12];
gTasks[taskId].data[12]++;
}
break;
case 2:
@ -1179,20 +1246,23 @@ static void AnimTask_MistBallFog_Step(u8 taskId)
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[12]++;
gTasks[taskId].data[11] = 0;
}
}
break;
case 3:
GetBattleAnimBg1Data(&animBg);
InitBattleAnimBg(1);
InitBattleAnimBg(2);
++gTasks[taskId].data[12];
ClearBattleAnimBg(1);
ClearBattleAnimBg(2);
gTasks[taskId].data[12]++;
// fall through
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);
@ -1215,18 +1285,24 @@ static void AnimTask_MistBallFog_Step(u8 taskId)
static void InitPoisonGasCloudAnim(struct Sprite *sprite)
{
sprite->data[0] = gBattleAnimArgs[0];
if (GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) < GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2))
sprite->data[7] = 0x8000;
if ((gBattlerPositions[gBattleAnimTarget] & BIT_SIDE) == B_SIDE_PLAYER)
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
{
gBattleAnimArgs[1] = -gBattleAnimArgs[1];
gBattleAnimArgs[3] = -gBattleAnimArgs[3];
if ((sprite->data[7] & 0x8000) && (gBattlerPositions[gBattleAnimAttacker] & BIT_SIDE) == B_SIDE_PLAYER)
if ((sprite->data[7] & 0x8000) && GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
sprite->subpriority = gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)].subpriority + 1;
sprite->data[6] = 1;
}
sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
if (B_UPDATED_MOVE_DATA >= GEN_5)
{
s16 x, y;
@ -1253,18 +1329,20 @@ static void InitPoisonGasCloudAnim(struct Sprite *sprite)
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[4];
sprite->data[7] |= GetBattlerSpriteBGPriority(gBattleAnimTarget) << 8;
}
if (IsContest())
{
sprite->data[6] = 1;
sprite->subpriority = 0x80;
}
InitAnimLinearTranslation(sprite);
sprite->callback = MovePoisonGasCloud;
}
static void MovePoisonGasCloud(struct Sprite *sprite)
{
s32 value;
int value;
switch (sprite->data[7] & 0xFF)
{
@ -1276,9 +1354,9 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
sprite->data[5] = (sprite->data[5] - 8) & 0xFF;
else
sprite->data[5] = (sprite->data[5] + 8) & 0xFF;
if (sprite->data[0] <= 0)
{
sprite->data[0] = 80;
#if B_UPDATED_MOVE_DATA >= GEN_5
s16 x, y;
SetAverageBattlerPositions(gBattleAnimTarget, 0, &x, &y);
@ -1286,18 +1364,20 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
#else
sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
#endif
sprite->data[0] = 80;
sprite->data[1] = sprite->x;
sprite->data[2] = sprite->x;
sprite->y += sprite->y2;
sprite->data[3] = sprite->y;
sprite->data[4] = sprite->y + 29;
++sprite->data[7];
sprite->data[7]++;
if (IsContest())
sprite->data[5] = 80;
else if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
sprite->data[5] = 204;
else
sprite->data[5] = 80;
sprite->y2 = 0;
value = gSineTable[sprite->data[5]];
sprite->x2 = value >> 3;
@ -1313,23 +1393,24 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
if (!IsContest())
{
u16 var0 = sprite->data[5] - 0x40;
if (var0 <= 0x7F)
sprite->oam.priority = sprite->data[7] >> 8;
else
sprite->oam.priority = (sprite->data[7] >> 8) + 1;
sprite->data[5] = (sprite->data[5] + 4) & 0xFF;
}
else
{
u16 var0 = sprite->data[5] - 0x40;
if (var0 <= 0x7F)
sprite->subpriority = 128;
else
sprite->subpriority = 140;
sprite->data[5] = (sprite->data[5] - 4) & 0xFF;
}
if (sprite->data[0] <= 0)
{
sprite->data[0] = 0x300;
@ -1337,12 +1418,13 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
sprite->data[3] = sprite->y += sprite->y2;
sprite->data[4] = sprite->y + 4;
if (IsContest())
sprite->data[2] = -0x10;
sprite->data[2] = -16;
else if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
sprite->data[2] = 0x100;
sprite->data[2] = DISPLAY_WIDTH + 16;
else
sprite->data[2] = -0x10;
++sprite->data[7];
sprite->data[2] = -16;
sprite->data[7]++;
sprite->x2 = sprite->y2 = 0;
InitAnimLinearTranslationWithSpeed(sprite);
}
@ -1355,14 +1437,14 @@ static void MovePoisonGasCloud(struct Sprite *sprite)
FreeOamMatrix(sprite->oam.matrixNum);
sprite->oam.affineMode = ST_OAM_AFFINE_OFF;
}
DestroySprite(sprite);
--gAnimVisualTaskCount;
gAnimVisualTaskCount--;
}
break;
}
}
// Creates Hail.
void AnimTask_Hail(u8 taskId)
{
struct Task *task = &gTasks[taskId];
@ -1373,7 +1455,6 @@ void AnimTask_Hail(u8 taskId)
static void AnimTask_Hail2(u8 taskId)
{
struct Task *task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
@ -1382,29 +1463,31 @@ static void AnimTask_Hail2(u8 taskId)
task->data[4] = 0;
task->data[5] = 0;
task->data[2] = 0;
++task->data[0];
task->data[0]++;
}
break;
case 1:
if (task->data[5] == 0)
{
if (GenerateHailParticle(task->data[3], task->data[2], taskId, 1))
++task->data[1];
task->data[1]++;
if (++task->data[2] == 3)
{
if (++task->data[3] == 10)
++task->data[0];
task->data[0]++;
else
--task->data[0];
task->data[0]--;
}
else
{
task->data[5] = 1;
}
}
else
{
--task->data[5];
task->data[5]--;
}
break;
case 2:
@ -1454,7 +1537,7 @@ static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId,
battlerY = sHailCoordData[hailStructId].y;
}
spriteX = battlerX - ((battlerY + 8) / 2);
id = CreateSprite(&sHailParticleSpriteTemplate, spriteX, -8, 18);
id = CreateSprite(&gHailParticleSpriteTemplate, spriteX, -8, 18);
if (id == MAX_SPRITES)
{
return FALSE;
@ -1478,24 +1561,29 @@ static void AnimHailBegin(struct Sprite *sprite)
sprite->x += 4;
sprite->y += 8;
if (sprite->x < sprite->data[3] && sprite->y < sprite->data[4])
return;
if (sprite->data[0] == 1 && sprite->data[5] == 0)
{
spriteId = CreateSprite(&gIceCrystalHitLargeSpriteTemplate, sprite->data[3], sprite->data[4], sprite->subpriority);
spriteId = CreateSprite(&gIceCrystalHitLargeSpriteTemplate,
sprite->data[3], sprite->data[4], sprite->subpriority);
sprite->data[0] = spriteId;
if (spriteId != 64)
if (spriteId != MAX_SPRITES)
{
gSprites[sprite->data[0]].callback = AnimHailContinue;
gSprites[sprite->data[0]].data[6] = sprite->data[6];
gSprites[sprite->data[0]].data[7] = sprite->data[7];
}
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
}
else
{
--gTasks[sprite->data[6]].data[sprite->data[7]];
gTasks[sprite->data[6]].data[sprite->data[7]]--;
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
}
@ -1505,7 +1593,7 @@ static void AnimHailContinue(struct Sprite *sprite)
{
if (++sprite->data[0] == 20)
{
--gTasks[sprite->data[6]].data[sprite->data[7]];
gTasks[sprite->data[6]].data[sprite->data[7]]--;
FreeOamMatrix(sprite->oam.matrixNum);
DestroySprite(sprite);
}
@ -1524,27 +1612,33 @@ static void InitIceBallAnim(struct Sprite *sprite)
if (animNum > 4)
animNum = 4;
StartSpriteAffineAnim(sprite, animNum);
InitSpritePosToAnimAttacker(sprite, 1);
InitSpritePosToAnimAttacker(sprite, TRUE);
sprite->data[0] = gBattleAnimArgs[4];
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
sprite->data[5] = gBattleAnimArgs[5];
InitAnimArcTranslation(sprite);
sprite->callback = AnimThrowIceBall;
}
// Throws the ball of ice in Ice Ball.
static void AnimThrowIceBall(struct Sprite *sprite)
{
if (TranslateAnimHorizontalArc(sprite))
{
StartSpriteAnim(sprite, 1);
sprite->callback = RunStoredCallbackWhenAnimEnds;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
if (!TranslateAnimHorizontalArc(sprite))
return;
StartSpriteAnim(sprite, 1);
sprite->callback = RunStoredCallbackWhenAnimEnds;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
// Initializes the particles that scatter at the end of the Ice Ball animation.
@ -1554,10 +1648,13 @@ static void InitIceBallParticle(struct Sprite *sprite)
sprite->oam.tileNum += 8;
InitSpritePosToAnimTarget(sprite, TRUE);
randA = (Random() & 0xFF) + 256;
randB = Random() & 0x1FF;
randA = (Random2() & 0xFF) + 256;
randB = Random2() & 0x1FF;
if (randB > 0xFF)
randB = 256 - randB;
sprite->data[1] = randA;
sprite->data[2] = randB;
sprite->callback = AnimIceBallParticle;
@ -1568,11 +1665,14 @@ static void AnimIceBallParticle(struct Sprite *sprite)
{
sprite->data[3] += sprite->data[1];
sprite->data[4] += sprite->data[2];
if (sprite->data[1] & 1)
sprite->x2 = -(sprite->data[3] >> 8);
else
sprite->x2 = sprite->data[3] >> 8;
sprite->y2 = sprite->data[4] >> 8;
if (++sprite->data[0] == 21)
DestroyAnimSprite(sprite);
}
@ -1585,15 +1685,6 @@ void AnimTask_GetIceBallCounter(u8 taskId)
DestroyAnimVisualTask(taskId);
}
// Counter for Ice Ball.
void AnimTask_GetRolloutCounter(u8 taskId)
{
u8 arg = gBattleAnimArgs[0];
gBattleAnimArgs[arg] = gAnimDisableStructPtr->rolloutTimerStartValue - gAnimDisableStructPtr->rolloutTimer - 1;
DestroyAnimVisualTask(taskId);
}
static const union AnimCmd sAnim_Snowflakes[] =
{
ANIMCMD_FRAME(0, 2),

View File

@ -830,8 +830,8 @@ void AnimLoadCompressedBgTilemap(u32 bgId, const u32 *src)
void AnimLoadCompressedBgTilemapHandleContest(struct BattleAnimBgData *data, const void *src, bool32 largeScreen)
{
InitAnimBgTilemapBuffer(data->bgId, src);
// if (IsContest() == TRUE)
// RelocateBattleBgPal(data->paletteId, data->bgTilemap, 0, largeScreen);
if (IsContest() == TRUE)
RelocateBattleBgPal(data->paletteId, data->bgTilemap, 0, largeScreen);
CopyBgTilemapBufferToVram(data->bgId);
}