summaryrefslogtreecommitdiff
path: root/src/contest_link_util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/contest_link_util.c')
-rw-r--r--src/contest_link_util.c2911
1 files changed, 2911 insertions, 0 deletions
diff --git a/src/contest_link_util.c b/src/contest_link_util.c
new file mode 100644
index 000000000..0e4ff15b2
--- /dev/null
+++ b/src/contest_link_util.c
@@ -0,0 +1,2911 @@
+#include "global.h"
+#include "contest_link_util.h"
+#include "battle.h"
+#include "blend_palette.h"
+#include "constants/songs.h"
+#include "contest.h"
+#include "contest_link.h"
+#include "data2.h"
+#include "decompress.h"
+#include "event_data.h"
+#include "ewram.h"
+#include "field_effect.h"
+#include "field_specials.h"
+#include "graphics.h"
+#include "link.h"
+#include "main.h"
+#include "menu.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokedex.h"
+#include "pokemon_icon.h"
+#include "pokemon_storage_system.h"
+#include "random.h"
+#include "scanline_effect.h"
+#include "script.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings2.h"
+#include "text.h"
+#include "trig.h"
+#include "tv.h"
+#include "util.h"
+
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+
+#define GET_CONTEST_WINNER(var) { \
+ for ((var) = 0; (var) < 4; (var)++) \
+ { \
+ if (gContestFinalStandings[i] == 0) \
+ break; \
+ } \
+}
+
+struct UnkEwramStruct18000 {
+ u8 unk_00;
+ u8 unk_01;
+ u8 unk_02;
+ u8 unk_03;
+ u8 unk_04;
+ u8 unk_05;
+ u8 unk_06;
+ u8 unk_07;
+ u8 unk_08;
+ u8 unk_09;
+ u8 unk_0a;
+ s16 unk_0c[4];
+ u8 unk_14;
+};
+
+struct UnkEwramStruct18018 {
+ s32 unk_00;
+ s32 unk_04;
+ u32 unk_08;
+ u32 unk_0c;
+ u8 unk_10;
+ u8 unk_11;
+ u8 unk_12;
+};
+
+#define eContestLink80C2020Struct2018000 (*(struct UnkEwramStruct18000 *)(gSharedMem + 0x18000))
+#define eContestLink80C2020Struct2018018 ((struct UnkEwramStruct18018 *)(gSharedMem + 0x18018))
+#define eContestLink80C2020Struct2018068 (gSharedMem + 0x18068)
+
+static void sub_80C2430(void);
+static void sub_80C2448(void);
+static void sub_80C24F4(u8 taskId);
+static void sub_80C255C(u8 taskId);
+static void sub_80C25A4(u8 taskId);
+static void sub_80C25C0(u8 taskId);
+static void sub_80C2600(u8 taskId);
+static void sub_80C26E4(u8 taskId);
+static void sub_80C2770(u8 taskId);
+static void sub_80C27EC(u8 taskId);
+static void sub_80C2878(u8 taskId);
+static void sub_80C2A8C(u8 taskId);
+static void sub_80C2D1C(u8 taskId);
+static void sub_80C2D80(u8 taskId);
+static void sub_80C2DD8(u8 taskId);
+static void sub_80C2E14(u8 taskId);
+static void sub_80C2EA0(u8 taskId);
+static void sub_80C2F28(u8 taskId);
+static void sub_80C2F64(u8 taskId);
+static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow);
+void sub_80C310C(void);
+void sub_80C3158(const u8 *string, u8 spriteId);
+void sub_80C33DC(void);
+u16 sub_80C34AC(const u8 *string);
+void sub_80C34CC(s16 data4, u16 pos0y, u16 data5, u16 data6);
+void sub_80C3520(u16 a0);
+void sub_80C3588(struct Sprite *sprite);
+void sub_80C35FC(struct Sprite *sprite);
+void sub_80C3630(struct Sprite *sprite);
+void sub_80C3698(const u8 *string);
+void sub_80C3764(void);
+void sub_80C37E4(void);
+u8 sub_80C3990(u8 a0, u8 a1);
+s8 sub_80C39E4(u8 a0, u8 a1);
+void sub_80C3A5C(u8 taskId);
+void sub_80C3BD8(u8 taskId);
+void sub_80C3B30(u8 taskId);
+void sub_80C3C44(struct Sprite *sprite);
+void sub_80C3CB8(struct Sprite *sprite);
+void sub_80C3D04(u8 taskId);
+void sub_80C3DF0(struct Sprite *sprite);
+void sub_80C3E60(u8 a0, u8 a1);
+void sub_80C3EA4(u8 taskId);
+void sub_80C3F00(void);
+void sub_80C40D4(u8 a0, u8 a1);
+void sub_80C42C0(u8 taskId);
+void Task_StartCommunication(u8 taskId);
+void Task_StartCommunicateRng(u8 taskId);
+void Task_StartCommunicateLeaderIds(u8 taskId);
+void Task_StartCommunicateCategory(u8 taskId);
+void Task_LinkContest_SetUpContest(u8 taskId);
+void Task_LinkContest_CalculateTurnOrder(u8 taskId);
+void Task_LinkContest_FinalizeConnection(u8 taskId);
+void Task_LinkContest_Disconnect(u8 taskId);
+void Task_LinkContest_WaitDisconnect(u8 taskId);
+
+const u16 gUnknown_083D1624[] = INCBIN_U16("graphics/unknown/unknown_3D1624/0.4bpp");
+const u16 gUnknown_083D1644[] = INCBIN_U16("graphics/unknown/unknown_3D1624/1.4bpp");
+const u16 gUnknown_083D1664[] = INCBIN_U16("graphics/unknown/unknown_3D1624/2.4bpp");
+const u16 gUnknown_083D1684[] = INCBIN_U16("graphics/unknown/unknown_3D1624/3.4bpp");
+const u16 gUnknown_083D16A4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/4.4bpp");
+const u16 gUnknown_083D16C4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/5.4bpp");
+const u16 gUnknown_083D16E4[] = INCBIN_U16("graphics/unknown/unknown_3D1624/6.4bpp");
+const u16 gUnknown_083D1704[] = INCBIN_U16("graphics/unknown/unknown_3D1624/7.4bpp");
+const u16 gMiscBlank_Pal[] = INCBIN_U16("graphics/interface/blank.gbapal");
+
+const struct OamData gOamData_83D1744 = {
+ .shape = ST_OAM_H_RECTANGLE,
+ .size = 3,
+ .priority = 3,
+ .paletteNum = 2
+};
+
+const struct SpriteTemplate gSpriteTemplate_83D174C = {
+ 0xbc1,
+ 0xbc1,
+ &gOamData_83D1744,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+const struct SpriteSheet gUnknown_083D1764[] = {
+ {gMiscBlank_Gfx, 0x400, 0xbc1},
+ {gMiscBlank_Gfx, 0x400, 0xbc2},
+ {gMiscBlank_Gfx, 0x400, 0xbc3},
+ {gMiscBlank_Gfx, 0x400, 0xbc4},
+ {gMiscBlank_Gfx, 0x400, 0xbc5},
+ {gMiscBlank_Gfx, 0x400, 0xbc6},
+ {gMiscBlank_Gfx, 0x400, 0xbc7},
+ {gMiscBlank_Gfx, 0x400, 0xbc8},
+};
+
+const struct SpritePalette gUnknown_083D17A4 = {
+ gMiscBlank_Pal, 0xbc1
+};
+
+const struct OamData gOamData_83D17AC = {};
+
+const struct SpriteTemplate gSpriteTemplate_83D17B4 = {
+ 0xbc9,
+ 0xbc9,
+ &gOamData_83D17AC,
+ gDummySpriteAnimTable,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ sub_80C3DF0
+};
+
+const struct CompressedSpriteSheet gUnknown_083D17CC = {gContestConfetti_Gfx, 0x220, 0xbc9};
+
+const struct CompressedSpritePalette gUnknown_083D17D4 = {gContestConfetti_Pal, 0xbc9};
+
+const u8 gUnknown_083D17DC[] = _("{COLOR RED}");
+const u8 gUnknown_083D17E0[] = _("/");
+const u8 gUnknown_083D17E2[] = _("{SIZE 3}{COLOR_HIGHLIGHT_SHADOW WHITE2 DARK_GREY LIGHT_BLUE}");
+
+void sub_80C2020(void)
+{
+ REG_DISPCNT = DISPCNT_OBJ_1D_MAP;
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6FA0);
+ Text_InitWindowWithTemplate(&gMenuWindow, &gWindowTemplate_81E6FA0);
+ REG_BG0CNT = BGCNT_WRAP | BGCNT_SCREENBASE(30);
+ REG_BG1CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(24);
+ REG_BG2CNT = BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(28);
+ REG_BG3CNT = BGCNT_WRAP | BGCNT_PRIORITY(3) | BGCNT_SCREENBASE(26);
+ REG_MOSAIC = 0;
+ REG_WININ = 0x3f3f;
+ REG_WINOUT = 0x3f2e;
+ REG_WIN0H = 0;
+ REG_WIN0V = 0;
+ REG_WIN1H = 0;
+ REG_WIN1V = 0;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+ 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_DISPCNT |= DISPCNT_BG_ALL_ON | DISPCNT_OBJ_ON | DISPCNT_WIN0_ON | DISPCNT_WIN1_ON;
+ gBattle_BG0_X = 0;
+ gBattle_BG0_Y = 0;
+ gBattle_BG1_X = 0;
+ gBattle_BG1_Y = 0;
+ gBattle_BG2_X = 0;
+ gBattle_BG2_Y = 0;
+ gBattle_BG3_X = 0;
+ gBattle_BG3_Y = 0;
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ gBattle_WIN1H = 0;
+ gBattle_WIN1V = 0;
+}
+
+void sub_80C2144(void)
+{
+ int i;
+ int j;
+ s8 r7;
+ s8 r4;
+ u16 r6;
+ u16 r3;
+
+ DmaFill32Large(3, 0, VRAM, VRAM_SIZE, 0x1000);
+ LZDecompressVram(gUnknown_08D1977C, BG_SCREEN_ADDR(0));
+ LZDecompressVram(gUnknown_08D1A490, BG_SCREEN_ADDR(26));
+ LZDecompressVram(gUnknown_08D1A364, BG_SCREEN_ADDR(28));
+ LZDecompressVram(gUnknown_08D1A250, BG_SCREEN_ADDR(30));
+ sub_80C37E4();
+ LoadCompressedPalette(gUnknown_08D1A618, 0, 0x200);
+ LoadFontDefaultPalette(&gWindowTemplate_81E6FA0);
+ for (i = 0; i < 4; i++)
+ {
+ r7 = sub_80C3990(i, 1);
+ r4 = sub_80C39E4(i, 1);
+ for (j = 0; j < 10; j++)
+ {
+ r6 = 0x60b2;
+ if (j < r7)
+ r6 = 0x60b4;
+ if (j < ABS(r4))
+ {
+ r3 = 0x60a4;
+ if (r4 < 0)
+ r3 = 0x60a6;
+ }
+ else
+ r3 = 0x60a2;
+ ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60b3] = r6;
+ ((u16 *)BG_VRAM)[i * 0x60 + j + 0x60d3] = r3;
+ }
+ }
+}
+
+void sub_80C226C(u8 a0)
+{
+ u8 *strbuf;
+
+ if (a0 == gContestPlayerMonIndex)
+ strbuf = StringCopy(gDisplayedStringBattle, gUnknown_083D17DC);
+ else
+ strbuf = gDisplayedStringBattle;
+ strbuf[0] = EXT_CTRL_CODE_BEGIN;
+ strbuf[1] = 0x06;
+ strbuf[2] = 0x04;
+ strbuf += 3;
+ strbuf = StringCopy(strbuf, gContestMons[a0].nickname);
+ strbuf[0] = EXT_CTRL_CODE_BEGIN;
+ strbuf[1] = 0x13;
+ strbuf[2] = 0x32;
+ strbuf += 3;
+ strbuf = StringCopy(strbuf, gUnknown_083D17E0);
+ if (gIsLinkContest & 1)
+ StringCopy(strbuf, gLinkPlayers[a0].name);
+ else
+ StringCopy(strbuf, gContestMons[a0].trainerName);
+ Text_InitWindowAndPrintText(&gMenuWindow, gDisplayedStringBattle, a0 * 36 + 770, 7, a0 * 3 + 4);
+}
+
+void sub_80C2340(void)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ sub_80C226C(i);
+}
+
+void sub_80C2358(void)
+{
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ SetVBlankCallback(NULL);
+ sub_80C2020();
+ ScanlineEffect_Clear();
+ ResetPaletteFade();
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ sub_80C2144();
+ sub_80C310C();
+ LoadAllContestMonIcons(0, TRUE);
+ sub_80C2340();
+ eContestLink80C2020Struct2018000 = (struct UnkEwramStruct18000){};
+ memset(eContestLink80C2020Struct2018018, 0, 4 * sizeof(struct UnkEwramStruct18018));
+ sub_80C33DC();
+ BeginNormalPaletteFade(0xffffffff, 0, 16, 0, 0);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ eContestLink80C2020Struct2018000.unk_02 = CreateTask(sub_80C24F4, 5);
+ SetMainCallback2(sub_80C2430);
+ gBattle_WIN1H = 0xf0;
+ gBattle_WIN1V = 0x80a0;
+ CreateTask(sub_80C2F28, 20);
+ sub_80C3F00();
+ PlayBGM(MUS_CONTEST_RESULTS);
+ SetVBlankCallback(sub_80C2448);
+}
+
+static void sub_80C2430(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+static void sub_80C2448(void)
+{
+ REG_BG0HOFS = gBattle_BG0_X;
+ REG_BG0VOFS = gBattle_BG0_Y;
+ REG_BG1HOFS = gBattle_BG1_X;
+ REG_BG1VOFS = gBattle_BG1_Y;
+ REG_BG2HOFS = gBattle_BG2_X;
+ REG_BG2VOFS = gBattle_BG2_Y;
+ REG_BG3HOFS = gBattle_BG3_X;
+ REG_BG3VOFS = gBattle_BG3_Y;
+ REG_WIN0H = gBattle_WIN0H;
+ REG_WIN0V = gBattle_WIN0V;
+ REG_WIN1H = gBattle_WIN1H;
+ REG_WIN1V = gBattle_WIN1V;
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ ScanlineEffect_InitHBlankDmaTransfer();
+}
+
+static void sub_80C24F4(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gIsLinkContest & 1)
+ {
+ sub_80C3698(gOtherText_LinkStandby);
+ gTasks[taskId].func = sub_80C255C;
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80C2600;
+ }
+ }
+}
+
+static void sub_80C255C(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers && GetLinkPlayerCount() == MAX_LINK_PLAYERS)
+ {
+ CreateTask(sub_80C25A4, 0);
+ gTasks[taskId].func = TaskDummy;
+ }
+}
+
+static void sub_80C25A4(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C89DC, sub_80C25C0);
+}
+
+static void sub_80C25C0(u8 taskId)
+{
+ if (IsLinkTaskFinished())
+ {
+ DestroyTask(taskId);
+ gTasks[eContestLink80C2020Struct2018000.unk_02].func = sub_80C2600;
+ sub_80C3764();
+ }
+}
+
+static void sub_80C2600(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 0)
+ {
+ CreateTask(sub_80C2F64, 20);
+ sub_80C3158(gContestText_AnnounceResults, eContestLink80C2020Struct2018000.unk_00);
+ sub_80C34CC(sub_80C34AC(gContestText_AnnounceResults), 0x90, 0x78, 0x440);
+ gTasks[taskId].data[0]++;
+ }
+ else if (gTasks[taskId].data[0] == 1)
+ {
+ if (eContestLink80C2020Struct2018000.unk_04 == 0)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ }
+ else if (gTasks[taskId].data[0] == 2)
+ {
+ if (++gTasks[taskId].data[1] == 0x15)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ }
+ else if (gTasks[taskId].data[0] == 3)
+ {
+ sub_80C3158(gContestText_PreliminaryResults, eContestLink80C2020Struct2018000.unk_00);
+ sub_80C34CC(sub_80C34AC(gContestText_PreliminaryResults), 0x90, 0xffff, 0x440);
+ gTasks[taskId].data[0]++;
+ }
+ else if (gTasks[taskId].data[0] == 4)
+ {
+ if (eContestLink80C2020Struct2018000.unk_04 == 2)
+ {
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C26E4;
+ }
+ }
+}
+
+static void sub_80C26E4(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (eContestLink80C2020Struct2018000.unk_0a == 0)
+ {
+ sub_80C40D4(0, gTasks[taskId].data[2]++);
+ if (eContestLink80C2020Struct2018000.unk_14 == 0)
+ {
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 1:
+ if (eContestLink80C2020Struct2018000.unk_14 == 0)
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+ break;
+ case 2:
+ sub_80C3520(0x440);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[2] = 0;
+ gTasks[taskId].func = sub_80C2770;
+ break;
+ }
+}
+
+static void sub_80C2770(u8 taskId)
+{
+ if (eContestLink80C2020Struct2018000.unk_04 == 0)
+ {
+ if (++gTasks[taskId].data[1] == 21)
+ {
+ gTasks[taskId].data[1] = 0;
+ sub_80C3158(gContestText_Round2Results, eContestLink80C2020Struct2018000.unk_00);
+ sub_80C34CC(sub_80C34AC(gContestText_Round2Results), 0x90, 0xffff, 0x440);
+ }
+ }
+ else if (eContestLink80C2020Struct2018000.unk_04 == 2)
+ {
+ gTasks[taskId].func = sub_80C27EC;
+ }
+}
+
+static void sub_80C27EC(u8 taskId)
+{
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (eContestLink80C2020Struct2018000.unk_0a == 0)
+ {
+ sub_80C40D4(1, gTasks[taskId].data[2]++);
+ if (eContestLink80C2020Struct2018000.unk_14 == 0)
+ {
+ gTasks[taskId].data[0] = 2;
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 1:
+ if (eContestLink80C2020Struct2018000.unk_14 == 0)
+ {
+ gTasks[taskId].data[0] = 0;
+ }
+ break;
+ case 2:
+ sub_80C3520(0x440);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C2878;
+ break;
+ }
+}
+
+static void sub_80C2878(u8 taskId)
+{
+ int i;
+ u8 taskId2;
+ u8 strbuf[100];
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (eContestLink80C2020Struct2018000.unk_04 == 0)
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (++gTasks[taskId].data[1] == 31)
+ {
+ gTasks[taskId].data[1] = 0;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 2:
+ for (i = 0; i < 4; i++)
+ {
+ taskId2 = CreateTask(sub_80C3A5C, 10);
+ gTasks[taskId2].data[0] = gContestFinalStandings[i];
+ gTasks[taskId2].data[1] = i;
+ }
+ gTasks[taskId].data[0]++;
+ break;
+ case 3:
+ if (eContestLink80C2020Struct2018000.unk_05 == 4)
+ {
+ if (++gTasks[taskId].data[1] == 31)
+ {
+ gTasks[taskId].data[1] = 0;
+ CreateTask(sub_80C3B30, 10);
+ gTasks[taskId].data[0]++;
+ GET_CONTEST_WINNER(i);
+ sub_80C3E60(i, 14);
+ }
+ }
+ break;
+ case 4:
+ if (++gTasks[taskId].data[1] == 21)
+ {
+ gTasks[taskId].data[1] = 0;
+ GET_CONTEST_WINNER(i);
+ if (gIsLinkContest & 1)
+ {
+ StringCopy(gStringVar1, gLinkPlayers[i].name);
+ }
+ else
+ {
+ StringCopy(gStringVar1, gContestMons[i].trainerName);
+ }
+ StringCopy(gStringVar2, gContestMons[i].nickname);
+ StringExpandPlaceholders(strbuf, gContestText_PokeWon);
+ sub_80C3158(strbuf, eContestLink80C2020Struct2018000.unk_00);
+ sub_80C34CC(sub_80C34AC(strbuf), 0x90, 0xffff, 0x440);
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 5:
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C2A8C;
+ break;
+ }
+}
+
+static void sub_80C2A8C(u8 taskId)
+{
+ int i;
+ u8 spriteId;
+ u16 species;
+ u32 personality;
+ u32 otId;
+ const struct CompressedSpritePalette *monPal;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ gBattle_WIN0H = 0xf0;
+ gBattle_WIN0V = 0x5050;
+ GET_CONTEST_WINNER(i);
+ species = gContestMons[i].species;
+ personality = gContestMons[i].personality;
+ otId = gContestMons[i].otId;
+ HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (intptr_t)gSharedMem, gMonSpriteGfx_Sprite_ptr[1], species, personality);
+ monPal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality);
+ LoadCompressedObjectPalette(monPal);
+ GetMonSpriteTemplate_803C56C(species, 1);
+ gUnknown_02024E8C.paletteTag = monPal->tag;
+ spriteId = CreateSprite(&gUnknown_02024E8C, 0x110, 0x50, 10);
+ gSprites[spriteId].data[1] = species;
+ gSprites[spriteId].oam.priority = 0;
+ gSprites[spriteId].callback = sub_80C3C44;
+ eContestLink80C2020Struct2018000.unk_08 = spriteId;
+ LoadCompressedObjectPic(&gUnknown_083D17CC);
+ LoadCompressedObjectPalette(&gUnknown_083D17D4);
+ CreateTask(sub_80C3D04, 10);
+ gTasks[taskId].data[0]++;
+ break;
+ case 1:
+ if (++gTasks[taskId].data[3] == 1)
+ {
+ u8 win0v;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[2] += 2;
+ if (gTasks[taskId].data[2] > 0x20)
+ gTasks[taskId].data[2] = 0x20;
+ win0v = gTasks[taskId].data[2];
+ gBattle_WIN0V = ((0x50 - win0v) << 8) | (0x50 + win0v);
+ if (win0v == 0x20)
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 2:
+ if (eContestLink80C2020Struct2018000.unk_06 == 1)
+ {
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 3:
+ if (++gTasks[taskId].data[1] == 121)
+ {
+ gTasks[taskId].data[1] = 0;
+ gSprites[eContestLink80C2020Struct2018000.unk_08].callback = sub_80C3CB8;
+ gTasks[taskId].data[0]++;
+ }
+ break;
+ case 4:
+ if (eContestLink80C2020Struct2018000.unk_06 == 2)
+ {
+ u8 win0v = (gBattle_WIN0V >> 8);
+ win0v += 2;
+ if (win0v > 0x50)
+ win0v = 0x50;
+ gBattle_WIN0V = (win0v << 8) | (0xa0 - win0v);
+ if (win0v == 0x50)
+ {
+ gTasks[taskId].data[0]++;
+ }
+ }
+ break;
+ case 5:
+ if (eContestLink80C2020Struct2018000.unk_06 == 2)
+ {
+ eContestLink80C2020Struct2018000.unk_09 = 1;
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].func = sub_80C2D1C;
+ }
+ break;
+ }
+}
+
+static void sub_80C2D1C(u8 taskId)
+{
+ int i;
+
+ if (gMain.newKeys & A_BUTTON)
+ {
+ if (!(gIsLinkContest & 1))
+ {
+ for (i = 0; i < 4; i++)
+ {
+ GetSetPokedexFlag(SpeciesToNationalPokedexNum(gContestMons[i].species), FLAG_SET_SEEN);
+ }
+ }
+ gTasks[taskId].func = sub_80C2D80;
+ }
+}
+
+static void sub_80C2D80(u8 taskId)
+{
+ if (gIsLinkContest & 1)
+ {
+ sub_80C3698(gOtherText_LinkStandby);
+ SetCloseLinkCallback();
+ gTasks[taskId].func = sub_80C2DD8;
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80C2E14;
+ }
+}
+
+static void sub_80C2DD8(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == 0)
+ {
+ gIsLinkContest = 0;
+ sub_80C3764();
+ gTasks[taskId].func = sub_80C2E14;
+ }
+}
+
+static void sub_80C2E14(u8 taskId)
+{
+ sub_80BE284(gContestFinalStandings[gContestPlayerMonIndex]);
+ sub_810FB10(2);
+ Contest_SaveWinner(gSpecialVar_ContestRank);
+ Contest_SaveWinner(0xFE);
+ eCurContestWinnerIsForArtist = TRUE;
+ eCurContestWinnerSaveIdx = sub_80B2C4C(0xfe, 0);
+ BeginHardwarePaletteFade(0xff, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_80C2EA0;
+}
+
+static void sub_80C2EA0(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gTasks[taskId].data[1] == 0)
+ {
+ DestroyTask(eContestLink80C2020Struct2018000.unk_03);
+ BlendPalettes(0x0000ffff, 16, 0);
+ gTasks[taskId].data[1]++;
+ }
+ else if (gTasks[taskId].data[1] == 1)
+ {
+ BlendPalettes(0xffff0000, 16, 0);
+ gTasks[taskId].data[1]++;
+ }
+ else
+ {
+ REG_BLDCNT = 0;
+ REG_BLDY = 0;
+ DestroyTask(taskId);
+ SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic);
+ }
+ }
+}
+
+static void sub_80C2F28(u8 taskId)
+{
+ gBattle_BG3_X += 2;
+ gBattle_BG3_Y++;
+ if (gBattle_BG3_X > 0xff)
+ gBattle_BG3_X -= 0xff;
+ if (gBattle_BG3_Y > 0xff)
+ gBattle_BG3_Y -= 0xff;
+}
+
+static void sub_80C2F64(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] == 2)
+ {
+ gTasks[taskId].data[0] = 0;
+ if (gTasks[taskId].data[2] == 0)
+ gTasks[taskId].data[1]++;
+ else
+ gTasks[taskId].data[1]--;
+ if (gTasks[taskId].data[1] == 16)
+ gTasks[taskId].data[2] = 1;
+ else if (gTasks[taskId].data[1] == 0)
+ gTasks[taskId].data[2] = 0;
+ BlendPalette(0x6b, 0x01, gTasks[taskId].data[1], RGB(30, 22, 11));
+ BlendPalette(0x68, 0x01, gTasks[taskId].data[1], RGB(31, 31, 31));
+ BlendPalette(0x6e, 0x01, gTasks[taskId].data[1], RGB(30, 29, 29));
+ }
+ if (gTasks[taskId].data[1] == 0)
+ eContestLink80C2020Struct2018000.unk_0a = 0;
+ else
+ eContestLink80C2020Struct2018000.unk_0a = 1;
+}
+
+void sub_80C3024(u16 species, u8 destOffset, u8 srcOffset, bool8 useDmaNow, u32 personality)
+{
+ int i;
+ int j;
+ u16 tile;
+ u16 offset;
+ u16 var0;
+ u16 var1;
+
+ if (useDmaNow)
+ {
+ DmaCopy32Defvars(3, GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180);
+ var0 = ((destOffset + 10) << 12);
+ var1 = (destOffset * 16 + 0x200);
+ tile = var1 | var0;
+ offset = destOffset * 0x60 + 0x83;
+ for (i = 0; i < 3; i++)
+ {
+ for (j = 0; j < 4; j++)
+ {
+ ((u16 *)BG_CHAR_ADDR(3))[(i << 5) + j + offset] = tile;
+ tile++;
+ }
+ }
+ }
+ else
+ {
+ RequestSpriteCopy(GetMonIconPtr(species, personality) + (srcOffset << 9) + 0x80, BG_CHAR_ADDR(1) + (destOffset << 9), 0x180);
+ }
+}
+
+static void LoadAllContestMonIcons(u8 srcOffset, bool8 useDmaNow)
+{
+ int i;
+
+ for (i = 0; i < 4; i++)
+ {
+ sub_80C3024(gContestMons[i].species, i, srcOffset, useDmaNow, gContestMons[i].personality);
+ }
+}
+
+void sub_80C310C(void)
+{
+ int i;
+ register u16 species asm("r0");
+
+ for (i = 0; i < 4; i++)
+ {
+ species = mon_icon_convert_unown_species_id(gContestMons[i].species, 0);
+ LoadPalette(gMonIconPalettes[gMonIconPaletteIndices[species]], 0xa0 + 0x10 * i, 0x20);
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80C3158(const u8 *string, u8 spriteId)
+{
+ int i, j;
+ u8 width;
+ u8 * displayedStringBattle;
+ void * dest;
+ u8 * d1;
+ u8 * d2;
+ void *d3;
+ void *d4;
+ void *d5;
+ void *d6;
+ int w;
+ u16 sp00[4];
+ struct Sprite *sprite = &gSprites[spriteId];
+ sp00[0] = gSprites[spriteId].oam.tileNum;
+ sp00[1] = gSprites[sprite->data[0]].oam.tileNum;
+ sp00[2] = gSprites[sprite->data[1]].oam.tileNum;
+ sp00[3] = gSprites[sprite->data[2]].oam.tileNum;
+
+ for (i = 0; i < 4; i++)
+ {
+ DmaClear32(3, (void *)VRAM + 0x10000 + 32 * sp00[i], 0x400);
+ }
+
+ width = Text_GetStringWidthFromWindowTemplate(&gWindowTemplate_81E7278, string);
+ displayedStringBattle = gDisplayedStringBattle;
+ displayedStringBattle = StringCopy(displayedStringBattle, gUnknown_083D17E2);
+ if ((~width + 1) & 7)
+ {
+ displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN;
+ displayedStringBattle[1] = 0x11;
+ displayedStringBattle[2] = ((~width + 1) & 7) / 2;
+ displayedStringBattle += 3;
+ }
+
+ width += -8 & (width + 7);
+ displayedStringBattle = StringCopy(displayedStringBattle, string);
+
+ displayedStringBattle[0] = EXT_CTRL_CODE_BEGIN;
+ displayedStringBattle[1] = 0x13;
+ displayedStringBattle[2] = width;
+ displayedStringBattle[3] = EOS;
+
+ sub_80034D4(eContestLink80C2020Struct2018068, gDisplayedStringBattle);
+
+ CpuCopy32(&gUnknown_083D1624[0x0], (void *)(VRAM + 0x10000) + 32 * sp00[0], 32);
+ CpuCopy32(&gUnknown_083D1624[0x40], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x100, 32);
+ CpuCopy32(&gUnknown_083D1624[0x40], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x200, 32);
+ CpuCopy32(&gUnknown_083D1624[0x20], (void *)(VRAM + 0x10000) + 32 * sp00[0] + 0x300, 32);
+
+ w = width / 8;
+ j = 0;
+ if (j <= w)
+ {
+ d2 = eContestLink80C2020Struct2018068 + 0x20;
+ d1 = eContestLink80C2020Struct2018068;
+ d3 = (void *)VRAM + 0x0FD20;
+ d4 = (void *)VRAM + 0x0FE20;
+ d5 = (void *)VRAM + 0x0FF20;
+ d6 = (void *)VRAM + 0x10020;
+ while (j <= w)
+ {
+ if (j < 7)
+ dest = 32 * sp00[0] + d6;
+ else if (j < 15)
+ dest = 32 * sp00[1] + d5;
+ else if (j < 23)
+ dest = 32 * sp00[2] + d4;
+ else
+ dest = 32 * sp00[3] + d3;
+
+ if (j == w)
+ break;
+
+ CpuCopy32(gUnknown_083D16E4, dest, 32);
+ CpuCopy32(gUnknown_083D16E4 + 0x10, dest + 0x300, 32);
+ CpuCopy32(j * 0x40 + d2, dest + 0x100, 32);
+ CpuCopy32(j * 0x40 + d1, dest + 0x200, 32);
+
+ d3 += 0x20;
+ d4 += 0x20;
+ d5 += 0x20;
+ d6 += 0x20;
+ j++;
+ }
+ }
+
+ CpuCopy32(gUnknown_083D1644, dest, 32);
+ CpuCopy32(gUnknown_083D1644 + 0x40, dest + 0x100, 32);
+ CpuCopy32(gUnknown_083D1644 + 0x40, dest + 0x200, 32);
+ CpuCopy32(gUnknown_083D1644 + 0x20, dest + 0x300, 32);
+}
+#else
+asm(".include \"constants/gba_constants.inc\"");
+asm(".include \"include/macros.inc\"");
+NAKED
+void sub_80C3158(const u8 * string, u8 spriteId)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0x1C\n"
+ "\tmov r9, r0\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r1, 24\n"
+ "\tlsls r2, r1, 4\n"
+ "\tadds r2, r1\n"
+ "\tlsls r2, 2\n"
+ "\tldr r3, _080C32C0 @ =gSprites\n"
+ "\tadds r2, r3\n"
+ "\tmov r1, sp\n"
+ "\tldrh r0, [r2, 0x4]\n"
+ "\tlsls r0, 22\n"
+ "\tlsrs r0, 22\n"
+ "\tstrh r0, [r1]\n"
+ "\tmov r4, sp\n"
+ "\tmovs r0, 0x2E\n"
+ "\tldrsh r1, [r2, r0]\n"
+ "\tlsls r0, r1, 4\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r3\n"
+ "\tldrh r0, [r0, 0x4]\n"
+ "\tlsls r0, 22\n"
+ "\tlsrs r0, 22\n"
+ "\tstrh r0, [r4, 0x2]\n"
+ "\tmovs r0, 0x30\n"
+ "\tldrsh r1, [r2, r0]\n"
+ "\tlsls r0, r1, 4\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r3\n"
+ "\tldrh r0, [r0, 0x4]\n"
+ "\tlsls r0, 22\n"
+ "\tlsrs r0, 22\n"
+ "\tstrh r0, [r4, 0x4]\n"
+ "\tmovs r0, 0x32\n"
+ "\tldrsh r1, [r2, r0]\n"
+ "\tlsls r0, r1, 4\n"
+ "\tadds r0, r1\n"
+ "\tlsls r0, 2\n"
+ "\tadds r0, r3\n"
+ "\tldrh r0, [r0, 0x4]\n"
+ "\tlsls r0, 22\n"
+ "\tlsrs r0, 22\n"
+ "\tstrh r0, [r4, 0x6]\n"
+ "\tldr r1, _080C32C4 @ =gWindowTemplate_81E7278\n"
+ "\tmov r8, r1\n"
+ "\tldr r7, _080C32C8 @ =0x06010000\n"
+ "\tldr r2, _080C32CC @ =0x040000d4\n"
+ "\tldr r6, _080C32D0 @ =0x85000100\n"
+ "\tmov r1, sp\n"
+ "\tmovs r5, 0\n"
+ "\tadd r3, sp, 0x8\n"
+ "\tmovs r4, 0x3\n"
+ "_080C31CE:\n"
+ "\tldrh r0, [r1]\n"
+ "\tlsls r0, 5\n"
+ "\tadds r0, r7\n"
+ "\tstr r5, [sp, 0x8]\n"
+ "\tstr r3, [r2]\n"
+ "\tstr r0, [r2, 0x4]\n"
+ "\tstr r6, [r2, 0x8]\n"
+ "\tldr r0, [r2, 0x8]\n"
+ "\tadds r1, 0x2\n"
+ "\tsubs r4, 0x1\n"
+ "\tcmp r4, 0\n"
+ "\tbge _080C31CE\n"
+ "\tmov r0, r8\n"
+ "\tmov r1, r9\n"
+ "\tbl Text_GetStringWidthFromWindowTemplate\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tldr r2, _080C32D4 @ =gDisplayedStringBattle\n"
+ "\tldr r1, _080C32D8 @ =gUnknown_083D17E2\n"
+ "\tadds r0, r2, 0\n"
+ "\tbl StringCopy\n"
+ "\tadds r2, r0, 0\n"
+ "\tmvns r0, r5\n"
+ "\tadds r1, r0, 0x1\n"
+ "\tmovs r0, 0x7\n"
+ "\tands r1, r0\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _080C3218\n"
+ "\tmovs r0, 0xFC\n"
+ "\tstrb r0, [r2]\n"
+ "\tmovs r0, 0x11\n"
+ "\tstrb r0, [r2, 0x1]\n"
+ "\tlsrs r0, r1, 1\n"
+ "\tstrb r0, [r2, 0x2]\n"
+ "\tadds r2, 0x3\n"
+ "_080C3218:\n"
+ "\tadds r6, r5, 0x7\n"
+ "\tmovs r1, 0x8\n"
+ "\tnegs r1, r1\n"
+ "\tadds r0, r1, 0\n"
+ "\tands r6, r0\n"
+ "\tlsls r6, 24\n"
+ "\tlsrs r5, r6, 24\n"
+ "\tadds r0, r2, 0\n"
+ "\tmov r1, r9\n"
+ "\tbl StringCopy\n"
+ "\tadds r2, r0, 0\n"
+ "\tmovs r0, 0xFC\n"
+ "\tstrb r0, [r2]\n"
+ "\tmovs r0, 0x13\n"
+ "\tstrb r0, [r2, 0x1]\n"
+ "\tstrb r5, [r2, 0x2]\n"
+ "\tmovs r0, 0xFF\n"
+ "\tstrb r0, [r2, 0x3]\n"
+ "\tldr r0, _080C32DC @ =gSharedMem + 0x18068\n"
+ "\tmov r10, r0\n"
+ "\tldr r1, _080C32D4 @ =gDisplayedStringBattle\n"
+ "\tbl sub_80034D4\n"
+ "\tmov r0, sp\n"
+ "\tldrh r4, [r0]\n"
+ "\tlsls r4, 5\n"
+ "\tldr r1, _080C32C8 @ =0x06010000\n"
+ "\tadds r7, r4, r1\n"
+ "\tldr r0, _080C32E0 @ =gUnknown_083D1624\n"
+ "\tmov r9, r0\n"
+ "\tldr r1, _080C32E4 @ =REG_BG0CNT\n"
+ "\tmov r8, r1\n"
+ "\tadds r1, r7, 0\n"
+ "\tmov r2, r8\n"
+ "\tbl CpuSet\n"
+ "\tmov r5, r9\n"
+ "\tadds r5, 0x80\n"
+ "\tldr r0, _080C32E8 @ =0x06010100\n"
+ "\tadds r1, r4, r0\n"
+ "\tadds r0, r5, 0\n"
+ "\tmov r2, r8\n"
+ "\tbl CpuSet\n"
+ "\tldr r0, _080C32EC @ =0x06010200\n"
+ "\tadds r1, r4, r0\n"
+ "\tadds r0, r5, 0\n"
+ "\tmov r2, r8\n"
+ "\tbl CpuSet\n"
+ "\tmov r0, r9\n"
+ "\tadds r0, 0x40\n"
+ "\tldr r1, _080C32F0 @ =0x06010300\n"
+ "\tadds r4, r1\n"
+ "\tadds r1, r4, 0\n"
+ "\tmov r2, r8\n"
+ "\tbl CpuSet\n"
+ "\tlsrs r5, r6, 27\n"
+ "\tmovs r4, 0\n"
+ "\tcmp r4, r5\n"
+ "\tbgt _080C3382\n"
+ "\tmov r6, sp\n"
+ "\tmov r0, r10\n"
+ "\tadds r0, 0x20\n"
+ "\tstr r0, [sp, 0xC]\n"
+ "\tmov r1, r10\n"
+ "\tstr r1, [sp, 0x10]\n"
+ "\tldr r0, _080C32F4 @ =0x0600fd20\n"
+ "\tstr r0, [sp, 0x14]\n"
+ "\tldr r1, _080C32F8 @ =0x0600fe20\n"
+ "\tstr r1, [sp, 0x18]\n"
+ "\tldr r0, _080C32FC @ =0x0600ff20\n"
+ "\tmov r10, r0\n"
+ "\tldr r1, _080C3300 @ =0x06010020\n"
+ "\tmov r9, r1\n"
+ "_080C32B2:\n"
+ "\tcmp r4, 0x6\n"
+ "\tbgt _080C3304\n"
+ "\tldrh r0, [r6]\n"
+ "\tlsls r0, 5\n"
+ "\tmov r1, r9\n"
+ "\tb _080C3322\n"
+ "\t.align 2, 0\n"
+ "_080C32C0: .4byte gSprites\n"
+ "_080C32C4: .4byte gWindowTemplate_81E7278\n"
+ "_080C32C8: .4byte 0x06010000\n"
+ "_080C32CC: .4byte 0x040000d4\n"
+ "_080C32D0: .4byte 0x85000100\n"
+ "_080C32D4: .4byte gDisplayedStringBattle\n"
+ "_080C32D8: .4byte gUnknown_083D17E2\n"
+ "_080C32DC: .4byte gSharedMem + 0x18068\n"
+ "_080C32E0: .4byte gUnknown_083D1624\n"
+ "_080C32E4: .4byte REG_BG0CNT\n"
+ "_080C32E8: .4byte 0x06010100\n"
+ "_080C32EC: .4byte 0x06010200\n"
+ "_080C32F0: .4byte 0x06010300\n"
+ "_080C32F4: .4byte 0x0600fd20\n"
+ "_080C32F8: .4byte 0x0600fe20\n"
+ "_080C32FC: .4byte 0x0600ff20\n"
+ "_080C3300: .4byte 0x06010020\n"
+ "_080C3304:\n"
+ "\tcmp r4, 0xE\n"
+ "\tbgt _080C3310\n"
+ "\tldrh r0, [r6, 0x2]\n"
+ "\tlsls r0, 5\n"
+ "\tmov r1, r10\n"
+ "\tb _080C3322\n"
+ "_080C3310:\n"
+ "\tcmp r4, 0x16\n"
+ "\tbgt _080C331C\n"
+ "\tldrh r0, [r6, 0x4]\n"
+ "\tlsls r0, 5\n"
+ "\tldr r1, [sp, 0x18]\n"
+ "\tb _080C3322\n"
+ "_080C331C:\n"
+ "\tldrh r0, [r6, 0x6]\n"
+ "\tlsls r0, 5\n"
+ "\tldr r1, [sp, 0x14]\n"
+ "_080C3322:\n"
+ "\tadds r7, r0, r1\n"
+ "\tcmp r4, r5\n"
+ "\tbeq _080C3382\n"
+ "\tldr r0, _080C33D0 @ =gUnknown_083D16E4\n"
+ "\tadds r1, r7, 0\n"
+ "\tmov r2, r8\n"
+ "\tbl CpuSet\n"
+ "\tmovs r0, 0xC0\n"
+ "\tlsls r0, 2\n"
+ "\tadds r1, r7, r0\n"
+ "\tldr r0, _080C33D0 @ =gUnknown_083D16E4\n"
+ "\tadds r0, 0x20\n"
+ "\tmov r2, r8\n"
+ "\tbl CpuSet\n"
+ "\tmovs r0, 0x80\n"
+ "\tlsls r0, 1\n"
+ "\tadds r1, r7, r0\n"
+ "\tldr r0, [sp, 0x10]\n"
+ "\tmov r2, r8\n"
+ "\tbl CpuSet\n"
+ "\tmovs r0, 0x80\n"
+ "\tlsls r0, 2\n"
+ "\tadds r1, r7, r0\n"
+ "\tldr r0, [sp, 0xC]\n"
+ "\tmov r2, r8\n"
+ "\tbl CpuSet\n"
+ "\tldr r1, [sp, 0xC]\n"
+ "\tadds r1, 0x40\n"
+ "\tstr r1, [sp, 0xC]\n"
+ "\tldr r0, [sp, 0x10]\n"
+ "\tadds r0, 0x40\n"
+ "\tstr r0, [sp, 0x10]\n"
+ "\tldr r1, [sp, 0x14]\n"
+ "\tadds r1, 0x20\n"
+ "\tstr r1, [sp, 0x14]\n"
+ "\tldr r0, [sp, 0x18]\n"
+ "\tadds r0, 0x20\n"
+ "\tstr r0, [sp, 0x18]\n"
+ "\tmovs r1, 0x20\n"
+ "\tadd r10, r1\n"
+ "\tadd r9, r1\n"
+ "\tadds r4, 0x1\n"
+ "\tcmp r4, r5\n"
+ "\tble _080C32B2\n"
+ "_080C3382:\n"
+ "\tldr r4, _080C33D4 @ =gUnknown_083D1644\n"
+ "\tldr r5, _080C33D8 @ =REG_BG0CNT\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r1, r7, 0\n"
+ "\tadds r2, r5, 0\n"
+ "\tbl CpuSet\n"
+ "\tadds r6, r4, 0\n"
+ "\tadds r6, 0x80\n"
+ "\tmovs r0, 0x80\n"
+ "\tlsls r0, 1\n"
+ "\tadds r1, r7, r0\n"
+ "\tadds r0, r6, 0\n"
+ "\tadds r2, r5, 0\n"
+ "\tbl CpuSet\n"
+ "\tmovs r0, 0x80\n"
+ "\tlsls r0, 2\n"
+ "\tadds r1, r7, r0\n"
+ "\tadds r0, r6, 0\n"
+ "\tadds r2, r5, 0\n"
+ "\tbl CpuSet\n"
+ "\tadds r4, 0x40\n"
+ "\tmovs r0, 0xC0\n"
+ "\tlsls r0, 2\n"
+ "\tadds r1, r7, r0\n"
+ "\tadds r0, r4, 0\n"
+ "\tadds r2, r5, 0\n"
+ "\tbl CpuSet\n"
+ "\tadd sp, 0x1C\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080C33D0: .4byte gUnknown_083D16E4\n"
+ "_080C33D4: .4byte gUnknown_083D1644\n"
+ "_080C33D8: .4byte REG_BG0CNT");
+}
+#endif //NONMATCHING
+
+void sub_80C33DC(void)
+{
+ int i;
+ struct SpriteTemplate template;
+ u8 spriteIds[8];
+
+ template = gSpriteTemplate_83D174C;
+ for (i = 0; i <8; i++)
+ LoadSpriteSheet(&gUnknown_083D1764[i]);
+
+ LoadSpritePalette(&gUnknown_083D17A4);
+ for (i = 0; i < 8; i++)
+ {
+ spriteIds[i] = CreateSprite(&template, 272, 144, 10);
+ template.tileTag++;
+ }
+
+ gSprites[spriteIds[0]].data[0] = spriteIds[1];
+ gSprites[spriteIds[0]].data[1] = spriteIds[2];
+ gSprites[spriteIds[0]].data[2] = spriteIds[3];
+
+ gSprites[spriteIds[4]].data[0] = spriteIds[5];
+ gSprites[spriteIds[4]].data[1] = spriteIds[6];
+ gSprites[spriteIds[4]].data[2] = spriteIds[7];
+
+ eContestLink80C2020Struct2018000.unk_00 = spriteIds[0];
+ eContestLink80C2020Struct2018000.unk_04 = 0;
+ eContestLink80C2020Struct2018000.unk_01 = spriteIds[4];
+ sub_80C3764();
+}
+
+u16 sub_80C34AC(const u8 * string)
+{
+ u8 width = (StringLength(string) * 6);
+ return 0x70 - (width / 2);
+}
+
+void sub_80C34CC(s16 arg0, u16 y, u16 arg2, u16 arg3)
+{
+ struct Sprite *sprite = &gSprites[eContestLink80C2020Struct2018000.unk_00];
+ sprite->pos1.x = 272;
+ sprite->pos1.y = y;
+ sprite->pos2.x = 0;
+ sprite->pos2.y = 0;
+ sprite->data[4] = arg0 + 32;
+ sprite->data[5] = arg2;
+ sprite->data[6] = arg3;
+ sprite->data[7] = 0;
+ sprite->callback = sub_80C3588;
+ eContestLink80C2020Struct2018000.unk_04 = 1;
+}
+
+void sub_80C3520(u16 arg0)
+{
+ struct Sprite *sprite = &gSprites[eContestLink80C2020Struct2018000.unk_00];
+ sprite->pos1.x += sprite->pos2.x;
+ sprite->pos1.y += sprite->pos2.y;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->data[6] = arg0;
+ sprite->data[7] = 0;
+ sprite->callback = sub_80C3630;
+ eContestLink80C2020Struct2018000.unk_04 = 3;
+}
+
+void sub_80C3564(struct Sprite *sprite)
+{
+ sprite->pos1.x = 272;
+ sprite->pos1.y = 144;
+ sprite->pos2.y = 0;
+ sprite->pos2.x = 0;
+ sprite->callback = SpriteCallbackDummy;
+ eContestLink80C2020Struct2018000.unk_04 = 0;
+}
+
+
+void sub_80C3588(struct Sprite *sprite)
+{
+ int i;
+ s16 var0;
+
+ var0 = (u16)sprite->data[7] + (u16)sprite->data[6];
+ sprite->pos1.x -= var0 >> 8;
+ sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF;
+ if (sprite->pos1.x < sprite->data[4])
+ sprite->pos1.x = sprite->data[4];
+
+ for (i = 0; i < 3; i++)
+ {
+ struct Sprite *sprite2 = &gSprites[sprite->data[i]];
+ sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64;
+ }
+
+ if (sprite->pos1.x == sprite->data[4])
+ sprite->callback = sub_80C35FC;
+}
+
+void sub_80C35FC(struct Sprite *sprite)
+{
+ eContestLink80C2020Struct2018000.unk_04 = 2;
+ if ((u16)sprite->data[5] != 0xFFFF)
+ {
+ if (--sprite->data[5] == -1)
+ sub_80C3520(sprite->data[6]);
+ }
+}
+
+void sub_80C3630(struct Sprite *sprite)
+{
+ int i;
+ s16 var0;
+
+ var0 = (u16)sprite->data[7] + (u16)sprite->data[6];
+ sprite->pos1.x -= var0 >> 8;
+ sprite->data[7] = (sprite->data[6] + sprite->data[7]) & 0xFF;
+ for (i = 0; i < 3; i++)
+ {
+ struct Sprite *sprite2 = &gSprites[sprite->data[i]];
+ sprite2->pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64;
+ }
+
+ if (sprite->pos1.x + sprite->pos2.x < -224)
+ sub_80C3564(sprite);
+}
+
+void sub_80C3698(const u8 *text)
+{
+ int i;
+ u16 x;
+ struct Sprite *sprite;
+
+ sub_80C3158(text, eContestLink80C2020Struct2018000.unk_01);
+ x = sub_80C34AC(text);
+ sprite = &gSprites[eContestLink80C2020Struct2018000.unk_01];
+ sprite->pos1.x = x + 32;
+ sprite->pos1.y = 80;
+ sprite->invisible = FALSE;
+ for (i = 0; i < 3; i++)
+ {
+ gSprites[sprite->data[i]].pos1.x = sprite->pos1.x + sprite->pos2.x + (i + 1) * 64;
+ gSprites[sprite->data[i]].pos1.y = sprite->pos1.y;
+ gSprites[sprite->data[i]].invisible = FALSE;
+ }
+
+ gBattle_WIN0H = 0x00F0;
+ gBattle_WIN0V = ((sprite->pos1.y - 16) << 8) | (sprite->pos1.y + 16);
+ REG_WININ = WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3 | WININ_WIN0_OBJ | WININ_WIN0_CLR;
+}
+
+void sub_80C3764(void)
+{
+ int i;
+ struct Sprite *sprite;
+
+ sprite = &gSprites[eContestLink80C2020Struct2018000.unk_01];
+ sprite->invisible = TRUE;
+ for (i = 0; i < 3; i++)
+ gSprites[sprite->data[i]].invisible = TRUE;
+
+ gBattle_WIN0H = 0;
+ gBattle_WIN0V = 0;
+ REG_WIN0H = gBattle_WIN0H;
+ REG_WIN0V = gBattle_WIN0V;
+ REG_WININ = WININ_WIN0_BG_ALL | WININ_WIN0_OBJ | WININ_WIN0_CLR | WININ_WIN1_BG_ALL | WININ_WIN1_OBJ | WININ_WIN1_CLR;
+}
+
+#ifdef ENGLISH
+#ifdef NONMATCHING
+static inline s32 de_sub_80C39A8(s32 a0)
+{
+ s32 result = 0;
+ if (gIsLinkContest & 0x1)
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 9, 2, 8, 2);
+ result = 8;
+ }
+ else if (gSpecialVar_ContestRank == 0)
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 0, 9, 2);
+ result = 9;
+ }
+ else if (gSpecialVar_ContestRank == 1)
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 9, 0, 8, 2);
+ result = 8;
+ }
+ else if (gSpecialVar_ContestRank == 2)
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 17, 0, 8, 2);
+ result = 8;
+ }
+ else
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 2, 9, 2);
+ result = 9;
+ }
+ return result;
+}
+
+static inline s32 de_sub_80C3A84(s32 a0, s32 * a1)
+{
+ s32 result;
+ if (gSpecialVar_ContestCategory == 0)
+ {
+ *a1 = 0;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 17, 2, 10, 2);
+ result = 10;
+ }
+ else if (gSpecialVar_ContestCategory == 1)
+ {
+ *a1 = 1;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 4, 11, 2);
+ result = 11;
+ }
+ else if (gSpecialVar_ContestCategory == 2)
+ {
+ *a1 = 2;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 11, 4, 10, 2);
+ result = 10;
+ }
+ else if (gSpecialVar_ContestCategory == 3)
+ {
+ *a1 = 3;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 21, 4, 10, 2);
+ result = 10;
+ }
+ else
+ {
+ *a1 = 4;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 1, gUnknown_08E964B8, 0, 6, 10, 2);
+ result = 10;
+ }
+ return result;
+}
+
+void sub_80C37E4(void)
+{
+ s32 sp0;
+ s32 i;
+ de_sub_80C3A84(de_sub_80C39A8(5) + 5, &sp0);
+ for (i = 0; i < 0x80; i++)
+ {
+ ((vu16 *)(VRAM + 0xE000))[i] &= 0xFFF;
+ ((vu16 *)(VRAM + 0xE000))[i] |= sp0 << 12;;
+ }
+}
+#else
+NAKED
+void sub_80C37E4(void)
+{
+ asm_unified("\tpush {r4-r6,lr}\n"
+ "\tsub sp, 0x10\n"
+ "\tmovs r5, 0x1\n"
+ "\tmovs r4, 0\n"
+ "\tldr r0, _080C3808 @ =gIsLinkContest\n"
+ "\tldrb r0, [r0]\n"
+ "\tadds r1, r5, 0\n"
+ "\tands r1, r0\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _080C3814\n"
+ "\tldr r0, _080C380C @ =0x0600e000\n"
+ "\tldr r3, _080C3810 @ =gUnknown_08E964B8\n"
+ "\tmovs r1, 0x9\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r2, 0x2\n"
+ "\tstr r2, [sp, 0x4]\n"
+ "\tb _080C386A\n"
+ "\t.align 2, 0\n"
+ "_080C3808: .4byte gIsLinkContest\n"
+ "_080C380C: .4byte 0x0600e000\n"
+ "_080C3810: .4byte gUnknown_08E964B8\n"
+ "_080C3814:\n"
+ "\tldr r0, _080C3830 @ =gSpecialVar_ContestRank\n"
+ "\tldrh r2, [r0]\n"
+ "\tcmp r2, 0\n"
+ "\tbne _080C383C\n"
+ "\tmovs r4, 0x1\n"
+ "\tldr r0, _080C3834 @ =0x0600e000\n"
+ "\tldr r3, _080C3838 @ =gUnknown_08E964B8\n"
+ "\tstr r2, [sp]\n"
+ "\tstr r2, [sp, 0x4]\n"
+ "\tmovs r1, 0x9\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tstr r1, [sp, 0xC]\n"
+ "\tb _080C3870\n"
+ "\t.align 2, 0\n"
+ "_080C3830: .4byte gSpecialVar_ContestRank\n"
+ "_080C3834: .4byte 0x0600e000\n"
+ "_080C3838: .4byte gUnknown_08E964B8\n"
+ "_080C383C:\n"
+ "\tcmp r2, 0x1\n"
+ "\tbne _080C385C\n"
+ "\tldr r0, _080C3854 @ =0x0600e000\n"
+ "\tldr r3, _080C3858 @ =gUnknown_08E964B8\n"
+ "\tmovs r1, 0x9\n"
+ "\tstr r1, [sp]\n"
+ "\tstr r4, [sp, 0x4]\n"
+ "\tmovs r1, 0x8\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tstr r1, [sp, 0xC]\n"
+ "\tb _080C3870\n"
+ "\t.align 2, 0\n"
+ "_080C3854: .4byte 0x0600e000\n"
+ "_080C3858: .4byte gUnknown_08E964B8\n"
+ "_080C385C:\n"
+ "\tcmp r2, 0x2\n"
+ "\tbne _080C3884\n"
+ "\tldr r0, _080C387C @ =0x0600e000\n"
+ "\tldr r3, _080C3880 @ =gUnknown_08E964B8\n"
+ "\tmovs r1, 0x11\n"
+ "\tstr r1, [sp]\n"
+ "\tstr r4, [sp, 0x4]\n"
+ "_080C386A:\n"
+ "\tmovs r1, 0x8\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tstr r2, [sp, 0xC]\n"
+ "_080C3870:\n"
+ "\tmovs r1, 0x5\n"
+ "\tmovs r2, 0x1\n"
+ "\tbl sub_809D104\n"
+ "\tb _080C389E\n"
+ "\t.align 2, 0\n"
+ "_080C387C: .4byte 0x0600e000\n"
+ "_080C3880: .4byte gUnknown_08E964B8\n"
+ "_080C3884:\n"
+ "\tmovs r4, 0x1\n"
+ "\tldr r0, _080C38C0 @ =0x0600e000\n"
+ "\tldr r3, _080C38C4 @ =gUnknown_08E964B8\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r2, 0x2\n"
+ "\tstr r2, [sp, 0x4]\n"
+ "\tmovs r1, 0x9\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tstr r2, [sp, 0xC]\n"
+ "\tmovs r1, 0x5\n"
+ "\tmovs r2, 0x1\n"
+ "\tbl sub_809D104\n"
+ "_080C389E:\n"
+ "\tadds r4, 0xD\n"
+ "\tldr r0, _080C38C8 @ =gSpecialVar_ContestCategory\n"
+ "\tldrh r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080C38CC\n"
+ "\tmovs r6, 0\n"
+ "\tldr r0, _080C38C0 @ =0x0600e000\n"
+ "\tldr r3, _080C38C4 @ =gUnknown_08E964B8\n"
+ "\tmovs r1, 0x11\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r2, 0x2\n"
+ "\tstr r2, [sp, 0x4]\n"
+ "\tmovs r1, 0xA\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tstr r2, [sp, 0xC]\n"
+ "\tb _080C392A\n"
+ "\t.align 2, 0\n"
+ "_080C38C0: .4byte 0x0600e000\n"
+ "_080C38C4: .4byte gUnknown_08E964B8\n"
+ "_080C38C8: .4byte gSpecialVar_ContestCategory\n"
+ "_080C38CC:\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _080C38EC\n"
+ "\tmovs r6, 0x1\n"
+ "\tldr r0, _080C38E4 @ =0x0600e000\n"
+ "\tldr r3, _080C38E8 @ =gUnknown_08E964B8\n"
+ "\tmovs r1, 0\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r1, 0x4\n"
+ "\tstr r1, [sp, 0x4]\n"
+ "\tmovs r1, 0xB\n"
+ "\tb _080C3924\n"
+ "\t.align 2, 0\n"
+ "_080C38E4: .4byte 0x0600e000\n"
+ "_080C38E8: .4byte gUnknown_08E964B8\n"
+ "_080C38EC:\n"
+ "\tcmp r0, 0x2\n"
+ "\tbne _080C3910\n"
+ "\tmovs r6, 0x2\n"
+ "\tldr r0, _080C3908 @ =0x0600e000\n"
+ "\tldr r3, _080C390C @ =gUnknown_08E964B8\n"
+ "\tmovs r1, 0xB\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r1, 0x4\n"
+ "\tstr r1, [sp, 0x4]\n"
+ "\tmovs r1, 0xA\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tstr r6, [sp, 0xC]\n"
+ "\tb _080C392A\n"
+ "\t.align 2, 0\n"
+ "_080C3908: .4byte 0x0600e000\n"
+ "_080C390C: .4byte gUnknown_08E964B8\n"
+ "_080C3910:\n"
+ "\tcmp r0, 0x3\n"
+ "\tbne _080C393C\n"
+ "\tmovs r6, 0x3\n"
+ "\tldr r0, _080C3934 @ =0x0600e000\n"
+ "\tldr r3, _080C3938 @ =gUnknown_08E964B8\n"
+ "\tmovs r1, 0x15\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r1, 0x4\n"
+ "\tstr r1, [sp, 0x4]\n"
+ "\tmovs r1, 0xA\n"
+ "_080C3924:\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tstr r1, [sp, 0xC]\n"
+ "_080C392A:\n"
+ "\tadds r1, r4, 0\n"
+ "\tadds r2, r5, 0\n"
+ "\tbl sub_809D104\n"
+ "\tb _080C395A\n"
+ "\t.align 2, 0\n"
+ "_080C3934: .4byte 0x0600e000\n"
+ "_080C3938: .4byte gUnknown_08E964B8\n"
+ "_080C393C:\n"
+ "\tmovs r6, 0x4\n"
+ "\tldr r0, _080C3984 @ =0x0600e000\n"
+ "\tldr r3, _080C3988 @ =gUnknown_08E964B8\n"
+ "\tmovs r1, 0\n"
+ "\tstr r1, [sp]\n"
+ "\tmovs r1, 0x6\n"
+ "\tstr r1, [sp, 0x4]\n"
+ "\tmovs r1, 0xA\n"
+ "\tstr r1, [sp, 0x8]\n"
+ "\tmovs r1, 0x2\n"
+ "\tstr r1, [sp, 0xC]\n"
+ "\tadds r1, r4, 0\n"
+ "\tadds r2, r5, 0\n"
+ "\tbl sub_809D104\n"
+ "_080C395A:\n"
+ "\tldr r5, _080C398C @ =0x00000fff\n"
+ "\tlsls r4, r6, 12\n"
+ "\tldr r2, _080C3984 @ =0x0600e000\n"
+ "\tmovs r3, 0x7F\n"
+ "_080C3962:\n"
+ "\tldrh r1, [r2]\n"
+ "\tadds r0, r5, 0\n"
+ "\tands r0, r1\n"
+ "\tstrh r0, [r2]\n"
+ "\tldrh r1, [r2]\n"
+ "\tadds r0, r4, 0\n"
+ "\torrs r0, r1\n"
+ "\tstrh r0, [r2]\n"
+ "\tadds r2, 0x2\n"
+ "\tsubs r3, 0x1\n"
+ "\tcmp r3, 0\n"
+ "\tbge _080C3962\n"
+ "\tadd sp, 0x10\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080C3984: .4byte 0x0600e000\n"
+ "_080C3988: .4byte gUnknown_08E964B8\n"
+ "_080C398C: .4byte 0x00000fff");
+}
+#endif // NONMATCHING
+
+#elif defined(GERMAN)
+s16 de_sub_80C39A8(s32 a0)
+{
+ s16 result;
+ if (gIsLinkContest & 1)
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 3, 8, 3);
+ result = 8;
+ }
+ else if (gSpecialVar_ContestRank == 0)
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 0, 11, 3);
+ result = 11;
+ }
+ else if (gSpecialVar_ContestRank == 1)
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 0, 10, 3);
+ result = 10;
+ }
+ else if (gSpecialVar_ContestRank == 2)
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 21, 0, 10, 3);
+ result = 10;
+ }
+ else
+ {
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 3, 11, 3);
+ result = 11;
+ }
+ return result;
+}
+
+s16 de_sub_80C3A84(s32 a0, s32 * a1)
+{
+ s16 result;
+ if (gSpecialVar_ContestCategory == 0)
+ {
+ *a1 = 0;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 19, 3, 7, 3);
+ result = 7;
+ }
+ else if (gSpecialVar_ContestCategory == 1)
+ {
+ *a1 = 1;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 0, 6, 7, 3);
+ result = 7;
+ }
+ else if (gSpecialVar_ContestCategory == 2)
+ {
+ *a1 = 2;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 7, 6, 4, 3);
+ result = 4;
+ }
+ else if (gSpecialVar_ContestCategory == 3)
+ {
+ *a1 = 3;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 11, 6, 6, 3);
+ result = 6;
+ }
+ else
+ {
+ *a1 = 4;
+ sub_809D104((void *)(VRAM + 0xE000), a0, 0, gUnknown_08E964B8, 17, 6, 5, 3);
+ result = 5;
+ }
+ return result;
+}
+
+void sub_80C37E4(void)
+{
+ s32 sp0;
+ s32 i;
+ de_sub_80C3A84(de_sub_80C39A8(6) + 6, &sp0);
+ for (i = 0; i < 0x80; i++)
+ {
+ ((vu16 *)(VRAM + 0xE000))[i] &= 0xFFF;
+ ((vu16 *)(VRAM + 0xE000))[i] |= sp0 << 12;;
+ }
+}
+#endif
+
+// fakematching?
+u8 sub_80C3990(u8 monIndex, u8 arg1)
+{
+ u32 var0;
+ u32 var1;
+
+ var0 = gContestMonRound1Points[monIndex] << 16;
+ var1 = var0 / 0x3F;
+ if (var1 & 0xFFFF)
+ var1 += 0x10000;
+
+ var1 >>= 16;
+ if (var1 == 0 && var0)
+ var1 = 1;
+
+ if (arg1 && var1 > 10)
+ var1 = 10;
+
+ return var1;
+}
+
+s8 sub_80C39E4(u8 arg0, u8 arg1)
+{
+ u32 r4;
+ u32 r2;
+ s16 val;
+ s8 ret;
+
+ val = gUnknown_02038688[arg0];
+ if (val < 0)
+ r4 = -val << 16;
+ else
+ r4 = val << 16;
+ r2 = r4 / 80;
+ if (r2 & 0xFFFF)
+ r2 += 0x10000;
+
+ r2 >>= 16;
+ if (r2 == 0 && r4 != 0)
+ r2 = 1;
+
+ if (arg1 != 0 && r2 > 10)
+ r2 = 10;
+
+ if (gUnknown_02038688[arg0] < 0)
+ ret = -r2;
+ else
+ ret = r2;
+
+ return ret;
+}
+
+void sub_80C3A5C(u8 taskId)
+{
+ u16 firstTileNum;
+
+ if (gTasks[taskId].data[10] == 0)
+ {
+ gTasks[taskId].data[11] = (3 - gTasks[taskId].data[0]) * 40;
+ gTasks[taskId].data[10]++;
+ }
+ else if (gTasks[taskId].data[10] == 1)
+ {
+ if (--gTasks[taskId].data[11] == -1)
+ {
+ firstTileNum = gTasks[taskId].data[0] * 2 + 0x5043;
+ *(vu16 *)((VRAM + 0xE142) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x00;
+ *(vu16 *)((VRAM + 0xE144) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x01;
+ *(vu16 *)((VRAM + 0xE182) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x10;
+ *(vu16 *)((VRAM + 0xE184) + gTasks[taskId].data[1] * 192) = firstTileNum + 0x11;
+ eContestLink80C2020Struct2018000.unk_05++;
+ DestroyTask(taskId);
+ PlaySE(SE_CONTEST_PLACE);
+ }
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80C3B30(u8 taskId)
+{
+ int i, j, k;
+
+ for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++)
+ ;
+
+ for (j = 0; j < 3; j++)
+ {
+ for (k = 0; k < 30; k++)
+ {
+ ((u16 *)((VRAM + 0xE100) + 2 * (96 * i + 32 * j)))[k] &= 0x0FFF;
+ ((u16 *)((VRAM + 0xE100) + 2 * (96 * i + 32 * j)))[k] |= 0x9000;
+ }
+ }
+ gTasks[taskId].data[10] = i;
+ gTasks[taskId].data[12] = 1;
+ gTasks[taskId].func = sub_80C3BD8;
+ eContestLink80C2020Struct2018000.unk_03 = taskId;
+}
+#else
+NAKED
+void sub_80C3B30(u8 taskId)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r12, r0\n"
+ "\tmovs r5, 0\n"
+ "\tldr r1, _080C3BC0 @ =gContestFinalStandings\n"
+ "\tldrb r0, [r1]\n"
+ "\tldr r2, _080C3BC4 @ =gTasks\n"
+ "\tmov r10, r2\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080C3B5C\n"
+ "_080C3B4E:\n"
+ "\tadds r5, 0x1\n"
+ "\tcmp r5, 0x3\n"
+ "\tbgt _080C3B5C\n"
+ "\tadds r0, r5, r1\n"
+ "\tldrb r0, [r0]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080C3B4E\n"
+ "_080C3B5C:\n"
+ "\tmovs r1, 0\n"
+ "\tlsls r0, r5, 1\n"
+ "\tmov r2, r12\n"
+ "\tlsls r2, 2\n"
+ "\tmov r9, r2\n"
+ "\tadds r0, r5\n"
+ "\tlsls r0, 5\n"
+ "\tmov r8, r0\n"
+ "\tldr r7, _080C3BC8 @ =0x00000fff\n"
+ "\tmovs r0, 0x90\n"
+ "\tlsls r0, 8\n"
+ "\tadds r6, r0, 0\n"
+ "_080C3B74:\n"
+ "\tlsls r0, r1, 5\n"
+ "\tadds r4, r1, 0x1\n"
+ "\tadd r0, r8\n"
+ "\t@ the next two instructions are swapped\n"
+ "\tmovs r3, 0x1D\n"
+ "\tlsls r0, 1\n"
+ "\tldr r1, _080C3BCC @ =0x0600e100\n"
+ "\tadds r2, r0, r1\n"
+ "_080C3B82:\n"
+ "\tldrh r1, [r2]\n"
+ "\tadds r0, r7, 0\n"
+ "\tands r0, r1\n"
+ "\torrs r0, r6\n"
+ "\tstrh r0, [r2]\n"
+ "\tadds r2, 0x2\n"
+ "\tsubs r3, 0x1\n"
+ "\tcmp r3, 0\n"
+ "\tbge _080C3B82\n"
+ "\tadds r1, r4, 0\n"
+ "\tcmp r1, 0x2\n"
+ "\tble _080C3B74\n"
+ "\tmov r0, r9\n"
+ "\tadd r0, r12\n"
+ "\tlsls r0, 3\n"
+ "\tadd r0, r10\n"
+ "\tstrh r5, [r0, 0x1C]\n"
+ "\tmovs r1, 0x1\n"
+ "\tstrh r1, [r0, 0x20]\n"
+ "\tldr r2, _080C3BD0 @ =sub_80C3BD8\n"
+ "\tstr r2, [r0]\n"
+ "\tmov r1, r12\n"
+ "\tldr r0, _080C3BD4 @ =gSharedMem + 0x18000\n"
+ "\tstrb r1, [r0, 0x3]\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080C3BC0: .4byte gContestFinalStandings\n"
+ "_080C3BC4: .4byte gTasks\n"
+ "_080C3BC8: .4byte 0x00000fff\n"
+ "_080C3BCC: .4byte 0x0600e100\n"
+ "_080C3BD0: .4byte sub_80C3BD8\n"
+ "_080C3BD4: .4byte gSharedMem + 0x18000");
+}
+#endif //NONMATCHING
+
+void sub_80C3BD8(u8 taskId)
+{
+ if (++gTasks[taskId].data[11] == 1)
+ {
+ gTasks[taskId].data[11] = 0;
+ BlendPalette(0x91, 1, gTasks[taskId].data[12], RGB(13, 28, 27));
+ if (gTasks[taskId].data[13] == 0)
+ {
+ if (++gTasks[taskId].data[12] == 16)
+ gTasks[taskId].data[13] = 1;
+ }
+ else
+ {
+ if (--gTasks[taskId].data[12] == 0)
+ gTasks[taskId].data[13] = 0;
+ }
+ }
+}
+
+void sub_80C3C44(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 10)
+ {
+ if (++sprite->data[0] == 10)
+ {
+ PlayCry1(sprite->data[1], 0);
+ sprite->data[1] = 0;
+ }
+ }
+ else
+ {
+ s16 delta = (u16)sprite->data[1] + 0x600;
+ sprite->pos1.x -= delta >> 8;
+ sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF;
+ if (sprite->pos1.x < 120)
+ sprite->pos1.x = 120;
+
+ if (sprite->pos1.x == 120)
+ {
+ sprite->callback = SpriteCallbackDummy;
+ sprite->data[1] = 0;
+ eContestLink80C2020Struct2018000.unk_06 = 1;
+ }
+ }
+}
+
+void sub_80C3CB8(struct Sprite *sprite)
+{
+ s16 delta = (u16)sprite->data[1] + 0x600;
+ sprite->pos1.x -= delta >> 8;
+ sprite->data[1] = (sprite->data[1] + 0x600) & 0xFF;
+ if (sprite->pos1.x < -32)
+ {
+ sprite->callback = SpriteCallbackDummy;
+ sprite->invisible = TRUE;
+ eContestLink80C2020Struct2018000.unk_06 = 2;
+ }
+}
+
+void sub_80C3D04(u8 taskId)
+{
+ if (++gTasks[taskId].data[0] == 5)
+ {
+ gTasks[taskId].data[0] = 0;
+ if (eContestLink80C2020Struct2018000.unk_07 < 40)
+ {
+ u8 spriteId = CreateSprite(&gSpriteTemplate_83D17B4, (Random() % 240) - 20, 44, 5);
+ gSprites[spriteId].data[0] = Random() % 512;
+ gSprites[spriteId].data[1] = (Random() % 24) + 16;
+ gSprites[spriteId].data[2] = (Random() % 256) + 48;
+ gSprites[spriteId].oam.tileNum += Random() % 17;
+ eContestLink80C2020Struct2018000.unk_07++;
+ }
+ }
+
+ if (eContestLink80C2020Struct2018000.unk_09)
+ DestroyTask(taskId);
+}
+
+void sub_80C3DF0(struct Sprite *sprite)
+{
+ register s16 var0 asm("r1");
+
+ sprite->data[3] += sprite->data[0];
+ sprite->pos2.x = Sin(sprite->data[3] >> 8, sprite->data[1]);
+ var0 = sprite->data[4] + sprite->data[2];
+ sprite->pos1.x += var0 >> 8;
+ var0 = var0 & 0xFF;
+ sprite->data[4] = var0;
+ sprite->pos1.y++;
+ if (eContestLink80C2020Struct2018000.unk_09)
+ sprite->invisible = TRUE;
+
+ if (sprite->pos1.x > 248 || sprite->pos1.y > 116)
+ {
+ DestroySprite(sprite);
+ eContestLink80C2020Struct2018000.unk_07--;
+ }
+}
+
+void sub_80C3E60(u8 monIndex, u8 numFrames)
+{
+ u8 taskId = CreateTask(sub_80C3EA4, 8);
+ gTasks[taskId].data[0] = monIndex;
+ gTasks[taskId].data[1] = numFrames;
+ gTasks[taskId].data[2] = gContestMons[monIndex].species;
+}
+
+void sub_80C3EA4(u8 taskId)
+{
+ u8 monIndex = gTasks[taskId].data[0];
+ if (gTasks[taskId].data[10]++ == gTasks[taskId].data[1])
+ {
+ gTasks[taskId].data[10] = 0;
+ sub_80C3024(gTasks[taskId].data[2], monIndex, gTasks[taskId].data[11], FALSE, gContestMons[monIndex].personality);
+ gTasks[taskId].data[11] ^= 1;
+ }
+}
+
+void sub_80C3F00(void)
+{
+ s32 i;
+ s16 r2 = gContestMonTotalPoints[0];
+ s32 r4;
+ u32 r5;
+ s8 r0;
+
+ for (i = 1; i < 4; i++)
+ {
+ if (r2 < gContestMonTotalPoints[i])
+ r2 = gContestMonTotalPoints[i];
+ }
+
+ if (r2 < 0)
+ {
+ r2 = gContestMonTotalPoints[0];
+
+ for (i = 1; i < 4; i++)
+ {
+ if (r2 > gContestMonTotalPoints[i])
+ r2 = gContestMonTotalPoints[i];
+ }
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ r4 = 1000 * gContestMonRound1Points[i] / ABS(r2);
+ if ((r4 % 10) >= 5)
+ r4 += 10;
+ eContestLink80C2020Struct2018018[i].unk_00 = r4 / 10;
+
+ r4 = 1000 * ABS(gUnknown_02038688[i]) / ABS(r2);
+ if ((r4 % 10) >= 5)
+ r4 += 10;
+ eContestLink80C2020Struct2018018[i].unk_04 = r4 / 10;
+
+ if (gUnknown_02038688[i] < 0)
+ eContestLink80C2020Struct2018018[i].unk_10 = 1;
+
+ r5 = 22528 * eContestLink80C2020Struct2018018[i].unk_00 / 100;
+ if ((r5 % 256) >= 128)
+ r5 += 256;
+ eContestLink80C2020Struct2018018[i].unk_08 = r5 / 256;
+
+ r5 = eContestLink80C2020Struct2018018[i].unk_04 * 22528 / 100;
+ if ((r5 % 256) >= 128)
+ r5 += 256;
+ eContestLink80C2020Struct2018018[i].unk_0c = r5 / 256;
+
+ eContestLink80C2020Struct2018018[i].unk_11 = sub_80C3990(i, 1);
+ r0 = sub_80C39E4(i, 1);
+ eContestLink80C2020Struct2018018[i].unk_12 = ABS(r0);
+
+ if (gContestFinalStandings[i])
+ {
+ s16 r2__ = eContestLink80C2020Struct2018018[i].unk_08;
+ s16 r1__ = eContestLink80C2020Struct2018018[i].unk_0c;
+ if (eContestLink80C2020Struct2018018[i].unk_10)
+ r1__ = -r1__;
+ if (r2__ + r1__ == 88)
+ {
+ if (r1__ > 0)
+ eContestLink80C2020Struct2018018[i].unk_0c--;
+ else if (r2__ > 0)
+ eContestLink80C2020Struct2018018[i].unk_08--;
+ }
+ }
+ }
+}
+
+#ifdef NONMATCHING
+void sub_80C40D4(u8 arg0, u8 arg1)
+{
+ int i;
+ u8 taskId;
+ u8 sp8, spC;
+
+ sp8 = 0;
+ spC = 0;
+ if (!arg0)
+ {
+ u32 var0;
+ for (i = 0; i < 4; i++)
+ {
+ u8 var1 = eContestLink80C2020Struct2018018[i].unk_11;
+ if (arg1 < var1)
+ {
+ int x = var1 + 19;
+ x += 32 * (i * 3 + 5);
+ x -= arg1;
+ x--;
+ *(vu16 *)((VRAM + 0xC000) + 2 * x) = 0x60B3;
+ taskId = CreateTask(sub_80C42C0, 10);
+ var0 = ((eContestLink80C2020Struct2018018[i].unk_08 << 16) / eContestLink80C2020Struct2018018[i].unk_11) * (arg1 + 1);
+ if ((var0 % 0x10000) >= 0x8000)
+ var0 += 0x10000;
+
+ gTasks[taskId].data[0] = i;
+ gTasks[taskId].data[1] = var0 >> 16;
+ eContestLink80C2020Struct2018000.unk_14++;
+ sp8++;
+ }
+ }
+ }
+ else
+ {
+ u32 var0;
+ for (i = 0; i < 4; i++)
+ {
+ int tile;
+ s8 var1 = eContestLink80C2020Struct2018018[i].unk_12;
+ tile = eContestLink80C2020Struct2018018[i].unk_10 ? 0x60A5 : 0x60A3;
+ if (arg1 < var1)
+ {
+ int x = var1 + 19;
+ x += 32 * (i * 3 + 6);
+ x -= arg1;
+ x--;
+ *(vu16 *)((VRAM + 0xC000) + 2 * x) = tile;
+ taskId = CreateTask(sub_80C42C0, 10);
+ var0 = ((eContestLink80C2020Struct2018018[i].unk_0c << 16) / eContestLink80C2020Struct2018018[i].unk_12) * (arg1 + 1);
+ if ((var0 % 0x10000) >= 0x8000)
+ var0 += 0x10000;
+
+ gTasks[taskId].data[0] = i;
+ if (eContestLink80C2020Struct2018018[i].unk_10)
+ {
+ gTasks[taskId].data[2] = 1;
+ spC++;
+ }
+ else
+ {
+ sp8++;
+ }
+
+ if (eContestLink80C2020Struct2018018[i].unk_10)
+ gTasks[taskId].data[1] = -(var0 >> 16) + eContestLink80C2020Struct2018018[i].unk_08;
+ else
+ gTasks[taskId].data[1] = (var0 >> 16) + eContestLink80C2020Struct2018018[i].unk_08;
+
+ eContestLink80C2020Struct2018000.unk_14++;
+ }
+ }
+ }
+
+ if (spC)
+ PlaySE(SE_BOO);
+
+ if (sp8)
+ PlaySE(SE_PIN);
+}
+#else
+// Assorted register differences
+NAKED
+void sub_80C40D4(u8 arg0, u8 arg1)
+{
+ asm_unified("\tpush {r4-r7,lr}\n"
+ "\tmov r7, r10\n"
+ "\tmov r6, r9\n"
+ "\tmov r5, r8\n"
+ "\tpush {r5-r7}\n"
+ "\tsub sp, 0x8\n"
+ "\tlsls r0, 24\n"
+ "\tlsls r1, 24\n"
+ "\tlsrs r7, r1, 24\n"
+ "\tmovs r1, 0\n"
+ "\tmov r10, r1\n"
+ "\tmovs r2, 0\n"
+ "\tstr r2, [sp]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _080C4198\n"
+ "\tmov r8, r2\n"
+ "\tldr r0, _080C417C @ =gSharedMem + 0x18018\n"
+ "\tsubs r1, 0x18\n"
+ "\tadds r1, r0\n"
+ "\tmov r9, r1\n"
+ "\tadds r4, r0, 0\n"
+ "\tadds r4, 0x8\n"
+ "\tmovs r6, 0xA0\n"
+ "_080C4102:\n"
+ "\tldrb r0, [r4, 0x9]\n"
+ "\tcmp r7, r0\n"
+ "\tbcs _080C416A\n"
+ "\tadds r0, 0x13\n"
+ "\tadds r0, r6, r0\n"
+ "\tsubs r0, r7\n"
+ "\tlsls r0, 1\n"
+ "\tldr r2, _080C4180 @ =0x0600bffe\n"
+ "\tadds r0, r2\n"
+ "\tldr r2, _080C4184 @ =0x000060b3\n"
+ "\tadds r1, r2, 0\n"
+ "\tstrh r1, [r0]\n"
+ "\tldr r0, _080C4188 @ =sub_80C42C0\n"
+ "\tmovs r1, 0xA\n"
+ "\tbl CreateTask\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tldr r0, [r4]\n"
+ "\tlsls r0, 16\n"
+ "\tldrb r1, [r4, 0x9]\n"
+ "\tbl __udivsi3\n"
+ "\tadds r1, r7, 0x1\n"
+ "\tadds r3, r0, 0\n"
+ "\tmuls r3, r1\n"
+ "\tldr r0, _080C418C @ =0x0000ffff\n"
+ "\tands r0, r3\n"
+ "\tldr r1, _080C4190 @ =0x00007fff\n"
+ "\tcmp r0, r1\n"
+ "\tbls _080C4146\n"
+ "\tmovs r0, 0x80\n"
+ "\tlsls r0, 9\n"
+ "\tadds r3, r0\n"
+ "_080C4146:\n"
+ "\tldr r1, _080C4194 @ =gTasks\n"
+ "\tlsls r0, r5, 2\n"
+ "\tadds r0, r5\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r1\n"
+ "\tmov r1, r8\n"
+ "\tstrh r1, [r0, 0x8]\n"
+ "\tlsrs r1, r3, 16\n"
+ "\tstrh r1, [r0, 0xA]\n"
+ "\tmov r2, r9\n"
+ "\tldrb r0, [r2, 0x14]\n"
+ "\tadds r0, 0x1\n"
+ "\tstrb r0, [r2, 0x14]\n"
+ "\tmov r0, r10\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r10, r0\n"
+ "_080C416A:\n"
+ "\tadds r4, 0x14\n"
+ "\tadds r6, 0x60\n"
+ "\tmovs r0, 0x1\n"
+ "\tadd r8, r0\n"
+ "\tmov r1, r8\n"
+ "\tcmp r1, 0x3\n"
+ "\tble _080C4102\n"
+ "\tb _080C4292\n"
+ "\t.align 2, 0\n"
+ "_080C417C: .4byte gSharedMem + 0x18018\n"
+ "_080C4180: .4byte 0x0600bffe\n"
+ "_080C4184: .4byte 0x000060b3\n"
+ "_080C4188: .4byte sub_80C42C0\n"
+ "_080C418C: .4byte 0x0000ffff\n"
+ "_080C4190: .4byte 0x00007fff\n"
+ "_080C4194: .4byte gTasks\n"
+ "_080C4198:\n"
+ "\tmovs r2, 0\n"
+ "\tmov r8, r2\n"
+ "\tldr r0, _080C4220 @ =gSharedMem + 0x18018\n"
+ "\tmov r12, r0\n"
+ "\tmov r9, r2\n"
+ "\tmovs r1, 0xC0\n"
+ "\tstr r1, [sp, 0x4]\n"
+ "_080C41A6:\n"
+ "\tmov r6, r9\n"
+ "\tadd r6, r12\n"
+ "\tldrb r1, [r6, 0x12]\n"
+ "\tldrb r0, [r6, 0x10]\n"
+ "\tldr r2, _080C4224 @ =0x000060a3\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080C41B6\n"
+ "\tadds r2, 0x2\n"
+ "_080C41B6:\n"
+ "\tlsls r0, r1, 24\n"
+ "\tasrs r0, 24\n"
+ "\tcmp r7, r0\n"
+ "\tbge _080C427E\n"
+ "\tadds r0, 0x13\n"
+ "\tldr r1, [sp, 0x4]\n"
+ "\tadds r0, r1, r0\n"
+ "\tsubs r0, r7\n"
+ "\tlsls r0, 1\n"
+ "\tldr r1, _080C4228 @ =0x0600bffe\n"
+ "\tadds r0, r1\n"
+ "\tstrh r2, [r0]\n"
+ "\tldr r0, _080C422C @ =sub_80C42C0\n"
+ "\tmovs r1, 0xA\n"
+ "\tbl CreateTask\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tldr r0, [r6, 0xC]\n"
+ "\tlsls r0, 16\n"
+ "\tldrb r1, [r6, 0x12]\n"
+ "\tbl __udivsi3\n"
+ "\tadds r1, r7, 0x1\n"
+ "\tadds r3, r0, 0\n"
+ "\tmuls r3, r1\n"
+ "\tldr r0, _080C4230 @ =0x0000ffff\n"
+ "\tands r0, r3\n"
+ "\tldr r1, _080C4234 @ =0x00007fff\n"
+ "\tcmp r0, r1\n"
+ "\tbls _080C41FA\n"
+ "\tmovs r2, 0x80\n"
+ "\tlsls r2, 9\n"
+ "\tadds r3, r2\n"
+ "_080C41FA:\n"
+ "\tldr r1, _080C4238 @ =gTasks\n"
+ "\tlsls r2, r5, 2\n"
+ "\tadds r0, r2, r5\n"
+ "\tlsls r0, 3\n"
+ "\tadds r4, r0, r1\n"
+ "\tmov r0, r8\n"
+ "\tstrh r0, [r4, 0x8]\n"
+ "\tldrb r0, [r6, 0x10]\n"
+ "\tadds r6, r1, 0\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080C423C\n"
+ "\tmovs r0, 0x1\n"
+ "\tstrh r0, [r4, 0xC]\n"
+ "\tldr r0, [sp]\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tstr r0, [sp]\n"
+ "\tb _080C4246\n"
+ "\t.align 2, 0\n"
+ "_080C4220: .4byte gSharedMem + 0x18018\n"
+ "_080C4224: .4byte 0x000060a3\n"
+ "_080C4228: .4byte 0x0600bffe\n"
+ "_080C422C: .4byte sub_80C42C0\n"
+ "_080C4230: .4byte 0x0000ffff\n"
+ "_080C4234: .4byte 0x00007fff\n"
+ "_080C4238: .4byte gTasks\n"
+ "_080C423C:\n"
+ "\tmov r0, r10\n"
+ "\tadds r0, 0x1\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tmov r10, r0\n"
+ "_080C4246:\n"
+ "\tldr r0, _080C4264 @ =gSharedMem + 0x18018\n"
+ "\tmov r1, r9\n"
+ "\tadds r4, r1, r0\n"
+ "\tldrb r1, [r4, 0x10]\n"
+ "\tmov r12, r0\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _080C4268\n"
+ "\tadds r0, r2, r5\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r6\n"
+ "\tlsrs r2, r3, 16\n"
+ "\tldr r1, [r4, 0x8]\n"
+ "\tsubs r1, r2\n"
+ "\tb _080C4274\n"
+ "\t.align 2, 0\n"
+ "_080C4264: .4byte gSharedMem + 0x18018\n"
+ "_080C4268:\n"
+ "\tadds r0, r2, r5\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r6\n"
+ "\tlsrs r2, r3, 16\n"
+ "\tldr r1, [r4, 0x8]\n"
+ "\tadds r1, r2\n"
+ "_080C4274:\n"
+ "\tstrh r1, [r0, 0xA]\n"
+ "\tldr r1, _080C42BC @ =gSharedMem + 0x18000\n"
+ "\tldrb r0, [r1, 0x14]\n"
+ "\tadds r0, 0x1\n"
+ "\tstrb r0, [r1, 0x14]\n"
+ "_080C427E:\n"
+ "\tmovs r2, 0x14\n"
+ "\tadd r9, r2\n"
+ "\tldr r0, [sp, 0x4]\n"
+ "\tadds r0, 0x60\n"
+ "\tstr r0, [sp, 0x4]\n"
+ "\tmovs r1, 0x1\n"
+ "\tadd r8, r1\n"
+ "\tmov r2, r8\n"
+ "\tcmp r2, 0x3\n"
+ "\tble _080C41A6\n"
+ "_080C4292:\n"
+ "\tldr r0, [sp]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080C429E\n"
+ "\tmovs r0, 0x16\n"
+ "\tbl PlaySE\n"
+ "_080C429E:\n"
+ "\tmov r1, r10\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _080C42AA\n"
+ "\tmovs r0, 0x15\n"
+ "\tbl PlaySE\n"
+ "_080C42AA:\n"
+ "\tadd sp, 0x8\n"
+ "\tpop {r3-r5}\n"
+ "\tmov r8, r3\n"
+ "\tmov r9, r4\n"
+ "\tmov r10, r5\n"
+ "\tpop {r4-r7}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080C42BC: .4byte gSharedMem + 0x18000");
+}
+#endif //NONMATCHING
+
+void sub_80C42C0(u8 taskId /*r12*/)
+{
+ bool32 r6 = FALSE;
+ bool32 r9 = FALSE;
+ u8 r5 = gTasks[taskId].data[0];
+ s16 r7 = gTasks[taskId].data[1];
+ s16 r1 = gTasks[taskId].data[2];
+ s32 i;
+
+ if (r1 != 0)
+ {
+ if (eContestLink80C2020Struct2018000.unk_0c[r5] <= 0)
+ r6 = TRUE;
+ }
+ else
+ {
+ if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 88)
+ r6 = TRUE;
+ }
+ if (eContestLink80C2020Struct2018000.unk_0c[r5] == r7)
+ r9 = TRUE;
+
+ if (!r9)
+ {
+ if (r6)
+ {
+ eContestLink80C2020Struct2018000.unk_0c[r5] = r7;
+ }
+ else if (r1 != 0)
+ {
+ eContestLink80C2020Struct2018000.unk_0c[r5]--;
+ }
+ else
+ {
+ eContestLink80C2020Struct2018000.unk_0c[r5]++;
+ }
+ }
+ if (!r6)
+ {
+ if (!r9)
+ {
+ for (i = 0; i < 11; i++)
+ {
+ u8 r0;
+ u16 tile;
+ if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 8 * (i + 1))
+ {
+ r0 = 8;
+ }
+ else if (eContestLink80C2020Struct2018000.unk_0c[r5] >= 8 * i)
+ {
+ r0 = eContestLink80C2020Struct2018000.unk_0c[r5] % 8;
+ }
+ else
+ {
+ r0 = 0;
+ }
+ if (r0 < 4)
+ tile = 0x504C + r0;
+ else
+ tile = 0x5057 + r0;
+ *(vu16 *)((VRAM + 0xE18E) + 2 * (96 * r5 + i)) = tile;
+ }
+ }
+ }
+ if (r9)
+ {
+ eContestLink80C2020Struct2018000.unk_14--;
+ DestroyTask(taskId);
+ }
+}
+
+void ScrSpecial_CheckSelectedMonAndInitContest(void)
+{
+ u8 result = CanMonParticipateInContest(&gPlayerParty[gContestMonPartyIndex]);
+ if (result != 0)
+ {
+ Contest_InitAllPokemon(gSpecialVar_ContestCategory, gSpecialVar_ContestRank);
+ InitContestMonConditions(gSpecialVar_ContestCategory);
+ }
+ gSpecialVar_Result = result;
+}
+
+u16 ScrSpecial_CanMonParticipateInSelectedLinkContest(void)
+{
+ u16 result = 0;
+ struct Pokemon *mon = &gPlayerParty[gContestMonPartyIndex];
+ switch (gSpecialVar_ContestCategory)
+ {
+ case CONTEST_CATEGORY_COOL:
+ if (GetMonData(mon, MON_DATA_COOL_RIBBON) > gSpecialVar_ContestRank)
+ result = 1;
+ break;
+ case CONTEST_CATEGORY_BEAUTY:
+ if (GetMonData(mon, MON_DATA_BEAUTY_RIBBON) > gSpecialVar_ContestRank)
+ result = 1;
+ break;
+ case CONTEST_CATEGORY_CUTE:
+ if (GetMonData(mon, MON_DATA_CUTE_RIBBON) > gSpecialVar_ContestRank)
+ result = 1;
+ break;
+ case CONTEST_CATEGORY_SMART:
+ if (GetMonData(mon, MON_DATA_SMART_RIBBON) > gSpecialVar_ContestRank)
+ result = 1;
+ break;
+ case CONTEST_CATEGORY_TOUGH:
+ if (GetMonData(mon, MON_DATA_TOUGH_RIBBON) > gSpecialVar_ContestRank)
+ result = 1;
+ break;
+ }
+
+ return result;
+}
+
+
+void ScrSpecial_GiveContestRibbon(void)
+{
+ u8 ribbonData;
+
+ if (gContestFinalStandings[gContestPlayerMonIndex] != 0)
+ return;
+
+ switch (gSpecialVar_ContestCategory)
+ {
+ case CONTEST_CATEGORY_COOL:
+ ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON);
+ if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4)
+ {
+ ribbonData++;
+ SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_COOL_RIBBON, &ribbonData);
+ }
+ break;
+ case CONTEST_CATEGORY_BEAUTY:
+ ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON);
+ if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4)
+ {
+ ribbonData++;
+ SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_BEAUTY_RIBBON, &ribbonData);
+ }
+ break;
+ case CONTEST_CATEGORY_CUTE:
+ ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON);
+ if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4)
+ {
+ ribbonData++;
+ SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_CUTE_RIBBON, &ribbonData);
+ }
+ break;
+ case CONTEST_CATEGORY_SMART:
+ ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON);
+ if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4)
+ {
+ ribbonData++;
+ SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_SMART_RIBBON, &ribbonData);
+ }
+ break;
+ case CONTEST_CATEGORY_TOUGH:
+ ribbonData = GetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON);
+ if (ribbonData <= gSpecialVar_ContestRank && ribbonData < 4)
+ {
+ ribbonData++;
+ SetMonData(&gPlayerParty[gContestMonPartyIndex], MON_DATA_TOUGH_RIBBON, &ribbonData);
+ }
+ break;
+ }
+}
+
+void Contest_CopyAndConvertTrainerName_Intl(u8 * dest, const u8 * src)
+{
+ StringCopy(dest, src);
+ if (dest[0] == EXT_CTRL_CODE_BEGIN && dest[1] == 0x15)
+ ConvertInternationalString(dest, LANGUAGE_JAPANESE);
+}
+
+void Contest_CopyAndConvertNicknameI_Intl(u8 * dest, u8 idx)
+{
+ StringCopy(dest, gContestMons[idx].nickname);
+ if (gIsLinkContest & 1)
+ {
+ if (gLinkPlayers[idx].language == LANGUAGE_JAPANESE)
+ {
+ ConvertInternationalString(dest, GetStringLanguage(dest));
+ }
+ }
+}
+
+void Contest_GetTrainerNameI_StringVar1(void)
+{
+ if (gIsLinkContest & 1)
+ {
+ Contest_CopyAndConvertTrainerName_Intl(gStringVar1, gLinkPlayers[gSpecialVar_0x8006].name);
+ }
+ else
+ {
+ Contest_CopyAndConvertTrainerName_Intl(gStringVar1, gContestMons[gSpecialVar_0x8006].trainerName);
+ }
+}
+
+void Contest_GetNicknameI_StringVar1(void)
+{
+ Contest_CopyAndConvertNicknameI_Intl(gStringVar3, gSpecialVar_0x8006);
+}
+
+void ScrSpecial_CountContestMonsWithBetterCondition(void)
+{
+ u8 i;
+ u8 count;
+
+ for (i = 0, count = 0; i < 4; i++)
+ {
+ if (gContestMonRound1Points[gSpecialVar_0x8006] < gContestMonRound1Points[i])
+ count++;
+ }
+
+ gSpecialVar_0x8004 = count;
+}
+
+void ScrSpecial_GetMonCondition(void)
+{
+ gSpecialVar_0x8004 = gContestMonRound1Points[gSpecialVar_0x8006];
+}
+
+void ScrSpecial_GetContestWinnerIdx(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++)
+ ;
+
+ gSpecialVar_0x8005 = i;
+}
+
+void ScrSpecial_GetContestWinnerTrainerName(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++)
+ ;
+
+ if (gIsLinkContest & 1)
+ {
+ Contest_CopyAndConvertTrainerName_Intl(gStringVar3, gLinkPlayers[i].name);
+ }
+ else
+ {
+ Contest_CopyAndConvertTrainerName_Intl(gStringVar3, gContestMons[i].trainerName);
+ }
+}
+
+void ScrSpecial_GetContestWinnerNick(void)
+{
+ u8 i;
+
+ for (i = 0; i < 4 && gContestFinalStandings[i] != 0; i++)
+ ;
+
+ Contest_CopyAndConvertNicknameI_Intl(gStringVar1, i);
+}
+
+void sub_80C488C(void)
+{
+ SetMainCallback2(CB2_StartContest);
+}
+
+void sub_80C489C(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+ SetMainCallback2(sub_80C488C);
+ }
+}
+
+void sub_80C48C8(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(sub_80C489C, 10);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+}
+
+void Contest_GetSpeciesNameI_StringVar1(void)
+{
+ gSpecialVar_0x8004 = gContestMons[gSpecialVar_0x8006].species;
+}
+
+void sub_80C4914(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ DestroyTask(taskId);
+ SetMainCallback2(sub_80C2358);
+ }
+}
+
+void sub_80C4940(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(sub_80C4914, 10);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+}
+
+void ScrSpecial_GetContestPlayerMonIdx(void)
+{
+ gSpecialVar_0x8004 = gContestPlayerMonIndex;
+}
+
+void ContestLinkTransfer(u8 category)
+{
+ u8 taskId;
+ ScriptContext2_Enable();
+ taskId = CreateTask(Task_LinkContest_Init, 0);
+ SetTaskFuncWithFollowupFunc(taskId, Task_LinkContest_Init, Task_StartCommunication);
+ gTasks[taskId].data[9] = category;
+}
+
+void Task_StartCommunication(u8 taskId)
+{
+ Contest_CreatePlayerMon(gContestMonPartyIndex);
+ SetTaskFuncWithFollowupFunc(taskId, sub_80C8734, Task_StartCommunicateRng);
+}
+
+void Task_StartCommunicateRng(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(
+ taskId, Task_LinkContest_CommunicateRng, Task_StartCommunicateLeaderIds);
+}
+
+void Task_StartCommunicateLeaderIds(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(
+ taskId, Task_LinkContest_CommunicateLeaderIds, Task_StartCommunicateCategory);
+}
+
+void Task_StartCommunicateCategory(u8 taskId)
+{
+ SetTaskFuncWithFollowupFunc(
+ taskId, Task_LinkContest_CommunicateCategory, Task_LinkContest_SetUpContest);
+}
+
+void Task_LinkContest_SetUpContest(u8 taskId)
+{
+ u8 i;
+ u8 sp0[4];
+ u8 sp4[4];
+
+ for (i = 0; i < 4; i++)
+ sp0[i] = gTasks[taskId].data[i + 1];
+
+ for (i = 0; i < 4; i++)
+ {
+ if (sp0[0] != sp0[i])
+ break;
+ }
+
+ if (i == 4)
+ gSpecialVar_0x8004 = 0;
+ else
+ gSpecialVar_0x8004 = 1;
+
+ for (i = 0; i < 4; i++)
+ sp4[i] = gTasks[taskId].data[i + 5];
+
+ gContestLinkLeaderIndex = LinkContest_GetLeaderIndex(sp4);
+ InitContestMonConditions(gSpecialVar_ContestCategory);
+ SetTaskFuncWithFollowupFunc(
+ taskId, Task_LinkContest_CommunicateRound1Points, Task_LinkContest_CalculateTurnOrder);
+}
+
+void Task_LinkContest_CalculateTurnOrder(u8 taskId)
+{
+ SortContestants(0);
+ SetTaskFuncWithFollowupFunc(
+ taskId, Task_LinkContest_CommunicateTurnOrder, Task_LinkContest_FinalizeConnection);
+}
+
+u8 LinkContest_GetLeaderIndex(u8 * a0)
+{
+ s32 i;
+ u8 result = 0;
+
+ for (i = 1; i < 4; i++)
+ {
+ if (a0[result] < a0[i])
+ result = i;
+ }
+
+ return result;
+}
+
+void Task_LinkContest_FinalizeConnection(u8 taskId)
+{
+ if (gSpecialVar_0x8004 == 1)
+ {
+ if (IsLinkTaskFinished())
+ gTasks[taskId].func = Task_LinkContest_Disconnect;
+ }
+ else
+ {
+ DestroyTask(taskId);
+ ScriptContext2_Disable();
+ EnableBothScriptContexts();
+ }
+}
+
+void Task_LinkContest_Disconnect(u8 taskId)
+{
+ SetCloseLinkCallback();
+ gTasks[taskId].func = Task_LinkContest_WaitDisconnect;
+}
+
+void Task_LinkContest_WaitDisconnect(u8 taskId)
+{
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ DestroyTask(taskId);
+ ScriptContext2_Disable();
+ EnableBothScriptContexts();
+ }
+}