summaryrefslogtreecommitdiff
path: root/src/contest.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/contest.c')
-rw-r--r--src/contest.c472
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;
+ }
+}