#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" #include "ewram.h" extern u8 gUnknown_0203856C; 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 bool8 gReceivedRemoteLinkPlayers; 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); // unused const u8 gText_Unused83C9150[] = _("テストです"); // "test" const u8 gMatsudaDebugMenu_ActionContestText[] = _("Contest"); const u8 gMatsudaDebugMenu_ActionContestResultsText[] = _("Contest results"); // unused const u8 gMatsudaDebugMenu_ActionChangePerimeterText[] = _("パラメータへんこう"); // "Change parameter" // unused const u8 gMatsudaDebugMenu_ActionChangeMoveText[] = _("わざ へんこう"); // "Change move" const u8 gMatsudaDebugMenu_ActionContestCommText[] = _("Contest (comm.)"); const u8 gMatsudaDebugMenu_ActionCommTestText[] = _("Init comm. data"); const u8 gMatsudaDebugMenu_ActionSetHighScoreText[] = _("Set highest score"); const u8 gMatsudaDebugMenu_ActionResetHighScoreText[] = _("Reset highest score"); const u8 gMatsudaDebugMenu_ActionSetAllArtMuseumText[] = _("Set all art museum items"); const struct MenuAction gMatsudaDebugMenuActions[] = { {gMatsudaDebugMenu_ActionContestText, MatsudaDebugMenu_Contest}, {gMatsudaDebugMenu_ActionContestResultsText, MatsudaDebugMenu_ContestResults}, {gMatsudaDebugMenu_ActionContestCommText, MatsudaDebugMenu_ContestComm}, {gMatsudaDebugMenu_ActionCommTestText, MatsudaDebugMenu_CommTest}, {gMatsudaDebugMenu_ActionSetHighScoreText, MatsudaDebugMenu_SetHighScore}, {gMatsudaDebugMenu_ActionResetHighScoreText, MatsudaDebugMenu_ResetHighScore}, {gMatsudaDebugMenu_ActionSetAllArtMuseumText, MatsudaDebugMenu_SetArtMuseumItems}, }; const u8 gMatsudaDebugMenu_UnknownByteArray[] = {0xFC, 0x02, 0x0F, 0x00, 0xFF}; const u8 Unknown_083C922D[] = INCBIN_U8("graphics/unknown/ball.4bpp"); const u16 Unknown_083C924E[] = INCBIN_U16("graphics/unknown/ball.gbapal"); const u8 gUnknown_083C926E[][2] = { {2, 0}, {17, 0}, {2, 2}, {17, 2}, }; const u8 gMatsudaDebugMenuContestTopLeft[][2] = { {0, 6}, {15, 6}, {0, 8}, {15, 8}, {0, 10}, {15, 10}, }; const u8 gUnknown_083C9282[] = { // TODO: 2d array? 7, 6, 22, 6, 7, 8, 22, 8, 7, 10, 22, 10, }; const u8 gUnknown_083C928E[][2] = { {2, 14}, {17, 14}, {2, 16}, {17, 16}, }; const u8 gUnknown_083C9296[] = {0x08, 0x80, 0x08, 0x80, 0x10, 0x10, 0x30, 0xA8, 0x30, 0xA8, 0x30, 0xA8, 0x08, 0x80, 0x08, 0x80, 0x10, 0x88}; const u8 gUnknown_083C92A8[] = {0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x78, 0x88, 0x98}; const struct SpriteSheet gUnknown_083C92B4[] = {Unknown_083C922D, 32, 0x4B0}; const struct SpritePalette gUnknown_083C92BC[] = {Unknown_083C924E, 0x4B0}; const struct OamData gOamData_83C92C4 = { .y = 0, .affineMode = 0, .objMode = 0, .mosaic = 0, .bpp = 0, .shape = 0, .x = 0, .matrixNum = 0, .size = 0, .tileNum = 0, .priority = 0, .paletteNum = 0, .affineParam = 0, }; const struct SpriteTemplate gSpriteTemplate_83C92CC = { .tileTag = 1200, .paletteTag = 1200, .oam = &gOamData_83C92C4, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = sub_80AA754, }; static void (* const gUnknown_083C92E4[][2])(struct Sprite *, s8) = { {sub_80AA8C8, sub_80AA8D8}, {sub_80AA8E8, sub_80AA8F8}, {sub_80AAC5C, sub_80AAC5C}, {sub_80AA930, sub_80AA974}, {sub_80AA9B8, sub_80AA9FC}, {sub_80AAA40, sub_80AAA84}, {sub_80AAAF0, sub_80AAB30}, {sub_80AAB70, sub_80AABB0}, {sub_80AABF0, sub_80AAD44}, }; static const u8 gMatsudaDebugMenu_StartText[] = _("{COLOR CYAN}{HIGHLIGHT RED}"); static const u8 gMatsudaDebugMenu_StartJapText[] = _("かいし"); // because StartText is only called by StringCopy, this part appears to be unused. static const u8 gMatsudaDebugMenu_GoBackText[] = _("もどる"); #ifdef GERMAN static const u8 gMatsudaDebugMenu_BattlePointsText[] = _("{COLOR MAGENTA}BP,"); #else static const u8 gMatsudaDebugMenu_BattlePointsText[] = _("{COLOR MAGENTA}BP."); #endif static const u8 MatsudaDebugMenuText_Cool[] = _("かっこよさ"); // cool static const u8 MatsudaDebugMenuText_Cute[] = _("かわいさ"); // cute static const u8 MatsudaDebugMenuText_Beauty[] = _("うつくしさ"); // beauty static const u8 MatsudaDebugMenuText_Smart[] = _("かしこさ"); // smart static const u8 MatsudaDebugMenuText_Tough[] = _("たくましさ"); // tough static const u8 MatsudaDebugMenuText_Sheen[] = _("けづや"); // sheen static const u8 *const gMatsudaDebugMenuTextList1[] = { MatsudaDebugMenuText_Cool, MatsudaDebugMenuText_Cute, MatsudaDebugMenuText_Beauty, MatsudaDebugMenuText_Smart, MatsudaDebugMenuText_Tough, MatsudaDebugMenuText_Sheen, }; static const u8 MatsudaDebugMenuText_CoolContest[] = _("かっこよさコンテスト"); static const u8 MatsudaDebugMenuText_BeautyContest[] = _("うつくしさコンテスト"); static const u8 MatsudaDebugMenuText_CuteContest[] = _("かわいさコンテスト "); static const u8 MatsudaDebugMenuText_SmartContest[] = _("かしこさコンテスト "); static const u8 MatsudaDebugMenuText_ToughContest[] = _("たくましさコンテスト"); static const u8 *const gMatsudaDebugMenuTextList2[] = { MatsudaDebugMenuText_CoolContest, MatsudaDebugMenuText_BeautyContest, MatsudaDebugMenuText_CuteContest, MatsudaDebugMenuText_SmartContest, MatsudaDebugMenuText_ToughContest, }; static const u8 MatsudaDebugMenuText_Fallarbor[] = _("ハジツゲ/ノーマル"); // Fallarbor / Normal static const u8 MatsudaDebugMenuText_Verdanturf[] = _("シダケ/スーパー "); // Verdanturf / Super static const u8 MatsudaDebugMenuText_Slateport[] = _("カイナ/ハイパー "); // Slateport / Hyper static const u8 MatsudaDebugMenuText_Lilycove[] = _("ミナモ/マスター "); // Lilycove / Master static const u8 *const gMatsudaDebugMenuTextList3[] = { MatsudaDebugMenuText_Fallarbor, MatsudaDebugMenuText_Verdanturf, MatsudaDebugMenuText_Slateport, MatsudaDebugMenuText_Lilycove, }; static const struct OamData gUnknown_083C9400 = { .y = 0, .affineMode = 0, .objMode = 0, .mosaic = 0, .bpp = 0, .shape = 1, .x = 0, .matrixNum = 0, .size = 1, .tileNum = 1023, .priority = 0, .paletteNum = 15, .affineParam = 0, }; 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; } } u8 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(); } } u8 MatsudaDebugMenu_Contest(void) { gIsLinkContest = 0; sub_80AA10C(); return 0; } u8 MatsudaDebugMenu_ContestComm(void) { sub_80AA10C(); return 0; } u8 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].data[0] = 1; gSprites[spriteId].data[1] = 1; gSprites[spriteId].data[2] = 3; gSprites[spriteId].data[3] = 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(gSharedMem, gMatsudaDebugMenu_StartText); StringAppend(gSharedMem, gContestMons[var].trainerName); for (i = 0; i < 4; i++) { if (var == i) sub_8003460(&gMenuWindow, gSharedMem, 10 * i + 2, gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); else sub_8003460(&gMenuWindow, gContestMons[i].trainerName, 10 * i + 2, gUnknown_083C926E[i][0], gUnknown_083C926E[i][1]); } } static void sub_80AA340(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].cool, STR_CONV_MODE_RIGHT_ALIGN, 3); sub_8003460(&gMenuWindow, gSharedMem, 0x66, gUnknown_083C9282[0], gUnknown_083C9282[1]); } static void sub_80AA388(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].cute, STR_CONV_MODE_RIGHT_ALIGN, 3); sub_8003460(&gMenuWindow, gSharedMem, 0x6C, gUnknown_083C9282[2], gUnknown_083C9282[3]); } static void sub_80AA3D0(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].beauty, STR_CONV_MODE_RIGHT_ALIGN, 3); sub_8003460(&gMenuWindow, gSharedMem, 0x72, gUnknown_083C9282[4], gUnknown_083C9282[5]); } static void sub_80AA418(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].smart, STR_CONV_MODE_RIGHT_ALIGN, 3); sub_8003460(&gMenuWindow, gSharedMem, 0x78, gUnknown_083C9282[6], gUnknown_083C9282[7]); } static void sub_80AA460(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].tough, STR_CONV_MODE_RIGHT_ALIGN, 3); sub_8003460(&gMenuWindow, gSharedMem, 0x7E, gUnknown_083C9282[8], gUnknown_083C9282[9]); } static void sub_80AA4A8(u8 var) { ConvertIntToDecimalStringN(gSharedMem, gContestMons[var].sheen, STR_CONV_MODE_RIGHT_ALIGN, 3); sub_8003460(&gMenuWindow, gSharedMem, 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(gSharedMem, var, STR_CONV_MODE_RIGHT_ALIGN, 3); sub_8003460(&gMenuWindow, gSharedMem, 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, &gContestMons[gContestPlayerMonIndex].moves[0]); SetMonData(&gPlayerParty[0], MON_DATA_MOVE2, &gContestMons[gContestPlayerMonIndex].moves[1]); SetMonData(&gPlayerParty[0], MON_DATA_MOVE3, &gContestMons[gContestPlayerMonIndex].moves[2]); SetMonData(&gPlayerParty[0], MON_DATA_MOVE4, &gContestMons[gContestPlayerMonIndex].moves[3]); } void sub_80AA754(struct Sprite *sprite) { switch (gMain.newAndRepeatedKeys) { case DPAD_RIGHT: case DPAD_LEFT: sprite->data[0] ^= 1; break; case DPAD_UP: if (sprite->data[1] == 0) sprite->data[1] = 8; else sprite->data[1]--; break; case DPAD_DOWN: if (sprite->data[1] == 8) sprite->data[1] = 0; else sprite->data[1]++; break; case A_BUTTON: gUnknown_083C92E4[sprite->data[1]][sprite->data[0]](sprite, 1); sub_80AA614(sprite->data[2], sprite->data[3]); break; case B_BUTTON: gUnknown_083C92E4[sprite->data[1]][sprite->data[0]](sprite, -1); sub_80AA614(sprite->data[2], sprite->data[3]); break; case R_BUTTON: gUnknown_083C92E4[sprite->data[1]][sprite->data[0]](sprite, 10); sub_80AA614(sprite->data[2], sprite->data[3]); break; case L_BUTTON: gUnknown_083C92E4[sprite->data[1]][sprite->data[0]](sprite, -10); sub_80AA614(sprite->data[2], sprite->data[3]); break; case START_BUTTON: sub_80AAD08(sprite, 1); break; } sprite->pos1.x = gUnknown_083C9296[sprite->data[0] + sprite->data[1] * 2]; sprite->pos1.y = gUnknown_083C92A8[sprite->data[1]]; } static void sub_80AA8A0(struct Sprite *sprite, s8 var1, u8 var2) { if (var1 == 1) { sprite->data[2] = var2; sub_80AA280(var2); sub_80AA658(sprite->data[2]); } } 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, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].cool = sub_80AA908(val, gContestMons[sprite->data[2]].cool, var2); sub_80AA340(sprite->data[2]); } void sub_80AA974(struct Sprite *sprite, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].cute = sub_80AA908(val, gContestMons[sprite->data[2]].cute, var2); sub_80AA388(sprite->data[2]); } void sub_80AA9B8(struct Sprite *sprite, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].beauty = sub_80AA908(val, gContestMons[sprite->data[2]].beauty, var2); sub_80AA3D0(sprite->data[2]); } void sub_80AA9FC(struct Sprite *sprite, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].smart = sub_80AA908(val, gContestMons[sprite->data[2]].smart, var2); sub_80AA418(sprite->data[2]); } void sub_80AAA40(struct Sprite *sprite, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].tough = sub_80AA908(val, gContestMons[sprite->data[2]].tough, var2); sub_80AA460(sprite->data[2]); } void sub_80AAA84(struct Sprite *sprite, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].sheen = sub_80AA908(val, gContestMons[sprite->data[2]].sheen, var2); sub_80AA4A8(sprite->data[2]); } // 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, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].moves[0] = sub_80AAAC8(val, gContestMons[sprite->data[2]].moves[0], var2); sub_80AA4F0(sprite->data[2], 0); } void sub_80AAB30(struct Sprite *sprite, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].moves[1] = sub_80AAAC8(val, gContestMons[sprite->data[2]].moves[1], var2); sub_80AA4F0(sprite->data[2], 1); } void sub_80AAB70(struct Sprite *sprite, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].moves[2] = sub_80AAAC8(val, gContestMons[sprite->data[2]].moves[2], var2); sub_80AA4F0(sprite->data[2], 2); } void sub_80AABB0(struct Sprite *sprite, s8 var2) { u8 val = sprite->data[2]; gContestMons[sprite->data[2]].moves[3] = sub_80AAAC8(val, gContestMons[sprite->data[2]].moves[3], var2); sub_80AA4F0(sprite->data[2], 3); } void sub_80AABF0(struct Sprite *sprite, s8 var2) { s8 a = (var2 > 0) ? 1 : -1; s8 r4 = sprite->data[3] + a; if (r4 < 0) r4 = 0; else if (r4 > 4) r4 = 4; sub_80AA5BC(r4); sprite->data[3] = r4; gScriptContestCategory = sprite->data[3]; sub_80AE398(sprite->data[3], gScriptContestRank); sub_80AA280(sprite->data[2]); sub_80AA658(sprite->data[2]); } 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->data[2]); sub_80AA658(sprite->data[2]); } void sub_80AACC4(void) { UpdatePaletteFade(); if (!gPaletteFade.active) { SetDebugMonForContest(); if (!(gIsLinkContest & 1)) sub_80AE82C(eMatsudaDebugVar); SetMainCallback2(sub_80AB47C); } } void sub_80AAD08(struct Sprite *sprite, s8 var2) { if (var2 == 1) { eMatsudaDebugVar = sprite->data[3]; 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); } u8 MatsudaDebugMenu_SetHighScore(void) { sub_80AAF30(); CloseMenu(); return 1; } u8 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; } u8 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; }