mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-11-18 12:37:38 +01:00
439 lines
11 KiB
C
439 lines
11 KiB
C
|
#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
|