summaryrefslogtreecommitdiff
path: root/src/naming_screen.c
diff options
context:
space:
mode:
authorYamaArashi <YamaArashi@users.noreply.github.com>2017-01-22 21:43:45 -0800
committerGitHub <noreply@github.com>2017-01-22 21:43:45 -0800
commita14cd89b9ca175af2fba4faadd8989e24d1275ce (patch)
tree8317f8eb02e8e7a8398944f61041c1a20508bc06 /src/naming_screen.c
parent22e4e3f3781cf69813ff258f1cd575a9ca46ae18 (diff)
parentb1925402a0c7ffa4ca9470ef2ad9afc9a1baaf06 (diff)
Merge pull request #214 from camthesaxman/naming_screen
start decompiling naming_screen
Diffstat (limited to 'src/naming_screen.c')
-rw-r--r--src/naming_screen.c559
1 files changed, 559 insertions, 0 deletions
diff --git a/src/naming_screen.c b/src/naming_screen.c
new file mode 100644
index 000000000..91860b604
--- /dev/null
+++ b/src/naming_screen.c
@@ -0,0 +1,559 @@
+#include "global.h"
+#include "asm.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "songs.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+
+struct UnknownStruct2
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+ u8 unk5;
+ u8 unk6;
+ u8 unk7;
+ const u8 *title;
+};
+
+struct UnknownStruct1
+{
+ u8 unk0; //state
+ u8 unk1;
+ u16 unk2;
+ u16 unk4;
+ u16 unk6;
+ u16 unk8;
+ u16 unkA;
+ u8 unkC;
+ u8 unkD;
+ u8 unkE;
+ u8 fillerF[2];
+ u8 unk11[0x10];
+ u8 filler21[0x13];
+ /*0x34*/ const struct UnknownStruct2 *unk34;
+ /*0x38*/ u8 *nameBuffer;
+ u16 unk3C; //savedKeyRepeatStartDelay
+ u16 unk3E;
+ u16 unk40;
+ u32 unk44;
+ /*0x48*/ MainCallback returnCallback;
+};
+
+extern u16 gKeyRepeatStartDelay;
+
+extern u8 unk_2000000[];
+
+#define EWRAM_000000 (*(struct UnknownStruct1 *)(unk_2000000))
+
+extern const struct UnknownStruct2 *const gUnknown_083CE398[];
+extern u8 (*const gUnknown_083CE218[])(struct Task *);
+extern u8 (*const gUnknown_083CE240[])(u8);
+
+void C2_NamingScreen(void);
+void sub_80B5AA0(void);
+//void AddNamingScreenTask();
+void AddNamingScreenTask(u8, u8 *, u16, u16, u32, MainCallback);
+void NamingScreen_TurnOffScreen(void);
+void NamingScreen_Init(void);
+void NamingScreen_ClearVram(void);
+void NamingScreen_ClearOam(void);
+void NamingScreen_SetUpVideoRegs(void);
+void sub_80B5DC8(void);
+void NamingScreen_ResetObjects(void);
+void sub_80B5DFC(void);
+void sub_80B5E20(void);
+void sub_80B5E3C(void);
+void sub_80B5C04(void);
+void NamingScreenDummyTask(u8);
+void sub_80B7558(void);
+void sub_80B753C(void);
+void sub_80B7680(void);
+void sub_80B75C4(void);
+void sub_80B7794(void);
+void sub_80B78A8(void);
+void sub_80B7960(void);
+void sub_80B6774(void);
+void sub_80B6A80(void);
+void sub_80B6CA8(void);
+void sub_80B6D04(void);
+void sub_80B6E44(void);
+void sub_80B61D8(void);
+void sub_80B6438(void);
+void sub_80B5E50(void);
+void sub_80B5E70(u8);
+void sub_80B6210(u8);
+void sub_80B68D8();
+u8 sub_80B60B8(void);
+u8 sub_80B6938(void);
+void sub_80B6878(void);
+void sub_80B6B14(void);
+void sub_80B65F0(void);
+void sub_80B6888();
+void sub_80B6460();
+u8 sub_80B6610(void);
+void sub_80B7614(void);
+void sub_80B6858();
+void sub_80B680C();
+void sub_80B77F8(void);
+void sub_80B74B0(void);
+void sub_80B74FC(void);
+u8 sub_80B6958(void);
+u8 sub_80B61C8(void);
+void sub_80B6FBC(void);
+void sub_80B7090(void);
+u8 sub_80B61EC(void);
+u8 sub_80B7004(void);
+void sub_80B6914(void);
+void sub_80B623C(u8);
+
+void DoNamingScreen(u8 a, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback)
+{
+ AddNamingScreenTask(a, nameBuffer, c, d, e, returnCallback);
+ SetMainCallback2(C2_NamingScreen);
+}
+
+void C2_NamingScreen(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ NamingScreen_TurnOffScreen();
+ NamingScreen_Init();
+ gMain.state++;
+ break;
+ case 1:
+ NamingScreen_ClearVram();
+ gMain.state++;
+ break;
+ case 2:
+ NamingScreen_ClearOam();
+ gMain.state++;
+ break;
+ case 3:
+ NamingScreen_SetUpVideoRegs();
+ gMain.state++;
+ break;
+ case 4:
+ sub_80B5DC8();
+ gMain.state++;
+ break;
+ case 5:
+ NamingScreen_ResetObjects();
+ gMain.state++;
+ break;
+ case 6:
+ sub_80B5DFC();
+ gMain.state++;
+ break;
+ case 7:
+ sub_80B5E20();
+ sub_80B5E3C();
+ sub_80B5C04();
+ SetMainCallback2(sub_80B5AA0);
+ break;
+ }
+}
+
+void sub_80B5AA0(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void sub_80B5AB8(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ REG_BG1VOFS = EWRAM_000000.unk4;
+ REG_BG2VOFS = EWRAM_000000.unk6;
+ REG_BG1CNT &= 0xFFFC;
+ REG_BG1CNT |= EWRAM_000000.unk8;
+ REG_BG2CNT &= 0xFFFC;
+ REG_BG2CNT |= EWRAM_000000.unkA;
+}
+
+void AddNamingScreenTask(u8 a, u8 *nameBuffer, u16 c, u16 d, u32 e, MainCallback returnCallback)
+{
+ struct Task *task;
+
+ task = &gTasks[CreateTask(NamingScreenDummyTask, 0xFF)];
+ task->data[0] = a;
+ task->data[1] = c;
+ task->data[2] = d;
+ task->data[3] = e >> 16;
+ task->data[4] = e;
+ StoreWordInTwoHalfwords(&task->data[5], (u32)nameBuffer);
+ StoreWordInTwoHalfwords(&task->data[7], (u32)returnCallback);
+}
+
+void GetNamingScreenParameters(void)
+{
+ u8 taskId;
+ struct Task *task;
+
+ taskId = FindTaskIdByFunc(NamingScreenDummyTask);
+ task = &gTasks[taskId];
+ EWRAM_000000.unk1 = task->data[0];
+ EWRAM_000000.unk3E = task->data[1];
+ EWRAM_000000.unk40 = task->data[2];
+ EWRAM_000000.unk44 = (task->data[3] << 16) | (u16)task->data[4];
+ LoadWordFromTwoHalfwords(&task->data[5], (u32 *)&EWRAM_000000.nameBuffer);
+ LoadWordFromTwoHalfwords(&task->data[7], (u32 *)&EWRAM_000000.returnCallback);
+ DestroyTask(taskId);
+}
+
+void NamingScreenDummyTask(u8 taskId)
+{
+}
+
+void NamingScreen_TurnOffScreen(void)
+{
+ SetVBlankCallback(NULL);
+ SetHBlankCallback(NULL);
+ REG_DISPCNT = 0;
+}
+
+void sub_80B5C04(void)
+{
+ u16 savedIme;
+
+ SetVBlankCallback(sub_80B5AB8);
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+}
+
+void NamingScreen_ClearVram(void)
+{
+ u8 *addr = (void *)VRAM;
+ u32 size = 0x10000;
+
+ while (1)
+ {
+ DmaFill16(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill16(3, 0, addr, size);
+ break;
+ }
+ }
+}
+
+void NamingScreen_ClearOam(void)
+{
+ DmaClear16(3, (void *)OAM, 0x400);
+}
+
+void NamingScreen_SetUpVideoRegs(void)
+{
+ REG_BG0CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG3CNT = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+ REG_BG0CNT = 0x1F00;
+ REG_BG1CNT = 0x1C01;
+ REG_BG2CNT = 0x1D0A;
+ REG_BG3CNT = 0x1E03;
+ REG_BLDCNT = 0x640;
+ REG_BLDALPHA = 0x80C;
+}
+
+void NamingScreen_Init(void)
+{
+ GetNamingScreenParameters();
+ EWRAM_000000.unk0 = 0;
+ EWRAM_000000.unk4 = 0;
+ EWRAM_000000.unk6 = 0;
+ EWRAM_000000.unk8 = 1;
+ EWRAM_000000.unkA = 2;
+ EWRAM_000000.unkC = 0;
+ EWRAM_000000.unkD = 1;
+ EWRAM_000000.unk34 = gUnknown_083CE398[EWRAM_000000.unk1];
+ EWRAM_000000.unkE = EWRAM_000000.unk34->unk4;
+ EWRAM_000000.unk2 = 14 - EWRAM_000000.unk34->unk1 / 2;
+ EWRAM_000000.unk3C = gKeyRepeatStartDelay;
+ memset(EWRAM_000000.unk11, 0xFF, 0x10);
+ if (EWRAM_000000.unk34->unk0 != 0)
+ StringCopy(EWRAM_000000.unk11, EWRAM_000000.nameBuffer);
+ gKeyRepeatStartDelay = 16;
+}
+
+void sub_80B5DC8(void)
+{
+ SetUpWindowConfig(&gWindowConfig_81E6E88);
+ InitMenuWindow(&gWindowConfig_81E6E88);
+}
+
+void NamingScreen_ResetObjects(void)
+{
+ ResetPaletteFade();
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+}
+
+void sub_80B5DFC(void)
+{
+ sub_80B7558();
+ sub_80B753C();
+ sub_80B7680();
+ sub_80B75C4();
+ sub_80B7794();
+ sub_80B78A8();
+ sub_80B7960();
+}
+
+void sub_80B5E20(void)
+{
+ sub_80B6774();
+ sub_80B6A80();
+ sub_80B6CA8();
+ sub_80B6D04();
+ sub_80B6E44();
+}
+
+void sub_80B5E3C(void)
+{
+ sub_80B61D8();
+ sub_80B6438();
+ sub_80B5E50();
+}
+
+void sub_80B5E50(void)
+{
+ u8 taskId;
+
+ taskId = CreateTask(sub_80B5E70, 2);
+ sub_80B5E70(taskId);
+}
+
+void sub_80B5E70(u8 taskId)
+{
+ while (gUnknown_083CE218[EWRAM_000000.unk0](&gTasks[taskId]) != 0)
+ ;
+}
+
+u8 sub_80B5EA8(struct Task *task)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ EWRAM_000000.unk0++;
+ return 0;
+}
+
+u8 sub_80B5ED0(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_80B6210(1);
+ sub_80B68D8(1);
+ EWRAM_000000.unk0++;
+ }
+ return 0;
+}
+
+u8 sub_80B5F00(struct Task *task)
+{
+ return sub_80B60B8();
+}
+
+u8 sub_80B5F10(struct Task *task)
+{
+ if (sub_80B6938() != 0)
+ {
+ sub_80B6210(1);
+ sub_80B6878();
+ EWRAM_000000.unk0 = 2;
+ }
+ return 0;
+}
+
+u8 sub_80B5F38(struct Task *task)
+{
+ sub_80B6210(0);
+ sub_80B6B14();
+ sub_80B65F0();
+ sub_80B6888(1);
+ sub_80B6460(0, 0, 1);
+ PlaySE(SE_WIN_OPEN);
+ EWRAM_000000.unk0 = 5;
+ return 0;
+}
+
+u8 sub_80B5F70(struct Task *task)
+{
+ s16 var1;
+ s16 var2;
+
+ if (sub_80B6610() != 0)
+ {
+ EWRAM_000000.unk0 = 2;
+ EWRAM_000000.unkE++;
+ EWRAM_000000.unkE %= 3;
+ sub_80B7614();
+ sub_80B77F8();
+ sub_80B6210(1);
+ sub_80B6858(&var1, &var2);
+ if (EWRAM_000000.unkE == 2 && (u16)(var1 - 6) <= 1)
+ var1 = 5;
+ sub_80B680C(var1, var2);
+ sub_80B6888(0);
+ }
+ return 0;
+}
+
+u8 pokemon_store(struct Task *task)
+{
+ sub_80B74B0();
+ sub_80B6210(0);
+ sub_80B68D8(0);
+ sub_80B6460(3, 0, 1);
+ gKeyRepeatStartDelay = EWRAM_000000.unk3C;
+ if (EWRAM_000000.unk1 == 2 && CalculatePlayerPartyCount() > 5)
+ {
+ sub_80B74FC();
+ EWRAM_000000.unk0 = 7;
+ return 0;
+ }
+ else
+ {
+ EWRAM_000000.unk0 = 8;
+ return 1;
+ }
+}
+
+u8 sub_80B604C(struct Task *task)
+{
+ if (MenuUpdateWindowText())
+ EWRAM_000000.unk0++;
+ return 0;
+}
+
+u8 sub_80B606C(struct Task *task)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ EWRAM_000000.unk0++;
+ return 0;
+}
+
+u8 sub_80B6094(struct Task *task)
+{
+ if (!gPaletteFade.active)
+ SetMainCallback2(EWRAM_000000.returnCallback);
+ return 0;
+}
+
+u8 sub_80B60B8(void)
+{
+ u8 var = sub_80B61EC();
+ u8 r0 = sub_80B6958();
+
+ if (var == 8)
+ return sub_80B61C8();
+ else if (var == 6)
+ {
+ sub_80B6FBC();
+ return 0;
+ }
+ else if (var == 7)
+ {
+ sub_80B7090();
+ return 0;
+ }
+ return gUnknown_083CE240[r0](var);
+}
+
+u8 sub_80B6108(u8 a)
+{
+ sub_80B6460(3, 0, 0);
+ if (a == 5)
+ {
+ u8 var = sub_80B7004();
+
+ sub_80B6914();
+ if (var != 0)
+ {
+ sub_80B6210(0);
+ EWRAM_000000.unk0 = 3;
+ }
+ }
+ return 0;
+}
+
+u8 sub_80B6148(u8 a)
+{
+ sub_80B6460(0, 1, 0);
+ if (a == 5)
+ return sub_80B61C8();
+ else
+ return 0;
+}
+
+u8 sub_80B6170(u8 a)
+{
+ sub_80B6460(1, 1, 0);
+ if (a == 5)
+ sub_80B6FBC();
+ return 0;
+}
+
+u8 sub_80B6194(u8 a)
+{
+ sub_80B6460(2, 1, 0);
+ if (a == 5)
+ {
+ PlaySE(SE_SELECT);
+ EWRAM_000000.unk0 = 6;
+ return 1;
+ }
+ else
+ return 0;
+}
+
+u8 sub_80B61C8(void)
+{
+ EWRAM_000000.unk0 = 4;
+ return 1;
+}
+
+void sub_80B61D8(void)
+{
+ CreateTask(sub_80B623C, 1);
+}
+
+u8 sub_80B61EC(void)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80B623C);
+
+ return gTasks[taskId].data[1];
+}
+
+void sub_80B6210(u8 a)
+{
+ u8 taskId = FindTaskIdByFunc(sub_80B623C);
+
+ gTasks[taskId].data[0] = a;
+}