From d937aaebb63b8c07d2ddf4c756cfc0833d368dc8 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 20 Jan 2025 23:27:08 +0100 Subject: [PATCH] expansion sync: battle_anim_psychic --- src/battle_anim_psychic.c | 250 +++++++++++++++++++++++++------------- 1 file changed, 163 insertions(+), 87 deletions(-) diff --git a/src/battle_anim_psychic.c b/src/battle_anim_psychic.c index f78f88ca5..a9c1f0cf6 100644 --- a/src/battle_anim_psychic.c +++ b/src/battle_anim_psychic.c @@ -1,36 +1,40 @@ #include "global.h" -#include "gflib.h" #include "battle_anim.h" +#include "gpu_regs.h" +#include "palette.h" +#include "sound.h" #include "scanline_effect.h" #include "trig.h" +#include "constants/rgb.h" #include "constants/songs.h" -static void AnimDefensiveWall(struct Sprite *sprite); -static void AnimWallSparkle(struct Sprite *sprite); -static void AnimBentSpoon(struct Sprite *sprite); -static void AnimQuestionMark(struct Sprite *sprite); -static void AnimRedX(struct Sprite *sprite); -static void AnimSkillSwapOrb(struct Sprite *sprite); -static void AnimDefensiveWall_Step2(struct Sprite *sprite); -static void AnimDefensiveWall_Step3(struct Sprite *sprite); -static void AnimDefensiveWall_Step4(struct Sprite *sprite); -static void AnimDefensiveWall_Step5(struct Sprite *sprite); -static void AnimQuestionMark_Step1(struct Sprite *sprite); -static void AnimQuestionMark_Step2(struct Sprite *sprite); -static void AnimTask_MeditateStretchAttacker_Step(u8 taskId); -static void AnimTask_Teleport_Step(u8 taskId); -static void AnimTask_ImprisonOrbs_Step(u8 taskId); -static void AnimTask_SkillSwap_Step(u8 taskId); +static void AnimDefensiveWall(struct Sprite *); +static void AnimDefensiveWall_Step1(struct Sprite *); +static void AnimDefensiveWall_Step2(struct Sprite *); +static void AnimDefensiveWall_Step3(struct Sprite *); +static void AnimDefensiveWall_Step4(struct Sprite *); +static void AnimDefensiveWall_Step5(struct Sprite *); +static void AnimWallSparkle(struct Sprite *); +static void AnimBentSpoon(struct Sprite *); +static void AnimQuestionMark(struct Sprite *); +static void AnimQuestionMark_Step1(struct Sprite *); +static void AnimQuestionMark_Step2(struct Sprite *); +static void AnimRedX(struct Sprite *); +static void AnimSkillSwapOrb(struct Sprite *); +static void AnimTask_MeditateStretchAttacker_Step(u8); +static void AnimTask_Teleport_Step(u8); +static void AnimTask_ImprisonOrbs_Step(u8); +static void AnimTask_SkillSwap_Step(u8); static void AnimTask_HeartSwap_Step(u8); -static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId); -static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId); +static void AnimTask_ExtrasensoryDistortion_Step(u8); +static void AnimTask_TransparentCloneGrowAndShrink_Step(u8); static void AnimateZenHeadbutt(struct Sprite *sprite); static void AnimPsychoCut(struct Sprite *sprite); static const union AffineAnimCmd sAffineAnim_PsychUpSpiral[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), - AFFINEANIMCMD_FRAME(-0x2, -0x2, -10, 120), + AFFINEANIMCMD_FRAME(0xFFFE, 0xFFFE, -10, 120), AFFINEANIMCMD_END, }; @@ -281,7 +285,7 @@ static const union AffineAnimCmd sAffineAnim_Teleport[] = AFFINEANIMCMD_END, }; -static const struct SpriteTemplate sImprisonOrbSpriteTemplate = +const struct SpriteTemplate gImprisonOrbSpriteTemplate = { .tileTag = ANIM_TAG_HOLLOW_ORB, .paletteTag = ANIM_TAG_HOLLOW_ORB, @@ -305,7 +309,7 @@ const struct SpriteTemplate gRedXSpriteTemplate = static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_0[] = { - AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 8), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 8), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), AFFINEANIMCMD_JUMP(0), }; @@ -313,27 +317,27 @@ static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_0[] = static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_1[] = { AFFINEANIMCMD_FRAME(0xF0, 0xF0, 0, 0), - AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 6), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 6), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), - AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 2), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 2), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_2[] = { AFFINEANIMCMD_FRAME(0xD0, 0xD0, 0, 0), - AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 4), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 4), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), - AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 4), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 4), AFFINEANIMCMD_JUMP(1), }; static const union AffineAnimCmd sAffineAnim_SkillSwapOrb_3[] = { AFFINEANIMCMD_FRAME(0xB0, 0xB0, 0, 0), - AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 2), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 2), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 8), - AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 6), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 6), AFFINEANIMCMD_JUMP(1), }; @@ -345,7 +349,7 @@ static const union AffineAnimCmd *const sAffineAnims_SkillSwapOrb[] = sAffineAnim_SkillSwapOrb_3, }; -static const struct SpriteTemplate sSkillSwapOrbSpriteTemplate = +const struct SpriteTemplate gSkillSwapOrbSpriteTemplate = { .tileTag = ANIM_TAG_BLUEGREEN_ORB, .paletteTag = ANIM_TAG_BLUEGREEN_ORB, @@ -396,11 +400,11 @@ static const union AffineAnimCmd sAffineAnim_PsychoBoostOrb_0[] = AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0), AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 17), AFFINEANIMCMD_LOOP(0), - AFFINEANIMCMD_FRAME(-0x8, -0x8, 0, 10), + AFFINEANIMCMD_FRAME(0xFFF8, 0xFFF8, 0, 10), AFFINEANIMCMD_FRAME(0x8, 0x8, 0, 10), AFFINEANIMCMD_LOOP(4), AFFINEANIMCMD_LOOP(0), - AFFINEANIMCMD_FRAME(-0x10, -0x10, 0, 5), + AFFINEANIMCMD_FRAME(0xFFF0, 0xFFF0, 0, 5), AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 5), AFFINEANIMCMD_LOOP(7), AFFINEANIMCMD_END, @@ -408,7 +412,7 @@ static const union AffineAnimCmd sAffineAnim_PsychoBoostOrb_0[] = static const union AffineAnimCmd sAffineAnim_PsychoBoostOrb_1[] = { - AFFINEANIMCMD_FRAME(-0x14, 0x18, 0, 15), + AFFINEANIMCMD_FRAME(0xFFEC, 0x18, 0, 15), AFFINEANIMCMD_END, }; @@ -548,26 +552,31 @@ static void AnimateZenHeadbutt(struct Sprite *sprite) // For the rectangular wall sprite used by Reflect, Mirror Coat, etc static void AnimDefensiveWall(struct Sprite *sprite) { - if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest()) + u8 isContest = IsContest(); + + if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || isContest) { sprite->oam.priority = 2; sprite->subpriority = 200; } - if (!IsContest()) + + if (!isContest) { u8 battlerCopy; u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); u8 rank = GetBattlerSpriteBGPriorityRank(battler); - s32 var0 = 1; - bool8 toBG2 = (rank ^ var0) != 0; + int var0 = 1; + u8 toBG_2 = (rank ^ var0) != 0; if (IsBattlerSpriteVisible(battler)) - MoveBattlerSpriteToBG(battler, toBG2, FALSE); + MoveBattlerSpriteToBG(battler, toBG_2, FALSE); + battler = BATTLE_PARTNER(battlerCopy); if (IsBattlerSpriteVisible(battler)) - MoveBattlerSpriteToBG(battler, toBG2 ^ var0, FALSE); + MoveBattlerSpriteToBG(battler, toBG_2 ^ var0, FALSE); } - if (!IsContest() && IsDoubleBattle()) + + if (!isContest && IsDoubleBattle()) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { @@ -584,41 +593,71 @@ static void AnimDefensiveWall(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y) + gBattleAnimArgs[1]; } - if (IsContest()) - sprite->y += 9; + sprite->data[0] = OBJ_PLTT_ID(IndexOfSpritePaletteTag(gBattleAnimArgs[2])); + + if (isContest) + { + sprite->y += 9; + sprite->callback = AnimDefensiveWall_Step2; + sprite->callback(sprite); + } + else + { + sprite->callback = AnimDefensiveWall_Step1; + } +} + +static void AnimDefensiveWall_Step1(struct Sprite *sprite) +{ + u8 battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + if (!sprite->data[7]) + { + sprite->data[7] = 1; + return; + } + + if (IsBattlerSpriteVisible(battler)) + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + + battler = BATTLE_PARTNER(battler); + if (IsBattlerSpriteVisible(battler)) + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + sprite->callback = AnimDefensiveWall_Step2; sprite->callback(sprite); } -// AnimDefensiveWall_Step1 is removed in FRLG from the removal of Contest handling - static void AnimDefensiveWall_Step2(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); if (sprite->data[3] == 13) sprite->callback = AnimDefensiveWall_Step3; else - ++sprite->data[3]; + sprite->data[3]++; } static void AnimDefensiveWall_Step3(struct Sprite *sprite) { u16 color; u16 startOffset; - s32 i; + int i; if (++sprite->data[1] == 2) { sprite->data[1] = 0; startOffset = sprite->data[0]; color = gPlttBufferFaded[startOffset + 8]; - for (i = 8; i > 0; --i) + + for (i = 8; i > 0; i--) gPlttBufferFaded[startOffset + i] = gPlttBufferFaded[startOffset + i - 1]; + gPlttBufferFaded[startOffset + 1] = color; + if (++sprite->data[2] == 16) sprite->callback = AnimDefensiveWall_Step4; } @@ -627,6 +666,7 @@ static void AnimDefensiveWall_Step3(struct Sprite *sprite) static void AnimDefensiveWall_Step4(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[3], 16 - sprite->data[3])); + if (--sprite->data[3] == -1) { if (!IsContest()) @@ -636,10 +676,12 @@ static void AnimDefensiveWall_Step4(struct Sprite *sprite) if (IsBattlerSpriteVisible(battler)) gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; + battler = BATTLE_PARTNER(battlerCopy); if (IsBattlerSpriteVisible(battler)) gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; } + sprite->invisible = TRUE; sprite->callback = AnimDefensiveWall_Step5; } @@ -652,15 +694,17 @@ static void AnimDefensiveWall_Step5(struct Sprite *sprite) u8 battlerCopy; u8 battler = battlerCopy = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); u8 rank = GetBattlerSpriteBGPriorityRank(battler); - s32 var0 = 1; + int var0 = 1; bool8 toBG2 = (rank ^ var0) != 0; if (IsBattlerSpriteVisible(battler)) ResetBattleAnimBg(toBG2); - battler = battlerCopy ^ 2; + + battler = BATTLE_PARTNER(battlerCopy); if (IsBattlerSpriteVisible(battler)) ResetBattleAnimBg(toBG2 ^ var0); } + sprite->callback = DestroyAnimSprite; } @@ -673,6 +717,7 @@ static void AnimWallSparkle(struct Sprite *sprite) bool8 respectMonPicOffsets = FALSE; if (!ignoreOffsets) respectMonPicOffsets = TRUE; + if (!IsContest() && IsDoubleBattle()) { if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) @@ -688,17 +733,18 @@ static void AnimWallSparkle(struct Sprite *sprite) } else { - if (gBattleAnimArgs[2] == 0) + if (gBattleAnimArgs[2] == ANIM_ATTACKER) InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); else InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); } - ++sprite->data[0]; + sprite->data[0]++; } - else if (sprite->animEnded || sprite->affineAnimEnded) + else { - DestroySpriteAndMatrix(sprite); + if (sprite->animEnded || sprite->affineAnimEnded) + DestroySpriteAndMatrix(sprite); } } @@ -706,6 +752,7 @@ static void AnimBentSpoon(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { StartSpriteAnim(sprite, 1); @@ -719,6 +766,7 @@ static void AnimBentSpoon(struct Sprite *sprite) sprite->y -= 10; sprite->data[1] = 1; } + StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = RunStoredCallbackWhenAnimEnds; } @@ -731,10 +779,13 @@ static void AnimQuestionMark(struct Sprite *sprite) if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) x = -x; + sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + x; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + y; + if (sprite->y < 16) sprite->y = 16; + StoreSpriteCallbackInData6(sprite, AnimQuestionMark_Step1); sprite->callback = RunStoredCallbackWhenAnimEnds; } @@ -758,7 +809,7 @@ static void AnimQuestionMark_Step2(struct Sprite *sprite) FreeOamMatrix(sprite->oam.matrixNum); sprite->oam.affineMode = ST_OAM_AFFINE_OFF; sprite->data[1] = 18; - ++sprite->data[0]; + sprite->data[0]++; } break; case 1: @@ -772,7 +823,6 @@ void AnimTask_MeditateStretchAttacker(u8 taskId) { struct Task *task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); - task->data[0] = spriteId; PrepareAffineAnimInTaskData(task, spriteId, sAffineAnim_MeditateStretchAttacker); task->func = AnimTask_MeditateStretchAttacker_Step; @@ -788,11 +838,11 @@ void AnimTask_Teleport(u8 taskId) { struct Task *task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_ATTACKER); - task->data[0] = spriteId; task->data[1] = 0; task->data[2] = 0; task->data[3] = GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER ? 4 : 8; + PrepareAffineAnimInTaskData(task, task->data[0], sAffineAnim_Teleport); task->func = AnimTask_Teleport_Step; } @@ -806,13 +856,13 @@ static void AnimTask_Teleport_Step(u8 taskId) case 0: RunAffineAnimFromTaskData(task); if (++task->data[2] > 19) - ++task->data[1]; + task->data[1]++; break; case 1: if (task->data[3] != 0) { gSprites[task->data[0]].y2 -= 8; - --task->data[3]; + task->data[3]--; } else { @@ -828,17 +878,21 @@ static void AnimTask_Teleport_Step(u8 taskId) void AnimTask_ImprisonOrbs(u8 taskId) { u16 var0, var1; + struct Task *task = &gTasks[taskId]; task->data[3] = 16; task->data[4] = 0; task->data[13] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); task->data[14] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); + var0 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_WIDTH) / 3; var1 = GetBattlerSpriteCoordAttr(gBattleAnimAttacker, BATTLER_COORD_ATTR_HEIGHT) / 3; task->data[12] = var0 > var1 ? var0 : var1; + SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16, 0)); + task->func = AnimTask_ImprisonOrbs_Step; } @@ -854,7 +908,7 @@ static void AnimTask_ImprisonOrbs_Step(u8 taskId) if (++task->data[1] > 8) { task->data[1] = 0; - spriteId = CreateSprite(&sImprisonOrbSpriteTemplate, task->data[13], task->data[14], 0); + spriteId = CreateSprite(&gImprisonOrbSpriteTemplate, task->data[13], task->data[14], 0); task->data[task->data[2] + 8] = spriteId; if (spriteId != MAX_SPRITES) { @@ -880,25 +934,29 @@ static void AnimTask_ImprisonOrbs_Step(u8 taskId) } if (++task->data[2] == 5) - ++task->data[0]; + task->data[0]++; } break; case 1: if (task->data[1] & 1) - --task->data[3]; + task->data[3]--; else - ++task->data[4]; + task->data[4]++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(task->data[3], task->data[4])); if (++task->data[1] == 32) { - for (i = 8; i < 13; ++i) + for (i = 8; i < 13; i++) + { if (task->data[i] != MAX_SPRITES) DestroySprite(&gSprites[task->data[i]]); - ++task->data[0]; + } + + task->data[0]++; } break; case 2: - ++task->data[0]; + task->data[0]++; break; case 3: SetGpuReg(REG_OFFSET_BLDALPHA, 0); @@ -912,18 +970,21 @@ static void AnimRedX_Step(struct Sprite *sprite) { if (sprite->data[1] > sprite->data[0] - 10) sprite->invisible = sprite->data[1] & 1; + if (sprite->data[1] == sprite->data[0]) DestroyAnimSprite(sprite); - ++sprite->data[1]; + + sprite->data[1]++; } static void AnimRedX(struct Sprite *sprite) { - if (gBattleAnimArgs[0] == 0) + if (gBattleAnimArgs[0] == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); } + sprite->data[0] = gBattleAnimArgs[1]; sprite->callback = AnimRedX_Step; } @@ -953,7 +1014,7 @@ void AnimTask_SkillSwap(u8 taskId) } else { - if (gBattleAnimArgs[0] == 1) + if (gBattleAnimArgs[0] == ANIM_TARGET) { task->data[10] = -10; task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_LEFT) + 8; @@ -970,6 +1031,7 @@ void AnimTask_SkillSwap(u8 taskId) task->data[14] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_BOTTOM) - 8; } } + task->data[1] = 6; task->func = AnimTask_SkillSwap_Step; } @@ -1034,19 +1096,20 @@ static void AnimTask_SkillSwap_Step(u8 taskId) if (++task->data[1] > 6) { task->data[1] = 0; - spriteId = CreateSprite(&sSkillSwapOrbSpriteTemplate, task->data[11], task->data[12], 0); - if (spriteId != 64) + spriteId = CreateSprite(&gSkillSwapOrbSpriteTemplate, task->data[11], task->data[12], 0); + if (spriteId != MAX_SPRITES) { gSprites[spriteId].data[0] = 16; gSprites[spriteId].data[2] = task->data[13]; gSprites[spriteId].data[4] = task->data[14]; gSprites[spriteId].data[5] = task->data[10]; + InitAnimArcTranslation(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3); } if (++task->data[2] == 12) - ++task->data[0]; + task->data[0]++; } break; case 1: @@ -1109,9 +1172,10 @@ void AnimTask_ExtrasensoryDistortion(u8 taskId) u8 yOffset; struct ScanlineEffectParams scanlineParams; struct Task *task = &gTasks[taskId]; - + yOffset = GetBattlerYCoordWithElevation(gBattleAnimTarget); task->data[14] = yOffset - 32; + switch (gBattleAnimArgs[0]) { case 0: @@ -1133,8 +1197,10 @@ void AnimTask_ExtrasensoryDistortion(u8 taskId) task->data[15] = yOffset + 32; break; } + if (task->data[14] < 0) task->data[14] = 0; + if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1) { task->data[10] = gBattle_BG1_X; @@ -1145,11 +1211,13 @@ void AnimTask_ExtrasensoryDistortion(u8 taskId) task->data[10] = gBattle_BG2_X; scanlineParams.dmaDest = ®_BG2HOFS; } - for (i = task->data[14]; i <= task->data[14] + 64; ++i) + + for (i = task->data[14]; i <= task->data[14] + 64; i++) { gScanlineEffectRegBuffers[0][i] = task->data[10]; gScanlineEffectRegBuffers[1][i] = task->data[10]; } + scanlineParams.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT; scanlineParams.initState = 1; scanlineParams.unused9 = 0; @@ -1166,24 +1234,27 @@ static void AnimTask_ExtrasensoryDistortion_Step(u8 taskId) { case 0: sineIndex = task->data[13]; - for (i = task->data[14]; i <= task->data[15]; ++i) + i = task->data[14]; + while (i <= task->data[15]) { s16 var2 = (gSineTable[sineIndex] >> task->data[12]); - if (var2 > 0) var2 += (task->data[1] & 3); else if (var2 < 0) var2 -= (task->data[1] & 3); + gScanlineEffectRegBuffers[0][i] = task->data[10] + var2; gScanlineEffectRegBuffers[1][i] = task->data[10] + var2; sineIndex += task->data[11]; + i++; } + if (++task->data[1] > 23) - ++task->data[0]; + task->data[0]++; break; case 1: gScanlineEffect.state = 3; - ++task->data[0]; + task->data[0]++; break; case 2: DestroyAnimVisualTask(taskId); @@ -1198,13 +1269,14 @@ void AnimTask_TransparentCloneGrowAndShrink(u8 taskId) s16 spriteId; s16 matrixNum; struct Task *task = &gTasks[taskId]; - + matrixNum = AllocOamMatrix(); if (matrixNum == 0xFF) { DestroyAnimVisualTask(taskId); return; } + spriteId = CloneBattlerSpriteWithBlend(gBattleAnimArgs[0]); if (spriteId < 0) { @@ -1212,11 +1284,12 @@ void AnimTask_TransparentCloneGrowAndShrink(u8 taskId) DestroyAnimVisualTask(taskId); return; } + gSprites[spriteId].callback = SpriteCallbackDummy; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; gSprites[spriteId].oam.matrixNum = matrixNum; - gSprites[spriteId].affineAnimPaused = TRUE; - ++gSprites[spriteId].subpriority; + gSprites[spriteId].affineAnimPaused = 1; + gSprites[spriteId].subpriority++; SetSpriteRotScale(spriteId, 256, 256, 0); CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); task->data[13] = GetAnimBattlerSpriteId(gBattleAnimArgs[0]); @@ -1237,7 +1310,7 @@ static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId) SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0); SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]); if (task->data[1] == 48) - ++task->data[0]; + task->data[0]++; break; case 1: task->data[1] -= 4; @@ -1245,11 +1318,11 @@ static void AnimTask_TransparentCloneGrowAndShrink_Step(u8 taskId) SetSpriteRotScale(task->data[15], task->data[2], task->data[2], 0); SetBattlerSpriteYOffsetFromOtherYScale(task->data[15], task->data[13]); if (task->data[1] == 0) - ++task->data[0]; + task->data[0]++; break; case 2: DestroySpriteWithActiveSheet(&gSprites[task->data[15]]); - ++task->data[0]; + task->data[0]++; break; case 3: FreeOamMatrix(task->data[14]); @@ -1265,33 +1338,36 @@ void AnimPsychoBoost(struct Sprite *sprite) case 0: sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); + if (IsContest()) sprite->y += 12; + sprite->data[1] = 8; SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1])); - ++sprite->data[0]; + sprite->data[0]++; break; case 1: if (sprite->affineAnimEnded) { - PlaySE12WithPanning(SE_M_TELEPORT, BattleAnimAdjustPanning(-64)); + PlaySE12WithPanning(SE_M_TELEPORT, BattleAnimAdjustPanning(SOUND_PAN_ATTACKER)); ChangeSpriteAffineAnim(sprite, 1); - ++sprite->data[0]; + sprite->data[0]++; } break; case 2: if (sprite->data[2]++ > 1) { sprite->data[2] = 0; - --sprite->data[1]; + sprite->data[1]--; SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[1], 16 - sprite->data[1])); if (sprite->data[1] == 0) { - ++sprite->data[0]; + sprite->data[0]++; sprite->invisible = TRUE; } } + sprite->data[3] += 0x380; sprite->y2 -= sprite->data[3] >> 8; sprite->data[3] &= 0xFF;