From 050a9415c7fd32eabf11efe238a2a98dddf0a8e0 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Thu, 28 Nov 2024 13:27:44 +0000 Subject: [PATCH] Document battle_anim_bug.c --- asm/macros/battle_anim_script.inc | 28 ++++++++ data/battle_anim_scripts.s | 34 +++++----- src/battle_anim_bug.c | 108 +++++++++++++++--------------- 3 files changed, 99 insertions(+), 71 deletions(-) diff --git a/asm/macros/battle_anim_script.inc b/asm/macros/battle_anim_script.inc index 7abf5b8d28..e0fda482ba 100644 --- a/asm/macros/battle_anim_script.inc +++ b/asm/macros/battle_anim_script.inc @@ -312,6 +312,34 @@ .endif .endm + .macro create_megahorn_horn_sprite anim_battler:req, subpriority_offset:req, x1:req, y1:req, x2:req, y2:req, duration:req + createsprite gMegahornHornSpriteTemplate, \anim_battler, \subpriority_offset, \x1, \y1, \x2, \y2, \duration + .endm + + .macro create_leech_life_needle_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, duration:req + createsprite gLeechLifeNeedleSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \duration + .endm + + .macro create_web_thread_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, unk2:req, amplitude:req, targets_both:req + createsprite gWebThreadSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \unk2, \amplitude, \targets_both + .endm + + .macro create_string_wrap_sprite anim_battler:req, subpriority_offset:req, x:req, y:req + createsprite gStringWrapSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y + .endm + + .macro create_linear_stinger_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req + createsprite gLinearStingerSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration + .endm + + .macro create_pin_missile_sprite anim_battler:req, subpriority_offset:req, initial_x:req, initial_y:req, target_x:req, target_y:req, duration:req, wave_amplitude:req + createsprite gPinMissileSpriteTemplate, \anim_battler, \subpriority_offset, \initial_x, \initial_y, \target_x, \target_y, \duration, \wave_amplitude + .endm + + .macro create_tail_glow_orb_sprite anim_battler:req, subpriority_offset:req, relative_to:req + createsprite gTailGlowOrbSpriteTemplate, \anim_battler, \subpriority_offset, \relative_to + .endm + .macro create_confusion_duck_sprite anim_battler:req, subpriority_offset:req, x:req, y:req, wave_offset:req, wave_period:req, duration:req createsprite gConfusionDuckSpriteTemplate, \anim_battler, \subpriority_offset, \x, \y, \wave_offset, \wave_period, \duration .endm diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index e06960e9c1..5d79c375ed 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -706,15 +706,15 @@ Move_PIN_MISSILE: splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, -8, -8, 20, -32 + create_pin_missile_sprite ANIM_ATTACKER, 2, initial_x=20, initial_y=-8, target_x=-8, target_y=-8, duration=20, wave_amplitude=-32 delay 15 - createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 8, 8, 20, -40 + create_pin_missile_sprite ANIM_ATTACKER, 2, initial_x=20, initial_y=-8, target_x=8, target_y=8, duration=20, wave_amplitude=-40 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 2, 1 delay 9 - createsprite gPinMissileSpriteTemplate, ANIM_ATTACKER, 2, 20, -8, 0, 0, 20, -32 + create_pin_missile_sprite ANIM_ATTACKER, 2, initial_x=20, initial_y=-8, target_x=0, target_y=0, duration=20, wave_amplitude=-32 delay 4 playsewithpan SE_M_HORN_ATTACK, SOUND_PAN_TARGET create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=8, y=8, relative_to=ANIM_TARGET, animation=2 @@ -821,7 +821,7 @@ Move_POISON_STING: splitbgprio ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER - createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 0, -8, 0, 20 + create_linear_stinger_sprite ANIM_TARGET, 2, initial_x=20, initial_y=0, target_x=-8, target_y=0, duration=20 waitforvisualfinish create_basic_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 @@ -840,8 +840,8 @@ Move_TWINEEDLE: splitbgprio ANIM_TARGET setalpha 12, 8 loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 6, 2 - createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 10, -4, 0, -4, 20 - createsprite gLinearStingerSpriteTemplate, ANIM_TARGET, 2, 20, 12, 10, 12, 20 + create_linear_stinger_sprite ANIM_TARGET, 2, initial_x=10, initial_y=-4, target_x=0, target_y=-4, duration=20 + create_linear_stinger_sprite ANIM_TARGET, 2, initial_x=20, initial_y=12, target_x=10, target_y=12, duration=20 delay 20 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 5, 1 create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=-4, relative_to=ANIM_TARGET, animation=3 @@ -1307,9 +1307,9 @@ Move_SPIKE_CANNON: waitforvisualfinish loopsewithpan SE_M_RAZOR_WIND2, SOUND_PAN_ATTACKER, 5, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 - createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 10, -8, -8, -8, 20 - createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 18, 0, 0, 0, 20 - createsprite gLinearStingerSpriteTemplate, ANIM_ATTACKER, 2, 26, 8, 8, 8, 20 + create_linear_stinger_sprite ANIM_ATTACKER, 2, initial_x=10, initial_y=-8, target_x=-8, target_y=-8, duration=20 + create_linear_stinger_sprite ANIM_ATTACKER, 2, initial_x=18, initial_y=0, target_x=0, target_y=0, duration=20 + create_linear_stinger_sprite ANIM_ATTACKER, 2, initial_x=26, initial_y=8, target_x=8, target_y=8, duration=20 waitforvisualfinish create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=-8, y=-8, relative_to=ANIM_TARGET, animation=2 create_handle_invert_hitsplat_sprite ANIM_ATTACKER, 3, x=0, y=0, relative_to=ANIM_TARGET, animation=2 @@ -3893,7 +3893,7 @@ Move_TAIL_GLOW: setalpha 12, 8 simple_palette_blend selector=F_PAL_BG, delay=2, initial_blend_y=0, target_blend_y=4, color=RGB_BLACK waitforvisualfinish - createsprite gTailGlowOrbSpriteTemplate, ANIM_ATTACKER, 66, ANIM_ATTACKER + create_tail_glow_orb_sprite ANIM_ATTACKER, 66, relative_to=ANIM_ATTACKER delay 18 loopsewithpan SE_M_MORNING_SUN, SOUND_PAN_ATTACKER, 16, 6 waitforvisualfinish @@ -5884,7 +5884,7 @@ Move_LEECH_LIFE: splitbgprio_foes ANIM_TARGET setalpha 12, 8 delay 1 - createsprite gLeechLifeNeedleSpriteTemplate, ANIM_ATTACKER, 2, -20, 15, 12 + create_leech_life_needle_sprite ANIM_ATTACKER, 2, x=-20, y=15, duration=12 waitforvisualfinish create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=2 playsewithpan SE_M_ABSORB, SOUND_PAN_TARGET @@ -6117,7 +6117,7 @@ MegahornContinue: delay 10 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6 delay 3 - createsprite gMegahornHornSpriteTemplate, ANIM_ATTACKER, 3, -42, 25, 0, 0, 6 + create_megahorn_horn_sprite ANIM_ATTACKER, 3, x1=-42, y1=25, x2=0, y2=0, duration=6 delay 4 playsewithpan SE_M_VICEGRIP, SOUND_PAN_TARGET create_basic_hitsplat_sprite ANIM_ATTACKER, 2, x=0, y=0, relative_to=ANIM_TARGET, animation=0 @@ -7452,11 +7452,11 @@ Move_STRING_SHOT: call StringShotThread waitforvisualfinish playsewithpan SE_M_STRING_SHOT2, SOUND_PAN_TARGET - createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, 10 + create_string_wrap_sprite ANIM_TARGET, 2, x=0, y=10 delay 4 - createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, -2 + create_string_wrap_sprite ANIM_TARGET, 2, x=0, y=-2 delay 4 - createsprite gStringWrapSpriteTemplate, ANIM_TARGET, 2, 0, 22 + create_string_wrap_sprite ANIM_TARGET, 2, x=0, y=22 waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 @@ -7465,7 +7465,7 @@ Move_STRING_SHOT: end StringShotThread: - createsprite gWebThreadSpriteTemplate, ANIM_TARGET, 2, 20, 0, 512, 20, 1 + create_web_thread_sprite ANIM_TARGET, 2, x=20, y=0, unk2=512, amplitude=20, targets_both=TRUE delay 1 return @@ -7502,7 +7502,7 @@ Move_SPIDER_WEB: end SpiderWebThread: - createsprite gWebThreadSpriteTemplate, ANIM_TARGET, 2, 20, 0, 512, 20, 0 + create_web_thread_sprite ANIM_TARGET, 2, x=20, y=0, unk2=512, amplitude=20, targets_both=FALSE delay 1 return diff --git a/src/battle_anim_bug.c b/src/battle_anim_bug.c index a5875a376f..2dbd9a08cc 100644 --- a/src/battle_anim_bug.c +++ b/src/battle_anim_bug.c @@ -1,5 +1,6 @@ #include "global.h" #include "battle_anim.h" +#include "battle_anim_internal.h" #include "gpu_regs.h" #include "trig.h" #include "constants/rgb.h" @@ -197,27 +198,29 @@ const struct SpriteTemplate gTailGlowOrbSpriteTemplate = static void AnimMegahornHorn(struct Sprite *sprite) { + CMD_ARGS(x1, y1, x2, y2, duration); + if (IsContest()) { StartSpriteAffineAnim(sprite, 2); - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + cmd->x2 = -cmd->x2; + cmd->x1 = -cmd->x1; } else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { StartSpriteAffineAnim(sprite, 1); - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - gBattleAnimArgs[3] = -gBattleAnimArgs[3]; - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + cmd->y1 = -cmd->y1; + cmd->x2 = -cmd->x2; + cmd->y2 = -cmd->y2; + cmd->x1 = -cmd->x1; } - sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[4]; + sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->x1; + sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->y1; + sprite->data[0] = cmd->duration; - 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[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->x2; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->y2; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); @@ -225,20 +228,22 @@ static void AnimMegahornHorn(struct Sprite *sprite) static void AnimLeechLifeNeedle(struct Sprite *sprite) { + CMD_ARGS(x, y, duration); + if (IsContest()) { - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + cmd->x = -cmd->x; StartSpriteAffineAnim(sprite, 2); } else if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) { - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + cmd->y = -cmd->y; + cmd->x = -cmd->x; } - sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[0]; - sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[1]; - sprite->data[0] = gBattleAnimArgs[2]; + sprite->x = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->x; + sprite->y = GetBattlerSpriteCoord2(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->y; + sprite->data[0] = cmd->duration; sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); @@ -249,22 +254,20 @@ static void AnimLeechLifeNeedle(struct Sprite *sprite) // Creates a single web thread that travels from attacker to target. // Used by MOVE_STRING_SHOT and MOVE_SPIDER_WEB in their first move phase. -// arg 0: x -// arg 1: y // arg 2: controls the left-to-right movement -// arg 3: amplitude -// arg 4: if targets both opponents static void AnimTranslateWebThread(struct Sprite *sprite) { + CMD_ARGS(x, y, unk2, amplitude, targetsBoth); + if (IsContest()) - gBattleAnimArgs[2] /= 2; + cmd->unk2 /= 2; InitSpritePosToAnimAttacker(sprite, TRUE); - sprite->data[0] = gBattleAnimArgs[2]; + sprite->data[0] = cmd->unk2; sprite->data[1] = sprite->x; sprite->data[3] = sprite->y; - if (!gBattleAnimArgs[4]) + if (!cmd->targetsBoth) { sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2); sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET); @@ -275,7 +278,7 @@ static void AnimTranslateWebThread(struct Sprite *sprite) } InitAnimLinearTranslationWithSpeed(sprite); - sprite->data[5] = gBattleAnimArgs[3]; + sprite->data[5] = cmd->amplitude; sprite->callback = AnimTranslateWebThread_Step; } @@ -294,13 +297,15 @@ static void AnimTranslateWebThread_Step(struct Sprite *sprite) // Second stage of String Shot static void AnimStringWrap(struct Sprite *sprite) { + CMD_ARGS(x, y); + SetAverageBattlerPositions(gBattleAnimTarget, FALSE, &sprite->x, &sprite->y); if (GetBattlerSide(gBattleAnimAttacker)) - sprite->x -= gBattleAnimArgs[0]; + sprite->x -= cmd->x; else - sprite->x += gBattleAnimArgs[0]; + sprite->x += cmd->x; - sprite->y += gBattleAnimArgs[1]; + sprite->y += cmd->y; if (GetBattlerSide(gBattleAnimTarget) == B_SIDE_PLAYER) sprite->y += 8; @@ -358,27 +363,24 @@ static void AnimSpiderWeb_End(struct Sprite *sprite) // Translates a stinger sprite linearly to a destination location. The sprite is // initially rotated so that it appears to be traveling in a straight line. -// 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 static void AnimTranslateStinger(struct Sprite *sprite) { + CMD_ARGS(initialX, intialY, targetX, targetY, duration); + s16 lVarX, lVarY; u16 rot; if (IsContest()) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + cmd->targetX = -cmd->targetX; } else { if (GetBattlerSide(gBattleAnimAttacker)) { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - gBattleAnimArgs[3] = -gBattleAnimArgs[3]; + cmd->targetX = -cmd->targetX; + cmd->intialY = -cmd->intialY; + cmd->targetY = -cmd->targetY; } } @@ -387,20 +389,20 @@ static void AnimTranslateStinger(struct Sprite *sprite) if (GetBattlerPosition(gBattleAnimTarget) == B_POSITION_PLAYER_LEFT || GetBattlerPosition(gBattleAnimTarget) == B_POSITION_OPPONENT_LEFT) { - gBattleAnimArgs[2] *= -1; - gBattleAnimArgs[0] *= -1; + cmd->targetX *= -1; + cmd->initialX *= -1; } } InitSpritePosToAnimAttacker(sprite, TRUE); - lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; - lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + gBattleAnimArgs[3]; + lVarX = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->targetX; + lVarY = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->targetY; rot = ArcTan2Neg(lVarX - sprite->x, lVarY - sprite->y); rot += 0xC000; TrySetSpriteRotScale(sprite, FALSE, 0x100, 0x100, rot); - sprite->data[0] = gBattleAnimArgs[4]; + sprite->data[0] = cmd->duration; sprite->data[2] = lVarX; sprite->data[4] = lVarY; @@ -409,23 +411,19 @@ static void AnimTranslateStinger(struct Sprite *sprite) } // Rotates sprite and moves it in an arc, so that it appears like a missle or arrow traveling. -// 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 AnimMissileArc(struct Sprite *sprite) { + CMD_ARGS(initialX, intialY, targetX, targetY, duration, waveAmplitude); + InitSpritePosToAnimAttacker(sprite, TRUE); if (GetBattlerSide(gBattleAnimAttacker)) - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + cmd->targetX = -cmd->targetX; - 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]; + sprite->data[0] = cmd->duration; + sprite->data[2] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_X_2) + cmd->targetX; + sprite->data[4] = GetBattlerSpriteCoord(gBattleAnimTarget, BATTLER_COORD_Y_PIC_OFFSET) + cmd->targetY; + sprite->data[5] = cmd->waveAmplitude; InitAnimArcTranslation(sprite); sprite->callback = AnimMissileArc_Step; @@ -471,7 +469,9 @@ static void AnimMissileArc_Step(struct Sprite *sprite) static void AnimTailGlowOrb(struct Sprite *sprite) { - if (gBattleAnimArgs[0] == ANIM_ATTACKER) + CMD_ARGS(relativeTo); + + if (cmd->relativeTo == ANIM_ATTACKER) { sprite->x = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_X_2); sprite->y = GetBattlerSpriteCoord(gBattleAnimAttacker, BATTLER_COORD_Y_PIC_OFFSET) + 18;