summaryrefslogtreecommitdiff
path: root/src/scene/contest_painting.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/scene/contest_painting.c')
-rw-r--r--src/scene/contest_painting.c805
1 files changed, 805 insertions, 0 deletions
diff --git a/src/scene/contest_painting.c b/src/scene/contest_painting.c
new file mode 100644
index 000000000..3662efdec
--- /dev/null
+++ b/src/scene/contest_painting.c
@@ -0,0 +1,805 @@
+#include "global.h"
+#include "contest_painting.h"
+#include "cute_sketch.h"
+#include "data2.h"
+#include "decompress.h"
+#include "main.h"
+#include "menu.h"
+#include "palette.h"
+#include "rng.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "text.h"
+#include "unknown_task.h"
+
+extern u8 unk_2000000[];
+
+static u8 gUnknown_03000750;
+static u16 gUnknown_03000752;
+static u16 gUnknown_03000754;
+static u8 gUnknown_03000756;
+
+u16 (*gUnknown_03005E10)[][32];
+struct Unk03005E20 gUnknown_03005E20;
+u8 gUnknown_03005E40[0x4C];
+struct ContestEntry *gUnknown_03005E8C;
+u16 (*gUnknown_03005E90)[];
+
+extern struct ContestEntry unk_2015de0;
+extern struct Unk2015E00 unk_2015e00;
+
+static const u16 gPictureFramePalettes[][16] =
+{
+ INCBIN_U16("graphics/picture_frame/bg0.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg1.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg2.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg3.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg4.gbapal"),
+ INCBIN_U16("graphics/picture_frame/bg5.gbapal"),
+ {0},
+ {0},
+};
+const u8 emptySpace[8 * 32] = {0};
+const u8 gPictureFrameTiles_0[] = INCBIN_U8("graphics/picture_frame/frame0.4bpp.rl");
+const u8 gPictureFrameTiles_1[] = INCBIN_U8("graphics/picture_frame/frame1.4bpp.rl");
+const u8 gPictureFrameTiles_2[] = INCBIN_U8("graphics/picture_frame/frame2.4bpp.rl");
+const u8 gPictureFrameTiles_3[] = INCBIN_U8("graphics/picture_frame/frame3.4bpp.rl");
+const u8 gPictureFrameTiles_4[] = INCBIN_U8("graphics/picture_frame/frame4.4bpp.rl");
+const u8 gPictureFrameTiles_5[] = INCBIN_U8("graphics/picture_frame/frame5.4bpp.rl");
+const u8 gPictureFrameTilemap_0[] = INCBIN_U8("graphics/picture_frame/frame0_map.bin.rl");
+const u8 gPictureFrameTilemap_1[] = INCBIN_U8("graphics/picture_frame/frame1_map.bin.rl");
+const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map.bin.rl");
+const u8 gPictureFrameTilemap_3[] = INCBIN_U8("graphics/picture_frame/frame3_map.bin.rl");
+const u8 gPictureFrameTilemap_4[] = INCBIN_U8("graphics/picture_frame/frame4_map.bin.rl");
+const u8 gPictureFrameTilemap_5[] = INCBIN_U8("graphics/picture_frame/frame5_map.bin.rl");
+const u8 *const gUnknown_083F60AC[] =
+{
+ OtherText_Cool,
+ OtherText_Beauty2,
+ OtherText_Cute,
+ OtherText_Smart,
+ OtherText_Tough,
+};
+const struct LabelPair gUnknown_083F60C0[] =
+{
+ {OtherText_NonstopSuperCool, OtherText_Terminator6},
+ {OtherText_GoodLookingPoke, OtherText_Terminator7},
+ {OtherText_MarvelousGreat, OtherText_Terminator8},
+ {OtherText_CenturyLastVenus, OtherText_Terminator9},
+ {OtherText_Terminator10, OtherText_DazzlingSmile},
+ {OtherText_PokeCenterIdol, OtherText_Terminator11},
+ {OtherText_LovelyAndSweet, OtherText_Terminator12},
+ {OtherText_ThePretty, OtherText_WinningPortrait},
+ {OtherText_GiveUsWink, OtherText_Terminator13},
+ {OtherText_SmartnessMaestro, OtherText_Terminator15},
+ {OtherText_ChosenPokeAmong, OtherText_Terminator15},
+ {OtherText_TheExcellent, OtherText_ItsMomentOfElegance},
+ {OtherText_PowerfullyMuscular, OtherText_Terminator16},
+ {OtherText_StrongErEst, OtherText_Terminator17},
+ {OtherText_MightyTough, OtherText_Exclamation},
+};
+const struct OamData gOamData_83F6138 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = 0,
+ .mosaic = 1,
+ .bpp = 1,
+ .shape = 0,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 3,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+const u16 gUnknown_083F6140[] = {0, 0};
+
+static void ShowContestPainting();
+static void CB2_HoldContestPainting(void);
+static void HoldContestPainting(void);
+static void ContestPaintingInitWindow(u8 arg0);
+static void ContestPaintingPrintCaption(u8 arg0, u8 arg1);
+static void ContestPaintingInitBG(void);
+static void ContestPaintingInitVars(u8 arg0);
+static void VBlankCB_ContestPainting(void);
+void sub_8106B90(); //should be static
+static void sub_8107090(u8 arg0, u8 arg1);
+
+__attribute__((naked))
+void sub_8106630(u32 arg0)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ ldr r2, _0810665C @ =0x02015de0\n\
+ subs r4, r2, 0x2\n\
+ subs r5, r2, 0x1\n\
+ ldr r3, _08106660 @ =gSaveBlock1\n\
+ subs r0, 0x1\n\
+ lsls r1, r0, 5\n\
+ adds r1, r3\n\
+ ldr r3, _08106664 @ =0x00002dfc\n\
+ adds r1, r3\n\
+ ldm r1!, {r3,r6,r7}\n\
+ stm r2!, {r3,r6,r7}\n\
+ ldm r1!, {r3,r6,r7}\n\
+ stm r2!, {r3,r6,r7}\n\
+ ldm r1!, {r6,r7}\n\
+ stm r2!, {r6,r7}\n\
+ strb r0, [r4]\n\
+ movs r0, 0\n\
+ strb r0, [r5]\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_0810665C: .4byte 0x02015de0\n\
+_08106660: .4byte gSaveBlock1\n\
+_08106664: .4byte 0x00002dfc\n\
+ .syntax divided\n");
+}
+
+void CB2_ContestPainting(void)
+{
+ ShowContestPainting();
+}
+
+static void ShowContestPainting(void)
+{
+ switch (gMain.state)
+ {
+ case 0:
+ remove_some_task();
+ SetVBlankCallback(NULL);
+ gUnknown_03005E8C = &unk_2015de0;
+ ContestPaintingInitVars(TRUE);
+ ContestPaintingInitBG();
+ gMain.state++;
+ break;
+ case 1:
+ {
+ u8 *addr;
+ size_t size;
+
+ ResetPaletteFade();
+ addr = (void *)VRAM;
+ size = 0x18000;
+ while (1)
+ {
+ DmaFill32(3, 0, addr, 0x1000);
+ addr += 0x1000;
+ size -= 0x1000;
+ if (size <= 0x1000)
+ {
+ DmaFill32(3, 0, addr, size);
+ break;
+ }
+ }
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ }
+ case 2:
+ SeedRng(gMain.vblankCounter1);
+ InitKeys();
+ ContestPaintingInitWindow(unk_2000000[0x15DDF]);
+ gMain.state++;
+ break;
+ case 3:
+ sub_8107090(unk_2000000[0x15DDE], unk_2000000[0x15DDF]);
+ gMain.state++;
+ break;
+ case 4:
+ ContestPaintingPrintCaption(unk_2000000[0x15DDE], unk_2000000[0x15DDF]);
+ LoadPalette(gUnknown_083F6140, 0, 1 * 2);
+ DmaClear32(3, PLTT, 0x400);
+ BeginFastPaletteFade(2);
+ SetVBlankCallback(VBlankCB_ContestPainting);
+ gUnknown_03000750 = 0;
+ REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON;
+ SetMainCallback2(CB2_HoldContestPainting);
+ break;
+ }
+}
+
+static void CB2_HoldContestPainting(void)
+{
+ HoldContestPainting();
+ UpdatePaletteFade();
+}
+
+static void CB2_QuitContestPainting(void)
+{
+ SetMainCallback2(gMain.savedCallback);
+}
+
+static void HoldContestPainting(void)
+{
+ switch (gUnknown_03000750)
+ {
+ case 0:
+ if (!gPaletteFade.active)
+ gUnknown_03000750 = 1;
+ if (gUnknown_03000756 != 0 && gUnknown_03000754 != 0)
+ gUnknown_03000754--;
+ break;
+ case 1:
+ if ((gMain.newKeys & 1) || (gMain.newKeys & 2))
+ {
+ u8 two = 2; //needed to make the asm match
+
+ gUnknown_03000750 = two;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0);
+ }
+ if (gUnknown_03000756 != 0)
+ gUnknown_03000754 = 0;
+ break;
+ case 2:
+ if (!gPaletteFade.active)
+ SetMainCallback2(CB2_QuitContestPainting);
+ if (gUnknown_03000756 != 0 && gUnknown_03000754 <= 0x1D)
+ gUnknown_03000754++;
+ break;
+ }
+}
+
+static void ContestPaintingInitWindow(u8 arg0)
+{
+ InitMenuWindow(&gWindowConfig_81E7160);
+ SetUpWindowConfig(&gWindowConfig_81E7160);
+}
+
+static void ContestPaintingPrintCaption(u8 contestType, u8 arg1)
+{
+ u8 xPos, yPos;
+ u8 *ptr;
+ u8 type;
+
+ if (arg1 == TRUE)
+ return;
+ ptr = gUnknown_03005E40;
+ type = gUnknown_03005E8C->contestType;
+ if (contestType < 8)
+ {
+ ptr = StringCopy(ptr, gUnknown_083F60AC[type]);
+ ptr = StringCopy(ptr, gContestText_ContestWinner);
+#if ENGLISH
+ ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name);
+#elif GERMAN
+ ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name);
+#endif
+
+ // {LATIN}
+ ptr[0] = 0xFC;
+ ptr[1] = 0x16;
+ ptr += 2;
+
+ ptr = StringCopy(ptr, gOtherText_Unknown1);
+#if ENGLISH
+ ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name);
+#elif GERMAN
+ ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name);
+#endif
+
+ xPos = 6;
+ yPos = 14;
+ }
+ else
+ {
+ ptr = StringCopy(ptr, gUnknown_083F60C0[type].prefix);
+ ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name);
+ ptr = StringCopy(ptr, gUnknown_083F60C0[type].suffix);
+
+ xPos = 3;
+ yPos = 14;
+ }
+ MenuPrint_PixelCoords(gUnknown_03005E40, xPos * 8 + 1, yPos * 8, 1);
+}
+
+static void ContestPaintingInitBG(void)
+{
+ REG_DISPCNT = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_BG0CNT = BGCNT_PRIORITY(2) | BGCNT_CHARBASE(0) | BGCNT_SCREENBASE(12) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256;
+ REG_BLDCNT = 0;
+ REG_BLDALPHA = 0;
+ REG_BLDY = 0;
+}
+
+static void ContestPaintingInitVars(bool8 arg0)
+{
+ if (arg0 == FALSE)
+ {
+ gUnknown_03000756 = FALSE;
+ gUnknown_03000752 = 0;
+ gUnknown_03000754 = 0;
+ }
+ else
+ {
+ gUnknown_03000756 = TRUE;
+ gUnknown_03000752 = 15;
+ gUnknown_03000754 = 30;
+ }
+}
+
+static void ContestPaintingMosaic(void)
+{
+ if (gUnknown_03000756 == FALSE)
+ {
+ REG_MOSAIC = 0;
+ return;
+ }
+
+ REG_BG1CNT = BGCNT_PRIORITY(1) | BGCNT_CHARBASE(1) | BGCNT_SCREENBASE(10) | BGCNT_MOSAIC | BGCNT_16COLOR | BGCNT_TXT256x256;
+ gUnknown_03000752 = gUnknown_03000754 / 2;
+
+ REG_MOSAIC = (gUnknown_03000752 << 12) | (gUnknown_03000752 << 8) | (gUnknown_03000752 << 4) | (gUnknown_03000752 << 0);
+}
+
+static void VBlankCB_ContestPainting(void)
+{
+ ContestPaintingMosaic();
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+#ifdef NONMATCHING
+static void sub_8106AC4(u16 species, u8 arg1)
+{
+ void *pal;
+
+ // Unsure what gUnknown_03005E8C->var0 is supposed to be.
+ pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->var4, gUnknown_03005E8C->var0);
+ LZDecompressVram(pal, gUnknown_03005E90);
+
+ if (arg1 == 1)
+ {
+ HandleLoadSpecialPokePic(
+ &gMonFrontPicTable[species],
+ gMonFrontPicCoords[species].x,
+ gMonFrontPicCoords[species].y,
+ 0x2000000,
+ gUnknown_081FAF4C[1],
+ species,
+ (u32)gUnknown_03005E8C->var0
+ );
+ sub_8106B90(gUnknown_081FAF4C[1], gUnknown_03005E90, gUnknown_03005E10);
+ }
+ else
+ {
+ HandleLoadSpecialPokePic(
+ &gMonBackPicTable[species],
+ gMonBackPicCoords[species].x,
+ gMonBackPicCoords[species].y,
+ 0x2000000,
+ gUnknown_081FAF4C[0],
+ species,
+ (u32)gUnknown_03005E8C->var0
+ );
+ sub_8106B90(gUnknown_081FAF4C[0], gUnknown_03005E90, gUnknown_03005E10);
+ }
+}
+#else
+__attribute__((naked))
+static void sub_8106AC4(u16 arg0, u8 arg2)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r8\n\
+ push {r7}\n\
+ sub sp, 0xC\n\
+ adds r4, r1, 0\n\
+ lsls r0, 16\n\
+ lsrs r6, r0, 16\n\
+ lsls r4, 24\n\
+ lsrs r4, 24\n\
+ ldr r7, _08106B28 @ =gUnknown_03005E8C\n\
+ ldr r0, [r7]\n\
+ ldr r1, [r0, 0x4]\n\
+ ldr r2, [r0]\n\
+ adds r0, r6, 0\n\
+ bl GetMonSpritePalFromOtIdPersonality\n\
+ ldr r1, _08106B2C @ =gUnknown_03005E90\n\
+ mov r8, r1\n\
+ ldr r1, [r1]\n\
+ bl LZDecompressVram\n\
+ cmp r4, 0\n\
+ bne _08106B40\n\
+ lsls r0, r6, 3\n\
+ ldr r1, _08106B30 @ =gMonFrontPicTable\n\
+ adds r0, r1\n\
+ ldr r1, _08106B34 @ =gMonFrontPicCoords\n\
+ lsls r2, r6, 2\n\
+ adds r2, r1\n\
+ ldrb r1, [r2]\n\
+ ldrb r2, [r2, 0x1]\n\
+ movs r3, 0x80\n\
+ lsls r3, 18\n\
+ ldr r4, _08106B38 @ =gUnknown_081FAF4C\n\
+ ldr r5, [r4, 0x4]\n\
+ str r5, [sp]\n\
+ str r6, [sp, 0x4]\n\
+ ldr r4, [r7]\n\
+ ldr r4, [r4]\n\
+ str r4, [sp, 0x8]\n\
+ bl HandleLoadSpecialPokePic\n\
+ mov r2, r8\n\
+ ldr r1, [r2]\n\
+ ldr r0, _08106B3C @ =gUnknown_03005E10\n\
+ ldr r2, [r0]\n\
+ adds r0, r5, 0\n\
+ bl sub_8106B90\n\
+ b _08106B74\n\
+ .align 2, 0\n\
+_08106B28: .4byte gUnknown_03005E8C\n\
+_08106B2C: .4byte gUnknown_03005E90\n\
+_08106B30: .4byte gMonFrontPicTable\n\
+_08106B34: .4byte gMonFrontPicCoords\n\
+_08106B38: .4byte gUnknown_081FAF4C\n\
+_08106B3C: .4byte gUnknown_03005E10\n\
+_08106B40:\n\
+ lsls r0, r6, 3\n\
+ ldr r1, _08106B80 @ =gMonBackPicTable\n\
+ adds r0, r1\n\
+ ldr r1, _08106B84 @ =gMonBackPicCoords\n\
+ lsls r2, r6, 2\n\
+ adds r2, r1\n\
+ ldrb r1, [r2]\n\
+ ldrb r2, [r2, 0x1]\n\
+ movs r3, 0x80\n\
+ lsls r3, 18\n\
+ ldr r4, _08106B88 @ =gUnknown_081FAF4C\n\
+ ldr r5, [r4]\n\
+ str r5, [sp]\n\
+ str r6, [sp, 0x4]\n\
+ ldr r4, [r7]\n\
+ ldr r4, [r4]\n\
+ str r4, [sp, 0x8]\n\
+ bl HandleLoadSpecialPokePic\n\
+ mov r0, r8\n\
+ ldr r1, [r0]\n\
+ ldr r0, _08106B8C @ =gUnknown_03005E10\n\
+ ldr r2, [r0]\n\
+ adds r0, r5, 0\n\
+ bl sub_8106B90\n\
+_08106B74:\n\
+ add sp, 0xC\n\
+ pop {r3}\n\
+ mov r8, r3\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_08106B80: .4byte gMonBackPicTable\n\
+_08106B84: .4byte gMonBackPicCoords\n\
+_08106B88: .4byte gUnknown_081FAF4C\n\
+_08106B8C: .4byte gUnknown_03005E10\n\
+ .syntax divided\n");
+}
+#endif
+
+#ifdef NONMATCHING
+void sub_8106B90(u8 a[][8][8][4], u16 b[], u16 c[][8][8][8])
+{
+ u16 i;
+ u16 j;
+ u16 k;
+ u16 l;
+
+ for (i = 0; i < 8; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ for (k = 0; k < 8; k++)
+ {
+ for (l = 0; l < 8; l++)
+ {
+ //u8 *arr = a[i][j][k];
+ //u8 r1 = arr[l / 2];
+ u8 r1 = a[i][j][k][l / 2];
+
+ if (l & 1)
+ r1 /= 16;
+ else
+ r1 %= 16;
+ //_08106BEA
+ if (r1 == 0)
+ c[i][k][j][l] = 0x8000;
+ else
+ c[i][k][j][l] = b[r1];
+ }
+ }
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_8106B90()
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ mov r7, r10\n\
+ mov r6, r9\n\
+ mov r5, r8\n\
+ push {r5-r7}\n\
+ sub sp, 0xC\n\
+ mov r10, r0\n\
+ mov r9, r1\n\
+ str r2, [sp]\n\
+ movs r0, 0\n\
+_08106BA4:\n\
+ movs r3, 0\n\
+ adds r1, r0, 0x1\n\
+ str r1, [sp, 0x4]\n\
+ lsls r0, 3\n\
+ str r0, [sp, 0x8]\n\
+_08106BAE:\n\
+ movs r1, 0\n\
+ adds r2, r3, 0x1\n\
+ mov r8, r2\n\
+ ldr r7, [sp, 0x8]\n\
+ adds r0, r7, r3\n\
+ lsls r0, 5\n\
+ mov r12, r0\n\
+ lsls r4, r3, 3\n\
+_08106BBE:\n\
+ movs r3, 0\n\
+ lsls r0, r1, 2\n\
+ adds r6, r1, 0x1\n\
+ mov r2, r12\n\
+ adds r5, r2, r0\n\
+ ldr r7, [sp, 0x8]\n\
+ adds r0, r7, r1\n\
+ lsls r0, 7\n\
+ ldr r1, [sp]\n\
+ adds r2, r0, r1\n\
+_08106BD2:\n\
+ lsrs r0, r3, 1\n\
+ adds r0, r5, r0\n\
+ add r0, r10\n\
+ ldrb r1, [r0]\n\
+ movs r0, 0x1\n\
+ ands r0, r3\n\
+ cmp r0, 0\n\
+ beq _08106BE6\n\
+ lsrs r1, 4\n\
+ b _08106BEA\n\
+_08106BE6:\n\
+ movs r0, 0xF\n\
+ ands r1, r0\n\
+_08106BEA:\n\
+ cmp r1, 0\n\
+ bne _08106BFC\n\
+ adds r0, r4, r3\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ movs r7, 0x80\n\
+ lsls r7, 8\n\
+ adds r1, r7, 0\n\
+ b _08106C08\n\
+_08106BFC:\n\
+ adds r0, r4, r3\n\
+ lsls r0, 1\n\
+ adds r0, r2\n\
+ lsls r1, 1\n\
+ add r1, r9\n\
+ ldrh r1, [r1]\n\
+_08106C08:\n\
+ strh r1, [r0]\n\
+ adds r0, r3, 0x1\n\
+ lsls r0, 16\n\
+ lsrs r3, r0, 16\n\
+ cmp r3, 0x7\n\
+ bls _08106BD2\n\
+ lsls r0, r6, 16\n\
+ lsrs r1, r0, 16\n\
+ cmp r1, 0x7\n\
+ bls _08106BBE\n\
+ mov r1, r8\n\
+ lsls r0, r1, 16\n\
+ lsrs r3, r0, 16\n\
+ cmp r3, 0x7\n\
+ bls _08106BAE\n\
+ ldr r2, [sp, 0x4]\n\
+ lsls r0, r2, 16\n\
+ lsrs r0, 16\n\
+ cmp r0, 0x7\n\
+ bls _08106BA4\n\
+ add sp, 0xC\n\
+ pop {r3-r5}\n\
+ mov r8, r3\n\
+ mov r9, r4\n\
+ mov r10, r5\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .syntax divided\n");
+}
+#endif
+
+static void sub_8106C40(u8 arg0, u8 arg1)
+{
+ u8 x, y;
+
+ LoadPalette(gPictureFramePalettes, 0, sizeof(gPictureFramePalettes));
+ if (arg1 == 1)
+ {
+ switch (gUnknown_03005E8C->contestType / 3)
+ {
+ case CONTEST_COOL:
+ RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM);
+ RLUnCompWram(gPictureFrameTilemap_0, gUnknown_03005E10);
+ break;
+ case CONTEST_BEAUTY:
+ RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM);
+ RLUnCompWram(gPictureFrameTilemap_1, gUnknown_03005E10);
+ break;
+ case CONTEST_CUTE:
+ RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM);
+ RLUnCompWram(gPictureFrameTilemap_2, gUnknown_03005E10);
+ break;
+ case CONTEST_SMART:
+ RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM);
+ RLUnCompWram(gPictureFrameTilemap_3, gUnknown_03005E10);
+ break;
+ case CONTEST_TOUGH:
+ RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM);
+ RLUnCompWram(gPictureFrameTilemap_4, gUnknown_03005E10);
+ break;
+ }
+
+#define VRAM_PICTURE_DATA(x, y) (((u16 *)(VRAM + 0x6000))[(y) * 32 + (x)])
+
+ // Set the background
+ for (y = 0; y < 20; y++)
+ {
+ for (x = 0; x < 32; x++)
+ VRAM_PICTURE_DATA(x, y) = 0x1015;
+ }
+
+ // Copy the image frame
+ for (y = 0; y < 10; y++)
+ {
+ for (x = 0; x < 18; x++)
+ VRAM_PICTURE_DATA(x + 6, y + 2) = (*gUnknown_03005E10)[y + 2][x + 6];
+ }
+
+ // Re-set the entire top row to the first top frame part
+ for (x = 0; x < 16; x++)
+ VRAM_PICTURE_DATA(x + 7, 2) = (*gUnknown_03005E10)[2][7];
+
+#undef VRAM_PICTURE_DATA
+ }
+ else if (arg0 < 8)
+ {
+ RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_5, (void *)(VRAM + 0x6000));
+ }
+ else
+ {
+ switch (gUnknown_03005E8C->contestType / 3)
+ {
+ case CONTEST_COOL:
+ RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_0, (void *)(VRAM + 0x6000));
+ break;
+ case CONTEST_BEAUTY:
+ RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_1, (void *)(VRAM + 0x6000));
+ break;
+ case CONTEST_CUTE:
+ RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_2, (void *)(VRAM + 0x6000));
+ break;
+ case CONTEST_SMART:
+ RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_3, (void *)(VRAM + 0x6000));
+ break;
+ case CONTEST_TOUGH:
+ RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM);
+ RLUnCompVram(gPictureFrameTilemap_4, (void *)(VRAM + 0x6000));
+ break;
+ }
+ }
+}
+
+static void sub_8106E98(u8 arg0)
+{
+ //Some hacks just to get the asm to match
+#ifndef NONMATCHING
+ asm(""::"r"(arg0));
+#endif
+
+ gMain.oamBuffer[0] = gOamData_83F6138;
+ gMain.oamBuffer[0].tileNum = 0;
+
+#ifndef NONMATCHING
+ if (arg0) arg0 = gMain.oamBuffer[0].tileNum;
+#endif
+
+ gMain.oamBuffer[0].x = 88;
+ gMain.oamBuffer[0].y = 24;
+}
+
+static u8 sub_8106EE0(u8 arg0)
+{
+ u8 contestType;
+
+ if (arg0 < 8)
+ contestType = gUnknown_03005E8C->contestType;
+ else
+ contestType = gUnknown_03005E8C->contestType / 3;
+
+ switch (contestType)
+ {
+ case CONTEST_COOL:
+ return CONTESTRESULT_COOL;
+ case CONTEST_BEAUTY:
+ return CONTESTRESULT_BEAUTY;
+ case CONTEST_CUTE:
+ return CONTESTRESULT_CUTE;
+ case CONTEST_SMART:
+ return CONTESTRESULT_SMART;
+ case CONTEST_TOUGH:
+ return CONTESTRESULT_TOUGH;
+ }
+
+ return contestType;
+}
+
+static void sub_8106F4C(void)
+{
+ gUnknown_03005E90 = &unk_2015e00.unk2017e00;
+ gUnknown_03005E10 = &unk_2015e00.unk2015e00;
+}
+
+static void sub_8106F6C(u8 arg0)
+{
+ gUnknown_03005E20.var_4 = gUnknown_03005E10;
+ gUnknown_03005E20.var_8 = gUnknown_03005E90;
+ gUnknown_03005E20.var_18 = 0;
+ gUnknown_03005E20.var_1F = gUnknown_03005E8C->var0;
+ gUnknown_03005E20.var_19 = 0;
+ gUnknown_03005E20.var_1A = 0;
+ gUnknown_03005E20.var_1B = 64;
+ gUnknown_03005E20.var_1C = 64;
+ gUnknown_03005E20.var_1D = 64;
+ gUnknown_03005E20.var_1E = 64;
+
+ switch (arg0)
+ {
+ case CONTESTRESULT_SMART:
+ case CONTESTRESULT_TOUGH:
+ gUnknown_03005E20.var_14 = 3;
+ break;
+ case CONTESTRESULT_COOL:
+ case CONTESTRESULT_BEAUTY:
+ case CONTESTRESULT_CUTE:
+ default:
+ gUnknown_03005E20.var_14 = 1;
+ break;
+ }
+
+ gUnknown_03005E20.var_16 = 2;
+ gUnknown_03005E20.var_0 = arg0;
+ gUnknown_03005E20.var_10 = 0x6010000;
+
+ sub_80FC7A0(&gUnknown_03005E20);
+ sub_80FDA18(&gUnknown_03005E20);
+ sub_80FD8CC(&gUnknown_03005E20);
+
+ LoadPalette(gUnknown_03005E90, 256, 256 * 2);
+}
+
+static void sub_8107090(u8 arg0, u8 arg1)
+{
+ sub_8106F4C();
+ sub_8106AC4(gUnknown_03005E8C->var8, 0);
+ sub_8106F6C(sub_8106EE0(arg0));
+ sub_8106E98(arg0);
+ sub_8106C40(arg0, arg1);
+}