#include "global.h" #include "constants/songs.h" #include "battle_anim.h" #include "contest.h" #include "contest_link_80C857C.h" #include "ewram.h" #include "decompress.h" #include "graphics.h" #include "link.h" #include "main.h" #include "menu.h" #include "palette.h" #include "random.h" #include "sound.h" #include "task.h" #include "text.h" #include "unknown_task.h" struct Shared18000 { /*0x18000*/ u8 unk18000; /*0x18001*/ u8 filler18001[3]; ///*0x18004*/ u8 unk18004[0x200]; /*0x18004*/ u16 unk18004[16][16]; /*0x18204*/ u8 filler18204[0xA04-0x204]; /*0x18A04*/ u8 unk18A04[0x800]; }; struct Shared19204 { /*0x19204*/ u8 filler0[2]; /*0x19206*/ u8 unk19206[4]; /*0x1920A*/ u8 unk1920A; /*0x1920B*/ u8 filler1920B; /*0x1920C*/ u8 unk1920C; /*0x1920D*/ u8 filler1920D[0x16-0xD]; /*0x19216*/ u8 unk19216; /*0x19217*/ u8 filler19217; /*0x19218*/ u8 unk19218[0x5D-0x18]; /*0x1925D*/ u8 unk1925D[3]; }; struct UnknownContestStruct1 { u8 filler0[0xB]; u8 unkB_0:2; u8 fillerC[0x13-0xC]; u8 unk13; u8 unk14; u8 filler15[0x19-0x15]; u8 unk19; u8 filler1A[0x1C-0x1A]; }; struct Shared19260 { /*0x19260*/ struct UnknownContestStruct1 unk19260[4]; /*0x192D0*/ u8 unk192D0[0x14]; /*0x192E4*/ u8 unk192E4[0x44]; /*0x19328*/ u8 unk19328[4]; /*0x1932C*/ u8 filler1932C[0x38-0x2C]; /*0x19338*/ u8 unk19338[0x10]; }; #define shared15800 (gSharedMem + 0x15800) #define shared18000 (*(struct Shared18000 *)(gSharedMem + 0x18000)) #define shared19204 (*(struct Shared19204 *)(gSharedMem + 0x19204)) #define shared19260 (*(struct Shared19260 *)(gSharedMem + 0x19260)) extern u16 gBattleTypeFlags; extern u8 gBankAttacker; extern u8 gBankTarget; extern u8 gBanksBySide[]; extern u8 gObjectBankIDs[]; extern bool8 gIsLinkContest; extern u8 gContestPlayerMonIndex; extern u16 gUnknown_030041B0; extern s16 gUnknown_030041B4; extern u16 gUnknown_030041B8; extern u16 gUnknown_03004200; extern struct Window gUnknown_03004210; extern u16 gUnknown_03004240; extern u16 gUnknown_03004244; extern u16 gUnknown_03004280; extern u16 gUnknown_03004288; extern u16 gUnknown_030042A0; extern u16 gUnknown_030042A4; extern u16 gUnknown_030042C0; extern u16 gUnknown_030042C4; extern u32 gUnknown_03005D28; extern u8 gUnknown_02038696[]; void sub_80AB350(void); void sub_80AB5D4(u8); void sub_80AB604(u8); void sub_80AB678(u8); void sub_80AB694(u8); void sub_80AB6B4(u8); u8 sub_80AB70C(u8 *); void sub_80AB960(u8); void sub_80AB9A0(u8); void sub_80ABAAC(void); void sub_80ABAC4(void); void sub_80ABB70(u8); u8 sub_80AE858(void); u8 sub_80AE8B4(void); void sub_80AEB30(void); void sub_80AF860(void); void sub_80AFA5C(void); void sub_80AFE30(void); void sub_80B0034(void); void sub_80B00C8(void); void sub_80B0324(void); void sub_80B0518(void); void sub_80B1118(void); void sub_80B159C(void); void sub_80B1B14(void); void sub_80B2184(void); void sub_80B2280(void); void sub_80B292C(void); void nullsub_89(u8 taskId) { } void ResetLinkContestBoolean(void) { gIsLinkContest = FALSE; } void sub_80AB1BC(void) { u16 savedIme; REG_DISPCNT = 0x40; savedIme = REG_IME; REG_IME = 0; REG_IE |= INTR_FLAG_VBLANK; REG_IME = savedIme; REG_DISPSTAT = 8; REG_BG0CNT = 0x9800; REG_BG1CNT = 0x9E09; REG_BG2CNT = 0x9C00; REG_BG3CNT = 0x3A03; REG_BLDCNT = 0; REG_BLDALPHA = 0; REG_BLDY = 0; REG_WININ = 0x3F3F; REG_WINOUT = 0x3F3F; REG_DISPCNT |= 0x7F00; gUnknown_030042A4 = 0; gUnknown_030042A0 = 0; gUnknown_030042C0 = 0; gUnknown_030041B4 = 0; gUnknown_03004288 = 0; gUnknown_03004280 = 0; gUnknown_030041B0 = 0; gUnknown_030041B8 = 0; gUnknown_030042C4 = 0; gUnknown_03004240 = 0; gUnknown_03004200 = 0; gUnknown_03004244 = 0; } void sub_80AB2AC(void) { s32 i; LZDecompressVram(gContestMiscGfx, (void *)VRAM); LZDecompressVram(gContestAudienceGfx, (void *)(VRAM + 0x2000)); LZDecompressVram(gUnknown_08D1725C, (void *)(VRAM + 0xD000)); LoadCompressedPalette(gUnknown_08D17144, 0, 0x200); sub_80AB350(); for (i = 0; i < 4; i++) { u32 var = 5 + i; LoadPalette(shared18000.unk18004[var], 16 * (5 + gUnknown_02038696[i]), 16 * sizeof(u16)); } } void sub_80AB320(void) { SetUpWindowConfig(&gWindowConfig_81E6FD8); InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6FD8); InitWindowFromConfig(&gMenuWindow, &gWindowConfig_81E6FF4); } void sub_80AB350(void) { u8 i; LoadFontDefaultPalette(&gWindowConfig_81E6FD8); FillPalette(0, 0, 2); for (i = 10; i < 14; i++) LoadPalette(gPlttBufferUnfaded + 241, 240 + i, 2); FillPalette(0x7E3F, 0xF3, 2); } void sub_80AB398(void) { s32 i; memset(&shared19204, 0, sizeof(shared19204)); // TODO: How is this struct divided? for (i = 0; i < 4; i++) shared19204.unk19206[i] = 0xFF; for (i = 0; i < 4; i++) memset(&shared19260.unk19260[i], 0, sizeof(shared19260.unk19260[i])); for (i = 0; i < 4; i++) { shared19260.unk19260[i].unkB_0 = 0; shared19260.unk19260[i].unk13 = 0xFF; shared19260.unk19260[i].unk14 = 0xFF; } memset(&shared19260.unk192D0, 0, sizeof(shared19260.unk192D0)); memset(&shared19260.unk192E4, 0, sizeof(shared19260.unk192E4)); memset(&shared19260.unk19328, 0, sizeof(shared19260.unk19328)); memset(&shared19260.unk19338, 0, sizeof(shared19260.unk19338)); if (!(gIsLinkContest & 1)) // wat? sub_80B0F28(0); for (i = 0; i < 4; i++) { shared19260.unk19260[i].unk19 = 0xFF; shared19204.unk19218[i] = gUnknown_02038696[i]; } sub_80B159C(); } void sub_80AB47C(void) { switch (gMain.state) { case 0: SetVBlankCallback(NULL); sub_80AB320(); sub_80AB1BC(); dp12_8087EA4(); ResetPaletteFade(); gPaletteFade.bufferTransferDisabled = TRUE; { u8 *dest = (void *)VRAM; u32 size = 0x18000; while (1) { DmaFill32(3, 0, dest, 0x1000); dest += 0x1000; size -= 0x1000; if (size <= 0x1000) { DmaFill32(3, 0, dest, size); break; } } } ResetSpriteData(); ResetTasks(); FreeAllSpritePalettes(); gReservedSpritePaletteCount = 4; //shared18000.unk18000 = 0; gSharedMem[0x18000] = 0; ClearBattleMonForms(); sub_80AB398(); gMain.state++; break; case 1: sub_80AB350(); gMain.state++; break; case 2: if (sub_80AB70C(shared19204.unk1925D) == 0) break; shared19204.unk1925D[0] = 0; gMain.state++; break; case 3: sub_80B2184(); gUnknown_030042C0 = 0; gUnknown_030041B4 = 0; BeginFastPaletteFade(2); gPaletteFade.bufferTransferDisabled = FALSE; SetVBlankCallback(sub_80ABAC4); shared19204.unk1920C = CreateTask(sub_80AB5D4, 10); SetMainCallback2(sub_80ABAAC); break; } } void sub_80AB5D4(u8 taskId) { if (!gPaletteFade.active) gTasks[taskId].func = sub_80AB604; } void sub_80AB604(u8 taskId) { if (gIsLinkContest & 1) // wat? { if (!gPaletteFade.active) { gPaletteFade.bufferTransferDisabled = FALSE; sub_80AF860(); CreateTask(sub_80AB678, 0); gTasks[taskId].func = nullsub_89; } } else { gTasks[taskId].func = sub_80AB960; } } void sub_80AB678(u8 taskId) { SetTaskFuncWithFollowupFunc(taskId, sub_80C89DC, sub_80AB694); } void sub_80AB694(u8 taskId) { u16 one = 1; gTasks[taskId].data[0] = one; gTasks[taskId].func = sub_80AB6B4; } void sub_80AB6B4(u8 taskId) { gTasks[taskId].data[0]--; if (gTasks[taskId].data[0] <= 0) { GetMultiplayerId(); // unused return value DestroyTask(taskId); gTasks[shared19204.unk1920C].func = sub_80AB960; gRngValue = gUnknown_03005D28; } } u8 sub_80AB70C(u8 *a) { u16 sp0[16]; u16 sp20[16]; switch (*a) { case 0: gPaletteFade.bufferTransferDisabled = TRUE; { u8 *dest = (void *)VRAM; u32 size = 0x18000; while (1) { DmaFill32(3, 0, dest, 0x1000); dest += 0x1000; size -= 0x1000; if (size <= 0x1000) { DmaFill32(3, 0, dest, size); break; } } } break; case 1: LZDecompressVram(gContestMiscGfx, (void *)VRAM); break; case 2: LZDecompressVram(gContestAudienceGfx, (void *)(VRAM + 0x2000)); DmaCopyLarge32(3, (void *)(VRAM + 0x2000), shared15800, 0x2000, 0x1000); break; case 3: LZDecompressVram(gUnknown_08D1725C, (void *)(VRAM + 0xD000)); break; case 4: LZDecompressVram(gUnknown_08D17424, (void *)(VRAM + 0xE000)); //DmaCopy32(3, (void *)(VRAM + 0xE000), shared18000.unk18A04, 0x800); //asm(""); { void *src = (void *)(VRAM + 0xE000); void *dest = shared18000.unk18A04; DmaCopy32(3, src, dest, 0x800); } break; case 5: LoadCompressedPalette(gUnknown_08D17144, 0, 0x200); CpuCopy32(gPlttBufferUnfaded + 128, sp0, 16 * sizeof(u16)); CpuCopy32(gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, sp20, 16 * sizeof(u16)); CpuCopy32(sp20, gPlttBufferUnfaded + 128, 16 * sizeof(u16)); CpuCopy32(sp0, gPlttBufferUnfaded + (5 + gContestPlayerMonIndex) * 16, 16 * sizeof(u16)); { void *src = gPlttBufferUnfaded; void *dest = shared18000.unk18004; DmaCopy32(3, src, dest, 0x200); } sub_80AB350(); break; case 6: sub_80B1118(); sub_80AFA5C(); sub_80AEB30(); shared19204.unk19216 = sub_80AE8B4(); sub_80AFE30(); sub_80B0034(); sub_80B00C8(); sub_80B0324(); sub_80B0518(); gBanksBySide[0] = 0; gBanksBySide[1] = 1; gBanksBySide[2] = 3; gBanksBySide[3] = 2; gBattleTypeFlags = 0; gBankAttacker = 2; gBankTarget = 3; gObjectBankIDs[gBankAttacker] = sub_80AE858(); sub_80B292C(); break; default: *a = 0; return 1; } (*a)++; return 0; } void sub_80AB960(u8 taskId) { gPaletteFade.bufferTransferDisabled = FALSE; if (!gPaletteFade.active) { gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].func = sub_80AB9A0; } } void sub_80AB9A0(u8 taskId) { switch (gTasks[taskId].data[0]) { case 0: if (gTasks[taskId].data[1]++ <= 60) break; gTasks[taskId].data[1] = 0; PlaySE12WithPanning(SE_C_MAKU_U, 0); gTasks[taskId].data[0]++; break; case 1: gUnknown_030041B4 += 7; if (gUnknown_030041B4 <= 160) break; gTasks[taskId].data[0]++; break; case 2: sub_80B2280(); gTasks[taskId].data[0]++; break; case 3: REG_BG0CNT_BITFIELD.priority = 0; REG_BG2CNT_BITFIELD.priority = 0; sub_80B1B14(); gTasks[taskId].data[0]++; break; case 4: default: if (shared19204.unk1920A & 0x40) break; gTasks[taskId].data[0] = 0; gTasks[taskId].data[1] = 0; gTasks[taskId].func = sub_80ABB70; break; } }