summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2018-07-22 10:40:00 -0500
committerMarcus Huderle <huderlem@gmail.com>2018-07-22 17:40:53 -0500
commit354b82fce64c1f798c1a6c143b82269514562f91 (patch)
tree926382658c40d9e0a5b1898417ff8c098cc434f9 /src
parentd1358719dbf4c7298662041b4e18a4567f65a6ba (diff)
Decompile more of contest_effects.s
Diffstat (limited to 'src')
-rw-r--r--src/contest_painting_effects.c599
1 files changed, 594 insertions, 5 deletions
diff --git a/src/contest_painting_effects.c b/src/contest_painting_effects.c
index b07319048..ae89df88e 100644
--- a/src/contest_painting_effects.c
+++ b/src/contest_painting_effects.c
@@ -3,6 +3,7 @@
#include "contest_painting.h"
extern u16 (*gUnknown_03005DEC)[][32];
+extern u8 gUnknown_083E7A50[][3];
extern u8 gUnknown_03005E00;
extern u8 gUnknown_03005DFC;
extern u8 gUnknown_03005DF8;
@@ -26,8 +27,15 @@ void sub_80FCC18(u8);
void sub_80FC92C(u8);
void sub_80FC9E4(u8);
void sub_80FD1C8(u16);
-u16 sub_80FD39C(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_80FC7A0(struct Unk03005E20* info)
{
@@ -152,13 +160,594 @@ void sub_80FCAC4(void)
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++)
+ u16* color = &var2[gUnknown_03005DE8];
+ for (j = 0; j < gUnknown_03005DF8; j++, color++)
{
- if (!(0x8000 & *pal))
+ 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))
{
- *pal = sub_80FD39C(pal);
+ *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);
+}