start decompiling battle transition

This commit is contained in:
DizzyEggg
2017-08-17 21:05:59 +02:00
parent 3f0250648e
commit e9ec2a1a56
8 changed files with 442 additions and 900 deletions

View File

@@ -2082,7 +2082,7 @@ sub_8135534: @ 8135534
push {r4,lr}
lsls r0, 24
lsrs r4, r0, 24
bl sub_811AAE8
bl IsBattleTransitionDone
lsls r0, 24
lsrs r0, 24
cmp r0, 0x1

File diff suppressed because it is too large Load Diff

View File

@@ -36,67 +36,67 @@ gUnknown_083FD708:: @ 83FD708
.4byte 0x0200c000
.align 2
gUnknown_083FD70C:: @ 83FD70C
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
.4byte sub_811AC64
sPhase1_Tasks:: @ 83FD70C
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.4byte Phase1Task_TransitionAll
.align 2
gBattleTransitionFuncs:: @ 83FD750
.4byte sub_811ACB4
.4byte sub_811ADAC
.4byte sub_811AF44
.4byte sub_811B0F0
.4byte sub_811B578
.4byte sub_811B7E8
.4byte sub_811BCBC
.4byte sub_811BEA0
.4byte sub_811CA5C
.4byte sub_811CCDC
.4byte sub_811D0B8
.4byte sub_811D1C8
.4byte sub_811C08C
.4byte sub_811C0AC
.4byte sub_811C0CC
.4byte sub_811C0EC
.4byte sub_811C10C
sPhase2_Tasks:: @ 83FD750
.4byte Phase2Task_Transition0
.4byte Phase2Task_Transition1
.4byte Phase2Task_Transition2
.4byte Phase2Task_Transition3
.4byte Phase2Task_Transition4
.4byte Phase2Task_Transition5
.4byte Phase2Task_Transition6
.4byte Phase2Task_Transition7
.4byte Phase2Task_Transition8
.4byte Phase2Task_Transition9
.4byte Phase2Task_Transition10
.4byte Phase2Task_Transition11
.4byte Phase2Task_Transition12
.4byte Phase2Task_Transition13
.4byte Phase2Task_Transition14
.4byte Phase2Task_Transition15
.4byte Phase2Task_Transition16
.align 2
gUnknown_083FD794:: @ 83FD794
.4byte sub_811AB88
.4byte sub_811ABD8
.4byte sub_811AC0C
.4byte sub_811AC34
sMainTransitionPhases:: @ 83FD794
.4byte Transition_Phase1
.4byte Transition_WaitForPhase1
.4byte Transition_Phase2
.4byte Transition_WaitForPhase2
.align 2
gUnknown_083FD7A4:: @ 83FD7A4
.4byte sub_811ACEC
.4byte sub_811AD1C
.4byte sub_811AD80
sPhase2_Transition0_Funcs:: @ 83FD7A4
.4byte Phase2_Transition0_Func1
.4byte Phase2_Transition0_Func2
.4byte Phase2_Transition0_Func3
.align 2
gUnknown_083FD7B0:: @ 83FD7B0
.4byte sub_811ADE4
.4byte sub_811AE70
sPhase2_Transition1_Funcs:: @ 83FD7B0
.4byte Phase2_Transition1_Func1
.4byte Phase2_Transition1_Func2
.align 2
gUnknown_083FD7B8:: @ 83FD7B8
.4byte sub_811AF7C
.4byte sub_811B000
sPhase2_Transition2_Funcs:: @ 83FD7B8
.4byte Phase2_Transition2_Func1
.4byte Phase2_Transition2_Func2
.align 2
gUnknown_083FD7C0:: @ 83FD7C0

View File

@@ -3,6 +3,8 @@
void sub_811AABC(u8);
void sub_811AAD8(u8);
u8 sub_811AAE8(void);
bool8 IsBattleTransitionDone(void);
#define B_TRANSITION_WILD 8
#endif // GUARD_BATTLE_TRANSITION_H

View File

@@ -120,7 +120,7 @@ bool32 is_c1_link_related_active(void);
// c1_overworld_normal
// c1_overworld
// c2_overworld_basic
// sub_8054398
void sub_8054398(void);
void c2_overworld(void);
// set_callback1
// sub_80543DC

View File

