From 44bbb7793315758a952bc9d19a5578b9fb4ba2ae Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 20 Jan 2025 23:39:19 +0100 Subject: [PATCH] expansion sync: battle_anim_status_effects --- src/battle_anim_status_effects.c | 174 +++++++++++++++++++++++++------ 1 file changed, 140 insertions(+), 34 deletions(-) diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index cd49c2e73..f746f186a 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -1,14 +1,22 @@ #include "global.h" -#include "gflib.h" #include "battle.h" #include "battle_anim.h" #include "decompress.h" +#include "gpu_regs.h" +#include "palette.h" +#include "sprite.h" #include "task.h" #include "trig.h" #include "util.h" #include "constants/battle_anim.h" -#include "constants/pokemon.h" +#include "constants/rgb.h" +extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; +extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; +extern const struct OamData gOamData_AffineOff_ObjNormal_8x8; +extern const struct OamData gOamData_AffineOff_ObjBlend_64x64; + +static void Task_UpdateFlashingCircleImpacts(u8 taskId); static void AnimTask_FrozenIceCube_Step1(u8 taskId); static void AnimTask_FrozenIceCube_Step2(u8 taskId); static void AnimTask_FrozenIceCube_Step3(u8 taskId); @@ -148,7 +156,7 @@ static const union AnimCmd *const sAnims_FlickeringImpact[] = { sAnim_FlickeringImpact_0, sAnim_FlickeringImpact_1, - sAnim_FlickeringImpact_2 + sAnim_FlickeringImpact_2, }; // Unused @@ -198,20 +206,45 @@ static const struct SpriteTemplate sFlickeringShrinkOrbSpriteTemplate = .callback = AnimTranslateLinearAndFlicker_Flipped, }; -// Presumably some debug text -static const u8 sText_TaskOver[] = _("TASK OVER\nタスクがオ-バ-しました"); - static const struct Subsprite sFrozenIceCubeSubsprites[] = { - {.x = -16, .y = -16, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .tileOffset = 0, .priority = 2}, - {.x = -16, .y = 48, .shape = SPRITE_SHAPE(64x32), .size = SPRITE_SIZE(64x32), .tileOffset = 64, .priority = 2}, - {.x = 48, .y = -16, .shape = SPRITE_SHAPE(32x64), .size = SPRITE_SIZE(32x64), .tileOffset = 96, .priority = 2}, - {.x = 48, .y = 48, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .tileOffset = 128, .priority = 2}, + { + .x = -16, + .y = -16, + .shape = SPRITE_SHAPE(64x64), + .size = SPRITE_SIZE(64x64), + .tileOffset = 0, + .priority = 2 + }, + { + .x = -16, + .y = 48, + .shape = SPRITE_SHAPE(64x32), + .size = SPRITE_SIZE(64x32), + .tileOffset = 64, + .priority = 2 + }, + { + .x = 48, + .y = -16, + .shape = SPRITE_SHAPE(32x64), + .size = SPRITE_SIZE(32x64), + .tileOffset = 96, + .priority = 2 + }, + { + .x = 48, + .y = 48, + .shape = SPRITE_SHAPE(32x32), + .size = SPRITE_SIZE(32x32), + .tileOffset = 128, + .priority = 2 + }, }; static const struct SubspriteTable sFrozenIceCubeSubspriteTable[] = { - {NELEMS(sFrozenIceCubeSubsprites), sFrozenIceCubeSubsprites}, + {ARRAY_COUNT(sFrozenIceCubeSubsprites), sFrozenIceCubeSubsprites}, }; static const struct SpriteTemplate sFrozenIceCubeSpriteTemplate = @@ -236,13 +269,86 @@ static const struct SpriteTemplate sFlashingCircleImpactSpriteTemplate = .callback = AnimFlashingCircleImpact, }; +static u8 UNUSED Task_FlashingCircleImpacts(u8 battlerId, bool8 red) +{ + u8 battlerSpriteId = gBattlerSpriteIds[battlerId]; + u8 taskId = CreateTask(Task_UpdateFlashingCircleImpacts, 10); + u8 spriteId; + u8 i; + + LoadCompressedSpriteSheetUsingHeap(&gBattleAnimPicTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); + LoadCompressedSpritePaletteUsingHeap(&gBattleAnimPaletteTable[GET_TRUE_SPRITE_INDEX(ANIM_TAG_CIRCLE_IMPACT)]); + gTasks[taskId].data[0] = battlerId; + if (red) + { + gTasks[taskId].data[1] = RGB_RED; + for (i = 0; i < 10; i++) + { + spriteId = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y + 32, 0); + gSprites[spriteId].data[0] = i * 51; + gSprites[spriteId].data[1] = -256; + gSprites[spriteId].invisible = TRUE; + if (i > 4) + gSprites[spriteId].data[6] = 21; + } + } + else + { + gTasks[taskId].data[1] = RGB_BLUE; + for (i = 0; i < 10; i++) + { + spriteId = CreateSprite(&sFlashingCircleImpactSpriteTemplate, gSprites[battlerSpriteId].x, gSprites[battlerSpriteId].y - 32, 0); + gSprites[spriteId].data[0] = i * 51; + gSprites[spriteId].data[1] = 256; + gSprites[spriteId].invisible = TRUE; + if (i > 4) + gSprites[spriteId].data[6] = 21; + } + } + gSprites[spriteId].data[7] = 1; + return taskId; +} + +static void Task_UpdateFlashingCircleImpacts(u8 taskId) +{ + if (gTasks[taskId].data[2] == 2) + { + gTasks[taskId].data[2] = 0; + BlendPalette(OBJ_PLTT_ID(gTasks[taskId].data[0]), 16, gTasks[taskId].data[4], gTasks[taskId].data[1]); + if (gTasks[taskId].data[5] == 0) + { + gTasks[taskId].data[4]++; + if (gTasks[taskId].data[4] > 8) + gTasks[taskId].data[5] ^= 1; + } + else + { + u16 var = gTasks[taskId].data[4]; + + gTasks[taskId].data[4]--; + if (gTasks[taskId].data[4] < 0) + { + gTasks[taskId].data[4] = var; + gTasks[taskId].data[5] ^= 1; + gTasks[taskId].data[3]++; + if (gTasks[taskId].data[3] == 2) + DestroyTask(taskId); + } + } + } + else + { + gTasks[taskId].data[2]++; + } +} + static void AnimFlashingCircleImpact(struct Sprite *sprite) { if (sprite->data[6] == 0) { sprite->invisible = FALSE; sprite->callback = AnimFlashingCircleImpact_Step; - sprite->callback(sprite); + AnimFlashingCircleImpact_Step(sprite); } else { @@ -292,28 +398,28 @@ void AnimTask_FrozenIceCubeAttacker(u8 taskId) void AnimTask_CentredFrozenIceCube(u8 taskId) { // same as AnimTask_FrozenIceCube but center position on target(s) - s16 x, y; - u8 spriteId; - u8 battler1 = gBattleAnimTarget; - u8 battler2 = BATTLE_PARTNER(battler1); + s16 x, y; + u8 spriteId; + u8 battler1 = gBattleAnimTarget; + u8 battler2 = BATTLE_PARTNER(battler1); - if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget)) - { - x = GetBattlerSpriteCoord(battler1, BATTLER_COORD_X_2); - y = GetBattlerSpriteCoord(battler1, BATTLER_COORD_Y_PIC_OFFSET); - } - else - { - x = (GetBattlerSpriteCoord(battler1, BATTLER_COORD_X_2) + GetBattlerSpriteCoord(battler2, BATTLER_COORD_X_2)) / 2; - y = (GetBattlerSpriteCoord(battler1, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoord(battler2, BATTLER_COORD_Y_PIC_OFFSET)) / 2; - } + if (!IsDoubleBattle() || IsAlly(gBattleAnimAttacker, gBattleAnimTarget)) + { + x = GetBattlerSpriteCoord(battler1, BATTLER_COORD_X_2); + y = GetBattlerSpriteCoord(battler1, BATTLER_COORD_Y_PIC_OFFSET); + } + else + { + x = (GetBattlerSpriteCoord(battler1, BATTLER_COORD_X_2) + GetBattlerSpriteCoord(battler2, BATTLER_COORD_X_2)) / 2; + y = (GetBattlerSpriteCoord(battler1, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoord(battler2, BATTLER_COORD_Y_PIC_OFFSET)) / 2; + } - x -= 32; - y -= 36; + x -= 32; + y -= 36; - spriteId = CreateSprite(&sFrozenIceCubeSpriteTemplate, x, y, 4); - if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == 0xFFFF) - gSprites[spriteId].invisible = TRUE; + spriteId = CreateSprite(&sFrozenIceCubeSpriteTemplate, x, y, 4); + if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == 0xFFFF) + gSprites[spriteId].invisible = TRUE; SetSubspriteTables(&gSprites[spriteId], sFrozenIceCubeSubspriteTable); gTasks[taskId].data[15] = spriteId; @@ -328,13 +434,11 @@ void AnimTask_FrozenIceCube(u8 taskId) if (IsContest()) x -= 6; - SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 16)); spriteId = CreateSprite(&sFrozenIceCubeSpriteTemplate, x, y, 4); if (GetSpriteTileStartByTag(ANIM_TAG_ICE_CUBE) == 0xFFFF) gSprites[spriteId].invisible = TRUE; - SetSubspriteTables(&gSprites[spriteId], sFrozenIceCubeSubspriteTable); gTasks[taskId].data[15] = spriteId; gTasks[taskId].func = AnimTask_FrozenIceCube_Step1; @@ -479,9 +583,11 @@ void AnimTask_StatsChange(u8 taskId) gBattleAnimArgs[3] = FALSE; // Whether it hits multiple battlers gBattleAnimArgs[4] = sharply; gTasks[taskId].func = InitStatsChangeAnimation; - InitStatsChangeAnimation(taskId); + gTasks[taskId].func(taskId); } +#undef CASE + void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId) { u8 taskId;