From d495e177b96b488847660b970c321bd246f7c4a3 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sun, 22 Oct 2023 14:15:07 -0500 Subject: [PATCH] Add Snow weather animation (#3440) * Snow weather animation * Update battle_anim_scripts.s * Apply changes from review --- data/battle_anim_scripts.s | 21 +++--- graphics/battle_anims/sprites/snowflakes.png | Bin 0 -> 6037 bytes include/constants/battle_anim.h | 1 + include/graphics.h | 2 + src/battle_anim_ice.c | 68 +++++++++++++++++++ src/data/battle_anim.h | 2 + src/graphics.c | 3 + 7 files changed, 89 insertions(+), 8 deletions(-) create mode 100644 graphics/battle_anims/sprites/snowflakes.png diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index b2cd95ca27..2c171356a7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -898,7 +898,7 @@ gBattleAnims_Moves:: .4byte Move_SOUL_STEALING_7_STAR_STRIKE @@@@ MAX MOVES .4byte Move_MAX_GUARD - .4byte Move_MAX_STRIKE + .4byte Move_MAX_STRIKE .4byte Move_MAX_KNUCKLE .4byte Move_MAX_AIRSTREAM .4byte Move_MAX_OOZE @@ -15161,16 +15161,21 @@ Move_SILK_TRAP:: clearmonbg ANIM_ATK_PARTNER end -@ Also used by Snow weather. Currently identical with Move_HAIL +@ Also used by Snow weather. Credits to Dat.H A Move_SNOWSCAPE:: - loadspritegfx ANIM_TAG_HAIL - loadspritegfx ANIM_TAG_ICE_CRYSTALS - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 0, 6, RGB_BLACK + loadspritegfx ANIM_TAG_SNOWFLAKES + playsewithpan SE_M_GUST, SOUND_PAN_ATTACKER + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS), 2, 0, 4, RGB(11, 18, 22) waitforvisualfinish - createvisualtask AnimTask_Hail, 5 - loopsewithpan SE_M_HAIL, 0, 8, 10 + createvisualtask AnimTask_CreateSnowflakes, 2, 0, 3, 120 + createvisualtask AnimTask_CreateSnowflakes, 2, 0, 3, 120 + createvisualtask AnimTask_CreateSnowflakes, 2, 0, 3, 120 + delay 120 + playsewithpan SE_M_GUST2, SOUND_PAN_ATTACKER + delay 30 + waitforvisualfinish + createvisualtask AnimTask_BlendBattleAnimPal, 10, (F_PAL_BG | F_PAL_BATTLERS), 2, 4, 0, RGB(11, 18, 22) waitforvisualfinish - createvisualtask AnimTask_BlendBattleAnimPal, 10, F_PAL_BG, 3, 6, 0, RGB_BLACK end @Credits to Skeli diff --git a/graphics/battle_anims/sprites/snowflakes.png b/graphics/battle_anims/sprites/snowflakes.png new file mode 100644 index 0000000000000000000000000000000000000000..4f4334b3b9e05f3efeb75b6ab515df5f08060c54 GIT binary patch literal 6037 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 - gAnimDisableStructPtr->rolloutTimer - 1; DestroyAnimVisualTask(taskId); } + +static const union AnimCmd sAnim_Snowflakes[] = +{ + ANIMCMD_FRAME(0, 2), + ANIMCMD_FRAME(8, 2), + ANIMCMD_FRAME(16, 2), + ANIMCMD_FRAME(24, 6), + ANIMCMD_FRAME(32, 2), + ANIMCMD_FRAME(40, 2), + ANIMCMD_FRAME(48, 2), + ANIMCMD_END, +}; + +static const union AnimCmd *const sAnims_Snowflakes[] = +{ + sAnim_Snowflakes, +}; + +const struct SpriteTemplate gSnowFlakesSpriteTemplate = +{ + .tileTag = ANIM_TAG_SNOWFLAKES, + .paletteTag = ANIM_TAG_SNOWFLAKES, + .oam = &gOamData_AffineOff_ObjNormal_16x32, + .anims = sAnims_Snowflakes, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimSnowflakes, +}; + +void AnimTask_CreateSnowflakes(u8 taskId) +{ + u8 x, y; + + if (gTasks[taskId].data[0] == 0) + { + gTasks[taskId].data[1] = gBattleAnimArgs[0]; + gTasks[taskId].data[2] = gBattleAnimArgs[1]; + gTasks[taskId].data[3] = gBattleAnimArgs[2]; + } + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1) + { + x = Random2() % DISPLAY_WIDTH; + y = Random2() % (DISPLAY_HEIGHT / 2); + CreateSprite(&gSnowFlakesSpriteTemplate, x, y, 4); + } + if (gTasks[taskId].data[0] == gTasks[taskId].data[3]) + DestroyAnimVisualTask(taskId); +} + +static void AnimSnowflakes(struct Sprite *sprite) +{ + sprite->callback = AnimSnowflakes_Step; +} + +static void AnimSnowflakes_Step(struct Sprite *sprite) +{ + if (++sprite->data[0] <= 13) + { + sprite->x2++; + sprite->y2 += 2; + sprite->x2--; + } + if (sprite->animEnded) + DestroySprite(sprite); +} diff --git a/src/data/battle_anim.h b/src/data/battle_anim.h index 885038725c..d342ccbae5 100644 --- a/src/data/battle_anim.h +++ b/src/data/battle_anim.h @@ -1448,6 +1448,7 @@ const struct CompressedSpriteSheet gBattleAnimPicTable[] = {gBattleAnimSpriteGfx_AuraSphere, 0x200, ANIM_TAG_POLTERGEIST}, {gBattleAnimSpriteGfx_Teapot, 0x1800, ANIM_TAG_TEAPOT}, {gBattleAnimSpriteGfx_WoodHammerHammer, 0x800, ANIM_TAG_WOOD_HAMMER_HAMMER}, + {gBattleAnimSpriteGfx_Snowflakes, 0x0700, ANIM_TAG_SNOWFLAKES}, }; const struct CompressedSpritePalette gBattleAnimPaletteTable[] = @@ -1896,6 +1897,7 @@ const struct CompressedSpritePalette gBattleAnimPaletteTable[] = {gBattleAnimSpritePal_Poltergeist, ANIM_TAG_POLTERGEIST}, {gBattleAnimSpritePal_Teapot, ANIM_TAG_TEAPOT}, {gBattleAnimSpritePal_WoodHammerHammer, ANIM_TAG_WOOD_HAMMER_HAMMER}, + {gBattleAnimSpritePal_RainDrops, ANIM_TAG_SNOWFLAKES}, }; const struct BattleAnimBackground gBattleAnimBackgroundTable[] = diff --git a/src/graphics.c b/src/graphics.c index 0549e4476b..d152d081c0 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -448,6 +448,9 @@ const u32 gBattleAnimSpritePal_SpinningBall2[] = INCBIN_U32("graphics/battle_ani const u32 gBattleAnimSpriteGfx_WoodHammerHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer_hammer.4bpp.lz"); const u32 gBattleAnimSpritePal_WoodHammerHammer[] = INCBIN_U32("graphics/battle_anims/sprites/wood_hammer_hammer.gbapal.lz"); +const u32 gBattleAnimSpriteGfx_Snowflakes[] = INCBIN_U32("graphics/battle_anims/sprites/snowflakes.4bpp.lz"); +const u32 gBattleAnimSpritePal_Snowflakes[] = INCBIN_U32("graphics/battle_anims/sprites/snowflakes.gbapal.lz"); + // old battle interface data, unused const u32 gOldBattleInterfaceGfx[] = INCBIN_U32("graphics/unused/obi1.4bpp.lz");