pokeemerald/src/battle_anim_effects_1.c

5612 lines
152 KiB
C
Raw Normal View History

2018-12-16 18:35:10 +01:00
#include "global.h"
#include "malloc.h"
2018-12-16 18:35:10 +01:00
#include "battle_anim.h"
#include "battle_interface.h"
2018-12-18 04:56:34 +01:00
#include "decompress.h"
2018-12-16 18:35:10 +01:00
#include "gpu_regs.h"
2018-12-18 04:56:34 +01:00
#include "graphics.h"
#include "main.h"
#include "math_util.h"
2018-12-16 18:35:10 +01:00
#include "palette.h"
#include "random.h"
2018-12-18 04:56:34 +01:00
#include "scanline_effect.h"
2018-12-16 18:35:10 +01:00
#include "sound.h"
#include "trig.h"
#include "util.h"
#include "constants/rgb.h"
#include "constants/songs.h"
EWRAM_DATA s16 gUnknown_0203A0F8[4] = {0};
void AnimMovePowderParticle(struct Sprite *);
2018-12-20 04:13:26 +01:00
void AnimPowerAbsorptionOrb(struct Sprite *);
void AnimSolarbeamBigOrb(struct Sprite *);
void AnimSolarbeamSmallOrb(struct Sprite *);
void AnimAbsorptionOrb(struct Sprite *);
void AnimHyperBeamOrb(struct Sprite *);
void AnimSporeParticle(struct Sprite *);
void AnimPetalDanceBigFlower(struct Sprite *);
void AnimPetalDanceSmallFlower(struct Sprite *);
void AnimRazorLeafParticle(struct Sprite *);
2018-12-16 18:35:10 +01:00
void AnimLeechSeed(struct Sprite *);
void AnimTranslateLinearSingleSineWave(struct Sprite *);
void AnimMoveTwisterParticle(struct Sprite *);
2018-12-20 04:13:26 +01:00
void AnimConstrictBinding(struct Sprite *);
void AnimMimicOrb(struct Sprite *);
void AnimIngrainRoot(struct Sprite *);
void AnimFrenzyPlantRoot(struct Sprite *);
void AnimIngrainOrb(struct Sprite *);
void AnimPresent(struct Sprite *);
void AnimKnockOffItem(struct Sprite *);
void AnimPresentHealParticle(struct Sprite *);
void AnimItemSteal(struct Sprite *);
void AnimTrickBag(struct Sprite *);
void AnimFlyingParticle(struct Sprite *);
2019-10-14 21:17:38 +02:00
void AnimNeedleArmSpike(struct Sprite *);
2018-12-16 18:35:10 +01:00
void sub_81009F8(struct Sprite *);
2019-10-14 22:42:15 +02:00
void AnimWhipHit(struct Sprite *);
2018-12-16 18:35:10 +01:00
void sub_8100A94(struct Sprite *);
void AnimCuttingSlice(struct Sprite *);
void AnimAirCutterSlice(struct Sprite *);
2018-12-16 18:35:10 +01:00
void sub_8100E1C(struct Sprite *);
void AnimProtect(struct Sprite *);
2019-10-14 21:17:38 +02:00
void AnimMilkBottle(struct Sprite *);
void AnimGrantingStars(struct Sprite *);
void AnimSparkingStars(struct Sprite *);
2018-12-16 18:35:10 +01:00
void sub_8101440(struct Sprite *);
void AnimSleepLetterZ(struct Sprite *);
void AnimLockOnTarget(struct Sprite *);
2019-10-14 21:17:38 +02:00
void AnimLockOnMoveTarget(struct Sprite *);
void AnimInclineMon(struct Sprite *);
2018-12-16 18:35:10 +01:00
void sub_8101B90(struct Sprite *);
void AnimSlashSlice(struct Sprite *);
void AnimFalseSwipeSlice(struct Sprite *);
void AnimFalseSwipePositionnedSlice(struct Sprite *);
void AnimEndureEnergy(struct Sprite *);
void AnimSharpenSphere(struct Sprite *);
void AnimConversion(struct Sprite *);
2019-10-14 21:17:38 +02:00
void AnimConversion2(struct Sprite *);
void AnimMoon(struct Sprite *);
void AnimMoonlightSparkle(struct Sprite *);
void AnimHornHit(struct Sprite *);
void AnimSuperFang(struct Sprite *);
void AnimWavingMusicNotes(struct Sprite *);
void AnimFlyingMusicNotes(struct Sprite *);
void AnimBellyDrumHand(struct Sprite *);
void AnimSlowFlyingMusicNotes(struct Sprite *);
2019-10-14 21:17:38 +02:00
void AnimThroughtBubble(struct Sprite *);
void AnimMetronomeFinger(struct Sprite *);
2019-10-14 21:17:38 +02:00
void AnimFollowMeFinger(struct Sprite *);
void AnimTauntFinger(struct Sprite *);
2018-12-16 18:35:10 +01:00
static void AnimMovePowderParticleStep(struct Sprite *);
2018-12-20 04:13:26 +01:00
static void AnimSolarbeamSmallOrbStep(struct Sprite *);
static void AnimAbsorptionOrbStep(struct Sprite *);
static void AnimHyperBeamOrbStep(struct Sprite *);
2018-12-16 18:35:10 +01:00
static void AnimLeechSeedStep(struct Sprite *);
static void AnimLeechSeedSprouts(struct Sprite *);
2018-12-20 04:13:26 +01:00
static void AnimSporeParticleStep(struct Sprite *);
static void AnimPetalDanceBigFlowerStep(struct Sprite *);
static void AnimPetalDanceSmallFlowerStep(struct Sprite *);
static void AnimRazorLeafParticleStep1(struct Sprite *);
static void AnimRazorLeafParticleStep2(struct Sprite *);
2018-12-16 18:35:10 +01:00
static void AnimTranslateLinearSingleSineWaveStep(struct Sprite *);
static void AnimMoveTwisterParticleStep(struct Sprite *);
2018-12-20 04:13:26 +01:00
static void AnimConstrictBindingStep1(struct Sprite *);
static void AnimConstrictBindingStep2(struct Sprite *);
2019-10-14 22:42:15 +02:00
static void AnimTask_DuplicateAndShrinkToPosStep1(u8);
static void AnimTask_DuplicateAndShrinkToPosStep2(u8);
static void AnimItemStealStep1(struct Sprite *);
2018-12-20 04:13:26 +01:00
static void AnimRootFlickerOut(struct Sprite *);
static void AnimTrickBagStep1(struct Sprite *);
static void AnimTrickBagStep2(struct Sprite *);
static void AnimTrickBagStep3(struct Sprite *);
static void AnimTask_LeafBladeStep1(u8);
static s16 AnimTask_LeafBladeStep2(struct Sprite *);
static void AnimTask_LeafBladeStep3(struct Task *, u8);
static void AnimTask_LeafBladeStep4(struct Sprite *);
static void AnimFlyingParticleStep(struct Sprite *);
static void AnimNeedleArmSpikeStep(struct Sprite *);
2018-12-16 18:35:10 +01:00
static void AnimSliceStep(struct Sprite *);
static void sub_8100E80(struct Sprite *);
static void AnimProtectStep(struct Sprite *);
static void AnimMilkBottleStep1(struct Sprite *);
static void AnimMilkBottleStep2(struct Sprite *, int, int);
2018-12-16 18:35:10 +01:00
static void sub_81014A0(struct Sprite *);
static void AnimSleepLetterZStep(struct Sprite *);
static void AnimLockOnTargetStep1(struct Sprite *);
static void AnimLockOnTargetStep2(struct Sprite *);
static void AnimLockOnTargetStep3(struct Sprite *);
static void AnimLockOnTargetStep4(struct Sprite *);
static void AnimLockOnTargetStep5(struct Sprite *);
static void AnimLockOnTargetStep6(struct Sprite *);
static void AnimInclineMonStep1(struct Sprite *);
static void AnimInclineMonStep1_Callback(struct Sprite *);
static void AnimInclineMonStep2(struct Sprite *);
static void AnimInclineMonStep3(struct Sprite *);
static void AnimInclineMonStep4(struct Sprite *);
static void AnimInclineMonStep3_Callback(struct Sprite *);
2018-12-16 18:35:10 +01:00
static void sub_8101BA0(struct Sprite *);
static void AnimTask_SkullBashPositionSet(u8);
static void AnimTask_SkullBashPositionReset(u8);
static void AnimFalseSwipeSliceStep1(struct Sprite *);
static void AnimFalseSwipeSliceStep2(struct Sprite *);
static void AnimFalseSwipeSliceStep3(struct Sprite *);
static void AnimEndureEnergyStep(struct Sprite *);
static void AnimSharpenSphereStep(struct Sprite *);
static void AnimConversion2Step(struct Sprite *);
static void AnimMoonStep(struct Sprite *);
static void AnimMoonlightSparkleStep(struct Sprite *);
static void AnimHornHitStep(struct Sprite *);
static void AnimTask_DoubleTeamStep1(u8);
static void AnimTask_DoubleTeamStep2(struct Sprite *);
static void AnimWavingMusicNotesStep1(s16, s16, s16 *, s16 *, s8);
static void AnimWavingMusicNotesStep2(struct Sprite *);
static void AnimFlyingMusicNotesStep(struct Sprite *);
static void AnimSlowFlyingMusicNotesStep(struct Sprite *);
static void AnimThroughtBubbleStep(struct Sprite *);
static void AnimMetronomeFingerStep(struct Sprite *);
static void AnimFollowMeFingerStep1(struct Sprite *);
static void AnimFollowMeFingerStep2(struct Sprite *);
static void AnimTauntFingerStep1(struct Sprite *);
static void AnimTauntFingerStep2(struct Sprite *);
2018-12-16 18:35:10 +01:00
const union AnimCmd gPowderParticlesAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_FRAME(2, 5),
ANIMCMD_FRAME(4, 5),
ANIMCMD_FRAME(6, 5),
ANIMCMD_FRAME(8, 5),
ANIMCMD_FRAME(10, 5),
ANIMCMD_FRAME(12, 5),
ANIMCMD_FRAME(14, 5),
ANIMCMD_JUMP(0),
};
const union AnimCmd *const gPowderParticlesAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gPowderParticlesAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSleepPowderParticleSpriteTemplate =
{
.tileTag = ANIM_TAG_SLEEP_POWDER,
.paletteTag = ANIM_TAG_SLEEP_POWDER,
.oam = &gUnknown_08524944,
.anims = gPowderParticlesAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimMovePowderParticle,
};
const struct SpriteTemplate gStunSporeParticleSpriteTemplate =
{
.tileTag = ANIM_TAG_STUN_SPORE,
.paletteTag = ANIM_TAG_STUN_SPORE,
.oam = &gUnknown_08524944,
.anims = gPowderParticlesAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimMovePowderParticle,
};
const struct SpriteTemplate gPoisonPowderParticleSpriteTemplate =
{
.tileTag = ANIM_TAG_POISON_POWDER,
.paletteTag = ANIM_TAG_POISON_POWDER,
.oam = &gUnknown_08524944,
.anims = gPowderParticlesAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimMovePowderParticle,
};
const union AnimCmd gSolarbeamBigOrbAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
const union AnimCmd gSolarbeamBigOrbAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(1, 1),
ANIMCMD_END,
};
const union AnimCmd gSolarbeamBigOrbAnimCmds3[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(2, 1),
ANIMCMD_END,
};
const union AnimCmd gSolarbeamBigOrbAnimCmds4[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(3, 1),
ANIMCMD_END,
};
const union AnimCmd gSolarbeamBigOrbAnimCmds5[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(4, 1),
ANIMCMD_END,
};
const union AnimCmd gSolarbeamBigOrbAnimCmds6[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(5, 1),
ANIMCMD_END,
};
const union AnimCmd gSolarbeamBigOrbAnimCmds7[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(6, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592198[] =
{
ANIMCMD_FRAME(7, 1),
ANIMCMD_END,
};
const union AnimCmd gPowerAbsorptionOrbAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(8, 1),
ANIMCMD_END,
};
const union AnimCmd *const gSolarbeamBigOrbAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gSolarbeamBigOrbAnimCmds1,
gSolarbeamBigOrbAnimCmds2,
gSolarbeamBigOrbAnimCmds3,
gSolarbeamBigOrbAnimCmds4,
gSolarbeamBigOrbAnimCmds5,
gSolarbeamBigOrbAnimCmds6,
gSolarbeamBigOrbAnimCmds7,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd *const gUnknown_085921C4[] =
{
gUnknown_08592198,
};
const union AnimCmd *const gPowerAbsorptionOrbAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gPowerAbsorptionOrbAnimCmds,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gPowerAbsorptionOrbAffineAnimCmds[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(-5, -5, 0, 1),
AFFINEANIMCMD_JUMP(0),
};
const union AffineAnimCmd *const gPowerAbsorptionOrbAffineAnimTable[] = {
gPowerAbsorptionOrbAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gPowerAbsorptionOrbSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ORBS,
.paletteTag = ANIM_TAG_ORBS,
.oam = &gUnknown_08524A8C,
.anims = gPowerAbsorptionOrbAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gPowerAbsorptionOrbAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimPowerAbsorptionOrb,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gSolarbeamBigOrbSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ORBS,
.paletteTag = ANIM_TAG_ORBS,
.oam = &gUnknown_08524904,
.anims = gSolarbeamBigOrbAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimSolarbeamBigOrb,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gSolarbeamSmallOrbSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ORBS,
.paletteTag = ANIM_TAG_ORBS,
.oam = &gUnknown_08524904,
.anims = gUnknown_085921C4,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimSolarbeamSmallOrb,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gStockpileAbsorptionOrbAffineCmds[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(320, 320, 0, 0),
AFFINEANIMCMD_FRAME(-14, -14, 0, 1),
AFFINEANIMCMD_JUMP(1),
};
const union AffineAnimCmd *const gStockpileAbsorptionOrbAffineAnimTable[] = {
gStockpileAbsorptionOrbAffineCmds,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gStockpileAbsorptionOrbSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_GRAY_ORB,
.paletteTag = ANIM_TAG_GRAY_ORB,
.oam = &gUnknown_085249C4,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gStockpileAbsorptionOrbAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimPowerAbsorptionOrb,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gAbsorptionOrbAffineAnimCmds[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(-5, -5, 0, 1),
AFFINEANIMCMD_JUMP(0),
};
const union AffineAnimCmd *const gAbsorptionOrbAffineAnimTable[] = {
gAbsorptionOrbAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gAbsorptionOrbSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ORBS,
.paletteTag = ANIM_TAG_ORBS,
.oam = &gUnknown_08524A8C,
.anims = gPowerAbsorptionOrbAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gAbsorptionOrbAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimAbsorptionOrb,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gHyperBeamOrbSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ORBS,
.paletteTag = ANIM_TAG_ORBS,
.oam = &gUnknown_08524904,
.anims = gSolarbeamBigOrbAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimHyperBeamOrb,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gLeechSeedAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
const union AnimCmd gLeechSeedAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(4, 7),
ANIMCMD_FRAME(8, 7),
ANIMCMD_JUMP(0),
};
const union AnimCmd *const gLeechSeedAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gLeechSeedAnimCmds1,
gLeechSeedAnimCmds2,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gLeechSeedSpriteTemplate =
{
.tileTag = ANIM_TAG_SEED,
.paletteTag = ANIM_TAG_SEED,
.oam = &gUnknown_0852490C,
.anims = gLeechSeedAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimLeechSeed,
};
const union AnimCmd gSporeParticleAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
const union AnimCmd gSporeParticleAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(4, 7),
ANIMCMD_END,
};
const union AnimCmd *const gSporeParticleAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gSporeParticleAnimCmds1,
gSporeParticleAnimCmds2,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gSporeParticleSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SPORE,
.paletteTag = ANIM_TAG_SPORE,
.oam = &gUnknown_0852490C,
.anims = gSporeParticleAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimSporeParticle,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gPetalDanceBigFlowerAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
const union AnimCmd gPetalDanceSmallFlowerAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(4, 1),
ANIMCMD_END,
};
const union AnimCmd *const gPetalDanceBigFlowerAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gPetalDanceBigFlowerAnimCmds,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd *const gPetalDanceSmallFlowerAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gPetalDanceSmallFlowerAnimCmds,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gPetalDanceBigFlowerSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FLOWER,
.paletteTag = ANIM_TAG_FLOWER,
.oam = &gUnknown_0852490C,
.anims = gPetalDanceBigFlowerAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimPetalDanceBigFlower,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gPetalDanceSmallFlowerSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FLOWER,
.paletteTag = ANIM_TAG_FLOWER,
.oam = &gUnknown_08524904,
.anims = gPetalDanceSmallFlowerAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimPetalDanceSmallFlower,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gRazorLeafParticleAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_FRAME(4, 5),
ANIMCMD_FRAME(8, 5),
ANIMCMD_FRAME(12, 5),
ANIMCMD_FRAME(16, 5),
ANIMCMD_FRAME(20, 5),
ANIMCMD_FRAME(16, 5),
ANIMCMD_FRAME(12, 5),
ANIMCMD_FRAME(8, 5),
ANIMCMD_FRAME(4, 5),
ANIMCMD_JUMP(0),
};
const union AnimCmd gRazorLeafParticleAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(24, 5),
ANIMCMD_FRAME(28, 5),
ANIMCMD_FRAME(32, 5),
ANIMCMD_END,
};
const union AnimCmd *const gRazorLeafParticleAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gRazorLeafParticleAnimCmds1,
gRazorLeafParticleAnimCmds2,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gRazorLeafParticleSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_LEAF,
.paletteTag = ANIM_TAG_LEAF,
.oam = &gUnknown_0852490C,
.anims = gRazorLeafParticleAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimRazorLeafParticle,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gTwisterLeafParticleSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_LEAF,
.paletteTag = ANIM_TAG_LEAF,
.oam = &gUnknown_0852490C,
.anims = gRazorLeafParticleAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimMoveTwisterParticle,
};
const union AnimCmd gRazorLeafCutterAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(0, 3, .hFlip = TRUE),
ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE),
ANIMCMD_FRAME(0, 3, .vFlip = TRUE),
ANIMCMD_JUMP(0),
};
const union AnimCmd *const gRazorLeafCutterAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gRazorLeafCutterAnimCmds,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gRazorLeafCutterSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_RAZOR_LEAF,
.paletteTag = ANIM_TAG_RAZOR_LEAF,
.oam = &gUnknown_08524934,
.anims = gRazorLeafCutterAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimTranslateLinearSingleSineWave,
};
const union AffineAnimCmd gSwiftStarAffineAnimCmds[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(0, 0, 0, 1),
AFFINEANIMCMD_JUMP(0),
};
const union AffineAnimCmd *const gSwiftStarAffineAnimTable[] = {
gSwiftStarAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSwiftStarSpriteTemplate =
{
.tileTag = ANIM_TAG_YELLOW_STAR,
.paletteTag = ANIM_TAG_YELLOW_STAR,
.oam = &gUnknown_08524974,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gSwiftStarAffineAnimTable,
2018-12-16 18:35:10 +01:00
.callback = AnimTranslateLinearSingleSineWave,
};
const union AnimCmd gConstrictBindingAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(32, 4),
ANIMCMD_FRAME(64, 4),
ANIMCMD_FRAME(96, 4),
ANIMCMD_END,
};
const union AnimCmd gConstrictBindingAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
ANIMCMD_FRAME(64, 4, .hFlip = TRUE),
ANIMCMD_FRAME(96, 4, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd *const gConstrictBindingAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gConstrictBindingAnimCmds1,
gConstrictBindingAnimCmds2,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gConstrictBindingAffineAnimCmds1[] = {
2018-12-20 04:13:26 +01:00
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(-11, 0, 0, 6),
AFFINEANIMCMD_FRAME(11, 0, 0, 6),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gConstrictBindingAffineAnimCmds2[] = {
2018-12-20 04:13:26 +01:00
AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0),
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(11, 0, 0, 6),
AFFINEANIMCMD_FRAME(-11, 0, 0, 6),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gConstrictBindingAffineAnimTable[] = {
gConstrictBindingAffineAnimCmds1,
gConstrictBindingAffineAnimCmds2,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gConstrictBindingSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_TENDRILS,
.paletteTag = ANIM_TAG_TENDRILS,
.oam = &gUnknown_0852499C,
.anims = gConstrictBindingAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gConstrictBindingAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimConstrictBinding,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gMimicOrbAffineAnimCmds1[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(0, 0, 0, 0),
AFFINEANIMCMD_FRAME(48, 48, 0, 14),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gMimicOrbAffineAnimCmds2[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(-16, -16, 0, 1),
AFFINEANIMCMD_JUMP(0),
};
const union AffineAnimCmd *const gMimicOrbAffineAnimTable[] = {
gMimicOrbAffineAnimCmds1,
gMimicOrbAffineAnimCmds2,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gMimicOrbSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ORBS,
.paletteTag = ANIM_TAG_ORBS,
.oam = &gUnknown_085249CC,
.anims = gPowerAbsorptionOrbAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gMimicOrbAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimMimicOrb,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gIngrainRootAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 7),
ANIMCMD_FRAME(16, 7),
ANIMCMD_FRAME(32, 7),
ANIMCMD_FRAME(48, 7),
ANIMCMD_END,
};
const union AnimCmd gIngrainRootAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 7, .hFlip = TRUE),
ANIMCMD_FRAME(16, 7, .hFlip = TRUE),
ANIMCMD_FRAME(32, 7, .hFlip = TRUE),
ANIMCMD_FRAME(48, 7, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gIngrainRootAnimCmds3[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 7),
ANIMCMD_FRAME(16, 7),
ANIMCMD_FRAME(32, 7),
ANIMCMD_END,
};
const union AnimCmd gIngrainRootAnimCmds4[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 7, .hFlip = TRUE),
ANIMCMD_FRAME(16, 7, .hFlip = TRUE),
ANIMCMD_FRAME(32, 7, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd *const gIngrainRootAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gIngrainRootAnimCmds1,
gIngrainRootAnimCmds2,
gIngrainRootAnimCmds3,
gIngrainRootAnimCmds4,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gIngrainRootSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ROOTS,
.paletteTag = ANIM_TAG_ROOTS,
.oam = &gUnknown_08524914,
.anims = gIngrainRootAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimIngrainRoot,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gFrenzyPlantRootSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ROOTS,
.paletteTag = ANIM_TAG_ROOTS,
.oam = &gUnknown_08524914,
.anims = gIngrainRootAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimFrenzyPlantRoot,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gIngrainOrbAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(3, 3),
ANIMCMD_FRAME(0, 5),
ANIMCMD_JUMP(0),
};
const union AnimCmd *const gIngrainOrbAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gIngrainOrbAnimCmds,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gIngrainOrbSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ORBS,
.paletteTag = ANIM_TAG_ORBS,
.oam = &gUnknown_08524904,
.anims = gIngrainOrbAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimIngrainOrb,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gFallingBagAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 30),
ANIMCMD_END,
};
const union AnimCmd *const gFallingBagAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gFallingBagAnimCmds,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gFallingBagAffineAnimCmds1[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(0, 0, -4, 10),
AFFINEANIMCMD_FRAME(0, 0, 4, 20),
AFFINEANIMCMD_FRAME(0, 0, -4, 10),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gFallingBagAffineAnimCmds2[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(0, 0, -1, 2),
AFFINEANIMCMD_FRAME(0, 0, 1, 4),
AFFINEANIMCMD_FRAME(0, 0, -1, 4),
AFFINEANIMCMD_FRAME(0, 0, 1, 4),
AFFINEANIMCMD_FRAME(0, 0, -1, 4),
AFFINEANIMCMD_FRAME(0, 0, 1, 2),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gFallingBagAffineAnimTable[] = {
gFallingBagAffineAnimCmds1,
gFallingBagAffineAnimCmds2,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gPresentSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ITEM_BAG,
.paletteTag = ANIM_TAG_ITEM_BAG,
.oam = &gUnknown_08524974,
.anims = gFallingBagAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gFallingBagAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimPresent,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gKnockOffItemSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ITEM_BAG,
.paletteTag = ANIM_TAG_ITEM_BAG,
.oam = &gUnknown_08524974,
.anims = gFallingBagAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gFallingBagAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimKnockOffItem,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gPresentHealParticleAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(4, 4),
ANIMCMD_FRAME(8, 4),
ANIMCMD_FRAME(12, 4),
ANIMCMD_END,
};
const union AnimCmd *const gPresentHealParticleAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gPresentHealParticleAnimCmds,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gPresentHealParticleSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_GREEN_SPARKLE,
.paletteTag = ANIM_TAG_GREEN_SPARKLE,
.oam = &gUnknown_0852490C,
.anims = gPresentHealParticleAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimPresentHealParticle,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gItemStealSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ITEM_BAG,
.paletteTag = ANIM_TAG_ITEM_BAG,
.oam = &gUnknown_08524974,
.anims = gFallingBagAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gFallingBagAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimItemSteal,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gTrickBagAffineAnimCmds1[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(0, 0, 0, 3),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gTrickBagAffineAnimCmds2[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(0, -10, 0, 3),
AFFINEANIMCMD_FRAME(0, -6, 0, 3),
AFFINEANIMCMD_FRAME(0, -2, 0, 3),
AFFINEANIMCMD_FRAME(0, 0, 0, 3),
AFFINEANIMCMD_FRAME(0, 2, 0, 3),
AFFINEANIMCMD_FRAME(0, 6, 0, 3),
AFFINEANIMCMD_FRAME(0, 10, 0, 3),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gTrickBagAffineAnimTable[] = {
gTrickBagAffineAnimCmds1,
gTrickBagAffineAnimCmds2,
gFallingBagAffineAnimCmds1,
gFallingBagAffineAnimCmds2,
2018-12-16 18:35:10 +01:00
};
2018-12-20 04:13:26 +01:00
const struct SpriteTemplate gTrickBagSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_ITEM_BAG,
.paletteTag = ANIM_TAG_ITEM_BAG,
.oam = &gUnknown_08524974,
.anims = gFallingBagAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gTrickBagAffineAnimTable,
2018-12-20 04:13:26 +01:00
.callback = AnimTrickBag,
2018-12-16 18:35:10 +01:00
};
const s8 gTrickBagCoordinates[][3] =
2018-12-16 18:35:10 +01:00
{
{5, 24, 1},
{0, 4, 0},
{8, 16, -1},
{0, 2, 0},
{8, 16, 1},
{0, 2, 0},
{8, 16, 1},
{0, 2, 0},
{8, 16, 1},
{0, 16, 0},
{0, 0, 127},
};
const union AnimCmd gUnknown_08592724[] =
{
ANIMCMD_FRAME(28, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_0859272C[] =
{
ANIMCMD_FRAME(32, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592734[] =
{
ANIMCMD_FRAME(20, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_0859273C[] =
{
ANIMCMD_FRAME(28, 1, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592744[] =
{
ANIMCMD_FRAME(16, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_0859274C[] =
{
ANIMCMD_FRAME(16, 1, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592754[] =
{
ANIMCMD_FRAME(28, 1),
ANIMCMD_END,
};
const union AnimCmd *const gUnknown_0859275C[] =
{
gUnknown_08592724,
gUnknown_0859272C,
gUnknown_08592734,
gUnknown_0859273C,
gUnknown_08592744,
gUnknown_0859274C,
gUnknown_08592754,
};
// Unused
2018-12-16 18:35:10 +01:00
const struct SpriteTemplate gUnknown_08592778 =
{
.tileTag = ANIM_TAG_LEAF,
.paletteTag = ANIM_TAG_LEAF,
.oam = &gUnknown_0852490C,
.anims = gUnknown_0859275C,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = SpriteCallbackDummy,
};
const union AffineAnimCmd gAromatherapyBigFlowerAffineAnimCmds[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, 4, 1),
AFFINEANIMCMD_JUMP(1),
};
const union AffineAnimCmd *const gAromatherapyBigFlowerAffineAnimTable[] = {
gAromatherapyBigFlowerAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gAromatherapySmallFlowerSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FLOWER,
.paletteTag = ANIM_TAG_FLOWER,
.oam = &gUnknown_08524904,
.anims = gPetalDanceSmallFlowerAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimFlyingParticle,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gAromatherapyBigFlowerSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FLOWER,
.paletteTag = ANIM_TAG_FLOWER,
.oam = &gUnknown_0852496C,
.anims = gPetalDanceBigFlowerAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gAromatherapyBigFlowerAffineAnimTable,
.callback = AnimFlyingParticle,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gSilverWindBigSparkAffineAnimCmds[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, -10, 1),
AFFINEANIMCMD_JUMP(1),
};
const union AffineAnimCmd gSilverWindMediumSparkAffineAnimCmds[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(192, 192, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, -12, 1),
AFFINEANIMCMD_JUMP(1),
};
const union AffineAnimCmd gSilverWindSmallSparkAffineAnimCmds[] = {
2018-12-16 18:35:10 +01:00
AFFINEANIMCMD_FRAME(143, 143, 0, 0),
AFFINEANIMCMD_FRAME(0, 0, -15, 1),
AFFINEANIMCMD_JUMP(1),
};
const union AffineAnimCmd *const gSilverWindBigSparkAffineAnimTable[] = {
gSilverWindBigSparkAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd *const gSilverWindMediumSparkAffineAnimTable[] = {
gSilverWindMediumSparkAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd *const gSilverWindSmallSparkAffineAnimTable[] = {
gSilverWindSmallSparkAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSilverWindBigSparkSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SPARKLE_6,
.paletteTag = ANIM_TAG_SPARKLE_6,
.oam = &gUnknown_0852496C,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gSilverWindBigSparkAffineAnimTable,
.callback = AnimFlyingParticle,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSilverWindMediumSparkSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SPARKLE_6,
.paletteTag = ANIM_TAG_SPARKLE_6,
.oam = &gUnknown_0852496C,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gSilverWindMediumSparkAffineAnimTable,
.callback = AnimFlyingParticle,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSilverWindSmallSparkSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SPARKLE_6,
.paletteTag = ANIM_TAG_SPARKLE_6,
.oam = &gUnknown_0852496C,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gSilverWindSmallSparkAffineAnimTable,
.callback = AnimFlyingParticle,
2018-12-16 18:35:10 +01:00
};
const u16 gMagicalLeafBlendColors[] =
{
RGB(31, 0, 0),
RGB(31, 19, 0),
RGB(31, 31, 0),
RGB(0, 31, 0),
RGB(5, 14, 31),
RGB(22, 10, 31),
RGB(22, 21, 31),
};
const struct SpriteTemplate gNeedleArmSpikeSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_GREEN_SPIKE,
.paletteTag = ANIM_TAG_GREEN_SPIKE,
.oam = &gUnknown_0852496C,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2019-10-14 21:17:38 +02:00
.callback = AnimNeedleArmSpike,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gWhipAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(64, 3),
ANIMCMD_FRAME(80, 3),
ANIMCMD_FRAME(96, 3),
ANIMCMD_FRAME(112, 6),
ANIMCMD_END,
};
const union AnimCmd gWhipAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(64, 3, .hFlip = TRUE),
ANIMCMD_FRAME(80, 3, .hFlip = TRUE),
ANIMCMD_FRAME(96, 3, .hFlip = TRUE),
ANIMCMD_FRAME(112, 6, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd *const gWhipAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gWhipAnimCmds1,
gWhipAnimCmds2,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSlamHitSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SLAM_HIT,
.paletteTag = ANIM_TAG_SLAM_HIT,
.oam = &gUnknown_08524914,
.anims = gWhipAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2019-10-14 22:42:15 +02:00
.callback = AnimWhipHit,
2018-12-16 18:35:10 +01:00
};
2019-04-02 08:36:22 +02:00
const struct SpriteTemplate gVineWhipSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_WHIP_HIT,
.paletteTag = ANIM_TAG_WHIP_HIT,
.oam = &gUnknown_08524914,
.anims = gWhipAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2019-10-14 22:42:15 +02:00
.callback = AnimWhipHit,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gUnknown_08592900[] =
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(16, 4),
ANIMCMD_FRAME(32, 4),
ANIMCMD_FRAME(48, 4),
ANIMCMD_FRAME(64, 5),
ANIMCMD_END,
};
const union AnimCmd *const gUnknown_08592918[] =
{
gUnknown_08592900,
};
// Unused
2018-12-16 18:35:10 +01:00
const struct SpriteTemplate gUnknown_0859291C =
{
2019-04-06 16:32:02 +02:00
.tileTag = ANIM_TAG_HIT,
.paletteTag = ANIM_TAG_HIT,
2018-12-16 18:35:10 +01:00
.oam = &gUnknown_08524914,
.anims = gUnknown_08592918,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_81009F8,
};
// Unused
2018-12-16 18:35:10 +01:00
const struct SpriteTemplate gUnknown_08592934 =
{
2019-04-06 16:32:02 +02:00
.tileTag = ANIM_TAG_HIT_2,
.paletteTag = ANIM_TAG_HIT_2,
2018-12-16 18:35:10 +01:00
.oam = &gUnknown_08524914,
.anims = gUnknown_08592918,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_81009F8,
};
const union AffineAnimCmd gUnknown_0859294C[] = {
AFFINEANIMCMD_FRAME(256, 256, 0, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gUnknown_0859295C[] = {
AFFINEANIMCMD_FRAME(256, 256, 32, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gUnknown_0859296C[] = {
AFFINEANIMCMD_FRAME(256, 256, 64, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gUnknown_0859297C[] = {
AFFINEANIMCMD_FRAME(256, 256, 96, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gUnknown_0859298C[] = {
AFFINEANIMCMD_FRAME(256, 256, -128, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gUnknown_0859299C[] = {
AFFINEANIMCMD_FRAME(256, 256, -96, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gUnknown_085929AC[] = {
AFFINEANIMCMD_FRAME(256, 256, -64, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gUnknown_085929BC[] = {
AFFINEANIMCMD_FRAME(256, 256, -32, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gUnknown_085929CC[] = {
gUnknown_0859294C,
gUnknown_0859295C,
gUnknown_0859296C,
gUnknown_0859297C,
gUnknown_0859298C,
gUnknown_0859299C,
gUnknown_085929AC,
gUnknown_085929BC,
};
// Unused
2018-12-16 18:35:10 +01:00
const struct SpriteTemplate gUnknown_085929EC =
{
.tileTag = ANIM_TAG_HANDS_AND_FEET,
.paletteTag = ANIM_TAG_HANDS_AND_FEET,
.oam = &gUnknown_08524974,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gUnknown_085929CC,
.callback = sub_8100A94,
};
const union AnimCmd gCuttingSliceAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_FRAME(16, 5),
ANIMCMD_FRAME(32, 5),
ANIMCMD_FRAME(48, 5),
ANIMCMD_END,
};
const union AnimCmd *const gCuttingSliceAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gCuttingSliceAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gCuttingSliceSpriteTemplate =
{
.tileTag = ANIM_TAG_CUT,
.paletteTag = ANIM_TAG_CUT,
.oam = &gUnknown_08524A34,
.anims = gCuttingSliceAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimCuttingSlice,
};
const struct SpriteTemplate gAirCutterSliceSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_CUT,
.paletteTag = ANIM_TAG_CUT,
.oam = &gUnknown_08524A34,
.anims = gCuttingSliceAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimAirCutterSlice,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gUnknown_08592A4C[] =
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A54[] =
{
ANIMCMD_FRAME(4, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A5C[] =
{
ANIMCMD_FRAME(8, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A64[] =
{
ANIMCMD_FRAME(12, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A6C[] =
{
ANIMCMD_FRAME(16, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A74[] =
{
ANIMCMD_FRAME(20, 1),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A7C[] =
{
ANIMCMD_FRAME(0, 1, .vFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A84[] =
{
ANIMCMD_FRAME(4, 1, .vFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A8C[] =
{
ANIMCMD_FRAME(8, 1, .vFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592A94[] =
{
ANIMCMD_FRAME(12, 1, .vFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd *const gUnknown_08592A9C[] =
{
gUnknown_08592A4C,
gUnknown_08592A54,
gUnknown_08592A5C,
gUnknown_08592A64,
gUnknown_08592A6C,
gUnknown_08592A74,
gUnknown_08592A7C,
gUnknown_08592A84,
gUnknown_08592A8C,
gUnknown_08592A94,
};
// Unused
2018-12-16 18:35:10 +01:00
const struct SpriteTemplate gUnknown_08592AC4 =
{
.tileTag = ANIM_TAG_MUSIC_NOTES,
.paletteTag = ANIM_TAG_MUSIC_NOTES,
.oam = &gUnknown_0852490C,
.anims = gUnknown_08592A9C,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_8100E1C,
};
const struct SpriteTemplate gUnknown_08592ADC =
{
.tileTag = ANIM_TAG_PROTECT,
.paletteTag = ANIM_TAG_PROTECT,
.oam = &gUnknown_08524A3C,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimProtect,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gMilkBottleAffineAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gMilkBottleAffineAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 12),
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6),
AFFINEANIMCMD_FRAME(0x0, 0x0, -2, 24),
AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 6),
AFFINEANIMCMD_FRAME(0x0, 0x0, 2, 12),
AFFINEANIMCMD_JUMP(0),
};
const union AffineAnimCmd *const gMilkBottleAffineAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gMilkBottleAffineAnimCmds1,
gMilkBottleAffineAnimCmds2,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gMilkBottleSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_MILK_BOTTLE,
.paletteTag = ANIM_TAG_MILK_BOTTLE,
.oam = &gUnknown_08524A94,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gMilkBottleAffineAnimTable,
2019-10-14 21:17:38 +02:00
.callback = AnimMilkBottle,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gGrantingStarsAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 7),
ANIMCMD_FRAME(16, 7),
ANIMCMD_FRAME(32, 7),
ANIMCMD_FRAME(48, 7),
ANIMCMD_FRAME(64, 7),
ANIMCMD_FRAME(80, 7),
ANIMCMD_FRAME(96, 7),
ANIMCMD_FRAME(112, 7),
ANIMCMD_JUMP(0),
};
const union AnimCmd *const gGrantingStarsAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gGrantingStarsAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gGrantingStarsSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SPARKLE_2,
.paletteTag = ANIM_TAG_SPARKLE_2,
.oam = &gUnknown_08524914,
.anims = gGrantingStarsAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimGrantingStars,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSparklingStarsSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SPARKLE_2,
.paletteTag = ANIM_TAG_SPARKLE_2,
.oam = &gUnknown_08524914,
.anims = gGrantingStarsAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSparkingStars,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gUnknown_08592BAC[] =
{
ANIMCMD_FRAME(0, 10),
ANIMCMD_FRAME(4, 10),
ANIMCMD_FRAME(8, 10),
ANIMCMD_FRAME(12, 10),
ANIMCMD_FRAME(16, 26),
ANIMCMD_FRAME(16, 5),
ANIMCMD_FRAME(20, 5),
ANIMCMD_FRAME(24, 15),
ANIMCMD_END,
};
const union AnimCmd gUnknown_08592BD0[] =
{
ANIMCMD_FRAME(0, 10, .hFlip = TRUE),
ANIMCMD_FRAME(4, 10, .hFlip = TRUE),
ANIMCMD_FRAME(8, 10, .hFlip = TRUE),
ANIMCMD_FRAME(12, 10, .hFlip = TRUE),
ANIMCMD_FRAME(16, 26, .hFlip = TRUE),
ANIMCMD_FRAME(16, 5, .hFlip = TRUE),
ANIMCMD_FRAME(20, 5, .hFlip = TRUE),
ANIMCMD_FRAME(24, 15, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd *const gUnknown_08592BF4[] =
{
gUnknown_08592BAC,
gUnknown_08592BD0,
};
// Unused
2018-12-16 18:35:10 +01:00
const struct SpriteTemplate gUnknown_08592BFC =
{
2019-04-06 16:32:02 +02:00
.tileTag = ANIM_TAG_BUBBLE_BURST,
.paletteTag = ANIM_TAG_BUBBLE_BURST,
2018-12-16 18:35:10 +01:00
.oam = &gUnknown_0852490C,
.anims = gUnknown_08592BF4,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_8101440,
};
const union AnimCmd gSleepLetterZAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 40),
ANIMCMD_END,
};
const union AnimCmd *const gSleepLetterZAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gSleepLetterZAnimCmds,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gSleepLetterZAffineAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0x14, 0x14, -30, 0),
AFFINEANIMCMD_FRAME(0x8, 0x8, 1, 24),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gSleepLetterZAffineAnimCmds1_2[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_LOOP(0),
AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24),
AFFINEANIMCMD_LOOP(10),
};
const union AffineAnimCmd gSleepLetterZAffineAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0x14, 0x14, 30, 0),
AFFINEANIMCMD_FRAME(0x8, 0x8, -1, 24),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gSleepLetterZAffineAnimCmds2_2[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_LOOP(0),
AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 24),
AFFINEANIMCMD_LOOP(10),
};
const union AffineAnimCmd *const gSleepLetterZAffineAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gSleepLetterZAffineAnimCmds1,
gSleepLetterZAffineAnimCmds2,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSleepLetterZSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_LETTER_Z,
.paletteTag = ANIM_TAG_LETTER_Z,
.oam = &gUnknown_08524974,
.anims = gSleepLetterZAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gSleepLetterZAffineAnimTable,
.callback = AnimSleepLetterZ,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gLockOnTargetSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_LOCK_ON,
.paletteTag = ANIM_TAG_LOCK_ON,
.oam = &gUnknown_08524914,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimLockOnTarget,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gLockOnMoveTargetSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_LOCK_ON,
.paletteTag = ANIM_TAG_LOCK_ON,
.oam = &gUnknown_0852490C,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2019-10-14 21:17:38 +02:00
.callback = AnimLockOnMoveTarget,
2018-12-16 18:35:10 +01:00
};
const s8 gInclineMonCoordTable[][2] =
2018-12-16 18:35:10 +01:00
{
{ 64, 64},
{ 0, -64},
{-64, 64},
{ 32, -32},
};
const struct SpriteTemplate gInclineMonSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = 0,
.paletteTag = 0,
.oam = &gDummyOamData,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimInclineMon,
2018-12-16 18:35:10 +01:00
};
// Unused
2018-12-16 18:35:10 +01:00
const struct SpriteTemplate gUnknown_08592CF0 =
{
.tileTag = 0,
.paletteTag = 0,
.oam = &gDummyOamData,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = sub_8101B90,
};
const union AnimCmd gSlashSliceAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(16, 4),
ANIMCMD_FRAME(32, 4),
ANIMCMD_FRAME(48, 4),
ANIMCMD_END,
};
const union AnimCmd gSlashSliceAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(48, 4),
ANIMCMD_END,
};
const union AnimCmd *const gSlashSliceAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gSlashSliceAnimCmds1,
gSlashSliceAnimCmds2,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSlashSliceSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SLASH,
.paletteTag = ANIM_TAG_SLASH,
.oam = &gUnknown_08524914,
.anims = gSlashSliceAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSlashSlice,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gFalseSwipeSliceSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SLASH_2,
.paletteTag = ANIM_TAG_SLASH_2,
.oam = &gUnknown_08524914,
.anims = gSlashSliceAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimFalseSwipeSlice,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gFalseSwipePositionnedSliceSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SLASH_2,
.paletteTag = ANIM_TAG_SLASH_2,
.oam = &gUnknown_08524914,
.anims = gSlashSliceAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimFalseSwipePositionnedSlice,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gEndureEnergyAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(8, 12),
ANIMCMD_FRAME(16, 4),
ANIMCMD_FRAME(24, 4),
ANIMCMD_END,
};
const union AnimCmd *const gEndureEnergyAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gEndureEnergyAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gEndureEnergySpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FOCUS_ENERGY,
.paletteTag = ANIM_TAG_FOCUS_ENERGY,
.oam = &gUnknown_08524954,
.anims = gEndureEnergyAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimEndureEnergy,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gSharpenSphereAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 18),
ANIMCMD_FRAME(0, 6),
ANIMCMD_FRAME(16, 18),
ANIMCMD_FRAME(0, 6),
ANIMCMD_FRAME(16, 6),
ANIMCMD_FRAME(32, 18),
ANIMCMD_FRAME(16, 6),
ANIMCMD_FRAME(32, 6),
ANIMCMD_FRAME(48, 18),
ANIMCMD_FRAME(32, 6),
ANIMCMD_FRAME(48, 6),
ANIMCMD_FRAME(64, 18),
ANIMCMD_FRAME(48, 6),
ANIMCMD_FRAME(64, 54),
ANIMCMD_END,
};
const union AnimCmd *const gSharpenSphereAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gSharpenSphereAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSharpenSphereSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_SPHERE_TO_CUBE,
.paletteTag = ANIM_TAG_SPHERE_TO_CUBE,
.oam = &gUnknown_08524914,
.anims = gSharpenSphereAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSharpenSphere,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gOctazookaBallSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_BLACK_BALL,
.paletteTag = ANIM_TAG_BLACK_BALL,
.oam = &gUnknown_08524904,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = TranslateAnimSpriteToTargetMonLocation,
};
const union AnimCmd gOctazookaAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 3),
ANIMCMD_FRAME(16, 3),
ANIMCMD_FRAME(32, 3),
ANIMCMD_FRAME(48, 3),
ANIMCMD_FRAME(64, 3),
ANIMCMD_END,
};
const union AnimCmd *const gOctazookaAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gOctazookaAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gOctazookaSmokeSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_GRAY_SMOKE,
.paletteTag = ANIM_TAG_GRAY_SMOKE,
.oam = &gUnknown_08524914,
.anims = gOctazookaAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSparklingParticle,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gConversionAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(3, 5),
ANIMCMD_FRAME(2, 5),
ANIMCMD_FRAME(1, 5),
ANIMCMD_FRAME(0, 5),
ANIMCMD_END,
};
const union AnimCmd *const gConversionAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gConversionAnimCmds,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gConversionAffineAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gConversionAffineAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gConversionAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gConversionSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_CONVERSION,
.paletteTag = ANIM_TAG_CONVERSION,
.oam = &gUnknown_08524AE4,
.anims = gConversionAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gConversionAffineAnimTable,
.callback = AnimConversion,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gConversion2AnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 5),
ANIMCMD_FRAME(1, 5),
ANIMCMD_FRAME(2, 5),
ANIMCMD_FRAME(3, 5),
ANIMCMD_END,
};
const union AnimCmd *const gConversion2AnimTable[] =
2018-12-16 18:35:10 +01:00
{
gConversion2AnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gConversion2SpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_CONVERSION,
.paletteTag = ANIM_TAG_CONVERSION,
.oam = &gUnknown_08524AE4,
.anims = gConversion2AnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gConversionAffineAnimTable,
2019-10-14 21:17:38 +02:00
.callback = AnimConversion2,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gMoonSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_MOON,
.paletteTag = ANIM_TAG_MOON,
.oam = &gUnknown_08524A3C,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimMoon,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gMoonlightSparkleAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 8),
ANIMCMD_FRAME(4, 8),
ANIMCMD_FRAME(8, 8),
ANIMCMD_FRAME(12, 8),
ANIMCMD_JUMP(0),
};
const union AnimCmd *const gMoonlightSparkleAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gMoonlightSparkleAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gMoonlightSparkleSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_GREEN_SPARKLE,
.paletteTag = ANIM_TAG_GREEN_SPARKLE,
.oam = &gUnknown_0852490C,
.anims = gMoonlightSparkleAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimMoonlightSparkle,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gHealingBlueStarAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 2),
ANIMCMD_FRAME(16, 2),
ANIMCMD_FRAME(32, 2),
ANIMCMD_FRAME(48, 3),
ANIMCMD_FRAME(64, 5),
ANIMCMD_FRAME(80, 3),
ANIMCMD_FRAME(96, 2),
ANIMCMD_FRAME(0, 2),
ANIMCMD_END,
};
const union AnimCmd *const gHealingBlueStarAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gHealingBlueStarAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gHealingBlueStarSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_BLUE_STAR,
.paletteTag = ANIM_TAG_BLUE_STAR,
.oam = &gUnknown_08524914,
.anims = gHealingBlueStarAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSparklingParticle,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gHornHitSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_HORN_HIT,
.paletteTag = ANIM_TAG_HORN_HIT,
.oam = &gUnknown_08524914,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimHornHit,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gSuperFangAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 2),
ANIMCMD_FRAME(16, 2),
ANIMCMD_FRAME(32, 2),
ANIMCMD_FRAME(48, 2),
ANIMCMD_END,
};
const union AnimCmd *const gSuperFangAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gSuperFangAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSuperFangSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FANG_ATTACK,
.paletteTag = ANIM_TAG_FANG_ATTACK,
.oam = &gUnknown_08524914,
.anims = gSuperFangAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimSuperFang,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gWavingMusicNotesAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 10),
ANIMCMD_END,
};
const union AnimCmd gWavingMusicNotesAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(4, 10),
ANIMCMD_END,
};
const union AnimCmd gWavingMusicNotesAnimCmds3[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(8, 41),
ANIMCMD_END,
};
const union AnimCmd gWavingMusicNotesAnimCmds4[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(12, 10),
ANIMCMD_END,
};
const union AnimCmd gWavingMusicNotesAnimCmds5[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(16, 10),
ANIMCMD_END,
};
const union AnimCmd gWavingMusicNotesAnimCmds6[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(20, 10),
ANIMCMD_END,
};
const union AnimCmd gWavingMusicNotesAnimCmds7[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 10, .vFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gWavingMusicNotesAnimCmds8[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(4, 10, .vFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd *const gMusicNotesAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gWavingMusicNotesAnimCmds1,
gWavingMusicNotesAnimCmds2,
gWavingMusicNotesAnimCmds3,
gWavingMusicNotesAnimCmds4,
gWavingMusicNotesAnimCmds5,
gWavingMusicNotesAnimCmds6,
gWavingMusicNotesAnimCmds7,
gWavingMusicNotesAnimCmds8,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gWavingMusicNotesAffineAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0xC, 0xC, 0, 16),
AFFINEANIMCMD_FRAME(0xFFF4, 0xFFF4, 0, 16),
AFFINEANIMCMD_JUMP(0),
};
const union AffineAnimCmd *const gMusicNotesAffineAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gWavingMusicNotesAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gWavingMusicNotesSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_MUSIC_NOTES,
.paletteTag = ANIM_TAG_MUSIC_NOTES,
.oam = &gUnknown_085249CC,
.anims = gMusicNotesAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gMusicNotesAffineAnimTable,
.callback = AnimWavingMusicNotes,
2018-12-16 18:35:10 +01:00
};
const u16 gParticlesColorBlendTable[][6] =
2018-12-16 18:35:10 +01:00
{
{ANIM_TAG_MUSIC_NOTES, RGB(31, 31, 31), RGB(31, 26, 28), RGB(31, 22, 26), RGB(31, 17, 24), RGB(31, 13, 22)},
{ANIM_TAG_BENT_SPOON, RGB(31, 31, 31), RGB(25, 31, 26), RGB(20, 31, 21), RGB(15, 31, 16), RGB(10, 31, 12)},
{ANIM_TAG_SPHERE_TO_CUBE, RGB(31, 31, 31), RGB(31, 31, 24), RGB(31, 31, 17), RGB(31, 31, 10), RGB(31, 31, 3)},
{ANIM_TAG_LARGE_FRESH_EGG, RGB(31, 31, 31), RGB(26, 28, 31), RGB(21, 26, 31), RGB(16, 24, 31), RGB(12, 22, 31)},
};
const struct SpriteTemplate gFastFlyingMusicNotesSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_MUSIC_NOTES,
.paletteTag = ANIM_TAG_MUSIC_NOTES,
.oam = &gUnknown_085249CC,
.anims = gMusicNotesAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gMusicNotesAffineAnimTable,
.callback = AnimFlyingMusicNotes,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gBellyDrumHandSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE,
.paletteTag = ANIM_TAG_PURPLE_HAND_OUTLINE,
.oam = &gUnknown_08524914,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimBellyDrumHand,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gSlowFlyingMusicNotesAffineAnimCmds[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0),
AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 1),
AFFINEANIMCMD_JUMP(1),
};
const union AffineAnimCmd *const gSlowFlyingMusicNotesAffineAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gSlowFlyingMusicNotesAffineAnimCmds,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gSlowFlyingMusicNotesSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_MUSIC_NOTES,
.paletteTag = ANIM_TAG_MUSIC_NOTES,
.oam = &gUnknown_085249CC,
.anims = gMusicNotesAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gSlowFlyingMusicNotesAffineAnimTable,
.callback = AnimSlowFlyingMusicNotes,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gMetronomeThroughtBubbleAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 2, .hFlip = TRUE),
ANIMCMD_FRAME(16, 2, .hFlip = TRUE),
ANIMCMD_FRAME(32, 2, .hFlip = TRUE),
ANIMCMD_FRAME(48, 2, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gMetronomeThroughtBubbleAnimCmds3[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(48, 2, .hFlip = TRUE),
ANIMCMD_FRAME(32, 2, .hFlip = TRUE),
ANIMCMD_FRAME(16, 2, .hFlip = TRUE),
ANIMCMD_FRAME(0, 2, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gMetronomeThroughtBubbleAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 2),
ANIMCMD_FRAME(16, 2),
ANIMCMD_FRAME(32, 2),
ANIMCMD_FRAME(48, 2),
ANIMCMD_END,
};
const union AnimCmd gMetronomeThroughtBubbleAnimCmds4[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(48, 2),
ANIMCMD_FRAME(32, 2),
ANIMCMD_FRAME(16, 2),
ANIMCMD_FRAME(0, 2),
ANIMCMD_END,
};
const union AnimCmd *const gMetronomeThroughtBubbleAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gMetronomeThroughtBubbleAnimCmds1,
gMetronomeThroughtBubbleAnimCmds2,
gMetronomeThroughtBubbleAnimCmds3,
gMetronomeThroughtBubbleAnimCmds4,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gThroughtBubbleSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_THOUGHT_BUBBLE,
.paletteTag = ANIM_TAG_THOUGHT_BUBBLE,
.oam = &gUnknown_08524914,
.anims = gMetronomeThroughtBubbleAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
2019-10-14 21:17:38 +02:00
.callback = AnimThroughtBubble,
2018-12-16 18:35:10 +01:00
};
const union AffineAnimCmd gMetronomeFingerAffineAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0),
AFFINEANIMCMD_FRAME(0x1E, 0x1E, 0, 8),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gMetronomeFingerAffineAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(0x0, 0x0, 4, 11),
AFFINEANIMCMD_FRAME(0x0, 0x0, -4, 11),
AFFINEANIMCMD_LOOP(2),
AFFINEANIMCMD_FRAME(0xFFE2, 0xFFE2, 0, 8),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd gMetronomeFingerAffineAnimCmds2_2[] =
2018-12-16 18:35:10 +01:00
{
AFFINEANIMCMD_FRAME(16, 16, 0, 0),
AFFINEANIMCMD_FRAME(30, 30, 0, 8),
AFFINEANIMCMD_FRAME(0, 0, 0, 16),
AFFINEANIMCMD_LOOP(0),
AFFINEANIMCMD_FRAME(0, 0, 4, 11),
AFFINEANIMCMD_FRAME(0, 0, -4, 11),
AFFINEANIMCMD_LOOP(2),
AFFINEANIMCMD_FRAME(-30, -30, 0, 8),
AFFINEANIMCMD_END,
};
const union AffineAnimCmd *const gMetronomeFingerAffineAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gMetronomeFingerAffineAnimCmds1,
gMetronomeFingerAffineAnimCmds2,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gMetronomeFingerSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FINGER,
.paletteTag = ANIM_TAG_FINGER,
.oam = &gUnknown_085249D4,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gMetronomeFingerAffineAnimTable,
2019-10-14 21:17:38 +02:00
.callback = AnimMetronomeFinger,
2018-12-16 18:35:10 +01:00
};
2019-10-14 21:17:38 +02:00
const struct SpriteTemplate gFollowMeFingerSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FINGER,
.paletteTag = ANIM_TAG_FINGER,
.oam = &gUnknown_08524974,
.anims = gDummySpriteAnimTable,
.images = NULL,
.affineAnims = gMetronomeFingerAffineAnimTable,
2019-10-14 21:17:38 +02:00
.callback = AnimFollowMeFinger,
2018-12-16 18:35:10 +01:00
};
const union AnimCmd gTauntFingerAnimCmds1[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 1),
ANIMCMD_END,
};
const union AnimCmd gTauntFingerAnimCmds2[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 1, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd gTauntFingerAnimCmds3[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(16, 4),
ANIMCMD_FRAME(32, 4),
ANIMCMD_FRAME(16, 4),
ANIMCMD_FRAME(0, 4),
ANIMCMD_FRAME(16, 4),
ANIMCMD_FRAME(32, 4),
ANIMCMD_END,
};
const union AnimCmd gTauntFingerAnimCmds4[] =
2018-12-16 18:35:10 +01:00
{
ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
ANIMCMD_FRAME(0, 4, .hFlip = TRUE),
ANIMCMD_FRAME(16, 4, .hFlip = TRUE),
ANIMCMD_FRAME(32, 4, .hFlip = TRUE),
ANIMCMD_END,
};
const union AnimCmd *const gTauntFingerAnimTable[] =
2018-12-16 18:35:10 +01:00
{
gTauntFingerAnimCmds1,
gTauntFingerAnimCmds2,
gTauntFingerAnimCmds3,
gTauntFingerAnimCmds4,
2018-12-16 18:35:10 +01:00
};
const struct SpriteTemplate gTauntFingerSpriteTemplate =
2018-12-16 18:35:10 +01:00
{
.tileTag = ANIM_TAG_FINGER_2,
.paletteTag = ANIM_TAG_FINGER_2,
.oam = &gUnknown_08524914,
.anims = gTauntFingerAnimTable,
2018-12-16 18:35:10 +01:00
.images = NULL,
.affineAnims = gDummySpriteAffineAnimTable,
.callback = AnimTauntFinger,
2018-12-16 18:35:10 +01:00
};
// Animates the falling particles that horizontally wave back and forth.
// Used by Sleep Powder, Stun Spore, and Poison Powder.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: total duration in frames
// arg 3: vertical movement speed (sub-pixel value)
// arg 4: wave amplitude
// arg 5: wave speed
void AnimMovePowderParticle(struct Sprite* sprite)
{
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[3];
if (GetBattlerSide(gBattleAnimAttacker))
{
sprite->data[3] = -gBattleAnimArgs[4];
}
else
{
sprite->data[3] = gBattleAnimArgs[4];
}
sprite->data[4] = gBattleAnimArgs[5];
sprite->callback = AnimMovePowderParticleStep;
}
static void AnimMovePowderParticleStep(struct Sprite* sprite)
{
if (sprite->data[0] > 0)
{
sprite->data[0]--;
sprite->pos2.y = sprite->data[2] >> 8;
sprite->data[2] += sprite->data[1];
sprite->pos2.x = Sin(sprite->data[5], sprite->data[3]);
sprite->data[5] = (sprite->data[5] + sprite->data[4]) & 0xFF;
}
else
{
DestroyAnimSprite(sprite);
}
}
2018-12-20 04:13:26 +01:00
// Moves an energy orb towards the center of the mon.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: duration
void AnimPowerAbsorptionOrb(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimAttacker(sprite, TRUE);
2018-12-16 18:35:10 +01:00
sprite->data[0] = gBattleAnimArgs[2];
2018-12-20 04:13:26 +01:00
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
2018-12-16 18:35:10 +01:00
sprite->callback = StartAnimLinearTranslation;
2018-12-18 05:08:08 +01:00
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
2018-12-16 18:35:10 +01:00
}
2018-12-20 04:13:26 +01:00
// Moves an orb in a straight line towards the target mon.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: duration
// arg 3: sprite anim number
void AnimSolarbeamBigOrb(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimAttacker(sprite, TRUE);
2018-12-16 18:35:10 +01:00
StartSpriteAnim(sprite, gBattleAnimArgs[3]);
sprite->data[0] = gBattleAnimArgs[2];
2018-12-20 04:13:26 +01:00
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
2018-12-16 18:35:10 +01:00
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
2018-12-20 04:13:26 +01:00
// Moves a small orb in a wavy pattern towards the target mon.
// The small orb "circles" the big orbs in AnimSolarbeamBigOrb.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: duration
// arg 3: initial wave offset
void AnimSolarbeamSmallOrb(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimAttacker(sprite, TRUE);
2018-12-16 18:35:10 +01:00
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = sprite->pos1.x;
2018-12-20 04:13:26 +01:00
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
2018-12-16 18:35:10 +01:00
sprite->data[3] = sprite->pos1.y;
2018-12-20 04:13:26 +01:00
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
2018-12-16 18:35:10 +01:00
InitAnimLinearTranslation(sprite);
sprite->data[5] = gBattleAnimArgs[3];
2018-12-20 04:13:26 +01:00
sprite->callback = AnimSolarbeamSmallOrbStep;
2018-12-16 18:35:10 +01:00
sprite->callback(sprite);
}
2018-12-20 04:13:26 +01:00
static void AnimSolarbeamSmallOrbStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
if (AnimTranslateLinear(sprite))
2018-12-16 18:35:10 +01:00
{
DestroySprite(sprite);
}
else
{
if (sprite->data[5] > 0x7F)
2018-12-18 05:08:08 +01:00
sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1;
2018-12-16 18:35:10 +01:00
else
2018-12-18 05:08:08 +01:00
sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 6;
2018-12-16 18:35:10 +01:00
sprite->pos2.x += Sin(sprite->data[5], 5);
sprite->pos2.y += Cos(sprite->data[5], 14);
sprite->data[5] = (sprite->data[5] + 15) & 0xFF;
}
}
2018-12-20 04:13:26 +01:00
// Creates 15 small secondary orbs used in the solarbeam anim effect.
// There is a 7-frame delay between each of them.
// No args.
void AnimTask_CreateSmallSolarbeamOrbs(u8 taskId)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
if (--gTasks[taskId].data[0] == -1)
2018-12-16 18:35:10 +01:00
{
gTasks[taskId].data[1]++;
gTasks[taskId].data[0] = 6;
gBattleAnimArgs[0] = 15;
gBattleAnimArgs[1] = 0;
gBattleAnimArgs[2] = 80;
gBattleAnimArgs[3] = 0;
2018-12-20 04:13:26 +01:00
CreateSpriteAndAnimate(&gSolarbeamSmallOrbSpriteTemplate, 0, 0, GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1);
2018-12-16 18:35:10 +01:00
}
if (gTasks[taskId].data[1] == 15)
DestroyAnimVisualTask(taskId);
}
2018-12-20 04:13:26 +01:00
// Moves an orb from the target mon to the attacking mon in an arc-like fashion.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: wave amplitude
// arg 3: wave period (lower means faster wave)
void AnimAbsorptionOrb(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimTarget(sprite, TRUE);
2018-12-16 18:35:10 +01:00
sprite->data[0] = gBattleAnimArgs[3];
2018-12-20 04:13:26 +01:00
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
2018-12-16 18:35:10 +01:00
sprite->data[5] = gBattleAnimArgs[2];
InitAnimArcTranslation(sprite);
2018-12-20 04:13:26 +01:00
sprite->callback = AnimAbsorptionOrbStep;
2018-12-16 18:35:10 +01:00
}
2018-12-20 04:13:26 +01:00
static void AnimAbsorptionOrbStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
DestroyAnimSprite(sprite);
}
2018-12-20 04:13:26 +01:00
// Moves an orb in a wave-like fashion towards the target mon. The wave's
// properties and the sprite anim are randomly determined.
void AnimHyperBeamOrb(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
u16 speed;
u16 animNum = Random2();
2019-04-02 08:36:22 +02:00
2018-12-20 04:13:26 +01:00
StartSpriteAnim(sprite, animNum % 8);
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
sprite->pos1.x -= 20;
else
sprite->pos1.x += 20;
2018-12-20 04:13:26 +01:00
speed = Random2();
sprite->data[0] = (speed & 31) + 64;
2018-12-16 18:35:10 +01:00
sprite->data[1] = sprite->pos1.x;
2018-12-20 04:13:26 +01:00
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
2018-12-16 18:35:10 +01:00
sprite->data[3] = sprite->pos1.y;
2018-12-20 04:13:26 +01:00
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
InitAnimFastLinearTranslationWithSpeed(sprite);
2018-12-16 18:35:10 +01:00
sprite->data[5] = Random2() & 0xFF;
sprite->data[6] = sprite->subpriority;
2018-12-20 04:13:26 +01:00
sprite->callback = AnimHyperBeamOrbStep;
2018-12-16 18:35:10 +01:00
sprite->callback(sprite);
}
2018-12-20 04:13:26 +01:00
static void AnimHyperBeamOrbStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
if (AnimFastTranslateLinear(sprite))
2018-12-16 18:35:10 +01:00
{
DestroyAnimSprite(sprite);
}
else
{
sprite->pos2.y += Cos(sprite->data[5], 12);
if (sprite->data[5] < 0x7F)
sprite->subpriority = sprite->data[6];
else
sprite->subpriority = sprite->data[6] + 1;
2018-12-20 04:13:26 +01:00
sprite->data[5] += 24;
sprite->data[5] &= 0xFF;
2018-12-16 18:35:10 +01:00
}
}
// seed (sprouts a sapling from a seed.)
// Used by Leech Seed.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: target x pixel offset
// arg 3: target y pixel offset
// arg 4: duration
// arg 5: wave amplitude
void AnimLeechSeed(struct Sprite* sprite)
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimAttacker(sprite, TRUE);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4];
2018-12-20 04:13:26 +01:00
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3];
2018-12-16 18:35:10 +01:00
sprite->data[5] = gBattleAnimArgs[5];
InitAnimArcTranslation(sprite);
sprite->callback = AnimLeechSeedStep;
}
static void AnimLeechSeedStep(struct Sprite* sprite)
{
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
{
sprite->invisible = 1;
sprite->data[0] = 10;
sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, AnimLeechSeedSprouts);
}
}
static void AnimLeechSeedSprouts(struct Sprite* sprite)
{
sprite->invisible = 0;
StartSpriteAnim(sprite, 1);
sprite->data[0] = 60;
sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
2018-12-20 04:13:26 +01:00
// Moves a spore particle in a halo around the target mon.
// The sprite's priority is updated to give the effect of going
// behind the mon's sprite.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: initial wave offset
// arg 3: duration
// arg 4: blend (0 = off, 1 = on)
void AnimSporeParticle(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimTarget(sprite, TRUE);
2018-12-16 18:35:10 +01:00
StartSpriteAnim(sprite, gBattleAnimArgs[4]);
if (gBattleAnimArgs[4] == 1)
sprite->oam.objMode = ST_OAM_OBJ_BLEND;
sprite->data[0] = gBattleAnimArgs[3];
sprite->data[1] = gBattleAnimArgs[2];
2018-12-20 04:13:26 +01:00
sprite->callback = AnimSporeParticleStep;
2018-12-16 18:35:10 +01:00
sprite->callback(sprite);
}
2018-12-20 04:13:26 +01:00
static void AnimSporeParticleStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->pos2.x = Sin(sprite->data[1], 32);
sprite->pos2.y = Cos(sprite->data[1], -3) + ((sprite->data[2] += 24) >> 8);
if ((u16)(sprite->data[1] - 0x40) < 0x80)
{
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);
2018-12-16 18:35:10 +01:00
}
else
{
2018-12-20 04:13:26 +01:00
u8 priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1;
2018-12-16 18:35:10 +01:00
if (priority > 3)
priority = 3;
sprite->oam.priority = priority;
}
2018-12-20 04:13:26 +01:00
sprite->data[1] += 2;
sprite->data[1] &= 0xFF;
2018-12-16 18:35:10 +01:00
if (--sprite->data[0] == -1)
DestroyAnimSprite(sprite);
}
2018-12-20 04:13:26 +01:00
// In a double battle, Updates the mon sprite background priorities to allow
// the circling effect controlled by AnimSporeParticle.
// No args.
void AnimTask_SporeDoubleBattle(u8 taskId)
2018-12-16 18:35:10 +01:00
{
if (IsContest() || !IsDoubleBattle())
{
DestroyAnimVisualTask(taskId);
}
else
{
2018-12-20 04:13:26 +01:00
if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1)
2018-12-16 18:35:10 +01:00
SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 3);
else
SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1);
DestroyAnimVisualTask(taskId);
}
}
2018-12-20 04:13:26 +01:00
// Rotates a big flower around the attacking mon, and slowly floats
// downward.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: target y pixel offset
// arg 3: duration
void AnimPetalDanceBigFlower(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimAttacker(sprite, FALSE);
2018-12-16 18:35:10 +01:00
sprite->data[0] = gBattleAnimArgs[3];
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = sprite->pos1.x;
sprite->data[3] = sprite->pos1.y;
2018-12-20 04:13:26 +01:00
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2];
2018-12-16 18:35:10 +01:00
InitAnimLinearTranslation(sprite);
sprite->data[5] = 0x40;
2018-12-20 04:13:26 +01:00
sprite->callback = AnimPetalDanceBigFlowerStep;
2018-12-16 18:35:10 +01:00
sprite->callback(sprite);
}
2018-12-20 04:13:26 +01:00
static void AnimPetalDanceBigFlowerStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
if (!AnimTranslateLinear(sprite))
2018-12-16 18:35:10 +01:00
{
sprite->pos2.x += Sin(sprite->data[5], 32);
sprite->pos2.y += Cos(sprite->data[5], -5);
if ((u16)(sprite->data[5] - 0x40) < 0x80)
2018-12-18 05:08:08 +01:00
sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1;
2018-12-16 18:35:10 +01:00
else
2018-12-18 05:08:08 +01:00
sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + 1;
2018-12-16 18:35:10 +01:00
sprite->data[5] = (sprite->data[5] + 5) & 0xFF;
}
else
{
DestroyAnimSprite(sprite);
}
}
2018-12-20 04:13:26 +01:00
// Slowly floats a small flower downard, while swaying from right to left.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: target y pixel offset
// arg 3: duration
void AnimPetalDanceSmallFlower(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimAttacker(sprite, TRUE);
2018-12-16 18:35:10 +01:00
sprite->data[0] = gBattleAnimArgs[3];
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = sprite->pos1.x;
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2];
InitAnimLinearTranslation(sprite);
sprite->data[5] = 0x40;
2018-12-20 04:13:26 +01:00
sprite->callback = AnimPetalDanceSmallFlowerStep;
2018-12-16 18:35:10 +01:00
sprite->callback(sprite);
}
2018-12-20 04:13:26 +01:00
static void AnimPetalDanceSmallFlowerStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
if (!AnimTranslateLinear(sprite))
2018-12-16 18:35:10 +01:00
{
sprite->pos2.x += Sin(sprite->data[5], 8);
if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5)
sprite->oam.matrixNum ^= ST_OAM_HFLIP;
2018-12-16 18:35:10 +01:00
2018-12-20 04:13:26 +01:00
sprite->data[5] += 5;
sprite->data[5] &= 0xFF;
2018-12-16 18:35:10 +01:00
}
else
{
DestroyAnimSprite(sprite);
}
}
2018-12-20 04:13:26 +01:00
// Shoots a leaf upward, then floats it downward while swaying back and forth.
// arg 0: upward x delta per frame
// arg 1: upward y delta per frame
// arg 2: upward duration
void AnimRazorLeafParticle(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
2018-12-16 18:35:10 +01:00
sprite->data[0] = gBattleAnimArgs[0];
sprite->data[1] = gBattleAnimArgs[1];
sprite->data[2] = gBattleAnimArgs[2];
2018-12-20 04:13:26 +01:00
sprite->callback = AnimRazorLeafParticleStep1;
2018-12-16 18:35:10 +01:00
}
2018-12-20 04:13:26 +01:00
static void AnimRazorLeafParticleStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (!sprite->data[2])
{
if (sprite->data[1] & 1)
{
sprite->data[0] = 0x80;
sprite->data[1] = 0;
sprite->data[2] = 0;
}
else
{
2018-12-20 04:13:26 +01:00
sprite->data[0] = 0;
sprite->data[1] = 0;
sprite->data[2] = 0;
2018-12-16 18:35:10 +01:00
}
2018-12-20 04:13:26 +01:00
sprite->callback = AnimRazorLeafParticleStep2;
2018-12-16 18:35:10 +01:00
}
else
{
sprite->data[2]--;
sprite->pos1.x += sprite->data[0];
sprite->pos1.y += sprite->data[1];
}
}
2018-12-20 04:13:26 +01:00
static void AnimRazorLeafParticleStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (GetBattlerSide(gBattleAnimAttacker))
sprite->pos2.x = -Sin(sprite->data[0], 25);
else
sprite->pos2.x = Sin(sprite->data[0], 25);
2018-12-20 04:13:26 +01:00
sprite->data[0] += 2;
sprite->data[0] &= 0xFF;
2018-12-16 18:35:10 +01:00
sprite->data[1]++;
if (!(sprite->data[1] & 1))
sprite->pos2.y++;
if (sprite->data[1] > 80)
DestroyAnimSprite(sprite);
}
// Animates a sprite that moves linearly from one location to another, with a
// single-cycle sine wave added to the y position along the way.
// Used by Razor Leaf and Magical Leaf.
// arg 0: initial x offset
// arg 1: initial y offset
// arg 2: target x offset
// arg 3: target y offset
// arg 4: translation duration
// arg 5: wave amplitude
// arg 6: target between double battle opponents (boolean)
void AnimTranslateLinearSingleSineWave(struct Sprite* sprite)
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimAttacker(sprite, TRUE);
2018-12-16 18:35:10 +01:00
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
gBattleAnimArgs[2] = -gBattleAnimArgs[2];
sprite->data[0] = gBattleAnimArgs[4];
if (!gBattleAnimArgs[6])
{
2018-12-20 04:13:26 +01:00
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2];
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3];
2018-12-16 18:35:10 +01:00
}
else
{
2018-12-20 04:13:26 +01:00
SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->data[2], &sprite->data[4]);
2018-12-16 18:35:10 +01:00
sprite->data[2] += gBattleAnimArgs[2];
sprite->data[4] += gBattleAnimArgs[3];
}
sprite->data[5] = gBattleAnimArgs[5];
InitAnimArcTranslation(sprite);
if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget))
sprite->data[0] = 1;
else
sprite->data[0] = 0;
sprite->callback = AnimTranslateLinearSingleSineWaveStep;
}
static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite)
{
bool8 destroy = FALSE;
s16 a = sprite->data[0];
s16 b = sprite->data[7];
s16 r0;
2019-04-02 08:36:22 +02:00
2018-12-16 18:35:10 +01:00
sprite->data[0] = 1;
2019-02-06 20:17:09 +01:00
TranslateAnimHorizontalArc(sprite);
2018-12-16 18:35:10 +01:00
r0 = sprite->data[7];
sprite->data[0] = a;
if (b > 200 && r0 < 56 && sprite->oam.affineParam == 0)
sprite->oam.affineParam++;
if (sprite->oam.affineParam && sprite->data[0])
{
sprite->invisible ^= 1;
sprite->oam.affineParam++;
if (sprite->oam.affineParam == 30)
destroy = TRUE;
}
2019-04-02 08:36:22 +02:00
2018-12-16 18:35:10 +01:00
if (sprite->pos1.x + sprite->pos2.x > 256
|| sprite->pos1.x + sprite->pos2.x < -16
|| sprite->pos1.y + sprite->pos2.y > 160
|| sprite->pos1.y + sprite->pos2.y < -16)
destroy = TRUE;
if (destroy)
DestroyAnimSprite(sprite);
}
// Animates particles in the Twister move animation.
// arg 0: duration
// arg 1: total y delta (the particles rise upward)
// arg 2: wave period (higher means faster wave)
// arg 3: wave amplitude
// arg 4: speedup frame (particles move faster at the end of the animation)
void AnimMoveTwisterParticle(struct Sprite* sprite)
{
if (IsDoubleBattle() == TRUE)
SetAverageBattlerPositions(gBattleAnimTarget, 1, &sprite->pos1.x, &sprite->pos1.y);
sprite->pos1.y += 32;
sprite->data[0] = gBattleAnimArgs[0];
sprite->data[1] = gBattleAnimArgs[1];
sprite->data[2] = gBattleAnimArgs[2];
sprite->data[3] = gBattleAnimArgs[3];
sprite->data[4] = gBattleAnimArgs[4];
sprite->callback = AnimMoveTwisterParticleStep;
}
static void AnimMoveTwisterParticleStep(struct Sprite* sprite)
{
if (sprite->data[1] == 0xFF)
{
sprite->pos1.y -= 2;
}
else if (sprite->data[1] > 0)
{
sprite->pos1.y -= 2;
sprite->data[1] -= 2;
}
sprite->data[5] += sprite->data[2];
if (sprite->data[0] < sprite->data[4])
sprite->data[5] += sprite->data[2];
sprite->data[5] &= 0xFF;
sprite->pos2.x = Cos(sprite->data[5], sprite->data[3]);
sprite->pos2.y = Sin(sprite->data[5], 5);
if (sprite->data[5] < 0x80)
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) - 1;
2018-12-16 18:35:10 +01:00
else
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1;
2018-12-16 18:35:10 +01:00
if (--sprite->data[0] == 0)
DestroyAnimSprite(sprite);
}
2018-12-20 04:13:26 +01:00
// Squeezes a constricting "rope" several times via affine animations.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: affine anim num
// arg 3: num squeezes
void AnimConstrictBinding(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimTarget(sprite, FALSE);
2018-12-16 18:35:10 +01:00
sprite->affineAnimPaused = 1;
StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]);
sprite->data[6] = gBattleAnimArgs[2];
sprite->data[7] = gBattleAnimArgs[3];
2018-12-20 04:13:26 +01:00
sprite->callback = AnimConstrictBindingStep1;
2018-12-16 18:35:10 +01:00
}
2018-12-20 04:13:26 +01:00
static void AnimConstrictBindingStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
u8 spriteId;
2018-12-16 18:35:10 +01:00
if ((u16)gBattleAnimArgs[7] == 0xFFFF)
{
sprite->affineAnimPaused = 0;
2018-12-20 04:13:26 +01:00
spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
2018-12-16 18:35:10 +01:00
sprite->data[0] = 0x100;
2018-12-20 04:13:26 +01:00
sprite->callback = AnimConstrictBindingStep2;
2018-12-16 18:35:10 +01:00
}
}
2018-12-20 04:13:26 +01:00
static void AnimConstrictBindingStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
2018-12-16 18:35:10 +01:00
if (!sprite->data[2])
sprite->data[0] += 11;
else
sprite->data[0] -= 11;
if (++sprite->data[1] == 6)
{
sprite->data[1] = 0;
sprite->data[2] ^= 1;
}
if (sprite->affineAnimEnded)
{
if (--sprite->data[7] > 0)
StartSpriteAffineAnim(sprite, sprite->data[6]);
else
DestroyAnimSprite(sprite);
}
}
2019-10-14 22:42:15 +02:00
void AnimTask_DuplicateAndShrinkToPos(u8 taskId)
2018-12-16 18:35:10 +01:00
{
u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
if (gSprites[spriteId].invisible)
{
DestroyAnimVisualTask(taskId);
}
else
{
2018-12-18 05:08:08 +01:00
PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND);
2018-12-16 18:35:10 +01:00
gTasks[taskId].data[14] = gSprites[spriteId].oam.priority;
2018-12-20 04:13:26 +01:00
gSprites[spriteId].oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget);
2018-12-16 18:35:10 +01:00
spriteId = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER);
gTasks[taskId].data[15] = gSprites[spriteId].oam.priority;
2018-12-20 04:13:26 +01:00
gSprites[spriteId].oam.priority = GetBattlerSpriteBGPriority(BATTLE_PARTNER(gBattleAnimTarget));
2018-12-16 18:35:10 +01:00
gTasks[taskId].data[0] = gBattleAnimArgs[0];
gTasks[taskId].data[1] = gBattleAnimArgs[1];
2018-12-20 04:13:26 +01:00
gTasks[taskId].data[11] = 0x100;
2019-10-14 22:42:15 +02:00
gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPosStep1;
2018-12-16 18:35:10 +01:00
}
}
2019-10-14 22:42:15 +02:00
static void AnimTask_DuplicateAndShrinkToPosStep1(u8 taskId)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
2018-12-16 18:35:10 +01:00
gTasks[taskId].data[10] += gTasks[taskId].data[0];
gSprites[spriteId].pos2.x = gTasks[taskId].data[10] >> 8;
2018-12-20 04:13:26 +01:00
if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x;
gTasks[taskId].data[11] += 16;
2018-12-18 05:08:08 +01:00
SetSpriteRotScale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0);
SetBattlerSpriteYOffsetFromYScale(spriteId);
2018-12-16 18:35:10 +01:00
if (--gTasks[taskId].data[1] == 0)
{
gTasks[taskId].data[0] = 0;
2019-10-14 22:42:15 +02:00
gTasks[taskId].func = AnimTask_DuplicateAndShrinkToPosStep2;
2018-12-16 18:35:10 +01:00
}
}
2019-10-14 22:42:15 +02:00
static void AnimTask_DuplicateAndShrinkToPosStep2(u8 taskId)
2018-12-16 18:35:10 +01:00
{
if ((u16)gBattleAnimArgs[7] == 0xFFFF)
{
if (gTasks[taskId].data[0] == 0)
{
u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET);
2018-12-18 05:08:08 +01:00
ResetSpriteRotScale(spriteId);
2018-12-16 18:35:10 +01:00
gSprites[spriteId].pos2.x = 0;
gSprites[spriteId].pos2.y = 0;
gSprites[spriteId].oam.priority = gTasks[taskId].data[14];
spriteId = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER);
gSprites[spriteId].oam.priority = gTasks[taskId].data[15];
gTasks[taskId].data[0]++;
return;
}
}
else
{
if (gTasks[taskId].data[0] == 0)
return;
}
gTasks[taskId].data[0]++;
if (gTasks[taskId].data[0] == 3)
DestroyAnimVisualTask(taskId);
}
2018-12-20 04:13:26 +01:00
// Moves an orb from the target mon to the attacking mon.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
void AnimMimicOrb(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
switch (sprite->data[0])
{
case 0:
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
gBattleAnimArgs[0] *= -1;
2018-12-20 04:13:26 +01:00
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[0];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[1];
2018-12-16 18:35:10 +01:00
sprite->invisible = 1;
sprite->data[0]++;
break;
case 1:
sprite->invisible = 0;
if (sprite->affineAnimEnded)
{
ChangeSpriteAffineAnim(sprite, 1);
sprite->data[0] = 25;
2018-12-20 04:13:26 +01:00
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
sprite->callback = InitAndRunAnimFastLinearTranslation;
2018-12-16 18:35:10 +01:00
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
break;
}
}
}
2018-12-20 04:13:26 +01:00
// Animates a root that flickers away after some time.
// arg 0: x pixel offset
// arg 1: y pixel offset
// arg 2: sprite subpriority offset
// arg 3: sprite anim num
// arg 4: duration
void AnimIngrainRoot(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (!sprite->data[0])
{
2018-12-20 04:13:26 +01:00
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
2018-12-16 18:35:10 +01:00
sprite->pos2.x = gBattleAnimArgs[0];
sprite->pos2.y = gBattleAnimArgs[1];
sprite->subpriority = gBattleAnimArgs[2] + 30;
StartSpriteAnim(sprite, gBattleAnimArgs[3]);
sprite->data[2] = gBattleAnimArgs[4];
sprite->data[0]++;
if (sprite->pos1.y + sprite->pos2.y > 120)
sprite->pos1.y += sprite->pos2.y + sprite->pos1.y - 120;
}
2018-12-20 04:13:26 +01:00
sprite->callback = AnimRootFlickerOut;
2018-12-16 18:35:10 +01:00
}
2018-12-20 04:13:26 +01:00
// Places a root on the path to the target mon that flickers away after some time.
// arg 0: percent along the path to the target mon
// arg 1: x pixel offset
// arg 2: y pixel offset
// arg 3: sprite subpriority offset
// arg 4: sprite anum num
// arg 5: duration
void AnimFrenzyPlantRoot(struct Sprite *sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
s16 attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2);
s16 attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET);
s16 targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2);
s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET);
2018-12-16 18:35:10 +01:00
2018-12-20 04:13:26 +01:00
targetX -= attackerX;
targetY -= attackerY;
sprite->pos1.x = attackerX + targetX * gBattleAnimArgs[0] / 100;
sprite->pos1.y = attackerY + targetY * gBattleAnimArgs[0] / 100;
2018-12-16 18:35:10 +01:00
sprite->pos2.x = gBattleAnimArgs[1];
sprite->pos2.y = gBattleAnimArgs[2];
sprite->subpriority = gBattleAnimArgs[3] + 30;
StartSpriteAnim(sprite, gBattleAnimArgs[4]);
sprite->data[2] = gBattleAnimArgs[5];
2018-12-20 04:13:26 +01:00
sprite->callback = AnimRootFlickerOut;
2018-12-16 18:35:10 +01:00
gUnknown_0203A0F8[0] = sprite->pos1.x;
gUnknown_0203A0F8[1] = sprite->pos1.y;
2018-12-20 04:13:26 +01:00
gUnknown_0203A0F8[2] = targetX;
gUnknown_0203A0F8[3] = targetY;
2018-12-16 18:35:10 +01:00
}
2018-12-20 04:13:26 +01:00
static void AnimRootFlickerOut(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[0] > (sprite->data[2] - 10))
sprite->invisible = sprite->data[0] % 2;
if (sprite->data[0] > sprite->data[2])
DestroyAnimSprite(sprite);
}
2018-12-20 04:13:26 +01:00
// Moves an orb in a fast wavy path.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: horizontal velocity
// arg 3: wave amplitude
// arg 4: duration
void AnimIngrainOrb(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (!sprite->data[0])
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[0];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[1];
sprite->data[1] = gBattleAnimArgs[2];
sprite->data[2] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[4];
}
sprite->data[0]++;
sprite->pos2.x = sprite->data[1] * sprite->data[0];
sprite->pos2.y = Sin((sprite->data[0] * 20) & 0xFF, sprite->data[2]);
if (sprite->data[0] > sprite->data[3])
DestroyAnimSprite(sprite);
}
2019-10-14 22:42:15 +02:00
static void AnimFallingItemStep(struct Sprite* sprite, s16 c)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
int a = (sprite->pos1.x << 8) | sprite->pos1.y;
int b = (sprite->data[6] << 8) | sprite->data[7];
c <<= 8;
2018-12-16 18:35:10 +01:00
sprite->data[5] = a;
sprite->data[6] = b;
sprite->data[7] = c;
}
2019-10-14 22:42:15 +02:00
bool8 moveAlongLinearPath (struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2019-10-14 22:42:15 +02:00
u16 xStartPos = (u8)(sprite->data[5] >> 8);
u16 yStartPos = (u8)sprite->data[5];
s32 xEndPos = (u8)(sprite->data[6] >> 8);
s32 yEndPos = (u8)sprite->data[6];
s16 totalTime = sprite->data[7] >> 8;
s16 currentTime = sprite->data[7] & 0xFF;
2018-12-16 18:35:10 +01:00
s16 r4_2;
s16 r0;
s32 var1;
s32 var2;
2019-10-14 22:42:15 +02:00
if (xEndPos == 0)
xEndPos = -32;
else if (xEndPos == 255)
xEndPos = 272;
r4_2 = yEndPos - yStartPos;
r0 = xEndPos - xStartPos;
var1 = r0 * currentTime / totalTime;
var2 = r4_2 * currentTime / totalTime;
sprite->pos1.x = var1 + xStartPos;
sprite->pos1.y = var2 + yStartPos;
if (++currentTime == totalTime)
2018-12-16 18:35:10 +01:00
return TRUE;
2019-10-14 22:42:15 +02:00
sprite->data[7] = (totalTime << 8) | currentTime;
2018-12-16 18:35:10 +01:00
return FALSE;
}
2019-10-14 22:42:15 +02:00
void AnimItemStealStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0] == 10)
StartSpriteAffineAnim(sprite, 1);
sprite->data[0]++;
if (sprite->data[0] > 50)
DestroyAnimSprite(sprite);
}
2019-10-14 22:42:15 +02:00
static void AnimFallingItemStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->data[0] += sprite->data[3] * 128 / sprite->data[4];
if (sprite->data[0] >= 128)
{
sprite->data[1]++;
sprite->data[0] = 0;
}
sprite->pos2.y = Sin(sprite->data[0] + 128, 30 - sprite->data[1] * 8);
2019-10-14 22:42:15 +02:00
if (moveAlongLinearPath (sprite))
2018-12-16 18:35:10 +01:00
{
sprite->pos2.y = 0;
sprite->data[0] = 0;
2019-10-14 22:42:15 +02:00
sprite->callback = AnimItemStealStep2;
2018-12-16 18:35:10 +01:00
}
}
2018-12-20 04:13:26 +01:00
void AnimPresent(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
s16 targetX;
s16 targetY;
InitSpritePosToAnimAttacker(sprite, FALSE);
targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X);
targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
2018-12-16 18:35:10 +01:00
if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget)
{
2018-12-20 04:13:26 +01:00
sprite->data[6] = targetX;
sprite->data[7] = targetY + 10;
2019-10-14 22:42:15 +02:00
AnimFallingItemStep(sprite, 60);
2018-12-16 18:35:10 +01:00
sprite->data[3] = 1;
}
else
{
2018-12-20 04:13:26 +01:00
sprite->data[6] = targetX;
sprite->data[7] = targetY + 10;
2019-10-14 22:42:15 +02:00
AnimFallingItemStep(sprite, 60);
2018-12-16 18:35:10 +01:00
sprite->data[3] = 3;
}
sprite->data[4] = 60;
2019-10-14 22:42:15 +02:00
sprite->callback = AnimFallingItemStep;
2018-12-16 18:35:10 +01:00
}
2019-10-14 22:42:15 +02:00
static void AnimFallingItemStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
int zero;
sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
zero = 0;
if (sprite->data[0] > 0x7F)
{
sprite->data[1]++;
sprite->data[0] = zero;
}
sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
2019-10-14 22:42:15 +02:00
if (moveAlongLinearPath (sprite))
2018-12-16 18:35:10 +01:00
{
sprite->pos2.y = zero;
sprite->data[0] = zero;
DestroyAnimSprite(sprite);
}
}
2018-12-20 04:13:26 +01:00
void AnimKnockOffItem(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y);
2018-12-16 18:35:10 +01:00
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
{
sprite->data[6] = 0;
2018-12-20 04:13:26 +01:00
sprite->data[7] = targetY + 10;
2019-10-14 22:42:15 +02:00
AnimFallingItemStep(sprite, 40);
2018-12-16 18:35:10 +01:00
sprite->data[3] = 3;
2018-12-20 04:13:26 +01:00
sprite->data[4] = 60;
2019-10-14 22:42:15 +02:00
sprite->callback = AnimFallingItemStep;
2018-12-16 18:35:10 +01:00
}
else
{
sprite->data[6] = 255;
2018-12-20 04:13:26 +01:00
sprite->data[7] = targetY + 10;
2018-12-16 18:35:10 +01:00
if (IsContest())
sprite->data[6] = 0;
2019-10-14 22:42:15 +02:00
AnimFallingItemStep(sprite, 40);
2018-12-16 18:35:10 +01:00
sprite->data[3] = 3;
2018-12-20 04:13:26 +01:00
sprite->data[4] = 60;
2019-10-14 22:42:15 +02:00
sprite->callback = AnimFallingItemStep;
2018-12-16 18:35:10 +01:00
}
}
2018-12-20 04:13:26 +01:00
// Animates a heal particle upward.
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: vertical velocity
// arg 3: unused
void AnimPresentHealParticle(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
if (!sprite->data[0])
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimTarget(sprite, FALSE);
2018-12-16 18:35:10 +01:00
sprite->data[1] = gBattleAnimArgs[2];
}
sprite->data[0]++;
sprite->pos2.y = sprite->data[1] * sprite->data[0];
if (sprite->animEnded)
DestroyAnimSprite(sprite);
}
2018-12-20 04:13:26 +01:00
void AnimItemSteal(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
s16 attackerX;
s16 attackerY;
InitSpritePosToAnimTarget(sprite, FALSE);
attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X);
attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y);
2018-12-16 18:35:10 +01:00
if (BATTLE_PARTNER(gBattleAnimTarget) == gBattleAnimAttacker)
{
2018-12-20 04:13:26 +01:00
sprite->data[6] = attackerX;
sprite->data[7] = attackerY + 10;
2019-10-14 22:42:15 +02:00
AnimFallingItemStep(sprite, 60);
2018-12-16 18:35:10 +01:00
sprite->data[3] = 1;
}
else
{
2018-12-20 04:13:26 +01:00
sprite->data[6] = attackerX;
sprite->data[7] = attackerY + 10;
2019-10-14 22:42:15 +02:00
AnimFallingItemStep(sprite, 60);
2018-12-16 18:35:10 +01:00
sprite->data[3] = 3;
}
sprite->data[4] = 60;
2019-10-14 22:42:15 +02:00
sprite->callback = AnimItemStealStep1;
2018-12-16 18:35:10 +01:00
}
2019-10-14 22:42:15 +02:00
static void AnimItemStealStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
int zero;
sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]);
zero = 0;
if (sprite->data[0] > 127)
{
sprite->data[1]++;
sprite->data[0] = zero;
}
sprite->pos2.y = Sin(sprite->data[0] + 0x80, 30 - sprite->data[1] * 8);
if (sprite->pos2.y == 0)
PlaySE12WithPanning(SE_W145B, BattleAnimAdjustPanning(63));
2019-10-14 22:42:15 +02:00
if (moveAlongLinearPath (sprite))
2018-12-16 18:35:10 +01:00
{
sprite->pos2.y = 0;
sprite->data[0] = 0;
2019-10-14 22:42:15 +02:00
sprite->callback = AnimItemStealStep2;
2018-12-16 18:35:10 +01:00
PlaySE12WithPanning(SE_W145B, BattleAnimAdjustPanning(-64));
}
}
2018-12-20 04:13:26 +01:00
// Moves a bag in a circular motion.
// arg 0: y position
// arg 1: initial wave offset
void AnimTrickBag(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
int a;
int b;
if (!sprite->data[0])
{
if (!IsContest())
{
sprite->data[1] = gBattleAnimArgs[1];
sprite->pos1.x = 120;
}
else
{
a = gBattleAnimArgs[1] - 32;
if (a < 0)
b = gBattleAnimArgs[1] + 0xDF;
else
b = a;
sprite->data[1] = a - ((b >> 8) << 8);
sprite->pos1.x = 70;
}
sprite->pos1.y = gBattleAnimArgs[0];
sprite->data[2] = gBattleAnimArgs[0];
sprite->data[4] = 20;
sprite->pos2.x = Cos(sprite->data[1], 60);
sprite->pos2.y = Sin(sprite->data[1], 20);
2018-12-20 04:13:26 +01:00
sprite->callback = AnimTrickBagStep1;
2018-12-16 18:35:10 +01:00
if (sprite->data[1] > 0 && sprite->data[1] < 192)
sprite->subpriority = 31;
else
sprite->subpriority = 29;
}
}
2018-12-20 04:13:26 +01:00
static void AnimTrickBagStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
switch (sprite->data[3])
{
case 0:
if (sprite->data[2] > 78)
{
sprite->data[3] = 1;
StartSpriteAffineAnim(sprite, 1);
break;
}
else
{
sprite->data[2] += sprite->data[4] / 10;
sprite->data[4] += 3;
sprite->pos1.y = sprite->data[2];
break;
}
break;
case 1:
if (sprite->data[3] && sprite->affineAnimEnded)
{
sprite->data[0] = 0;
sprite->data[2] = 0;
2018-12-20 04:13:26 +01:00
sprite->callback = AnimTrickBagStep2;
2018-12-16 18:35:10 +01:00
}
break;
}
}
2018-12-20 04:13:26 +01:00
static void AnimTrickBagStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[2] == gTrickBagCoordinates[sprite->data[0]][1])
2018-12-16 18:35:10 +01:00
{
if (gTrickBagCoordinates[sprite->data[0]][2] == 127)
2018-12-16 18:35:10 +01:00
{
sprite->data[0] = 0;
2018-12-20 04:13:26 +01:00
sprite->callback = AnimTrickBagStep3;
2018-12-16 18:35:10 +01:00
}
sprite->data[2] = 0;
sprite->data[0]++;
}
else
{
sprite->data[2]++;
sprite->data[1] = (gTrickBagCoordinates[sprite->data[0]][0] * gTrickBagCoordinates[sprite->data[0]][2] + sprite->data[1]) & 0xFF;
2018-12-16 18:35:10 +01:00
if (!IsContest())
{
if ((u16)(sprite->data[1] - 1) < 191)
sprite->subpriority = 31;
else
sprite->subpriority = 29;
}
sprite->pos2.x = Cos(sprite->data[1], 60);
sprite->pos2.y = Sin(sprite->data[1], 20);
}
}
2018-12-20 04:13:26 +01:00
static void AnimTrickBagStep3(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0] > 20)
DestroyAnimSprite(sprite);
sprite->invisible = sprite->data[0] % 2;
sprite->data[0]++;
}
void AnimTask_LeafBlade(u8 taskId)
2018-12-16 18:35:10 +01:00
{
struct Task *task = &gTasks[taskId];
2018-12-18 05:08:08 +01:00
task->data[4] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1;
2018-12-16 18:35:10 +01:00
task->data[6] = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
2018-12-30 17:58:42 +01:00
task->data[10] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH);
task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT);
2018-12-16 18:35:10 +01:00
task->data[5] = (GetBattlerSide(gBattleAnimTarget) == B_SIDE_OPPONENT) ? 1 : -1;
task->data[9] = 56 - (task->data[5] * 64);
task->data[8] = task->data[7] - task->data[9] + task->data[6];
task->data[2] = CreateSprite(&gUnknown_08592778, task->data[8], task->data[9], task->data[4]);
if (task->data[2] == MAX_SPRITES)
DestroyAnimVisualTask(taskId);
gSprites[task->data[2]].data[0] = 10;
gSprites[task->data[2]].data[1] = task->data[8];
gSprites[task->data[2]].data[2] = task->data[6] - (task->data[10] / 2 + 10) * task->data[5];
gSprites[task->data[2]].data[3] = task->data[9];
gSprites[task->data[2]].data[4] = task->data[7] + (task->data[11] / 2 + 10) * task->data[5];
gSprites[task->data[2]].data[5] = AnimTask_LeafBladeStep2(&gSprites[task->data[2]]);
2018-12-16 18:35:10 +01:00
InitAnimArcTranslation(&gSprites[task->data[2]]);
task->func = AnimTask_LeafBladeStep1;
2018-12-16 18:35:10 +01:00
}
static void AnimTask_LeafBladeStep1(u8 taskId)
2018-12-16 18:35:10 +01:00
{
struct Task* task = &gTasks[taskId];
struct Sprite* sprite = &gSprites[task->data[2]];
int a = task->data[0];
switch (a)
{
case 4:
AnimTask_LeafBladeStep3(task, taskId);
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
{
task->data[15] = 5;
task->data[0] = 0xFF;
}
break;
case 8:
AnimTask_LeafBladeStep3(task, taskId);
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
{
task->data[15] = 9;
task->data[0] = 0xFF;
}
break;
case 0:
AnimTask_LeafBladeStep3(task, taskId);
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
{
task->data[15] = 1;
task->data[0] = 0xFF;
}
break;
case 1:
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
sprite->data[0] = 10;
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = task->data[6];
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = task->data[7];
sprite->data[5] = AnimTask_LeafBladeStep2(sprite);
2018-12-16 18:35:10 +01:00
task->data[4] += 2;
task->data[3] = a;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
InitAnimArcTranslation(sprite);
task->data[0]++;
break;
case 2:
AnimTask_LeafBladeStep3(task, taskId);
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
{
task->data[15] = 3;
task->data[0] = 0xFF;
}
break;
case 3:
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
sprite->data[0] = 10;
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = task->data[7] - ((task->data[11] / 2) + 10) * task->data[5];
sprite->data[5] = AnimTask_LeafBladeStep2(sprite);
2018-12-16 18:35:10 +01:00
task->data[3] = 2;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
InitAnimArcTranslation(sprite);
task->data[0]++;
break;
case 5:
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
sprite->data[0] = 10;
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = task->data[6] + ((task->data[10] / 2) + 10) * task->data[5];
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];
sprite->data[5] = AnimTask_LeafBladeStep2(sprite);
2018-12-16 18:35:10 +01:00
task->data[4] -= 2;
task->data[3] = 3;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
InitAnimArcTranslation(sprite);
task->data[0]++;
break;
case 6:
AnimTask_LeafBladeStep3(task, taskId);
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
{
task->data[15] = 7;
task->data[0] = 0xFF;
}
break;
case 7:
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
sprite->data[0] = 10;
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = task->data[6];
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = task->data[7];
sprite->data[5] = AnimTask_LeafBladeStep2(sprite);
2018-12-16 18:35:10 +01:00
task->data[4] += 2;
task->data[3] = 4;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
InitAnimArcTranslation(sprite);
task->data[0]++;
break;
case 9:
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
sprite->data[0] = 10;
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = task->data[6] - ((task->data[10] / 2) + 10) * task->data[5];
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = task->data[7] + ((task->data[11] / 2) + 10) * task->data[5];
sprite->data[5] = AnimTask_LeafBladeStep2(sprite);
2018-12-16 18:35:10 +01:00
task->data[3] = 5;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
InitAnimArcTranslation(sprite);
task->data[0]++;
break;
case 10:
AnimTask_LeafBladeStep3(task, taskId);
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
{
task->data[15] = 11;
task->data[0] = 0xFF;
}
break;
case 11:
{
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.x = 0;
sprite->pos2.y = 0;
sprite->data[0] = 10;
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = task->data[8];
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = task->data[9];
sprite->data[5] = AnimTask_LeafBladeStep2(sprite);
2018-12-16 18:35:10 +01:00
task->data[4] -= 2;
task->data[3] = 6;
sprite->subpriority = task->data[4];
StartSpriteAnim(sprite, task->data[3]);
InitAnimArcTranslation(sprite);
task->data[0]++;
break;
}
case 12:
AnimTask_LeafBladeStep3(task, taskId);
2019-02-06 20:17:09 +01:00
if (TranslateAnimHorizontalArc(sprite))
2018-12-16 18:35:10 +01:00
{
DestroySprite(sprite);
task->data[0]++;
}
break;
case 13:
if (task->data[12] == 0)
DestroyAnimVisualTask(taskId);
break;
case 0xFF:
if (++task->data[1] > 5)
{
task->data[1] = 0;
task->data[0] = task->data[15];
}
break;
}
}
static s16 AnimTask_LeafBladeStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
s16 var = 8;
if (sprite->data[4] < sprite->pos1.y)
var = -var;
return var;
}
static void AnimTask_LeafBladeStep3(struct Task* task, u8 taskId)
2018-12-16 18:35:10 +01:00
{
task->data[14]++;
if (task->data[14] > 0)
{
u8 spriteId;
s16 spriteX;
s16 spriteY;
task->data[14] = 0;
spriteX = gSprites[task->data[2]].pos1.x + gSprites[task->data[2]].pos2.x;
spriteY = gSprites[task->data[2]].pos1.y + gSprites[task->data[2]].pos2.y;
spriteId = CreateSprite(&gUnknown_08592778, spriteX, spriteY, task->data[4]);
if (spriteId != MAX_SPRITES)
{
gSprites[spriteId].data[6] = taskId;
gSprites[spriteId].data[7] = 12;
gTasks[taskId].data[12]++;
gSprites[spriteId].data[0] = task->data[13] & 1;
gTasks[taskId].data[13]++;
StartSpriteAnim(&gSprites[spriteId], task->data[3]);
gSprites[spriteId].subpriority = task->data[4];
gSprites[spriteId].callback = AnimTask_LeafBladeStep4;
2018-12-16 18:35:10 +01:00
}
}
}
static void AnimTask_LeafBladeStep4(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->data[0]++;
if (sprite->data[0] > 1)
{
sprite->data[0] = 0;
sprite->invisible ^= 1;
sprite->data[1]++;
if (sprite->data[1] > 8)
{
gTasks[sprite->data[6]].data[sprite->data[7]]--;
DestroySprite(sprite);
}
}
}
void AnimFlyingParticle(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
u8 battler;
if (!gBattleAnimArgs[6])
battler = gBattleAnimAttacker;
else
battler = gBattleAnimTarget;
if (GetBattlerSide(battler) != B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
{
sprite->data[4] = 0;
sprite->data[2] = gBattleAnimArgs[3];
sprite->pos1.x = 0xFFF0;
}
else
{
sprite->data[4] = 1;
sprite->data[2] = -gBattleAnimArgs[3];
sprite->pos1.x = 0x100;
}
sprite->data[1] = gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[3] = gBattleAnimArgs[4];
switch (gBattleAnimArgs[5])
{
case 0:
sprite->pos1.y = gBattleAnimArgs[0];
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(battler);
2018-12-16 18:35:10 +01:00
break;
case 1:
sprite->pos1.y = gBattleAnimArgs[0];
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1;
2018-12-16 18:35:10 +01:00
break;
case 2:
sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) + gBattleAnimArgs[0];
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(battler);
2018-12-16 18:35:10 +01:00
break;
case 3:
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[0];
GetAnimBattlerSpriteId(ANIM_TARGET);
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1;
2018-12-16 18:35:10 +01:00
break;
}
sprite->callback = AnimFlyingParticleStep;
2018-12-16 18:35:10 +01:00
}
static void AnimFlyingParticleStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
int a = sprite->data[7];
sprite->data[7]++;
sprite->pos2.y = (sprite->data[1] * gSineTable[sprite->data[0]]) >> 8;
sprite->pos2.x = sprite->data[2] * a;
sprite->data[0] = (sprite->data[3] * a) & 0xFF;
if (!sprite->data[4])
{
if (sprite->pos2.x + sprite->pos1.x <= 0xF7)
return;
}
else
{
if (sprite->pos2.x + sprite->pos1.x > -16)
return;
}
2018-12-18 05:08:08 +01:00
DestroySpriteAndMatrix(sprite);
2018-12-16 18:35:10 +01:00
}
2019-10-14 22:42:15 +02:00
void AnimTask_MagicalLeafRainbowBlend(u8 taskId)
2018-12-16 18:35:10 +01:00
{
struct Task* task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
task->data[8] = IndexOfSpritePaletteTag(ANIM_TAG_LEAF) * 16 + 256;
task->data[12] = IndexOfSpritePaletteTag(ANIM_TAG_RAZOR_LEAF) * 16 + 256;
task->data[0]++;
break;
case 1:
if (++task->data[9] >= 0)
{
task->data[9] = 0;
BlendPalette(task->data[8], 16, task->data[10], gMagicalLeafBlendColors[task->data[11]]);
BlendPalette(task->data[12], 16, task->data[10], gMagicalLeafBlendColors[task->data[11]]);
if (++task->data[10] == 17)
{
task->data[10] = 0;
if (++task->data[11] == 7)
task->data[11] = 0;
}
}
break;
}
if (gBattleAnimArgs[7] == -1)
DestroyAnimVisualTask(taskId);
}
2019-10-14 21:17:38 +02:00
void AnimNeedleArmSpike(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
u8 a;
u8 b;
u16 c;
u16 x;
u16 y;
if (gBattleAnimArgs[4] == 0)
{
DestroyAnimSprite(sprite);
}
else
{
if (gBattleAnimArgs[0] == 0)
{
a = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
b = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
}
else
{
a = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
b = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
}
sprite->data[0] = gBattleAnimArgs[4];
if (gBattleAnimArgs[1] == 0)
{
sprite->pos1.x = gBattleAnimArgs[2] + a;
sprite->pos1.y = gBattleAnimArgs[3] + b;
sprite->data[5] = a;
sprite->data[6] = b;
}
else
{
sprite->pos1.x = a;
sprite->pos1.y = b;
sprite->data[5] = gBattleAnimArgs[2] + a;
sprite->data[6] = gBattleAnimArgs[3] + b;
}
x = sprite->pos1.x;
sprite->data[1] = x * 16;
y = sprite->pos1.y;
sprite->data[2] = y * 16;
sprite->data[3] = (sprite->data[5] - sprite->pos1.x) * 16 / gBattleAnimArgs[4];
sprite->data[4] = (sprite->data[6] - sprite->pos1.y) * 16 / gBattleAnimArgs[4];
c = ArcTan2Neg(sprite->data[5] - x, sprite->data[6] - y);
if (IsContest())
c -= 0x8000;
2018-12-18 05:08:08 +01:00
TrySetSpriteRotScale(sprite, 0, 0x100, 0x100, c);
sprite->callback = AnimNeedleArmSpikeStep;
2018-12-16 18:35:10 +01:00
}
}
static void AnimNeedleArmSpikeStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0])
{
sprite->data[1] += sprite->data[3];
sprite->data[2] += sprite->data[4];
sprite->pos1.x = sprite->data[1] >> 4 ;
sprite->pos1.y = sprite->data[2] >> 4 ;
sprite->data[0]--;
}
else
{
2018-12-18 05:08:08 +01:00
DestroySpriteAndMatrix(sprite);
2018-12-16 18:35:10 +01:00
}
}
2019-10-14 22:42:15 +02:00
static void AnimWhipHitStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->animEnded)
DestroyAnimSprite(sprite);
}
void sub_81009F8(struct Sprite* sprite)
{
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
{
sprite->pos1.x -= gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
}
else
{
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
}
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAnimEnds;
2018-12-16 18:35:10 +01:00
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
2019-10-14 22:42:15 +02:00
void AnimWhipHit(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2019-04-02 08:36:22 +02:00
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
StartSpriteAnim(sprite, 1);
2019-10-14 22:42:15 +02:00
sprite->callback = AnimWhipHitStep;
2018-12-20 04:13:26 +01:00
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
2018-12-16 18:35:10 +01:00
sprite->pos1.y += gBattleAnimArgs[1];
}
void sub_8100A94(struct Sprite* sprite)
{
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[1] = gBattleAnimArgs[3];
sprite->data[3] = gBattleAnimArgs[4];
sprite->data[5] = gBattleAnimArgs[5];
StartSpriteAffineAnim(sprite, gBattleAnimArgs[6]);
2018-12-18 05:08:08 +01:00
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
2019-02-06 20:17:09 +01:00
sprite->callback = TranslateSpriteLinearAndFlicker;
2018-12-16 18:35:10 +01:00
}
// Moves the sprite in a diagonally slashing motion across the target mon.
2019-04-02 08:36:22 +02:00
// Used by moves such as MOVE_CUT and MOVE_AERIAL_ACE.
2018-12-16 18:35:10 +01:00
// arg 0: initial x pixel offset
// arg 1: initial y pixel offset
// arg 2: slice direction; 0 = right-to-left, 1 = left-to-right
void AnimCuttingSlice(struct Sprite* sprite)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
sprite->pos1.y += 8;
sprite->callback = AnimSliceStep;
if (gBattleAnimArgs[2] == 0)
{
sprite->pos1.x += gBattleAnimArgs[0];
}
else
{
sprite->pos1.x -= gBattleAnimArgs[0];
sprite->hFlip = 1;
}
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[1] -= 0x400;
sprite->data[2] += 0x400;
sprite->data[5] = gBattleAnimArgs[2];
if (sprite->data[5] == 1)
sprite->data[1] = -sprite->data[1];
}
void AnimAirCutterSlice(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
u8 a;
u8 b;
switch (gBattleAnimArgs[3])
{
case 1:
a = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), 0);
b = GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), 1);
break;
case 2:
a = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
b = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
if (IsBattlerSpriteVisible(BATTLE_PARTNER(gBattleAnimTarget)))
{
a = (GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), 0) + a) / 2;
b = (GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), 1) + b) / 2;
}
break;
case 0:
default:
a = GetBattlerSpriteCoord(gBattleAnimTarget, 0);
b = GetBattlerSpriteCoord(gBattleAnimTarget, 1);
break;
}
sprite->pos1.x = a;
sprite->pos1.y = b;
if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
sprite->pos1.y += 8;
sprite->callback = AnimSliceStep;
if (gBattleAnimArgs[2] == 0)
{
sprite->pos1.x += gBattleAnimArgs[0];
}
else
{
sprite->pos1.x -= gBattleAnimArgs[0];
sprite->hFlip = 1;
}
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[1] -= 0x400;
sprite->data[2] += 0x400;
sprite->data[5] = gBattleAnimArgs[2];
if (sprite->data[5] == 1)
sprite->data[1] = -sprite->data[1];
}
static void AnimSliceStep(struct Sprite* sprite)
{
sprite->data[3] += sprite->data[1];
sprite->data[4] += sprite->data[2];
if (sprite->data[5] == 0)
sprite->data[1] += 0x18;
else
sprite->data[1] -= 0x18;
sprite->data[2] -= 0x18;
sprite->pos2.x = sprite->data[3] >> 8;
sprite->pos2.y = sprite->data[4] >> 8;
sprite->data[0]++;
if (sprite->data[0] == 20)
{
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
sprite->data[0] = 3;
sprite->callback = WaitAnimForDuration;
}
}
void unref_sub_8100D38(struct Sprite* sprite)
{
if (sprite->data[2] > 1)
{
if (sprite->data[3] & 1)
{
sprite->invisible = 0;
gSprites[sprite->data[0]].invisible = 0;
gSprites[sprite->data[1]].invisible = 0;
}
else
{
sprite->invisible = 1;
gSprites[sprite->data[0]].invisible = 1;
gSprites[sprite->data[1]].invisible = 1;
}
sprite->data[2] = 0;
sprite->data[3]++;
}
else
{
sprite->data[2]++;
}
if (sprite->data[3] == 10)
{
DestroySprite(&gSprites[sprite->data[0]]);
DestroySprite(&gSprites[sprite->data[1]]);
DestroyAnimSprite(sprite);
}
}
void sub_8100E1C(struct Sprite* sprite)
{
sprite->data[0] = gBattleAnimArgs[2];
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
sprite->pos1.x -= gBattleAnimArgs[0];
else
sprite->pos1.x += gBattleAnimArgs[0];
StartSpriteAnim(sprite, gBattleAnimArgs[5]);
sprite->data[1] = -gBattleAnimArgs[3];
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[3] = gBattleAnimArgs[4];
sprite->callback = sub_8100E80;
sprite->callback(sprite);
}
static void sub_8100E80(struct Sprite* sprite)
{
sprite->pos2.x = Cos(sprite->data[0], 100);
sprite->pos2.y = Sin(sprite->data[0], 20);
if (sprite->data[0] < 128)
sprite->subpriority = 0;
else
sprite->subpriority = 14;
sprite->data[0] = (sprite->data[0] + sprite->data[1]) & 0xFF;
sprite->data[5] += 0x82;
sprite->pos2.y += sprite->data[5] >> 8;
sprite->data[2]++;
if (sprite->data[2] == sprite->data[3])
DestroyAnimSprite(sprite);
}
void AnimProtect(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (IsContest())
gBattleAnimArgs[1] += 8;
sprite->pos1.x = GetBattlerSpriteCoord2(gBattleAnimAttacker, 0) + gBattleAnimArgs[0];
sprite->pos1.y = GetBattlerSpriteCoord2(gBattleAnimAttacker, 1) + gBattleAnimArgs[1];
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER || IsContest())
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker) + 1;
2018-12-16 18:35:10 +01:00
else
2018-12-20 04:13:26 +01:00
sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker);
2018-12-16 18:35:10 +01:00
sprite->data[0] = gBattleAnimArgs[2];
sprite->data[2] = (IndexOfSpritePaletteTag(ANIM_TAG_PROTECT) << 4) + 0x100;
sprite->data[7] = 16;
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7]));
sprite->callback = AnimProtectStep;
2018-12-16 18:35:10 +01:00
}
static void AnimProtectStep(struct Sprite *sprite)
2018-12-16 18:35:10 +01:00
{
int a;
int i;
sprite->data[5] += 96;
sprite->pos2.x = -(sprite->data[5] >> 8);
if (++sprite->data[1] > 1)
{
sprite->data[1] = 0;
a = gPlttBufferFaded[sprite->data[2] + 1];
i = 0;
do
{
gPlttBufferFaded[sprite->data[2] + ++i] = gPlttBufferFaded[sprite->data[2] + i + 1];
} while (i < 6);
gPlttBufferFaded[sprite->data[2] + 7] = a;
}
if (sprite->data[7] > 6 && sprite->data[0] >0 && ++sprite->data[6] > 1)
{
sprite->data[6] = 0;
sprite->data[7] -= 1;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7]));
}
if (sprite->data[0] > 0)
{
sprite->data[0] -= 1;
}
else if (++sprite->data[6] > 1)
{
sprite->data[6] = 0;
sprite->data[7]++;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - sprite->data[7], sprite->data[7]));
if (sprite->data[7] == 16)
{
sprite->invisible = 1;
2019-02-06 20:17:09 +01:00
sprite->callback = DestroyAnimSpriteAndDisableBlend;
2018-12-16 18:35:10 +01:00
}
}
}
2019-10-14 21:17:38 +02:00
void AnimMilkBottle(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + 0xFFE8;
sprite->data[0] = 0;
sprite->data[1] = 0;
sprite->data[2] = 0;
sprite->data[3] = 0;
sprite->data[4] = 0;
sprite->data[6] = 0;
sprite->data[7] = 16;
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT2_ALL | BLDCNT_EFFECT_BLEND);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
sprite->callback = AnimMilkBottleStep1;
2018-12-16 18:35:10 +01:00
}
static void AnimMilkBottleStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
switch (sprite->data[0])
{
case 0:
if (++sprite->data[2] > 0)
{
sprite->data[2] = 0;
if (((++sprite->data[1]) & 1) != 0)
{
if (sprite->data[6] <= 15)
sprite->data[6]++;
}
else if (sprite->data[7] > 0)
sprite->data[7]--;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
if (sprite->data[6] == 16 && sprite->data[7] == 0)
{
sprite->data[1] = 0;
sprite->data[0]++;
}
}
break;
case 1:
if (++sprite->data[1] > 8)
{
sprite->data[1] = 0;
StartSpriteAffineAnim(sprite, 1);
sprite->data[0]++;
}
break;
case 2:
AnimMilkBottleStep2(sprite, 16, 4);
2018-12-16 18:35:10 +01:00
if (++sprite->data[1] > 2)
{
sprite->data[1] = 0;
sprite->pos1.y++;
}
if (++sprite->data[2] <= 29)
break;
if (sprite->data[2] & 1)
{
if (sprite->data[6] > 0)
sprite->data[6]--;
}
else if (sprite->data[7] <= 15)
{
sprite->data[7]++;
}
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(sprite->data[6], sprite->data[7]));
if (sprite->data[6] == 0 && sprite->data[7] == 16)
{
sprite->data[1] = 0;
sprite->data[2] = 0;
sprite->data[0]++;
}
break;
case 3:
sprite->invisible = 1;
sprite->data[0]++;
break;
case 4:
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0));
DestroyAnimSprite(sprite);
break;
}
}
static void AnimMilkBottleStep2(struct Sprite* sprite, int unk1, int unk2)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[3] <= 11)
sprite->data[4] += 2;
if ((u16)(sprite->data[3] - 0x12) <= 0x17)
sprite->data[4] -= 2;
if ((sprite->data[3]) > 0x2F)
sprite->data[4] += 2;
sprite->pos2.x = sprite->data[4] / 9;
sprite->pos2.y = sprite->data[4] / 14;
if (sprite->pos2.y < 0)
sprite->pos2.y *= -1;
sprite->data[3]++;
if (sprite->data[3] > 0x3B)
sprite->data[3] = 0;
}
void AnimGrantingStars(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (!gBattleAnimArgs[2])
2018-12-18 05:08:08 +01:00
SetSpriteCoordsToAnimAttackerCoords(sprite);
2018-12-16 18:35:10 +01:00
2018-12-20 04:13:26 +01:00
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
2018-12-16 18:35:10 +01:00
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[0] = gBattleAnimArgs[5];
sprite->data[1] = gBattleAnimArgs[3];
sprite->data[2] = gBattleAnimArgs[4];
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
2019-02-06 20:17:09 +01:00
sprite->callback = TranslateSpriteLinearFixedPoint;
2018-12-16 18:35:10 +01:00
}
void AnimSparkingStars(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
u8 battler;
if (!gBattleAnimArgs[2])
battler = gBattleAnimAttacker;
else
battler = gBattleAnimTarget;
if (IsDoubleBattle() && IsBattlerSpriteVisible(BATTLE_PARTNER(battler)))
{
SetAverageBattlerPositions(battler, gBattleAnimArgs[6], &sprite->pos1.x, &sprite->pos1.y);
2018-12-20 04:13:26 +01:00
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
2018-12-16 18:35:10 +01:00
sprite->pos1.y += gBattleAnimArgs[1];
}
else
{
if (!gBattleAnimArgs[6])
{
sprite->pos1.x = GetBattlerSpriteCoord(battler, 0);
sprite->pos1.y = GetBattlerSpriteCoord(battler, 1) + gBattleAnimArgs[1];
}
else
{
sprite->pos1.x = GetBattlerSpriteCoord(battler, 2);
sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) + gBattleAnimArgs[1];
}
2018-12-20 04:13:26 +01:00
SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]);
2018-12-16 18:35:10 +01:00
}
sprite->data[0] = gBattleAnimArgs[5];
sprite->data[1] = gBattleAnimArgs[3];
sprite->data[2] = gBattleAnimArgs[4];
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
2019-02-06 20:17:09 +01:00
sprite->callback = TranslateSpriteLinearFixedPoint;
2018-12-16 18:35:10 +01:00
}
void sub_8101440(struct Sprite* sprite)
{
2018-12-18 05:08:08 +01:00
SetSpriteCoordsToAnimAttackerCoords(sprite);
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
{
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
}
else
{
sprite->pos1.x -= gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
StartSpriteAnim(sprite, 1);
}
sprite->callback = sub_81014A0;
}
static void sub_81014A0(struct Sprite* sprite)
{
if (++sprite->data[0] > 30)
{
sprite->pos2.y = (30 - sprite->data[0]) / 3;
sprite->pos2.x = Sin(sprite->data[1] * 4, 3);
sprite->data[1]++;
}
if (sprite->animEnded)
DestroyAnimSprite(sprite);
}
void AnimSleepLetterZ(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-18 05:08:08 +01:00
SetSpriteCoordsToAnimAttackerCoords(sprite);
2018-12-16 18:35:10 +01:00
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
{
sprite->pos1.x += gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[3] = 1;
}
else
{
sprite->pos1.x -= gBattleAnimArgs[0];
sprite->pos1.y += gBattleAnimArgs[1];
sprite->data[3] = 0xFFFF;
StartSpriteAffineAnim(sprite, 1);
}
sprite->callback = AnimSleepLetterZStep;
2018-12-16 18:35:10 +01:00
}
static void AnimSleepLetterZStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->pos2.y = -(sprite->data[0] / 0x28);
sprite->pos2.x = sprite->data[4] / 10;
sprite->data[4] += sprite->data[3] * 2;
sprite->data[0] += sprite->data[1];
if (++sprite->data[1] > 60)
2018-12-18 05:08:08 +01:00
DestroySpriteAndMatrix(sprite);
2018-12-16 18:35:10 +01:00
}
void AnimLockOnTarget(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->pos1.x -= 32;
sprite->pos1.y -= 32;
sprite->data[0] = 20;
sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep1);
2018-12-16 18:35:10 +01:00
}
static void AnimLockOnTargetStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
switch (sprite->data[5] & 1)
{
case 0:
sprite->data[0] = 1;
sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep1);
2018-12-16 18:35:10 +01:00
break;
case 1:
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.y = 0;
sprite->pos2.x = 0;
sprite->data[0] = 8;
sprite->data[2] = sprite->pos1.x + gInclineMonCoordTable[sprite->data[5] >> 8][0];
sprite->data[4] = sprite->pos1.y + gInclineMonCoordTable[sprite->data[5] >> 8][1];
2018-12-16 18:35:10 +01:00
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep2);
2018-12-16 18:35:10 +01:00
sprite->data[5] += 0x100;
PlaySE12WithPanning(SE_W199, BattleAnimAdjustPanning(63));
break;
}
sprite->data[5] ^= 1;
}
static void AnimLockOnTargetStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if ((sprite->data[5] >> 8) == 4)
{
sprite->data[0] = 10;
sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep3);
2018-12-16 18:35:10 +01:00
}
else
{
sprite->callback = AnimLockOnTargetStep1;
2018-12-16 18:35:10 +01:00
}
}
static void AnimLockOnTargetStep3(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
s16 a;
s16 b;
if (sprite->oam.affineParam == 0)
{
sprite->data[0] = 3;
sprite->data[1] = 0;
sprite->data[2] = 0;
sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep4);
2018-12-16 18:35:10 +01:00
}
else
{
switch (sprite->oam.affineParam)
{
case 1:
a = -8;
b = -8;
break;
case 2:
a = -8;
b = 8;
break;
case 3:
a = 8;
b = -8;
break;
default:
a = 8;
b = 8;
break;
}
sprite->pos1.x += sprite->pos2.x;
sprite->pos1.y += sprite->pos2.y;
sprite->pos2.y = 0;
sprite->pos2.x = 0;
sprite->data[0] = 6;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + a;
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + b;
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, AnimLockOnTargetStep5);
2018-12-16 18:35:10 +01:00
}
}
static void AnimLockOnTargetStep4(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[2] == 0)
{
if ((sprite->data[1] += 3) > 16)
sprite->data[1] = 16;
}
else if ((sprite->data[1] -= 3) < 0)
{
sprite->data[1] = 0;
}
BlendPalettes(sub_80A75AC(1, 1, 1, 1, 1, 0, 0), sprite->data[1], RGB(31, 31, 31));
if (sprite->data[1] == 16)
{
int pal;
sprite->data[2]++;
pal = sprite->oam.paletteNum;
LoadPalette(&gPlttBufferUnfaded[0x108 + pal * 16], pal * 16 | 0x101, 4);
PlaySE12WithPanning(SE_W043, BattleAnimAdjustPanning(63));
}
else if (sprite->data[1] == 0)
{
sprite->callback = AnimLockOnTargetStep5;
2018-12-16 18:35:10 +01:00
}
}
static void AnimLockOnTargetStep5(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if ((u16)gBattleAnimArgs[7] == 0xFFFF)
{
sprite->data[1] = 0;
sprite->data[0] = 0;
sprite->callback = AnimLockOnTargetStep6;
2018-12-16 18:35:10 +01:00
}
}
static void AnimLockOnTargetStep6(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0] % 3 == 0)
{
sprite->data[1]++;
sprite->invisible ^= 1;
}
sprite->data[0]++;
if (sprite->data[1] == 8)
DestroyAnimSprite(sprite);
}
2019-10-14 21:17:38 +02:00
void AnimLockOnMoveTarget(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->oam.affineParam = gBattleAnimArgs[0];
if ((s16)sprite->oam.affineParam == 1)
{
sprite->pos1.x -= 0x18;
sprite->pos1.y -= 0x18;
}
else if ((s16)sprite->oam.affineParam == 2)
{
sprite->pos1.x -= 0x18;
sprite->pos1.y += 0x18;
sprite->oam.matrixNum = ST_OAM_VFLIP;
2018-12-16 18:35:10 +01:00
}
else if ((s16)sprite->oam.affineParam == 3)
{
sprite->pos1.x += 0x18;
sprite->pos1.y -= 0x18;
sprite->oam.matrixNum = ST_OAM_HFLIP;
2018-12-16 18:35:10 +01:00
}
else
{
sprite->pos1.x += 0x18;
sprite->pos1.y += 0x18;
sprite->oam.matrixNum = ST_OAM_HFLIP | ST_OAM_VFLIP;
2018-12-16 18:35:10 +01:00
}
sprite->oam.tileNum = (sprite->oam.tileNum + 16);
sprite->callback = AnimLockOnTarget;
2018-12-16 18:35:10 +01:00
sprite->callback(sprite);
}
void AnimInclineMon(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->invisible = 1;
sprite->data[0] = 0;
switch (gBattleAnimArgs[0])
{
case 0:
sprite->callback = AnimInclineMonStep1;
2018-12-16 18:35:10 +01:00
break;
case 1:
sprite->callback = AnimInclineMonStep2;
2018-12-16 18:35:10 +01:00
break;
case 2:
sprite->callback = AnimInclineMonStep3;
2018-12-16 18:35:10 +01:00
break;
default:
sprite->callback = AnimInclineMonStep4;
2018-12-16 18:35:10 +01:00
break;
}
}
static void AnimInclineMonStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->data[0] = 6;
sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker)) ? 2 : -2;
sprite->data[2] = 0;
sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
StoreSpriteCallbackInData6(sprite, AnimInclineMonStep1_Callback);
2019-02-06 20:17:09 +01:00
sprite->callback = TranslateMonSpriteLinear;
2018-12-16 18:35:10 +01:00
}
static void AnimInclineMonStep1_Callback(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0] == 0)
{
sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
2018-12-18 05:08:08 +01:00
PrepareBattlerSpriteForRotScale(sprite->data[3], ST_OAM_OBJ_NORMAL);
2018-12-16 18:35:10 +01:00
sprite->data[4] = (sprite->data[6] = GetBattlerSide(gBattleAnimAttacker)) ? 0x300 : 0xFFFFFD00;
sprite->data[5] = 0;
}
sprite->data[5] += sprite->data[4];
2018-12-18 05:08:08 +01:00
SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
SetBattlerSpriteYOffsetFromRotation(sprite->data[3]);
2018-12-16 18:35:10 +01:00
if (++sprite->data[0] > 3)
{
sprite->data[0] = 0;
sprite->callback = AnimInclineMonStep4;
2018-12-16 18:35:10 +01:00
}
}
static void AnimInclineMonStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->data[0] = 4;
sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker)) ? -3 : 3;
sprite->data[2] = 0;
sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
StoreSpriteCallbackInData6(sprite, AnimInclineMonStep4);
2019-02-06 20:17:09 +01:00
sprite->callback = TranslateMonSpriteLinear;
2018-12-16 18:35:10 +01:00
}
static void AnimInclineMonStep3(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[0] > 8)
{
sprite->data[0] = 0;
sprite->callback = AnimInclineMonStep3_Callback;
2018-12-16 18:35:10 +01:00
}
}
static void AnimInclineMonStep3_Callback(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0] == 0)
{
sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker];
sprite->data[6] = GetBattlerSide(gBattleAnimAttacker);
if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER)
{
sprite->data[4] = 0xFC00;
sprite->data[5] = 0xC00;
}
else
{
sprite->data[4] = 0x400;
sprite->data[5] = 0xF400;
}
}
sprite->data[5] += sprite->data[4];
2018-12-18 05:08:08 +01:00
SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]);
SetBattlerSpriteYOffsetFromRotation(sprite->data[3]);
2018-12-16 18:35:10 +01:00
if (++sprite->data[0] > 2)
{
2018-12-18 05:08:08 +01:00
ResetSpriteRotScale(sprite->data[3]);
sprite->callback = AnimInclineMonStep4;
2018-12-16 18:35:10 +01:00
}
}
static void AnimInclineMonStep4(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
DestroyAnimSprite(sprite);
}
void sub_8101B90(struct Sprite *sprite)
{
sprite->data[0] = 0;
sprite->callback = sub_8101BA0;
}
static void sub_8101BA0(struct Sprite *sprite)
{
switch (sprite->data[0])
{
case 0:
sprite->data[1] = 0;
sprite->data[2] = gBattlerSpriteIds[gBattleAnimAttacker];
sprite->data[3] = GetBattlerSide(gBattleAnimAttacker);
sprite->data[4] = (sprite->data[3] != B_SIDE_PLAYER) ? 0x200 : -0x200;
sprite->data[5] = 0;
2018-12-18 05:08:08 +01:00
PrepareBattlerSpriteForRotScale(sprite->data[2], ST_OAM_OBJ_NORMAL);
2018-12-16 18:35:10 +01:00
sprite->data[0]++;
// fall through
case 1:
sprite->data[5] += sprite->data[4];
2018-12-18 05:08:08 +01:00
SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
SetBattlerSpriteYOffsetFromRotation(sprite->data[2]);
2018-12-16 18:35:10 +01:00
if (++sprite->data[1] > 3)
{
sprite->data[1] = 0;
sprite->data[4] *= -1;
sprite->data[0]++;
}
break;
case 2:
sprite->data[5] += sprite->data[4];
2018-12-18 05:08:08 +01:00
SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]);
SetBattlerSpriteYOffsetFromRotation(sprite->data[2]);
2018-12-16 18:35:10 +01:00
if (++sprite->data[1] > 3)
{
2018-12-18 05:08:08 +01:00
ResetSpriteRotScale(sprite->data[2]);
2018-12-16 18:35:10 +01:00
DestroyAnimSprite(sprite);
}
break;
}
}
void AnimTask_SkullBashPosition(u8 taskId)
2018-12-16 18:35:10 +01:00
{
u8 a;
gTasks[taskId].data[0] = gBattlerSpriteIds[gBattleAnimAttacker];
a = GetBattlerSide(gBattleAnimAttacker);
gTasks[taskId].data[1] = a;
gTasks[taskId].data[2] = 0;
switch (gBattleAnimArgs[0])
{
default:
DestroyAnimVisualTask(taskId);
break;
case 0:
gTasks[taskId].data[2] = 0;
gTasks[taskId].data[3] = 8;
gTasks[taskId].data[4] = 0;
gTasks[taskId].data[5] = 3;
if (a == 0)
gTasks[taskId].data[5] *= -1;
gTasks[taskId].func = AnimTask_SkullBashPositionSet;
2018-12-16 18:35:10 +01:00
break;
case 1:
gTasks[taskId].data[3] = 8;
gTasks[taskId].data[4] = 0x600;
gTasks[taskId].data[5] = 0xC0;
if (a == 0)
{
gTasks[taskId].data[4] = -gTasks[taskId].data[4];
gTasks[taskId].data[5] = -gTasks[taskId].data[5];
}
gTasks[taskId].func = AnimTask_SkullBashPositionReset;
2018-12-16 18:35:10 +01:00
break;
}
}
static void AnimTask_SkullBashPositionSet(u8 taskId)
2018-12-16 18:35:10 +01:00
{
struct Task *task = &gTasks[taskId];
switch (task->data[2])
{
case 0:
if (task->data[3])
{
task->data[4] += task->data[5];
gSprites[task->data[0]].pos2.x = task->data[4];
task->data[3]--;
}
else
{
task->data[3] = 8;
task->data[4] = 0;
task->data[5] = (task->data[1] == 0) ? -0xC0 : 0xC0;
2018-12-18 05:08:08 +01:00
PrepareBattlerSpriteForRotScale(task->data[0], ST_OAM_OBJ_NORMAL);
2018-12-16 18:35:10 +01:00
task->data[2]++;
}
break;
case 1:
if (task->data[3])
{
task->data[4] += task->data[5];
2018-12-18 05:08:08 +01:00
SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]);
SetBattlerSpriteYOffsetFromRotation(task->data[0]);
2018-12-16 18:35:10 +01:00
task->data[3]--;
}
else
{
task->data[3] = 8;
task->data[4] = gSprites[task->data[0]].pos2.x;
task->data[5] = (task->data[1] == 0) ? 0x2 : -0x2;
task->data[6] = 1;
task->data[2]++;
}
break;
case 2:
if (task->data[3])
{
if (task->data[6])
{
task->data[6]--;
}
else
{
if (task->data[3] & 1)
gSprites[task->data[0]].pos2.x = task->data[4] + task->data[5];
else
gSprites[task->data[0]].pos2.x = task->data[4] - task->data[5];
task->data[6] = 1;
task->data[3]--;
}
}
else
{
gSprites[task->data[0]].pos2.x = task->data[4];
task->data[3] = 12;
task->data[2]++;
}
break;
case 3:
if (task->data[3])
{
task->data[3]--;
}
else
{
task->data[3] = 3;
task->data[4] = gSprites[task->data[0]].pos2.x;
task->data[5] = (task->data[1] == 0) ? 8 : -8;
task->data[2]++;
}
break;
case 4:
if (task->data[3])
{
task->data[4] += task->data[5];
gSprites[task->data[0]].pos2.x = task->data[4];
task->data[3]--;
}
else
{
DestroyAnimVisualTask(taskId);
}
break;
}
}
static void AnimTask_SkullBashPositionReset(u8 taskId)
2018-12-16 18:35:10 +01:00
{
struct Task* task = &gTasks[taskId];
if (task->data[3])
{
task->data[4] -= task->data[5];
2018-12-18 05:08:08 +01:00
SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]);
SetBattlerSpriteYOffsetFromRotation(task->data[0]);
2018-12-16 18:35:10 +01:00
task->data[3]--;
}
else
{
2018-12-18 05:08:08 +01:00
ResetSpriteRotScale(task->data[0]);
2018-12-16 18:35:10 +01:00
DestroyAnimVisualTask(taskId);
}
}
void AnimSlashSlice(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (gBattleAnimArgs[0] == 0)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2];
}
else
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[1];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[2];
}
sprite->data[0] = 0;
sprite->data[1] = 0;
StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSliceStep3);
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAnimEnds;
2018-12-16 18:35:10 +01:00
}
void AnimFalseSwipeSlice(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + 0xFFD0;
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSliceStep1);
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAnimEnds;
2018-12-16 18:35:10 +01:00
}
void AnimFalseSwipePositionnedSlice(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->pos1.x = sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + 0xFFD0 + gBattleAnimArgs[0];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
StartSpriteAnim(sprite, 1);
sprite->data[0] = 0;
sprite->data[1] = 0;
sprite->callback = AnimFalseSwipeSliceStep3;
2018-12-16 18:35:10 +01:00
}
static void AnimFalseSwipeSliceStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[0] > 8)
{
sprite->data[0] = 12;
sprite->data[1] = 8;
sprite->data[2] = 0;
StoreSpriteCallbackInData6(sprite, AnimFalseSwipeSliceStep2);
2019-02-06 20:17:09 +01:00
sprite->callback = TranslateSpriteLinear;
2018-12-16 18:35:10 +01:00
}
}
static void AnimFalseSwipeSliceStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->data[0] = 0;
sprite->data[1] = 0;
sprite->callback = AnimFalseSwipeSliceStep3;
2018-12-16 18:35:10 +01:00
}
static void AnimFalseSwipeSliceStep3(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[0] > 1)
{
sprite->data[0] = 0;
sprite->invisible = !sprite->invisible;
if (++sprite->data[1] > 8)
DestroyAnimSprite(sprite);
}
}
void AnimEndureEnergy(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (gBattleAnimArgs[0] == 0)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[1];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[2];
}
else
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 0) + gBattleAnimArgs[1];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 1) + gBattleAnimArgs[2];
}
sprite->data[0] = 0;
sprite->data[1] = gBattleAnimArgs[3];
sprite->callback = AnimEndureEnergyStep;
2018-12-16 18:35:10 +01:00
}
static void AnimEndureEnergyStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[0] > sprite->data[1])
{
sprite->data[0] = 0;
sprite->pos1.y--;
}
sprite->pos1.y -= sprite->data[0];
if (sprite->animEnded)
DestroyAnimSprite(sprite);
}
void AnimSharpenSphere(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) - 12;
sprite->data[0] = 0;
sprite->data[1] = 2;
sprite->data[2] = 0;
sprite->data[3] = 0;
sprite->data[4] = 0;
sprite->data[5] = BattleAnimAdjustPanning(-64);
sprite->callback = AnimSharpenSphereStep;
2018-12-16 18:35:10 +01:00
}
static void AnimSharpenSphereStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[0] >= sprite->data[1])
{
sprite->invisible = !sprite->invisible;
if (!sprite->invisible)
{
sprite->data[4]++;
if (!(sprite->data[4] & 1))
PlaySE12WithPanning(SE_W207B, sprite->data[5]);
}
sprite->data[0] = 0;
if (++sprite->data[2] > 1)
{
sprite->data[2] = 0;
sprite->data[1]++;
}
}
if (sprite->animEnded && sprite->data[1] > 16 && sprite->invisible)
DestroyAnimSprite(sprite);
}
void AnimConversion(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0] == 0)
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0) + gBattleAnimArgs[0];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + gBattleAnimArgs[1];
if (IsContest())
sprite->pos1.y += 10;
sprite->data[0]++;
}
if ((u16)gBattleAnimArgs[7] == 0xFFFF)
DestroyAnimSprite(sprite);
}
2019-10-14 22:51:45 +02:00
void AnimTask_ConversionAlphaBlend(u8 taskId)
2018-12-16 18:35:10 +01:00
{
if (gTasks[taskId].data[2] == 1)
{
gBattleAnimArgs[7] = 0xFFFF;
gTasks[taskId].data[2]++;
}
else if (gTasks[taskId].data[2] == 2)
{
DestroyAnimVisualTask(taskId);
}
else
{
if (++gTasks[taskId].data[0] == 4)
{
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1]++;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(16 - gTasks[taskId].data[1], gTasks[taskId].data[1]));
if (gTasks[taskId].data[1] == 16)
gTasks[taskId].data[2]++;
}
}
}
2019-10-14 21:17:38 +02:00
void AnimConversion2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
InitSpritePosToAnimTarget(sprite, FALSE);
2018-12-16 18:35:10 +01:00
sprite->animPaused = 1;
sprite->data[0] = gBattleAnimArgs[2];
sprite->callback = AnimConversion2Step;
2018-12-16 18:35:10 +01:00
}
static void AnimConversion2Step(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0])
{
sprite->data[0]--;
}
else
{
sprite->animPaused = 0;
sprite->data[0] = 30;
sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, 2);
sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, 3);
sprite->callback = StartAnimLinearTranslation;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
}
2019-10-14 22:51:45 +02:00
void AnimTask_Conversion2AlphaBlend(u8 taskId)
2018-12-16 18:35:10 +01:00
{
if (++gTasks[taskId].data[0] == 4)
{
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1]++;
SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].data[1], 16 - gTasks[taskId].data[1]));
if (gTasks[taskId].data[1] == 16)
DestroyAnimVisualTask(taskId);
}
}
void unref_sub_8102434(u8 taskId)
{
u8 i;
for (i = 0; i < gBattlersCount; i++)
{
if (gBattleAnimArgs[0] == 1 && GetBattlerSide(i) == B_SIDE_PLAYER)
SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]);
if (gBattleAnimArgs[1] == 1 && GetBattlerSide(i) == B_SIDE_OPPONENT)
SetHealthboxSpriteInvisible(gHealthboxSpriteIds[i]);
}
DestroyAnimVisualTask(taskId);
}
void unref_sub_81024A8(u8 taskId)
{
u8 i;
for (i = 0; i < gBattlersCount; i++)
SetHealthboxSpriteVisible(gHealthboxSpriteIds[i]);
DestroyAnimVisualTask(taskId);
}
void AnimMoon(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (IsContest())
{
sprite->pos1.x = 48;
sprite->pos1.y = 40;
}
else
{
sprite->pos1.x = gBattleAnimArgs[0];
sprite->pos1.y = gBattleAnimArgs[1];
}
sprite->oam.shape = 0;
sprite->oam.size = 3;
sprite->data[0] = 0;
sprite->callback = AnimMoonStep;
2018-12-16 18:35:10 +01:00
}
static void AnimMoonStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (sprite->data[0])
DestroyAnimSprite(sprite);
}
void AnimMoonlightSparkle(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[0];
sprite->pos1.y = gBattleAnimArgs[1];
sprite->data[0] = 0;
sprite->data[1] = 0;
sprite->data[2] = 0;
sprite->data[3] = 0;
sprite->data[4] = 1;
sprite->callback = AnimMoonlightSparkleStep;
2018-12-16 18:35:10 +01:00
}
static void AnimMoonlightSparkleStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[1] > 1)
{
sprite->data[1] = 0;
if (sprite->data[2] < 120)
{
sprite->pos1.y++;
sprite->data[2]++;
}
}
if (sprite->data[0])
DestroyAnimSprite(sprite);
}
2019-10-14 22:51:45 +02:00
void AnimTask_FadeScreenBlueStep(u8);
2018-12-16 18:35:10 +01:00
2019-10-14 22:51:45 +02:00
void AnimTask_FadeScreenBlue(u8 taskId)
2018-12-16 18:35:10 +01:00
{
int a = sub_80A75AC(1, 0, 0, 0, 0, 0, 0) & 0xFFFF;
int b;
int c;
int d;
gTasks[taskId].data[0] = 0;
gTasks[taskId].data[1] = 0;
gTasks[taskId].data[2] = 0;
gTasks[taskId].data[3] = a;
gTasks[taskId].data[4] = 0;
gTasks[taskId].data[5] = 0;
gTasks[taskId].data[6] = 0;
gTasks[taskId].data[7] = 13;
gTasks[taskId].data[8] = 14;
gTasks[taskId].data[9] = 15;
b = sub_80A76C4(1, 1, 1, 1);
c = a | b;
2018-12-18 05:08:08 +01:00
StorePointerInVars(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void*)c);
2018-12-16 18:35:10 +01:00
b = b | (0x10000 << IndexOfSpritePaletteTag(ANIM_TAG_MOON));
d = IndexOfSpritePaletteTag(ANIM_TAG_GREEN_SPARKLE);
BeginNormalPaletteFade((0x10000 << d) | b, 0, 0, 16, RGB(27, 29, 31));
2019-10-14 22:51:45 +02:00
gTasks[taskId].func = AnimTask_FadeScreenBlueStep;
2018-12-16 18:35:10 +01:00
gTasks[taskId].func(taskId);
}
2019-10-14 22:51:45 +02:00
void AnimTask_FadeScreenBlueStep(u8 taskId)
2018-12-16 18:35:10 +01:00
{
struct Task* task = &gTasks[taskId];
switch (task->data[0])
{
case 0:
if (++task->data[1] > 0)
{
u16 color;
u16 bitmask;
u16 r3;
u16 i;
u16 j;
task->data[1] = 0;
if (++task->data[2] <= 15)
{
u16 red;
u16 green;
u16 blue;
task->data[4] += task->data[7];
task->data[5] += task->data[8];
task->data[6] += task->data[9];
red = task->data[4] >> 3;
green = task->data[5] >> 3;
blue = task->data[6] >> 3;
color = RGB(red, green, blue);
}
else
{
color = RGB(27, 29, 31);
task->data[0]++;
}
bitmask = 1;
r3 = 0;
for (i = 0; i <= 15; i++)
{
if (task->data[3] & bitmask)
{
for (j = 1; j <= 15; j++)
{
gPlttBufferFaded[r3 + j] = color;
}
}
bitmask <<= 1;
r3 += 16;
}
}
break;
case 1:
if (!gPaletteFade.active)
{
u8 spriteId;
for (spriteId = 0; spriteId < MAX_SPRITES; spriteId++)
{
if (gSprites[spriteId].template == &gMoonSpriteTemplate || gSprites[spriteId].template == &gMoonlightSparkleSpriteTemplate)
2018-12-16 18:35:10 +01:00
gSprites[spriteId].data[0] = 1;
}
task->data[1] = 0;
task->data[0]++;
}
break;
case 2:
if (++task->data[1] > 30)
{
2018-12-18 05:08:08 +01:00
BeginNormalPaletteFade((u32)LoadPointerFromVars(task->data[14], task->data[15]), 0, 16, 0, RGB(27, 29, 31));
2018-12-16 18:35:10 +01:00
task->data[0]++;
}
break;
case 3:
if (!gPaletteFade.active)
DestroyAnimVisualTask(taskId);
break;
}
}
void AnimHornHit(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (gBattleAnimArgs[2] < 2)
gBattleAnimArgs[2] = 2;
if (gBattleAnimArgs[2] > 0x7F)
gBattleAnimArgs[2] = 0x7F;
sprite->data[0] = 0;
sprite->data[1] = gBattleAnimArgs[2];
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[0];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[1];
sprite->data[6] = sprite->pos1.x;
sprite->data[7] = sprite->pos1.y;
if (IsContest())
{
sprite->oam.matrixNum = ST_OAM_HFLIP;
2018-12-16 18:35:10 +01:00
sprite->pos1.x += 40;
sprite->pos1.y += 20;
sprite->data[2] = sprite->pos1.x << 7;
sprite->data[3] = -0x1400 / sprite->data[1];
sprite->data[4] = sprite->pos1.y << 7;
sprite->data[5] = -0xA00 / sprite->data[1];
}
else if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER)
{
sprite->pos1.x -= 40;
sprite->pos1.y += 20;
sprite->data[2] = sprite->pos1.x << 7;
sprite->data[3] = 0x1400 / sprite->data[1];
sprite->data[4] = sprite->pos1.y << 7;
sprite->data[5] = -0xA00 / sprite->data[1];
}
else
{
sprite->pos1.x += 40;
sprite->pos1.y -= 20;
sprite->data[2] = sprite->pos1.x << 7;
sprite->data[3] = -0x1400 / sprite->data[1];
sprite->data[4] = sprite->pos1.y << 7;
sprite->data[5] = 0xA00 / sprite->data[1];
sprite->oam.matrixNum = (ST_OAM_HFLIP | ST_OAM_VFLIP);
2018-12-16 18:35:10 +01:00
}
sprite->callback = AnimHornHitStep;
2018-12-16 18:35:10 +01:00
}
static void AnimHornHitStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->data[2] += sprite->data[3];
sprite->data[4] += sprite->data[5];
sprite->pos1.x = sprite->data[2] >> 7;
sprite->pos1.y = sprite->data[4] >> 7;
if (--sprite->data[1] == 1)
{
sprite->pos1.x = sprite->data[6];
sprite->pos1.y = sprite->data[7];
}
if (sprite->data[1] == 0)
DestroyAnimSprite(sprite);
}
void AnimTask_DoubleTeam(u8 taskId)
2018-12-16 18:35:10 +01:00
{
u16 i;
int obj;
u16 r3;
u16 r4;
struct Task* task = &gTasks[taskId];
task->data[0] = GetAnimBattlerSpriteId(ANIM_ATTACKER);
task->data[1] = AllocSpritePalette(ANIM_TAG_BENT_SPOON);
r3 = (task->data[1] * 16) + 0x100;
r4 = (gSprites[task->data[0]].oam.paletteNum + 16) << 4;
for (i = 1; i < 16; i++)
gPlttBufferUnfaded[r3 + i] = gPlttBufferUnfaded[r4 + i];
BlendPalette(r3, 16, 11, RGB(0, 0, 0));
task->data[3] = 0;
i = 0;
2018-12-18 05:08:08 +01:00
while (i < 2 && (obj = CloneBattlerSpriteWithBlend(0)) >= 0)
2018-12-16 18:35:10 +01:00
{
gSprites[obj].oam.paletteNum = task->data[1];
gSprites[obj].data[0] = 0;
gSprites[obj].data[1] = i << 7;
gSprites[obj].data[2] = taskId;
gSprites[obj].callback = AnimTask_DoubleTeamStep2;
2018-12-16 18:35:10 +01:00
task->data[3]++;
i++;
}
task->func = AnimTask_DoubleTeamStep1;
2018-12-20 04:13:26 +01:00
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
2018-12-16 18:35:10 +01:00
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);
else
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
}
static void AnimTask_DoubleTeamStep1(u8 taskId)
2018-12-16 18:35:10 +01:00
{
struct Task* task = &gTasks[taskId];
if (!task->data[3])
{
2018-12-20 04:13:26 +01:00
if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1)
2018-12-16 18:35:10 +01:00
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON);
else
SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON);
FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON);
DestroyAnimVisualTask(taskId);
}
}
static void AnimTask_DoubleTeamStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[3] > 1)
{
sprite->data[3] = 0;
sprite->data[0]++;
}
if (sprite->data[0] > 64)
{
gTasks[sprite->data[2]].data[3]--;
obj_delete_but_dont_free_vram(sprite);
}
else
{
sprite->data[4] = gSineTable[sprite->data[0]] / 6;
sprite->data[5] = gSineTable[sprite->data[0]] / 13;
sprite->data[1] = (sprite->data[1] + sprite->data[5]) & 0xFF;
sprite->pos2.x = Sin(sprite->data[1], sprite->data[4]);
}
}
void AnimSuperFang(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAnimEnds;
2018-12-16 18:35:10 +01:00
}
2019-10-14 22:42:15 +02:00
void AnimTask_MusicNotesRainbowBlend(u8 taskId)
2018-12-16 18:35:10 +01:00
{
u16 i;
u16 j;
u16 index;
index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[0][0]);
2018-12-16 18:35:10 +01:00
if (index != 0xFF)
{
index = (index << 4) + 0x100;
for (i = 1; i < ARRAY_COUNT(gParticlesColorBlendTable[0]); i++)
gPlttBufferFaded[index + i] = gParticlesColorBlendTable[0][i];
2018-12-16 18:35:10 +01:00
}
for (j = 1; j < ARRAY_COUNT(gParticlesColorBlendTable); j++)
2018-12-16 18:35:10 +01:00
{
index = AllocSpritePalette(gParticlesColorBlendTable[j][0]);
2018-12-16 18:35:10 +01:00
if (index != 0xFF)
{
index = (index << 4) + 0x100;
for (i = 1; i < ARRAY_COUNT(gParticlesColorBlendTable[0]); i++)
gPlttBufferFaded[index + i] = gParticlesColorBlendTable[j][i];
2018-12-16 18:35:10 +01:00
}
}
DestroyAnimVisualTask(taskId);
}
// clears the rainbow effect for musical notes.
2019-10-14 22:42:15 +02:00
void AnimTask_MusicNotesClearRainbowBlend(u8 taskId)
2018-12-16 18:35:10 +01:00
{
u16 i;
for (i = 1; i < ARRAY_COUNT(gParticlesColorBlendTable); i++)
FreeSpritePaletteByTag(gParticlesColorBlendTable[i][0]);
2018-12-16 18:35:10 +01:00
DestroyAnimVisualTask(taskId);
}
void AnimWavingMusicNotes(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
u8 index;
u8 a;
u8 b;
2018-12-18 05:08:08 +01:00
SetSpriteCoordsToAnimAttackerCoords(sprite);
2018-12-16 18:35:10 +01:00
StartSpriteAnim(sprite, gBattleAnimArgs[0]);
if ((index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[gBattleAnimArgs[1]][0])) != 0xFF)
2018-12-16 18:35:10 +01:00
sprite->oam.paletteNum = index;
sprite->data[1] = gBattleAnimArgs[1];
sprite->data[2] = 0;
sprite->data[3] = gBattleAnimArgs[2];
if (IsContest())
{
a = 48;
b = 40;
}
else
{
a = GetBattlerSpriteCoord(gBattleAnimTarget, 2);
b = GetBattlerSpriteCoord(gBattleAnimTarget, 3);
}
sprite->data[4] = sprite->pos1.x << 4;
sprite->data[5] = sprite->pos1.y << 4;
AnimWavingMusicNotesStep1(a - sprite->pos1.x, b - sprite->pos1.y, &sprite->data[6], &sprite->data[7], 40);
sprite->callback = AnimWavingMusicNotesStep2;
2018-12-16 18:35:10 +01:00
}
static void AnimWavingMusicNotesStep1(s16 a, s16 b, s16* c, s16* d, s8 e)
2018-12-16 18:35:10 +01:00
{
int f;
int g;
if (a < 0)
e = -e;
f = a << 8;
g = f / e;
if (g == 0)
g = 1;
*c = f / g;
*d = (b << 8) / g;
}
static void AnimWavingMusicNotesStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2019-07-30 15:08:49 +02:00
s16 y, yDelta;
2018-12-16 18:35:10 +01:00
u8 index;
2019-07-30 15:08:49 +02:00
2018-12-16 18:35:10 +01:00
sprite->data[0]++;
2019-07-30 15:08:49 +02:00
yDelta = sprite->data[0] * 5 - ((sprite->data[0] * 5 / 256) << 8);
2018-12-16 18:35:10 +01:00
sprite->data[4] += sprite->data[6];
sprite->data[5] += sprite->data[7];
sprite->pos1.x = sprite->data[4] >> 4;
sprite->pos1.y = sprite->data[5] >> 4;
2019-07-30 15:08:49 +02:00
sprite->pos2.y = Sin(yDelta, 15);
2018-12-16 18:35:10 +01:00
2019-07-30 15:08:49 +02:00
y = sprite->pos1.y;
if (sprite->pos1.x < -16 || sprite->pos1.x > 256 || y < -16 || y > 128)
2018-12-16 18:35:10 +01:00
{
2018-12-18 05:08:08 +01:00
DestroySpriteAndMatrix(sprite);
2018-12-16 18:35:10 +01:00
}
else
{
if (sprite->data[3] && ++sprite->data[2] > sprite->data[3])
{
sprite->data[2] = 0;
if (++sprite->data[1] > 3)
sprite->data[1] = 0;
index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[sprite->data[1]][0]);
2018-12-16 18:35:10 +01:00
if (index != 0xFF)
sprite->oam.paletteNum = index;
}
}
}
void AnimFlyingMusicNotes(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT)
2019-07-30 15:08:49 +02:00
gBattleAnimArgs[1] *= -1;
2018-12-16 18:35:10 +01:00
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1];
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2];
StartSpriteAnim(sprite, gBattleAnimArgs[0]);
sprite->data[2] = 0;
sprite->data[3] = 0;
sprite->data[4] = sprite->pos1.x << 4;
sprite->data[5] = sprite->pos1.y << 4;
sprite->data[6] = (gBattleAnimArgs[1] << 4) / 5;
sprite->data[7] = (gBattleAnimArgs[2] << 7) / 5;
sprite->callback = AnimFlyingMusicNotesStep;
2018-12-16 18:35:10 +01:00
}
static void AnimFlyingMusicNotesStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
sprite->data[4] += sprite->data[6];
sprite->data[5] += sprite->data[7];
sprite->pos1.x = sprite->data[4] >> 4;
sprite->pos1.y = sprite->data[5] >> 4;
if (sprite->data[0] > 5 && sprite->data[3] == 0)
{
sprite->data[2] = (sprite->data[2] + 16) & 0xFF;
sprite->pos2.x = Cos(sprite->data[2], 18);
sprite->pos2.y = Sin(sprite->data[2], 18);
if (sprite->data[2] == 0)
sprite->data[3] = 1;
}
if (++sprite->data[0] == 48)
2018-12-18 05:08:08 +01:00
DestroySpriteAndMatrix(sprite);
2018-12-16 18:35:10 +01:00
}
void AnimBellyDrumHand(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
s16 a;
if (gBattleAnimArgs[0] == 1)
{
sprite->oam.matrixNum = ST_OAM_HFLIP;
2018-12-16 18:35:10 +01:00
a = 16;
}
else
{
a = -16;
}
sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + a;
sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + 8;
sprite->data[0] = 8;
sprite->callback = WaitAnimForDuration;
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
}
void AnimSlowFlyingMusicNotes(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
s16 xDiff;
u8 index;
2018-12-18 05:08:08 +01:00
SetSpriteCoordsToAnimAttackerCoords(sprite);
2018-12-16 18:35:10 +01:00
sprite->pos1.y += 8;
StartSpriteAnim(sprite, gBattleAnimArgs[1]);
index = IndexOfSpritePaletteTag(gParticlesColorBlendTable[gBattleAnimArgs[2]][0]);
2018-12-16 18:35:10 +01:00
if (index != 0xFF)
sprite->oam.paletteNum = index;
xDiff = (gBattleAnimArgs[0] == 0) ? -32 : 32;
sprite->data[0] = 40;
sprite->data[1] = sprite->pos1.x;
sprite->data[2] = xDiff + sprite->data[1];
sprite->data[3] = sprite->pos1.y;
sprite->data[4] = sprite->data[3] - 40;
InitAnimLinearTranslation(sprite);
sprite->data[5] = gBattleAnimArgs[3];
sprite->callback = AnimSlowFlyingMusicNotesStep;
2018-12-16 18:35:10 +01:00
}
static void AnimSlowFlyingMusicNotesStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2018-12-20 04:13:26 +01:00
if (AnimTranslateLinear(sprite) == 0)
2018-12-16 18:35:10 +01:00
{
s16 xDiff;
xDiff = Sin(sprite->data[5], 8);
if (sprite->pos2.x < 0)
xDiff = -xDiff;
sprite->pos2.x += xDiff;
sprite->pos2.y += Sin(sprite->data[5], 4);
sprite->data[5] = (sprite->data[5] + 8) & 0xFF;
}
else
{
DestroyAnimSprite(sprite);
}
}
2019-10-14 22:51:45 +02:00
void SetSpriteNextToMonHead(u8 battler, struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
2018-12-30 17:58:42 +01:00
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8;
2018-12-16 18:35:10 +01:00
else
2018-12-30 17:58:42 +01:00
sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8;
2018-12-16 18:35:10 +01:00
2018-12-30 17:58:42 +01:00
sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) - (s16)GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4;
2018-12-16 18:35:10 +01:00
}
2019-10-14 21:17:38 +02:00
void AnimThroughtBubble(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
u8 a;
u8 battler;
if (gBattleAnimArgs[0] == 0)
battler = gBattleAnimAttacker;
else
battler = gBattleAnimTarget;
2019-10-14 22:51:45 +02:00
SetSpriteNextToMonHead(battler, sprite);
2018-12-16 18:35:10 +01:00
a = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? 0 : 1;
sprite->data[0] = gBattleAnimArgs[1];
sprite->data[1] = a + 2;
StartSpriteAnim(sprite, a);
StoreSpriteCallbackInData6(sprite, AnimThroughtBubbleStep);
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAnimEnds;
2018-12-16 18:35:10 +01:00
}
static void AnimThroughtBubbleStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (--sprite->data[0] == 0)
{
StoreSpriteCallbackInData6(sprite, DestroyAnimSprite);
StartSpriteAnim(sprite, sprite->data[1]);
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAnimEnds;
2018-12-16 18:35:10 +01:00
}
}
2019-10-14 21:17:38 +02:00
void AnimMetronomeFinger(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
u8 battler;
if (gBattleAnimArgs[0] == 0)
battler = gBattleAnimAttacker;
else
battler = gBattleAnimTarget;
2019-10-14 22:51:45 +02:00
SetSpriteNextToMonHead(battler, sprite);
2018-12-16 18:35:10 +01:00
sprite->data[0] = 0;
StoreSpriteCallbackInData6(sprite, AnimMetronomeFingerStep);
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
2018-12-16 18:35:10 +01:00
}
static void AnimMetronomeFingerStep(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[0] > 16)
{
StartSpriteAffineAnim(sprite, 1);
2018-12-18 05:08:08 +01:00
StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix);
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
2018-12-16 18:35:10 +01:00
}
}
2019-10-14 21:17:38 +02:00
void AnimFollowMeFinger(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
u8 battler;
if (gBattleAnimArgs[0] == 0)
battler = gBattleAnimAttacker;
else
battler = gBattleAnimTarget;
sprite->pos1.x = GetBattlerSpriteCoord(battler, 0);
2018-12-30 17:58:42 +01:00
sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP);
2018-12-16 18:35:10 +01:00
if (sprite->pos1.y <= 9)
sprite->pos1.y = 10;
sprite->data[0] = 1;
sprite->data[1] = 0;
sprite->data[2] = sprite->subpriority;
sprite->data[3] = sprite->subpriority + 4;
sprite->data[4] = 0;
StoreSpriteCallbackInData6(sprite, AnimFollowMeFingerStep1);
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAffineAnimEnds;
2018-12-16 18:35:10 +01:00
}
static void AnimFollowMeFingerStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[4] > 12)
sprite->callback = AnimFollowMeFingerStep2;
2018-12-16 18:35:10 +01:00
}
static void AnimFollowMeFingerStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2019-07-30 15:08:49 +02:00
s16 x1, x2;
2018-12-16 18:35:10 +01:00
sprite->data[1] += 4;
if (sprite->data[1] > 254)
{
if (--sprite->data[0] == 0)
{
sprite->pos2.x = 0;
sprite->callback = AnimMetronomeFingerStep;
2018-12-16 18:35:10 +01:00
return;
}
else
{
sprite->data[1] &= 0xFF;
}
}
if (sprite->data[1] > 0x4F)
sprite->subpriority = sprite->data[3];
if (sprite->data[1] > 0x9F)
sprite->subpriority = sprite->data[2];
2019-07-30 15:08:49 +02:00
x1 = gSineTable[sprite->data[1]];
x2 = x1 >> 3;
sprite->pos2.x = (x1 >> 3) + (x2 >> 1);
2018-12-16 18:35:10 +01:00
}
void AnimTauntFinger(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
2019-07-30 15:08:49 +02:00
u8 battler;
2018-12-16 18:35:10 +01:00
if (gBattleAnimArgs[0] == 0)
2019-07-30 15:08:49 +02:00
battler = gBattleAnimAttacker;
2018-12-16 18:35:10 +01:00
else
2019-07-30 15:08:49 +02:00
battler = gBattleAnimTarget;
2018-12-16 18:35:10 +01:00
2019-10-14 22:51:45 +02:00
SetSpriteNextToMonHead(battler, sprite);
2019-07-30 15:08:49 +02:00
if (GetBattlerSide(battler) == B_SIDE_PLAYER)
2018-12-16 18:35:10 +01:00
{
StartSpriteAnim(sprite, 0);
sprite->data[0] = 2;
}
else
{
StartSpriteAnim(sprite, 1);
sprite->data[0] = 3;
}
sprite->callback = AnimTauntFingerStep1;
2018-12-16 18:35:10 +01:00
}
static void AnimTauntFingerStep1(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[1] > 10)
{
sprite->data[1] = 0;
StartSpriteAnim(sprite, sprite->data[0]);
StoreSpriteCallbackInData6(sprite, AnimTauntFingerStep2);
2018-12-18 05:08:08 +01:00
sprite->callback = RunStoredCallbackWhenAnimEnds;
2018-12-16 18:35:10 +01:00
}
}
static void AnimTauntFingerStep2(struct Sprite* sprite)
2018-12-16 18:35:10 +01:00
{
if (++sprite->data[1] > 5)
DestroyAnimSprite(sprite);
}