diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 09ef8d35a6..60fdb94f64 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -134,7 +134,7 @@ gBattleAnims_Moves:: .4byte Move_FOCUS_ENERGY .4byte Move_BIDE .4byte Move_METRONOME - .4byte Move_MIRROR_MOVE @ doesn't have an actual animation + .4byte Move_MIRROR_MOVE @ doesn´t have an actual animation .4byte Move_SELF_DESTRUCT .4byte Move_EGG_BOMB .4byte Move_LICK @@ -1889,11 +1889,80 @@ Move_FIRE_FANG: end Move_SHADOW_SNEAK: - end - + loadspritegfx ANIM_TAG_LICK + setalpha 0, 16 + delay 1 + createvisualtask sub_81143C0, 2 + delay 1 + createvisualtask sub_8113BAC, 5 + playsewithpan SE_W060, SOUND_PAN_ATTACKER + delay 48 + playsewithpan SE_W060B, SOUND_PAN_ATTACKER + waitforvisualfinish + createvisualtask sub_8114470, 2 + setalpha 0, 16 + delay 1 + playsewithpan SE_W122, SOUND_PAN_TARGET + createsprite gUnknown_08596D8C, ANIM_TARGET, 2, 0, 0 + createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 16, 1 + waitforvisualfinish + clearmonbg_23 ANIM_TARGET + delay 1 + blendoff + delay 1 + end + Move_MUD_BOMB: - end - + loadspritegfx ANIM_TAG_MUD_SAND + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 5 + playsewithpan SE_W145C, SOUND_PAN_ATTACKER + createsprite gMudBombToss, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 + delay 11 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 42, 27, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 42, 27, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -27, 44, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 39, -28, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -42, -42, 20 + playsewithpan SE_W233B, SOUND_PAN_TARGET + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 0, 40, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -8, -44, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -46, -28, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 46, 9, 20 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 42, 0, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -43, -12, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 16, -46, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -16, 44, 20 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 0, 40, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -8, -44, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -46, -28, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 46, 9, 20 + playsewithpan SE_W088, SOUND_PAN_TARGET + delay 5 + createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 3, 0, 5, 1 + createsprite gMudBombSplash, ANIM_TARGET, 2, 42, 0, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -43, -12, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, 16, -46, 20 + createsprite gMudBombSplash, ANIM_TARGET, 2, -16, 44, 20 + waitforvisualfinish + end + Move_PSYCHO_CUT: end diff --git a/src/ground.c b/src/ground.c index ae3cf6c3e0..79d44eaa08 100644 --- a/src/ground.c +++ b/src/ground.c @@ -12,10 +12,14 @@ void AnimDirtScatter(struct Sprite *); void AnimMudSportDirt(struct Sprite *); void AnimFissureDirtPlumeParticle(struct Sprite *); void AnimDigDirtMound(struct Sprite *); +void MudBombParticles(struct Sprite *); +void MudBombBall(struct Sprite *); static void AnimBonemerangProjectileStep(struct Sprite *); static void AnimBonemerangProjectileEnd(struct Sprite *); static void AnimMudSportDirtRising(struct Sprite *); static void AnimMudSportDirtFalling(struct Sprite *); +static void MudBombParticles_Callback(struct Sprite *); +static void MudBombBall_Callback(struct Sprite *); static void sub_8114CFC(u8); static void sub_8114EB4(u8); static void sub_8114F54(u8); @@ -27,6 +31,7 @@ static void sub_81154A4(u8); static void sub_8115588(struct Task *); static void sub_81156D0(u8); + const union AffineAnimCmd gUnknown_08597150[] = { AFFINEANIMCMD_FRAME(0x0, 0x0, 15, 1), @@ -137,6 +142,28 @@ const struct SpriteTemplate gUnknown_08597214 = .callback = AnimDigDirtMound, }; +const struct SpriteTemplate gMudBombSplash = +{ + .tileTag = ANIM_TAG_MUD_SAND, + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gUnknown_08524904, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = MudBombParticles, +}; + +const struct SpriteTemplate gMudBombToss = +{ + .tileTag = ANIM_TAG_MUD_SAND , + .paletteTag = ANIM_TAG_MUD_SAND, + .oam = &gUnknown_0852490C, + .anims = gUnknown_085971C8, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = MudBombBall, +}; + // Moves a bone projectile towards the target mon, which moves like // a boomerang. After hitting the target mon, it comes back to the user. void AnimBonemerangProjectile(struct Sprite *sprite) @@ -557,6 +584,53 @@ void AnimDigDirtMound(struct Sprite *sprite) sprite->callback = WaitAnimForDuration; } +//Lifted from sludge bomb +void MudBombParticles(struct Sprite *sprite) +{ + sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[0]; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[1]; + + InitSpriteDataForLinearTranslation(sprite); + + sprite->data[5] = sprite->data[1] / gBattleAnimArgs[2]; + sprite->data[6] = sprite->data[2] / gBattleAnimArgs[2]; + + sprite->callback = MudBombParticles_Callback; +} +//also lifted from sludge bomb +static void MudBombParticles_Callback(struct Sprite *sprite) +{ + TranslateSpriteLinearFixedPoint(sprite); + + sprite->data[1] -= sprite->data[5]; + sprite->data[2] -= sprite->data[6]; + + if (!sprite->data[0]) + DestroyAnimSprite(sprite); +} +//lifted from smokescreen +void MudBombBall(struct Sprite *sprite) +{ + InitSpritePosToAnimAttacker(sprite, 1); + if (GetBattlerSide(gBattleAnimAttacker)) + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + sprite->data[5] = gBattleAnimArgs[5]; + InitAnimArcTranslation(sprite); + + sprite->callback = MudBombBall_Callback; +} +//Also lifted form smokescreen +static void MudBombBall_Callback(struct Sprite *sprite) +{ + if (TranslateAnimHorizontalArc(sprite)) + DestroyAnimSprite(sprite); +} void sub_81152DC(u8 taskId) { u16 i;