@@ -227,6 +227,7 @@ SECTIONS {
src/coins.o(.text);
src/landmark.o(.text);
src/fldeff_strength.o(.text);
src/battle_transition.o(.text);
asm/battle_transition.o(.text);
src/battle_811DA74.o(.text);
asm/battle_message.o(.text);

View File

@@ -438,7 +438,7 @@ void task01_battle_start(u8 taskId)
}
break;
case 1:
if (sub_811AAE8() == TRUE)
if (IsBattleTransitionDone() == TRUE)
{
SetMainCallback2(sub_800E7C4);
prev_quest_postbuffer_cursor_backup_reset();
@@ -827,7 +827,7 @@ void CB2_StartFirstBattle(void)
UpdatePaletteFade();
RunTasks();
if (sub_811AAE8() == TRUE)
if (IsBattleTransitionDone() == TRUE)
{
gBattleTypeFlags = BATTLE_TYPE_FIRST_BATTLE;
gMain.savedCallback = HandleFirstBattleEnd;

302
src/battle_transition.c Normal file
View File

@@ -0,0 +1,302 @@
#include "global.h"
#include "main.h"
#include "rom4.h"
#include "task.h"
#include "palette.h"
#include "trig.h"
void sub_807DE10(void);
void dp12_8087EA4(void);
typedef bool8 (*TransitionState)(struct Task* task);
extern const TransitionState sMainTransitionPhases[];
extern const TransitionState sPhase2_Transition0_Funcs[];
extern const TransitionState sPhase2_Transition1_Funcs[];
extern const TransitionState sPhase2_Transition2_Funcs[];
extern const TaskFunc sPhase1_Tasks[];
extern const TaskFunc sPhase2_Tasks[];
extern u8 ewram[];
extern s16 gUnknown_03005560[];
extern u16 gUnknown_03004DE0[][0x3C0];
struct TransitionData
{
vs8 field_0; // now that's interesting
s8 field_1;
s16 field_2;
s16 field_4;
s16 field_6;
s16 field_8;
s16 field_A;
s16 field_C;
s16 field_E;
s16 field_10;
s16 field_12;
s16 field_14;
s16 field_16;
s16 field_18;
};
#define TRANSITION_STRUCT (*(struct TransitionData *) (&ewram[0xC000]))
// this file's functions
static void LaunchBattleTransitionTask(u8 transitionID);
static void Task_BattleTransitionMain(u8 taskID);
void sub_811D4C8(s16 a0, s16 a1, s16 a2, s16 a3, s16 a4);
bool8 sub_811D52C(void);
void sub_811D658(void);
static void VBlankCB_Phase2_Transition1(void);
static void HBlankCB_Phase2_Transition1(void);
void VBlankCB_Phase2_Transition2(void);
void HBlankCB_Phase2_Transition2(void);
void VBlankCB_BattleTransition(void);
void sub_811D6E8(s16* a0, s16 a1, s16 a2, s16 a3, s16 a4, s16 a5);
void sub_811AABC(u8 transitionID)
{
gMain.callback2 = sub_8054398;
LaunchBattleTransitionTask(transitionID);
}
void sub_811AAD8(u8 transitionID)
{
LaunchBattleTransitionTask(transitionID);
}
#define tState data[0]
#define tTransitionID data[1]
#define tTransitionDone data[15]
bool8 IsBattleTransitionDone(void)
{
u8 taskID = FindTaskIdByFunc(Task_BattleTransitionMain);
if (gTasks[taskID].tTransitionDone)
{
DestroyTask(taskID);
return 1;
}
else
return 0;
}
static void LaunchBattleTransitionTask(u8 transitionID)
{
u8 taskID = CreateTask(Task_BattleTransitionMain, 2);
gTasks[taskID].tTransitionID = transitionID;
}
static void Task_BattleTransitionMain(u8 taskID)
{
while (sMainTransitionPhases[gTasks[taskID].tState](&gTasks[taskID]));
}
bool8 Transition_Phase1(struct Task* task)
{
sub_807DE10();
CpuSet(gPlttBufferFaded, gPlttBufferUnfaded, 0x4000100);
if (sPhase1_Tasks[task->tTransitionID] != NULL)
{
CreateTask(sPhase1_Tasks[task->tTransitionID], 4);
task->tState++;
return 0;
}
else
{
task->tState = 2;
return 1;
}
}
bool8 Transition_WaitForPhase1(struct Task* task)
{
if (FindTaskIdByFunc(sPhase1_Tasks[task->tTransitionID]) == 0xFF)
{
task->tState++;
return 1;
}
else
return 0;
}
bool8 Transition_Phase2(struct Task* task)
{
CreateTask(sPhase2_Tasks[task->tTransitionID], 0);
task->tState++;
return 0;
}
bool8 Transition_WaitForPhase2(struct Task* task)
{
task->tTransitionDone = 0;
if (FindTaskIdByFunc(sPhase2_Tasks[task->tTransitionID]) == 0xFF)
task->tTransitionDone = 1;
return 0;
}
void Phase1Task_TransitionAll(u8 taskID)
{
if (gTasks[taskID].tState == 0)
{
gTasks[taskID].tState++;
sub_811D4C8(0, 0, 3, 2, 2);
}
else if (sub_811D52C())
DestroyTask(taskID);
}
void Phase2Task_Transition0(u8 taskID)
{
while (sPhase2_Transition0_Funcs[gTasks[taskID].tState](&gTasks[taskID]));
}
bool8 Phase2_Transition0_Func1(struct Task* task)
{
REG_MOSAIC = 0;
REG_BG1CNT |= 0x40;
REG_BG2CNT |= 0x40;
REG_BG3CNT |= 0x40;
task->tState++;
return 1;
}
bool8 Phase2_Transition0_Func2(struct Task* task)
{
if (task->data[1] != 0)
task->data[1]--;
else
{
task->data[1] = 4;
if (++task->data[2] == 10)
BeginNormalPaletteFade(-1, -1, 0, 0x10, 0);
REG_MOSAIC = (task->data[2] & 15) * 17;
if (task->data[2] > 14)
task->tState++;
}
return 0;
}
bool8 Phase2_Transition0_Func3(struct Task* task)
{
if (!gPaletteFade.active)
{
u8 taskID = FindTaskIdByFunc(Phase2Task_Transition0);
DestroyTask(taskID);
}
return 0;
}
void Phase2Task_Transition1(u8 taskID)
{
while (sPhase2_Transition1_Funcs[gTasks[taskID].tState](&gTasks[taskID]));
}
bool8 Phase2_Transition1_Func1(struct Task* task)
{
u16 savedIME;
sub_811D658();
dp12_8087EA4();
BeginNormalPaletteFade(-1, 4, 0, 0x10, 0);
sub_811D6E8(gUnknown_03005560, TRANSITION_STRUCT.field_14, 0, 2, 0, 160);
SetVBlankCallback(VBlankCB_Phase2_Transition1);
SetHBlankCallback(HBlankCB_Phase2_Transition1);
savedIME = REG_IME;
REG_IME = 0;
REG_IE |= 3;
REG_IME = savedIME;
REG_DISPSTAT |= 0x18;
task->tState++;
return 0;
}
bool8 Phase2_Transition1_Func2(struct Task* task)
{
TRANSITION_STRUCT.field_0 = 0;
task->data[1] += 4;
task->data[2] += 8;
sub_811D6E8(gUnknown_03004DE0[0], TRANSITION_STRUCT.field_14, task->data[1], 2, task->data[2], 160);
if (!gPaletteFade.active)
{
u8 taskID = FindTaskIdByFunc(Phase2Task_Transition1);
DestroyTask(taskID);
}
TRANSITION_STRUCT.field_0++;
return 0;
}
static void VBlankCB_Phase2_Transition1(void)
{
VBlankCB_BattleTransition();
if (TRANSITION_STRUCT.field_0)
DmaCopy16(3, gUnknown_03004DE0[0], gUnknown_03004DE0[1], 320);
}
static void HBlankCB_Phase2_Transition1(void)
{
u16 var = gUnknown_03004DE0[1][REG_VCOUNT];
REG_BG1HOFS = var;
REG_BG2HOFS = var;
REG_BG3HOFS = var;
}
void Phase2Task_Transition2(u8 taskID)
{
while (sPhase2_Transition2_Funcs[gTasks[taskID].tState](&gTasks[taskID]));
}
bool8 Phase2_Transition2_Func1(struct Task* task)
{
u16 savedIME;
sub_811D658();
dp12_8087EA4();
BeginNormalPaletteFade(-1, 4, 0, 0x10, 0);
memset(gUnknown_03005560, TRANSITION_STRUCT.field_16, 0x140);
SetVBlankCallback(VBlankCB_Phase2_Transition2);
SetHBlankCallback(HBlankCB_Phase2_Transition2);
savedIME = REG_IME;
REG_IME = 0;
REG_IE |= 3;
REG_IME = savedIME;
REG_DISPSTAT |= 0x18;
task->tState++;
return 0;
}
bool8 Phase2_Transition2_Func2(struct Task* task)
{
u8 i;
u16 r3, r4;
TRANSITION_STRUCT.field_0 = 0;
r4 = task->data[1];
r3 = task->data[2] >> 8;
task->data[1] += 4224;
task->data[2] += 384;
for (i = 0; i < 160; i++, r4 += 4224)
{
u16 var = r4 / 256;
gUnknown_03004DE0[0][i] = Sin(var, r3) + TRANSITION_STRUCT.field_16;
}
if (!gPaletteFade.active)
DestroyTask(FindTaskIdByFunc(Phase2Task_Transition2));
TRANSITION_STRUCT.field_0++;
return 0;
}