diff options
Diffstat (limited to 'src/battle_anim_sound_tasks.c')
-rw-r--r-- | src/battle_anim_sound_tasks.c | 438 |
1 files changed, 438 insertions, 0 deletions
diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c new file mode 100644 index 000000000..e956fd44f --- /dev/null +++ b/src/battle_anim_sound_tasks.c @@ -0,0 +1,438 @@ +#include "global.h" +#include "battle.h" +#include "constants/battle_anim.h" +#include "constants/species.h" +#include "battle_anim.h" +#include "task.h" +#include "sound.h" +#include "contest.h" + +// this file's functions +static void sub_8158B98(u8 taskId); +static void sub_8158C04(u8 taskId); +static void sub_8158D08(u8 taskId); +static void sub_8158FF4(u8 taskId); +static void sub_815913C(u8 taskId); +static void sub_8159308(u8 taskId); + +// task start +void sub_8158B30(u8 taskId) +{ + s8 pan1, pan2, panIncrement; + + gTasks[taskId].data[0] = gBattleAnimArgs[0]; + gTasks[taskId].data[1] = gBattleAnimArgs[1]; + + pan1 = BattleAnimAdjustPanning(PAN_SIDE_PLAYER); + pan2 = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT); + panIncrement = CalculatePanIncrement(pan1, pan2, 2); + + gTasks[taskId].data[2] = pan1; + gTasks[taskId].data[3] = pan2; + gTasks[taskId].data[4] = panIncrement; + gTasks[taskId].data[10] = 10; + + gTasks[taskId].func = sub_8158B98; +} + +static void sub_8158B98(u8 taskId) +{ + s16 pan = gTasks[taskId].data[2]; + s8 panIncrement = gTasks[taskId].data[4]; + if (++gTasks[taskId].data[11] == 111) + { + gTasks[taskId].data[10] = 5; + gTasks[taskId].data[11] = 0; + gTasks[taskId].func = sub_8158C04; + } + else + { + if (++gTasks[taskId].data[10] == 11) + { + gTasks[taskId].data[10] = 0; + PlaySE12WithPanning(gTasks[taskId].data[0], pan); + } + pan += panIncrement; + gTasks[taskId].data[2] = KeepPanInRange(pan); + } +} + +static void sub_8158C04(u8 taskId) +{ + if (++gTasks[taskId].data[10] == 6) + { + s8 pan; + + gTasks[taskId].data[10] = 0; + pan = BattleAnimAdjustPanning(PAN_SIDE_OPPONENT); + PlaySE12WithPanning(gTasks[taskId].data[1], pan); + if (++gTasks[taskId].data[11] == 2) + DestroyAnimSoundTask(taskId); + } +} +// task end + +// task start +void sub_8158C58(u8 taskId) +{ + u16 songId = gBattleAnimArgs[0]; + s8 targetPan = gBattleAnimArgs[2]; + s8 panIncrement = gBattleAnimArgs[3]; + u8 r10 = gBattleAnimArgs[4]; + u8 r7 = gBattleAnimArgs[5]; + u8 r9 = gBattleAnimArgs[6]; + s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + + targetPan = BattleAnimAdjustPanning(targetPan); + panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement); + + gTasks[taskId].data[0] = songId; + gTasks[taskId].data[1] = sourcePan; + gTasks[taskId].data[2] = targetPan; + gTasks[taskId].data[3] = panIncrement; + gTasks[taskId].data[4] = r10; + gTasks[taskId].data[5] = r7; + gTasks[taskId].data[6] = r9; + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] = sourcePan; + gTasks[taskId].data[12] = r9; + + gTasks[taskId].func = sub_8158D08; + sub_8158D08(taskId); +} + +static void sub_8158D08(u8 taskId) +{ + if (gTasks[taskId].data[12]++ == gTasks[taskId].data[6]) + { + gTasks[taskId].data[12] = 0; + PlaySE12WithPanning(gTasks[taskId].data[0], gTasks[taskId].data[11]); + if (--gTasks[taskId].data[4] == 0) + { + DestroyAnimSoundTask(taskId); + return; + } + } + + if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5]) + { + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] += gTasks[taskId].data[3]; + gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11]); + } +} +// task end + +// task start +void sub_8158D8C(u8 taskId) +{ + u16 species = 0; + s8 pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER); + if (IsContest()) + { + if (gBattleAnimArgs[0] == ANIM_ATTACKER) + species = gContestResources->field_18->field_0; + else + DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task + } + else + { + u8 battlerId; + + // get wanted battler + if (gBattleAnimArgs[0] == ANIM_ATTACKER) + battlerId = gBattleAnimAttacker; + else if (gBattleAnimArgs[0] == ANIM_TARGET) + battlerId = gBattleAnimTarget; + else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER) + battlerId = BATTLE_PARTNER(gBattleAnimAttacker); + else + battlerId = BATTLE_PARTNER(gBattleAnimTarget); + + // check if battler is visible + if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId)) + { + DestroyAnimVisualTask(taskId); + return; + } + + if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + } + + if (species != SPECIES_NONE) + PlayCry3(species, pan, 3); + + DestroyAnimVisualTask(taskId); +} +// task end + +// task start +void sub_8158E9C(u8 taskId) +{ + u16 species = 0; + s8 pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER); + if (IsContest()) + { + if (gBattleAnimArgs[0] == ANIM_ATTACKER) + species = gContestResources->field_18->field_0; + else + DestroyAnimVisualTask(taskId); // UB: function should return upon destroying task + } + else + { + u8 battlerId; + + // get wanted battler + if (gBattleAnimArgs[0] == ANIM_ATTACKER) + battlerId = gBattleAnimAttacker; + else if (gBattleAnimArgs[0] == ANIM_TARGET) + battlerId = gBattleAnimTarget; + else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER) + battlerId = BATTLE_PARTNER(gBattleAnimAttacker); + else + battlerId = BATTLE_PARTNER(gBattleAnimTarget); + + // check if battler is visible + if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId)) + { + DestroyAnimVisualTask(taskId); + return; + } + + if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + else + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + } + + gTasks[taskId].data[0] = gBattleAnimArgs[1]; + gTasks[taskId].data[1] = species; + gTasks[taskId].data[2] = pan; + + if (species != SPECIES_NONE) + { + if (gBattleAnimArgs[1] == 0xFF) + PlayCry3(species, pan, 9); + else + PlayCry3(species, pan, 7); + + gTasks[taskId].func = sub_8158FF4; + } + else + { + DestroyAnimVisualTask(taskId); + } +} + +static void sub_8158FF4(u8 taskId) +{ + u16 species = gTasks[taskId].data[1]; + s8 pan = gTasks[taskId].data[2]; + + if (gTasks[taskId].data[9] < 2) + { + gTasks[taskId].data[9]++; + } + else + { + if (gTasks[taskId].data[0] == 0xFF) + { + if (!IsCryPlaying()) + { + PlayCry3(species, pan, 10); + DestroyAnimVisualTask(taskId); + } + } + else + { + if (!IsCryPlaying()) + { + PlayCry3(species, pan, 8); + DestroyAnimVisualTask(taskId); + } + } + } +} +// task end + +void sub_8159078(u8 taskId) +{ + if (gTasks[taskId].data[9] < 2) + { + gTasks[taskId].data[9]++; + } + else + { + if (!IsCryPlaying()) + DestroyAnimVisualTask(taskId); + } +} + +// task start +void sub_81590B8(u8 taskId) +{ + u16 species; + s8 pan; + + gTasks[taskId].data[10] = gBattleAnimArgs[0]; + pan = BattleAnimAdjustPanning(PAN_SIDE_PLAYER); + + if (IsContest()) + species = gContestResources->field_18->field_0; + else + species = gAnimBattlerSpecies[gBattleAnimAttacker]; + + gTasks[taskId].data[1] = species; + gTasks[taskId].data[2] = pan; + + if (species != SPECIES_NONE) + gTasks[taskId].func = sub_815913C; + else + DestroyAnimVisualTask(taskId); +} + +static void sub_815913C(u8 taskId) +{ + u16 species = gTasks[taskId].data[1]; + s8 pan = gTasks[taskId].data[2]; + + switch (gTasks[taskId].data[9]) + { + case 2: + PlayCry6(species, pan, 4); + gTasks[taskId].data[9]++; + break; + case 1: + case 3: + case 4: + gTasks[taskId].data[9]++; + break; + case 5: + if (IsCryPlaying()) + break; + case 0: + StopCryAndClearCrySongs(); + gTasks[taskId].data[9]++; + break; + default: + if (gTasks[taskId].data[10] == 0) + PlayCry6(species, pan, 6); + else + PlayCry3(species, pan, 6); + + DestroyAnimVisualTask(taskId); + break; + } +} +// task end + +void sub_8159210(u8 taskId) +{ + u16 songId = gBattleAnimArgs[0]; + s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + + PlaySE1WithPanning(songId, pan); + DestroyAnimVisualTask(taskId); +} + +void sub_8159244(u8 taskId) +{ + u16 songId = gBattleAnimArgs[0]; + s8 pan = BattleAnimAdjustPanning(gBattleAnimArgs[1]); + + PlaySE2WithPanning(songId, pan); + DestroyAnimVisualTask(taskId); +} + +void sub_8159278(u8 taskId) +{ + s8 targetPan = gBattleAnimArgs[1]; + s8 panIncrement = gBattleAnimArgs[2]; + u16 r9 = gBattleAnimArgs[3]; + s8 sourcePan = BattleAnimAdjustPanning(gBattleAnimArgs[0]); + + targetPan = BattleAnimAdjustPanning(targetPan); + panIncrement = CalculatePanIncrement(sourcePan, targetPan, panIncrement); + + gTasks[taskId].data[1] = sourcePan; + gTasks[taskId].data[2] = targetPan; + gTasks[taskId].data[3] = panIncrement; + gTasks[taskId].data[5] = r9; + gTasks[taskId].data[10] = 0; + gTasks[taskId].data[11] = sourcePan; + + gTasks[taskId].func = sub_8159308; + sub_8159308(taskId); +} + +#ifdef NONMATCHING +void sub_8159308(u8 taskId) +{ + s16 panIncrement = gTasks[taskId].data[3]; + + if (gTasks[taskId].data[10]++ == gTasks[taskId].data[5]) + { + gTasks[taskId].data[10] = 0; + + gTasks[taskId].data[11] += panIncrement; + gTasks[taskId].data[11] = KeepPanInRange(gTasks[taskId].data[11]); + } + + gUnknown_02038440 = gTasks[taskId].data[11]; + if (gTasks[taskId].data[11] == gTasks[taskId].data[2]) + DestroyAnimVisualTask(taskId); +} +#else +ASM_DIRECT +void sub_8159308(u8 taskId) +{ + asm_unified(" push {r4,r5,lr}\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + adds r5, r0, 0\n\ + ldr r1, =gTasks\n\ + lsls r0, r5, 2\n\ + adds r0, r5\n\ + lsls r0, 3\n\ + adds r4, r0, r1\n\ + ldrh r2, [r4, 0xE]\n\ + ldrh r0, [r4, 0x1C]\n\ + adds r1, r0, 0x1\n\ + strh r1, [r4, 0x1C]\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + movs r3, 0x12\n\ + ldrsh r1, [r4, r3]\n\ + cmp r0, r1\n\ + bne _08159342\n\ + movs r0, 0\n\ + strh r0, [r4, 0x1C]\n\ + ldrh r1, [r4, 0x1E]\n\ + adds r0, r2, r1\n\ + strh r0, [r4, 0x1E]\n\ + movs r2, 0x1E\n\ + ldrsh r0, [r4, r2]\n\ + bl KeepPanInRange\n\ + strh r0, [r4, 0x1E]\n\ +_08159342:\n\ + ldr r1, =gUnknown_02038440\n\ + ldrh r0, [r4, 0x1E]\n\ + strb r0, [r1]\n\ + movs r3, 0x1E\n\ + ldrsh r1, [r4, r3]\n\ + movs r2, 0xC\n\ + ldrsh r0, [r4, r2]\n\ + cmp r1, r0\n\ + bne _0815935A\n\ + adds r0, r5, 0\n\ + bl DestroyAnimVisualTask\n\ +_0815935A:\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .pool"); +} +#endif |