Fix tera tint not applying on activation (#8135)

This commit is contained in:
FosterProgramming 2025-11-09 18:10:44 +01:00 committed by GitHub
parent 6c383fac96
commit 3e583f8add
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 31 additions and 26 deletions

View File

@ -29002,7 +29002,7 @@ gBattleAnimMove_Transform::
monbg ANIM_ATTACKER
playsewithpan SE_M_TELEPORT, SOUND_PAN_ATTACKER
waitplaysewithpan SE_M_MINIMIZE, SOUND_PAN_ATTACKER, 48
createvisualtask AnimTask_TransformMon, 2, 0, 1
createvisualtask AnimTask_TransformMon, 2, SPECIES_GFX_CHANGE_TRANSFORM
waitforvisualfinish
clearmonbg ANIM_ATTACKER
end
@ -31513,14 +31513,14 @@ gBattleAnimGeneral_SimpleHeal::
gBattleAnimGeneral_IllusionOff::
monbg ANIM_TARGET
createvisualtask AnimTask_TransformMon, 2, 1, 0
createvisualtask AnimTask_TransformMon, 2, SPECIES_GFX_CHANGE_ILLUSION_OFF
waitforvisualfinish
clearmonbg ANIM_TARGET
end
gBattleAnimGeneral_FormChange::
monbg ANIM_ATTACKER
createvisualtask AnimTask_TransformMon, 2, 1, 0
createvisualtask AnimTask_TransformMon, 2, SPECIES_GFX_CHANGE_FORM_CHANGE
waitforvisualfinish
clearmonbg ANIM_ATTACKER
end
@ -31552,7 +31552,7 @@ gBattleAnimGeneral_MegaEvolution::
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
waitforvisualfinish
createvisualtask SoundTask_PlayNormalCry, 0
createvisualtask AnimTask_HideSwapSprite, 2, 1, 0
createvisualtask AnimTask_HideSwapSprite, 2
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
createsprite gMegaSymbolSpriteTemplate ANIM_ATTACKER, 3, 0, 0, ANIM_ATTACKER
@ -31637,7 +31637,7 @@ gBattleAnimGeneral_TeraActivate::
createvisualtask AnimTask_SetOpponentShadowCallbacks, 2 @ Restore shadows hidden in the charge script
loadspritegfx ANIM_TAG_TERA_SYMBOL
loadspritegfx ANIM_TAG_SPARKLE_6
createvisualtask AnimTask_HideSwapSprite, 2, 1, 0
createvisualtask AnimTask_HideSwapSprite, 2
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
createvisualtask SoundTask_PlayNormalCry, 0
@ -31777,7 +31777,7 @@ General_PrimalReversion_Alpha:
delay 20
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
waitforvisualfinish
createvisualtask AnimTask_HideSwapSprite, 2, 1, 0
createvisualtask AnimTask_HideSwapSprite, 2
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
createvisualtask SoundTask_PlayNormalCry, 0
@ -31810,7 +31810,7 @@ General_PrimalReversion_Omega:
delay 20
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
waitforvisualfinish
createvisualtask AnimTask_HideSwapSprite, 2, 1, 0
createvisualtask AnimTask_HideSwapSprite, 2
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
createvisualtask SoundTask_PlayNormalCry, 0
@ -31850,7 +31850,7 @@ gBattleAnimGeneral_PowerConstruct::
delay 20
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
waitforvisualfinish
createvisualtask AnimTask_HideSwapSprite, 2, 1, 0
createvisualtask AnimTask_HideSwapSprite, 2
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
createvisualtask SoundTask_PlayNormalCry, 0
@ -31920,7 +31920,7 @@ gBattleAnimGeneral_UltraBurst::
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA
createsprite gUltraBurstSymbolSpriteTemplate, ANIM_ATTACKER, 0x0, 0x0, 0x0, 0x0, 0x0
waitforvisualfinish
createvisualtask AnimTask_HideSwapSprite, 2, 1, 0
createvisualtask AnimTask_HideSwapSprite, 2
createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA
createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14
createvisualtask SoundTask_PlayNormalCry, 0

View File

@ -22,7 +22,7 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battler);
void ClearSpritesHealthboxAnimData(void);
void CopyAllBattleSpritesInvisibilities(void);
void CopyBattleSpriteInvisibility(u8 battler);
void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bool8 trackEnemyPersonality);
void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 changeType);
void BattleLoadSubstituteOrMonSpriteGfx(u8 battler, bool8 loadMonSprite);
void LoadBattleMonGfxAndAnimate(u8 battler, bool8 loadMonSprite, u8 spriteId);
void TrySetBehindSubstituteSpriteBit(u8 battler, u16 move);

