diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/copy_orb.c | 31 | ||||
-rw-r--r-- | src/battle/anim/cutter.c | 144 | ||||
-rw-r--r-- | src/battle/anim/flying_path.c | 74 | ||||
-rw-r--r-- | src/battle/anim/flying_petals.c | 100 | ||||
-rw-r--r-- | src/battle/anim/heal.c | 27 | ||||
-rw-r--r-- | src/battle/anim/homing.c | 14 | ||||
-rw-r--r-- | src/battle/anim/hop.c | 58 | ||||
-rw-r--r-- | src/battle/anim/hop_2.c | 16 | ||||
-rw-r--r-- | src/battle/anim/leaf.c | 240 | ||||
-rw-r--r-- | src/battle/anim/orbit.c | 83 | ||||
-rw-r--r-- | src/battle/anim/orbs.c | 181 | ||||
-rw-r--r-- | src/battle/anim/osmose.c | 27 | ||||
-rw-r--r-- | src/battle/anim/powder.c | 52 | ||||
-rw-r--r-- | src/battle/anim/roots.c | 69 | ||||
-rw-r--r-- | src/battle/anim/seed.c | 31 | ||||
-rw-r--r-- | src/battle/anim/shimmer.c | 17 | ||||
-rw-r--r-- | src/battle/anim/switch.c | 70 | ||||
-rw-r--r-- | src/battle/anim/tendrils.c | 59 | ||||
-rw-r--r-- | src/battle/anim/unused_1.c | 64 | ||||
-rw-r--r-- | src/battle/anim/whip.c | 89 | ||||
-rw-r--r-- | src/rom_8077ABC.c | 5 |
21 files changed, 1263 insertions, 188 deletions
diff --git a/src/battle/anim/copy_orb.c b/src/battle/anim/copy_orb.c index ac60d2c2b..d554a7e26 100644 --- a/src/battle/anim/copy_orb.c +++ b/src/battle/anim/copy_orb.c @@ -7,9 +7,40 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +extern const union AnimCmd *const gSpriteAnimTable_83D62D4[]; + +void sub_80CB4CC(struct Sprite* sprite); + // copy_orb // Used in Mimic. +const union AffineAnimCmd gSpriteAffineAnim_83D65B8[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 0), + AFFINEANIMCMD_FRAME(48, 48, 0, 14), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D65D0[] = { + AFFINEANIMCMD_FRAME(-16, -16, 0, 1), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D65E0[] = { + gSpriteAffineAnim_83D65B8, + gSpriteAffineAnim_83D65D0, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D65E8 = +{ + .tileTag = 10147, + .paletteTag = 10147, + .oam = &gOamData_837DFEC, + .anims = gSpriteAnimTable_83D62D4, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D65E0, + .callback = sub_80CB4CC, +}; + void sub_80CB4CC(struct Sprite* sprite) { switch (sprite->data[0]) diff --git a/src/battle/anim/cutter.c b/src/battle/anim/cutter.c deleted file mode 100644 index bc7478053..000000000 --- a/src/battle/anim/cutter.c +++ /dev/null @@ -1,144 +0,0 @@ -#include "global.h" -#include "battle.h" -#include "rom_8077ABC.h" -#include "trig.h" -#include "battle_anim.h" - -extern s16 gBattleAnimArgs[]; -extern u8 gAnimBankAttacker; -extern u8 gAnimBankTarget; - -static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite); -static void AnimMoveTwisterParticleStep(struct Sprite* sprite); - -// 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. -// arg 0: initial x offset -// arg 1: initial y offset -// arg 2: target x offset -// arg 3: target y offset -// arg 4: translation duration -// arg 5: wave amplitude -// arg 6: target between double battle opponents (boolean) -void AnimTranslateLinearSingleSineWave(struct Sprite* sprite) -{ - InitAnimSpritePos(sprite, 1); - if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) - { - gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - } - - sprite->data[0] = gBattleAnimArgs[4]; - if (!gBattleAnimArgs[6]) - { - sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; - sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - } - else - { - SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); - sprite->data[2] += gBattleAnimArgs[2]; - sprite->data[4] += gBattleAnimArgs[3]; - } - - sprite->data[5] = gBattleAnimArgs[5]; - InitAnimSpriteTranslationOverDuration(sprite); - if (GetBattlerSide(gAnimBankAttacker) == GetBattlerSide(gAnimBankTarget)) - { - sprite->data[0] = 1; - } - else - { - sprite->data[0] = 0; - } - - sprite->callback = AnimTranslateLinearSingleSineWaveStep; -} - -static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite) -{ - bool8 destroy = FALSE; - s16 a = sprite->data[0]; - s16 b = sprite->data[7]; - s16 r0; - - sprite->data[0] = 1; - TranslateAnimSpriteLinearAndSine(sprite); - r0 = sprite->data[7]; - sprite->data[0] = a; - if (b > 0xC8 && r0 <= 0x37 && sprite->oam.affineParam == 0) - sprite->oam.affineParam++; - - if (sprite->oam.affineParam != 0 && sprite->data[0] != 0) - { - sprite->invisible ^= 1; - sprite->oam.affineParam++; - if (sprite->oam.affineParam == 0x1E) - destroy = TRUE; - } - - if (sprite->pos1.x + sprite->pos2.x > 256 - || sprite->pos1.x + sprite->pos2.x < -16 - || sprite->pos1.y + sprite->pos2.y > 160 - || sprite->pos1.y + sprite->pos2.y < -16) - destroy = TRUE; - - if (destroy) - DestroyAnimSprite(sprite); -} - -// Animates particles in the Twister move animation. -// arg 0: duration -// arg 1: total y delta (the particles rise upward) -// arg 2: wave period (higher means faster wave) -// arg 3: wave amplitude -// arg 4: speedup frame (particles move faster at the end of the animation) -void AnimMoveTwisterParticle(struct Sprite* sprite) -{ - if (!IsContest() && IsDoubleBattle() == TRUE) - { - SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y); - } - - sprite->pos1.y += 32; - sprite->data[0] = gBattleAnimArgs[0]; - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[2] = gBattleAnimArgs[2]; - sprite->data[3] = gBattleAnimArgs[3]; - sprite->data[4] = gBattleAnimArgs[4]; - sprite->callback = AnimMoveTwisterParticleStep; -} - -static void AnimMoveTwisterParticleStep(struct Sprite* sprite) -{ - if (sprite->data[1] == 0xFF) - { - sprite->pos1.y -= 2; - } - else if (sprite->data[1] > 0) - { - sprite->pos1.y -= 2; - sprite->data[1] -= 2; - } - - sprite->data[5] += sprite->data[2]; - if (sprite->data[0] < sprite->data[4]) - sprite->data[5] += sprite->data[2]; - - sprite->data[5] &= 0xFF; - sprite->pos2.x = Cos(sprite->data[5], sprite->data[3]); - sprite->pos2.y = Sin(sprite->data[5], 5); - if (sprite->data[5] <= 0x7F) - { - sprite->oam.priority = sub_8079ED4(gAnimBankTarget) - 1; - } - else - { - sprite->oam.priority = sub_8079ED4(gAnimBankTarget) + 1; - } - - sprite->data[0]--; - if (!sprite->data[0]) - DestroyAnimSprite(sprite); -} diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c index 5e9de8cb1..b190e9e8c 100644 --- a/src/battle/anim/flying_path.c +++ b/src/battle/anim/flying_path.c @@ -8,8 +8,6 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern struct SpriteTemplate gSpriteTemplate_83D6884; - static void sub_80CBF5C(u8 taskId); static s16 sub_80CC338(struct Sprite* sprite); static void sub_80CC358(struct Task* task, u8 taskId); @@ -18,6 +16,70 @@ static void sub_80CC408(struct Sprite* sprite); // flying_path (guides a sprite along a specific path.) // Used by Leaf Blade. +const union AnimCmd gSpriteAnim_83D6830[] = +{ + ANIMCMD_FRAME(28, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6838[] = +{ + ANIMCMD_FRAME(32, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6840[] = +{ + ANIMCMD_FRAME(20, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6848[] = +{ + ANIMCMD_FRAME(28, 1, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6850[] = +{ + ANIMCMD_FRAME(16, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6858[] = +{ + ANIMCMD_FRAME(16, 1, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6860[] = +{ + ANIMCMD_FRAME(28, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D6868[] = +{ + gSpriteAnim_83D6830, + gSpriteAnim_83D6838, + gSpriteAnim_83D6840, + gSpriteAnim_83D6848, + gSpriteAnim_83D6850, + gSpriteAnim_83D6858, + gSpriteAnim_83D6860, +}; + +const struct SpriteTemplate gSpriteTemplate_83D6884 = +{ + .tileTag = 10063, + .paletteTag = 10063, + .oam = &gOamData_837DF2C, + .anims = gSpriteAnimTable_83D6868, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy, +}; + void sub_80CBDF4(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -44,7 +106,7 @@ void sub_80CBDF4(u8 taskId) task->func = sub_80CBF5C; } -void sub_80CBF5C(u8 taskId) +static void sub_80CBF5C(u8 taskId) { struct Task* task = &gTasks[taskId]; struct Sprite* sprite = &gSprites[task->data[2]]; @@ -244,7 +306,7 @@ void sub_80CBF5C(u8 taskId) } } -s16 sub_80CC338(struct Sprite* sprite) +static s16 sub_80CC338(struct Sprite* sprite) { s16 var = 8; if (sprite->data[4] < sprite->pos1.y) @@ -253,7 +315,7 @@ s16 sub_80CC338(struct Sprite* sprite) return var; } -void sub_80CC358(struct Task* task, u8 taskId) +static void sub_80CC358(struct Task* task, u8 taskId) { task->data[14]++; if (task->data[14] > 0) @@ -279,7 +341,7 @@ void sub_80CC358(struct Task* task, u8 taskId) } } -void sub_80CC408(struct Sprite* sprite) +static void sub_80CC408(struct Sprite* sprite) { sprite->data[0]++; if (sprite->data[0] > 1) diff --git a/src/battle/anim/flying_petals.c b/src/battle/anim/flying_petals.c index c7a596b56..4696cbc6c 100644 --- a/src/battle/anim/flying_petals.c +++ b/src/battle/anim/flying_petals.c @@ -7,12 +7,110 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +extern const union AnimCmd *const gSpriteAnimTable_83D6424[]; +extern const union AnimCmd *const gSpriteAnimTable_83D6420[]; +void sub_80CC474(struct Sprite* sprite); static void sub_80CC580(struct Sprite* sprite); // flying_petals (petals fly across the screen.) // Used by Aromatherapy. +const union AffineAnimCmd gSpriteAffineAnim_83D689C[] = { + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, 4, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D68B4[] = { + gSpriteAffineAnim_83D689C, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D68B8 = +{ + .tileTag = 10159, + .paletteTag = 10159, + .oam = &gOamData_837DF24, + .anims = gSpriteAnimTable_83D6424, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CC474, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D68D0 = +{ + .tileTag = 10159, + .paletteTag = 10159, + .oam = &gOamData_837DF8C, + .anims = gSpriteAnimTable_83D6420, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D68B4, + .callback = sub_80CC474, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D68E8[] = { + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, -10, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6900[] = { + AFFINEANIMCMD_FRAME(192, 192, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, -12, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6918[] = { + AFFINEANIMCMD_FRAME(143, 143, 0, 0), + AFFINEANIMCMD_FRAME(0, 0, -15, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D6930[] = { + gSpriteAffineAnim_83D68E8, +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D6934[] = { + gSpriteAffineAnim_83D6900, +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D6938[] = { + gSpriteAffineAnim_83D6918, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D693C = +{ + .tileTag = 10271, + .paletteTag = 10271, + .oam = &gOamData_837DF8C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6930, + .callback = sub_80CC474, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6954 = +{ + .tileTag = 10271, + .paletteTag = 10271, + .oam = &gOamData_837DF8C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6934, + .callback = sub_80CC474, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D696C = +{ + .tileTag = 10271, + .paletteTag = 10271, + .oam = &gOamData_837DF8C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6938, + .callback = sub_80CC474, +}; + void sub_80CC474(struct Sprite* sprite) { u8 bank; @@ -61,7 +159,7 @@ void sub_80CC474(struct Sprite* sprite) sprite->callback = sub_80CC580; } -void sub_80CC580(struct Sprite* sprite) +static void sub_80CC580(struct Sprite* sprite) { int a = sprite->data[7]; sprite->data[7]++; diff --git a/src/battle/anim/heal.c b/src/battle/anim/heal.c index a8c14ea1c..c2bce0e77 100644 --- a/src/battle/anim/heal.c +++ b/src/battle/anim/heal.c @@ -7,9 +7,36 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CBAA4(struct Sprite* sprite); + // heal (healing sparkles on a Pokemon) // Used in Present, if the move heals instead of damages. +const union AnimCmd gSpriteAnim_83D674C[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(4, 4), + ANIMCMD_FRAME(8, 4), + ANIMCMD_FRAME(12, 4), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D6760[] = +{ + gSpriteAnim_83D674C, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6764 = +{ + .tileTag = 10195, + .paletteTag = 10195, + .oam = &gOamData_837DF2C, + .anims = gSpriteAnimTable_83D6760, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CBAA4, +}; + void sub_80CBAA4(struct Sprite* sprite) { if (sprite->data[0] == 0) diff --git a/src/battle/anim/homing.c b/src/battle/anim/homing.c index b24fcf4b1..5cd2a3ddb 100644 --- a/src/battle/anim/homing.c +++ b/src/battle/anim/homing.c @@ -8,11 +8,23 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CC6CC(struct Sprite* sprite); static void sub_80CC7D4(struct Sprite* sprite); // homing (the spinning effect of sprites going inward in a static rotation.) // Used by Needle Arm. +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6994 = +{ + .tileTag = 10266, + .paletteTag = 10266, + .oam = &gOamData_837DF8C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CC6CC, +}; + void sub_80CC6CC(struct Sprite* sprite) { u8 a; @@ -69,7 +81,7 @@ void sub_80CC6CC(struct Sprite* sprite) } } -void sub_80CC7D4(struct Sprite* sprite) +static void sub_80CC7D4(struct Sprite* sprite) { if (sprite->data[0]) { diff --git a/src/battle/anim/hop.c b/src/battle/anim/hop.c index 7d1b2fd01..3aba79511 100644 --- a/src/battle/anim/hop.c +++ b/src/battle/anim/hop.c @@ -7,9 +7,67 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CB94C(struct Sprite* sprite); +void sub_80CBA28(struct Sprite* sprite); + // hop (where a sprite "hops" across the screen) // Used by Present, Trick, and the item knock off effect. +const union AnimCmd gSpriteAnim_83D66B0[] = +{ + ANIMCMD_FRAME(0, 30), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D66B8[] = +{ + gSpriteAnim_83D66B0, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D66BC[] = { + AFFINEANIMCMD_FRAME(0, 0, -4, 10), + AFFINEANIMCMD_FRAME(0, 0, 4, 20), + AFFINEANIMCMD_FRAME(0, 0, -4, 10), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D66DC[] = { + AFFINEANIMCMD_FRAME(0, 0, -1, 2), + AFFINEANIMCMD_FRAME(0, 0, 1, 4), + AFFINEANIMCMD_FRAME(0, 0, -1, 4), + AFFINEANIMCMD_FRAME(0, 0, 1, 4), + AFFINEANIMCMD_FRAME(0, 0, -1, 4), + AFFINEANIMCMD_FRAME(0, 0, 1, 2), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D6714[] = { + gSpriteAffineAnim_83D66BC, + gSpriteAffineAnim_83D66DC, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D671C = +{ + .tileTag = 10224, + .paletteTag = 10224, + .oam = &gOamData_837DF94, + .anims = gSpriteAnimTable_83D66B8, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6714, + .callback = sub_80CB94C, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6734 = +{ + .tileTag = 10224, + .paletteTag = 10224, + .oam = &gOamData_837DF94, + .anims = gSpriteAnimTable_83D66B8, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6714, + .callback = sub_80CBA28, +}; + void sub_80CB7EC(struct Sprite* sprite, s16 c) { s32 a = (sprite->pos1.x * 256) | sprite->pos1.y; diff --git a/src/battle/anim/hop_2.c b/src/battle/anim/hop_2.c index 861f428da..ab239f3c4 100644 --- a/src/battle/anim/hop_2.c +++ b/src/battle/anim/hop_2.c @@ -11,12 +11,26 @@ extern u8 gAnimBankTarget; extern void sub_80CB7EC(struct Sprite* sprite, s16 c); extern bool8 sub_80CB814(struct Sprite* sprite); extern void sub_80CB8B8(struct Sprite* sprite); +extern const union AnimCmd *const gSpriteAnimTable_83D66B8[]; +extern const union AffineAnimCmd *const gSpriteAffineAnimTable_83D6714[]; +void sub_80CBAE8(struct Sprite* sprite); static void sub_80CBB60(struct Sprite* sprite); // hop_2 // Used in item steal. +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D677C = +{ + .tileTag = 10224, + .paletteTag = 10224, + .oam = &gOamData_837DF94, + .anims = gSpriteAnimTable_83D66B8, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6714, + .callback = sub_80CBAE8, +}; + void sub_80CBAE8(struct Sprite* sprite) { s16 p1; @@ -43,7 +57,7 @@ void sub_80CBAE8(struct Sprite* sprite) sprite->callback = sub_80CBB60; } -void sub_80CBB60(struct Sprite* sprite) +static void sub_80CBB60(struct Sprite* sprite) { int zero; sprite->data[0] += ((sprite->data[3] * 128) / sprite->data[4]); diff --git a/src/battle/anim/leaf.c b/src/battle/anim/leaf.c index ca2af257d..d31e4dbd6 100644 --- a/src/battle/anim/leaf.c +++ b/src/battle/anim/leaf.c @@ -1,18 +1,120 @@ #include "global.h" +#include "battle.h" +#include "battle_anim.h" #include "rom_8077ABC.h" #include "trig.h" -#include "battle_anim.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CAED8(struct Sprite* sprite); +void AnimMoveTwisterParticle(struct Sprite* sprite); +void AnimTranslateLinearSingleSineWave(struct Sprite* sprite); static void sub_80CAF20(struct Sprite* sprite); static void sub_80CAF6C(struct Sprite* sprite); +static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite); +static void AnimMoveTwisterParticleStep(struct Sprite* sprite); // leaf // Used by Razor Leaf and Twister. +const union AnimCmd gSpriteAnim_83D6458[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(4, 5), + ANIMCMD_FRAME(8, 5), + ANIMCMD_FRAME(12, 5), + ANIMCMD_FRAME(16, 5), + ANIMCMD_FRAME(20, 5), + ANIMCMD_FRAME(16, 5), + ANIMCMD_FRAME(12, 5), + ANIMCMD_FRAME(8, 5), + ANIMCMD_FRAME(4, 5), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd gSpriteAnim_83D6484[] = +{ + ANIMCMD_FRAME(24, 5), + ANIMCMD_FRAME(28, 5), + ANIMCMD_FRAME(32, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D6494[] = +{ + gSpriteAnim_83D6458, + gSpriteAnim_83D6484, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D649C = +{ + .tileTag = 10063, + .paletteTag = 10063, + .oam = &gOamData_837DF2C, + .anims = gSpriteAnimTable_83D6494, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CAED8, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D64B4 = +{ + .tileTag = 10063, + .paletteTag = 10063, + .oam = &gOamData_837DF2C, + .anims = gSpriteAnimTable_83D6494, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMoveTwisterParticle, +}; + +const union AnimCmd gSpriteAnim_83D64CC[] = +{ + ANIMCMD_FRAME(0, 3), + ANIMCMD_FRAME(0, 3, .hFlip = TRUE), + ANIMCMD_FRAME(0, 3, .vFlip = TRUE, .hFlip = TRUE), + ANIMCMD_FRAME(0, 3, .vFlip = TRUE), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_83D64E0[] = +{ + gSpriteAnim_83D64CC, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D64E4 = +{ + .tileTag = 10160, + .paletteTag = 10160, + .oam = &gOamData_837DF54, + .anims = gSpriteAnimTable_83D64E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimTranslateLinearSingleSineWave, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D64FC[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 1), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D650C[] = { + gSpriteAffineAnim_83D64FC, +}; + +const struct SpriteTemplate gSwiftStarSpriteTemplate = +{ + .tileTag = 10174, + .paletteTag = 10174, + .oam = &gOamData_837DF94, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D650C, + .callback = AnimTranslateLinearSingleSineWave, +}; + void sub_80CAED8(struct Sprite* sprite) { sprite->pos1.x = GetBattlerSpriteCoord(gAnimBankAttacker, 2); @@ -23,7 +125,7 @@ void sub_80CAED8(struct Sprite* sprite) sprite->callback = sub_80CAF20; } -void sub_80CAF20(struct Sprite* sprite) +static void sub_80CAF20(struct Sprite* sprite) { if (!sprite->data[2]) { @@ -49,7 +151,7 @@ void sub_80CAF20(struct Sprite* sprite) } } -void sub_80CAF6C(struct Sprite* sprite) +static void sub_80CAF6C(struct Sprite* sprite) { if (GetBattlerSide(gAnimBankAttacker)) { @@ -72,3 +174,135 @@ void sub_80CAF6C(struct Sprite* sprite) DestroyAnimSprite(sprite); } } + +// 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. +// arg 0: initial x offset +// arg 1: initial y offset +// arg 2: target x offset +// arg 3: target y offset +// arg 4: translation duration +// arg 5: wave amplitude +// arg 6: target between double battle opponents (boolean) +void AnimTranslateLinearSingleSineWave(struct Sprite* sprite) +{ + InitAnimSpritePos(sprite, 1); + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + { + gBattleAnimArgs[2] = -gBattleAnimArgs[2]; + } + + sprite->data[0] = gBattleAnimArgs[4]; + if (!gBattleAnimArgs[6]) + { + sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; + } + else + { + SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->data[2], &sprite->data[4]); + sprite->data[2] += gBattleAnimArgs[2]; + sprite->data[4] += gBattleAnimArgs[3]; + } + + sprite->data[5] = gBattleAnimArgs[5]; + InitAnimSpriteTranslationOverDuration(sprite); + if (GetBattlerSide(gAnimBankAttacker) == GetBattlerSide(gAnimBankTarget)) + { + sprite->data[0] = 1; + } + else + { + sprite->data[0] = 0; + } + + sprite->callback = AnimTranslateLinearSingleSineWaveStep; +} + +static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite) +{ + bool8 destroy = FALSE; + s16 a = sprite->data[0]; + s16 b = sprite->data[7]; + s16 r0; + + sprite->data[0] = 1; + TranslateAnimSpriteLinearAndSine(sprite); + r0 = sprite->data[7]; + sprite->data[0] = a; + if (b > 0xC8 && r0 <= 0x37 && sprite->oam.affineParam == 0) + sprite->oam.affineParam++; + + if (sprite->oam.affineParam != 0 && sprite->data[0] != 0) + { + sprite->invisible ^= 1; + sprite->oam.affineParam++; + if (sprite->oam.affineParam == 0x1E) + destroy = TRUE; + } + + if (sprite->pos1.x + sprite->pos2.x > 256 + || sprite->pos1.x + sprite->pos2.x < -16 + || sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.y + sprite->pos2.y < -16) + destroy = TRUE; + + if (destroy) + DestroyAnimSprite(sprite); +} + +// Animates particles in the Twister move animation. +// arg 0: duration +// arg 1: total y delta (the particles rise upward) +// arg 2: wave period (higher means faster wave) +// arg 3: wave amplitude +// arg 4: speedup frame (particles move faster at the end of the animation) +void AnimMoveTwisterParticle(struct Sprite* sprite) +{ + if (!IsContest() && IsDoubleBattle() == TRUE) + { + SetAverageBattlerPositions(gAnimBankTarget, 1, &sprite->pos1.x, &sprite->pos1.y); + } + + sprite->pos1.y += 32; + sprite->data[0] = gBattleAnimArgs[0]; + sprite->data[1] = gBattleAnimArgs[1]; + sprite->data[2] = gBattleAnimArgs[2]; + sprite->data[3] = gBattleAnimArgs[3]; + sprite->data[4] = gBattleAnimArgs[4]; + sprite->callback = AnimMoveTwisterParticleStep; +} + +static void AnimMoveTwisterParticleStep(struct Sprite* sprite) +{ + if (sprite->data[1] == 0xFF) + { + sprite->pos1.y -= 2; + } + else if (sprite->data[1] > 0) + { + sprite->pos1.y -= 2; + sprite->data[1] -= 2; + } + + sprite->data[5] += sprite->data[2]; + if (sprite->data[0] < sprite->data[4]) + sprite->data[5] += sprite->data[2]; + + sprite->data[5] &= 0xFF; + sprite->pos2.x = Cos(sprite->data[5], sprite->data[3]); + sprite->pos2.y = Sin(sprite->data[5], 5); + if (sprite->data[5] <= 0x7F) + { + sprite->oam.priority = sub_8079ED4(gAnimBankTarget) - 1; + } + else + { + sprite->oam.priority = sub_8079ED4(gAnimBankTarget) + 1; + } + + sprite->data[0]--; + if (!sprite->data[0]) + DestroyAnimSprite(sprite); +} diff --git a/src/battle/anim/orbit.c b/src/battle/anim/orbit.c index b4a641cc2..e76e0923e 100644 --- a/src/battle/anim/orbit.c +++ b/src/battle/anim/orbit.c @@ -7,12 +7,85 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CABF8(struct Sprite* sprite); +void sub_80CAD54(struct Sprite* sprite); +void sub_80CAE20(struct Sprite* sprite); static void sub_80CAC44(struct Sprite* sprite); static void sub_80CADA8(struct Sprite* sprite); static void sub_80CAE74(struct Sprite* sprite); -// orbit (The effect of a sprite rotating around another one in a pseudo 3D effect.) -// Used by Spore, Cotton Spore, and Petal Dance. +const union AnimCmd gSpriteAnim_83D63E0[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D63E8[] = +{ + ANIMCMD_FRAME(4, 7), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D63F0[] = +{ + gSpriteAnim_83D63E0, + gSpriteAnim_83D63E8, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D63F8 = +{ + .tileTag = 10158, + .paletteTag = 10158, + .oam = &gOamData_837DF2C, + .anims = gSpriteAnimTable_83D63F0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CABF8, +}; + +const union AnimCmd gSpriteAnim_83D6410[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6418[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D6420[] = +{ + gSpriteAnim_83D6410, +}; + +const union AnimCmd *const gSpriteAnimTable_83D6424[] = +{ + gSpriteAnim_83D6418, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6428 = +{ + .tileTag = 10159, + .paletteTag = 10159, + .oam = &gOamData_837DF2C, + .anims = gSpriteAnimTable_83D6420, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CAD54, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6440 = +{ + .tileTag = 10159, + .paletteTag = 10159, + .oam = &gOamData_837DF24, + .anims = gSpriteAnimTable_83D6424, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CAE20, +}; void sub_80CABF8(struct Sprite* sprite) { @@ -29,7 +102,7 @@ void sub_80CABF8(struct Sprite* sprite) sub_80CAC44(sprite); } -void sub_80CAC44(struct Sprite* sprite) +static void sub_80CAC44(struct Sprite* sprite) { u8 var1; @@ -91,7 +164,7 @@ void sub_80CAD54(struct Sprite* sprite) sub_80CADA8(sprite); } -void sub_80CADA8(struct Sprite* sprite) +static void sub_80CADA8(struct Sprite* sprite) { if (!TranslateAnimSpriteByDeltas(sprite)) { @@ -128,7 +201,7 @@ void sub_80CAE20(struct Sprite* sprite) sub_80CAE74(sprite); } -void sub_80CAE74(struct Sprite* sprite) +static void sub_80CAE74(struct Sprite* sprite) { if (!TranslateAnimSpriteByDeltas(sprite)) { diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c index 53c16d8d7..af6568bd8 100644 --- a/src/battle/anim/orbs.c +++ b/src/battle/anim/orbs.c @@ -8,11 +8,184 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CA7B0(struct Sprite* sprite); +void sub_80CA800(struct Sprite* sprite); +void sub_80CA858(struct Sprite* sprite); +void sub_80CA9A8(struct Sprite* sprite); +void sub_80CAA14(struct Sprite* sprite); static void sub_80CA8B4(struct Sprite* sprite); static void sub_80CA9F8(struct Sprite* sprite); static void sub_80CAACC(struct Sprite* sprite); -extern struct SpriteTemplate gSpriteTemplate_83D631C; +const union AnimCmd gSpriteAnim_83D626C[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6274[] = +{ + ANIMCMD_FRAME(1, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D627C[] = +{ + ANIMCMD_FRAME(2, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6284[] = +{ + ANIMCMD_FRAME(3, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D628C[] = +{ + ANIMCMD_FRAME(4, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6294[] = +{ + ANIMCMD_FRAME(5, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D629C[] = +{ + ANIMCMD_FRAME(6, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D62A4[] = +{ + ANIMCMD_FRAME(7, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D62AC[] = +{ + ANIMCMD_FRAME(8, 1), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D62B4[] = +{ + gSpriteAnim_83D626C, + gSpriteAnim_83D6274, + gSpriteAnim_83D627C, + gSpriteAnim_83D6284, + gSpriteAnim_83D628C, + gSpriteAnim_83D6294, + gSpriteAnim_83D629C, +}; + +const union AnimCmd *const gSpriteAnimTable_83D62D0[] = +{ + gSpriteAnim_83D62A4, +}; + +const union AnimCmd *const gSpriteAnimTable_83D62D4[] = +{ + gSpriteAnim_83D62AC, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D62D8[] = { + AFFINEANIMCMD_FRAME(-5, -5, 0, 1), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D62E8[] = { + gSpriteAffineAnim_83D62D8, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D62EC = +{ + .tileTag = 10147, + .paletteTag = 10147, + .oam = &gOamData_837E0AC, + .anims = gSpriteAnimTable_83D62D4, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D62E8, + .callback = sub_80CA7B0, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6304 = +{ + .tileTag = 10147, + .paletteTag = 10147, + .oam = &gOamData_837DF24, + .anims = gSpriteAnimTable_83D62B4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CA800, +}; + +const struct SpriteTemplate gSpriteTemplate_83D631C = +{ + .tileTag = 10147, + .paletteTag = 10147, + .oam = &gOamData_837DF24, + .anims = gSpriteAnimTable_83D62D0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CA858, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6334[] = { + AFFINEANIMCMD_FRAME(320, 320, 0, 0), + AFFINEANIMCMD_FRAME(-14, -14, 0, 1), + AFFINEANIMCMD_JUMP(1), +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D634C[] = { + gSpriteAffineAnim_83D6334, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6350 = +{ + .tileTag = 10235, + .paletteTag = 10235, + .oam = &gOamData_837DFE4, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D634C, + .callback = sub_80CA7B0, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6368[] = { + AFFINEANIMCMD_FRAME(-5, -5, 0, 1), + AFFINEANIMCMD_JUMP(0), +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D6378[] = { + gSpriteAffineAnim_83D6368, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D637C = +{ + .tileTag = 10147, + .paletteTag = 10147, + .oam = &gOamData_837E0AC, + .anims = gSpriteAnimTable_83D62D4, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6378, + .callback = sub_80CA9A8, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6394 = +{ + .tileTag = 10147, + .paletteTag = 10147, + .oam = &gOamData_837DF24, + .anims = gSpriteAnimTable_83D62B4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CAA14, +}; + // orbs // Used by Solar Beam, Absorb, Hyper Beam, and Leech Seed. @@ -52,7 +225,7 @@ void sub_80CA858(struct Sprite* sprite) sub_80CA8B4(sprite); } -void sub_80CA8B4(struct Sprite* sprite) +static void sub_80CA8B4(struct Sprite* sprite) { if (TranslateAnimSpriteByDeltas(sprite)) { @@ -103,7 +276,7 @@ void sub_80CA9A8(struct Sprite* sprite) sprite->callback = sub_80CA9F8; } -void sub_80CA9F8(struct Sprite* sprite) +static void sub_80CA9F8(struct Sprite* sprite) { if (TranslateAnimSpriteLinearAndSine(sprite)) DestroyAnimSprite(sprite); @@ -139,7 +312,7 @@ void sub_80CAA14(struct Sprite* sprite) sub_80CAACC(sprite); } -void sub_80CAACC(struct Sprite* sprite) +static void sub_80CAACC(struct Sprite* sprite) { if (sub_8078CE8(sprite)) { diff --git a/src/battle/anim/osmose.c b/src/battle/anim/osmose.c index cca7af76e..dad5605f7 100644 --- a/src/battle/anim/osmose.c +++ b/src/battle/anim/osmose.c @@ -7,9 +7,34 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -// osmose (I didn't want to use "absorb" as thats confusing) +void sub_80CB768(struct Sprite* sprite); + +// osmose // Used by Ingrain. +const union AnimCmd gSpriteAnim_83D6688[] = +{ + ANIMCMD_FRAME(3, 3), + ANIMCMD_FRAME(0, 5), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_83D6694[] = +{ + gSpriteAnim_83D6688, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6698 = +{ + .tileTag = 10147, + .paletteTag = 10147, + .oam = &gOamData_837DF24, + .anims = gSpriteAnimTable_83D6694, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CB768, +}; + void sub_80CB768(struct Sprite* sprite) { if (!sprite->data[0]) diff --git a/src/battle/anim/powder.c b/src/battle/anim/powder.c index 88339522e..046d3c20c 100644 --- a/src/battle/anim/powder.c +++ b/src/battle/anim/powder.c @@ -6,8 +6,60 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; +void AnimMovePowderParticle(struct Sprite* sprite); static void AnimMovePowderParticleStep(struct Sprite* sprite); +const union AnimCmd gSpriteAnim_83D61FC[] = +{ + ANIMCMD_FRAME(0, 5), + ANIMCMD_FRAME(2, 5), + ANIMCMD_FRAME(4, 5), + ANIMCMD_FRAME(6, 5), + ANIMCMD_FRAME(8, 5), + ANIMCMD_FRAME(10, 5), + ANIMCMD_FRAME(12, 5), + ANIMCMD_FRAME(14, 5), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_83D6220[] = +{ + gSpriteAnim_83D61FC, +}; + +const struct SpriteTemplate gSleepPowderParticleSpriteTemplate = +{ + .tileTag = 10067, + .paletteTag = 10067, + .oam = &gOamData_837DF64, + .anims = gSpriteAnimTable_83D6220, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMovePowderParticle, +}; + +const struct SpriteTemplate gStunSporeParticleSpriteTemplate = +{ + .tileTag = 10068, + .paletteTag = 10068, + .oam = &gOamData_837DF64, + .anims = gSpriteAnimTable_83D6220, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMovePowderParticle, +}; + +const struct SpriteTemplate gPoisonPowderParticleSpriteTemplate = +{ + .tileTag = 10065, + .paletteTag = 10065, + .oam = &gOamData_837DF64, + .anims = gSpriteAnimTable_83D6220, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimMovePowderParticle, +}; + // Animates the falling particles that horizontally wave back and forth. // Used by Sleep Powder, Stun Spore, and Poison Powder. // arg 0: initial x pixel offset diff --git a/src/battle/anim/roots.c b/src/battle/anim/roots.c index 30c2d9652..b9b76c584 100644 --- a/src/battle/anim/roots.c +++ b/src/battle/anim/roots.c @@ -6,14 +6,79 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; - extern s16 gUnknown_03000728[]; +void sub_80CB59C(struct Sprite* sprite); +void sub_80CB620(struct Sprite *sprite); static void sub_80CB710(struct Sprite* sprite); // roots // Used by Ingrain and Frenzy Plant. +const union AnimCmd gSpriteAnim_83D6600[] = +{ + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(16, 7), + ANIMCMD_FRAME(32, 7), + ANIMCMD_FRAME(48, 7), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6614[] = +{ + ANIMCMD_FRAME(0, 7, .hFlip = TRUE), + ANIMCMD_FRAME(16, 7, .hFlip = TRUE), + ANIMCMD_FRAME(32, 7, .hFlip = TRUE), + ANIMCMD_FRAME(48, 7, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6628[] = +{ + ANIMCMD_FRAME(0, 7), + ANIMCMD_FRAME(16, 7), + ANIMCMD_FRAME(32, 7), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D6638[] = +{ + ANIMCMD_FRAME(0, 7, .hFlip = TRUE), + ANIMCMD_FRAME(16, 7, .hFlip = TRUE), + ANIMCMD_FRAME(32, 7, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D6648[] = +{ + gSpriteAnim_83D6600, + gSpriteAnim_83D6614, + gSpriteAnim_83D6628, + gSpriteAnim_83D6638, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6658 = +{ + .tileTag = 10223, + .paletteTag = 10223, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D6648, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CB59C, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D6670 = +{ + .tileTag = 10223, + .paletteTag = 10223, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D6648, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CB620, +}; + void sub_80CB59C(struct Sprite* sprite) { if (!sprite->data[0]) @@ -57,7 +122,7 @@ void sub_80CB620(struct Sprite *sprite) gUnknown_03000728[3] = e2; } -void sub_80CB710(struct Sprite* sprite) +static void sub_80CB710(struct Sprite* sprite) { if (++sprite->data[0] > (sprite->data[2] - 10)) sprite->invisible = sprite->data[0] % 2; diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c index d7c56e7a8..11eebada0 100644 --- a/src/battle/anim/seed.c +++ b/src/battle/anim/seed.c @@ -7,9 +7,40 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void AnimLeechSeed(struct Sprite* sprite); static void AnimLeechSeedStep(struct Sprite* sprite); static void AnimLeechSeedSprouts(struct Sprite* sprite); +const union AnimCmd gSpriteAnim_83D63AC[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D63B4[] = +{ + ANIMCMD_FRAME(4, 7), + ANIMCMD_FRAME(8, 7), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_83D63C0[] = +{ + gSpriteAnim_83D63AC, + gSpriteAnim_83D63B4, +}; + +const struct SpriteTemplate gLeechSeedSpriteTemplate = +{ + .tileTag = 10006, + .paletteTag = 10006, + .oam = &gOamData_837DF2C, + .anims = gSpriteAnimTable_83D63C0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimLeechSeed, +}; + // seed (sprouts a sapling from a seed.) // Used by Leech Seed. // arg 0: initial x pixel offset diff --git a/src/battle/anim/shimmer.c b/src/battle/anim/shimmer.c index 9e7bea1e4..78b430094 100644 --- a/src/battle/anim/shimmer.c +++ b/src/battle/anim/shimmer.c @@ -9,11 +9,20 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern u16 gUnknown_083D6984[]; - // shimmer // Used by Magical Leaf. +static const u16 sMagicalLeafBlendColors[] = +{ + RGB(31, 0, 0), + RGB(31, 19, 0), + RGB(31, 31, 0), + RGB(0, 31, 0), + RGB(5, 14, 31), + RGB(22, 10, 31), + RGB(22, 21, 31), +}; + void sub_80CC5F8(u8 taskId) { struct Task* task = &gTasks[taskId]; @@ -29,8 +38,8 @@ void sub_80CC5F8(u8 taskId) if (task->data[9] >= 0) { task->data[9] = 0; - BlendPalette(task->data[8], 0x10, task->data[10], gUnknown_083D6984[task->data[11]]); - BlendPalette(task->data[12], 0x10, task->data[10], gUnknown_083D6984[task->data[11]]); + BlendPalette(task->data[8], 0x10, task->data[10], sMagicalLeafBlendColors[task->data[11]]); + BlendPalette(task->data[12], 0x10, task->data[10], sMagicalLeafBlendColors[task->data[11]]); task->data[10]++; if (task->data[10] == 17) { diff --git a/src/battle/anim/switch.c b/src/battle/anim/switch.c index c4082b6aa..fcb1d9fc3 100644 --- a/src/battle/anim/switch.c +++ b/src/battle/anim/switch.c @@ -7,9 +7,11 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +extern const union AffineAnimCmd gSpriteAffineAnim_83D66BC[]; +extern const union AffineAnimCmd gSpriteAffineAnim_83D66DC[]; +extern const union AnimCmd *const gSpriteAnimTable_83D66B8[]; -extern s8 gUnknown_083D680C[11][3]; - +void sub_80CBBF0(struct Sprite* sprite); static void sub_80CBC8C(struct Sprite* sprite); static void sub_80CBCF8(struct Sprite* sprite); static void sub_80CBDB0(struct Sprite* sprite); @@ -17,6 +19,56 @@ static void sub_80CBDB0(struct Sprite* sprite); // switch (makes an item and circles it from side to side on the field.) // Used in Trick. + +const union AffineAnimCmd gSpriteAffineAnim_83D6794[] = { + AFFINEANIMCMD_FRAME(0, 0, 0, 3), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D67A4[] = { + AFFINEANIMCMD_FRAME(0, -10, 0, 3), + AFFINEANIMCMD_FRAME(0, -6, 0, 3), + AFFINEANIMCMD_FRAME(0, -2, 0, 3), + AFFINEANIMCMD_FRAME(0, 0, 0, 3), + AFFINEANIMCMD_FRAME(0, 2, 0, 3), + AFFINEANIMCMD_FRAME(0, 6, 0, 3), + AFFINEANIMCMD_FRAME(0, 10, 0, 3), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D67E4[] = { + gSpriteAffineAnim_83D6794, + gSpriteAffineAnim_83D67A4, + gSpriteAffineAnim_83D66BC, + gSpriteAffineAnim_83D66DC, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D67F4 = +{ + .tileTag = 10224, + .paletteTag = 10224, + .oam = &gOamData_837DF94, + .anims = gSpriteAnimTable_83D66B8, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D67E4, + .callback = sub_80CBBF0, +}; + +const s8 gUnknown_083D680C[][3] = +{ + {5, 24, 1}, + {0, 4, 0}, + {8, 16, -1}, + {0, 2, 0}, + {8, 16, 1}, + {0, 2, 0}, + {8, 16, 1}, + {0, 2, 0}, + {8, 16, 1}, + {0, 16, 0}, + {0, 0, 127}, +}; + void sub_80CBBF0(struct Sprite* sprite) { int a; @@ -27,7 +79,7 @@ void sub_80CBBF0(struct Sprite* sprite) if (!IsContest()) { sprite->data[1] = gBattleAnimArgs[1]; - sprite->pos1.x = 0x78; + sprite->pos1.x = 120; } else { @@ -38,13 +90,13 @@ void sub_80CBBF0(struct Sprite* sprite) b = a; sprite->data[1] = a - ((b >> 8) << 8); - sprite->pos1.x = 0x46; + sprite->pos1.x = 70; } sprite->pos1.y = gBattleAnimArgs[0]; sprite->data[2] = gBattleAnimArgs[0]; sprite->data[4] = 20; - sprite->pos2.x = Cos(sprite->data[1], 0x3C); + sprite->pos2.x = Cos(sprite->data[1], 60); sprite->pos2.y = Sin(sprite->data[1], 20); sprite->callback = sub_80CBC8C; if (sprite->data[1] > 0 && sprite->data[1] < 0xC0) @@ -54,7 +106,7 @@ void sub_80CBBF0(struct Sprite* sprite) } } -void sub_80CBC8C(struct Sprite* sprite) +static void sub_80CBC8C(struct Sprite* sprite) { switch (sprite->data[3]) { @@ -84,7 +136,7 @@ void sub_80CBC8C(struct Sprite* sprite) } } -void sub_80CBCF8(struct Sprite* sprite) +static void sub_80CBCF8(struct Sprite* sprite) { if (sprite->data[2] == gUnknown_083D680C[sprite->data[0]][1]) { @@ -113,12 +165,12 @@ void sub_80CBCF8(struct Sprite* sprite) } } - sprite->pos2.x = Cos(sprite->data[1], 0x3C); + sprite->pos2.x = Cos(sprite->data[1], 60); sprite->pos2.y = Sin(sprite->data[1], 20); } } -void sub_80CBDB0(struct Sprite* sprite) +static void sub_80CBDB0(struct Sprite* sprite) { if (sprite->data[0] > 20) DestroyAnimSprite(sprite); diff --git a/src/battle/anim/tendrils.c b/src/battle/anim/tendrils.c index 4ef704f3a..55e2c21bb 100644 --- a/src/battle/anim/tendrils.c +++ b/src/battle/anim/tendrils.c @@ -7,12 +7,67 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CB25C(struct Sprite* sprite); static void sub_80CB298(struct Sprite* sprite); static void sub_80CB2D4(struct Sprite* sprite); // tendrils // Used by Constrict. +const union AnimCmd gSpriteAnim_83D6528[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_FRAME(96, 4), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D653C[] = +{ + ANIMCMD_FRAME(0, 4, .hFlip = TRUE), + ANIMCMD_FRAME(32, 4, .hFlip = TRUE), + ANIMCMD_FRAME(64, 4, .hFlip = TRUE), + ANIMCMD_FRAME(96, 4, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D6550[] = +{ + gSpriteAnim_83D6528, + gSpriteAnim_83D653C, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6558[] = { + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_FRAME(-11, 0, 0, 6), + AFFINEANIMCMD_FRAME(11, 0, 0, 6), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6578[] = { + AFFINEANIMCMD_FRAME(-256, 256, 0, 0), + AFFINEANIMCMD_FRAME(11, 0, 0, 6), + AFFINEANIMCMD_FRAME(-11, 0, 0, 6), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D6598[] = { + gSpriteAffineAnim_83D6558, + gSpriteAffineAnim_83D6578, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D65A0 = +{ + .tileTag = 10186, + .paletteTag = 10186, + .oam = &gOamData_837DFBC, + .anims = gSpriteAnimTable_83D6550, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6598, + .callback = sub_80CB25C, +}; + void sub_80CB25C(struct Sprite* sprite) { sub_8078764(sprite, 0); @@ -23,7 +78,7 @@ void sub_80CB25C(struct Sprite* sprite) sprite->callback = sub_80CB298; } -void sub_80CB298(struct Sprite* sprite) +static void sub_80CB298(struct Sprite* sprite) { if ((u16)gBattleAnimArgs[7] == 0xFFFF) { @@ -34,7 +89,7 @@ void sub_80CB298(struct Sprite* sprite) } } -void sub_80CB2D4(struct Sprite* sprite) +static void sub_80CB2D4(struct Sprite* sprite) { GetAnimBattlerSpriteId(1); if (!sprite->data[2]) diff --git a/src/battle/anim/unused_1.c b/src/battle/anim/unused_1.c index d7e5fbfe4..15050b54c 100644 --- a/src/battle/anim/unused_1.c +++ b/src/battle/anim/unused_1.c @@ -8,9 +8,73 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CC8C8(struct Sprite* sprite); + // unused effect file. // Seems to be a beta effect for Beat Up, possibly. +const union AffineAnimCmd gSpriteAffineAnim_83D6A58[] = { + AFFINEANIMCMD_FRAME(256, 256, 0, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6A68[] = { + AFFINEANIMCMD_FRAME(256, 256, 32, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6A78[] = { + AFFINEANIMCMD_FRAME(256, 256, 64, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6A88[] = { + AFFINEANIMCMD_FRAME(256, 256, 96, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6A98[] = { + AFFINEANIMCMD_FRAME(256, 256, -128, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6AA8[] = { + AFFINEANIMCMD_FRAME(256, 256, -96, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6AB8[] = { + AFFINEANIMCMD_FRAME(256, 256, -64, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D6AC8[] = { + AFFINEANIMCMD_FRAME(256, 256, -32, 0), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D6AD8[] = { + gSpriteAffineAnim_83D6A58, + gSpriteAffineAnim_83D6A68, + gSpriteAffineAnim_83D6A78, + gSpriteAffineAnim_83D6A88, + gSpriteAffineAnim_83D6A98, + gSpriteAffineAnim_83D6AA8, + gSpriteAffineAnim_83D6AB8, + gSpriteAffineAnim_83D6AC8, +}; + +const struct SpriteTemplate gSpriteTemplate_83D6AF8 = +{ + .tileTag = 10143, + .paletteTag = 10143, + .oam = &gOamData_837DF94, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_83D6AD8, + .callback = sub_80CC8C8, +}; + void sub_80CC8C8(struct Sprite* sprite) { sprite->pos1.x += gBattleAnimArgs[0]; diff --git a/src/battle/anim/whip.c b/src/battle/anim/whip.c index 08b24369d..e6e004932 100644 --- a/src/battle/anim/whip.c +++ b/src/battle/anim/whip.c @@ -8,16 +8,101 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; +void sub_80CC82C(struct Sprite* sprite); +void sub_80CC884(struct Sprite* sprite); + // whip (does a hitting animation that uses a rotating sprite to invoke the sprite getting hit.) // Used by Slam and Vine Whip. -void sub_80CC810(struct Sprite* sprite) +const union AnimCmd gSpriteAnim_83D69AC[] = +{ + ANIMCMD_FRAME(64, 3), + ANIMCMD_FRAME(80, 3), + ANIMCMD_FRAME(96, 3), + ANIMCMD_FRAME(112, 6), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D69C0[] = +{ + ANIMCMD_FRAME(64, 3, .hFlip = TRUE), + ANIMCMD_FRAME(80, 3, .hFlip = TRUE), + ANIMCMD_FRAME(96, 3, .hFlip = TRUE), + ANIMCMD_FRAME(112, 6, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D69D4[] = +{ + gSpriteAnim_83D69AC, + gSpriteAnim_83D69C0, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D69DC = +{ + .tileTag = 10056, + .paletteTag = 10056, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D69D4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CC884, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D69F4 = +{ + .tileTag = 10287, + .paletteTag = 10287, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D69D4, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CC884, +}; + +const union AnimCmd gSpriteAnim_83D6A0C[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(48, 4), + ANIMCMD_FRAME(64, 5), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D6A24[] = +{ + gSpriteAnim_83D6A0C, +}; + +const struct SpriteTemplate gSpriteTemplate_83D6A28 = +{ + .tileTag = 10021, + .paletteTag = 10021, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D6A24, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CC82C, +}; + +const struct SpriteTemplate gSpriteTemplate_83D6A40 = +{ + .tileTag = 10022, + .paletteTag = 10022, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D6A24, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80CC82C, +}; + +static void sub_80CC810(struct Sprite* sprite) { if (sprite->animEnded) DestroyAnimSprite(sprite); } -// unused, beta effect for diagonal sprite movement? void sub_80CC82C(struct Sprite* sprite) { if (GetBattlerSide(gAnimBankAttacker) != 0) diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index cccedc89c..a10fd45b8 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -56,7 +56,6 @@ struct Struct_2017810 #define BG2CNT (*(vBgCnt *)REG_ADDR_BG2CNT) #define BG3CNT (*(vBgCnt *)REG_ADDR_BG3CNT) -extern struct OamData gOamData_837DF9C[]; extern const union AnimCmd *const gDummySpriteAnimTable[]; extern const union AffineAnimCmd *const gDummySpriteAffineAnimTable[]; @@ -129,7 +128,7 @@ const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { .tileTag = 55125, .paletteTag = 55125, - .oam = gOamData_837DF9C, + .oam = &gOamData_837DF9C, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, @@ -138,7 +137,7 @@ const struct SpriteTemplate gSpriteTemplate_837F5B0[] = { .tileTag = 55126, .paletteTag = 55126, - .oam = gOamData_837DF9C, + .oam = &gOamData_837DF9C, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, |