mirror of
https://github.com/pret/pokefirered.git
synced 2026-09-30 04:48:36 -05:00
expansion sync: battle_anim_status_effects
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user