summaryrefslogtreecommitdiff
path: root/src/debug
diff options
context:
space:
mode:
Diffstat (limited to 'src/debug')
-rw-r--r--src/debug/matsuda_debug_menu.c1113
-rw-r--r--src/debug/mori_debug_menu.c168
-rw-r--r--src/debug/sound_check_menu.c1300
-rw-r--r--src/debug/unknown_debug_menu.c52
4 files changed, 2633 insertions, 0 deletions
diff --git a/src/debug/matsuda_debug_menu.c b/src/debug/matsuda_debug_menu.c
new file mode 100644
index 000000000..c7d81f502
--- /dev/null
+++ b/src/debug/matsuda_debug_menu.c
@@ -0,0 +1,1113 @@
+#include "global.h"
+#include "matsuda_debug_menu.h"
+#include "contest.h"
+#include "contest_link_80C2020.h"
+#include "contest_link_80C857C.h"
+#include "data2.h"
+#include "link.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "overworld.h"
+#include "sprite.h"
+#include "start_menu.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+#include "unknown_task.h"
+
+extern u8 gUnknown_0203856C;
+extern u8 gUnknown_0203857D[][64];
+extern u16 gUnknown_02038670[];
+extern u16 gUnknown_02038678[];
+extern u16 gUnknown_02038680[];
+extern u8 gUnknown_02038690[];
+extern u8 gUnknown_02038694;
+extern u8 gIsLinkContest;
+extern u8 gUnknown_0203869B;
+extern u8 gContestPlayerMonIndex;
+extern u16 gScriptContestCategory;
+extern u16 gScriptContestRank;
+
+extern u16 gUnknown_030042A4;
+extern u16 gUnknown_030042A0;
+extern u16 gUnknown_030042C0;
+extern u16 gUnknown_030041B4;
+extern u16 gUnknown_03004288;
+extern u16 gUnknown_03004280;
+extern u16 gUnknown_030041B0;
+extern u16 gUnknown_030041B8;
+extern struct Window gUnknown_03004210;
+extern u8 (*gCallback_03004AE8)(void);
+
+extern u8 gUnknown_083C926E[][2];
+extern u8 gUnknown_083C9282[];
+extern const u8 gUnknown_083C928E[][2];
+extern u8 gUnknown_083C9296[];
+extern u8 gUnknown_083C92A8[];
+extern u8 unk_2000000[];
+extern u8 gMatsudaDebugMenu_GoBackText[];
+extern u8 gMatsudaDebugMenu_BattlePointsText[];
+extern u8 gMatsudaDebugMenu_StartText[];
+
+extern struct SpritePalette gUnknown_083C92BC;
+extern struct SpriteSheet gUnknown_083C92B4;
+extern struct SpriteTemplate gSpriteTemplate_83C92CC;
+extern void (*gUnknown_083C92E4[][2])(struct Sprite *, s8);
+extern u32 gUnknown_083C9400[2];
+
+
+extern u8 gMatsudaDebugMenu_UnknownByteArray[];
+extern u8* gMatsudaDebugMenuTextList1[];
+extern u8* gMatsudaDebugMenuTextList2[];
+extern u8* gMatsudaDebugMenuTextList3[];
+extern u8 gMatsudaDebugMenuContestTopLeft[][2];
+
+extern bool8 gReceivedRemoteLinkPlayers;
+
+extern struct MenuAction gMatsudaDebugMenuActions[];
+
+static bool8 sub_80A9B78(void);
+static void sub_80A9BE4(u8 taskId);
+static void sub_80A9C98(u8);
+static void sub_80A9CC0(u8);
+static void sub_80A9CDC(u8);
+static void sub_80A9D58(u8);
+static void sub_80A9DBC(u8);
+static void sub_80A9DD8(u8);
+static void sub_80A9E04(u8 taskId);
+static void sub_80A9E3C(u8 taskId);
+static void sub_80A9E80(u8);
+static void sub_80A9ED8(u8);
+static void sub_80A9F10(u8);
+static void sub_80AA10C(void);
+static void sub_80AA5BC(u8);
+static void sub_80AA614(u8, u8);
+static void sub_80AAD08(struct Sprite *, s8);
+
+u8 unref_sub_80A9B28(void)
+{
+ MenuZeroFillScreen();
+ MenuDrawTextWindow(0, 0, 17, 18);
+ PrintMenuItems(1, 1, 7, gMatsudaDebugMenuActions);
+ InitMenu(0, 1, 1, 7, 0, 16);
+ gCallback_03004AE8 = sub_80A9B78;
+ return 0;
+}
+
+static bool8 sub_80A9B78(void)
+{
+ s8 choice = ProcessMenuInput();
+
+ switch (choice)
+ {
+ case -2:
+ return FALSE;
+ default:
+ gCallback_03004AE8 = gMatsudaDebugMenuActions[choice].func;
+ return FALSE;
+ case -1:
+ CloseMenu();
+ return TRUE;
+ }
+}
+
+s8 MatsudaDebugMenu_ContestResults(void)
+{
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ CreateTask(sub_80A9BE4, 0xFF);
+ return 1;
+}
+
+static void sub_80A9BE4(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+
+ if (!(gIsLinkContest & 1))
+ sub_80AF668();
+
+ sub_80C2358();
+ }
+}
+
+s8 MatsudaDebugMenu_Contest(void)
+{
+ gIsLinkContest = 0;
+ sub_80AA10C();
+ return 0;
+}
+
+s8 MatsudaDebugMenu_ContestComm(void)
+{
+ sub_80AA10C();
+ return 0;
+}
+
+s8 MatsudaDebugMenu_CommTest(void)
+{
+ u8 newTaskId;
+ u8 newTaskId2;
+
+ newTaskId = CreateTask(sub_80A9E3C, 0);
+ SetTaskFuncWithFollowupFunc(newTaskId, sub_80A9E3C, sub_80A9C98);
+ newTaskId2 = CreateTask(sub_80A9E04, 1);
+ gTasks[newTaskId2].data[10] = newTaskId;
+ gTasks[newTaskId].data[10] = newTaskId2;
+ return 1;
+}
+
+static void sub_80A9C98(u8 taskId)
+{
+ sub_80AE098(0);
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, sub_80A9CC0);
+}
+
+static void sub_80A9CC0(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C88AC, sub_80A9CDC);
+}
+
+static void sub_80A9CDC(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8E1C, sub_80A9D58);
+}
+
+static void sub_80A9CF8(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == FALSE)
+ {
+ DestroyTask(gTasks[taskId].data[10]);
+ DestroyTask(taskId);
+ CloseMenu();
+ }
+}
+
+static void sub_80A9D30(u8 taskId)
+{
+ sub_800832C();
+ gTasks[taskId].func = sub_80A9CF8;
+}
+
+static void sub_80A9D58(u8 taskId)
+{
+ int i;
+ u8 dest[4];
+
+ for (i = 0; i < 4; i++)
+ dest[i] = gTasks[taskId].data[5 + i];
+
+ gUnknown_0203869B = sub_80C4B34(dest);
+ sub_80AE82C((u8)gScriptContestCategory);
+ sub_80B0F28(0);
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8EBC, sub_80A9DBC);
+}
+
+static void sub_80A9DBC(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8F34, sub_80A9DD8);
+}
+
+static void sub_80A9DD8(u8 taskId)
+{
+ DestroyTask(gTasks[taskId].data[10]);
+ DestroyTask(taskId);
+ CloseMenu();
+}
+
+static void sub_80A9E04(u8 taskId)
+{
+ if (gMain.newKeys == 2)
+ gTasks[(u8)gTasks[taskId].data[10]].func = sub_80A9D30;
+}
+
+static void sub_80A9E3C(u8 taskId)
+{
+ u8 i;
+
+ OpenLink();
+
+ for (i = 0; i < 4; i++)
+ gBlockRecvBuffer[i][0] = 255;
+
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80A9E80;
+}
+
+static void sub_80A9E80(u8 taskId)
+{
+ TaskFunc func;
+
+ if (gTasks[taskId].data[0] < 10)
+ gTasks[taskId].data[0]++;
+ else
+ {
+ if (GetLinkPlayerCount_2() > 3)
+ {
+ gTasks[taskId].data[0] = 0;
+
+ if (IsLinkMaster())
+ {
+ func = sub_80A9ED8;
+ gTasks[taskId].func = (TaskFunc)func;
+ }
+ else
+ {
+ func = sub_80A9F10;
+ gTasks[taskId].func = (TaskFunc)func;
+ }
+ }
+ }
+}
+
+static void sub_80A9ED8(u8 taskId)
+{
+ gTasks[taskId].data[0] = gTasks[taskId].data[0] + 1;
+ if ((gTasks[taskId].data[0]) == 101)
+ {
+ sub_8007F4C();
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80A9F10;
+ }
+}
+
+static void sub_80A9F10(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers)
+ {
+ gContestPlayerMonIndex = GetMultiplayerId();
+ if (GetLinkPlayerCount() == 4)
+ {
+ gIsLinkContest = 1;
+ SwitchTaskToFollowupFunc(taskId);
+ }
+ }
+}
+
+static void sub_80A9F50(void)
+{
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP;
+ REG_DISPCNT |= DISPCNT_OBJ_ON | DISPCNT_BG0_ON;
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6C3C);
+ REG_MOSAIC = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ gUnknown_030042A4 = 0;
+ gUnknown_030042A0 = 0;
+ gUnknown_030042C0 = 0;
+ gUnknown_030041B4 = 0;
+ gUnknown_03004288 = 0;
+ gUnknown_03004280 = 0;
+ gUnknown_030041B0 = 0;
+ gUnknown_030041B8 = 0;
+}
+
+static void sub_80A9FE4(void)
+{
+ u8 *addr;
+ u32 i;
+ u8 ptr[5];
+
+ memcpy(ptr, gMatsudaDebugMenu_UnknownByteArray, 5);
+
+ addr = (void *)VRAM;
+ i = VRAM_SIZE;
+
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ i -= 0x1000;
+ if (i <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, i);
+ break;
+ }
+ }
+ sub_80034D4((void *)VRAM, ptr);
+ LoadFontDefaultPalette(&gWindowConfig_81E6C3C);
+}
+
+static void sub_80AA064(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+ if (gMain.newKeys == 4)
+ SetMainCallback2(sub_805469C);
+}
+
+static void sub_80AA090(void)
+{
+ REG_BG0HOFS = gUnknown_030042A4;
+ REG_BG0VOFS = gUnknown_030042A0;
+ REG_BG1HOFS = gUnknown_030042C0;
+ REG_BG1VOFS = gUnknown_030041B4;
+ REG_BG2HOFS = gUnknown_03004288;
+ REG_BG2VOFS = gUnknown_03004280;
+ REG_BG3HOFS = gUnknown_030041B0;
+ REG_BG3VOFS = gUnknown_030041B8;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ sub_8089668();
+}
+
+static void sub_80AA10C(void)
+{
+ u8 i;
+ u8 zero;
+ u8 spriteId;
+
+ gPaletteFade.bufferTransferDisabled = 1;
+ SetVBlankCallback(0);
+ sub_80A9F50();
+ dp12_8087EA4();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ sub_80A9FE4();
+ SetVBlankCallback(sub_80AA090);
+ SetMainCallback2(sub_80AA064);
+ gPaletteFade.bufferTransferDisabled = 0;
+ gUnknown_02038694 = 0;
+
+ if (!(gContestMons[0].nickname[0]))
+ sub_80AE398(0, 0);
+
+ sub_80AE098(gUnknown_02038694);
+
+ for (i = 0; i < 6; i++)
+ {
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList1[i],
+ (0xA * i + 0x2A), gMatsudaDebugMenuContestTopLeft[i][0],
+ gMatsudaDebugMenuContestTopLeft[i][1]);
+ }
+
+ gScriptContestCategory = gScriptContestRank = 0;
+ zero = 0; // it's possible this was some assignment that matsuda used to quickly edit and test things without changing whats passed to the later functions.
+ sub_80AA5BC(zero);
+ sub_80AA5E8(gScriptContestRank);
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenu_GoBackText, 0xD6, 0x12, 0x12);
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenu_BattlePointsText, 0xDC, zero, 0xC);
+ LoadSpriteSheet(&gUnknown_083C92B4);
+ LoadSpritePalette(&gUnknown_083C92BC);
+ sub_80AA280(3);
+ sub_80AA658(3);
+ sub_80AA614(3, zero);
+ spriteId = CreateSprite(&gSpriteTemplate_83C92CC, gUnknown_083C9296[3], gUnknown_083C92A8[1], 5);
+ gSprites[spriteId].data0 = 1;
+ gSprites[spriteId].data1 = 1;
+ gSprites[spriteId].data2 = 3;
+ gSprites[spriteId].data3 = zero; // only this assignment of zero is necessary. other replacements of 0 with zero do not change the asm, compiler will treat it the same.
+}
+
+void sub_80AA280(u8 var) // no?
+{
+ u8 i;
+
+ FillWindowRect_DefaultPalette(&gMenuWindow, 0, 0, 0, 0x1E, 3);
+ StringCopy(unk_2000000, gMatsudaDebugMenu_StartText);
+ StringAppend(unk_2000000, &gUnknown_0203857D[var][0]);
+
+ for (i = 0; i < 4; i++)
+ {
+ if (var == i)
+ {
+ sub_8003460(&gMenuWindow, unk_2000000, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]);
+ }
+ else
+ {
+ u8 *ptr = gUnknown_0203857D[i];
+ sub_8003460(&gMenuWindow, ptr, (10 * i + 2), gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]);
+ }
+ }
+}
+
+static void sub_80AA340(u8 var)
+{
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cool, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]);
+}
+
+static void sub_80AA388(u8 var)
+{
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].cute, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]);
+}
+
+static void sub_80AA3D0(u8 var)
+{
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].beauty, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]);
+}
+
+static void sub_80AA418(u8 var)
+{
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].smart, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]);
+}
+
+static void sub_80AA460(u8 var)
+{
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].tough, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]);
+}
+
+static void sub_80AA4A8(u8 var)
+{
+ ConvertIntToDecimalStringN(unk_2000000, gContestMons[var].sheen, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0x84, gUnknown_083C9282[10], gUnknown_083C9282[11]);
+}
+
+static void sub_80AA4F0(u8 var1, u8 var2)
+{
+ FillWindowRect_DefaultPalette(&gMenuWindow, 0, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1], gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1] + 1);
+ sub_8003460(&gMenuWindow, gMoveNames[gContestMons[var1].moves[var2]], 0x8A + var2 * 14, gUnknown_083C928E[var2][0], gUnknown_083C928E[var2][1]);
+ ConvertIntToDecimalStringN(gStringVar1, gContestMons[var1].moves[var2], STR_CONV_MODE_LEADING_ZEROS, 3);
+ sub_8003460(&gMenuWindow, gStringVar1, 0xFA + var2 * 6, gUnknown_083C928E[var2][0] + 7, gUnknown_083C928E[var2][1]);
+}
+
+static void sub_80AA5BC(u8 var)
+{
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList2[var], 0xC2, 3, 0x12);
+}
+
+void sub_80AA5E8(u8 var)
+{
+ sub_8003460(&gMenuWindow, gMatsudaDebugMenuTextList3[var], 0xE8, 3, 4);
+}
+
+static void sub_80AA614(u8 var1, u8 var2)
+{
+ u16 var = sub_80AE770(var1, var2);
+
+ ConvertIntToDecimalStringN(unk_2000000, var, STR_CONV_MODE_RIGHT_ALIGN, 3);
+ sub_8003460(&gMenuWindow, unk_2000000, 0xE2, 3, 0xC);
+}
+
+void sub_80AA658(u8 var)
+{
+ u8 i;
+
+ sub_80AA340(var);
+ sub_80AA388(var);
+ sub_80AA3D0(var);
+ sub_80AA418(var);
+ sub_80AA460(var);
+ sub_80AA4A8(var);
+
+ for (i = 0; i < 4; i++)
+ sub_80AA4F0(var, i);
+}
+
+void SetDebugMonForContest(void)
+{
+ SetMonData(&gPlayerParty[0], MON_DATA_COOL, &gContestMons[gContestPlayerMonIndex].cool);
+ SetMonData(&gPlayerParty[0], MON_DATA_CUTE, &gContestMons[gContestPlayerMonIndex].cute);
+ SetMonData(&gPlayerParty[0], MON_DATA_BEAUTY, &gContestMons[gContestPlayerMonIndex].beauty);
+ SetMonData(&gPlayerParty[0], MON_DATA_SMART, &gContestMons[gContestPlayerMonIndex].smart);
+ SetMonData(&gPlayerParty[0], MON_DATA_TOUGH, &gContestMons[gContestPlayerMonIndex].tough);
+ SetMonData(&gPlayerParty[0], MON_DATA_SHEEN, &gContestMons[gContestPlayerMonIndex].sheen);
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE1, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[0]);
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[1]);
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[2]);
+ SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, (const u8 *) &gContestMons[gContestPlayerMonIndex].moves[3]);
+}
+
+void sub_80AA754(struct Sprite *sprite)
+{
+ switch (gMain.newAndRepeatedKeys)
+ {
+ case DPAD_RIGHT:
+ case DPAD_LEFT:
+ sprite->data0 ^= 1;
+ break;
+ case DPAD_UP:
+ if (sprite->data1 == 0)
+ sprite->data1 = 8;
+ else
+ sprite->data1--;
+ break;
+ case DPAD_DOWN:
+ if (sprite->data1 == 8)
+ sprite->data1 = 0;
+ else
+ sprite->data1++;
+ break;
+ case A_BUTTON:
+ gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 1);
+ sub_80AA614(sprite->data2, sprite->data3);
+ break;
+ case B_BUTTON:
+ gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -1);
+ sub_80AA614(sprite->data2, sprite->data3);
+ break;
+ case R_BUTTON:
+ gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, 10);
+ sub_80AA614(sprite->data2, sprite->data3);
+ break;
+ case L_BUTTON:
+ gUnknown_083C92E4[sprite->data1][sprite->data0](sprite, -10);
+ sub_80AA614(sprite->data2, sprite->data3);
+ break;
+ case START_BUTTON:
+ sub_80AAD08(sprite, 1);
+ break;
+ }
+ sprite->pos1.x = gUnknown_083C9296[sprite->data0 + sprite->data1 * 2];
+ sprite->pos1.y = gUnknown_083C92A8[sprite->data1];
+}
+
+static void sub_80AA8A0(struct Sprite *sprite, s8 var1, u8 var2)
+{
+ if (var1 == 1)
+ {
+ sprite->data2 = var2;
+ sub_80AA280(var2);
+ sub_80AA658(sprite->data2);
+ }
+}
+
+void sub_80AA8C8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 0);
+}
+
+void sub_80AA8D8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 1);
+}
+
+void sub_80AA8E8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 2);
+}
+
+void sub_80AA8F8(struct Sprite *sprite, s8 var1)
+{
+ sub_80AA8A0(sprite, var1, 3);
+}
+
+static u8 sub_80AA908(u32 a1, u8 a2, s8 a3) // first param is unused.
+{
+ s16 val = a2 + a3;
+
+ if (val > 255)
+ val = 255;
+ else if (val < 0)
+ val = 0;
+
+ return val;
+}
+
+void sub_80AA930(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].cool = sub_80AA908(val, gContestMons[sprite->data2].cool, var2);
+ sub_80AA340(sprite->data2);
+}
+
+void sub_80AA974(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].cute = sub_80AA908(val, gContestMons[sprite->data2].cute, var2);
+ sub_80AA388(sprite->data2);
+}
+
+void sub_80AA9B8(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].beauty = sub_80AA908(val, gContestMons[sprite->data2].beauty, var2);
+ sub_80AA3D0(sprite->data2);
+}
+
+void sub_80AA9FC(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].smart = sub_80AA908(val, gContestMons[sprite->data2].smart, var2);
+ sub_80AA418(sprite->data2);
+}
+
+void sub_80AAA40(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].tough = sub_80AA908(val, gContestMons[sprite->data2].tough, var2);
+ sub_80AA460(sprite->data2);
+}
+
+void sub_80AAA84(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].sheen = sub_80AA908(val, gContestMons[sprite->data2].sheen, var2);
+ sub_80AA4A8(sprite->data2);
+}
+
+// a similar function is at 0x80AA908, however, it apparently returns the wrong type (u8 vs u16).
+static u16 sub_80AAAC8(u32 a1, u16 a2, s8 a3) // first param is unused.
+{
+ s16 val = a2 + a3;
+
+ if (val > 354)
+ val = 1;
+ else if (val < 0)
+ val = 354;
+
+ return val;
+}
+
+void sub_80AAAF0(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[0], var2);
+ sub_80AA4F0(sprite->data2, 0);
+}
+
+void sub_80AAB30(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[1], var2);
+ sub_80AA4F0(sprite->data2, 1);
+}
+
+void sub_80AAB70(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[2], var2);
+ sub_80AA4F0(sprite->data2, 2);
+}
+
+void sub_80AABB0(struct Sprite *sprite, u8 var2)
+{
+ u8 val = sprite->data2;
+
+ gContestMons[sprite->data2].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data2].moves[3], var2);
+ sub_80AA4F0(sprite->data2, 3);
+}
+
+void sub_80AABF0(struct Sprite *sprite, s8 var2)
+{
+ s8 a = (var2 > 0) ? 1 : -1;
+ s8 r4 = sprite->data3 + a;
+
+ if (r4 < 0)
+ r4 = 0;
+ else if (r4 > 4)
+ r4 = 4;
+ sub_80AA5BC(r4);
+ sprite->data3 = r4;
+ gScriptContestCategory = sprite->data3;
+ sub_80AE398(sprite->data3, gScriptContestRank);
+ sub_80AA280(sprite->data2);
+ sub_80AA658(sprite->data2);
+}
+
+void sub_80AAC5C(struct Sprite *sprite, s8 var2)
+{
+ if (var2 > 0)
+ gScriptContestRank++;
+ else if (gScriptContestRank != 0)
+ gScriptContestRank--;
+ if (gScriptContestRank > 3)
+ gScriptContestRank = 3;
+ sub_80AA5E8(gScriptContestRank);
+ sub_80AE398(gScriptContestCategory, gScriptContestRank);
+ sub_80AA280(sprite->data2);
+ sub_80AA658(sprite->data2);
+}
+
+void sub_80AACC4(void)
+{
+ UpdatePaletteFade();
+ if (!gPaletteFade.active)
+ {
+ SetDebugMonForContest();
+ if (!(gIsLinkContest & 1))
+ sub_80AE82C(unk_2000000[0]);
+ SetMainCallback2(sub_80AB47C);
+ }
+}
+
+void sub_80AAD08(struct Sprite *sprite, s8 var2)
+{
+ if (var2 == 1)
+ {
+ unk_2000000[0] = sprite->data3;
+ SetMainCallback2(sub_80AACC4);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+ }
+}
+
+void sub_80AAD44(struct Sprite *sprite, s8 var2)
+{
+ if (var2 == 1)
+ {
+ int i;
+
+ SetDebugMonForContest();
+ for (i = 0; i < 4; i++)
+ gUnknown_02038670[i] = sub_80AE770(i, gScriptContestCategory);
+ SetMainCallback2(sub_805469C);
+ }
+}
+
+//Do this later
+/*
+void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d)
+{
+ u32 r5;
+ u16 r7;
+ u8 r7_2;
+ //u32 sp44;
+ //u32 sp48;
+ u32 sp58;
+
+ gMain.state = 0;
+
+ r5 = d + 1;
+ //Could also be DmaClear32
+ DmaFill32(3, 0, (u8 *)VRAM + 0x18000 - r5 * 256, 0x100);
+
+ r7 = StringLength(string);
+ if (r7 > 8)
+ r7 = 8;
+ sp58 = d * 2;
+
+ //More stuff
+
+ r7_2 = 0x7C - sp58;
+
+}
+*/
+
+__attribute__((naked))
+void sub_80AAD84(u8 *string, u8 b, u8 c, u8 d)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0x64\n\
+ mov r9, r0\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ str r1, [sp, 0x48]\n\
+ lsls r2, 24\n\
+ lsrs r2, 24\n\
+ str r2, [sp, 0x4C]\n\
+ lsls r3, 24\n\
+ lsrs r3, 24\n\
+ mov r10, r3\n\
+ mov r5, r10\n\
+ adds r5, 0x1\n\
+ lsls r1, r5, 8\n\
+ ldr r0, _080AAEC4 @ =0x06018000\n\
+ subs r1, r0, r1\n\
+ movs r0, 0\n\
+ str r0, [sp, 0x44]\n\
+ ldr r4, _080AAEC8 @ =0x040000d4\n\
+ add r0, sp, 0x44\n\
+ str r0, [r4]\n\
+ str r1, [r4, 0x4]\n\
+ ldr r0, _080AAECC @ =0x85000040\n\
+ str r0, [r4, 0x8]\n\
+ ldr r0, [r4, 0x8]\n\
+ mov r0, r9\n\
+ bl StringLength\n\
+ lsls r0, 16\n\
+ lsrs r7, r0, 16\n\
+ cmp r7, 0x8\n\
+ bls _080AADD0\n\
+ movs r7, 0x8\n\
+_080AADD0:\n\
+ movs r6, 0\n\
+ mov r8, r5\n\
+ mov r1, r10\n\
+ lsls r1, 1\n\
+ str r1, [sp, 0x58]\n\
+ ldr r2, [sp, 0x48]\n\
+ adds r2, 0x20\n\
+ str r2, [sp, 0x5C]\n\
+ cmp r6, r7\n\
+ bge _080AAE1E\n\
+ add r5, sp, 0x40\n\
+ add r0, sp, 0x20\n\
+ mov r10, r0\n\
+ ldr r2, _080AAEC4 @ =0x06018000\n\
+_080AADEC:\n\
+ mov r1, r9\n\
+ adds r0, r1, r6\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r5]\n\
+ movs r0, 0xFF\n\
+ strb r0, [r5, 0x1]\n\
+ mov r0, sp\n\
+ adds r1, r5, 0\n\
+ str r2, [sp, 0x60]\n\
+ bl sub_80034D4\n\
+ mov r1, r8\n\
+ lsls r0, r1, 8\n\
+ ldr r2, [sp, 0x60]\n\
+ subs r0, r2, r0\n\
+ mov r1, r10\n\
+ str r1, [r4]\n\
+ str r0, [r4, 0x4]\n\
+ ldr r0, _080AAED0 @ =0x84000008\n\
+ str r0, [r4, 0x8]\n\
+ ldr r0, [r4, 0x8]\n\
+ adds r2, 0x20\n\
+ adds r6, 0x1\n\
+ cmp r6, r7\n\
+ blt _080AADEC\n\
+_080AAE1E:\n\
+ movs r1, 0x7C\n\
+ ldr r2, [sp, 0x58]\n\
+ subs r1, r2\n\
+ lsls r1, 24\n\
+ lsrs r7, r1, 24\n\
+ ldr r0, _080AAED4 @ =gMain\n\
+ mov r9, r0\n\
+ lsls r3, r7, 3\n\
+ add r3, r9\n\
+ ldr r0, _080AAED8 @ =gUnknown_083C9400\n\
+ ldr r1, [r0]\n\
+ ldr r2, [r0, 0x4]\n\
+ str r1, [sp, 0x50]\n\
+ str r2, [sp, 0x54]\n\
+ str r1, [r3, 0x3C]\n\
+ str r2, [r3, 0x40]\n\
+ mov r2, r8\n\
+ lsls r0, r2, 3\n\
+ movs r1, 0x80\n\
+ lsls r1, 3\n\
+ adds r2, r1, 0\n\
+ subs r2, r0\n\
+ adds r6, r3, 0\n\
+ adds r6, 0x40\n\
+ ldr r0, _080AAEDC @ =0x000003ff\n\
+ mov r8, r0\n\
+ mov r1, r8\n\
+ ands r2, r1\n\
+ ldrh r5, [r6]\n\
+ ldr r4, _080AAEE0 @ =0xfffffc00\n\
+ adds r0, r4, 0\n\
+ ands r0, r5\n\
+ orrs r0, r2\n\
+ strh r0, [r6]\n\
+ ldrh r5, [r3, 0x3E]\n\
+ ldr r2, _080AAEE4 @ =0xfffffe00\n\
+ adds r0, r2, 0\n\
+ ands r0, r5\n\
+ ldr r1, [sp, 0x48]\n\
+ orrs r0, r1\n\
+ strh r0, [r3, 0x3E]\n\
+ adds r3, 0x3C\n\
+ add r0, sp, 0x4C\n\
+ ldrb r0, [r0]\n\
+ strb r0, [r3]\n\
+ adds r1, r7, 0x1\n\
+ lsls r1, 3\n\
+ mov r0, r9\n\
+ adds r7, r1, r0\n\
+ ldr r0, [sp, 0x50]\n\
+ ldr r1, [sp, 0x54]\n\
+ str r0, [r7, 0x3C]\n\
+ str r1, [r7, 0x40]\n\
+ ldrh r0, [r6]\n\
+ lsls r0, 22\n\
+ lsrs r0, 22\n\
+ adds r0, 0x4\n\
+ adds r5, r7, 0\n\
+ adds r5, 0x40\n\
+ mov r1, r8\n\
+ ands r0, r1\n\
+ ldrh r3, [r5]\n\
+ ands r4, r3\n\
+ orrs r4, r0\n\
+ strh r4, [r5]\n\
+ ldrh r0, [r7, 0x3E]\n\
+ ands r2, r0\n\
+ ldr r0, [sp, 0x5C]\n\
+ orrs r2, r0\n\
+ strh r2, [r7, 0x3E]\n\
+ adds r1, r7, 0\n\
+ adds r1, 0x3C\n\
+ add r2, sp, 0x4C\n\
+ ldrb r2, [r2]\n\
+ strb r2, [r1]\n\
+ add sp, 0x64\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080AAEC4: .4byte 0x06018000\n\
+_080AAEC8: .4byte 0x040000d4\n\
+_080AAECC: .4byte 0x85000040\n\
+_080AAED0: .4byte 0x84000008\n\
+_080AAED4: .4byte gMain\n\
+_080AAED8: .4byte gUnknown_083C9400\n\
+_080AAEDC: .4byte 0x000003ff\n\
+_080AAEE0: .4byte 0xfffffc00\n\
+_080AAEE4: .4byte 0xfffffe00\n\
+ .syntax divided\n");
+}
+
+void unref_sub_80AAEE8(s32 a, u8 b, u8 c, u8 d)
+{
+ u8 string[12];
+ u8 offset = 0;
+
+ if (a < 0)
+ {
+ string[0] = 0xAE;
+ offset = 1;
+ }
+ ConvertIntToDecimalStringN(string + offset, (a < 0) ? -a : a, 0, 8);
+ sub_80AAD84(string, b, c, d);
+}
+
+void sub_80AAF30(void)
+{
+ s32 i;
+
+ gUnknown_0203856C = 1;
+ gContestPlayerMonIndex = 3;
+ sub_80AE098(0);
+
+ for (i = 3; i > -1; i--)
+ gUnknown_02038690[i] = 3 - i;
+
+ for (i = 0; i < 3; i++)
+ {
+ gUnknown_02038670[i] = 0;
+ gUnknown_02038680[i] = 0;
+ gUnknown_02038678[i] = 0;
+ memcpy(&gContestMons[i], &gContestMons[3], sizeof(struct ContestPokemon));
+ }
+
+ gUnknown_02038670[3] = 0x12C;
+ gUnknown_02038680[3] = 0x190;
+ gUnknown_02038678[3] = 0x190;
+ sub_80B2A7C(0xFE);
+}
+
+//Don't know size of return type
+int MatsudaDebugMenu_SetHighScore(void)
+{
+ sub_80AAF30();
+ CloseMenu();
+ return 1;
+}
+
+//Don't know size of return type
+int MatsudaDebugMenu_ResetHighScore(void)
+{
+ s32 i;
+
+ gUnknown_0203856C = 0;
+ for (i = 0; i < 4; i++)
+ {
+ gUnknown_02038670[i] = 0;
+ gUnknown_02038680[i] = 0;
+ gUnknown_02038678[i] = 0;
+ }
+ CloseMenu();
+ return 1;
+}
+
+//Don't know size of return type
+int MatsudaDebugMenu_SetArtMuseumItems(void)
+{
+ s32 i;
+
+ gContestPlayerMonIndex = 3;
+ sub_80AE098(0);
+ for (i = 3; i > -1; i--)
+ gUnknown_02038690[i] = 3 - i;
+ for (gScriptContestCategory = 0; gScriptContestCategory < 5; gScriptContestCategory++)
+ sub_80B2A7C(0xFF);
+ CloseMenu();
+ return 1;
+}
+
+void unref_sub_80AB084(u8 *text)
+{
+ u16 savedIme;
+ u8 *addr;
+ size_t size;
+
+ 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_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON;
+
+ savedIme = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = savedIme;
+ REG_DISPSTAT = 8;
+ ResetTasks();
+ ResetSpriteData();
+ SetMainCallback2(sub_80AB184);
+
+ addr = (void *)VRAM;
+ size = 0x18000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ SetUpWindowConfig(&gWindowConfig_81E6FD8);
+ InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8);
+ LoadFontDefaultPalette(&gWindowConfig_81E6FD8);
+ sub_8003460(&gUnknown_03004210, text, 1, 9, 7);
+}
+
+void sub_80AB184(void)
+{
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG3HOFS = 0;
+ REG_BG3VOFS = 0;
+}
diff --git a/src/debug/mori_debug_menu.c b/src/debug/mori_debug_menu.c
new file mode 100644
index 000000000..1595ecd2e
--- /dev/null
+++ b/src/debug/mori_debug_menu.c
@@ -0,0 +1,168 @@
+#include "global.h"
+#include "mori_debug_menu.h"
+#include "data2.h"
+#include "daycare.h"
+#include "learn_move.h"
+#include "link.h"
+#include "main.h"
+#include "menu.h"
+#include "pokeblock.h"
+#include "start_menu.h"
+#include "string_util.h"
+
+#define SIO_MULTI_CNT ((struct SioMultiCnt *)REG_ADDR_SIOCNT)
+
+extern u8 (*gCallback_03004AE8)(void);
+
+u8 gUnknown_03004DA0[0x20];
+
+extern u8 gUnknown_0839B22C[][3];
+extern u8 gUnknown_0839B24A[];
+extern u8 gUnknown_0839B24D[];
+extern u8 gUnknown_0839B255[];
+extern u8 gUnknown_0839B257[];
+
+extern const struct MenuAction gMoriDebugMenuActions[];
+
+void unref_sub_8083CF0(void)
+{
+ int i;
+ int id = SIO_MULTI_CNT->id;
+ gUnknown_03004DA0[0] = EOS;
+ StringAppend(gUnknown_03004DA0, gUnknown_0839B24A);
+ for (i = 0; i < 10; i++)
+ if ((word_3002910[id ^ 1] >> i) & 1)
+ StringAppend(gUnknown_03004DA0, gUnknown_0839B22C[i]);
+}
+
+bool8 sub_8083D4C(void)
+{
+ if ( gMain.newKeys & A_BUTTON )
+ {
+ CloseMenu();
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr)
+{
+ u8 localPtr[52];
+ u16 monData;
+ u16 var;
+
+ monData = GetMonData(gPlayerParty, MON_DATA_SPECIES, ptr);
+ var = sub_8041870(monData);
+ StringCopy(localPtr, gSpeciesNames[monData]);
+ StringAppend(localPtr, gUnknown_0839B24D);
+ StringAppend(localPtr, gSpeciesNames[var]);
+ StringAppend(localPtr, gUnknown_0839B255);
+ MenuZeroFillScreen();
+ MenuDrawTextWindow(0, 14, 30, 19);
+ MenuPrint(localPtr, 1, 15);
+ gCallback_03004AE8 = sub_8083D4C;
+ return 0;
+}
+
+s8 MoriDebugMenu_Egg(void)
+{
+ if ( Daycare_CountPokemon(&gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() )
+ sub_8041940();
+ CloseMenu();
+
+ return 1;
+}
+
+s8 MoriDebugMenu_MaleEgg(void)
+{
+ if ( Daycare_CountPokemon(&gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() )
+ sub_8041950();
+ CloseMenu();
+
+ return 1;
+}
+
+s8 MoriDebugMenu_1000Steps(void)
+{
+ sub_8041790(1000);
+ CloseMenu();
+ return 1;
+}
+
+s8 MoriDebugMenu_10000Steps(void)
+{
+ sub_8041790(10000);
+ CloseMenu();
+ return 1;
+}
+
+s8 MoriDebugMenu_MoveTutor(void)
+{
+ sub_8132670();
+ CloseMenu();
+ return 1;
+}
+
+s8 MoriDebugMenu_BreedEgg(void)
+{
+ u8 loopCounter;
+
+ for (loopCounter = 0; loopCounter <= 5; loopCounter++)
+ {
+ //UB: Too few arguments for function 'GetMonData'
+ if ( GetMonData(&gPlayerParty[loopCounter], MON_DATA_IS_EGG) )
+ {
+ u8 friendship = 0;
+ SetMonData(&gPlayerParty[loopCounter], MON_DATA_FRIENDSHIP, &friendship);
+ }
+ }
+ gSaveBlock1.daycareData.misc.countersEtc.unk_11a = -3;
+ CloseMenu();
+ return 1;
+}
+
+s8 MoriDebugMenu_LongName(void)
+{
+ SetMonData(gPlayerParty, MON_DATA_NICKNAME, gUnknown_0839B257);
+ CloseMenu();
+ return 1;
+}
+
+s8 MoriDebugMenu_PokeblockCase(void)
+{
+ s32 loopCounter;
+
+ for (loopCounter = 0; loopCounter <= 39; loopCounter++)
+ PokeblockClearIfExists(loopCounter);
+
+ CloseMenu();
+ return 1;
+}
+
+bool8 MoriDebugMenuProcessInput(void)
+{
+ s8 choice = ProcessMenuInput();
+
+ switch (choice)
+ {
+ default:
+ gCallback_03004AE8 = gMoriDebugMenuActions[choice].func;
+ return FALSE;
+ case -2:
+ return FALSE;
+ case -1:
+ CloseMenu();
+ return TRUE;
+ }
+}
+
+s8 InitMoriDebugMenu(void)
+{
+ MenuZeroFillScreen();
+ MenuDrawTextWindow(0, 0, 10, 19);
+ PrintMenuItems(1, 1, 9, gMoriDebugMenuActions);
+ InitMenu(0, 1, 1, 9, 0, 9);
+ gCallback_03004AE8 = MoriDebugMenuProcessInput;
+ return 0;
+}
diff --git a/src/debug/sound_check_menu.c b/src/debug/sound_check_menu.c
new file mode 100644
index 000000000..14261b75e
--- /dev/null
+++ b/src/debug/sound_check_menu.c
@@ -0,0 +1,1300 @@
+#include "global.h"
+#include "sprite.h"
+#include "palette.h"
+#include "task.h"
+#include "m4a.h"
+#include "main.h"
+#include "text.h"
+#include "menu.h"
+#include "songs.h"
+#include "title_screen.h"
+#include "sound.h"
+#include "pokedex_cry_screen.h"
+
+// local task defines
+#define tWindowSelected data[0]
+#define tBgmIndex data[1]
+#define tSeIndex data[2]
+
+// window selections
+enum
+{
+ BGM_WINDOW,
+ SE_WINDOW
+};
+
+// driver test cry enums
+enum
+{
+ CRY_TEST_VOICE,
+ CRY_TEST_VOLUME,
+ CRY_TEST_PANPOT,
+ CRY_TEST_PITCH,
+ CRY_TEST_LENGTH,
+ CRY_TEST_RELEASE,
+ CRY_TEST_PROGRESS,
+ CRY_TEST_CHORUS,
+ CRY_TEST_PRIORITY
+};
+
+// minmax range enums
+enum
+{
+ MIN,
+ MAX
+};
+
+extern struct ToneData voicegroup_84537C0[];
+extern struct ToneData voicegroup_8452590[];
+extern struct ToneData voicegroup_8453DC0[];
+extern struct ToneData voicegroup_8452B90[];
+extern struct ToneData voicegroup_84543C0[];
+extern struct ToneData voicegroup_8453190[];
+extern struct ToneData voicegroup_84549C0[];
+extern struct ToneData voicegroup_8453790[];
+
+static EWRAM_DATA u8 gUnknown_020387B0 = 0;
+static EWRAM_DATA u8 gUnknown_020387B1 = 0;
+static EWRAM_DATA u8 gUnknown_020387B2 = 0;
+static EWRAM_DATA s8 sDriverTestSelection = 0;
+static EWRAM_DATA int sSoundTestParams[9] = {0};
+static EWRAM_DATA u8 gUnknown_020387D8 = 0;
+static EWRAM_DATA u8 gUnknown_020387D9 = 0;
+
+u16 gSoundTestCryNum;
+extern u8 gUnknown_03005E98;
+
+struct MusicPlayerInfo *gUnknown_03005D30;
+
+extern struct MusicPlayerInfo gMPlay_BGM;
+
+void Task_InitSoundCheckMenu(u8);
+void sub_80BA384(u8);
+void sub_80BA65C(u8);
+void sub_80BA68C(u8);
+void HighlightSelectedWindow(u8);
+void PrintSoundNumber(u16, u16, u16);
+void sub_80BA79C(const u8 *const, u16, u16);
+void Task_DrawDriverTestMenu(u8);
+void Task_ProcessDriverTestInput(u8);
+void AdjustSelectedDriverParam(s8);
+void PrintDriverTestMenuText(void);
+void sub_80BAE10(u8, u8);
+void PrintSignedNumber(int, u16, u16, u8);
+void sub_80BAF84(u8);
+void sub_80BB038(u8);
+void sub_80BB1D4(void);
+void Task_InitCryTest(u8);
+void Task_ProcessCryTestInput(u8);
+void PrintCryNumber(void);
+
+void CB2_SoundCheckMenu(void)
+{
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+}
+
+void VBlankCB_SoundCheckMenu(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+
+ if (gUnknown_020387B0 != 0)
+ {
+ m4aSoundMain();
+ m4aSoundMain();
+ m4aSoundMain();
+ }
+}
+
+// unused
+void CB2_StartSoundCheckMenu(void)
+{
+ u8 taskId;
+
+ SetVBlankCallback(NULL);
+ REG_DISPCNT = 0;
+ REG_BG2CNT = 0;
+ REG_BG1CNT = 0;
+ REG_BG0CNT = 0;
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG1HOFS = 0;
+ REG_BG1VOFS = 0;
+ REG_BG0HOFS = 0;
+ REG_BG0VOFS = 0;
+ DmaFill16(3, 0, VRAM, VRAM_SIZE);
+ DmaFill32(3, 0, OAM, OAM_SIZE);
+ DmaFill16(3, 0, PLTT, PLTT_SIZE);
+ ResetPaletteFade();
+ ResetTasks();
+ ResetSpriteData();
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ REG_WIN0H = WIN_RANGE(0, 0);
+ REG_WIN0V = WIN_RANGE(0, 0);
+ REG_WIN1H = WIN_RANGE(0, 0);
+ REG_WIN1V = WIN_RANGE(0, 0);
+ REG_WININ = 0x1111;
+ REG_WINOUT = 0x31;
+ REG_BLDCNT = 0xE1;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 7;
+ REG_IE = 1; // could be a typo of REG_IME
+ REG_IE |= 1;
+ REG_DISPSTAT |= 8;
+ SetVBlankCallback(VBlankCB_SoundCheckMenu);
+ SetMainCallback2(CB2_SoundCheckMenu);
+ REG_DISPCNT = 0x7140;
+ taskId = CreateTask(Task_InitSoundCheckMenu, 0);
+ gTasks[taskId].tWindowSelected = BGM_WINDOW;
+ gTasks[taskId].tBgmIndex = 0;
+ gTasks[taskId].tSeIndex = 0;
+ gTasks[taskId].data[3] = 0;
+ gUnknown_020387B0 = 0;
+ gTasks[taskId].data[3] = 0; // why?
+ m4aSoundInit();
+}
+
+void Task_InitSoundCheckMenu(u8 taskId)
+{
+ u8 soundcheckStr[] = _("サウンドチェック");
+ u8 bgmStr[] = _("BGM");
+ u8 seStr[] = _("SE ");
+ u8 abDescStr[] = _("A‥さいせい B‥おわり");
+ u8 upDownStr[] = _("L‥UP R‥DOWN");
+ u8 driverStr[] = _("R‥DRIVER-TEST");
+
+ if (!gPaletteFade.active)
+ {
+ MenuDrawTextWindow(2, 0, 27, 3);
+ MenuDrawTextWindow(2, 5, 27, 10);
+ MenuDrawTextWindow(2, 12, 27, 17);
+ MenuPrint(soundcheckStr, 4, 1);
+ MenuPrint(abDescStr, 14, 1);
+ MenuPrint(bgmStr, 4, 6);
+ MenuPrint(upDownStr, 14, 6);
+ MenuPrint(seStr, 4, 13);
+ MenuPrint(upDownStr, 14, 13);
+ MenuPrint(driverStr, 14, 18);
+ gTasks[taskId].func = sub_80BA384;
+ REG_WIN0H = WIN_RANGE(17, 223);
+ REG_WIN0V = WIN_RANGE(1, 31);
+ }
+}
+
+// ideally this should be a multi Coords8 struct, but it wont match when its treated like a struct.
+static const u8 gUnknown_083D0300[] = { 1, 1, 1, 3, 1, 5, 1, 7, 1, 9, 1, 11, 1, 13, 1, 15, 1, 17 };
+
+extern const u8 *const gBGMNames[];
+extern const u8 *const gSENames[];
+
+void sub_80BA384(u8 taskId) // Task_HandleDrawingSoundCheckMenuText
+{
+ HighlightSelectedWindow(gTasks[taskId].tWindowSelected);
+ PrintSoundNumber(gTasks[taskId].tBgmIndex + BGM_STOP, 7, 8); // print by BGM index
+ sub_80BA79C(gBGMNames[gTasks[taskId].tBgmIndex], 11, 8);
+ PrintSoundNumber(gTasks[taskId].tSeIndex, 7, 15);
+ sub_80BA79C(gSENames[gTasks[taskId].tSeIndex], 11, 15);
+ gTasks[taskId].func = sub_80BA65C;
+}
+
+bool8 Task_ProcessSoundCheckMenuInput(u8 taskId)
+{
+ if (gMain.newKeys & R_BUTTON) // driver test
+ {
+ gTasks[taskId].func = Task_DrawDriverTestMenu;
+ }
+ else if (gMain.newKeys & L_BUTTON)
+ {
+ gTasks[taskId].func = sub_80BAF84;
+ }
+ else if (gMain.newKeys & START_BUTTON)
+ {
+ gTasks[taskId].func = Task_InitCryTest;
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ if (gTasks[taskId].tWindowSelected != 0) // is playing?
+ {
+ if (gTasks[taskId].data[4] != 0)
+ {
+ if (gTasks[taskId].tSeIndex != 0)
+ {
+ m4aSongNumStop(gTasks[taskId].data[4]);
+ m4aSongNumStart(gTasks[taskId].tSeIndex);
+ gTasks[taskId].data[4] = gTasks[taskId].tSeIndex;
+ }
+ else
+ {
+ m4aSongNumStop(gTasks[taskId].data[4]);
+ gTasks[taskId].data[4] = 0;
+ }
+ }
+ else if (gTasks[taskId].tSeIndex != 0)
+ {
+ m4aSongNumStart(gTasks[taskId].tSeIndex);
+ gTasks[taskId].data[4] = gTasks[taskId].tSeIndex;
+ }
+ }
+ else
+ {
+ if (gTasks[taskId].data[3] != 0)
+ {
+ if (gTasks[taskId].tBgmIndex != 0)
+ {
+ m4aSongNumStop(gTasks[taskId].data[3] + BGM_STOP);
+ m4aSongNumStart(gTasks[taskId].tBgmIndex + BGM_STOP);
+ gTasks[taskId].data[3] = gTasks[taskId].tBgmIndex;
+ }
+ else
+ {
+ m4aSongNumStop(gTasks[taskId].data[3] + BGM_STOP);
+ gTasks[taskId].data[3] = 0;
+ }
+ }
+ else if (gTasks[taskId].tBgmIndex != 0)
+ {
+ m4aSongNumStart(gTasks[taskId].tBgmIndex + BGM_STOP);
+ gTasks[taskId].data[3] = gTasks[taskId].tBgmIndex;
+ }
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ m4aSongNumStart(SE_SELECT);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_80BA68C;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ gTasks[taskId].tWindowSelected ^= 1;
+ return TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ gTasks[taskId].tWindowSelected ^= 1;
+ return TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
+ {
+ if (gTasks[taskId].tWindowSelected != 0)
+ {
+ if (gTasks[taskId].tSeIndex > 0)
+ gTasks[taskId].tSeIndex--;
+ else
+ gTasks[taskId].tSeIndex = 247;
+ }
+ else
+ {
+ if (gTasks[taskId].tBgmIndex > 0)
+ gTasks[taskId].tBgmIndex--;
+ else
+ gTasks[taskId].tBgmIndex = 117;
+ }
+ return TRUE;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
+ {
+ if (gTasks[taskId].tWindowSelected != 0)
+ {
+ if (gTasks[taskId].tSeIndex < 247)
+ gTasks[taskId].tSeIndex++;
+ else
+ gTasks[taskId].tSeIndex = 0;
+ }
+ else
+ {
+ if (gTasks[taskId].tBgmIndex < 117)
+ gTasks[taskId].tBgmIndex++;
+ else
+ gTasks[taskId].tBgmIndex = 0;
+ }
+ return TRUE;
+ }
+ else if (gMain.heldKeys & SELECT_BUTTON)
+ {
+ gUnknown_020387B0 = 1;
+ }
+ else
+ {
+ gUnknown_020387B0 = 0;
+ }
+ return FALSE;
+}
+
+void sub_80BA65C(u8 taskId)
+{
+ if (Task_ProcessSoundCheckMenuInput(taskId) != FALSE)
+ gTasks[taskId].func = sub_80BA384;
+}
+
+void sub_80BA68C(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+ SetMainCallback2(CB2_InitTitleScreen);
+ }
+}
+
+void HighlightSelectedWindow(u8 windowType)
+{
+ switch (windowType)
+ {
+ case BGM_WINDOW:
+ default:
+ REG_WIN1H = WIN_RANGE(17, 223);
+ REG_WIN1V = WIN_RANGE(41, 87);
+ break;
+ case SE_WINDOW:
+ REG_WIN1H = WIN_RANGE(17, 223);
+ REG_WIN1V = WIN_RANGE(97, 143);
+ break;
+ }
+}
+
+void PrintSoundNumber(u16 soundIndex, u16 x, u16 y) // PrintSoundNumber ?
+{
+ u8 i;
+ u8 str[5];
+ bool8 someBool;
+ u8 divisorValue;
+
+ for (i = 0; i < 3; i++)
+ str[i] = 0; // initialize array
+
+ str[3] = CHAR_ELLIPSIS;
+ str[4] = EOS;
+ someBool = FALSE;
+
+ divisorValue = soundIndex / 100;
+ if (divisorValue)
+ {
+ str[0] = divisorValue + CHAR_0;
+ someBool = TRUE;
+ }
+
+ divisorValue = (soundIndex % 100) / 10;
+ if (divisorValue || someBool)
+ str[1] = divisorValue + CHAR_0;
+
+ str[2] = ((soundIndex % 100) % 10) + CHAR_0;
+ MenuPrint(str, x, y);
+}
+
+void sub_80BA79C(const u8 *const string, u16 x, u16 y)
+{
+ u8 i;
+ u8 str[11];
+
+ for (i = 0; i <= 10; i++)
+ str[i] = 0; // format string.
+
+ str[10] = EOS; // the above for loop formats the last element of the array unnecessarily.
+
+ for (i = 0; string[i] != EOS && i < 10; i++)
+ str[i] = string[i];
+
+ MenuPrint(str, x, y);
+}
+
+void Task_DrawDriverTestMenu(u8 taskId) // Task_DrawDriverTestMenu
+{
+ u8 bbackStr[] = _("Bぼたんで もどる");
+ u8 aplayStr[] = _("Aぼたんで さいせい");
+ u8 voiceStr[] = _("VOICE‥‥‥‥");
+ u8 volumeStr[] = _("VOLUME‥‥‥");
+ u8 panpotStr[] = _("PANPOT‥‥‥");
+ u8 pitchStr[] = _("PITCH‥‥‥‥");
+ u8 lengthStr[] = _("LENGTH‥‥‥");
+ u8 releaseStr[] = _("RELEASE‥‥");
+ u8 progressStr[] = _("PROGRESS‥");
+ u8 chorusStr[] = _("CHORUS‥‥‥");
+ u8 priorityStr[] = _("PRIORITY‥");
+ u8 playingStr[] = _("さいせいちゆう‥"); // 再生中 (playing)
+ u8 reverseStr[] = _("はんてん‥‥‥‥"); // 反転 (reverse)
+ u8 stereoStr[] = _("すてれお‥‥‥‥"); // stereo
+
+ REG_DISPCNT = 0x3140;
+ MenuDrawTextWindow(0, 0, 29, 19);
+ MenuPrint(bbackStr, 19, 4);
+ MenuPrint(aplayStr, 19, 2);
+ MenuPrint(voiceStr, 2, 1);
+ MenuPrint(volumeStr, 2, 3);
+ MenuPrint(panpotStr, 2, 5);
+ MenuPrint(pitchStr, 2, 7);
+ MenuPrint(lengthStr, 2, 9);
+ MenuPrint(releaseStr, 2, 11);
+ MenuPrint(progressStr, 2, 13);
+ MenuPrint(chorusStr, 2, 15);
+ MenuPrint(priorityStr, 2, 17);
+ MenuPrint(playingStr, 19, 16);
+ MenuPrint(reverseStr, 19, 14);
+ MenuPrint(stereoStr, 19, 12);
+ REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH);
+ REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT);
+ sDriverTestSelection = 0;
+ gUnknown_020387B1 = 0;
+ gUnknown_020387B2 = 0;
+ gUnknown_03005D30 = NULL;
+ gUnknown_020387D8 = 0;
+ gUnknown_020387D9 = 1;
+ sSoundTestParams[CRY_TEST_VOICE] = 0;
+ sSoundTestParams[CRY_TEST_VOLUME] = 120;
+ sSoundTestParams[CRY_TEST_PANPOT] = 0;
+ sSoundTestParams[CRY_TEST_PITCH] = 15360;
+ sSoundTestParams[CRY_TEST_LENGTH] = 180;
+ sSoundTestParams[CRY_TEST_PROGRESS] = 0;
+ sSoundTestParams[CRY_TEST_RELEASE] = 0;
+ sSoundTestParams[CRY_TEST_CHORUS] = 0;
+ sSoundTestParams[CRY_TEST_PRIORITY] = 2;
+ PrintDriverTestMenuText();
+ sub_80BAE10(0, 0);
+ gTasks[taskId].func = Task_ProcessDriverTestInput;
+}
+
+void Task_ProcessDriverTestInput(u8 taskId)
+{
+ if (gMain.newKeys & B_BUTTON)
+ {
+ REG_DISPCNT = 0x7140;
+ REG_WIN0H = WIN_RANGE(17, 223);
+ REG_WIN0V = WIN_RANGE(1, 31);
+ MenuZeroFillWindowRect(0, 0, 29, 19);
+ gTasks[taskId].func = Task_InitSoundCheckMenu;
+ return;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_UP) // _080BAAA8
+ {
+ u8 old = sDriverTestSelection;
+
+ if(--sDriverTestSelection < 0)
+ sDriverTestSelection = 8;
+ sub_80BAE10(old, sDriverTestSelection);
+ return;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN) // _080BAAD0
+ {
+ u8 old = sDriverTestSelection;
+
+ if(++sDriverTestSelection > 8)
+ sDriverTestSelection = 0;
+ sub_80BAE10(old, sDriverTestSelection);
+ return;
+ }
+ if (gMain.newKeys & START_BUTTON) // _080BAAF8
+ {
+ gUnknown_020387D8 ^= 1;
+ PrintDriverTestMenuText();
+ return;
+ }
+ if (gMain.newKeys & SELECT_BUTTON) // _080BAB14
+ {
+ gUnknown_020387D9 ^= 1;
+ PrintDriverTestMenuText();
+ SetPokemonCryStereo(gUnknown_020387D9);
+ return;
+ }
+ if (gMain.newAndRepeatedKeys & R_BUTTON) // _080BAB38
+ {
+ AdjustSelectedDriverParam(10);
+ PrintDriverTestMenuText();
+ return;
+ }
+ if (gMain.newAndRepeatedKeys & L_BUTTON) // _080BAB46
+ {
+ AdjustSelectedDriverParam(-10);
+ PrintDriverTestMenuText();
+ return;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BAB56
+ {
+ AdjustSelectedDriverParam(-1);
+ PrintDriverTestMenuText();
+ return;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BAB64
+ {
+ AdjustSelectedDriverParam(1);
+ PrintDriverTestMenuText();
+ return;
+ }
+ if (gMain.newKeys & A_BUTTON) // _080BAB78
+ {
+ u8 divide, remaining;
+
+ SetPokemonCryVolume(sSoundTestParams[CRY_TEST_VOLUME]);
+ SetPokemonCryPanpot(sSoundTestParams[CRY_TEST_PANPOT]);
+ SetPokemonCryPitch(sSoundTestParams[CRY_TEST_PITCH]);
+ SetPokemonCryLength(sSoundTestParams[CRY_TEST_LENGTH]);
+ SetPokemonCryProgress(sSoundTestParams[CRY_TEST_PROGRESS]);
+ SetPokemonCryRelease(sSoundTestParams[CRY_TEST_RELEASE]);
+ SetPokemonCryChorus(sSoundTestParams[CRY_TEST_CHORUS]);
+ SetPokemonCryPriority(sSoundTestParams[CRY_TEST_PRIORITY]);
+
+ remaining = sSoundTestParams[CRY_TEST_VOICE] % 128;
+ divide = sSoundTestParams[CRY_TEST_VOICE] / 128;
+
+ switch (divide)
+ {
+ case 0:
+ if (gUnknown_020387D8)
+ gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84537C0[remaining]);
+ else
+ gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452590[remaining]);
+ break;
+ case 1:
+ if (gUnknown_020387D8)
+ gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453DC0[remaining]);
+ else
+ gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8452B90[remaining]);
+ break;
+ case 2:
+ if (gUnknown_020387D8)
+ gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84543C0[remaining]);
+ else
+ gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453190[remaining]);
+ break;
+ case 3:
+ if (gUnknown_020387D8)
+ gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_84549C0[remaining]);
+ else
+ gUnknown_03005D30 = SetPokemonCryTone(&voicegroup_8453790[remaining]);
+ break;
+ }
+ }
+
+ // _080BACA2
+ if (gUnknown_03005D30 != NULL)
+ {
+ gUnknown_020387B1 = IsPokemonCryPlaying(gUnknown_03005D30);
+
+ if (gUnknown_020387B1 != gUnknown_020387B2)
+ PrintDriverTestMenuText();
+
+ gUnknown_020387B2 = gUnknown_020387B1;
+ }
+}
+
+void AdjustSelectedDriverParam(s8 delta)
+{
+ // also ideally should be a MinMax struct, but any attempt to make this into a struct causes it to not match due to the weird multi dim access.
+ int paramRanges[] =
+ {
+ 0, 387, // Voice
+ 0, 127, // Volume
+ -127, 127, // Panpot
+ -128, 32639, // Pitch
+ 0, 65535, // Length
+ 0, 255, // Release
+ 0, 65535, // Progress
+ -64, 63 // Chorus
+ // Priority??? Why is it missing?
+ };
+
+ sSoundTestParams[sDriverTestSelection] += delta;
+
+ if (sSoundTestParams[sDriverTestSelection] > paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MAX)])
+ sSoundTestParams[sDriverTestSelection] = paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MIN)];
+
+ if (sSoundTestParams[sDriverTestSelection] < paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MIN)])
+ sSoundTestParams[sDriverTestSelection] = paramRanges[MULTI_DIM_ARR(sDriverTestSelection, B_16, MAX)];
+}
+
+void PrintDriverTestMenuText(void)
+{
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_VOICE] + 1, 11, 1, 5);
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_VOLUME], 11, 3, 5);
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_PANPOT], 11, 5, 5);
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_PITCH], 11, 7, 5);
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_LENGTH], 11, 9, 5);
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_RELEASE], 11, 11, 5);
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_PROGRESS], 11, 13, 5);
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_CHORUS], 11, 15, 5);
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_PRIORITY], 11, 17, 5);
+ PrintSignedNumber(gUnknown_020387B1, 27, 16, 1);
+ PrintSignedNumber(gUnknown_020387D8, 27, 14, 1);
+ PrintSignedNumber(gUnknown_020387D9, 27, 12, 1);
+}
+
+void sub_80BAE10(u8 var1, u8 var2)
+{
+ u8 str1[] = _("▶");
+ u8 str2[] = _(" ");
+
+ MenuPrint(str2, gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var1, B_16, 1)]);
+ MenuPrint(str1, gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 0)], gUnknown_083D0300[MULTI_DIM_ARR(var2, B_16, 1)]);
+}
+
+void PrintSignedNumber(int n, u16 x, u16 y, u8 digits)
+{
+ int powersOfTen[6] =
+ {
+ 1,
+ 10,
+ 100,
+ 1000,
+ 10000,
+ 100000
+ };
+ u8 str[8];
+ s8 i;
+ s8 negative;
+ s8 someVar2;
+
+ for (i = 0; i <= digits; i++)
+ str[i] = CHAR_SPACE;
+ str[digits + 1] = EOS;
+
+ negative = FALSE;
+ if (n < 0)
+ {
+ n = -n;
+ negative = TRUE;
+ }
+
+ if (digits == 1)
+ someVar2 = TRUE;
+ else
+ someVar2 = FALSE;
+
+ for (i = digits - 1; i >= 0; i--)
+ {
+ s8 d = n / powersOfTen[i];
+
+ if (d != 0 || someVar2 || i == 0)
+ {
+ if (negative && !someVar2)
+ str[digits - i - 1] = CHAR_HYPHEN;
+ str[digits - i] = CHAR_0 + d;
+ someVar2 = TRUE;
+ }
+ n %= powersOfTen[i];
+ }
+
+ MenuPrint(str, x, y);
+}
+
+static const s8 gUnknown_083D03F8[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 };
+
+void sub_80BAF84(u8 taskId)
+{
+ u8 seStr[] = _("SE");
+ u8 panStr[] = _("PAN");
+ u8 playingStr[] = _("さいせいちゆう‥");
+
+ REG_DISPCNT = 0x3140;
+ MenuDrawTextWindow(0, 0, 29, 19);
+ MenuPrint(seStr, 3, 2);
+ MenuPrint(panStr, 3, 4);
+ MenuPrint(playingStr, 3, 8);
+ REG_WIN0H = WIN_RANGE(0, DISPLAY_WIDTH);
+ REG_WIN0V = WIN_RANGE(0, DISPLAY_HEIGHT);
+ sSoundTestParams[CRY_TEST_VOICE] = 1;
+ sSoundTestParams[CRY_TEST_PANPOT] = 0;
+ sSoundTestParams[CRY_TEST_CHORUS] = 0;
+ sSoundTestParams[CRY_TEST_PROGRESS] = 0;
+ sSoundTestParams[CRY_TEST_RELEASE] = 0;
+ sub_80BB1D4();
+ gTasks[taskId].func = sub_80BB038;
+}
+
+void sub_80BB038(u8 taskId)
+{
+ sub_80BB1D4();
+ if (sSoundTestParams[CRY_TEST_PROGRESS])
+ {
+ if (sSoundTestParams[CRY_TEST_RELEASE])
+ {
+ sSoundTestParams[CRY_TEST_RELEASE]--;
+ }
+ else // _080BB05C
+ {
+ s8 panpot = gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]];
+ if (panpot != -128)
+ {
+ if (panpot == 127)
+ {
+ sSoundTestParams[CRY_TEST_CHORUS] += 2;
+ if (sSoundTestParams[CRY_TEST_CHORUS] < 63)
+ SE12PanpotControl(sSoundTestParams[CRY_TEST_CHORUS]);
+ }
+ }
+ else // _080BB08C
+ {
+ sSoundTestParams[CRY_TEST_CHORUS] -= 2;
+ if (sSoundTestParams[CRY_TEST_CHORUS] > -64)
+ SE12PanpotControl(sSoundTestParams[CRY_TEST_CHORUS]);
+ }
+ }
+ }
+ // _080BB0A2
+ if (gMain.newKeys & B_BUTTON)
+ {
+ REG_DISPCNT = 0x7140;
+ REG_WIN0H = WIN_RANGE(17, 223);
+ REG_WIN0V = WIN_RANGE(1, 31);
+ MenuZeroFillWindowRect(0, 0, 29, 19);
+ gTasks[taskId].func = Task_InitSoundCheckMenu;
+ return;
+ }
+ if (gMain.newKeys & A_BUTTON) // _080BB104
+ {
+ s8 panpot = gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]];
+ if (panpot != -128)
+ {
+ if (panpot == 127)
+ {
+ PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], -64);
+ sSoundTestParams[CRY_TEST_CHORUS] = -64;
+ sSoundTestParams[CRY_TEST_PROGRESS] = 1;
+ sSoundTestParams[CRY_TEST_RELEASE] = 30;
+ return;
+ }
+ }
+ else // _080BB140
+ {
+ PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], 63);
+ sSoundTestParams[CRY_TEST_CHORUS] = 63;
+ sSoundTestParams[CRY_TEST_PROGRESS] = 1;
+ sSoundTestParams[CRY_TEST_RELEASE] = 30;
+ return;
+ }
+ // _080BB154
+ PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], panpot);
+ sSoundTestParams[CRY_TEST_PROGRESS] = 0;
+ return;
+ }
+ if (gMain.newKeys & L_BUTTON) // _080BB15E
+ {
+ sSoundTestParams[CRY_TEST_PANPOT]++;
+ if (sSoundTestParams[CRY_TEST_PANPOT] > 4)
+ sSoundTestParams[CRY_TEST_PANPOT] = 0;
+ }
+ if (gMain.newKeys & R_BUTTON) // _080BB176
+ {
+ sSoundTestParams[CRY_TEST_PANPOT]--;
+ if (sSoundTestParams[CRY_TEST_PANPOT] < 0)
+ sSoundTestParams[CRY_TEST_PANPOT] = 4;
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_RIGHT) // _080BB192
+ {
+ sSoundTestParams[CRY_TEST_VOICE]++;
+ if (sSoundTestParams[CRY_TEST_VOICE] > 247)
+ sSoundTestParams[CRY_TEST_VOICE] = 0;
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_LEFT) // _080BB1B0
+ {
+ sSoundTestParams[CRY_TEST_VOICE]--;
+ if (sSoundTestParams[CRY_TEST_VOICE] < 0)
+ sSoundTestParams[CRY_TEST_VOICE] = 247;
+ }
+}
+
+void sub_80BB1D4(void)
+{
+ u8 lrStr[] = _(" LR");
+ u8 rlStr[] = _(" RL");
+
+ PrintSignedNumber(sSoundTestParams[CRY_TEST_VOICE], 7, 2, 3);
+
+ switch (gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]])
+ {
+ case 127:
+ MenuPrint(lrStr, 7, 4);
+ break;
+ case -128:
+ MenuPrint(rlStr, 7, 4);
+ break;
+ default:
+ PrintSignedNumber(gUnknown_083D03F8[sSoundTestParams[CRY_TEST_PANPOT]], 7, 4, 3);
+ break;
+ }
+ PrintSignedNumber(IsSEPlaying(), 12, 8, 1);
+}
+
+#define SOUND_LIST_BGM \
+ X(BGM_STOP, "STOP") \
+ X(BGM_TETSUJI, "TETSUJI") \
+ X(BGM_FIELD13, "FIELD13") \
+ X(BGM_KACHI22, "KACHI22") \
+ X(BGM_KACHI2, "KACHI2") \
+ X(BGM_KACHI3, "KACHI3") \
+ X(BGM_KACHI5, "KACHI5") \
+ X(BGM_PCC, "PCC") \
+ X(BGM_NIBI, "NIBI") \
+ X(BGM_SUIKUN, "SUIKUN") \
+ X(BGM_DOORO1, "DOORO1") \
+ X(BGM_DOORO_X1, "DOORO-X1") \
+ X(BGM_DOORO_X3, "DOORO-X3") \
+ X(BGM_MACHI_S2, "MACHI-S2") \
+ X(BGM_MACHI_S4, "MACHI-S4") \
+ X(BGM_GIM, "GIM") \
+ X(BGM_NAMINORI, "NAMINORI") \
+ X(BGM_DAN01, "DAN01") \
+ X(BGM_FANFA1, "FANFA1") \
+ X(BGM_ME_ASA, "ME-ASA") \
+ X(BGM_ME_BACHI, "ME-BACHI") \
+ X(BGM_FANFA4, "FANFA4") \
+ X(BGM_FANFA5, "FANFA5") \
+ X(BGM_ME_WAZA, "ME-WAZA") \
+ X(BGM_BIJYUTU, "BIJYUTU") \
+ X(BGM_DOORO_X4, "DOORO-X4") \
+ X(BGM_FUNE_KAN, "FUNE-KAN") \
+ X(BGM_ME_SHINKA, "ME-SHINKA") \
+ X(BGM_SHINKA, "SHINKA") \
+ X(BGM_ME_WASURE, "ME-WASURE") \
+ X(BGM_SYOUJOEYE, "SYOUJOEYE") \
+ X(BGM_BOYEYE, "BOYEYE") \
+ X(BGM_DAN02, "DAN02") \
+ X(BGM_MACHI_S3, "MACHI-S3") \
+ X(BGM_ODAMAKI, "ODAMAKI") \
+ X(BGM_B_TOWER, "B-TOWER") \
+ X(BGM_SWIMEYE, "SWIMEYE") \
+ X(BGM_DAN03, "DAN03") \
+ X(BGM_ME_KINOMI, "ME-KINOMI") \
+ X(BGM_ME_TAMA, "ME-TAMA") \
+ X(BGM_ME_B_BIG, "ME-B-BIG") \
+ X(BGM_ME_B_SMALL, "ME-B-SMALL") \
+ X(BGM_ME_ZANNEN, "ME-ZANNEN") \
+ X(BGM_BD_TIME, "BD-TIME") \
+ X(BGM_TEST1, "TEST1") \
+ X(BGM_TEST2, "TEST2") \
+ X(BGM_TEST3, "TEST3") \
+ X(BGM_TEST4, "TEST4") \
+ X(BGM_TEST, "TEST") \
+ X(BGM_GOMACHI0, "GOMACHI0") \
+ X(BGM_GOTOWN, "GOTOWN") \
+ X(BGM_POKECEN, "POKECEN") \
+ X(BGM_NEXTROAD, "NEXTROAD") \
+ X(BGM_GRANROAD, "GRANROAD") \
+ X(BGM_CYCLING, "CYCLING") \
+ X(BGM_FRIENDLY, "FRIENDLY") \
+ X(BGM_MISHIRO, "MISHIRO") \
+ X(BGM_TOZAN, "TOZAN") \
+ X(BGM_GIRLEYE, "GIRLEYE") \
+ X(BGM_MINAMO, "MINAMO") \
+ X(BGM_ASHROAD, "ASHROAD") \
+ X(BGM_EVENT0, "EVENT0") \
+ X(BGM_DEEPDEEP, "DEEPDEEP") \
+ X(BGM_KACHI1, "KACHI1") \
+ X(BGM_TITLE3, "TITLE3") \
+ X(BGM_DEMO1, "DEMO1") \
+ X(BGM_GIRL_SUP, "GIRL-SUP") \
+ X(BGM_HAGESHII, "HAGESHII") \
+ X(BGM_KAKKOII, "KAKKOII") \
+ X(BGM_KAZANBAI, "KAZANBAI") \
+ X(BGM_AQA_0, "AQA-0") \
+ X(BGM_TSURETEK, "TSURETEK") \
+ X(BGM_BOY_SUP, "BOY-SUP") \
+ X(BGM_RAINBOW, "RAINBOW") \
+ X(BGM_AYASII, "AYASII") \
+ X(BGM_KACHI4, "KACHI4") \
+ X(BGM_ROPEWAY, "ROPEWAY") \
+ X(BGM_CASINO, "CASINO") \
+ X(BGM_HIGHTOWN, "HIGHTOWN") \
+ X(BGM_SAFARI, "SAFARI") \
+ X(BGM_C_ROAD, "C-ROAD") \
+ X(BGM_AJITO, "AJITO") \
+ X(BGM_M_BOAT, "M-BOAT") \
+ X(BGM_M_DUNGON, "M-DUNGON") \
+ X(BGM_FINECITY, "FINECITY") \
+ X(BGM_MACHUPI, "MACHUPI") \
+ X(BGM_P_SCHOOL, "P-SCHOOL") \
+ X(BGM_DENDOU, "DENDOU") \
+ X(BGM_TONEKUSA, "TONEKUSA") \
+ X(BGM_MABOROSI, "MABOROSI") \
+ X(BGM_CON_FAN, "CON-FAN") \
+ X(BGM_CONTEST0, "CONTEST0") \
+ X(BGM_MGM0, "MGM0") \
+ X(BGM_T_BATTLE, "T-BATTLE") \
+ X(BGM_OOAME, "OOAME") \
+ X(BGM_HIDERI, "HIDERI") \
+ X(BGM_RUNECITY, "RUNECITY") \
+ X(BGM_CON_K, "CON-K") \
+ X(BGM_EIKOU_R, "EIKOU-R") \
+ X(BGM_KARAKURI, "KARAKURI") \
+ X(BGM_HUTAGO, "HUTAGO") \
+ X(BGM_SITENNOU, "SITENNOU") \
+ X(BGM_YAMA_EYE, "YAMA-EYE") \
+ X(BGM_CONLOBBY, "CONLOBBY") \
+ X(BGM_INTER_V, "INTER-V") \
+ X(BGM_DAIGO, "DAIGO") \
+ X(BGM_THANKFOR, "THANKFOR") \
+ X(BGM_END, "END") \
+ X(BGM_BATTLE27, "BATTLE27") \
+ X(BGM_BATTLE31, "BATTLE31") \
+ X(BGM_BATTLE20, "BATTLE20") \
+ X(BGM_BATTLE32, "BATTLE32") \
+ X(BGM_BATTLE33, "BATTLE33") \
+ X(BGM_BATTLE36, "BATTLE36") \
+ X(BGM_BATTLE34, "BATTLE34") \
+ X(BGM_BATTLE35, "BATTLE35") \
+ X(BGM_BATTLE38, "BATTLE38") \
+ X(BGM_BATTLE30, "BATTLE30")
+
+#define SOUND_LIST_SE \
+ X(SE_STOP, "STOP") \
+ X(SE_KAIFUKU, "KAIFUKU") \
+ X(SE_PC_LOGON, "PC-LOGON") \
+ X(SE_PC_OFF, "PC-OFF") \
+ X(SE_PC_ON, "PC-ON") \
+ X(SE_SELECT, "SELECT") \
+ X(SE_WIN_OPEN, "WIN-OPEN") \
+ X(SE_WALL_HIT, "WALL-HIT") \
+ X(SE_DOOR, "DOOR") \
+ X(SE_KAIDAN, "KAIDAN") \
+ X(SE_DANSA, "DANSA") \
+ X(SE_JITENSYA, "JITENSYA") \
+ X(SE_KOUKA_L, "KOUKA-L") \
+ X(SE_KOUKA_M, "KOUKA-M") \
+ X(SE_KOUKA_H, "KOUKA-H") \
+ X(SE_BOWA2, "BOWA2") \
+ X(SE_POKE_DEAD, "POKE-DEAD") \
+ X(SE_NIGERU, "NIGERU") \
+ X(SE_JIDO_DOA, "JIDO-DOA") \
+ X(SE_NAMINORI, "NAMINORI") \
+ X(SE_BAN, "BAN") \
+ X(SE_PIN, "PIN") \
+ X(SE_BOO, "BOO") \
+ X(SE_BOWA, "BOWA") \
+ X(SE_JYUNI, "JYUNI") \
+ X(SE_A, "A") \
+ X(SE_I, "I") \
+ X(SE_U, "U") \
+ X(SE_E, "E") \
+ X(SE_O, "O") \
+ X(SE_N, "N") \
+ X(SE_SEIKAI, "SEIKAI") \
+ X(SE_HAZURE, "HAZURE") \
+ X(SE_EXP, "EXP") \
+ X(SE_JITE_PYOKO, "JITE-PYOKO") \
+ X(SE_MU_PACHI, "MU-PACHI") \
+ X(SE_TK_KASYA, "TK-KASYA") \
+ X(SE_FU_ZAKU, "FU-ZAKU") \
+ X(SE_FU_ZAKU2, "FU-ZAKU2") \
+ X(SE_FU_ZUZUZU, "FU-ZUZUZU") \
+ X(SE_RU_GASHIN, "RU-GASHIN") \
+ X(SE_RU_GASYAN, "RU-GASYAN") \
+ X(SE_RU_BARI, "RU-BARI") \
+ X(SE_RU_HYUU, "RU-HYUU") \
+ X(SE_KI_GASYAN, "KI-GASYAN") \
+ X(SE_TK_WARPIN, "TK-WARPIN") \
+ X(SE_TK_WARPOUT, "TK-WARPOUT") \
+ X(SE_TU_SAA, "TU-SAA") \
+ X(SE_HI_TURUN, "HI-TURUN") \
+ X(SE_TRACK_MOVE, "TRACK-MOVE") \
+ X(SE_TRACK_STOP, "TRACK-STOP") \
+ X(SE_TRACK_HAIK, "TRACK-HAIK") \
+ X(SE_TRACK_DOOR, "TRACK-DOOR") \
+ X(SE_MOTER, "MOTER") \
+ X(SE_CARD, "CARD") \
+ X(SE_SAVE, "SAVE") \
+ X(SE_KON, "KON") \
+ X(SE_KON2, "KON2") \
+ X(SE_KON3, "KON3") \
+ X(SE_KON4, "KON4") \
+ X(SE_SUIKOMU, "SUIKOMU") \
+ X(SE_NAGERU, "NAGERU") \
+ X(SE_TOY_C, "TOY-C") \
+ X(SE_TOY_D, "TOY-D") \
+ X(SE_TOY_E, "TOY-E") \
+ X(SE_TOY_F, "TOY-F") \
+ X(SE_TOY_G, "TOY-G") \
+ X(SE_TOY_A, "TOY-A") \
+ X(SE_TOY_B, "TOY-B") \
+ X(SE_TOY_C1, "TOY-C1") \
+ X(SE_MIZU, "MIZU") \
+ X(SE_HASHI, "HASHI") \
+ X(SE_DAUGI, "DAUGI") \
+ X(SE_PINPON, "PINPON") \
+ X(SE_FUUSEN1, "FUUSEN1") \
+ X(SE_FUUSEN2, "FUUSEN2") \
+ X(SE_FUUSEN3, "FUUSEN3") \
+ X(SE_TOY_KABE, "TOY-KABE") \
+ X(SE_TOY_DANGO, "TOY-DANGO") \
+ X(SE_DOKU, "DOKU") \
+ X(SE_ESUKA, "ESUKA") \
+ X(SE_T_AME, "T-AME") \
+ X(SE_T_AME_E, "T-AME-E") \
+ X(SE_T_OOAME, "T-OOAME") \
+ X(SE_T_OOAME_E, "T-OOAME-E") \
+ X(SE_T_KOAME, "T-KOAME") \
+ X(SE_T_KOAME_E, "T-KOAME-E") \
+ X(SE_T_KAMI, "T-KAMI") \
+ X(SE_T_KAMI2, "T-KAMI2") \
+ X(SE_ELEBETA, "ELEBETA") \
+ X(SE_HINSI, "HINSI") \
+ X(SE_EXPMAX, "EXPMAX") \
+ X(SE_TAMAKORO, "TAMAKORO") \
+ X(SE_TAMAKORO_E, "TAMAKORO-E") \
+ X(SE_BASABASA, "BASABASA") \
+ X(SE_REGI, "REGI") \
+ X(SE_C_GAJI, "C-GAJI") \
+ X(SE_C_MAKU_U, "C-MAKU-U") \
+ X(SE_C_MAKU_D, "C-MAKU-D") \
+ X(SE_C_PASI, "C-PASI") \
+ X(SE_C_SYU, "C-SYU") \
+ X(SE_C_PIKON, "C-PIKON") \
+ X(SE_REAPOKE, "REAPOKE") \
+ X(SE_OP_BASYU, "OP-BASYU") \
+ X(SE_BT_START, "BT-START") \
+ X(SE_DENDOU, "DENDOU") \
+ X(SE_JIHANKI, "JIHANKI") \
+ X(SE_TAMA, "TAMA") \
+ X(SE_Z_SCROLL, "Z-SCROLL") \
+ X(SE_Z_PAGE, "Z-PAGE") \
+ X(SE_PN_ON, "PN-ON") \
+ X(SE_PN_OFF, "PN-OFF") \
+ X(SE_Z_SEARCH, "Z-SEARCH") \
+ X(SE_TAMAGO, "TAMAGO") \
+ X(SE_TB_START, "TB-START") \
+ X(SE_TB_KON, "TB-KON") \
+ X(SE_TB_KARA, "TB-KARA") \
+ X(SE_BIDORO, "BIDORO") \
+ X(SE_W085, "W085") \
+ X(SE_W085B, "W085B") \
+ X(SE_W231, "W231") \
+ X(SE_W171, "W171") \
+ X(SE_W233, "W233") \
+ X(SE_W233B, "W233B") \
+ X(SE_W145, "W145") \
+ X(SE_W145B, "W145B") \
+ X(SE_W145C, "W145C") \
+ X(SE_W240, "W240") \
+ X(SE_W015, "W015") \
+ X(SE_W081, "W081") \
+ X(SE_W081B, "W081B") \
+ X(SE_W088, "W088") \
+ X(SE_W016, "W016") \
+ X(SE_W016B, "W016B") \
+ X(SE_W003, "W003") \
+ X(SE_W104, "W104") \
+ X(SE_W013, "W013") \
+ X(SE_W196, "W196") \
+ X(SE_W086, "W086") \
+ X(SE_W004, "W004") \
+ X(SE_W025, "W025") \
+ X(SE_W025B, "W025B") \
+ X(SE_W152, "W152") \
+ X(SE_W026, "W026") \
+ X(SE_W172, "W172") \
+ X(SE_W172B, "W172B") \
+ X(SE_W053, "W053") \
+ X(SE_W007, "W007") \
+ X(SE_W092, "W092") \
+ X(SE_W221, "W221") \
+ X(SE_W221B, "W221B") \
+ X(SE_W052, "W052") \
+ X(SE_W036, "W036") \
+ X(SE_W059, "W059") \
+ X(SE_W059B, "W059B") \
+ X(SE_W010, "W010") \
+ X(SE_W011, "W011") \
+ X(SE_W017, "W017") \
+ X(SE_W019, "W019") \
+ X(SE_W028, "W028") \
+ X(SE_W013B, "W013B") \
+ X(SE_W044, "W044") \
+ X(SE_W029, "W029") \
+ X(SE_W057, "W057") \
+ X(SE_W056, "W056") \
+ X(SE_W250, "W250") \
+ X(SE_W030, "W030") \
+ X(SE_W039, "W039") \
+ X(SE_W054, "W054") \
+ X(SE_W077, "W077") \
+ X(SE_W020, "W020") \
+ X(SE_W082, "W082") \
+ X(SE_W047, "W047") \
+ X(SE_W195, "W195") \
+ X(SE_W006, "W006") \
+ X(SE_W091, "W091") \
+ X(SE_W146, "W146") \
+ X(SE_W120, "W120") \
+ X(SE_W153, "W153") \
+ X(SE_W071B, "W071B") \
+ X(SE_W071, "W071") \
+ X(SE_W103, "W103") \
+ X(SE_W062, "W062") \
+ X(SE_W062B, "W062B") \
+ X(SE_W048, "W048") \
+ X(SE_W187, "W187") \
+ X(SE_W118, "W118") \
+ X(SE_W155, "W155") \
+ X(SE_W122, "W122") \
+ X(SE_W060, "W060") \
+ X(SE_W185, "W185") \
+ X(SE_W014, "W014") \
+ X(SE_W043, "W043") \
+ X(SE_W207, "W207") \
+ X(SE_W207B, "W207B") \
+ X(SE_W215, "W215") \
+ X(SE_W109, "W109") \
+ X(SE_W173, "W173") \
+ X(SE_W280, "W280") \
+ X(SE_W202, "W202") \
+ X(SE_W060B, "W060B") \
+ X(SE_W076, "W076") \
+ X(SE_W080, "W080") \
+ X(SE_W100, "W100") \
+ X(SE_W107, "W107") \
+ X(SE_W166, "W166") \
+ X(SE_W129, "W129") \
+ X(SE_W115, "W115") \
+ X(SE_W112, "W112") \
+ X(SE_W197, "W197") \
+ X(SE_W199, "W199") \
+ X(SE_W236, "W236") \
+ X(SE_W204, "W204") \
+ X(SE_W268, "W268") \
+ X(SE_W070, "W070") \
+ X(SE_W063, "W063") \
+ X(SE_W127, "W127") \
+ X(SE_W179, "W179") \
+ X(SE_W151, "W151") \
+ X(SE_W201, "W201") \
+ X(SE_W161, "W161") \
+ X(SE_W161B, "W161B") \
+ X(SE_W227, "W227") \
+ X(SE_W227B, "W227B") \
+ X(SE_W226, "W226") \
+ X(SE_W208, "W208") \
+ X(SE_W213, "W213") \
+ X(SE_W213B, "W213B") \
+ X(SE_W234, "W234") \
+ X(SE_W260, "W260") \
+ X(SE_W328, "W328") \
+ X(SE_W320, "W320") \
+ X(SE_W255, "W255") \
+ X(SE_W291, "W291") \
+ X(SE_W089, "W089") \
+ X(SE_W239, "W239") \
+ X(SE_W230, "W230") \
+ X(SE_W281, "W281") \
+ X(SE_W327, "W327") \
+ X(SE_W287, "W287") \
+ X(SE_W257, "W257") \
+ X(SE_W253, "W253") \
+ X(SE_W258, "W258") \
+ X(SE_W322, "W322") \
+ X(SE_W298, "W298") \
+ X(SE_W287B, "W287B") \
+ X(SE_W114, "W114") \
+ X(SE_W063B, "W063B")
+
+// Create BGM list
+#define X(songId, name) static const u8 sBGMName_##songId[] = _(name);
+SOUND_LIST_BGM
+#undef X
+
+#define X(songId, name) sBGMName_##songId,
+static const u8 *const gBGMNames[] =
+{
+SOUND_LIST_BGM
+};
+#undef X
+
+// Create SE list
+#define X(songId, name) static const u8 sSEName_##songId[] = _(name);
+SOUND_LIST_SE
+#undef X
+
+#define X(songId, name) sSEName_##songId,
+static const u8 *const gSENames[] =
+{
+SOUND_LIST_SE
+};
+#undef X
+
+void Task_InitCryTest(u8 taskId)
+{
+ struct CryRelatedStruct cryStruct, cryStruct2;
+ u8 zero;
+
+ SetUpWindowConfig(&gWindowConfig_81E6C3C);
+ InitMenuWindow(&gWindowConfig_81E6CE4);
+ gSoundTestCryNum = 1;
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+
+ cryStruct.unk0 = 0x2000;
+ cryStruct.unk2 = 29;
+ cryStruct.paletteNo = 12;
+ cryStruct.yPos = 30;
+ cryStruct.xPos = 4;
+
+ zero = 0; // wtf?
+ gUnknown_03005E98 = 0;
+
+ while (sub_8119E3C(&cryStruct, 3) == FALSE)
+ ;
+
+ cryStruct2.unk0 = 0;
+ cryStruct2.unk2 = 15;
+ cryStruct2.paletteNo = 13;
+ cryStruct2.xPos = 12;
+ cryStruct2.yPos = 12;
+
+ zero = 0; // wtf?
+ gUnknown_03005E98 = 0;
+
+ while (ShowPokedexCryScreen(&cryStruct2, 2) == FALSE)
+ ;
+
+ MenuDrawTextWindow(0, 16, 5, 19);
+ PrintCryNumber();
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0);
+ REG_BG2HOFS = 0;
+ REG_BG2VOFS = 0;
+ REG_BG2CNT = 0xF01;
+ REG_BG3CNT = 0x1D03;
+ REG_DISPCNT = 0x1d40;
+ m4aMPlayFadeOutTemporarily(&gMPlay_BGM, 2);
+ gTasks[taskId].func = Task_ProcessCryTestInput;
+}
+
+void Task_ProcessCryTestInput(u8 taskId)
+{
+ sub_8119F88(3);
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ sub_811A050(gSoundTestCryNum);
+ }
+ if (gMain.newKeys & R_BUTTON)
+ {
+ StopCryAndClearCrySongs();
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if(--gSoundTestCryNum == 0)
+ gSoundTestCryNum = 384; // total species
+ PrintCryNumber();
+ }
+ if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if(++gSoundTestCryNum > 384)
+ gSoundTestCryNum = 1;
+ PrintCryNumber();
+ }
+ if (gMain.newKeys & B_BUTTON)
+ {
+ REG_DISPCNT = 0x7140;
+ REG_WIN0H = WIN_RANGE(17, 223);
+ REG_WIN0V = WIN_RANGE(1, 31);
+ MenuZeroFillWindowRect(0, 0, 29, 19);
+ gTasks[taskId].func = Task_InitSoundCheckMenu;
+ DestroyCryMeterNeedleSprite();
+ }
+}
+
+void PrintCryNumber(void)
+{
+ PrintSignedNumber(gSoundTestCryNum, 1, 17, 3);
+}
diff --git a/src/debug/unknown_debug_menu.c b/src/debug/unknown_debug_menu.c
new file mode 100644
index 000000000..a81625f2a
--- /dev/null
+++ b/src/debug/unknown_debug_menu.c
@@ -0,0 +1,52 @@
+#include "global.h"
+#include "menu.h"
+
+extern u8 gBattleCommunication[];
+
+extern u8 (*gCallback_03004AE8)(void);
+
+extern const struct MenuAction gUnknown_0842C29C[];
+
+static u8 sub_814A464(void);
+
+int unref_sub_814A414(void)
+{
+ MenuZeroFillScreen();
+ MenuDrawTextWindow(0, 0, 16, 18);
+ PrintMenuItems(2, 1, 8, gUnknown_0842C29C);
+ InitMenu(0, 1, 1, 8, 0, 15);
+ gCallback_03004AE8 = sub_814A464;
+ return 0;
+}
+
+static u8 sub_814A464(void)
+{
+ s8 result = ProcessMenuInput();
+ if (result == -2)
+ {
+ return 0;
+ }
+ else if (result == -1)
+ {
+ CloseMenu();
+ return 1;
+ }
+ else
+ {
+ gBattleCommunication[0] = result;
+ gCallback_03004AE8 = gUnknown_0842C29C[result].func;
+ return 0;
+ }
+}
+
+u8 sub_814A4B8(void)
+{
+ gSaveBlock2.filler_A8.var_4AE[0] = 3;
+ gSaveBlock2.filler_A8.var_4AE[1] = 3;
+ gSaveBlock2.filler_A8.var_4B4 = gBattleCommunication[0] + 1;
+ gSaveBlock2.filler_A8.var_4B6 = gBattleCommunication[0] + 1;
+ gSaveBlock2.filler_A8.var_4B0 = 1;
+ gSaveBlock2.filler_A8.var_4B2 = 1;
+ CloseMenu();
+ return 1;
+}