From 04e482facad29a7ecb7335f2bdc7d8ebb3e9a108 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Sun, 19 Jan 2025 23:32:16 +0100 Subject: [PATCH] expansion sync: battle_anim_ice --- src/battle_anim_ice.c | 323 ++++++++++++++++++++++++++--------------- src/battle_anim_mons.c | 4 +- 2 files changed, 209 insertions(+), 118 deletions(-) diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index a6b7fa100..7cc2395bf 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -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), diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 373c82327..4900b1040 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -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); }