From e1e3bcfa915a7eb9b51db1cf89aed4766046a549 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 26 Jan 2025 11:08:46 +0100 Subject: [PATCH] Tera starstorm (#6073) Co-authored-by: Hedara --- data/battle_anim_scripts.s | 150 +++++++++++++++++- .../battle_anims/sprites/starstorm_beam.png | Bin 0 -> 300 bytes include/battle_anim.h | 1 + include/constants/battle_anim.h | 1 + include/graphics.h | 2 + src/battle_anim_effects_1.c | 150 ++++++++++++++++++ src/data/battle_anim.h | 2 + src/graphics.c | 3 + 8 files changed, 308 insertions(+), 1 deletion(-) create mode 100644 graphics/battle_anims/sprites/starstorm_beam.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index b5f83b2d23..58d9ddafd8 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -18066,6 +18066,155 @@ PopulationBombContinue: gBattleAnimMove_RevivalBlessing:: goto gBattleAnimMove_LunarBlessing +gBattleAnimMove_TeraStarstorm:: + loadspritegfx ANIM_TAG_STARSTORM + loadspritegfx ANIM_TAG_YELLOW_STAR + loadspritegfx ANIM_TAG_IMPACT + fadetobg BG_COSMIC + waitbgfadein + playsewithpan SE_FALL, SOUND_PAN_ATTACKER + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + call TeraStarstormCreateBeam + delay 2 + jumpifmovetypeequal TYPE_STELLAR, TeraStarstormStellar + goto TeraStarstormSingle +TeraStarstormStellar: + jumpifdoublebattle TeraStarstormDouble +TeraStarstormSingle: + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, -5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 5, 30, 0, 1 + delay 3 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + waitforvisualfinish + restorebg + waitbgfadeout + end +TeraStarstormDouble: + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 10, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 10, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 0, 0, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -10, 0, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, -5, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 2 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, 5, 5, 30, 1, 1 + delay 3 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 0, 1 + createsprite gTeraStarSpriteTemplate, ANIM_BATTLER, 3, 0, 0, -5, 5, 30, 1, 1 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + delay 5 + playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET + createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 5, 1, 1 + createvisualtask AnimTask_ShakeMon, 2, ANIM_DEF_PARTNER, 5, 5, 1, 1 + waitforvisualfinish + restorebg + waitbgfadeout + end + +TeraStarstormCreateBeam:: + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -3, 1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 1, 0, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 3, -1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -2, 0, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 0, 1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, -1, -1, 0, 0, 20 + createsprite gTeraStarstormBeamSpriteTemplate, ANIM_BATTLER, 1, 2, 0, 0, 0, 20 + return + gBattleAnimMove_TeraBlast:: gBattleAnimMove_OrderUp:: gBattleAnimMove_GlaiveRush:: @@ -18083,7 +18232,6 @@ gBattleAnimMove_CombatTorque:: gBattleAnimMove_MagicalTorque:: gBattleAnimMove_Psyblade:: gBattleAnimMove_MatchaGotcha:: -gBattleAnimMove_TeraStarstorm:: gBattleAnimMove_MightyCleave:: gBattleAnimMove_TachyonCutter:: gBattleAnimMove_SupercellSlam:: diff --git a/graphics/battle_anims/sprites/starstorm_beam.png b/graphics/battle_anims/sprites/starstorm_beam.png new file mode 100644 index 0000000000000000000000000000000000000000..f4dced0a3575ba27b788edb3a3daa7659ae76e03 GIT binary patch literal 300 zcmeAS@N?(olHy`uVBq!ia0vp^0zj<5!3-pI!a4o{DaPU;cPEB*=VV?2IR*hfA+9qn zEC4d2OxaDGW?WZ`OiB&Ws`QIVIO02f-q*~De)~SHTJyN-$>+&mAOHEY?f?J(mmELz z12qVg1o;Is0Qtz^KtQ)MP_EC@#W6%5CuT1+Tfl7Bu-#*Z*sg{bg^WxIsxzv&6687FGVD-&_e}3kLu=wP zdata[0] = gBattleAnimArgs[4]; + sprite->data[3] = 0; + sprite->data[4] = -70; + InitAnimLinearTranslation(sprite); + sprite->callback = AnimTeraStarstormBeam_Step; + sprite->affineAnimPaused = TRUE; + sprite->callback(sprite); + +} + +static void AnimTeraStarstormBeam_Step(struct Sprite *sprite) +{ + if (AnimTranslateLinear(sprite)) + DestroyAnimSprite(sprite); +} + +const union AffineAnimCmd gTeraStarAffineAnimCmds[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd *const gTeraStarAffineAnimTable[] = { + gTeraStarAffineAnimCmds, +}; + +// arg0: start offset x +// arg1: start offset y +// arg2: end offset x +// arg3: end offset y +// arg4: duration +// arg5: target partner +// arg6: ????? +const struct SpriteTemplate gTeraStarSpriteTemplate = +{ + .tileTag = ANIM_TAG_YELLOW_STAR, + .paletteTag = ANIM_TAG_YELLOW_STAR, + .oam = &gOamData_AffineNormal_ObjNormal_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gTeraStarAffineAnimTable, + .callback = AnimTeraStarstormStars, +}; + + +void AnimTeraStarstormStars(struct Sprite *sprite) +{ + gBattleAnimArgs[0] += 4; + gBattleAnimArgs[1] -= 100; + InitSpritePosToAnimAttacker(sprite, TRUE); + + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[1] = sprite->x; + sprite->data[3] = sprite->y; + if (gBattleAnimArgs[5] == 1) + { + u32 targetPartner; + if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) + { + if (gBattleAnimTarget == 0) + targetPartner = 2; + else + targetPartner = 0; + } + else + { + if (gBattleAnimTarget == 1) + targetPartner = 3; + else + targetPartner = 1; + } + sprite->data[2] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_X_2) + gBattleAnimArgs[2] ; + sprite->data[4] = GetBattlerSpriteCoord(targetPartner, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + } + else + { + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2] ; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + } + InitAnimLinearTranslation(sprite); + sprite->callback = AnimTeraStarstormStars_Step; + sprite->affineAnimPaused = TRUE; + sprite->callback(sprite); +} + +static void AnimTeraStarstormStars_Step(struct Sprite *sprite) +{ + if (AnimTranslateLinear(sprite)) + DestroyAnimSprite(sprite); + if ((u16)gBattleAnimArgs[7] == 0xFFFF) + { + StartSpriteAnim(sprite, 1); + sprite->affineAnimPaused = FALSE; + } +} + // Animates a sprite that moves linearly from one location to another, with a // single-cycle sine wave added to the y position along the way. // Used by Razor Leaf and Magical Leaf. diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index a09c8d72c8..5f1643f82d 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1466,6 +1466,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_Beam, 0x0800, ANIM_TAG_BEAM}, {gBattleAnimSpriteGfx_PurpleChain, 0x1000, ANIM_TAG_PURPLE_CHAIN}, {gBattleAnimSpriteGfx_PinkVioletOrb, 0x0080, ANIM_TAG_PINKVIO_ORB}, + {gBattleAnimSpriteGfx_TeraStarstormBeam, 0x200, ANIM_TAG_STARSTORM}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1933,6 +1934,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Beam, ANIM_TAG_BEAM}, {gBattleAnimSpritePal_PurpleChain, ANIM_TAG_PURPLE_CHAIN}, {gBattleAnimSpritePal_PinkVioletOrb, ANIM_TAG_PINKVIO_ORB}, + {gBattleAnimSpritePal_TeraStarstormBeam, ANIM_TAG_STARSTORM}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/graphics.c b/src/graphics.c index bc510d9d96..19b9570079 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -1287,6 +1287,9 @@ const u32 gBattleAnimSpritePal_Meteor[] = INCBIN_U32("graphics/battle_anims/spri const u32 gBattleAnimSpriteGfx_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.4bpp.lz"); const u32 gBattleAnimSpritePal_FlatRock[] = INCBIN_U32("graphics/battle_anims/sprites/flat_rock.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.4bpp.lz"); +const u32 gBattleAnimSpritePal_TeraStarstormBeam[] = INCBIN_U32("graphics/battle_anims/sprites/starstorm_beam.gbapal.lz"); + const u32 gBattleAnimUnusedPal_Unknown2[] = INCBIN_U32("graphics/battle_anims/unused/unknown_2.gbapal.lz"); #include "data/graphics/trainers.h"