diff options
Diffstat (limited to 'src/battle/anim/fire_2.c')
-rw-r--r-- | src/battle/anim/fire_2.c | 302 |
1 files changed, 289 insertions, 13 deletions
diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c index 97ac2e933..b055d7c80 100644 --- a/src/battle/anim/fire_2.c +++ b/src/battle/anim/fire_2.c @@ -9,18 +9,180 @@ extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; -extern struct SpriteTemplate gSpriteTemplate_83D96C4; -extern s16 gHeatedRockCoords[7][2]; +void AnimEmberFlare(struct Sprite *sprite); +void sub_80D5210(struct Sprite *sprite); +void AnimFireRing(struct Sprite *sprite); +void AnimFireCross(struct Sprite *sprite); +void sub_80D53B4(struct Sprite *sprite); +void sub_80D58FC(struct Sprite *sprite); +void sub_80D5A20(struct Sprite *sprite); static void AnimFireRingStep1(struct Sprite *); static void UpdateFireRingCircleOffset(struct Sprite *); static void AnimFireRingStep2(struct Sprite *); static void AnimFireRingStep3(struct Sprite *); -void sub_80D53F4(struct Sprite *); -void sub_80D541C(struct Sprite *); -void sub_80D54E0(u8 taskId); -void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3); +static void sub_80D53F4(struct Sprite *); +static void sub_80D541C(struct Sprite *); +static void sub_80D54E0(u8 taskId); +static void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3); +static void sub_80D59B0(struct Sprite *); +static void sub_80D5A74(struct Sprite *); + +const union AnimCmd gSpriteAnim_83D95C8[] = +{ + ANIMCMD_FRAME(0, 4), + ANIMCMD_FRAME(16, 4), + ANIMCMD_FRAME(32, 4), + ANIMCMD_FRAME(48, 4), + ANIMCMD_FRAME(64, 4), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_83D95E0[] = +{ + gSpriteAnim_83D95C8, +}; + +const struct SpriteTemplate gEmberSpriteTemplate = +{ + .tileTag = 10029, + .paletteTag = 10029, + .oam = &gOamData_837DF34, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = TranslateAnimSpriteToTargetMonLocation, +}; + +const struct SpriteTemplate gEmberFlareSpriteTemplate = +{ + .tileTag = 10029, + .paletteTag = 10029, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D95E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimEmberFlare, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D9614 = +{ + .tileTag = 10029, + .paletteTag = 10029, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D95E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80D5210, +}; + +const struct SpriteTemplate gFireRingSpriteTemplate = +{ + .tileTag = 10029, + .paletteTag = 10029, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D95E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireRing, +}; + +const union AnimCmd gSpriteAnim_83D9644[] = +{ + ANIMCMD_FRAME(32, 6), + ANIMCMD_FRAME(48, 6), + ANIMCMD_JUMP(0), +}; + +const union AnimCmd *const gSpriteAnimTable_83D9650[] = +{ + gSpriteAnim_83D9644, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D9654[] = +{ + AFFINEANIMCMD_FRAME(0x0, 0x0, 0, 1), + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd gSpriteAffineAnim_83D9664[] = +{ + AFFINEANIMCMD_FRAME(0xA0, 0xA0, 0, 0), + AFFINEANIMCMD_END, +}; +const union AffineAnimCmd *const gSpriteAffineAnimTable_83D9674[] = +{ + gSpriteAffineAnim_83D9654, + gSpriteAffineAnim_83D9664, +}; + +const struct SpriteTemplate gFireCrossSpriteTemplate = +{ + .tileTag = 10029, + .paletteTag = 10029, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D9650, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimFireCross, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D9694 = +{ + .tileTag = 10029, + .paletteTag = 10029, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D95E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80D53B4, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D96AC = +{ + .tileTag = 10029, + .paletteTag = 10029, + .oam = &gOamData_837DF34, + .anims = gSpriteAnimTable_83D95E0, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_807A9BC, +}; + + +const struct SpriteTemplate gSpriteTemplate_83D96C4 = +{ + .tileTag = 10201, + .paletteTag = 10201, + .oam = &gOamData_837DF2C, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80D58FC, +}; + +const s16 gHeatedRockCoords[][2] = +{ + {-2, -5}, + {-1, -1}, + { 3, -6}, + { 4, -2}, + { 2, -8}, + {-5, -5}, + { 4, -7}, +}; + +const struct SpriteTemplate gBattleAnimSpriteTemplate_83D96F8 = +{ + .tileTag = 10201, + .paletteTag = 10201, + .oam = &gOamData_837DF34, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80D5A20, +}; // Animates the secondary effect of MOVE_EMBER, where the flames grow and slide // horizontally a bit. @@ -42,13 +204,12 @@ void AnimEmberFlare(struct Sprite *sprite) sprite->callback(sprite); } -struct Sprite *sub_80D5210(struct Sprite *sprite) +void sub_80D5210(struct Sprite *sprite) { gBattleAnimArgs[0] = -gBattleAnimArgs[0]; gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->callback = sub_8079534; - return sprite; } // Animates the a fire sprite in the first-half of the MOVE_FIRE_BLAST @@ -157,7 +318,7 @@ void sub_80D53B4(struct Sprite *sprite) StoreSpriteCallbackInData(sprite, sub_80D53F4); } -void sub_80D53F4(struct Sprite *sprite) +static void sub_80D53F4(struct Sprite *sprite) { sprite->invisible = FALSE; @@ -168,7 +329,7 @@ void sub_80D53F4(struct Sprite *sprite) sub_80D541C(sprite); } -void sub_80D541C(struct Sprite *sprite) +static void sub_80D541C(struct Sprite *sprite) { sprite->pos2.x = Sin(sprite->data[1], sprite->data[2] >> 8); sprite->pos2.y = Cos(sprite->data[1], sprite->data[2] >> 8); @@ -199,7 +360,7 @@ void sub_80D5470(u8 taskId) // initialize animation task for Move_ERUPTION? task->func = sub_80D54E0; } -void sub_80D54E0(u8 taskId) // animate Move_ERUPTION? +static void sub_80D54E0(u8 taskId) // animate Move_ERUPTION? { struct Task *task = &gTasks[taskId]; @@ -309,7 +470,7 @@ void sub_80D54E0(u8 taskId) // animate Move_ERUPTION? } } -void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3) +static void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3) { u16 i, j; s8 sign; @@ -346,4 +507,119 @@ void sub_80D57C4(u8 spriteId, u8 taskId, u8 a3) gTasks[taskId].data[a3]++; } } -}
\ No newline at end of file +} + +void sub_80D58FC(struct Sprite *sprite) +{ + sub_80D59B0(sprite); + + if (sprite->invisible) + { + gTasks[sprite->data[6]].data[sprite->data[7]]--; + DestroySprite(sprite); + } +} + +u16 sub_80D5940(u8 spriteId) +{ + u16 var1 = gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y + gSprites[spriteId].centerToCornerVecY; + + if (GetBattlerSide(gAnimBankAttacker) == 0) + { + var1 = ((var1 << 16) + 0x4A0000) >> 16; + } + else + { + var1 = ((var1 << 16) + 0x2C0000) >> 16; + } + + return var1; +} + +void sub_80D5994(struct Sprite *sprite, s16 x, s16 y) +{ + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = (u16)sprite->pos1.x * 8; + sprite->data[3] = (u16)sprite->pos1.y * 8; + sprite->data[4] = x * 8; + sprite->data[5] = y * 8; +} + +static void sub_80D59B0(struct Sprite *sprite) +{ + int var1; + if (++sprite->data[0] > 2) + { + sprite->data[0] = 0; + ++sprite->data[1]; + var1 = (u16)sprite->data[1] * (u16)sprite->data[1]; + sprite->data[3] += var1; + } + + sprite->data[2] += sprite->data[4]; + sprite->pos1.x = sprite->data[2] >> 3; + sprite->data[3] += sprite->data[5]; + sprite->pos1.y = sprite->data[3] >> 3; + + if (sprite->pos1.x < -8 || sprite->pos1.x > 0xf8 || sprite->pos1.y < -8 || sprite->pos1.y > 120) + sprite->invisible = TRUE; +} + +void sub_80D5A20(struct Sprite *sprite) +{ + sprite->pos1.x = gBattleAnimArgs[0]; + sprite->pos1.y = gBattleAnimArgs[1]; + + sprite->data[0] = 0; + sprite->data[1] = 0; + sprite->data[2] = 0; + sprite->data[6] = gBattleAnimArgs[2]; + sprite->data[7] = gBattleAnimArgs[3]; + + sprite->oam.tileNum += gBattleAnimArgs[4] * 16; + sprite->callback = sub_80D5A74; +} + +static void sub_80D5A74(struct Sprite *sprite) +{ + switch (sprite->data[0]) + { + case 0: + if (sprite->data[6] != 0) + { + sprite->data[6]--; + return; + } + + sprite->data[0]++; + // fall through + case 1: + sprite->pos1.y += 8; + if (sprite->pos1.y >= sprite->data[7]) + { + sprite->pos1.y = sprite->data[7]; + sprite->data[0]++; + } + break; + case 2: + if (++sprite->data[1] > 1) + { + sprite->data[1] = 0; + if ((++sprite->data[2] & 1) != 0) + { + sprite->pos2.y = -3; + } + else + { + sprite->pos2.y = 3; + } + } + + if (++sprite->data[3] > 16) + { + DestroyAnimSprite(sprite); + } + break; + } +} |