Merge pull request #238 from DizzyEggg/decompile_battle_anim_sound_tasks

decompile battle_anim_sound_tasks
This commit is contained in:
Diegoisawesome 2018-04-18 11:40:01 -05:00 committed by GitHub
commit 4e63a52832
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 453 additions and 1021 deletions

View File

@ -554,7 +554,7 @@ _080A60E8:
ldrh r0, [r1, 0x2] ldrh r0, [r1, 0x2]
cmp r0, 0 cmp r0, 0
bne _080A610C bne _080A610C
ldr r1, =gAnimSpeciesByBanks ldr r1, =gAnimBattlerSpecies
lsls r0, r4, 1 lsls r0, r4, 1
adds r0, r1 adds r0, r1
ldrh r1, [r0] ldrh r1, [r0]

File diff suppressed because it is too large Load Diff

View File

@ -47,7 +47,7 @@ extern s16 gBattleAnimArgs[ANIM_ARGS_COUNT];
extern u8 gAnimMoveTurn; extern u8 gAnimMoveTurn;
extern u8 gBattleAnimAttacker; extern u8 gBattleAnimAttacker;
extern u8 gBattleAnimTarget; extern u8 gBattleAnimTarget;
extern u16 gAnimSpeciesByBanks[MAX_BATTLERS_COUNT]; extern u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT];
extern u8 gUnknown_02038440; extern u8 gUnknown_02038440;
void ClearBattleAnimationVars(void); void ClearBattleAnimationVars(void);
@ -61,7 +61,7 @@ void sub_80A438C(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible);
bool8 IsContest(void); bool8 IsContest(void);
s8 BattleAnimAdjustPanning(s8 pan); s8 BattleAnimAdjustPanning(s8 pan);
s8 BattleAnimAdjustPanning2(s8 pan); s8 BattleAnimAdjustPanning2(s8 pan);
s16 sub_80A52EC(s16 a); s16 KeepPanInRange(s16 a);
s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan); s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan);
// battle_anim_80FE840.s // battle_anim_80FE840.s

View File

@ -203,7 +203,7 @@ SECTIONS {
src/mystery_event_script.o(.text); src/mystery_event_script.o(.text);
asm/field_effect_helpers.o(.text); asm/field_effect_helpers.o(.text);
asm/contest_ai.o(.text); asm/contest_ai.o(.text);
asm/battle_anim_sound_tasks.o(.text); src/battle_anim_sound_tasks.o(.text);
src/battle_controller_safari.o(.text); src/battle_controller_safari.o(.text);
src/fldeff_sweetscent.o(.text); src/fldeff_sweetscent.o(.text);
asm/battle_anim_815A0D4.o(.text); asm/battle_anim_815A0D4.o(.text);

View File

@ -123,7 +123,7 @@ EWRAM_DATA static u8 sAnimBackgroundFadeState = 0;
EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused. EWRAM_DATA static u16 sAnimMoveIndex = 0; // set but unused.
EWRAM_DATA u8 gBattleAnimAttacker = 0; EWRAM_DATA u8 gBattleAnimAttacker = 0;
EWRAM_DATA u8 gBattleAnimTarget = 0; EWRAM_DATA u8 gBattleAnimTarget = 0;
EWRAM_DATA u16 gAnimSpeciesByBanks[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA u16 gAnimBattlerSpecies[MAX_BATTLERS_COUNT] = {0};
EWRAM_DATA u8 gUnknown_02038440 = 0; EWRAM_DATA u8 gUnknown_02038440 = 0;
// const rom data // const rom data
@ -228,15 +228,15 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo
for (i = 0; i < MAX_BATTLERS_COUNT; i++) for (i = 0; i < MAX_BATTLERS_COUNT; i++)
{ {
if (GetBattlerSide(i) != 0) if (GetBattlerSide(i) != 0)
gAnimSpeciesByBanks[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); gAnimBattlerSpecies[i] = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
else else
gAnimSpeciesByBanks[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); gAnimBattlerSpecies[i] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES);
} }
} }
else else
{ {
for (i = 0; i < 4; i++) for (i = 0; i < 4; i++)
gAnimSpeciesByBanks[i] = gContestResources->field_18->field_0; gAnimBattlerSpecies[i] = gContestResources->field_18->field_0;
} }
if (!isMoveAnim) if (!isMoveAnim)
@ -1318,16 +1318,16 @@ s8 BattleAnimAdjustPanning2(s8 pan)
return pan; return pan;
} }
s16 sub_80A52EC(s16 a) s16 KeepPanInRange(s16 panArg)
{ {
s16 var = a; s16 pan = panArg;
if (var > 63) if (pan > PAN_SIDE_OPPONENT)
var = 63; pan = PAN_SIDE_OPPONENT;
else if (var < -64) else if (pan < PAN_SIDE_PLAYER)
var = -64; pan = PAN_SIDE_PLAYER;
return var; return pan;
} }
s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan) s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan)

View File

@ -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