From b6bdaedb77a740893ebb66a85ebecbfa64353ba6 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 18 Jun 2021 14:28:58 -0400 Subject: Sync image_processing_effects from emerald, 1 --- src/contest_painting.c | 187 ++--- src/contest_painting_effects.c | 1535 -------------------------------------- src/debug/tomomichi_debug_menu.c | 2 +- src/image_processing_effects.c | 1535 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 1634 insertions(+), 1625 deletions(-) delete mode 100644 src/contest_painting_effects.c create mode 100644 src/image_processing_effects.c (limited to 'src') diff --git a/src/contest_painting.c b/src/contest_painting.c index 59ffd2353..c502bd83a 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -1,29 +1,29 @@ #include "global.h" #include "contest_painting.h" -#include "contest_painting_effects.h" #include "data2.h" #include "decompress.h" +#include "ewram.h" +#include "image_processing_effects.h" #include "main.h" #include "menu.h" #include "palette.h" #include "random.h" +#include "scanline_effect.h" #include "sprite.h" #include "string_util.h" #include "strings.h" #include "text.h" -#include "scanline_effect.h" -#include "ewram.h" -static u8 gUnknown_03000750; -static u16 gUnknown_03000752; -static u16 gUnknown_03000754; -static u8 gUnknown_03000756; +static u8 sHoldState; +static u16 sMosaicVal; +static u16 sFrameCounter; +static u8 sVarsInitialized; -u16 (*gUnknown_03005E10)[][32]; -struct Unk03005E20 gUnknown_03005E20; -u8 gUnknown_03005E40[0x4C]; -struct ContestEntry *gUnknown_03005E8C; -u16 *gUnknown_03005E90; +u16 (*gContestMonPixels)[][32]; +struct ImageProcessingContext gImageProcessingContext; +u8 sCaptionBuffer[76]; +struct ContestWinner *gContestPaintingWinner; +u16 *gContestPaintingMonPalette; static const u16 gPictureFramePalettes[][16] = { @@ -49,7 +49,8 @@ const u8 gPictureFrameTilemap_2[] = INCBIN_U8("graphics/picture_frame/frame2_map 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[] = + +const u8 *const sContestRankNames[] = { OtherText_Cool, OtherText_Beauty2, @@ -57,25 +58,32 @@ const u8 *const gUnknown_083F60AC[] = OtherText_Smart, OtherText_Tough, }; -const struct LabelPair gUnknown_083F60C0[] = + +const struct LabelPair sMuseumCaptions[] = { + // COOL {OtherText_NonstopSuperCool, OtherText_Terminator6}, {OtherText_GoodLookingPoke, OtherText_Terminator7}, {OtherText_MarvelousGreat, OtherText_Terminator8}, + // BEAUTY {OtherText_CenturyLastVenus, OtherText_Terminator9}, {OtherText_Terminator10, OtherText_DazzlingSmile}, {OtherText_PokeCenterIdol, OtherText_Terminator11}, + // CUTE {OtherText_LovelyAndSweet, OtherText_Terminator12}, {OtherText_ThePretty, OtherText_WinningPortrait}, {OtherText_GiveUsWink, OtherText_Terminator13}, + // SMART {OtherText_SmartnessMaestro, OtherText_Terminator15}, {OtherText_ChosenPokeAmong, OtherText_Terminator15}, {OtherText_TheExcellent, OtherText_ItsMomentOfElegance}, + // TOUGH {OtherText_PowerfullyMuscular, OtherText_Terminator16}, {OtherText_StrongErEst, OtherText_Terminator17}, {OtherText_MightyTough, OtherText_Exclamation}, }; -const struct OamData gOamData_83F6138 = + +const struct OamData sContestPaintingMonOamData = { .y = 0, .affineMode = 0, @@ -91,7 +99,8 @@ const struct OamData gOamData_83F6138 = .paletteNum = 0, .affineParam = 0, }; -const u16 gUnknown_083F6140[] = {0, 0}; + +const u16 sBgPalette[] = {RGB_BLACK, RGB_BLACK}; static void ShowContestPainting(); static void CB2_HoldContestPainting(void); @@ -107,7 +116,7 @@ static void sub_8107090(u8 arg0, u8 arg1); void sub_8106630(u32 contestWinnerId) { // probably fakematching - struct ContestWinner *ptr1 = (struct ContestWinner*)&ewram15DE0; // TODO: resolve messy struct duplicates + struct ContestWinner *ptr1 = &eContestPaintingWinner; // TODO: resolve messy struct duplicates u8 *ptr2 = (u8*)&gBattleStruct->contestWinnerSaveIdx; u8 *ptr3 = (u8*)&gBattleStruct->contestWinnerIsForArtist; *ptr1 = gSaveBlock1.contestWinners[contestWinnerId - 1]; @@ -127,7 +136,7 @@ static void ShowContestPainting(void) case 0: ScanlineEffect_Stop(); SetVBlankCallback(NULL); - gUnknown_03005E8C = &ewram15DE0; + gContestPaintingWinner = &eContestPaintingWinner; ContestPaintingInitVars(TRUE); ContestPaintingInitBG(); gMain.state++; @@ -152,11 +161,11 @@ static void ShowContestPainting(void) break; case 4: ContestPaintingPrintCaption(gBattleStruct->contestWinnerSaveIdx, gBattleStruct->contestWinnerIsForArtist); - LoadPalette(gUnknown_083F6140, 0, 1 * 2); + LoadPalette(sBgPalette, 0, 1 * 2); DmaClear32(3, PLTT, 0x400); BeginFastPaletteFade(2); SetVBlankCallback(VBlankCB_ContestPainting); - gUnknown_03000750 = 0; + sHoldState = 0; REG_DISPCNT = DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG1_ON | DISPCNT_OBJ_ON; SetMainCallback2(CB2_HoldContestPainting); break; @@ -176,30 +185,30 @@ static void CB2_QuitContestPainting(void) static void HoldContestPainting(void) { - switch (gUnknown_03000750) + switch (sHoldState) { case 0: if (!gPaletteFade.active) - gUnknown_03000750 = 1; - if (gUnknown_03000756 != 0 && gUnknown_03000754 != 0) - gUnknown_03000754--; + sHoldState = 1; + if (sVarsInitialized != 0 && sFrameCounter != 0) + sFrameCounter--; break; case 1: if ((gMain.newKeys & 1) || (gMain.newKeys & 2)) { u8 two = 2; //needed to make the asm match - gUnknown_03000750 = two; + sHoldState = two; BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); } - if (gUnknown_03000756 != 0) - gUnknown_03000754 = 0; + if (sVarsInitialized != 0) + sFrameCounter = 0; break; case 2: if (!gPaletteFade.active) SetMainCallback2(CB2_QuitContestPainting); - if (gUnknown_03000756 != 0 && gUnknown_03000754 <= 0x1D) - gUnknown_03000754++; + if (sVarsInitialized != 0 && sFrameCounter <= 0x1D) + sFrameCounter++; break; } } @@ -218,16 +227,16 @@ static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) if (arg1 == TRUE) return; - ptr = gUnknown_03005E40; - type = gUnknown_03005E8C->contestType; + ptr = sCaptionBuffer; + type = gContestPaintingWinner->contestCategory; if (contestType < 8) { - ptr = StringCopy(ptr, gUnknown_083F60AC[type]); + ptr = StringCopy(ptr, sContestRankNames[type]); ptr = StringCopy(ptr, gContestText_ContestWinner); #if ENGLISH - ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); + ptr = StringCopy(ptr, gContestPaintingWinner->trainerName); #elif GERMAN - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); + ptr = StringCopy10(ptr, gContestPaintingWinner->nickname); #endif // {LATIN} @@ -237,9 +246,9 @@ static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) ptr = StringCopy(ptr, gOtherText_Unknown1); #if ENGLISH - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); + ptr = StringCopy10(ptr, gContestPaintingWinner->nickname); #elif GERMAN - ptr = StringCopy(ptr, gUnknown_03005E8C->trainer_name); + ptr = StringCopy(ptr, gContestPaintingWinner->trainerName); #endif xPos = 6; @@ -247,14 +256,14 @@ static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) } else { - ptr = StringCopy(ptr, gUnknown_083F60C0[type].prefix); - ptr = StringCopy10(ptr, gUnknown_03005E8C->pokemon_name); - ptr = StringCopy(ptr, gUnknown_083F60C0[type].suffix); + ptr = StringCopy(ptr, sMuseumCaptions[type].prefix); + ptr = StringCopy10(ptr, gContestPaintingWinner->nickname); + ptr = StringCopy(ptr, sMuseumCaptions[type].suffix); xPos = 3; yPos = 14; } - Menu_PrintTextPixelCoords(gUnknown_03005E40, xPos * 8 + 1, yPos * 8, 1); + Menu_PrintTextPixelCoords(sCaptionBuffer, xPos * 8 + 1, yPos * 8, 1); } static void ContestPaintingInitBG(void) @@ -272,30 +281,30 @@ static void ContestPaintingInitVars(bool8 arg0) { if (arg0 == FALSE) { - gUnknown_03000756 = FALSE; - gUnknown_03000752 = 0; - gUnknown_03000754 = 0; + sVarsInitialized = FALSE; + sMosaicVal = 0; + sFrameCounter = 0; } else { - gUnknown_03000756 = TRUE; - gUnknown_03000752 = 15; - gUnknown_03000754 = 30; + sVarsInitialized = TRUE; + sMosaicVal = 15; + sFrameCounter = 30; } } static void ContestPaintingMosaic(void) { - if (gUnknown_03000756 == FALSE) + if (sVarsInitialized == 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; + sMosaicVal = sFrameCounter / 2; - REG_MOSAIC = (gUnknown_03000752 << 12) | (gUnknown_03000752 << 8) | (gUnknown_03000752 << 4) | (gUnknown_03000752 << 0); + REG_MOSAIC = (sMosaicVal << 12) | (sMosaicVal << 8) | (sMosaicVal << 4) | (sMosaicVal << 0); } static void VBlankCB_ContestPainting(void) @@ -310,8 +319,8 @@ static void sub_8106AC4(u16 species, u8 arg1) { const void *pal; - pal = GetMonSpritePalFromOtIdPersonality(species, gUnknown_03005E8C->otId, gUnknown_03005E8C->personality); - LZDecompressVram(pal, gUnknown_03005E90); + pal = GetMonSpritePalFromOtIdPersonality(species, gContestPaintingWinner->otId, gContestPaintingWinner->personality); + LZDecompressVram(pal, gContestPaintingMonPalette); if (arg1 == 0) { @@ -322,9 +331,9 @@ static void sub_8106AC4(u16 species, u8 arg1) EWRAM, gUnknown_081FAF4C[1], species, - (u32)gUnknown_03005E8C->personality + (u32)gContestPaintingWinner->personality ); - sub_8106B90((u8*)gUnknown_081FAF4C[1], (u16*)gUnknown_03005E90, (u16*)gUnknown_03005E10); + sub_8106B90((u8*)gUnknown_081FAF4C[1], (u16*)gContestPaintingMonPalette, (u16*)gContestMonPixels); } else { @@ -335,9 +344,9 @@ static void sub_8106AC4(u16 species, u8 arg1) EWRAM, gUnknown_081FAF4C[0], species, - (u32)gUnknown_03005E8C->personality + (u32)gContestPaintingWinner->personality ); - sub_8106B90((u8*)gUnknown_081FAF4C[0], (u16*)gUnknown_03005E90, (u16*)gUnknown_03005E10); + sub_8106B90((u8*)gUnknown_081FAF4C[0], (u16*)gContestPaintingMonPalette, (u16*)gContestMonPixels); } } @@ -396,27 +405,27 @@ static void sub_8106C40(u8 arg0, u8 arg1) LoadPalette(gPictureFramePalettes, 0, sizeof(gPictureFramePalettes)); if (arg1 == 1) { - switch (gUnknown_03005E8C->contestType / 3) + switch (gContestPaintingWinner->contestCategory / 3) { case CONTEST_COOL: RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_0, gUnknown_03005E10); + RLUnCompWram(gPictureFrameTilemap_0, gContestMonPixels); break; case CONTEST_BEAUTY: RLUnCompVram(gPictureFrameTiles_1, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_1, gUnknown_03005E10); + RLUnCompWram(gPictureFrameTilemap_1, gContestMonPixels); break; case CONTEST_CUTE: RLUnCompVram(gPictureFrameTiles_2, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_2, gUnknown_03005E10); + RLUnCompWram(gPictureFrameTilemap_2, gContestMonPixels); break; case CONTEST_SMART: RLUnCompVram(gPictureFrameTiles_3, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_3, gUnknown_03005E10); + RLUnCompWram(gPictureFrameTilemap_3, gContestMonPixels); break; case CONTEST_TOUGH: RLUnCompVram(gPictureFrameTiles_4, (void *)VRAM); - RLUnCompWram(gPictureFrameTilemap_4, gUnknown_03005E10); + RLUnCompWram(gPictureFrameTilemap_4, gContestMonPixels); break; } @@ -433,12 +442,12 @@ static void sub_8106C40(u8 arg0, u8 arg1) 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]; + VRAM_PICTURE_DATA(x + 6, y + 2) = (*gContestMonPixels)[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]; + VRAM_PICTURE_DATA(x + 7, 2) = (*gContestMonPixels)[2][7]; #undef VRAM_PICTURE_DATA } @@ -449,7 +458,7 @@ static void sub_8106C40(u8 arg0, u8 arg1) } else { - switch (gUnknown_03005E8C->contestType / 3) + switch (gContestPaintingWinner->contestCategory / 3) { case CONTEST_COOL: RLUnCompVram(gPictureFrameTiles_0, (void *)VRAM); @@ -482,7 +491,7 @@ static void sub_8106E98(u8 arg0) asm(""::"r"(arg0)); #endif - gMain.oamBuffer[0] = gOamData_83F6138; + gMain.oamBuffer[0] = sContestPaintingMonOamData; gMain.oamBuffer[0].tileNum = 0; #ifndef NONMATCHING @@ -498,9 +507,9 @@ static u8 sub_8106EE0(u8 arg0) u8 contestType; if (arg0 < 8) - contestType = gUnknown_03005E8C->contestType; + contestType = gContestPaintingWinner->contestCategory; else - contestType = gUnknown_03005E8C->contestType / 3; + contestType = gContestPaintingWinner->contestCategory / 3; switch (contestType) { @@ -521,52 +530,52 @@ static u8 sub_8106EE0(u8 arg0) static void sub_8106F4C(void) { - gUnknown_03005E90 = ewram15E00.unk2017e00; - gUnknown_03005E10 = &ewram15E00.unk2015e00; + gContestPaintingMonPalette = ewram15E00.palette; + gContestMonPixels = (void *)&ewram15E00.pixels; } 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->personality % 256; - 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; + gImageProcessingContext.var_4 = gContestMonPixels; + gImageProcessingContext.var_8 = gContestPaintingMonPalette; + gImageProcessingContext.var_18 = 0; + gImageProcessingContext.var_1F = gContestPaintingWinner->personality % 256; + gImageProcessingContext.var_19 = 0; + gImageProcessingContext.var_1A = 0; + gImageProcessingContext.var_1B = 64; + gImageProcessingContext.var_1C = 64; + gImageProcessingContext.var_1D = 64; + gImageProcessingContext.var_1E = 64; switch (arg0) { case CONTESTRESULT_SMART: case CONTESTRESULT_TOUGH: - gUnknown_03005E20.var_14 = 3; + gImageProcessingContext.var_14 = 3; break; case CONTESTRESULT_COOL: case CONTESTRESULT_BEAUTY: case CONTESTRESULT_CUTE: default: - gUnknown_03005E20.var_14 = 1; + gImageProcessingContext.var_14 = 1; break; } - gUnknown_03005E20.var_16 = 2; - gUnknown_03005E20.var_0 = arg0; - gUnknown_03005E20.var_10 = OBJ_VRAM0; + gImageProcessingContext.var_16 = 2; + gImageProcessingContext.var_0 = arg0; + gImageProcessingContext.var_10 = OBJ_VRAM0; - sub_80FC7A0(&gUnknown_03005E20); - sub_80FDA18(&gUnknown_03005E20); - sub_80FD8CC(&gUnknown_03005E20); + sub_80FC7A0(&gImageProcessingContext); + sub_80FDA18(&gImageProcessingContext); + sub_80FD8CC(&gImageProcessingContext); - LoadPalette(gUnknown_03005E90, 256, 256 * 2); + LoadPalette(gContestPaintingMonPalette, 256, 256 * 2); } static void sub_8107090(u8 arg0, u8 arg1) { sub_8106F4C(); - sub_8106AC4(gUnknown_03005E8C->species, 0); + sub_8106AC4(gContestPaintingWinner->species, 0); sub_8106F6C(sub_8106EE0(arg0)); sub_8106E98(arg0); sub_8106C40(arg0, arg1); diff --git a/src/contest_painting_effects.c b/src/contest_painting_effects.c deleted file mode 100644 index ade91a0ec..000000000 --- a/src/contest_painting_effects.c +++ /dev/null @@ -1,1535 +0,0 @@ -#include "global.h" -#include "contest_painting_effects.h" -#include "contest_painting.h" - -extern const u8 gUnknown_083E7A50[][3]; - -u16 (*gUnknown_03005DEC)[][32]; -u8 gUnknown_03005DE8; -u8 gUnknown_03005DF0; -u8 gUnknown_03005DFC; -u8 gUnknown_03005DF8; -u8 gUnknown_03005DF4; -u8 gUnknown_03005E00; -u8 gUnknown_03005E04; -u16 * gUnknown_03005E08; -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; -} diff --git a/src/debug/tomomichi_debug_menu.c b/src/debug/tomomichi_debug_menu.c index c4ce87f33..771aa7d18 100644 --- a/src/debug/tomomichi_debug_menu.c +++ b/src/debug/tomomichi_debug_menu.c @@ -4470,7 +4470,7 @@ NAKED void PicTest_Redraw(u8 a0) static void PrepareDebugOverlayBeforeShowingContestPainting(u8 a0) { - struct ContestEntry *contestEntry = &ewram15DE0; + struct ContestWinner *contestEntry = &eContestPaintingWinner; contestEntry->species = sPicTest_Species; contestEntry->otId = sPicTest_OTID; contestEntry->personality = sPicTest_Personality; diff --git a/src/image_processing_effects.c b/src/image_processing_effects.c new file mode 100644 index 000000000..f0f44d6e5 --- /dev/null +++ b/src/image_processing_effects.c @@ -0,0 +1,1535 @@ +#include "global.h" +#include "image_processing_effects.h" +#include "contest_painting.h" + +extern const u8 gUnknown_083E7A50[][3]; + +u16 (*gUnknown_03005DEC)[][32]; +u8 gUnknown_03005DE8; +u8 gUnknown_03005DF0; +u8 gUnknown_03005DFC; +u8 gUnknown_03005DF8; +u8 gUnknown_03005DF4; +u8 gUnknown_03005E00; +u8 gUnknown_03005E04; +u16 * gUnknown_03005E08; +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 ImageProcessingContext* 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 ImageProcessingContext * 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 ImageProcessingContext * 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 ImageProcessingContext *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; +} -- cgit v1.2.3