diff options
Diffstat (limited to 'src/battle/anim')
37 files changed, 1821 insertions, 210 deletions
diff --git a/src/battle/anim/aurora.c b/src/battle/anim/aurora.c index 5aff17f48..c17748440 100644 --- a/src/battle/anim/aurora.c +++ b/src/battle/anim/aurora.c @@ -68,7 +68,7 @@ void sub_80D33B4(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + r6; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->callback = sub_80D344C; sprite->affineAnimPaused = TRUE; sprite->callback(sprite); @@ -81,7 +81,7 @@ static void sub_80D344C(struct Sprite *sprite) StartSpriteAnim(sprite, 1); sprite->affineAnimPaused = FALSE; } - if (TranslateAnimSpriteByDeltas(sprite) != 0) + if (TranslateAnimLinear(sprite) != 0) DestroyAnimSprite(sprite); } diff --git a/src/battle/anim/blow_kiss.c b/src/battle/anim/blow_kiss.c index 0235794c2..80056614f 100644 --- a/src/battle/anim/blow_kiss.c +++ b/src/battle/anim/blow_kiss.c @@ -33,13 +33,13 @@ void sub_80D1F58(struct Sprite* sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->callback = sub_80D1FA4; } static void sub_80D1FA4(struct Sprite* sprite) { - if (TranslateAnimSpriteByDeltas(sprite) == 0) + if (TranslateAnimLinear(sprite) == 0) { sprite->pos2.y += Sin(sprite->data[5], 14); sprite->data[5] = (sprite->data[5] + 4) & 0xFF; diff --git a/src/battle/anim/bubble.c b/src/battle/anim/bubble.c index e024091d7..ceefd82cf 100644 --- a/src/battle/anim/bubble.c +++ b/src/battle/anim/bubble.c @@ -80,7 +80,7 @@ void sub_80D31C8(struct Sprite* sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); sprite->data[5] = newSpriteId; @@ -106,7 +106,7 @@ static void sub_80D32E8(struct Sprite *sprite) u16 index = gSprites[spriteId].data[3]; sprite->data[0] = 1; - TranslateAnimSpriteByDeltas(sprite); + TranslateAnimLinear(sprite); sprite->pos2.x += Sin(index / 256, gSprites[spriteId].data[0]); sprite->pos2.y += Cos(index / 256, gSprites[spriteId].data[1]); diff --git a/src/battle/anim/bug.c b/src/battle/anim/bug.c index c4c7fe937..e4ea01f5c 100644 --- a/src/battle/anim/bug.c +++ b/src/battle/anim/bug.c @@ -224,7 +224,7 @@ void sub_80DC824(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -249,7 +249,7 @@ void sub_80DC8F4(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -282,7 +282,7 @@ void sub_80DC9A0(struct Sprite *sprite) static void sub_80DCA38(struct Sprite *sprite) { - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) { DestroyAnimSprite(sprite); return; @@ -414,7 +414,7 @@ void AnimTranslateStinger(struct Sprite *sprite) sprite->data[2] = lVarX; sprite->data[4] = lVarY; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -438,7 +438,7 @@ void AnimMissileArc(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = AnimMissileArcStep; sprite->invisible = TRUE; @@ -448,7 +448,7 @@ static void AnimMissileArcStep(struct Sprite *sprite) { sprite->invisible = FALSE; - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) { DestroyAnimSprite(sprite); } @@ -468,7 +468,7 @@ static void AnimMissileArcStep(struct Sprite *sprite) x2 += x1; y2 += y1; - if (!TranslateAnimSpriteLinearAndSine(sprite)) + if (!TranslateAnimArc(sprite)) { u16 rotation = ArcTan2Neg(sprite->pos1.x + sprite->pos2.x - x2, sprite->pos1.y + sprite->pos2.y - y2); diff --git a/src/battle/anim/bullet.c b/src/battle/anim/bullet.c index 764903247..60c001853 100644 --- a/src/battle/anim/bullet.c +++ b/src/battle/anim/bullet.c @@ -44,7 +44,7 @@ void sub_80CFFD8(struct Sprite* sprite) sprite->data[0] = 20; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; sprite->affineAnimPaused = 1; StoreSpriteCallbackInData(sprite, sub_80D0030); } diff --git a/src/battle/anim/current.c b/src/battle/anim/current.c index af72edef0..fb7bc4e1c 100644 --- a/src/battle/anim/current.c +++ b/src/battle/anim/current.c @@ -366,7 +366,7 @@ void sub_80D648C(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[2]; sprite->data[6] = gBattleAnimArgs[5]; sprite->data[7] = gBattleAnimArgs[4]; @@ -378,7 +378,7 @@ void sub_80D648C(struct Sprite *sprite) static void sub_80D6514(struct Sprite *sprite) { - if (!TranslateAnimSpriteByDeltas(sprite)) + if (!TranslateAnimLinear(sprite)) { sprite->pos2.x += Sin(sprite->data[7], sprite->data[5]); sprite->pos2.y += Cos(sprite->data[7], sprite->data[5]); @@ -857,7 +857,7 @@ static void sub_80D6BB8(u8 taskId) sprite->data[4] = task->data[15]; sprite->data[5] = taskId; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData(sprite, sub_80D6D00); sprite->callback = sub_8078600; @@ -887,7 +887,7 @@ static void sub_80D6BB8(u8 taskId) static void sub_80D6CCC(struct Sprite *sprite) { - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) { gTasks[sprite->data[5]].data[7]--; DestroySprite(sprite); diff --git a/src/battle/anim/dark.c b/src/battle/anim/dark.c index 59db85342..09e16b8fe 100644 --- a/src/battle/anim/dark.c +++ b/src/battle/anim/dark.c @@ -402,13 +402,13 @@ void sub_80DFFD0(struct Sprite *sprite) sprite->data[4] = sprite->pos1.y + 12; sprite->data[5] = -12; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = sub_80E00D0; } static void sub_80E00D0(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) move_anim_8074EE0(sprite); } diff --git a/src/battle/anim/dragon.c b/src/battle/anim/dragon.c index 163529ecb..0b5b1b88b 100644 --- a/src/battle/anim/dragon.c +++ b/src/battle/anim/dragon.c @@ -242,7 +242,7 @@ void sub_80DF63C(struct Sprite *sprite) StartSpriteAnim(sprite, 1); } sprite->data[0] = gBattleAnimArgs[4]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, move_anim_8074EE0); } diff --git a/src/battle/anim/energy_wave.c b/src/battle/anim/energy_wave.c index 9ac362b57..cbca5338c 100644 --- a/src/battle/anim/energy_wave.c +++ b/src/battle/anim/energy_wave.c @@ -170,7 +170,7 @@ void sub_80D3554(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[5] = 0xD200 / sprite->data[0]; sprite->data[7] = gBattleAnimArgs[3]; @@ -191,7 +191,7 @@ void sub_80D3554(struct Sprite *sprite) static void sub_80D35DC(struct Sprite *sprite) { - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) { DestroyAnimSprite(sprite); } @@ -299,6 +299,6 @@ void sub_80D3728(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, var2) + gBattleAnimArgs[3]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/fight.c b/src/battle/anim/fight.c index af2af1981..1a534aec7 100644 --- a/src/battle/anim/fight.c +++ b/src/battle/anim/fight.c @@ -567,7 +567,7 @@ void sub_80D92D0(struct Sprite *sprite) } sprite->data[4] = sprite->pos1.y - 20; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, sub_80D9328); } @@ -583,7 +583,7 @@ static void sub_80D9328(struct Sprite *sprite) sprite->pos2.y = 0; sprite->pos2.x = 0; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } } @@ -604,7 +604,7 @@ void sub_80D9378(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->pos1.y; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[5]; sprite->data[6] = gBattleAnimArgs[4]; @@ -615,7 +615,7 @@ void sub_80D9378(struct Sprite *sprite) static void sub_80D9404(struct Sprite *sprite) { - if (!TranslateAnimSpriteByDeltas(sprite)) + if (!TranslateAnimLinear(sprite)) { sprite->pos2.y += Sin(sprite->data[7] >> 8, sprite->data[5]); sprite->data[7] += sprite->data[6]; @@ -672,7 +672,7 @@ static void AnimStompFootStep(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, AnimStompFootEnd); } } @@ -846,9 +846,9 @@ static void sub_80D986C(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(sprite->data[7], 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData(sprite, move_anim_8074EE0); - sprite->callback = TranslateAnimSpriteByDeltasUntil; + sprite->callback = TranslateAnimLinearUntil; } } @@ -941,9 +941,9 @@ void sub_80D9A38(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(bank, 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); StoreSpriteCallbackInData(sprite, DestroyAnimSprite); - sprite->callback = TranslateAnimSpriteByDeltasUntil; + sprite->callback = TranslateAnimLinearUntil; } static void sub_80D9B24(struct Sprite *sprite) diff --git a/src/battle/anim/fire_2.c b/src/battle/anim/fire_2.c index b055d7c80..68e13e1c1 100644 --- a/src/battle/anim/fire_2.c +++ b/src/battle/anim/fire_2.c @@ -241,7 +241,7 @@ static void AnimFireRingStep1(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->callback = AnimFireRingStep2; } @@ -249,7 +249,7 @@ static void AnimFireRingStep1(struct Sprite *sprite) static void AnimFireRingStep2(struct Sprite *sprite) { - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) { sprite->data[0] = 0; diff --git a/src/battle/anim/flying.c b/src/battle/anim/flying.c index e8c50816c..35022db1f 100644 --- a/src/battle/anim/flying.c +++ b/src/battle/anim/flying.c @@ -496,14 +496,14 @@ void sub_80DA16C(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->callback = sub_80785E4; StoreSpriteCallbackInData(sprite, sub_80DA1EC); } void sub_80DA1EC(struct Sprite *sprite) { - if (TranslateAnimSpriteByDeltas(sprite) != 0) + if (TranslateAnimLinear(sprite) != 0) { DestroyAnimSprite(sprite); } @@ -543,7 +543,7 @@ void sub_80DA208(struct Sprite *sprite) sprite->data[2] = sprite->data[2] + gBattleAnimArgs[2]; sprite->data[4] = sprite->data[4] + gBattleAnimArgs[3]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); SeekSpriteAnim(sprite, gBattleAnimArgs[5]); @@ -596,14 +596,14 @@ void sub_80DA38C(struct Sprite *sprite) sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->callback = sub_80DA410; } void sub_80DA410(struct Sprite *sprite) { sprite->data[0] = 1; - TranslateAnimSpriteByDeltas(sprite); + TranslateAnimLinear(sprite); if (((u16)sprite->data[3] >> 8) > 200) { diff --git a/src/battle/anim/flying_path.c b/src/battle/anim/flying_path.c index b190e9e8c..d2f85ad35 100644 --- a/src/battle/anim/flying_path.c +++ b/src/battle/anim/flying_path.c @@ -102,7 +102,7 @@ void sub_80CBDF4(u8 taskId) gSprites[task->data[2]].data[3] = task->data[9]; gSprites[task->data[2]].data[4] = task->data[7] + (task->data[11] / 2 + 10) * task->data[5]; gSprites[task->data[2]].data[5] = sub_80CC338(&gSprites[task->data[2]]); - InitAnimSpriteTranslationOverDuration(&gSprites[task->data[2]]); + InitAnimArcTranslation(&gSprites[task->data[2]]); task->func = sub_80CBF5C; } @@ -115,7 +115,7 @@ static void sub_80CBF5C(u8 taskId) { case 4: sub_80CC358(task, taskId); - if (TranslateAnimSpriteLinearAndSine(sprite) == 0) + if (TranslateAnimArc(sprite) == 0) { break; } @@ -127,7 +127,7 @@ static void sub_80CBF5C(u8 taskId) break; case 8: sub_80CC358(task, taskId); - if (TranslateAnimSpriteLinearAndSine(sprite) == 0) + if (TranslateAnimArc(sprite) == 0) { break; } @@ -139,7 +139,7 @@ static void sub_80CBF5C(u8 taskId) break; case 0: sub_80CC358(task, taskId); - if (TranslateAnimSpriteLinearAndSine(sprite) == 0) + if (TranslateAnimArc(sprite) == 0) break; task->data[15] = 1; @@ -160,12 +160,12 @@ static void sub_80CBF5C(u8 taskId) task->data[3] = a; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); task->data[0]++; break; case 2: sub_80CC358(task, taskId); - if (TranslateAnimSpriteLinearAndSine(sprite) == 0) + if (TranslateAnimArc(sprite) == 0) break; task->data[15] = 3; @@ -185,7 +185,7 @@ static void sub_80CBF5C(u8 taskId) task->data[3] = 2; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); task->data[0]++; break; case 5: @@ -203,12 +203,12 @@ static void sub_80CBF5C(u8 taskId) task->data[3] = 3; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); task->data[0]++; break; case 6: sub_80CC358(task, taskId); - if (TranslateAnimSpriteLinearAndSine(sprite) == 0) + if (TranslateAnimArc(sprite) == 0) break; task->data[15] = 7; @@ -229,7 +229,7 @@ static void sub_80CBF5C(u8 taskId) task->data[3] = 4; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); task->data[0]++; break; case 9: @@ -246,12 +246,12 @@ static void sub_80CBF5C(u8 taskId) task->data[3] = 5; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); task->data[0]++; break; case 10: sub_80CC358(task, taskId); - if (TranslateAnimSpriteLinearAndSine(sprite) == 0) + if (TranslateAnimArc(sprite) == 0) { break; } @@ -277,13 +277,13 @@ static void sub_80CBF5C(u8 taskId) task->data[3] = 6; sprite->subpriority = task->data[4]; StartSpriteAnim(sprite, task->data[3]); - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); task->data[0]++; break; } case 12: sub_80CC358(task, taskId); - if (TranslateAnimSpriteLinearAndSine(sprite) != 0) + if (TranslateAnimArc(sprite) != 0) { DestroySprite(sprite); task->data[0]++; diff --git a/src/battle/anim/ghost.c b/src/battle/anim/ghost.c index 85879c86c..c11cea5a0 100644 --- a/src/battle/anim/ghost.c +++ b/src/battle/anim/ghost.c @@ -1,35 +1,53 @@ #include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "blend_palette.h" +#include "palette.h" +#include "rom_8077ABC.h" +#include "scanline_effect.h" #include "sound.h" -#include "constants/songs.h" #include "trig.h" -#include "rom_8077ABC.h" -#include "battle_anim.h" +#include "constants/battle_constants.h" +#include "constants/songs.h" extern s16 gBattleAnimArgs[]; +extern u8 gBankSpriteIds[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; extern u8 gUnknown_0202F7D2; -void sub_80DDB6C(struct Sprite *sprite); -void sub_80DDBD8(struct Sprite *); -void sub_80DDC4C(struct Sprite *); -void sub_80DDCC8(struct Sprite *); -void sub_80DDD58(struct Sprite *sprite); -void sub_80DDD78(struct Sprite *); -void sub_80DDE7C(u8 taskId); -void sub_80DDED0(u8 taskId); -void sub_80DDF40(struct Sprite *sprite); -void sub_80DDFE8(struct Sprite *); -void sub_80DE0FC(struct Sprite *sprite); -void sub_80DE114(struct Sprite *); -void sub_80DE2DC(u8 taskId); -void sub_80DE3D4(u8 taskId); -void sub_80DE7B8(struct Sprite *sprite); -void sub_80DEF3C(struct Sprite *sprite); -void sub_80DF0B8(struct Sprite *sprite); -void sub_80DF0B8(struct Sprite *sprite); -void sub_80DF3D8(struct Sprite *sprite); -void sub_80DF49C(struct Sprite *sprite); +static void sub_80DDB6C(struct Sprite *sprite); +static void sub_80DDBD8(struct Sprite *); +static void sub_80DDC4C(struct Sprite *); +static void sub_80DDCC8(struct Sprite *); +static void sub_80DDD58(struct Sprite *sprite); +static void sub_80DDD78(struct Sprite *); +static void sub_80DDE7C(u8 taskId); +static void sub_80DDED0(u8 taskId); +static void sub_80DDF40(struct Sprite *sprite); +static void sub_80DDFE8(struct Sprite *); +static void sub_80DE0FC(struct Sprite *sprite); +static void sub_80DE114(struct Sprite *); +static void sub_80DE2DC(u8 taskId); +static void sub_80DE3D4(u8 taskId); +static void sub_80DE7B8(struct Sprite *sprite); +static void sub_80DEF3C(struct Sprite *sprite); +static void sub_80DF0B8(struct Sprite *sprite); +static void sub_80DF3D8(struct Sprite *sprite); +static void sub_80DF49C(struct Sprite *sprite); +static void sub_80DE61C(u8 taskId); +static void sub_80DE6B0(u8 taskId); +static void sub_80DE8D8(struct Sprite *sprite); +static void sub_80DEB38(u8 taskId); +static void sub_80DED60(u8 taskId); +static void sub_80DEEE8(u8 taskId); +static void sub_80DEF98(struct Sprite *sprite); +static void sub_80DF018(struct Sprite *sprite); +static void sub_80DF090(struct Sprite *sprite); +static void sub_80DF18C(struct Sprite *sprite); +static void sub_80DF24C(u8 taskId); +static void sub_80DF4F4(struct Sprite *sprite); + const union AffineAnimCmd gSpriteAffineAnim_83DAE48[] = { @@ -204,7 +222,7 @@ const struct SpriteTemplate gSpriteTemplate_83DAF98 = .callback = sub_80DF49C, }; -void sub_80DDB6C(struct Sprite *sprite) +static void sub_80DDB6C(struct Sprite *sprite) { InitAnimSpritePos(sprite, 1); sprite->data[0] = gBattleAnimArgs[2]; @@ -219,16 +237,17 @@ void sub_80DDB6C(struct Sprite *sprite) REG_BLDALPHA = sprite->data[6]; } -void sub_80DDBD8(struct Sprite *sprite) +static void sub_80DDBD8(struct Sprite *sprite) { s16 r0; s16 r2; sub_80DDCC8(sprite); - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) { sprite->callback = sub_80DDC4C; return; } + sprite->pos2.x += Sin(sprite->data[5], 10); sprite->pos2.y += Cos(sprite->data[5], 15); r2 = sprite->data[5]; @@ -241,24 +260,26 @@ void sub_80DDBD8(struct Sprite *sprite) PlaySE12WithPanning(SE_W109, gUnknown_0202F7D2); } -void sub_80DDC4C(struct Sprite *sprite) +static void sub_80DDC4C(struct Sprite *sprite) { s16 r2; s16 r0; sprite->data[0] = 1; - TranslateAnimSpriteByDeltas(sprite); - sprite->pos2.x += Sin(sprite->data[5],10); - sprite->pos2.y += Cos(sprite->data[5],15); + TranslateAnimLinear(sprite); + sprite->pos2.x += Sin(sprite->data[5], 10); + sprite->pos2.y += Cos(sprite->data[5], 15); r2 = sprite->data[5]; sprite->data[5] = (sprite->data[5] + 5) & 0xFF; r0 = sprite->data[5]; - if(r2 == 0 || r2 > 196) - if(r0 > 0) + if (r2 == 0 || r2 > 196) + { + if (r0 > 0) PlaySE(SE_W109); + } - if(sprite->data[6] == 0) + if (sprite->data[6] == 0) { sprite->invisible = TRUE; sprite->callback = sub_807861C; @@ -267,13 +288,13 @@ void sub_80DDC4C(struct Sprite *sprite) sub_80DDCC8(sprite); } -void sub_80DDCC8(struct Sprite *sprite) +static void sub_80DDCC8(struct Sprite *sprite) { s16 r0; - if(sprite->data[6] > 0xFF) + if (sprite->data[6] > 0xFF) { - if(++sprite->data[6] == 0x10d) + if (++sprite->data[6] == 0x10d) sprite->data[6] = 0; return; } @@ -281,32 +302,30 @@ void sub_80DDCC8(struct Sprite *sprite) r0 = sprite->data[7]; sprite->data[7]++; - if((r0 & 0xFF) == 0) + if ((r0 & 0xFF) == 0) { sprite->data[7] &= 0xff00; - if((sprite->data[7] & 0x100) != 0) + if ((sprite->data[7] & 0x100) != 0) sprite->data[6]++; else sprite->data[6]--; + + REG_BLDALPHA = BLDALPHA_BLEND(sprite->data[6], 16 - sprite->data[6]); + if (sprite->data[6] == 0 || sprite->data[6] == 16) + sprite->data[7] ^= 0x100; + if (sprite->data[6] == 0) + sprite->data[6] = 0x100; } - else - return; - - REG_BLDALPHA = BLDALPHA_BLEND(sprite->data[6], 16 - sprite->data[6]); - if(sprite->data[6] == 0 || sprite->data[6] == 16) - sprite->data[7] ^= 0x100; - if(sprite->data[6] == 0) - sprite->data[6] = 0x100; } -void sub_80DDD58(struct Sprite *sprite) +static void sub_80DDD58(struct Sprite *sprite) { sub_8078764(sprite, 1); sprite->callback = sub_80DDD78; sub_80DDD78(sprite); } -void sub_80DDD78(struct Sprite *sprite) +static void sub_80DDD78(struct Sprite *sprite) { u16 temp1; sprite->pos2.x = Sin(sprite->data[0], 32); @@ -340,7 +359,7 @@ void sub_80DDDF0(u8 taskId) gTasks[taskId].func = sub_80DDE7C; } -void sub_80DDE7C(u8 taskId) +static void sub_80DDE7C(u8 taskId) { gTasks[taskId].data[10] += 1; if (gTasks[taskId].data[10] == 3) @@ -351,11 +370,12 @@ void sub_80DDE7C(u8 taskId) REG_BLDALPHA = gTasks[taskId].data[3] << 8 | gTasks[taskId].data[2]; if (gTasks[taskId].data[2] != 9) return; + gTasks[taskId].func = sub_80DDED0; } } -void sub_80DDED0(u8 taskId) +static void sub_80DDED0(u8 taskId) { u8 spriteId; if (gTasks[taskId].data[1] > 0) @@ -363,20 +383,23 @@ void sub_80DDED0(u8 taskId) gTasks[taskId].data[1] -= 1; return; } + spriteId = GetAnimBattlerSpriteId(0); gTasks[taskId].data[0] += 8; if (gTasks[taskId].data[0] <= 0xFF) { obj_id_set_rotscale(spriteId, gTasks[taskId].data[0], gTasks[taskId].data[0], 0); - return; } - sub_8078F40(spriteId); - DestroyAnimVisualTask(taskId); - REG_BLDCNT = 0; - REG_BLDALPHA = 0; + else + { + sub_8078F40(spriteId); + DestroyAnimVisualTask(taskId); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + } } -void sub_80DDF40(struct Sprite *sprite) +static void sub_80DDF40(struct Sprite *sprite) { u16 r5, r6; r5 = sprite->pos1.x; @@ -394,7 +417,7 @@ void sub_80DDF40(struct Sprite *sprite) sprite->callback = sub_80DDFE8; } -void sub_80DDFE8(struct Sprite *sprite) +static void sub_80DDFE8(struct Sprite *sprite) { switch (sprite->data[0]) { @@ -438,7 +461,7 @@ void sub_80DDFE8(struct Sprite *sprite) } } -void sub_80DE0FC(struct Sprite *sprite) +static void sub_80DE0FC(struct Sprite *sprite) { sub_8078764(sprite, 1); sprite->callback = sub_80DE114; @@ -446,7 +469,7 @@ void sub_80DE0FC(struct Sprite *sprite) /* NONMATCHING */ NAKED -void sub_80DE114(struct Sprite *sprite) +static void sub_80DE114(struct Sprite *sprite) { asm_unified("\tpush {r4-r6,lr}\n" "\tadds r3, r0, 0\n" @@ -570,7 +593,7 @@ void sub_80DE1B0(u8 taskId) task->func = sub_80DE2DC; } -void sub_80DE2DC(u8 taskId) +static void sub_80DE2DC(u8 taskId) { struct Task *task; @@ -613,5 +636,735 @@ void sub_80DE3AC(u8 taskId) task = &gTasks[taskId]; task->data[15] = 0; task->func = sub_80DE3D4; - sub_80DE3D4(taskId); + task->func(taskId); +} + +static void sub_80DE3D4(u8 taskId) +{ + s16 startLine; + struct Task *task = &gTasks[taskId]; + u8 position = GetBattlerPosition_permutated(gAnimBankTarget); + + switch (task->data[15]) + { + case 0: + task->data[14] = AllocSpritePalette(0x2771); + if (task->data[14] == 0xFF) + { + DestroyAnimVisualTask(taskId); + } + else + { + task->data[0] = duplicate_obj_of_side_rel2move_in_transparent_mode(1); + if (task->data[0] < 0) + { + FreeSpritePaletteByTag(0x2771); + DestroyAnimVisualTask(taskId); + } + else + { + gSprites[task->data[0]].oam.paletteNum = task->data[14]; + gSprites[task->data[0]].oam.objMode = ST_OAM_OBJ_NORMAL; + gSprites[task->data[0]].oam.priority = 3; + task->data[1] = 0; + task->data[2] = 0; + task->data[3] = 16; + task->data[13] = GetAnimBattlerSpriteId(1); + task->data[4] = (gSprites[task->data[13]].oam.paletteNum + 16) * 16; + if (position == 1) + REG_DISPCNT &= 0xFDFF; + else + REG_DISPCNT &= 0xFBFF; + + task->data[15]++; + } + } + break; + case 1: + task->data[14] = (task->data[14] + 16) * 16; + CpuSet(&gPlttBufferUnfaded[task->data[4]], &gPlttBufferFaded[task->data[14]], 0x4000008); + BlendPalette(task->data[4], 16, 10, RGB(13, 0, 15)); + task->data[15]++; + break; + case 2: + startLine = gSprites[task->data[13]].pos1.y + gSprites[task->data[13]].pos2.y - 32; + if (startLine < 0) + startLine = 0; + + if (position == 1) + task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 4, 1); + else + task->data[10] = ScanlineEffect_InitWave(startLine, startLine + 64, 2, 6, 0, 8, 1); + + task->data[15]++; + break; + case 3: + if (position == 1) + REG_BLDCNT = 0x3F42; + else + REG_BLDCNT = 0x3F44; + + REG_BLDALPHA = 0x1000; + task->data[15]++; + break; + case 4: + if (position == 1) + REG_DISPCNT |= DISPCNT_BG1_ON; + else + REG_DISPCNT |= DISPCNT_BG2_ON; + + task->func = sub_80DE61C; + task->data[15]++; + break; + default: + task->data[15]++; + break; + } +} + +static void sub_80DE61C(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + task->data[1]++; + task->data[5] = task->data[1] & 1; + if (task->data[5] == 0) + task->data[2] = gSineTable[task->data[1]] / 18; + + if (task->data[5] == 1) + task->data[3] = 16 - (gSineTable[task->data[1]] / 18); + + REG_BLDALPHA = (task->data[3] << 8) | task->data[2]; + if (task->data[1] == 128) + { + task->data[15] = 0; + task->func = sub_80DE6B0; + task->func(taskId); + } +} + +static void sub_80DE6B0(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + u8 position = GetBattlerPosition_permutated(gAnimBankTarget); + + switch (task->data[15]) + { + case 0: + gScanlineEffect.state = 3; + task->data[14] = GetAnimBattlerSpriteId(1); + if (position == 1) + REG_DISPCNT &= 0xFDFF; + else + REG_DISPCNT &= 0xFBFF; + break; + case 1: + BlendPalette(task->data[4], 16, 0, RGB(13, 0, 15)); + break; + case 2: + gSprites[task->data[14]].invisible = 1; + obj_delete_but_dont_free_vram(&gSprites[task->data[0]]); + FreeSpritePaletteByTag(0x2771); + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + if (position == 1) + REG_DISPCNT |= DISPCNT_BG1_ON; + else + REG_DISPCNT |= DISPCNT_BG2_ON; + + DestroyAnimVisualTask(taskId); + break; + } + + task->data[15]++; +} + +static void sub_80DE7B8(struct Sprite *sprite) +{ + s16 battler1X, battler1Y; + s16 battler2X, battler2Y; + s16 yDiff; + + if (gBattleAnimArgs[0] == 0) + { + battler1X = GetBattlerSpriteCoord(gAnimBankAttacker, 0); + battler1Y = GetBattlerSpriteCoord(gAnimBankAttacker, 1) + 28; + battler2X = GetBattlerSpriteCoord(gAnimBankTarget, 0); + battler2Y = GetBattlerSpriteCoord(gAnimBankTarget, 1) + 28; + } + else + { + battler1X = GetBattlerSpriteCoord(gAnimBankTarget, 0); + battler1Y = GetBattlerSpriteCoord(gAnimBankTarget, 1) + 28; + battler2X = GetBattlerSpriteCoord(gAnimBankAttacker, 0); + battler2Y = GetBattlerSpriteCoord(gAnimBankAttacker, 1) + 28; + } + + yDiff = battler2Y - battler1Y; + sprite->data[0] = battler1X * 16; + sprite->data[1] = battler1Y * 16; + sprite->data[2] = ((battler2X - battler1X) * 16) / gBattleAnimArgs[1]; + sprite->data[3] = (yDiff * 16) / gBattleAnimArgs[1]; + sprite->data[4] = gBattleAnimArgs[1]; + sprite->data[5] = battler2X; + sprite->data[6] = battler2Y; + sprite->data[7] = sprite->data[4] / 2; + sprite->oam.priority = 2; + sprite->pos1.x = battler1X; + sprite->pos1.y = battler1Y; + sprite->callback = sub_80DE8D8; + sprite->invisible = 1; +} + +static void sub_80DE8D8(struct Sprite *sprite) +{ + if (sprite->data[4]) + { + sprite->data[0] += sprite->data[2]; + sprite->data[1] += sprite->data[3]; + sprite->pos1.x = sprite->data[0] >> 4; + sprite->pos1.y = sprite->data[1] >> 4; + if (--sprite->data[4] == 0) + sprite->data[0] = 0; + } +} + +void sub_80DE918(u8 taskId) +{ + struct Task *task; + s16 battler; + u8 spriteId; + s16 baseX, baseY; + s16 x, y; + + task = &gTasks[taskId]; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x1000; + task->data[5] = 0; + task->data[6] = 0; + task->data[7] = 0; + task->data[8] = 0; + task->data[9] = 16; + task->data[10] = gBattleAnimArgs[0]; + + baseX = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + baseY = sub_807A100(gAnimBankAttacker, 3); + if (!IsContest()) + { + for (battler = 0; battler < 4; battler++) + { + if (battler != gAnimBankAttacker + && battler != (gAnimBankAttacker ^ 2) + && IsAnimBankSpriteVisible(battler)) + { + spriteId = CreateSprite(&gSpriteTemplate_83DAF08, baseX, baseY, 55); + if (spriteId != MAX_SPRITES) + { + x = GetBattlerSpriteCoord(battler, 2); + y = sub_807A100(battler, 3); + gSprites[spriteId].data[0] = baseX << 4; + gSprites[spriteId].data[1] = baseY << 4; + gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1]; + gSprites[spriteId].data[3] = ((y - baseY) << 4) / gBattleAnimArgs[1]; + gSprites[spriteId].data[4] = gBattleAnimArgs[1]; + gSprites[spriteId].data[5] = x; + gSprites[spriteId].data[6] = y; + gSprites[spriteId].callback = sub_80DE8D8; + + task->data[task->data[12] + 13] = spriteId; + task->data[12]++; + } + } + } + } + else + { + spriteId = CreateSprite(&gSpriteTemplate_83DAF08, baseX, baseY, 55); + if (spriteId != MAX_SPRITES) + { + x = 48; + y = 40; + gSprites[spriteId].data[0] = baseX << 4; + gSprites[spriteId].data[1] = baseY << 4; + gSprites[spriteId].data[2] = ((x - baseX) << 4) / gBattleAnimArgs[1]; + gSprites[spriteId].data[3] = ((y - baseY) << 4) / gBattleAnimArgs[1]; + gSprites[spriteId].data[4] = gBattleAnimArgs[1]; + gSprites[spriteId].data[5] = x; + gSprites[spriteId].data[6] = y; + gSprites[spriteId].callback = sub_80DE8D8; + + task->data[13] = spriteId; + task->data[12] = 1; + } + } + + task->func = sub_80DEB38; +} + +static void sub_80DEB38(u8 taskId) +{ + u16 i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (task->data[6] == 0) + { + if (++task->data[5] > 1) + { + task->data[5] = 0; + task->data[7]++; + if (task->data[7] & 1) + { + if (task->data[8] < 16) + task->data[8]++; + } + else + { + if (task->data[9]) + task->data[9]--; + } + + REG_BLDALPHA = (task->data[9] << 8) | task->data[8]; + if (task->data[7] >= 24) + { + task->data[7] = 0; + task->data[6] = 1; + } + } + } + + if (task->data[10]) + task->data[10]--; + else if (task->data[6]) + task->data[0]++; + break; + case 1: + if (++task->data[5] > 1) + { + task->data[5] = 0; + task->data[7]++; + if (task->data[7] & 1) + { + if (task->data[8]) + task->data[8]--; + } + else + { + if (task->data[9] < 16) + task->data[9]++; + } + + REG_BLDALPHA = (task->data[9] << 8) | task->data[8]; + if (task->data[8] == 0 && task->data[9] == 16) + { + for (i = 0; i < task->data[12]; i++) + DestroySprite(&gSprites[task->data[i + 13]]); + + task->data[0]++; + } + } + break; + case 2: + if (++task->data[5] > 0) + task->data[0]++; + break; + case 3: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_80DECB0(u8 taskId) +{ + s16 startX, startY; + s16 leftDistance, topDistance, bottomDistance, rightDistance; + + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F1F; + REG_BLDCNT = 0xC8; + REG_BLDY = 0x10; + + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER || IsContest()) + startX = 40; + else + startX = 200; + + gBattle_WIN0H = (startX << 8) | startX; + startY = 40; + gBattle_WIN0V = (startY << 8) | startY; + + leftDistance = startX; + rightDistance = 240 - startX; + topDistance = startY; + bottomDistance = 72; + gTasks[taskId].data[1] = leftDistance; + gTasks[taskId].data[2] = rightDistance; + gTasks[taskId].data[3] = topDistance; + gTasks[taskId].data[4] = bottomDistance; + gTasks[taskId].data[5] = startX; + gTasks[taskId].data[6] = startY; + gTasks[taskId].func = sub_80DED60; +} + +static void sub_80DED60(u8 taskId) +{ + s16 step; + s16 leftDistance, rightDistance, topDistance, bottomDistance; + s16 startX, startY; + u16 left, right, top, bottom; + u16 selectedPalettes; + + step = gTasks[taskId].data[0]; + gTasks[taskId].data[0]++; + leftDistance = gTasks[taskId].data[1]; + rightDistance = gTasks[taskId].data[2]; + topDistance = gTasks[taskId].data[3]; + bottomDistance = gTasks[taskId].data[4]; + startX = gTasks[taskId].data[5]; + startY = gTasks[taskId].data[6]; + + if (step < 16) + { + left = startX - (leftDistance * 0.0625) * step; + right = startX + (rightDistance * 0.0625) * step; + top = startY - (topDistance * 0.0625) * step; + bottom = startY + (bottomDistance * 0.0625) * step; + } + else + { + left = 0; + right = 240; + top = 0; + bottom = 112; + selectedPalettes = sub_80791A8(1, 0, 0, 0, 0, 0, 0); + BeginNormalPaletteFade(selectedPalettes, 0, 16, 16, RGB(0, 0, 0)); + gTasks[taskId].func = sub_80DEEE8; + } + + gBattle_WIN0H = (left << 8) | right; + gBattle_WIN0V = (top << 8) | bottom; +} + +static void sub_80DEEE8(u8 taskId) +{ + if (!gPaletteFade.active) + { + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + REG_BLDCNT = 0; + REG_BLDY = 0; + DestroyAnimVisualTask(taskId); + } +} + +static void sub_80DEF3C(struct Sprite *sprite) +{ + s16 xDelta; + s16 xDelta2; + + InitAnimSpritePos(sprite, 1); + if (GetBattlerSide(gAnimBankAttacker) == B_SIDE_PLAYER) + { + xDelta = 24; + xDelta2 = -2; + sprite->oam.matrixNum = 8; + } + else + { + xDelta = -24; + xDelta2 = 2; + } + + sprite->pos1.x += xDelta; + sprite->data[1] = xDelta2; + sprite->data[0] = 60; + sprite->callback = sub_80DEF98; +} + +static void sub_80DEF98(struct Sprite *sprite) +{ + u16 var0; + + if (sprite->data[0] > 0) + { + sprite->data[0]--; + } + else + { + sprite->pos2.x += sprite->data[1]; + var0 = sprite->pos2.x + 7; + if (var0 > 14) + { + sprite->pos1.x += sprite->pos2.x; + sprite->pos2.x = 0; + sprite->oam.tileNum += 8; + if (++sprite->data[2] == 3) + { + sprite->data[0] = 30; + sprite->callback = WaitAnimForDuration; + StoreSpriteCallbackInData(sprite, sub_80DF018); + } + else + { + sprite->data[0] = 40; + } + } + } +} + +static void sub_80DF018(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x0010; + sprite->data[0]++; + sprite->data[1] = 0; + sprite->data[2] = 0; + } + else if (sprite->data[1] < 2) + { + sprite->data[1]++; + } + else + { + sprite->data[1] = 0; + sprite->data[2]++; + REG_BLDALPHA = (16 - sprite->data[2]) | (sprite->data[2] << 8); + if (sprite->data[2] == 16) + { + sprite->invisible = 1; + sprite->callback = sub_80DF090; + } + } +} + +static void sub_80DF090(struct Sprite *sprite) +{ + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + DestroyAnimSprite(sprite); +} + +static void sub_80DF0B8(struct Sprite *sprite) +{ + u16 coeffB; + u16 coeffA; + + sprite->pos2.x = Sin(sprite->data[0], 12); + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + sprite->pos2.x = -sprite->pos2.x; + + sprite->data[0] = (sprite->data[0] + 6) & 0xFF; + sprite->data[1] += 0x100; + sprite->pos2.y = -(sprite->data[1] >> 8); + + sprite->data[7]++; + if (sprite->data[7] == 1) + { + sprite->data[6] = 0x050B; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = sprite->data[6]; + } + else if (sprite->data[7] > 30) + { + sprite->data[2]++; + coeffB = sprite->data[6] >> 8; + coeffA = sprite->data[6] & 0xFF; + + if (++coeffB > 16) + coeffB = 16; + if (--(s16)coeffA < 0) + coeffA = 0; + + REG_BLDALPHA = (coeffB << 8) | coeffA; + sprite->data[6] = (coeffB << 8) | coeffA; + if (coeffB == 16 && coeffA == 0) + { + sprite->invisible = 1; + sprite->callback = sub_80DF18C; + } + } +} + +static void sub_80DF18C(struct Sprite *sprite) +{ + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimSprite(sprite); +} + +void sub_80DF1A4(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + task->data[0] = 0; + task->data[1] = 16; + task->data[9] = GetBattlerSpriteCoord(gAnimBankAttacker, 2); + task->data[10] = sub_8077FC0(gAnimBankAttacker); + task->data[11] = (sub_807A100(gAnimBankAttacker, 1) / 2) + 8; + task->data[7] = 0; + task->data[5] = sub_8079ED4(gAnimBankAttacker); + task->data[6] = sub_8079E90(gAnimBankAttacker) - 2; + task->data[3] = 0; + task->data[4] = 16; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x1000; + task->data[8] = 0; + task->func = sub_80DF24C; +} + +static void sub_80DF24C(u8 taskId) +{ + u16 i; + u8 spriteId; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + for (i = 0; i < 6; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_83DAF80, task->data[9], task->data[10], task->data[6]); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].data[0] = taskId; + gSprites[spriteId].data[1] = GetBattlerSide(gAnimBankAttacker) == B_SIDE_PLAYER; + + gSprites[spriteId].data[2] = (i * 42) & 0xFF; + gSprites[spriteId].data[3] = task->data[11]; + gSprites[spriteId].data[5] = i * 6; + task->data[7]++; + } + } + + task->data[0]++; + break; + case 1: + if (++task->data[1] & 1) + { + if (task->data[3] < 14) + task->data[3]++; + } + else + { + if (task->data[4] > 4) + task->data[4]--; + } + + if (task->data[3] == 14 && task->data[4] == 4) + { + task->data[1] = 0; + task->data[0]++; + } + + REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; + break; + case 2: + if (++task->data[1] > 30) + { + task->data[1] = 0; + task->data[0]++; + } + break; + case 3: + if (++task->data[1] & 1) + { + if (task->data[3] > 0) + task->data[3]--; + } + else + { + if (task->data[4] < 16) + task->data[4]++; + } + + if (task->data[3] == 0 && task->data[4] == 16) + { + task->data[8] = 1; + task->data[0]++; + } + + REG_BLDALPHA = (task->data[4] << 8) | task->data[3]; + break; + case 4: + if (task->data[7] == 0) + task->data[0]++; + break; + case 5: + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroyAnimVisualTask(taskId); + break; + } +} + +static void sub_80DF3D8(struct Sprite *sprite) +{ + u16 index; + + if (sprite->data[1] == 0) + sprite->data[2] += 2; + else + sprite->data[2] -= 2; + + sprite->data[2] &= 0xFF; + sprite->pos2.x = Sin(sprite->data[2], sprite->data[3]); + + index = sprite->data[2] - 65; + if (index < 127) + sprite->oam.priority = gTasks[sprite->data[0]].data[5] + 1; + else + sprite->oam.priority = gTasks[sprite->data[0]].data[5]; + + sprite->data[5]++; + sprite->data[6] = (sprite->data[5] * 8) & 0xFF; + sprite->pos2.y = Sin(sprite->data[6], 7); + if (gTasks[sprite->data[0]].data[8]) + { + gTasks[sprite->data[0]].data[7]--; + DestroySprite(sprite); + } +} + +static void sub_80DF49C(struct Sprite *sprite) +{ + sprite->invisible = 1; + sprite->data[5] = gBankSpriteIds[gAnimBankAttacker]; + sprite->data[0] = 128; + sprite->data[1] = 10; + sprite->data[2] = gBattleAnimArgs[0]; + sprite->data[3] = gBattleAnimArgs[1]; + sprite->callback = sub_80DF4F4; + + gSprites[sprite->data[5]].pos1.y += 8; +} + +static void sub_80DF4F4(struct Sprite *sprite) +{ + if (sprite->data[3]) + { + sprite->data[3]--; + gSprites[sprite->data[5]].pos2.x = Sin(sprite->data[0], sprite->data[1]); + gSprites[sprite->data[5]].pos2.y = Cos(sprite->data[0], sprite->data[1]); + sprite->data[0] += sprite->data[2]; + if (sprite->data[0] > 255) + sprite->data[0] -= 256; + } + else + { + gSprites[sprite->data[5]].pos2.x = 0; + gSprites[sprite->data[5]].pos2.y = 0; + gSprites[sprite->data[5]].pos1.y -= 8; + sprite->callback = move_anim_8074EE0; + } } diff --git a/src/battle/anim/grip.c b/src/battle/anim/grip.c index 1ec779c09..b5c191449 100644 --- a/src/battle/anim/grip.c +++ b/src/battle/anim/grip.c @@ -67,7 +67,7 @@ void sub_80D0178(struct Sprite* sprite) sprite->data[0] = 6; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + r8; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + r6; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, sub_80D020C); } diff --git a/src/battle/anim/ground.c b/src/battle/anim/ground.c index 67b4c9c9c..cf73ead2f 100644 --- a/src/battle/anim/ground.c +++ b/src/battle/anim/ground.c @@ -160,13 +160,13 @@ static void AnimBonemerangProjectile(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); sprite->data[5] = -40; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = AnimBonemerangProjectileStep; } static void AnimBonemerangProjectileStep(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) { sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; @@ -176,14 +176,14 @@ static void AnimBonemerangProjectileStep(struct Sprite *sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankAttacker, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankAttacker, 3); sprite->data[5] = 40; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = AnimBonemerangProjectileEnd; } } static void AnimBonemerangProjectileEnd(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) DestroyAnimSprite(sprite); } @@ -203,7 +203,7 @@ static void AnimBoneHitProjectile(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + gBattleAnimArgs[3]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -233,7 +233,7 @@ static void AnimDirtScatter(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = targetXPos + xOffset; sprite->data[4] = targetYPos + yOffset; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, move_anim_8074EE0); } @@ -537,13 +537,13 @@ static void AnimFissureDirtPlumeParticle(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[4]; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = AnimFissureDirtPlumeParticleStep; } static void AnimFissureDirtPlumeParticleStep(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) DestroyAnimSprite(sprite); } diff --git a/src/battle/anim/guard.c b/src/battle/anim/guard.c index 341f74372..b1f194ef5 100644 --- a/src/battle/anim/guard.c +++ b/src/battle/anim/guard.c @@ -61,6 +61,6 @@ void sub_80D3014(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y - 72; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/guillotine.c b/src/battle/anim/guillotine.c index eb1bc7733..bc0fce4dd 100644 --- a/src/battle/anim/guillotine.c +++ b/src/battle/anim/guillotine.c @@ -71,7 +71,7 @@ void sub_80D0228(struct Sprite* sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + r9; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + r6; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[0]; sprite->data[6] = sprite->data[0]; sprite->callback = sub_80D02D0; @@ -79,7 +79,7 @@ void sub_80D0228(struct Sprite* sprite) static void sub_80D02D0(struct Sprite* sprite) { - if (TranslateAnimSpriteByDeltas(sprite) && sprite->animEnded == 1) + if (TranslateAnimLinear(sprite) && sprite->animEnded == 1) { SeekSpriteAnim(sprite, 0); sprite->animPaused = 1; @@ -119,6 +119,6 @@ static void sub_80D0344(struct Sprite* sprite) static void sub_80D03A8(struct Sprite* sprite) { - if (TranslateAnimSpriteByDeltas(sprite) != 0) + if (TranslateAnimLinear(sprite) != 0) DestroyAnimSprite(sprite); } diff --git a/src/battle/anim/heal_bell.c b/src/battle/anim/heal_bell.c index 09029c9ff..c9f26b093 100644 --- a/src/battle/anim/heal_bell.c +++ b/src/battle/anim/heal_bell.c @@ -126,7 +126,7 @@ void sub_80D1C08(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankAttacker, 0) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankAttacker, 1) + gBattleAnimArgs[3]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); sub_80D1BA8(sprite, gBattleAnimArgs[5], gBattleAnimArgs[6]); } diff --git a/src/battle/anim/leaf.c b/src/battle/anim/leaf.c index d31e4dbd6..2d36d7360 100644 --- a/src/battle/anim/leaf.c +++ b/src/battle/anim/leaf.c @@ -207,7 +207,7 @@ void AnimTranslateLinearSingleSineWave(struct Sprite* sprite) } sprite->data[5] = gBattleAnimArgs[5]; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); if (GetBattlerSide(gAnimBankAttacker) == GetBattlerSide(gAnimBankTarget)) { sprite->data[0] = 1; @@ -228,7 +228,7 @@ static void AnimTranslateLinearSingleSineWaveStep(struct Sprite* sprite) s16 r0; sprite->data[0] = 1; - TranslateAnimSpriteLinearAndSine(sprite); + TranslateAnimArc(sprite); r0 = sprite->data[7]; sprite->data[0] = a; if (b > 0xC8 && r0 <= 0x37 && sprite->oam.affineParam == 0) diff --git a/src/battle/anim/musical.c b/src/battle/anim/musical.c index 17836ace7..b67cd17b8 100644 --- a/src/battle/anim/musical.c +++ b/src/battle/anim/musical.c @@ -368,14 +368,14 @@ void sub_80CEE60(struct Sprite* sprite) sprite->data[2] = a + sprite->data[1]; sprite->data[3] = sprite->pos1.y; sprite->data[4] = sprite->data[3] - 40; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = sub_80CEEE8; } static void sub_80CEEE8(struct Sprite* sprite) { - if (TranslateAnimSpriteByDeltas(sprite) == 0) + if (TranslateAnimLinear(sprite) == 0) { s16 a; a = Sin(sprite->data[5], 8); diff --git a/src/battle/anim/normal.c b/src/battle/anim/normal.c index 4d481836c..7564c529c 100644 --- a/src/battle/anim/normal.c +++ b/src/battle/anim/normal.c @@ -2,12 +2,16 @@ #include "battle.h" #include "battle_anim.h" #include "blend_palette.h" +#include "decompress.h" +#include "ewram.h" #include "palette.h" #include "random.h" #include "rom_8077ABC.h" +#include "sound.h" #include "task.h" #include "trig.h" #include "constants/battle_constants.h" +#include "constants/songs.h" extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; @@ -16,24 +20,43 @@ extern u8 gHealthboxIDs[]; extern u8 gBattlersCount; extern u8 gBankSpriteIds[]; extern u8 gBattleTerrain; +extern u16 gBattlerPartyIndexes[]; +extern u8 gBankTarget; +extern u8 gEffectBank; +extern u8 gBankAttacker; +extern u8 gAnimVisualTaskCount; + +extern const u8 gUnknown_08D20A14[]; +extern const u8 gUnknown_08D20A30[]; +extern const u8 gBattleStatMask1_Tilemap[]; +extern const u8 gBattleStatMask2_Tilemap[]; +extern const u8 gBattleStatMask_Gfx[]; +extern const u16 gBattleStatMask1_Pal[]; +extern const u16 gBattleStatMask2_Pal[]; +extern const u16 gBattleStatMask3_Pal[]; +extern const u16 gBattleStatMask4_Pal[]; +extern const u16 gBattleStatMask5_Pal[]; +extern const u16 gBattleStatMask6_Pal[]; +extern const u16 gBattleStatMask7_Pal[]; +extern const u16 gBattleStatMask8_Pal[]; extern void sub_80DA48C(struct Sprite *); -static void sub_80E1CB4(struct Sprite *sprite); -static void sub_80E1D84(struct Sprite *sprite); +static void AnimConfusionDuck(struct Sprite *sprite); +static void AnimSimplePaletteBlend(struct Sprite *sprite); static void sub_80E1E2C(struct Sprite *sprite); static void sub_80E1F3C(struct Sprite *sprite); static void sub_80E24B8(struct Sprite *sprite); -/*static*/ void sub_80E27A0(struct Sprite *sprite); +static void sub_80E27A0(struct Sprite *sprite); static void sub_80E2838(struct Sprite *sprite); static void sub_80E2870(struct Sprite *sprite); static void sub_80E2908(struct Sprite *sprite); static void sub_80E2978(struct Sprite *sprite); static void sub_80E29C0(struct Sprite *sprite); static void sub_80E27E8(struct Sprite *sprite); -static void sub_80E1D20(struct Sprite *sprite); -u32 sub_80E1DC4(s16); -static void sub_80E1E0C(struct Sprite *sprite); +static void AnimConfusionDuckStep(struct Sprite *sprite); +static u32 UnpackSelectedBattleAnimPalettes(s16); +static void AnimSimplePaletteBlendStep(struct Sprite *sprite); static void sub_80E1E80(struct Sprite *sprite); static void sub_80E1F0C(struct Sprite *sprite); static void sub_80E1FDC(u8, u8, u8); @@ -46,12 +69,21 @@ static void sub_80E260C(void); static void sub_80E255C(struct Sprite *sprite); static void sub_80E2710(u8 taskId); static void sub_80E29FC(struct Sprite *sprite); -/*static*/ void sub_80E2C8C(u8 taskId, u32 selectedPalettes); +static void sub_80E2C8C(u8 taskId, u32 selectedPalettes); static void sub_80E2CD0(u8 taskId); static void sub_80E2DB8(u8 taskId); -void sub_80E2E10(u8 taskId); - -const union AnimCmd gSpriteAnim_83DB37C[] = +static void sub_80E2E10(u8 taskId); +static void sub_80E2EE8(struct Sprite *sprite); +static void sub_80E3194(u8 taskId); +static void sub_80E3338(u8 taskId); +static void sub_80E3704(u8 taskId); +static void sub_80E38F8(u8 taskId); +static void sub_80E39BC(u32, u16); +static void sub_80E3AD0(u8 taskId); +static void sub_80E3E64(u8 taskId); +static void sub_80E4368(u8 taskId); + +const union AnimCmd gConfusionDuckSpriteAnim1[] = { ANIMCMD_FRAME(0, 8), ANIMCMD_FRAME(4, 8), @@ -60,7 +92,7 @@ const union AnimCmd gSpriteAnim_83DB37C[] = ANIMCMD_JUMP(0), }; -const union AnimCmd gSpriteAnim_83DB390[] = +const union AnimCmd gConfusionDuckSpriteAnim2[] = { ANIMCMD_FRAME(0, 8, .hFlip = TRUE), ANIMCMD_FRAME(4, 8), @@ -69,24 +101,24 @@ const union AnimCmd gSpriteAnim_83DB390[] = ANIMCMD_JUMP(0), }; -const union AnimCmd *const gSpriteAnimTable_83DB3A4[] = +const union AnimCmd *const gConfusionDuckSpriteAnimTable[] = { - gSpriteAnim_83DB37C, - gSpriteAnim_83DB390, + gConfusionDuckSpriteAnim1, + gConfusionDuckSpriteAnim2, }; -const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB3AC = +const struct SpriteTemplate gConfusionDuckSpriteTemplate = { .tileTag = 10073, .paletteTag = 10073, .oam = &gOamData_837DF2C, - .anims = gSpriteAnimTable_83DB3A4, + .anims = gConfusionDuckSpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80E1CB4, + .callback = AnimConfusionDuck, }; -const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB3C4 = +const struct SpriteTemplate gSimplePaletteBlendSpriteTemplate = { .tileTag = 0, .paletteTag = 0, @@ -94,7 +126,7 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB3C4 = .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = sub_80E1D84, + .callback = AnimSimplePaletteBlend, }; const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB3DC = @@ -270,7 +302,13 @@ const struct SpriteTemplate gBattleAnimSpriteTemplate_83DB550 = const u16 gUnknown_083DB568 = RGB(31, 31, 31); -static void sub_80E1CB4(struct Sprite *sprite) +// Moves a spinning duck around the mon's head. +// arg 0: initial x pixel offset +// arg 1: initial y pixel offset +// arg 2: initial wave offset +// arg 3: wave period (higher means faster wave) +// arg 4: duration +static void AnimConfusionDuck(struct Sprite *sprite) { sprite->pos1.x += gBattleAnimArgs[0]; sprite->pos1.y += gBattleAnimArgs[1]; @@ -288,11 +326,11 @@ static void sub_80E1CB4(struct Sprite *sprite) } sprite->data[3] = gBattleAnimArgs[4]; - sprite->callback = sub_80E1D20; + sprite->callback = AnimConfusionDuckStep; sprite->callback(sprite); } -static void sub_80E1D20(struct Sprite *sprite) +static void AnimConfusionDuckStep(struct Sprite *sprite) { sprite->pos2.x = Cos(sprite->data[0], 30); sprite->pos2.y = Sin(sprite->data[0], 10); @@ -307,27 +345,42 @@ static void sub_80E1D20(struct Sprite *sprite) DestroyAnimSprite(sprite); } -static void sub_80E1D84(struct Sprite *sprite) +// Performs a simple color blend on a specified sprite. +// arg 0: palette selector +// arg 1: delay +// arg 2: start blend amount +// arg 3: end blend amount +// arg 4: blend color +static void AnimSimplePaletteBlend(struct Sprite *sprite) { - u32 selectedPalettes = sub_80E1DC4(gBattleAnimArgs[0]); + u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); BeginNormalPaletteFade(selectedPalettes, gBattleAnimArgs[1], gBattleAnimArgs[2], gBattleAnimArgs[3], gBattleAnimArgs[4]); sprite->invisible = 1; - sprite->callback = sub_80E1E0C; + sprite->callback = AnimSimplePaletteBlendStep; } -u32 sub_80E1DC4(s16 a) -{ - u8 arg0 = a & 1; - u8 arg1 = (a >> 1) & 1; - u8 arg2 = (a >> 2) & 1; - u8 arg3 = (a >> 3) & 1; - u8 arg4 = (a >> 4) & 1; - u8 arg5 = (a >> 5) & 1; - u8 arg6 = (a >> 6) & 1; +// Unpacks a bitfield and returns a bitmask of its selected palettes. +// Bits 0-6 of the selector parameter result in the following palettes being selected: +// 0: battle background palettes (BG palettes 1, 2, and 3) +// 1: gAnimBankAttacker OBJ palette +// 2: gAnimBankTarget OBJ palette +// 3: gAnimBankAttacker partner OBJ palette +// 4: gAnimBankTarget partner OBJ palette +// 5: BG palette 4 +// 6: BG palette 5 +static u32 UnpackSelectedBattleAnimPalettes(s16 selector) +{ + u8 arg0 = selector & 1; + u8 arg1 = (selector >> 1) & 1; + u8 arg2 = (selector >> 2) & 1; + u8 arg3 = (selector >> 3) & 1; + u8 arg4 = (selector >> 4) & 1; + u8 arg5 = (selector >> 5) & 1; + u8 arg6 = (selector >> 6) & 1; return sub_80791A8(arg0, arg1, arg2, arg3, arg4, arg5, arg6); } -static void sub_80E1E0C(struct Sprite *sprite) +static void AnimSimplePaletteBlendStep(struct Sprite *sprite) { if (!gPaletteFade.active) DestroyAnimSprite(sprite); @@ -346,7 +399,7 @@ static void sub_80E1E2C(struct Sprite *sprite) sprite->data[6] = gBattleAnimArgs[6]; sprite->data[7] = gBattleAnimArgs[0]; - selectedPalettes = sub_80E1DC4(sprite->data[7]); + selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); BlendPalettes(selectedPalettes, gBattleAnimArgs[4], gBattleAnimArgs[3]); sprite->invisible = 1; sprite->callback = sub_80E1E80; @@ -371,7 +424,7 @@ static void sub_80E1E80(struct Sprite *sprite) return; } - selectedPalettes = sub_80E1DC4(sprite->data[7]); + selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); if (sprite->data[1] & 0x100) BlendPalettes(selectedPalettes, sprite->data[4], sprite->data[3]); else @@ -388,7 +441,7 @@ static void sub_80E1F0C(struct Sprite *sprite) if (!gPaletteFade.active) { - selectedPalettes = sub_80E1DC4(sprite->data[7]); + selectedPalettes = UnpackSelectedBattleAnimPalettes(sprite->data[7]); BlendPalettes(selectedPalettes, 0, 0); DestroyAnimSprite(sprite); } @@ -424,7 +477,7 @@ void sub_80E1F8C(u8 taskId) static void sub_80E1FDC(u8 taskId, u8 initialBlendAmount, u8 targetBlendAmount) { - u32 selectedPalettes = sub_80E1DC4(gTasks[taskId].data[0]); + u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gTasks[taskId].data[0]); BeginNormalPaletteFade( selectedPalettes, gTasks[taskId].data[1], @@ -795,7 +848,7 @@ static void sub_80E2710(u8 taskId) } } -/*static*/ void sub_80E27A0(struct Sprite *sprite) +static void sub_80E27A0(struct Sprite *sprite) { StartSpriteAffineAnim(sprite, gBattleAnimArgs[3]); if (gBattleAnimArgs[2] == 0) @@ -890,7 +943,7 @@ static void sub_80E29FC(struct Sprite *sprite) void sub_80E2A38(u8 taskId) { - u32 selectedPalettes = sub_80E1DC4(gBattleAnimArgs[0]); + u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); selectedPalettes |= sub_80792C0( (gBattleAnimArgs[0] >> 7) & 1, (gBattleAnimArgs[0] >> 8) & 1, @@ -907,7 +960,7 @@ void sub_80E2A7C(u8 taskId) u8 sp[2]; sp[1] = 0xFF; - selectedPalettes = sub_80E1DC4(1); + selectedPalettes = UnpackSelectedBattleAnimPalettes(1); switch (gBattleAnimArgs[0]) { case 2: @@ -953,7 +1006,7 @@ void sub_80E2A7C(u8 taskId) void sub_80E2B74(u8 taskId) { - u32 selectedPalettes = sub_80E1DC4(gBattleAnimArgs[0]); + u32 selectedPalettes = UnpackSelectedBattleAnimPalettes(gBattleAnimArgs[0]); switch (gBattleTerrain) { @@ -998,7 +1051,7 @@ void sub_80E2C60(u8 taskId) sub_80E2C8C(taskId, 1 << (paletteIndex + 16)); } -/*static*/ void sub_80E2C8C(u8 taskId, u32 selectedPalettes) +static void sub_80E2C8C(u8 taskId, u32 selectedPalettes) { gTasks[taskId].data[0] = selectedPalettes; gTasks[taskId].data[1] = selectedPalettes >> 16; @@ -1071,3 +1124,808 @@ void sub_80E2DD8(u8 taskId) task->data[5] = 0; task->func = sub_80E2E10; } + +static void sub_80E2E10(u8 taskId) +{ + struct Task *task = &gTasks[taskId]; + + if (task->data[4]) + { + if (task->data[1]) + { + task->data[1]--; + } + else + { + task->data[6] = duplicate_obj_of_side_rel2move_in_transparent_mode(task->data[0]); + if (task->data[6] >= 0) + { + gSprites[task->data[6]].oam.priority = task->data[0] ? 1 : 2; + gSprites[task->data[6]].data[0] = task->data[3]; + gSprites[task->data[6]].data[1] = taskId; + gSprites[task->data[6]].data[2] = 5; + gSprites[task->data[6]].callback = sub_80E2EE8; + task->data[5]++; + } + + task->data[4]--; + task->data[1] = task->data[2]; + } + } + else if (task->data[5] == 0) + { + DestroyAnimVisualTask(taskId); + } +} + +static void sub_80E2EE8(struct Sprite *sprite) +{ + if (sprite->data[0]) + { + sprite->data[0]--; + } + else + { + gTasks[sprite->data[1]].data[sprite->data[2]]--; + obj_delete_but_dont_free_vram(sprite); + } +} + +void sub_80E2F2C(u8 taskId) +{ + u16 species; + int spriteId, newSpriteId; + u16 var0; + struct Struct_sub_8078914 subStruct; + + var0 = 0; + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3D; + REG_DISPCNT |= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x0C08; + REG_BG1CNT_BITFIELD.priority = 0; + REG_BG1CNT_BITFIELD.screenSize = 0; + REG_BG1CNT_BITFIELD.areaOverflowMode = 1; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + if (IsDoubleBattle() && !IsContest()) + { + if (GetBattlerPosition(gAnimBankAttacker) == B_POSITION_OPPONENT_RIGHT + || GetBattlerPosition(gAnimBankAttacker) == B_POSITION_PLAYER_LEFT) + { + if (IsAnimBankSpriteVisible(gAnimBankAttacker ^ 2) == TRUE) + { + gSprites[gBankSpriteIds[gAnimBankAttacker ^ 2]].oam.priority -= 1; + REG_BG1CNT_BITFIELD.priority = 1; + var0 = 1; + } + } + } + + if (IsContest()) + { + species = eWRAM_19348Struct->species2; + } + else + { + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gAnimBankAttacker]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gAnimBankAttacker]], MON_DATA_SPECIES); + } + + spriteId = GetAnimBattlerSpriteId(0); + newSpriteId = sub_807A4A0(gAnimBankAttacker, spriteId, species); + sub_8078914(&subStruct); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); + LZDecompressVram(&gUnknown_08D20A30, subStruct.field_4); + if (IsContest()) + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); + + LZDecompressVram(&gUnknown_08D20A14, subStruct.field_0); + LoadPalette(&gUnknown_083DB568, subStruct.field_8 * 16 + 1, 2); + + gBattle_BG1_X = -gSprites[spriteId].pos1.x + 32; + gBattle_BG1_Y = -gSprites[spriteId].pos1.y + 32; + gTasks[taskId].data[0] = newSpriteId; + gTasks[taskId].data[6] = var0; + gTasks[taskId].func = sub_80E3194; +} + +static void sub_80E3194(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + struct Sprite *sprite; + + gTasks[taskId].data[10] += 4; + gBattle_BG1_Y -= 4; + if (gTasks[taskId].data[10] == 64) + { + gTasks[taskId].data[10] = 0; + gBattle_BG1_Y += 64; + if (++gTasks[taskId].data[11] == 4) + { + sub_8076464(0); + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + REG_DISPCNT ^= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + sprite = &gSprites[GetAnimBattlerSpriteId(0)]; // unused + sprite = &gSprites[gTasks[taskId].data[0]]; + DestroySprite(sprite); + + sub_8078914(&subStruct); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x800); + if (gTasks[taskId].data[6] == 1) + gSprites[gBankSpriteIds[gAnimBankAttacker ^ 2]].oam.priority++; + + REG_BG1CNT_BITFIELD.areaOverflowMode = 0; + do {} while(0); // needed to match. perhaps part of a debug macro + gBattle_BG1_Y = 0; + DestroyAnimVisualTask(taskId); + } + } +} + +void sub_80E32E0(u8 taskId) +{ + u8 i; + + for (i = 0; i < 8; i++) + gTasks[taskId].data[i] = gBattleAnimArgs[i]; + + gTasks[taskId].func = sub_80E3338; +} + +static void sub_80E3338(u8 taskId) +{ + int i; + u8 battler1, battler2; + u16 species; + u8 spriteId, spriteId2; + u16 var0; + struct Struct_sub_8078914 subStruct; + s16 taskData[8]; + + spriteId2 = 0; + var0 = 0; + + for (i = 0; i < 8; i++) + { + taskData[i] = gTasks[taskId].data[i]; + gTasks[taskId].data[i] = 0; + } + + if (taskData[2] == 0) + battler1 = gAnimBankAttacker; + else + battler1 = gAnimBankTarget; + + battler2 = battler1 ^ 2; + if (IsContest() || (taskData[3] && !IsAnimBankSpriteVisible(battler2))) + taskData[3] = 0; + + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3D; + REG_DISPCNT |= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x1000; + REG_BG1CNT_BITFIELD.priority = 0; + REG_BG1CNT_BITFIELD.screenSize = 0; + REG_BG1CNT_BITFIELD.areaOverflowMode = 1; + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + if (IsDoubleBattle() && taskData[3] == 0) + { + if (GetBattlerPosition(battler1) == B_POSITION_OPPONENT_RIGHT + || GetBattlerPosition(battler1) == B_POSITION_PLAYER_LEFT) + { + if (IsAnimBankSpriteVisible(battler2) == TRUE) + { + gSprites[gBankSpriteIds[battler2]].oam.priority -= 1; + REG_BG1CNT_BITFIELD.priority = 1; + var0 = 1; + } + } + } + + if (IsContest()) + { + species = eWRAM_19348Struct->species2; + } + else + { + if (GetBattlerSide(battler1) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); + } + + spriteId = sub_807A4A0(battler1, gBankSpriteIds[battler1], species); + if (taskData[3]) + spriteId2 = sub_807A4A0(battler2, gBankSpriteIds[battler2], species); + + sub_8078914(&subStruct); + if (taskData[0] == 0) + LZDecompressVram(&gBattleStatMask1_Tilemap, subStruct.field_4); + else + LZDecompressVram(&gBattleStatMask2_Tilemap, subStruct.field_4); + + if (IsContest()) + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); + + LZDecompressVram(&gBattleStatMask_Gfx, subStruct.field_0); + + if (taskData[1] == 0) + LoadCompressedPalette(gBattleStatMask2_Pal, subStruct.field_8 << 4, 32); + else if (taskData[1] == 1) + LoadCompressedPalette(gBattleStatMask1_Pal, subStruct.field_8 << 4, 32); + else if (taskData[1] == 2) + LoadCompressedPalette(gBattleStatMask3_Pal, subStruct.field_8 << 4, 32); + else if (taskData[1] == 3) + LoadCompressedPalette(gBattleStatMask4_Pal, subStruct.field_8 << 4, 32); + else if (taskData[1] == 4) + LoadCompressedPalette(gBattleStatMask6_Pal, subStruct.field_8 << 4, 32); + else if (taskData[1] == 5) + LoadCompressedPalette(gBattleStatMask7_Pal, subStruct.field_8 << 4, 32); + else if (taskData[1] == 6) + LoadCompressedPalette(gBattleStatMask8_Pal, subStruct.field_8 << 4, 32); + else + LoadCompressedPalette(gBattleStatMask5_Pal, subStruct.field_8 << 4, 32); + + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + + if (taskData[0] == 1) + { + gBattle_BG1_X = 64; + gTasks[taskId].data[1] = -3; + } + else + { + gTasks[taskId].data[1] = 3; + } + + if (taskData[4] == 0) + { + gTasks[taskId].data[4] = 10; + gTasks[taskId].data[5] = 20; + } + else + { + gTasks[taskId].data[4] = 13; + gTasks[taskId].data[5] = 30; + } + + gTasks[taskId].data[0] = spriteId; + gTasks[taskId].data[2] = taskData[3]; + gTasks[taskId].data[3] = spriteId2; + gTasks[taskId].data[6] = var0; + gTasks[taskId].data[7] = gBankSpriteIds[battler2]; + gTasks[taskId].func = sub_80E3704; + + if (taskData[0] == 0) + PlaySE12WithPanning(SE_W287, BattleAnimAdjustPanning2(-64)); + else + PlaySE12WithPanning(SE_W287B, BattleAnimAdjustPanning2(-64)); +} + +static void sub_80E3704(u8 taskId) +{ + gBattle_BG1_Y += gTasks[taskId].data[1]; + + switch (gTasks[taskId].data[15]) + { + case 0: + if (gTasks[taskId].data[11]++ > 0) + { + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[12]++; + REG_BLDALPHA = ((16 - gTasks[taskId].data[12]) << 8) | gTasks[taskId].data[12]; + if (gTasks[taskId].data[12] == gTasks[taskId].data[4]) + gTasks[taskId].data[15]++; + } + break; + case 1: + if (++gTasks[taskId].data[10] == gTasks[taskId].data[5]) + gTasks[taskId].data[15]++; + break; + case 2: + if (gTasks[taskId].data[11]++ > 0) + { + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[12]--; + REG_BLDALPHA = ((16 - gTasks[taskId].data[12]) << 8) | gTasks[taskId].data[12]; + if (gTasks[taskId].data[12] == 0) + { + sub_8076464(0); + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + REG_DISPCNT ^= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroySprite(&gSprites[gTasks[taskId].data[0]]); + if (gTasks[taskId].data[2]) + DestroySprite(&gSprites[gTasks[taskId].data[3]]); + + if (gTasks[taskId].data[6] == 1) + gSprites[gTasks[taskId].data[7]].oam.priority++; + + REG_BG1CNT_BITFIELD.areaOverflowMode = 0; + DestroyAnimVisualTask(taskId); + } + } + break; + } +} + +void sub_80E388C(u8 taskId) +{ + u32 selectedPalettes = sub_80792C0(1, 1, 1, 1); + sub_80E39BC(selectedPalettes, 0); + gTasks[taskId].data[14] = selectedPalettes >> 16; + + selectedPalettes = sub_80791A8(1, 0, 0, 0, 0, 0, 0) & 0xFFFF; + sub_80E39BC(selectedPalettes, 0xFFFF); + gTasks[taskId].data[15] = selectedPalettes; + + gTasks[taskId].data[0] = 0; + gTasks[taskId].data[1] = 0; + gTasks[taskId].func = sub_80E38F8; +} + +static void sub_80E38F8(u8 taskId) +{ + u16 i; + struct Task *task = &gTasks[taskId]; + + switch (task->data[0]) + { + case 0: + if (++task->data[1] > 6) + { + task->data[1] = 0; + task->data[2] = 16; + task->data[0]++; + } + break; + case 1: + if (++task->data[1] > 1) + { + task->data[1] = 0; + task->data[2]--; + + for (i = 0; i < 16; i++) + { + if ((task->data[15] >> i) & 1) + { + u16 paletteOffset = i * 16; + BlendPalette(paletteOffset, 16, task->data[2], 0xFFFF); + } + + if ((task->data[14] >> i) & 1) + { + u16 paletteOffset = i * 16 + 0x100; + BlendPalette(paletteOffset, 16, task->data[2], 0); + } + } + + if (task->data[2] == 0) + task->data[0]++; + } + break; + case 2: + DestroyAnimVisualTask(taskId); + break; + } +} + +static void sub_80E39BC(u32 selectedPalettes, u16 color) +{ + u16 i; + + for (i = 0; i < 32; i++) + { + if (selectedPalettes & 1) + { + u16 curOffset = i * 16; + u16 paletteOffset = curOffset; + while (curOffset < paletteOffset + 16) + { + gPlttBufferFaded[curOffset] = color; + curOffset++; + } + } + + selectedPalettes >>= 1; + } +} + +void sub_80E3A08(u8 taskId) +{ + u32 i; + int j; + u32 selectedPalettes = 0; + + for (i = 0; i < 4; i++) + { + if (gAnimBankAttacker != i) + selectedPalettes |= 1 << (i + 16); + } + + for (j = 5; j != 0; j--) + gBattleAnimArgs[j] = gBattleAnimArgs[j - 1]; + + sub_80E2C8C(taskId, selectedPalettes); +} + +void sub_80E3A58(u8 taskId) +{ + u8 newTaskId; + + sub_80789D4(0); + newTaskId = CreateTask(sub_80E3AD0, 5); + if (gBattleAnimArgs[2] && GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + { + gBattleAnimArgs[0] = -gBattleAnimArgs[0]; + gBattleAnimArgs[1] = -gBattleAnimArgs[1]; + } + + gTasks[newTaskId].data[1] = gBattleAnimArgs[0]; + gTasks[newTaskId].data[2] = gBattleAnimArgs[1]; + gTasks[newTaskId].data[3] = gBattleAnimArgs[3]; + gTasks[newTaskId].data[0]++; + DestroyAnimVisualTask(taskId); +} + +static void sub_80E3AD0(u8 taskId) +{ + gTasks[taskId].data[10] += gTasks[taskId].data[1]; + gTasks[taskId].data[11] += gTasks[taskId].data[2]; + gBattle_BG3_X += gTasks[taskId].data[10] >> 8; + gBattle_BG3_Y += gTasks[taskId].data[11] >> 8; + gTasks[taskId].data[10] &= 0xFF; + gTasks[taskId].data[11] &= 0xFF; + + if (gBattleAnimArgs[7] == gTasks[taskId].data[3]) + { + gBattle_BG3_X = 0; + gBattle_BG3_Y = 0; + sub_80789D4(1); + DestroyTask(taskId); + } +} + +void sub_80E3B4C(u8 taskId) +{ + gBattleAnimArgs[7] = GetBattlerSide(gAnimBankAttacker); + DestroyAnimVisualTask(taskId); +} + +void sub_80E3B78(u8 taskId) +{ + gBattleAnimArgs[7] = GetBattlerSide(gAnimBankTarget); + DestroyAnimVisualTask(taskId); +} + +void sub_80E3BA4(u8 taskId) +{ + gBattleAnimArgs[7] = (gAnimBankAttacker ^ 2) == gAnimBankTarget; + DestroyAnimVisualTask(taskId); +} + +void sub_80E3BDC(u8 taskId) +{ + u16 i; + + for (i = 0; i < 4; i++) + { + if (i != gAnimBankAttacker && IsAnimBankSpriteVisible(i)) + gSprites[gBankSpriteIds[i]].invisible = gBattleAnimArgs[0]; + } + + DestroyAnimVisualTask(taskId); +} + +void sub_80E3C4C(u8 taskId, int unused, u16 arg2, u8 battler1, u8 arg4, u8 arg5, u8 arg6, u8 arg7, const u8 *arg8, const u8 *arg9, const u16 *palette) +{ + u16 species; + u8 spriteId, spriteId2; + struct Struct_sub_8078914 subStruct; + u8 battler2; + + spriteId2 = 0; + battler2 = battler1 ^ 2; + + if (IsContest() || (arg4 && !IsAnimBankSpriteVisible(battler2))) + arg4 = 0; + + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3D; + REG_DISPCNT |= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0x3F42; + REG_BLDALPHA = 0x1000; + REG_BG1CNT_BITFIELD.priority = 0; + REG_BG1CNT_BITFIELD.screenSize = 0; + REG_BG1CNT_BITFIELD.areaOverflowMode = 1; + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + if (IsContest()) + { + species = eWRAM_19348Struct->species2; + } + else + { + if (GetBattlerSide(battler1) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler1]], MON_DATA_SPECIES); + } + + spriteId = sub_807A4A0(battler1, gBankSpriteIds[battler1], species); + if (arg4) + spriteId2 = sub_807A4A0(battler2, gBankSpriteIds[battler2], species); + + sub_8078914(&subStruct); + LZDecompressVram(arg9, subStruct.field_4); + if (IsContest()) + sub_80763FC(subStruct.field_8, (u16 *)subStruct.field_4, 0, 0); + + LZDecompressVram(arg8, subStruct.field_0); + LoadCompressedPalette(palette, subStruct.field_8 << 4, 32); + gBattle_BG1_X = 0; + gBattle_BG1_Y = 0; + gTasks[taskId].data[1] = arg2; + gTasks[taskId].data[4] = arg5; + gTasks[taskId].data[5] = arg7; + gTasks[taskId].data[6] = arg6; + gTasks[taskId].data[0] = spriteId; + gTasks[taskId].data[2] = arg4; + gTasks[taskId].data[3] = spriteId2; + gTasks[taskId].func = sub_80E3E64; +} + +static void sub_80E3E64(u8 taskId) +{ + gTasks[taskId].data[13] += gTasks[taskId].data[1] < 0 ? -gTasks[taskId].data[1] : gTasks[taskId].data[1]; + if (gTasks[taskId].data[1] < 0) + gBattle_BG1_Y -= gTasks[taskId].data[13] >> 8; + else + gBattle_BG1_Y += gTasks[taskId].data[13] >> 8; + + gTasks[taskId].data[13] &= 0xFF; + switch (gTasks[taskId].data[15]) + { + case 0: + if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6]) + { + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[12]++; + REG_BLDALPHA = ((16 - gTasks[taskId].data[12]) << 8) | gTasks[taskId].data[12]; + if (gTasks[taskId].data[12] == gTasks[taskId].data[4]) + gTasks[taskId].data[15]++; + } + break; + case 1: + if (++gTasks[taskId].data[10] == gTasks[taskId].data[5]) + gTasks[taskId].data[15]++; + break; + case 2: + if (gTasks[taskId].data[11]++ >= gTasks[taskId].data[6]) + { + gTasks[taskId].data[11] = 0; + gTasks[taskId].data[12]--; + REG_BLDALPHA = ((16 - gTasks[taskId].data[12]) << 8) | gTasks[taskId].data[12]; + if (gTasks[taskId].data[12] == 0) + { + sub_8076464(0); + gBattle_WIN0H = 0; + gBattle_WIN0V = 0; + REG_WININ = 0x3F3F; + REG_WINOUT = 0x3F3F; + + if (!IsContest()) + REG_BG1CNT_BITFIELD.charBaseBlock = 0; + + REG_DISPCNT ^= DISPCNT_OBJWIN_ON; + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + DestroySprite(&gSprites[gTasks[taskId].data[0]]); + if (gTasks[taskId].data[2]) + DestroySprite(&gSprites[gTasks[taskId].data[3]]); + + REG_BG1CNT_BITFIELD.areaOverflowMode = 0; + DestroyAnimVisualTask(taskId); + } + } + break; + } +} + +void sub_80E4008(u8 taskId) +{ + gBattleAnimArgs[0] = gBattleTerrain; + DestroyAnimVisualTask(taskId); +} + +void sub_80E4028(u8 taskId) +{ + u32 selectedPalettes; + u8 *dest; + int offset; + int i = 0; + + if (gBattleAnimArgs[0] == 0) + { + selectedPalettes = sub_80791A8(1, 0, 0, 0, 0, 0, 0); + while ((selectedPalettes & 1) == 0) + { + selectedPalettes >>= 1; + i++; + } + } + else if (gBattleAnimArgs[0] == 1) + { + i = gAnimBankAttacker + 16; + } + else if (gBattleAnimArgs[0] == 2) + { + i = gAnimBankTarget + 16; + } + + offset = gBattleAnimArgs[1] * 32; + dest = IsContest() ? &ewram14800[offset] : &ewram18000_2[offset]; + // This doesn't match when u16* is used. + memcpy(dest, &((u8 *)gPlttBufferUnfaded)[i * 32], 32); + DestroyAnimVisualTask(taskId); +} + + +void sub_80E40D0(u8 taskId) +{ + u32 selectedPalettes; + u8 *src; + u8 *dest; + int offset; + int i = 0; + + if (gBattleAnimArgs[0] == 0) + { + selectedPalettes = sub_80791A8(1, 0, 0, 0, 0, 0, 0); + while ((selectedPalettes & 1) == 0) + { + selectedPalettes >>= 1; + i++; + } + } + else if (gBattleAnimArgs[0] == 1) + { + i = gAnimBankAttacker + 16; + } + else if (gBattleAnimArgs[0] == 2) + { + i = gAnimBankTarget + 16; + } + + dest = &((u8 *)gPlttBufferUnfaded)[i * 32]; + offset = gBattleAnimArgs[1] * 32; + src = IsContest() ? &ewram14800[offset] : &ewram18000_2[offset]; + // This doesn't match when u16* is used. + memcpy(dest, src, 32); + DestroyAnimVisualTask(taskId); +} + +void sub_80E4178(u8 taskId) +{ + u32 selectedPalettes; + int i = 0; + + if (gBattleAnimArgs[0] == 0) + { + selectedPalettes = sub_80791A8(1, 0, 0, 0, 0, 0, 0); + while ((selectedPalettes & 1) == 0) + { + selectedPalettes >>= 1; + i++; + } + } + else if (gBattleAnimArgs[0] == 1) + { + i = gAnimBankAttacker + 16; + } + else if (gBattleAnimArgs[0] == 2) + { + i = gAnimBankTarget + 16; + } + + memcpy(&gPlttBufferUnfaded[i * 16], &gPlttBufferFaded[i * 16], 32); + DestroyAnimVisualTask(taskId); +} + +void sub_80E4200(u8 taskId) +{ + if (IsContest()) + gBattleAnimArgs[7] = 1; + else + gBattleAnimArgs[7] = 0; + + DestroyAnimVisualTask(taskId); +} + +void sub_80E4234(u8 taskId) +{ + gAnimBankAttacker = gBankTarget; + gAnimBankTarget = gEffectBank; + DestroyAnimVisualTask(taskId); +} + +void sub_80E4264(u8 taskId) +{ + if (GetBattlerSide(gAnimBankAttacker) == GetBattlerSide(gAnimBankTarget)) + gBattleAnimArgs[7] = 1; + else + gBattleAnimArgs[7] = 0; + + DestroyAnimVisualTask(taskId); +} + +void sub_80E42B0(u8 taskId) +{ + gAnimBankTarget = gBankTarget; + DestroyAnimVisualTask(taskId); +} + +void sub_80E42D0(u8 taskId) +{ + gAnimBankAttacker = gBankAttacker; + gAnimBankTarget = gEffectBank; + DestroyAnimVisualTask(taskId); +} + +void sub_80E4300(u8 taskId) +{ + if (IsContest()) + { + DestroyAnimVisualTask(taskId); + } + else + { + gTasks[taskId].data[0] = ewram17800[gAnimBankAttacker].invisible; + ewram17800[gAnimBankAttacker].invisible = 1; + gTasks[taskId].func = sub_80E4368; + gAnimVisualTaskCount--; + } +} + +static void sub_80E4368(u8 taskId) +{ + if (gBattleAnimArgs[7] == 0x1000) + { + ewram17800[gAnimBankAttacker].invisible = gTasks[taskId].data[0] & 1; + DestroyTask(taskId); + } +} diff --git a/src/battle/anim/orbit.c b/src/battle/anim/orbit.c index e76e0923e..f938a2707 100644 --- a/src/battle/anim/orbit.c +++ b/src/battle/anim/orbit.c @@ -158,7 +158,7 @@ void sub_80CAD54(struct Sprite* sprite) sprite->data[2] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankAttacker, 3) + gBattleAnimArgs[2]; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[5] = 0x40; sprite->callback = sub_80CADA8; sub_80CADA8(sprite); @@ -166,7 +166,7 @@ void sub_80CAD54(struct Sprite* sprite) static void sub_80CADA8(struct Sprite* sprite) { - if (!TranslateAnimSpriteByDeltas(sprite)) + if (!TranslateAnimLinear(sprite)) { sprite->pos2.x += Sin(sprite->data[5], 32); sprite->pos2.y += Cos(sprite->data[5], -5); @@ -195,7 +195,7 @@ void sub_80CAE20(struct Sprite* sprite) sprite->data[2] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankAttacker, 3) + gBattleAnimArgs[2]; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[5] = 0x40; sprite->callback = sub_80CAE74; sub_80CAE74(sprite); @@ -203,7 +203,7 @@ void sub_80CAE20(struct Sprite* sprite) static void sub_80CAE74(struct Sprite* sprite) { - if (!TranslateAnimSpriteByDeltas(sprite)) + if (!TranslateAnimLinear(sprite)) { sprite->pos2.x += Sin(sprite->data[5], 8); if ((u16)(sprite->data[5] - 0x3B) < 5 || (u16)(sprite->data[5] - 0xBB) < 5) diff --git a/src/battle/anim/orbs.c b/src/battle/anim/orbs.c index af6568bd8..b97f0c246 100644 --- a/src/battle/anim/orbs.c +++ b/src/battle/anim/orbs.c @@ -196,7 +196,7 @@ void sub_80CA7B0(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankAttacker, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankAttacker, 3); - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, move_anim_8074EE0); } @@ -207,7 +207,7 @@ void sub_80CA800(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -219,7 +219,7 @@ void sub_80CA858(struct Sprite* sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2); sprite->data[3] = sprite->pos1.y; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[5] = gBattleAnimArgs[3]; sprite->callback = sub_80CA8B4; sub_80CA8B4(sprite); @@ -227,7 +227,7 @@ void sub_80CA858(struct Sprite* sprite) static void sub_80CA8B4(struct Sprite* sprite) { - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) { DestroySprite(sprite); } @@ -272,13 +272,13 @@ void sub_80CA9A8(struct Sprite* sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankAttacker, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankAttacker, 3); sprite->data[5] = gBattleAnimArgs[2]; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = sub_80CA9F8; } static void sub_80CA9F8(struct Sprite* sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) DestroyAnimSprite(sprite); } diff --git a/src/battle/anim/poison.c b/src/battle/anim/poison.c index 4d6673adf..99f534e1c 100644 --- a/src/battle/anim/poison.c +++ b/src/battle/anim/poison.c @@ -204,14 +204,14 @@ void sub_80D9D70(struct Sprite *sprite) sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3); sprite->data[5] = -30; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = sub_80D9DD4; } static void sub_80D9DD4(struct Sprite *sprite) // same as sub_80D9E78 { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) DestroyAnimSprite(sprite); } @@ -232,14 +232,14 @@ void sub_80D9DF0(struct Sprite *sprite) sprite->data[4] = l2 + gBattleAnimArgs[5]; sprite->data[5] = -30; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = sub_80D9E78; } static void sub_80D9E78(struct Sprite *sprite) // same as sub_80D9DD4 { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) DestroyAnimSprite(sprite); } @@ -284,7 +284,7 @@ void sub_80D9F14(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; sprite->data[4] = sprite->pos1.y + sprite->data[0]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/psychic.c b/src/battle/anim/psychic.c index a63652646..704fa0306 100644 --- a/src/battle/anim/psychic.c +++ b/src/battle/anim/psychic.c @@ -912,7 +912,7 @@ static void sub_80DC1FC(u8 taskId) gSprites[spriteId].data[4] = task->data[14]; gSprites[spriteId].data[5] = task->data[10]; - InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]); + InitAnimArcTranslation(&gSprites[spriteId]); StartSpriteAffineAnim(&gSprites[spriteId], task->data[2] & 3); } @@ -929,7 +929,7 @@ static void sub_80DC1FC(u8 taskId) void sub_80DC2B0(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) { FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); diff --git a/src/battle/anim/ring.c b/src/battle/anim/ring.c index 024728ecc..a2cf618a6 100644 --- a/src/battle/anim/ring.c +++ b/src/battle/anim/ring.c @@ -240,7 +240,7 @@ void sub_80D0FD8(struct Sprite* sprite) void sub_80D1098(struct Sprite* sprite) { - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) { FreeSpriteOamMatrix(sprite); DestroyAnimSprite(sprite); @@ -327,7 +327,7 @@ void sub_80D10B8(struct Sprite* sprite) sprite->data[2] = sp0; sprite->data[4] = sp1; sprite->data[0] = gBattleAnimArgs[0]; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->callback = sub_80D1098; sub_80D1098(sprite); } diff --git a/src/battle/anim/rock.c b/src/battle/anim/rock.c index 4e839d3e8..7738e4d0c 100644 --- a/src/battle/anim/rock.c +++ b/src/battle/anim/rock.c @@ -564,7 +564,7 @@ void sub_80DD490(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[2]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -729,7 +729,7 @@ static void sub_80DD774(struct Task *task) gSprites[spriteId].data[5] = -16 - (task->data[1] * 2); gSprites[spriteId].oam.tileNum += var0; - InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]); + InitAnimArcTranslation(&gSprites[spriteId]); task->data[11]++; } @@ -738,7 +738,7 @@ static void sub_80DD774(struct Task *task) void sub_80DD87C(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) { u8 taskId = FindTaskIdByFunc(sub_80DD604); if (taskId != 0xFF) diff --git a/src/battle/anim/scan.c b/src/battle/anim/scan.c index 9f427a9c4..409acf549 100644 --- a/src/battle/anim/scan.c +++ b/src/battle/anim/scan.c @@ -77,7 +77,7 @@ static void sub_80CD408(struct Sprite* sprite) sprite->data[0] = 8; sprite->data[2] = sprite->pos1.x + gUnknown_083D6DDC[sprite->data[5] >> 8][0]; sprite->data[4] = sprite->pos1.y + gUnknown_083D6DDC[sprite->data[5] >> 8][1]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, sub_80CD4B8); sprite->data[5] += 0x100; PlaySE12WithPanning(0xD2, BattleAnimAdjustPanning(0x3F)); @@ -142,7 +142,7 @@ static void sub_80CD4EC(struct Sprite* sprite) sprite->data[0] = 6; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + a; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 3) + b; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, sub_80CD654); } } diff --git a/src/battle/anim/seed.c b/src/battle/anim/seed.c index 11eebada0..bf8142a49 100644 --- a/src/battle/anim/seed.c +++ b/src/battle/anim/seed.c @@ -61,13 +61,13 @@ void AnimLeechSeed(struct Sprite* sprite) sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 0) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, 1) + gBattleAnimArgs[3]; sprite->data[5] = gBattleAnimArgs[5]; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = AnimLeechSeedStep; } static void AnimLeechSeedStep(struct Sprite* sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) { sprite->invisible = 1; sprite->data[0] = 10; diff --git a/src/battle/anim/sonic.c b/src/battle/anim/sonic.c index 0494c42ed..4a9ade286 100644 --- a/src/battle/anim/sonic.c +++ b/src/battle/anim/sonic.c @@ -148,7 +148,7 @@ void AnimSonicBoomProjectile(struct Sprite* sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = targetXPos; sprite->data[4] = targetYPos; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/sunlight.c b/src/battle/anim/sunlight.c index 7efc85b37..5edb9afea 100644 --- a/src/battle/anim/sunlight.c +++ b/src/battle/anim/sunlight.c @@ -37,6 +37,6 @@ void sub_80D517C(struct Sprite *sprite) sprite->data[0] = 60; sprite->data[2] = 140; sprite->data[4] = 80; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/sword.c b/src/battle/anim/sword.c index 7fb410224..fcb85a794 100644 --- a/src/battle/anim/sword.c +++ b/src/battle/anim/sword.c @@ -50,6 +50,6 @@ static void sub_80CF6B4(struct Sprite* sprite) sprite->data[0] = 6; sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y - 32; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/tile.c b/src/battle/anim/tile.c index a10850808..12cfd53b3 100644 --- a/src/battle/anim/tile.c +++ b/src/battle/anim/tile.c @@ -175,7 +175,7 @@ static void sub_80CE1AC(struct Sprite* sprite) sprite->data[0] = 30; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankAttacker, 2); sprite->data[4] = GetBattlerSpriteCoord(gAnimBankAttacker, 3); - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } } diff --git a/src/battle/anim/unused_8.c b/src/battle/anim/unused_8.c index a005bee1c..92f5973db 100644 --- a/src/battle/anim/unused_8.c +++ b/src/battle/anim/unused_8.c @@ -78,7 +78,7 @@ static void sub_80CF490(struct Sprite* sprite) sprite->data[0] = sprite->data[1]; sprite->data[2] = sprite->pos1.x; sprite->data[4] = sprite->pos1.y + 15; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, sub_80CF4B8); } diff --git a/src/battle/anim/water.c b/src/battle/anim/water.c index 0afe133f0..1c354d916 100644 --- a/src/battle/anim/water.c +++ b/src/battle/anim/water.c @@ -198,7 +198,7 @@ void sub_80D37FC(struct Sprite *sprite) sprite->data[2] = sprite->pos1.x + gBattleAnimArgs[2]; sprite->data[4] = sprite->pos1.y + gBattleAnimArgs[4]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } diff --git a/src/battle/anim/wisp_orb.c b/src/battle/anim/wisp_orb.c index 32373ca2a..f9e21d704 100644 --- a/src/battle/anim/wisp_orb.c +++ b/src/battle/anim/wisp_orb.c @@ -133,7 +133,7 @@ static void sub_80D5C5C(struct Sprite *sprite) s16 initialData5; s16 newData5; - if (!TranslateAnimSpriteByDeltas(sprite)) + if (!TranslateAnimLinear(sprite)) { sprite->pos2.x += Sin(sprite->data[5], 16); initialData5 = sprite->data[5]; |