diff options
Diffstat (limited to 'src')
49 files changed, 3769 insertions, 277 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]; diff --git a/src/battle/battle_7.c b/src/battle/battle_7.c index 75afc2739..87a0f0309 100644 --- a/src/battle/battle_7.c +++ b/src/battle/battle_7.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_anim.h" +#include "battle_anim_813F0F4.h" #include "battle_interface.h" #include "blend_palette.h" #include "contest.h" @@ -95,7 +96,6 @@ const struct SpritePalette gUnknown_0820A4D4[] = extern void c3_0802FDF4(u8); extern void sub_80440EC(); extern void sub_804777C(); -extern void sub_8141828(); extern u8 GetBattlerSpriteCoord(); extern u8 IsBankSpritePresent(u8); extern u8 sub_8077F68(u8); diff --git a/src/battle/battle_anim_812C144.c b/src/battle/battle_anim_812C144.c index 2175f7d2a..0e9c45023 100644 --- a/src/battle/battle_anim_812C144.c +++ b/src/battle/battle_anim_812C144.c @@ -14,15 +14,6 @@ #include "constants/songs.h" #include "constants/species.h" -struct EWRAM_19348_Struct -{ - /*0x00*/ u8 filler0[0x2]; - /*0x02*/ u16 species; - /*0x04*/ u8 filler4[0x8]; - /*0x0C*/ u32 otId; - /*0x10*/ u32 personality; -}; - extern s16 gBattleAnimArgs[]; extern u8 gAnimBankAttacker; extern u8 gAnimBankTarget; @@ -178,7 +169,7 @@ void sub_812C2BC(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[2]; sprite->data[2] = x; sprite->data[4] = y; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -358,13 +349,13 @@ void sub_812C720(struct Sprite *sprite) sprite->data[4] = y + gBattleAnimArgs[3]; sprite->data[5] = -50; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = sub_812C798; } static void sub_812C798(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) { sprite->data[0] = 30; sprite->data[1] = 0; @@ -959,7 +950,7 @@ void sub_812D294(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; } } diff --git a/src/battle/battle_anim_813F0F4.c b/src/battle/battle_anim_813F0F4.c new file mode 100755 index 000000000..219395baf --- /dev/null +++ b/src/battle/battle_anim_813F0F4.c @@ -0,0 +1,1897 @@ +#include "global.h" +#include "battle.h" +#include "battle_anim.h" +#include "battle_anim_813F0F4.h" +#include "battle_interface.h" +#include "blend_palette.h" +#include "decompress.h" +#include "ewram.h" +#include "m4a.h" +#include "main.h" +#include "palette.h" +#include "pokeball.h" +#include "rom_8077ABC.h" +#include "sound.h" +#include "sprite.h" +#include "task.h" +#include "trig.h" +#include "util.h" +#include "constants/items.h" +#include "constants/songs.h" + +extern int gUnknown_03005F0C; +extern u16 gUnknown_03005F10; +extern u16 gUnknown_03005F14; + +extern s16 gBattleAnimArgs[]; +extern u8 gAnimBankAttacker; +extern u8 gAnimBankTarget; +extern u8 gHealthboxIDs[]; +extern u8 gBankSpriteIds[]; +extern u16 gBattlerPartyIndexes[]; +extern u16 gLastUsedItem; +extern u8 gDoingBattleAnim; +extern u8 gEffectBank; + +extern const u8 gUnknown_08D2EE48[]; +extern const u8 gUnknown_08D2EDFC[]; +extern const u16 gUnknown_08D2E150[]; +extern const struct CompressedSpritePalette gUnknown_0840B2B8[]; +extern const struct SpriteTemplate gSpriteTemplate_840B3B4[]; +extern const struct SpriteTemplate gSpriteTemplate_8402500; +extern const struct SpriteTemplate gBattleAnimSpriteTemplate_84024E8; +extern const u8 gUnknown_0840B378[]; +extern const struct CompressedSpriteSheet gUnknown_0840B258[]; +extern const TaskFunc gUnknown_0840B384[]; +extern const u16 gUnknown_0840B4D4[]; +extern const struct CompressedSpriteSheet gBattleAnimPicTable[]; +extern const struct CompressedSpritePalette gBattleAnimPaletteTable[]; + +static void sub_813F300(u8 taskId); +static void sub_813F6CC(u8 taskId); +static void sub_813FD34(u8 taskId); +static void sub_813FD90(struct Sprite *sprite); +static void sub_813FB7C(u8 taskId); +static void sub_813FCBC(u8 taskId); +static void sub_813FDC0(struct Sprite *sprite); +static void sub_813FE70(struct Sprite *sprite); +static void sub_81407B8(struct Sprite *sprite); +static void sub_813FEC8(struct Sprite *sprite); +static void sub_8140014(struct Sprite *sprite); +static void sub_8140058(struct Sprite *sprite); +static void sub_8140410(struct Sprite *sprite); +static void sub_8140158(struct Sprite *sprite); +static void sub_81401A0(struct Sprite *sprite); +static void sub_8140434(struct Sprite *sprite); +static void sub_81405F4(struct Sprite *sprite); +static void sub_8140454(struct Sprite *sprite); +static void sub_81404E4(struct Sprite *sprite); +static void sub_81405C8(struct Sprite *sprite); +static void sub_81406BC(struct Sprite *sprite); +static void sub_81407F4(struct Sprite *sprite); +static void sub_8140A08(struct Sprite *sprite); +static void sub_8140A28(struct Sprite *sprite); +static void sub_8141294(struct Sprite *sprite); +static void sub_8140ECC(struct Sprite *sprite); +static void sub_8140FF8(struct Sprite *sprite); +static void sub_8141230(struct Sprite *sprite); +static void sub_81413DC(u8 taskId); +static void sub_814146C(u8 taskId); +static void sub_81414BC(u8 taskId); +static void sub_814191C(u8 taskId); +static void sub_8141B20(struct Sprite *sprite); +static void sub_8141B74(struct Sprite *sprite); +static void sub_8141AD8(u8 taskId); +static void sub_8141CBC(struct Sprite *sprite); +static void sub_8141CF4(struct Sprite *sprite); +static void sub_8141D20(struct Sprite *sprite); + + +void unref_sub_813F0F4(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + u8 healthBoxSpriteId; + u8 battler; + u8 spriteId1, spriteId2, spriteId3, spriteId4; + + battler = gAnimBankAttacker; + 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; + REG_BG1CNT_BITFIELD.charBaseBlock = 1; + + healthBoxSpriteId = gHealthboxIDs[battler]; + spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; + spriteId2 = gSprites[healthBoxSpriteId].data[5]; + spriteId3 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + spriteId4 = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); + gSprites[healthBoxSpriteId].oam.priority = 1; + gSprites[spriteId1].oam.priority = 1; + gSprites[spriteId2].oam.priority = 1; + gSprites[spriteId3] = gSprites[healthBoxSpriteId]; + gSprites[spriteId4] = gSprites[spriteId1]; + gSprites[spriteId3].oam.objMode = ST_OAM_OBJ_WINDOW; + gSprites[spriteId4].oam.objMode = ST_OAM_OBJ_WINDOW; + gSprites[spriteId3].callback = SpriteCallbackDummy; + gSprites[spriteId4].callback = SpriteCallbackDummy; + + sub_8078914(&subStruct); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x1000); + LZDecompressVram(&gUnknown_08D2EE48, subStruct.field_4); + LZDecompressVram(&gUnknown_08D2EDFC, subStruct.field_0); + LoadCompressedPalette(gUnknown_08D2E150, subStruct.field_8 << 4, 32); + + gBattle_BG1_X = -gSprites[spriteId3].pos1.x + 32; + gBattle_BG1_Y = -gSprites[spriteId3].pos1.y - 32; + gTasks[taskId].data[1] = 640; + gTasks[taskId].data[0] = spriteId3; + gTasks[taskId].data[2] = spriteId4; + gTasks[taskId].func = sub_813F300; +} + +static void sub_813F300(u8 taskId) +{ + struct Struct_sub_8078914 subStruct; + u8 spriteId1, spriteId2; + u8 battler; + + battler = gAnimBankAttacker; + gTasks[taskId].data[13] += gTasks[taskId].data[1]; + gBattle_BG1_Y += (u16)gTasks[taskId].data[13] >> 8; + gTasks[taskId].data[13] &= 0xFF; + + switch (gTasks[taskId].data[15]) + { + case 0: + if (gTasks[taskId].data[11]++ > 1) + { + 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] == 8) + gTasks[taskId].data[15]++; + } + break; + case 1: + if (++gTasks[taskId].data[10] == 30) + gTasks[taskId].data[15]++; + break; + case 2: + if (gTasks[taskId].data[11]++ > 1) + { + 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]]); + DestroySprite(&gSprites[gTasks[taskId].data[2]]); + sub_8078914(&subStruct); + DmaFill32Defvars(3, 0, subStruct.field_4, 0x800); + REG_BG1CNT_BITFIELD.areaOverflowMode = 0; + spriteId1 = gSprites[gHealthboxIDs[battler]].oam.affineParam; + spriteId2 = gSprites[gHealthboxIDs[battler]].data[5]; + gSprites[gHealthboxIDs[battler]].oam.priority = 1; + gSprites[spriteId1].oam.priority = 1; + gSprites[spriteId2].oam.priority = 1; + DestroyAnimVisualTask(taskId); + } + } + break; + } +} + +void sub_813F4EC(u8 taskId) +{ + u8 healthBoxSpriteId; + u8 spriteId1, spriteId2; + u8 paletteNum1, paletteNum2; + u16 offset1, offset2; + + healthBoxSpriteId = gHealthboxIDs[gAnimBankAttacker]; + spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; + spriteId2 = gSprites[healthBoxSpriteId].data[5]; + paletteNum1 = AllocSpritePalette(0xD709); + paletteNum2 = AllocSpritePalette(0xD70A); + + offset1 = (gSprites[healthBoxSpriteId].oam.paletteNum * 16) + 0x100; + offset2 = (gSprites[spriteId2].oam.paletteNum * 16) + 0x100; + LoadPalette(&gPlttBufferUnfaded[offset1], paletteNum1 * 16 + 0x100, 0x20); + LoadPalette(&gPlttBufferUnfaded[offset2], paletteNum2 * 16 + 0x100, 0x20); + + gSprites[healthBoxSpriteId].oam.paletteNum = paletteNum1; + gSprites[spriteId1].oam.paletteNum = paletteNum1; + gSprites[spriteId2].oam.paletteNum = paletteNum2; + DestroyAnimVisualTask(taskId); +} + +void sub_813F5E8(u8 taskId) +{ + u8 healthBoxSpriteId; + u8 spriteId1, spriteId2; + u8 paletteIndex1, paletteIndex2; + + healthBoxSpriteId = gHealthboxIDs[gAnimBankAttacker]; + spriteId1 = gSprites[healthBoxSpriteId].oam.affineParam; + spriteId2 = gSprites[healthBoxSpriteId].data[5]; + + FreeSpritePaletteByTag(0xD709); + FreeSpritePaletteByTag(0xD70A); + paletteIndex1 = IndexOfSpritePaletteTag(0xD6FF); + paletteIndex2 = IndexOfSpritePaletteTag(0xD704); + gSprites[healthBoxSpriteId].oam.paletteNum = paletteIndex1; + gSprites[spriteId1].oam.paletteNum = paletteIndex1; + gSprites[spriteId2].oam.paletteNum = paletteIndex2; + + DestroyAnimVisualTask(taskId); +} + +void sub_813F6A0(u8 taskId) +{ + gTasks[taskId].data[10] = gBattleAnimArgs[0]; + gTasks[taskId].data[11] = gBattleAnimArgs[1]; + gTasks[taskId].func = sub_813F6CC; +} + +static void sub_813F6CC(u8 taskId) +{ + u8 paletteNum; + int paletteOffset, colorOffset; + + gTasks[taskId].data[0]++; + if (gTasks[taskId].data[0]++ >= gTasks[taskId].data[11]) + { + gTasks[taskId].data[0] = 0; + paletteNum = IndexOfSpritePaletteTag(0xD709); + colorOffset = gTasks[taskId].data[10] == 0 ? 6 : 2; + switch (gTasks[taskId].data[1]) + { + case 0: + gTasks[taskId].data[2] += 2; + if (gTasks[taskId].data[2] > 16) + gTasks[taskId].data[2] = 16; + + paletteOffset = paletteNum * 16 + 0x100; + BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31)); + if (gTasks[taskId].data[2] == 16) + gTasks[taskId].data[1]++; + break; + case 1: + gTasks[taskId].data[2] -= 2; + if (gTasks[taskId].data[2] < 0) + gTasks[taskId].data[2] = 0; + + paletteOffset = paletteNum * 16 + 0x100; + BlendPalette(paletteOffset + colorOffset, 1, gTasks[taskId].data[2], RGB(20, 27, 31)); + if (gTasks[taskId].data[2] == 0) + DestroyAnimVisualTask(taskId); + break; + } + } +} + +void sub_813F798(u8 taskId) +{ + u8 spriteId; + + spriteId = gBankSpriteIds[gAnimBankAttacker]; + switch (gTasks[taskId].data[0]) + { + case 0: + sub_8078E70(spriteId, 0); + gTasks[taskId].data[10] = 0x100; + gTasks[taskId].data[0]++; + break; + case 1: + gTasks[taskId].data[10] += 0x30; + obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0); + sub_8079A64(spriteId); + if (gTasks[taskId].data[10] >= 0x2D0) + gTasks[taskId].data[0]++; + break; + case 2: + sub_8078F40(spriteId); + gSprites[spriteId].invisible = 1; + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_813F844(u8 taskId) +{ + u8 spriteId; + u16 ball; + u8 ballIndex; + u8 x, y; + u8 priority, subpriority; + u32 selectedPalettes; + + spriteId = gBankSpriteIds[gAnimBankAttacker]; + if (GetBattlerSide(gAnimBankAttacker) == B_SIDE_PLAYER) + ball = GetMonData(&gPlayerParty[gBattlerPartyIndexes[gAnimBankAttacker]], MON_DATA_POKEBALL); + else + ball = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gAnimBankAttacker]], MON_DATA_POKEBALL); + + ballIndex = ball_number_to_ball_processing_index(ball); + switch (gTasks[taskId].data[0]) + { + case 0: + x = GetBattlerSpriteCoord(gAnimBankAttacker, 0); + y = GetBattlerSpriteCoord(gAnimBankAttacker, 1); + priority = gSprites[spriteId].oam.priority; + subpriority = gSprites[spriteId].subpriority; + gTasks[taskId].data[10] = sub_814086C(x, y + 32, priority, subpriority, ballIndex); + selectedPalettes = sub_80791A8(1, 0, 0, 0, 0, 0, 0); + gTasks[taskId].data[11] = sub_8141314(0, gAnimBankAttacker, selectedPalettes, ballIndex); + gTasks[taskId].data[0]++; + break; + case 1: + if (!gTasks[gTasks[taskId].data[10]].isActive && !gTasks[gTasks[taskId].data[11]].isActive) + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_813F990(u8 taskId) +{ + u8 ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); + sub_80478DC(ballIndex); + DestroyAnimVisualTask(taskId); +} + +void sub_813F9B8(u8 taskId) +{ + u8 ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); + sub_804794C(ballIndex); + DestroyAnimVisualTask(taskId); +} + +void sub_813F9E0(u8 taskId) +{ + if (ewram17840.unk8 == 5) + gBattleAnimArgs[7] = -1; + else + gBattleAnimArgs[7] = 0; + + DestroyAnimVisualTask(taskId); +} + +u8 ball_number_to_ball_processing_index(u16 ballItem) +{ + switch (ballItem) + { + case ITEM_MASTER_BALL: + return 4; + case ITEM_ULTRA_BALL: + return 3; + case ITEM_GREAT_BALL: + return 1; + case ITEM_SAFARI_BALL: + return 2; + case ITEM_NET_BALL: + return 5; + case ITEM_DIVE_BALL: + return 6; + case ITEM_NEST_BALL: + return 7; + case ITEM_REPEAT_BALL: + return 8; + case ITEM_TIMER_BALL: + return 9; + case ITEM_LUXURY_BALL: + return 10; + case ITEM_PREMIER_BALL: + return 11; + case ITEM_POKE_BALL: + default: + return 0; + } +} + +void sub_813FA94(u8 taskId) +{ + u8 ballIndex; + u8 spriteId; + + ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); + spriteId = CreateSprite(&gBallSpriteTemplates[ballIndex], 32, 80, 29); + gSprites[spriteId].data[0] = 34; + gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 0); + gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 1) - 16; + gSprites[spriteId].callback = sub_813FD90; + ewram17840.unk9_1 = gSprites[gBankSpriteIds[gAnimBankTarget]].invisible; + gTasks[taskId].data[0] = spriteId; + gTasks[taskId].func = sub_813FB7C; +} + +static void sub_813FB7C(u8 taskId) +{ + u8 spriteId = gTasks[taskId].data[0]; + if ((u16)gSprites[spriteId].data[0] == 0xFFFF) + DestroyAnimVisualTask(taskId); +} + +void sub_813FBB8(u8 taskId) +{ + int x, y; + u8 ballIndex; + u8 subpriority; + u8 spriteId; + + if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) + { + x = 32; + y = 11; + } + else + { + x = 23; + y = 5; + } + + ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); + subpriority = sub_8079E90(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + 1; + spriteId = CreateSprite(&gBallSpriteTemplates[ballIndex], x + 32, y | 80, subpriority); + gSprites[spriteId].data[0] = 34; + gSprites[spriteId].data[1] = GetBattlerSpriteCoord(gAnimBankTarget, 0); + gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 1) - 16; + gSprites[spriteId].callback = SpriteCallbackDummy; + StartSpriteAnim(&gSprites[gBankSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], 1); + gTasks[taskId].data[0] = spriteId; + gTasks[taskId].func = sub_813FCBC; +} + +static void sub_813FCBC(u8 taskId) +{ + if (gSprites[gBankSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animCmdIndex == 1) + { + PlaySE12WithPanning(SE_NAGERU, 0); + gSprites[gTasks[taskId].data[0]].callback = sub_813FD90; + CreateTask(sub_813FD34, 10); + gTasks[taskId].func = sub_813FB7C; + } +} + +static void sub_813FD34(u8 taskId) +{ + if (gSprites[gBankSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]].animEnded) + { + StartSpriteAnim(&gSprites[gBankSpriteIds[GetBattlerAtPosition(B_POSITION_PLAYER_LEFT)]], 0); + DestroyTask(taskId); + } +} + +static void sub_813FD90(struct Sprite *sprite) +{ + u16 temp = sprite->data[1]; + u16 temp2 = sprite->data[2]; + sprite->data[1] = sprite->pos1.x; + sprite->data[2] = temp; + sprite->data[3] = sprite->pos1.y; + sprite->data[4] = temp2; + sprite->data[5] = -40; + InitAnimArcTranslation(sprite); + sprite->callback = sub_813FDC0; +} + +static void sub_813FDC0(struct Sprite *sprite) +{ + int i; + u8 ballIndex; + int ballIndex2; // extra var needed to match + + if (TranslateAnimArc(sprite)) + { + if (ewram17840.unk8 == 5) + { + sprite->callback = sub_81407B8; + } + else + { + StartSpriteAnim(sprite, 1); + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + + for (i = 0; i < 8; i++) + { + sprite->data[i] = 0; + } + + sprite->data[5] = 0; + sprite->callback = sub_813FE70; + ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); + ballIndex2 = ballIndex; + if (ballIndex2 > 11) + return; + if (ballIndex2 < 0) + return; + + sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballIndex); + sub_8141314(0, gAnimBankTarget, 14, ballIndex); + } + } +} + +static void sub_813FE70(struct Sprite *sprite) +{ + if (++sprite->data[5] == 10) + { + sprite->data[5] = CreateTask(TaskDummy, 50); + sprite->callback = sub_813FEC8; + gSprites[gBankSpriteIds[gAnimBankTarget]].data[1] = 0; + } +} + +static void sub_813FEC8(struct Sprite *sprite) +{ + u8 spriteId; + u8 taskId; + + spriteId = gBankSpriteIds[gAnimBankTarget]; + taskId = sprite->data[5]; + + if (++gTasks[taskId].data[1] == 11) + PlaySE(SE_SUIKOMU); + + switch (gTasks[taskId].data[0]) + { + case 0: + sub_8078E70(spriteId, 0); + gTasks[taskId].data[10] = 256; + gUnknown_03005F0C = 28; + gUnknown_03005F14 = (gSprites[spriteId].pos1.y + gSprites[spriteId].pos2.y) - (sprite->pos1.y + sprite->pos2.y); + gUnknown_03005F10 = (u32)(gUnknown_03005F14 * 256) / 28; + gTasks[taskId].data[2] = gUnknown_03005F10; + gTasks[taskId].data[0]++; + break; + case 1: + gTasks[taskId].data[10] += 0x20; + obj_id_set_rotscale(spriteId, gTasks[taskId].data[10], gTasks[taskId].data[10], 0); + gTasks[taskId].data[3] += gTasks[taskId].data[2]; + gSprites[spriteId].pos2.y = -gTasks[taskId].data[3] >> 8; + if (gTasks[taskId].data[10] >= 0x480) + gTasks[taskId].data[0]++; + break; + case 2: + sub_8078F40(spriteId); + gSprites[spriteId].invisible = 1; + gTasks[taskId].data[0]++; + break; + default: + if (gTasks[taskId].data[1] > 10) + { + DestroyTask(taskId); + StartSpriteAnim(sprite, 2); + sprite->data[5] = 0; + sprite->callback = sub_8140014; + } + break; + } +} + +static void sub_8140014(struct Sprite *sprite) +{ + int angle; + + if (sprite->animEnded) + { + sprite->data[3] = 0; + sprite->data[4] = 32; + sprite->data[5] = 0; + angle = 0; + sprite->pos1.y += Cos(angle, 32); + sprite->pos2.y = -Cos(angle, sprite->data[4]); + sprite->callback = sub_8140058; + } +} + +static void sub_8140058(struct Sprite *sprite) +{ + bool8 lastBounce; + int bounceCount; + + lastBounce = 0; + + switch (sprite->data[3] & 0xFF) + { + case 0: + sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]); + sprite->data[5] += (sprite->data[3] >> 8) + 4; + if (sprite->data[5] >= 64) + { + sprite->data[4] -= 10; + sprite->data[3] += 257; + + bounceCount = sprite->data[3] >> 8; + if (bounceCount == 4) + lastBounce = 1; + + // Play a different sound effect for each pokeball bounce. + switch (bounceCount) + { + case 1: + PlaySE(SE_KON); + break; + case 2: + PlaySE(SE_KON2); + break; + case 3: + PlaySE(SE_KON3); + break; + default: + PlaySE(SE_KON4); + break; + } + } + break; + case 1: + sprite->pos2.y = -Cos(sprite->data[5], sprite->data[4]); + sprite->data[5] -= (sprite->data[3] >> 8) + 4; + if (sprite->data[5] <= 0) + { + sprite->data[5] = 0; + sprite->data[3] &= -0x100; + } + break; + } + + if (lastBounce) + { + sprite->data[3] = 0; + sprite->pos1.y += Cos(64, 32); + sprite->pos2.y = 0; + if (ewram17840.unk8 == 0) + { + sprite->data[5] = 0; + sprite->callback = sub_8140410; + } + else + { + sprite->callback = sub_8140158; + sprite->data[4] = 1; + sprite->data[5] = 0; + } + } +} + +static void sub_8140158(struct Sprite *sprite) +{ + if (++sprite->data[3] == 31) + { + sprite->data[3] = 0; + sprite->affineAnimPaused = 1; + StartSpriteAffineAnim(sprite, 1); + ewram17840.unkC = 0; + sprite->callback = sub_81401A0; + PlaySE(SE_BOWA); + } +} + +static void sub_81401A0(struct Sprite *sprite) +{ + s8 state; + u16 var0; + + switch (sprite->data[3] & 0xFF) + { + case 0: + if ((s16)ewram17840.unkC > 0xFF) + { + sprite->pos2.x += sprite->data[4]; + ewram17840.unkC &= 0xFF; + } + else + { + ewram17840.unkC += 0xB0; + } + + sprite->data[5]++; + sprite->affineAnimPaused = 0; + var0 = sprite->data[5] + 7; + if (var0 > 14) + { + ewram17840.unkC = 0; + sprite->data[3]++; + sprite->data[5] = 0; + } + break; + case 1: + if (++sprite->data[5] == 1) + { + sprite->data[5] = 0; + sprite->data[4] = -sprite->data[4]; + sprite->data[3]++; + sprite->affineAnimPaused = 0; + if (sprite->data[4] < 0) + ChangeSpriteAffineAnim(sprite, 2); + else + ChangeSpriteAffineAnim(sprite, 1); + } + else + { + sprite->affineAnimPaused = 1; + } + break; + case 2: + if ((s16)ewram17840.unkC > 0xFF) + { + sprite->pos2.x += sprite->data[4]; + ewram17840.unkC &= 0xFF; + } + else + { + ewram17840.unkC += 0xB0; + } + + sprite->data[5]++; + sprite->affineAnimPaused = 0; + var0 = sprite->data[5] + 12; + if (var0 > 24) + { + ewram17840.unkC = 0; + sprite->data[3]++; + sprite->data[5] = 0; + } + break; + case 3: + if (sprite->data[5]++ < 0) + { + sprite->affineAnimPaused = 1; + break; + } + + sprite->data[5] = 0; + sprite->data[4] = -sprite->data[4]; + sprite->data[3]++; + sprite->affineAnimPaused = 0; + if (sprite->data[4] < 0) + ChangeSpriteAffineAnim(sprite, 2); + else + ChangeSpriteAffineAnim(sprite, 1); + // fall through + case 4: + if ((s16)ewram17840.unkC > 0xFF) + { + sprite->pos2.x += sprite->data[4]; + ewram17840.unkC &= 0xFF; + } + else + { + ewram17840.unkC += 0xB0; + } + + sprite->data[5]++; + sprite->affineAnimPaused = 0; + var0 = sprite->data[5] + 4; + if (var0 > 8) + { + ewram17840.unkC = 0; + sprite->data[3]++; + sprite->data[5] = 0; + sprite->data[4] = -sprite->data[4]; + } + break; + case 5: + sprite->data[3] += 0x100; + state = sprite->data[3] >> 8; + if (state == ewram17840.unk8) + { + sprite->affineAnimPaused = 1; + sprite->callback = sub_8140410; + } + else + { + if (ewram17840.unk8 == 4 && state == 3) + { + sprite->callback = sub_8140434; + sprite->affineAnimPaused = 1; + } + else + { + sprite->data[3]++; + sprite->affineAnimPaused = 1; + } + } + break; + case 6: + default: + if (++sprite->data[5] == 31) + { + sprite->data[5] = 0; + sprite->data[3] &= -0x100; + StartSpriteAffineAnim(sprite, 3); + if (sprite->data[4] < 0) + StartSpriteAffineAnim(sprite, 2); + else + StartSpriteAffineAnim(sprite, 1); + + PlaySE(SE_BOWA); + } + break; + } +} + +static void sub_8140410(struct Sprite *sprite) +{ + if (++sprite->data[5] == 31) + { + sprite->data[5] = 0; + sprite->callback = sub_81405F4; + } +} + +static void sub_8140434(struct Sprite *sprite) +{ + sprite->animPaused = 1; + sprite->callback = sub_8140454; + sprite->data[3] = 0; + sprite->data[4] = 0; + sprite->data[5] = 0; +} + +static void sub_8140454(struct Sprite *sprite) +{ + u8 *battler = &gAnimBankTarget; + + sprite->data[4]++; + if (sprite->data[4] == 40) + return; + + if (sprite->data[4] == 95) + { + gDoingBattleAnim = 0; + UpdateOamPriorityInAllHealthboxes(1); + m4aMPlayAllStop(); + PlaySE(MUS_FANFA5); + } + else if (sprite->data[4] == 315) + { + FreeOamMatrix(gSprites[gBankSpriteIds[*battler]].oam.matrixNum); + DestroySprite(&gSprites[gBankSpriteIds[*battler]]); + sprite->data[0] = 0; + sprite->callback = sub_81404E4; + } +} + +static void sub_81404E4(struct Sprite *sprite) +{ + u8 paletteIndex; + + switch (sprite->data[0]) + { + case 0: + sprite->data[1] = 0; + sprite->data[2] = 0; + sprite->oam.objMode = ST_OAM_OBJ_BLEND; + REG_BLDCNT = 0x3F40; + REG_BLDALPHA = 0x0010; + paletteIndex = IndexOfSpritePaletteTag(sprite->template->paletteTag); + BeginNormalPaletteFade(1 << (paletteIndex + 0x10), 0, 0, 16, RGB(31, 31, 31)); + sprite->data[0]++; + break; + case 1: + if (sprite->data[1]++ > 0) + { + sprite->data[1] = 0; + sprite->data[2]++; + REG_BLDALPHA = (sprite->data[2] << 8) | (16 - sprite->data[2]); + if (sprite->data[2] == 16) + sprite->data[0]++; + } + break; + case 2: + sprite->invisible = 1; + sprite->data[0]++; + break; + default: + if (!gPaletteFade.active) + { + REG_BLDCNT = 0; + REG_BLDALPHA = 0; + sprite->data[0] = 0; + sprite->callback = sub_81405C8; + } + break; + } +} + +static void sub_81405C8(struct Sprite *sprite) +{ + if (sprite->data[0] == 0) + { + sprite->data[0] = -1; + } + else + { + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + } +} + +// fakematching. I think the return type of ball_number_to_ball_processing_index() +// is wrong because of the weird required casting. +static void sub_81405F4(struct Sprite *sprite) +{ + u8 ballIndex; + int ballIndex2; // extra var needed to match + + StartSpriteAnim(sprite, 1); + StartSpriteAffineAnim(sprite, 0); + sprite->callback = sub_81406BC; + + ballIndex = ball_number_to_ball_processing_index(gLastUsedItem); + ballIndex2 = ballIndex; + if (ballIndex2 > 11) + goto LABEL; + if (ballIndex2 < 0) + goto LABEL; + + sub_814086C(sprite->pos1.x, sprite->pos1.y - 5, 1, 28, ballIndex); + sub_8141314(1, gAnimBankTarget, 14, ballIndex); + + LABEL: + gSprites[gBankSpriteIds[gAnimBankTarget]].invisible = 0; + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[gAnimBankTarget]], 1); + AnimateSprite(&gSprites[gBankSpriteIds[gAnimBankTarget]]); + gSprites[gBankSpriteIds[gAnimBankTarget]].data[1] = 0x1000; +} + +static void sub_81406BC(struct Sprite *sprite) +{ + int next = FALSE; + + if (sprite->animEnded) + sprite->invisible = 1; + + if (gSprites[gBankSpriteIds[gAnimBankTarget]].affineAnimEnded) + { + StartSpriteAffineAnim(&gSprites[gBankSpriteIds[gAnimBankTarget]], 0); + next = TRUE; + } + else + { + gSprites[gBankSpriteIds[gAnimBankTarget]].data[1] -= 288; + gSprites[gBankSpriteIds[gAnimBankTarget]].pos2.y = gSprites[gBankSpriteIds[gAnimBankTarget]].data[1] >> 8; + } + + if (sprite->animEnded && next) + { + gSprites[gBankSpriteIds[gAnimBankTarget]].pos2.y = 0; + gSprites[gBankSpriteIds[gAnimBankTarget]].invisible = ewram17840.unk9_1; + sprite->data[0] = 0; + sprite->callback = sub_81405C8; + gDoingBattleAnim = 0; + UpdateOamPriorityInAllHealthboxes(1); + } +} + +static void sub_81407B8(struct Sprite *sprite) +{ + int i; + + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.y = 0; + sprite->pos2.x = 0; + for (i = 0; i < 6; i++) + sprite->data[i] = 0; + + sprite->callback = sub_81407F4; +} + +#ifdef NONMATCHING +// there is some weird typing going on with var0 and var1. +static void sub_81407F4(struct Sprite *sprite) +{ + s16 var0, var1; + + var0 = sprite->data[0] + 0x800; + var1 = sprite->data[1] + 0x680; + sprite->pos2.x -= var1 >> 8; + sprite->pos2.y += var0 >> 8; + sprite->data[0] = var0 & 0xFF; + sprite->data[1] = var1 & 0xFF; + + if (sprite->pos1.y + sprite->pos2.y > 160 + || sprite->pos1.x + sprite->pos2.x < -8) + { + sprite->data[0] = 0; + sprite->callback = sub_81405C8; + gDoingBattleAnim = 0; + UpdateOamPriorityInAllHealthboxes(1); + } +} +#else +NAKED +static void sub_81407F4(struct Sprite *sprite) +{ + asm(".syntax unified\n\ + push {r4,lr}\n\ + adds r4, r0, 0\n\ + movs r0, 0x80\n\ + lsls r0, 4\n\ + adds r2, r0, 0\n\ + ldrh r1, [r4, 0x2E]\n\ + adds r2, r1\n\ + movs r0, 0xD0\n\ + lsls r0, 3\n\ + adds r3, r0, 0\n\ + ldrh r1, [r4, 0x30]\n\ + adds r3, r1\n\ + lsls r1, r3, 16\n\ + asrs r1, 24\n\ + ldrh r0, [r4, 0x24]\n\ + subs r0, r1\n\ + strh r0, [r4, 0x24]\n\ + lsls r0, r2, 16\n\ + asrs r0, 24\n\ + ldrh r1, [r4, 0x26]\n\ + adds r0, r1\n\ + strh r0, [r4, 0x26]\n\ + movs r0, 0xFF\n\ + ands r2, r0\n\ + strh r2, [r4, 0x2E]\n\ + ands r3, r0\n\ + strh r3, [r4, 0x30]\n\ + movs r2, 0x22\n\ + ldrsh r0, [r4, r2]\n\ + movs r2, 0x26\n\ + ldrsh r1, [r4, r2]\n\ + adds r0, r1\n\ + cmp r0, 0xA0\n\ + bgt _0814084A\n\ + movs r1, 0x20\n\ + ldrsh r0, [r4, r1]\n\ + movs r2, 0x24\n\ + ldrsh r1, [r4, r2]\n\ + adds r0, r1\n\ + movs r1, 0x8\n\ + negs r1, r1\n\ + cmp r0, r1\n\ + bge _0814085E\n\ +_0814084A:\n\ + movs r0, 0\n\ + strh r0, [r4, 0x2E]\n\ + ldr r0, _08140864 @ =sub_81405C8\n\ + str r0, [r4, 0x1C]\n\ + ldr r1, _08140868 @ =gDoingBattleAnim\n\ + movs r0, 0\n\ + strb r0, [r1]\n\ + movs r0, 0x1\n\ + bl UpdateOamPriorityInAllHealthboxes\n\ +_0814085E:\n\ + pop {r4}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_08140864: .4byte sub_81405C8\n\ +_08140868: .4byte gDoingBattleAnim\n\ + .syntax divided\n"); +} +#endif // NONMATCHING + +u8 sub_814086C(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballIndex) +{ + u8 taskId; + + if (GetSpriteTileStartByTag(gUnknown_0840B258[ballIndex].tag) == 0xFFFF) + { + LoadCompressedObjectPic(&gUnknown_0840B258[ballIndex]); + LoadCompressedObjectPalette(&gUnknown_0840B2B8[ballIndex]); + } + + taskId = CreateTask(gUnknown_0840B384[ballIndex], 5); + gTasks[taskId].data[1] = x; + gTasks[taskId].data[2] = y; + gTasks[taskId].data[3] = priority; + gTasks[taskId].data[4] = subpriority; + gTasks[taskId].data[15] = ballIndex; + PlaySE(SE_BOWA2); + if (gMain.inBattle) + ewram17840.unkA++; + + return taskId; +} + +void sub_8140930(u8 taskId) +{ + u8 spriteId; + u8 x, y; + u8 priority, subpriority; + u8 ballIndex; + u8 var0; + + ballIndex = gTasks[taskId].data[15]; + if (gTasks[taskId].data[0] < 16) + { + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8140A08; + gSprites[spriteId].oam.priority = priority; + + var0 = (u8)gTasks[taskId].data[0]; + if (var0 >= 8) + var0 -= 8; + + gSprites[spriteId].data[0] = var0 * 32; + if (gTasks[taskId].data[0] == 15) + { + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); + return; + } + } + + gTasks[taskId].data[0]++; +} + +static void sub_8140A08(struct Sprite *sprite) +{ + if (sprite->data[1] == 0) + sprite->callback = sub_8140A28; + else + sprite->data[1]--; +} + +static void sub_8140A28(struct Sprite *sprite) +{ + sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); + sprite->pos2.y = Cos(sprite->data[0], sprite->data[1]); + sprite->data[1] += 2; + if (sprite->data[1] == 50) + sub_8141294(sprite); +} + +void sub_8140A64(u8 taskId) +{ + u8 i; + u8 x, y, priority, subpriority, ballIndex; + u8 spriteId; + + ballIndex = gTasks[taskId].data[15]; + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8140ECC; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = i * 32; + gSprites[spriteId].data[4] = 10; + gSprites[spriteId].data[5] = 2; + gSprites[spriteId].data[6] = 1; + } + + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); +} + +void sub_8140B3C(u8 taskId) +{ + u8 i; + u8 x, y, priority, subpriority, ballIndex; + u8 spriteId; + + ballIndex = gTasks[taskId].data[15]; + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8140ECC; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = i * 32; + gSprites[spriteId].data[4] = 10; + gSprites[spriteId].data[5] = 1; + gSprites[spriteId].data[6] = 2; + } + + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); +} + +void sub_8140C14(u8 taskId) +{ + u8 i; + u8 x, y, priority, subpriority, ballIndex; + u8 spriteId; + + ballIndex = gTasks[taskId].data[15]; + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8140ECC; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = i * 32; + gSprites[spriteId].data[4] = 4; + gSprites[spriteId].data[5] = 1; + gSprites[spriteId].data[6] = 1; + } + + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); +} + +void sub_8140CE8(u8 taskId) +{ + u8 i; + u8 x, y, priority, subpriority, ballIndex; + u8 spriteId; + + ballIndex = gTasks[taskId].data[15]; + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + for (i = 0; i < 10; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8140ECC; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = i * 25; + gSprites[spriteId].data[4] = 5; + gSprites[spriteId].data[5] = 1; + gSprites[spriteId].data[6] = 1; + } + + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); +} + +void sub_8140DC4(u8 taskId) +{ + u8 i; + u8 x, y, priority, subpriority, ballIndex; + u8 spriteId; + + if (gTasks[taskId].data[7]) + { + gTasks[taskId].data[7]--; + } + else + { + ballIndex = gTasks[taskId].data[15]; + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8140ECC; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = i * 32; + gSprites[spriteId].data[4] = 8; + gSprites[spriteId].data[5] = 2; + gSprites[spriteId].data[6] = 2; + } + + gTasks[taskId].data[7] = 8; + if (++gTasks[taskId].data[0] == 2) + { + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); + } + } +} + +static void sub_8140ECC(struct Sprite *sprite) +{ + sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); + sprite->pos2.y = Cos(sprite->data[0], sprite->data[2]); + sprite->data[0] = (sprite->data[0] + sprite->data[4]) & 0xFF; + sprite->data[1] += sprite->data[5]; + sprite->data[2] += sprite->data[6]; + if (++sprite->data[3] == 51) + sub_8141294(sprite); +} + +void sub_8140F24(u8 taskId) +{ + u8 i; + u8 x, y, priority, subpriority, ballIndex; + u8 spriteId; + + ballIndex = gTasks[taskId].data[15]; + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + for (i = 0; i < 12; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8140FF8; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = i * 21; + } + + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); +} + +static void sub_8140FF8(struct Sprite *sprite) +{ + sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); + sprite->pos2.y = Cos(sprite->data[0], Sin(sprite->data[0], sprite->data[2])); + sprite->data[0] = (sprite->data[0] + 6) & 0xFF; + sprite->data[1]++; + sprite->data[2]++; + if (++sprite->data[3] == 51) + sub_8141294(sprite); +} + +void sub_8141058(u8 taskId) +{ + u8 i, j; + u8 x, y, priority, subpriority, ballIndex; + u8 spriteId; + + ballIndex = gTasks[taskId].data[15]; + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + for (j = 0; j < 2; j++) + { + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8140ECC; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = i * 32; + gSprites[spriteId].data[4] = 8; + + if (j == 0) + { + gSprites[spriteId].data[5] = 2; + gSprites[spriteId].data[6] = 1; + } + else + { + gSprites[spriteId].data[5] = 1; + gSprites[spriteId].data[6] = 2; + } + } + } + + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); +} + +void sub_8141164(u8 taskId) +{ + u8 i; + u8 x, y, priority, subpriority, ballIndex; + u8 spriteId; + + ballIndex = gTasks[taskId].data[15]; + x = gTasks[taskId].data[1]; + y = gTasks[taskId].data[2]; + priority = gTasks[taskId].data[3]; + subpriority = gTasks[taskId].data[4]; + + for (i = 0; i < 8; i++) + { + spriteId = CreateSprite(&gSpriteTemplate_840B3B4[ballIndex], x, y, subpriority); + StartSpriteAnim(&gSprites[spriteId], gUnknown_0840B378[ballIndex]); + gSprites[spriteId].callback = sub_8141230; + gSprites[spriteId].oam.priority = priority; + gSprites[spriteId].data[0] = i * 32; + } + + gSprites[spriteId].data[7] = 1; + DestroyTask(taskId); +} + +static void sub_8141230(struct Sprite *sprite) +{ + sprite->pos2.x = Sin(sprite->data[0], sprite->data[1]); + sprite->pos2.y = Cos(sprite->data[0], Sin(sprite->data[0] & 0x3F, sprite->data[2])); + sprite->data[0] = (sprite->data[0] + 10) & 0xFF; + sprite->data[1]++; + sprite->data[2]++; + if (++sprite->data[3] == 51) + sub_8141294(sprite); +} + +static void sub_8141294(struct Sprite *sprite) +{ + int i; + int temp; + + if (!gMain.inBattle) + { + temp = sprite->data[7]; // temp var needed to match + if (temp == 1) + DestroySpriteAndFreeResources(sprite); + else + DestroySprite(sprite); + } + else if (sprite->data[7] == 1) + { + if (--ewram17840.unkA == 0) + { + for (i = 0; i < 12; i++) + { + FreeSpriteTilesByTag(gUnknown_0840B258[i].tag); + FreeSpritePaletteByTag(gUnknown_0840B2B8[i].tag); + } + + DestroySprite(sprite); + } + else + DestroySprite(sprite); + } + else + DestroySprite(sprite); +} + +u8 sub_8141314(u8 arg0, u8 battler, u32 selectedPalettes, u8 ballIndex) +{ + u8 taskId; + + taskId = CreateTask(sub_81413DC, 5); + gTasks[taskId].data[15] = ballIndex; + gTasks[taskId].data[3] = battler; + gTasks[taskId].data[10] = selectedPalettes; + gTasks[taskId].data[11] = selectedPalettes >> 16; + + if (!arg0) + { + BlendPalette(battler * 16 + 0x100, 16, 0, gUnknown_0840B4D4[ballIndex]); + gTasks[taskId].data[1] = 1; + } + else + { + BlendPalette(battler * 16 + 0x100, 16, 16, gUnknown_0840B4D4[ballIndex]); + gTasks[taskId].data[0] = 16; + gTasks[taskId].data[1] = -1; + gTasks[taskId].func = sub_814146C; + } + + BeginNormalPaletteFade(selectedPalettes, 0, 0, 16, RGB(31, 31, 31)); + return taskId; +} + +static void sub_81413DC(u8 taskId) +{ + u8 ballIndex = gTasks[taskId].data[15]; + + if (gTasks[taskId].data[2] <= 16) + { + BlendPalette(gTasks[taskId].data[3] * 16 + 0x100, 16, gTasks[taskId].data[0], gUnknown_0840B4D4[ballIndex]); + gTasks[taskId].data[0] += gTasks[taskId].data[1]; + gTasks[taskId].data[2]++; + } + else if (!gPaletteFade.active) + { + u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16); + BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB(31, 31, 31)); + DestroyTask(taskId); + } +} + +static void sub_814146C(u8 taskId) +{ + if (!gPaletteFade.active) + { + u32 selectedPalettes = (u16)gTasks[taskId].data[10] | ((u16)gTasks[taskId].data[11] << 16); + BeginNormalPaletteFade(selectedPalettes, 0, 16, 0, RGB(31, 31, 31)); + gTasks[taskId].func = sub_81414BC; + } +} + +static void sub_81414BC(u8 taskId) +{ + u8 ballIndex = gTasks[taskId].data[15]; + + if (gTasks[taskId].data[2] <= 16) + { + BlendPalette(gTasks[taskId].data[3] * 16 + 0x100, 16, gTasks[taskId].data[0], gUnknown_0840B4D4[ballIndex]); + gTasks[taskId].data[0] += gTasks[taskId].data[1]; + gTasks[taskId].data[2]++; + } + else + { + DestroyTask(taskId); + } +} + +void sub_814151C(u8 taskId) +{ + u8 spriteId; + u32 x; + u32 done; + + done = FALSE; + spriteId = gBankSpriteIds[gAnimBankAttacker]; + switch (gTasks[taskId].data[10]) + { + case 0: + gTasks[taskId].data[11] = gBattleAnimArgs[0]; + gTasks[taskId].data[0] += 0x500; + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + gSprites[spriteId].pos2.x += gTasks[taskId].data[0] >> 8; + else + gSprites[spriteId].pos2.x -= gTasks[taskId].data[0] >> 8; + + gTasks[taskId].data[0] &= 0xFF; + x = gSprites[spriteId].pos1.x + gSprites[spriteId].pos2.x + 32; + if (x > 304) + gTasks[taskId].data[10]++; + break; + case 1: + refresh_graphics_maybe(gAnimBankAttacker, gTasks[taskId].data[11], spriteId); + gTasks[taskId].data[10]++; + break; + case 2: + gTasks[taskId].data[0] += 0x500; + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + gSprites[spriteId].pos2.x -= gTasks[taskId].data[0] >> 8; + else + gSprites[spriteId].pos2.x += gTasks[taskId].data[0] >> 8; + + gTasks[taskId].data[0] &= 0xFF; + if (GetBattlerSide(gAnimBankAttacker) != B_SIDE_PLAYER) + { + if (gSprites[spriteId].pos2.x <= 0) + { + gSprites[spriteId].pos2.x = 0; + // done = FALSE; // fakematching--can't get the tail merge correct + goto DONE; + } + } + else + { + if (gSprites[spriteId].pos2.x >= 0) + { + gSprites[spriteId].pos2.x = 0; + done = TRUE; + } + } + + if (done) + { + DONE: + DestroyAnimVisualTask(taskId); + } + break; + } +} + +void sub_81416C4(u8 taskId) +{ + u8 spriteId; + + switch (gTasks[taskId].data[15]) + { + case 0: + if (GetBattlerPosition_permutated(gAnimBankAttacker) == 1) + REG_BLDCNT = 0x3F42; + else + REG_BLDCNT = 0x3F44; + + REG_BLDALPHA = 0x0010; + gTasks[taskId].data[15]++; + break; + case 1: + if (gTasks[taskId].data[1]++ > 1) + { + gTasks[taskId].data[1] = 0; + gTasks[taskId].data[0]++; + REG_BLDALPHA = (gTasks[taskId].data[0] << 8) | (16 - gTasks[taskId].data[0]); + if (gTasks[taskId].data[0] == 16) + gTasks[taskId].data[15]++; + } + break; + case 2: + spriteId = gBankSpriteIds[gAnimBankAttacker]; + DmaClear32(3, (void *)OBJ_VRAM0 + gSprites[spriteId].oam.tileNum * TILE_SIZE_4BPP, 0x800); + sub_80324E0(gAnimBankAttacker); + DestroyAnimVisualTask(taskId); + break; + } +} + +void sub_81417D8(u8 taskId) +{ + gBattleAnimArgs[7] = ewram17800[gAnimBankAttacker].substituteSprite; + DestroyAnimVisualTask(taskId); +} + +void sub_8141808(u8 taskId) +{ + gAnimBankTarget = gEffectBank; + DestroyAnimVisualTask(taskId); +} + +void sub_8141828(u8 battler, struct Pokemon *mon) +{ + int isShiny; + u32 otId, personality; + u32 shinyValue; + u8 taskId1, taskId2; + + isShiny = 0; + ewram17810[battler].unk0_7 = 1; + otId = GetMonData(mon, MON_DATA_OT_ID); + personality = GetMonData(mon, MON_DATA_PERSONALITY); + + if (IsAnimBankSpriteVisible(battler)) + { + shinyValue = HIHALF(otId) ^ LOHALF(otId) ^ HIHALF(personality) ^ LOHALF(personality); + if (shinyValue < 8) + isShiny = TRUE; + + if (isShiny) + { + if (GetSpriteTileStartByTag(0x27F9) == 0xFFFF) + { + LoadCompressedObjectPic(&gBattleAnimPicTable[233]); + LoadCompressedObjectPalette(&gBattleAnimPaletteTable[233]); + } + + taskId1 = CreateTask(sub_814191C, 10); + taskId2 = CreateTask(sub_814191C, 10); + gTasks[taskId1].data[0] = battler; + gTasks[taskId2].data[0] = battler; + gTasks[taskId1].data[1] = 0; + gTasks[taskId2].data[1] = 1; + return; + } + } + + ewram17810[battler].unk1_0 = 1; +} + +static void sub_814191C(u8 taskId) +{ + u8 battler; + u8 x, y; + u8 spriteId; + u16 counter; + s16 state; + u8 pan; + + if (gTasks[taskId].data[13] < 60) + { + gTasks[taskId].data[13]++; + return; + } + + if (ewram17840.unkA) + return; + + counter = gTasks[taskId].data[10]++; + if (counter & 3) + return; + + battler = gTasks[taskId].data[0]; + x = GetBattlerSpriteCoord(battler, 0); + y = GetBattlerSpriteCoord(battler, 1); + state = gTasks[taskId].data[11]; + if (state == 0) + { + spriteId = CreateSprite(&gBattleAnimSpriteTemplate_84024E8, x, y, 5); + } + else if (state >= 0 && gTasks[taskId].data[11] < 4) + { + spriteId = CreateSprite(&gSpriteTemplate_8402500, x, y, 5); + gSprites[spriteId].oam.tileNum += 4; + } + else + { + spriteId = CreateSprite(&gSpriteTemplate_8402500, x, y, 5); + gSprites[spriteId].oam.tileNum += 5; + } + + if (gTasks[taskId].data[1] == 0) + { + gSprites[spriteId].callback = sub_8141B20; + } + else + { + gSprites[spriteId].callback = sub_8141B74; + gSprites[spriteId].pos2.x = -32; + gSprites[spriteId].pos2.y = 32; + gSprites[spriteId].invisible = 1; + if (gTasks[taskId].data[11] == 0) + { + if (GetBattlerSide(battler) == B_SIDE_PLAYER) + pan = 192; + else + pan = 63; + + PlaySE12WithPanning(SE_REAPOKE, pan); + } + } + + gSprites[spriteId].data[0] = taskId; + gTasks[taskId].data[11]++; + gTasks[taskId].data[12]++; + if (gTasks[taskId].data[11] == 5) + gTasks[taskId].func = sub_8141AD8; +} + +static void sub_8141AD8(u8 taskId) +{ + u8 battler; + + if (gTasks[taskId].data[12] == 0) + { + if (gTasks[taskId].data[1] == 1) + { + battler = gTasks[taskId].data[0]; + ewram17810[battler].unk1_0 = 1; + } + + DestroyTask(taskId); + } +} + +static void sub_8141B20(struct Sprite *sprite) +{ + sprite->pos2.x = Sin(sprite->data[1], 24); + sprite->pos2.y = Cos(sprite->data[1], 24); + sprite->data[1] += 12; + if (sprite->data[1] > 0xFF) + { + gTasks[sprite->data[0]].data[12]--; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + } +} + +static void sub_8141B74(struct Sprite *sprite) +{ + if (sprite->data[1] < 4) + { + sprite->data[1]++; + } + else + { + sprite->invisible = 0; + sprite->pos2.x += 5; + sprite->pos2.y -= 5; + if (sprite->pos2.x > 32) + { + gTasks[sprite->data[0]].data[12]--; + FreeSpriteOamMatrix(sprite); + DestroySprite(sprite); + } + } +} + +void sub_8141BD4(u8 taskId) +{ + u8 paletteIndex; + + LoadCompressedObjectPic(&gBattleAnimPicTable[269]); + LoadCompressedObjectPalette(&gBattleAnimPaletteTable[269]); + paletteIndex = IndexOfSpritePaletteTag(0x281D); // unused + DestroyAnimVisualTask(taskId); +} + +void sub_8141C08(u8 taskId) +{ + FreeSpriteTilesByTag(0x281D); + FreeSpritePaletteByTag(0x281D); + DestroyAnimVisualTask(taskId); +} + +void sub_8141C30(struct Sprite *sprite) +{ + InitAnimSpritePos(sprite, 0); + sprite->data[0] = 30; + sprite->data[2] = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), 0) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT), 1) + gBattleAnimArgs[3]; + sprite->data[5] = -32; + InitAnimArcTranslation(sprite); + StartSpriteAnim(&gSprites[gBankSpriteIds[gAnimBankAttacker]], 1); + sprite->callback = sub_8141CBC; +} + +static void sub_8141CBC(struct Sprite *sprite) +{ + if (gSprites[gBankSpriteIds[gAnimBankAttacker]].animCmdIndex == 1) + sprite->callback = sub_8141CF4; +} + +static void sub_8141CF4(struct Sprite *sprite) +{ + if (TranslateAnimArc(sprite)) + { + sprite->data[0] = 0; + sprite->invisible = 1; + sprite->callback = sub_8141D20; + } +} + +static void sub_8141D20(struct Sprite *sprite) +{ + if (gSprites[gBankSpriteIds[gAnimBankAttacker]].animEnded) + { + if (++sprite->data[0] > 0) + { + StartSpriteAnim(&gSprites[gBankSpriteIds[gAnimBankAttacker]], 0); + DestroyAnimSprite(sprite); + } + } +} + +void sub_8141D7C(u8 taskId) +{ + gAnimBankAttacker = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + gAnimBankTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + DestroyAnimVisualTask(taskId); +} + +void sub_8141DAC(u8 taskId) +{ + if (ewram17840.unk0 == 83) + gBattleAnimArgs[0] = 1; + else if (ewram17840.unk0 == 250) + gBattleAnimArgs[0] = 2; + else if (ewram17840.unk0 == 128) + gBattleAnimArgs[0] = 3; + else if (ewram17840.unk0 == 328) + gBattleAnimArgs[0] = 4; + else + gBattleAnimArgs[0] = 0; + + DestroyAnimVisualTask(taskId); +} + +void sub_8141E10(u8 taskId) +{ + gAnimBankAttacker = ewram17840.unk0; + gAnimBankTarget = ewram17840.unk0 >> 8; + DestroyAnimVisualTask(taskId); +} diff --git a/src/battle/battle_controller_linkopponent.c b/src/battle/battle_controller_linkopponent.c index a759822cd..8ca3d160a 100644 --- a/src/battle/battle_controller_linkopponent.c +++ b/src/battle/battle_controller_linkopponent.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_anim.h" +#include "battle_anim_813F0F4.h" #include "battle_interface.h" #include "data2.h" #include "link.h" @@ -71,7 +72,7 @@ extern void sub_80313A0(struct Sprite *); extern void sub_803757C(void); extern void oamt_add_pos2_onto_pos1(); extern void StoreSpriteCallbackInData(); -extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); +extern void StartAnimLinearTranslation(struct Sprite *); extern void sub_80375B4(void); extern void sub_8010384(struct Sprite *); extern void sub_8037B78(void); @@ -103,7 +104,6 @@ extern u8 move_anim_start_t3(); extern void sub_8037FD8(void); extern void sub_8037F34(void); extern void LinkOpponentBufferExecCompleted(void); -extern void sub_8141828(); extern void sub_804777C(); // this file's functions @@ -1280,7 +1280,7 @@ void LinkOpponentHandleTrainerSlideBack(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], SpriteCallbackDummy); gBattleBankFunc[gActiveBattler] = sub_80375B4; } @@ -1631,7 +1631,7 @@ void LinkOpponentHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_803A3A8); taskId = CreateTask(sub_803A2C4, 5); gTasks[taskId].data[0] = gActiveBattler; diff --git a/src/battle/battle_controller_linkpartner.c b/src/battle/battle_controller_linkpartner.c index 16aef5791..dff4edfc1 100644 --- a/src/battle/battle_controller_linkpartner.c +++ b/src/battle/battle_controller_linkpartner.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_anim.h" +#include "battle_anim_813F0F4.h" #include "battle_interface.h" #include "data2.h" #include "battle_811DA74.h" @@ -73,7 +74,7 @@ extern u8 sub_8031720(); extern u8 mplay_80342A4(); extern void oamt_add_pos2_onto_pos1(); extern void StoreSpriteCallbackInData(); -extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); +extern void StartAnimLinearTranslation(struct Sprite *); extern void sub_80105EC(struct Sprite *); extern s32 sub_803FC34(u16); extern void LoadPlayerTrainerBankSprite(); @@ -97,7 +98,6 @@ extern void sub_8043DB0(); extern void move_anim_start_t4(); extern void c3_0802FDF4(u8); extern void sub_8031F88(); -extern void sub_8141828(); extern void c2_8011A1C(void); // this file's functions @@ -1224,7 +1224,7 @@ void LinkPartnerHandleTrainerSlideBack(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], SpriteCallbackDummy); gBattleBankFunc[gActiveBattler] = sub_811DB1C; } @@ -1576,7 +1576,7 @@ void LinkPartnerHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gActiveBattler; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_8030E38); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 1); diff --git a/src/battle/battle_controller_opponent.c b/src/battle/battle_controller_opponent.c index d8760e21f..ee313c098 100644 --- a/src/battle/battle_controller_opponent.c +++ b/src/battle/battle_controller_opponent.c @@ -83,7 +83,7 @@ extern void sub_80313A0(struct Sprite *); extern void sub_8032B4C(void); extern void sub_8031A6C(u16, u8); extern void sub_8032B84(void); -extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); +extern void StartAnimLinearTranslation(struct Sprite *); extern void sub_8032BBC(void); extern void oamt_add_pos2_onto_pos1(); extern void StoreSpriteCallbackInData(); @@ -1284,7 +1284,7 @@ void OpponentHandleTrainerSlideBack(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], SpriteCallbackDummy); gBattleBankFunc[gActiveBattler] = sub_8032BBC; } @@ -2223,7 +2223,7 @@ void OpponentHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 35; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = 280; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_8035C10); taskId = CreateTask(sub_8035C44, 5); gTasks[taskId].data[0] = gActiveBattler; diff --git a/src/battle/battle_controller_player.c b/src/battle/battle_controller_player.c index a83946554..654a2c195 100644 --- a/src/battle/battle_controller_player.c +++ b/src/battle/battle_controller_player.c @@ -2,6 +2,7 @@ #include "data2.h" #include "battle.h" #include "battle_anim.h" +#include "battle_anim_813F0F4.h" #include "battle_interface.h" #include "battle_message.h" #include "item.h" @@ -94,7 +95,7 @@ extern void sub_8047858(); extern u8 GetBattlerSide(u8); extern void StartBattleIntroAnim(); extern void oamt_add_pos2_onto_pos1(); -extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); +extern void StartAnimLinearTranslation(struct Sprite *); extern void StoreSpriteCallbackInData(); extern void BattleLoadPlayerMonSprite(); extern bool8 IsDoubleBattle(void); @@ -164,7 +165,6 @@ extern void sub_8010520(struct Sprite *); extern void sub_8010574(struct Sprite *); extern bool8 IsDoubleBattle(); extern void sub_804777C(); -extern void sub_8141828(); extern void sub_8094E20(u8); extern void nullsub_14(void); extern void sub_80A6DCC(void); @@ -2612,7 +2612,7 @@ void PlayerHandleTrainerSlideBack(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], SpriteCallbackDummy); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 1); gBattleBankFunc[gActiveBattler] = sub_802D274; @@ -3067,7 +3067,7 @@ void PlayerHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gActiveBattler; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_8030E38); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 1); diff --git a/src/battle/battle_controller_wally.c b/src/battle/battle_controller_wally.c index ed4eadee6..312ef9d12 100644 --- a/src/battle/battle_controller_wally.c +++ b/src/battle/battle_controller_wally.c @@ -1,6 +1,7 @@ #include "global.h" #include "battle.h" #include "battle_anim.h" +#include "battle_anim_813F0F4.h" #include "battle_interface.h" #include "battle_message.h" #include "data2.h" @@ -63,7 +64,6 @@ extern void Emitcmd35(u8, u16); extern void nullsub_14(void); extern void PrepareBagForWallyTutorial(void); -extern void sub_8141828(); extern void sub_8045A5C(); extern void sub_804777C(); extern void sub_8043DFC(); @@ -85,7 +85,7 @@ extern void sub_80304A8(void); extern void sub_8047858(); extern void StartBattleIntroAnim(); extern void oamt_add_pos2_onto_pos1(); -extern void StartTranslateAnimSpriteByDeltas(struct Sprite *); +extern void StartAnimLinearTranslation(struct Sprite *); extern void sub_8030E38(struct Sprite *); extern void StoreSpriteCallbackInData(); extern u8 sub_8046400(); @@ -1482,7 +1482,7 @@ void WallyHandleTrainerBallThrow(void) gSprites[gBankSpriteIds[gActiveBattler]].data[0] = 50; gSprites[gBankSpriteIds[gActiveBattler]].data[2] = -40; gSprites[gBankSpriteIds[gActiveBattler]].data[4] = gSprites[gBankSpriteIds[gActiveBattler]].pos1.y; - gSprites[gBankSpriteIds[gActiveBattler]].callback = StartTranslateAnimSpriteByDeltas; + gSprites[gBankSpriteIds[gActiveBattler]].callback = StartAnimLinearTranslation; gSprites[gBankSpriteIds[gActiveBattler]].data[5] = gActiveBattler; StoreSpriteCallbackInData(&gSprites[gBankSpriteIds[gActiveBattler]], sub_8030E38); StartSpriteAnim(&gSprites[gBankSpriteIds[gActiveBattler]], 1); diff --git a/src/battle/pokeball.c b/src/battle/pokeball.c index c619141a1..ac15246d6 100644 --- a/src/battle/pokeball.c +++ b/src/battle/pokeball.c @@ -1,6 +1,7 @@ #include "global.h" #include "gba/m4a_internal.h" #include "battle.h" +#include "battle_anim_813F0F4.h" #include "decompress.h" #include "graphics.h" #include "m4a.h" @@ -296,11 +297,8 @@ const struct SpriteTemplate gBallSpriteTemplates[] = }, }; -extern u32 ball_number_to_ball_processing_index(u16); // not sure of return type -extern void InitAnimSpriteTranslationOverDuration(); -extern bool8 TranslateAnimSpriteLinearAndSine(struct Sprite *); -extern u8 sub_814086C(u8, u8, int, int, u8); -extern u8 sub_8141314(u8, u8, int, u8); +extern void InitAnimArcTranslation(); +extern bool8 TranslateAnimArc(struct Sprite *); static void sub_8046464(u8); static void sub_80466E8(struct Sprite *); @@ -397,7 +395,7 @@ static void sub_8046464(u8 taskId) gSprites[spriteId].data[2] = GetBattlerSpriteCoord(gBankTarget, 0); gSprites[spriteId].data[4] = GetBattlerSpriteCoord(gBankTarget, 1) - 16; gSprites[spriteId].data[5] = -40; - InitAnimSpriteTranslationOverDuration(&gSprites[spriteId]); + InitAnimArcTranslation(&gSprites[spriteId]); gSprites[spriteId].oam.affineParam = taskId; gTasks[taskId].data[4] = gBankTarget; gTasks[taskId].func = TaskDummy; @@ -406,7 +404,7 @@ static void sub_8046464(u8 taskId) static void objc_0804ABD4(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) { u8 taskId = sprite->oam.affineParam; u8 r5 = gTasks[taskId].data[4]; @@ -834,7 +832,7 @@ static void sub_8047074(struct Sprite *sprite) sprite->data[4] = GetBattlerSpriteCoord(sprite->data[6], 3) + 24; sprite->data[5] = -30; sprite->oam.affineParam = sprite->data[6]; - InitAnimSpriteTranslationOverDuration(sprite); + InitAnimArcTranslation(sprite); sprite->callback = sub_80470C4; } @@ -858,7 +856,7 @@ static void sub_80470C4(struct Sprite *sprite) StartSpriteAffineAnim(sprite, 4); } r4 = sprite->data[0]; - TranslateAnimSpriteByDeltas(sprite); + TranslateAnimLinear(sprite); sprite->data[7] += sprite->data[6] / 3; sprite->pos2.y += Sin(HIBYTE(sprite->data[7]), sprite->data[5]); sprite->oam.affineParam += 0x100; @@ -876,7 +874,7 @@ static void sub_80470C4(struct Sprite *sprite) } else { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) { sprite->pos1.x += sprite->pos2.x; sprite->pos1.y += sprite->pos2.y; diff --git a/src/pokemon_1.c b/src/pokemon_1.c index 0622ec614..4f5094024 100644 --- a/src/pokemon_1.c +++ b/src/pokemon_1.c @@ -13,12 +13,7 @@ #include "trainer.h" #include "text.h" #include "ewram.h" - -//Extracts the upper 16 bits of a 32-bit number -#define HIHALF(n) (((n) & 0xFFFF0000) >> 16) - -//Extracts the lower 16 bits of a 32-bit number -#define LOHALF(n) ((n) & 0xFFFF) +#include "util.h" extern u16 gMoveToLearn; diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 008d942b2..2fd7cb1ca 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3,6 +3,7 @@ #include "constants/songs.h" #include "constants/species.h" #include "battle.h" +#include "battle_anim_813F0F4.h" #include "contest.h" #include "data2.h" #include "decompress.h" @@ -119,7 +120,6 @@ static u8 *SummaryScreen_CopyColoredString(u8 *, const u8 *, u8); static void sub_80A0A2C(struct Pokemon *, u8, u8); static void SummaryScreen_PrintColoredText(const u8 *, u8, u8, u8); -extern u8 ball_number_to_ball_processing_index(u16); extern u8 StorageSystemGetNextMonIndex(struct BoxPokemon *, u8, u8, u8); extern struct MusicPlayerInfo gMPlay_BGM; diff --git a/src/rom_8077ABC.c b/src/rom_8077ABC.c index 00ce3d8df..e81d02251 100644 --- a/src/rom_8077ABC.c +++ b/src/rom_8077ABC.c @@ -760,18 +760,18 @@ void sub_807867C(struct Sprite *sprite, s16 a2) } } -void InitAnimSpriteTranslationOverDuration(struct Sprite *sprite) +void InitAnimArcTranslation(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); sprite->data[6] = 0x8000 / sprite->data[0]; sprite->data[7] = 0; } -bool8 TranslateAnimSpriteLinearAndSine(struct Sprite *sprite) +bool8 TranslateAnimArc(struct Sprite *sprite) { - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) return TRUE; sprite->data[7] += sprite->data[6]; sprite->pos2.y += Sin((u8)(sprite->data[7] >> 8), sprite->data[5]); @@ -951,7 +951,7 @@ void InitSpriteDataForLinearTranslation(struct Sprite *sprite) sprite->data[3] = 0; } -void InitAnimSpriteTranslationDeltas(struct Sprite *sprite) +void InitAnimLinearTranslation(struct Sprite *sprite) { int x = sprite->data[2] - sprite->data[1]; int y = sprite->data[4] - sprite->data[3]; @@ -979,16 +979,16 @@ void InitAnimSpriteTranslationDeltas(struct Sprite *sprite) sprite->data[3] = 0; } -void StartTranslateAnimSpriteByDeltas(struct Sprite *sprite) +void StartAnimLinearTranslation(struct Sprite *sprite) { sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; - InitAnimSpriteTranslationDeltas(sprite); - sprite->callback = TranslateAnimSpriteByDeltasUntil; + InitAnimLinearTranslation(sprite); + sprite->callback = TranslateAnimLinearUntil; sprite->callback(sprite); } -bool8 TranslateAnimSpriteByDeltas(struct Sprite *sprite) +bool8 TranslateAnimLinear(struct Sprite *sprite) { u16 v1, v2, x, y; @@ -1018,9 +1018,9 @@ bool8 TranslateAnimSpriteByDeltas(struct Sprite *sprite) return FALSE; } -void TranslateAnimSpriteByDeltasUntil(struct Sprite *sprite) +void TranslateAnimLinearUntil(struct Sprite *sprite) { - if (TranslateAnimSpriteByDeltas(sprite)) + if (TranslateAnimLinear(sprite)) SetCallbackToStoredInData(sprite); } @@ -1028,7 +1028,7 @@ void sub_8078BD4(struct Sprite *sprite) { int v1 = abs(sprite->data[2] - sprite->data[1]) << 8; sprite->data[0] = v1 / sprite->data[0]; - InitAnimSpriteTranslationDeltas(sprite); + InitAnimLinearTranslation(sprite); } void sub_8078C00(struct Sprite *sprite) @@ -1036,7 +1036,7 @@ void sub_8078C00(struct Sprite *sprite) sprite->data[1] = sprite->pos1.x; sprite->data[3] = sprite->pos1.y; sub_8078BD4(sprite); - sprite->callback = TranslateAnimSpriteByDeltasUntil; + sprite->callback = TranslateAnimLinearUntil; sprite->callback(sprite); } @@ -1420,7 +1420,7 @@ void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(gAnimBankTarget, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(gAnimBankTarget, v2) + gBattleAnimArgs[3]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -1433,13 +1433,13 @@ void sub_80794A8(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 = sub_8079518; } void sub_8079518(struct Sprite *sprite) { - if (TranslateAnimSpriteLinearAndSine(sprite)) + if (TranslateAnimArc(sprite)) DestroyAnimSprite(sprite); } @@ -1473,7 +1473,7 @@ void sub_8079534(struct Sprite *sprite) sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(slot, 2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(slot, r7) + gBattleAnimArgs[3]; - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } @@ -2351,6 +2351,6 @@ void sub_807A9BC(struct Sprite *sprite) sprite->pos1.x += x; sprite->pos1.y = gBattleAnimArgs[5] - 80; } - sprite->callback = StartTranslateAnimSpriteByDeltas; + sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData(sprite, DestroyAnimSprite); } |