diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/anim/battle_intro.c | 4 | ||||
-rw-r--r-- | src/battle_anim_effects_3.c | 2 | ||||
-rw-r--r-- | src/battle_gfx_sfx_util.c | 26 | ||||
-rw-r--r-- | src/battle_main.c | 6 | ||||
-rw-r--r-- | src/contest.c | 4 | ||||
-rw-r--r-- | src/contest_link_80C2020.c | 2 | ||||
-rw-r--r-- | src/contest_painting.c | 182 | ||||
-rw-r--r-- | src/data/pointillism_points.h | 3210 | ||||
-rw-r--r-- | src/debug/watanabe_debug_menu.c | 6 | ||||
-rw-r--r-- | src/decompress.c | 4 | ||||
-rw-r--r-- | src/egg_hatch.c | 2 | ||||
-rw-r--r-- | src/evolution_scene.c | 10 | ||||
-rw-r--r-- | src/field_effect.c | 4 | ||||
-rw-r--r-- | src/image_processing_effects.c | 1415 | ||||
-rw-r--r-- | src/main_menu.c | 4 | ||||
-rw-r--r-- | src/pokeblock_feed.c | 2 | ||||
-rw-r--r-- | src/pokemon_3.c | 2 | ||||
-rw-r--r-- | src/pokemon_summary_screen.c | 2 | ||||
-rw-r--r-- | src/script_pokemon_util_80C4BF0.c | 4 | ||||
-rw-r--r-- | src/starter_choose.c | 2 | ||||
-rw-r--r-- | src/text.c | 2 | ||||
-rw-r--r-- | src/trade.c | 2 | ||||
-rw-r--r-- | src/trainer_card.c | 2 |
23 files changed, 3888 insertions, 1011 deletions
diff --git a/src/battle/anim/battle_intro.c b/src/battle/anim/battle_intro.c index 1c1972bb4..e432701f4 100644 --- a/src/battle/anim/battle_intro.c +++ b/src/battle/anim/battle_intro.c @@ -463,7 +463,7 @@ void sub_80E4EF8(u8 left, u8 top, u8 c, u8 paletteNum, u16 e, u8 bgMap, u8 g) s32 y; u8 bank = GetBattlerAtPosition(c); - DmaCopy16(3, gUnknown_081FAF4C[c] + gBattleMonForms[bank] * 0x800, (void *)(VRAM + e), 0x800); + DmaCopy16(3, gMonSpriteGfx_Sprite_ptr[c] + gBattleMonForms[bank] * 0x800, (void *)(VRAM + e), 0x800); tileNum = e / 32 - g * 512; for (y = top; y < top + 8; y++) { @@ -481,7 +481,7 @@ void unref_sub_80E4FDC(u8 left, u8 top, u8 c, u8 form, u8 paletteNum, u16 f, u8 s32 x; s32 y; - DmaCopy16(3, gUnknown_081FAF4C[c] + form * 0x800, (void *)(VRAM + f), 0x800); + DmaCopy16(3, gMonSpriteGfx_Sprite_ptr[c] + form * 0x800, (void *)(VRAM + f), 0x800); tileNum = f / 32 - h * 512; for (y = top; y < top + 8; y++) { diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 881f13c97..51cc90ee6 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -2297,7 +2297,7 @@ void sub_812D7E8(u8 taskId) else position = GetBattlerPosition(gBattleAnimAttacker); - dest = gUnknown_081FAF4C[position] + (gBattleMonForms[gBattleAnimAttacker] << 11); + dest = gMonSpriteGfx_Sprite_ptr[position] + (gBattleMonForms[gBattleAnimAttacker] << 11); src = subStruct.field_0; DmaCopy32(3, dest, src, 0x800); diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 49da3c9e6..3c3464b9e 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -313,7 +313,7 @@ void BattleLoadOpponentMonSprite(struct Pokemon *pkmn, u8 b) gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, eVoidSharedArr2, - gUnknown_081FAF4C[var], + gMonSpriteGfx_Sprite_ptr[var], species, r7); paletteOffset = 0x100 + b * 16; @@ -365,7 +365,7 @@ void BattleLoadPlayerMonSprite(struct Pokemon *pkmn, u8 b) gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, eVoidSharedArr2, - gUnknown_081FAF4C[var], + gMonSpriteGfx_Sprite_ptr[var], species, r7); paletteOffset = 0x100 + b * 16; @@ -408,9 +408,9 @@ void sub_8031A6C(u16 a, u8 b) gTrainerFrontPicCoords[a].coords, gTrainerFrontPicCoords[a].y_offset, eVoidSharedArr, - gUnknown_081FAF4C[status], + gMonSpriteGfx_Sprite_ptr[status], 0); - spriteSheet.data = gUnknown_081FAF4C[status]; + spriteSheet.data = gMonSpriteGfx_Sprite_ptr[status]; spriteSheet.size = gTrainerFrontPicTable[a].size; spriteSheet.tag = gTrainerFrontPicTable[a].tag; LoadCompressedObjectPic(&spriteSheet); @@ -427,7 +427,7 @@ void LoadPlayerTrainerBankSprite(u16 a, u8 b) gTrainerBackPicCoords[a].coords, gTrainerBackPicCoords[a].y_offset, eVoidSharedArr, - gUnknown_081FAF4C[status], + gMonSpriteGfx_Sprite_ptr[status], 0); LoadCompressedPalette(gTrainerBackPicPaletteTable[a].data, 0x100 + b * 16, 32); } @@ -662,7 +662,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, eVoidSharedArr2, - gUnknown_081FAF4C[0], + gMonSpriteGfx_Sprite_ptr[0], species, shared19348.unk10); } @@ -682,7 +682,7 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, eVoidSharedArr2, - gUnknown_081FAF4C[r10], + gMonSpriteGfx_Sprite_ptr[r10], species, gTransformedPersonalities[a]); } @@ -695,12 +695,12 @@ void sub_8031FC4(u8 a, u8 b, bool8 c) gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, eVoidSharedArr2, - gUnknown_081FAF4C[r10], + gMonSpriteGfx_Sprite_ptr[r10], species, gTransformedPersonalities[a]); } } - DmaCopy32Defvars(3, gUnknown_081FAF4C[r10], (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[a]].oam.tileNum * 32), 0x800); + DmaCopy32Defvars(3, gMonSpriteGfx_Sprite_ptr[r10], (void *)(VRAM + 0x10000 + gSprites[gBattlerSpriteIds[a]].oam.tileNum * 32), 0x800); paletteOffset = 0x100 + a * 16; lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personalityValue); LZDecompressWram(lzPaletteData, gSharedMem); @@ -739,15 +739,15 @@ void BattleLoadSubstituteSprite(u8 a, u8 b) else r4 = GetBattlerPosition(a); if (IsContest()) - LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); + LZDecompressVram(gSubstituteDollTilemap, gMonSpriteGfx_Sprite_ptr[r4]); else if (GetBattlerSide(a) != 0) - LZDecompressVram(gSubstituteDollGfx, gUnknown_081FAF4C[r4]); + LZDecompressVram(gSubstituteDollGfx, gMonSpriteGfx_Sprite_ptr[r4]); else - LZDecompressVram(gSubstituteDollTilemap, gUnknown_081FAF4C[r4]); + LZDecompressVram(gSubstituteDollTilemap, gMonSpriteGfx_Sprite_ptr[r4]); // There is probably a way to do this without all the temp variables, but I couldn't figure it out. foo = a * 16; gSubstituteDollPal_ = gSubstituteDollPal; - src = gUnknown_081FAF4C[r4]; + src = gMonSpriteGfx_Sprite_ptr[r4]; for (i = 0; i < 3; i++) DmaCopy32(3, src, src + i * 0x800 + 0x800, 0x800); LoadCompressedPalette(gSubstituteDollPal_, 0x100 + foo, 32); diff --git a/src/battle_main.c b/src/battle_main.c index fee505c43..3c490e626 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2623,7 +2623,7 @@ void debug_sub_8012688(void) gMonFrontPicCoords[gCurrentMove].coords, gMonFrontPicCoords[gCurrentMove].y_offset, (void *)EWRAM, - gUnknown_081FAF4C[1], + gMonSpriteGfx_Sprite_ptr[1], gCurrentMove); LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32); GetMonSpriteTemplate_803C56C(gCurrentMove, 1); @@ -2683,7 +2683,7 @@ void debug_sub_80129F8(u8 taskId) gMonFrontPicCoords[gCurrentMove].coords, gMonFrontPicCoords[gCurrentMove].y_offset, (void *)EWRAM, - gUnknown_081FAF4C[1], + gMonSpriteGfx_Sprite_ptr[1], gCurrentMove); LoadCompressedPalette(gMonPaletteTable[gCurrentMove].data, 272, 32); gSprites[gTasks[taskId].data[1]].pos1.y = gMonFrontPicCoords[gCurrentMove].y_offset + 40; @@ -3179,7 +3179,7 @@ void sub_8010494(struct Sprite *sprite) else { // this should use a MEMSET_ALT, but *(dst++) wont match with it. - dst = (u8 *)gUnknown_081FAF4C[GetBattlerPosition(sprite->data[0])] + (gBattleMonForms[sprite->data[0]] << 11) + (sprite->data[3] << 8); + dst = (u8 *)gMonSpriteGfx_Sprite_ptr[GetBattlerPosition(sprite->data[0])] + (gBattleMonForms[sprite->data[0]] << 11) + (sprite->data[3] << 8); for (i = 0; i < 0x100; i++) *(dst++) = 0; StartSpriteAnim(sprite, gBattleMonForms[sprite->data[0]]); diff --git a/src/contest.c b/src/contest.c index 50824c867..20e25e829 100644 --- a/src/contest.c +++ b/src/contest.c @@ -2457,7 +2457,7 @@ u8 unref_sub_80AE908(void) gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (void *)EWRAM, - gUnknown_081FAF4C[1], + gMonSpriteGfx_Sprite_ptr[1], species); LoadCompressedPalette(gMonPaletteTable[species].data, 0x110, 32); GetMonSpriteTemplate_803C56C(gContestMons[gContestPlayerMonIndex].species, 1); @@ -2483,7 +2483,7 @@ u8 sub_80AE9FC(u16 species, u32 otId, u32 personality) gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, EWRAM, - gUnknown_081FAF4C[0], + gMonSpriteGfx_Sprite_ptr[0], species, personality); lzPaletteData = GetMonSpritePalFromOtIdPersonality(species, otId, personality); diff --git a/src/contest_link_80C2020.c b/src/contest_link_80C2020.c index e76e7322b..579ee3688 100644 --- a/src/contest_link_80C2020.c +++ b/src/contest_link_80C2020.c @@ -610,7 +610,7 @@ static void sub_80C2A8C(u8 taskId) species = gContestMons[i].species; personality = gContestMons[i].personality; otId = gContestMons[i].otId; - HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (intptr_t)gSharedMem, gUnknown_081FAF4C[1], species, personality); + HandleLoadSpecialPokePic(gMonFrontPicTable + species, gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (intptr_t)gSharedMem, gMonSpriteGfx_Sprite_ptr[1], species, personality); monPal = GetMonSpritePalStructFromOtIdPersonality(species, otId, personality); LoadCompressedObjectPalette(monPal); GetMonSpriteTemplate_803C56C(species, 1); diff --git a/src/contest_painting.c b/src/contest_painting.c index 24a63b48f..0238bb179 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -105,13 +105,13 @@ const u16 sBgPalette[] = {RGB_BLACK, RGB_BLACK}; static void ShowContestPainting(); static void CB2_HoldContestPainting(void); static void HoldContestPainting(void); -static void ContestPaintingInitWindow(u8 arg0); -static void ContestPaintingPrintCaption(u8 arg0, u8 arg1); -static void ContestPaintingInitBG(void); -static void ContestPaintingInitVars(u8 arg0); +static void InitContestPaintingWindow(bool8 isForArtist); +static void PrintContestPaintingCaption(u8 contestType, bool8 isForArtist); +static void InitContestPaintingBg(void); +static void InitContestPaintingVars(bool8 reset); static void VBlankCB_ContestPainting(void); -static void sub_8106B90(u8 *a, u16 *b, u16 *c); -static void CreateContestPaintingPicture(u8 arg0, u8 arg1); +static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 *destPixels); +static void CreateContestPaintingPicture(u8 contestWinnerId, bool8 isForArtist); void SetContestWinnerForPainting(u32 contestWinnerId) { @@ -137,8 +137,8 @@ static void ShowContestPainting(void) ScanlineEffect_Stop(); SetVBlankCallback(NULL); gContestPaintingWinner = &eCurContestWinner; - ContestPaintingInitVars(TRUE); - ContestPaintingInitBG(); + InitContestPaintingVars(TRUE); + InitContestPaintingBg(); gMain.state++; break; case 1: @@ -152,7 +152,7 @@ static void ShowContestPainting(void) case 2: SeedRng(gMain.vblankCounter1); InitKeys(); - ContestPaintingInitWindow(eCurContestWinnerIsForArtist); + InitContestPaintingWindow(eCurContestWinnerIsForArtist); gMain.state++; break; case 3: @@ -160,7 +160,7 @@ static void ShowContestPainting(void) gMain.state++; break; case 4: - ContestPaintingPrintCaption(eCurContestWinnerSaveIdx, eCurContestWinnerIsForArtist); + PrintContestPaintingCaption(eCurContestWinnerSaveIdx, eCurContestWinnerIsForArtist); LoadPalette(sBgPalette, 0, 1 * 2); DmaClear32(3, PLTT, 0x400); BeginFastPaletteFade(2); @@ -190,16 +190,14 @@ static void HoldContestPainting(void) case 0: if (!gPaletteFade.active) sHoldState = 1; - if (sVarsInitialized != 0 && sFrameCounter != 0) + if (sVarsInitialized&& sFrameCounter != 0) sFrameCounter--; break; case 1: - if ((gMain.newKeys & 1) || (gMain.newKeys & 2)) + if ((gMain.newKeys & A_BUTTON) || (gMain.newKeys & B_BUTTON)) { - u8 two = 2; //needed to make the asm match - - sHoldState = two; - BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB(0, 0, 0)); + sHoldState++; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); } if (sVarsInitialized != 0) sFrameCounter = 0; @@ -207,25 +205,25 @@ static void HoldContestPainting(void) case 2: if (!gPaletteFade.active) SetMainCallback2(CB2_QuitContestPainting); - if (sVarsInitialized != 0 && sFrameCounter <= 0x1D) + if (sVarsInitialized && sFrameCounter < 30) sFrameCounter++; break; } } -static void ContestPaintingInitWindow(u8 arg0) +static void InitContestPaintingWindow(u8 isForArtist) { - InitMenuWindow(&gWindowTemplate_81E7160); - Text_LoadWindowTemplate(&gWindowTemplate_81E7160); + InitMenuWindow(&gWindowTemplate_ContestPainting); + Text_LoadWindowTemplate(&gWindowTemplate_ContestPainting); } -static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) +static void PrintContestPaintingCaption(u8 contestType, u8 isForArtist) { u8 xPos, yPos; u8 *ptr; u8 type; - if (arg1 == TRUE) + if (isForArtist == TRUE) return; ptr = sCaptionBuffer; type = gContestPaintingWinner->contestCategory; @@ -240,7 +238,7 @@ static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) #endif // {LATIN} - ptr[0] = 0xFC; + ptr[0] = EXT_CTRL_CODE_BEGIN; ptr[1] = 0x16; ptr += 2; @@ -266,7 +264,7 @@ static void ContestPaintingPrintCaption(u8 contestType, u8 arg1) Menu_PrintTextPixelCoords(sCaptionBuffer, xPos * 8 + 1, yPos * 8, 1); } -static void ContestPaintingInitBG(void) +static void InitContestPaintingBg(void) { REG_DISPCNT = 0; REG_IE |= INTR_FLAG_VBLANK; @@ -277,9 +275,9 @@ static void ContestPaintingInitBG(void) REG_BLDY = 0; } -static void ContestPaintingInitVars(bool8 arg0) +static void InitContestPaintingVars(bool8 reset) { - if (arg0 == FALSE) + if (reset == FALSE) { sVarsInitialized = FALSE; sMosaicVal = 0; @@ -315,7 +313,7 @@ static void VBlankCB_ContestPainting(void) TransferPlttBuffer(); } -static void sub_8106AC4(u16 species, u8 arg1) +static void InitContestMonPixels(u16 species, u8 arg1) { const void *pal; @@ -329,11 +327,11 @@ static void sub_8106AC4(u16 species, u8 arg1) gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, EWRAM, - gUnknown_081FAF4C[1], + gMonSpriteGfx_Sprite_ptr[1], species, (u32)gContestPaintingWinner->personality ); - sub_8106B90((u8*)gUnknown_081FAF4C[1], (u16*)gContestPaintingMonPalette, (u16*)gContestMonPixels); + _InitContestMonPixels((u8*)gMonSpriteGfx_Sprite_ptr[1], (u16*)gContestPaintingMonPalette, (u16*)gContestMonPixels); } else { @@ -342,17 +340,17 @@ static void sub_8106AC4(u16 species, u8 arg1) gMonBackPicCoords[species].coords, gMonBackPicCoords[species].y_offset, EWRAM, - gUnknown_081FAF4C[0], + gMonSpriteGfx_Sprite_ptr[0], species, (u32)gContestPaintingWinner->personality ); - sub_8106B90((u8*)gUnknown_081FAF4C[0], (u16*)gContestPaintingMonPalette, (u16*)gContestMonPixels); + _InitContestMonPixels((u8*)gMonSpriteGfx_Sprite_ptr[0], (u16*)gContestPaintingMonPalette, (u16*)gContestMonPixels); } } -static void sub_8106B90(u8 *a, u16 *b, u16 *c) +static void _InitContestMonPixels(u8 *spriteGfx, u16 *palette, u16 *destPixels) { - u16 i, j, k, l; + u16 tileY, tileX, pixelY, pixelX; /* Raw arithmetics are required to match this function. @@ -362,48 +360,49 @@ static void sub_8106B90(u8 *a, u16 *b, u16 *c) calculate dimensions manually (as seen in other functions), tell that it may have been this way in the original code. */ - for (i = 0; i < 8; i++) + for (tileY = 0; tileY < 8; tileY++) { - for (j = 0; j < 8; j++) + for (tileX = 0; tileX < 8; tileX++) { - for (k = 0; k < 8; k++) + for (pixelY = 0; pixelY < 8; pixelY++) { - for (l = 0; l < 8; l++) + for (pixelX = 0; pixelX < 8; pixelX++) { - u8 temp = a[(((i * 8) + j) * 32) + (k << 2) + (l >> 1)]; + u8 colorIndex = spriteGfx[(((tileY * 8) + tileX) * 32) + (pixelY << 2) + (pixelX >> 1)]; /* The shifts have to be there to match r0 and r2's order in one instruction: add r5, r2, r0 This also makes agbcc's expression order parsing even more super sensitive and obscene when it comes to parentheses affecting regalloc regardless if - unnecessary, requiring j must be placed in the front to match, or else + unnecessary, requiring tileX must be placed in the front to match, or else regalloc breaks again and does this a few instructions above: add r0, r3, r7 <- regswap */ - if (l & 1) - temp /= 16; + if (pixelX & 1) + colorIndex /= 16; else - temp %= 16; + colorIndex %= 16; // Same order as above needs to be written here, or else this happens: // add r0, r7, r1 <- regswap - if (temp == 0) - *(u16 *)(c + (((i * 8) + k) << 6) + ((j * 8) + l)) = 0x8000; + if (colorIndex == 0) + *(u16 *)(destPixels + (((tileY * 8) + pixelY) << 6) + ((tileX * 8) + pixelX)) = 0x8000; else - *(u16 *)(c + (((i * 8) + k) << 6) + ((j * 8) + l)) = b[temp]; + *(u16 *)(destPixels + (((tileY * 8) + pixelY) << 6) + ((tileX * 8) + pixelX)) = + palette[colorIndex]; } } } } } -static void sub_8106C40(u8 arg0, u8 arg1) +static void LoadContestPaintingFrame(u8 contestWinnerId, u8 isForArtist) { u8 x, y; LoadPalette(gPictureFramePalettes, 0, sizeof(gPictureFramePalettes)); - if (arg1 == 1) + if (isForArtist == TRUE) { switch (gContestPaintingWinner->contestCategory / 3) { @@ -451,7 +450,7 @@ static void sub_8106C40(u8 arg0, u8 arg1) #undef VRAM_PICTURE_DATA } - else if (arg0 < 8) + else if (contestWinnerId < 8) { RLUnCompVram(gPictureFrameTiles_5, (void *)VRAM); RLUnCompVram(gPictureFrameTilemap_5, (void *)(VRAM + 0x6000)); @@ -484,29 +483,28 @@ static void sub_8106C40(u8 arg0, u8 arg1) } } -static void sub_8106E98(u8 arg0) +static void InitPaintingMonOamData(u8 contestWinnerId) { - //Some hacks just to get the asm to match -#ifndef NONMATCHING - asm(""::"r"(arg0)); -#endif - gMain.oamBuffer[0] = sContestPaintingMonOamData; gMain.oamBuffer[0].tileNum = 0; -#ifndef NONMATCHING - if (arg0) arg0 = gMain.oamBuffer[0].tileNum; -#endif - - gMain.oamBuffer[0].x = 88; - gMain.oamBuffer[0].y = 24; + if (contestWinnerId > 1) + { + gMain.oamBuffer[0].x = 88; + gMain.oamBuffer[0].y = 24; + } + else // duplicated code branch + { + gMain.oamBuffer[0].x = 88; + gMain.oamBuffer[0].y = 24; + } } -static u8 sub_8106EE0(u8 arg0) +static u8 GetImageEffectForContestWinner(u8 contestWinnerId) { u8 contestType; - if (arg0 < 8) + if (contestWinnerId < 8) contestType = gContestPaintingWinner->contestCategory; else contestType = gContestPaintingWinner->contestCategory / 3; @@ -528,55 +526,55 @@ static u8 sub_8106EE0(u8 arg0) return contestType; } -static void sub_8106F4C(void) +static void AllocPaintingResources(void) { - gContestPaintingMonPalette = ewram15E00.palette; - gContestMonPixels = (void *)&ewram15E00.pixels; + gContestPaintingMonPalette = eContestPaintingBuffers.palette; + gContestMonPixels = (void *)eContestPaintingBuffers.pixels; } -static void sub_8106F6C(u8 arg0) +static void DoContestPaintingImageProcessing(u8 imageEffect) { - 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) + gImageProcessingContext.canvasPixels = gContestMonPixels; + gImageProcessingContext.canvasPalette = gContestPaintingMonPalette; + gImageProcessingContext.paletteStart = 0; + gImageProcessingContext.personality = gContestPaintingWinner->personality % 256; + gImageProcessingContext.columnStart = 0; + gImageProcessingContext.rowStart = 0; + gImageProcessingContext.columnEnd = 64; + gImageProcessingContext.rowEnd = 64; + gImageProcessingContext.canvasWidth = 64; + gImageProcessingContext.canvasHeight = 64; + + switch (imageEffect) { case CONTESTRESULT_SMART: case CONTESTRESULT_TOUGH: - gImageProcessingContext.var_14 = 3; + gImageProcessingContext.quantizeEffect = QUANTIZE_EFFECT_GRAYSCALE; break; case CONTESTRESULT_COOL: case CONTESTRESULT_BEAUTY: case CONTESTRESULT_CUTE: default: - gImageProcessingContext.var_14 = 1; + gImageProcessingContext.quantizeEffect = QUANTIZE_EFFECT_STANDARD_LIMITED_COLORS; break; } - gImageProcessingContext.var_16 = 2; - gImageProcessingContext.var_0 = arg0; - gImageProcessingContext.var_10 = OBJ_VRAM0; + gImageProcessingContext.bgType = 2; + gImageProcessingContext.effect = imageEffect; + gImageProcessingContext.dest = OBJ_VRAM0; - sub_80FC7A0(&gImageProcessingContext); - sub_80FDA18(&gImageProcessingContext); - sub_80FD8CC(&gImageProcessingContext); + ApplyImageProcessingEffects(&gImageProcessingContext); + ApplyImageProcessingQuantization(&gImageProcessingContext); + ConvertImageProcessingToGBA(&gImageProcessingContext); LoadPalette(gContestPaintingMonPalette, 256, 256 * 2); } -static void CreateContestPaintingPicture(u8 arg0, u8 arg1) +static void CreateContestPaintingPicture(u8 contestWinnerId, u8 isForArtist) { - sub_8106F4C(); - sub_8106AC4(gContestPaintingWinner->species, 0); - sub_8106F6C(sub_8106EE0(arg0)); - sub_8106E98(arg0); - sub_8106C40(arg0, arg1); + AllocPaintingResources(); + InitContestMonPixels(gContestPaintingWinner->species, 0); + DoContestPaintingImageProcessing(GetImageEffectForContestWinner(contestWinnerId)); + InitPaintingMonOamData(contestWinnerId); + LoadContestPaintingFrame(contestWinnerId, isForArtist); } diff --git a/src/data/pointillism_points.h b/src/data/pointillism_points.h new file mode 100644 index 000000000..708f5c02e --- /dev/null +++ b/src/data/pointillism_points.h @@ -0,0 +1,3210 @@ +#define GET_POINT_OFFSET_DL(bits) (((bits) >> 0) & 1) +#define GET_POINT_COLOR_TYPE(bits) (((bits) >> 1) & 3) +#define GET_POINT_DELTA(bits) (((bits) >> 3) & 7) + +#define PT(x, y, delta, colorType, offsetDownLeft) x, y, (delta << 3) | (colorType << 1) | offsetDownLeft + +static const u8 sPointillismPoints[][3] = { + PT( 0, 29, 3, 2, FALSE), + PT(14, 30, 3, 1, TRUE), + PT( 0, 1, 6, 1, FALSE), + PT(46, 30, 6, 3, TRUE), + PT(10, 34, 3, 3, TRUE), + PT( 5, 38, 5, 3, FALSE), + PT(18, 23, 3, 3, FALSE), + PT(26, 3, 2, 0, TRUE), + PT( 5, 17, 3, 0, FALSE), + PT( 5, 39, 5, 3, TRUE), + PT(26, 63, 2, 1, FALSE), + PT(34, 63, 2, 3, FALSE), + PT(43, 47, 5, 3, FALSE), + PT(17, 2, 5, 2, TRUE), + PT(35, 13, 5, 0, FALSE), + PT(23, 12, 3, 0, TRUE), + PT(47, 14, 2, 1, TRUE), + PT(48, 24, 4, 0, FALSE), + PT(45, 40, 4, 1, FALSE), + PT( 1, 3, 3, 0, TRUE), + PT(14, 42, 5, 1, TRUE), + PT(34, 21, 4, 2, TRUE), + PT(34, 10, 4, 3, FALSE), + PT(57, 6, 4, 1, TRUE), + PT(22, 7, 5, 3, TRUE), + PT(34, 58, 3, 1, TRUE), + PT(59, 54, 6, 2, TRUE), + PT(10, 43, 4, 2, FALSE), + PT(54, 9, 2, 1, FALSE), + PT(28, 47, 4, 1, TRUE), + PT(46, 56, 5, 2, FALSE), + PT( 5, 42, 4, 0, FALSE), + PT( 7, 20, 6, 1, FALSE), + PT(49, 8, 2, 3, TRUE), + PT(26, 36, 5, 2, TRUE), + PT(34, 10, 2, 3, FALSE), + PT(27, 38, 5, 1, TRUE), + PT(41, 22, 2, 0, TRUE), + PT(53, 8, 2, 2, FALSE), + PT(30, 8, 2, 2, FALSE), + PT( 5, 49, 2, 2, FALSE), + PT(56, 49, 2, 3, TRUE), + PT(52, 51, 2, 1, FALSE), + PT(17, 9, 3, 3, TRUE), + PT(40, 61, 6, 1, FALSE), + PT(53, 3, 3, 3, FALSE), + PT(60, 43, 5, 3, FALSE), + PT(16, 1, 2, 3, TRUE), + PT( 3, 62, 4, 1, FALSE), + PT(23, 24, 6, 2, FALSE), + PT( 8, 41, 3, 0, TRUE), + PT( 3, 36, 5, 0, FALSE), + PT(61, 51, 5, 3, TRUE), + PT(49, 36, 3, 0, TRUE), + PT(27, 24, 4, 3, FALSE), + PT( 7, 13, 4, 2, TRUE), + PT(45, 63, 2, 1, FALSE), + PT(47, 21, 4, 2, TRUE), + PT(41, 15, 2, 1, FALSE), + PT( 7, 44, 2, 1, FALSE), + PT(44, 11, 4, 3, FALSE), + PT(18, 26, 2, 3, FALSE), + PT( 0, 11, 5, 3, TRUE), + PT(22, 53, 4, 2, FALSE), + PT(31, 28, 4, 1, FALSE), + PT(41, 51, 4, 3, TRUE), + PT(59, 48, 2, 3, TRUE), + PT(17, 6, 6, 2, TRUE), + PT(62, 49, 5, 3, TRUE), + PT(17, 58, 4, 2, TRUE), + PT(42, 2, 3, 0, TRUE), + PT(51, 24, 6, 2, TRUE), + PT(42, 32, 4, 0, TRUE), + PT(46, 50, 3, 1, TRUE), + PT(59, 31, 4, 1, TRUE), + PT(57, 41, 5, 1, FALSE), + PT(46, 49, 5, 0, TRUE), + PT(42, 14, 5, 2, TRUE), + PT(45, 0, 3, 3, TRUE), + PT(56, 40, 3, 1, TRUE), + PT(20, 59, 5, 1, TRUE), + PT(46, 4, 4, 3, FALSE), + PT(54, 48, 2, 0, TRUE), + PT(59, 33, 5, 2, TRUE), + PT(43, 63, 3, 1, TRUE), + PT(32, 19, 6, 0, TRUE), + PT(51, 12, 6, 0, FALSE), + PT(34, 43, 5, 1, TRUE), + PT(22, 2, 3, 3, FALSE), + PT(28, 18, 3, 2, FALSE), + PT(15, 60, 6, 3, FALSE), + PT(56, 16, 5, 2, TRUE), + PT(24, 47, 5, 2, TRUE), + PT(53, 59, 2, 0, TRUE), + PT(55, 49, 2, 1, TRUE), + PT(19, 61, 5, 3, TRUE), + PT(30, 44, 6, 1, TRUE), + PT(46, 55, 2, 1, FALSE), + PT(60, 31, 6, 1, TRUE), + PT(50, 42, 4, 3, TRUE), + PT(13, 59, 3, 2, FALSE), + PT(53, 42, 4, 3, TRUE), + PT( 9, 61, 4, 3, TRUE), + PT(18, 11, 3, 0, FALSE), + PT(12, 21, 3, 2, TRUE), + PT(32, 1, 3, 2, FALSE), + PT( 8, 59, 3, 2, FALSE), + PT(18, 55, 6, 1, TRUE), + PT(21, 3, 5, 2, FALSE), + PT(42, 59, 6, 0, TRUE), + PT(15, 4, 6, 2, TRUE), + PT( 8, 23, 6, 1, TRUE), + PT(56, 61, 5, 1, FALSE), + PT(47, 53, 2, 3, FALSE), + PT(16, 53, 2, 3, FALSE), + PT(35, 19, 5, 2, FALSE), + PT(47, 6, 4, 0, FALSE), + PT(39, 58, 4, 2, FALSE), + PT( 0, 28, 5, 1, FALSE), + PT( 3, 57, 3, 2, TRUE), + PT(40, 7, 3, 1, FALSE), + PT(32, 10, 6, 3, TRUE), + PT( 7, 53, 5, 2, TRUE), + PT(21, 47, 5, 2, FALSE), + PT(16, 44, 4, 1, TRUE), + PT(63, 41, 2, 2, FALSE), + PT(42, 33, 6, 3, FALSE), + PT(52, 26, 5, 2, FALSE), + PT(28, 61, 6, 1, TRUE), + PT(56, 43, 4, 1, FALSE), + PT(53, 40, 3, 3, TRUE), + PT(61, 15, 3, 2, FALSE), + PT(30, 62, 3, 1, TRUE), + PT(12, 62, 3, 3, TRUE), + PT(43, 49, 5, 2, FALSE), + PT(50, 57, 2, 0, TRUE), + PT( 5, 9, 2, 0, TRUE), + PT( 4, 56, 5, 1, FALSE), + PT(50, 0, 2, 3, FALSE), + PT(19, 11, 6, 0, TRUE), + PT(52, 42, 2, 1, TRUE), + PT(44, 34, 4, 0, TRUE), + PT(57, 47, 2, 2, TRUE), + PT(55, 40, 3, 3, FALSE), + PT( 7, 59, 5, 2, TRUE), + PT(17, 3, 5, 0, FALSE), + PT(45, 48, 3, 3, FALSE), + PT(49, 17, 2, 0, TRUE), + PT(35, 1, 3, 3, FALSE), + PT(61, 49, 6, 2, FALSE), + PT(28, 2, 6, 2, FALSE), + PT(33, 14, 4, 2, TRUE), + PT(61, 7, 2, 3, TRUE), + PT(51, 21, 2, 0, FALSE), + PT(41, 50, 6, 1, FALSE), + PT(24, 31, 6, 0, FALSE), + PT(45, 59, 6, 0, FALSE), + PT(39, 62, 2, 3, FALSE), + PT(49, 21, 2, 1, FALSE), + PT(48, 37, 2, 3, TRUE), + PT(51, 6, 6, 2, FALSE), + PT( 0, 41, 3, 0, FALSE), + PT(60, 3, 2, 1, FALSE), + PT(44, 12, 2, 0, TRUE), + PT( 9, 48, 6, 0, FALSE), + PT(16, 14, 2, 0, TRUE), + PT(39, 22, 3, 1, TRUE), + PT(12, 59, 5, 3, FALSE), + PT(43, 51, 3, 3, FALSE), + PT(19, 45, 5, 2, TRUE), + PT(17, 36, 5, 0, TRUE), + PT(52, 62, 5, 1, TRUE), + PT(36, 30, 4, 0, TRUE), + PT(39, 26, 5, 2, TRUE), + PT( 4, 57, 2, 3, FALSE), + PT(62, 51, 4, 3, FALSE), + PT(27, 46, 4, 2, TRUE), + PT(12, 6, 3, 0, TRUE), + PT(37, 25, 3, 0, FALSE), + PT(29, 51, 6, 1, TRUE), + PT(29, 40, 5, 2, TRUE), + PT(28, 16, 5, 1, FALSE), + PT(31, 53, 3, 3, FALSE), + PT(52, 2, 2, 0, FALSE), + PT(43, 58, 2, 2, FALSE), + PT(13, 11, 2, 2, TRUE), + PT(12, 44, 2, 0, FALSE), + PT(55, 58, 3, 0, TRUE), + PT( 6, 19, 2, 3, TRUE), + PT(36, 16, 4, 2, TRUE), + PT(36, 4, 3, 3, FALSE), + PT( 0, 53, 6, 2, FALSE), + PT(58, 0, 6, 3, TRUE), + PT(60, 7, 3, 1, FALSE), + PT(43, 40, 6, 3, FALSE), + PT(52, 57, 5, 3, TRUE), + PT(40, 9, 3, 3, TRUE), + PT(56, 49, 6, 0, FALSE), + PT(22, 37, 6, 0, TRUE), + PT(24, 40, 6, 0, TRUE), + PT(24, 12, 4, 1, FALSE), + PT( 6, 57, 5, 2, TRUE), + PT(61, 32, 4, 2, FALSE), + PT(46, 39, 4, 0, TRUE), + PT(62, 24, 3, 0, FALSE), + PT(21, 60, 4, 2, FALSE), + PT( 6, 27, 4, 3, FALSE), + PT(21, 14, 4, 1, FALSE), + PT(10, 13, 3, 3, TRUE), + PT(24, 22, 6, 2, FALSE), + PT(16, 40, 4, 0, TRUE), + PT(32, 17, 2, 0, TRUE), + PT(54, 50, 2, 2, TRUE), + PT(59, 46, 4, 2, FALSE), + PT(31, 45, 2, 1, FALSE), + PT(54, 46, 4, 0, FALSE), + PT(11, 23, 6, 1, TRUE), + PT(38, 3, 3, 3, TRUE), + PT( 8, 25, 6, 0, TRUE), + PT(42, 24, 4, 2, TRUE), + PT(53, 45, 5, 2, TRUE), + PT(48, 56, 3, 0, FALSE), + PT(28, 37, 2, 2, FALSE), + PT(28, 34, 5, 0, FALSE), + PT( 8, 35, 4, 0, TRUE), + PT(38, 30, 6, 0, FALSE), + PT(25, 15, 2, 2, TRUE), + PT(16, 47, 4, 1, FALSE), + PT(18, 2, 4, 2, TRUE), + PT(60, 1, 3, 2, TRUE), + PT(14, 20, 3, 0, FALSE), + PT(13, 24, 2, 3, TRUE), + PT(34, 11, 6, 0, TRUE), + PT(19, 52, 4, 0, TRUE), + PT(15, 45, 6, 3, FALSE), + PT(57, 31, 4, 2, TRUE), + PT(24, 16, 3, 3, TRUE), + PT(45, 32, 4, 0, FALSE), + PT(25, 11, 6, 0, TRUE), + PT(51, 19, 2, 2, FALSE), + PT(46, 17, 4, 0, TRUE), + PT(45, 10, 6, 3, TRUE), + PT( 7, 21, 3, 1, TRUE), + PT(50, 4, 6, 1, FALSE), + PT( 6, 24, 3, 1, TRUE), + PT(19, 36, 2, 1, FALSE), + PT(54, 34, 2, 3, FALSE), + PT(29, 41, 3, 2, FALSE), + PT(53, 23, 4, 0, TRUE), + PT(54, 23, 5, 1, TRUE), + PT(53, 50, 3, 0, TRUE), + PT(42, 15, 5, 3, FALSE), + PT(16, 0, 6, 2, FALSE), + PT( 2, 14, 5, 0, FALSE), + PT(49, 50, 6, 1, FALSE), + PT(59, 5, 4, 0, FALSE), + PT(54, 38, 2, 1, FALSE), + PT(52, 6, 6, 2, FALSE), + PT(30, 49, 6, 1, FALSE), + PT(53, 5, 6, 2, FALSE), + PT(30, 19, 2, 2, TRUE), + PT(21, 20, 5, 2, FALSE), + PT(41, 28, 3, 0, FALSE), + PT(36, 36, 2, 1, FALSE), + PT(34, 41, 3, 0, FALSE), + PT(52, 54, 6, 0, FALSE), + PT(30, 1, 4, 1, TRUE), + PT(12, 60, 4, 2, FALSE), + PT(10, 61, 2, 3, FALSE), + PT(39, 30, 4, 1, TRUE), + PT(21, 2, 2, 1, FALSE), + PT(17, 25, 5, 1, FALSE), + PT(29, 49, 2, 2, TRUE), + PT( 3, 59, 5, 1, FALSE), + PT(33, 25, 5, 2, FALSE), + PT(10, 35, 2, 0, TRUE), + PT(37, 17, 3, 1, FALSE), + PT(26, 10, 6, 2, FALSE), + PT(59, 11, 6, 1, TRUE), + PT(33, 11, 6, 3, TRUE), + PT( 1, 49, 5, 0, FALSE), + PT(53, 29, 4, 3, TRUE), + PT(44, 48, 6, 0, TRUE), + PT(46, 57, 5, 2, TRUE), + PT(48, 5, 5, 2, FALSE), + PT(18, 42, 5, 1, TRUE), + PT(57, 34, 4, 0, FALSE), + PT(21, 52, 3, 2, FALSE), + PT(28, 1, 2, 2, TRUE), + PT(32, 22, 4, 1, FALSE), + PT(19, 4, 3, 0, FALSE), + PT(30, 19, 2, 0, FALSE), + PT(37, 51, 2, 2, TRUE), + PT(57, 3, 6, 0, TRUE), + PT(63, 54, 3, 0, FALSE), + PT(20, 35, 2, 0, FALSE), + PT(47, 30, 3, 3, TRUE), + PT(31, 23, 5, 2, FALSE), + PT( 2, 22, 6, 0, TRUE), + PT(32, 24, 6, 0, FALSE), + PT(46, 24, 6, 3, TRUE), + PT(59, 14, 6, 0, FALSE), + PT(16, 57, 4, 2, FALSE), + PT(38, 57, 3, 3, FALSE), + PT(48, 38, 5, 3, FALSE), + PT(18, 1, 2, 2, FALSE), + PT(55, 42, 5, 3, FALSE), + PT(33, 6, 3, 2, TRUE), + PT(42, 22, 6, 1, FALSE), + PT( 9, 56, 3, 2, FALSE), + PT( 7, 34, 2, 3, TRUE), + PT(59, 45, 2, 2, TRUE), + PT( 7, 30, 5, 3, FALSE), + PT(27, 46, 3, 2, TRUE), + PT( 4, 9, 6, 0, FALSE), + PT(48, 45, 6, 3, TRUE), + PT(45, 52, 4, 2, FALSE), + PT(24, 36, 4, 2, TRUE), + PT(14, 45, 4, 3, FALSE), + PT(35, 10, 2, 3, FALSE), + PT(18, 45, 2, 0, TRUE), + PT(33, 40, 5, 3, FALSE), + PT(15, 1, 4, 0, TRUE), + PT( 1, 49, 2, 1, FALSE), + PT(63, 27, 3, 3, FALSE), + PT(33, 37, 5, 1, TRUE), + PT(38, 24, 2, 1, TRUE), + PT(21, 45, 6, 2, FALSE), + PT(35, 33, 6, 3, FALSE), + PT(14, 46, 3, 2, FALSE), + PT(20, 34, 3, 2, FALSE), + PT(44, 11, 5, 0, FALSE), + PT(26, 24, 4, 0, TRUE), + PT(33, 7, 3, 1, FALSE), + PT(36, 38, 5, 0, TRUE), + PT(43, 10, 6, 2, FALSE), + PT(62, 39, 6, 1, TRUE), + PT(18, 52, 3, 1, TRUE), + PT(31, 1, 5, 1, FALSE), + PT(46, 6, 4, 1, TRUE), + PT(47, 31, 2, 2, FALSE), + PT(24, 6, 4, 3, FALSE), + PT(49, 31, 5, 1, TRUE), + PT(34, 38, 5, 3, FALSE), + PT(30, 21, 2, 3, FALSE), + PT(32, 34, 5, 0, FALSE), + PT(21, 55, 2, 1, FALSE), + PT(37, 4, 5, 2, FALSE), + PT(31, 4, 5, 3, FALSE), + PT(12, 19, 3, 0, FALSE), + PT( 7, 11, 6, 3, FALSE), + PT(29, 28, 5, 1, FALSE), + PT(48, 34, 3, 2, FALSE), + PT(46, 18, 5, 3, TRUE), + PT(43, 33, 3, 3, FALSE), + PT(22, 56, 6, 0, FALSE), + PT( 4, 2, 2, 3, FALSE), + PT( 5, 20, 4, 0, FALSE), + PT(56, 60, 6, 1, TRUE), + PT(33, 27, 5, 3, TRUE), + PT(20, 42, 4, 3, TRUE), + PT(56, 20, 3, 1, TRUE), + PT(43, 31, 5, 1, TRUE), + PT(41, 43, 4, 2, TRUE), + PT(39, 54, 4, 0, TRUE), + PT(17, 34, 3, 1, TRUE), + PT(41, 3, 3, 1, TRUE), + PT(24, 36, 5, 0, FALSE), + PT(33, 45, 6, 3, FALSE), + PT(60, 44, 4, 2, FALSE), + PT(51, 23, 3, 3, TRUE), + PT(42, 58, 4, 0, TRUE), + PT(10, 35, 6, 3, TRUE), + PT( 0, 11, 4, 0, TRUE), + PT(17, 56, 3, 0, TRUE), + PT(15, 14, 3, 2, FALSE), + PT(31, 15, 6, 3, TRUE), + PT(60, 16, 6, 3, TRUE), + PT(56, 49, 6, 2, TRUE), + PT( 7, 21, 5, 0, FALSE), + PT(30, 46, 3, 0, TRUE), + PT(38, 16, 6, 1, TRUE), + PT(61, 53, 5, 3, TRUE), + PT(58, 4, 6, 2, FALSE), + PT(13, 24, 3, 1, FALSE), + PT( 1, 45, 2, 2, TRUE), + PT(61, 26, 2, 3, TRUE), + PT(23, 63, 6, 1, FALSE), + PT(11, 33, 2, 0, TRUE), + PT(30, 38, 5, 1, TRUE), + PT(13, 25, 4, 2, FALSE), + PT(46, 4, 3, 1, TRUE), + PT(27, 51, 4, 0, FALSE), + PT(21, 33, 3, 2, TRUE), + PT(31, 4, 4, 0, TRUE), + PT(15, 18, 3, 3, TRUE), + PT(45, 42, 6, 1, FALSE), + PT( 3, 55, 3, 3, TRUE), + PT(53, 7, 4, 3, TRUE), + PT(36, 31, 6, 0, TRUE), + PT(47, 48, 2, 2, TRUE), + PT( 6, 0, 4, 2, FALSE), + PT(11, 34, 3, 1, FALSE), + PT(12, 59, 5, 0, TRUE), + PT(20, 26, 2, 3, TRUE), + PT(55, 32, 4, 2, TRUE), + PT(63, 38, 6, 3, TRUE), + PT(58, 62, 2, 0, FALSE), + PT(34, 4, 2, 0, TRUE), + PT(40, 18, 3, 2, FALSE), + PT( 3, 46, 5, 3, FALSE), + PT(14, 56, 5, 0, FALSE), + PT( 1, 41, 4, 1, FALSE), + PT(30, 51, 3, 0, TRUE), + PT( 6, 33, 4, 3, TRUE), + PT(51, 25, 3, 1, FALSE), + PT( 2, 5, 2, 3, TRUE), + PT(17, 17, 5, 2, FALSE), + PT(31, 38, 3, 3, FALSE), + PT(57, 31, 5, 0, FALSE), + PT(46, 47, 2, 1, FALSE), + PT(34, 52, 2, 1, TRUE), + PT(59, 38, 5, 3, TRUE), + PT(52, 0, 2, 2, FALSE), + PT(16, 49, 2, 0, TRUE), + PT(29, 45, 5, 1, FALSE), + PT( 8, 8, 6, 3, TRUE), + PT(21, 24, 6, 2, FALSE), + PT( 4, 43, 4, 2, FALSE), + PT(47, 30, 4, 3, TRUE), + PT(34, 42, 4, 2, FALSE), + PT( 7, 20, 4, 2, TRUE), + PT( 1, 39, 3, 0, TRUE), + PT(41, 10, 5, 0, TRUE), + PT(61, 28, 5, 3, TRUE), + PT(13, 31, 3, 2, FALSE), + PT(36, 61, 6, 1, FALSE), + PT(54, 29, 4, 2, FALSE), + PT(20, 33, 2, 3, FALSE), + PT(26, 13, 5, 0, TRUE), + PT(63, 43, 5, 1, FALSE), + PT(26, 62, 6, 2, TRUE), + PT(17, 40, 3, 0, FALSE), + PT(50, 5, 2, 2, TRUE), + PT(33, 46, 6, 2, FALSE), + PT(45, 20, 5, 1, FALSE), + PT(60, 8, 6, 3, TRUE), + PT(63, 52, 3, 3, FALSE), + PT(39, 36, 3, 2, FALSE), + PT(22, 22, 6, 1, TRUE), + PT(41, 59, 3, 0, TRUE), + PT(54, 47, 3, 2, FALSE), + PT( 3, 37, 5, 2, FALSE), + PT(11, 22, 6, 3, FALSE), + PT(28, 29, 3, 1, TRUE), + PT(44, 39, 3, 1, TRUE), + PT(11, 31, 5, 1, TRUE), + PT( 8, 16, 4, 3, TRUE), + PT(63, 37, 5, 3, TRUE), + PT(51, 19, 3, 3, TRUE), + PT( 4, 49, 6, 3, TRUE), + PT(14, 47, 2, 1, FALSE), + PT( 8, 35, 4, 0, FALSE), + PT(58, 26, 3, 3, FALSE), + PT(47, 11, 3, 3, TRUE), + PT(30, 32, 3, 0, TRUE), + PT(35, 59, 2, 2, FALSE), + PT(37, 0, 4, 3, TRUE), + PT(20, 4, 4, 2, TRUE), + PT(54, 26, 5, 1, TRUE), + PT(39, 33, 2, 2, TRUE), + PT(40, 19, 5, 2, FALSE), + PT(14, 60, 6, 2, TRUE), + PT(12, 45, 5, 1, TRUE), + PT(55, 22, 2, 2, TRUE), + PT(41, 21, 3, 2, TRUE), + PT(23, 52, 6, 3, FALSE), + PT( 9, 10, 6, 0, TRUE), + PT(55, 34, 5, 0, FALSE), + PT(23, 43, 6, 2, TRUE), + PT(20, 43, 2, 1, FALSE), + PT( 8, 19, 3, 3, TRUE), + PT(49, 19, 5, 0, FALSE), + PT( 6, 7, 6, 2, TRUE), + PT(35, 58, 5, 0, TRUE), + PT(15, 36, 5, 3, FALSE), + PT( 7, 53, 4, 3, FALSE), + PT(14, 18, 2, 2, TRUE), + PT(35, 51, 5, 2, FALSE), + PT(14, 33, 4, 3, FALSE), + PT(28, 18, 4, 2, TRUE), + PT(35, 29, 5, 3, TRUE), + PT( 4, 53, 6, 1, TRUE), + PT(22, 1, 4, 2, FALSE), + PT(61, 44, 5, 3, FALSE), + PT(53, 10, 4, 2, TRUE), + PT(17, 19, 4, 2, TRUE), + PT(27, 27, 2, 2, TRUE), + PT(21, 57, 2, 0, FALSE), + PT(11, 53, 4, 2, FALSE), + PT(58, 39, 6, 0, FALSE), + PT(46, 47, 2, 2, TRUE), + PT(16, 31, 6, 2, TRUE), + PT(27, 40, 6, 2, TRUE), + PT(38, 48, 6, 3, TRUE), + PT(52, 55, 5, 1, TRUE), + PT(15, 48, 5, 0, TRUE), + PT(46, 63, 5, 1, TRUE), + PT(56, 52, 5, 1, TRUE), + PT(43, 47, 4, 2, TRUE), + PT(13, 40, 5, 1, FALSE), + PT(51, 24, 2, 0, FALSE), + PT(33, 18, 2, 0, TRUE), + PT(31, 34, 6, 2, FALSE), + PT(17, 37, 4, 1, TRUE), + PT(33, 63, 2, 0, TRUE), + PT(38, 39, 4, 2, TRUE), + PT(40, 54, 2, 1, FALSE), + PT(21, 38, 6, 1, FALSE), + PT(17, 24, 4, 2, FALSE), + PT(50, 37, 6, 3, TRUE), + PT(39, 58, 6, 1, TRUE), + PT(53, 7, 3, 2, FALSE), + PT(26, 14, 5, 1, FALSE), + PT(30, 47, 3, 3, TRUE), + PT( 0, 46, 4, 0, TRUE), + PT(27, 60, 2, 2, FALSE), + PT(47, 58, 5, 3, TRUE), + PT(62, 56, 2, 2, TRUE), + PT(26, 19, 5, 3, TRUE), + PT(41, 13, 5, 3, TRUE), + PT(55, 23, 3, 0, FALSE), + PT(48, 28, 6, 2, TRUE), + PT(21, 52, 2, 2, FALSE), + PT(40, 17, 5, 2, FALSE), + PT(44, 37, 5, 1, FALSE), + PT(32, 63, 5, 0, FALSE), + PT(12, 52, 3, 1, TRUE), + PT(48, 46, 4, 2, TRUE), + PT(55, 28, 4, 2, FALSE), + PT(31, 37, 4, 3, FALSE), + PT(12, 25, 6, 2, FALSE), + PT(24, 16, 6, 2, TRUE), + PT(10, 19, 2, 0, TRUE), + PT(37, 19, 4, 0, FALSE), + PT(19, 25, 2, 0, TRUE), + PT(32, 40, 3, 2, TRUE), + PT(62, 48, 3, 1, TRUE), + PT(35, 36, 4, 0, TRUE), + PT(13, 35, 4, 1, TRUE), + PT(29, 40, 5, 3, FALSE), + PT(45, 18, 3, 3, TRUE), + PT(14, 46, 5, 1, TRUE), + PT(11, 49, 6, 1, FALSE), + PT(36, 60, 5, 2, FALSE), + PT(19, 60, 2, 1, FALSE), + PT(40, 22, 5, 1, FALSE), + PT( 5, 12, 6, 1, FALSE), + PT(57, 11, 6, 1, FALSE), + PT(33, 4, 2, 2, FALSE), + PT(16, 49, 6, 1, FALSE), + PT(18, 31, 4, 1, TRUE), + PT(57, 46, 5, 3, FALSE), + PT(34, 61, 4, 3, TRUE), + PT(12, 30, 3, 0, FALSE), + PT(37, 0, 2, 3, TRUE), + PT( 6, 49, 2, 2, FALSE), + PT(19, 33, 3, 1, FALSE), + PT(20, 32, 6, 2, TRUE), + PT(10, 59, 4, 2, TRUE), + PT(51, 8, 5, 0, FALSE), + PT(61, 2, 6, 1, TRUE), + PT(35, 0, 2, 1, TRUE), + PT(34, 33, 5, 0, FALSE), + PT(48, 20, 5, 3, FALSE), + PT(20, 50, 6, 3, FALSE), + PT(57, 35, 3, 3, FALSE), + PT(28, 17, 6, 0, FALSE), + PT(55, 22, 6, 0, FALSE), + PT(21, 49, 3, 3, TRUE), + PT(52, 40, 5, 2, FALSE), + PT(53, 5, 5, 0, TRUE), + PT(55, 51, 5, 1, FALSE), + PT(28, 23, 5, 3, FALSE), + PT(16, 6, 2, 3, FALSE), + PT(50, 31, 5, 3, TRUE), + PT( 0, 41, 3, 3, FALSE), + PT( 4, 1, 2, 3, FALSE), + PT(59, 35, 3, 3, FALSE), + PT(27, 52, 5, 1, FALSE), + PT(48, 17, 5, 1, TRUE), + PT( 3, 0, 3, 3, TRUE), + PT(29, 55, 3, 1, FALSE), + PT(58, 24, 4, 2, TRUE), + PT(28, 22, 5, 2, FALSE), + PT( 4, 63, 6, 1, TRUE), + PT(38, 35, 5, 2, TRUE), + PT(21, 44, 4, 3, TRUE), + PT( 2, 53, 4, 3, TRUE), + PT( 7, 53, 6, 1, TRUE), + PT(26, 12, 2, 0, FALSE), + PT(40, 38, 5, 2, FALSE), + PT(47, 54, 2, 3, FALSE), + PT(55, 11, 4, 3, TRUE), + PT(27, 61, 3, 0, FALSE), + PT(39, 31, 4, 0, FALSE), + PT(43, 42, 6, 1, TRUE), + PT(11, 15, 4, 0, FALSE), + PT(53, 60, 5, 3, TRUE), + PT(51, 33, 2, 2, TRUE), + PT(45, 38, 6, 2, FALSE), + PT(31, 26, 4, 0, TRUE), + PT(47, 44, 5, 1, FALSE), + PT(26, 50, 3, 1, FALSE), + PT(59, 63, 4, 0, TRUE), + PT(19, 63, 2, 1, TRUE), + PT(15, 36, 4, 1, FALSE), + PT(20, 27, 2, 0, FALSE), + PT(33, 6, 5, 0, FALSE), + PT(37, 52, 2, 0, FALSE), + PT(46, 14, 2, 2, FALSE), + PT(60, 62, 4, 2, TRUE), + PT(22, 6, 6, 0, FALSE), + PT(11, 4, 3, 3, TRUE), + PT(62, 2, 4, 2, FALSE), + PT(12, 23, 4, 2, TRUE), + PT(43, 60, 5, 2, TRUE), + PT(21, 54, 6, 1, TRUE), + PT(24, 35, 5, 1, FALSE), + PT(29, 16, 5, 1, FALSE), + PT(53, 23, 5, 0, FALSE), + PT( 0, 55, 4, 2, FALSE), + PT(10, 59, 2, 2, TRUE), + PT(29, 11, 3, 3, TRUE), + PT(60, 49, 4, 2, TRUE), + PT(29, 15, 3, 2, TRUE), + PT(32, 19, 6, 2, FALSE), + PT(17, 43, 5, 3, FALSE), + PT(35, 12, 5, 3, FALSE), + PT(36, 2, 2, 2, FALSE), + PT(49, 22, 3, 0, TRUE), + PT(14, 35, 6, 2, TRUE), + PT(26, 16, 2, 3, FALSE), + PT(20, 4, 3, 0, TRUE), + PT(45, 39, 6, 3, TRUE), + PT(51, 2, 6, 0, TRUE), + PT( 2, 4, 2, 3, FALSE), + PT(13, 34, 4, 2, TRUE), + PT(37, 0, 2, 3, FALSE), + PT(42, 63, 4, 3, FALSE), + PT(32, 12, 2, 1, FALSE), + PT(47, 46, 6, 2, TRUE), + PT(27, 13, 4, 1, FALSE), + PT(30, 1, 6, 2, FALSE), + PT( 5, 34, 4, 0, TRUE), + PT(52, 42, 6, 1, FALSE), + PT(11, 9, 3, 2, TRUE), + PT(63, 50, 5, 3, TRUE), + PT(61, 24, 5, 2, TRUE), + PT(11, 56, 6, 3, FALSE), + PT(57, 23, 5, 0, FALSE), + PT(52, 4, 4, 2, FALSE), + PT(54, 14, 5, 1, FALSE), + PT(56, 1, 2, 2, FALSE), + PT(60, 36, 4, 1, FALSE), + PT(33, 3, 3, 0, FALSE), + PT(50, 47, 2, 1, FALSE), + PT(41, 36, 6, 0, TRUE), + PT(10, 59, 2, 1, FALSE), + PT(26, 28, 4, 0, FALSE), + PT(48, 49, 3, 1, TRUE), + PT(26, 33, 2, 0, FALSE), + PT( 5, 41, 2, 0, FALSE), + PT(38, 45, 2, 1, TRUE), + PT(22, 12, 3, 2, TRUE), + PT(43, 6, 3, 1, TRUE), + PT( 6, 18, 2, 2, FALSE), + PT(56, 15, 6, 2, TRUE), + PT(35, 58, 5, 2, FALSE), + PT( 0, 25, 6, 1, TRUE), + PT(41, 20, 5, 2, TRUE), + PT(42, 33, 5, 0, TRUE), + PT(20, 49, 2, 2, FALSE), + PT(26, 6, 3, 3, FALSE), + PT(24, 27, 5, 0, FALSE), + PT(59, 22, 5, 0, TRUE), + PT(21, 30, 2, 1, FALSE), + PT(52, 10, 2, 2, FALSE), + PT(27, 5, 4, 3, TRUE), + PT(11, 1, 4, 3, FALSE), + PT(42, 34, 6, 2, TRUE), + PT(33, 32, 3, 0, FALSE), + PT(32, 55, 2, 3, TRUE), + PT(20, 31, 2, 0, TRUE), + PT(29, 17, 4, 2, TRUE), + PT(36, 43, 5, 3, TRUE), + PT( 7, 63, 3, 3, TRUE), + PT(44, 37, 4, 2, TRUE), + PT(42, 41, 3, 0, FALSE), + PT(17, 36, 5, 0, FALSE), + PT(49, 44, 5, 1, FALSE), + PT(57, 11, 4, 3, FALSE), + PT(40, 16, 4, 3, FALSE), + PT(34, 6, 2, 3, FALSE), + PT( 9, 44, 2, 1, TRUE), + PT(52, 25, 2, 2, TRUE), + PT(58, 18, 4, 0, TRUE), + PT(29, 56, 4, 1, TRUE), + PT(18, 37, 4, 2, FALSE), + PT(33, 48, 2, 1, FALSE), + PT(55, 26, 2, 1, FALSE), + PT(36, 59, 4, 2, TRUE), + PT(50, 21, 4, 1, TRUE), + PT(13, 26, 2, 0, FALSE), + PT(22, 46, 4, 3, FALSE), + PT(29, 20, 2, 3, FALSE), + PT(62, 46, 3, 3, TRUE), + PT(10, 22, 2, 0, FALSE), + PT(29, 48, 5, 1, TRUE), + PT( 4, 58, 3, 0, TRUE), + PT( 8, 45, 5, 3, FALSE), + PT(40, 30, 6, 1, TRUE), + PT(10, 18, 5, 3, FALSE), + PT(13, 3, 5, 3, TRUE), + PT(38, 58, 3, 3, FALSE), + PT(53, 59, 5, 1, FALSE), + PT( 3, 26, 3, 0, FALSE), + PT(63, 11, 4, 3, TRUE), + PT( 4, 5, 6, 2, FALSE), + PT(54, 11, 4, 3, TRUE), + PT(59, 23, 2, 0, TRUE), + PT(13, 39, 4, 3, FALSE), + PT(44, 31, 4, 0, FALSE), + PT(38, 16, 4, 0, FALSE), + PT(37, 35, 5, 2, TRUE), + PT(55, 9, 2, 1, TRUE), + PT(20, 23, 5, 2, TRUE), + PT(46, 61, 4, 1, TRUE), + PT(29, 26, 3, 3, TRUE), + PT(33, 51, 5, 3, FALSE), + PT(40, 23, 2, 1, TRUE), + PT(38, 60, 6, 3, FALSE), + PT(20, 26, 6, 1, TRUE), + PT(50, 32, 5, 1, TRUE), + PT(25, 62, 4, 0, FALSE), + PT(12, 2, 5, 2, TRUE), + PT(60, 60, 5, 1, FALSE), + PT(48, 48, 5, 0, FALSE), + PT(37, 63, 3, 3, FALSE), + PT( 3, 23, 3, 3, FALSE), + PT(53, 17, 3, 2, FALSE), + PT(27, 20, 5, 1, FALSE), + PT(40, 58, 4, 1, TRUE), + PT(14, 31, 2, 1, FALSE), + PT(54, 33, 4, 0, FALSE), + PT( 7, 59, 2, 0, FALSE), + PT(35, 25, 6, 2, FALSE), + PT(13, 46, 3, 0, FALSE), + PT(63, 32, 4, 2, TRUE), + PT(62, 59, 2, 2, TRUE), + PT(11, 46, 2, 1, FALSE), + PT(55, 11, 4, 1, TRUE), + PT(61, 50, 3, 3, TRUE), + PT(22, 3, 4, 3, TRUE), + PT(20, 12, 4, 0, TRUE), + PT(24, 3, 6, 0, FALSE), + PT(62, 33, 2, 1, TRUE), + PT(15, 0, 6, 1, FALSE), + PT(63, 35, 2, 3, FALSE), + PT(14, 49, 3, 2, TRUE), + PT(24, 28, 3, 2, TRUE), + PT(48, 14, 3, 3, FALSE), + PT(33, 32, 4, 1, TRUE), + PT(63, 12, 3, 3, FALSE), + PT(20, 51, 4, 1, FALSE), + PT(34, 33, 2, 2, TRUE), + PT(54, 5, 3, 3, FALSE), + PT(29, 49, 2, 2, FALSE), + PT(32, 17, 6, 3, TRUE), + PT(13, 51, 3, 0, TRUE), + PT(37, 5, 6, 3, FALSE), + PT(30, 49, 4, 0, FALSE), + PT(53, 58, 5, 3, TRUE), + PT(50, 47, 6, 0, FALSE), + PT(20, 35, 5, 2, TRUE), + PT(53, 30, 5, 0, TRUE), + PT( 5, 5, 3, 1, TRUE), + PT( 9, 31, 4, 3, FALSE), + PT(47, 11, 2, 2, TRUE), + PT(21, 17, 2, 1, TRUE), + PT(41, 27, 3, 0, FALSE), + PT(28, 19, 6, 2, TRUE), + PT(52, 49, 4, 1, TRUE), + PT(39, 63, 5, 3, TRUE), + PT( 9, 48, 3, 0, TRUE), + PT(35, 18, 6, 2, FALSE), + PT( 2, 42, 4, 0, TRUE), + PT( 9, 60, 3, 2, TRUE), + PT(12, 2, 2, 0, FALSE), + PT(34, 5, 2, 3, TRUE), + PT(34, 8, 3, 1, TRUE), + PT(10, 15, 2, 2, TRUE), + PT( 2, 17, 2, 1, TRUE), + PT( 1, 33, 4, 1, FALSE), + PT(22, 57, 6, 1, TRUE), + PT(36, 56, 6, 2, FALSE), + PT(15, 30, 5, 1, TRUE), + PT(43, 21, 2, 2, TRUE), + PT(32, 34, 5, 3, FALSE), + PT(58, 63, 6, 0, TRUE), + PT(26, 39, 5, 1, TRUE), + PT(41, 52, 2, 2, FALSE), + PT(22, 57, 5, 3, TRUE), + PT(19, 62, 2, 3, FALSE), + PT(54, 33, 6, 0, FALSE), + PT( 0, 36, 5, 1, TRUE), + PT(36, 33, 6, 0, FALSE), + PT(21, 49, 2, 1, TRUE), + PT(16, 55, 4, 2, FALSE), + PT( 8, 7, 4, 1, TRUE), + PT(33, 9, 4, 2, TRUE), + PT( 5, 60, 6, 1, FALSE), + PT(25, 3, 4, 2, TRUE), + PT(15, 41, 5, 1, TRUE), + PT(22, 7, 2, 1, TRUE), + PT(62, 61, 4, 2, TRUE), + PT(54, 11, 5, 0, FALSE), + PT(46, 43, 2, 3, FALSE), + PT(12, 49, 2, 0, TRUE), + PT(48, 19, 5, 2, TRUE), + PT(38, 62, 6, 3, TRUE), + PT(41, 47, 5, 3, FALSE), + PT(21, 61, 2, 3, TRUE), + PT(28, 46, 4, 0, TRUE), + PT(51, 47, 2, 0, FALSE), + PT(13, 5, 3, 2, TRUE), + PT(28, 26, 2, 1, FALSE), + PT(14, 24, 6, 3, TRUE), + PT(27, 17, 2, 2, FALSE), + PT( 6, 20, 4, 0, TRUE), + PT(49, 14, 4, 3, TRUE), + PT(26, 3, 2, 0, FALSE), + PT( 0, 52, 6, 0, TRUE), + PT(63, 11, 3, 2, TRUE), + PT(15, 18, 3, 3, TRUE), + PT(26, 21, 2, 0, FALSE), + PT(15, 0, 4, 2, FALSE), + PT(62, 10, 5, 1, FALSE), + PT(48, 43, 4, 2, FALSE), + PT(38, 49, 2, 0, FALSE), + PT(45, 47, 5, 3, TRUE), + PT(63, 12, 2, 1, TRUE), + PT(18, 11, 2, 3, FALSE), + PT(21, 7, 3, 3, TRUE), + PT(40, 16, 6, 1, FALSE), + PT(15, 23, 2, 2, TRUE), + PT(11, 39, 6, 1, TRUE), + PT(52, 29, 2, 0, FALSE), + PT(28, 58, 2, 1, FALSE), + PT(44, 39, 6, 3, TRUE), + PT(10, 26, 6, 1, FALSE), + PT( 5, 31, 4, 0, TRUE), + PT(36, 13, 3, 3, TRUE), + PT(28, 23, 4, 2, FALSE), + PT(47, 59, 6, 1, FALSE), + PT(59, 37, 2, 0, FALSE), + PT( 3, 47, 4, 0, TRUE), + PT(12, 16, 4, 1, TRUE), + PT(14, 58, 5, 2, FALSE), + PT(51, 3, 5, 2, FALSE), + PT(18, 6, 3, 2, FALSE), + PT(42, 55, 6, 0, FALSE), + PT(63, 1, 3, 3, FALSE), + PT(53, 22, 6, 3, TRUE), + PT(44, 50, 6, 2, TRUE), + PT( 5, 17, 4, 1, FALSE), + PT(41, 9, 4, 0, FALSE), + PT(43, 13, 3, 3, TRUE), + PT(24, 13, 4, 0, FALSE), + PT(35, 57, 2, 3, FALSE), + PT(15, 58, 3, 0, FALSE), + PT(33, 53, 5, 1, TRUE), + PT(54, 38, 5, 1, TRUE), + PT(35, 5, 5, 3, TRUE), + PT(27, 8, 2, 3, TRUE), + PT(62, 9, 2, 3, FALSE), + PT(45, 58, 6, 3, TRUE), + PT(21, 53, 6, 2, TRUE), + PT(41, 10, 2, 1, FALSE), + PT( 2, 57, 3, 3, TRUE), + PT(20, 52, 6, 1, TRUE), + PT(23, 29, 3, 0, FALSE), + PT(22, 29, 3, 1, FALSE), + PT( 1, 57, 4, 1, FALSE), + PT(30, 39, 6, 3, FALSE), + PT(50, 20, 4, 3, FALSE), + PT(10, 57, 6, 3, FALSE), + PT(31, 13, 3, 3, FALSE), + PT(11, 10, 3, 0, TRUE), + PT(53, 29, 6, 2, FALSE), + PT( 3, 18, 2, 3, FALSE), + PT(12, 19, 5, 3, FALSE), + PT(12, 52, 3, 3, FALSE), + PT(16, 20, 3, 3, FALSE), + PT(35, 50, 4, 3, TRUE), + PT( 2, 16, 5, 0, TRUE), + PT(53, 24, 6, 1, TRUE), + PT(51, 29, 3, 1, FALSE), + PT(60, 21, 4, 1, TRUE), + PT(62, 63, 4, 1, FALSE), + PT(42, 2, 5, 2, FALSE), + PT(40, 10, 5, 3, TRUE), + PT(26, 6, 6, 2, TRUE), + PT(60, 23, 5, 1, TRUE), + PT( 3, 18, 2, 3, TRUE), + PT(47, 10, 4, 3, FALSE), + PT(18, 56, 2, 0, TRUE), + PT(54, 27, 4, 1, TRUE), + PT( 1, 57, 6, 2, TRUE), + PT(25, 25, 2, 3, TRUE), + PT( 9, 40, 4, 1, FALSE), + PT(30, 39, 5, 2, FALSE), + PT(53, 51, 5, 2, FALSE), + PT(39, 37, 6, 0, TRUE), + PT( 6, 49, 5, 2, TRUE), + PT(26, 57, 5, 0, FALSE), + PT(45, 4, 3, 3, FALSE), + PT(36, 62, 3, 2, FALSE), + PT(60, 48, 3, 1, TRUE), + PT(63, 62, 6, 3, TRUE), + PT(34, 54, 2, 0, TRUE), + PT( 0, 1, 3, 2, FALSE), + PT(18, 26, 2, 0, FALSE), + PT(18, 30, 5, 2, FALSE), + PT(31, 18, 5, 1, FALSE), + PT(47, 6, 3, 0, TRUE), + PT(53, 26, 3, 0, FALSE), + PT(59, 9, 6, 3, FALSE), + PT(52, 29, 2, 1, TRUE), + PT( 2, 7, 2, 0, FALSE), + PT(32, 47, 3, 2, TRUE), + PT(11, 3, 6, 1, TRUE), + PT(28, 22, 6, 0, TRUE), + PT( 5, 19, 3, 1, TRUE), + PT(41, 6, 2, 1, TRUE), + PT(48, 45, 6, 3, FALSE), + PT(42, 45, 5, 2, FALSE), + PT(25, 52, 3, 2, FALSE), + PT(15, 21, 2, 1, FALSE), + PT(54, 21, 5, 2, FALSE), + PT(58, 6, 3, 2, FALSE), + PT(18, 29, 4, 3, FALSE), + PT( 3, 56, 3, 2, TRUE), + PT( 1, 1, 5, 2, TRUE), + PT(23, 46, 2, 0, FALSE), + PT(20, 23, 3, 2, FALSE), + PT(52, 15, 5, 0, FALSE), + PT( 9, 55, 3, 1, TRUE), + PT(40, 29, 4, 3, FALSE), + PT(41, 45, 6, 3, FALSE), + PT(30, 23, 5, 0, FALSE), + PT(21, 15, 3, 2, FALSE), + PT(32, 45, 2, 0, FALSE), + PT(39, 22, 5, 3, FALSE), + PT(20, 9, 2, 1, FALSE), + PT(59, 61, 4, 0, TRUE), + PT(37, 26, 5, 2, FALSE), + PT( 0, 34, 6, 3, FALSE), + PT(13, 48, 2, 0, FALSE), + PT(23, 25, 3, 1, TRUE), + PT( 0, 59, 4, 0, TRUE), + PT(42, 40, 6, 2, FALSE), + PT(45, 15, 2, 3, FALSE), + PT(10, 48, 5, 0, FALSE), + PT( 6, 0, 4, 2, TRUE), + PT(49, 46, 5, 1, FALSE), + PT(20, 51, 5, 0, FALSE), + PT(54, 16, 5, 3, FALSE), + PT( 5, 46, 3, 0, TRUE), + PT(25, 26, 2, 2, TRUE), + PT(44, 20, 2, 3, TRUE), + PT(55, 15, 2, 1, TRUE), + PT(50, 23, 3, 1, TRUE), + PT(57, 24, 6, 1, FALSE), + PT(46, 50, 3, 3, FALSE), + PT(36, 29, 6, 0, TRUE), + PT(18, 29, 5, 1, TRUE), + PT(20, 12, 4, 3, TRUE), + PT(54, 46, 6, 1, FALSE), + PT( 6, 10, 3, 1, FALSE), + PT(40, 40, 4, 0, FALSE), + PT(58, 58, 2, 3, TRUE), + PT( 8, 39, 6, 3, FALSE), + PT(24, 26, 2, 0, FALSE), + PT(30, 38, 3, 1, TRUE), + PT(31, 51, 3, 3, TRUE), + PT(33, 23, 5, 3, TRUE), + PT( 1, 8, 4, 0, FALSE), + PT(53, 3, 3, 0, TRUE), + PT(59, 2, 4, 0, FALSE), + PT( 2, 45, 4, 1, TRUE), + PT(14, 23, 6, 1, FALSE), + PT(49, 41, 2, 0, TRUE), + PT(34, 23, 4, 1, FALSE), + PT(58, 44, 4, 1, TRUE), + PT(52, 32, 3, 0, FALSE), + PT( 0, 58, 4, 1, FALSE), + PT(37, 51, 4, 0, TRUE), + PT(51, 4, 4, 3, TRUE), + PT( 4, 24, 6, 1, FALSE), + PT(44, 12, 5, 3, TRUE), + PT(40, 20, 5, 2, FALSE), + PT(63, 48, 5, 1, TRUE), + PT(48, 33, 3, 2, TRUE), + PT( 1, 37, 6, 1, FALSE), + PT( 5, 35, 6, 2, FALSE), + PT(36, 16, 6, 0, FALSE), + PT(61, 20, 3, 1, TRUE), + PT(63, 56, 5, 3, TRUE), + PT(34, 27, 6, 1, FALSE), + PT(37, 7, 6, 3, TRUE), + PT(10, 12, 3, 2, TRUE), + PT( 3, 30, 3, 1, FALSE), + PT(15, 60, 2, 1, FALSE), + PT(17, 24, 3, 2, TRUE), + PT( 0, 53, 5, 3, TRUE), + PT(50, 24, 2, 2, FALSE), + PT(35, 48, 3, 1, TRUE), + PT(17, 61, 2, 1, FALSE), + PT(26, 22, 6, 2, TRUE), + PT(40, 5, 4, 2, FALSE), + PT(23, 61, 6, 3, TRUE), + PT(46, 9, 5, 3, FALSE), + PT(24, 29, 2, 3, TRUE), + PT(32, 31, 3, 0, FALSE), + PT(35, 44, 5, 3, TRUE), + PT(32, 63, 2, 3, FALSE), + PT(63, 41, 5, 3, FALSE), + PT(35, 59, 5, 0, TRUE), + PT(24, 57, 2, 1, TRUE), + PT(30, 50, 6, 2, TRUE), + PT(20, 29, 5, 1, FALSE), + PT(53, 1, 3, 2, TRUE), + PT(62, 59, 3, 3, FALSE), + PT(34, 30, 2, 3, FALSE), + PT(24, 34, 2, 1, FALSE), + PT(62, 41, 6, 1, TRUE), + PT(47, 20, 3, 0, TRUE), + PT(59, 7, 2, 2, TRUE), + PT( 6, 61, 5, 0, TRUE), + PT(53, 55, 4, 1, TRUE), + PT(52, 29, 5, 2, TRUE), + PT(24, 18, 3, 1, TRUE), + PT(11, 19, 4, 2, FALSE), + PT(19, 56, 3, 2, FALSE), + PT(31, 11, 3, 1, TRUE), + PT(19, 33, 3, 2, FALSE), + PT( 6, 57, 6, 1, FALSE), + PT(55, 61, 4, 3, FALSE), + PT(41, 38, 2, 2, TRUE), + PT(60, 51, 4, 3, TRUE), + PT( 0, 1, 5, 3, FALSE), + PT(21, 24, 6, 0, TRUE), + PT(13, 44, 2, 1, TRUE), + PT(39, 59, 4, 0, FALSE), + PT(45, 1, 4, 3, FALSE), + PT(35, 21, 6, 0, FALSE), + PT(36, 0, 2, 3, TRUE), + PT(55, 63, 6, 1, TRUE), + PT(37, 36, 6, 0, TRUE), + PT( 6, 59, 6, 3, TRUE), + PT( 3, 24, 3, 1, FALSE), + PT(44, 52, 2, 2, FALSE), + PT(29, 54, 3, 0, FALSE), + PT(58, 4, 4, 1, TRUE), + PT(18, 38, 2, 2, TRUE), + PT(43, 25, 3, 1, FALSE), + PT(41, 44, 6, 3, FALSE), + PT( 1, 25, 3, 2, TRUE), + PT(47, 6, 5, 1, TRUE), + PT(12, 18, 4, 3, FALSE), + PT(54, 50, 3, 2, TRUE), + PT(13, 18, 5, 0, FALSE), + PT( 3, 40, 2, 1, TRUE), + PT(41, 6, 2, 3, TRUE), + PT( 3, 56, 4, 0, TRUE), + PT(48, 44, 2, 0, FALSE), + PT(34, 0, 5, 0, FALSE), + PT(36, 59, 3, 2, FALSE), + PT(32, 62, 2, 1, TRUE), + PT( 2, 12, 3, 0, TRUE), + PT(41, 44, 3, 1, FALSE), + PT(57, 48, 4, 1, FALSE), + PT(42, 31, 4, 1, FALSE), + PT(20, 52, 5, 2, FALSE), + PT(20, 37, 3, 1, TRUE), + PT( 6, 59, 2, 2, TRUE), + PT( 6, 28, 2, 1, TRUE), + PT(21, 3, 3, 0, FALSE), + PT(30, 42, 3, 1, TRUE), + PT(23, 37, 5, 3, TRUE), + PT(28, 41, 5, 3, FALSE), + PT( 2, 50, 3, 3, FALSE), + PT(29, 40, 6, 2, TRUE), + PT(54, 3, 6, 2, FALSE), + PT(22, 61, 5, 1, FALSE), + PT(18, 13, 2, 1, TRUE), + PT(29, 45, 4, 0, TRUE), + PT(50, 23, 5, 3, FALSE), + PT(26, 21, 4, 3, FALSE), + PT(34, 47, 2, 2, TRUE), + PT(60, 14, 4, 0, FALSE), + PT(47, 39, 2, 1, TRUE), + PT( 4, 9, 6, 1, FALSE), + PT(30, 1, 6, 2, FALSE), + PT( 6, 22, 3, 3, FALSE), + PT(46, 27, 3, 2, FALSE), + PT(40, 19, 5, 1, FALSE), + PT(48, 52, 2, 1, FALSE), + PT(18, 50, 3, 0, FALSE), + PT(29, 29, 6, 2, TRUE), + PT( 7, 28, 2, 3, FALSE), + PT(45, 61, 6, 2, TRUE), + PT(28, 27, 4, 2, FALSE), + PT(33, 45, 3, 3, FALSE), + PT(16, 9, 2, 2, FALSE), + PT(61, 17, 2, 1, FALSE), + PT(37, 2, 4, 3, FALSE), + PT(35, 2, 3, 0, TRUE), + PT(25, 5, 2, 2, FALSE), + PT(11, 33, 3, 1, FALSE), + PT( 9, 2, 5, 2, FALSE), + PT(24, 40, 5, 2, TRUE), + PT(30, 16, 2, 1, FALSE), + PT(46, 24, 5, 3, FALSE), + PT(31, 2, 5, 2, FALSE), + PT(20, 23, 4, 2, FALSE), + PT(57, 8, 6, 1, FALSE), + PT(22, 20, 4, 1, FALSE), + PT(22, 40, 4, 0, TRUE), + PT(17, 16, 5, 2, FALSE), + PT(35, 54, 5, 1, TRUE), + PT(57, 33, 4, 3, FALSE), + PT(14, 6, 5, 2, TRUE), + PT(60, 62, 4, 3, FALSE), + PT(42, 27, 3, 3, TRUE), + PT( 0, 60, 6, 1, TRUE), + PT(53, 63, 2, 2, FALSE), + PT( 0, 11, 2, 0, FALSE), + PT(52, 60, 2, 3, TRUE), + PT(45, 7, 3, 3, TRUE), + PT(36, 57, 4, 3, TRUE), + PT(22, 0, 3, 2, TRUE), + PT(51, 43, 3, 3, FALSE), + PT(15, 8, 6, 0, TRUE), + PT(58, 9, 2, 1, TRUE), + PT(12, 33, 3, 2, FALSE), + PT(42, 23, 6, 2, FALSE), + PT(41, 39, 2, 0, FALSE), + PT(55, 27, 3, 0, FALSE), + PT(21, 8, 5, 3, TRUE), + PT(31, 22, 2, 1, FALSE), + PT(31, 40, 6, 2, FALSE), + PT(28, 32, 4, 1, FALSE), + PT(18, 1, 2, 1, FALSE), + PT(33, 49, 2, 0, FALSE), + PT(34, 38, 3, 3, FALSE), + PT( 1, 61, 2, 0, TRUE), + PT(30, 39, 4, 2, TRUE), + PT(61, 48, 4, 2, FALSE), + PT(29, 17, 4, 1, FALSE), + PT(54, 48, 2, 3, FALSE), + PT(31, 62, 5, 1, FALSE), + PT(60, 39, 3, 1, TRUE), + PT(31, 41, 2, 0, FALSE), + PT(30, 5, 5, 1, FALSE), + PT(10, 16, 2, 2, FALSE), + PT(31, 0, 5, 3, FALSE), + PT(11, 59, 3, 0, FALSE), + PT(10, 57, 6, 0, FALSE), + PT(55, 11, 3, 3, TRUE), + PT(29, 10, 5, 0, TRUE), + PT(62, 28, 6, 1, TRUE), + PT(19, 46, 5, 0, FALSE), + PT(39, 27, 3, 3, FALSE), + PT(29, 2, 3, 2, FALSE), + PT( 1, 37, 2, 2, FALSE), + PT(58, 16, 3, 2, FALSE), + PT(18, 5, 5, 1, FALSE), + PT(48, 32, 4, 3, FALSE), + PT(47, 46, 5, 3, FALSE), + PT( 3, 7, 4, 2, FALSE), + PT(54, 4, 5, 1, TRUE), + PT(17, 37, 5, 2, TRUE), + PT(40, 14, 5, 3, FALSE), + PT(15, 29, 2, 2, TRUE), + PT(28, 40, 6, 0, FALSE), + PT(31, 35, 4, 3, FALSE), + PT(54, 18, 6, 3, TRUE), + PT(58, 49, 2, 0, FALSE), + PT(44, 44, 5, 3, TRUE), + PT(26, 13, 2, 2, TRUE), + PT(63, 60, 6, 1, FALSE), + PT(53, 28, 2, 3, FALSE), + PT(51, 22, 5, 0, FALSE), + PT(29, 63, 4, 0, TRUE), + PT(44, 62, 5, 1, TRUE), + PT(36, 35, 5, 3, TRUE), + PT(50, 21, 5, 1, FALSE), + PT(27, 16, 6, 2, TRUE), + PT(24, 55, 2, 0, FALSE), + PT(59, 30, 2, 0, TRUE), + PT(43, 22, 4, 2, FALSE), + PT(29, 22, 4, 3, FALSE), + PT(60, 45, 2, 0, TRUE), + PT(21, 40, 5, 0, FALSE), + PT(39, 39, 4, 3, TRUE), + PT(59, 58, 2, 3, FALSE), + PT(26, 12, 3, 1, FALSE), + PT(21, 8, 4, 2, TRUE), + PT(11, 16, 4, 1, FALSE), + PT(26, 62, 2, 3, TRUE), + PT(40, 31, 3, 3, FALSE), + PT( 1, 30, 3, 3, FALSE), + PT(28, 47, 2, 0, FALSE), + PT(37, 11, 6, 2, FALSE), + PT(62, 12, 3, 1, FALSE), + PT(27, 16, 5, 1, FALSE), + PT(15, 20, 2, 3, TRUE), + PT(15, 63, 2, 3, TRUE), + PT( 3, 21, 3, 3, TRUE), + PT( 2, 54, 2, 3, TRUE), + PT(21, 29, 3, 0, FALSE), + PT( 8, 54, 2, 0, FALSE), + PT(20, 13, 5, 1, TRUE), + PT(10, 5, 3, 2, TRUE), + PT(38, 18, 3, 3, FALSE), + PT(62, 24, 3, 0, TRUE), + PT(54, 24, 6, 3, TRUE), + PT(23, 57, 5, 3, FALSE), + PT(13, 4, 3, 0, TRUE), + PT(22, 34, 2, 2, TRUE), + PT(62, 38, 3, 3, TRUE), + PT( 0, 6, 2, 3, TRUE), + PT(51, 34, 3, 2, TRUE), + PT(43, 57, 5, 1, TRUE), + PT(62, 49, 3, 2, FALSE), + PT(34, 63, 2, 1, TRUE), + PT(48, 28, 6, 0, TRUE), + PT( 7, 43, 2, 2, FALSE), + PT(50, 53, 3, 3, FALSE), + PT( 2, 7, 4, 0, FALSE), + PT(15, 59, 2, 0, TRUE), + PT(32, 7, 2, 1, FALSE), + PT(42, 48, 3, 2, TRUE), + PT(40, 56, 6, 3, FALSE), + PT(32, 1, 2, 3, TRUE), + PT(21, 32, 4, 0, TRUE), + PT(58, 27, 3, 3, FALSE), + PT(56, 18, 4, 2, FALSE), + PT( 3, 62, 3, 3, TRUE), + PT(41, 29, 2, 1, TRUE), + PT(32, 39, 3, 0, TRUE), + PT(18, 37, 4, 0, FALSE), + PT(50, 51, 5, 1, TRUE), + PT(63, 5, 6, 0, TRUE), + PT(53, 60, 5, 2, TRUE), + PT(45, 2, 5, 3, FALSE), + PT(16, 42, 2, 3, FALSE), + PT(23, 8, 6, 0, TRUE), + PT(23, 46, 5, 1, TRUE), + PT(48, 30, 2, 2, TRUE), + PT(49, 21, 4, 3, FALSE), + PT( 8, 16, 6, 1, TRUE), + PT(21, 1, 4, 3, TRUE), + PT(18, 7, 5, 3, TRUE), + PT(41, 39, 6, 2, FALSE), + PT(63, 8, 6, 0, TRUE), + PT(28, 32, 3, 1, FALSE), + PT(51, 12, 2, 1, TRUE), + PT(24, 49, 4, 2, FALSE), + PT(55, 45, 5, 3, FALSE), + PT(33, 24, 4, 2, FALSE), + PT(58, 39, 6, 0, TRUE), + PT(53, 62, 6, 0, FALSE), + PT(58, 20, 6, 1, TRUE), + PT(15, 26, 5, 2, TRUE), + PT(48, 46, 2, 0, TRUE), + PT(26, 49, 3, 2, TRUE), + PT(23, 60, 3, 0, FALSE), + PT(51, 49, 4, 1, TRUE), + PT(29, 57, 5, 2, TRUE), + PT(16, 29, 5, 3, TRUE), + PT(36, 21, 3, 2, FALSE), + PT(37, 1, 5, 1, TRUE), + PT(34, 22, 5, 3, FALSE), + PT(27, 37, 6, 2, TRUE), + PT(55, 16, 4, 3, FALSE), + PT(57, 1, 6, 3, FALSE), + PT(23, 43, 2, 2, FALSE), + PT( 9, 22, 2, 3, TRUE), + PT(32, 40, 4, 1, TRUE), + PT(38, 58, 4, 3, FALSE), + PT(39, 42, 4, 2, FALSE), + PT(54, 2, 5, 2, FALSE), + PT(41, 48, 6, 2, TRUE), + PT(54, 1, 3, 3, TRUE), + PT(40, 59, 3, 2, TRUE), + PT(35, 30, 5, 2, TRUE), + PT(17, 30, 5, 2, FALSE), + PT(47, 50, 3, 0, TRUE), + PT(63, 38, 6, 0, TRUE), + PT(56, 30, 2, 3, TRUE), + PT( 5, 24, 5, 3, FALSE), + PT( 0, 46, 2, 1, FALSE), + PT(52, 63, 6, 2, FALSE), + PT(22, 16, 5, 0, TRUE), + PT(32, 61, 6, 3, FALSE), + PT(47, 22, 4, 2, TRUE), + PT(18, 23, 2, 0, FALSE), + PT(33, 55, 6, 2, TRUE), + PT(37, 55, 5, 2, TRUE), + PT( 1, 8, 4, 3, TRUE), + PT( 3, 31, 5, 0, TRUE), + PT(13, 42, 2, 3, FALSE), + PT(58, 63, 6, 1, TRUE), + PT(43, 25, 3, 2, TRUE), + PT(42, 31, 5, 0, TRUE), + PT(40, 44, 2, 0, FALSE), + PT(40, 48, 2, 0, FALSE), + PT(57, 20, 3, 1, TRUE), + PT( 0, 24, 4, 0, TRUE), + PT(40, 12, 6, 3, TRUE), + PT(17, 16, 2, 0, TRUE), + PT(60, 51, 6, 1, FALSE), + PT(51, 54, 3, 1, FALSE), + PT(54, 0, 3, 2, FALSE), + PT(49, 27, 3, 2, TRUE), + PT(56, 29, 2, 0, FALSE), + PT(60, 57, 4, 3, TRUE), + PT(58, 63, 2, 2, FALSE), + PT(25, 18, 2, 2, FALSE), + PT(13, 31, 3, 0, FALSE), + PT( 0, 37, 3, 0, FALSE), + PT(40, 28, 6, 1, FALSE), + PT(39, 3, 3, 1, FALSE), + PT(38, 45, 5, 1, FALSE), + PT(41, 40, 4, 3, TRUE), + PT(10, 42, 3, 0, FALSE), + PT(10, 26, 6, 0, FALSE), + PT(32, 26, 5, 3, FALSE), + PT( 6, 11, 3, 2, TRUE), + PT(15, 12, 3, 2, FALSE), + PT(53, 40, 3, 2, FALSE), + PT(61, 22, 4, 1, TRUE), + PT(33, 28, 6, 0, TRUE), + PT(20, 28, 5, 3, FALSE), + PT(34, 50, 6, 2, TRUE), + PT( 9, 41, 6, 0, FALSE), + PT(32, 26, 2, 0, FALSE), + PT(49, 63, 5, 2, FALSE), + PT(10, 61, 6, 3, TRUE), + PT(11, 46, 5, 2, TRUE), + PT(31, 34, 6, 0, TRUE), + PT( 6, 7, 5, 0, TRUE), + PT(34, 23, 5, 2, TRUE), + PT(48, 17, 3, 0, FALSE), + PT(12, 25, 2, 2, TRUE), + PT( 7, 10, 6, 2, FALSE), + PT(24, 41, 4, 3, TRUE), + PT(51, 12, 6, 0, FALSE), + PT( 3, 26, 6, 3, TRUE), + PT( 6, 1, 5, 2, TRUE), + PT(15, 59, 5, 1, TRUE), + PT(17, 31, 6, 3, TRUE), + PT(43, 33, 6, 3, FALSE), + PT(63, 35, 2, 3, TRUE), + PT(23, 7, 5, 1, TRUE), + PT(43, 14, 6, 0, FALSE), + PT(17, 57, 3, 2, TRUE), + PT(41, 3, 6, 1, TRUE), + PT(48, 3, 5, 3, TRUE), + PT(60, 32, 4, 3, FALSE), + PT( 3, 34, 2, 2, FALSE), + PT(58, 40, 6, 2, TRUE), + PT( 1, 40, 5, 1, TRUE), + PT(62, 21, 3, 0, FALSE), + PT(48, 7, 2, 3, TRUE), + PT(59, 44, 6, 0, FALSE), + PT(21, 7, 5, 2, FALSE), + PT(23, 39, 3, 2, TRUE), + PT(63, 30, 6, 1, TRUE), + PT(13, 23, 2, 0, FALSE), + PT(21, 14, 6, 0, FALSE), + PT( 9, 5, 6, 0, FALSE), + PT(45, 32, 2, 2, TRUE), + PT(60, 61, 6, 0, FALSE), + PT(12, 23, 3, 2, FALSE), + PT(26, 13, 4, 2, TRUE), + PT(43, 43, 5, 1, FALSE), + PT( 2, 22, 5, 2, TRUE), + PT(23, 49, 2, 3, TRUE), + PT( 0, 8, 2, 1, TRUE), + PT(55, 53, 4, 0, TRUE), + PT(30, 28, 3, 3, TRUE), + PT(43, 50, 3, 2, FALSE), + PT(16, 42, 2, 3, FALSE), + PT(58, 51, 6, 0, TRUE), + PT(23, 43, 5, 1, FALSE), + PT(12, 61, 2, 0, TRUE), + PT(40, 10, 6, 0, FALSE), + PT(35, 10, 4, 3, FALSE), + PT(10, 20, 4, 2, FALSE), + PT(11, 15, 6, 0, FALSE), + PT(27, 30, 5, 0, TRUE), + PT( 2, 53, 5, 0, FALSE), + PT(59, 2, 2, 2, FALSE), + PT( 0, 15, 6, 2, TRUE), + PT(28, 60, 5, 3, FALSE), + PT(40, 56, 3, 0, TRUE), + PT(27, 17, 2, 1, FALSE), + PT( 9, 22, 2, 0, FALSE), + PT(46, 13, 4, 0, FALSE), + PT(61, 4, 6, 1, FALSE), + PT(22, 44, 4, 2, TRUE), + PT( 2, 61, 3, 0, FALSE), + PT(11, 19, 3, 2, FALSE), + PT(34, 42, 3, 2, FALSE), + PT(32, 39, 4, 1, FALSE), + PT( 5, 38, 4, 1, FALSE), + PT(18, 29, 5, 2, FALSE), + PT( 8, 5, 5, 3, FALSE), + PT(63, 28, 2, 3, TRUE), + PT(36, 13, 6, 1, TRUE), + PT(54, 8, 4, 2, FALSE), + PT(16, 34, 5, 0, TRUE), + PT(28, 10, 2, 0, TRUE), + PT(37, 15, 2, 0, FALSE), + PT(36, 56, 5, 3, TRUE), + PT(37, 50, 3, 3, FALSE), + PT( 6, 42, 5, 0, TRUE), + PT(62, 58, 5, 0, FALSE), + PT(52, 23, 6, 1, TRUE), + PT(24, 51, 2, 3, TRUE), + PT( 7, 20, 3, 3, TRUE), + PT(17, 23, 4, 0, FALSE), + PT(19, 14, 2, 2, FALSE), + PT(59, 28, 2, 1, FALSE), + PT(42, 19, 6, 3, TRUE), + PT(42, 53, 6, 1, FALSE), + PT(48, 2, 4, 2, TRUE), + PT( 0, 7, 3, 3, TRUE), + PT(12, 4, 5, 2, FALSE), + PT(55, 55, 6, 0, FALSE), + PT(37, 18, 4, 2, TRUE), + PT(18, 34, 4, 0, TRUE), + PT(34, 53, 6, 1, TRUE), + PT( 7, 32, 5, 2, TRUE), + PT(39, 14, 6, 0, FALSE), + PT(52, 25, 3, 1, FALSE), + PT(10, 60, 4, 2, TRUE), + PT( 7, 29, 5, 1, TRUE), + PT(49, 58, 2, 1, FALSE), + PT(26, 61, 6, 3, TRUE), + PT(22, 21, 2, 3, FALSE), + PT(57, 19, 2, 2, TRUE), + PT(45, 3, 5, 3, FALSE), + PT( 6, 57, 5, 2, FALSE), + PT(22, 0, 2, 1, TRUE), + PT(53, 42, 6, 2, TRUE), + PT(36, 1, 3, 0, FALSE), + PT(36, 55, 5, 0, FALSE), + PT(37, 27, 6, 2, FALSE), + PT(37, 25, 2, 3, TRUE), + PT(39, 47, 3, 1, TRUE), + PT(39, 13, 2, 0, FALSE), + PT(54, 60, 6, 0, FALSE), + PT(60, 51, 4, 1, TRUE), + PT(62, 39, 3, 3, FALSE), + PT(37, 45, 5, 0, TRUE), + PT(31, 18, 4, 0, TRUE), + PT(55, 50, 3, 3, TRUE), + PT(17, 33, 6, 2, TRUE), + PT(48, 12, 3, 0, TRUE), + PT(37, 61, 4, 3, FALSE), + PT(23, 2, 3, 2, TRUE), + PT(20, 46, 2, 0, TRUE), + PT(56, 19, 6, 0, FALSE), + PT(10, 43, 4, 0, FALSE), + PT(30, 16, 2, 2, TRUE), + PT(55, 48, 5, 3, FALSE), + PT(30, 4, 5, 2, FALSE), + PT(20, 52, 3, 0, TRUE), + PT( 8, 20, 3, 0, FALSE), + PT(14, 28, 6, 0, FALSE), + PT(26, 46, 3, 1, TRUE), + PT(31, 57, 6, 0, TRUE), + PT(12, 28, 5, 0, FALSE), + PT(62, 51, 4, 1, TRUE), + PT(15, 19, 2, 3, FALSE), + PT(37, 57, 5, 3, TRUE), + PT(20, 27, 3, 1, FALSE), + PT(40, 62, 4, 0, TRUE), + PT(45, 25, 2, 0, TRUE), + PT(12, 52, 6, 1, FALSE), + PT(57, 49, 3, 0, TRUE), + PT(26, 8, 6, 2, FALSE), + PT( 9, 47, 2, 0, TRUE), + PT(48, 4, 3, 2, FALSE), + PT( 2, 59, 3, 1, TRUE), + PT(51, 33, 6, 1, TRUE), + PT(56, 2, 3, 1, FALSE), + PT(49, 56, 6, 1, FALSE), + PT(31, 29, 2, 3, FALSE), + PT(23, 16, 3, 1, TRUE), + PT(50, 32, 2, 3, TRUE), + PT( 0, 51, 2, 1, FALSE), + PT(33, 15, 4, 3, TRUE), + PT(20, 25, 4, 3, TRUE), + PT(36, 44, 6, 3, TRUE), + PT(37, 5, 5, 3, TRUE), + PT(61, 37, 2, 0, TRUE), + PT(18, 48, 3, 1, FALSE), + PT(22, 3, 3, 1, FALSE), + PT(20, 9, 2, 1, TRUE), + PT( 2, 35, 4, 1, FALSE), + PT( 1, 60, 2, 0, FALSE), + PT(63, 45, 4, 1, TRUE), + PT(49, 63, 4, 1, TRUE), + PT(23, 0, 6, 1, TRUE), + PT(63, 15, 5, 3, TRUE), + PT(38, 7, 2, 2, TRUE), + PT(33, 43, 5, 1, FALSE), + PT(56, 57, 3, 3, FALSE), + PT( 9, 37, 5, 1, TRUE), + PT(59, 48, 4, 2, TRUE), + PT(18, 45, 2, 1, TRUE), + PT(50, 25, 5, 0, FALSE), + PT(36, 28, 5, 2, TRUE), + PT(53, 50, 4, 3, FALSE), + PT(13, 35, 3, 3, FALSE), + PT(29, 7, 4, 0, TRUE), + PT(11, 52, 2, 3, TRUE), + PT(45, 50, 6, 1, FALSE), + PT(58, 60, 6, 2, TRUE), + PT(26, 16, 6, 1, TRUE), + PT(26, 7, 4, 1, FALSE), + PT(59, 27, 5, 1, FALSE), + PT(51, 31, 4, 3, FALSE), + PT(14, 53, 3, 1, FALSE), + PT(59, 10, 3, 2, FALSE), + PT(17, 7, 2, 0, TRUE), + PT(13, 60, 5, 2, TRUE), + PT(30, 55, 5, 0, TRUE), + PT(17, 5, 2, 1, FALSE), + PT(21, 47, 3, 2, FALSE), + PT(36, 49, 2, 3, FALSE), + PT(43, 33, 3, 1, TRUE), + PT(35, 16, 6, 0, TRUE), + PT( 2, 20, 5, 0, TRUE), + PT(38, 32, 2, 3, FALSE), + PT(16, 23, 2, 0, FALSE), + PT(11, 15, 6, 1, TRUE), + PT( 1, 46, 2, 2, FALSE), + PT(33, 14, 6, 3, TRUE), + PT(26, 29, 5, 3, TRUE), + PT(30, 48, 4, 2, FALSE), + PT( 4, 20, 5, 2, TRUE), + PT(17, 0, 6, 0, FALSE), + PT( 8, 42, 3, 2, TRUE), + PT(29, 34, 4, 0, TRUE), + PT(36, 44, 6, 3, TRUE), + PT(36, 17, 2, 1, FALSE), + PT( 4, 46, 5, 0, FALSE), + PT(29, 24, 4, 1, TRUE), + PT(60, 22, 2, 3, FALSE), + PT(16, 23, 6, 0, TRUE), + PT(32, 33, 2, 1, FALSE), + PT(51, 62, 6, 2, FALSE), + PT( 6, 19, 2, 1, TRUE), + PT(23, 56, 5, 1, TRUE), + PT(20, 13, 2, 2, TRUE), + PT(36, 59, 5, 1, TRUE), + PT(52, 59, 3, 3, FALSE), + PT(24, 7, 6, 2, FALSE), + PT(55, 29, 3, 3, TRUE), + PT(11, 41, 4, 0, FALSE), + PT(18, 30, 3, 2, TRUE), + PT(26, 36, 4, 2, FALSE), + PT(61, 40, 4, 2, FALSE), + PT(11, 18, 6, 1, TRUE), + PT(27, 58, 4, 1, FALSE), + PT(20, 19, 5, 1, FALSE), + PT(49, 56, 2, 2, TRUE), + PT(55, 43, 5, 3, FALSE), + PT(25, 30, 5, 2, FALSE), + PT(63, 27, 5, 1, FALSE), + PT(51, 31, 6, 1, TRUE), + PT(63, 21, 5, 0, TRUE), + PT( 1, 30, 3, 0, FALSE), + PT(31, 34, 3, 0, TRUE), + PT(51, 60, 6, 2, FALSE), + PT(30, 18, 4, 1, FALSE), + PT(13, 55, 5, 2, FALSE), + PT(15, 8, 6, 0, TRUE), + PT(46, 9, 6, 3, FALSE), + PT( 1, 5, 3, 3, FALSE), + PT(28, 4, 3, 3, FALSE), + PT(12, 1, 3, 2, FALSE), + PT(41, 40, 5, 3, TRUE), + PT(57, 45, 2, 2, FALSE), + PT( 9, 34, 6, 3, FALSE), + PT( 4, 55, 6, 3, TRUE), + PT(45, 47, 6, 2, TRUE), + PT(36, 35, 3, 1, TRUE), + PT( 8, 32, 6, 1, FALSE), + PT(32, 31, 6, 2, FALSE), + PT( 2, 49, 3, 0, TRUE), + PT(24, 19, 6, 3, FALSE), + PT( 6, 43, 3, 3, FALSE), + PT(14, 27, 2, 0, FALSE), + PT(47, 14, 3, 2, FALSE), + PT(17, 56, 2, 1, TRUE), + PT( 1, 55, 3, 0, TRUE), + PT(20, 17, 4, 3, FALSE), + PT(49, 61, 6, 1, TRUE), + PT(29, 27, 6, 2, FALSE), + PT(37, 49, 5, 3, TRUE), + PT(17, 10, 5, 3, TRUE), + PT(57, 23, 3, 1, TRUE), + PT( 5, 14, 2, 1, TRUE), + PT(41, 37, 4, 1, FALSE), + PT(21, 13, 4, 0, FALSE), + PT(43, 39, 4, 0, TRUE), + PT(62, 36, 4, 3, TRUE), + PT(42, 43, 2, 3, FALSE), + PT(36, 61, 2, 2, TRUE), + PT(21, 48, 6, 0, TRUE), + PT(15, 51, 4, 2, FALSE), + PT( 6, 22, 2, 1, TRUE), + PT( 6, 49, 2, 0, FALSE), + PT(46, 63, 2, 0, FALSE), + PT( 5, 13, 5, 3, TRUE), + PT(60, 31, 3, 0, TRUE), + PT(18, 19, 4, 2, FALSE), + PT(15, 51, 6, 3, FALSE), + PT(21, 59, 6, 1, TRUE), + PT( 3, 15, 5, 1, FALSE), + PT(59, 60, 5, 2, FALSE), + PT(54, 9, 5, 0, TRUE), + PT(17, 59, 4, 3, TRUE), + PT(40, 43, 6, 0, TRUE), + PT(26, 14, 5, 3, TRUE), + PT(57, 44, 6, 0, TRUE), + PT(14, 60, 6, 2, TRUE), + PT(44, 36, 6, 1, TRUE), + PT(61, 17, 5, 1, TRUE), + PT( 7, 60, 6, 3, TRUE), + PT(20, 24, 2, 1, TRUE), + PT(29, 63, 5, 3, FALSE), + PT(48, 18, 4, 2, TRUE), + PT(38, 29, 2, 0, TRUE), + PT( 7, 17, 3, 3, FALSE), + PT(52, 1, 2, 0, TRUE), + PT(11, 57, 4, 0, TRUE), + PT(41, 2, 5, 0, TRUE), + PT(21, 16, 3, 1, FALSE), + PT(48, 31, 6, 2, TRUE), + PT(60, 43, 5, 1, FALSE), + PT(48, 59, 6, 3, FALSE), + PT(32, 26, 4, 1, TRUE), + PT(50, 36, 5, 1, TRUE), + PT(21, 32, 3, 2, FALSE), + PT(37, 61, 6, 3, FALSE), + PT(45, 20, 6, 0, TRUE), + PT(24, 35, 2, 3, TRUE), + PT(24, 5, 2, 1, TRUE), + PT(52, 48, 6, 3, TRUE), + PT(14, 57, 4, 1, TRUE), + PT(29, 31, 2, 3, TRUE), + PT( 1, 21, 5, 3, TRUE), + PT(11, 62, 3, 1, TRUE), + PT(13, 25, 5, 3, FALSE), + PT(49, 56, 3, 2, FALSE), + PT(21, 52, 2, 2, TRUE), + PT(19, 25, 5, 0, TRUE), + PT(25, 20, 4, 3, TRUE), + PT(21, 24, 4, 1, TRUE), + PT(41, 12, 4, 3, TRUE), + PT(45, 14, 2, 3, TRUE), + PT(52, 24, 2, 0, FALSE), + PT(59, 30, 5, 0, TRUE), + PT(52, 44, 4, 1, FALSE), + PT(49, 8, 2, 1, TRUE), + PT(29, 24, 3, 1, FALSE), + PT(28, 11, 5, 1, FALSE), + PT(25, 30, 3, 1, FALSE), + PT(35, 39, 2, 3, TRUE), + PT(59, 14, 6, 3, TRUE), + PT(25, 43, 2, 3, FALSE), + PT(47, 8, 4, 0, TRUE), + PT(55, 2, 4, 0, FALSE), + PT(11, 50, 6, 0, FALSE), + PT(22, 5, 6, 0, FALSE), + PT(19, 5, 3, 1, FALSE), + PT( 7, 57, 3, 0, TRUE), + PT(12, 59, 5, 1, FALSE), + PT(21, 5, 6, 0, FALSE), + PT(48, 5, 3, 0, TRUE), + PT(19, 0, 2, 1, FALSE), + PT(39, 22, 5, 1, FALSE), + PT(15, 40, 4, 3, TRUE), + PT(12, 35, 5, 3, TRUE), + PT(57, 40, 5, 1, FALSE), + PT(36, 37, 3, 3, TRUE), + PT(24, 41, 2, 2, FALSE), + PT(22, 5, 3, 1, FALSE), + PT(53, 47, 4, 3, FALSE), + PT(10, 58, 5, 0, TRUE), + PT(52, 44, 6, 3, FALSE), + PT(46, 58, 2, 2, TRUE), + PT(26, 10, 5, 2, TRUE), + PT(22, 20, 5, 3, FALSE), + PT(53, 40, 5, 1, FALSE), + PT(53, 15, 2, 0, TRUE), + PT(17, 50, 3, 0, TRUE), + PT(32, 26, 5, 0, FALSE), + PT(23, 26, 5, 0, FALSE), + PT(22, 51, 4, 2, TRUE), + PT(19, 44, 5, 0, TRUE), + PT( 9, 22, 6, 1, TRUE), + PT(29, 39, 4, 3, FALSE), + PT(21, 12, 5, 3, TRUE), + PT(34, 28, 3, 0, TRUE), + PT(41, 51, 2, 0, FALSE), + PT(45, 17, 3, 1, TRUE), + PT(22, 25, 5, 3, FALSE), + PT(13, 12, 5, 0, FALSE), + PT(55, 58, 6, 2, FALSE), + PT(42, 29, 6, 3, TRUE), + PT(48, 10, 6, 3, FALSE), + PT(36, 57, 3, 1, TRUE), + PT(57, 10, 6, 1, FALSE), + PT(17, 3, 5, 2, TRUE), + PT(50, 29, 6, 0, FALSE), + PT(56, 30, 4, 3, TRUE), + PT(46, 23, 3, 0, FALSE), + PT(22, 23, 5, 1, FALSE), + PT(54, 59, 6, 0, TRUE), + PT(23, 4, 3, 0, TRUE), + PT(58, 37, 5, 2, TRUE), + PT( 0, 54, 4, 3, TRUE), + PT(37, 18, 6, 1, TRUE), + PT( 6, 10, 2, 2, FALSE), + PT(17, 5, 5, 3, TRUE), + PT( 3, 53, 5, 3, TRUE), + PT(11, 52, 5, 0, TRUE), + PT( 0, 49, 2, 1, TRUE), + PT(39, 15, 3, 2, FALSE), + PT(29, 6, 5, 2, TRUE), + PT(28, 48, 4, 3, TRUE), + PT(47, 42, 4, 3, TRUE), + PT(22, 32, 6, 0, TRUE), + PT(51, 43, 5, 1, TRUE), + PT( 5, 48, 6, 3, FALSE), + PT(41, 35, 6, 2, TRUE), + PT(16, 22, 5, 3, TRUE), + PT(45, 32, 5, 0, TRUE), + PT(55, 19, 4, 2, FALSE), + PT(45, 14, 4, 2, TRUE), + PT( 8, 10, 3, 0, FALSE), + PT(15, 3, 3, 1, TRUE), + PT(49, 12, 6, 3, TRUE), + PT(30, 52, 6, 0, TRUE), + PT(27, 14, 4, 2, TRUE), + PT(26, 7, 6, 2, FALSE), + PT(13, 60, 6, 1, TRUE), + PT( 0, 58, 6, 3, FALSE), + PT( 4, 39, 2, 1, FALSE), + PT(35, 24, 4, 2, FALSE), + PT(13, 11, 3, 0, FALSE), + PT(49, 50, 6, 3, TRUE), + PT( 0, 13, 4, 0, TRUE), + PT(50, 16, 2, 1, FALSE), + PT(38, 13, 3, 0, TRUE), + PT(41, 36, 5, 1, TRUE), + PT(61, 33, 3, 3, TRUE), + PT(30, 27, 5, 0, FALSE), + PT(13, 18, 5, 0, FALSE), + PT(53, 30, 4, 1, TRUE), + PT(10, 46, 4, 1, FALSE), + PT(39, 39, 6, 2, TRUE), + PT( 1, 14, 4, 0, FALSE), + PT(49, 57, 5, 0, TRUE), + PT(59, 36, 6, 3, FALSE), + PT(20, 16, 6, 1, TRUE), + PT(24, 44, 4, 3, FALSE), + PT( 4, 45, 2, 2, TRUE), + PT(26, 17, 6, 3, TRUE), + PT(15, 11, 2, 2, FALSE), + PT(14, 44, 5, 2, FALSE), + PT(33, 23, 5, 2, FALSE), + PT(22, 33, 6, 2, TRUE), + PT(62, 16, 2, 0, FALSE), + PT(10, 5, 3, 3, FALSE), + PT(59, 9, 2, 1, TRUE), + PT(38, 24, 3, 3, FALSE), + PT(35, 12, 3, 1, FALSE), + PT(51, 55, 3, 3, TRUE), + PT( 9, 18, 6, 2, TRUE), + PT(61, 13, 2, 2, TRUE), + PT(54, 6, 4, 2, FALSE), + PT(51, 48, 5, 0, TRUE), + PT(59, 15, 5, 0, FALSE), + PT(52, 42, 5, 2, FALSE), + PT( 2, 18, 6, 2, TRUE), + PT( 9, 34, 6, 0, TRUE), + PT(59, 49, 3, 2, FALSE), + PT(51, 34, 4, 3, TRUE), + PT(61, 52, 2, 2, TRUE), + PT(20, 34, 5, 0, FALSE), + PT(40, 16, 3, 3, FALSE), + PT(33, 49, 2, 0, FALSE), + PT(45, 22, 4, 0, TRUE), + PT(30, 5, 6, 1, TRUE), + PT(15, 48, 6, 0, TRUE), + PT(14, 26, 6, 2, TRUE), + PT(56, 46, 5, 0, FALSE), + PT(38, 55, 3, 3, FALSE), + PT(43, 19, 6, 1, TRUE), + PT(31, 30, 6, 3, TRUE), + PT(10, 40, 4, 2, FALSE), + PT(50, 28, 3, 1, FALSE), + PT(31, 63, 3, 0, TRUE), + PT(57, 57, 5, 0, TRUE), + PT(44, 27, 2, 2, FALSE), + PT(21, 42, 2, 3, TRUE), + PT(50, 15, 4, 0, TRUE), + PT(48, 33, 3, 0, FALSE), + PT(35, 42, 4, 3, TRUE), + PT(61, 7, 2, 0, FALSE), + PT(11, 63, 5, 3, TRUE), + PT(49, 2, 5, 3, FALSE), + PT( 8, 57, 5, 3, TRUE), + PT(63, 32, 3, 0, FALSE), + PT(45, 52, 2, 0, TRUE), + PT(46, 52, 2, 0, FALSE), + PT(38, 18, 4, 1, TRUE), + PT(37, 10, 6, 3, TRUE), + PT(52, 9, 4, 2, TRUE), + PT(10, 62, 2, 3, FALSE), + PT(26, 23, 2, 0, TRUE), + PT(56, 28, 4, 0, FALSE), + PT(17, 33, 4, 3, FALSE), + PT( 5, 15, 3, 0, FALSE), + PT(38, 43, 6, 1, FALSE), + PT(10, 12, 2, 3, FALSE), + PT( 3, 41, 3, 2, TRUE), + PT(41, 59, 4, 1, TRUE), + PT(22, 27, 5, 0, TRUE), + PT( 7, 9, 2, 3, TRUE), + PT(23, 44, 3, 2, FALSE), + PT(53, 51, 6, 0, FALSE), + PT(23, 18, 3, 3, FALSE), + PT(61, 26, 5, 1, TRUE), + PT(33, 29, 2, 0, FALSE), + PT(10, 8, 2, 3, TRUE), + PT(20, 60, 6, 3, FALSE), + PT(40, 54, 6, 3, FALSE), + PT(59, 32, 3, 1, TRUE), + PT(19, 34, 3, 2, TRUE), + PT(19, 58, 2, 2, TRUE), + PT( 2, 35, 5, 2, FALSE), + PT(62, 25, 2, 2, FALSE), + PT(57, 60, 3, 1, FALSE), + PT(16, 8, 3, 3, FALSE), + PT(10, 19, 5, 0, TRUE), + PT(63, 56, 5, 2, FALSE), + PT( 7, 35, 3, 3, TRUE), + PT(25, 42, 4, 2, FALSE), + PT(20, 60, 3, 3, TRUE), + PT(13, 4, 6, 3, TRUE), + PT(26, 47, 5, 0, FALSE), + PT(42, 29, 3, 3, FALSE), + PT(17, 55, 5, 0, TRUE), + PT(40, 39, 2, 1, FALSE), + PT(13, 0, 4, 3, FALSE), + PT(10, 60, 4, 3, FALSE), + PT(31, 28, 6, 1, TRUE), + PT( 4, 58, 5, 2, FALSE), + PT(36, 61, 5, 1, TRUE), + PT(38, 49, 5, 3, TRUE), + PT(19, 28, 4, 0, TRUE), + PT(62, 18, 4, 1, TRUE), + PT(54, 10, 3, 1, FALSE), + PT(45, 30, 3, 0, TRUE), + PT( 5, 31, 3, 1, TRUE), + PT(30, 10, 3, 3, TRUE), + PT(32, 8, 4, 2, FALSE), + PT(44, 12, 6, 1, TRUE), + PT(29, 31, 2, 0, TRUE), + PT(14, 18, 2, 0, FALSE), + PT(39, 18, 3, 0, TRUE), + PT(42, 19, 6, 0, TRUE), + PT(28, 4, 6, 0, FALSE), + PT(26, 56, 3, 3, TRUE), + PT(44, 53, 4, 2, TRUE), + PT( 7, 11, 6, 1, TRUE), + PT(45, 2, 3, 1, FALSE), + PT(42, 53, 6, 2, TRUE), + PT(22, 47, 2, 2, FALSE), + PT(17, 49, 6, 1, TRUE), + PT(44, 49, 3, 3, FALSE), + PT(60, 58, 4, 3, TRUE), + PT(60, 43, 2, 1, FALSE), + PT(39, 29, 2, 1, FALSE), + PT(54, 44, 5, 1, TRUE), + PT(37, 59, 6, 2, TRUE), + PT(18, 61, 4, 3, TRUE), + PT(19, 35, 3, 0, TRUE), + PT(51, 44, 4, 3, FALSE), + PT( 9, 60, 2, 1, FALSE), + PT(21, 26, 4, 1, TRUE), + PT(33, 7, 3, 1, FALSE), + PT(34, 37, 4, 0, FALSE), + PT(25, 27, 5, 2, FALSE), + PT(58, 25, 6, 2, TRUE), + PT( 5, 38, 3, 2, TRUE), + PT(35, 34, 4, 2, TRUE), + PT(14, 30, 2, 0, TRUE), + PT(19, 48, 2, 1, FALSE), + PT(44, 34, 4, 2, TRUE), + PT(10, 29, 3, 0, FALSE), + PT(35, 62, 3, 2, TRUE), + PT( 2, 40, 4, 2, TRUE), + PT(33, 14, 4, 0, FALSE), + PT(33, 34, 6, 3, TRUE), + PT(24, 51, 4, 3, TRUE), + PT(35, 35, 6, 0, TRUE), + PT(36, 26, 3, 1, FALSE), + PT(62, 37, 4, 2, FALSE), + PT(36, 1, 3, 0, FALSE), + PT(52, 16, 4, 1, FALSE), + PT( 7, 0, 6, 3, TRUE), + PT( 6, 32, 4, 0, FALSE), + PT(58, 2, 5, 1, TRUE), + PT( 7, 44, 5, 2, FALSE), + PT( 9, 47, 5, 1, FALSE), + PT( 1, 50, 5, 2, FALSE), + PT( 0, 53, 2, 1, TRUE), + PT(43, 60, 3, 3, TRUE), + PT(54, 55, 3, 3, FALSE), + PT(32, 53, 3, 2, TRUE), + PT(12, 7, 6, 1, TRUE), + PT(22, 8, 2, 1, FALSE), + PT(63, 54, 2, 0, TRUE), + PT(11, 31, 5, 2, TRUE), + PT(33, 32, 6, 1, TRUE), + PT(23, 26, 5, 3, FALSE), + PT(22, 1, 5, 3, TRUE), + PT(47, 28, 6, 2, FALSE), + PT(41, 49, 5, 3, FALSE), + PT(59, 56, 6, 0, TRUE), + PT(13, 22, 2, 1, FALSE), + PT( 7, 41, 4, 2, FALSE), + PT(51, 60, 6, 2, FALSE), + PT(62, 30, 3, 0, FALSE), + PT(48, 2, 6, 2, FALSE), + PT(42, 52, 3, 1, TRUE), + PT(46, 35, 3, 0, FALSE), + PT(52, 0, 3, 3, TRUE), + PT(32, 14, 5, 0, FALSE), + PT(21, 51, 6, 3, TRUE), + PT(39, 53, 4, 1, TRUE), + PT(55, 62, 2, 0, TRUE), + PT(50, 46, 6, 3, FALSE), + PT(58, 2, 5, 1, TRUE), + PT( 0, 54, 3, 2, TRUE), + PT(19, 41, 2, 3, FALSE), + PT( 8, 43, 6, 3, TRUE), + PT( 8, 2, 4, 3, TRUE), + PT(50, 45, 6, 2, FALSE), + PT(48, 54, 5, 0, TRUE), + PT(46, 16, 2, 1, FALSE), + PT(60, 46, 5, 1, FALSE), + PT( 4, 51, 6, 0, FALSE), + PT(63, 1, 4, 1, FALSE), + PT(55, 20, 3, 2, TRUE), + PT(39, 0, 5, 3, TRUE), + PT(12, 57, 4, 3, FALSE), + PT(39, 4, 4, 0, TRUE), + PT(25, 8, 3, 2, TRUE), + PT( 1, 4, 3, 3, FALSE), + PT(39, 27, 5, 1, TRUE), + PT(49, 23, 3, 3, TRUE), + PT( 7, 1, 5, 2, TRUE), + PT(46, 59, 3, 3, TRUE), + PT(52, 36, 6, 0, TRUE), + PT(50, 43, 4, 2, FALSE), + PT(14, 7, 3, 3, FALSE), + PT(15, 51, 2, 0, FALSE), + PT(22, 33, 6, 1, FALSE), + PT(57, 2, 3, 1, FALSE), + PT(51, 61, 4, 1, FALSE), + PT(12, 37, 3, 1, FALSE), + PT(41, 41, 5, 0, FALSE), + PT(58, 50, 4, 3, FALSE), + PT(11, 19, 4, 1, FALSE), + PT(31, 15, 3, 2, FALSE), + PT( 4, 44, 4, 0, FALSE), + PT(57, 26, 3, 1, TRUE), + PT(26, 42, 3, 3, TRUE), + PT(36, 19, 3, 1, FALSE), + PT(49, 59, 6, 1, TRUE), + PT(57, 35, 5, 0, FALSE), + PT(49, 7, 6, 0, TRUE), + PT(31, 16, 4, 0, FALSE), + PT(41, 23, 6, 1, FALSE), + PT(38, 59, 5, 2, TRUE), + PT( 2, 60, 3, 2, FALSE), + PT(14, 0, 4, 0, FALSE), + PT(20, 62, 6, 3, TRUE), + PT( 1, 15, 5, 2, TRUE), + PT( 6, 18, 4, 3, TRUE), + PT(48, 19, 3, 0, TRUE), + PT( 0, 51, 5, 1, FALSE), + PT(12, 7, 4, 3, TRUE), + PT(17, 58, 3, 2, FALSE), + PT(21, 10, 2, 1, TRUE), + PT(31, 13, 5, 1, FALSE), + PT(55, 7, 5, 1, FALSE), + PT(52, 53, 6, 2, FALSE), + PT(40, 22, 4, 3, TRUE), + PT( 6, 2, 6, 3, FALSE), + PT( 9, 35, 6, 0, FALSE), + PT(20, 2, 5, 0, FALSE), + PT(57, 50, 6, 2, FALSE), + PT(36, 53, 2, 1, FALSE), + PT(18, 34, 4, 3, FALSE), + PT( 9, 7, 6, 1, TRUE), + PT(15, 62, 3, 3, FALSE), + PT( 0, 60, 6, 1, TRUE), + PT(16, 55, 2, 2, FALSE), + PT(58, 3, 4, 2, TRUE), + PT(45, 30, 4, 2, FALSE), + PT(54, 54, 4, 3, FALSE), + PT(31, 60, 3, 1, FALSE), + PT(55, 51, 4, 2, TRUE), + PT(35, 19, 3, 3, TRUE), + PT(51, 13, 2, 1, TRUE), + PT(37, 48, 3, 3, FALSE), + PT(23, 3, 3, 0, FALSE), + PT(24, 24, 2, 2, FALSE), + PT(48, 7, 4, 1, FALSE), + PT(62, 51, 4, 0, TRUE), + PT(20, 55, 2, 3, FALSE), + PT(22, 0, 2, 1, FALSE), + PT(44, 18, 5, 3, TRUE), + PT(37, 63, 3, 3, FALSE), + PT(36, 25, 2, 3, FALSE), + PT(22, 15, 6, 2, TRUE), + PT(45, 16, 2, 0, TRUE), + PT(36, 42, 5, 0, FALSE), + PT(25, 37, 5, 3, FALSE), + PT(12, 22, 3, 3, TRUE), + PT(56, 33, 6, 3, FALSE), + PT(61, 26, 5, 3, TRUE), + PT(59, 50, 2, 1, FALSE), + PT(54, 19, 5, 0, TRUE), + PT(14, 48, 6, 0, TRUE), + PT(25, 7, 5, 3, TRUE), + PT(37, 35, 5, 0, FALSE), + PT(32, 8, 5, 0, TRUE), + PT(42, 0, 6, 0, FALSE), + PT(48, 56, 4, 1, TRUE), + PT(30, 15, 3, 3, TRUE), + PT(59, 27, 6, 0, FALSE), + PT(58, 55, 5, 3, TRUE), + PT(57, 55, 6, 2, TRUE), + PT(57, 45, 5, 3, TRUE), + PT(31, 46, 3, 3, FALSE), + PT(26, 43, 3, 3, FALSE), + PT(20, 23, 4, 0, FALSE), + PT(47, 3, 2, 0, TRUE), + PT(29, 0, 6, 0, FALSE), + PT(23, 43, 3, 2, TRUE), + PT(53, 40, 4, 2, TRUE), + PT(59, 15, 2, 0, TRUE), + PT( 9, 4, 5, 3, FALSE), + PT(35, 17, 3, 3, FALSE), + PT(19, 55, 3, 3, FALSE), + PT(55, 55, 3, 3, FALSE), + PT( 7, 1, 6, 1, FALSE), + PT(20, 6, 6, 1, FALSE), + PT(17, 12, 5, 3, FALSE), + PT(54, 46, 4, 2, FALSE), + PT(21, 42, 3, 2, FALSE), + PT(34, 21, 6, 2, FALSE), + PT(44, 30, 6, 2, TRUE), + PT(34, 39, 6, 1, TRUE), + PT(25, 63, 5, 2, TRUE), + PT(33, 51, 2, 2, TRUE), + PT(38, 26, 2, 0, TRUE), + PT(22, 62, 2, 1, FALSE), + PT(43, 36, 2, 2, TRUE), + PT(60, 15, 5, 2, TRUE), + PT(49, 21, 6, 3, FALSE), + PT(63, 36, 3, 2, TRUE), + PT(37, 1, 6, 3, TRUE), + PT(51, 22, 3, 1, FALSE), + PT(31, 14, 2, 0, FALSE), + PT(47, 11, 2, 1, FALSE), + PT(42, 26, 4, 2, TRUE), + PT(23, 10, 6, 2, TRUE), + PT( 9, 40, 6, 2, TRUE), + PT( 2, 19, 6, 3, FALSE), + PT(52, 47, 2, 3, TRUE), + PT( 3, 4, 6, 0, TRUE), + PT(62, 38, 2, 0, TRUE), + PT(53, 51, 6, 0, TRUE), + PT(34, 23, 4, 1, TRUE), + PT(29, 5, 5, 1, TRUE), + PT(46, 39, 4, 0, FALSE), + PT( 3, 43, 3, 2, TRUE), + PT( 1, 25, 3, 3, FALSE), + PT(14, 5, 3, 0, FALSE), + PT(22, 37, 2, 3, TRUE), + PT( 2, 40, 3, 0, FALSE), + PT(25, 11, 4, 2, FALSE), + PT(62, 53, 2, 3, FALSE), + PT(46, 41, 4, 2, TRUE), + PT(62, 56, 3, 3, FALSE), + PT(58, 47, 2, 1, FALSE), + PT(20, 23, 5, 2, TRUE), + PT(17, 18, 6, 0, FALSE), + PT(21, 49, 3, 0, FALSE), + PT( 8, 11, 5, 0, TRUE), + PT(45, 0, 6, 1, TRUE), + PT(44, 6, 3, 1, FALSE), + PT(20, 28, 5, 3, FALSE), + PT( 4, 8, 2, 1, FALSE), + PT(27, 43, 5, 2, TRUE), + PT(42, 55, 6, 1, TRUE), + PT(16, 39, 5, 2, FALSE), + PT(29, 14, 6, 2, FALSE), + PT(32, 2, 2, 1, FALSE), + PT(30, 26, 5, 3, FALSE), + PT( 7, 11, 2, 0, FALSE), + PT(54, 30, 6, 1, TRUE), + PT(43, 40, 3, 1, TRUE), + PT(49, 37, 3, 3, TRUE), + PT(56, 58, 5, 3, TRUE), + PT(57, 48, 5, 3, TRUE), + PT(18, 9, 2, 2, FALSE), + PT(14, 8, 3, 0, TRUE), + PT( 0, 13, 5, 2, FALSE), + PT(27, 14, 6, 2, FALSE), + PT(17, 37, 2, 2, TRUE), + PT(12, 45, 4, 3, FALSE), + PT(54, 44, 2, 3, FALSE), + PT(49, 49, 5, 2, FALSE), + PT( 3, 26, 2, 3, FALSE), + PT(28, 50, 2, 2, FALSE), + PT(10, 62, 6, 3, FALSE), + PT(51, 27, 4, 3, TRUE), + PT(31, 50, 3, 0, FALSE), + PT(51, 38, 6, 1, TRUE), + PT(26, 19, 3, 1, FALSE), + PT(15, 52, 3, 2, FALSE), + PT(53, 44, 5, 3, TRUE), + PT(56, 3, 3, 0, FALSE), + PT(21, 15, 4, 3, TRUE), + PT(49, 41, 4, 0, FALSE), + PT(40, 14, 5, 0, FALSE), + PT(49, 44, 5, 3, FALSE), + PT(21, 25, 3, 1, TRUE), + PT(16, 3, 5, 3, TRUE), + PT(46, 42, 6, 1, FALSE), + PT(42, 39, 3, 1, TRUE), + PT(54, 4, 3, 3, FALSE), + PT(59, 4, 4, 0, TRUE), + PT( 7, 47, 3, 0, TRUE), + PT(39, 29, 3, 2, TRUE), + PT(60, 61, 5, 3, FALSE), + PT(37, 8, 6, 1, FALSE), + PT(59, 52, 5, 1, FALSE), + PT(12, 16, 2, 1, TRUE), + PT(37, 53, 3, 1, FALSE), + PT(47, 25, 5, 0, FALSE), + PT(23, 0, 5, 1, TRUE), + PT(10, 28, 2, 3, TRUE), + PT(10, 17, 3, 1, TRUE), + PT(53, 19, 6, 3, TRUE), + PT(41, 28, 5, 0, FALSE), + PT(12, 49, 6, 2, TRUE), + PT(60, 16, 3, 1, FALSE), + PT(27, 58, 5, 2, TRUE), + PT(58, 28, 3, 0, FALSE), + PT(34, 16, 5, 2, TRUE), + PT(28, 60, 2, 1, FALSE), + PT(23, 24, 5, 1, FALSE), + PT(11, 43, 5, 3, TRUE), + PT(45, 4, 5, 3, FALSE), + PT(60, 19, 4, 1, TRUE), + PT( 1, 28, 5, 3, FALSE), + PT(20, 22, 4, 1, FALSE), + PT(12, 36, 2, 1, TRUE), + PT(53, 55, 6, 2, FALSE), + PT(27, 48, 3, 3, FALSE), + PT(58, 28, 4, 0, FALSE), + PT( 6, 6, 6, 3, FALSE), + PT( 9, 21, 3, 1, FALSE), + PT(27, 26, 4, 3, TRUE), + PT(15, 51, 6, 2, TRUE), + PT(55, 6, 4, 1, TRUE), + PT(58, 18, 3, 2, TRUE), + PT( 0, 22, 5, 0, TRUE), + PT(14, 29, 6, 2, TRUE), + PT(63, 56, 2, 3, FALSE), + PT(42, 60, 6, 2, FALSE), + PT(19, 50, 2, 0, FALSE), + PT(23, 44, 6, 3, TRUE), + PT(41, 42, 3, 3, FALSE), + PT(53, 47, 5, 2, TRUE), + PT(60, 42, 2, 0, TRUE), + PT(40, 19, 4, 0, TRUE), + PT(25, 30, 6, 2, FALSE), + PT(12, 6, 5, 2, TRUE), + PT( 9, 4, 3, 2, FALSE), + PT(29, 47, 4, 3, FALSE), + PT(57, 7, 2, 3, FALSE), + PT(20, 4, 5, 2, TRUE), + PT(58, 47, 5, 3, FALSE), + PT(41, 21, 6, 2, TRUE), + PT(36, 2, 6, 3, FALSE), + PT(63, 2, 3, 1, FALSE), + PT(15, 24, 4, 2, FALSE), + PT(22, 29, 3, 0, TRUE), + PT(20, 22, 2, 0, FALSE), + PT(41, 27, 2, 1, TRUE), + PT(21, 14, 3, 0, TRUE), + PT(58, 46, 5, 1, TRUE), + PT( 8, 48, 2, 2, TRUE), + PT(53, 22, 6, 0, FALSE), + PT(46, 24, 6, 2, TRUE), + PT(59, 11, 3, 2, FALSE), + PT(58, 24, 2, 1, TRUE), + PT(41, 19, 3, 3, FALSE), + PT(32, 19, 4, 3, TRUE), + PT( 4, 29, 6, 2, FALSE), + PT( 0, 56, 3, 0, TRUE), + PT( 8, 57, 6, 1, FALSE), + PT(32, 16, 4, 3, FALSE), + PT( 8, 2, 5, 0, FALSE), + PT(63, 15, 2, 3, FALSE), + PT(48, 31, 3, 0, TRUE), + PT(32, 45, 2, 0, FALSE), + PT(56, 23, 3, 2, FALSE), + PT(24, 49, 4, 3, TRUE), + PT(51, 56, 6, 0, FALSE), + PT(22, 51, 4, 1, TRUE), + PT( 0, 1, 6, 3, FALSE), + PT(13, 2, 4, 1, TRUE), + PT(57, 4, 3, 3, TRUE), + PT(14, 48, 4, 2, FALSE), + PT( 6, 1, 5, 2, FALSE), + PT(52, 51, 6, 2, TRUE), + PT(22, 52, 5, 3, FALSE), + PT(50, 22, 4, 2, FALSE), + PT(38, 57, 6, 2, FALSE), + PT(31, 60, 3, 2, TRUE), + PT(40, 29, 6, 3, TRUE), + PT(23, 21, 5, 1, TRUE), + PT(39, 57, 6, 0, FALSE), + PT(11, 27, 3, 0, FALSE), + PT(53, 32, 5, 2, TRUE), + PT(11, 53, 3, 2, FALSE), + PT( 3, 14, 4, 0, TRUE), + PT( 6, 12, 4, 0, FALSE), + PT( 2, 24, 6, 2, FALSE), + PT(30, 54, 5, 2, TRUE), + PT(22, 12, 3, 0, TRUE), + PT(37, 9, 5, 2, FALSE), + PT(55, 5, 5, 3, FALSE), + PT(46, 43, 5, 2, FALSE), + PT(36, 26, 2, 2, FALSE), + PT(39, 4, 2, 0, FALSE), + PT(50, 56, 6, 1, TRUE), + PT(55, 21, 6, 2, TRUE), + PT(17, 63, 3, 2, TRUE), + PT(35, 35, 3, 3, TRUE), + PT(41, 63, 3, 2, TRUE), + PT(26, 60, 5, 1, TRUE), + PT(27, 44, 5, 2, FALSE), + PT(56, 59, 6, 3, FALSE), + PT( 4, 19, 6, 1, TRUE), + PT(44, 20, 2, 1, FALSE), + PT(26, 9, 3, 1, TRUE), + PT(54, 17, 4, 2, FALSE), + PT(58, 63, 2, 0, TRUE), + PT( 1, 14, 5, 1, TRUE), + PT(59, 3, 5, 1, FALSE), + PT( 8, 13, 5, 1, TRUE), + PT(43, 19, 4, 3, TRUE), + PT(58, 60, 3, 2, FALSE), + PT(58, 21, 5, 1, FALSE), + PT(36, 0, 2, 3, TRUE), + PT(62, 10, 2, 2, TRUE), + PT(12, 41, 5, 2, TRUE), + PT(31, 21, 6, 0, FALSE), + PT(53, 24, 3, 0, TRUE), + PT(61, 55, 6, 3, TRUE), + PT(18, 56, 3, 1, TRUE), + PT(59, 2, 4, 0, FALSE), + PT( 8, 33, 3, 0, TRUE), + PT(46, 54, 3, 2, TRUE), + PT(21, 61, 4, 2, FALSE), + PT(34, 12, 4, 3, TRUE), + PT(54, 63, 6, 1, TRUE), + PT(51, 18, 2, 0, TRUE), + PT(26, 25, 3, 3, TRUE), + PT(43, 36, 2, 1, FALSE), + PT(17, 42, 3, 0, FALSE), + PT(37, 50, 5, 1, FALSE), + PT(44, 26, 2, 1, FALSE), + PT(38, 6, 2, 0, FALSE), + PT(17, 41, 6, 1, TRUE), + PT(44, 9, 2, 2, FALSE), + PT(43, 18, 5, 1, TRUE), + PT(29, 3, 4, 2, FALSE), + PT( 0, 18, 2, 2, TRUE), + PT(34, 61, 4, 3, FALSE), + PT(21, 55, 3, 1, FALSE), + PT(15, 18, 6, 3, TRUE), + PT(36, 1, 3, 0, FALSE), + PT(42, 23, 2, 1, TRUE), + PT(20, 59, 5, 0, TRUE), + PT(42, 25, 6, 1, FALSE), + PT(45, 23, 2, 3, TRUE), + PT(11, 44, 6, 1, TRUE), + PT( 7, 45, 6, 2, FALSE), + PT( 7, 56, 3, 2, TRUE), + PT(31, 54, 4, 1, FALSE), + PT(17, 10, 2, 3, TRUE), + PT(20, 17, 2, 1, TRUE), + PT(42, 23, 4, 2, TRUE), + PT( 1, 58, 3, 2, FALSE), + PT(38, 39, 6, 0, FALSE), + PT(45, 59, 6, 2, TRUE), + PT(58, 48, 6, 2, FALSE), + PT( 6, 58, 3, 2, FALSE), + PT(45, 5, 2, 1, TRUE), + PT(33, 50, 2, 1, FALSE), + PT(62, 30, 5, 2, FALSE), + PT(58, 63, 5, 2, TRUE), + PT(32, 42, 6, 2, FALSE), + PT(38, 3, 3, 1, FALSE), + PT(25, 39, 5, 3, FALSE), + PT(49, 4, 4, 3, FALSE), + PT(42, 63, 6, 0, FALSE), + PT(37, 35, 5, 1, FALSE), + PT( 8, 8, 6, 2, TRUE), + PT(44, 48, 3, 3, FALSE), + PT( 8, 5, 3, 0, FALSE), + PT( 6, 9, 5, 2, TRUE), + PT(25, 0, 4, 3, TRUE), + PT(13, 16, 3, 0, TRUE), + PT(28, 0, 2, 1, TRUE), + PT(61, 11, 4, 2, FALSE), + PT(46, 31, 2, 3, FALSE), + PT(61, 24, 6, 2, FALSE), + PT(18, 30, 2, 2, TRUE), + PT(21, 57, 4, 2, TRUE), + PT(51, 15, 2, 3, TRUE), + PT(26, 28, 3, 1, TRUE), + PT(55, 41, 3, 1, TRUE), + PT(59, 56, 2, 1, FALSE), + PT(29, 34, 6, 2, FALSE), + PT(38, 10, 6, 0, TRUE), + PT(22, 45, 2, 1, TRUE), + PT(13, 32, 4, 3, TRUE), + PT(36, 29, 2, 3, FALSE), + PT(46, 43, 3, 0, FALSE), + PT(22, 42, 3, 1, TRUE), + PT(36, 23, 6, 3, FALSE), + PT( 2, 5, 5, 1, TRUE), + PT(55, 26, 2, 3, TRUE), + PT(17, 61, 5, 2, FALSE), + PT(30, 47, 4, 1, FALSE), + PT(44, 41, 3, 1, FALSE), + PT(47, 4, 4, 2, TRUE), + PT(54, 12, 6, 2, TRUE), + PT(48, 62, 2, 1, FALSE), + PT(17, 48, 6, 3, TRUE), + PT(18, 33, 5, 3, FALSE), + PT(33, 48, 2, 3, TRUE), + PT(44, 61, 4, 2, FALSE), + PT(17, 35, 2, 2, FALSE), + PT(26, 50, 2, 3, TRUE), + PT(57, 39, 3, 0, FALSE), + PT(15, 36, 3, 0, TRUE), + PT( 0, 61, 6, 3, TRUE), + PT(44, 60, 3, 2, FALSE), + PT(11, 57, 4, 1, TRUE), + PT(14, 4, 3, 3, TRUE), + PT(28, 49, 2, 2, FALSE), + PT( 0, 4, 2, 2, TRUE), + PT(38, 42, 5, 1, FALSE), + PT(32, 37, 5, 1, FALSE), + PT(11, 60, 6, 1, TRUE), + PT(17, 11, 5, 3, FALSE), + PT(55, 34, 5, 3, FALSE), + PT(14, 34, 4, 3, FALSE), + PT(24, 45, 4, 3, TRUE), + PT( 6, 12, 3, 2, FALSE), + PT(38, 24, 5, 3, TRUE), + PT(58, 1, 5, 1, FALSE), + PT(47, 49, 6, 2, FALSE), + PT(31, 52, 3, 1, FALSE), + PT(49, 5, 2, 0, FALSE), + PT(46, 23, 6, 2, FALSE), + PT(24, 34, 4, 1, TRUE), + PT(35, 33, 6, 1, FALSE), + PT( 7, 8, 4, 1, FALSE), + PT(38, 28, 4, 1, FALSE), + PT(49, 18, 5, 3, TRUE), + PT( 8, 31, 2, 0, FALSE), + PT(39, 21, 5, 1, FALSE), + PT(31, 11, 4, 3, FALSE), + PT(47, 20, 6, 2, TRUE), + PT(36, 31, 4, 3, FALSE), + PT(59, 35, 6, 1, TRUE), + PT(32, 62, 5, 2, TRUE), + PT(23, 12, 2, 2, TRUE), + PT(19, 57, 3, 1, FALSE), + PT(48, 20, 4, 2, TRUE), + PT( 9, 7, 2, 3, TRUE), + PT(56, 56, 3, 3, TRUE), + PT(41, 36, 4, 3, TRUE), + PT(23, 39, 5, 0, FALSE), + PT(27, 18, 5, 1, FALSE), + PT(43, 61, 5, 2, TRUE), + PT(25, 52, 3, 2, FALSE), + PT( 1, 29, 2, 0, FALSE), + PT( 8, 57, 2, 0, TRUE), + PT(14, 54, 3, 1, TRUE), + PT(38, 19, 2, 0, FALSE), + PT(22, 40, 3, 3, FALSE), + PT(60, 40, 2, 3, TRUE), + PT(62, 57, 6, 2, FALSE), + PT(10, 3, 5, 3, FALSE), + PT(55, 26, 2, 1, TRUE), + PT(43, 51, 4, 3, FALSE), + PT(19, 44, 4, 0, TRUE), + PT(37, 20, 2, 0, FALSE), + PT(22, 11, 6, 2, TRUE), + PT(29, 53, 6, 1, TRUE), + PT(33, 8, 6, 1, TRUE), + PT(40, 33, 3, 1, FALSE), + PT(18, 12, 3, 1, TRUE), + PT(54, 42, 3, 0, TRUE), + PT(44, 43, 4, 1, TRUE), + PT( 1, 15, 4, 3, FALSE), + PT(23, 12, 3, 0, FALSE), + PT( 9, 15, 2, 0, TRUE), + PT(43, 36, 3, 2, FALSE), + PT( 9, 9, 2, 2, TRUE), + PT(54, 8, 2, 1, TRUE), + PT(32, 57, 4, 0, TRUE), + PT( 0, 58, 3, 3, TRUE), + PT(43, 54, 6, 0, TRUE), + PT( 2, 55, 2, 1, TRUE), + PT( 4, 52, 6, 2, TRUE), + PT(55, 61, 3, 1, FALSE), + PT(23, 61, 2, 1, TRUE), + PT(43, 54, 5, 3, TRUE), + PT(19, 30, 2, 1, TRUE), + PT(62, 17, 6, 1, TRUE), + PT(39, 58, 5, 2, TRUE), + PT(30, 49, 3, 1, FALSE), + PT( 3, 3, 5, 2, TRUE), + PT(37, 55, 3, 3, TRUE), + PT(17, 1, 4, 1, FALSE), + PT(28, 18, 2, 3, TRUE), + PT(48, 58, 6, 0, FALSE), + PT(23, 29, 5, 0, TRUE), + PT(14, 19, 4, 3, TRUE), + PT(26, 46, 4, 2, FALSE), + PT(45, 0, 3, 2, FALSE), + PT(23, 40, 3, 2, TRUE), + PT( 9, 31, 5, 3, FALSE), + PT(26, 45, 4, 3, FALSE), + PT(10, 19, 6, 1, FALSE), + PT(62, 0, 4, 3, TRUE), + PT(11, 59, 6, 0, FALSE), + PT( 8, 58, 5, 2, TRUE), + PT(34, 18, 3, 3, FALSE), + PT(52, 29, 5, 1, TRUE), + PT(38, 34, 6, 2, TRUE), + PT(23, 44, 2, 3, TRUE), + PT(41, 19, 5, 2, TRUE), + PT(45, 16, 2, 0, FALSE), + PT(32, 49, 4, 1, TRUE), + PT(30, 51, 3, 0, FALSE), + PT(51, 6, 5, 2, TRUE), + PT(38, 20, 4, 3, TRUE), + PT(34, 29, 5, 1, FALSE), + PT(45, 6, 3, 0, FALSE), + PT( 7, 9, 5, 3, FALSE), + PT(33, 21, 5, 3, FALSE), + PT(33, 56, 4, 1, TRUE), + PT(53, 11, 6, 2, FALSE), + PT(36, 11, 4, 1, FALSE), + PT(30, 1, 2, 3, TRUE), + PT(11, 36, 2, 0, TRUE), + PT(23, 7, 4, 0, FALSE), + PT(20, 37, 6, 1, FALSE), + PT(26, 14, 5, 3, TRUE), + PT(53, 23, 3, 3, TRUE), + PT(12, 8, 4, 0, TRUE), + PT(48, 53, 3, 3, TRUE), + PT(12, 11, 4, 0, FALSE), + PT( 4, 16, 2, 0, TRUE), + PT(53, 17, 3, 3, FALSE), + PT(51, 61, 2, 3, FALSE), + PT(30, 43, 3, 2, TRUE), + PT(26, 25, 2, 0, FALSE), + PT( 4, 6, 4, 1, FALSE), + PT( 3, 61, 4, 2, FALSE), + PT(42, 14, 6, 2, TRUE), + PT( 3, 62, 2, 3, TRUE), + PT(11, 24, 6, 3, FALSE), + PT(61, 13, 4, 3, FALSE), + PT(53, 18, 4, 0, FALSE), + PT(31, 13, 2, 3, FALSE), + PT(35, 50, 3, 1, FALSE), + PT( 0, 61, 4, 3, FALSE), + PT(48, 25, 6, 3, FALSE), + PT(18, 14, 4, 1, TRUE), + PT( 1, 35, 5, 0, FALSE), + PT(59, 49, 2, 0, TRUE), + PT(45, 28, 6, 3, FALSE), + PT(42, 5, 2, 3, FALSE), + PT(20, 14, 6, 0, FALSE), + PT(58, 55, 3, 0, TRUE), + PT(31, 48, 4, 2, TRUE), + PT(16, 38, 5, 3, TRUE), + PT(34, 17, 3, 3, TRUE), + PT(46, 43, 3, 3, FALSE), + PT(22, 22, 4, 0, TRUE), + PT(50, 24, 6, 2, TRUE), + PT(35, 50, 3, 1, FALSE), + PT(61, 13, 3, 0, TRUE), + PT(57, 9, 4, 1, TRUE), + PT(48, 46, 4, 2, FALSE), + PT(30, 15, 4, 2, FALSE), + PT( 9, 33, 6, 0, TRUE), + PT( 5, 3, 2, 0, TRUE), + PT( 5, 34, 5, 1, FALSE), + PT( 3, 7, 6, 3, TRUE), + PT( 4, 8, 2, 1, TRUE), + PT( 5, 16, 6, 2, FALSE), + PT(55, 20, 5, 0, TRUE), + PT(10, 36, 6, 1, FALSE), + PT(52, 30, 3, 1, TRUE), + PT(18, 23, 5, 3, FALSE), + PT( 1, 2, 2, 1, TRUE), + PT(10, 12, 2, 0, TRUE), + PT( 2, 20, 2, 1, TRUE), + PT(13, 37, 4, 1, TRUE), + PT( 0, 7, 3, 1, FALSE), + PT(28, 40, 6, 2, TRUE), + PT( 8, 14, 5, 2, FALSE), + PT(27, 60, 2, 2, TRUE), + PT(28, 25, 3, 2, TRUE), + PT(50, 19, 3, 1, FALSE), + PT(28, 0, 6, 3, TRUE), + PT(34, 27, 6, 2, TRUE), + PT(57, 62, 2, 2, FALSE), + PT(50, 6, 6, 0, TRUE), + PT(23, 5, 5, 1, TRUE), + PT( 1, 15, 4, 0, FALSE), + PT(30, 15, 6, 2, FALSE), + PT(24, 3, 3, 3, TRUE), + PT(43, 0, 2, 2, FALSE), + PT(21, 58, 6, 0, FALSE), + PT(37, 48, 4, 0, TRUE), + PT(11, 0, 6, 3, TRUE), + PT(36, 55, 3, 2, TRUE), + PT(41, 33, 2, 3, FALSE), + PT(36, 15, 5, 2, FALSE), + PT(62, 21, 6, 3, FALSE), + PT(60, 45, 4, 1, TRUE), + PT(61, 60, 2, 3, TRUE), + PT(26, 28, 2, 1, TRUE), + PT(10, 41, 4, 1, FALSE), + PT(37, 63, 4, 3, FALSE), + PT(59, 57, 5, 3, TRUE), + PT(29, 8, 2, 3, FALSE), + PT(11, 25, 2, 2, FALSE), + PT(18, 1, 5, 2, FALSE), + PT(53, 17, 5, 1, FALSE), + PT( 2, 0, 2, 1, TRUE), + PT(57, 42, 6, 2, TRUE), + PT( 7, 26, 2, 0, TRUE), + PT(36, 14, 3, 3, FALSE), + PT(14, 44, 2, 2, TRUE), + PT( 8, 49, 3, 1, TRUE), + PT(33, 29, 4, 3, FALSE), + PT(29, 28, 5, 1, FALSE), + PT(29, 36, 2, 1, TRUE), + PT( 1, 0, 3, 0, FALSE), + PT(40, 42, 6, 3, TRUE), + PT(21, 15, 2, 1, TRUE), + PT(16, 50, 6, 3, FALSE), + PT(34, 19, 6, 0, TRUE), + PT(19, 5, 3, 3, FALSE), + PT(23, 53, 6, 2, TRUE), + PT(59, 14, 4, 2, FALSE), + PT(53, 58, 3, 2, TRUE), + PT(27, 54, 3, 1, TRUE), + PT( 3, 29, 4, 2, FALSE), + PT(15, 22, 6, 0, FALSE), + PT(45, 9, 4, 2, TRUE), + PT( 5, 33, 2, 1, TRUE), + PT(10, 39, 6, 3, FALSE), + PT( 4, 13, 3, 2, FALSE), + PT( 6, 62, 4, 0, TRUE), + PT(42, 39, 6, 1, TRUE), + PT(40, 14, 2, 2, TRUE), + PT(11, 23, 3, 2, TRUE), + PT(29, 50, 5, 2, TRUE), + PT( 8, 61, 5, 0, TRUE), + PT(33, 50, 2, 3, TRUE), + PT(51, 49, 4, 1, FALSE), + PT(14, 3, 4, 0, TRUE), + PT(13, 11, 2, 3, FALSE), + PT(62, 42, 5, 3, FALSE), + PT(25, 54, 5, 1, FALSE), + PT(13, 0, 2, 2, FALSE), + PT(34, 7, 6, 3, FALSE), + PT(10, 9, 2, 2, TRUE), + PT(20, 16, 4, 1, FALSE), + PT( 7, 22, 5, 2, FALSE), + PT(54, 19, 2, 2, TRUE), + PT( 9, 47, 3, 1, TRUE), + PT(32, 59, 5, 3, FALSE), + PT(58, 58, 2, 3, FALSE), + PT(13, 21, 5, 1, FALSE), + PT(57, 19, 5, 1, TRUE), + PT(11, 1, 5, 1, FALSE), + PT(19, 23, 3, 3, FALSE), + PT( 8, 23, 3, 3, FALSE), + PT(12, 15, 6, 2, FALSE), + PT(31, 49, 2, 1, FALSE), + PT( 7, 58, 3, 2, TRUE), + PT(53, 30, 2, 1, FALSE), + PT(36, 44, 2, 2, TRUE), + PT(14, 33, 3, 0, TRUE), + PT(52, 59, 6, 1, TRUE), + PT(25, 15, 5, 0, FALSE), + PT(16, 47, 5, 3, FALSE), + PT(35, 39, 6, 0, TRUE), + PT(57, 46, 3, 0, FALSE), + PT(60, 63, 4, 2, FALSE), + PT( 7, 35, 6, 0, FALSE), + PT(40, 19, 6, 2, TRUE), + PT(19, 10, 2, 0, FALSE), + PT(53, 25, 6, 1, TRUE), + PT(35, 40, 5, 0, TRUE), + PT(19, 47, 3, 1, FALSE), + PT(58, 25, 2, 2, FALSE), + PT(55, 54, 4, 3, FALSE), + PT(32, 59, 2, 2, TRUE), + PT(55, 57, 2, 0, FALSE), + PT(60, 33, 6, 2, FALSE), + PT(28, 56, 6, 0, FALSE), + PT(21, 7, 4, 3, FALSE), + PT(39, 33, 3, 0, TRUE), + PT(24, 17, 4, 1, TRUE), + PT(48, 40, 6, 3, TRUE), + PT(50, 45, 3, 3, TRUE), + PT(44, 63, 6, 0, FALSE), + PT(29, 47, 4, 3, FALSE), + PT( 1, 17, 3, 2, FALSE), + PT(59, 15, 2, 1, FALSE), + PT(42, 23, 4, 3, TRUE), + PT( 5, 0, 3, 1, TRUE), + PT(37, 28, 6, 1, FALSE), + PT( 4, 34, 5, 2, TRUE), + PT(16, 15, 4, 2, TRUE), + PT(13, 57, 6, 0, FALSE), + PT(11, 46, 4, 3, TRUE), + PT(45, 52, 2, 2, TRUE), + PT(62, 48, 6, 3, FALSE), + PT(22, 38, 5, 1, FALSE), + PT( 5, 63, 5, 1, TRUE), + PT(32, 59, 5, 3, FALSE), + PT(59, 28, 5, 3, TRUE), + PT( 1, 24, 2, 3, FALSE), + PT(22, 61, 2, 0, FALSE), + PT(10, 31, 3, 0, FALSE), + PT(23, 15, 4, 1, FALSE), + PT( 6, 19, 2, 0, TRUE), + PT(56, 33, 2, 3, TRUE), + PT(23, 10, 6, 3, TRUE), + PT(28, 25, 6, 0, FALSE), + PT(22, 56, 6, 0, TRUE), + PT(48, 16, 6, 3, FALSE), + PT(49, 47, 4, 3, FALSE), + PT(60, 27, 4, 1, TRUE), + PT(51, 47, 3, 0, TRUE), + PT(22, 53, 4, 2, TRUE), + PT(58, 24, 3, 3, TRUE), + PT(55, 1, 3, 3, FALSE), + PT(13, 24, 2, 1, FALSE), + PT(31, 28, 3, 1, TRUE), + PT( 7, 52, 5, 2, TRUE), + PT(11, 63, 6, 1, TRUE), + PT(30, 52, 3, 2, TRUE), + PT(44, 19, 5, 2, FALSE), + PT(32, 32, 2, 1, TRUE), + PT(32, 15, 6, 0, TRUE), + PT( 8, 15, 4, 2, FALSE), + PT(24, 61, 3, 2, FALSE), + PT(54, 52, 4, 3, TRUE), + PT(51, 42, 4, 2, TRUE), + PT(45, 48, 4, 3, FALSE), + PT(61, 55, 4, 3, FALSE), + PT(37, 17, 2, 0, TRUE), + PT( 3, 5, 3, 0, FALSE), + PT(16, 4, 5, 0, TRUE), + PT( 7, 46, 6, 3, FALSE), + PT(42, 41, 2, 2, TRUE), + PT(58, 14, 6, 1, TRUE), + PT(42, 6, 5, 0, TRUE), + PT(61, 1, 5, 0, TRUE), + PT(39, 14, 2, 3, FALSE), + PT(29, 40, 3, 1, TRUE), + PT(16, 51, 5, 1, TRUE), + PT(12, 20, 3, 2, TRUE), + PT(21, 63, 4, 2, TRUE), + PT(55, 35, 3, 3, FALSE), + PT( 4, 44, 3, 2, FALSE), + PT(21, 52, 5, 1, FALSE), + PT( 9, 47, 2, 2, TRUE), + PT( 2, 63, 2, 2, FALSE), + PT(25, 44, 6, 1, TRUE), + PT(57, 50, 4, 0, FALSE), + PT(42, 24, 6, 1, FALSE), + PT(23, 35, 4, 0, TRUE), + PT(11, 45, 4, 2, TRUE), + PT(36, 58, 5, 2, TRUE), + PT(49, 63, 6, 2, FALSE), + PT(24, 25, 4, 2, FALSE), + PT(30, 21, 3, 1, FALSE), + PT(23, 51, 5, 1, TRUE), + PT(35, 9, 4, 3, FALSE), + PT(27, 13, 2, 2, TRUE), + PT(54, 38, 5, 0, FALSE), + PT(58, 28, 2, 2, FALSE), + PT(12, 62, 2, 0, FALSE), + PT(24, 6, 6, 2, TRUE), + PT(55, 38, 6, 3, FALSE), + PT(33, 38, 2, 3, TRUE), + PT(61, 28, 5, 2, FALSE), + PT(22, 37, 3, 2, TRUE), + PT(30, 11, 3, 3, FALSE), + PT(29, 13, 6, 1, FALSE), + PT( 8, 31, 3, 1, TRUE), + PT(18, 28, 2, 1, FALSE), + PT(32, 42, 5, 0, FALSE), + PT( 6, 59, 6, 2, TRUE), + PT(57, 14, 3, 3, FALSE), + PT(49, 48, 5, 0, FALSE), + PT( 2, 33, 2, 2, FALSE), + PT( 6, 30, 5, 0, TRUE), + PT(22, 9, 3, 2, FALSE), + PT(39, 50, 5, 2, TRUE), + PT(57, 3, 4, 3, TRUE), + PT(41, 9, 3, 3, FALSE), + PT(27, 17, 3, 2, FALSE), + PT(40, 58, 5, 2, FALSE), + PT( 3, 3, 3, 0, FALSE), + PT(35, 9, 5, 3, TRUE), + PT(48, 23, 4, 1, TRUE), + PT(15, 37, 6, 1, TRUE), + PT( 6, 36, 6, 3, TRUE), + PT(34, 9, 6, 1, TRUE), + PT(44, 9, 5, 1, FALSE), + PT(12, 18, 5, 1, FALSE), + PT(40, 32, 2, 0, FALSE), + PT(21, 41, 6, 1, TRUE), + PT(15, 26, 2, 1, TRUE), + PT(19, 24, 6, 3, FALSE), + PT(46, 22, 2, 1, TRUE), + PT(60, 26, 2, 2, TRUE), + PT(58, 17, 6, 1, FALSE), + PT( 2, 10, 5, 2, FALSE), + PT(25, 57, 2, 0, TRUE), + PT(49, 62, 3, 2, TRUE), + PT(50, 20, 6, 1, FALSE), + PT(18, 46, 6, 2, FALSE), + PT(62, 54, 4, 1, TRUE), + PT(55, 62, 2, 2, TRUE), + PT(21, 53, 6, 2, FALSE), + PT( 1, 58, 5, 2, FALSE), + PT(38, 37, 4, 1, FALSE), + PT( 1, 43, 6, 3, TRUE), + PT(28, 61, 6, 1, TRUE), + PT(62, 16, 3, 2, FALSE), + PT(38, 51, 3, 0, TRUE), + PT( 5, 25, 2, 3, TRUE), + PT(18, 56, 3, 2, FALSE), + PT(21, 60, 6, 1, FALSE), + PT(63, 15, 6, 3, TRUE), + PT( 2, 57, 6, 1, FALSE), + PT(19, 0, 3, 2, TRUE), + PT(29, 44, 2, 0, FALSE), + PT(57, 19, 6, 0, TRUE), + PT(15, 55, 3, 0, TRUE), + PT( 9, 13, 5, 1, FALSE), + PT(32, 47, 6, 1, FALSE), + PT(59, 52, 4, 1, FALSE), + PT(38, 20, 2, 0, FALSE), + PT(36, 61, 4, 1, FALSE), + PT(11, 49, 4, 1, TRUE), + PT(47, 45, 5, 1, FALSE), + PT(48, 4, 6, 2, TRUE), + PT(25, 32, 5, 1, FALSE), + PT(22, 54, 6, 3, TRUE), + PT(20, 40, 6, 3, TRUE), + PT(17, 11, 4, 3, TRUE), + PT(29, 6, 5, 0, TRUE), + PT(53, 22, 5, 3, FALSE), + PT(36, 46, 5, 0, TRUE), + PT(54, 20, 5, 1, FALSE), + PT(33, 12, 3, 3, TRUE), + PT(63, 57, 3, 0, TRUE), + PT(39, 16, 5, 1, FALSE), + PT(30, 18, 6, 2, FALSE), + PT(16, 36, 6, 2, FALSE), + PT(29, 19, 3, 2, TRUE), + PT(23, 22, 6, 3, TRUE), + PT(39, 27, 4, 3, TRUE), + PT( 7, 36, 4, 0, TRUE), + PT(55, 33, 2, 0, TRUE), + PT(55, 40, 4, 2, FALSE), + PT(25, 2, 3, 2, FALSE), + PT(20, 18, 3, 2, TRUE), + PT(27, 36, 5, 3, FALSE), + PT(46, 58, 2, 2, TRUE), + PT(55, 52, 4, 0, TRUE), + PT(51, 45, 5, 0, TRUE), + PT(47, 30, 6, 2, FALSE), + PT(41, 60, 2, 1, FALSE), + PT( 5, 21, 4, 0, FALSE), + PT( 5, 62, 3, 0, TRUE), + PT(24, 11, 6, 0, FALSE), + PT(47, 2, 4, 3, TRUE), + PT(20, 28, 6, 2, FALSE), + PT(18, 32, 6, 0, FALSE), + PT(43, 34, 3, 1, TRUE), + PT( 6, 49, 5, 0, FALSE), + PT(21, 45, 2, 1, FALSE), + PT( 1, 14, 2, 1, TRUE), + PT(19, 12, 5, 0, FALSE), + PT( 7, 42, 2, 2, FALSE), + PT(29, 54, 2, 2, FALSE), + PT(21, 43, 4, 3, FALSE), + PT( 3, 37, 2, 2, TRUE), + PT(62, 59, 4, 0, FALSE), + PT(53, 12, 4, 2, TRUE), + PT(43, 22, 6, 2, TRUE), + PT(30, 49, 5, 2, FALSE), + PT( 6, 3, 5, 0, TRUE), + PT(36, 7, 3, 3, TRUE), + PT(50, 47, 3, 0, TRUE), + PT(37, 33, 6, 0, TRUE), + PT(34, 38, 3, 2, TRUE), + PT( 0, 27, 3, 0, FALSE), + PT(42, 36, 6, 0, TRUE), + PT(32, 6, 5, 3, TRUE), + PT(30, 50, 4, 3, FALSE), + PT(50, 57, 2, 1, FALSE), + PT(32, 1, 3, 0, TRUE), + PT(15, 21, 2, 2, TRUE), + PT(39, 16, 5, 3, FALSE), + PT( 9, 37, 3, 0, TRUE), + PT(41, 55, 6, 0, FALSE), + PT(19, 28, 3, 2, TRUE), + PT(41, 45, 4, 3, FALSE), + PT( 2, 26, 2, 3, FALSE), + PT(29, 43, 3, 2, FALSE), + PT(24, 4, 6, 2, FALSE), + PT(40, 42, 4, 0, TRUE), + PT(21, 27, 5, 3, FALSE), + PT(22, 1, 2, 0, FALSE), + PT( 5, 9, 2, 2, FALSE), + PT(34, 3, 4, 1, FALSE), + PT( 2, 27, 6, 2, FALSE), + PT(41, 42, 4, 1, TRUE), + PT(38, 54, 2, 1, TRUE), + PT(35, 61, 3, 1, FALSE), + PT(29, 16, 4, 2, FALSE), + PT(37, 43, 6, 3, TRUE), + PT(25, 36, 4, 3, FALSE), + PT(40, 19, 2, 3, FALSE), + PT(23, 20, 3, 0, TRUE), + PT(11, 47, 4, 2, TRUE), + PT(55, 52, 6, 3, TRUE), + PT(57, 33, 3, 1, TRUE), + PT(15, 61, 5, 2, TRUE), + PT(13, 16, 4, 0, FALSE), + PT( 5, 11, 5, 2, TRUE), + PT( 1, 18, 4, 2, FALSE), + PT(24, 61, 6, 1, FALSE), + PT( 9, 33, 4, 3, FALSE), + PT(26, 14, 3, 3, TRUE), + PT(48, 6, 3, 3, TRUE), + PT(11, 60, 5, 0, TRUE), + PT( 7, 62, 4, 3, TRUE), + PT(19, 30, 3, 1, FALSE), + PT(19, 7, 4, 1, TRUE), + PT(16, 52, 3, 3, FALSE), + PT(50, 23, 4, 1, TRUE), + PT(53, 22, 6, 0, TRUE), + PT(50, 46, 3, 1, TRUE), + PT(40, 14, 4, 1, FALSE), + PT(20, 58, 4, 1, TRUE), + PT(34, 3, 5, 0, TRUE), + PT(42, 16, 4, 0, FALSE), + PT(62, 60, 4, 3, TRUE), + PT(22, 32, 2, 1, FALSE), + PT(63, 36, 6, 0, TRUE), + PT(13, 46, 6, 1, FALSE), + PT(47, 23, 5, 2, TRUE), + PT(54, 59, 2, 3, TRUE), + PT(36, 35, 3, 0, FALSE), + PT(55, 29, 2, 1, TRUE), + PT(23, 58, 3, 1, FALSE), + PT(10, 61, 3, 3, FALSE), + PT( 5, 18, 2, 3, FALSE), + PT(51, 50, 4, 2, TRUE), + PT(29, 31, 5, 0, TRUE), + PT(52, 44, 4, 3, FALSE), + PT(32, 41, 6, 2, TRUE), + PT(14, 50, 2, 3, TRUE), + PT( 1, 57, 5, 2, TRUE), + PT(39, 36, 4, 1, TRUE), + PT(40, 63, 3, 0, FALSE), + PT(57, 56, 4, 2, TRUE), + PT(35, 17, 2, 0, TRUE), + PT(25, 44, 5, 0, TRUE), + PT(48, 8, 5, 0, FALSE), + PT(37, 39, 3, 2, TRUE), + PT(23, 37, 4, 0, TRUE), + PT( 9, 61, 2, 3, FALSE), + PT(27, 15, 5, 2, FALSE), + PT(27, 18, 4, 1, FALSE), + PT(40, 62, 4, 3, FALSE), + PT(52, 16, 3, 1, TRUE), + PT( 2, 52, 2, 2, TRUE), + PT(26, 41, 3, 0, TRUE), + PT(41, 17, 6, 0, TRUE), + PT(18, 39, 2, 3, TRUE), + PT(39, 39, 5, 3, TRUE), + PT(52, 39, 4, 2, FALSE), + PT( 3, 25, 6, 3, FALSE), + PT(23, 29, 6, 1, TRUE), + PT(25, 37, 3, 1, FALSE), + PT(43, 57, 2, 1, TRUE), + PT(59, 51, 3, 2, TRUE), + PT(39, 49, 6, 2, FALSE), + PT(40, 51, 6, 3, TRUE), + PT( 9, 48, 3, 1, TRUE), + PT( 3, 58, 4, 3, TRUE), + PT(25, 17, 3, 3, TRUE), + PT(11, 26, 6, 2, FALSE), + PT(61, 42, 2, 2, TRUE), + PT( 4, 36, 6, 3, FALSE), + PT(48, 35, 6, 0, FALSE), + PT(15, 34, 3, 1, TRUE), + PT(61, 61, 4, 2, FALSE), + PT(41, 29, 2, 1, FALSE), + PT(22, 25, 5, 3, FALSE), + PT( 3, 18, 2, 3, TRUE), + PT(24, 37, 6, 1, TRUE), + PT(47, 35, 3, 1, FALSE), + PT(26, 53, 4, 3, TRUE), + PT(33, 38, 3, 0, TRUE), + PT(27, 48, 3, 0, FALSE), + PT(43, 34, 5, 2, TRUE), + PT(44, 26, 6, 2, FALSE), + PT(62, 18, 3, 0, TRUE), + PT(40, 39, 2, 2, TRUE), + PT(27, 17, 2, 1, FALSE), + PT(23, 21, 2, 0, FALSE), + PT(52, 55, 4, 2, TRUE), + PT(18, 63, 2, 2, TRUE), + PT(49, 13, 6, 3, TRUE), + PT(62, 42, 5, 2, TRUE), + PT(15, 36, 4, 2, FALSE), + PT(60, 63, 3, 3, TRUE), + PT(29, 52, 2, 3, TRUE), + PT(26, 35, 3, 3, TRUE), + PT(55, 15, 2, 0, FALSE), + PT(50, 52, 6, 2, TRUE), + PT(25, 5, 4, 1, FALSE), + PT(51, 22, 6, 2, FALSE), + PT(30, 20, 3, 3, FALSE), + PT( 8, 19, 5, 0, TRUE), + PT(58, 55, 6, 0, FALSE), + PT(29, 54, 2, 2, TRUE), + PT(41, 46, 3, 2, TRUE), + PT(50, 46, 4, 1, TRUE), + PT(53, 23, 3, 2, FALSE), + PT(54, 29, 2, 1, TRUE), + PT(35, 52, 6, 2, FALSE), + PT(36, 26, 6, 3, TRUE), + PT(47, 38, 5, 3, FALSE), + PT(30, 23, 3, 1, FALSE), + PT(31, 21, 3, 3, TRUE), + PT(43, 31, 3, 0, TRUE), + PT(10, 51, 3, 1, FALSE), + PT(53, 49, 4, 2, FALSE), + PT(45, 23, 5, 2, FALSE), + PT(12, 33, 6, 3, FALSE), + PT(44, 53, 6, 2, TRUE), + PT(27, 3, 4, 3, TRUE), + PT( 1, 13, 3, 2, TRUE), + PT(28, 14, 2, 0, TRUE), + PT(17, 43, 2, 0, FALSE), + PT(37, 59, 4, 0, FALSE), + PT(31, 23, 3, 0, TRUE), + PT(32, 8, 6, 3, FALSE), + PT(19, 56, 3, 0, TRUE), + PT(27, 43, 4, 2, FALSE), + PT(11, 31, 5, 0, TRUE), + PT(39, 21, 5, 2, FALSE), + PT(55, 57, 2, 0, FALSE), + PT(58, 21, 5, 3, FALSE), + PT(47, 17, 6, 3, FALSE), + PT(36, 4, 4, 0, FALSE), + PT(59, 42, 6, 2, TRUE), + PT(39, 53, 6, 2, FALSE), + PT(13, 27, 4, 0, FALSE), + PT(16, 34, 6, 3, TRUE), + PT(31, 56, 4, 3, TRUE), + PT(49, 15, 5, 0, FALSE), + PT(40, 37, 2, 2, TRUE), + PT( 0, 29, 4, 2, TRUE), + PT(49, 40, 5, 0, FALSE), + PT(11, 58, 3, 2, TRUE), + PT(45, 19, 3, 1, TRUE), + PT( 3, 55, 5, 3, FALSE), + PT(29, 40, 3, 0, TRUE), + PT( 8, 45, 4, 1, FALSE), + PT(39, 57, 6, 1, FALSE), + PT(63, 47, 3, 2, TRUE), + PT(51, 52, 5, 0, FALSE), + PT(24, 8, 6, 0, TRUE), + PT(35, 31, 2, 1, TRUE), + PT(13, 44, 4, 1, TRUE), + PT(58, 45, 3, 1, FALSE), + PT( 2, 37, 2, 1, TRUE), + PT(32, 54, 6, 2, FALSE), + PT(18, 43, 5, 2, TRUE), + PT(53, 53, 6, 2, FALSE), + PT(35, 32, 4, 0, TRUE), + PT(58, 25, 3, 1, TRUE), + PT(31, 43, 3, 0, TRUE), + PT(53, 14, 3, 0, TRUE), + PT(38, 36, 6, 3, TRUE), + PT(24, 8, 2, 0, FALSE), + PT(12, 22, 5, 2, TRUE), + PT(31, 52, 4, 0, TRUE), + PT( 5, 56, 3, 0, TRUE), + PT(20, 33, 4, 2, FALSE), + PT(17, 49, 2, 2, FALSE), + PT(62, 56, 5, 0, TRUE), + PT(63, 8, 4, 2, TRUE), + PT(42, 31, 4, 2, TRUE), + PT(37, 6, 5, 0, FALSE), + PT(11, 30, 2, 2, FALSE), + PT(26, 56, 4, 1, FALSE), + PT(36, 24, 5, 0, TRUE), + PT(26, 17, 4, 0, FALSE), + PT(59, 58, 3, 3, FALSE), + PT(28, 38, 3, 1, FALSE), + PT( 5, 50, 3, 0, TRUE), + PT(57, 42, 6, 0, TRUE), + PT( 9, 7, 4, 2, TRUE), + PT( 5, 62, 2, 3, FALSE), + PT(52, 38, 2, 2, FALSE), + PT(27, 50, 4, 3, FALSE), + PT( 5, 8, 6, 3, TRUE), + PT(15, 3, 4, 0, FALSE), + PT(42, 57, 6, 0, TRUE), + PT( 8, 1, 3, 3, FALSE), + PT(29, 35, 6, 0, TRUE), + PT(40, 27, 5, 0, FALSE), + PT(30, 55, 2, 2, FALSE), + PT(19, 14, 5, 0, FALSE), + PT(42, 59, 6, 3, TRUE), + PT(47, 28, 5, 0, FALSE), + PT(48, 48, 3, 1, FALSE), + PT(54, 31, 2, 3, FALSE), + PT(62, 13, 2, 2, TRUE), + PT(46, 22, 3, 0, FALSE), + PT(21, 55, 4, 0, FALSE), + PT(42, 51, 6, 0, FALSE), + PT(43, 14, 4, 2, TRUE), + PT(24, 32, 2, 3, FALSE), + PT( 2, 25, 4, 2, TRUE), + PT(10, 46, 6, 0, FALSE), + PT(22, 3, 2, 0, TRUE), + PT( 4, 39, 4, 2, TRUE), + PT(27, 28, 4, 0, TRUE), + PT(41, 4, 4, 3, TRUE), + PT(61, 32, 3, 3, FALSE), + PT(40, 51, 6, 0, TRUE), + PT(30, 57, 2, 0, FALSE), + PT(49, 41, 3, 3, FALSE), + PT( 6, 37, 5, 0, FALSE), + PT(25, 59, 2, 1, FALSE), + PT(11, 27, 3, 2, FALSE), + PT(62, 55, 4, 0, FALSE), + PT(10, 55, 6, 1, TRUE), + PT( 2, 44, 4, 2, TRUE), + PT(21, 24, 2, 2, FALSE), + PT(59, 32, 3, 2, FALSE), + PT(34, 59, 3, 2, FALSE), + PT(36, 52, 6, 2, TRUE), + PT(15, 47, 6, 0, TRUE), + PT(59, 23, 6, 2, TRUE), + PT(48, 57, 6, 3, TRUE), + PT(13, 21, 2, 0, TRUE), + PT(16, 3, 3, 3, FALSE), + PT(26, 57, 6, 1, TRUE), + PT(47, 46, 5, 0, FALSE), + PT(28, 40, 6, 3, FALSE), + PT(40, 24, 3, 3, TRUE), + PT(21, 1, 6, 0, FALSE), + PT(62, 50, 5, 0, FALSE), + PT(52, 47, 4, 1, TRUE), + PT( 7, 12, 6, 3, FALSE), + PT(40, 44, 6, 2, FALSE), + PT(42, 12, 3, 3, TRUE), + PT(63, 32, 2, 1, TRUE), + PT(43, 23, 4, 3, TRUE), + PT(40, 41, 5, 1, FALSE), + PT(60, 19, 6, 3, FALSE), + PT(38, 45, 5, 1, FALSE), + PT(10, 6, 3, 3, FALSE), + PT(32, 4, 3, 1, FALSE), + PT( 2, 7, 6, 2, TRUE), + PT(14, 24, 6, 0, FALSE), + PT( 0, 52, 6, 2, FALSE), + PT(47, 20, 6, 3, TRUE), + PT(33, 48, 3, 3, TRUE), + PT(21, 55, 3, 1, TRUE), + PT(58, 11, 6, 1, FALSE), + PT(34, 34, 4, 0, TRUE), + PT(27, 53, 4, 1, TRUE), + PT(13, 3, 3, 2, FALSE), + PT(35, 59, 2, 1, TRUE), + PT(14, 29, 3, 3, TRUE), + PT(29, 63, 5, 3, FALSE), + PT(57, 39, 5, 3, FALSE), + PT(15, 56, 4, 0, FALSE), + PT(49, 60, 6, 2, TRUE), + PT(11, 15, 5, 3, FALSE), + PT( 6, 6, 5, 0, FALSE), + PT(37, 57, 4, 1, TRUE), + PT(10, 50, 2, 2, TRUE), + PT(15, 29, 4, 2, TRUE), + PT(12, 13, 6, 2, FALSE), + PT(18, 46, 4, 0, TRUE), + PT(54, 24, 3, 3, TRUE), + PT(31, 52, 3, 1, TRUE), + PT( 5, 58, 6, 3, FALSE), + PT(43, 1, 2, 3, TRUE), + PT(14, 22, 5, 1, TRUE), + PT(14, 11, 4, 3, FALSE), + PT(13, 45, 2, 0, FALSE), + PT(33, 17, 4, 3, TRUE), + PT(61, 19, 6, 1, FALSE), + PT(21, 37, 5, 1, FALSE), + PT(27, 45, 6, 2, TRUE), + PT(44, 43, 4, 3, FALSE), + PT(38, 31, 4, 0, FALSE), + PT(34, 43, 2, 1, FALSE), + PT(63, 61, 4, 3, TRUE), + PT(48, 10, 6, 3, FALSE), + PT(53, 31, 2, 3, TRUE), + PT(33, 8, 5, 0, TRUE), + PT(29, 32, 6, 1, TRUE), + PT(52, 17, 2, 3, FALSE), + PT( 5, 56, 5, 2, TRUE), +}; + +#undef PT diff --git a/src/debug/watanabe_debug_menu.c b/src/debug/watanabe_debug_menu.c index 205d4d5e3..53b7dee7a 100644 --- a/src/debug/watanabe_debug_menu.c +++ b/src/debug/watanabe_debug_menu.c @@ -2670,14 +2670,14 @@ void debug_80C6B00(u8 taskId) void debug_80C6CB8(u8 taskId) { - DecompressPicFromTable_2(gMonFrontPicTable + gUnknown_Debug_2038A20->unk0, gMonFrontPicCoords[gUnknown_Debug_2038A20->unk0].coords, gMonFrontPicCoords[gUnknown_Debug_2038A20->unk0].y_offset, gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], gUnknown_Debug_2038A20->unk0); + DecompressPicFromTable_2(gMonFrontPicTable + gUnknown_Debug_2038A20->unk0, gMonFrontPicCoords[gUnknown_Debug_2038A20->unk0].coords, gMonFrontPicCoords[gUnknown_Debug_2038A20->unk0].y_offset, gMonSpriteGfx_Sprite_ptr[0], gMonSpriteGfx_Sprite_ptr[1], gUnknown_Debug_2038A20->unk0); LoadCompressedObjectPalette(gMonPaletteTable + gUnknown_Debug_2038A20->unk0); GetMonSpriteTemplate_803C56C(gUnknown_Debug_2038A20->unk0, 1); gUnknown_Debug_2038A20->unk2 = CreateSprite(&gUnknown_02024E8C, 0x28, 0x28, 0); gSprites[gUnknown_Debug_2038A20->unk2].callback = debug_69; gSprites[gUnknown_Debug_2038A20->unk2].oam.priority = 0; - DecompressPicFromTable_2(gMonBackPicTable + gUnknown_Debug_2038A20->unk0, gMonBackPicCoords[gUnknown_Debug_2038A20->unk0].coords, gMonBackPicCoords[gUnknown_Debug_2038A20->unk0].y_offset, gUnknown_081FAF4C[0], gUnknown_081FAF4C[2], gUnknown_Debug_2038A20->unk0); + DecompressPicFromTable_2(gMonBackPicTable + gUnknown_Debug_2038A20->unk0, gMonBackPicCoords[gUnknown_Debug_2038A20->unk0].coords, gMonBackPicCoords[gUnknown_Debug_2038A20->unk0].y_offset, gMonSpriteGfx_Sprite_ptr[0], gMonSpriteGfx_Sprite_ptr[2], gUnknown_Debug_2038A20->unk0); LoadCompressedObjectPalette(gMonPaletteTable + gUnknown_Debug_2038A20->unk0); GetMonSpriteTemplate_803C56C(gUnknown_Debug_2038A20->unk0, 2); gUnknown_Debug_2038A20->unk3 = CreateSprite(&gUnknown_02024E8C, 0x28, 0x78, 0); @@ -3297,7 +3297,7 @@ void debug_80C777C(u8 taskId) void debug_80C7934(u8 taskId) { - DecompressPicFromTable_2(gTrainerFrontPicTable + gUnknown_Debug_2038A20->unk0, gTrainerFrontPicCoords[gUnknown_Debug_2038A20->unk0].coords, gTrainerFrontPicCoords[gUnknown_Debug_2038A20->unk0].y_offset, gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], gUnknown_Debug_2038A20->unk0); + DecompressPicFromTable_2(gTrainerFrontPicTable + gUnknown_Debug_2038A20->unk0, gTrainerFrontPicCoords[gUnknown_Debug_2038A20->unk0].coords, gTrainerFrontPicCoords[gUnknown_Debug_2038A20->unk0].y_offset, gMonSpriteGfx_Sprite_ptr[0], gMonSpriteGfx_Sprite_ptr[1], gUnknown_Debug_2038A20->unk0); LoadCompressedObjectPalette(gTrainerFrontPicPaletteTable + gUnknown_Debug_2038A20->unk0); GetMonSpriteTemplate_803C5A0(gUnknown_Debug_2038A20->unk0, 1); gUnknown_Debug_2038A20->unk2 = CreateSprite(&gUnknown_02024E8C, 0x28, 0x28, 0); diff --git a/src/decompress.c b/src/decompress.c index c0158ada8..bd613ec6a 100644 --- a/src/decompress.c +++ b/src/decompress.c @@ -71,8 +71,8 @@ void HandleLoadSpecialPokePic(const struct CompressedSpriteSheet *src, u32 coord { u32 frontOrBack; - // gUnknown_081FAF4C appears to be a list of pointers to locations to store poke pics for back and front pic here. the first and third pointers are used for back while the others are used for front. - if (dest == gUnknown_081FAF4C[0] || dest == gUnknown_081FAF4C[2]) + // gMonSpriteGfx_Sprite_ptr appears to be a list of pointers to locations to store poke pics for back and front pic here. the first and third pointers are used for back while the others are used for front. + if (dest == gMonSpriteGfx_Sprite_ptr[0] || dest == gMonSpriteGfx_Sprite_ptr[2]) frontOrBack = 0; // backPic else frontOrBack = 1; // frontPic diff --git a/src/egg_hatch.c b/src/egg_hatch.c index fdc12129e..974fa77e2 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -356,7 +356,7 @@ static u8 EggHatchCreateMonSprite(u8 a0, u8 switchID, u8 pokeID) { u16 species = GetMonData(mon, MON_DATA_SPECIES); u32 pid = GetMonData(mon, MON_DATA_PERSONALITY); - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, ewram0_6, gUnknown_081FAF4C[2 * a0 + 1], species, pid); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, ewram0_6, gMonSpriteGfx_Sprite_ptr[2 * a0 + 1], species, pid); LoadCompressedObjectPalette(GetMonSpritePalStruct(mon)); } break; diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 47a453693..7ea062083 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -228,7 +228,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, gMonFrontPicCoords[currSpecies].coords, gMonFrontPicCoords[currSpecies].y_offset, (void*)EWRAM, - gUnknown_081FAF4C[1], currSpecies); + gMonSpriteGfx_Sprite_ptr[1], currSpecies); pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(currSpecies, TiD, PiD); LoadCompressedPalette(*pokePal, 0x110, 0x20); @@ -245,7 +245,7 @@ void EvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, bool8 canStopEvo, gMonFrontPicCoords[speciesToEvolve].coords, gMonFrontPicCoords[speciesToEvolve].y_offset, (void*)EWRAM, - gUnknown_081FAF4C[3], speciesToEvolve); + gMonSpriteGfx_Sprite_ptr[3], speciesToEvolve); pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD); LoadCompressedPalette(*pokePal, 0x120, 0x20); @@ -325,7 +325,7 @@ static void CB2_EvolutionSceneLoadGraphics(void) gMonFrontPicCoords[postEvoSpecies].coords, gMonFrontPicCoords[postEvoSpecies].y_offset, (void*)EWRAM, - gUnknown_081FAF4C[3], postEvoSpecies); + gMonSpriteGfx_Sprite_ptr[3], postEvoSpecies); pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD); LoadCompressedPalette(*pokePal, 0x120, 0x20); @@ -395,7 +395,7 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) gMonFrontPicCoords[postEvoSpecies].coords, gMonFrontPicCoords[postEvoSpecies].y_offset, (void*)EWRAM, - gUnknown_081FAF4C[3], postEvoSpecies); + gMonSpriteGfx_Sprite_ptr[3], postEvoSpecies); pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(postEvoSpecies, TiD, PiD); LoadCompressedPalette(*pokePal, 0x120, 0x20); gMain.state++; @@ -445,7 +445,7 @@ void TradeEvolutionScene(struct Pokemon* mon, u16 speciesToEvolve, u8 preEvoSpri gMonFrontPicCoords[speciesToEvolve].coords, gMonFrontPicCoords[speciesToEvolve].y_offset, (void*)EWRAM, - gUnknown_081FAF4C[1], speciesToEvolve); + gMonSpriteGfx_Sprite_ptr[1], speciesToEvolve); pokePal = (void*) GetMonSpritePalStructFromOtIdPersonality(speciesToEvolve, TiD, PiD); LoadCompressedPalette(*pokePal, 0x120, 0x20); diff --git a/src/field_effect.c b/src/field_effect.c index 280eb20bc..1685a16fa 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -543,7 +543,7 @@ u8 CreateBirchSprite(s16 x, s16 y, u8 subpriority) u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) { - DecompressPicFromTable_2(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, gUnknown_081FAF4C[3], gUnknown_081FAF4C[3], species); + DecompressPicFromTable_2(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, gMonSpriteGfx_Sprite_ptr[3], gMonSpriteGfx_Sprite_ptr[3], species); LoadCompressedObjectPalette(&gMonPaletteTable[species]); GetMonSpriteTemplate_803C56C(species, 3); gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; @@ -555,7 +555,7 @@ u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subprio { const struct CompressedSpritePalette *spritePalette; - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gMonSpriteGfx_Sprite_ptr[3] /* this is actually u8* or something, pointing to ewram */, gMonSpriteGfx_Sprite_ptr[3], species, g); spritePalette = GetMonSpritePalStructFromOtIdPersonality(species, d, g); LoadCompressedObjectPalette(spritePalette); GetMonSpriteTemplate_803C56C(species, 3); diff --git a/src/image_processing_effects.c b/src/image_processing_effects.c index f0f44d6e5..fe5fc5dd9 100644 --- a/src/image_processing_effects.c +++ b/src/image_processing_effects.c @@ -2,136 +2,145 @@ #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; +#define GET_R(color) ((color) & 0x1F) +#define GET_G(color) (((color) >> 5) & 0x1F) +#define GET_B(color) (((color) >> 10) & 0x1F) + +#define RGB_ALPHA (1 << 15) +#define IS_ALPHA(color) ((color) & RGB_ALPHA) + +#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r)) + +u16 *gCanvasPixels; +u8 gCanvasColumnStart; +u8 gCanvasRowEnd; +u8 gCanvasRowStart; +u8 gCanvasColumnEnd; +u8 gCanvasHeight; +u8 gCanvasMonPersonality; +u8 gCanvasWidth; +u16 * gCanvasPalette; +u16 gCanvasPaletteStart; // 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); +void ApplyImageEffect_Pointillism(void); +void ApplyImageEffect_Blur(void); +void ApplyImageEffect_BlackOutline(void); +void ApplyImageEffect_Invert(void); +void ApplyImageEffect_BlackAndWhite(void); +void ApplyImageEffect_BlurRight(void); +void ApplyImageEffect_BlurDown(void); +void ApplyImageEffect_Shimmer(void); +void ApplyImageEffect_Grayscale(void); +void ApplyImageEffect_PersonalityColor(u8 personality); +void ApplyImageEffect_RedChannelGrayscale(u8); +void ApplyImageEffect_RedChannelGrayscaleHighlight(u8); +void AddPointillismPoints(u16); u16 ConvertColorToGrayscale(u16*); -u16 sub_80FD68C(u16*, u16*, u16*); +u16 QuantizePixel_Blur(u16 *prevPixel, u16 *curPixel, u16 *nextPixel); 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 QuantizePixel_BlackAndWhite(u16*); +u16 QuantizePixel_BlackOutline(u16 *colorA, u16 *colorB); +u16 QuantizePixel_Invert(u16*); +u16 QuantizePixel_BlurHard(u16 *prevPixel, u16 *curPixel, u16 *nextPixel); +u16 QuantizePixel_MotionBlur(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) +void QuantizePalette_Standard(bool8); +void SetPresetPalette_PrimaryColors(void); +void QuantizePalette_PrimaryColors(void); +void SetPresetPalette_Grayscale(void); +void QuantizePalette_Grayscale(void); +void SetPresetPalette_GrayscaleSmall(void); +void QuantizePalette_GrayscaleSmall(void); +void SetPresetPalette_BlackAndWhite(void); +void QuantizePalette_BlackAndWhite(void); +u16 QuantizePixel_Standard(u16 *); +u16 QuantizePixel_GrayscaleSmall(u16 *); +u16 QuantizePixel_Grayscale(u16 *); +u16 QuantizePixel_PrimaryColors(u16 *); + +#define MAX_DIMENSION 64 + +#include "data/pointillism_points.h" + +void ApplyImageProcessingEffects(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) + gCanvasPixels = info->canvasPixels; + gCanvasMonPersonality = info->personality; + gCanvasColumnStart = info->columnStart; + gCanvasRowStart = info->rowStart; + gCanvasColumnEnd = info->columnEnd; + gCanvasRowEnd = info->rowEnd; + gCanvasWidth = info->canvasWidth; + gCanvasHeight = info->canvasHeight; + switch (info->effect) { - case 2: - sub_80FCAA4(); + case IMAGE_EFFECT_POINTILLISM: + ApplyImageEffect_Pointillism(); break; - case 8: - sub_80FCB5C(); + case IMAGE_EFFECT_BLUR: + ApplyImageEffect_Blur(); break; - case 9: - sub_80FCD54(); - sub_80FCC18(gUnknown_03005E00); + case IMAGE_EFFECT_OUTLINE_COLORED: + ApplyImageEffect_BlackOutline(); + ApplyImageEffect_PersonalityColor(gCanvasMonPersonality); break; - case 10: - sub_80FCD54(); - sub_80FCEA4(); - sub_80FCCBC(); - case 31: - sub_80FCEA4(); + case IMAGE_EFFECT_INVERT_BLACK_WHITE: + ApplyImageEffect_BlackOutline(); + ApplyImageEffect_Invert(); + ApplyImageEffect_BlackAndWhite(); + case IMAGE_EFFECT_INVERT: + ApplyImageEffect_Invert(); break; - case 11: - sub_80FCD54(); - sub_80FD06C(); - sub_80FD06C(); - sub_80FD114(); - sub_80FCCBC(); + case IMAGE_EFFECT_THICK_BLACK_WHITE: + ApplyImageEffect_BlackOutline(); + ApplyImageEffect_BlurRight(); + ApplyImageEffect_BlurRight(); + ApplyImageEffect_BlurDown(); + ApplyImageEffect_BlackAndWhite(); break; - case 13: - sub_80FCF3C(); + case IMAGE_EFFECT_SHIMMER: + ApplyImageEffect_Shimmer(); break; - case 30: - sub_80FCD54(); + case IMAGE_EFFECT_OUTLINE: + ApplyImageEffect_BlackOutline(); break; - case 32: - sub_80FD06C(); + case IMAGE_EFFECT_BLUR_RIGHT: + ApplyImageEffect_BlurRight(); break; - case 33: - sub_80FD114(); + case IMAGE_EFFECT_BLUR_DOWN: + ApplyImageEffect_BlurDown(); break; - case 6: - sub_80FCAC4(); - sub_80FC92C(3); + case IMAGE_EFFECT_GRAYSCALE_LIGHT: + ApplyImageEffect_Grayscale(); + ApplyImageEffect_RedChannelGrayscale(3); break; - case 36: - sub_80FCD54(); - sub_80FD06C(); - sub_80FD114(); - sub_80FCCBC(); - sub_80FCB5C(); - sub_80FCB5C(); - sub_80FC92C(2); - sub_80FC9E4(4); + case IMAGE_EFFECT_CHARCOAL: + ApplyImageEffect_BlackOutline(); + ApplyImageEffect_BlurRight(); + ApplyImageEffect_BlurDown(); + ApplyImageEffect_BlackAndWhite(); + ApplyImageEffect_Blur(); + ApplyImageEffect_Blur(); + ApplyImageEffect_RedChannelGrayscale(2); + ApplyImageEffect_RedChannelGrayscaleHighlight(4); break; } } -#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r)) - -void sub_80FC92C(u8 a0) // it changes palette someway somehow... .__. +void ApplyImageEffect_RedChannelGrayscale(u8 delta) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; 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* var2 = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pal = &var2[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pal++) { - if (!(0x8000 & *pal)) + if (!IS_ALPHA(*pal)) { u8 val = (31 & *pal); - val += a0; + val += delta; if (val > 31) val = 31; @@ -141,20 +150,20 @@ void sub_80FC92C(u8 a0) // it changes palette someway somehow... .__. } } -void sub_80FC9E4(u8 a0) +void ApplyImageEffect_RedChannelGrayscaleHighlight(u8 highlight) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; 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* var2 = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pal = &var2[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pal++) { - if (!(0x8000 & *pal)) + if (!IS_ALPHA(*pal)) { u8 val = (31 & *pal); - if (val > 31 - a0) - val = 31 - (a0 >> 1); + if (val > 31 - highlight) + val = 31 - (highlight >> 1); *pal = RGB2(val, val, val); } @@ -162,23 +171,23 @@ void sub_80FC9E4(u8 a0) } } -void sub_80FCAA4(void) +void ApplyImageEffect_Pointillism(void) { u32 i; for (i = 0; i < 3200; i++) - sub_80FD1C8(i); + AddPointillismPoints(i); } -void sub_80FCAC4(void) +void ApplyImageEffect_Grayscale(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; i++) { - u16* var2 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; - u16* color = &var2[gUnknown_03005DE8]; - for (j = 0; j < gUnknown_03005DF8; j++, color++) + u16* var2 = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* color = &var2[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, color++) { - if (!(0x8000 & *color)) + if (!IS_ALPHA(*color)) { *color = ConvertColorToGrayscale(color); } @@ -186,479 +195,316 @@ void sub_80FCAC4(void) } } -void sub_80FCB5C(void) +void ApplyImageEffect_Blur(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF8; i++) + for (i = 0; i < gCanvasColumnEnd; i++) { - u16* var0 = &(*gUnknown_03005DEC)[0][gUnknown_03005DFC * gUnknown_03005E04]; - u16* palette = &var0[gUnknown_03005DE8 + i]; + u16* var0 = &gCanvasPixels[gCanvasRowStart * gCanvasWidth]; + u16* palette = &var0[gCanvasColumnStart + i]; u16 color = *palette; j = 1; - palette += gUnknown_03005E04; - while (j < gUnknown_03005DF0 - 1) + palette += gCanvasWidth; + while (j < gCanvasRowEnd - 1) { - if (!(0x8000 & *palette)) + if (!IS_ALPHA(*palette)) { - *palette = sub_80FD68C(&color, palette, palette + gUnknown_03005E04); + *palette = QuantizePixel_Blur(&color, palette, palette + gCanvasWidth); color = *palette; } j++; - palette += gUnknown_03005E04; + palette += gCanvasWidth; } } } -void sub_80FCC18(u8 arg0) +void ApplyImageEffect_PersonalityColor(u8 personality) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; i++) { - u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; - u16* color = &var0[gUnknown_03005DE8]; - for (j = 0; j < gUnknown_03005DF8; j++, color++) + u16* pixelRow = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pixel = &pixelRow[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pixel++) { - if (!(0x8000 & *color)) + if (!IS_ALPHA(*pixel)) { - *color = ConvertCoolColor(color, arg0); + *pixel = ConvertCoolColor(pixel, personality); } } } } -void sub_80FCCBC(void) +void ApplyImageEffect_BlackAndWhite(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; i++) { - u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; - u16* color = &var0[gUnknown_03005DE8]; - for (j = 0; j < gUnknown_03005DF8; j++, color++) + u16* pixelRow = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pixel = &pixelRow[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pixel++) { - if (!(0x8000 & *color)) + if (!IS_ALPHA(*pixel)) { - *color = ConvertToBlackOrWhite(color); + *pixel = QuantizePixel_BlackAndWhite(pixel); } } } } -void sub_80FCD54(void) +void ApplyImageEffect_BlackOutline(void) { u8 i, j; - u16 *palette; + u16 *pixel; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; 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++) + u16* pixelRow = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + pixel = &pixelRow[gCanvasColumnStart]; + *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1); + for (j = 1, pixel = pixel + 1; j < gCanvasColumnEnd - 1; j++, pixel++) { - *palette = sub_80FD50C(palette, palette + 1); - *palette = sub_80FD50C(palette, palette - 1); + *pixel = QuantizePixel_BlackOutline(pixel, pixel + 1); + *pixel = QuantizePixel_BlackOutline(pixel, pixel - 1); } - *palette = sub_80FD50C(palette, palette - 1); + *pixel = QuantizePixel_BlackOutline(pixel, pixel - 1); } - for (j = 0; j < gUnknown_03005DF8; j++) + for (j = 0; j < gCanvasColumnEnd; 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) + u16* var0 = &gCanvasPixels[gCanvasRowStart * gCanvasWidth]; + pixel = &var0[gCanvasColumnStart + j]; + *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth); + for (i = 1, pixel = pixel + gCanvasWidth; i < gCanvasRowEnd - 1; i++, pixel += gCanvasWidth) { - *palette = sub_80FD50C(palette, palette + gUnknown_03005E04); - *palette = sub_80FD50C(palette, palette - gUnknown_03005E04); + *pixel = QuantizePixel_BlackOutline(pixel, pixel + gCanvasWidth); + *pixel = QuantizePixel_BlackOutline(pixel, pixel - gCanvasWidth); } - *palette = sub_80FD50C(palette, palette - gUnknown_03005E04); + *pixel = QuantizePixel_BlackOutline(pixel, pixel - gCanvasWidth); } } -void sub_80FCEA4(void) +void ApplyImageEffect_Invert(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; i++) { - u16* var0 = &(*gUnknown_03005DEC)[0][(gUnknown_03005DFC + i) * gUnknown_03005E04]; - u16* color = &var0[gUnknown_03005DE8]; - for (j = 0; j < gUnknown_03005DF8; j++, color++) + u16* pixelRow = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pixel = &pixelRow[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pixel++) { - if (!(0x8000 & *color)) + if (!IS_ALPHA(*pixel)) { - *color = InvertColor(color); + *pixel = QuantizePixel_Invert(pixel); } } } } -void sub_80FCF3C(void) +void ApplyImageEffect_Shimmer(void) { u8 i, j; - u16 *palette; + u16 *pixel; u16 color; - palette = (*gUnknown_03005DEC)[0]; + pixel = gCanvasPixels; for (i = 0; i < 64; i++) { - for (j = 0; j < 64; j++, palette++) + for (j = 0; j < 64; j++, pixel++) { - if (!(0x8000 & *palette)) + if (!IS_ALPHA(*pixel)) { - *palette = InvertColor(palette); + *pixel = QuantizePixel_Invert(pixel); } } } 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) + pixel = &gCanvasPixels[j]; + color = *pixel; + *pixel = RGB_ALPHA; + for (i = 1, pixel += 64; i < 63; i++, pixel += 64) { - if (!(0x8000 & *palette)) + if (!IS_ALPHA(*pixel)) { - *palette = sub_80FD7AC(&color, palette, palette + 64); - color = *palette; + *pixel = QuantizePixel_BlurHard(&color, pixel, pixel + 64); + color = *pixel; } } - *palette = 0x8000; - palette = &(*gUnknown_03005DEC)[0][j]; - color = *palette; - *palette = 0x8000; - for (i = 1, palette += 64; i < 63; i++, palette += 64) + *pixel = RGB_ALPHA; + pixel = &gCanvasPixels[j]; + color = *pixel; + *pixel = RGB_ALPHA; + for (i = 1, pixel += 64; i < 63; i++, pixel += 64) { - if (!(0x8000 & *palette)) + if (!IS_ALPHA(*pixel)) { - *palette = sub_80FD7AC(&color, palette, palette + 64); - color = *palette; + *pixel = QuantizePixel_BlurHard(&color, pixel, pixel + 64); + color = *pixel; } } - *palette = 0x8000; + *pixel = RGB_ALPHA; } - palette = (*gUnknown_03005DEC)[0]; + pixel = gCanvasPixels; for (i = 0; i < 64; i++) { - for (j = 0; j < 64; j++, palette++) + for (j = 0; j < 64; j++, pixel++) { - if (!(0x8000 & *palette)) + if (!IS_ALPHA(*pixel)) { - *palette = InvertColor(palette); + *pixel = QuantizePixel_Invert(pixel); } } } } -void sub_80FD06C(void) +void ApplyImageEffect_BlurRight(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; 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++) + u16* pixelRow = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pixel = &pixelRow[gCanvasColumnStart]; + u16 color = *pixel; + for (j = 1, pixel++; j < gCanvasColumnEnd - 1; j++, pixel++) { - if (!(0x8000 & *palette)) + if (!IS_ALPHA(*pixel)) { - *palette = sub_80FD568(&color, palette); - color = *palette; + *pixel = QuantizePixel_MotionBlur(&color, pixel); + color = *pixel; } } } } -void sub_80FD114(void) +void ApplyImageEffect_BlurDown(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF8; i++) + for (i = 0; i < gCanvasColumnEnd; 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) + u16* pixelRow = &gCanvasPixels[gCanvasRowStart * gCanvasWidth]; + u16* pixel = &pixelRow[gCanvasColumnStart + i]; + u16 prevPixel = *pixel; + for (j = 1, pixel += gCanvasWidth; j < gCanvasRowEnd - 1; j++, pixel += gCanvasWidth) { - if (!(0x8000 & *palette)) + if (!IS_ALPHA(*pixel)) { - *palette = sub_80FD568(&color, palette); - color = *palette; + *pixel = QuantizePixel_MotionBlur(&prevPixel, pixel); + prevPixel = *pixel; } } } } -NAKED -void sub_80FD1C8(u16 arg0) +struct PointillismPoint +{ + u8 column; + u8 row; + u16 delta; +}; + +void AddPointillismPoints(u16 point) { - 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"); + u8 i; + bool8 offsetDownLeft; + u8 colorType; + struct PointillismPoint points[6]; + + points[0].column = sPointillismPoints[point][0]; + points[0].row = sPointillismPoints[point][1]; + points[0].delta = GET_POINT_DELTA(sPointillismPoints[point][2]); + + colorType = GET_POINT_COLOR_TYPE(sPointillismPoints[point][2]); + offsetDownLeft = GET_POINT_OFFSET_DL(sPointillismPoints[point][2]); + for (i = 1; i < points[0].delta; i++) + { + if (!offsetDownLeft) + { + points[i].column = points[0].column - i; + points[i].row = points[0].row + i; + } + else + { + points[i].column = points[0].column + 1; + points[i].row = points[0].row - 1; + } + + if (points[i].column >= MAX_DIMENSION || points[i].row >= MAX_DIMENSION) + { + points[0].delta = i - 1; + break; + } + + points[i].delta = points[0].delta - i; + } + + for (i = 0; i < points[0].delta; i++) + { + u16 *pixel = &gCanvasPixels[points[i].row * MAX_DIMENSION] + points[i].column; + + if (!IS_ALPHA(*pixel)) + { + u16 red = GET_R(*pixel); + u16 green = GET_G(*pixel); + u16 blue = GET_B(*pixel); + + switch (colorType) + { + case 0: + case 1: + switch (GET_POINT_DELTA(sPointillismPoints[point][2]) % 3) + { + case 0: + if (red >= points[i].delta) + red -= points[i].delta; + else + red = 0; + break; + case 1: + if (green >= points[i].delta) + green -= points[i].delta; + else + green = 0; + break; + case 2: + if (blue >= points[i].delta) + blue -= points[i].delta; + else + blue = 0; + break; + } + break; + case 2: + case 3: + red += points[i].delta; + green += points[i].delta; + blue += points[i].delta; + if (red > 31) + red = 31; + if (green > 31) + green = 31; + if (blue > 31) + blue = 31; + break; + } + + *pixel = RGB2(red, green, blue); + } + } } u16 ConvertColorToGrayscale(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); u16 average = (red + green + blue) / 3; return RGB2(average, average, average); } @@ -667,13 +513,13 @@ u16 ConvertColorToGrayscale(u16 *color) // Everything else is white. u16 ConvertCoolColor(u16 *color, u8 personality) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); if (red < 17 && green < 17 && blue < 17) return GetCoolColorFromPersonality(personality); else - return RGB2(31, 31, 31); + return RGB_WHITE; } // Based on the given value, which comes from the first 8 bits of @@ -729,37 +575,37 @@ u16 GetCoolColorFromPersonality(u8 personality) return RGB2(red, green, blue); } -u16 ConvertToBlackOrWhite(u16 *color) +u16 QuantizePixel_BlackAndWhite(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); if (red < 17 && green < 17 && blue < 17) - return RGB2(0, 0, 0); + return RGB_BLACK; else - return RGB2(31, 31, 31); + return RGB_WHITE; } -u16 sub_80FD50C(u16 *colorA, u16 *colorB) +u16 QuantizePixel_BlackOutline(u16 *colorA, u16 *colorB) { if (*colorA) { - if (*colorA & 0x8000) - return 0x8000; - if (*colorB & 0x8000) - return RGB2(0, 0, 0); + if (IS_ALPHA(*colorA)) + return RGB_ALPHA; + if (IS_ALPHA(*colorB)) + return RGB_BLACK; return *colorA; } - return RGB2(0, 0, 0); + return RGB_BLACK; } -u16 InvertColor(u16 *color) +u16 QuantizePixel_Invert(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); red = 31 - red; green = 31 - green; blue = 31 - blue; @@ -767,63 +613,63 @@ u16 InvertColor(u16 *color) return RGB2(red, green, blue); } -u16 sub_80FD568(u16 *a0, u16 *a1) +u16 QuantizePixel_MotionBlur(u16 *prevPixel, u16 *curPixel) { - u16 sp0[2][3]; - u16 spC[3]; - u8 r4; - u16 r2; + u16 pixelChannels[2][3]; + u16 diffs[3]; + u8 i; + u16 largestDiff; u16 r, g, b; - if (*a0 == *a1) - return *a1; + if (*prevPixel == *curPixel) + return *curPixel; - 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; + pixelChannels[0][0] = GET_R(*prevPixel); + pixelChannels[0][1] = GET_G(*prevPixel); + pixelChannels[0][2] = GET_B(*prevPixel); + pixelChannels[1][0] = GET_R(*curPixel); + pixelChannels[1][1] = GET_G(*curPixel); + pixelChannels[1][2] = GET_B(*curPixel); - 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; + if (pixelChannels[0][0] > 25 && pixelChannels[0][1] > 25 && pixelChannels[0][2] > 25) + return *curPixel; + if (pixelChannels[1][0] > 25 && pixelChannels[1][1] > 25 && pixelChannels[1][2] > 25) + return *curPixel; - for (r4 = 0; r4 < 3; r4++) + for (i = 0; i < 3; i++) { - if (sp0[0][r4] > sp0[1][r4]) - spC[r4] = sp0[0][r4] - sp0[1][r4]; + if (pixelChannels[0][i] > pixelChannels[1][i]) + diffs[i] = pixelChannels[0][i] - pixelChannels[1][i]; else - spC[r4] = sp0[1][r4] - sp0[0][r4]; + diffs[i] = pixelChannels[1][i] - pixelChannels[0][i]; } - if (spC[0] >= spC[1]) + if (diffs[0] >= diffs[1]) { - if (spC[0] >= spC[2]) - r2 = spC[0]; - else if (spC[1] >= spC[2]) - r2 = spC[1]; + if (diffs[0] >= diffs[2]) + largestDiff = diffs[0]; + else if (diffs[1] >= diffs[2]) + largestDiff = diffs[1]; else - r2 = spC[2]; + largestDiff = diffs[2]; } else { - if (spC[1] >= spC[2]) - r2 = spC[1]; - else if (spC[2] >= spC[0]) - r2 = spC[2]; + if (diffs[1] >= diffs[2]) + largestDiff = diffs[1]; + else if (diffs[2] >= diffs[0]) + largestDiff = diffs[2]; else - r2 = spC[0]; + largestDiff = diffs[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; + r = (pixelChannels[1][0] * (31 - largestDiff / 2)) / 31; + g = (pixelChannels[1][1] * (31 - largestDiff / 2)) / 31; + b = (pixelChannels[1][2] * (31 - largestDiff / 2)) / 31; return RGB2(r, g, b); } -u16 sub_80FD68C(u16 * a0, u16 * a1, u16 * a2) +u16 QuantizePixel_Blur(u16 *prevPixel, u16 *curPixel, u16 *nextPixel) { u16 red, green, blue; u16 avg0, avg1, avg2; @@ -831,19 +677,19 @@ u16 sub_80FD68C(u16 * a0, u16 * a1, u16 * a2) u32 minimum; u16 factor; - if (*a0 == *a1 && *a2 == *a1) - return *a1; + if (*prevPixel == *curPixel && *nextPixel == *curPixel) + return *curPixel; - red = (*a1 >> 0) & 0x1F; - green = (*a1 >> 5) & 0x1F; - blue = (*a1 >> 10) & 0x1F; + red = GET_R(*curPixel); + green = GET_G(*curPixel); + blue = GET_B(*curPixel); - 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; + avg0 = ((GET_R(*prevPixel)) + (GET_G(*prevPixel)) + (GET_B(*prevPixel))) / 3; + avg1 = ((GET_R(*curPixel)) + (GET_G(*curPixel)) + (GET_B(*curPixel))) / 3; + avg2 = ((GET_R(*nextPixel)) + (GET_G(*nextPixel)) + (GET_B(*nextPixel))) / 3; if (avg0 == avg1 && avg2 == avg1) - return *a1; + return *curPixel; if (avg0 > avg1) diff1 = avg0 - avg1; @@ -867,7 +713,7 @@ u16 sub_80FD68C(u16 * a0, u16 * a1, u16 * a2) return RGB2(red, green, blue); } -u16 sub_80FD7AC(u16 *a0, u16 *a1, u16 *a2) +u16 QuantizePixel_BlurHard(u16 *prevPixel, u16 *curPixel, u16 *nextPixel) { u16 red, green, blue; u16 avg0, avg1, avg2; @@ -875,19 +721,19 @@ u16 sub_80FD7AC(u16 *a0, u16 *a1, u16 *a2) u32 minimum; u16 factor; - if (*a0 == *a1 && *a2 == *a1) - return *a1; + if (*prevPixel == *curPixel && *nextPixel == *curPixel) + return *curPixel; - red = (*a1 >> 0) & 0x1F; - green = (*a1 >> 5) & 0x1F; - blue = (*a1 >> 10) & 0x1F; + red = GET_R(*curPixel); + green = GET_G(*curPixel); + blue = GET_B(*curPixel); - 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; + avg0 = ((GET_R(*prevPixel)) + (GET_G(*prevPixel)) + (GET_B(*prevPixel))) / 3; + avg1 = ((GET_R(*curPixel)) + (GET_G(*curPixel)) + (GET_B(*curPixel))) / 3; + avg2 = ((GET_R(*nextPixel)) + (GET_G(*nextPixel)) + (GET_B(*nextPixel))) / 3; if (avg0 == avg1 && avg2 == avg1) - return *a1; + return *curPixel; if (avg0 > avg1) diff1 = avg0 - avg1; @@ -911,318 +757,141 @@ u16 sub_80FD7AC(u16 *a0, u16 *a1, u16 *a2) return RGB2(red, green, blue); } -/* -void sub_80FD8CC(struct ImageProcessingContext * a0) +void ConvertImageProcessingToGBA(struct ImageProcessingContext *context) { 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) + u16 *src, *dest, *src_, *dest_; + u16 width, height; + + width = context->canvasWidth >> 3; + height = context->canvasHeight >> 3; + src_ = context->canvasPixels; + dest_ = context->dest; + + if (context->bgType == 2) { - for (i = 0; i < sp08; i++) + for (i = 0; i < height; i++) { - for (j = 0; j < r5; j++) + for (j = 0; j < width; 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); + dest = dest_ + ((i * width + j) << 5) + (k << 2); + src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3); + + dest[0] = src[0] | (src[1] << 8); + dest[1] = src[2] | (src[3] << 8); + dest[2] = src[4] | (src[5] << 8); + dest[3] = src[6] | (src[7] << 8); } } } } else { - for (i = 0; i < sp08; i++) + for (i = 0; i < height; i++) { - for (j = 0; j < r5; j++) + for (j = 0; j < width; 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); + dest = dest_ + ((i * width + j) << 4) + (k << 1); + src = src_ + ((((i << 3) + k) << 3) * width) + (j << 3); + + dest[0] = src[0] | (src[1] << 4) | (src[2] << 8) | (src[3] << 12); + dest[1] = src[4] | (src[5] << 4) | (src[6] << 8) | (src[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) +void ApplyImageProcessingQuantization(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) + gCanvasPaletteStart = arg0->paletteStart * 16; + gCanvasPalette = &arg0->canvasPalette[gCanvasPaletteStart]; + gCanvasPixels = arg0->canvasPixels; + gCanvasColumnStart = arg0->columnStart; + gCanvasRowStart = arg0->rowStart; + gCanvasColumnEnd = arg0->columnEnd; + gCanvasRowEnd = arg0->rowEnd; + gCanvasWidth = arg0->canvasWidth; + gCanvasHeight = arg0->canvasHeight; + + switch (arg0->quantizeEffect) { - case 0: - sub_80FDC18(FALSE); + case QUANTIZE_EFFECT_STANDARD: + QuantizePalette_Standard(FALSE); break; - case 1: - sub_80FDC18(TRUE); + case QUANTIZE_EFFECT_STANDARD_LIMITED_COLORS: + QuantizePalette_Standard(TRUE); break; - case 2: - sub_80FDAE4(); - sub_80FDF88(); + case QUANTIZE_EFFECT_PRIMARY_COLORS: + SetPresetPalette_PrimaryColors(); + QuantizePalette_PrimaryColors(); break; - case 3: - sub_80FDBE4(); - sub_80FDED8(); + case QUANTIZE_EFFECT_GRAYSCALE: + SetPresetPalette_Grayscale(); + QuantizePalette_Grayscale(); break; - case 4: - sub_80FDBA8(); - sub_80FDE28(); + case QUANTIZE_EFFECT_GRAYSCALE_SMALL: + SetPresetPalette_GrayscaleSmall(); + QuantizePalette_GrayscaleSmall(); break; - case 5: - sub_80FDB8C(); - sub_80FDD70(); + case QUANTIZE_EFFECT_BLACK_WHITE: + SetPresetPalette_BlackAndWhite(); + QuantizePalette_BlackAndWhite(); break; } } -void sub_80FDAE4(void) +void SetPresetPalette_PrimaryColors(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); + gCanvasPalette[0] = RGB_BLACK; + gCanvasPalette[1] = RGB2(6, 6, 6); + gCanvasPalette[2] = RGB2(29, 29, 29); + gCanvasPalette[3] = RGB2(11, 11, 11); + gCanvasPalette[4] = RGB2(29, 6, 6); + gCanvasPalette[5] = RGB2(6, 29, 6); + gCanvasPalette[6] = RGB2(6, 6, 29); + gCanvasPalette[7] = RGB2(29, 29, 6); + gCanvasPalette[8] = RGB2(29, 6, 29); + gCanvasPalette[9] = RGB2(6, 29, 29); + gCanvasPalette[10] = RGB2(29, 11, 6); + gCanvasPalette[11] = RGB2(11, 29, 6); + gCanvasPalette[12] = RGB2(6, 11, 29); + gCanvasPalette[13] = RGB2(29, 6, 11); + gCanvasPalette[14] = RGB2(6, 29, 11); + gCanvasPalette[15] = RGB2(11, 6, 29); } -void sub_80FDB8C(void) +void SetPresetPalette_BlackAndWhite(void) { - gUnknown_03005E08[0] = RGB2(0, 0, 0); - gUnknown_03005E08[1] = RGB2(0, 0, 0); - gUnknown_03005E08[2] = RGB2(31, 31, 31); + gCanvasPalette[0] = RGB_BLACK; + gCanvasPalette[1] = RGB_BLACK; + gCanvasPalette[2] = RGB_WHITE; } -void sub_80FDBA8(void) +void SetPresetPalette_GrayscaleSmall(void) { u8 i; - gUnknown_03005E08[0] = RGB2(0, 0, 0); - gUnknown_03005E08[1] = RGB2(0, 0, 0); + gCanvasPalette[0] = RGB_BLACK; + gCanvasPalette[1] = RGB_BLACK; for (i = 0; i < 14; i++) - gUnknown_03005E08[i + 2] = RGB2(2 * (i + 2), 2 * (i + 2), 2 * (i + 2)); + gCanvasPalette[i + 2] = RGB2(2 * (i + 2), 2 * (i + 2), 2 * (i + 2)); } -void sub_80FDBE4(void) +void SetPresetPalette_Grayscale(void) { u8 i; - gUnknown_03005E08[0] = RGB2(0, 0, 0); + gCanvasPalette[0] = RGB_BLACK; for (i = 0; i < 32; i++) - gUnknown_03005E08[i + 1] = RGB2(i, i, i); + gCanvasPalette[i + 1] = RGB2(i, i, i); } -void sub_80FDC18(bool8 arg0) +void QuantizePalette_Standard(bool8 arg0) { u8 i, j; u16 maxIndex; @@ -1232,44 +901,44 @@ void sub_80FDC18(bool8 arg0) maxIndex = 0xFF; for (j = 0; j < maxIndex; j++) - gUnknown_03005E08[j] = 0; + gCanvasPalette[j] = 0; - gUnknown_03005E08[maxIndex] = RGB2(15, 15, 15); - for (i = 0; i < gUnknown_03005DF0; i++) + gCanvasPalette[maxIndex] = RGB2(15, 15, 15); + for (i = 0; i < gCanvasRowEnd; 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* var2 = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pal = &var2[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pal++) { - if (*pal & 0x8000) + if (IS_ALPHA(*pal)) { - *pal = gUnknown_03005E0C; + *pal = gCanvasPaletteStart; } else { - u16 color = sub_80FE038(pal); + u16 color = QuantizePixel_Standard(pal); u8 curIndex = 1; if (curIndex < maxIndex) { - if (gUnknown_03005E08[curIndex] == RGB_BLACK) + if (gCanvasPalette[curIndex] == RGB_BLACK) { - gUnknown_03005E08[curIndex] = color; - *pal = gUnknown_03005E0C + curIndex; + gCanvasPalette[curIndex] = color; + *pal = gCanvasPaletteStart + curIndex; } else { while (curIndex < maxIndex) { - if (gUnknown_03005E08[curIndex] == RGB_BLACK) + if (gCanvasPalette[curIndex] == RGB_BLACK) { - gUnknown_03005E08[curIndex] = color; - *pal = gUnknown_03005E0C + curIndex; + gCanvasPalette[curIndex] = color; + *pal = gCanvasPaletteStart + curIndex; break; } - if (gUnknown_03005E08[curIndex] == color) + if (gCanvasPalette[curIndex] == color) { - *pal = gUnknown_03005E0C + curIndex; + *pal = gCanvasPaletteStart + curIndex; break; } @@ -1288,90 +957,90 @@ void sub_80FDC18(bool8 arg0) } } -void sub_80FDD70(void) +void QuantizePalette_BlackAndWhite(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; 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* var2 = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pal = &var2[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pal++) { - if (*pal & 0x8000) + if (IS_ALPHA(*pal)) { - *pal = gUnknown_03005E0C; + *pal = gCanvasPaletteStart; } else { - if (ConvertToBlackOrWhite(pal) == RGB_BLACK) - *pal = gUnknown_03005E0C + 1; + if (QuantizePixel_BlackAndWhite(pal) == RGB_BLACK) + *pal = gCanvasPaletteStart + 1; else - *pal = gUnknown_03005E0C + 2; + *pal = gCanvasPaletteStart + 2; } } } } -void sub_80FDE28(void) +void QuantizePalette_GrayscaleSmall(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; 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* var2 = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pal = &var2[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pal++) { - if (*pal & 0x8000) - *pal = gUnknown_03005E0C; + if (IS_ALPHA(*pal)) + *pal = gCanvasPaletteStart; else - *pal = sub_80FE17C(pal) + gUnknown_03005E0C; + *pal = QuantizePixel_GrayscaleSmall(pal) + gCanvasPaletteStart; } } } -void sub_80FDED8(void) +void QuantizePalette_Grayscale(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; 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* var2 = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pal = &var2[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pal++) { - if (*pal & 0x8000) - *pal = gUnknown_03005E0C; + if (IS_ALPHA(*pal)) + *pal = gCanvasPaletteStart; else - *pal = sub_80FE1B0(pal) + gUnknown_03005E0C; + *pal = QuantizePixel_Grayscale(pal) + gCanvasPaletteStart; } } } -void sub_80FDF88(void) +void QuantizePalette_PrimaryColors(void) { u8 i, j; - for (i = 0; i < gUnknown_03005DF0; i++) + for (i = 0; i < gCanvasRowEnd; 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* var2 = &gCanvasPixels[(gCanvasRowStart + i) * gCanvasWidth]; + u16* pal = &var2[gCanvasColumnStart]; + for (j = 0; j < gCanvasColumnEnd; j++, pal++) { - if (*pal & 0x8000) - *pal = gUnknown_03005E0C; + if (IS_ALPHA(*pal)) + *pal = gCanvasPaletteStart; else - *pal = sub_80FE0AC(pal) + gUnknown_03005E0C; + *pal = QuantizePixel_PrimaryColors(pal) + gCanvasPaletteStart; } } } -u16 sub_80FE038(u16 *color) +u16 QuantizePixel_Standard(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); if (red & 3) red = (red & 0x1C) + 4; @@ -1398,11 +1067,11 @@ u16 sub_80FE038(u16 *color) return RGB2(red, green, blue); } -u16 sub_80FE0AC(u16* color) +u16 QuantizePixel_PrimaryColors(u16* color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); if (red < 12 && green < 11 && blue < 11) return 1; @@ -1513,11 +1182,11 @@ u16 sub_80FE0AC(u16* color) return 3; } -u16 sub_80FE17C(u16 *color) +u16 QuantizePixel_GrayscaleSmall(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); u16 average = ((red + green + blue) / 3) & 0x1E; if (average == 0) return 1; @@ -1525,11 +1194,11 @@ u16 sub_80FE17C(u16 *color) return average / 2; } -u16 sub_80FE1B0(u16 *color) +u16 QuantizePixel_Grayscale(u16 *color) { - u16 red = *color & 0x1F; - u16 green = (*color >> 5) & 0x1F; - u16 blue = (*color >> 10) & 0x1F; + u16 red = GET_R(*color); + u16 green = GET_G(*color); + u16 blue = GET_B(*color); u16 average = (red + green + blue) / 3; return average + 1; } diff --git a/src/main_menu.c b/src/main_menu.c index 3237663a5..7160bf3e7 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -1424,8 +1424,8 @@ u8 CreateAzurillSprite(u8 x, u8 y) &gMonFrontPicTable[SPECIES_AZURILL], gMonFrontPicCoords[SPECIES_AZURILL].coords, gMonFrontPicCoords[SPECIES_AZURILL].y_offset, - gUnknown_081FAF4C[0], - gUnknown_081FAF4C[1], + gMonSpriteGfx_Sprite_ptr[0], + gMonSpriteGfx_Sprite_ptr[1], SPECIES_AZURILL); LoadCompressedObjectPalette(&gMonPaletteTable[SPECIES_AZURILL]); GetMonSpriteTemplate_803C56C(SPECIES_AZURILL, 1); diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c index cb3d8789e..99f381c5c 100644 --- a/src/pokeblock_feed.c +++ b/src/pokeblock_feed.c @@ -616,7 +616,7 @@ static bool8 sub_8147B20(struct Pokemon* mon) case 0: species = GetMonData(mon, MON_DATA_SPECIES2); PiD = GetMonData(mon, MON_DATA_PERSONALITY); - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, EWRAM, gUnknown_081FAF4C[1], species, PiD); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, EWRAM, gMonSpriteGfx_Sprite_ptr[1], species, PiD); ewram1FFFF++; break; case 1: diff --git a/src/pokemon_3.c b/src/pokemon_3.c index 16c2f3738..2e71154b9 100644 --- a/src/pokemon_3.c +++ b/src/pokemon_3.c @@ -473,7 +473,7 @@ u16 SpeciesToCryId(u16 species) void unref_sub_803F938(u16 species, u32 personality, u8 *dest) { - if (species == SPECIES_SPINDA && dest != gUnknown_081FAF4C[0] && dest != gUnknown_081FAF4C[2]) + if (species == SPECIES_SPINDA && dest != gMonSpriteGfx_Sprite_ptr[0] && dest != gMonSpriteGfx_Sprite_ptr[2]) { int i; for (i = 0; i < 4; i++) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 9d1aa99db..3ed7cee56 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1839,7 +1839,7 @@ static u8 SummaryScreen_LoadPokemonSprite(struct Pokemon *mon, u8 *state) gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, ewram_addr, - gUnknown_081FAF4C[1], + gMonSpriteGfx_Sprite_ptr[1], species, personality); *state += 1; diff --git a/src/script_pokemon_util_80C4BF0.c b/src/script_pokemon_util_80C4BF0.c index ff82adf74..c1d226958 100644 --- a/src/script_pokemon_util_80C4BF0.c +++ b/src/script_pokemon_util_80C4BF0.c @@ -287,8 +287,8 @@ void ShowContestEntryMonPic(void) &gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, - (u32)gUnknown_081FAF4C[0], - gUnknown_081FAF4C[1], + (u32)gMonSpriteGfx_Sprite_ptr[0], + gMonSpriteGfx_Sprite_ptr[1], species, var1); palette = GetMonSpritePalStructFromOtIdPersonality(species, var2, var1); diff --git a/src/starter_choose.c b/src/starter_choose.c index 4e430015e..24ba70279 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -714,7 +714,7 @@ static u8 CreatePokemonFrontSprite(u16 species, u8 x, u8 y) DecompressPicFromTable_2( &gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, - gUnknown_081FAF4C[0], gUnknown_081FAF4C[1], + gMonSpriteGfx_Sprite_ptr[0], gMonSpriteGfx_Sprite_ptr[1], species); LoadCompressedObjectPalette(&gMonPaletteTable[species]); GetMonSpriteTemplate_803C56C(species, 1); diff --git a/src/text.c b/src/text.c index d963045df..20adca6bd 100644 --- a/src/text.c +++ b/src/text.c @@ -1480,7 +1480,7 @@ const struct WindowTemplate gWindowTemplate_81E7144 = BG_SCREEN_ADDR(31), // tilemap }; -const struct WindowTemplate gWindowTemplate_81E7160 = +const struct WindowTemplate gWindowTemplate_ContestPainting = { 1, // BG number 1, // BG character base block diff --git a/src/trade.c b/src/trade.c index aeb77dd58..06a65e33a 100644 --- a/src/trade.c +++ b/src/trade.c @@ -3522,7 +3522,7 @@ static void sub_804B2D0(u8 whichParty, u8 a1) case 0: species = GetMonData(pokemon, MON_DATA_SPECIES2); personality = GetMonData(pokemon, MON_DATA_PERSONALITY); - HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gSharedMem, gUnknown_081FAF4C[whichParty * 2 + 1], species, personality); + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gSharedMem, gMonSpriteGfx_Sprite_ptr[whichParty * 2 + 1], species, personality); LoadCompressedObjectPalette(GetMonSpritePalStruct(pokemon)); gUnknown_03004828->tradeSpecies[whichParty] = species; break; diff --git a/src/trainer_card.c b/src/trainer_card.c index 0e44c7cfc..3e653a5d9 100644 --- a/src/trainer_card.c +++ b/src/trainer_card.c @@ -70,7 +70,7 @@ const struct TrainerCard sTestTrainerCard = .stars = 4, .hasPokedex = TRUE, .var_3 = TRUE, - .var_4 = TRUE, + .canvasPixels = TRUE, .firstHallOfFameA = 999, .firstHallOfFameB = 99, .firstHallOfFameC = 99, |