#include "global.h" #include "battle_anim.h" #include "item_menu_icons.h" #include "sprite.h" #include "random.h" #include "gpu_regs.h" #include "item.h" #include "rtc.h" #include "item_icon.h" #include "sound.h" #include "menu.h" #include "malloc.h" #include "util.h" #include "trig.h" #include "graphics.h" #include "battle_scripts.h" #include "battle_controllers.h" #include "constants/moves.h" #include "constants/hold_effects.h" #include "constants/items.h" #include "constants/pokemon.h" // function declarations static void SpriteCB_SpriteToCentreOfSide(struct Sprite *sprite); static void SpriteCB_SpriteOnMonForDuration(struct Sprite *sprite); static void SpriteCB_ToxicThreadWrap(struct Sprite *sprite); static void SpriteCB_GrowingSuperpower(struct Sprite *sprite); static void SpriteCB_CentredSpiderWeb(struct Sprite *sprite); static void SpriteCB_CoreEnforcerHits(struct Sprite *sprite); static void SpriteCB_CoreEnforcerBeam(struct Sprite *sprite); static void SpriteCB_TranslateAnimSpriteToTargetMonLocationDoubles(struct Sprite *sprite); static void SpriteCB_FallingObject(struct Sprite *sprite); static void SpriteCB_FallingObjectStep(struct Sprite *sprite); static void SpriteCB_SunsteelStrikeRings(struct Sprite *sprite); static void SpriteCB_MoongeistCharge(struct Sprite *sprite); static void SpriteCB_MindBlownBall(struct Sprite *sprite); static void AnimMindBlownBallStep(struct Sprite *sprite); static void SpriteCB_MindBlownExplosion(struct Sprite *sprite); static void SpriteCB_LockingJaw(struct Sprite *sprite); static void SpriteCB_LockingJawStep(struct Sprite *sprite); static void SpriteCB_LockingJawFinish(struct Sprite *sprite); static void SpriteCB_LeftRightSlice(struct Sprite *sprite); static void SpriteCB_LeftRightSliceStep1(struct Sprite *sprite); static void SpriteCB_LeftRightSliceStep0(struct Sprite *sprite); static void SpriteCB_PyroBallRockBounce(struct Sprite *sprite); static void SpriteCB_PyroBallLaunch(struct Sprite *sprite); static void SpriteCB_AcidLaunchSingleTarget(struct Sprite *sprite); static void SpriteCB_AcidDripSingleTarget(struct Sprite *sprite); static void SpriteCB_WaterDroplet(struct Sprite *sprite); static void SpriteCB_WaterDropletDrip(struct Sprite *sprite); static void SpriteCB_WaterDropletDrop(struct Sprite *sprite); static void SpriteCB_AnimSpriteOnSelectedMonPos(struct Sprite *sprite); static void SpriteCB_SurroundingRing(struct Sprite *sprite); static void SpriteCB_PhotonGeyserBeam(struct Sprite *sprite); static void SpriteCB_BeamUpStep(struct Sprite *sprite); static void SpriteCB_CentredElectricity(struct Sprite *sprite); static void AnimSkyDropBallUp(struct Sprite *sprite); static void SpriteCB_SearingShotRock(struct Sprite *sprite); static void AnimHappyHourCoinShower(struct Sprite *sprite); static void SpriteCB_Geyser(struct Sprite *sprite); static void SpriteCB_GeyserTarget(struct Sprite *sprite); static void SpriteCB_TwinkleOnBattler(struct Sprite *sprite); static void AnimBlastBurnTargetPlume_Step1(struct Sprite *sprite); static void AnimBlastBurnTargetPlume(struct Sprite *sprite); static void AnimEllipticalGustAttacker(struct Sprite *sprite); static void AnimEllipticalGustAttacker_Step(struct Sprite *sprite); static void AnimGrowingShockWaveOrbOnTarget(struct Sprite *sprite); static void AnimTask_GrowStep(u8 taskId); static void AnimExtremeEvoboostCircle(struct Sprite *sprite); static void AnimExtremeEvoboostCircle_Step(struct Sprite *sprite); static void AnimOceanicOperettaSpotlight(struct Sprite *sprite); static void AnimSoulStealingStar(struct Sprite *sprite); static void AnimSoulStealingStar_Step1(struct Sprite *sprite); static void AnimSoulStealingStar_Step2(struct Sprite *sprite); // const data // general static const union AffineAnimCmd sSquishTargetAffineAnimCmds[] = { AFFINEANIMCMD_FRAME(0, 64, 0, 16), //Flatten AFFINEANIMCMD_FRAME(0, 0, 0, 64), AFFINEANIMCMD_FRAME(0, -64, 0, 16), AFFINEANIMCMD_END, }; // GEN 4 // shadow sneak const struct SpriteTemplate gShadowSneakImpactSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_IceCrystalHit, .callback = AnimIceEffectParticle }; // power trick const struct SpriteTemplate gPowerTrickSpriteTemplate = { .tileTag = ANIM_TAG_POWER_TRICK, .paletteTag = ANIM_TAG_POWER_TRICK, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_SpinningBone, .callback = SpriteCB_SpriteOnMonForDuration }; //// GEN 5 //shell smash const struct SpriteTemplate gShellSmashLeftShellSpriteTemplate = { .tileTag = ANIM_TAG_SHELL_RIGHT, .paletteTag = ANIM_TAG_SHELL_RIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, .callback = AnimBite }; const struct SpriteTemplate gShellSmashRightShellSpriteTemplate = { .tileTag = ANIM_TAG_SHELL_LEFT, .paletteTag = ANIM_TAG_SHELL_LEFT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, .callback = AnimBite }; const struct SpriteTemplate gShellSmashPurpleRocksSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_SHELL_RIGHT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FlyingRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRockFragment }; //wide guard const struct SpriteTemplate gWideGuardBlueConversionTemplate = { .tileTag = ANIM_TAG_CONVERSION, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_8x8, .anims = gConversionAnimTable, .images = NULL, .affineAnims = gConversionAffineAnimTable, .callback = AnimConversion }; //guard split const struct SpriteTemplate gGuardSwapOrbs1Template = { .tileTag = ANIM_TAG_BLUEGREEN_ORB, .paletteTag = ANIM_TAG_BLUEGREEN_ORB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimMimicOrb }; const struct SpriteTemplate gGuardSwapOrbs2Template = { .tileTag = ANIM_TAG_BLUEGREEN_ORB, .paletteTag = ANIM_TAG_BLUEGREEN_ORB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimMissileArc }; // power split const struct SpriteTemplate gPowerSplitOrbs1Template = { .tileTag = ANIM_TAG_BLUEGREEN_ORB, .paletteTag = ANIM_TAG_RED_HEART, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimMimicOrb }; const struct SpriteTemplate gPowerSplitOrbs2Template = { .tileTag = ANIM_TAG_BLUEGREEN_ORB, .paletteTag = ANIM_TAG_RED_HEART, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimMissileArc }; // automotize const struct SpriteTemplate gAutotomizeMetalShardsTemplate = { .tileTag = ANIM_TAG_METAL_BITS, .paletteTag = ANIM_TAG_METAL_BITS, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_TearDrop, .callback = AnimTearDrop }; //rage powder const struct SpriteTemplate gRagePowderRedPowderTemplate = { .tileTag = ANIM_TAG_SPORE, .paletteTag = ANIM_TAG_HEART_STAMP, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gSporeParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSporeParticle }; //flame charge const struct SpriteTemplate gFlameChargeEmberTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FlamethrowerFlame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceBigFlower }; //final gambit const struct SpriteTemplate gFinalGambitBlueYawnTemplate = { .tileTag = ANIM_TAG_PINK_CLOUD, .paletteTag = ANIM_TAG_WATER_IMPACT, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall }; const struct SpriteTemplate gFinalGambitExplosionTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_WATER_IMPACT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; //synchronoise const struct SpriteTemplate gSynchronoiseVioletRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gHyperVoiceRingAffineAnimTable, .callback = AnimHyperVoiceRing }; const struct SpriteTemplate gSynchronoiseYellowRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gHyperVoiceRingAffineAnimTable, .callback = AnimHyperVoiceRing }; const struct SpriteTemplate gSynchronoiseBlueRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gHyperVoiceRingAffineAnimTable, .callback = AnimHyperVoiceRing }; const struct SpriteTemplate gSynchronoiseAeroWheelTemplate = { .tileTag = ANIM_TAG_AIR_WAVE_2, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gAffineAnims_AirWaveCrescent, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpread }; //electro ball const struct SpriteTemplate gElectroBallCannonBallTemplate = { .tileTag = ANIM_TAG_FLASH_CANNON_BALL, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall }; //foul play const struct SpriteTemplate gFoulPlayImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; const struct SpriteTemplate gFoulPlayRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; //simple beam const struct SpriteTemplate gSimpleBeamBrownTemplate = { .tileTag = ANIM_TAG_GOLD_RING, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; const struct SpriteTemplate gSimpleBeamPinkTemplate = { .tileTag = ANIM_TAG_GOLD_RING, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; const struct SpriteTemplate gSimpleBeamBrownRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; const struct SpriteTemplate gSimpleBeamPinkRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; // after you const struct SpriteTemplate gAfterYouGreenRageTemplate = { .tileTag = ANIM_TAG_ANGER, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAngerMarkAffineAnimTable, .callback = AnimAngerMark }; //quick guard const struct SpriteTemplate gQuickGuardArmImpactTemplate = { .tileTag = ANIM_TAG_QUICK_GUARD_HAND, .paletteTag = ANIM_TAG_QUICK_GUARD_HAND, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBasicFistOrFoot }; //sky drop static const union AffineAnimCmd sSkyDropFlyBallAffineAnimCmd_0[] = { AFFINEANIMCMD_FRAME(0xa0, 0x100, 0x50, 0x0), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sSkyDropFlyBallAffineAnimCmds[] = { sSkyDropFlyBallAffineAnimCmd_0 }; const struct SpriteTemplate gSkyDropFlyBallTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_ROUND_SHADOW, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSkyDropFlyBallAffineAnimCmds, .callback = AnimThrowMistBall }; const struct SpriteTemplate gSkyDropTargetFlyingTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_ROUND_SHADOW, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimSkyDropBallUp }; //shift gear const struct SpriteTemplate gShiftGearGearsTemplate = { .tileTag = ANIM_TAG_GEAR, .paletteTag = ANIM_TAG_GEAR, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_SpinningBone, .callback = SpriteCB_SpriteOnMonForDuration }; //circle throw const struct SpriteTemplate gCircleThrowRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; //quash const struct SpriteTemplate gQuashArmHitTemplate = { .tileTag = ANIM_TAG_ASSURANCE_HAND, .paletteTag = ANIM_TAG_ASSURANCE_HAND, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimStompFoot }; //reflect type const struct SpriteTemplate gReflectTypeBlueStringTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_ToxicThreadWrap }; const struct SpriteTemplate gReflectTypeVioletStringTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_PURPLE_FLAME, .oam = &gOamData_AffineOff_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_ToxicThreadWrap }; const struct SpriteTemplate gReflectTypeWhiteStringTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_GUARD_RING, .oam = &gOamData_AffineOff_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_ToxicThreadWrap }; const struct SpriteTemplate gReflectTypeWhiteRingTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_GUARD_RING, .oam = &gOamData_AffineDouble_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGuardRingAffineAnimTable, .callback = SpriteCB_SurroundingRing }; const struct SpriteTemplate gReflectTypePinkRingTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineDouble_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGuardRingAffineAnimTable, .callback = SpriteCB_SurroundingRing }; const struct SpriteTemplate gReflectTypeVioletRingTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_PURPLE_FLAME, .oam = &gOamData_AffineDouble_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGuardRingAffineAnimTable, .callback = SpriteCB_SurroundingRing }; const struct SpriteTemplate gReflectTypeBlueRingTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGuardRingAffineAnimTable, .callback = SpriteCB_SurroundingRing }; //frost breath const struct SpriteTemplate gFrostBreathBlueRageTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_DragonRageFirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDragonRageFirePlume }; const struct SpriteTemplate gFrostBreathBlueBreathTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gAnims_DragonRageFire, .images = NULL, .affineAnims = gAffineAnims_DragonRageFire, .callback = AnimDragonFireToTarget }; //heart stamp const struct SpriteTemplate gHeartStampSpinningHeartTemplate = { .tileTag = ANIM_TAG_HEART_STAMP, .paletteTag = ANIM_TAG_HEART_STAMP, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gAffineAnims_SpinningHandOrFoot, .callback = AnimSpinningKickOrPunch }; //horn leech const struct SpriteTemplate gHornLeechHornTemplate = { .tileTag = ANIM_TAG_HORN_LEECH, .paletteTag = ANIM_TAG_HORN_LEECH, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimShadowBall }; //dual chop const struct SpriteTemplate gDualChopImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //sacred sword const struct SpriteTemplate gSacredSwordBladesTemplate = { .tileTag = ANIM_TAG_PUNISHMENT_BLADES, .paletteTag = ANIM_TAG_HYDRO_PUMP, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gAnims_DragonBreathFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpread }; const struct SpriteTemplate gSacredSwordCutTemplate = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_HYDRO_PUMP, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gCuttingSliceAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCuttingSlice }; //razor shell const struct SpriteTemplate gRazorShellTemplate = { .tileTag = ANIM_TAG_RAZOR_SHELL, .paletteTag = ANIM_TAG_RAZOR_SHELL, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = SpriteCB_SpriteOnMonForDuration }; //heat crash const struct SpriteTemplate gHeatCrashEruptionRockTemplate = { .tileTag = ANIM_TAG_WARM_ROCK, .paletteTag = ANIM_TAG_WARM_ROCK, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimStompFoot }; //leaf tornado const struct SpriteTemplate gLeafTornadoVortexTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; //cotton guard const struct SpriteTemplate gCottonGuardSporeTemplate = { .tileTag = ANIM_TAG_SPORE, .paletteTag = ANIM_TAG_SPORE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gSporeParticleAnimTable, .images = NULL, .affineAnims = gPowerAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; //night daze const struct SpriteTemplate gNightDazeVioletRingsTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_PURPLE_FLAME, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; const struct SpriteTemplate gNightDazeVioletCirclesTemplate = { .tileTag = ANIM_TAG_RED_ORB, .paletteTag = ANIM_TAG_PURPLE_FLAME, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gHiddenPowerOrbAffineAnimTable, .callback = AnimOrbitScatter }; //tail slap const struct SpriteTemplate gTailSlapTemplate = { .tileTag = ANIM_TAG_PUNISHMENT_BLADES, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gScratchAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; //gear grind const struct SpriteTemplate gGearGrindTemplate = { .tileTag = ANIM_TAG_GEAR, .paletteTag = ANIM_TAG_GEAR, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimBite }; //searing shot const struct SpriteTemplate gSearingShotRedChargeTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gSearingShotEruptionRockTemplate = { .tileTag = ANIM_TAG_WARM_ROCK, .paletteTag = ANIM_TAG_WARM_ROCK, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOverheatFlame }; static const union AffineAnimCmd sSpriteAffineAnim_SearingShotRock[] = { AFFINEANIMCMD_FRAME(8, 8, 9, 15), AFFINEANIMCMD_FRAME(-8, -8, 9, 15), AFFINEANIMCMD_END, }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_SearingShotRock[] = { sSpriteAffineAnim_SearingShotRock, }; const struct SpriteTemplate gSearingShotEruptionImpactTemplate = { .tileTag = ANIM_TAG_WARM_ROCK, .paletteTag = ANIM_TAG_WARM_ROCK, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = sSpriteAffineAnimTable_SearingShotRock, .callback = SpriteCB_SearingShotRock }; //techno blast const struct SpriteTemplate gTechnoBlastWhiteChargeTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gTechnoBlastWhiteCircleTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gPowerAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gTechnoBlastWhiteBlastTemplate = { .tileTag = ANIM_TAG_BLACK_BALL_2, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; const struct SpriteTemplate gTechnoBlastWhiteSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark }; const struct SpriteTemplate gTechnoBlastWhiteSmokeTemplate = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gOctazookaAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gTechnoBlastYellowBlastTemplate = { .tileTag = ANIM_TAG_BLACK_BALL_2, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; const struct SpriteTemplate gTechnoBlastYellowSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark }; const struct SpriteTemplate gTechnoBlastYellowSmokeTemplate = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gOctazookaAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gTechnoBlastBlueChargeTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gTechnoBlastBlueBubbleTemplate = { .tileTag = ANIM_TAG_BUBBLE, .paletteTag = ANIM_TAG_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gAnims_WaterBubbleProjectile, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallBubblePair }; const struct SpriteTemplate gTechnoBlastBlueBlastTemplate = { .tileTag = ANIM_TAG_BLACK_BALL_2, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; const struct SpriteTemplate gTechnoBlastBlueSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark }; const struct SpriteTemplate gTechnoBlastBlueSmokeTemplate = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gOctazookaAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gTechnoBlastRedChargeTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gTechnoBlastRedBlastTemplate = { .tileTag = ANIM_TAG_BLACK_BALL_2, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; const struct SpriteTemplate gTechnoBlastRedSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark }; const struct SpriteTemplate gTechnoBlastRedSmokeTemplate = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gOctazookaAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gTechnoBlastIceChargeTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gTechnoBlastIceBlastTemplate = { .tileTag = ANIM_TAG_BLACK_BALL_2, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; const struct SpriteTemplate gTechnoBlastIceSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark }; const struct SpriteTemplate gTechnoBlastIceSmokeTemplate = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gOctazookaAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gTechnoBlastIceCrystalsTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x16, .anims = gAnims_IceCrystalLarge, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //secret sword const struct SpriteTemplate gSecretSwordBladesTemplate = { .tileTag = ANIM_TAG_PUNISHMENT_BLADES, .paletteTag = ANIM_TAG_HYDRO_PUMP, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gAnims_DragonBreathFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpread }; //glaciate const struct SpriteTemplate gGlaciateSmokeTemplate = { .tileTag = ANIM_TAG_BLACK_SMOKE, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlackSmoke }; //blue flare const struct SpriteTemplate gBlueFlareFlameJabTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_METAL_BITS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FlamethrowerFlame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gBlueFlareFlameSwirlTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_METAL_BITS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FlamethrowerFlame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gBlueFlareBurnTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_METAL_BITS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FlamethrowerFlame, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpread }; //freeze shock const struct SpriteTemplate gFreezeShockCircleTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrb }; const struct SpriteTemplate gFreezeShockIceBallTemplate = { .tileTag = ANIM_TAG_ICE_CHUNK, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gAnims_IceBallChunk, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; //ice burn const struct SpriteTemplate gIceBurnSmokeTemplate = { .tileTag = ANIM_TAG_BLACK_SMOKE, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlackSmoke }; //icicle crash static const union AffineAnimCmd sSpriteAffineAnim_IcicleCrash[] = { AFFINEANIMCMD_FRAME(0, 0, 128, 1), //180 degree turn AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_IcicleCrash[] = { sSpriteAffineAnim_IcicleCrash, }; const struct SpriteTemplate gIcicleCrashSpearTemplate = { .tileTag = ANIM_TAG_ICICLE_SPEAR, .paletteTag = ANIM_TAG_ICICLE_SPEAR, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_IcicleCrash, .callback = AnimFallingRock }; //v create const struct SpriteTemplate gVCreateFlameTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FireBlastCross, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gVCreateRedRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gVCreateRedOrbTemplate = { .tileTag = ANIM_TAG_ECLIPSING_ORB, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gEclipsingOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; //fusion flare const struct SpriteTemplate gFusionFlareRedBallUpTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWeatherBallUp }; const struct SpriteTemplate gFusionFlareRedBallTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimStompFoot }; const struct SpriteTemplate gFusionFlareRedBubblesTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_WaterPulseBubble, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWaterPulseBubble }; const struct SpriteTemplate gFusionFlareRedRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; //fusion bolt static const union AffineAnimCmd sSpriteAffineAnim_DrakeStrikePlayer[] = { AFFINEANIMCMD_FRAME(0, 0, 0xb9, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sSpriteAffineAnim_DrakeStrikeOpponent[] = { AFFINEANIMCMD_FRAME(0, 0, 0x50, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd* const sAffineAnimCmdTable_DrakeStriking[] = //devestating drake, fusion bolt { sSpriteAffineAnim_DrakeStrikePlayer, sSpriteAffineAnim_DrakeStrikeOpponent, }; const struct SpriteTemplate gFusionBoltBallTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnimCmdTable_DrakeStriking, .callback = AnimFlyBallAttack }; // GEN 6 //mat block const struct SpriteTemplate gMatBlockGreenConversionTemplate = { .tileTag = ANIM_TAG_CONVERSION, .paletteTag = ANIM_TAG_GREEN_LIGHT_WALL, .oam = &gOamData_AffineDouble_ObjBlend_8x8, .anims = gConversionAnimTable, .images = NULL, .affineAnims = gConversionAffineAnimTable, .callback = AnimConversion }; //belch static const union AnimCmd sAnimCmdBerryEaten[] = { ANIMCMD_FRAME(16, 3), ANIMCMD_END, }; static const union AnimCmd *const sAnimCmdFramesBerryEaten[] = { sAnimCmdBerryEaten, }; const struct SpriteTemplate gBelchBerryTemplate = { .tileTag = ANIM_TAG_BERRY_NORMAL, .paletteTag = ANIM_TAG_BERRY_NORMAL, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnimCmdFramesBerryEaten, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMissileArc }; //forest's curse const struct SpriteTemplate gForestsCurseIngrainTemplate = { .tileTag = ANIM_TAG_ROOTS, .paletteTag = ANIM_TAG_ROOTS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gIngrainRootAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWaterPulseBubble }; //petal blizzard static const union AnimCmd sAnimCmd_PetalBlizzard1_0[] = { ANIMCMD_FRAME(0, 10), ANIMCMD_JUMP(0), }; static const union AnimCmd *const sAnimCmdTable_PetalBlizzard1[] = { sAnimCmd_PetalBlizzard1_0, }; const struct SpriteTemplate gPetalBlizzardTwister1Template = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = sAnimCmdTable_PetalBlizzard1, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveTwisterParticle }; static const u16 sPetalBlizzardFlowerOam[] = {0x0, 0x2000,0x0800,0x0}; //todo: convert to oam data static const union AnimCmd sAnimCmd_PetalBlizzard2_0[] = { ANIMCMD_FRAME(0, 4), ANIMCMD_FRAME(4, 0), ANIMCMD_END, }; static const union AnimCmd *const sAnimCmdTable_PetalBlizzard2[] = { sAnimCmd_PetalBlizzard2_0, }; const struct SpriteTemplate gPetalBlizzardTwister2Template = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = (const struct OamData *) &sPetalBlizzardFlowerOam, .anims = sAnimCmdTable_PetalBlizzard2, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveTwisterParticle }; //crafty shield const struct SpriteTemplate gCraftyShieldPinkConversionTemplate = { .tileTag = ANIM_TAG_CRAFTY_SHIELD, .paletteTag = ANIM_TAG_CRAFTY_SHIELD, .oam = &gOamData_AffineDouble_ObjBlend_8x8, .anims = gConversionAnimTable, .images = NULL, .affineAnims = gConversionAffineAnimTable, .callback = AnimConversion }; //grassy terrain const struct SpriteTemplate gGrassyTerrainOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gPowerAbsorptionOrbAffineAnimTable, .callback = AnimOrbitFast }; const struct SpriteTemplate gGrassyTerrainStarTemplate = { .tileTag = ANIM_TAG_GREEN_SPARKLE, .paletteTag = ANIM_TAG_GREEN_SPARKLE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gMoonlightSparkleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOrbitScatter }; //misty terrain const struct SpriteTemplate gMistyTerrainOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_WATER_GUN, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gPowerAbsorptionOrbAffineAnimTable, .callback = AnimOrbitFast }; const struct SpriteTemplate gMistyTerrainStarTemplate = { .tileTag = ANIM_TAG_GREEN_SPARKLE, .paletteTag = ANIM_TAG_WATER_GUN, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gMoonlightSparkleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOrbitScatter }; //electrify const struct SpriteTemplate gElectrifyRingTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineDouble_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGuardRingAffineAnimTable, .callback = SpriteCB_SurroundingRing }; const struct SpriteTemplate gElectrifyYellowRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; //fairy wind const struct SpriteTemplate gFairyWindCloudTemplate = { .tileTag = ANIM_TAG_PINK_CLOUD, .paletteTag = ANIM_TAG_PINK_CLOUD, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gSwiftStarAffineAnimTable, .callback = AnimTranslateLinearSingleSineWave }; //confide const struct SpriteTemplate gConfideBubbleTemplate = { .tileTag = ANIM_TAG_CONFIDE, .paletteTag = ANIM_TAG_CONFIDE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gMetronomeThroughtBubbleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThoughtBubble }; //diamond storm const struct SpriteTemplate gDiamondStormSwirlingIceTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_Snowball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSwirlingSnowball_Step1 }; const struct SpriteTemplate gDiamondStormBlizzardTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gAnims_BlizzardIceCrystal, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveParticleBeyondTarget }; const struct SpriteTemplate gDiamondStormDiamondsTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x16, .anims = gAnims_IceCrystalLarge, .images = NULL, .affineAnims = gAffineAnims_BasicRock, .callback = AnimMoveTwisterParticle }; //steam eruption const struct SpriteTemplate gSteamEruptionBreathTemplate = { .tileTag = ANIM_TAG_STEAM_ERUPTION, .paletteTag = ANIM_TAG_STEAM_ERUPTION, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gAnims_DragonBreathFire, .images = NULL, .affineAnims = gAffineAnims_DragonBreathFire, .callback = AnimDragonFireToTarget }; //hyperspace hole const struct SpriteTemplate gHyperspaceHoleImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_IceCrystalHit, .callback = AnimIceEffectParticle }; //water shuriken const struct SpriteTemplate gWaterShurikenStarTemplate = { .tileTag = ANIM_TAG_YELLOW_STAR, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall }; const struct SpriteTemplate gWaterShurikenRingTemplate = { .tileTag = ANIM_TAG_BLUE_RING_2, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gWaterPulseRingAffineAnimTable, .callback = AnimWaterPulseRing }; const struct SpriteTemplate gWaterShurikenImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //eerie impulse const struct SpriteTemplate gEerieImpulseRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gHyperVoiceRingAffineAnimTable, .callback = AnimHyperVoiceRing }; const struct SpriteTemplate gEerieImpulseImpactTemplate = { .tileTag = ANIM_TAG_GOLD_RING, .paletteTag = ANIM_TAG_SPARK_H, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGrantingStars }; //venom drench const struct SpriteTemplate gVenomDrenchAcidTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gAnims_PoisonProjectile, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFallingRock }; //powder const struct SpriteTemplate gPowderBlackSporeTemplate = { .tileTag = ANIM_TAG_SPORE, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gSporeParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSporeParticle }; //geomancy const struct SpriteTemplate gGeomancyRingTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_GUARD_RING, .oam = &gOamData_AffineDouble_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGuardRingAffineAnimTable, .callback = SpriteCB_SurroundingRing }; const struct SpriteTemplate gGeomancyYellowRageTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_PAW_PRINT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_DragonRageFirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDragonRageFirePlume }; const struct SpriteTemplate gGeomancyRedCellVortexTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gGeomancyGreenCellVortexTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_WHIP_HIT, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gGeomancyBlueCellVortexTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_SWEAT_BEAD, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gGeomancyRedCellRaiseTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRaiseSprite }; const struct SpriteTemplate gGeomancyGreenCellRaiseTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_WHIP_HIT, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRaiseSprite }; const struct SpriteTemplate gGeomancyBlueCellRaiseTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_SWEAT_BEAD, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRaiseSprite }; //magnetic flux const struct SpriteTemplate gMagneticFluxUproarTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; //happy hour const struct SpriteTemplate gHappyHourCoinShowerTemplate = { .tileTag = ANIM_TAG_COIN, .paletteTag = ANIM_TAG_COIN, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gCoinAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHappyHourCoinShower }; //electric terrain const struct SpriteTemplate gElectricTerrainOrbsTemplate = { .tileTag = ANIM_TAG_ELECTRIC_ORBS, .paletteTag = ANIM_TAG_ELECTRIC_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_ElectricChargingParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOrbitFast }; const struct SpriteTemplate gElectricTerrainFlyingBallTemplate = { .tileTag = ANIM_TAG_ELECTRIC_ORBS, .paletteTag = ANIM_TAG_ELECTRIC_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_ElectricChargingParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOrbitScatter }; //celebrate const struct SpriteTemplate gCelebrateBagTemplate = { .tileTag = ANIM_TAG_ITEM_BAG, .paletteTag = ANIM_TAG_ITEM_BAG, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gMetronomeFingerAffineAnimTable, .callback = AnimFollowMeFinger }; //hold hands const struct SpriteTemplate gHoldHandsHeartTemplate = { .tileTag = ANIM_TAG_MAGENTA_HEART, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceBigFlower }; //hold back const struct SpriteTemplate gHoldBackSwipeTemplate = { .tileTag = ANIM_TAG_PURPLE_SWIPE, .paletteTag = ANIM_TAG_PAW_PRINT, .oam = &gOamData_AffineOff_ObjNormal_64x64, .anims = gAnims_RevengeBigScratch, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimRevengeScratch }; const struct SpriteTemplate gHoldBackRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_PAW_PRINT, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gHoldBackStarsTemplate = { .tileTag = ANIM_TAG_PAIN_SPLIT, .paletteTag = ANIM_TAG_DUCK, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDizzyPunchDuck }; //infestation const struct SpriteTemplate gInfestationBubbleTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_WaterPulseBubble, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; //oblivion wing static const union AffineAnimCmd sSpriteAffineAnim_GrowingRing[] = { AFFINEANIMCMD_FRAME(8, 8, 0, 16), //Double in size AFFINEANIMCMD_END, }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_GrowingRing[] = { sSpriteAffineAnim_GrowingRing, }; const struct SpriteTemplate gOblivionWingBeamTemplate = { .tileTag = ANIM_TAG_HYDRO_PUMP, .paletteTag = ANIM_TAG_HYDRO_PUMP, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_GrowingRing, .callback = TranslateAnimSpriteToTargetMonLocation }; //thousand arrows const struct SpriteTemplate gThousandArrowsGreenChargeTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gThousandArrowsGreenHexTemplate = { .tileTag = ANIM_TAG_VERTICAL_HEX, .paletteTag = ANIM_TAG_ZYGARDE_HEXES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Geyser }; const struct SpriteTemplate gThousandArrowsGreenArrowTemplate = { .tileTag = ANIM_TAG_NEEDLE, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMudSportDirt }; const struct SpriteTemplate gThousandArrowsGreenDischargeTemplate = { .tileTag = ANIM_TAG_ELECTRICITY, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_ElectricPuff, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimElectricPuff }; //thousand waves const struct SpriteTemplate gThousandWavesGreenWaveTemplate = { .tileTag = ANIM_TAG_FLYING_DIRT, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFlyingSandCrescent }; const struct SpriteTemplate gThousandWavesGreenRecoverTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_ZYGARDE_HEXES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gPowerAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gThousandWavesGreenWheelTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_ZYGARDE_HEXES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDragonDanceOrb }; const struct SpriteTemplate gThousandWavesRotatingImpactTemplate = { .tileTag = ANIM_TAG_ZYGARDE_HEXES, .paletteTag = ANIM_TAG_ZYGARDE_HEXES, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gAffineAnims_Whirlpool, .callback = AnimParticleInVortex }; const struct SpriteTemplate gThousandWavesPoundImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatOnMonEdge }; //lands wrath const struct SpriteTemplate gLandsWrathVortexTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, .affineAnims = gAffineAnims_Whirlpool, .callback = AnimParticleInVortex }; //light of ruin const struct SpriteTemplate gLightOfRuinPinkOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate gLightOfRuinPinkDischargeTemplate = { .tileTag = ANIM_TAG_ELECTRICITY, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_ElectricPuff, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimElectricPuff }; const struct SpriteTemplate gLightOfRuinPinkExplosionTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; //origin pulse const struct SpriteTemplate gOriginPulseRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; const struct SpriteTemplate gOriginPulseOrbTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDragonDanceOrb }; const struct SpriteTemplate gOriginPulseOrbInwardTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gOriginPulseBlueImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatRandom }; const struct SpriteTemplate gOriginPulseBasicSplatTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //precipice blades static const union AnimCmd sAnimCmdLargeSpike[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(64, 3), ANIMCMD_FRAME(96, 3), ANIMCMD_END, }; static const union AnimCmd *const sAnimCmdTable_LargeSpike[] = { sAnimCmdLargeSpike, }; const struct SpriteTemplate gPrecipiceBladesSpikeTemplate = { .tileTag = ANIM_TAG_LARGE_SPIKE, .paletteTag = ANIM_TAG_LARGE_SPIKE, .oam = &gOamData_AffineOff_ObjNormal_32x64, .anims = sAnimCmdTable_LargeSpike, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SpriteOnMonForDuration }; static const union AffineAnimCmd sSpriteAffineAnim_LargeHailRock[] = { AFFINEANIMCMD_FRAME(256, 256, 0, 1), //Double sprite size AFFINEANIMCMD_END, }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_LargeHailRock[] = { sSpriteAffineAnim_LargeHailRock, }; const struct SpriteTemplate gPrecipiceBladesLargeSpikeTemplate = { .tileTag = ANIM_TAG_LARGE_SPIKE, .paletteTag = ANIM_TAG_LARGE_SPIKE, .oam = &gOamData_AffineDouble_ObjNormal_32x64, .anims = sAnimCmdTable_LargeSpike, .images = NULL, .affineAnims = sSpriteAffineAnimTable_LargeHailRock, .callback = SpriteCB_SpriteOnMonForDuration }; const struct SpriteTemplate gPrecipiceBladesPlumeTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_FIRE_PLUME, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_DragonRageFirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_AnimSpriteOnSelectedMonPos }; //dragon ascent static const union AffineAnimCmd sAffineAnimCmd_Drake[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), //drake faces up AFFINEANIMCMD_END, }; static const union AffineAnimCmd* const sAffineAnimCmdTable_DrakeFaceNorth[] = { sAffineAnimCmd_Drake, sAffineAnimCmd_Drake, }; const struct SpriteTemplate gDragonAscentFlyUpTemplate = { .tileTag = ANIM_TAG_DRAGON_ASCENT, .paletteTag = ANIM_TAG_DRAGON_ASCENT, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnimCmdTable_DrakeFaceNorth, .callback = AnimParticleInVortex }; const struct SpriteTemplate gDragonAscentDrakeTemplate = { .tileTag = ANIM_TAG_DRAGON_ASCENT, .paletteTag = ANIM_TAG_DRAGON_ASCENT, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sAffineAnimCmdTable_DrakeStriking, .callback = AnimFlyBallAttack }; //hyperspace fury const struct SpriteTemplate gHyperspaceFuryRingTemplate = { .tileTag = ANIM_TAG_HOOPA_RING, .paletteTag = ANIM_TAG_HOOPA_RING, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimFireSpiralOutward }; const struct SpriteTemplate gHyperspaceFuryHandTemplate = { .tileTag = ANIM_TAG_HOOPA_HAND, .paletteTag = ANIM_TAG_HOOPA_HAND, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gHyperspaceFuryImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatRandom }; // GEN 7 //first impression const struct SpriteTemplate gFirstImpressionPoundTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //baneful bunker const struct SpriteTemplate gBanefulBunkerPoisonBubbleTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gAnims_PoisonProjectile, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallBubblePair }; //spirit shackle const struct SpriteTemplate gSpiritShackleArrowTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSonicBoomProjectile }; const struct SpriteTemplate gSpiritShackleChainTemplate = { .tileTag = ANIM_TAG_CHAIN_LINK, .paletteTag = ANIM_TAG_CHAIN_LINK, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThunderWave }; //darkest lariat const struct SpriteTemplate gDarkestLariatImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //sparklig aria const struct SpriteTemplate gSparklingAriaBlueChargeTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gSparklingAriaRainTemplate = { .tileTag = ANIM_TAG_HYDRO_PUMP, .paletteTag = ANIM_TAG_HYDRO_PUMP, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gAnims_WaterBubbleProjectile, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMudSportDirt }; const struct SpriteTemplate gSparklingAriaBubbleRainTemplate = { .tileTag = ANIM_TAG_BUBBLE, .paletteTag = ANIM_TAG_BUBBLE, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gAnims_WaterBubbleProjectile, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMudSportDirt }; const struct SpriteTemplate gSparklingAriaBubblesTemplate = { .tileTag = ANIM_TAG_BUBBLE, .paletteTag = ANIM_TAG_BUBBLE, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gAnims_WaterBubbleProjectile, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallBubblePair }; //ice hammer const struct SpriteTemplate gIceHammerPunchStompTemplate = { .tileTag = ANIM_TAG_HORSESHOE_SIDE_FIST, .paletteTag = ANIM_TAG_HORSESHOE_SIDE_FIST, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimStompFoot }; const struct SpriteTemplate gIceHammerSmokesTemplate = { .tileTag = ANIM_TAG_BLACK_SMOKE, .paletteTag = ANIM_TAG_ECLIPSING_ORB, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlackSmoke }; //floral healing const struct SpriteTemplate gFloralHealingFlowerTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gPetalDanceBigFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSporeParticle }; const struct SpriteTemplate gFloralHealingOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gAffineAnims_Whirlpool, .callback = AnimParticleInVortex }; const struct SpriteTemplate gFloralHealingLeavesTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gAffineAnims_Whirlpool, .callback = AnimParticleInVortex }; const struct SpriteTemplate gFloralHealingWindLeavesTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSweetScentPetal }; //high horsepower const struct SpriteTemplate gHighHorsepowerHorseshoeTemplate = { .tileTag = ANIM_TAG_HORSESHOE_SIDE_FIST, .paletteTag = ANIM_TAG_HORSESHOE_SIDE_FIST, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gAffineAnims_MegaPunchKick, .callback = AnimSpinningKickOrPunch }; //strength sap const struct SpriteTemplate gStrengthSapRedSmokeTemplate = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_RED_HEART, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gOctazookaAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gStrengthSapRedInwardTemplate = { .tileTag = ANIM_TAG_TEAL_ALERT, .paletteTag = ANIM_TAG_RED_HEART, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimTealAlert }; const struct SpriteTemplate gStrengthSapAbsorbTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gAbsorptionOrbAffineAnimTable, .callback = AnimAbsorptionOrb }; //solar blade const struct SpriteTemplate gSolarBladeImpactTemplate = { .tileTag = ANIM_TAG_CLAW_SLASH, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_ClawSlash, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimClawSlash }; //leafage const struct SpriteTemplate gLeafageImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //toxic thread const struct SpriteTemplate gToxicThreadString = { .tileTag = ANIM_TAG_STRING, .paletteTag = ANIM_TAG_STRING, .oam = &gOamData_AffineOff_ObjNormal_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_ToxicThreadWrap }; //laser focus const struct SpriteTemplate gLaserFocusRedEyesTemplate = { .tileTag = ANIM_TAG_OPENING_EYE, .paletteTag = ANIM_TAG_EYE_SPARKLE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gOpeningEyeAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; //gear up const struct SpriteTemplate gGearUpGearsTemplate = { .tileTag = ANIM_TAG_GEAR, .paletteTag = ANIM_TAG_GEAR, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceBigFlower }; //throat chop const struct SpriteTemplate gThroatChopRedImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //pollen puff const struct SpriteTemplate gPollenPuffPinkStarTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gGrantingStarsAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallBubblePair }; const struct SpriteTemplate gPollenPuffPinkSparkleTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gGrantingStarsAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark }; const struct SpriteTemplate gPollenPuffYellowSparkleTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gGrantingStarsAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark }; const struct SpriteTemplate gPollenPuffSporeTemplate = { .tileTag = ANIM_TAG_SPORE, .paletteTag = ANIM_TAG_SPORE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gSporeParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThrowProjectile }; const struct SpriteTemplate gPollenPuffImpactTemplates = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_FLAT_ROCK, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPollenPuffHealTemplate = { .tileTag = ANIM_TAG_BLUE_STAR, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gHealingBlueStarAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; //anchor shot const struct SpriteTemplate gAnchorShotAnchorTemplate = { .tileTag = ANIM_TAG_ANCHOR, .paletteTag = ANIM_TAG_CHAIN_LINK, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlockX }; const struct SpriteTemplate gAnchorShotAngledAnchorTemplate = { .tileTag = ANIM_TAG_ANCHOR, .paletteTag = ANIM_TAG_CHAIN_LINK, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall }; //psychic terrain const struct SpriteTemplate gPsychicTerrainOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gPowerAbsorptionOrbAffineAnimTable, .callback = AnimOrbitFast }; const struct SpriteTemplate gPsychicTerrainStarTemplate = { .tileTag = ANIM_TAG_GREEN_SPARKLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gMoonlightSparkleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimOrbitScatter }; //lunge const struct SpriteTemplate gLungeGreenChargeTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_PsychoBoostOrb, .callback = AnimPsychoBoost }; const struct SpriteTemplate gLungeGreenBubbleTemplate = { .tileTag = ANIM_TAG_SMALL_BUBBLES, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThrowProjectile }; const struct SpriteTemplate gLungeGreenImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //power trip const struct SpriteTemplate gPowerTripFocusEnergyTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gPowerTripImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_PURPLE_FLAME, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //burn up const struct SpriteTemplate gBurnUpRedYawnTemplate = { .tileTag = ANIM_TAG_PINK_CLOUD, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThrowMistBall }; //speed swap const struct SpriteTemplate gSpeedSwapRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gSpeedSwapCircleTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gMimicOrbAffineAnimTable, .callback = AnimMimicOrb }; const struct SpriteTemplate gSpeedSwapOrbMissileTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gMimicOrbAffineAnimTable, .callback = AnimMissileArc }; const struct SpriteTemplate gSpeedSwapOrbTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; //smart strike const struct SpriteTemplate gSmartStrikeGemTemplate = { .tileTag = ANIM_TAG_POWER_GEM, .paletteTag = ANIM_TAG_POWER_GEM, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gSmartStrikeImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_FLASH_CANNON_BALL, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //purify const struct SpriteTemplate gPurifyWhiteBallTemplate = { .tileTag = ANIM_TAG_FLASH_CANNON_BALL, .paletteTag = ANIM_TAG_FLASH_CANNON_BALL, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMissileArc }; const struct SpriteTemplate gPurifySmokeTemplate = { .tileTag = ANIM_TAG_BLACK_SMOKE, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjNormal_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlackSmoke }; //revelation dance const struct SpriteTemplate gRevelationDanceYellowOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceBigFlower }; const struct SpriteTemplate gRevelationDanceYellowFlowerTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gPetalDanceSmallFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimPetalDanceSmallFlower }; const struct SpriteTemplate gRevelationDanceYellowAirWaveTemplate = { .tileTag = ANIM_TAG_AIR_WAVE, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineDouble_ObjBlend_32x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSonicBoomProjectile }; const struct SpriteTemplate gRevelationDanceYellowImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; const struct SpriteTemplate gRevelationDanceYellowRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; const struct SpriteTemplate gRevelationDanceYellowDispersalTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpread }; //core enforcer const struct SpriteTemplate gCoreEnforcerBlueRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gCoreEnforcerYellowRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gCoreEnforcerGreenRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gCoreEnforcerCircleChargeTemplate = { .tileTag = ANIM_TAG_SHOCK_3, .paletteTag = ANIM_TAG_SHOCK_3, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gAnims_ThunderboltOrb, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimFlashingHitSplat }; const struct SpriteTemplate gCoreEnforcerBlueSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSparkElectricity }; const struct SpriteTemplate gCoreEnforcerGreenChargeTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSparkElectricity }; const struct SpriteTemplate gCoreEnforcerSnoreTemplate = { .tileTag = ANIM_TAG_SNORE_Z, .paletteTag = ANIM_TAG_SNORE_Z, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_CentredSpiderWeb }; const struct SpriteTemplate gCoreEnforcerImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = SpriteCB_CoreEnforcerHits }; const struct SpriteTemplate gCoreEnforcerBeamTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_CoreEnforcerBeam }; const struct SpriteTemplate gCoreEnforcerExplosionTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_EXPLOSION, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SpriteToCentreOfSide }; //trop kick const struct SpriteTemplate gTropKickGreenFootTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimJumpKick }; const struct SpriteTemplate gTropKickFlowerTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gPetalDanceBigFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpread }; const struct SpriteTemplate gTropKickLeavesTemplate = { .tileTag = ANIM_TAG_LEAF, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpread }; //clanging scales const struct SpriteTemplate gClangingScalesPurpleMetalSoundTemplate = { .tileTag = ANIM_TAG_METAL_SOUND_WAVES, .paletteTag = ANIM_TAG_METAL_SOUND_WAVES, .oam = &gOamData_AffineDouble_ObjNormal_32x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGrowingRingAffineAnimTable, .callback = SpriteCB_TranslateAnimSpriteToTargetMonLocationDoubles }; //brutal swing const struct SpriteTemplate gBrutalSwingRandomImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatRandom }; const struct SpriteTemplate gBrutalSwingBasicImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; //aurora veil const struct SpriteTemplate gAuroraVeilRingTemplate = { .tileTag = ANIM_TAG_GUARD_RING, .paletteTag = ANIM_TAG_GUARD_RING, .oam = &gOamData_AffineDouble_ObjBlend_64x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGuardRingAffineAnimTable, .callback = SpriteCB_SurroundingRing }; //shell trap const struct SpriteTemplate gShellTrapYellowImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; const struct SpriteTemplate gShellTrapRedImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; const struct SpriteTemplate gShellTrapFireHitsTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_Snowball, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMoveParticleBeyondTarget }; //fleur cannon const struct SpriteTemplate gFleurCannonOrbTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate gFleurCannonDischargeTemplate = { .tileTag = ANIM_TAG_ELECTRICITY, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_ElectricPuff, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimElectricPuff }; //stomping tantrum const struct SpriteTemplate gStompingTantrumRockTemplate = { .tileTag = ANIM_TAG_SMALL_ROCK, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_TearDrop, .callback = AnimTearDrop }; //prismatic laser const struct SpriteTemplate gPrismaticLaserChargeTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gPrismaticLaserYellowOutwardTemplate = { .tileTag = ANIM_TAG_GREEN_SPIKE, .paletteTag = ANIM_TAG_SPARK_H, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPrismaticLaserGreenOutwardTemplate = { .tileTag = ANIM_TAG_GREEN_SPIKE, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPrismaticLaserRedOutwardTemplate = { .tileTag = ANIM_TAG_GREEN_SPIKE, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPrismaticLaserVioletOutwardTemplate = { .tileTag = ANIM_TAG_GREEN_SPIKE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPrismaticLaserYellowInwardTemplate = { .tileTag = ANIM_TAG_TEAL_ALERT, .paletteTag = ANIM_TAG_SPARK_H, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPrismaticLaserGreenInwardTemplate = { .tileTag = ANIM_TAG_TEAL_ALERT, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPrismaticLaserRedInwardTemplate = { .tileTag = ANIM_TAG_TEAL_ALERT, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPrismaticLaserVioletInwardTemplate = { .tileTag = ANIM_TAG_TEAL_ALERT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gPrismaticLaserYellowRainTemplate = { .tileTag = ANIM_TAG_NEEDLE, .paletteTag = ANIM_TAG_SPARK_H, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_FallingObject }; const struct SpriteTemplate gPrismaticLaserGreenRainTemplate = { .tileTag = ANIM_TAG_NEEDLE, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_FallingObject }; const struct SpriteTemplate gPrismaticLaserRedRainTemplate = { .tileTag = ANIM_TAG_NEEDLE, .paletteTag = ANIM_TAG_JAGGED_MUSIC_NOTE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_FallingObject }; const struct SpriteTemplate gPrismaticLaserVioletRainTemplate = { .tileTag = ANIM_TAG_NEEDLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_FallingObject }; //spectral thief const struct SpriteTemplate gSpectralThiefBlackSmokeTemplate = { .tileTag = ANIM_TAG_GRAY_SMOKE, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gOctazookaAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gSpectralThiefThiefImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_IceCrystalHit, .callback = AnimIceEffectParticle }; const struct SpriteTemplate gSpectralThiefBlackOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gMimicOrbAffineAnimTable, .callback = AnimMimicOrb }; const struct SpriteTemplate gSpectralThiefBlackBuffTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; //sunsteeel strike const struct SpriteTemplate gSunsteelStrikeBlackFlyBallTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; static const struct OamData sSunsteelStrikeBlastOAM = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .priority = 1, //Above sprites }; static const union AffineAnimCmd sSpriteAffineAnim_SunsteelStrikeBlastEnemySide[] = { AFFINEANIMCMD_FRAME(0, 0, -64, 1), //90 degree turn AFFINEANIMCMD_FRAME(0, 0, 0, 7), //Pause AFFINEANIMCMD_FRAME(16, 16, 0, 15), //Double in size AFFINEANIMCMD_END }; static const union AffineAnimCmd sSpriteAffineAnim_SunsteelStrikeBlastPlayerSide[] = { AFFINEANIMCMD_FRAME(0, 0, 128, 1), //180 degree turn AFFINEANIMCMD_FRAME(0, 0, 0, 7), //Pause AFFINEANIMCMD_FRAME(16, 16, 0, 15), //Double in size AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_SunsteelStrikeBlast[] = { sSpriteAffineAnim_SunsteelStrikeBlastEnemySide, sSpriteAffineAnim_SunsteelStrikeBlastPlayerSide, }; const struct SpriteTemplate gSunsteelStrikeSuperpowerTemplate = { .tileTag = ANIM_TAG_METEOR, .paletteTag = ANIM_TAG_METEOR, .oam = &sSunsteelStrikeBlastOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_SunsteelStrikeBlast, .callback = AnimFlyBallAttack }; const struct SpriteTemplate gSunsteelStrikeRedBeamTemplate = { .tileTag = ANIM_TAG_GOLD_RING, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallAttack, .callback = SpriteCB_SunsteelStrikeRings }; const struct SpriteTemplate gSunsteelStrikeYellowBeamTemplate = { .tileTag = ANIM_TAG_GOLD_RING, .paletteTag = ANIM_TAG_GOLD_RING, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallAttack, .callback = SpriteCB_SunsteelStrikeRings }; const struct SpriteTemplate gSunsteelStrikeRedImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; const struct SpriteTemplate gSunsteelStrikeRocksTemplate = { .tileTag = ANIM_TAG_SMALL_ROCK, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_TearDrop, .callback = AnimTearDrop }; //moongeist beam const struct SpriteTemplate gMoongeistBeamBlueOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_WATER_GUN, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate gMoongeistBeamPurpleOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ASSURANCE_HAND, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate gMoongeistBeamChargeTemplate = { .tileTag = ANIM_TAG_ELECTRIC_ORBS, .paletteTag = ANIM_TAG_ELECTRIC_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_ElectricChargingParticles, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MoongeistCharge }; //zing zap const struct SpriteTemplate gZingZapYellowBallTemplate = { .tileTag = ANIM_TAG_YELLOW_BALL, .paletteTag = ANIM_TAG_SPARK_H, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimShadowBall }; const struct SpriteTemplate gZingZapRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; //nature's madness const struct SpriteTemplate gNaturesMadnessPinkStarsTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gGrantingStarsAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallBubblePair }; const struct SpriteTemplate gNaturesMadnessCrystalsTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gAnims_SmallBubblePair, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSmallBubblePair }; const struct SpriteTemplate gNaturesMadnessPinkRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; const struct SpriteTemplate gNaturesMadnessGrayRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_ECLIPSING_ORB, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; //mind blown const struct SpriteTemplate gMindBlownHeadTemplate = { .tileTag = ANIM_TAG_BLACEPHALON_HEAD, .paletteTag = ANIM_TAG_BLACEPHALON_HEAD, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = SpriteCB_MindBlownBall }; const struct SpriteTemplate gMindBlownBlueOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MindBlownExplosion }; const struct SpriteTemplate gMindBlownPinkOrbsTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_PINK_HEART, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gPowerAbsorptionOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_MindBlownExplosion }; const struct SpriteTemplate gMindBlownBlueImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_SMALL_BUBBLES, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = SpriteCB_RandomCentredHits }; const struct SpriteTemplate gMindBlownPinkImpactTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_PINK_HEART, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = SpriteCB_RandomCentredHits }; //plasma fists const struct SpriteTemplate gPlasmaFistsChargeTemplate = { .tileTag = ANIM_TAG_SHOCK_3, .paletteTag = ANIM_TAG_SHOCK_3, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gAnims_ThunderboltOrb, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; //photon geyser static const union AnimCmd sAnimCmdPhotonGeyserBeam1[] = { ANIMCMD_FRAME(0, 1), ANIMCMD_END }; static const union AnimCmd sAnimCmdSmiteBeam[] = { ANIMCMD_FRAME(4, 1), ANIMCMD_END }; static const union AnimCmd sAnimCmdPhotonGeyserBeam2[] = { ANIMCMD_FRAME(8, 1), ANIMCMD_END }; static const union AnimCmd *const sAnimCmdTable_PhotonGeyserBeam[] = { sAnimCmdPhotonGeyserBeam1, sAnimCmdSmiteBeam, sAnimCmdPhotonGeyserBeam2, }; static const union AffineAnimCmd sSpriteAffineAnim_DoNothing[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), //Do nothing AFFINEANIMCMD_END }; static const union AffineAnimCmd sSpriteAffineAnim_PhotonGeyserBeam[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 16), //Delay AFFINEANIMCMD_FRAME(64, 64, 0, 4), //Double in size //Pulsate AFFINEANIMCMD_FRAME(-128, -128, 0, 1), AFFINEANIMCMD_FRAME(128, 128, 0, 1), AFFINEANIMCMD_JUMP(2), }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_PhotonGeyserBeam[] = { sSpriteAffineAnim_DoNothing, sSpriteAffineAnim_PhotonGeyserBeam, }; const struct SpriteTemplate gPhotonGeyserBeam = { .tileTag = ANIM_TAG_STRAIGHT_BEAM, .paletteTag = ANIM_TAG_STRAIGHT_BEAM, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = sAnimCmdTable_PhotonGeyserBeam, .images = NULL, .affineAnims = sSpriteAffineAnimTable_PhotonGeyserBeam, .callback = SpriteCB_PhotonGeyserBeam }; const struct SpriteTemplate gPhotonGeyserChargeTemplate = { .tileTag = ANIM_TAG_SHOCK_3, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gAnims_ThunderboltOrb, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gPhotonGeyserSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSparkElectricity }; const struct SpriteTemplate gPhotonGeyserZapCannonSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SMALL_RED_EYE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimZapCannonSpark }; const struct SpriteTemplate gPhotonGeyserWhiteRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; const struct SpriteTemplate gPhotonGeyserYellowRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimUproarRing }; const struct SpriteTemplate gPhotonGeyserZapBallTemplate = { .tileTag = ANIM_TAG_YELLOW_BALL, .paletteTag = ANIM_TAG_YELLOW_BALL, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; // GEN 8 //snipe shot static const union AffineAnimCmd sSpriteAffineAnim_LargeSpikePointedLeft[] = { AFFINEANIMCMD_FRAME(0, 0, 32, 1), //45 degree turn AFFINEANIMCMD_END }; static const union AffineAnimCmd sSpriteAffineAnim_LargeSpikePointedRight[] = { AFFINEANIMCMD_FRAME(0, 0, -32, 1), //45 degree turn AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_LargeSpike[] = { sSpriteAffineAnim_LargeSpikePointedLeft, sSpriteAffineAnim_LargeSpikePointedRight, }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_SnipeShot[] = { sSpriteAffineAnim_LargeSpikePointedRight, }; static const union AnimCmd sAnimCmdSnipeShot[] = { ANIMCMD_FRAME(64, 4), ANIMCMD_FRAME(48, 4), ANIMCMD_FRAME(32, 4), ANIMCMD_FRAME(16, 4), ANIMCMD_FRAME(0, 4), ANIMCMD_END, }; static const union AnimCmd *const sAnimCmdTable_SnipeShot[] = { sAnimCmdSnipeShot, }; const struct SpriteTemplate gSnipeShotBallTemplate = //used in aura sphere { .tileTag = ANIM_TAG_IMPACT_2, .paletteTag = ANIM_TAG_IMPACT_2, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = sAnimCmdTable_SnipeShot, .images = NULL, .affineAnims = sSpriteAffineAnimTable_SnipeShot, .callback = AnimShadowBall }; //jaw lock const struct SpriteTemplate gJawLockTeethTemplate = { .tileTag = ANIM_TAG_SHARP_TEETH, .paletteTag = ANIM_TAG_SHARP_TEETH, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, .callback = SpriteCB_LockingJaw }; //stuff cheeks static const union AnimCmd sAnimCmdBerryChomp[] = { ANIMCMD_FRAME(0, 0x30), ANIMCMD_FRAME(0, 0x25), ANIMCMD_FRAME(16, 3), ANIMCMD_END, }; static const union AnimCmd *const sAnimCmdTable_BerryChomp[] = { sAnimCmdBerryChomp, }; const struct SpriteTemplate gFloatingBerryTemplate = { .tileTag = ANIM_TAG_BERRY_NORMAL, .paletteTag = ANIM_TAG_BERRY_NORMAL, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = sAnimCmdTable_BerryChomp, .images = NULL, .affineAnims = gMetronomeFingerAffineAnimTable, .callback = AnimMetronomeFinger }; //no retreat static const struct OamData sPyroBallFlamesOAM = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 1, //Above sprites }; const struct SpriteTemplate gNoRetreatFlameTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &sPyroBallFlamesOAM, .anims = gAnims_DragonBreathFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_SpriteOnMonForDuration }; //magic powder const struct SpriteTemplate gMagicPowderBluePowderTemplate = { .tileTag = ANIM_TAG_POISON_POWDER, .paletteTag = ANIM_TAG_WATER_GUN, .oam = &gOamData_AffineOff_ObjNormal_8x16, .anims = gPowderParticlesAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMovePowderParticle }; //dreepy missile const struct SpriteTemplate gDreepyMissileTemplate = { .tileTag = ANIM_TAG_DREEPY, .paletteTag = ANIM_TAG_DREEPY, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimShadowBall }; //bolt beak const struct SpriteTemplate gBoltBeakBlueSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_ELECTRICITY, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSparkElectricity }; const struct SpriteTemplate gBoltBeakBlueFlashingSparkTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_ELECTRICITY, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimSparkElectricityFlashing }; //fishious rend static const struct OamData sFishiousRendTeethOam = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .priority = 1, //Above sprites }; const struct SpriteTemplate gFishiousRendTeethTemplate = { .tileTag = ANIM_TAG_SHARP_TEETH, .paletteTag = ANIM_TAG_SHARP_TEETH, .oam = &sFishiousRendTeethOam, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_LeftRightSlice }; //clangorous soul const struct SpriteTemplate gClangorousSoulBlueBuffTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gClangorousSoulPurpleBuffTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gClangorousSoulWhiteBuffTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gClangorousSoulRedFistTemplate = { .tileTag = ANIM_TAG_HORSESHOE_SIDE_FIST, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimJumpKick }; const struct SpriteTemplate gClangorousSoulRedRingTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; //pyro ball static const struct OamData sPyroBallRockOAM = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .shape = SPRITE_SHAPE(16x16), .size = SPRITE_SIZE(16x16), .priority = 1, //Above sprites }; const struct SpriteTemplate gPyroBallRockTemplate = { .tileTag = ANIM_TAG_FLAT_ROCK, .paletteTag = ANIM_TAG_FLAT_ROCK, .oam = &sPyroBallRockOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PyroBallRockBounce }; const struct SpriteTemplate gPyroBallBurningRockTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &sPyroBallFlamesOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PyroBallRockBounce }; const struct SpriteTemplate gPyroBallFlamesUpTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &sPyroBallFlamesOAM, .anims = gAnims_DragonBreathFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PyroBallRockBounce }; const struct SpriteTemplate gPyroBallEmberBallTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_SMALL_EMBER, .oam = &sPyroBallFlamesOAM, .anims = gAnims_DragonBreathFire, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_PyroBallLaunch }; //aura wheel const struct SpriteTemplate gAuraWheelBlueElectricityTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimFireSpiralOutward }; const struct SpriteTemplate gAuraWheelRedElectricityTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SPARK, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimFireSpiralOutward }; //breaking swipe const struct SpriteTemplate gBreakingSwipeCenteredElectricity = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_CentredElectricity }; //branch poke const struct SpriteTemplate gBranchPokeBranchTemplate = { .tileTag = ANIM_TAG_BRANCH, .paletteTag = ANIM_TAG_BRANCH, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimShadowBall }; //apple acid const struct SpriteTemplate gAppleAcidFloatingAppleTemplate = { .tileTag = ANIM_TAG_APPLE, .paletteTag = ANIM_TAG_APPLE, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gMetronomeFingerAffineAnimTable, .callback = AnimMetronomeFinger }; const struct SpriteTemplate gAppleAcidLaunchTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gAnims_PoisonProjectile, .images = NULL, .affineAnims = gAffineAnims_PoisonProjectile, .callback = SpriteCB_AcidLaunchSingleTarget }; const struct SpriteTemplate gAppleAcidDripTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_16x16, .anims = gAnims_AcidPoisonDroplet, .images = NULL, .affineAnims = gAffineAnims_Droplet, .callback = SpriteCB_AcidDripSingleTarget }; //grav apple static const struct OamData sAppleOAM = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 1, //Above sprites }; const struct SpriteTemplate gGravAppleSmallApple = { .tileTag = ANIM_TAG_APPLE, .paletteTag = ANIM_TAG_APPLE, .oam = &sAppleOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_FallingObject }; static const union AffineAnimCmd sSpriteAffineAnim_ScaledApple[] = { AFFINEANIMCMD_FRAME(64, 64, 0, 10), //Quadruple in size AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_ScaledApple[] = { sSpriteAffineAnim_ScaledApple, }; const struct SpriteTemplate gGravAppleLargeApple = { .tileTag = ANIM_TAG_APPLE, .paletteTag = ANIM_TAG_APPLE, .oam = &sAppleOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_ScaledApple, .callback = SpriteCB_FallingObject }; //strange steam const struct SpriteTemplate gStrangeSteamPinkCloudTemplate = { .tileTag = ANIM_TAG_PINK_CLOUD, .paletteTag = ANIM_TAG_PINK_CLOUD, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimDirtScatter }; const struct SpriteTemplate gStrangeSteamGreenCloudTemplate = { .tileTag = ANIM_TAG_PINK_CLOUD, .paletteTag = ANIM_TAG_FINGER, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimDirtScatter }; const struct SpriteTemplate gStrangeSteamBlueCloudTemplate = { .tileTag = ANIM_TAG_PINK_CLOUD, .paletteTag = ANIM_TAG_WATER_GUN, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimDirtScatter }; //life dew static const union AnimCmd sAnimCmdWaterDropletDrip[] = { ANIMCMD_FRAME(0, 3), ANIMCMD_FRAME(16, 3), ANIMCMD_FRAME(32, 3), ANIMCMD_FRAME(48, 3), ANIMCMD_END, }; static const union AnimCmd sAnimCmdWaterDropletSplash[] = { ANIMCMD_FRAME(64, 3), ANIMCMD_FRAME(80, 3), ANIMCMD_FRAME(96, 3), ANIMCMD_FRAME(112, 10), ANIMCMD_END, }; static const union AnimCmd *const sAnimCmdWaterDroplet[] = { sAnimCmdWaterDropletDrip, sAnimCmdWaterDropletSplash, }; const struct SpriteTemplate gLifeDewDropletTemplate = { .tileTag = ANIM_TAG_WATER_DROPLET, .paletteTag = ANIM_TAG_WATER_DROPLET, .oam = &sAppleOAM, .anims = sAnimCmdWaterDroplet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_WaterDroplet }; const struct SpriteTemplate gLifeDewSpecialOrbsTemplate = { .tileTag = ANIM_TAG_BLUE_STAR, .paletteTag = ANIM_TAG_BLUE_STAR, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gHealingBlueStarAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_AnimSpriteOnSelectedMonPos }; //obstruct const struct SpriteTemplate gObstructCrossTemplate = { .tileTag = ANIM_TAG_OBSTRUCT_CROSS, .paletteTag = ANIM_TAG_OBSTRUCT_CROSS, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCrossImpact }; //meteor assault static const struct OamData sGrowingSuperpowerOAM = { .affineMode = ST_OAM_AFFINE_DOUBLE, .objMode = ST_OAM_OBJ_NORMAL, .shape = SPRITE_SHAPE(64x64), .size = SPRITE_SIZE(64x64), .priority = 2, }; static const union AffineAnimCmd sSpriteAffineAnim_GrowingSuperpowerEnemyAttack[] = { AFFINEANIMCMD_FRAME(0, 0, 128, 1), //180 degree turn AFFINEANIMCMD_FRAME(0, 0, 0, 2), //Pause AFFINEANIMCMD_FRAME(16, 16, 0, 15), //Double in size AFFINEANIMCMD_END }; static const union AffineAnimCmd sSpriteAffineAnim_GrowingSuperpowerPlayerAttack[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 2), //Pause AFFINEANIMCMD_FRAME(16, 16, 0, 15), //Double in size AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sSpriteAffineAnimTable_GrowingSuperpower[] = { sSpriteAffineAnim_GrowingSuperpowerPlayerAttack, sSpriteAffineAnim_GrowingSuperpowerEnemyAttack, }; const struct SpriteTemplate gGrowingSuperpowerTemplate = //used in breakneck blitz { .tileTag = ANIM_TAG_METEOR, .paletteTag = ANIM_TAG_METEOR, .oam = &sGrowingSuperpowerOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_GrowingSuperpower, .callback = SpriteCB_GrowingSuperpower }; //steel beam const struct SpriteTemplate gSteelBeamSpikeShardTemplate = { .tileTag = ANIM_TAG_SPIKES, .paletteTag = ANIM_TAG_SPIKES, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_ShadowBall, .callback = AnimDirtScatter }; // Z MOVES //activate const struct SpriteTemplate gZMoveSymbolSpriteTemplate = { .tileTag = ANIM_TAG_Z_MOVE_SYMBOL, .paletteTag = ANIM_TAG_Z_MOVE_SYMBOL, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_LusterPurgeCircle, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gBlueZMoveEnergySpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_SWEAT_BEAD, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy, }; const struct SpriteTemplate gGreenZMoveEnergySpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_WHIP_HIT, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy, }; const struct SpriteTemplate gYellowZMoveEnergySpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_PAW_PRINT, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy, }; // breakneck blitz const struct SpriteTemplate gBreakneckBlitzDanceSpriteTemplate = { .tileTag = ANIM_TAG_HOLLOW_ORB, .paletteTag = ANIM_TAG_FLAT_ROCK, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDragonDanceOrb }; const struct SpriteTemplate gBreakneckBlitzHitSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_FLAT_ROCK, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; // all out pummelling const struct SpriteTemplate gAllOutPummelingOnslaughtSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_IMPACT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimJumpKick }; // supersonic skystrike static const union AffineAnimCmd sSupersonicSkystrikeAffinePlayerSide[] = { AFFINEANIMCMD_FRAME(0, 0, 0xb9, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sSupersonicSkystrikeAffineOpponentSide[] = { AFFINEANIMCMD_FRAME(0, 0, 0x50, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd* const sSupersonicSkystrikeAffineAnimTable[] = { sSupersonicSkystrikeAffinePlayerSide, sSupersonicSkystrikeAffineOpponentSide, }; const struct SpriteTemplate gSupersonicSkystrikeFlySpriteTemplate = { .tileTag = ANIM_TAG_BIRD, .paletteTag = ANIM_TAG_BIRD, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSupersonicSkystrikeAffineAnimTable, .callback = AnimFlyBallAttack }; //acid downpour const struct SpriteTemplate gAcidDownpourReversalSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimReversalOrb }; const struct SpriteTemplate gAcidDownpourAuraSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; //tectonic rage const struct SpriteTemplate gTectonicRageBlastBurnSpriteTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_FIRE_PLUME, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlastBurnTargetPlume }; const struct SpriteTemplate gTectonicRageExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_EXPLOSION_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // continental crush const struct SpriteTemplate gContinentalCrushNeedleArmSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FlyingRock, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gContinentalCrushBigRockStompSpriteTemplate = { .tileTag = ANIM_TAG_REALLY_BIG_ROCK, .paletteTag = ANIM_TAG_REALLY_BIG_ROCK, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_LargeHailRock, .callback = SpriteCB_FallingObject }; const struct SpriteTemplate gContinentalCrushFocusEnergySpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gContinentalCrushGrowingRockSpriteTemplate = { .tileTag = ANIM_TAG_REALLY_BIG_ROCK, .paletteTag = ANIM_TAG_REALLY_BIG_ROCK, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gContinentalCrushEruptionSpriteTemplate = { .tileTag = ANIM_TAG_ROCKS, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEruptionFallingRock }; // savage spin out const struct SpriteTemplate gSavageSpinOutStringBlastSpriteTemplate = { .tileTag = ANIM_TAG_STRING, .paletteTag = ANIM_TAG_STRING, .oam = &gOamData_AffineOff_ObjNormal_64x32, .anims = gAffineAnims_AirWaveCrescent, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimAirWaveCrescent }; const struct SpriteTemplate gSavageSpinOutCacoonSpriteTemplate = { .tileTag = ANIM_TAG_COCOON, .paletteTag = ANIM_TAG_COCOON, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, .callback = AnimBite }; const struct SpriteTemplate gSavageSpinOutGreenChargeSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gSavageSpinOutGreenCutSpriteTemplate = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gCuttingSliceAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCuttingSlice }; const struct SpriteTemplate gSavageSpinOutWhiteExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // never ending nightmare const struct SpriteTemplate gNeverEndingNightmareRingAttackerSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gNeverEndingNightmareRingTargetSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gNeverEndingNightmareFocusEnergySpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gNeverEndingNightmareHandSpriteTemplate = { .tileTag = ANIM_TAG_ASSURANCE_HAND, .paletteTag = ANIM_TAG_ASSURANCE_HAND, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gNeverEndingNightmareBlastBurnSpriteTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlastBurnTargetPlume }; const struct SpriteTemplate gNeverEndingNightmareGeyserHexSpriteTemplate = { .tileTag = ANIM_TAG_VERTICAL_HEX, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_GeyserTarget }; const struct SpriteTemplate gNeverEndingNightmareExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // corkscrew crash const struct SpriteTemplate gCorkscrewCrashMetalBitSpriteTemplate = { .tileTag = ANIM_TAG_SPIKES, .paletteTag = ANIM_TAG_SPIKES, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_TearDrop, .callback = AnimParticleInVortex }; const struct SpriteTemplate gCorkscrewCrashChargeSpriteTemplate = { .tileTag = ANIM_TAG_CORKSCREW, .paletteTag = ANIM_TAG_CORKSCREW, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gCorkscrewCrashCorkscrewFlyUpSpriteTemplate = { .tileTag = ANIM_TAG_CORKSCREW, .paletteTag = ANIM_TAG_CORKSCREW, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimParticleInVortex }; static const union AffineAnimCmd sCorkscrewCrashFlyDownAffineOpponentSide[] = { AFFINEANIMCMD_FRAME(0, 0, 0x80, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd* const sCorkscrewCrashFlyDownAffineAnimTable[] = { sCorkscrewCrashFlyDownAffineOpponentSide, }; const struct SpriteTemplate gCorkscrewCrashCorkscrewFlyDownSpriteTemplate = { .tileTag = ANIM_TAG_CORKSCREW, .paletteTag = ANIM_TAG_CORKSCREW, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sCorkscrewCrashFlyDownAffineAnimTable, .callback = AnimStompFoot }; static const union AffineAnimCmd sCorkscrewCrashStrikePlayerAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xb9, 1), AFFINEANIMCMD_END, }; static const union AffineAnimCmd sCorkscrewCrashStrikeTargetAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x50, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sCorkscrewCrashStrikeAffineAnimTable[] = { sCorkscrewCrashStrikePlayerAffineAnims, sCorkscrewCrashStrikeTargetAffineAnims, }; const struct SpriteTemplate gCorkscrewCrashStrikeSpriteTemplate = { .tileTag = ANIM_TAG_CORKSCREW, .paletteTag = ANIM_TAG_CORKSCREW, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sCorkscrewCrashStrikeAffineAnimTable, .callback = AnimFlyBallAttack }; static const union AffineAnimCmd sCorkscrewCrashLeftAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x40, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sCorkscrewCrashLeftAffineAnimTable[] = { sCorkscrewCrashLeftAffineAnims, }; const struct SpriteTemplate gCorkscrewCrashLeftUpSpriteTemplate = { .tileTag = ANIM_TAG_CORKSCREW, .paletteTag = ANIM_TAG_CORKSCREW, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sCorkscrewCrashLeftAffineAnimTable, .callback = AnimAssistPawprint }; const struct SpriteTemplate gCorkscrewCrashLeftDownSpriteTemplate = { .tileTag = ANIM_TAG_CORKSCREW, .paletteTag = ANIM_TAG_CORKSCREW, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sCorkscrewCrashLeftAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sCorkscrewCrashRightUpAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xc2, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sCorkscrewCrashRightUpAffineAnimTable[] = { sCorkscrewCrashRightUpAffineAnims, }; const struct SpriteTemplate gCorkscrewCrashRightUpSpriteTemplate = { .tileTag = ANIM_TAG_CORKSCREW, .paletteTag = ANIM_TAG_CORKSCREW, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sCorkscrewCrashRightUpAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sCorkscrewCrashRightDownAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xba, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sCorkscrewCrashRightDownAffineAnimTable[] = { sCorkscrewCrashRightDownAffineAnims, }; const struct SpriteTemplate gCorkscrewCrashRightDownSpriteTemplate = { .tileTag = ANIM_TAG_CORKSCREW, .paletteTag = ANIM_TAG_CORKSCREW, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sCorkscrewCrashRightDownAffineAnimTable, .callback = AnimAssistPawprint }; // inferno overdrive const struct SpriteTemplate gInfernoOverdriveSuperpowerSpriteTemplate = { .tileTag = ANIM_TAG_METEOR, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &sGrowingSuperpowerOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_GrowingSuperpower, .callback = SpriteCB_GrowingSuperpower }; const struct SpriteTemplate gInfernoOverdriveChargeSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gInfernoOverdriveExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_EXPLOSION_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // hydro vortex const struct SpriteTemplate gHydroVortexSuperpowerSpriteTemplate = { .tileTag = ANIM_TAG_METEOR, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &sGrowingSuperpowerOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_GrowingSuperpower, .callback = SpriteCB_GrowingSuperpower }; const struct SpriteTemplate gHydroVortexHurricaneSpriteTemplate = { .tileTag = ANIM_TAG_GUST, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_32x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEllipticalGust }; const struct SpriteTemplate gHydroVortexImpactSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; // bloom doom const struct SpriteTemplate gBloomDoomPetalSpinSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gPetalDanceBigFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireSpiralOutward }; const struct SpriteTemplate gBloomDoomGreenChargeSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gBloomDoomHurricaneSpriteTemplate = { .tileTag = ANIM_TAG_GUST, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineOff_ObjNormal_32x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEllipticalGustAttacker, }; const struct SpriteTemplate gBloomDoomFlowerGeyserSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gPetalDanceBigFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Geyser }; const struct SpriteTemplate gBloomDoomGreenBeamSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate gBloomDoomPetalStarSpriteTemplate = { .tileTag = ANIM_TAG_FLOWER, .paletteTag = ANIM_TAG_FLOWER, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gPetalDanceBigFlowerAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimNeedleArmSpike }; const struct SpriteTemplate gBloomDoomExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_RAZOR_LEAF, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // gigavolt havoc const struct SpriteTemplate gGigavoltHavocChargingSpearSpriteTemplate = { .tileTag = ANIM_TAG_HAVOC_SPEAR, .paletteTag = ANIM_TAG_HAVOC_SPEAR, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gGigavoltHavocLaunchSpearSpriteTemplate = { .tileTag = ANIM_TAG_HAVOC_SPEAR, .paletteTag = ANIM_TAG_HAVOC_SPEAR, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSuperpowerFireball }; const struct SpriteTemplate gGigavoltHavocRingsSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gGigavoltHavocGeyserSpriteTemplate = { .tileTag = ANIM_TAG_VERTICAL_HEX, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_GeyserTarget }; // shattered psyche const struct SpriteTemplate gShatteredPsycheReflectHitSpriteTemplate = { .tileTag = ANIM_TAG_BLUE_LIGHT_WALL, .paletteTag = ANIM_TAG_BLUE_LIGHT_WALL, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; const struct SpriteTemplate gShatteredPsychePinkChargeSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gShatteredPsycheRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; // subzero slammer const struct SpriteTemplate gSubzeroSlammerIceSpinSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x16, .anims = gAnims_IceCrystalLarge, .images = NULL, .affineAnims = gAffineAnims_IceCrystalHit, .callback = AnimFireSpiralOutward }; const struct SpriteTemplate gSubzeroSlammerExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_EXPLOSION_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gSubzeroSlammerIceSwirlSpriteTemplate = { .tileTag = ANIM_TAG_ICE_CRYSTALS, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineNormal_ObjBlend_8x16, .anims = gAnims_IceCrystalLarge, .images = NULL, .affineAnims = gAffineAnims_IceCrystalHit, .callback = AnimParticleInVortex }; // devastating drake static const union AffineAnimCmd sDevastatingDrakeStrikePlayer[] = { AFFINEANIMCMD_FRAME(0, 0, 0xb9, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd sDevastatingDrakeStrikeOpponent[] = { AFFINEANIMCMD_FRAME(0, 0, 0x50, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sDevastatingDrakeStrikeAffineAnimTable[] = { sDevastatingDrakeStrikePlayer, sDevastatingDrakeStrikeOpponent, }; static const union AffineAnimCmd sDevastatingDrakeFlyUpAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sDevastatingDrakeFlyUpAffineAnimTable[] = { sDevastatingDrakeFlyUpAffineAnims, sDevastatingDrakeFlyUpAffineAnims }; static const union AffineAnimCmd sDevastatingDrakeRightAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xc2, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sDevastatingDrakeRightAffineAnimTable[] = { sDevastatingDrakeRightAffineAnims, sDevastatingDrakeRightAffineAnims }; static const union AffineAnimCmd sDevastatingDrakeLeftAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x40, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd* const sDevastatingDrakeLeftAffineAnimTable[] = { sDevastatingDrakeLeftAffineAnims, sDevastatingDrakeLeftAffineAnims, }; const struct SpriteTemplate gDevastatingDrakePurpleEnergySpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gDevastatingDrakeShockwaveSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrb }; const struct SpriteTemplate gDevastatingDrakeDrakeUpSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_DRAKE, .paletteTag = ANIM_TAG_PURPLE_DRAKE, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sDevastatingDrakeFlyUpAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gDevastatingDrakeRightSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_DRAKE, .paletteTag = ANIM_TAG_PURPLE_DRAKE, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sDevastatingDrakeRightAffineAnimTable, .callback = AnimAssistPawprint }; const struct SpriteTemplate gDevastatingDrakeLeftSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_DRAKE, .paletteTag = ANIM_TAG_PURPLE_DRAKE, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sDevastatingDrakeLeftAffineAnimTable, .callback = AnimAssistPawprint }; const struct SpriteTemplate gDevastatingDrakeStrikeSpriteTemplate = { .tileTag = ANIM_TAG_PURPLE_DRAKE, .paletteTag = ANIM_TAG_PURPLE_DRAKE, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sDevastatingDrakeStrikeAffineAnimTable, .callback = AnimFlyBallAttack }; const struct SpriteTemplate gDevastatingDrakePurpleBlastSpriteTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_FIRE_PLUME, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlastBurnTargetPlume }; const struct SpriteTemplate gDevastatingDrakeHexSpriteTemplate = { .tileTag = ANIM_TAG_VERTICAL_HEX, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gRazorLeafParticleAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_Geyser }; const struct SpriteTemplate gDevastatingDrakeExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_EXPLOSION, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gDevastatingDrakeExplosion2SpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_EXPLOSION_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // black hole eclipse const struct SpriteTemplate gBlackHoleEclipseShockwaveSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_BLACK_BALL_2, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrb }; const struct SpriteTemplate gBlackHoleEclipseBlueRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gBlackHoleEclipseBlackRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gBlackHoleEclipseRedExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gBlackHoleEclipseWispSpriteTemplate = { .tileTag = ANIM_TAG_WISP_ORB, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gAnims_WillOWispOrb, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimWillOWispOrb }; const struct SpriteTemplate gBlackHoleEclipseRedRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gBlackHoleEclipseBlueRingInwardsSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gBlackHoleEclipseRedRingInwardsSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; static const union AffineAnimCmd gGrowingBackHoleTargetAffineCmds[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -10, 0x88), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const gGrowingBlackHoleTargetAffineAnimTable[] = { gGrowingBackHoleTargetAffineCmds, }; const struct SpriteTemplate gBlackHoleEclipseHoleSpriteTemplate = { .tileTag = ANIM_TAG_SHADOW_BALL, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGrowingBlackHoleTargetAffineAnimTable, .callback = AnimSpriteOnMonPos }; static const union AffineAnimCmd gShrinkingBlackHoleAffineCmds[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(-0x10, -0x10, 0xf6, 8), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd *const gShrinkingBlackHoleAffineAnimTable[] = { gShrinkingBlackHoleAffineCmds, }; const struct SpriteTemplate gBlackHoleEclipseHoleShrinkSpriteTemplate = { .tileTag = ANIM_TAG_SHADOW_BALL, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gShrinkingBlackHoleAffineAnimTable, .callback = AnimSpriteOnMonPos }; static const union AffineAnimCmd gGrowingBackHoleAffineCmds[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, -10, 0x48), AFFINEANIMCMD_END, }; static const union AffineAnimCmd *const gGrowingBlackHoleAffineAnimTable[] = { gGrowingBackHoleAffineCmds, }; const struct SpriteTemplate gBlackHoleEclipseHoleUserSpriteTemplate = { .tileTag = ANIM_TAG_SHADOW_BALL, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gGrowingBlackHoleAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gTargetTwinkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_SpinningSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_TwinkleOnBattler }; // twinkle tackle static const union AffineAnimCmd sTwinkleTackleStarPlayerAffineAnims[] = { AFFINEANIMCMD_FRAME(8, 8, 0, 0), AFFINEANIMCMD_FRAME(0x10, 0x10, 0x0, 0x1e), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd sTwinkleTackleStarOpponentAffineAnims[] = { AFFINEANIMCMD_FRAME(8, 8, 0, 0), AFFINEANIMCMD_FRAME(0x20, 0x20, 0, 0xf), AFFINEANIMCMD_END_ALT(1), }; static const union AffineAnimCmd *const sTwinkleTackleStarAffineAnimTable[] = { sTwinkleTackleStarPlayerAffineAnims, sTwinkleTackleStarOpponentAffineAnims }; const struct SpriteTemplate gTwinkleTacklePinkStarSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gGrantingStarsAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGrantingStars }; const struct SpriteTemplate gTwinkleTacklePinkRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_PINK_PETAL, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gTwinkleTackleStarGrowSpriteTemplate = { .tileTag = ANIM_TAG_YELLOW_STAR, .paletteTag = ANIM_TAG_YELLOW_STAR, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sTwinkleTackleStarAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gTwinkleTackleTwinkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_SPARKLE_4, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_SpinningSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCB_TwinkleOnBattler }; const struct SpriteTemplate gTwinkleTackleDigStarSpriteTemplate = { .tileTag = ANIM_TAG_YELLOW_STAR, .paletteTag = ANIM_TAG_YELLOW_STAR, .oam = &gOamData_AffineDouble_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDirtPlumeParticle }; const struct SpriteTemplate gTwinkleTackleYellowImpactSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_YELLOW_STAR, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; const struct SpriteTemplate gTwinkleTackleImpactStarsSpriteTemplate = { .tileTag = ANIM_TAG_PAIN_SPLIT, .paletteTag = ANIM_TAG_YELLOW_STAR, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDizzyPunchDuck }; // catastrokpika const struct SpriteTemplate gCatastrokpikaSuperpowerSpriteTemplate = { .tileTag = ANIM_TAG_METEOR, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &sGrowingSuperpowerOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_GrowingSuperpower, .callback = SpriteCB_GrowingSuperpower }; // 10e6 volt thunderbolt const struct SpriteTemplate g10MillionVoltBoltYellowFlySpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; const struct SpriteTemplate g10MillionVoltBoltShockwaveSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrbOnTarget, }; const struct SpriteTemplate g10MillionVoltBoltRedBeamSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate g10MillionVoltBoltBlueBeamSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate g10MillionVoltBoltPinkBeamSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_BERRY_EATEN, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate g10MillionVoltBoltYellowBeamSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_ELECTRIC_ORBS, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate g10MillionVoltBoltGreenBeamSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate g10MillionVoltBoltPurpleBeamSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; // stoked sparksurfer const struct SpriteTemplate gStokedSparksurferFlySpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_SPARK_2, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; // extreme evoboost const struct SpriteTemplate gExtremeEvoboostRedChargeUpSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gExtremeEvoboostPinkChargeUpSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_BERRY_EATEN, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gExtremeEvoboostIceChargeUpSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gExtremeEvoboostBlackChargeUpSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WISP_ORB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gExtremeEvoboostBlueChargeUpSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gExtremeEvoboostPurpleChargeUpSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gExtremeEvoboostYellowChargeUpSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gExtremeEvoboostGreenChargeUpSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gExtremeEvoboostRedChargeCircleSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimExtremeEvoboostCircle }; const struct SpriteTemplate gExtremeEvoboostPinkChargeCircleSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_BERRY_EATEN, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimExtremeEvoboostCircle }; const struct SpriteTemplate gExtremeEvoboostIceChargeCircleSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimExtremeEvoboostCircle }; const struct SpriteTemplate gExtremeEvoboostBlackChargeCircleSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WISP_ORB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimExtremeEvoboostCircle }; const struct SpriteTemplate gExtremeEvoboostBlueChargeCircleSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimExtremeEvoboostCircle }; const struct SpriteTemplate gExtremeEvoboostPurpleChargeCircleSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimExtremeEvoboostCircle }; const struct SpriteTemplate gExtremeEvoboostYellowChargeCircleSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimExtremeEvoboostCircle }; const struct SpriteTemplate gExtremeEvoboostGreenChargeCircleSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimExtremeEvoboostCircle }; const struct SpriteTemplate gExtremeEvoboostRedStockpileSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gExtremeEvoboostPinkStockpileSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_BERRY_EATEN, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gExtremeEvoboostIceStockpileSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_ICE_CHUNK, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gExtremeEvoboostBlackStockpileSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_WISP_ORB, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gExtremeEvoboostBlueStockpileSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gExtremeEvoboostPurpleStockpileSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gExtremeEvoboostYellowStockpileSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; const struct SpriteTemplate gExtremeEvoboostGreenStockpileSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gStockpileAbsorptionOrbAffineAnimTable, .callback = AnimPowerAbsorptionOrb }; // pulverizing pancake const struct SpriteTemplate gPulverizingPancakeRedDetectSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_SpinningSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpinningSparkle }; const struct SpriteTemplate gPulverizingPancakeExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_ELECTRIC_ORBS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gPulverizingPancakeYellowRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_ELECTRIC_ORBS, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; // genesis supernova const struct SpriteTemplate gGenesisSupernovaOrbRiseSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_JAB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gAnims_PoisonProjectile, .images = NULL, .affineAnims = gAffineAnims_Bubble, .callback = AnimAssistPawprint }; const struct SpriteTemplate gGenesisSupernovaReversalSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_JAB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimReversalOrb }; const struct SpriteTemplate gGenesisSupernovaSpinUpSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_JAB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gGenesisSupernovaChargeSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_POISON_JAB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gGenesisSupernovaSuperpowerSpriteTemplate = { .tileTag = ANIM_TAG_METEOR, .paletteTag = ANIM_TAG_WISP_ORB, .oam = &sGrowingSuperpowerOAM, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSpriteAffineAnimTable_GrowingSuperpower, .callback = SpriteCB_GrowingSuperpower }; const struct SpriteTemplate gGenesisSupernovaBubbleSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_POISON_JAB, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gAnims_PoisonProjectile, .images = NULL, .affineAnims = gAffineAnims_Bubble, .callback = AnimBubbleEffect }; const struct SpriteTemplate gGenesisSupernovaExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_WISP_ORB, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // sinister arrow raid static const union AffineAnimCmd sArrowRaidFlyStrikePlayerAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xb9, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd sArrowRaidFlyStrikeOpponentAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x50, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidFlyStrikeAffineAnimTable[] = { sArrowRaidFlyStrikePlayerAffineAnims, sArrowRaidFlyStrikeOpponentAffineAnims }; static const union AffineAnimCmd sArrowRaidFlyRightAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xc2, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidFlyRightAffineAnimTable[] = { sArrowRaidFlyRightAffineAnims, sArrowRaidFlyRightAffineAnims }; static const union AffineAnimCmd sArrowRaidFlyLeftAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x40, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidFlyLeftAffineAnimTable[] = { sArrowRaidFlyLeftAffineAnims, sArrowRaidFlyLeftAffineAnims }; const struct SpriteTemplate gArrowRaidExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gArrowRaidFlyUpSpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; const struct SpriteTemplate gArrowRaidFlyRightSpriteTemplate = { .tileTag = ANIM_TAG_BIRD, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidFlyRightAffineAnimTable, .callback = AnimAssistPawprint }; const struct SpriteTemplate gArrowRaidFlyLeftSpriteTemplate = { .tileTag = ANIM_TAG_BIRD, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidFlyLeftAffineAnimTable, .callback = AnimAssistPawprint }; const struct SpriteTemplate gArrowRaidFlyStrikeSpriteTemplate = { .tileTag = ANIM_TAG_BIRD, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidFlyStrikeAffineAnimTable, .callback = AnimFlyBallAttack }; static const union AffineAnimCmd sArrowRaidArrowUpAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xa0, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidArrowUpAffineAnimTable[] = { sArrowRaidArrowUpAffineAnims, }; const struct SpriteTemplate gArrowRaidArrowUpSpriteTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidArrowUpAffineAnimTable, .callback = AnimParticleInVortex }; static const union AffineAnimCmd sArrowRaidArrowRightUpAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x75, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidArrowRightUpAffineAnimTable[] = { sArrowRaidArrowRightUpAffineAnims, }; const struct SpriteTemplate gArrowRaidRightUpSpriteTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidArrowRightUpAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sArrowRaidRightDownAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x60, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidRightDownAffineAnimTable[] = { sArrowRaidRightDownAffineAnims, }; const struct SpriteTemplate gArrowRaidRightDownSpriteTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidRightDownAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sArrowRaidArrowLeftUpAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xe0, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidLeftUpAffineAnimTable[] = { sArrowRaidArrowLeftUpAffineAnims, }; const struct SpriteTemplate gArrowRaidLeftUpSpriteTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidLeftUpAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sArrowRaidFaceUpLeftAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xe0, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidFaceUpLeftAffineAnimTable[] = { sArrowRaidFaceUpLeftAffineAnims, }; const struct SpriteTemplate gArrowRaidFaceUpLeftSpriteTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidFaceUpLeftAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sArrowRaidArrowFaceRightAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x60, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidArrowFaceRightAffineAnimTable[] = { sArrowRaidArrowFaceRightAffineAnims }; const struct SpriteTemplate gArrowRaidRightSpriteTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidArrowFaceRightAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sArrowRaidLeftDownAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xd0, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidLeftDownAffineAnimTable[] = { sArrowRaidLeftDownAffineAnims }; const struct SpriteTemplate gArrowRaidLeftDownSpriteTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidLeftDownAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sArrowRaidOnslaughtAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x30, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sArrowRaidOnslaughtAffineAnimTable[] = { sArrowRaidOnslaughtAffineAnims }; const struct SpriteTemplate gArrowRaidArrowOnslaughtSpriteTemplate = { .tileTag = ANIM_TAG_SPIRIT_ARROW, .paletteTag = ANIM_TAG_SPIRIT_ARROW, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sArrowRaidOnslaughtAffineAnimTable, .callback = AnimAssistPawprint }; // malicious moonsault const struct SpriteTemplate gMaliciousMoonsaultRedFlySpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; const struct SpriteTemplate gMaliciousMoonsaultRedBounceSpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_BounceBallLand, .callback = AnimBounceBallLand }; const struct SpriteTemplate gMaliciousMoonsaultRedImpactSpriteTemplate = { .tileTag = ANIM_TAG_IMPACT, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_HitSplat, .callback = AnimHitSplatBasic }; const struct SpriteTemplate gMaliciousMoonsaultFireblastSpriteTemplate = { .tileTag = ANIM_TAG_SMALL_EMBER, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FireBlastCross, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFireCross }; const struct SpriteTemplate gMaliciousMoonsaultExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_EXPLOSION_2, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // oceanic operetta const struct SpriteTemplate gOceanOperaSpotlightSpriteTemplate = { .tileTag = ANIM_TAG_SPOTLIGHT, .paletteTag = ANIM_TAG_SPOTLIGHT, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gSpotlightAffineAnimTable, .callback = AnimOceanicOperettaSpotlight, }; const struct SpriteTemplate gOceanOperaBlueFlareSpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gOceanOperaBlueChargeSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gOceanOperaBlueRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gOceanOperaMovingOrbsSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimThrowMistBall }; const struct SpriteTemplate gOceanOperaBlueOrbsSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBite }; const struct SpriteTemplate gOceanOperaExpandingRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingExpandingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gOceanOperaExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gOceanOperaSparkleSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gGrantingStarsAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGrantingStars }; // splintered stormshards const struct SpriteTemplate gSplinteredShardsFlySpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; const struct SpriteTemplate gSplinteredShardsExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gSplinteredShardsRisingSpearSpriteTemplate = { .tileTag = ANIM_TAG_ICICLE_SPEAR, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimAssistPawprint }; static const union AffineAnimCmd sSplinteredShardsOpponentSteepAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xca, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sSplinteredShardsOpponentSteepAffineAnimTable[] = { sSplinteredShardsOpponentSteepAffineAnims, }; const struct SpriteTemplate gSplinteredShardsSplinterOpponentSteepSpriteTemplate = { .tileTag = ANIM_TAG_ICICLE_SPEAR, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSplinteredShardsOpponentSteepAffineAnimTable, .callback = AnimJumpKick }; static const union AffineAnimCmd sSplinteredShardsOpponentShallowAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0xb9, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sSplinteredShardsOpponentShallowAffineAnimTable[] = { sSplinteredShardsOpponentShallowAffineAnims }; const struct SpriteTemplate gSplinteredShardsSplinterOpponentShallowSpriteTemplate = { .tileTag = ANIM_TAG_ICICLE_SPEAR, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSplinteredShardsOpponentShallowAffineAnimTable, .callback = AnimJumpKick }; static const union AffineAnimCmd sSplinteredShardsPlayerSteepAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x60, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sSplinteredShardsPlayerSteepAffineAnimTable[] = { sSplinteredShardsPlayerSteepAffineAnims }; const struct SpriteTemplate gSplinteredShardsSplinterPlayerSteepSpriteTemplate = { .tileTag = ANIM_TAG_ICICLE_SPEAR, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSplinteredShardsPlayerSteepAffineAnimTable, .callback = AnimJumpKick }; static const union AffineAnimCmd sSplinteredShardsPlayerShallowAffineAnims[] = { AFFINEANIMCMD_FRAME(0, 0, 0x50, 1), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sSplinteredShardsPlayerShallowAffineAnimTable[] = { sSplinteredShardsPlayerShallowAffineAnims }; const struct SpriteTemplate gSplinteredShardsSplinterPlayerShallowSpriteTemplate = { .tileTag = ANIM_TAG_ICICLE_SPEAR, .paletteTag = ANIM_TAG_ROCKS, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSplinteredShardsPlayerShallowAffineAnimTable, .callback = AnimJumpKick }; // lets snuggle forever const struct SpriteTemplate gSnuggleForeverEyesSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_4, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = sAnims_SpinningSparkle, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpinningSparkle }; const struct SpriteTemplate gSnuggleForeverStarSpriteTemplate = { .tileTag = ANIM_TAG_PAIN_SPLIT, .paletteTag = ANIM_TAG_DUCK, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimDizzyPunchDuck }; const struct SpriteTemplate gSnuggleForeverHeartSpriteTemplate = { .tileTag = ANIM_TAG_MAGENTA_HEART, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMagentaHeart }; // clangorous soulblaze const struct SpriteTemplate gClangoorousSoulblazeWhiteFlySpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; const struct SpriteTemplate gClangoorousSoulblazePurpleSwirlSpriteTemplate = { .tileTag = ANIM_TAG_WATER_ORB, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_16x16, .anims = gAnims_WaterMudOrb, .images = NULL, .affineAnims = gAffineAnims_Whirlpool, .callback = AnimParticleInVortex }; const struct SpriteTemplate gClangoorousSoulblazePurpleChargeSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gClangoorousSoulblazePulseSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = TranslateAnimSpriteToTargetMonLocation }; // guardian of alola const struct SpriteTemplate gGuardianOfAlolaFistSpriteTemplate = { .tileTag = ANIM_TAG_HORSESHOE_SIDE_FIST, .paletteTag = ANIM_TAG_HORSESHOE_SIDE_FIST, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimStompFoot }; const struct SpriteTemplate gGuardianOfAlolaDirtGeyserSpriteTemplate = { .tileTag = ANIM_TAG_MUD_SAND, .paletteTag = ANIM_TAG_MUD_SAND, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimMudSportDirt }; // seering sunraze smash static const union AffineAnimCmd sSearingSunrazeSmashWormholeGrowingAffineAnims[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0xf8, 0x88), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sSearingSunrazeSmashWormholeGrowingAffineAnimTable[] = { sSearingSunrazeSmashWormholeGrowingAffineAnims }; const struct SpriteTemplate gSearingSunrazeSmashGrowWormholeSpriteTemplate = { .tileTag = ANIM_TAG_SHADOW_BALL, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sSearingSunrazeSmashWormholeGrowingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gSearingSunrazeSmashBlueRingInwardsSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gSearingSunrazeSmashWhiteRingInwardsSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gSearingSunrazeSmashCrossImpactSpriteTemplate = { .tileTag = ANIM_TAG_CROSS_IMPACT, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCrossImpact }; const struct SpriteTemplate gSearingSunrazeSmashWhiteCutSpriteTemplate = { .tileTag = ANIM_TAG_CUT, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gCuttingSliceAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCuttingSlice }; const struct SpriteTemplate gSearingSunrazeSmashInfernoOrbSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingChargeOrb }; const struct SpriteTemplate gSearingSunrazeSmashShockwaveSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrbOnTarget }; const struct SpriteTemplate gSearingSunrazeSmashRedFlySpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_VERTICAL_HEX, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; // menacing moonraze maelstrom const struct SpriteTemplate gMoonrazeMaelstromBlueBuffSpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gMoonrazeMaelstromBlackBuffSpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gMoonrazeMaelstromPurpleBuffSpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gMoonrazeMaelstromBlackSparklesSpriteTemplate = { .tileTag = ANIM_TAG_SPARKLE_2, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gGrantingStarsAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimGrantingStars }; const struct SpriteTemplate gMoonrazeMaelstromBlueRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gMoonrazeMaelstromWhiteRingSpriteTemplate = { .tileTag = ANIM_TAG_THIN_RING, .paletteTag = ANIM_TAG_AIR_WAVE_2, .oam = &gOamData_AffineDouble_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gThinRingShrinkingAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gMoonrazeMaelstromSuperpowerSpriteTemplate = { .tileTag = ANIM_TAG_METEOR, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineOff_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSuperpowerFireball }; const struct SpriteTemplate gMoonrazeMaelstromBlackOrbsSpriteTemplate = { .tileTag = ANIM_TAG_POISON_BUBBLE, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimParticleInVortex }; const struct SpriteTemplate gMoonrazeMaelstromBeamSpriteTemplate = { .tileTag = ANIM_TAG_ORBS, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_8x8, .anims = gSolarBeamBigOrbAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimHyperBeamOrb }; const struct SpriteTemplate gMoonrazeMaelstromExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gMoonrazeMaelstromShockwaveSpriteTemplate = { .tileTag = ANIM_TAG_CIRCLE_OF_LIGHT, .paletteTag = ANIM_TAG_POISON_BUBBLE, .oam = &gOamData_AffineNormal_ObjBlend_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_GrowingElectricOrb, .callback = AnimGrowingShockWaveOrbOnTarget }; static const union AffineAnimCmd sMoonrazeMaelstromWormholeAffineAnims[] = { AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), AFFINEANIMCMD_FRAME(0, 0, 0xf6, 0x88), AFFINEANIMCMD_END }; static const union AffineAnimCmd *const sMoonrazeMaelstromWormholeAffineAnimTable[] = { sMoonrazeMaelstromWormholeAffineAnims }; const struct SpriteTemplate gMoonrazeMaelstromWormholeSpriteTemplate = { .tileTag = ANIM_TAG_SHADOW_BALL, .paletteTag = ANIM_TAG_WATER_ORB, .oam = &gOamData_AffineNormal_ObjNormal_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = sMoonrazeMaelstromWormholeAffineAnimTable, .callback = AnimSpriteOnMonPos }; // light that burns the sky const struct SpriteTemplate gLightThatBurnsTheSkyGreenSparkSpriteTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_LEAF, .oam = &gOamData_AffineNormal_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlashingSpark, .callback = AnimSparkElectricityFlashing }; const struct SpriteTemplate gLightThatBurnsTheSkyBlastBurnSpriteTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_CIRCLE_OF_LIGHT, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimBlastBurnTargetPlume }; static const struct OamData sGeyserOam = { .affineMode = ST_OAM_AFFINE_OFF, .objMode = ST_OAM_OBJ_NORMAL, .shape = SPRITE_SHAPE(32x32), .size = SPRITE_SIZE(32x32), .priority = 1, //Above sprites }; const struct SpriteTemplate gLightThatBurnsTheSkyExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION_2, .paletteTag = ANIM_TAG_EXPLOSION_2, .oam = &sGeyserOam, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; // soul stealing 7star strike const struct SpriteTemplate gSoulStealBlackFlySpriteTemplate = { .tileTag = ANIM_TAG_ROUND_SHADOW, .paletteTag = ANIM_TAG_HANDS_AND_FEET, .oam = &gOamData_AffineDouble_ObjNormal_64x64, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_FlyBallUp, .callback = AnimFlyBallUp }; const struct SpriteTemplate gSoulStealIceBuffSpriteTemplate = { .tileTag = ANIM_TAG_FOCUS_ENERGY, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_16x32, .anims = gEndureEnergyAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimEndureEnergy }; const struct SpriteTemplate gSoulStealBlueFistSpriteTemplate = { .tileTag = ANIM_TAG_HANDS_AND_FEET, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_HandsAndFeet, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimJumpKick }; const struct SpriteTemplate gSoulStealBlueStarSpriteTemplate = { .tileTag = ANIM_TAG_PAIN_SPLIT, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gAffineAnims_Bite, .callback = AnimSoulStealingStar }; const struct SpriteTemplate gSoulStealBlueParalyzeSpriteTemplate = { .tileTag = ANIM_TAG_SPARK_2, .paletteTag = ANIM_TAG_ICE_CRYSTALS, .oam = &gOamData_AffineOff_ObjNormal_16x16, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimElectricity }; const struct SpriteTemplate gSoulStealBlastburnSpriteTemplate = { .tileTag = ANIM_TAG_FIRE_PLUME, .paletteTag = ANIM_TAG_WISP_FIRE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gAnims_FirePlume, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimFirePlume }; const struct SpriteTemplate gSoulStealExplosionSpriteTemplate = { .tileTag = ANIM_TAG_EXPLOSION, .paletteTag = ANIM_TAG_WISP_FIRE, .oam = &gOamData_AffineOff_ObjNormal_32x32, .anims = gExplosionAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimSpriteOnMonPos }; const struct SpriteTemplate gSoulStealZStarSpriteTemplate = { .tileTag = ANIM_TAG_SNORE_Z, .paletteTag = ANIM_TAG_SNORE_Z, .oam = &gOamData_AffineOff_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = AnimCrossImpact }; // functions //general void AnimTask_IsTargetPartner(u8 taskId) { if (gBattleAnimTarget == (gBattleAnimAttacker ^ BIT_FLANK)) gBattleAnimArgs[0] = 1; else gBattleAnimArgs[0] = 0; DestroyAnimVisualTask(taskId); } void AnimTask_AllBanksInvisible(u8 taskId) { u32 i; for (i = 0; i < gBattlersCount; i++) { u8 spriteId = gBattlerSpriteIds[i]; if (spriteId != 0xFF) gSprites[spriteId].invisible = TRUE; } DestroyAnimVisualTask(taskId); } void AnimTask_AllBanksVisible(u8 taskId) { u32 i; for (i = 0; i < gBattlersCount; i++) { u8 spriteId = gBattlerSpriteIds[i]; if (spriteId != 0xFF) gSprites[spriteId].invisible = FALSE; } DestroyAnimVisualTask(taskId); } void AnimTask_AllBanksInvisibleExceptAttackerAndTarget(u8 taskId) { u32 i; for (i = 0; i < gBattlersCount; ++i) { u8 spriteId = gBattlerSpriteIds[i]; if (spriteId == GetAnimBattlerSpriteId(ANIM_ATTACKER) || spriteId == GetAnimBattlerSpriteId(ANIM_TARGET)) continue; if (spriteId != 0xFF || !IsBattlerSpriteVisible(i)) //Pokemon that are already hidden gSprites[spriteId].invisible = TRUE; } DestroyAnimVisualTask(taskId); } static u8 LoadBattleAnimTarget(u8 arg) { u8 battler; if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { switch (gBattleAnimArgs[arg]) { case 0: battler = gBattleAnimAttacker; break; default: battler = gBattleAnimTarget; break; case 2: battler = BATTLE_PARTNER(gBattleAnimAttacker); break; case 3: battler = BATTLE_PARTNER(gBattleAnimTarget); break; } } else { if (gBattleAnimArgs[arg] == 0) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; } return battler; } static u8 GetProperCentredCoord(u8 battler, u8 coordType) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) return (GetBattlerSpriteCoord2(battler, coordType) + GetBattlerSpriteCoord2(BATTLE_PARTNER(battler), coordType)) / 2; return GetBattlerSpriteCoord(battler, coordType); } static void InitSpritePosToGivenTarget(struct Sprite *sprite, u8 target) { sprite->x = GetBattlerSpriteCoord2(target, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord2(target, BATTLER_COORD_Y); SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y2 = gBattleAnimArgs[1]; } static void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool8 respectMonPicOffsets) { if (!respectMonPicOffsets) { sprite->x = (GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X)) / 2; sprite->y = (GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y)) / 2; } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; } static void InitSpritePosToAnimAttackersCentre(struct Sprite *sprite, bool8 respectMonPicOffsets) { if (!respectMonPicOffsets) { sprite->x = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X)) / 2; sprite->y = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y)) / 2; } else { sprite->x = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_X_2) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_X_2)) / 2; sprite->y = (GetBattlerSpriteCoord2(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoord2(BATTLE_PARTNER(gBattleAnimAttacker), BATTLER_COORD_Y_PIC_OFFSET)) / 2; } SetAnimSpriteInitialXOffset(sprite, gBattleAnimArgs[0]); sprite->y += gBattleAnimArgs[1]; } //sprite callbacks static void AnimSoulStealingStar(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[4]; sprite->data[2] = gBattleAnimArgs[5]; sprite->callback = AnimSoulStealingStar_Step1; } static void AnimSoulStealingStar_Step1(struct Sprite *sprite) { sprite->data[4] += sprite->data[0]; sprite->data[5] += sprite->data[1]; sprite->x2 = sprite->data[4] >> 8; sprite->y2 = sprite->data[5] >> 8; if (++sprite->data[3] == sprite->data[2]) sprite->callback = AnimSoulStealingStar_Step2; } static void AnimSoulStealingStar_Step2(struct Sprite *sprite) { sprite->data[4] -= sprite->data[0]; sprite->data[5] -= sprite->data[1]; sprite->x2 = sprite->data[4] >> 8; sprite->y2 = sprite->data[5] >> 8; if (--sprite->data[3] == 0) DestroySpriteAndMatrix(sprite); } //Creates The Extreme Evoboost Circles static void AnimExtremeEvoboostCircle(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); sprite->y += 20; sprite->data[1] = 191; sprite->callback = AnimExtremeEvoboostCircle_Step; sprite->callback(sprite); } static void AnimExtremeEvoboostCircle_Step(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[1], 32); sprite->y2 = Cos(sprite->data[1], 8); sprite->data[1] += 5; sprite->data[1] &= 0xFF; if (++sprite->data[0] == 71) DestroyAnimSprite(sprite); } static void AnimGrowingShockWaveOrbOnTarget(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); StartSpriteAffineAnim(sprite, 2); sprite->data[0]++; break; case 1: if (sprite->affineAnimEnded) DestroySpriteAndMatrix(sprite); break; } } static void AnimEllipticalGustAttacker(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, FALSE); sprite->y += 20; sprite->data[1] = 191; sprite->callback = AnimEllipticalGustAttacker_Step; sprite->callback(sprite); } static void AnimEllipticalGustAttacker_Step(struct Sprite *sprite) { sprite->x2 = Sin(sprite->data[1], 32); sprite->y2 = Cos(sprite->data[1], 8); sprite->data[1] += 5; sprite->data[1] &= 0xFF; if (++sprite->data[0] == 71) DestroyAnimSprite(sprite); } static void SetSpriteCoordsToAnimTargetCoords(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); } static void AnimBlastBurnTargetPlume(struct Sprite *sprite) { SetSpriteCoordsToAnimTargetCoords(sprite); if (GetBattlerSide(gBattleAnimTarget)) { sprite->x -= gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[2] = -gBattleAnimArgs[4]; } else { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[2] = gBattleAnimArgs[4]; } sprite->data[1] = gBattleAnimArgs[2]; sprite->data[4] = gBattleAnimArgs[3]; sprite->data[3] = gBattleAnimArgs[5]; sprite->callback = AnimBlastBurnTargetPlume_Step1; } static void AnimBlastBurnTargetPlume_Step1(struct Sprite *sprite) { if (++sprite->data[0] < sprite->data[4]) { sprite->x2 += sprite->data[2]; sprite->y2 += sprite->data[3]; } if (sprite->data[0] == sprite->data[1]) DestroySpriteAndMatrix(sprite); } static void SpriteCB_SpriteToCentreOfSide(struct Sprite *sprite) { bool8 var; if (!sprite->data[0]) { if (!gBattleAnimArgs[3]) var = TRUE; else var = FALSE; if (gBattleAnimArgs[2] == 0) //Attacker { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) InitSpritePosToAnimAttackersCentre(sprite, var); else InitSpritePosToAnimAttacker(sprite, var); } else { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) InitSpritePosToAnimTargetsCentre(sprite, var); else InitSpritePosToAnimTarget(sprite, var); } sprite->data[0]++; } else if (sprite->animEnded || sprite->affineAnimEnded) { DestroySpriteAndMatrix(sprite); } } static void SpriteCB_SpriteOnMonForDuration(struct Sprite *sprite) { u8 target = LoadBattleAnimTarget(0); if (!IsBattlerSpriteVisible(target)) { DestroyAnimSprite(sprite); } else { sprite->x = GetBattlerSpriteCoord(target, 0); sprite->y = GetBattlerSpriteCoord(target, 1); sprite->x += gBattleAnimArgs[1]; sprite->y += gBattleAnimArgs[2]; sprite->data[0] = 0; sprite->data[1] = gBattleAnimArgs[3]; sprite->data[2] = gBattleAnimArgs[4]; sprite->data[3] = 0; sprite->callback = AnimBrickBreakWall_Step; } } static void SpriteCB_ToxicThreadWrap(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) sprite->x -= gBattleAnimArgs[0]; else sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) sprite->y += 8; sprite->callback = AnimStringWrap_Step; } static void SpriteCB_GrowingSuperpower(struct Sprite *sprite) { u8 battler; if (gBattleAnimArgs[0] == 0) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); battler = gBattleAnimTarget; sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimAttacker); } else { battler = gBattleAnimAttacker; sprite->oam.priority = GetBattlerSpriteBGPriority(gBattleAnimTarget); } if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_OPPONENT) StartSpriteAffineAnim(sprite, 1); sprite->data[0] = 16; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(battler, 2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(battler, 3); InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); sprite->callback = AnimTranslateLinear_WithFollowup; } static void SpriteCB_CentredSpiderWeb(struct Sprite *sprite) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); sprite->callback = AnimSpiderWeb; } static void SpriteCB_CoreEnforcerHits(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); if (gBattleAnimArgs[2] == 0) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) InitSpritePosToAnimAttackersCentre(sprite, FALSE); else InitSpritePosToAnimAttacker(sprite, FALSE); } else { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); } sprite->y += 20; sprite->callback = AnimFlashingHitSplat_Step; } static void SpriteCB_CoreEnforcerBeam(struct Sprite *sprite) { if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { AnimSolarBeamBigOrb(sprite); } else { InitSpritePosToAnimAttacker(sprite, TRUE); StartSpriteAnim(sprite, gBattleAnimArgs[3]); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 2; sprite->data[4] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET)) / 2; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } } static void SpriteCB_TranslateAnimSpriteToTargetMonLocationDoubles(struct Sprite *sprite) { bool8 v1; u8 target; u8 coordType; if (!(gBattleAnimArgs[5] & 0xff00)) v1 = TRUE; else v1 = FALSE; if (!(gBattleAnimArgs[5] & 0xff)) coordType = BATTLER_COORD_Y_PIC_OFFSET; else coordType = BATTLER_COORD_Y; InitSpritePosToAnimAttacker(sprite, v1); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; target = LoadBattleAnimTarget(6); if (!IsBattlerSpriteVisible(target)) DestroyAnimSprite(sprite); else { sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(target, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(target, coordType) + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } } //Causes an object to fall from the sky. //arg 0: initial x pixel offset //arg 1: initial y pixel offset //arg 2: speed //arg 3: anim battler static void SpriteCB_FallingObject(struct Sprite *sprite) { u8 target = LoadBattleAnimTarget(3); if (!IsBattlerSpriteVisible(target)) DestroyAnimSprite(sprite); else { sprite->x = GetBattlerSpriteCoord2(target, BATTLER_COORD_X); sprite->y = GetBattlerSpriteCoord2(target, BATTLER_COORD_Y); sprite->x2 = gBattleAnimArgs[0]; sprite->y = gBattleAnimArgs[1]; sprite->y2 = -gBattleAnimArgs[1]; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { sprite->y += 45; sprite->y2 -= 45; } sprite->data[3] = gBattleAnimArgs[2]; //Speed sprite->callback = SpriteCB_FallingObjectStep; } } static void SpriteCB_FallingObjectStep(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->y2 += sprite->data[3]; if (sprite->y2 >= 0) { sprite->y2 = 0; sprite->data[0]++; } break; case 1: if (++sprite->data[1] > 0) { sprite->data[1] = 0; sprite->invisible ^= 1; if (++sprite->data[2] == 10) DestroySpriteAndMatrix(sprite); } break; } } static void SpriteCB_SunsteelStrikeRings(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x = 272; sprite->y = -32; } else { sprite->x = -32; sprite->y = -32; } sprite->data[0] = gBattleAnimArgs[0]; sprite->data[1] = sprite->x; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[3] = sprite->y; sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); InitAnimLinearTranslation(sprite); sprite->callback = AnimFlyBallAttack_Step; } //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 static void SpriteCB_MoongeistCharge(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; //Target X sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; //Target Y sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); sprite->callback = AnimMissileArc_Step; } //Spins a sprite towards the target, pausing in the middle. //Used in Mind Blown. //arg 0: duration step 1 (attacker -> center) //arg 1: duration step 2 (spin center) //arg 2: duration step 3 (center -> target) static void SpriteCB_MindBlownBall(struct Sprite *sprite) { s16 oldPosX = sprite->x; s16 oldPosY = sprite->y; sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3); sprite->data[0] = 0; sprite->data[1] = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[1]; sprite->data[3] = gBattleAnimArgs[2]; sprite->data[4] = sprite->x << 4; sprite->data[5] = sprite->y << 4; sprite->data[6] = ((oldPosX - sprite->x) << 4) / (gBattleAnimArgs[0] << 1); sprite->data[7] = ((oldPosY - sprite->y) << 4) / (gBattleAnimArgs[0] << 1); sprite->callback = AnimMindBlownBallStep; } static void AnimMindBlownBallStep(struct Sprite *sprite) { switch (sprite->data[0]) { case 0: sprite->data[4] += sprite->data[6]; sprite->data[5] += sprite->data[7]; sprite->x = sprite->data[4] >> 4; sprite->y = sprite->data[5] >> 4; sprite->data[1] -= 1; if (sprite->data[1] > 0) break; sprite->data[0] += 1; break; case 1: sprite->data[2] -= 1; if (sprite->data[2] > 0) break; sprite->data[1] = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[2] = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[4] = sprite->x << 4; sprite->data[5] = sprite->y << 4; sprite->data[6] = ((sprite->data[1] - sprite->x) << 4) / sprite->data[3]; sprite->data[7] = ((sprite->data[2] - sprite->y) << 4) / sprite->data[3]; sprite->data[0] += 1; break; case 2: sprite->data[4] += sprite->data[6]; sprite->data[5] += sprite->data[7]; sprite->x = sprite->data[4] >> 4; sprite->y = sprite->data[5] >> 4; sprite->data[3] -= 1; if (sprite->data[3] > 0) break; sprite->x = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->y = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] += 1; break; case 3: DestroySpriteAndMatrix(sprite); break; } } static void SpriteCB_MindBlownExplosion(struct Sprite *sprite) { u8 a; u8 b; u16 x; u16 y; if (gBattleAnimArgs[4] == 0) { DestroyAnimSprite(sprite); } else { a = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_X_2); b = GetProperCentredCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); sprite->data[0] = gBattleAnimArgs[4]; if (gBattleAnimArgs[1] == 0) { sprite->x = gBattleAnimArgs[2] + a; sprite->y = gBattleAnimArgs[3] + b; sprite->data[5] = a; sprite->data[6] = b; } else { sprite->x = a; sprite->y = b; sprite->data[5] = gBattleAnimArgs[2] + a; sprite->data[6] = gBattleAnimArgs[3] + b; } x = sprite->x; sprite->data[1] = x * 16; y = sprite->y; sprite->data[2] = y * 16; sprite->data[3] = (sprite->data[5] - sprite->x) * 16 / gBattleAnimArgs[4]; sprite->data[4] = (sprite->data[6] - sprite->y) * 16 / gBattleAnimArgs[4]; sprite->callback = AnimNeedleArmSpike_Step; } } void SpriteCB_RandomCentredHits(struct Sprite *sprite) { if (gBattleAnimArgs[1] == -1) gBattleAnimArgs[1] = Random() & 3; StartSpriteAffineAnim(sprite, gBattleAnimArgs[1]); if (gBattleAnimArgs[0] == 0) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) InitSpritePosToAnimAttackersCentre(sprite, FALSE); else InitSpritePosToAnimAttacker(sprite, FALSE); } else { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); } sprite->x2 += (Random() % 48) - 24; sprite->y2 += (Random() % 24) - 12; StoreSpriteCallbackInData6(sprite, DestroySpriteAndMatrix); sprite->callback = RunStoredCallbackWhenAffineAnimEnds; } //Creates a jaw that bites down and locks on the target. //args: Idk same as bite and crunch //arg 6: Time to hold bite for. static void SpriteCB_LockingJaw(struct Sprite *sprite) { sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; StartSpriteAffineAnim(sprite, gBattleAnimArgs[2]); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[4]; sprite->data[2] = gBattleAnimArgs[5]; sprite->data[6] = -gBattleAnimArgs[6]; sprite->callback = SpriteCB_LockingJawStep; } static void SpriteCB_LockingJawStep(struct Sprite *sprite) { sprite->data[4] += sprite->data[0]; sprite->data[5] += sprite->data[1]; sprite->x2 = sprite->data[4] >> 8; sprite->y2 = sprite->data[5] >> 8; if (++sprite->data[3] == sprite->data[2]) sprite->callback = SpriteCB_LockingJawFinish; } static void SpriteCB_LockingJawFinish(struct Sprite *sprite) { if (--sprite->data[3] <= sprite->data[6]) DestroySpriteAndMatrix(sprite); } //Creates a sprite that moves left then right along the target. //arg 0: Slice distance //arg 1: Speed static void SpriteCB_LeftRightSlice(struct Sprite *sprite) { sprite->x2 = gBattleAnimArgs[0]; sprite->data[0] = -gBattleAnimArgs[0]; //Slice distance sprite->data[1] = gBattleAnimArgs[1]; //Slice speed sprite->callback = SpriteCB_LeftRightSliceStep0; } static void SpriteCB_LeftRightSliceStep1(struct Sprite *sprite) { sprite->x2 += sprite->data[1]; if (sprite->x2 >= sprite->data[0]) DestroyAnimSprite(sprite); } static void SpriteCB_LeftRightSliceStep0(struct Sprite *sprite) { sprite->x2 -= sprite->data[1]; if (sprite->x2 <= sprite->data[0]) { sprite->data[0] = -sprite->data[0]; sprite->callback = SpriteCB_LeftRightSliceStep1; } } //Creates a rock that bounces between the attacker's feet. //arg 0: initial x pixel offset //arg 1: initial y pixel offset //arg 2: Ignore horizontal motion if TRUE. Only bounce once. #define sVerticalTime sprite->data[0] #define sHorizontalTime sprite->data[1] #define sMovingBackHorizontally sprite->data[2] static void SpriteCB_PyroBallRockBounceStep(struct Sprite *sprite) { s8 initialVerticalVelocity; s8 initialHorizontalVelocity; if (sprite->y2 > 0) //Rock returned back down { if (gBattleAnimArgs[2] || sMovingBackHorizontally) //Finished moving from left to right DestroyAnimSprite(sprite); else { sVerticalTime = 0; sMovingBackHorizontally = TRUE; } } initialVerticalVelocity = -6; initialHorizontalVelocity = -1; //Starts by moving right to left //vi = -6 //g = 0.25 (gravity not negative b/c go up to go closer to 0) //h = vi*t + 0.5g*t^2 //t = sVerticalTime sprite->y2 = (initialVerticalVelocity * sVerticalTime + (1 * sVerticalTime * sVerticalTime) / 4); //x = vi*t //vi = sprite->data[2] //t = sHorizontalTime if (!gBattleAnimArgs[2]) sprite->x2 = (initialHorizontalVelocity * sHorizontalTime); sVerticalTime++; if (sMovingBackHorizontally) sHorizontalTime--; //Move left to right else sHorizontalTime++; //Move right to left } static void InitSpritePositionForPyroBall(struct Sprite *sprite) { InitSpritePosToAnimAttacker(sprite, 0); sprite->y += 20; //Move closer to attacker's feet if (GetBattlerSide(gBattleAnimAttacker) == B_SIDE_PLAYER) sprite->y += 20; //Move below the text box } static void SpriteCB_PyroBallRockBounce(struct Sprite *sprite) { InitSpritePositionForPyroBall(sprite); sprite->callback = SpriteCB_PyroBallRockBounceStep; } #undef sVerticalTime #undef sHorizontalTime #undef sMovingBackHorizontally //Launches a projectile from the attacker's feet at the target. //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 static void SpriteCB_PyroBallLaunch(struct Sprite *sprite) { InitSpritePositionForPyroBall(sprite); if (GetBattlerSide(gBattleAnimAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; //Target X sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; //Target Y sprite->data[5] = gBattleAnimArgs[5]; InitAnimArcTranslation(sprite); sprite->callback = AnimMissileArc_Step; } //Throws acid at a single target. static void SpriteCB_AcidLaunchSingleTarget(struct Sprite *sprite) { s16 l1, l2; if (!gBattleAnimArgs[3]) StartSpriteAnim(sprite, 2); InitSpritePosToAnimTarget(sprite, TRUE); l1 = sprite->x; l2 = sprite->y; InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker)) gBattleAnimArgs[4] = -gBattleAnimArgs[4]; sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = l1 + gBattleAnimArgs[4]; sprite->data[4] = l2 + gBattleAnimArgs[5]; sprite->data[5] = -30; InitAnimArcTranslation(sprite); sprite->callback = AnimAcidPoisonBubble_Step; } //Causes acid to drip down a single target. static void SpriteCB_AcidDripSingleTarget(struct Sprite *sprite) { if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[0] = -gBattleAnimArgs[0]; sprite->x += gBattleAnimArgs[0]; sprite->y += gBattleAnimArgs[1]; sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = sprite->x + gBattleAnimArgs[2]; sprite->data[4] = sprite->y + sprite->data[0]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } //Causes an object to fall from the sky. //arg 0: initial x pixel offset //arg 1: initial y pixel offset //arg 2: anim battler static void SpriteCB_WaterDroplet(struct Sprite *sprite) { u8 target = LoadBattleAnimTarget(2); if (!IsBattlerSpriteVisible(target)) DestroyAnimSprite(sprite); else { InitSpritePosToGivenTarget(sprite, target); sprite->data[1] = sprite->y; //Target's y coord sprite->x2 = gBattleAnimArgs[0]; sprite->y2 = 0; //Put droplet at the top of the screen sprite->y = 15; sprite->callback = SpriteCB_WaterDropletDrip; } } static void SpriteCB_WaterDropletDrip(struct Sprite *sprite) { sprite->data[0] = 12; StartSpriteAnim(sprite, 0); sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, SpriteCB_WaterDropletDrop); } static void SpriteCB_WaterDropletDrop(struct Sprite *sprite) { sprite->y2 += 4; if (sprite->y2 >= sprite->data[1]) { sprite->data[0] = 19; StartSpriteAnim(sprite, 1); sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } } static void SpriteCB_AnimSpriteOnSelectedMonPos(struct Sprite *sprite) { if (!sprite->data[0]) { u8 target = LoadBattleAnimTarget(2); if (!IsBattlerSpriteVisible(target)) DestroyAnimSprite(sprite); else { InitSpritePosToGivenTarget(sprite, target); sprite->data[0]++; } } else if (sprite->animEnded || sprite->affineAnimEnded) { DestroySpriteAndMatrix(sprite); } } static void SpriteCB_SurroundingRing(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 0); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 1) + 40; sprite->data[0] = 13; sprite->data[2] = sprite->x; sprite->data[4] = sprite->y - 72; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } //Imitates launching a beam of light towards the sky //arg 0: initial x pixel offset //arg 1: initial y pixel offset //arg 2: battler //arg 3: duration //arg 4: Anim num //arg 5: affine anim start delay static void SpriteCB_PhotonGeyserBeam(struct Sprite *sprite) { u8 target = LoadBattleAnimTarget(2); if (!IsBattlerSpriteVisible(target)) DestroyAnimSprite(sprite); else { InitSpritePosToGivenTarget(sprite, target); StartSpriteAnim(sprite, gBattleAnimArgs[4]); sprite->data[0] = gBattleAnimArgs[3]; sprite->data[1] = gBattleAnimArgs[5]; sprite->callback = SpriteCB_BeamUpStep; } } //Animates the beam of light static void SpriteCB_BeamUpStep(struct Sprite *sprite) { if (sprite->data[1]-- == 0) StartSpriteAffineAnim(sprite, 1); if (sprite->data[0]-- <= 0) DestroySpriteAndMatrix(sprite); } static void SpriteCB_CentredElectricity(struct Sprite *sprite) { if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimTarget(sprite, FALSE); sprite->oam.tileNum += gBattleAnimArgs[3] * 4; if (gBattleAnimArgs[3] == 1) sprite->oam.matrixNum = 8; else if (gBattleAnimArgs[3] == 2) sprite->oam.matrixNum = 16; sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } static void AnimSkyDropBallUp(struct Sprite *sprite) { InitSpritePosToAnimTarget(sprite, TRUE); sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = gBattleAnimArgs[3]; sprite->callback = AnimFlyBallUp_Step; gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)].invisible = TRUE; } static void SpriteCB_SearingShotRock(struct Sprite *sprite) { u8 target = LoadBattleAnimTarget(4); if (!IsBattlerSpriteVisible(target)) { DestroyAnimSprite(sprite); } else { InitSpritePosToGivenTarget(sprite, target); StartSpriteAnim(sprite, gBattleAnimArgs[2]); sprite->data[0] = gBattleAnimArgs[3]; sprite->callback = WaitAnimForDuration; StoreSpriteCallbackInData6(sprite, AnimSpinningKickOrPunchFinish); } } static void AnimHappyHourCoinShower(struct Sprite *sprite) { if (gBattleAnimArgs[3] != 0) SetAverageBattlerPositions(gBattleAnimAttacker, 0, &sprite->x, &sprite->y); //coin shower on attacker sprite->x += gBattleAnimArgs[0]; sprite->y += 14; StartSpriteAnim(sprite, gBattleAnimArgs[1]); AnimateSprite(sprite); sprite->data[0] = 0; sprite->data[1] = 0; sprite->data[2] = 4; sprite->data[3] = 16; sprite->data[4] = -70; sprite->data[5] = gBattleAnimArgs[2]; StoreSpriteCallbackInData6(sprite, AnimFallingRock_Step); sprite->callback = TranslateSpriteInEllipse; sprite->callback(sprite); } //Launches an object upwards like they were being shot from a geyser //arg 0: null //arg 1: initial x pixel offset //arg 2: initial y pixel offset static void SpriteCB_Geyser(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, 2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, 3) + gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1; sprite->callback = AnimMudSportDirtRising; } //Launches an object upwards like they were being shot from a geyser //arg 0: null //arg 1: initial x pixel offset //arg 2: initial y pixel offset static void SpriteCB_GeyserTarget(struct Sprite *sprite) { sprite->x = GetBattlerSpriteCoord(gBattleAnimTarget, 2) + gBattleAnimArgs[1]; sprite->y = GetBattlerSpriteCoord(gBattleAnimTarget, 3) + gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[1] > 0 ? 1 : -1; sprite->callback = AnimMudSportDirtRising; } // Anim Tasks Functions #define tSpriteId data[0] #define tTimer data[1] #define tInitialXPos data[2] #define tInitialYPos data[3] #define tSide data[4] #define tAnimLengthTime data[5] static const s8 sHomerunEnemyHorizontalMovement[] = { 3, 3, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, }; static const s8 sHomerunEnemyVerticalMovement[] = { -4, -4, -4, -4, -4, -3, -3, -2, -2, -1, -1, -1, -1, -1, -1, -1, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 0, }; void AnimTask_TwinkleTackleLaunchStep(u8 taskId) { u16 rotation; s16 xScale, yScale; struct Task* task = &gTasks[taskId]; struct Sprite *sprite = &gSprites[task->tSpriteId]; if (task->tTimer > task->tAnimLengthTime) { if (task->tTimer > task->tAnimLengthTime + 5) //Wait an extra few frames so the glint can be placed on the target { sprite->x = task->tInitialXPos; sprite->y = task->tInitialYPos; ResetSpriteRotScale(task->tSpriteId); DestroyAnimVisualTask(taskId); } else ++task->tTimer; return; } else if ((u16) task->tTimer < NELEMS(sHomerunEnemyHorizontalMovement)) { s8 movement = sHomerunEnemyHorizontalMovement[task->tTimer]; if (task->tSide == B_SIDE_PLAYER) movement *= -1; sprite->x += movement; movement = sHomerunEnemyVerticalMovement[task->tTimer]; if (task->tSide == B_SIDE_PLAYER) movement *= -1; sprite->y += movement; } xScale = 0x180; yScale = 0x180; rotation = (task->tTimer << 4) + (task->tTimer << 3); xScale += rotation; yScale += rotation; rotation <<= 7; if (task->tSide == B_SIDE_OPPONENT) rotation *= -1; SetSpriteRotScale(task->tSpriteId, xScale, yScale, rotation); if (++task->tTimer > task->tAnimLengthTime) sprite->invisible = TRUE; } //Launches the target in Twinkle Tackle //arg 0: Anim time void AnimTask_TwinkleTackleLaunch(u8 taskId) { struct Task* task = &gTasks[taskId]; task->tSpriteId = GetAnimBattlerSpriteId(ANIM_TARGET); task->tSide = GetBattlerSide(gBattleAnimTarget); task->tAnimLengthTime = gBattleAnimArgs[0]; task->tInitialXPos = gSprites[task->tSpriteId].x; task->tInitialYPos = gSprites[task->tSpriteId].y; task->tTimer = 0; task->func = AnimTask_TwinkleTackleLaunchStep; PrepareBattlerSpriteForRotScale(task->tSpriteId, ST_OAM_OBJ_NORMAL); } #undef tSpriteId #undef tTimer #undef tInitialXPos #undef tInitialYPos #undef tSide #undef tAnimLengthTime void AnimTask_GetTimeOfDay(u8 taskId) { gBattleAnimArgs[0] = 0; //Daytime is default RtcCalcLocalTime(); if (gLocalTime.hours >= 20 || gLocalTime.hours < 4) gBattleAnimArgs[0] = 1; else if (gLocalTime.hours >= 17 && gLocalTime.hours < 20) gBattleAnimArgs[0] = 2; DestroyAnimVisualTask(taskId); } void AnimTask_GetLycanrocForm(u8 taskId) { if (GetMonData(GetIllusionMonPtr(gBattleAnimAttacker), MON_DATA_SPECIES) == SPECIES_LYCANROC_MIDNIGHT) gBattleAnimArgs[0] = 1; else gBattleAnimArgs[0] = 0; gBattleAnimArgs[0] = 0; DestroyAnimVisualTask(taskId); } // Scales up the target mon sprite // Used in Let's Snuggle Forever // No args. void AnimTask_GrowTarget(u8 taskId) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); PrepareBattlerSpriteForRotScale(spriteId, ST_OAM_OBJ_BLEND); SetSpriteRotScale(spriteId, 208, 208, 0); gTasks[taskId].data[0] = 120; gTasks[taskId].func = AnimTask_GrowStep; } static void AnimTask_GrowStep(u8 taskId) { if (--gTasks[taskId].data[0] == -1) { u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); ResetSpriteRotScale(spriteId); DestroyAnimVisualTask(taskId); } } // Uses a spotlight sprite as a light mask to illuminate the attacker. The spotlight grows and shrinks. // arg 0: initial x pixel offset // arg 1: initial y pixel offset // arg 2: duration of fully-opened spotlight static void AnimOceanicOperettaSpotlight(struct Sprite *sprite) { SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG_ALL | WINOUT_WIN01_OBJ | WINOUT_WIN01_CLR | WINOUT_WINOBJ_BG_ALL | WINOUT_WINOBJ_OBJ); SetGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_OBJWIN_ON); gBattle_WIN0H = 0; gBattle_WIN0V = 0; SetGpuReg(REG_OFFSET_WIN0H, gBattle_WIN0H); SetGpuReg(REG_OFFSET_WIN0V, gBattle_WIN0V); sprite->data[0] = gBattleAnimArgs[2]; InitSpritePosToAnimAttacker(sprite, FALSE); sprite->oam.objMode = ST_OAM_OBJ_WINDOW; sprite->invisible = TRUE; sprite->callback = AnimFlatterSpotlight_Step; } static void AnimTask_WaitAffineAnim(u8 taskId) { struct Task* task = &gTasks[taskId]; if (!RunAffineAnimFromTaskData(task)) DestroyAnimVisualTask(taskId); } void AnimTask_SquishTarget(u8 taskId) { struct Task* task = &gTasks[taskId]; u8 spriteId = GetAnimBattlerSpriteId(ANIM_TARGET); PrepareAffineAnimInTaskData(task, spriteId, sSquishTargetAffineAnimCmds); task->func = AnimTask_WaitAffineAnim; } void CoreEnforcerLoadBeamTarget(struct Sprite *sprite) { sprite->data[0] = gBattleAnimArgs[2]; sprite->data[1] = sprite->x; sprite->data[2] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_X_2)) / 2; sprite->data[3] = sprite->y; sprite->data[4] = (GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + GetBattlerSpriteCoord(BATTLE_PARTNER(gBattleAnimTarget), BATTLER_COORD_Y_PIC_OFFSET)) / 2; } void AnimTask_CreateBestowItem(u8 taskId) { u8 iconSpriteId = AddItemIconSprite(ANIM_TAG_ITEM_BAG, ANIM_TAG_ITEM_BAG, gLastUsedItem); if (iconSpriteId != MAX_SPRITES) { gSprites[iconSpriteId].oam.priority = 2; gSprites[iconSpriteId].callback = AnimThrowProjectile; ++gAnimVisualTaskCount; } DestroyAnimVisualTask(taskId); } //Creates purple flames that surround the target. //No args. void AnimTask_PurpleFlamesOnTarget(u8 taskId) { struct Task *task = &gTasks[taskId]; task->data[0] = 0; task->data[1] = 16; task->data[9] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); task->data[10] = GetBattlerYCoordWithElevation(gBattleAnimTarget); task->data[11] = (GetBattlerSpriteCoordAttr(gBattleAnimTarget, BATTLER_COORD_ATTR_WIDTH) / 2) + 8; task->data[7] = 0; task->data[5] = GetBattlerSpriteBGPriority(gBattleAnimTarget); task->data[6] = GetBattlerSpriteSubpriority(gBattleAnimTarget) - 2; task->data[3] = 0; task->data[4] = 16; SetGpuReg(REG_OFFSET_BLDCNT, (BLDCNT_EFFECT_BLEND | BLDCNT_TGT2_ALL)); SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(0, 0x10)); task->data[8] = 0; task->func = AnimTask_GrudgeFlames_Step; } void AnimTask_TechnoBlast(u8 taskId) { if (ItemId_GetHoldEffect(gBattleMons[gBattleAnimAttacker].item) == HOLD_EFFECT_DRIVE) gBattleAnimArgs[0] = ItemId_GetSecondaryId(gBattleMons[gBattleAnimAttacker].item); else gBattleAnimArgs[0] = 0; DestroyAnimVisualTask(taskId); } // Z MOVES //Creates a twinkle at the location the target was knocked too in Twinkle Tackle static void SpriteCB_TwinkleOnBattler(struct Sprite *sprite) { struct Sprite* monSprite; if (gBattleAnimArgs[2] == ANIM_TARGET) monSprite = &gSprites[GetAnimBattlerSpriteId(ANIM_TARGET)]; else monSprite = &gSprites[GetAnimBattlerSpriteId(ANIM_ATTACKER)]; sprite->x = monSprite->x; sprite->y = monSprite->y; sprite->x2 = monSprite->x2; sprite->y2 = monSprite->y2; sprite->callback = RunStoredCallbackWhenAnimEnds; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } void AnimTask_PrimalReversion(u8 taskId) { if (ItemId_GetId(gBattleMons[gBattleAnimAttacker].item) == ITEM_RED_ORB) gBattleAnimArgs[0] = ItemId_GetId(gBattleMons[gBattleAnimAttacker].item); else gBattleAnimArgs[0] = 0; DestroyAnimVisualTask(taskId); } void AnimTask_ShellSideArm(u8 taskId) { if (gBattleStruct->swapDamageCategory) gBattleAnimArgs[0] = TRUE; else gBattleAnimArgs[0] = FALSE; DestroyAnimVisualTask(taskId); } void AnimTask_TerrainPulse(u8 taskId) { if (IsBattlerTerrainAffected(gBattleAnimAttacker, STATUS_FIELD_TERRAIN_ANY)) { if (gFieldStatuses & STATUS_FIELD_ELECTRIC_TERRAIN) gBattleAnimArgs[0] = TYPE_ELECTRIC; else if (gFieldStatuses & STATUS_FIELD_GRASSY_TERRAIN) gBattleAnimArgs[0] = TYPE_GRASS; else if (gFieldStatuses & STATUS_FIELD_MISTY_TERRAIN) gBattleAnimArgs[0] = TYPE_FAIRY; else if (gFieldStatuses & STATUS_FIELD_PSYCHIC_TERRAIN) gBattleAnimArgs[0] = TYPE_PSYCHIC; else //failsafe gBattleAnimArgs[0] = 0; } else { gBattleAnimArgs[0] = 0; } DestroyAnimVisualTask(taskId); } void AnimTask_AffectionHangedOn(u8 taskId) { int side = GetBattlerSide(gBattleAnimTarget); struct Pokemon *party = (side == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; gBattleAnimArgs[0] = GetMonFriendshipScore(&party[gBattlerPartyIndexes[gBattleAnimTarget]]); DestroyAnimVisualTask(taskId); }