From b0a759b2db835fa28ff63e2e5a88bc5210e917d9 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 20 Jan 2025 17:42:18 +0100 Subject: [PATCH] expansion sync: battle_anim_dark --- include/battle_anim.h | 4 +- src/battle_anim.c | 10 +- src/battle_anim_dark.c | 237 +++++++++++++++++++++------------ src/battle_anim_effects_2.c | 6 +- src/battle_anim_mons.c | 2 +- src/battle_anim_psychic.c | 4 +- src/battle_controller_player.c | 2 +- 7 files changed, 168 insertions(+), 97 deletions(-) diff --git a/include/battle_anim.h b/include/battle_anim.h index 02854ccd6..aa9e8acdf 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -466,7 +466,7 @@ void SpriteCB_RandomCentredHits(struct Sprite *sprite); void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool32 respectMonPicOffsets); // -void MoveBattlerSpriteToBG(u8 battlerId, u8); +void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible); void ResetBattleAnimBg(u8); void LoadMoveBg(u16 bgId); void ClearBattleAnimationVars(void); @@ -556,7 +556,7 @@ void SetBattlerSpriteYOffsetFromRotation(u8 spriteId); void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 xScale, s16 yScale, u16 rotation); void TryResetSpriteAffineState(struct Sprite *sprite); u16 ArcTan2Neg(s16 a, s16 b); -void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor); +void SetGrayscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor); u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 a6, bool8 a7); u32 GetBattleMonSpritePalettesMask(bool8 playerLeft, bool8 playerRight, bool8 foeLeft, bool8 foeRight); u8 GetSpritePalIdxByBattler(u8 a1); diff --git a/src/battle_anim.c b/src/battle_anim.c index 17949ca1a..c5484ad17 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -945,7 +945,7 @@ static void Cmd_monbg(void) else toBG_2 = TRUE; - MoveBattlerSpriteToBG(battlerId, toBG_2); + MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); spriteId = gBattlerSpriteIds[battlerId]; taskId = CreateTask(Task_InitUpdateMonBg, 10); gTasks[taskId].data[t1_MONBG_BATTLER] = spriteId; @@ -976,7 +976,7 @@ static void Cmd_monbg(void) else toBG_2 = TRUE; - MoveBattlerSpriteToBG(battlerId, toBG_2); + MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); spriteId = gBattlerSpriteIds[battlerId]; taskId = CreateTask(Task_InitUpdateMonBg, 10); gTasks[taskId].data[t1_MONBG_BATTLER] = spriteId; @@ -1032,7 +1032,7 @@ bool8 IsBattlerSpriteVisible(u8 battlerId) return FALSE; } -void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2) +void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) { struct BattleAnimBgData animBg; u8 battlerSpriteId; @@ -1245,7 +1245,7 @@ static void Cmd_monbg_static(void) else toBG_2 = TRUE; - MoveBattlerSpriteToBG(battlerId, toBG_2); + MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; } @@ -1258,7 +1258,7 @@ static void Cmd_monbg_static(void) else toBG_2 = TRUE; - MoveBattlerSpriteToBG(battlerId, toBG_2); + MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; } diff --git a/src/battle_anim_dark.c b/src/battle_anim_dark.c index 9223202ff..3045243cc 100644 --- a/src/battle_anim_dark.c +++ b/src/battle_anim_dark.c @@ -1,30 +1,30 @@ #include "global.h" - -#include "gpu_regs.h" - #include "battle_anim.h" +// #include "contest.h" +#include "gpu_regs.h" #include "graphics.h" #include "palette.h" #include "scanline_effect.h" #include "trig.h" #include "util.h" +#include "constants/rgb.h" -static void AnimUnusedBagSteal(struct Sprite *sprite); -static void AnimUnusedBagSteal_Step(struct Sprite *sprite); -static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId); -static void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId); -static void AnimBite_Step1(struct Sprite *sprite); -static void AnimBite_Step2(struct Sprite *sprite); -static void AnimTearDrop_Step(struct Sprite *sprite); -static void SetAllBattlersSpritePriority(u8 priority); -static void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId); -static void DoMementoShadowEffect(struct Task *task); -static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId); -static void AnimTask_MetallicShine_Step(u8 taskId); +static void AnimUnusedBagSteal(struct Sprite *); +static void AnimUnusedBagSteal_Step(struct Sprite *); +static void AnimTask_AttackerFadeToInvisible_Step(u8); +static void AnimTask_AttackerFadeFromInvisible_Step(u8); +static void AnimBite_Step1(struct Sprite *); +static void AnimBite_Step2(struct Sprite *); +static void AnimTearDrop_Step(struct Sprite *); +static void AnimTask_MoveAttackerMementoShadow_Step(u8); +static void AnimTask_MoveTargetMementoShadow_Step(u8); +static void DoMementoShadowEffect(struct Task *); +static void SetAllBattlersSpritePriority(u8); static void AnimPunishment(struct Sprite *sprite); +static void AnimTask_MetallicShine_Step(u8); // Unused -const struct SpriteTemplate sUnusedBagStealSpriteTemplate = +static const struct SpriteTemplate sUnusedBagStealSpriteTemplate = { .tileTag = ANIM_TAG_TIED_BAG, .paletteTag = ANIM_TAG_TIED_BAG, @@ -257,6 +257,10 @@ const struct SpriteTemplate gPunishmentImpactSpriteTemplate = .callback = AnimPunishment, }; +// arg 0: x pixel offset +// arg 1: y pixel offset +// arg 2: Something +// arg 3: Something static void AnimPunishment(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); @@ -271,8 +275,7 @@ static void AnimPunishment(struct Sprite *sprite) void AnimTask_AttackerFadeToInvisible(u8 taskId) { - s32 battler; - + int battler; gTasks[taskId].data[0] = gBattleAnimArgs[0]; battler = gBattleAnimAttacker; gTasks[taskId].data[1] = 16; @@ -281,6 +284,7 @@ void AnimTask_AttackerFadeToInvisible(u8 taskId) SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); else SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); + gTasks[taskId].func = AnimTask_AttackerFadeToInvisible_Step; } @@ -288,11 +292,10 @@ static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId) { u8 blendA = gTasks[taskId].data[1] >> 8; u8 blendB = gTasks[taskId].data[1]; - if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0]) { - ++blendA; - --blendB; + blendA++; + blendB--; gTasks[taskId].data[1] = BLDALPHA_BLEND(blendB, blendA); SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); gTasks[taskId].data[2] = 0; @@ -304,7 +307,7 @@ static void AnimTask_AttackerFadeToInvisible_Step(u8 taskId) } else { - ++gTasks[taskId].data[2]; + gTasks[taskId].data[2]++; } } @@ -320,11 +323,10 @@ static void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId) { u8 blendA = gTasks[taskId].data[1] >> 8; u8 blendB = gTasks[taskId].data[1]; - if (gTasks[taskId].data[2] == (u8)gTasks[taskId].data[0]) { - --blendA; - ++blendB; + blendA--; + blendB++; gTasks[taskId].data[1] = (blendA << 8) | blendB; SetGpuReg(REG_OFFSET_BLDALPHA, gTasks[taskId].data[1]); gTasks[taskId].data[2] = 0; @@ -337,7 +339,7 @@ static void AnimTask_AttackerFadeFromInvisible_Step(u8 taskId) } else { - ++gTasks[taskId].data[2]; + gTasks[taskId].data[2]++; } } @@ -348,6 +350,7 @@ void AnimTask_InitAttackerFadeFromInvisible(u8 taskId) SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG1); else SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); + DestroyAnimVisualTask(taskId); } @@ -378,16 +381,18 @@ static void AnimUnusedBagSteal_Step(struct Sprite *sprite) sprite->data[4] += sprite->data[2]; sprite->x2 = sprite->data[3] >> 8; sprite->y2 = sprite->data[4] >> 8; - --sprite->data[0]; + sprite->data[0]--; } + sprite->y2 += Sin(sprite->data[5], sprite->data[6]); sprite->data[5] = (sprite->data[5] + 3) & 0xFF; if (sprite->data[5] > 0x7F) { sprite->data[5] = 0; sprite->data[6] += 20; - ++sprite->data[7]; + sprite->data[7]++; } + if (--sprite->data[0] == 0) DestroyAnimSprite(sprite); } @@ -434,8 +439,10 @@ void AnimTearDrop(struct Sprite *sprite) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; + xOffset = 20; sprite->oam.tileNum += 4; + switch (gBattleAnimArgs[1]) { case 0: @@ -459,10 +466,12 @@ void AnimTearDrop(struct Sprite *sprite) xOffset = -20; break; } + sprite->data[0] = 32; sprite->data[2] = sprite->x + xOffset; sprite->data[4] = sprite->y + 12; sprite->data[5] = -12; + InitAnimArcTranslation(sprite); sprite->callback = AnimTearDrop_Step; } @@ -479,7 +488,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId) struct BattleAnimBgData animBg; u16 i; u8 pos; - s32 var0; + int var0; struct Task *task = &gTasks[taskId]; task->data[7] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + 31; @@ -487,13 +496,16 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId) task->data[5] = task->data[7]; task->data[4] = task->data[6]; task->data[13] = (task->data[7] - task->data[6]) << 8; + pos = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); task->data[14] = pos - 32; task->data[15] = pos + 32; + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) task->data[8] = -12; else task->data[8] = -64; + task->data[3] = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker); if (task->data[3] == 1) { @@ -516,6 +528,7 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId) if (!IsContest()) gBattle_BG1_X += DISPLAY_WIDTH; } + scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; @@ -525,11 +538,12 @@ void AnimTask_MoveAttackerMementoShadow(u8 taskId) task->data[1] = 0; task->data[2] = 0; SetAllBattlersSpritePriority(3); - for (i = 0; i < 112; ++i) + for (i = 0; i < 112; i++) { gScanlineEffectRegBuffers[0][i] = task->data[10]; gScanlineEffectRegBuffers[1][i] = task->data[10]; } + ScanlineEffect_SetParams(scanlineParams); SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | (var0 ^ (WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR))); SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); @@ -552,37 +566,44 @@ static void AnimTask_MoveAttackerMementoShadow_Step(u8 taskId) if (++task->data[2] & 1) { if (task->data[11] != 12) - ++task->data[11]; + task->data[11]++; } - else if (task->data[12] != 8) + else { - --task->data[12]; + if (task->data[12] != 8) + task->data[12]--; } + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12])); + if (task->data[11] == 12 && task->data[12] == 8) - ++task->data[0]; + task->data[0]++; } break; case 1: task->data[4] -= 8; DoMementoShadowEffect(task); + if (task->data[4] < task->data[8]) - ++task->data[0]; + task->data[0]++; break; case 2: task->data[4] -= 8; DoMementoShadowEffect(task); task->data[14] += 4; task->data[15] -= 4; + if (task->data[14] >= task->data[15]) task->data[14] = task->data[15]; + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; + if (task->data[14] == task->data[15]) - ++task->data[0]; + task->data[0]++; break; case 3: gScanlineEffect.state = 3; - ++task->data[0]; + task->data[0]++; break; case 4: DestroyAnimVisualTask(taskId); @@ -622,7 +643,8 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId) SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND | BLDCNT_TGT1_BG2); gBattle_BG1_X += DISPLAY_WIDTH; } - ++task->data[0]; + + task->data[0]++; } break; case 1: @@ -637,8 +659,9 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId) task->data[10] = gBattle_BG2_Y; FillPalette(RGB_BLACK, BG_PLTT_ID(9), PLTT_SIZE_4BPP); } + SetAllBattlersSpritePriority(3); - ++task->data[0]; + task->data[0]++; break; case 2: task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + 31; @@ -647,40 +670,46 @@ void AnimTask_MoveTargetMementoShadow(u8 taskId) x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); task->data[14] = x - 4; task->data[15] = x + 4; + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) task->data[8] = -12; else task->data[8] = -64; + task->data[4] = task->data[8]; task->data[5] = task->data[8]; task->data[11] = 12; task->data[12] = 8; - ++task->data[0]; + task->data[0]++; break; case 3: if (task->data[3] == 1) scanlineParams.dmaDest = ®_BG1VOFS; else scanlineParams.dmaDest = ®_BG2VOFS; - for (i = 0; i < 112; ++i) + + for (i = 0; i < 112; i++) { gScanlineEffectRegBuffers[0][i] = task->data[10] + (159 - i); gScanlineEffectRegBuffers[1][i] = task->data[10] + (159 - i); } + scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; ScanlineEffect_SetParams(scanlineParams); - ++task->data[0]; + task->data[0]++; break; case 4: if (task->data[3] == 1) SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); else SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG3 | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); + SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR); gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; gBattle_WIN0V = DISPLAY_HEIGHT; + task->data[0] = 0; task->data[1] = 0; task->data[2] = 0; @@ -698,11 +727,12 @@ static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId) { case 0: task->data[5] += 8; - if (task->data[5] >= task->data[7]) + if (task->data[5] >= task->data[7]) task->data[5] = task->data[7]; + DoMementoShadowEffect(task); if (task->data[5] == task->data[7]) - ++task->data[0]; + task->data[0]++; break; case 1: if (task->data[15] - task->data[14] < 0x40) @@ -714,39 +744,43 @@ static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId) { task->data[1] = 1; } + gBattle_WIN0H = (task->data[14] << 8) | task->data[15]; task->data[4] += 8; if (task->data[4] >= task->data[6]) task->data[4] = task->data[6]; + DoMementoShadowEffect(task); if (task->data[4] == task->data[6] && task->data[1]) { task->data[1] = 0; - ++task->data[0]; + task->data[0]++; } break; case 2: if (++task->data[1] > 1) { task->data[1] = 0; - ++task->data[2]; + task->data[2]++; if (task->data[2] & 1) { if (task->data[11]) - --task->data[11]; + task->data[11]--; } - else if (task->data[12] < 16) + else { - ++task->data[12]; + if (task->data[12] < 16) + task->data[12]++; } + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[11], task->data[12])); if (task->data[11] == 0 && task->data[12] == 16) - ++task->data[0]; + task->data[0]++; } break; case 3: gScanlineEffect.state = 3; - ++task->data[0]; + task->data[0]++; break; case 4: gBattle_WIN0H = 0; @@ -760,39 +794,51 @@ static void AnimTask_MoveTargetMementoShadow_Step(u8 taskId) static void DoMementoShadowEffect(struct Task *task) { - s32 var0, var1, var4; - s16 var2, i; + int var0, var1; + s16 var2; + s16 i; + int var4; var2 = task->data[5] - task->data[4]; if (var2 != 0) { var0 = task->data[13] / var2; var1 = task->data[6] << 8; - for (i = 0; i < task->data[4]; ++i) + + for (i = 0; i < task->data[4]; i++) + { gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = task->data[10] - (i - 159); - for (i = task->data[4]; i <= task->data[5]; ++i) + } + + for (i = task->data[4]; i <= task->data[5]; i++) { if (i >= 0) { s16 var3 = (var1 >> 8) - i; - gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var3 + task->data[10]; } + var1 += var0; } + var4 = task->data[10] - (i - 159); - for (; i < task->data[7]; ++i) + for (i = i; i < task->data[7]; i++) + { if (i >= 0) - gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4--; + { + gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = var4; + var4--; + } + } } else { var4 = task->data[10] + 159; - for (i = 0; i < 112; ++i) + for (i = 0; i < 112; i++) { gScanlineEffectRegBuffers[0][i] = var4; gScanlineEffectRegBuffers[1][i] = var4; - --var4; + var4--; } } } @@ -801,7 +847,7 @@ static void SetAllBattlersSpritePriority(u8 priority) { u16 i; - for (i = 0; i < MAX_BATTLERS_COUNT; ++i) + for (i = 0; i < MAX_BATTLERS_COUNT; i++) { u8 spriteId = GetAnimBattlerSpriteId(i); if (spriteId != SPRITE_NONE) @@ -811,25 +857,27 @@ static void SetAllBattlersSpritePriority(u8 priority) void AnimTask_InitMementoShadow(u8 taskId) { - bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE; - - MoveBattlerSpriteToBG(gBattleAnimAttacker, toBG2); + u8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? 1 : 0; + MoveBattlerSpriteToBG(gBattleAnimAttacker, toBG2, TRUE); gSprites[gBattlerSpriteIds[gBattleAnimAttacker]].invisible = FALSE; + if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) { - MoveBattlerSpriteToBG(gBattleAnimAttacker ^ 2, toBG2 ^ 1); - gSprites[gBattlerSpriteIds[gBattleAnimAttacker ^ 2]].invisible = FALSE; + MoveBattlerSpriteToBG(BATTLE_PARTNER(gBattleAnimAttacker), toBG2 ^ 1, TRUE); + gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].invisible = FALSE; } + DestroyAnimVisualTask(taskId); } void AnimTask_MementoHandleBg(u8 taskId) { bool8 toBG2 = GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) ^ 1 ? TRUE : FALSE; - ResetBattleAnimBg(toBG2); + if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimAttacker))) ResetBattleAnimBg(toBG2 ^ 1); + DestroyAnimVisualTask(taskId); } @@ -852,7 +900,8 @@ void AnimClawSlash(struct Sprite *sprite) void AnimTask_MetallicShine(u8 taskId) { u16 species; - u8 spriteId, newSpriteId; + u8 spriteId; + u8 newSpriteId; u16 paletteNum; struct BattleAnimBgData animBg; bool32 priorityChanged = FALSE; @@ -868,6 +917,7 @@ void AnimTask_MetallicShine(u8 taskId) SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 0); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 1); + if (IsDoubleBattle() && !IsContest()) { if (GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_OPPONENT_RIGHT || GetBattlerPosition(gBattleAnimAttacker) == B_POSITION_PLAYER_LEFT) @@ -880,23 +930,36 @@ void AnimTask_MetallicShine(u8 taskId) } } } - if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); + + if (IsContest()) + { + species = SPECIES_NONE; // species = gContestResources->moveAnim->species; + } else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); + { + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gBattleAnimAttacker]], MON_DATA_SPECIES); + } + spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); newSpriteId = CreateInvisibleSpriteCopy(gBattleAnimAttacker, spriteId, species); + GetBattleAnimBg1Data(&animBg); AnimLoadCompressedBgTilemap(animBg.bgId, gMetalShineTilemap); AnimLoadCompressedBgGfx(animBg.bgId, gMetalShineGfx, animBg.tilesOffset); LoadCompressedPalette(gMetalShinePalette, BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); + gBattle_BG1_X = -gSprites[spriteId].x + 96; gBattle_BG1_Y = -gSprites[spriteId].y + 32; paletteNum = 16 + gSprites[spriteId].oam.paletteNum; + if (gBattleAnimArgs[1] == 0) - SetGreyscaleOrOriginalPalette(paletteNum, FALSE); + SetGrayscaleOrOriginalPalette(paletteNum, FALSE); else - BlendPalette(PLTT_ID(paletteNum), 16, 11, gBattleAnimArgs[2]); + BlendPalette(BG_PLTT_ID(paletteNum), 16, 11, gBattleAnimArgs[2]); + gTasks[taskId].data[0] = newSpriteId; gTasks[taskId].data[1] = gBattleAnimArgs[0]; gTasks[taskId].data[2] = gBattleAnimArgs[1]; @@ -923,10 +986,11 @@ static void AnimTask_MetallicShine_Step(u8 taskId) spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); paletteNum = 16 + gSprites[spriteId].oam.paletteNum; if (gTasks[taskId].data[1] == 0) - SetGreyscaleOrOriginalPalette(paletteNum, 1); + SetGrayscaleOrOriginalPalette(paletteNum, TRUE); + DestroySprite(&gSprites[gTasks[taskId].data[0]]); GetBattleAnimBg1Data(&animBg); - InitBattleAnimBg(animBg.bgId); + ClearBattleAnimBg(animBg.bgId); if (gTasks[taskId].data[6] == 1) gSprites[gBattlerSpriteIds[BATTLE_PARTNER(gBattleAnimAttacker)]].oam.priority++; } @@ -938,6 +1002,7 @@ static void AnimTask_MetallicShine_Step(u8 taskId) SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ | WINOUT_WINOBJ_CLR | WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR); if (!IsContest()) SetAnimBgAttribute(1, BG_ANIM_CHAR_BASE_BLOCK, 0); + SetGpuReg(REG_OFFSET_DISPCNT, GetGpuReg(REG_OFFSET_DISPCNT) ^ DISPCNT_OBJWIN_ON); SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); @@ -946,12 +1011,13 @@ static void AnimTask_MetallicShine_Step(u8 taskId) } } -// Changes battler's palette to either greyscale or original. +// Changes battler's palette to either grayscale or original. // arg0: which battler -// arg1: 0 grayscale, 1 original +// arg1: FALSE grayscale, TRUE original void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId) { - u8 spriteId, battler; + u8 spriteId; + u8 battler; bool8 calcSpriteId = FALSE; u8 position = B_POSITION_PLAYER_LEFT; @@ -963,19 +1029,19 @@ void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId) case ANIM_DEF_PARTNER: spriteId = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); break; - case 4: + case ANIM_PLAYER_LEFT: position = B_POSITION_PLAYER_LEFT; calcSpriteId = TRUE; break; - case 5: + case ANIM_PLAYER_RIGHT: position = B_POSITION_PLAYER_RIGHT; calcSpriteId = TRUE; break; - case 6: + case ANIM_OPPONENT_LEFT: position = B_POSITION_OPPONENT_LEFT; calcSpriteId = TRUE; break; - case 7: + case ANIM_OPPONENT_RIGHT: position = B_POSITION_OPPONENT_RIGHT; calcSpriteId = TRUE; break; @@ -983,6 +1049,7 @@ void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId) spriteId = SPRITE_NONE; break; } + if (calcSpriteId) { battler = GetBattlerAtPosition(position); @@ -991,8 +1058,10 @@ void AnimTask_SetGrayscaleOrOriginalPal(u8 taskId) else spriteId = SPRITE_NONE; } + if (spriteId != SPRITE_NONE) - SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); + SetGrayscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, gBattleAnimArgs[1]); + DestroyAnimVisualTask(taskId); } @@ -1000,7 +1069,9 @@ void GetIsDoomDesireHitTurn(u8 taskId) { if (gAnimMoveTurn < 2) gBattleAnimArgs[ARG_RET_ID] = FALSE; + if (gAnimMoveTurn == 2) gBattleAnimArgs[ARG_RET_ID] = TRUE; + DestroyAnimVisualTask(taskId); } diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index 7b91af882..608dc2621 100644 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -2073,7 +2073,7 @@ void AnimTask_GrowAndGrayscale(u8 taskId) PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND); SetSpriteRotScale(spriteId, 0xD0, 0xD0, 0); - SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, FALSE); + SetGrayscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, FALSE); gTasks[taskId].data[0] = 80; gTasks[taskId].func = AnimTask_GrowAndGrayscale_Step; } @@ -2084,7 +2084,7 @@ static void AnimTask_GrowAndGrayscale_Step(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); ResetSpriteRotScale(spriteId); - SetGreyscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, TRUE); + SetGrayscaleOrOriginalPalette(gSprites[spriteId].oam.paletteNum + 16, TRUE); DestroyAnimVisualTask(taskId); } } @@ -3819,7 +3819,7 @@ static void AnimPerishSongMusicNote2(struct Sprite *sprite) } if (++sprite->data[0] == sprite->data[1]) - SetGreyscaleOrOriginalPalette(sprite->oam.paletteNum + 16, FALSE); + SetGrayscaleOrOriginalPalette(sprite->oam.paletteNum + 16, FALSE); if (sprite->data[0] == sprite->data[1] + 80) DestroyAnimSprite(sprite); diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 4900b1040..5bd5a2a28 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -1177,7 +1177,7 @@ u16 ArcTan2Neg(s16 a, s16 b) return -var; } -void SetGreyscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor) +void SetGrayscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor) { s32 i; struct PlttData *originalColor; diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index 848d14578..f78f88ca5 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -562,10 +562,10 @@ static void AnimDefensiveWall(struct Sprite *sprite) bool8 toBG2 = (rank ^ var0) != 0; if (IsBattlerSpriteVisible(battler)) - MoveBattlerSpriteToBG(battler, toBG2); + MoveBattlerSpriteToBG(battler, toBG2, FALSE); battler = BATTLE_PARTNER(battlerCopy); if (IsBattlerSpriteVisible(battler)) - MoveBattlerSpriteToBG(battler, toBG2 ^ var0); + MoveBattlerSpriteToBG(battler, toBG2 ^ var0, FALSE); } if (!IsContest() && IsDoubleBattle()) { diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 30921fafd..fb2eae88b 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1625,7 +1625,7 @@ static void Task_CreateLevelUpVerticalStripes(u8 taskId) u32 battlerIdAlt = battlerId; bool32 v6Alt = isOnBg2; - MoveBattlerSpriteToBG(battlerIdAlt, v6Alt); + MoveBattlerSpriteToBG(battlerIdAlt, v6Alt, FALSE); } ++data[15]; break;