expansion sync: battle_anim_status_effects

This commit is contained in:
cawtds
2025-01-20 23:39:19 +01:00
parent 204f56c430
commit 44bbb77933

View File

@@ -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;