Skip to content

Instantly share code, notes, and snippets.

@Sierraffinity
Last active April 13, 2020 05:15
Show Gist options
  • Save Sierraffinity/f19f10d130d19069f6d687a254798eb6 to your computer and use it in GitHub Desktop.
Save Sierraffinity/f19f10d130d19069f6d687a254798eb6 to your computer and use it in GitHub Desktop.
Decomped(ish) pokeemerald-jp sound check menu
/*
* To use this menu, you will need to add the entries
* src/debug/sound_check_menu.o(.text);
* src/debug/sound_check_menu.o(.rodata);
* to the ld_script where appropriate (i.e. next to other entries of the same type),
* an entry in sym_ewram.txt formatted the same way as the other entries, then
* finally an entry in sym_common.txt and a file in common_syms with the same name as
* this file but with a .txt extension. Its only contents should be sMPlayInfo_Cry.
*/
#include "global.h"
#include "bg.h"
#include "sprite.h"
#include "palette.h"
#include "task.h"
#include "m4a.h"
#include "main.h"
#include "text.h"
#include "menu.h"
#include "gpu_regs.h"
#include "scanline_effect.h"
#include "string_util.h"
#include "constants/rgb.h"
#include "constants/songs.h"
#include "title_screen.h"
#include "sound.h"
#include "trainer_pokemon_sprites.h"
#define tWindowSelected data[0]
#define tBgmIndex data[1]
#define tSeIndex data[2]
#define tBgmIndexOld data[3]
#define tSeIndexOld data[4]
#define tWhichSubmenu data[14]
#define tState data[15]
// wonky dim access macro
#define MULTI_DIM_ARR(x, dim, y) ((x) * dim + (y))
// dim access enums
enum
{
B_8 = 1,
B_16 = 2,
B_32 = 4
};
// windows
enum
{
WIN_INFO,
WIN_MUS,
WIN_SE,
WIN_COUNT
};
// selected test
enum
{
TEST_MUS,
TEST_SE
};
// 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 gCryTable[];
extern struct ToneData gCryTable2[];
static EWRAM_DATA u8 sIsFastForwarding = 0;
static EWRAM_DATA u8 sDriverTest_IsCryPlaying = 0;
static EWRAM_DATA u8 sDriverTest_IsCryPlayingOld = 0;
static EWRAM_DATA int sSoundTestParams[9] = {0};
static EWRAM_DATA u8 sDriverTest_Reverse = 0;
static EWRAM_DATA u8 sDriverTest_Stereo = 0;
struct MusicPlayerInfo *sMPlayInfo_Cry;
extern struct MusicPlayerInfo gMPlayInfo_BGM;
static const struct BgTemplate sSoundCheckMenuBgTemplates[] =
{
{
.bg = 0,
.charBaseIndex = 0,
.mapBaseIndex = 31,
.screenSize = 0,
.paletteMode = 0,
.priority = 0,
.baseTile = 0
},
};
static const struct WindowTemplate sSoundCheckMenuWindowTemplates[] =
{
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 1,
.width = 28,
.height = 4,
.paletteNum = 15,
.baseBlock = 20,
},
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 8,
.width = 28,
.height = 4,
.paletteNum = 15,
.baseBlock = 132,
},
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 15,
.width = 28,
.height = 4,
.paletteNum = 15,
.baseBlock = 244,
},
DUMMY_WIN_TEMPLATE,
};
static const struct WindowTemplate sSoundCheckMenuDriverTestWindowTemplates[] =
{
{
.bg = 0,
.tilemapLeft = 1,
.tilemapTop = 1,
.width = 28,
.height = 18,
.paletteNum = 15,
.baseBlock = 20,
},
DUMMY_WIN_TEMPLATE,
};
static void Task_InitSoundCheckMenu(u8 taskId);
static void Task_InitSoundCheckMenu_CreateWindows(u8);
static void Task_HandleDrawingSoundCheckMenuText(u8);
static void Task_ProcessSoundCheckMenuInputAndRedraw(u8);
static void Task_ExitToTitleScreen(u8);
static void HighlightSelectedWindow(u8);
static void PrintSoundNumber(u16, u8);
static void PrintPaddedString(const u8 *const, u8);
static void Task_DrawSubmenu(u8);
static void Task_ProcessDriverTestInput(u8);
static void AdjustSelectedDriverParam(s8);
static void PrintDriverTestMenuText(void);
static void PrintSignedNumber(int, u16, u16, u8);
static void Task_DrawDriverTestMenu(u8);
static void Task_DrawPanTestMenu(u8);
static void Task_ProcessPanTestInput(u8);
static void PrintPanTestMenuText(void);
static void InitGpuRegs(void);
static void ClearTasksAndGraphicalStructs(void);
static void SetupDispcnt(void);
static void DestroyWindow(u8 windowId);
static void PutWindowTilemapAndCopyWindowToVram(u8 windowId);
static void CB2_SoundCheckMenu(void)
{
RunTasks();
AnimateSprites();
BuildOamBuffer();
UpdatePaletteFade();
}
static void VBlankCB_SoundCheckMenu(void)
{
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
if (sIsFastForwarding != 0)
{
m4aSoundMain();
m4aSoundMain();
m4aSoundMain();
}
}
void CB2_StartSoundCheckMenu(void) // sub_080E8320
{
u8 taskId;
switch (gMain.state)
{
case 0:
SetVBlankCallback(NULL);
InitGpuRegs();
gMain.state++;
break;
case 1:
ClearTasksAndGraphicalStructs();
gMain.state++;
break;
case 2:
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sSoundCheckMenuBgTemplates, ARRAY_COUNT(sSoundCheckMenuBgTemplates));
ResetBgPositions();
gMain.state++;
break;
case 3:
if (IsDma3ManagerBusyWithBgCopy() == TRUE)
return;
ShowBg(0);
gMain.state++;
break;
case 4:
InitWindows(sSoundCheckMenuWindowTemplates);
DeactivateAllTextPrinters();
LoadMessageBoxAndBorderGfx();
gMain.state++;
break;
case 5:
BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB(0, 0, 0));
gMain.state++;
break;
case 6:
SetupDispcnt();
SetGpuReg(REG_OFFSET_WININ, WININ_WIN0_BG0 |
WININ_WIN0_OBJ |
WININ_WIN1_BG0 |
WININ_WIN1_OBJ);
SetGpuReg(REG_OFFSET_WINOUT, WINOUT_WIN01_BG0 |
WINOUT_WIN01_OBJ |
WINOUT_WIN01_CLR);
SetGpuReg(REG_OFFSET_BLDCNT, BLDCNT_TGT1_BG0 |
BLDCNT_TGT1_BD |
BLDCNT_EFFECT_DARKEN);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 7);
EnableInterrupts(INTR_FLAG_VBLANK);
SetVBlankCallback(VBlankCB_SoundCheckMenu);
SetMainCallback2(CB2_SoundCheckMenu);
taskId = CreateTask(Task_InitSoundCheckMenu_CreateWindows, 0);
gTasks[taskId].tWindowSelected = TEST_MUS;
gTasks[taskId].tBgmIndex = 0;
gTasks[taskId].tSeIndex = 0;
gTasks[taskId].tBgmIndexOld = 0;
gTasks[taskId].tSeIndexOld = 0;
sIsFastForwarding = 0;
m4aSoundInit();
gMain.state++;
break;
}
}
static void Task_InitSoundCheckMenu_CreateWindows(u8 taskId) // SanitizeDayCareMailForRuby
{
const u8 soundcheckStr[] = _("SOUND CHECK A…PLAY B…STOP");
const u8 bgmStr[] = _("BGM");
const u8 seStr[] = _("SE ");
const u8 upDownStr[] = _("L…UP R…DOWN");
const u8 driverStr[] = _("R…DRIVER-TEST");
if (!gPaletteFade.active)
{
SetStandardWindowBorderStyle(WIN_INFO, FALSE);
AddTextPrinterParameterized(WIN_INFO, 1, soundcheckStr, 0, 0, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, driverStr, 100, 14, TEXT_SPEED_FF, NULL);
PutWindowTilemapAndCopyWindowToVram(WIN_INFO);
SetStandardWindowBorderStyle(WIN_MUS, FALSE);
AddTextPrinterParameterized(WIN_MUS, 1, bgmStr, 0, 0, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_MUS, 1, upDownStr, 100, 0, TEXT_SPEED_FF, NULL);
PutWindowTilemapAndCopyWindowToVram(WIN_MUS);
SetStandardWindowBorderStyle(WIN_SE, FALSE);
AddTextPrinterParameterized(WIN_SE, 1, seStr, 0, 0, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_SE, 1, upDownStr, 100, 0, TEXT_SPEED_FF, NULL);
PutWindowTilemapAndCopyWindowToVram(WIN_SE);
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, 239));
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, 48));
HighlightSelectedWindow(WIN_INFO);
gTasks[taskId].func = Task_HandleDrawingSoundCheckMenuText;
}
}
static const u8 *const gBGMNames[];
static const u8 *const gSENames[];
static void Task_HandleDrawingSoundCheckMenuText(u8 taskId) // sub_080E85F4
{
FillWindowPixelRect(WIN_MUS, PIXEL_FILL(1), 0, 14, 224, 12);
PrintSoundNumber(gTasks[taskId].tBgmIndex + (MUS_TETSUJI - 1), WIN_MUS); // print by BGM index
PrintPaddedString(gBGMNames[gTasks[taskId].tBgmIndex], WIN_MUS);
FillWindowPixelRect(WIN_SE, PIXEL_FILL(1), 0, 14, 224, 12);
PrintSoundNumber(gTasks[taskId].tSeIndex, WIN_SE);
PrintPaddedString(gSENames[gTasks[taskId].tSeIndex], WIN_SE);
gTasks[taskId].func = Task_ProcessSoundCheckMenuInputAndRedraw;
}
static bool8 Task_ProcessSoundCheckMenuInput(u8 taskId) // sub_080E8688
{
if (gMain.newKeys & R_BUTTON) // driver test
{
gTasks[taskId].tWhichSubmenu = 1;
gTasks[taskId].tState = 0;
gTasks[taskId].func = Task_DrawSubmenu;
}
else if (gMain.newKeys & L_BUTTON)
{
gTasks[taskId].tWhichSubmenu = 0;
gTasks[taskId].tState = 0;
gTasks[taskId].func = Task_DrawSubmenu;
}
else if (gMain.newKeys & A_BUTTON)
{
if (gTasks[taskId].tWindowSelected != TEST_MUS)
{
if (gTasks[taskId].tSeIndexOld != 0)
{
if (gTasks[taskId].tSeIndex != 0)
{
m4aSongNumStop(gTasks[taskId].tSeIndexOld);
m4aSongNumStart(gTasks[taskId].tSeIndex);
gTasks[taskId].tSeIndexOld = gTasks[taskId].tSeIndex;
}
else
{
m4aSongNumStop(gTasks[taskId].tSeIndexOld);
gTasks[taskId].tSeIndexOld = 0;
}
}
else if (gTasks[taskId].tSeIndex != 0)
{
m4aSongNumStart(gTasks[taskId].tSeIndex);
gTasks[taskId].tSeIndexOld = gTasks[taskId].tSeIndex;
}
}
else
{
if (gTasks[taskId].tBgmIndexOld != 0)
{
if (gTasks[taskId].tBgmIndex != 0)
{
m4aSongNumStop(gTasks[taskId].tBgmIndexOld + (MUS_TETSUJI - 1));
m4aSongNumStart(gTasks[taskId].tBgmIndex + (MUS_TETSUJI - 1));
gTasks[taskId].tBgmIndexOld = gTasks[taskId].tBgmIndex;
}
else
{
m4aSongNumStop(gTasks[taskId].tBgmIndexOld + (MUS_TETSUJI - 1));
gTasks[taskId].tBgmIndexOld = 0;
}
}
else if (gTasks[taskId].tBgmIndex != 0)
{
m4aSongNumStart(gTasks[taskId].tBgmIndex + (MUS_TETSUJI - 1));
gTasks[taskId].tBgmIndexOld = gTasks[taskId].tBgmIndex;
}
}
}
else if (gMain.newKeys & B_BUTTON)
{
m4aSongNumStart(SE_SELECT);
BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0));
gTasks[taskId].func = Task_ExitToTitleScreen;
}
else if (gMain.newAndRepeatedKeys & (DPAD_UP | DPAD_DOWN))
{
gTasks[taskId].tWindowSelected ^= 1;
HighlightSelectedWindow(gTasks[taskId].tWindowSelected);
return FALSE;
}
else if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
{
if (gTasks[taskId].tWindowSelected != TEST_MUS)
{
if (gTasks[taskId].tSeIndex > 0)
gTasks[taskId].tSeIndex--;
else
gTasks[taskId].tSeIndex = SE_USSOKI;
}
else
{
if (gTasks[taskId].tBgmIndex > 0)
gTasks[taskId].tBgmIndex--;
else
gTasks[taskId].tBgmIndex = (PH_NURSE_SOLO - (MUS_TETSUJI - 1));
}
return TRUE;
}
else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
{
if (gTasks[taskId].tWindowSelected != TEST_MUS)
{
if (gTasks[taskId].tSeIndex < SE_USSOKI)
gTasks[taskId].tSeIndex++;
else
gTasks[taskId].tSeIndex = 0;
}
else
{
if (gTasks[taskId].tBgmIndex < (PH_NURSE_SOLO - (MUS_TETSUJI - 1)))
gTasks[taskId].tBgmIndex++;
else
gTasks[taskId].tBgmIndex = 0;
}
return TRUE;
}
else if (gMain.heldKeys & SELECT_BUTTON)
{
sIsFastForwarding = 1;
}
else
{
sIsFastForwarding = 0;
}
return FALSE;
}
static void Task_ProcessSoundCheckMenuInputAndRedraw(u8 taskId) // sub_080E8878
{
if (Task_ProcessSoundCheckMenuInput(taskId) != FALSE)
gTasks[taskId].func = Task_HandleDrawingSoundCheckMenuText;
}
static void Task_ExitToTitleScreen(u8 taskId) // sub_080E88A8
{
u8 windowId;
if (!gPaletteFade.active)
{
for (windowId = WIN_INFO; windowId < WIN_COUNT; windowId++)
{
DestroyWindow(windowId);
}
DestroyTask(taskId);
SetMainCallback2(CB2_InitTitleScreen);
}
}
static void HighlightSelectedWindow(u8 windowType) // sub_080E88E8
{
switch (windowType)
{
case WIN_INFO:
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0, 239));
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(56, 104));
break;
case WIN_MUS:
SetGpuReg(REG_OFFSET_WIN1H, WIN_RANGE(0, 239));
SetGpuReg(REG_OFFSET_WIN1V, WIN_RANGE(112, 160));
break;
}
}
static void PrintSoundNumber(u16 soundIndex, u8 windowId) // sub_080E8928
{
ConvertIntToDecimalStringN(gStringVar1, soundIndex, STR_CONV_MODE_RIGHT_ALIGN, 3);
gStringVar1[3] = CHAR_ELLIPSIS;
gStringVar1[4] = EOS;
AddTextPrinterParameterized(windowId, 1, gStringVar1, 0, 14, TEXT_SPEED_FF, NULL);
PutWindowTilemapAndCopyWindowToVram(windowId);
}
static void PrintPaddedString(const u8 *const string, u8 windowId) // sub_080E8978
{
u8 i;
u8 str[16];
for (i = 0; i < 15; i++)
str[i] = CHAR_SPACE; // pad string.
str[15] = EOS;
for (i = 0; string[i] != EOS && i < 15; i++)
str[i] = string[i];
AddTextPrinterParameterized(windowId, 1, str, 40, 14, TEXT_SPEED_FF, NULL);
PutWindowTilemapAndCopyWindowToVram(windowId);
}
static void Task_DrawSubmenu(u8 taskId) // sub_080E89EC
{
u8 windowId;
switch (gTasks[taskId].tState)
{
case 0:
for (windowId = WIN_INFO; windowId < WIN_COUNT; windowId++)
{
DestroyWindow(windowId);
}
FreeAllWindowBuffers();
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sSoundCheckMenuBgTemplates, ARRAY_COUNT(sSoundCheckMenuBgTemplates));
gTasks[taskId].tState++;
break;
case 1:
if (IsDma3ManagerBusyWithBgCopy() == TRUE)
return;
InitWindows(sSoundCheckMenuDriverTestWindowTemplates);
SetStandardWindowBorderStyle(0, TRUE);
gTasks[taskId].tState++;
break;
case 2:
ShowBg(0);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG0_ON |
DISPCNT_OBJ_ON |
DISPCNT_WIN0_ON);
if (gTasks[taskId].tWhichSubmenu == 0)
{
gTasks[taskId].func = Task_DrawPanTestMenu;
}
else
{
gTasks[taskId].func = Task_DrawDriverTestMenu;
}
break;
}
}
static void Task_DrawDriverTestMenu(u8 taskId) // sub_080E8AA0
{
const u8 bbackStr[] = _("B BUTTON: BACK");
const u8 aplayStr[] = _("A BUTTON: PLAY");
const u8 voiceStr[] = _("VOICE…………");
const u8 volumeStr[] = _("VOLUME………");
const u8 panpotStr[] = _("PANPOT………");
const u8 pitchStr[] = _("PITCH…………");
const u8 lengthStr[] = _("LENGTH………");
const u8 releaseStr[] = _("RELEASE……");
const u8 progressStr[] = _("PROGRESS…");
const u8 chorusStr[] = _("CHORUS………");
const u8 priorityStr[] = _("PRIORITY…");
const u8 playingStr[] = _("PLAYING");
const u8 reverseStr[] = _("REVERSE");
const u8 stereoStr[] = _("STEREO");
SetStandardWindowBorderStyle(WIN_INFO, FALSE);
AddTextPrinterParameterized(WIN_INFO, 1, bbackStr, 136, 16, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, aplayStr, 136, 32, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, playingStr, 136, 80, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, reverseStr, 136, 96, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, stereoStr, 136, 112, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, voiceStr, 8, 0, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, volumeStr, 8, 16, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, panpotStr, 8, 32, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, pitchStr, 8, 48, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, lengthStr, 8, 64, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, releaseStr, 8, 80, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, progressStr, 8, 96, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, chorusStr, 8, 112, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, priorityStr, 8, 128, TEXT_SPEED_FF, NULL);
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH));
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(0, DISPLAY_HEIGHT));
sDriverTest_IsCryPlaying = 0;
sDriverTest_IsCryPlayingOld = 0;
sMPlayInfo_Cry = NULL;
sDriverTest_Reverse = 0;
sDriverTest_Stereo = 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_81983AC(WIN_INFO, 1, 0, 0, 16, 9, 0);
gTasks[taskId].func = Task_ProcessDriverTestInput;
}
static void Task_ProcessDriverTestInput(u8 taskId) // sub_080E8D68
{
if (gMain.newKeys & B_BUTTON)
{
gTasks[taskId].tState = 0;
gTasks[taskId].func = Task_InitSoundCheckMenu;
return;
}
if (gMain.newAndRepeatedKeys & DPAD_UP)
{
Menu_MoveCursorNoWrapAround(-1);
return;
}
if (gMain.newAndRepeatedKeys & DPAD_DOWN)
{
Menu_MoveCursorNoWrapAround(1);
return;
}
if (gMain.newKeys & START_BUTTON)
{
sDriverTest_Reverse ^= 1;
PrintDriverTestMenuText();
return;
}
if (gMain.newKeys & SELECT_BUTTON)
{
sDriverTest_Stereo ^= 1;
PrintDriverTestMenuText();
SetPokemonCryStereo(sDriverTest_Stereo);
return;
}
if (gMain.newAndRepeatedKeys & R_BUTTON)
{
AdjustSelectedDriverParam(10);
PrintDriverTestMenuText();
return;
}
if (gMain.newAndRepeatedKeys & L_BUTTON)
{
AdjustSelectedDriverParam(-10);
PrintDriverTestMenuText();
return;
}
if (gMain.newAndRepeatedKeys & DPAD_LEFT)
{
AdjustSelectedDriverParam(-1);
PrintDriverTestMenuText();
return;
}
if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
{
AdjustSelectedDriverParam(1);
PrintDriverTestMenuText();
return;
}
if (gMain.newKeys & A_BUTTON)
{
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 (sDriverTest_Reverse)
sMPlayInfo_Cry = SetPokemonCryTone(&gCryTable2[(128 * 0) + remaining]);
else
sMPlayInfo_Cry = SetPokemonCryTone(&gCryTable[(128 * 0) + remaining]);
break;
case 1:
if (sDriverTest_Reverse)
sMPlayInfo_Cry = SetPokemonCryTone(&gCryTable2[(128 * 1) + remaining]);
else
sMPlayInfo_Cry = SetPokemonCryTone(&gCryTable[(128 * 1) + remaining]);
break;
case 2:
if (sDriverTest_Reverse)
sMPlayInfo_Cry = SetPokemonCryTone(&gCryTable2[(128 * 2) + remaining]);
else
sMPlayInfo_Cry = SetPokemonCryTone(&gCryTable[(128 * 2) + remaining]);
break;
case 3:
if (sDriverTest_Reverse)
sMPlayInfo_Cry = SetPokemonCryTone(&gCryTable2[(128 * 3) + remaining]);
else
sMPlayInfo_Cry = SetPokemonCryTone(&gCryTable[(128 * 3) + remaining]);
break;
}
}
if (sMPlayInfo_Cry != NULL)
{
sDriverTest_IsCryPlaying = IsPokemonCryPlaying(sMPlayInfo_Cry);
if (sDriverTest_IsCryPlaying != sDriverTest_IsCryPlayingOld)
PrintDriverTestMenuText();
sDriverTest_IsCryPlayingOld = sDriverTest_IsCryPlaying;
}
}
static void AdjustSelectedDriverParam(s8 delta) // sub_080E8FA4
{
// 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.
const 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?
};
u8 cursorPos = Menu_GetCursorPos();
sSoundTestParams[cursorPos] += delta;
if (sSoundTestParams[cursorPos] > paramRanges[MULTI_DIM_ARR(cursorPos, B_16, MAX)])
sSoundTestParams[cursorPos] = paramRanges[MULTI_DIM_ARR(cursorPos, B_16, MIN)];
if (sSoundTestParams[cursorPos] < paramRanges[MULTI_DIM_ARR(cursorPos, B_16, MIN)])
sSoundTestParams[cursorPos] = paramRanges[MULTI_DIM_ARR(cursorPos, B_16, MAX)];
}
static void PrintDriverTestMenuText(void) // sub_080E900C
{
PrintSignedNumber(sSoundTestParams[CRY_TEST_VOICE] + 1, 80, 0, 5);
PrintSignedNumber(sSoundTestParams[CRY_TEST_VOLUME], 80, 16, 5);
PrintSignedNumber(sSoundTestParams[CRY_TEST_PANPOT], 80, 32, 5);
PrintSignedNumber(sSoundTestParams[CRY_TEST_PITCH], 80, 48, 5);
PrintSignedNumber(sSoundTestParams[CRY_TEST_LENGTH], 80, 64, 5);
PrintSignedNumber(sSoundTestParams[CRY_TEST_RELEASE], 80, 80, 5);
PrintSignedNumber(sSoundTestParams[CRY_TEST_PROGRESS], 80, 96, 5);
PrintSignedNumber(sSoundTestParams[CRY_TEST_CHORUS], 80, 112, 5);
PrintSignedNumber(sSoundTestParams[CRY_TEST_PRIORITY], 80, 128, 5);
PrintSignedNumber(sDriverTest_IsCryPlaying, 200, 80, 1);
PrintSignedNumber(sDriverTest_Reverse, 200, 96, 1);
PrintSignedNumber(sDriverTest_Stereo, 200, 112, 1);
}
static void PrintSignedNumber(int n, u16 x, u16 y, u8 digits) // sub_080E90C0
{
const 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];
}
AddTextPrinterParameterized(WIN_INFO, 1, str, x, y, TEXT_SPEED_FF, NULL);
PutWindowTilemapAndCopyWindowToVram(WIN_INFO);
}
static const s8 gUnknown_08566E58[5] = { 0x3F, 0x00, 0xC0, 0x7F, 0x80 };
static void Task_DrawPanTestMenu(u8 taskId) // sub_080E91E4
{
const u8 seStr[] = _("SE");
const u8 panStr[] = _("PAN");
AddTextPrinterParameterized(WIN_INFO, 1, seStr, 10, 14, TEXT_SPEED_FF, NULL);
AddTextPrinterParameterized(WIN_INFO, 1, panStr, 10, 28, TEXT_SPEED_FF, NULL);
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(0, DISPLAY_WIDTH));
SetGpuReg(REG_OFFSET_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;
PrintPanTestMenuText();
gTasks[taskId].func = Task_ProcessPanTestInput;
}
static void Task_ProcessPanTestInput(u8 taskId) // sub_080E9284
{
if (sSoundTestParams[CRY_TEST_PROGRESS])
{
if (sSoundTestParams[CRY_TEST_RELEASE])
{
sSoundTestParams[CRY_TEST_RELEASE]--;
}
else
{
s8 panpot = gUnknown_08566E58[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
{
sSoundTestParams[CRY_TEST_CHORUS] -= 2;
if (sSoundTestParams[CRY_TEST_CHORUS] > -64)
SE12PanpotControl(sSoundTestParams[CRY_TEST_CHORUS]);
}
}
}
if (gMain.newKeys & B_BUTTON)
{
gTasks[taskId].tState = 0;
gTasks[taskId].func = Task_InitSoundCheckMenu;
return;
}
if (gMain.newKeys & A_BUTTON)
{
s8 panpot = gUnknown_08566E58[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
{
PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], 63);
sSoundTestParams[CRY_TEST_CHORUS] = 63;
sSoundTestParams[CRY_TEST_PROGRESS] = 1;
sSoundTestParams[CRY_TEST_RELEASE] = 30;
return;
}
PlaySE12WithPanning(sSoundTestParams[CRY_TEST_VOICE], panpot);
sSoundTestParams[CRY_TEST_PROGRESS] = 0;
return;
}
if (gMain.newKeys & L_BUTTON)
{
sSoundTestParams[CRY_TEST_PANPOT]++;
if (sSoundTestParams[CRY_TEST_PANPOT] > 4)
sSoundTestParams[CRY_TEST_PANPOT] = 0;
PrintPanTestMenuText();
}
if (gMain.newKeys & R_BUTTON)
{
sSoundTestParams[CRY_TEST_PANPOT]--;
if (sSoundTestParams[CRY_TEST_PANPOT] < 0)
sSoundTestParams[CRY_TEST_PANPOT] = 4;
PrintPanTestMenuText();
}
if (gMain.newAndRepeatedKeys & DPAD_RIGHT)
{
sSoundTestParams[CRY_TEST_VOICE]++;
if (sSoundTestParams[CRY_TEST_VOICE] > SE_USSOKI)
sSoundTestParams[CRY_TEST_VOICE] = MUS_DUMMY;
PrintPanTestMenuText();
}
else if (gMain.newAndRepeatedKeys & DPAD_LEFT)
{
sSoundTestParams[CRY_TEST_VOICE]--;
if (sSoundTestParams[CRY_TEST_VOICE] < MUS_DUMMY)
sSoundTestParams[CRY_TEST_VOICE] = SE_USSOKI;
PrintPanTestMenuText();
}
}
static void Task_InitSoundCheckMenu(u8 taskId) // sub_080E9410
{
switch (gTasks[taskId].tState)
{
case 0:
DestroyWindow(WIN_INFO);
FreeAllWindowBuffers();
ResetBgsAndClearDma3BusyFlags(0);
InitBgsFromTemplates(0, sSoundCheckMenuBgTemplates, ARRAY_COUNT(sSoundCheckMenuBgTemplates));
gTasks[taskId].tState++;
break;
case 1:
if (IsDma3ManagerBusyWithBgCopy() == TRUE)
return;
InitWindows(sSoundCheckMenuWindowTemplates);
gTasks[taskId].tState++;
break;
case 2:
ShowBg(0);
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG0_ON |
DISPCNT_OBJ_ON |
DISPCNT_WIN0_ON |
DISPCNT_WIN1_ON);
SetGpuReg(REG_OFFSET_WIN0H, WIN_RANGE(17, 223));
SetGpuReg(REG_OFFSET_WIN0V, WIN_RANGE(1, 31));
gTasks[taskId].func = Task_InitSoundCheckMenu_CreateWindows;
break;
}
}
static void PrintPanTestMenuText(void) // sub_080E94B8
{
u8 lrStr[] = _(" LR");
u8 rlStr[] = _(" RL");
FillWindowPixelRect(WIN_INFO, PIXEL_FILL(1), 100, 14, 3, 28);
PrintSignedNumber(sSoundTestParams[CRY_TEST_VOICE], 100, 14, 3);
switch (gUnknown_08566E58[sSoundTestParams[CRY_TEST_PANPOT]])
{
case 127:
AddTextPrinterParameterized(WIN_INFO, 1, lrStr, 100, 28, TEXT_SPEED_FF, NULL);
break;
case -128:
AddTextPrinterParameterized(WIN_INFO, 1, rlStr, 100, 28, TEXT_SPEED_FF, NULL);
break;
default:
PrintSignedNumber(gUnknown_08566E58[sSoundTestParams[CRY_TEST_PANPOT]], 100, 28, 3);
break;
}
}
static void InitGpuRegs(void) // sub_080E9560
{
DmaClear16(3, VRAM, VRAM_SIZE);
DmaClear32(3, OAM, OAM_SIZE);
DmaClear16(3, PLTT, PLTT_SIZE);
SetGpuReg(REG_OFFSET_DISPCNT, 0);
SetGpuReg(REG_OFFSET_BG0CNT, 0);
SetGpuReg(REG_OFFSET_BG0HOFS, 0);
SetGpuReg(REG_OFFSET_BG0VOFS, 0);
SetGpuReg(REG_OFFSET_BG1CNT, 0);
SetGpuReg(REG_OFFSET_BG1HOFS, 0);
SetGpuReg(REG_OFFSET_BG1VOFS, 0);
SetGpuReg(REG_OFFSET_BG2CNT, 0);
SetGpuReg(REG_OFFSET_BG2HOFS, 0);
SetGpuReg(REG_OFFSET_BG2VOFS, 0);
SetGpuReg(REG_OFFSET_BG3CNT, 0);
SetGpuReg(REG_OFFSET_BG3HOFS, 0);
SetGpuReg(REG_OFFSET_BG3VOFS, 0);
SetGpuReg(REG_OFFSET_WIN0H, 0);
SetGpuReg(REG_OFFSET_WIN0V, 0);
SetGpuReg(REG_OFFSET_WIN1H, 0);
SetGpuReg(REG_OFFSET_WIN1V, 0);
SetGpuReg(REG_OFFSET_WININ, 0);
SetGpuReg(REG_OFFSET_WINOUT, 0);
SetGpuReg(REG_OFFSET_BLDCNT, 0);
SetGpuReg(REG_OFFSET_BLDALPHA, 0);
SetGpuReg(REG_OFFSET_BLDY, 0);
}
static void ClearTasksAndGraphicalStructs(void) // sub_080E96A8
{
ScanlineEffect_Stop();
ResetTasks();
ResetSpriteData();
ResetAllPicSprites();
ResetPaletteFade();
FreeAllSpritePalettes();
}
static void SetupDispcnt(void) // sub_080E96C8
{
SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
DISPCNT_OBJ_1D_MAP |
DISPCNT_BG0_ON |
DISPCNT_OBJ_ON |
DISPCNT_WIN0_ON |
DISPCNT_WIN1_ON);
}
static void PutWindowTilemapAndCopyWindowToVram(u8 windowId) // sub_080E9734
{
PutWindowTilemap(windowId);
CopyWindowToVram(windowId, 3);
}
static void DestroyWindow(u8 windowId) // sub_080E9750
{
FillWindowPixelBuffer(windowId, PIXEL_FILL(0));
ClearWindowTilemap(windowId);
CopyWindowToVram(windowId, 2);
RemoveWindow(windowId);
}
#define SOUND_LIST_BGM \
X(MUS_STOP, "STOP") \
X(MUS_TETSUJI, "MUS-TETSUJI") \
X(MUS_FIELD13, "MUS-FIELD13") \
X(MUS_KACHI22, "MUS-KACHI22") \
X(MUS_KACHI2, "MUS-KACHI2") \
X(MUS_KACHI3, "MUS-KACHI3") \
X(MUS_KACHI5, "MUS-KACHI5") \
X(MUS_PCC, "MUS-PCC") \
X(MUS_NIBI, "MUS-NIBI") \
X(MUS_SUIKUN, "MUS-SUIKUN") \
X(MUS_DOORO1, "MUS-DOORO1") \
X(MUS_DOORO_X1, "MUS-DOORO-X1") \
X(MUS_DOORO_X3, "MUS-DOORO-X3") \
X(MUS_MACHI_S2, "MUS-MACHI-S2") \
X(MUS_MACHI_S4, "MUS-MACHI-S4") \
X(MUS_GIM, "MUS-GIM") \
X(MUS_NAMINORI, "MUS-NAMINORI") \
X(MUS_DAN01, "MUS-DAN01") \
X(MUS_FANFA1, "MUS-FANFA1") \
X(MUS_ME_ASA, "MUS-ME-ASA") \
X(MUS_ME_BACHI, "MUS-ME-BACHI") \
X(MUS_FANFA4, "MUS-FANFA4") \
X(MUS_FANFA5, "MUS-FANFA5") \
X(MUS_ME_WAZA, "MUS-ME-WAZA") \
X(MUS_BIJYUTU, "MUS-BIJYUTU") \
X(MUS_DOORO_X4, "MUS-DOORO-X4") \
X(MUS_FUNE_KAN, "MUS-FUNE-KAN") \
X(MUS_ME_SHINKA, "MUS-ME-SHINKA") \
X(MUS_SHINKA, "MUS-SHINKA") \
X(MUS_ME_WASURE, "MUS-ME-WASURE") \
X(MUS_SYOUJOEYE, "MUS-SYOUJOEYE") \
X(MUS_BOYEYE, "MUS-BOYEYE") \
X(MUS_DAN02, "MUS-DAN02") \
X(MUS_MACHI_S3, "MUS-MACHI-S3") \
X(MUS_ODAMAKI, "MUS-ODAMAKI") \
X(MUS_B_TOWER, "MUS-B-TOWER") \
X(MUS_SWIMEYE, "MUS-SWIMEYE") \
X(MUS_DAN03, "MUS-DAN03") \
X(MUS_ME_KINOMI, "MUS-ME-KINOMI") \
X(MUS_ME_TAMA, "MUS-ME-TAMA") \
X(MUS_ME_B_BIG, "MUS-ME-B-BIG") \
X(MUS_ME_B_SMALL, "MUS-ME-B-SMALL") \
X(MUS_ME_ZANNEN, "MUS-ME-ZANNEN") \
X(MUS_BD_TIME, "MUS-BD-TIME") \
X(MUS_TEST1, "MUS-TEST1") \
X(MUS_TEST2, "MUS-TEST2") \
X(MUS_TEST3, "MUS-TEST3") \
X(MUS_TEST4, "MUS-TEST4") \
X(MUS_TEST, "MUS-TEST") \
X(MUS_GOMACHI0, "MUS-GOMACHI0") \
X(MUS_GOTOWN, "MUS-GOTOWN") \
X(MUS_POKECEN, "MUS-POKECEN") \
X(MUS_NEXTROAD, "MUS-NEXTROAD") \
X(MUS_GRANROAD, "MUS-GRANROAD") \
X(MUS_CYCLING, "MUS-CYCLING") \
X(MUS_FRIENDLY, "MUS-FRIENDLY") \
X(MUS_MISHIRO, "MUS-MISHIRO") \
X(MUS_TOZAN, "MUS-TOZAN") \
X(MUS_GIRLEYE, "MUS-GIRLEYE") \
X(MUS_MINAMO, "MUS-MINAMO") \
X(MUS_ASHROAD, "MUS-ASHROAD") \
X(MUS_EVENT0, "MUS-EVENT0") \
X(MUS_DEEPDEEP, "MUS-DEEPDEEP") \
X(MUS_KACHI1, "MUS-KACHI1") \
X(MUS_TITLE3, "MUS-TITLE3") \
X(MUS_DEMO1, "MUS-DEMO1") \
X(MUS_GIRL_SUP, "MUS-GIRL-SUP") \
X(MUS_HAGESHII, "MUS-HAGESHII") \
X(MUS_KAKKOII, "MUS-KAKKOII") \
X(MUS_KAZANBAI, "MUS-KAZANBAI") \
X(MUS_AQA_0, "MUS-AQA-0") \
X(MUS_TSURETEK, "MUS-TSURETEK") \
X(MUS_BOY_SUP, "MUS-BOY-SUP") \
X(MUS_RAINBOW, "MUS-RAINBOW") \
X(MUS_AYASII, "MUS-AYASII") \
X(MUS_KACHI4, "MUS-KACHI4") \
X(MUS_ROPEWAY, "MUS-ROPEWAY") \
X(MUS_CASINO, "MUS-CASINO") \
X(MUS_HIGHTOWN, "MUS-HIGHTOWN") \
X(MUS_SAFARI, "MUS-SAFARI") \
X(MUS_C_ROAD, "MUS-C-ROAD") \
X(MUS_AJITO, "MUS-AJITO") \
X(MUS_M_BOAT, "MUS-M-BOAT") \
X(MUS_M_DUNGON, "MUS-M-DUNGON") \
X(MUS_FINECITY, "MUS-FINECITY") \
X(MUS_MACHUPI, "MUS-MACHUPI") \
X(MUS_P_SCHOOL, "MUS-P-SCHOOL") \
X(MUS_DENDOU, "MUS-DENDOU") \
X(MUS_TONEKUSA, "MUS-TONEKUSA") \
X(MUS_MABOROSI, "MUS-MABOROSI") \
X(MUS_CON_FAN, "MUS-CON-FAN") \
X(MUS_CONTEST0, "MUS-CONTEST0") \
X(MUS_MGM0, "MUS-MGM0") \
X(MUS_T_BATTLE, "MUS-T-BATTLE") \
X(MUS_OOAME, "MUS-OOAME") \
X(MUS_HIDERI, "MUS-HIDERI") \
X(MUS_RUNECITY, "MUS-RUNECITY") \
X(MUS_CON_K, "MUS-CON-K") \
X(MUS_EIKOU_R, "MUS-EIKOU-R") \
X(MUS_KARAKURI, "MUS-KARAKURI") \
X(MUS_HUTAGO, "MUS-HUTAGO") \
X(MUS_SITENNOU, "MUS-SITENNOU") \
X(MUS_YAMA_EYE, "MUS-YAMA-EYE") \
X(MUS_CONLOBBY, "MUS-CONLOBBY") \
X(MUS_INTER_V, "MUS-INTER-V") \
X(MUS_DAIGO, "MUS-DAIGO") \
X(MUS_THANKFOR, "MUS-THANKFOR") \
X(MUS_END, "MUS-END") \
X(MUS_B_FRONTIER, "MUS-B-FRONTIER") \
X(MUS_B_ARENA, "MUS-B-ARENA") \
X(MUS_ME_POINTGET, "MUS-ME-POINTGET") \
X(MUS_ME_TORE_EYE, "MUS-ME-TORE-EYE") \
X(MUS_PYRAMID, "MUS-PYRAMID") \
X(MUS_PYRAMID_TOP, "MUS-PYRAMID-TOP") \
X(MUS_B_PALACE, "MUS-B-PALACE") \
X(MUS_REKKUU_KOURIN, "MUS-REKKUU-KOURIN") \
X(MUS_SATTOWER, "MUS-SATTOWER") \
X(MUS_ME_SYMBOLGET, "MUS-ME-SYMBOLGET") \
X(MUS_B_DOME, "MUS-B-DOME") \
X(MUS_B_TUBE, "MUS-B-TUBE") \
X(MUS_B_FACTORY, "MUS-B-FACTORY") \
X(MUS_VS_REKKU, "MUS-VS-REKKU") \
X(MUS_VS_FRONT, "MUS-VS-FRONT") \
X(MUS_VS_MEW, "MUS-VS-MEW") \
X(MUS_B_DOME1, "MUS-B-DOME1") \
X(MUS_BATTLE27, "MUS-BATTLE27") \
X(MUS_BATTLE31, "MUS-BATTLE31") \
X(MUS_BATTLE20, "MUS-BATTLE20") \
X(MUS_BATTLE32, "MUS-BATTLE32") \
X(MUS_BATTLE33, "MUS-BATTLE33") \
X(MUS_BATTLE36, "MUS-BATTLE36") \
X(MUS_BATTLE34, "MUS-BATTLE34") \
X(MUS_BATTLE35, "MUS-BATTLE35") \
X(MUS_BATTLE38, "MUS-BATTLE38") \
X(MUS_BATTLE30, "MUS-BATTLE30") \
X(MUS_RG_ANNAI, "MUS-RG-ANNAI") \
X(MUS_RG_SLOT, "MUS-RG-SLOT") \
X(MUS_RG_AJITO, "MUS-RG-AJITO") \
X(MUS_RG_GYM, "MUS-RG-GYM") \
X(MUS_RG_PURIN, "MUS-RG-PURIN") \
X(MUS_RG_DEMO, "MUS-RG-DEMO") \
X(MUS_RG_TITLE, "MUS-RG-TITLE") \
X(MUS_RG_GUREN, "MUS-RG-GUREN") \
X(MUS_RG_SHION, "MUS-RG-SHION") \
X(MUS_RG_KAIHUKU, "MUS-RG-KAIHUKU") \
X(MUS_RG_CYCLING, "MUS-RG-CYCLING") \
X(MUS_RG_ROCKET, "MUS-RG-ROCKET") \
X(MUS_RG_SHOUJO, "MUS-RG-SHOUJO") \
X(MUS_RG_SHOUNEN, "MUS-RG-SHOUNEN") \
X(MUS_RG_DENDOU, "MUS-RG-DENDOU") \
X(MUS_RG_T_MORI, "MUS-RG-T-MORI") \
X(MUS_RG_OTSUKIMI, "MUS-RG-OTSUKIMI") \
X(MUS_RG_POKEYASHI, "MUS-RG-POKEYASHI") \
X(MUS_RG_ENDING, "MUS-RG-ENDING") \
X(MUS_RG_LOAD01, "MUS-RG-LOAD01") \
X(MUS_RG_OPENING, "MUS-RG-OPENING") \
X(MUS_RG_LOAD02, "MUS-RG-LOAD02") \
X(MUS_RG_LOAD03, "MUS-RG-LOAD03") \
X(MUS_RG_CHAMP_R, "MUS-RG-CHAMP-R") \
X(MUS_RG_VS_GYM, "MUS-RG-VS-GYM") \
X(MUS_RG_VS_TORE, "MUS-RG-VS-TORE") \
X(MUS_RG_VS_YASEI, "MUS-RG-VS-YASEI") \
X(MUS_RG_VS_LAST, "MUS-RG-VS-LAST") \
X(MUS_RG_MASARA, "MUS-RG-MASARA") \
X(MUS_RG_KENKYU, "MUS-RG-KENKYU") \
X(MUS_RG_OHKIDO, "MUS-RG-OHKIDO") \
X(MUS_RG_POKECEN, "MUS-RG-POKECEN") \
X(MUS_RG_SANTOAN, "MUS-RG-SANTOAN") \
X(MUS_RG_NAMINORI, "MUS-RG-NAMINORI") \
X(MUS_RG_P_TOWER, "MUS-RG-P-TOWER") \
X(MUS_RG_SHIRUHU, "MUS-RG-SHIRUHU") \
X(MUS_RG_HANADA, "MUS-RG-HANADA") \
X(MUS_RG_TAMAMUSI, "MUS-RG-TAMAMUSI") \
X(MUS_RG_WIN_TRE, "MUS-RG-WIN-TRE") \
X(MUS_RG_WIN_YASEI, "MUS-RG-WIN-YASEI") \
X(MUS_RG_WIN_GYM, "MUS-RG-WIN-GYM") \
X(MUS_RG_KUCHIBA, "MUS-RG-KUCHIBA") \
X(MUS_RG_NIBI, "MUS-RG-NIBI") \
X(MUS_RG_RIVAL1, "MUS-RG-RIVAL1") \
X(MUS_RG_RIVAL2, "MUS-RG-RIVAL2") \
X(MUS_RG_FAN2, "MUS-RG-FAN2") \
X(MUS_RG_FAN5, "MUS-RG-FAN5") \
X(MUS_RG_FAN6, "MUS-RG-FAN6") \
X(MUS_ME_RG_PHOTO, "MUS-ME-RG-PHOTO") \
X(MUS_RG_TITLEROG, "MUS-RG-TITLEROG") \
X(MUS_RG_GET_YASEI, "MUS-RG-GET-YASEI") \
X(MUS_RG_SOUSA, "MUS-RG-SOUSA") \
X(MUS_RG_SEKAIKAN, "MUS-RG-SEKAIKAN") \
X(MUS_RG_SEIBETU, "MUS-RG-SEIBETU") \
X(MUS_RG_JUMP, "MUS-RG-JUMP") \
X(MUS_RG_UNION, "MUS-RG-UNION") \
X(MUS_RG_NETWORK, "MUS-RG-NETWORK") \
X(MUS_RG_OKURIMONO, "MUS-RG-OKURIMONO") \
X(MUS_RG_KINOMIKUI, "MUS-RG-KINOMIKUI") \
X(MUS_RG_NANADUNGEON, "MUS-RG-NANADUNGEON") \
X(MUS_RG_OSHIE_TV, "MUS-RG-OSHIE-TV") \
X(MUS_RG_NANASHIMA, "MUS-RG-NANASHIMA") \
X(MUS_RG_NANAISEKI, "MUS-RG-NANAISEKI") \
X(MUS_RG_NANA123, "MUS-RG-NANA123") \
X(MUS_RG_NANA45, "MUS-RG-NANA45") \
X(MUS_RG_NANA67, "MUS-RG-NANA67") \
X(MUS_RG_POKEFUE, "MUS-RG-POKEFUE") \
X(MUS_RG_VS_DEO, "MUS-RG-VS-DEO") \
X(MUS_RG_VS_MYU2, "MUS-RG-VS-MYU2") \
X(MUS_RG_VS_DEN, "MUS-RG-VS-DEN") \
X(MUS_RG_EXEYE, "MUS-RG-EXEYE") \
X(MUS_RG_DEOEYE, "MUS-RG-DEOEYE") \
X(MUS_RG_T_TOWER, "MUS-RG-T-TOWER") \
X(MUS_RG_SLOWMASARA, "MUS-RG-SLOWMASARA") \
X(MUS_RG_TVNOIZE, "MUS-RG-TVNOIZE") \
X(PH_TRAP_BLEND, "PH-TRAP-BLEND") \
X(PH_TRAP_HELD, "PH-TRAP-HELD") \
X(PH_TRAP_SOLO, "PH-TRAP-SOLO") \
X(PH_FACE_BLEND, "PH-FACE-BLEND") \
X(PH_FACE_HELD, "PH-FACE-HELD") \
X(PH_FACE_SOLO, "PH-FACE-SOLO") \
X(PH_CLOTH_BLEND, "PH-CLOTH-BLEND") \
X(PH_CLOTH_HELD, "PH-CLOTH-HELD") \
X(PH_CLOTH_SOLO, "PH-CLOTH-SOLO") \
X(PH_DRESS_BLEND, "PH-DRESS-BLEND") \
X(PH_DRESS_HELD, "PH-DRESS-HELD") \
X(PH_DRESS_SOLO, "PH-DRESS-SOLO") \
X(PH_FLEECE_BLEND, "PH-FLEECE-BLEND") \
X(PH_FLEECE_HELD, "PH-FLEECE-HELD") \
X(PH_FLEECE_SOLO, "PH-FLEECE-SOLO") \
X(PH_KIT_BLEND, "PH-KIT-BLEND") \
X(PH_KIT_HELD, "PH-KIT-HELD") \
X(PH_KIT_SOLO, "PH-KIT-SOLO") \
X(PH_PRICE_BLEND, "PH-PRICE-BLEND") \
X(PH_PRICE_HELD, "PH-PRICE-HELD") \
X(PH_PRICE_SOLO, "PH-PRICE-SOLO") \
X(PH_LOT_BLEND, "PH-LOT-BLEND") \
X(PH_LOT_HELD, "PH-LOT-HELD") \
X(PH_LOT_SOLO, "PH-LOT-SOLO") \
X(PH_GOAT_BLEND, "PH-GOAT-BLEND") \
X(PH_GOAT_HELD, "PH-GOAT-HELD") \
X(PH_GOAT_SOLO, "PH-GOAT-SOLO") \
X(PH_THOUGHT_BLEND, "PH-THOUGHT-BLEND") \
X(PH_THOUGHT_HELD, "PH-THOUGHT-HELD") \
X(PH_THOUGHT_SOLO, "PH-THOUGHT-SOLO") \
X(PH_CHOICE_BLEND, "PH-CHOICE-BLEND") \
X(PH_CHOICE_HELD, "PH-CHOICE-HELD") \
X(PH_CHOICE_SOLO, "PH-CHOICE-SOLO") \
X(PH_MOUTH_BLEND, "PH-MOUTH-BLEND") \
X(PH_MOUTH_HELD, "PH-MOUTH-HELD") \
X(PH_MOUTH_SOLO, "PH-MOUTH-SOLO") \
X(PH_FOOT_BLEND, "PH-FOOT-BLEND") \
X(PH_FOOT_HELD, "PH-FOOT-HELD") \
X(PH_FOOT_SOLO, "PH-FOOT-SOLO") \
X(PH_GOOSE_BLEND, "PH-GOOSE-BLEND") \
X(PH_GOOSE_HELD, "PH-GOOSE-HELD") \
X(PH_GOOSE_SOLO, "PH-GOOSE-SOLO") \
X(PH_STRUT_BLEND, "PH-STRUT-BLEND") \
X(PH_STRUT_HELD, "PH-STRUT-HELD") \
X(PH_STRUT_SOLO, "PH-STRUT-SOLO") \
X(PH_CURE_BLEND, "PH-CURE-BLEND") \
X(PH_CURE_HELD, "PH-CURE-HELD") \
X(PH_CURE_SOLO, "PH-CURE-SOLO") \
X(PH_NURSE_BLEND, "PH-NURSE-BLEND") \
X(PH_NURSE_HELD, "PH-NURSE-HELD") \
X(PH_NURSE_SOLO, "PH-NURSE-SOLO")
#define SOUND_LIST_SE \
X(SE_STOP, "STOP") \
X(SE_KAIFUKU, "SE-KAIFUKU") \
X(SE_PC_LOGIN, "SE-PC-LOGIN") \
X(SE_PC_OFF, "SE-PC-OFF") \
X(SE_PC_ON, "SE-PC-ON") \
X(SE_SELECT, "SE-SELECT") \
X(SE_WIN_OPEN, "SE-WIN-OPEN") \
X(SE_WALL_HIT, "SE-WALL-HIT") \
X(SE_DOOR, "SE-DOOR") \
X(SE_KAIDAN, "SE-KAIDAN") \
X(SE_DANSA, "SE-DANSA") \
X(SE_JITENSYA, "SE-JITENSYA") \
X(SE_KOUKA_L, "SE-KOUKA-L") \
X(SE_KOUKA_M, "SE-KOUKA-M") \
X(SE_KOUKA_H, "SE-KOUKA-H") \
X(SE_BOWA2, "SE-BOWA2") \
X(SE_POKE_DEAD, "SE-POKE-DEAD") \
X(SE_NIGERU, "SE-NIGERU") \
X(SE_JIDO_DOA, "SE-JIDO-DOA") \
X(SE_NAMINORI, "SE-NAMINORI") \
X(SE_BAN, "SE-BAN") \
X(SE_PIN, "SE-PIN") \
X(SE_BOO, "SE-BOO") \
X(SE_BOWA, "SE-BOWA") \
X(SE_JYUNI, "SE-JYUNI") \
X(SE_A, "SE-A") \
X(SE_I, "SE-I") \
X(SE_U, "SE-U") \
X(SE_E, "SE-E") \
X(SE_O, "SE-O") \
X(SE_N, "SE-N") \
X(SE_SEIKAI, "SE-SEIKAI") \
X(SE_HAZURE, "SE-HAZURE") \
X(SE_EXP, "SE-EXP") \
X(SE_JITE_PYOKO, "SE-JITE-PYOKO") \
X(SE_MU_PACHI, "SE-MU-PACHI") \
X(SE_TK_KASYA, "SE-TK-KASYA") \
X(SE_FU_ZAKU, "SE-FU-ZAKU") \
X(SE_FU_ZAKU2, "SE-FU-ZAKU2") \
X(SE_FU_ZUZUZU, "SE-FU-ZUZUZU") \
X(SE_RU_GASHIN, "SE-RU-GASHIN") \
X(SE_RU_GASYAN, "SE-RU-GASYAN") \
X(SE_RU_BARI, "SE-RU-BARI") \
X(SE_RU_HYUU, "SE-RU-HYUU") \
X(SE_KI_GASYAN, "SE-KI-GASYAN") \
X(SE_TK_WARPIN, "SE-TK-WARPIN") \
X(SE_TK_WARPOUT, "SE-TK-WARPOUT") \
X(SE_TU_SAA, "SE-TU-SAA") \
X(SE_HI_TURUN, "SE-HI-TURUN") \
X(SE_TRACK_MOVE, "SE-TRACK-MOVE") \
X(SE_TRACK_STOP, "SE-TRACK-STOP") \
X(SE_TRACK_HAIKI, "SE-TRACK-HAIKI") \
X(SE_TRACK_DOOR, "SE-TRACK-DOOR") \
X(SE_MOTER, "SE-MOTER") \
X(SE_CARD, "SE-CARD") \
X(SE_SAVE, "SE-SAVE") \
X(SE_KON, "SE-KON") \
X(SE_KON2, "SE-KON2") \
X(SE_KON3, "SE-KON3") \
X(SE_KON4, "SE-KON4") \
X(SE_SUIKOMU, "SE-SUIKOMU") \
X(SE_NAGERU, "SE-NAGERU") \
X(SE_TOY_C, "SE-TOY-C") \
X(SE_TOY_D, "SE-TOY-D") \
X(SE_TOY_E, "SE-TOY-E") \
X(SE_TOY_F, "SE-TOY-F") \
X(SE_TOY_G, "SE-TOY-G") \
X(SE_TOY_A, "SE-TOY-A") \
X(SE_TOY_B, "SE-TOY-B") \
X(SE_TOY_C1, "SE-TOY-C1") \
X(SE_MIZU, "SE-MIZU") \
X(SE_HASHI, "SE-HASHI") \
X(SE_DAUGI, "SE-DAUGI") \
X(SE_PINPON, "SE-PINPON") \
X(SE_FUUSEN1, "SE-FUUSEN1") \
X(SE_FUUSEN2, "SE-FUUSEN2") \
X(SE_FUUSEN3, "SE-FUUSEN3") \
X(SE_TOY_KABE, "SE-TOY-KABE") \
X(SE_TOY_DANGO, "SE-TOY-DANGO") \
X(SE_DOKU, "SE-DOKU") \
X(SE_ESUKA, "SE-ESUKA") \
X(SE_T_AME, "SE-T-AME") \
X(SE_T_AME_E, "SE-T-AME-E") \
X(SE_T_OOAME, "SE-T-OOAME") \
X(SE_T_OOAME_E, "SE-T-OOAME-E") \
X(SE_T_KOAME, "SE-T-KOAME") \
X(SE_T_KOAME_E, "SE-T-KOAME-E") \
X(SE_T_KAMI, "SE-T-KAMI") \
X(SE_T_KAMI2, "SE-T-KAMI2") \
X(SE_ELEBETA, "SE-ELEBETA") \
X(SE_HINSI, "SE-HINSI") \
X(SE_EXPMAX, "SE-EXPMAX") \
X(SE_TAMAKORO, "SE-TAMAKORO") \
X(SE_TAMAKORO_E, "SE-TAMAKORO-E") \
X(SE_BASABASA, "SE-BASABASA") \
X(SE_REGI, "SE-REGI") \
X(SE_C_GAJI, "SE-C-GAJI") \
X(SE_C_MAKU_U, "SE-C-MAKU-U") \
X(SE_C_MAKU_D, "SE-C-MAKU-D") \
X(SE_C_PASI, "SE-C-PASI") \
X(SE_C_SYU, "SE-C-SYU") \
X(SE_C_PIKON, "SE-C-PIKON") \
X(SE_REAPOKE, "SE-REAPOKE") \
X(SE_OP_BASYU, "SE-OP-BASYU") \
X(SE_BT_START, "SE-BT-START") \
X(SE_DENDOU, "SE-DENDOU") \
X(SE_JIHANKI, "SE-JIHANKI") \
X(SE_TAMA, "SE-TAMA") \
X(SE_Z_SCROLL, "SE-Z-SCROLL") \
X(SE_Z_PAGE, "SE-Z-PAGE") \
X(SE_PN_ON, "SE-PN-ON") \
X(SE_PN_OFF, "SE-PN-OFF") \
X(SE_Z_SEARCH, "SE-Z-SEARCH") \
X(SE_TAMAGO, "SE-TAMAGO") \
X(SE_TB_START, "SE-TB-START") \
X(SE_TB_KON, "SE-TB-KON") \
X(SE_TB_KARA, "SE-TB-KARA") \
X(SE_BIDORO, "SE-BIDORO") \
X(SE_W085, "SE-W085") \
X(SE_W085B, "SE-W085B") \
X(SE_W231, "SE-W231") \
X(SE_W171, "SE-W171") \
X(SE_W233, "SE-W233") \
X(SE_W233B, "SE-W233B") \
X(SE_W145, "SE-W145") \
X(SE_W145B, "SE-W145B") \
X(SE_W145C, "SE-W145C") \
X(SE_W240, "SE-W240") \
X(SE_W015, "SE-W015") \
X(SE_W081, "SE-W081") \
X(SE_W081B, "SE-W081B") \
X(SE_W088, "SE-W088") \
X(SE_W016, "SE-W016") \
X(SE_W016B, "SE-W016B") \
X(SE_W003, "SE-W003") \
X(SE_W104, "SE-W104") \
X(SE_W013, "SE-W013") \
X(SE_W196, "SE-W196") \
X(SE_W086, "SE-W086") \
X(SE_W004, "SE-W004") \
X(SE_W025, "SE-W025") \
X(SE_W025B, "SE-W025B") \
X(SE_W152, "SE-W152") \
X(SE_W026, "SE-W026") \
X(SE_W172, "SE-W172") \
X(SE_W172B, "SE-W172B") \
X(SE_W053, "SE-W053") \
X(SE_W007, "SE-W007") \
X(SE_W092, "SE-W092") \
X(SE_W221, "SE-W221") \
X(SE_W221B, "SE-W221B") \
X(SE_W052, "SE-W052") \
X(SE_W036, "SE-W036") \
X(SE_W059, "SE-W059") \
X(SE_W059B, "SE-W059B") \
X(SE_W010, "SE-W010") \
X(SE_W011, "SE-W011") \
X(SE_W017, "SE-W017") \
X(SE_W019, "SE-W019") \
X(SE_W028, "SE-W028") \
X(SE_W013B, "SE-W013B") \
X(SE_W044, "SE-W044") \
X(SE_W029, "SE-W029") \
X(SE_W057, "SE-W057") \
X(SE_W056, "SE-W056") \
X(SE_W250, "SE-W250") \
X(SE_W030, "SE-W030") \
X(SE_W039, "SE-W039") \
X(SE_W054, "SE-W054") \
X(SE_W077, "SE-W077") \
X(SE_W020, "SE-W020") \
X(SE_W082, "SE-W082") \
X(SE_W047, "SE-W047") \
X(SE_W195, "SE-W195") \
X(SE_W006, "SE-W006") \
X(SE_W091, "SE-W091") \
X(SE_W146, "SE-W146") \
X(SE_W120, "SE-W120") \
X(SE_W153, "SE-W153") \
X(SE_W071B, "SE-W071B") \
X(SE_W071, "SE-W071") \
X(SE_W103, "SE-W103") \
X(SE_W062, "SE-W062") \
X(SE_W062B, "SE-W062B") \
X(SE_W048, "SE-W048") \
X(SE_W187, "SE-W187") \
X(SE_W118, "SE-W118") \
X(SE_W155, "SE-W155") \
X(SE_W122, "SE-W122") \
X(SE_W060, "SE-W060") \
X(SE_W185, "SE-W185") \
X(SE_W014, "SE-W014") \
X(SE_W043, "SE-W043") \
X(SE_W207, "SE-W207") \
X(SE_W207B, "SE-W207B") \
X(SE_W215, "SE-W215") \
X(SE_W109, "SE-W109") \
X(SE_W173, "SE-W173") \
X(SE_W280, "SE-W280") \
X(SE_W202, "SE-W202") \
X(SE_W060B, "SE-W060B") \
X(SE_W076, "SE-W076") \
X(SE_W080, "SE-W080") \
X(SE_W100, "SE-W100") \
X(SE_W107, "SE-W107") \
X(SE_W166, "SE-W166") \
X(SE_W129, "SE-W129") \
X(SE_W115, "SE-W115") \
X(SE_W112, "SE-W112") \
X(SE_W197, "SE-W197") \
X(SE_W199, "SE-W199") \
X(SE_W236, "SE-W236") \
X(SE_W204, "SE-W204") \
X(SE_W268, "SE-W268") \
X(SE_W070, "SE-W070") \
X(SE_W063, "SE-W063") \
X(SE_W127, "SE-W127") \
X(SE_W179, "SE-W179") \
X(SE_W151, "SE-W151") \
X(SE_W201, "SE-W201") \
X(SE_W161, "SE-W161") \
X(SE_W161B, "SE-W161B") \
X(SE_W227, "SE-W227") \
X(SE_W227B, "SE-W227B") \
X(SE_W226, "SE-W226") \
X(SE_W208, "SE-W208") \
X(SE_W213, "SE-W213") \
X(SE_W213B, "SE-W213B") \
X(SE_W234, "SE-W234") \
X(SE_W260, "SE-W260") \
X(SE_W328, "SE-W328") \
X(SE_W320, "SE-W320") \
X(SE_W255, "SE-W255") \
X(SE_W291, "SE-W291") \
X(SE_W089, "SE-W089") \
X(SE_W239, "SE-W239") \
X(SE_W230, "SE-W230") \
X(SE_W281, "SE-W281") \
X(SE_W327, "SE-W327") \
X(SE_W287, "SE-W287") \
X(SE_W257, "SE-W257") \
X(SE_W253, "SE-W253") \
X(SE_W258, "SE-W258") \
X(SE_W322, "SE-W322") \
X(SE_W298, "SE-W298") \
X(SE_W287B, "SE-W287B") \
X(SE_W114, "SE-W114") \
X(SE_W063B, "SE-W063B") \
X(SE_RG_W_DOOR, "SE-RG-W-DOOR") \
X(SE_RG_CARD1, "SE-RG-CARD1") \
X(SE_RG_CARD2, "SE-RG-CARD2") \
X(SE_RG_CARD3, "SE-RG-CARD3") \
X(SE_RG_BAG1, "SE-RG-BAG1") \
X(SE_RG_BAG2, "SE-RG-BAG2") \
X(SE_RG_GETTING, "SE-RG-GETTING") \
X(SE_RG_SHOP, "SE-RG-SHOP") \
X(SE_RG_KITEKI, "SE-RG-KITEKI") \
X(SE_RG_HELP_OP, "SE-RG-HELP-OP") \
X(SE_RG_HELP_CL, "SE-RG-HELP-CL") \
X(SE_RG_HELP_NG, "SE-RG-HELP-NG") \
X(SE_RG_DEOMOV, "SE-RG-DEOMOV") \
X(SE_RG_EXCELLENT, "SE-RG-EXCELLENT") \
X(SE_RG_NAWAMISS, "SE-RG-NAWAMISS") \
X(SE_TOREEYE, "SE-TOREEYE") \
X(SE_TOREOFF, "SE-TOREOFF") \
X(SE_HANTEI1, "SE-HANTEI1") \
X(SE_HANTEI2, "SE-HANTEI2") \
X(SE_CURTAIN, "SE-CURTAIN") \
X(SE_CURTAIN1, "SE-CURTAIN1") \
X(SE_USSOKI, "SE-USSOKI")
// 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
#undef tWindowSelected
#undef tBgmIndex
#undef tSeIndex
#undef tBgmIndexOld
#undef tSeIndexOld
#undef tWhichSubmenu
#undef tState
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment