Fix terastallization anims flickering (#7613)

This commit is contained in:
RavePossum 2025-08-25 05:48:52 -04:00 committed by GitHub
parent ff3e8da007
commit 0a3c281cdd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 28 additions and 8 deletions

View File

@ -28732,6 +28732,7 @@ MegaEvolutionSpinEffect:
return
gBattleAnimGeneral_TeraCharge::
createvisualtask AnimTask_HideOpponentShadows, 2 @ Hide opponent shadows so they don't flicker between battle anims
loadspritegfx ANIM_TAG_TERA_CRYSTAL
loadspritegfx ANIM_TAG_TERA_SHATTER
loadspritegfx ANIM_TAG_FOCUS_ENERGY
@ -28753,7 +28754,6 @@ gBattleAnimGeneral_TeraCharge::
delay 20
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
waitforvisualfinish
createvisualtask AnimTask_TransformMon, 2, 1, 0
call TeraChargeParticles
playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_ATTACKER
clearmonbg ANIM_ATK_PARTNER
@ -28770,6 +28770,7 @@ TeraChargeParticles:
return
gBattleAnimGeneral_TeraActivate::
createvisualtask AnimTask_SetOpponentShadowCallbacks, 2 @ Restore shadows hidden in the charge script
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
waitforvisualfinish

View File

@ -2515,6 +2515,32 @@ void AnimTask_HideSwapSprite(u8 taskId)
}
}
void AnimTask_HideOpponentShadows(u8 taskId)
{
u32 battlerLeft = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerLeft].shadowSpriteIdPrimary].callback = SpriteCB_SetInvisible;
gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerLeft].shadowSpriteIdSecondary].callback = SpriteCB_SetInvisible;
if (IsDoubleBattle())
{
u32 battlerRight = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerRight].shadowSpriteIdPrimary].callback = SpriteCB_SetInvisible;
gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerRight].shadowSpriteIdSecondary].callback = SpriteCB_SetInvisible;
}
DestroyAnimVisualTask(taskId);
}
void AnimTask_SetOpponentShadowCallbacks(u8 taskId)
{
u32 battlerLeft = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT);
SetBattlerShadowSpriteCallback(battlerLeft, gBattleMons[battlerLeft].species);
if (IsDoubleBattle())
{
u32 battlerRight = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT);
SetBattlerShadowSpriteCallback(battlerRight, gBattleMons[battlerRight].species);
}
DestroyAnimVisualTask(taskId);
}
void AnimTask_TransformMon(u8 taskId)
{
int i, j;

View File

@ -1003,13 +1003,6 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo
CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16));
}
// Terastallization's tint
if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA)
{
BlendPalette(paletteOffset, 16, 8, GetTeraTypeRGB(GetBattlerTeraType(battlerAtk)));
CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16));
}
gSprites[gBattlerSpriteIds[battlerAtk]].y = GetBattlerSpriteDefault_Y(battlerAtk);
StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerAtk]], 0);
}