#include "global.h" #include "alloc.h" #include "battle_anim.h" #include "battle_interface.h" #include "decompress.h" #include "gpu_regs.h" #include "graphics.h" #include "main.h" #include "math_util.h" #include "palette.h" #include "random.h" #include "scanline_effect.h" #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 *); 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 *); void AnimLeechSeed(struct Sprite *); void AnimTranslateLinearSingleSineWave(struct Sprite *); void AnimMoveTwisterParticle(struct Sprite *); 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 sub_8100640(struct Sprite *); void sub_8100898(struct Sprite *); void sub_81009F8(struct Sprite *); void sub_8100A50(struct Sprite *); void sub_8100A94(struct Sprite *); void AnimCuttingSlice(struct Sprite *); void sub_8100B88(struct Sprite *); void sub_8100E1C(struct Sprite *); void sub_8100EF0(struct Sprite *); void sub_81010CC(struct Sprite *); void sub_810130C(struct Sprite *); void sub_810135C(struct Sprite *); void sub_8101440(struct Sprite *); void sub_81014F4(struct Sprite *); void sub_81015AC(struct Sprite *); void sub_8101898(struct Sprite *); void sub_8101940(struct Sprite *); void sub_8101B90(struct Sprite *); void sub_8101F40(struct Sprite *); void sub_8101FA8(struct Sprite *); void sub_8101FF0(struct Sprite *); void sub_81020D8(struct Sprite *); void sub_810217C(struct Sprite *); void sub_8102268(struct Sprite *); void sub_810234C(struct Sprite *); void sub_81024E0(struct Sprite *); void sub_8102540(struct Sprite *); void sub_8102844(struct Sprite *); void sub_8102BCC(struct Sprite *); void sub_8102CD4(struct Sprite *); void sub_8102EB0(struct Sprite *); void sub_8102FB8(struct Sprite *); void sub_8103028(struct Sprite *); void sub_8103164(struct Sprite *); void sub_8103208(struct Sprite *); void sub_8103284(struct Sprite *); void sub_8103390(struct Sprite *); void AnimRockPolishStreak(struct Sprite *); void AnimRockPolishSparkle(struct Sprite *); void AnimPoisonJabProjectile(struct Sprite *); void AnimNightSlash(struct Sprite *); static void AnimMovePowderParticleStep(struct Sprite *); static void AnimSolarbeamSmallOrbStep(struct Sprite *); static void AnimAbsorptionOrbStep(struct Sprite *); static void AnimHyperBeamOrbStep(struct Sprite *); static void AnimLeechSeedStep(struct Sprite *); static void AnimLeechSeedSprouts(struct Sprite *); 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 *); static void AnimTranslateLinearSingleSineWaveStep(struct Sprite *); static void AnimMoveTwisterParticleStep(struct Sprite *); static void AnimConstrictBindingStep1(struct Sprite *); static void AnimConstrictBindingStep2(struct Sprite *); static void sub_80FF53C(u8); static void sub_80FF5CC(u8); static void AnimItemStealStep(struct Sprite *); static void AnimRootFlickerOut(struct Sprite *); static void AnimTrickBagStep1(struct Sprite *); static void AnimTrickBagStep2(struct Sprite *); static void AnimTrickBagStep3(struct Sprite *); static void sub_8100128(u8); static s16 sub_8100504(struct Sprite *); static void sub_8100524(struct Task *, u8); static void sub_80CC408(struct Sprite *); static void sub_810074C(struct Sprite *); static void sub_81009A0(struct Sprite *); static void AnimSliceStep(struct Sprite *); static void sub_8100E80(struct Sprite *); static void sub_8100FD4(struct Sprite *); static void sub_8101138(struct Sprite *); static void sub_8101298(struct Sprite *, int, int); static void sub_81014A0(struct Sprite *); static void sub_8101560(struct Sprite *); static void sub_81015D4(struct Sprite *); static void sub_8101684(struct Sprite *); static void sub_81016B8(struct Sprite *); static void sub_8101774(struct Sprite *); static void sub_8101820(struct Sprite *); static void sub_8101848(struct Sprite *); static void sub_8101998(struct Sprite *); static void sub_81019E8(struct Sprite *); static void sub_8101A74(struct Sprite *); static void sub_8101AC4(struct Sprite *); static void sub_8101B84(struct Sprite *); static void sub_8101AE8(struct Sprite *); static void sub_8101BA0(struct Sprite *); static void sub_8101D2C(u8); static void sub_8101EEC(u8); static void sub_8102044(struct Sprite *); static void sub_810207C(struct Sprite *); static void sub_810208C(struct Sprite *); static void sub_810213C(struct Sprite *); static void sub_81021CC(struct Sprite *); static void sub_810237C(struct Sprite *); static void sub_8102528(struct Sprite *); static void sub_8102584(struct Sprite *); static void sub_810296C(struct Sprite *); static void sub_8102AE0(u8); static void sub_8102B3C(struct Sprite *); static void sub_8102D8C(s16, s16, s16 *, s16 *, s8); static void sub_8102DE4(struct Sprite *); static void sub_8102F40(struct Sprite *); static void sub_81030B0(struct Sprite *); static void sub_81031D0(struct Sprite *); static void sub_8103250(struct Sprite *); static void sub_8103300(struct Sprite *); static void sub_8103320(struct Sprite *); static void sub_81033F0(struct Sprite *); static void sub_810342C(struct Sprite *); const union AnimCmd gUnknown_085920F0[] = { 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 gUnknown_08592114[] = { gUnknown_085920F0, }; const struct SpriteTemplate gSleepPowderParticleSpriteTemplate = { .tileTag = ANIM_TAG_SLEEP_POWDER, .paletteTag = ANIM_TAG_SLEEP_POWDER, .oam = &gUnknown_08524944, .anims = gUnknown_08592114, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMovePowderParticle, }; const struct SpriteTemplate gStunSporeParticleSpriteTemplate = { .tileTag = ANIM_TAG_STUN_SPORE, .paletteTag = ANIM_TAG_STUN_SPORE, .oam = &gUnknown_08524944, .anims = gUnknown_08592114, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMovePowderParticle, }; const struct SpriteTemplate gPoisonPowderParticleSpriteTemplate = { .tileTag = ANIM_TAG_POISON_POWDER, .paletteTag = ANIM_TAG_POISON_POWDER, .oam = &gUnknown_08524944, .anims = gUnknown_08592114, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMovePowderParticle, }; const union AnimCmd gUnknown_08592160[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_08592168[] = { ANIMCMD_FRAME(1, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_08592170[] = { ANIMCMD_FRAME(2, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_08592178[] = { ANIMCMD_FRAME(3, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_08592180[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_08592188[] = { ANIMCMD_FRAME(5, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_08592190[] = { ANIMCMD_FRAME(6, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_08592198[] = { ANIMCMD_FRAME(7, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_085921A0[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END, }; const union AnimCmd *const gUnknown_085921A8[] = { gUnknown_08592160, gUnknown_08592168, gUnknown_08592170, gUnknown_08592178, gUnknown_08592180, gUnknown_08592188, gUnknown_08592190, }; const union AnimCmd *const gUnknown_085921C4[] = { gUnknown_08592198, }; const union AnimCmd *const gUnknown_085921C8[] = { gUnknown_085921A0, }; const union AffineAnimCmd gUnknown_085921CC[] = { AFFINEANIMCMD_FRAME(-5, -5, 0, 1), AFFINEANIMCMD_JUMP(0), }; const union AffineAnimCmd *const gUnknown_085921DC[] = { gUnknown_085921CC, }; const struct SpriteTemplate gPowerAbsorptionOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gUnknown_08524A8C, .anims = gUnknown_085921C8, .images = NULL, .affineAnims = gUnknown_085921DC, .callback = AnimPowerAbsorptionOrb, }; const struct SpriteTemplate gSolarbeamBigOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gUnknown_08524904, .anims = gUnknown_085921A8, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSolarbeamBigOrb, }; const struct SpriteTemplate gSolarbeamSmallOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gUnknown_08524904, .anims = gUnknown_085921C4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSolarbeamSmallOrb, }; const union AffineAnimCmd gUnknown_08592228[] = { AFFINEANIMCMD_FRAME(320, 320, 0, 0), AFFINEANIMCMD_FRAME(-14, -14, 0, 1), AFFINEANIMCMD_JUMP(1), }; const union AffineAnimCmd *const gUnknown_08592240[] = { gUnknown_08592228, }; const struct SpriteTemplate gStockpileAbsorptionOrbSpriteTemplate = { .tileTag = ANIM_TAG_GRAY_ORB, .paletteTag = ANIM_TAG_GRAY_ORB, .oam = &gUnknown_085249C4, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_08592240, .callback = AnimPowerAbsorptionOrb, }; const union AffineAnimCmd gUnknown_0859225C[] = { AFFINEANIMCMD_FRAME(-5, -5, 0, 1), AFFINEANIMCMD_JUMP(0), }; const union AffineAnimCmd *const gUnknown_0859226C[] = { gUnknown_0859225C, }; const struct SpriteTemplate gAbsorptionOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gUnknown_08524A8C, .anims = gUnknown_085921C8, .images = NULL, .affineAnims = gUnknown_0859226C, .callback = AnimAbsorptionOrb, }; const struct SpriteTemplate gHyperBeamOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gUnknown_08524904, .anims = gUnknown_085921A8, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb, }; const union AnimCmd gUnknown_085922A0[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_085922A8[] = { ANIMCMD_FRAME(4, 7), ANIMCMD_FRAME(8, 7), ANIMCMD_JUMP(0), }; const union AnimCmd *const gUnknown_085922B4[] = { gUnknown_085922A0, gUnknown_085922A8, }; const struct SpriteTemplate gLeechSeedSpriteTemplate = { .tileTag = ANIM_TAG_SEED, .paletteTag = ANIM_TAG_SEED, .oam = &gUnknown_0852490C, .anims = gUnknown_085922B4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimLeechSeed, }; const union AnimCmd gUnknown_085922D4[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_085922DC[] = { ANIMCMD_FRAME(4, 7), ANIMCMD_END, }; const union AnimCmd *const gUnknown_085922E4[] = { gUnknown_085922D4, gUnknown_085922DC, }; const struct SpriteTemplate gSporeParticleSpriteTemplate = { .tileTag = ANIM_TAG_SPORE, .paletteTag = ANIM_TAG_SPORE, .oam = &gUnknown_0852490C, .anims = gUnknown_085922E4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSporeParticle, }; const union AnimCmd gUnknown_08592304[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_0859230C[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592314[] = { gUnknown_08592304, }; const union AnimCmd *const gUnknown_08592318[] = { gUnknown_0859230C, }; const struct SpriteTemplate gPetalDanceBigFlowerSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gUnknown_0852490C, .anims = gUnknown_08592314, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceBigFlower, }; const struct SpriteTemplate gPetalDanceSmallFlowerSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gUnknown_08524904, .anims = gUnknown_08592318, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceSmallFlower, }; const union AnimCmd gUnknown_0859234C[] = { 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 gUnknown_08592378[] = { ANIMCMD_FRAME(24, 5), ANIMCMD_FRAME(28, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592388[] = { gUnknown_0859234C, gUnknown_08592378, }; const struct SpriteTemplate gRazorLeafParticleSpriteTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gUnknown_0852490C, .anims = gUnknown_08592388, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRazorLeafParticle, }; const struct SpriteTemplate gTwisterLeafParticleSpriteTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gUnknown_0852490C, .anims = gUnknown_08592388, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveTwisterParticle, }; const union AnimCmd gUnknown_085923C0[] = { 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 gUnknown_085923D4[] = { gUnknown_085923C0, }; const struct SpriteTemplate gRazorLeafCutterSpriteTemplate = { .tileTag = ANIM_TAG_RAZOR_LEAF, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gUnknown_08524934, .anims = gUnknown_085923D4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTranslateLinearSingleSineWave, }; const union AffineAnimCmd gUnknown_085923F0[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_JUMP(0), }; const union AffineAnimCmd *const gUnknown_08592400[] = { gUnknown_085923F0, }; const struct SpriteTemplate gSwiftStarSpriteTemplate = { .tileTag = ANIM_TAG_YELLOW_STAR, .paletteTag = ANIM_TAG_YELLOW_STAR, .oam = &gUnknown_08524974, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_08592400, .callback = AnimTranslateLinearSingleSineWave, }; const union AnimCmd gUnknown_0859241C[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(64, 4), ANIMCMD_FRAME(96, 4), ANIMCMD_END, }; const union AnimCmd gUnknown_08592430[] = { 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 gUnknown_08592444[] = { gUnknown_0859241C, gUnknown_08592430, }; const union AffineAnimCmd gUnknown_0859244C[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-11, 0, 0, 6), AFFINEANIMCMD_FRAME(11, 0, 0, 6), AFFINEANIMCMD_END, }; const union AffineAnimCmd gUnknown_0859246C[] = { AFFINEANIMCMD_FRAME(-0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(11, 0, 0, 6), AFFINEANIMCMD_FRAME(-11, 0, 0, 6), AFFINEANIMCMD_END, }; const union AffineAnimCmd *const gUnknown_0859248C[] = { gUnknown_0859244C, gUnknown_0859246C, }; const struct SpriteTemplate gConstrictBindingSpriteTemplate = { .tileTag = ANIM_TAG_TENDRILS, .paletteTag = ANIM_TAG_TENDRILS, .oam = &gUnknown_0852499C, .anims = gUnknown_08592444, .images = NULL, .affineAnims = gUnknown_0859248C, .callback = AnimConstrictBinding, }; const union AffineAnimCmd gUnknown_085924AC[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 0), AFFINEANIMCMD_FRAME(48, 48, 0, 14), AFFINEANIMCMD_END, }; const union AffineAnimCmd gUnknown_085924C4[] = { AFFINEANIMCMD_FRAME(-16, -16, 0, 1), AFFINEANIMCMD_JUMP(0), }; const union AffineAnimCmd *const gUnknown_085924D4[] = { gUnknown_085924AC, gUnknown_085924C4, }; const struct SpriteTemplate gMimicOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gUnknown_085249CC, .anims = gUnknown_085921C8, .images = NULL, .affineAnims = gUnknown_085924D4, .callback = AnimMimicOrb, }; const union AnimCmd gUnknown_085924F4[] = { ANIMCMD_FRAME(0, 7), ANIMCMD_FRAME(16, 7), ANIMCMD_FRAME(32, 7), ANIMCMD_FRAME(48, 7), ANIMCMD_END, }; const union AnimCmd gUnknown_08592508[] = { 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 gUnknown_0859251C[] = { ANIMCMD_FRAME(0, 7), ANIMCMD_FRAME(16, 7), ANIMCMD_FRAME(32, 7), ANIMCMD_END, }; const union AnimCmd gUnknown_0859252C[] = { ANIMCMD_FRAME(0, 7, .hFlip = TRUE), ANIMCMD_FRAME(16, 7, .hFlip = TRUE), ANIMCMD_FRAME(32, 7, .hFlip = TRUE), ANIMCMD_END, }; const union AnimCmd *const gUnknown_0859253C[] = { gUnknown_085924F4, gUnknown_08592508, gUnknown_0859251C, gUnknown_0859252C, }; const struct SpriteTemplate gIngrainRootSpriteTemplate = { .tileTag = ANIM_TAG_ROOTS, .paletteTag = ANIM_TAG_ROOTS, .oam = &gUnknown_08524914, .anims = gUnknown_0859253C, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimIngrainRoot, }; const struct SpriteTemplate gFrenzyPlantRootSpriteTemplate = { .tileTag = ANIM_TAG_ROOTS, .paletteTag = ANIM_TAG_ROOTS, .oam = &gUnknown_08524914, .anims = gUnknown_0859253C, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFrenzyPlantRoot, }; const union AnimCmd gUnknown_0859257C[] = { ANIMCMD_FRAME(3, 3), ANIMCMD_FRAME(0, 5), ANIMCMD_JUMP(0), }; const union AnimCmd *const gUnknown_08592588[] = { gUnknown_0859257C, }; const struct SpriteTemplate gIngrainOrbSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gUnknown_08524904, .anims = gUnknown_08592588, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimIngrainOrb, }; const union AnimCmd gUnknown_085925A4[] = { ANIMCMD_FRAME(0, 30), ANIMCMD_END, }; const union AnimCmd *const gUnknown_085925AC[] = { gUnknown_085925A4, }; const union AffineAnimCmd gUnknown_085925B0[] = { AFFINEANIMCMD_FRAME(0, 0, -4, 10), AFFINEANIMCMD_FRAME(0, 0, 4, 20), AFFINEANIMCMD_FRAME(0, 0, -4, 10), AFFINEANIMCMD_END, }; const union AffineAnimCmd gUnknown_085925D0[] = { 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 gUnknown_08592608[] = { gUnknown_085925B0, gUnknown_085925D0, }; const struct SpriteTemplate gPresentSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gUnknown_08524974, .anims = gUnknown_085925AC, .images = NULL, .affineAnims = gUnknown_08592608, .callback = AnimPresent, }; const struct SpriteTemplate gKnockOffItemSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gUnknown_08524974, .anims = gUnknown_085925AC, .images = NULL, .affineAnims = gUnknown_08592608, .callback = AnimKnockOffItem, }; const union AnimCmd gUnknown_08592640[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 4), ANIMCMD_FRAME(8, 4), ANIMCMD_FRAME(12, 4), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592654[] = { gUnknown_08592640, }; const struct SpriteTemplate gPresentHealParticleSpriteTemplate = { .tileTag = ANIM_TAG_GREEN_SPARKLE, .paletteTag = ANIM_TAG_GREEN_SPARKLE, .oam = &gUnknown_0852490C, .anims = gUnknown_08592654, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPresentHealParticle, }; const struct SpriteTemplate gItemStealSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gUnknown_08524974, .anims = gUnknown_085925AC, .images = NULL, .affineAnims = gUnknown_08592608, .callback = AnimItemSteal, }; const union AffineAnimCmd gUnknown_08592688[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 3), AFFINEANIMCMD_END, }; const union AffineAnimCmd gUnknown_08592698[] = { 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 gUnknown_085926D8[] = { gUnknown_08592688, gUnknown_08592698, gUnknown_085925B0, gUnknown_085925D0, }; const struct SpriteTemplate gTrickBagSpriteTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gUnknown_08524974, .anims = gUnknown_085925AC, .images = NULL, .affineAnims = gUnknown_085926D8, .callback = AnimTrickBag, }; const s8 gUnknown_08592700[][3] = { {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, }; 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 gUnknown_08592790[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 4, 1), AFFINEANIMCMD_JUMP(1), }; const union AffineAnimCmd *const gUnknown_085927A8[] = { gUnknown_08592790, }; const struct SpriteTemplate gUnknown_085927AC = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gUnknown_08524904, .anims = gUnknown_08592318, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8100640, }; const struct SpriteTemplate gUnknown_085927C4 = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gUnknown_0852496C, .anims = gUnknown_08592314, .images = NULL, .affineAnims = gUnknown_085927A8, .callback = sub_8100640, }; const union AffineAnimCmd gUnknown_085927DC[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -10, 1), AFFINEANIMCMD_JUMP(1), }; const union AffineAnimCmd gUnknown_085927F4[] = { AFFINEANIMCMD_FRAME(192, 192, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -12, 1), AFFINEANIMCMD_JUMP(1), }; const union AffineAnimCmd gUnknown_0859280C[] = { AFFINEANIMCMD_FRAME(143, 143, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -15, 1), AFFINEANIMCMD_JUMP(1), }; const union AffineAnimCmd *const gUnknown_08592824[] = { gUnknown_085927DC, }; const union AffineAnimCmd *const gUnknown_08592828[] = { gUnknown_085927F4, }; const union AffineAnimCmd *const gUnknown_0859282C[] = { gUnknown_0859280C, }; const struct SpriteTemplate gUnknown_08592830 = { .tileTag = ANIM_TAG_SPARKLE_6, .paletteTag = ANIM_TAG_SPARKLE_6, .oam = &gUnknown_0852496C, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_08592824, .callback = sub_8100640, }; const struct SpriteTemplate gUnknown_08592848 = { .tileTag = ANIM_TAG_SPARKLE_6, .paletteTag = ANIM_TAG_SPARKLE_6, .oam = &gUnknown_0852496C, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_08592828, .callback = sub_8100640, }; const struct SpriteTemplate gUnknown_08592860 = { .tileTag = ANIM_TAG_SPARKLE_6, .paletteTag = ANIM_TAG_SPARKLE_6, .oam = &gUnknown_0852496C, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_0859282C, .callback = sub_8100640, }; 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 gUnknown_08592888 = { .tileTag = ANIM_TAG_GREEN_SPIKE, .paletteTag = ANIM_TAG_GREEN_SPIKE, .oam = &gUnknown_0852496C, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8100898, }; const union AnimCmd gUnknown_085928A0[] = { ANIMCMD_FRAME(64, 3), ANIMCMD_FRAME(80, 3), ANIMCMD_FRAME(96, 3), ANIMCMD_FRAME(112, 6), ANIMCMD_END, }; const union AnimCmd gUnknown_085928B4[] = { 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 gUnknown_085928C8[] = { gUnknown_085928A0, gUnknown_085928B4, }; const struct SpriteTemplate gUnknown_085928D0 = { .tileTag = ANIM_TAG_SLAM_HIT, .paletteTag = ANIM_TAG_SLAM_HIT, .oam = &gUnknown_08524914, .anims = gUnknown_085928C8, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8100A50, }; const struct SpriteTemplate gUnknown_085928E8 = { .tileTag = ANIM_TAG_WHIP_HIT, .paletteTag = ANIM_TAG_WHIP_HIT, .oam = &gUnknown_08524914, .anims = gUnknown_085928C8, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8100A50, }; 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, }; const struct SpriteTemplate gUnknown_0859291C = { .tileTag = ANIM_TAG_UNUSED_HIT, .paletteTag = ANIM_TAG_UNUSED_HIT, .oam = &gUnknown_08524914, .anims = gUnknown_08592918, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_81009F8, }; const struct SpriteTemplate gUnknown_08592934 = { .tileTag = ANIM_TAG_UNUSED_HIT_2, .paletteTag = ANIM_TAG_UNUSED_HIT_2, .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, }; 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 gUnknown_08592A04[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(16, 5), ANIMCMD_FRAME(32, 5), ANIMCMD_FRAME(48, 5), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592A18[] = { gUnknown_08592A04, }; const struct SpriteTemplate gCuttingSliceSpriteTemplate = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_CUT, .oam = &gUnknown_08524A34, .anims = gUnknown_08592A18, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCuttingSlice, }; const struct SpriteTemplate gUnknown_08592A34 = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_CUT, .oam = &gUnknown_08524A34, .anims = gUnknown_08592A18, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8100B88, }; 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, }; 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 = sub_8100EF0, }; const union AffineAnimCmd gUnknown_08592AF4[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gUnknown_08592B04[] = { 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 gUnknown_08592B34[] = { gUnknown_08592AF4, gUnknown_08592B04, }; const struct SpriteTemplate gUnknown_08592B3C = { .tileTag = ANIM_TAG_MILK_BOTTLE, .paletteTag = ANIM_TAG_MILK_BOTTLE, .oam = &gUnknown_08524A94, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_08592B34, .callback = sub_81010CC, }; const union AnimCmd gUnknown_08592B54[] = { 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 gUnknown_08592B78[] = { gUnknown_08592B54, }; const struct SpriteTemplate gUnknown_08592B7C = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_SPARKLE_2, .oam = &gUnknown_08524914, .anims = gUnknown_08592B78, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_810130C, }; const struct SpriteTemplate gUnknown_08592B94 = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_SPARKLE_2, .oam = &gUnknown_08524914, .anims = gUnknown_08592B78, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_810135C, }; 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, }; const struct SpriteTemplate gUnknown_08592BFC = { .tileTag = ANIM_TAG_UNUSED_BUBBLE_BURST, .paletteTag = ANIM_TAG_UNUSED_BUBBLE_BURST, .oam = &gUnknown_0852490C, .anims = gUnknown_08592BF4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8101440, }; const union AnimCmd gUnknown_08592C14[] = { ANIMCMD_FRAME(0, 40), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592C1C[] = { gUnknown_08592C14, }; const union AffineAnimCmd gUnknown_08592C20[] = { AFFINEANIMCMD_FRAME(0x14, 0x14, -30, 0), AFFINEANIMCMD_FRAME(0x8, 0x8, 1, 24), AFFINEANIMCMD_END, }; const union AffineAnimCmd gUnknown_08592C20_2[] = { AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(0x0, 0x0, 1, 24), AFFINEANIMCMD_LOOP(10), }; const union AffineAnimCmd gUnknown_08592C50[] = { AFFINEANIMCMD_FRAME(0x14, 0x14, 30, 0), AFFINEANIMCMD_FRAME(0x8, 0x8, -1, 24), AFFINEANIMCMD_END, }; const union AffineAnimCmd gUnknown_08592C50_2[] = { AFFINEANIMCMD_LOOP(0), AFFINEANIMCMD_FRAME(0x0, 0x0, -1, 24), AFFINEANIMCMD_LOOP(10), }; const union AffineAnimCmd *const gUnknown_08592C80[] = { gUnknown_08592C20, gUnknown_08592C50, }; const struct SpriteTemplate gUnknown_08592C88 = { .tileTag = ANIM_TAG_LETTER_Z, .paletteTag = ANIM_TAG_LETTER_Z, .oam = &gUnknown_08524974, .anims = gUnknown_08592C1C, .images = NULL, .affineAnims = gUnknown_08592C80, .callback = sub_81014F4, }; const struct SpriteTemplate gUnknown_08592CA0 = { .tileTag = ANIM_TAG_LOCK_ON, .paletteTag = ANIM_TAG_LOCK_ON, .oam = &gUnknown_08524914, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_81015AC, }; const struct SpriteTemplate gUnknown_08592CB8 = { .tileTag = ANIM_TAG_LOCK_ON, .paletteTag = ANIM_TAG_LOCK_ON, .oam = &gUnknown_0852490C, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8101898, }; const s8 gUnknown_08592CD0[][2] = { { 64, 64}, { 0, -64}, {-64, 64}, { 32, -32}, }; const struct SpriteTemplate gUnknown_08592CD8 = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8101940, }; const struct SpriteTemplate gUnknown_08592CF0 = { .tileTag = 0, .paletteTag = 0, .oam = &gDummyOamData, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8101B90, }; const union AnimCmd gUnknown_08592D08[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_END, }; const union AnimCmd gUnknown_08592D1C[] = { ANIMCMD_FRAME(48, 4), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592D24[] = { gUnknown_08592D08, gUnknown_08592D1C, }; const struct SpriteTemplate gUnknown_08592D2C = { .tileTag = ANIM_TAG_SLASH, .paletteTag = ANIM_TAG_SLASH, .oam = &gUnknown_08524914, .anims = gUnknown_08592D24, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8101F40, }; const struct SpriteTemplate gUnknown_08592D44 = { .tileTag = ANIM_TAG_SLASH_2, .paletteTag = ANIM_TAG_SLASH_2, .oam = &gUnknown_08524914, .anims = gUnknown_08592D24, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8101FA8, }; const struct SpriteTemplate gUnknown_08592D5C = { .tileTag = ANIM_TAG_SLASH_2, .paletteTag = ANIM_TAG_SLASH_2, .oam = &gUnknown_08524914, .anims = gUnknown_08592D24, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8101FF0, }; const union AnimCmd gUnknown_08592D74[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(8, 12), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(24, 4), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592D88[] = { gUnknown_08592D74, }; const struct SpriteTemplate gUnknown_08592D8C = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_FOCUS_ENERGY, .oam = &gUnknown_08524954, .anims = gUnknown_08592D88, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_81020D8, }; const union AnimCmd gUnknown_08592DA4[] = { 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 gUnknown_08592DE0[] = { gUnknown_08592DA4, }; const struct SpriteTemplate gUnknown_08592DE4 = { .tileTag = ANIM_TAG_SPHERE_TO_CUBE, .paletteTag = ANIM_TAG_SPHERE_TO_CUBE, .oam = &gUnknown_08524914, .anims = gUnknown_08592DE0, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_810217C, }; const struct SpriteTemplate gUnknown_08592DFC = { .tileTag = ANIM_TAG_BLACK_BALL, .paletteTag = ANIM_TAG_BLACK_BALL, .oam = &gUnknown_08524904, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation, }; const union AnimCmd gUnknown_08592E14[] = { 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 gUnknown_08592E2C[] = { gUnknown_08592E14, }; const struct SpriteTemplate gUnknown_08592E30 = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_GRAY_SMOKE, .oam = &gUnknown_08524914, .anims = gUnknown_08592E2C, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80A77C8, }; const union AnimCmd gUnknown_08592E48[] = { ANIMCMD_FRAME(3, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(1, 5), ANIMCMD_FRAME(0, 5), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592E5C[] = { gUnknown_08592E48, }; const union AffineAnimCmd gUnknown_08592E60[] = { AFFINEANIMCMD_FRAME(0x200, 0x200, 0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd *const gUnknown_08592E70[] = { gUnknown_08592E60, }; const struct SpriteTemplate gUnknown_08592E74 = { .tileTag = ANIM_TAG_CONVERSION, .paletteTag = ANIM_TAG_CONVERSION, .oam = &gUnknown_08524AE4, .anims = gUnknown_08592E5C, .images = NULL, .affineAnims = gUnknown_08592E70, .callback = sub_8102268, }; const union AnimCmd gUnknown_08592E8C[] = { ANIMCMD_FRAME(0, 5), ANIMCMD_FRAME(1, 5), ANIMCMD_FRAME(2, 5), ANIMCMD_FRAME(3, 5), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592EA0[] = { gUnknown_08592E8C, }; const struct SpriteTemplate gUnknown_08592EA4 = { .tileTag = ANIM_TAG_CONVERSION, .paletteTag = ANIM_TAG_CONVERSION, .oam = &gUnknown_08524AE4, .anims = gUnknown_08592EA0, .images = NULL, .affineAnims = gUnknown_08592E70, .callback = sub_810234C, }; const struct SpriteTemplate gUnknown_08592EBC = { .tileTag = ANIM_TAG_MOON, .paletteTag = ANIM_TAG_MOON, .oam = &gUnknown_08524A3C, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_81024E0, }; const union AnimCmd gUnknown_08592ED4[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), ANIMCMD_FRAME(8, 8), ANIMCMD_FRAME(12, 8), ANIMCMD_JUMP(0), }; const union AnimCmd *const gUnknown_08592EE8[] = { gUnknown_08592ED4, }; const struct SpriteTemplate gBattleAnimSpriteTemplate_8592EEC = { .tileTag = ANIM_TAG_GREEN_SPARKLE, .paletteTag = ANIM_TAG_GREEN_SPARKLE, .oam = &gUnknown_0852490C, .anims = gUnknown_08592EE8, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8102540, }; const union AnimCmd gUnknown_08592F04[] = { 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 gUnknown_08592F28[] = { gUnknown_08592F04, }; const struct SpriteTemplate gUnknown_08592F2C = { .tileTag = ANIM_TAG_BLUE_STAR, .paletteTag = ANIM_TAG_BLUE_STAR, .oam = &gUnknown_08524914, .anims = gUnknown_08592F28, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80A77C8, }; const struct SpriteTemplate gUnknown_08592F44 = { .tileTag = ANIM_TAG_HORN_HIT, .paletteTag = ANIM_TAG_HORN_HIT, .oam = &gUnknown_08524914, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8102844, }; const union AnimCmd gUnknown_08592F5C[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(48, 2), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592F70[] = { gUnknown_08592F5C, }; const struct SpriteTemplate gUnknown_08592F74 = { .tileTag = ANIM_TAG_FANG_ATTACK, .paletteTag = ANIM_TAG_FANG_ATTACK, .oam = &gUnknown_08524914, .anims = gUnknown_08592F70, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8102BCC, }; const union AnimCmd gUnknown_08592F8C[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_END, }; const union AnimCmd gUnknown_08592F94[] = { ANIMCMD_FRAME(4, 10), ANIMCMD_END, }; const union AnimCmd gUnknown_08592F9C[] = { ANIMCMD_FRAME(8, 41), ANIMCMD_END, }; const union AnimCmd gUnknown_08592FA4[] = { ANIMCMD_FRAME(12, 10), ANIMCMD_END, }; const union AnimCmd gUnknown_08592FAC[] = { ANIMCMD_FRAME(16, 10), ANIMCMD_END, }; const union AnimCmd gUnknown_08592FB4[] = { ANIMCMD_FRAME(20, 10), ANIMCMD_END, }; const union AnimCmd gUnknown_08592FBC[] = { ANIMCMD_FRAME(0, 10, .vFlip = TRUE), ANIMCMD_END, }; const union AnimCmd gUnknown_08592FC4[] = { ANIMCMD_FRAME(4, 10, .vFlip = TRUE), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08592FCC[] = { gUnknown_08592F8C, gUnknown_08592F94, gUnknown_08592F9C, gUnknown_08592FA4, gUnknown_08592FAC, gUnknown_08592FB4, gUnknown_08592FBC, gUnknown_08592FC4, }; const union AffineAnimCmd gUnknown_08592FEC[] = { AFFINEANIMCMD_FRAME(0xC, 0xC, 0, 16), AFFINEANIMCMD_FRAME(0xFFF4, 0xFFF4, 0, 16), AFFINEANIMCMD_JUMP(0), }; const union AffineAnimCmd *const gUnknown_08593004[] = { gUnknown_08592FEC, }; const struct SpriteTemplate gUnknown_08593008 = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gUnknown_085249CC, .anims = gUnknown_08592FCC, .images = NULL, .affineAnims = gUnknown_08593004, .callback = sub_8102CD4, }; const u16 gUnknown_08593020[][6] = { {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 gUnknown_08593050 = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gUnknown_085249CC, .anims = gUnknown_08592FCC, .images = NULL, .affineAnims = gUnknown_08593004, .callback = sub_8102EB0, }; const struct SpriteTemplate gUnknown_08593068 = { .tileTag = ANIM_TAG_PURPLE_HAND_OUTLINE, .paletteTag = ANIM_TAG_PURPLE_HAND_OUTLINE, .oam = &gUnknown_08524914, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8102FB8, }; const union AffineAnimCmd gUnknown_08593080[] = { AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0), AFFINEANIMCMD_FRAME(0x4, 0x4, 0, 1), AFFINEANIMCMD_JUMP(1), }; const union AffineAnimCmd *const gUnknown_08593098[] = { gUnknown_08593080, }; const struct SpriteTemplate gUnknown_0859309C = { .tileTag = ANIM_TAG_MUSIC_NOTES, .paletteTag = ANIM_TAG_MUSIC_NOTES, .oam = &gUnknown_085249CC, .anims = gUnknown_08592FCC, .images = NULL, .affineAnims = gUnknown_08593098, .callback = sub_8103028, }; const union AnimCmd gUnknown_085930B4[] = { 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 gUnknown_085930C8[] = { 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 gUnknown_085930DC[] = { ANIMCMD_FRAME(0, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(48, 2), ANIMCMD_END, }; const union AnimCmd gUnknown_085930F0[] = { ANIMCMD_FRAME(48, 2), ANIMCMD_FRAME(32, 2), ANIMCMD_FRAME(16, 2), ANIMCMD_FRAME(0, 2), ANIMCMD_END, }; const union AnimCmd *const gUnknown_08593104[] = { gUnknown_085930B4, gUnknown_085930DC, gUnknown_085930C8, gUnknown_085930F0, }; const struct SpriteTemplate gUnknown_08593114 = { .tileTag = ANIM_TAG_THOUGHT_BUBBLE, .paletteTag = ANIM_TAG_THOUGHT_BUBBLE, .oam = &gUnknown_08524914, .anims = gUnknown_08593104, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8103164, }; const union AffineAnimCmd gUnknown_0859312C[] = { AFFINEANIMCMD_FRAME(0x10, 0x10, 0, 0), AFFINEANIMCMD_FRAME(0x1E, 0x1E, 0, 8), AFFINEANIMCMD_END, }; const union AffineAnimCmd gUnknown_08593144[] = { 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 gUnknown_08593144_2[] = { 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 gUnknown_085931B4[] = { gUnknown_0859312C, gUnknown_08593144, }; const struct SpriteTemplate gUnknown_085931BC = { .tileTag = ANIM_TAG_FINGER, .paletteTag = ANIM_TAG_FINGER, .oam = &gUnknown_085249D4, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_085931B4, .callback = sub_8103208, }; const struct SpriteTemplate gUnknown_085931D4 = { .tileTag = ANIM_TAG_FINGER, .paletteTag = ANIM_TAG_FINGER, .oam = &gUnknown_08524974, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gUnknown_085931B4, .callback = sub_8103284, }; const union AnimCmd gUnknown_085931EC[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; const union AnimCmd gUnknown_085931F4[] = { ANIMCMD_FRAME(0, 1, .hFlip = TRUE), ANIMCMD_END, }; const union AnimCmd gUnknown_085931FC[] = { 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 gUnknown_0859321C[] = { 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 gUnknown_0859323C[] = { gUnknown_085931EC, gUnknown_085931F4, gUnknown_085931FC, gUnknown_0859321C, }; const struct SpriteTemplate gUnknown_0859324C = { .tileTag = ANIM_TAG_FINGER_2, .paletteTag = ANIM_TAG_FINGER_2, .oam = &gUnknown_08524914, .anims = gUnknown_0859323C, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_8103390, }; const struct SpriteTemplate gPowerOrbs_Float = { .tileTag = ANIM_TAG_RED_ORB, .paletteTag = ANIM_TAG_RED_ORB, .oam = &gUnknown_0852490C, .anims = gUnknown_085922E4, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSporeParticle, }; const union AnimCmd gRockPolishStreak_AnimCmd[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_FRAME(4, 2), ANIMCMD_FRAME(8, 3), ANIMCMD_FRAME(12, 15), ANIMCMD_FRAME(8, 3), ANIMCMD_FRAME(4, 2), ANIMCMD_FRAME(0, 1), ANIMCMD_END, }; const union AnimCmd *const gRockPolishStreak_AnimCmds[] = { gRockPolishStreak_AnimCmd, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd0[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd1[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x10, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd2[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x20, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd3[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x30, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd4[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x40, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd5[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x50, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd6[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x60, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd7[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x70, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd8[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x80, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmd9[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0x90, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdA[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0xA0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdB[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0xB0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdC[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0xC0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdD[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0xD0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdE[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0xE0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd gRockPolishStreak_AffineAnimCmdF[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0xF0, 0), AFFINEANIMCMD_END, }; const union AffineAnimCmd *const gRockPolishStreak_AffineAnimCmds[] = { gRockPolishStreak_AffineAnimCmd0, gRockPolishStreak_AffineAnimCmd1, gRockPolishStreak_AffineAnimCmd2, gRockPolishStreak_AffineAnimCmd3, gRockPolishStreak_AffineAnimCmd4, gRockPolishStreak_AffineAnimCmd5, gRockPolishStreak_AffineAnimCmd6, gRockPolishStreak_AffineAnimCmd7, gRockPolishStreak_AffineAnimCmd8, gRockPolishStreak_AffineAnimCmd9, gRockPolishStreak_AffineAnimCmdA, gRockPolishStreak_AffineAnimCmdB, gRockPolishStreak_AffineAnimCmdC, gRockPolishStreak_AffineAnimCmdD, gRockPolishStreak_AffineAnimCmdE, gRockPolishStreak_AffineAnimCmdF, }; const struct SpriteTemplate gRockPolishStreakSpriteTemplate = { .tileTag = ANIM_TAG_WHITE_STREAK, .paletteTag = ANIM_TAG_WHITE_STREAK, .oam = &gUnknown_08524B0C, .anims = gRockPolishStreak_AnimCmds, .images = NULL, .affineAnims = gRockPolishStreak_AffineAnimCmds, .callback = AnimRockPolishStreak, }; const union AnimCmd gRockPolishSparkle_AnimCmd1[] = { ANIMCMD_FRAME(0, 7), ANIMCMD_FRAME(4, 7), ANIMCMD_FRAME(8, 7), ANIMCMD_FRAME(12, 7), ANIMCMD_END, }; const union AnimCmd *const gRockPolishSparkle_AnimCmds[] = { gRockPolishSparkle_AnimCmd1, }; const struct SpriteTemplate gRockPolishSparkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_3, .paletteTag = ANIM_TAG_SPARKLE_3, .oam = &gUnknown_0852490C, .anims = gRockPolishSparkle_AnimCmds, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRockPolishSparkle, }; const struct SpriteTemplate gPoisonJabProjectileSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_JAB, .paletteTag = ANIM_TAG_PURPLE_JAB, .oam = &gUnknown_08524B14, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPoisonJabProjectile, }; const union AnimCmd gNightSlashLeftAnimCmd0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_END, }; const union AnimCmd gNightSlashLeftAnimCmd1[] = { ANIMCMD_FRAME(48, 4), ANIMCMD_END, }; const union AnimCmd *const gNightSlashLeftAnimTable[] = { gNightSlashLeftAnimCmd0, gNightSlashLeftAnimCmd1, }; const struct SpriteTemplate gNightSlashLeftSpriteTemplate = { .tileTag = ANIM_TAG_SLASH, .paletteTag = ANIM_TAG_SLASH, .oam = &gUnknown_08524914, .anims = gNightSlashLeftAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNightSlash, }; const union AnimCmd gNightSlashRightAnimCmd0[] = { ANIMCMD_FRAME(0, 4, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(16, 4, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(32, 4, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_FRAME(48, 4, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END, }; const union AnimCmd gNightSlashRightAnimCmd1[] = { ANIMCMD_FRAME(48, 4, .vFlip = TRUE, .hFlip = TRUE), ANIMCMD_END, }; const union AnimCmd *const gNightSlashRightAnimTable[] = { gNightSlashRightAnimCmd0, gNightSlashRightAnimCmd1, }; const struct SpriteTemplate gNightSlashRightSpriteTemplate = { .tileTag = ANIM_TAG_SLASH, .paletteTag = ANIM_TAG_SLASH, .oam = &gUnknown_08524914, .anims = gNightSlashRightAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNightSlash, }; // 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); } } // 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) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); } // 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) { InitSpritePosToAnimAttacker(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[3]); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } // 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) { InitSpritePosToAnimAttacker(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->pos1.x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = AnimSolarbeamSmallOrbStep; sprite->callback(sprite); } static void AnimSolarbeamSmallOrbStep(struct Sprite* sprite) { if (AnimTranslateLinear(sprite)) { DestroySprite(sprite); } else { if (sprite->data[5] > 0x7F) sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1; else sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimTarget) + 6; sprite->pos2.x += Sin(sprite->data[5], 5); sprite->pos2.y += Cos(sprite->data[5], 14); sprite->data[5] = (sprite->data[5] + 15) & 0xFF; } } // 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) { if (--gTasks[taskId].data[0] == -1) { gTasks[taskId].data[1]++; gTasks[taskId].data[0] = 6; gBattleAnimArgs[0] = 15; gBattleAnimArgs[1] = 0; gBattleAnimArgs[2] = 80; gBattleAnimArgs[3] = 0; CreateSpriteAndAnimate(&gSolarbeamSmallOrbSpriteTemplate, 0, 0, GetBattlerSpriteSubpriority(gBattleAnimTarget) + 1); } if (gTasks[taskId].data[1] == 15) DestroyAnimVisualTask(taskId); } // 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) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[5] = gBattleAnimArgs[2]; InitAnimArcTranslation(sprite); sprite->callback = AnimAbsorptionOrbStep; } static void AnimAbsorptionOrbStep(struct Sprite* sprite) { if (TranslateAnimHorizontalArc(sprite)) DestroyAnimSprite(sprite); } // 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) { u16 speed; u16 animNum = Random2(); 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) sprite->pos1.x -= 20; else sprite->pos1.x += 20; speed = Random2(); sprite->data[0] = (speed & 31) + 64; sprite->data[1] = sprite->pos1.x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimFastLinearTranslationWithSpeed(sprite); sprite->data[5] = Random2() & 0xFF; sprite->data[6] = sprite->subpriority; sprite->callback = AnimHyperBeamOrbStep; sprite->callback(sprite); } static void AnimHyperBeamOrbStep(struct Sprite* sprite) { if (AnimFastTranslateLinear(sprite)) { 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; sprite->data[5] += 24; sprite->data[5] &= 0xFF; } } // 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) { InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); sprite->callback = AnimLeechSeedStep; } static void AnimLeechSeedStep(struct Sprite* sprite) { if (TranslateAnimHorizontalArc(sprite)) { 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); } // 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) { InitSpritePosToAnimTarget(sprite, TRUE); 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]; sprite->callback = AnimSporeParticleStep; sprite->callback(sprite); } static void AnimSporeParticleStep(struct Sprite* sprite) { 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) { sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); } else { u8 priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1; if (priority > 3) priority = 3; sprite->oam.priority = priority; } sprite->data[1] += 2; sprite->data[1] &= 0xFF; if (--sprite->data[0] == -1) DestroyAnimSprite(sprite); } // 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) { if (IsContest() || !IsDoubleBattle()) { DestroyAnimVisualTask(taskId); } else { if (GetBattlerSpriteBGPriorityRank(gBattleAnimTarget) == 1) SetAnimBgAttribute(2, BG_ANIM_PRIORITY, 3); else SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); DestroyAnimVisualTask(taskId); } } // 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) { InitSpritePosToAnimAttacker(sprite, FALSE); 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, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[2]; InitAnimLinearTranslation(sprite); sprite->data[5] = 0x40; sprite->callback = AnimPetalDanceBigFlowerStep; sprite->callback(sprite); } static void AnimPetalDanceBigFlowerStep(struct Sprite* sprite) { if (!AnimTranslateLinear(sprite)) { sprite->pos2.x += Sin(sprite->data[5], 32); sprite->pos2.y += Cos(sprite->data[5], -5); if ((u16)(sprite->data[5] - 0x40) < 0x80) sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) - 1; else sprite->subpriority = GetBattlerSpriteSubpriority(gBattleAnimAttacker) + 1; sprite->data[5] = (sprite->data[5] + 5) & 0xFF; } else { DestroyAnimSprite(sprite); } } // 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) { InitSpritePosToAnimAttacker(sprite, TRUE); 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; sprite->callback = AnimPetalDanceSmallFlowerStep; sprite->callback(sprite); } static void AnimPetalDanceSmallFlowerStep(struct Sprite* sprite) { if (!AnimTranslateLinear(sprite)) { sprite->pos2.x += Sin(sprite->data[5], 8); if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5) sprite->oam.matrixNum ^= 0x8; // horizontal flip sprite->data[5] += 5; sprite->data[5] &= 0xFF; } else { DestroyAnimSprite(sprite); } } // 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) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[2]; sprite->callback = AnimRazorLeafParticleStep1; } static void AnimRazorLeafParticleStep1(struct Sprite* sprite) { if (!sprite->data[2]) { if (sprite->data[1] & 1) { sprite->data[0] = 0x80; sprite->data[1] = 0; sprite->data[2] = 0; } else { sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 0; } sprite->callback = AnimRazorLeafParticleStep2; } else { sprite->data[2]--; sprite->pos1.x += sprite->data[0]; sprite->pos1.y += sprite->data[1]; } } static void AnimRazorLeafParticleStep2(struct Sprite* sprite) { if (GetBattlerSide(gBattleAnimAttacker)) sprite->pos2.x = -Sin(sprite->data[0], 25); else sprite->pos2.x = Sin(sprite->data[0], 25); sprite->data[0] += 2; sprite->data[0] &= 0xFF; 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) { InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; if (!gBattleAnimArgs[6]) { sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; } else { SetAverageBattlerPositions(gBattleAnimTarget, TRUE, &sprite->data[2], &sprite->data[4]); 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; sprite->data[0] = 1; TranslateAnimHorizontalArc(sprite); 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; } 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) sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) - 1; else sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget) + 1; if (--sprite->data[0] == 0) DestroyAnimSprite(sprite); } // 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) { InitSpritePosToAnimTarget(sprite, FALSE); sprite->affineAnimPaused = 1; StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); sprite->data[6] = gBattleAnimArgs[2]; sprite->data[7] = gBattleAnimArgs[3]; sprite->callback = AnimConstrictBindingStep1; } static void AnimConstrictBindingStep1(struct Sprite* sprite) { u8 spriteId; if ((u16)gBattleAnimArgs[7] == 0xFFFF) { sprite->affineAnimPaused = 0; spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); sprite->data[0] = 0x100; sprite->callback = AnimConstrictBindingStep2; } } static void AnimConstrictBindingStep2(struct Sprite* sprite) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); 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); } } void sub_80FF458(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); if (gSprites[spriteId].invisible) { DestroyAnimVisualTask(taskId); } else { PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND); gTasks[taskId].data[14] = gSprites[spriteId].oam.priority; gSprites[spriteId].oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); spriteId = GetAnimBattlerSpriteId(ANIM_DEF_PARTNER); gTasks[taskId].data[15] = gSprites[spriteId].oam.priority; gSprites[spriteId].oam.priority = GetBattlerSpriteBGPriority(BATTLE_PARTNER(gBattleAnimTarget)); gTasks[taskId].data[0] = gBattleAnimArgs[0]; gTasks[taskId].data[1] = gBattleAnimArgs[1]; gTasks[taskId].data[11] = 0x100; gTasks[taskId].func = sub_80FF53C; } } static void sub_80FF53C(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); gTasks[taskId].data[10] += gTasks[taskId].data[0]; gSprites[spriteId].pos2.x = gTasks[taskId].data[10] >> 8; if (GetBattlerSide(gBattleAnimTarget) != B_SIDE_PLAYER) gSprites[spriteId].pos2.x = -gSprites[spriteId].pos2.x; gTasks[taskId].data[11] += 16; SetSpriteRotScale(spriteId, gTasks[taskId].data[11], gTasks[taskId].data[11], 0); SetBattlerSpriteYOffsetFromYScale(spriteId); if (--gTasks[taskId].data[1] == 0) { gTasks[taskId].data[0] = 0; gTasks[taskId].func = sub_80FF5CC; } } static void sub_80FF5CC(u8 taskId) { if ((u16)gBattleAnimArgs[7] == 0xFFFF) { if (gTasks[taskId].data[0] == 0) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); ResetSpriteRotScale(spriteId); 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); } // 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) { switch (sprite->data[0]) { case 0: if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) gBattleAnimArgs[0] *= -1; sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X) + gBattleAnimArgs[0]; sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y) + gBattleAnimArgs[1]; sprite->invisible = 1; sprite->data[0]++; break; case 1: sprite->invisible = 0; if (sprite->affineAnimEnded) { ChangeSpriteAffineAnim(sprite, 1); sprite->data[0] = 25; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET); sprite->callback = InitAndRunAnimFastLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); break; } } } // 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) { if (!sprite->data[0]) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); 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; } sprite->callback = AnimRootFlickerOut; } // 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) { 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); targetX -= attackerX; targetY -= attackerY; sprite->pos1.x = attackerX + targetX * gBattleAnimArgs[0] / 100; sprite->pos1.y = attackerY + targetY * gBattleAnimArgs[0] / 100; sprite->pos2.x = gBattleAnimArgs[1]; sprite->pos2.y = gBattleAnimArgs[2]; sprite->subpriority = gBattleAnimArgs[3] + 30; StartSpriteAnim(sprite, gBattleAnimArgs[4]); sprite->data[2] = gBattleAnimArgs[5]; sprite->callback = AnimRootFlickerOut; gUnknown_0203A0F8[0] = sprite->pos1.x; gUnknown_0203A0F8[1] = sprite->pos1.y; gUnknown_0203A0F8[2] = targetX; gUnknown_0203A0F8[3] = targetY; } static void AnimRootFlickerOut(struct Sprite* sprite) { if (++sprite->data[0] > (sprite->data[2] - 10)) sprite->invisible = sprite->data[0] % 2; if (sprite->data[0] > sprite->data[2]) DestroyAnimSprite(sprite); } // 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) { 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); } static void sub_80FF9B8(struct Sprite* sprite, s16 c) { int a = (sprite->pos1.x << 8) | sprite->pos1.y; int b = (sprite->data[6] << 8) | sprite->data[7]; c <<= 8; sprite->data[5] = a; sprite->data[6] = b; sprite->data[7] = c; } bool8 sub_80FF9E0(struct Sprite* sprite) { u16 r10 = (u8)(sprite->data[5] >> 8); u16 r9 = (u8)sprite->data[5]; s32 r2 = (u8)(sprite->data[6] >> 8); s32 r4 = (u8)sprite->data[6]; s16 r6 = sprite->data[7] >> 8; s16 r3 = sprite->data[7] & 0xFF; s16 r4_2; s16 r0; s32 var1; s32 var2; if (r2 == 0) r2 = -32; else if (r2 == 255) r2 = 272; r4_2 = r4 - r9; r0 = r2 - r10; var1 = r0 * r3 / r6; var2 = r4_2 * r3 / r6; sprite->pos1.x = var1 + r10; sprite->pos1.y = var2 + r9; if (++r3 == r6) return TRUE; sprite->data[7] = (r6 << 8) | r3; return FALSE; } void sub_80FFA84(struct Sprite* sprite) { if (sprite->data[0] == 10) StartSpriteAffineAnim(sprite, 1); sprite->data[0]++; if (sprite->data[0] > 50) DestroyAnimSprite(sprite); } static void sub_80FFAB4(struct Sprite* sprite) { 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); if (sub_80FF9E0(sprite)) { sprite->pos2.y = 0; sprite->data[0] = 0; sprite->callback = sub_80FFA84; } } void AnimPresent(struct Sprite* sprite) { s16 targetX; s16 targetY; InitSpritePosToAnimAttacker(sprite, FALSE); targetX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X); targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); if (BATTLE_PARTNER(gBattleAnimAttacker) == gBattleAnimTarget) { sprite->data[6] = targetX; sprite->data[7] = targetY + 10; sub_80FF9B8(sprite, 60); sprite->data[3] = 1; } else { sprite->data[6] = targetX; sprite->data[7] = targetY + 10; sub_80FF9B8(sprite, 60); sprite->data[3] = 3; } sprite->data[4] = 60; sprite->callback = sub_80FFAB4; } static void sub_80FFB90(struct Sprite* sprite) { 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); if (sub_80FF9E0(sprite)) { sprite->pos2.y = zero; sprite->data[0] = zero; DestroyAnimSprite(sprite); } } void AnimKnockOffItem(struct Sprite* sprite) { s16 targetY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y); if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { sprite->data[6] = 0; sprite->data[7] = targetY + 10; sub_80FF9B8(sprite, 40); sprite->data[3] = 3; sprite->data[4] = 60; sprite->callback = sub_80FFAB4; } else { sprite->data[6] = 255; sprite->data[7] = targetY + 10; if (IsContest()) sprite->data[6] = 0; sub_80FF9B8(sprite, 40); sprite->data[3] = 3; sprite->data[4] = 60; sprite->callback = sub_80FFB90; } } // 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) { if (!sprite->data[0]) { InitSpritePosToAnimTarget(sprite, FALSE); sprite->data[1] = gBattleAnimArgs[2]; } sprite->data[0]++; sprite->pos2.y = sprite->data[1] * sprite->data[0]; if (sprite->animEnded) DestroyAnimSprite(sprite); } void AnimItemSteal(struct Sprite* sprite) { s16 attackerX; s16 attackerY; InitSpritePosToAnimTarget(sprite, FALSE); attackerX = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X); attackerY = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y); if (BATTLE_PARTNER(gBattleAnimTarget) == gBattleAnimAttacker) { sprite->data[6] = attackerX; sprite->data[7] = attackerY + 10; sub_80FF9B8(sprite, 60); sprite->data[3] = 1; } else { sprite->data[6] = attackerX; sprite->data[7] = attackerY + 10; sub_80FF9B8(sprite, 60); sprite->data[3] = 3; } sprite->data[4] = 60; sprite->callback = AnimItemStealStep; } static void AnimItemStealStep(struct Sprite* sprite) { 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)); if (sub_80FF9E0(sprite)) { sprite->pos2.y = 0; sprite->data[0] = 0; sprite->callback = sub_80FFA84; PlaySE12WithPanning(SE_W145B, BattleAnimAdjustPanning(-64)); } } // Moves a bag in a circular motion. // arg 0: y position // arg 1: initial wave offset void AnimTrickBag(struct Sprite* sprite) { 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); sprite->callback = AnimTrickBagStep1; if (sprite->data[1] > 0 && sprite->data[1] < 192) sprite->subpriority = 31; else sprite->subpriority = 29; } } static void AnimTrickBagStep1(struct Sprite* sprite) { 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; sprite->callback = AnimTrickBagStep2; } break; } } static void AnimTrickBagStep2(struct Sprite* sprite) { if (sprite->data[2] == gUnknown_08592700[sprite->data[0]][1]) { if (gUnknown_08592700[sprite->data[0]][2] == 127) { sprite->data[0] = 0; sprite->callback = AnimTrickBagStep3; } sprite->data[2] = 0; sprite->data[0]++; } else { sprite->data[2]++; sprite->data[1] = (gUnknown_08592700[sprite->data[0]][0] * gUnknown_08592700[sprite->data[0]][2] + sprite->data[1]) & 0xFF; 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); } } static void AnimTrickBagStep3(struct Sprite* sprite) { if (sprite->data[0] > 20) DestroyAnimSprite(sprite); sprite->invisible = sprite->data[0] % 2; sprite->data[0]++; } void sub_80FFFC0(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[4] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 1; task->data[6] = GetBattlerSpriteCoord(gBattleAnimTarget, 2); task->data[7] = GetBattlerSpriteCoord(gBattleAnimTarget, 3); task->data[10] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH); task->data[11] = GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_HEIGHT); 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] = sub_8100504(&gSprites[task->data[2]]); InitAnimArcTranslation(&gSprites[task->data[2]]); task->func = sub_8100128; } static void sub_8100128(u8 taskId) { struct Task* task = &gTasks[taskId]; struct Sprite* sprite = &gSprites[task->data[2]]; int a = task->data[0]; switch (a) { case 4: sub_8100524(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { task->data[15] = 5; task->data[0] = 0xFF; } break; case 8: sub_8100524(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { task->data[15] = 9; task->data[0] = 0xFF; } break; case 0: sub_8100524(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { 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] = sub_8100504(sprite); 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: sub_8100524(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { 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] = sub_8100504(sprite); 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] = sub_8100504(sprite); 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: sub_8100524(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { 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] = sub_8100504(sprite); 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] = sub_8100504(sprite); task->data[3] = 5; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); InitAnimArcTranslation(sprite); task->data[0]++; break; case 10: sub_8100524(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { 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] = sub_8100504(sprite); 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: sub_8100524(task, taskId); if (TranslateAnimHorizontalArc(sprite)) { 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 sub_8100504(struct Sprite* sprite) { s16 var = 8; if (sprite->data[4] < sprite->pos1.y) var = -var; return var; } static void sub_8100524(struct Task* task, u8 taskId) { 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 = sub_80CC408; } } } static void sub_80CC408(struct Sprite* sprite) { 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 sub_8100640(struct Sprite* sprite) { u8 battler; if (!gBattleAnimArgs[6]) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; if (GetBattlerSide(battler) != 0) { 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]; sprite->oam.priority = GetBattlerSpriteBGPriority(battler); break; case 1: sprite->pos1.y = gBattleAnimArgs[0]; sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1; break; case 2: sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) + gBattleAnimArgs[0]; sprite->oam.priority = GetBattlerSpriteBGPriority(battler); break; case 3: sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[0]; GetAnimBattlerSpriteId(ANIM_TARGET); sprite->oam.priority = GetBattlerSpriteBGPriority(battler) + 1; break; } sprite->callback = sub_810074C; } static void sub_810074C(struct Sprite* sprite) { 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; } DestroySpriteAndMatrix(sprite); } void sub_81007C4(u8 taskId) { 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); } void sub_8100898(struct Sprite* sprite) { 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; TrySetSpriteRotScale(sprite, 0, 0x100, 0x100, c); sprite->callback = sub_81009A0; } } static void sub_81009A0(struct Sprite* sprite) { 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 { DestroySpriteAndMatrix(sprite); } } static void sub_81009DC(struct Sprite* sprite) { if (sprite->animEnded) DestroyAnimSprite(sprite); } void sub_81009F8(struct Sprite* sprite) { if (GetBattlerSide(gBattleAnimAttacker) != 0) { sprite->pos1.x -= gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; } else { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; } sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } void sub_8100A50(struct Sprite* sprite) { if (GetBattlerSide(gBattleAnimAttacker) == 0) StartSpriteAnim(sprite, 1); sprite->callback = sub_81009DC; SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); 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]); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = TranslateSpriteLinearAndFlicker; } // Moves the sprite in a diagonally slashing motion across the target mon. // Used by moves such as MOVE_CUT and MOVE_AERIAL_ACE. // 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 sub_8100B88(struct Sprite* sprite) { 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) == 0) 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 sub_8100EF0(struct Sprite* sprite) { 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()) sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker) + 1; else sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); 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 = sub_8100FD4; } static void sub_8100FD4(struct Sprite *sprite) { 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; sprite->callback = DestroyAnimSpriteAndDisableBlend; } } } void sub_81010CC(struct Sprite* sprite) { 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 = sub_8101138; } static void sub_8101138(struct Sprite* sprite) { 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: sub_8101298(sprite, 16, 4); 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 sub_8101298(struct Sprite* sprite, int unk1, int unk2) { 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 sub_810130C(struct Sprite* sprite) { if (!gBattleAnimArgs[2]) SetSpriteCoordsToAnimAttackerCoords(sprite); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->pos1.y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[5]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinearFixedPoint; } void sub_810135C(struct Sprite* sprite) { 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); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); 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]; } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); } sprite->data[0] = gBattleAnimArgs[5]; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = TranslateSpriteLinearFixedPoint; } void sub_8101440(struct Sprite* sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) { 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 sub_81014F4(struct Sprite* sprite) { SetSpriteCoordsToAnimAttackerCoords(sprite); 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 = sub_8101560; } static void sub_8101560(struct Sprite* sprite) { 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) DestroySpriteAndMatrix(sprite); } void sub_81015AC(struct Sprite* sprite) { sprite->pos1.x -= 32; sprite->pos1.y -= 32; sprite->data[0] = 20; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, sub_81015D4); } static void sub_81015D4(struct Sprite* sprite) { switch (sprite->data[5] & 1) { case 0: sprite->data[0] = 1; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, sub_81015D4); 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 + gUnknown_08592CD0[sprite->data[5] >> 8][0]; sprite->data[4] = sprite->pos1.y + gUnknown_08592CD0[sprite->data[5] >> 8][1]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, sub_8101684); sprite->data[5] += 0x100; PlaySE12WithPanning(SE_W199, BattleAnimAdjustPanning(63)); break; } sprite->data[5] ^= 1; } static void sub_8101684(struct Sprite* sprite) { if ((sprite->data[5] >> 8) == 4) { sprite->data[0] = 10; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, sub_81016B8); } else { sprite->callback = sub_81015D4; } } static void sub_81016B8(struct Sprite* sprite) { 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, sub_8101774); } 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, sub_8101820); } } static void sub_8101774(struct Sprite* sprite) { 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 = sub_8101820; } } static void sub_8101820(struct Sprite* sprite) { if ((u16)gBattleAnimArgs[7] == 0xFFFF) { sprite->data[1] = 0; sprite->data[0] = 0; sprite->callback = sub_8101848; } } static void sub_8101848(struct Sprite* sprite) { if (sprite->data[0] % 3 == 0) { sprite->data[1]++; sprite->invisible ^= 1; } sprite->data[0]++; if (sprite->data[1] == 8) DestroyAnimSprite(sprite); } void sub_8101898(struct Sprite* sprite) { 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 = 16; } else if ((s16)sprite->oam.affineParam == 3) { sprite->pos1.x += 0x18; sprite->pos1.y -= 0x18; sprite->oam.matrixNum = 8; } else { sprite->pos1.x += 0x18; sprite->pos1.y += 0x18; sprite->oam.matrixNum = 24; } sprite->oam.tileNum = (sprite->oam.tileNum + 16); sprite->callback = sub_81015AC; sprite->callback(sprite); } void sub_8101940(struct Sprite* sprite) { sprite->invisible = 1; sprite->data[0] = 0; switch (gBattleAnimArgs[0]) { case 0: sprite->callback = sub_8101998; break; case 1: sprite->callback = sub_8101A74; break; case 2: sprite->callback = sub_8101AC4; break; default: sprite->callback = sub_8101B84; break; } } static void sub_8101998(struct Sprite* sprite) { sprite->data[0] = 6; sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker)) ? 2 : -2; sprite->data[2] = 0; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; StoreSpriteCallbackInData6(sprite, sub_81019E8); sprite->callback = TranslateMonSpriteLinear; } static void sub_81019E8(struct Sprite* sprite) { if (sprite->data[0] == 0) { sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; PrepareBattlerSpriteForRotScale(sprite->data[3], ST_OAM_OBJ_NORMAL); sprite->data[4] = (sprite->data[6] = GetBattlerSide(gBattleAnimAttacker)) ? 0x300 : 0xFFFFFD00; sprite->data[5] = 0; } sprite->data[5] += sprite->data[4]; SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]); SetBattlerSpriteYOffsetFromRotation(sprite->data[3]); if (++sprite->data[0] > 3) { sprite->data[0] = 0; sprite->callback = sub_8101B84; } } static void sub_8101A74(struct Sprite* sprite) { sprite->data[0] = 4; sprite->data[1] = (GetBattlerSide(gBattleAnimAttacker)) ? -3 : 3; sprite->data[2] = 0; sprite->data[3] = gBattlerSpriteIds[gBattleAnimAttacker]; StoreSpriteCallbackInData6(sprite, sub_8101B84); sprite->callback = TranslateMonSpriteLinear; } static void sub_8101AC4(struct Sprite* sprite) { if (++sprite->data[0] > 8) { sprite->data[0] = 0; sprite->callback = sub_8101AE8; } } static void sub_8101AE8(struct Sprite* sprite) { 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]; SetSpriteRotScale(sprite->data[3], 0x100, 0x100, sprite->data[5]); SetBattlerSpriteYOffsetFromRotation(sprite->data[3]); if (++sprite->data[0] > 2) { ResetSpriteRotScale(sprite->data[3]); sprite->callback = sub_8101B84; } } static void sub_8101B84(struct Sprite* sprite) { 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; PrepareBattlerSpriteForRotScale(sprite->data[2], ST_OAM_OBJ_NORMAL); sprite->data[0]++; // fall through case 1: sprite->data[5] += sprite->data[4]; SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]); SetBattlerSpriteYOffsetFromRotation(sprite->data[2]); 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]; SetSpriteRotScale(sprite->data[2], 0x100, 0x100, sprite->data[5]); SetBattlerSpriteYOffsetFromRotation(sprite->data[2]); if (++sprite->data[1] > 3) { ResetSpriteRotScale(sprite->data[2]); DestroyAnimSprite(sprite); } break; } } void sub_8101C94(u8 taskId) { 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 = sub_8101D2C; 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 = sub_8101EEC; break; } } static void sub_8101D2C(u8 taskId) { 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; PrepareBattlerSpriteForRotScale(task->data[0], ST_OAM_OBJ_NORMAL); task->data[2]++; } break; case 1: if (task->data[3]) { task->data[4] += task->data[5]; SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]); SetBattlerSpriteYOffsetFromRotation(task->data[0]); 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 sub_8101EEC(u8 taskId) { struct Task* task = &gTasks[taskId]; if (task->data[3]) { task->data[4] -= task->data[5]; SetSpriteRotScale(task->data[0], 0x100, 0x100, task->data[4]); SetBattlerSpriteYOffsetFromRotation(task->data[0]); task->data[3]--; } else { ResetSpriteRotScale(task->data[0]); DestroyAnimVisualTask(taskId); } } void sub_8101F40(struct Sprite* sprite) { 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, sub_810208C); sprite->callback = RunStoredCallbackWhenAnimEnds; } void sub_8101FA8(struct Sprite* sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + 0xFFD0; sprite->pos1.y = GetBattlerSpriteCoord(gBattleAnimTarget, 3); StoreSpriteCallbackInData6(sprite, sub_8102044); sprite->callback = RunStoredCallbackWhenAnimEnds; } void sub_8101FF0(struct Sprite* sprite) { 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 = sub_810208C; } static void sub_8102044(struct Sprite* sprite) { if (++sprite->data[0] > 8) { sprite->data[0] = 12; sprite->data[1] = 8; sprite->data[2] = 0; StoreSpriteCallbackInData6(sprite, sub_810207C); sprite->callback = TranslateSpriteLinear; } } static void sub_810207C(struct Sprite* sprite) { sprite->data[0] = 0; sprite->data[1] = 0; sprite->callback = sub_810208C; } static void sub_810208C(struct Sprite* sprite) { if (++sprite->data[0] > 1) { sprite->data[0] = 0; sprite->invisible = !sprite->invisible; if (++sprite->data[1] > 8) DestroyAnimSprite(sprite); } } void sub_81020D8(struct Sprite* sprite) { 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 = sub_810213C; } static void sub_810213C(struct Sprite* sprite) { 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 sub_810217C(struct Sprite* sprite) { 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 = sub_81021CC; } static void sub_81021CC(struct Sprite* sprite) { 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 sub_8102268(struct Sprite* sprite) { 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); } void sub_81022D4(u8 taskId) { 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]++; } } } void sub_810234C(struct Sprite* sprite) { InitSpritePosToAnimTarget(sprite, FALSE); sprite->animPaused = 1; sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = sub_810237C; } static void sub_810237C(struct Sprite* sprite) { 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); } } void sub_81023E0(u8 taskId) { 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 sub_81024E0(struct Sprite* sprite) { 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 = sub_8102528; } static void sub_8102528(struct Sprite* sprite) { if (sprite->data[0]) DestroyAnimSprite(sprite); } void sub_8102540(struct Sprite* sprite) { 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 = sub_8102584; } static void sub_8102584(struct Sprite* sprite) { 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); } void sub_81026A8(u8); void sub_81025C0(u8 taskId) { 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; StorePointerInVars(&gTasks[taskId].data[14], &gTasks[taskId].data[15], (void*)c); b = b | (0x10000 << IndexOfSpritePaletteTag(ANIM_TAG_MOON)); d = IndexOfSpritePaletteTag(ANIM_TAG_GREEN_SPARKLE); BeginNormalPaletteFade((0x10000 << d) | b, 0, 0, 16, RGB(27, 29, 31)); gTasks[taskId].func = sub_81026A8; gTasks[taskId].func(taskId); } void sub_81026A8(u8 taskId) { 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 == &gUnknown_08592EBC || gSprites[spriteId].template == &gBattleAnimSpriteTemplate_8592EEC) gSprites[spriteId].data[0] = 1; } task->data[1] = 0; task->data[0]++; } break; case 2: if (++task->data[1] > 30) { BeginNormalPaletteFade((u32)LoadPointerFromVars(task->data[14], task->data[15]), 0, 16, 0, RGB(27, 29, 31)); task->data[0]++; } break; case 3: if (!gPaletteFade.active) DestroyAnimVisualTask(taskId); break; } } void sub_8102844(struct Sprite* sprite) { 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 = 8; 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 = 24; } sprite->callback = sub_810296C; } static void sub_810296C(struct Sprite* sprite) { 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 sub_81029B4(u8 taskId) { 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; while (i < 2 && (obj = CloneBattlerSpriteWithBlend(0)) >= 0) { 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 = sub_8102B3C; task->data[3]++; i++; } task->func = sub_8102AE0; if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); } static void sub_8102AE0(u8 taskId) { struct Task* task = &gTasks[taskId]; if (!task->data[3]) { if (GetBattlerSpriteBGPriorityRank(gBattleAnimAttacker) == 1) SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG1_ON); else SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_BG2_ON); FreeSpritePaletteByTag(ANIM_TAG_BENT_SPOON); DestroyAnimVisualTask(taskId); } } static void sub_8102B3C(struct Sprite* sprite) { 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 sub_8102BCC(struct Sprite* sprite) { StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = RunStoredCallbackWhenAnimEnds; } void sub_8102BE8(u8 taskId) { u16 i; u16 j; u16 index; index = IndexOfSpritePaletteTag(gUnknown_08593020[0][0]); if (index != 0xFF) { index = (index << 4) + 0x100; for (i = 1; i < ARRAY_COUNT(gUnknown_08593020[0]); i++) gPlttBufferFaded[index + i] = gUnknown_08593020[0][i]; } for (j = 1; j < ARRAY_COUNT(gUnknown_08593020); j++) { index = AllocSpritePalette(gUnknown_08593020[j][0]); if (index != 0xFF) { index = (index << 4) + 0x100; for (i = 1; i < ARRAY_COUNT(gUnknown_08593020[0]); i++) gPlttBufferFaded[index + i] = gUnknown_08593020[j][i]; } } DestroyAnimVisualTask(taskId); } // clears the rainbow effect for musical notes. void sub_8102CA0(u8 taskId) { u16 i; for (i = 1; i < ARRAY_COUNT(gUnknown_08593020); i++) FreeSpritePaletteByTag(gUnknown_08593020[i][0]); DestroyAnimVisualTask(taskId); } void sub_8102CD4(struct Sprite* sprite) { u8 index; u8 a; u8 b; SetSpriteCoordsToAnimAttackerCoords(sprite); StartSpriteAnim(sprite, gBattleAnimArgs[0]); if ((index = IndexOfSpritePaletteTag(gUnknown_08593020[gBattleAnimArgs[1]][0])) != 0xFF) 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; sub_8102D8C(a - sprite->pos1.x, b - sprite->pos1.y, &sprite->data[6], &sprite->data[7], 40); sprite->callback = sub_8102DE4; } static void sub_8102D8C(s16 a, s16 b, s16* c, s16* d, s8 e) { 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 sub_8102DE4(struct Sprite* sprite) { int b; s16 a; int c; u8 index; sprite->data[0]++; b = sprite->data[0] * 5 - ((sprite->data[0] * 5 / 256) << 8); 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; sprite->pos2.y = Sin(b, 15); a = (u16)sprite->pos1.y; c = (u16)sprite->pos1.x; if ((u32)((c + 16) << 16) > (0x110) << 16 || a < -16 || a > 0x80) { DestroySpriteAndMatrix(sprite); } 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(gUnknown_08593020[sprite->data[1]][0]); if (index != 0xFF) sprite->oam.paletteNum = index; } } } void sub_8102EB0(struct Sprite* sprite) { int a; if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) { a = gBattleAnimArgs[1]; (u16)gBattleAnimArgs[1] = -a; } 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 = sub_8102F40; } static void sub_8102F40(struct Sprite* sprite) { 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) DestroySpriteAndMatrix(sprite); } void sub_8102FB8(struct Sprite* sprite) { s16 a; if (gBattleAnimArgs[0] == 1) { sprite->oam.matrixNum = 8; 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 sub_8103028(struct Sprite* sprite) { s16 xDiff; u8 index; SetSpriteCoordsToAnimAttackerCoords(sprite); sprite->pos1.y += 8; StartSpriteAnim(sprite, gBattleAnimArgs[1]); index = IndexOfSpritePaletteTag(gUnknown_08593020[gBattleAnimArgs[2]][0]); 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 = sub_81030B0; } static void sub_81030B0(struct Sprite* sprite) { if (AnimTranslateLinear(sprite) == 0) { 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); } } void sub_810310C(u8 battler, struct Sprite* sprite) { if (GetBattlerSide(battler) == B_SIDE_PLAYER) sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_RIGHT) + 8; else sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8; sprite->pos1.y = GetBattlerSpriteCoord(battler, 3) - (s16)GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_HEIGHT) / 4; } void sub_8103164(struct Sprite* sprite) { u8 a; u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; sub_810310C(battler, sprite); a = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? 0 : 1; sprite->data[0] = gBattleAnimArgs[1]; sprite->data[1] = a + 2; StartSpriteAnim(sprite, a); StoreSpriteCallbackInData6(sprite, sub_81031D0); sprite->callback = RunStoredCallbackWhenAnimEnds; } static void sub_81031D0(struct Sprite* sprite) { if (--sprite->data[0] == 0) { StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); StartSpriteAnim(sprite, sprite->data[1]); sprite->callback = RunStoredCallbackWhenAnimEnds; } } void sub_8103208(struct Sprite* sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; sub_810310C(battler, sprite); sprite->data[0] = 0; StoreSpriteCallbackInData6(sprite, sub_8103250); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } static void sub_8103250(struct Sprite* sprite) { if (++sprite->data[0] > 16) { StartSpriteAffineAnim(sprite, 1); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } } void sub_8103284(struct Sprite* sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; sprite->pos1.x = GetBattlerSpriteCoord(battler, 0); sprite->pos1.y = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_TOP); 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, sub_8103300); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } static void sub_8103300(struct Sprite* sprite) { if (++sprite->data[4] > 12) sprite->callback = sub_8103320; } static void sub_8103320(struct Sprite* sprite) { s16 temp; s16 temp2; sprite->data[1] += 4; if (sprite->data[1] > 254) { if (--sprite->data[0] == 0) { sprite->pos2.x = 0; sprite->callback = sub_8103250; 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]; temp = gSineTable[sprite->data[1]]; sprite->pos2.x = (temp2 = temp >> 3) + (temp2 >> 1); } void sub_8103390(struct Sprite* sprite) { u8 bank; if (gBattleAnimArgs[0] == 0) bank = gBattleAnimAttacker; else bank = gBattleAnimTarget; sub_810310C(bank, sprite); if (GetBattlerSide(bank) == B_SIDE_PLAYER) { StartSpriteAnim(sprite, 0); sprite->data[0] = 2; } else { StartSpriteAnim(sprite, 1); sprite->data[0] = 3; } sprite->callback = sub_81033F0; } static void sub_81033F0(struct Sprite* sprite) { if (++sprite->data[1] > 10) { sprite->data[1] = 0; StartSpriteAnim(sprite, sprite->data[0]); StoreSpriteCallbackInData6(sprite, sub_810342C); sprite->callback = RunStoredCallbackWhenAnimEnds; } } static void sub_810342C(struct Sprite* sprite) { if (++sprite->data[1] > 5) DestroyAnimSprite(sprite); } // Animates a white streak by giving it a random rotation. // arg 0: initial x pixel offset // arg 1: initial y pixel offset void AnimRockPolishStreak(struct Sprite *sprite) { int affineAnimNum = Random2() % ARRAY_COUNT(gRockPolishStreak_AffineAnimCmds); InitSpritePosToAnimAttacker(sprite, TRUE); StartSpriteAffineAnim(sprite, affineAnimNum); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAnimEnds; } // Places a blue sparkle that plays its default animation. // arg 0: initial x pixel offset // arg 1: initial y pixel offset void AnimRockPolishSparkle(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, TRUE); StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAnimEnds; } // Moves a projectile towards the center of the target mon. The sprite is rotated to look // like it's traveling along that path. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration void AnimPoisonJabProjectile(struct Sprite *sprite) { s16 targetXPos; s16 targetYPos; u16 rotation; InitSpritePosToAnimTarget(sprite, TRUE); targetXPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); targetYPos = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); rotation = ArcTan2Neg(targetXPos - sprite->pos1.x, targetYPos - sprite->pos1.y); TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rotation); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = targetXPos; sprite->data[4] = targetYPos; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } void AnimTask_BlendNightSlash(u8 taskId) { int paletteOffset = IndexOfSpritePaletteTag(ANIM_TAG_SLASH) * 16 + 256; BlendPalette(paletteOffset, 16, 6, RGB_RED); DestroyAnimVisualTask(taskId); } void AnimNightSlash(struct Sprite *sprite) { sprite->callback = sub_8101F40; sprite->callback(sprite); }