View File

@ -667,6 +667,14 @@
#define ANIM_ORDER_UP_DROOPY 2
#define ANIM_ORDER_UP_STRETCHY 3
// AnimTask_TransformMon variations
enum SpeciesGfxChange
{
SPECIES_GFX_CHANGE_TRANSFORM,
SPECIES_GFX_CHANGE_FORM_CHANGE,
SPECIES_GFX_CHANGE_ILLUSION_OFF,
};
// Flags given to various functions to indicate which palettes to consider.
// Handled by UnpackSelectedBattlePalettes
#define F_PAL_BG (1 << 0)

View File

@ -2484,11 +2484,10 @@ void AnimTask_HideSwapSprite(u8 taskId)
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]);
HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, SPECIES_GFX_CHANGE_FORM_CHANGE);
GetBgDataForTransform(&animBg, gBattleAnimAttacker);
if (IsContest())
@ -2536,14 +2535,6 @@ void AnimTask_HideSwapSprite(u8 taskId)
break;
case 2:
gSprites[spriteId].x = gTasks[taskId].data[11]; // restores battler position
if (!IsContest())
{
if (!IsOnPlayerSide(gBattleAnimAttacker))
{
if (gTasks[taskId].data[10] == 0)
SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies);
}
}
DestroyAnimVisualTask(taskId);
break;
@ -2596,7 +2587,6 @@ void AnimTask_TransformMon(u8 taskId)
SetAnimBgAttribute(2, BG_ANIM_MOSAIC, 1);
gTasks[taskId].data[10] = gBattleAnimArgs[0];
gTasks[taskId].data[11] = gBattleAnimArgs[1];
gTasks[taskId].data[0]++;
break;
case 1:
@ -2611,7 +2601,7 @@ void AnimTask_TransformMon(u8 taskId)
}
break;
case 2:
HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10], gTasks[taskId].data[11]);
HandleSpeciesGfxDataChange(gBattleAnimAttacker, gBattleAnimTarget, gTasks[taskId].data[10]);
GetBgDataForTransform(&animBg, gBattleAnimAttacker);
if (IsContest())
@ -2680,7 +2670,7 @@ void AnimTask_TransformMon(u8 taskId)
{
if (!IsOnPlayerSide(gBattleAnimAttacker))
{
if (gTasks[taskId].data[10] == 0)
if (gTasks[taskId].data[10] == SPECIES_GFX_CHANGE_TRANSFORM)
SetBattlerShadowSpriteCallback(gBattleAnimAttacker, gBattleSpritesDataPtr->battlerData[gBattleAnimAttacker].transformSpecies);
}
}

View File

@ -906,7 +906,7 @@ void CopyBattleSpriteInvisibility(u8 battler)
gBattleSpritesDataPtr->battlerData[battler].invisible = gSprites[gBattlerSpriteIds[battler]].invisible;
}
void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bool8 trackEnemyPersonality)
void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, u8 changeType)
{
u32 personalityValue, position, paletteOffset, targetSpecies;
bool32 isShiny;
@ -947,7 +947,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo
targetSpecies = gBattleSpritesDataPtr->battlerData[battlerAtk].transformSpecies;
}
if (trackEnemyPersonality)
if (changeType == SPECIES_GFX_CHANGE_TRANSFORM)
{
personalityValue = gDisableStructs[battlerAtk].transformedMonPersonality;
isShiny = gDisableStructs[battlerAtk].transformedMonShininess;
@ -969,7 +969,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo
paletteData = GetMonSpritePalFromSpeciesAndPersonality(targetSpecies, isShiny, personalityValue);
LoadPalette(paletteData, paletteOffset, PLTT_SIZE_4BPP);
if (!megaEvo)
if (changeType == SPECIES_GFX_CHANGE_TRANSFORM)
{
BlendPalette(paletteOffset, 16, 6, RGB_WHITE);
CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16));
@ -986,6 +986,13 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool32 megaEvo, bo
CpuCopy32(gPlttBufferFaded + paletteOffset, gPlttBufferUnfaded + paletteOffset, PLTT_SIZEOF(16));
}
// Terastallization's tint
if (changeType != SPECIES_GFX_CHANGE_ILLUSION_OFF && 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);
}