diff options
Diffstat (limited to 'src/contest.c')
-rw-r--r-- | src/contest.c | 472 |
1 files changed, 472 insertions, 0 deletions
diff --git a/src/contest.c b/src/contest.c new file mode 100644 index 000000000..ebce709e3 --- /dev/null +++ b/src/contest.c @@ -0,0 +1,472 @@ +#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; + } +} |