Skip to content

Commit

Permalink
Smoother primal/mega animation
Browse files Browse the repository at this point in the history
  • Loading branch information
kleeenexfeu committed Jun 16, 2024
1 parent a44fade commit 986af71
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 4 deletions.
8 changes: 4 additions & 4 deletions data/battle_anim_scripts.s
Original file line number Diff line number Diff line change
Expand Up @@ -28282,7 +28282,7 @@ General_MegaEvolution:
delay 20
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
waitforvisualfinish
createvisualtask AnimTask_TransformMon, 2, 1, 0
createvisualtask AnimTask_MegaSwapSprite, 2, 1, 0
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
waitforvisualfinish
Expand Down Expand Up @@ -28426,7 +28426,7 @@ General_PrimalReversion_Alpha:
delay 20
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
waitforvisualfinish
createvisualtask AnimTask_TransformMon, 2, 1, 0
createvisualtask AnimTask_MegaSwapSprite, 2, 1, 0
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
waitforvisualfinish
Expand All @@ -28453,7 +28453,7 @@ General_PrimalReversion_Omega:
delay 20
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
waitforvisualfinish
createvisualtask AnimTask_TransformMon, 2, 1, 0
createvisualtask AnimTask_MegaSwapSprite, 2, 1, 0
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
waitforvisualfinish
Expand Down Expand Up @@ -28489,7 +28489,7 @@ General_UltraBurst::
call LightThatBurnsTheSkyGreenSparks
delay 20
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
createvisualtask AnimTask_TransformMon, 2, 1, 0
createvisualtask AnimTask_MegaSwapSprite, 2, 1, 0
createsprite gUltraBurstSymbolSpriteTemplate, ANIM_ATTACKER, 0x0, 0x0, 0x0, 0x0, 0x0
waitforvisualfinish
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
Expand Down
82 changes: 82 additions & 0 deletions src/battle_anim_effects_3.c
Original file line number Diff line number Diff line change
Expand Up @@ -2325,6 +2325,88 @@ void AnimTask_SwallowDeformMon(u8 taskId)
}
}

void AnimTask_MegaSwapSprite(u8 taskId)
{
int i, j;
u8 position;
struct BattleAnimBgData animBg;
u8 *dest;
u8 *src;
u16 *bgTilemap;

u8 spriteId = gBattlerSpriteIds[gBattleAnimAttacker];

switch (gTasks[taskId].data[0])
{
case 0:
gTasks[taskId].data[11] = gSprites[spriteId].x; // Save battler position
gSprites[spriteId].x = -64; // hide it from screen to avoid the blip/glitch effect when swapping the sprite
gTasks[taskId].data[10] = gBattleAnimArgs[0];
gTasks[taskId].data[0]++;
break;
case 1:
HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10], gBattleAnimArgs[1]);
GetBgDataForTransform(&animBg, gBattleAnimAttacker);

if (IsContest())
position = 0;
else
position = GetBattlerPosition(gBattleAnimAttacker);

src = gMonSpritesGfxPtr->spritesGfx[position];
dest = animBg.bgTiles;
CpuCopy32(src, dest, MON_PIC_SIZE);
LoadBgTiles(1, animBg.bgTiles, 0x800, animBg.tilesOffset);
if (IsContest())
{
if (IsSpeciesNotUnown(gContestResources->moveAnim->species) != IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies))
{
bgTilemap = (u16 *)animBg.bgTilemap;
for (i = 0; i < 8; i++)
{
for (j = 0; j < 4; j++)
{
u16 temp = bgTilemap[j + i * 0x20];
bgTilemap[j + i * 0x20] = bgTilemap[(7 - j) + i * 0x20];
bgTilemap[(7 - j) + i * 0x20] = temp;
}
}

for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
{
bgTilemap[j + i * 0x20] ^= 0x400;
}
}
}

if (IsSpeciesNotUnown(gContestResources->moveAnim->targetSpecies))
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteContest;
else
gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].affineAnims = gAffineAnims_BattleSpriteOpponentSide;

StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[gBattleAnimAttacker]], BATTLER_AFFINE_NORMAL);
}

gTasks[taskId].data[0]++;
break;
case 2:
gSprites[spriteId].x = gTasks[taskId].data[11]; // restores battler position
if (!IsContest())
{
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
{
if (gTasks[taskId].data[10] == 0)
SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies);
}
}

DestroyAnimVisualTask(taskId);
break;
}
}

void AnimTask_TransformMon(u8 taskId)
{
int i, j;
Expand Down

0 comments on commit 986af71

Please sign in to comment.