summaryrefslogtreecommitdiff
path: root/src/pokeblock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pokeblock.c')
-rw-r--r--src/pokeblock.c1147
1 files changed, 1147 insertions, 0 deletions
diff --git a/src/pokeblock.c b/src/pokeblock.c
new file mode 100644
index 000000000..6804f55d6
--- /dev/null
+++ b/src/pokeblock.c
@@ -0,0 +1,1147 @@
+#include "global.h"
+#include "overworld.h"
+#include "sprite.h"
+#include "script.h"
+#include "strings.h"
+#include "task.h"
+#include "scanline_effect.h"
+#include "text.h"
+#include "main.h"
+#include "menu.h"
+#include "field_fadetransition.h"
+#include "palette.h"
+#include "graphics.h"
+#include "decompress.h"
+#include "menu_helpers.h"
+#include "battle.h"
+#include "item_menu.h"
+#include "item_use.h"
+#include "item.h"
+#include "constants/items.h"
+#include "sound.h"
+#include "constants/songs.h"
+#include "safari_zone.h"
+#include "event_data.h"
+#include "pokeblock.h"
+#include "ewram.h"
+
+struct UnkPokeblockStruct
+{
+ u8 unk0;
+ u8 unk1;
+ u8 unk2;
+ u8 unk3;
+};
+
+static EWRAM_DATA u8 gUnknown_02039244 = 0;
+static EWRAM_DATA struct UnkPokeblockStruct gUnknown_02039248 = {0};
+static EWRAM_DATA u8 gUnknown_0203924C = 0;
+
+// function declarations
+
+// gUnknown_083F7EF4
+static void sub_810C508(u8);
+static void sub_810C5C0(u8);
+static void sub_810C748(u8);
+static void sub_810C788(u8);
+static void sub_810C854(u8);
+
+// gUnknown_083F7F24
+static void sub_810C610(u8);
+static void sub_810C668(u8);
+
+// sub_810B6C0
+static bool8 sub_810B998(void);
+static void sub_810BC98(void);
+static void sub_810BD08(void);
+static void sub_810BB0C(void);
+static void sub_810BB30(void);
+static void sub_810BC84(u8);
+
+// sub_810B96C
+static void sub_810BF7C(u8);
+
+// sub_810BC84
+static void sub_810BDAC(bool8);
+
+// sub_810BF38
+static void sub_810C8D4(struct Sprite *);
+
+// sub_810BF7C
+static void sub_810C0C8(u8);
+static void sub_810C31C(u8);
+static void sub_810C368(u8);
+
+// sub_810C0C8
+static void sub_810C1C8(u8, u8);
+static void sub_810C23C(u8);
+
+// sub_810C368
+static void sub_810C40C(u8);
+
+// sub_810C540
+static void sub_810C5EC(u8);
+
+// sub_810C610
+static void sub_810C704(u8);
+
+static const u8 *gUnknown_03000758;
+
+// rodata
+
+#define GFX_TAG_POKEBLOCK_CASE 14800
+
+const s8 gPokeblockFlavorCompatibilityTable[] =
+{
+ // Cool, Beauty, Cute, Smart, Tough
+ 0, 0, 0, 0, 0, // Hardy
+ 1, 0, 0, 0, -1, // Lonely
+ 1, 0, -1, 0, 0, // Brave
+ 1, -1, 0, 0, 0, // Adamant
+ 1, 0, 0, -1, 0, // Naughty
+ -1, 0, 0, 0, 1, // Bold
+ 0, 0, 0, 0, 0, // Docile
+ 0, 0, -1, 0, 1, // Relaxed
+ 0, -1, 0, 0, 1, // Impish
+ 0, 0, 0, -1, 1, // Lax
+ -1, 0, 1, 0, 0, // Timid
+ 0, 0, 1, 0, -1, // Hasty
+ 0, 0, 0, 0, 0, // Serious
+ 0, -1, 1, 0, 0, // Jolly
+ 0, 0, 1, -1, 0, // Naive
+ -1, 1, 0, 0, 0, // Modest
+ 0, 1, 0, 0, -1, // Mild
+ 0, 1, -1, 0, 0, // Quiet
+ 0, 0, 0, 0, 0, // Bashful
+ 0, 1, 0, -1, 0, // Rash
+ -1, 0, 0, 1, 0, // Calm
+ 0, 0, 0, 1, -1, // Gentle
+ 0, 0, -1, 1, 0, // Sassy
+ 0, -1, 0, 1, 0, // Careful
+ 0, 0, 0, 0, 0 // Quirky
+};
+
+void (*const gUnknown_083F7EA8[])(void) =
+{
+ sub_80A5B40,
+ c2_exit_to_overworld_2_switch,
+ sub_802E424,
+ c2_exit_to_overworld_2_switch
+};
+
+const u8 *const gPokeblockNames[] =
+{
+ NULL,
+ ContestStatsText_RedPokeBlock,
+ ContestStatsText_BluePokeBlock,
+ ContestStatsText_PinkPokeBlock,
+ ContestStatsText_GreenPokeBlock,
+ ContestStatsText_YellowPokeBlock,
+ ContestStatsText_PurplePokeBlock,
+ ContestStatsText_IndigoPokeBlock,
+ ContestStatsText_BrownPokeBlock,
+ ContestStatsText_LiteBluePokeBlock,
+ ContestStatsText_OlivePokeBlock,
+ ContestStatsText_GrayPokeBlock,
+ ContestStatsText_BlackPokeBlock,
+ ContestStatsText_WhitePokeBlock,
+ ContestStatsText_GoldPokeBlock
+};
+
+const struct MenuAction2 gUnknown_083F7EF4[] =
+{
+ {OtherText_Use, sub_810C508},
+ {OtherText_Toss, sub_810C5C0},
+ {gOtherText_CancelNoTerminator, sub_810C748},
+ {OtherText_Use, sub_810C788},
+ {OtherText_Use, sub_810C854},
+};
+
+const u8 gUnknown_083F7F1C[] = {0, 1, 2};
+const u8 gUnknown_083F7F1F[] = {3, 2};
+const u8 gUnknown_083F7F21[] = {4, 2};
+
+const struct YesNoFuncTable gUnknown_083F7F24 = {sub_810C610, sub_810C668};
+
+const u8 UnreferencedData_083F7F2C[] = {0x16, 0x17, 0x18, 0x21, 0x2f};
+
+const struct OamData gOamData_83F7F34 =
+{
+ .size = 3,
+ .priority = 2
+};
+
+const union AnimCmd gSpriteAnim_83F7F3C[] =
+{
+ ANIMCMD_FRAME(.imageValue = 0, .duration = 0),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gSpriteAnimTable_83F7F44[] =
+{
+ gSpriteAnim_83F7F3C
+};
+
+const union AffineAnimCmd gSpriteAffineAnim_83F7F48[] =
+{
+ AFFINEANIMCMD_FRAME(0, 0, -2, 2),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 4),
+ AFFINEANIMCMD_FRAME(0, 0, -2, 4),
+ AFFINEANIMCMD_FRAME(0, 0, 2, 2),
+ AFFINEANIMCMD_END
+};
+
+const union AffineAnimCmd *const gSpriteAffineAnimTable_83F7F70[] =
+{
+ gSpriteAffineAnim_83F7F48
+};
+
+const struct CompressedSpriteSheet gUnknown_083F7F74 =
+{
+ gMenuPokeblockDevice_Gfx,
+ 0x800,
+ GFX_TAG_POKEBLOCK_CASE
+};
+
+const struct CompressedSpritePalette gUnknown_083F7F7C =
+{
+ gMenuPokeblockDevice_Pal,
+ GFX_TAG_POKEBLOCK_CASE
+};
+
+const struct SpriteTemplate gSpriteTemplate_83F7F84 =
+{
+ GFX_TAG_POKEBLOCK_CASE,
+ GFX_TAG_POKEBLOCK_CASE,
+ &gOamData_83F7F34,
+ gSpriteAnimTable_83F7F44,
+ NULL,
+ gDummySpriteAffineAnimTable,
+ SpriteCallbackDummy
+};
+
+const struct Pokeblock gUnknown_083F7F9C[] =
+{
+ { PBLOCK_CLR_RED, 20, 0, 0, 0, 0, 20 },
+ { PBLOCK_CLR_BLUE, 0, 20, 0, 0, 0, 20 },
+ { PBLOCK_CLR_PINK, 0, 0, 20, 0, 0, 20 },
+ { PBLOCK_CLR_GREEN, 0, 0, 0, 20, 0, 20 },
+ { PBLOCK_CLR_YELLOW, 0, 0, 0, 0, 20, 20 },
+#if DEBUG
+ { PBLOCK_CLR_PURPLE, 20, 0, 20, 0, 0, 20 },
+ { PBLOCK_CLR_INDIGO, 0, 20, 0, 20, 0, 20 },
+ { PBLOCK_CLR_BROWN, 0, 0, 20, 0, 20, 20 },
+ { PBLOCK_CLR_LITEBLUE, 20, 0, 0, 20, 0, 20 },
+ { PBLOCK_CLR_OLIVE, 0, 20, 0, 0, 20, 20 },
+ { PBLOCK_CLR_GRAY, 0, 2, 0, 2, 2, 0 },
+ { PBLOCK_CLR_BLACK, 3, 3, 3, 4, 3, 0 },
+ { PBLOCK_CLR_WHITE, 1, 1, 1, 1, 1, 1 },
+ { PBLOCK_CLR_GOLD, 20, 0, 0, 0, 0, 20 },
+ { 0 },
+#endif
+};
+
+// text
+
+static void sub_810B674(void)
+{
+ AnimateSprites();
+ BuildOamBuffer();
+ RunTasks();
+ UpdatePaletteFade();
+}
+
+static void sub_810B68C(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+ DmaCopy16Defvars(3, gBGTilemapBuffers[2], (void *)(VRAM + 0x7800), sizeof gBGTilemapBuffers[2]);
+}
+
+static bool8 sub_810B6C0(void)
+{
+ u16 ime;
+ switch (gMain.state)
+ {
+ case 0:
+ ClearVideoCallbacks();
+ sub_80F9368();
+ REG_BG2CNT = BGCNT_SCREENBASE(15) | BGCNT_CHARBASE(2) | BGCNT_PRIORITY(2);
+ REG_BLDCNT = 0;
+ gMain.state++;
+ break;
+ case 1:
+ ScanlineEffect_Stop();
+ gMain.state++;
+ break;
+ case 2:
+ ResetPaletteFade();
+ gPaletteFade.bufferTransferDisabled = TRUE;
+ gMain.state++;
+ break;
+ case 3:
+ ResetSpriteData();
+ gMain.state++;
+ break;
+ case 4:
+ if (gUnknown_02039244 != 2)
+ {
+ ResetTasks();
+ }
+ gMain.state++;
+ break;
+ case 5:
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6E34);
+ gMain.state++;
+ break;
+ case 6:
+ Text_LoadWindowTemplate(&gWindowTemplate_81E6E50);
+ gMain.state++;
+ break;
+ case 7:
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E34);
+ gMain.state++;
+ break;
+ case 8:
+ if (MultistepInitMenuWindowContinue())
+ {
+ gMain.state++;
+ }
+ break;
+ case 9:
+ MultistepInitMenuWindowBegin(&gWindowTemplate_81E6E50);
+ gMain.state++;
+ break;
+ case 10:
+ if (MultistepInitMenuWindowContinue())
+ {
+ ewram1FFFF = 0;
+ gMain.state++;
+ }
+ break;
+ case 11:
+ if (sub_810B998())
+ {
+ gMain.state++;
+ }
+ break;
+ case 12:
+ ClearVerticalScrollIndicatorPalettes();
+ LoadScrollIndicatorPalette();
+ CreateVerticalScrollIndicators(TOP_ARROW, 0xb0, 0x08);
+ CreateVerticalScrollIndicators(BOTTOM_ARROW, 0xb0, 0x98);
+ gMain.state++;
+ break;
+ case 13:
+ ewram1FFFE = sub_810BA50(0x38, 0x40, 0);
+ gMain.state++;
+ break;
+ case 14:
+ sub_810BC98();
+ sub_810BD08();
+ gMain.state++;
+ break;
+ case 15:
+ sub_810BB0C();
+ sub_810BB30();
+ sub_810BC84(gUnknown_02039248.unk1);
+ gMain.state++;
+ break;
+ case 16:
+ ime = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = ime;
+ REG_DISPSTAT |= DISPSTAT_VBLANK_INTR;
+ SetVBlankCallback(sub_810B68C);
+ REG_DISPCNT = DISPCNT_OBJ_ON | DISPCNT_BG2_ON | DISPCNT_BG1_ON | DISPCNT_BG0_ON | DISPCNT_OBJ_1D_MAP;
+ gMain.state++;
+ break;
+ case 17:
+ if (sub_8055870() != TRUE)
+ {
+ gMain.state++;
+ }
+ break;
+ case 18:
+ BeginNormalPaletteFade(-1, 0, 0x10, 0, 0);
+ gPaletteFade.bufferTransferDisabled = FALSE;
+ SetMainCallback2(sub_810B674);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void sub_810B96C(void)
+{
+ do {
+ if (sub_810B6C0() == TRUE)
+ {
+ CreateTask(sub_810BF7C, 0);
+ break;
+ }
+ } while (sub_80F9344() != TRUE);
+}
+
+static bool8 sub_810B998(void)
+{
+ switch (ewram1FFFF)
+ {
+ case 0:
+ LZDecompressVram(gMenuPokeblock_Gfx, BG_CHAR_ADDR(2));
+ ewram1FFFF++;
+ break;
+ case 1:
+ LZDecompressWram(gMenuPokeblock_Tilemap, gBGTilemapBuffers[2]);
+ ewram1FFFF++;
+ break;
+ case 2:
+ LoadCompressedPalette(gMenuPokeblock_Pal, 0, 0xc0);
+ ewram1FFFF++;
+ break;
+ case 3:
+ LoadCompressedObjectPic(&gUnknown_083F7F74);
+ ewram1FFFF++;
+ break;
+ case 4:
+ LoadCompressedObjectPalette(&gUnknown_083F7F7C);
+ ewram1FFFF = 0;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u8 sub_810BA50(s16 x, s16 y, u8 subpriority)
+{
+ return CreateSprite(&gSpriteTemplate_83F7F84, x, y, subpriority);
+}
+
+void sub_810BA7C(u8 a0)
+{
+ gUnknown_02039244 = a0;
+ switch (gUnknown_02039244)
+ {
+ default:
+ gUnknown_03000758 = gUnknown_083F7F1C;
+ gUnknown_0203924C = sizeof gUnknown_083F7F1C;
+ break;
+ case 2:
+ gUnknown_03000758 = gUnknown_083F7F1F;
+ gUnknown_0203924C = sizeof gUnknown_083F7F1F;
+ break;
+ case 3:
+ gUnknown_03000758 = gUnknown_083F7F21;
+ gUnknown_0203924C = sizeof gUnknown_083F7F21;
+ break;
+ }
+}
+
+void sub_810BADC(void)
+{
+ sub_810BA7C(2);
+ SetMainCallback2(sub_810B96C);
+}
+
+void OpenPokeblockCaseOnFeeder(void)
+{
+ sub_810BA7C(3);
+ SetMainCallback2(sub_810B96C);
+}
+
+#if DEBUG
+void debug_sub_8120F98(void)
+{
+ u8 i;
+
+ for (i = 0; i < 40 && gUnknown_083F7F9C[i].color != 0; i++)
+ gSaveBlock1.pokeblocks[i] = gUnknown_083F7F9C[i];
+}
+#endif
+
+static void sub_810BB0C(void)
+{
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
+ sub_8072BD8(ItemId_GetName(ITEM_POKEBLOCK_CASE), 2, 1, 0x48);
+}
+
+static void sub_810BB30(void)
+{
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
+ Menu_PrintText(gContestStatsText_Spicy, 2, 13);
+ Menu_PrintText(gContestStatsText_Dry, 2, 15);
+ Menu_PrintText(gContestStatsText_Sweet, 2, 17);
+ Menu_PrintText(gContestStatsText_Bitter, 8, 13);
+ Menu_PrintText(gContestStatsText_Sour, 8, 15);
+}
+
+static void sub_810BB88(u8 a0)
+{
+ u8 i;
+ u8 y;
+ u8 *buf;
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
+ for (i = a0; i <= a0 + 8; i++)
+ {
+ y = (i - a0) << 1;
+ if (i == gUnknown_02039248.unk2)
+ {
+ buf = sub_8072C74(gStringVar1, gContestStatsText_StowCase, 0x78, 0);
+ Menu_PrintText(gStringVar1, 15, y + 1);
+ if (i != a0 + 8)
+ {
+ Menu_EraseWindowRect(15, y + 3, 29, 18);
+ }
+ break;
+ }
+ buf = sub_8072C74(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[i].color], 0x5e, 0);
+ buf[0] = EXT_CTRL_CODE_BEGIN;
+ buf[1] = 0x14;
+ buf[2] = 0x06;
+ buf += 3;
+ ConvertIntToDecimalStringN(buf, sub_810C9B0(&gSaveBlock1.pokeblocks[i]), STR_CONV_MODE_RIGHT_ALIGN, 3);
+ Menu_PrintText(gStringVar1, 15, y + 1);
+ }
+}
+
+static void sub_810BC84(u8 a0)
+{
+ sub_810BB88(a0);
+ sub_810BDAC(FALSE);
+}
+
+static void sub_810BC98(void)
+{
+ u16 i, j;
+ struct Pokeblock buf;
+ for (i=0; i<39; i++)
+ {
+ for (j=i+1; j<40; j++)
+ {
+ if (gSaveBlock1.pokeblocks[i].color == 0)
+ {
+ buf = gSaveBlock1.pokeblocks[i];
+ gSaveBlock1.pokeblocks[i] = gSaveBlock1.pokeblocks[j];
+ gSaveBlock1.pokeblocks[j] = buf;
+ }
+ }
+ }
+}
+
+static void sub_810BD08(void)
+{
+ u8 i;
+ gUnknown_02039248.unk2 = 0;
+ for (i=0; i<40; i++)
+ {
+ if (gSaveBlock1.pokeblocks[i].color != 0)
+ gUnknown_02039248.unk2++;
+ }
+ if (gUnknown_02039248.unk2 < 8)
+ {
+ gUnknown_02039248.unk3 = gUnknown_02039248.unk2;
+ }
+ else
+ {
+ gUnknown_02039248.unk3 = 8;
+ }
+ if (gUnknown_02039248.unk1 + 8 > gUnknown_02039248.unk2 && gUnknown_02039248.unk1 != 0)
+ {
+ gUnknown_02039248.unk1--;
+ }
+}
+
+static void sub_810BD64(u16 a0, u16 a1)
+{
+ u8 i;
+ int y;
+ for (i=0; i<14; i++)
+ {
+ gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 1) * 32 + (y = i + 15)] = a0;
+ gBGTilemapBuffers[2][(2 * gUnknown_02039248.unk0 + 2) * 32 + y] = a0;
+ }
+}
+
+static void sub_810BDAC(bool8 flag)
+{
+ u8 i;
+ u16 v0;
+ if (!flag)
+ {
+ sub_810BD64(0x1005, 0x1014);
+ }
+ else
+ {
+ sub_810BD64(0x2005, 0x2014);
+ }
+ if (gUnknown_02039248.unk1)
+ {
+ SetVerticalScrollIndicators(TOP_ARROW, VISIBLE);
+ }
+ else
+ {
+ SetVerticalScrollIndicators(TOP_ARROW, INVISIBLE);
+ }
+ if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2)
+ {
+ SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE);
+ }
+ else
+ {
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
+ }
+ for (i=0; i<5; i++)
+ {
+ v0 = ((i % 3) << 6) + 0x1a1 + (i / 3) * 6;
+ if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2)
+ {
+ if (GetPokeblockData(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1], i + 1) > 0)
+ {
+ gBGTilemapBuffers[2][v0] = (i << 12) + 23;
+ gBGTilemapBuffers[2][v0 + 32] = (i << 12) + 24;
+ }
+ else
+ {
+ gBGTilemapBuffers[2][v0] = 15;
+ gBGTilemapBuffers[2][v0 + 32] = 15;
+ }
+ }
+ else
+ {
+ gBGTilemapBuffers[2][v0] = 15;
+ gBGTilemapBuffers[2][v0 + 32] = 15;
+ }
+ }
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
+ if (gUnknown_02039248.unk0 + gUnknown_02039248.unk1 != gUnknown_02039248.unk2)
+ {
+ sub_8072C14(gStringVar1, sub_810C9E8(&gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1]), 16, 1);
+ Menu_PrintText(gStringVar1, 11, 17);
+ }
+ else
+ {
+ Menu_EraseWindowRect(11, 17, 12, 18);
+ }
+}
+
+static void sub_810BF38(bool8 flag)
+{
+ PlaySE(SE_SELECT);
+ gSprites[ewram1FFFE].callback = sub_810C8D4;
+ sub_810BDAC(flag);
+}
+
+static void sub_810BF7C(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (gUnknown_02039248.unk0 != 0)
+ {
+ sub_810BD64(5, 20);
+ gUnknown_02039248.unk0--;
+ sub_810BF38(FALSE);
+ }
+ else if (gUnknown_02039248.unk1 != 0)
+ {
+ gUnknown_02039248.unk1--;
+ sub_810BB88(gUnknown_02039248.unk1);
+ sub_810BF38(FALSE);
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3)
+ {
+ sub_810BD64(5, 20);
+ gUnknown_02039248.unk0++;
+ sub_810BF38(FALSE);
+ }
+ else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2)
+ {
+ gUnknown_02039248.unk1++;
+ sub_810BB88(gUnknown_02039248.unk1);
+ sub_810BF38(FALSE);
+ }
+ }
+ else if (gMain.newKeys & SELECT_BUTTON)
+ {
+ if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2)
+ {
+ PlaySE(SE_SELECT);
+ sub_810BDAC(TRUE);
+ gTasks[taskId].data[0] = gUnknown_02039248.unk1 + gUnknown_02039248.unk0;
+ gTasks[taskId].func = sub_810C0C8;
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 == gUnknown_02039248.unk2)
+ {
+ gSpecialVar_Result = 0xffff;
+ sub_810C31C(taskId);
+ }
+ else
+ {
+ sub_810C368(taskId);
+ }
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gSpecialVar_Result = 0xffff;
+ sub_810C31C(taskId);
+ }
+ }
+}
+
+static void sub_810C0C8(u8 taskId)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (gUnknown_02039248.unk0 != 0)
+ {
+ sub_810BD64(5, 20);
+ gUnknown_02039248.unk0--;
+ sub_810BF38(TRUE);
+ sub_810C1C8(taskId, 1);
+ }
+ else if (gUnknown_02039248.unk1 != 0)
+ {
+ sub_810C1C8(taskId, 0);
+ gUnknown_02039248.unk1--;
+ sub_810BB88(gUnknown_02039248.unk1);
+ sub_810BF38(TRUE);
+ sub_810C1C8(taskId, 1);
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (gUnknown_02039248.unk0 != gUnknown_02039248.unk3)
+ {
+ sub_810BD64(5, 20);
+ gUnknown_02039248.unk0++;
+ sub_810BF38(TRUE);
+ sub_810C1C8(taskId, 1);
+ }
+ else if (gUnknown_02039248.unk1 + gUnknown_02039248.unk0 != gUnknown_02039248.unk2)
+ {
+ sub_810C1C8(taskId, 0);
+ gUnknown_02039248.unk1++;
+ sub_810BB88(gUnknown_02039248.unk1);
+ sub_810BF38(TRUE);
+ sub_810C1C8(taskId, 1);
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON || gMain.newKeys & SELECT_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_810C1C8(taskId, 0);
+ sub_810C23C(taskId);
+ gTasks[taskId].func = sub_810BF7C;
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_810C1C8(taskId, 0);
+ sub_810BDAC(0);
+ gTasks[taskId].func = sub_810BF7C;
+ }
+}
+
+static void sub_810C1C8(u8 taskId, u8 flag)
+{
+ u8 i;
+ u32 x;
+ s16 y;
+ u16 v0 = 0x1005;
+ if (!flag)
+ {
+ v0 = 0x0005;
+ }
+ y = gTasks[taskId].data[0] - gUnknown_02039248.unk1;
+ if ((u16)y <= 8 && y != gUnknown_02039248.unk0)
+ {
+ for (i=0; i<14; i++)
+ {
+ gBGTilemapBuffers[2][(2 * y + 1) * 32 + (x = i + 15)] = v0;
+ gBGTilemapBuffers[2][(2 * y + 2) * 32 + x] = v0;
+ }
+ }
+}
+
+static void sub_810C23C(u8 taskId)
+{
+ struct Pokeblock buf;
+ u8 selidx = gUnknown_02039248.unk1 + gUnknown_02039248.unk0;
+ if (selidx == gUnknown_02039248.unk2)
+ {
+ sub_810BDAC(FALSE);
+ }
+ else
+ {
+ buf = gSaveBlock1.pokeblocks[selidx];
+ gSaveBlock1.pokeblocks[selidx] = gSaveBlock1.pokeblocks[gTasks[taskId].data[0]];
+ gSaveBlock1.pokeblocks[gTasks[taskId].data[0]] = buf;
+ sub_810BB88(gUnknown_02039248.unk1);
+ sub_810BDAC(FALSE);
+ }
+}
+
+static void sub_810C2B0(void)
+{
+ DestroyVerticalScrollIndicator(TOP_ARROW);
+ DestroyVerticalScrollIndicator(BOTTOM_ARROW);
+ BuyMenuFreeMemory();
+}
+
+static void sub_810C2C8(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ if (gUnknown_02039244 == 3)
+ {
+ gFieldCallback = sub_8080990;
+ }
+ sub_810C2B0();
+ SetMainCallback2(gUnknown_083F7EA8[gUnknown_02039244]);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_810C31C(u8 taskId)
+{
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ if (gUnknown_02039244 > 1)
+ {
+ gSpecialVar_ItemId = ITEM_NONE;
+ }
+ gTasks[taskId].func = sub_810C2C8;
+}
+
+static void sub_810C368(u8 taskId)
+{
+ int v0 = 0;
+ if (gUnknown_02039244 > 1)
+ v0 = 2;
+ StopVerticalScrollIndicators(TOP_ARROW);
+ StopVerticalScrollIndicators(BOTTOM_ARROW);
+ BasicInitMenuWindow(&gWindowTemplate_81E6E50);
+ Menu_DrawStdWindowFrame(7, v0 + 4, 13, 11);
+ Menu_PrintItemsReordered(8, v0 + 5, gUnknown_0203924C, gUnknown_083F7EF4, gUnknown_03000758);
+ InitMenu(0, 8, v0 + 5, gUnknown_0203924C, 0, 5);
+ gSpecialVar_ItemId = gUnknown_02039248.unk0 + gUnknown_02039248.unk1;
+ gTasks[taskId].func = sub_810C40C;
+}
+
+static void sub_810C40C(u8 taskId)
+{
+ if (gMain.newAndRepeatedKeys & DPAD_UP)
+ {
+ if (Menu_GetCursorPos())
+ {
+ PlaySE(SE_SELECT);
+ Menu_MoveCursor(-1);
+ }
+ }
+ else if (gMain.newAndRepeatedKeys & DPAD_DOWN)
+ {
+ if (Menu_GetCursorPos() != gUnknown_0203924C - 1)
+ {
+ PlaySE(SE_SELECT);
+ Menu_MoveCursor(+1);
+ }
+ }
+ else if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ gUnknown_083F7EF4[gUnknown_03000758[Menu_GetCursorPos()]].func(taskId);
+ }
+ else if (gMain.newKeys & B_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_810C748(taskId);
+ }
+}
+
+static void sub_810C4C4(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ sub_810C2B0();
+ sub_8136130(&gSaveBlock1.pokeblocks[gSpecialVar_ItemId], sub_810B96C);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_810C508(u8 taskId)
+{
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_810C4C4;
+}
+
+static void sub_810C540(u8 taskId)
+{
+ BasicInitMenuWindow(&gWindowTemplate_81E6E50);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(7, 4, 13, 11);
+ StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gUnknown_02039248.unk0 + gUnknown_02039248.unk1].color]);
+ StringExpandPlaceholders(gStringVar4, gContestStatsText_ThrowAwayPrompt);
+ DisplayItemMessageOnField(taskId, gStringVar4, sub_810C5EC, 0);
+}
+
+static void sub_810C5C0(u8 taskId)
+{
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
+ gTasks[taskId].func = sub_810C540;
+}
+
+static void sub_810C5EC(u8 taskId)
+{
+ DisplayYesNoMenu(7, 6, 1);
+ DoYesNoFuncWithChoice(taskId, &gUnknown_083F7F24);
+}
+
+static void sub_810C610(u8 taskId)
+{
+ Menu_EraseWindowRect(7, 6, 13, 11);
+ PokeblockClearIfExists((gUnknown_02039248.unk0 + gUnknown_02039248.unk1));
+ StringExpandPlaceholders(gStringVar4, gContestStatsText_WasThrownAway);
+ DisplayItemMessageOnField(taskId, gStringVar4, sub_810C704, 0);
+ sub_810BC98();
+ sub_810BD08();
+}
+
+static void sub_810C668(u8 taskId)
+{
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
+ if (gUnknown_02039248.unk2 > gUnknown_02039248.unk3 && gUnknown_02039248.unk1 + gUnknown_02039248.unk3 != gUnknown_02039248.unk2)
+ {
+ SetVerticalScrollIndicators(BOTTOM_ARROW, VISIBLE);
+ }
+ BasicInitMenuWindow(&gWindowTemplate_81E6E50);
+ Menu_EraseWindowRect(7, 6, 13, 11);
+ Menu_EraseWindowRect(0, 14, 29, 19);
+ gTasks[taskId].func = sub_810BF7C;
+}
+
+static void sub_810C6DC(u8 taskId)
+{
+ if (gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON)
+ {
+ sub_810C668(taskId);
+ }
+}
+
+static void sub_810C704(u8 taskId)
+{
+ BasicInitMenuWindow(&gWindowTemplate_81E6E34);
+ sub_810BC84(gUnknown_02039248.unk1);
+ SetVerticalScrollIndicators(BOTTOM_ARROW, INVISIBLE);
+ gTasks[taskId].func = sub_810C6DC;
+}
+
+static void sub_810C748(u8 taskId)
+{
+ StartVerticalScrollIndicators(TOP_ARROW);
+ StartVerticalScrollIndicators(BOTTOM_ARROW);
+ Menu_DestroyCursor();
+ Menu_EraseWindowRect(7, 4, 13, 11);
+ gTasks[taskId].func = sub_810BF7C;
+}
+
+static void sub_810C788(u8 taskId)
+{
+ s16 v0 = PokeblockGetGain(GetNature(&gEnemyParty[0]), &gSaveBlock1.pokeblocks[gSpecialVar_ItemId]);
+ StringCopy(gBattleTextBuff1, gPokeblockNames[gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color]);
+ PokeblockClearIfExists(gSpecialVar_ItemId);
+ gSpecialVar_ItemId = gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color << 8;
+ if (v0 == 0)
+ {
+ gSpecialVar_ItemId += 1;
+ }
+ if (v0 > 0)
+ {
+ gSpecialVar_ItemId += 2;
+ }
+ if (v0 < 0)
+ {
+ gSpecialVar_ItemId += 3;
+ }
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_810C2C8;
+}
+
+static void sub_810C854(u8 taskId)
+{
+ SafariZoneActivatePokeblockFeeder(gSpecialVar_ItemId);
+ StringCopy(gStringVar1, gPokeblockNames[gSaveBlock1.pokeblocks[gSpecialVar_ItemId].color]);
+ gSpecialVar_Result = gSpecialVar_ItemId;
+ PokeblockClearIfExists(gSpecialVar_ItemId);
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+ gTasks[taskId].func = sub_810C2C8;
+}
+
+static void sub_810C8D4(struct Sprite *sprite)
+{
+ if (sprite->data[0] > 1)
+ {
+ sprite->data[0] = 0;
+ }
+ switch (sprite->data[0])
+ {
+ case 0:
+ sprite->oam.affineMode = 1;
+ sprite->affineAnims = gSpriteAffineAnimTable_83F7F70;
+ InitSpriteAffineAnim(sprite);
+ sprite->data[0] = 1;
+ sprite->data[1] = 0;
+ break;
+ case 1:
+ if (++sprite->data[1] > 11)
+ {
+ sprite->oam.affineMode = 0;
+ sprite->data[0] = 0;
+ sprite->data[1] = 0;
+ FreeOamMatrix(sprite->oam.matrixNum);
+ sprite->callback = SpriteCallbackDummy;
+ }
+ break;
+ }
+}
+
+static void ClearPokeblock(u8 pokeblockIdx)
+{
+ gSaveBlock1.pokeblocks[pokeblockIdx].color = 0;
+ gSaveBlock1.pokeblocks[pokeblockIdx].spicy = 0;
+ gSaveBlock1.pokeblocks[pokeblockIdx].dry = 0;
+ gSaveBlock1.pokeblocks[pokeblockIdx].sweet = 0;
+ gSaveBlock1.pokeblocks[pokeblockIdx].bitter = 0;
+ gSaveBlock1.pokeblocks[pokeblockIdx].sour = 0;
+ gSaveBlock1.pokeblocks[pokeblockIdx].feel = 0;
+}
+
+void ClearPokeblocks(void)
+{
+ u8 pokeblockIdx;
+ for (pokeblockIdx=0; pokeblockIdx<ARRAY_COUNT(gSaveBlock1.pokeblocks); pokeblockIdx++)
+ {
+ ClearPokeblock(pokeblockIdx);
+ }
+}
+
+u8 sub_810C9B0(struct Pokeblock *pokeblock)
+{
+ u8 contestStat;
+ u8 maxRating;
+ u8 rating = GetPokeblockData(pokeblock, 1);
+ for (contestStat=1; contestStat<5; contestStat++)
+ {
+ maxRating = GetPokeblockData(pokeblock, contestStat + 1);
+ if (rating < maxRating)
+ {
+ rating = maxRating;
+ }
+ }
+ return rating;
+}
+
+u8 sub_810C9E8(struct Pokeblock *pokeblock)
+{
+ u8 feel = GetPokeblockData(pokeblock, 6);
+ if (feel > 99)
+ feel = 99;
+ return feel;
+}
+
+s8 GetFirstFreePokeblockSlot(void)
+{
+ u8 i;
+ for (i=0; i<ARRAY_COUNT(gSaveBlock1.pokeblocks); i++)
+ {
+ if (gSaveBlock1.pokeblocks[i].color == 0)
+ {
+ return i;
+ }
+ }
+ return -1;
+}
+
+bool8 sub_810CA34(const struct Pokeblock *pokeblock)
+{
+ s8 idx = GetFirstFreePokeblockSlot();
+ if (idx == -1)
+ {
+ return FALSE;
+ }
+ gSaveBlock1.pokeblocks[idx] = *pokeblock;
+ return TRUE;
+}
+
+bool8 PokeblockClearIfExists(u8 pokeblockIdx)
+{
+ if (gSaveBlock1.pokeblocks[pokeblockIdx].color == 0)
+ {
+ return FALSE;
+ }
+ ClearPokeblock(pokeblockIdx);
+ return TRUE;
+}
+
+s16 GetPokeblockData(const struct Pokeblock *pokeblock, u8 field)
+{
+ if (field == PBLOCK_COLOR)
+ return pokeblock->color;
+ if (field == PBLOCK_SPICY)
+ return pokeblock->spicy;
+ if (field == PBLOCK_DRY)
+ return pokeblock->dry;
+ if (field == PBLOCK_SWEET)
+ return pokeblock->sweet;
+ if (field == PBLOCK_BITTER)
+ return pokeblock->bitter;
+ if (field == PBLOCK_SOUR)
+ return pokeblock->sour;
+ if (field == PBLOCK_FEEL)
+ return pokeblock->feel;
+ return 0;
+}
+
+s16 PokeblockGetGain(u8 nature, const struct Pokeblock *pokeblock)
+{
+ u8 flavor;
+ s16 curGain;
+ s16 totalGain = 0;
+ for (flavor=0; flavor<5; flavor++)
+ {
+ curGain = GetPokeblockData(pokeblock, flavor + 1);
+ if (curGain > 0)
+ {
+ totalGain += curGain * gPokeblockFlavorCompatibilityTable[5 * nature + flavor];
+ }
+ }
+ return totalGain;
+}
+
+void PokeblockCopyName(struct Pokeblock *pokeblock, u8 *dest)
+{
+ u8 color = GetPokeblockData(pokeblock, PBLOCK_COLOR);
+ StringCopy(dest, gPokeblockNames[color]);
+}
+
+bool8 sub_810CB68(u8 nature, u8 *dest)
+{
+ u8 flavor;
+ for (flavor=0; flavor<5; flavor++)
+ {
+ if (PokeblockGetGain(nature, &gUnknown_083F7F9C[flavor]) > 0)
+ {
+ StringCopy(dest, gPokeblockNames[flavor + 1]);
+ return TRUE;
+ }
+ }
+ return FALSE;
+}