#include "global.h" #include "contest_painting_effects.h" #include "contest_painting.h" extern u16 (*gUnknown_03005DEC)[][32]; extern u8 gUnknown_083E7A50[][3]; extern u8 gUnknown_03005DE8; extern u8 gUnknown_03005DF0; extern u8 gUnknown_03005DFC; extern u8 gUnknown_03005DF8; extern u8 gUnknown_03005DF4; extern u8 gUnknown_03005E00; extern u8 gUnknown_03005E04; extern u16 * gUnknown_03005E08; extern u16 gUnknown_03005E0C; // this file's functions void sub_80FCAA4(void); void sub_80FCB5C(void); void sub_80FCD54(void); void sub_80FCEA4(void); void sub_80FCCBC(void); void sub_80FD06C(void); void sub_80FD114(void); void sub_80FCF3C(void); void sub_80FCAC4(void); void sub_80FCC18(u8); void sub_80FC92C(u8); void sub_80FC9E4(u8); void sub_80FD1C8(u16); u16 ConvertColorToGrayscale(u16*); u16 sub_80FD68C(u16*, u16*, u16*); u16 ConvertCoolColor(u16*, u8); u16 ConvertToBlackOrWhite(u16*); u16 sub_80FD50C(u16*, u16*); u16 InvertColor(u16*); u16 sub_80FD7AC(u16*, u16*, u16*); u16 sub_80FD568(u16*, u16*); u16 GetCoolColorFromPersonality(u8); void sub_80FDC18(bool8); void sub_80FDAE4(void); void sub_80FDF88(void); void sub_80FDBE4(void); void sub_80FDED8(void); void sub_80FDBA8(void); void sub_80FDE28(void); void sub_80FDB8C(void); void sub_80FDD70(void); u16 sub_80FE038(u16 *); u16 sub_80FE17C(u16 *); u16 sub_80FE1B0(u16 *); u16 sub_80FE0AC(u16 *); void sub_80FC7A0(struct Unk03005E20* info) { gUnknown_03005DEC = info->var_4; gUnknown_03005E00 = info->var_1F; gUnknown_03005DE8 = info->var_19; gUnknown_03005DFC = info->var_1A; gUnknown_03005DF8 = info->var_1B; gUnknown_03005DF0 = info->var_1C; gUnknown_03005E04 = info->var_1D; gUnknown_03005DF4 = info->var_1E; switch (info->var_0) { case 2: sub_80FCAA4(); break; case 8: sub_80FCB5C(); break; case 9: sub_80FCD54(); sub_80FCC18(gUnknown_03005E00); break; case 10: sub_80FCD54(); sub_80FCEA4(); sub_80FCCBC(); case 31: sub_80FCEA4(); break; case 11: sub_80FCD54(); sub_80FD06C(); sub_80FD06C(); sub_80FD114(); sub_80FCCBC(); break; case 13: sub_80FCF3C(); break; case 30: sub_80FCD54(); break; case 32: sub_80FD06C(); break; case 33: sub_80FD114(); break; case 6: sub_80FCAC4(); sub_80FC92C(3); break; case 36: sub_80FCD54(); sub_80FD06C(); sub_80FD114(); sub_80FCCBC(); sub_80FCB5C(); sub_80FCB5C(); sub_80FC92C(2); sub_80FC9E4(4); break; } } #define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r)) void sub_80FC92C(u8 a0) // it changes palette someway somehow... .__. { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* pal = &var2[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, pal++) { if (!(0x8000 & *pal)) { u8 val = (31 & *pal); val += a0; if (val > 31) val = 31; *pal = RGB2(val, val, val); } } } } void sub_80FC9E4(u8 a0) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* pal = &var2[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, pal++) { if (!(0x8000 & *pal)) { u8 val = (31 & *pal); if (val > 31 - a0) val = 31 - (a0 >> 1); *pal = RGB2(val, val, val); } } } } void sub_80FCAA4(void) { u32 i; for (i = 0; i < 3200; i++) sub_80FD1C8(i); } void sub_80FCAC4(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* color = &var2[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, color++) { if (!(0x8000 & *color)) { *color = ConvertColorToGrayscale(color); } } } } void sub_80FCB5C(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF8; i++) { u16* var0 = &(*gUnknown_03005DEC)[0][gUnknown_03005DFC * gUnknown_03005E04]; u16* palette = &var0[gUnknown_03005DE8 + i]; u16 color = *palette; j = 1; palette += gUnknown_03005E04; while (j < gUnknown_03005DF0 - 1) { if (!(0x8000 & *palette)) { *palette = sub_80FD68C(&color, palette, palette + gUnknown_03005E04); color = *palette; } j++; palette += gUnknown_03005E04; } } } void sub_80FCC18(u8 arg0) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* color = &var0[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, color++) { if (!(0x8000 & *color)) { *color = ConvertCoolColor(color, arg0); } } } } void sub_80FCCBC(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* color = &var0[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, color++) { if (!(0x8000 & *color)) { *color = ConvertToBlackOrWhite(color); } } } } void sub_80FCD54(void) { u8 i, j; u16 *palette; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; palette = &var0[gUnknown_03005DE8]; *palette = sub_80FD50C(palette, palette + 1); for (j = 1, palette = palette + 1; j < gUnknown_03005DF8 - 1; j++, palette++) { *palette = sub_80FD50C(palette, palette + 1); *palette = sub_80FD50C(palette, palette - 1); } *palette = sub_80FD50C(palette, palette - 1); } for (j = 0; j < gUnknown_03005DF8; j++) { u16* var0 = &(*gUnknown_03005DEC)[0][gUnknown_03005DFC * gUnknown_03005E04]; palette = &var0[gUnknown_03005DE8 + j]; *palette = sub_80FD50C(palette, palette + gUnknown_03005E04); for (i = 1, palette = palette + gUnknown_03005E04; i < gUnknown_03005DF0 - 1; i++, palette += gUnknown_03005E04) { *palette = sub_80FD50C(palette, palette + gUnknown_03005E04); *palette = sub_80FD50C(palette, palette - gUnknown_03005E04); } *palette = sub_80FD50C(palette, palette - gUnknown_03005E04); } } void sub_80FCEA4(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* color = &var0[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, color++) { if (!(0x8000 & *color)) { *color = InvertColor(color); } } } } void sub_80FCF3C(void) { u8 i, j; u16 *palette; u16 color; palette = (*gUnknown_03005DEC)[0]; for (i = 0; i < 64; i++) { for (j = 0; j < 64; j++, palette++) { if (!(0x8000 & *palette)) { *palette = InvertColor(palette); } } } for (j = 0; j < 64; j++) { palette = &(*gUnknown_03005DEC)[0][j]; color = *palette; *palette = 0x8000; for (i = 1, palette += 64; i < 63; i++, palette += 64) { if (!(0x8000 & *palette)) { *palette = sub_80FD7AC(&color, palette, palette + 64); color = *palette; } } *palette = 0x8000; palette = &(*gUnknown_03005DEC)[0][j]; color = *palette; *palette = 0x8000; for (i = 1, palette += 64; i < 63; i++, palette += 64) { if (!(0x8000 & *palette)) { *palette = sub_80FD7AC(&color, palette, palette + 64); color = *palette; } } *palette = 0x8000; } palette = (*gUnknown_03005DEC)[0]; for (i = 0; i < 64; i++) { for (j = 0; j < 64; j++, palette++) { if (!(0x8000 & *palette)) { *palette = InvertColor(palette); } } } } void sub_80FD06C(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* palette = &var0[gUnknown_03005DE8]; u16 color = *palette; for (j = 1, palette++; j < gUnknown_03005DF8 - 1; j++, palette++) { if (!(0x8000 & *palette)) { *palette = sub_80FD568(&color, palette); color = *palette; } } } } void sub_80FD114(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF8; i++) { u16* var0 = &(*gUnknown_03005DEC)[0][gUnknown_03005DFC * gUnknown_03005E04]; u16* palette = &var0[gUnknown_03005DE8 + i]; u16 color = *palette; for (j = 1, palette += gUnknown_03005E04; j < gUnknown_03005DF0 - 1; j++, palette += gUnknown_03005E04) { if (!(0x8000 & *palette)) { *palette = sub_80FD568(&color, palette); color = *palette; } } } } NAKED void sub_80FD1C8(u16 arg0) { 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, 0x20\n\ lsls r0, 16\n\ lsrs r0, 16\n\ mov r10, r0\n\ mov r2, sp\n\ ldr r3, _080FD234 @ =gUnknown_083E7A50\n\ lsls r1, r0, 1\n\ add r1, r10\n\ adds r0, r1, r3\n\ ldrb r0, [r0]\n\ strb r0, [r2]\n\ adds r0, r3, 0x1\n\ adds r0, r1, r0\n\ ldrb r0, [r0]\n\ strb r0, [r2, 0x1]\n\ mov r5, sp\n\ adds r0, r3, 0x2\n\ adds r1, r0\n\ ldrb r4, [r1]\n\ lsls r2, r4, 24\n\ lsrs r1, r2, 27\n\ movs r0, 0x7\n\ ands r1, r0\n\ strh r1, [r5, 0x2]\n\ lsrs r2, 25\n\ mov r9, r2\n\ movs r0, 0x3\n\ ands r2, r0\n\ mov r9, r2\n\ movs r5, 0x1\n\ ands r5, r4\n\ movs r4, 0x1\n\ mov r8, r4\n\ cmp r8, r1\n\ bcs _080FD27A\n\ mov r3, sp\n\ _080FD21A:\n\ cmp r5, 0\n\ bne _080FD238\n\ mov r0, r8\n\ lsls r2, r0, 2\n\ mov r4, sp\n\ adds r1, r4, r2\n\ ldrb r0, [r3]\n\ mov r4, r8\n\ subs r0, r4\n\ strb r0, [r1]\n\ ldrb r0, [r3, 0x1]\n\ add r0, r8\n\ b _080FD24A\n\ .align 2, 0\n\ _080FD234: .4byte gUnknown_083E7A50\n\ _080FD238:\n\ mov r0, r8\n\ lsls r2, r0, 2\n\ mov r4, sp\n\ adds r1, r4, r2\n\ ldrb r0, [r3]\n\ adds r0, 0x1\n\ strb r0, [r1]\n\ ldrb r0, [r3, 0x1]\n\ subs r0, 0x1\n\ _080FD24A:\n\ strb r0, [r1, 0x1]\n\ add r2, sp\n\ ldrb r0, [r2]\n\ cmp r0, 0x3F\n\ bhi _080FD25A\n\ ldrb r0, [r2, 0x1]\n\ cmp r0, 0x3F\n\ bls _080FD262\n\ _080FD25A:\n\ mov r0, r8\n\ subs r0, 0x1\n\ strh r0, [r3, 0x2]\n\ b _080FD27A\n\ _080FD262:\n\ ldrh r0, [r3, 0x2]\n\ mov r1, r8\n\ subs r0, r1\n\ strh r0, [r2, 0x2]\n\ mov r0, r8\n\ adds r0, 0x1\n\ lsls r0, 24\n\ lsrs r0, 24\n\ mov r8, r0\n\ ldrh r0, [r3, 0x2]\n\ cmp r8, r0\n\ bcc _080FD21A\n\ _080FD27A:\n\ movs r2, 0\n\ mov r8, r2\n\ mov r0, sp\n\ ldrh r0, [r0, 0x2]\n\ cmp r8, r0\n\ bcc _080FD288\n\ b _080FD38A\n\ _080FD288:\n\ movs r3, 0x1F\n\ _080FD28A:\n\ ldr r1, _080FD2E8 @ =gUnknown_03005DEC\n\ mov r4, r8\n\ lsls r0, r4, 2\n\ mov r2, sp\n\ adds r6, r2, r0\n\ ldrb r0, [r6, 0x1]\n\ lsls r0, 7\n\ ldr r1, [r1]\n\ adds r1, r0\n\ ldrb r0, [r6]\n\ lsls r0, 1\n\ adds r2, r1, r0\n\ ldrh r1, [r2]\n\ movs r4, 0x80\n\ lsls r4, 8\n\ adds r0, r4, 0\n\ ands r0, r1\n\ cmp r0, 0\n\ bne _080FD376\n\ movs r7, 0x1F\n\ ands r7, r1\n\ lsls r0, r1, 16\n\ lsrs r5, r0, 21\n\ ands r5, r3\n\ lsrs r4, r0, 26\n\ ands r4, r3\n\ mov r0, r9\n\ cmp r0, 0\n\ blt _080FD36C\n\ cmp r0, 0x1\n\ ble _080FD2EC\n\ cmp r0, 0x3\n\ bgt _080FD36C\n\ ldrh r0, [r6, 0x2]\n\ adds r1, r7, r0\n\ lsls r1, 16\n\ lsrs r7, r1, 16\n\ adds r1, r5, r0\n\ lsls r1, 16\n\ lsrs r5, r1, 16\n\ adds r0, r4, r0\n\ lsls r0, 16\n\ lsrs r4, r0, 16\n\ cmp r7, 0x1F\n\ bls _080FD360\n\ movs r7, 0x1F\n\ b _080FD360\n\ .align 2, 0\n\ _080FD2E8: .4byte gUnknown_03005DEC\n\ _080FD2EC:\n\ mov r1, r10\n\ lsls r0, r1, 1\n\ add r0, r10\n\ ldr r1, _080FD320 @ =gUnknown_083E7A50\n\ adds r1, 0x2\n\ adds r0, r1\n\ ldrb r0, [r0]\n\ lsrs r0, 3\n\ movs r1, 0x7\n\ ands r0, r1\n\ movs r1, 0x3\n\ str r2, [sp, 0x18]\n\ str r3, [sp, 0x1C]\n\ bl __umodsi3\n\ lsls r0, 24\n\ lsrs r0, 24\n\ ldr r2, [sp, 0x18]\n\ ldr r3, [sp, 0x1C]\n\ cmp r0, 0x1\n\ beq _080FD33C\n\ cmp r0, 0x1\n\ bgt _080FD324\n\ cmp r0, 0\n\ beq _080FD32A\n\ b _080FD36C\n\ .align 2, 0\n\ _080FD320: .4byte gUnknown_083E7A50\n\ _080FD324:\n\ cmp r0, 0x2\n\ beq _080FD34E\n\ b _080FD36C\n\ _080FD32A:\n\ ldrh r0, [r6, 0x2]\n\ cmp r7, r0\n\ bcc _080FD338\n\ subs r0, r7, r0\n\ lsls r0, 16\n\ lsrs r7, r0, 16\n\ b _080FD36C\n\ _080FD338:\n\ movs r7, 0\n\ b _080FD36C\n\ _080FD33C:\n\ ldrh r0, [r6, 0x2]\n\ cmp r5, r0\n\ bcc _080FD34A\n\ subs r0, r5, r0\n\ lsls r0, 16\n\ lsrs r5, r0, 16\n\ b _080FD36C\n\ _080FD34A:\n\ movs r5, 0\n\ b _080FD36C\n\ _080FD34E:\n\ ldrh r0, [r6, 0x2]\n\ cmp r4, r0\n\ bcc _080FD35C\n\ subs r0, r4, r0\n\ lsls r0, 16\n\ lsrs r4, r0, 16\n\ b _080FD36C\n\ _080FD35C:\n\ movs r4, 0\n\ b _080FD36C\n\ _080FD360:\n\ cmp r5, 0x1F\n\ bls _080FD366\n\ movs r5, 0x1F\n\ _080FD366:\n\ cmp r4, 0x1F\n\ bls _080FD36C\n\ movs r4, 0x1F\n\ _080FD36C:\n\ lsls r0, r4, 10\n\ lsls r1, r5, 5\n\ orrs r0, r1\n\ orrs r7, r0\n\ strh r7, [r2]\n\ _080FD376:\n\ mov r0, r8\n\ adds r0, 0x1\n\ lsls r0, 24\n\ lsrs r0, 24\n\ mov r8, r0\n\ mov r0, sp\n\ ldrh r0, [r0, 0x2]\n\ cmp r8, r0\n\ bcs _080FD38A\n\ b _080FD28A\n\ _080FD38A:\n\ add sp, 0x20\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"); } u16 ConvertColorToGrayscale(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; u16 average = (red + green + blue) / 3; return RGB2(average, average, average); } // The dark colors are the colored edges of the Cool painting effect. // Everything else is white. u16 ConvertCoolColor(u16 *color, u8 personality) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; if (red < 17 && green < 17 && blue < 17) return GetCoolColorFromPersonality(personality); else return RGB2(31, 31, 31); } // Based on the given value, which comes from the first 8 bits of // the mon's personality value, return a color. u16 GetCoolColorFromPersonality(u8 personality) { u16 red = 0; u16 green = 0; u16 blue = 0; u8 strength = (personality / 6) % 3; u8 colorType = personality % 6; switch (colorType) { case 0: // Teal color green = 21 - strength; blue = green; red = 0; break; case 1: // Yellow color blue = 0; red = 21 - strength; green = red; break; case 2: // Purple color blue = 21 - strength; green = 0; red = blue; break; case 3: // Red color blue = 0; green = 0; red = 23 - strength; break; case 4: // Blue color blue = 23 - strength; green = 0; red = 0; break; case 5: // Green color blue = 0; green = 23 - strength; red = 0; break; } return RGB2(red, green, blue); } u16 ConvertToBlackOrWhite(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; if (red < 17 && green < 17 && blue < 17) return RGB2(0, 0, 0); else return RGB2(31, 31, 31); } u16 sub_80FD50C(u16 *colorA, u16 *colorB) { if (*colorA) { if (*colorA & 0x8000) return 0x8000; if (*colorB & 0x8000) return RGB2(0, 0, 0); return *colorA; } return RGB2(0, 0, 0); } u16 InvertColor(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; red = 31 - red; green = 31 - green; blue = 31 - blue; return RGB2(red, green, blue); } u16 sub_80FD568(u16 *a0, u16 *a1) { u16 sp0[2][3]; u16 spC[3]; u8 r4; u16 r2; u16 r, g, b; if (*a0 == *a1) return *a1; sp0[0][0] = (*a0 >> 0) & 0x1F; sp0[0][1] = (*a0 >> 5) & 0x1F; sp0[0][2] = (*a0 >> 10) & 0x1F; sp0[1][0] = (*a1 >> 0) & 0x1F; sp0[1][1] = (*a1 >> 5) & 0x1F; sp0[1][2] = (*a1 >> 10) & 0x1F; if (sp0[0][0] > 25 && sp0[0][1] > 25 && sp0[0][2] > 25) return *a1; if (sp0[1][0] > 25 && sp0[1][1] > 25 && sp0[1][2] > 25) return *a1; for (r4 = 0; r4 < 3; r4++) { if (sp0[0][r4] > sp0[1][r4]) spC[r4] = sp0[0][r4] - sp0[1][r4]; else spC[r4] = sp0[1][r4] - sp0[0][r4]; } if (spC[0] >= spC[1]) { if (spC[0] >= spC[2]) r2 = spC[0]; else if (spC[1] >= spC[2]) r2 = spC[1]; else r2 = spC[2]; } else { if (spC[1] >= spC[2]) r2 = spC[1]; else if (spC[2] >= spC[0]) r2 = spC[2]; else r2 = spC[0]; } r = (sp0[1][0] * (31 - r2 / 2)) / 31; g = (sp0[1][1] * (31 - r2 / 2)) / 31; b = (sp0[1][2] * (31 - r2 / 2)) / 31; return RGB2(r, g, b); } u16 sub_80FD68C(u16 * a0, u16 * a1, u16 * a2) { u16 red, green, blue; u16 avg0, avg1, avg2; u16 diff1, diff2; u32 minimum; u16 factor; if (*a0 == *a1 && *a2 == *a1) return *a1; red = (*a1 >> 0) & 0x1F; green = (*a1 >> 5) & 0x1F; blue = (*a1 >> 10) & 0x1F; avg0 = (((*a0 >> 0) & 0x1F) + ((*a0 >> 5) & 0x1F) + ((*a0 >> 10) & 0x1F)) / 3; avg1 = (((*a1 >> 0) & 0x1F) + ((*a1 >> 5) & 0x1F) + ((*a1 >> 10) & 0x1F)) / 3; avg2 = (((*a2 >> 0) & 0x1F) + ((*a2 >> 5) & 0x1F) + ((*a2 >> 10) & 0x1F)) / 3; if (avg0 == avg1 && avg2 == avg1) return *a1; if (avg0 > avg1) diff1 = avg0 - avg1; else diff1 = avg1 - avg0; if (avg2 > avg1) diff2 = avg2 - avg1; else diff2 = avg1 - avg2; if (diff1 >= diff2) minimum = diff1; else minimum = diff2; factor = 31 - minimum / 2; red = red * factor / 31; green = green * factor / 31; blue = blue * factor / 31; return RGB2(red, green, blue); } u16 sub_80FD7AC(u16 *a0, u16 *a1, u16 *a2) { u16 red, green, blue; u16 avg0, avg1, avg2; u16 diff1, diff2; u32 minimum; u16 factor; if (*a0 == *a1 && *a2 == *a1) return *a1; red = (*a1 >> 0) & 0x1F; green = (*a1 >> 5) & 0x1F; blue = (*a1 >> 10) & 0x1F; avg0 = (((*a0 >> 0) & 0x1F) + ((*a0 >> 5) & 0x1F) + ((*a0 >> 10) & 0x1F)) / 3; avg1 = (((*a1 >> 0) & 0x1F) + ((*a1 >> 5) & 0x1F) + ((*a1 >> 10) & 0x1F)) / 3; avg2 = (((*a2 >> 0) & 0x1F) + ((*a2 >> 5) & 0x1F) + ((*a2 >> 10) & 0x1F)) / 3; if (avg0 == avg1 && avg2 == avg1) return *a1; if (avg0 > avg1) diff1 = avg0 - avg1; else diff1 = avg1 - avg0; if (avg2 > avg1) diff2 = avg2 - avg1; else diff2 = avg1 - avg2; if (diff1 >= diff2) minimum = diff1; else minimum = diff2; factor = 31 - minimum; red = red * factor / 31; green = green * factor / 31; blue = blue * factor / 31; return RGB2(red, green, blue); } /* void sub_80FD8CC(struct Unk03005E20 * a0) { u16 i, j, k; u8 r5 = a0->var_1D >> 3; u8 sp08 = a0->var_1E >> 3; u16 * sp00 = (u16 *)a0->var_4; u16 * sp04 = (u16 *)a0->var_10; if (a0->var_16 == 2) { for (i = 0; i < sp08; i++) { for (j = 0; j < r5; j++) { for (k = 0; k < 8; k++) { u16 * r3 = &sp04[i * r5 * 32 + 4 * k]; u16 * r2 = &sp00[j * 8 + (i * 8 + k) * 8 * r5]; r3[0] = r2[0] | (r2[1] << 8); r3[1] = r2[2] | (r2[3] << 8); r3[2] = r2[4] | (r2[5] << 8); r3[3] = r2[6] | (r2[7] << 8); } } } } else { for (i = 0; i < sp08; i++) { for (j = 0; j < r5; j++) { for (k = 0; k < 8; k++) { u16 * r3 = &sp04[i * r5 * 16 + 2 * k]; u16 * r2 = &sp00[j * 8 + (i * 8 + k) * 8 * r5]; r3[0] = r2[0] | (r2[1] << 4) | (r2[2] << 8) | (r2[3] << 12); r3[1] = r2[4] | (r2[5] << 4) | (r2[6] << 8) | (r2[7] << 12); } } } } } */ NAKED void sub_80FD8CC(struct Unk03005E20 * a0) { 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, 0xC\n" "\tldrb r1, [r0, 0x1D]\n" "\tlsrs r5, r1, 3\n" "\tldrb r1, [r0, 0x1E]\n" "\tlsrs r1, 3\n" "\tstr r1, [sp, 0x8]\n" "\tldr r1, [r0, 0x4]\n" "\tstr r1, [sp]\n" "\tldr r2, [r0, 0x10]\n" "\tstr r2, [sp, 0x4]\n" "\tldrh r0, [r0, 0x16]\n" "\tcmp r0, 0x2\n" "\tbne _080FD97C\n" "\tmovs r1, 0\n" "\tldr r0, [sp, 0x8]\n" "\tcmp r1, r0\n" "\tbcc _080FD8FA\n" "\tb _080FDA08\n" "_080FD8FA:\n" "\tmovs r0, 0\n" "\tadds r2, r1, 0x1\n" "\tmov r10, r2\n" "\tcmp r0, r5\n" "\tbcs _080FD96E\n" "\tadds r2, r1, 0\n" "\tmuls r2, r5\n" "\tmov r9, r2\n" "\tlsls r1, 3\n" "\tmov r8, r1\n" "_080FD90E:\n" "\tmovs r4, 0\n" "\tlsls r6, r0, 4\n" "\tadds r7, r0, 0x1\n" "\tadd r0, r9\n" "\tlsls r0, 6\n" "\tldr r1, [sp, 0x4]\n" "\tadds r1, r0\n" "\tmov r12, r1\n" "_080FD91E:\n" "\tlsls r0, r4, 3\n" "\tmov r2, r12\n" "\tadds r3, r2, r0\n" "\tmov r1, r8\n" "\tadds r0, r1, r4\n" "\tlsls r0, 3\n" "\tmuls r0, r5\n" "\tlsls r0, 1\n" "\tldr r2, [sp]\n" "\tadds r0, r2, r0\n" "\tadds r2, r0, r6\n" "\tldrh r0, [r2, 0x2]\n" "\tlsls r0, 8\n" "\tldrh r1, [r2]\n" "\torrs r0, r1\n" "\tstrh r0, [r3]\n" "\tldrh r0, [r2, 0x6]\n" "\tlsls r0, 8\n" "\tldrh r1, [r2, 0x4]\n" "\torrs r0, r1\n" "\tstrh r0, [r3, 0x2]\n" "\tldrh r0, [r2, 0xA]\n" "\tlsls r0, 8\n" "\tldrh r1, [r2, 0x8]\n" "\torrs r0, r1\n" "\tstrh r0, [r3, 0x4]\n" "\tldrh r0, [r2, 0xE]\n" "\tlsls r0, 8\n" "\tldrh r1, [r2, 0xC]\n" "\torrs r0, r1\n" "\tstrh r0, [r3, 0x6]\n" "\tadds r0, r4, 0x1\n" "\tlsls r0, 16\n" "\tlsrs r4, r0, 16\n" "\tcmp r4, 0x7\n" "\tbls _080FD91E\n" "\tlsls r0, r7, 16\n" "\tlsrs r0, 16\n" "\tcmp r0, r5\n" "\tbcc _080FD90E\n" "_080FD96E:\n" "\tmov r1, r10\n" "\tlsls r0, r1, 16\n" "\tlsrs r1, r0, 16\n" "\tldr r2, [sp, 0x8]\n" "\tcmp r1, r2\n" "\tbcc _080FD8FA\n" "\tb _080FDA08\n" "_080FD97C:\n" "\tmovs r1, 0\n" "\tldr r0, [sp, 0x8]\n" "\tcmp r1, r0\n" "\tbcs _080FDA08\n" "_080FD984:\n" "\tmovs r0, 0\n" "\tadds r2, r1, 0x1\n" "\tmov r10, r2\n" "\tcmp r0, r5\n" "\tbcs _080FD9FC\n" "\tadds r2, r1, 0\n" "\tmuls r2, r5\n" "\tmov r9, r2\n" "\tlsls r1, 3\n" "\tmov r8, r1\n" "_080FD998:\n" "\tmovs r4, 0\n" "\tlsls r6, r0, 4\n" "\tadds r7, r0, 0x1\n" "\tadd r0, r9\n" "\tlsls r0, 5\n" "\tldr r1, [sp, 0x4]\n" "\tadds r1, r0\n" "\tmov r12, r1\n" "_080FD9A8:\n" "\tlsls r0, r4, 2\n" "\tmov r2, r12\n" "\tadds r3, r2, r0\n" "\tmov r1, r8\n" "\tadds r0, r1, r4\n" "\tlsls r0, 3\n" "\tmuls r0, r5\n" "\tlsls r0, 1\n" "\tldr r2, [sp]\n" "\tadds r0, r2, r0\n" "\tadds r2, r0, r6\n" "\tldrh r1, [r2, 0x2]\n" "\tlsls r1, 4\n" "\tldrh r0, [r2]\n" "\torrs r1, r0\n" "\tldrh r0, [r2, 0x4]\n" "\tlsls r0, 8\n" "\torrs r1, r0\n" "\tldrh r0, [r2, 0x6]\n" "\tlsls r0, 12\n" "\torrs r1, r0\n" "\tstrh r1, [r3]\n" "\tldrh r1, [r2, 0xA]\n" "\tlsls r1, 4\n" "\tldrh r0, [r2, 0x8]\n" "\torrs r1, r0\n" "\tldrh r0, [r2, 0xC]\n" "\tlsls r0, 8\n" "\torrs r1, r0\n" "\tldrh r0, [r2, 0xE]\n" "\tlsls r0, 12\n" "\torrs r1, r0\n" "\tstrh r1, [r3, 0x2]\n" "\tadds r0, r4, 0x1\n" "\tlsls r0, 16\n" "\tlsrs r4, r0, 16\n" "\tcmp r4, 0x7\n" "\tbls _080FD9A8\n" "\tlsls r0, r7, 16\n" "\tlsrs r0, 16\n" "\tcmp r0, r5\n" "\tbcc _080FD998\n" "_080FD9FC:\n" "\tmov r1, r10\n" "\tlsls r0, r1, 16\n" "\tlsrs r1, r0, 16\n" "\tldr r2, [sp, 0x8]\n" "\tcmp r1, r2\n" "\tbcc _080FD984\n" "_080FDA08:\n" "\tadd sp, 0xC\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"); } void sub_80FDA18(struct Unk03005E20 *arg0) { gUnknown_03005E0C = arg0->var_18 * 16; gUnknown_03005E08 = &arg0->var_8[gUnknown_03005E0C]; gUnknown_03005DEC = arg0->var_4; gUnknown_03005DE8 = arg0->var_19; gUnknown_03005DFC = arg0->var_1A; gUnknown_03005DF8 = arg0->var_1B; gUnknown_03005DF0 = arg0->var_1C; gUnknown_03005E04 = arg0->var_1D; gUnknown_03005DF4 = arg0->var_1E; switch (arg0->var_14) { case 0: sub_80FDC18(FALSE); break; case 1: sub_80FDC18(TRUE); break; case 2: sub_80FDAE4(); sub_80FDF88(); break; case 3: sub_80FDBE4(); sub_80FDED8(); break; case 4: sub_80FDBA8(); sub_80FDE28(); break; case 5: sub_80FDB8C(); sub_80FDD70(); break; } } void sub_80FDAE4(void) { gUnknown_03005E08[0] = RGB2(0, 0, 0); gUnknown_03005E08[1] = RGB2(6, 6, 6); gUnknown_03005E08[2] = RGB2(29, 29, 29); gUnknown_03005E08[3] = RGB2(11, 11, 11); gUnknown_03005E08[4] = RGB2(29, 6, 6); gUnknown_03005E08[5] = RGB2(6, 29, 6); gUnknown_03005E08[6] = RGB2(6, 6, 29); gUnknown_03005E08[7] = RGB2(29, 29, 6); gUnknown_03005E08[8] = RGB2(29, 6, 29); gUnknown_03005E08[9] = RGB2(6, 29, 29); gUnknown_03005E08[10] = RGB2(29, 11, 6); gUnknown_03005E08[11] = RGB2(11, 29, 6); gUnknown_03005E08[12] = RGB2(6, 11, 29); gUnknown_03005E08[13] = RGB2(29, 6, 11); gUnknown_03005E08[14] = RGB2(6, 29, 11); gUnknown_03005E08[15] = RGB2(11, 6, 29); } void sub_80FDB8C(void) { gUnknown_03005E08[0] = RGB2(0, 0, 0); gUnknown_03005E08[1] = RGB2(0, 0, 0); gUnknown_03005E08[2] = RGB2(31, 31, 31); } void sub_80FDBA8(void) { u8 i; gUnknown_03005E08[0] = RGB2(0, 0, 0); gUnknown_03005E08[1] = RGB2(0, 0, 0); for (i = 0; i < 14; i++) gUnknown_03005E08[i + 2] = RGB2(2 * (i + 2), 2 * (i + 2), 2 * (i + 2)); } void sub_80FDBE4(void) { u8 i; gUnknown_03005E08[0] = RGB2(0, 0, 0); for (i = 0; i < 32; i++) gUnknown_03005E08[i + 1] = RGB2(i, i, i); } void sub_80FDC18(bool8 arg0) { u8 i, j; u16 maxIndex; maxIndex = 0xDF; if (!arg0) maxIndex = 0xFF; for (j = 0; j < maxIndex; j++) gUnknown_03005E08[j] = 0; gUnknown_03005E08[maxIndex] = RGB2(15, 15, 15); for (i = 0; i < gUnknown_03005DF0; i++) { u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* pal = &var2[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, pal++) { if (*pal & 0x8000) { *pal = gUnknown_03005E0C; } else { u16 color = sub_80FE038(pal); u8 curIndex = 1; if (curIndex < maxIndex) { if (gUnknown_03005E08[curIndex] == RGB_BLACK) { gUnknown_03005E08[curIndex] = color; *pal = gUnknown_03005E0C + curIndex; } else { while (curIndex < maxIndex) { if (gUnknown_03005E08[curIndex] == RGB_BLACK) { gUnknown_03005E08[curIndex] = color; *pal = gUnknown_03005E0C + curIndex; break; } if (gUnknown_03005E08[curIndex] == color) { *pal = gUnknown_03005E0C + curIndex; break; } curIndex++; } } } if (curIndex == maxIndex) { curIndex = maxIndex; *pal = curIndex; } } } } } void sub_80FDD70(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* pal = &var2[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, pal++) { if (*pal & 0x8000) { *pal = gUnknown_03005E0C; } else { if (ConvertToBlackOrWhite(pal) == RGB_BLACK) *pal = gUnknown_03005E0C + 1; else *pal = gUnknown_03005E0C + 2; } } } } void sub_80FDE28(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* pal = &var2[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, pal++) { if (*pal & 0x8000) *pal = gUnknown_03005E0C; else *pal = sub_80FE17C(pal) + gUnknown_03005E0C; } } } void sub_80FDED8(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* pal = &var2[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, pal++) { if (*pal & 0x8000) *pal = gUnknown_03005E0C; else *pal = sub_80FE1B0(pal) + gUnknown_03005E0C; } } } void sub_80FDF88(void) { u8 i, j; for (i = 0; i < gUnknown_03005DF0; i++) { u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; u16* pal = &var2[gUnknown_03005DE8]; for (j = 0; j < gUnknown_03005DF8; j++, pal++) { if (*pal & 0x8000) *pal = gUnknown_03005E0C; else *pal = sub_80FE0AC(pal) + gUnknown_03005E0C; } } } u16 sub_80FE038(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; if (red & 3) red = (red & 0x1C) + 4; if (green & 3) green = (green & 0x1C) + 4; if (blue & 3) blue = (blue & 0x1C) + 4; if (red < 6) red = 6; if (red > 30) red = 30; if (green < 6) green = 6; if (green > 30) green = 30; if (blue < 6) blue = 6; if (blue > 30) blue = 30; return RGB2(red, green, blue); } u16 sub_80FE0AC(u16* color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; if (red < 12 && green < 11 && blue < 11) return 1; if (red > 19 && green > 19 && blue > 19) return 2; if (red > 19) { if (green > 19) { if (blue > 14) return 2; else return 7; } else if (blue > 19) { if (green > 14) return 2; else return 8; } } if (green > 19 && blue > 19) { if (red > 14) return 2; else return 9; } if (red > 19) { if (green > 11) { if (blue > 11) { if (green < blue) return 8; else return 7; } else { return 10; } } else if (blue > 11) { return 13; } else { return 4; } } if (green > 19) { if (red > 11) { if (blue > 11) { if (red < blue) return 9; else return 7; } else { return 11; } } else { if (blue > 11) return 14; else return 5; } } if (blue > 19) { if (red > 11) { if (green > 11) { if (red < green) return 9; else return 8; } } else if (green > 11) { return 12; } if (blue > 11) return 15; else return 6; } return 3; } u16 sub_80FE17C(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; u16 average = ((red + green + blue) / 3) & 0x1E; if (average == 0) return 1; else return average / 2; } u16 sub_80FE1B0(u16 *color) { u16 red = *color & 0x1F; u16 green = (*color >> 5) & 0x1F; u16 blue = (*color >> 10) & 0x1F; u16 average = (red + green + blue) / 3; return average + 1; }