summaryrefslogtreecommitdiff
path: root/src/learn_move.c
diff options
context:
space:
mode:
authorgarak <garakmon@gmail.com>2018-09-24 08:40:33 -0400
committergarak <garakmon@gmail.com>2018-09-24 08:40:33 -0400
commit72f9afcbf4a81909019f21acad0484b72ed217f6 (patch)
treebc7e9a48b8056e28403e251dab7ac64f649ad9e4 /src/learn_move.c
parent3964dbd4822f1b22bbc696add7e56ff0c5b2caea (diff)
parent7ceabffc842dfdf127fd594055f895a0803f54f6 (diff)
Merge remote-tracking branch 'upstream/master'
Diffstat (limited to 'src/learn_move.c')
-rw-r--r--src/learn_move.c833
1 files changed, 833 insertions, 0 deletions
diff --git a/src/learn_move.c b/src/learn_move.c
new file mode 100644
index 000000000..ff23cb3dc
--- /dev/null
+++ b/src/learn_move.c
@@ -0,0 +1,833 @@
+#include "global.h"
+#include "main.h"
+#include "battle.h"
+#include "bg.h"
+#include "contest_effect.h"
+#include "data2.h"
+#include "event_data.h"
+#include "field_screen.h"
+#include "gpu_regs.h"
+#include "learn_move.h"
+#include "list_menu.h"
+#include "malloc.h"
+#include "menu.h"
+#include "menu_helpers.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokemon_summary_screen.h"
+#include "pokenav.h"
+#include "script.h"
+#include "sound.h"
+#include "sprite.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "constants/rgb.h"
+#include "constants/songs.h"
+
+static EWRAM_DATA struct
+{
+ u8 state;
+ u8 spriteIds[16]; /*0x001*/
+ u16 movesToLearn[4]; /*0x012*/
+ u8 filler1A[0x44 - 0x1A]; /*0x01A*/
+ u8 partyMon; /*0x044*/
+ u8 moveSlot; /*0x045*/
+ struct ListMenuItem menuItems[20]; /*0x048*/
+ u8 fillerE8[0x110 - 0xE8]; /*0x0E8*/
+ u8 numMenuChoices; /*0x110*/
+ u8 numToShowAtOnce; /*0x111*/
+ u8 listMenuTask; /*0x112*/
+ u8 scrollArrowTaskId1; /*0x113*/
+ u8 scrollArrowTaskId2; /*0x114*/
+ u16 scrollOffset; /*0x116*/
+} *sLearnMoveStruct = {0};
+
+static EWRAM_DATA struct {
+ u16 listOffset;
+ u16 listRow;
+ u8 showContestInfo;
+} sLearnMoveStruct2 = {0};
+
+const u16 gUnknown_085CE9F8[] = INCBIN_U16("graphics/interface/ui_learn_move.gbapal");
+const u8 gUnknown_085CEA18[] = INCBIN_U8("graphics/interface/ui_learn_move.4bpp");
+
+const struct OamData gUnknown_085CEB98 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_SQUARE,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct OamData gUnknown_085CEBA0 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_V_RECTANGLE,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct OamData gUnknown_085CEBA8 =
+{
+ .y = 0,
+ .affineMode = 0,
+ .objMode = ST_OAM_OBJ_NORMAL,
+ .mosaic = 0,
+ .bpp = ST_OAM_4BPP,
+ .shape = ST_OAM_H_RECTANGLE,
+ .x = 0,
+ .matrixNum = 0,
+ .size = 0,
+ .tileNum = 0,
+ .priority = 0,
+ .paletteNum = 0,
+ .affineParam = 0,
+};
+
+const struct SpriteSheet gUnknown_085CEBB0 =
+{
+ .data = gUnknown_085CEA18,
+ .size = 0x180,
+ .tag = 5525
+};
+
+const struct SpritePalette gUnknown_085CEBB8 =
+{
+ .data = gUnknown_085CE9F8,
+ .tag = 5526
+};
+
+const struct ScrollArrowsTemplate gUnknown_085CEBC0 =
+{
+ .firstArrowType = 0,
+ .firstX = 27,
+ .firstY = 16,
+ .secondArrowType = 1,
+ .secondX = 117,
+ .secondY = 16,
+ .fullyUpThreshold = -1,
+ .fullyDownThreshold = -1,
+ .tileTag = 5325,
+ .palTag = 5325,
+ .palNum = 0,
+};
+
+const struct ScrollArrowsTemplate gUnknown_085CEBD0 =
+{
+ .firstArrowType = 2,
+ .firstX = 192,
+ .firstY = 8,
+ .secondArrowType = 3,
+ .secondX = 192,
+ .secondY = 104,
+ .fullyUpThreshold = 0,
+ .fullyDownThreshold = 0,
+ .tileTag = 5425,
+ .palTag = 5425,
+ .palNum = 0,
+};
+
+const union AnimCmd gUnknown_085CEBE0[] =
+{
+ ANIMCMD_FRAME(8, 5, FALSE, FALSE),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_085CEBE8[] =
+{
+ ANIMCMD_FRAME(9, 5, FALSE, FALSE),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_085CEBF0[] =
+{
+ ANIMCMD_FRAME(10, 5, FALSE, FALSE),
+ ANIMCMD_END
+};
+
+const union AnimCmd gUnknown_085CEBF8[] =
+{
+ ANIMCMD_FRAME(11, 5, FALSE, FALSE),
+ ANIMCMD_END
+};
+
+const union AnimCmd *const gUnknown_085CEC00[] =
+{
+ gUnknown_085CEBE0,
+ gUnknown_085CEBE8,
+ gUnknown_085CEBF0,
+ gUnknown_085CEBF8,
+};
+
+const struct SpriteTemplate gUnknown_085CEC10 =
+{
+ .tileTag = 5525,
+ .paletteTag = 5526,
+ .oam = &gUnknown_085CEB98,
+ .anims = gUnknown_085CEC00,
+ .images = NULL,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy
+};
+
+const struct BgTemplate gUnknown_085CEC28[] =
+{
+ {
+ .bg = 0,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 31,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 0,
+ .baseTile = 0,
+ },
+ {
+ .bg = 1,
+ .charBaseIndex = 0,
+ .mapBaseIndex = 30,
+ .screenSize = 0,
+ .paletteMode = 0,
+ .priority = 1,
+ .baseTile = 0,
+ },
+};
+
+static void LearnMoveMain(void);
+static void CreateMenuItemsList(void);
+static void CreateHearts(void);
+static void CB2_Main(void);
+static void Task_WaitForFadeOut(u8 taskId);
+static void CB2_InitLearnMove(void);
+static void CB2_InitLearnMoveReturnFromSelectMove(void);
+static void InitBGs(void);
+static void AddScrollArrows(void);
+static void HandleInput(u8);
+static void ShowTeachMoveText(u8);
+static s32 GetCurrentItemId(void);
+static void FreeListMenuResources(void);
+static void RemoveScrollArrows(void);
+static void HideSpritesAndPrintTeachText(bool8);
+
+static void VBlankCB_LearnMove(void)
+{
+ LoadOam();
+ ProcessSpriteCopyRequests();
+ TransferPlttBuffer();
+}
+
+void TeachMoveTutorMove(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(Task_WaitForFadeOut, 0xA);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0);
+}
+
+static void Task_WaitForFadeOut(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ SetMainCallback2(CB2_InitLearnMove);
+ gFieldCallback = sub_80AF168;
+ DestroyTask(taskId);
+ }
+}
+
+static void CB2_InitLearnMove(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ clear_scheduled_bg_copies_to_vram();
+ sLearnMoveStruct = AllocZeroed(sizeof(*sLearnMoveStruct));
+ sLearnMoveStruct->partyMon = gSpecialVar_0x8004;
+ SetVBlankCallback(VBlankCB_LearnMove);
+
+ InitBGs();
+ sub_81D2824(0);
+
+ sLearnMoveStruct2.listOffset = 0;
+ sLearnMoveStruct2.listRow = 0;
+ sLearnMoveStruct2.showContestInfo = FALSE;
+
+ CreateMenuItemsList();
+
+ LoadSpriteSheet(&gUnknown_085CEBB0);
+ LoadSpritePalette(&gUnknown_085CEBB8);
+ CreateHearts();
+
+ sLearnMoveStruct->listMenuTask = ListMenuInit(&gMultiuseListMenuTemplate, sLearnMoveStruct2.listOffset, sLearnMoveStruct2.listRow);
+ FillPalette(RGB_BLACK, 0, 2);
+ SetMainCallback2(CB2_Main);
+}
+
+static void CB2_InitLearnMoveReturnFromSelectMove(void)
+{
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ clear_scheduled_bg_copies_to_vram();
+ sLearnMoveStruct = AllocZeroed(sizeof(*sLearnMoveStruct));
+ sLearnMoveStruct->state = 28;
+ sLearnMoveStruct->partyMon = gSpecialVar_0x8004;
+ sLearnMoveStruct->moveSlot = gSpecialVar_0x8005;
+ SetVBlankCallback(VBlankCB_LearnMove);
+
+ InitBGs();
+ sub_81D2824(sLearnMoveStruct2.showContestInfo);
+ CreateMenuItemsList();
+
+ LoadSpriteSheet(&gUnknown_085CEBB0);
+ LoadSpritePalette(&gUnknown_085CEBB8);
+ CreateHearts();
+
+ sLearnMoveStruct->listMenuTask = ListMenuInit(&gMultiuseListMenuTemplate, sLearnMoveStruct2.listOffset, sLearnMoveStruct2.listRow);
+ FillPalette(RGB_BLACK, 0, 2);
+ SetMainCallback2(CB2_Main);
+}
+
+static void InitBGs(void)
+{
+ ResetVramOamAndBgCntRegs();
+ ResetBgsAndClearDma3BusyFlags(0);
+ InitBgsFromTemplates(0, gUnknown_085CEC28, 2);
+ ResetAllBgsCoordinates();
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 |
+ DISPCNT_OBJ_1D_MAP |
+ DISPCNT_OBJ_ON);
+ ShowBg(0);
+ ShowBg(1);
+ SetGpuReg(REG_OFFSET_BLDCNT, 0);
+}
+
+static void CB2_Main(void)
+{
+ LearnMoveMain();
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ do_scheduled_bg_tilemap_copies_to_vram();
+ UpdatePaletteFade();
+}
+
+static void sub_816084C(const u8 *src)
+{
+ StringExpandPlaceholders(gStringVar4, src);
+ sub_81D2BF4(gStringVar4);
+}
+
+static void LearnMoveMain(void)
+{
+ switch (sLearnMoveStruct->state)
+ {
+ case 0:
+ sLearnMoveStruct->state++;
+ HideSpritesAndPrintTeachText(FALSE);
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ {
+ sLearnMoveStruct->state = 4;
+ }
+ break;
+ case 2:
+ sLearnMoveStruct->state++;
+ break;
+ case 3:
+ HideSpritesAndPrintTeachText(FALSE);
+ sLearnMoveStruct->state++;
+ AddScrollArrows();
+ break;
+ case 4:
+ HandleInput(FALSE);
+ return;
+ case 5:
+ ShowTeachMoveText(FALSE);
+ sLearnMoveStruct->state++;
+ AddScrollArrows();
+ break;
+ case 6:
+ HandleInput(TRUE);
+ break;
+ case 8:
+ if (!sub_81D2C3C())
+ {
+ sub_81D2C50();
+ sLearnMoveStruct->state++;
+ }
+ break;
+ case 9:
+ {
+ s8 selection = Menu_ProcessInputNoWrap_();
+
+ if (selection == 0)
+ {
+ if (GiveMoveToMon(&gPlayerParty[sLearnMoveStruct->partyMon], GetCurrentItemId()) != 0xFFFF)
+ {
+ sub_816084C(gText_PkmnLearnedMove4);
+ gSpecialVar_0x8004 = 1;
+ sLearnMoveStruct->state = 31;
+ }
+ else
+ {
+ sLearnMoveStruct->state = 16;
+ }
+ }
+ else if (selection == -1 || selection == 1)
+ {
+ if (sLearnMoveStruct2.showContestInfo == FALSE)
+ {
+ sLearnMoveStruct->state = 3;
+ }
+ else if (sLearnMoveStruct2.showContestInfo == TRUE)
+ {
+ sLearnMoveStruct->state = 5;
+ }
+ }
+ }
+ break;
+ case 12:
+ if (!sub_81D2C3C())
+ {
+ sub_81D2C50();
+ sLearnMoveStruct->state++;
+ }
+ break;
+ case 13:
+ {
+ s8 selection = Menu_ProcessInputNoWrap_();
+
+ if (selection == 0)
+ {
+ gSpecialVar_0x8004 = selection;
+ sLearnMoveStruct->state = 14;
+ }
+ else if (selection == -1 || selection == 1)
+ {
+ if (sLearnMoveStruct2.showContestInfo == FALSE)
+ {
+ sLearnMoveStruct->state = 3;
+ }
+ else if (sLearnMoveStruct2.showContestInfo == TRUE)
+ {
+ sLearnMoveStruct->state = 5;
+ }
+ }
+ }
+ break;
+ case 16:
+ sub_816084C(gText_PkmnTryingToLearnMove);
+ sLearnMoveStruct->state++;
+ break;
+ case 17:
+ if (!sub_81D2C3C())
+ {
+ sub_81D2C50();
+ sLearnMoveStruct->state = 18;
+ }
+ break;
+ case 18:
+ {
+ s8 var = Menu_ProcessInputNoWrap_();
+
+ if (var == 0)
+ {
+ sub_816084C(gText_WhichMoveToForget2);
+ sLearnMoveStruct->state = 19;
+ }
+ else if (var == -1 || var == 1)
+ {
+ sLearnMoveStruct->state = 24;
+ }
+ }
+ break;
+ case 24:
+ StringCopy(gStringVar2, gMoveNames[GetCurrentItemId()]);
+ sub_816084C(gText_StopTryingToTeachMove);
+ sLearnMoveStruct->state++;
+ break;
+ case 25:
+ if (!sub_81D2C3C())
+ {
+ sub_81D2C50();
+ sLearnMoveStruct->state++;
+ }
+ break;
+ case 26:
+ {
+ s8 var = Menu_ProcessInputNoWrap_();
+
+ if (var == 0)
+ {
+ sLearnMoveStruct->state = 27;
+ }
+ else if (var == -1 || var == 1)
+ {
+ // What's the point? It gets set to 16, anyway.
+ if (sLearnMoveStruct2.showContestInfo == FALSE)
+ {
+ sLearnMoveStruct->state = 3;
+ }
+ else if (sLearnMoveStruct2.showContestInfo == TRUE)
+ {
+ sLearnMoveStruct->state = 5;
+ }
+ sLearnMoveStruct->state = 16;
+ }
+ }
+ break;
+ case 27:
+ if (!sub_81D2C3C())
+ {
+ FillWindowPixelBuffer(3, 0x11);
+ if (sLearnMoveStruct2.showContestInfo == FALSE)
+ {
+ sLearnMoveStruct->state = 3;
+ }
+ else if (sLearnMoveStruct2.showContestInfo == TRUE)
+ {
+ sLearnMoveStruct->state = 5;
+ }
+ }
+ break;
+ case 19:
+ if (!sub_81D2C3C())
+ {
+ sLearnMoveStruct->state = 20;
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ }
+ break;
+ case 20:
+ if (!gPaletteFade.active)
+ {
+ ShowSelectMovePokemonSummaryScreen(gPlayerParty, sLearnMoveStruct->partyMon, gPlayerPartyCount - 1, CB2_InitLearnMoveReturnFromSelectMove, GetCurrentItemId());
+ FreeListMenuResources();
+ }
+ break;
+ case 21:
+ if (!sub_81D2C3C())
+ {
+ sLearnMoveStruct->state = 14;
+ }
+ break;
+ case 22:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ break;
+ case 14:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK);
+ sLearnMoveStruct->state++;
+ break;
+ case 15:
+ if (!gPaletteFade.active)
+ {
+ FreeListMenuResources();
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ break;
+ case 28:
+ BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK);
+ sLearnMoveStruct->state++;
+ if (sLearnMoveStruct2.showContestInfo == FALSE)
+ {
+ HideSpritesAndPrintTeachText(TRUE);
+ }
+ else if (sLearnMoveStruct2.showContestInfo == TRUE)
+ {
+ ShowTeachMoveText(TRUE);
+ }
+ RemoveScrollArrows();
+ CopyWindowToVram(3, 2);
+ break;
+ case 29:
+ if (!gPaletteFade.active)
+ {
+ if (sLearnMoveStruct->moveSlot == MAX_MON_MOVES)
+ {
+ sLearnMoveStruct->state = 24;
+ }
+ else
+ {
+ u16 moveId = GetMonData(&gPlayerParty[sLearnMoveStruct->partyMon], MON_DATA_MOVE1 + sLearnMoveStruct->moveSlot);
+
+ StringCopy(gStringVar3, gMoveNames[moveId]);
+ RemoveMonPPBonus(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->moveSlot);
+ SetMonMoveSlot(&gPlayerParty[sLearnMoveStruct->partyMon], GetCurrentItemId(), sLearnMoveStruct->moveSlot);
+ StringCopy(gStringVar2, gMoveNames[GetCurrentItemId()]);
+ sub_816084C(gText_12AndPoof);
+ sLearnMoveStruct->state = 30;
+ gSpecialVar_0x8004 = 1;
+ }
+ }
+ break;
+ case 30:
+ if (!sub_81D2C3C())
+ {
+ sub_816084C(gText_PkmnForgotMoveAndLearnedNew);
+ sLearnMoveStruct->state = 31;
+ PlayFanfare(MUS_FANFA1);
+ }
+ break;
+ case 31:
+ if (!sub_81D2C3C())
+ {
+ PlayFanfare(MUS_FANFA1);
+ sLearnMoveStruct->state = 32;
+ }
+ break;
+ case 32:
+ if (IsFanfareTaskInactive())
+ {
+ sLearnMoveStruct->state = 33;
+ }
+ break;
+ case 33:
+ if (gMain.newKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sLearnMoveStruct->state = 14;
+ }
+ break;
+ }
+}
+
+static void FreeListMenuResources(void)
+{
+ RemoveScrollArrows();
+ DestroyListMenuTask(sLearnMoveStruct->listMenuTask, &sLearnMoveStruct2.listOffset, &sLearnMoveStruct2.listRow);
+ FreeAllWindowBuffers();
+ FREE_AND_SET_NULL(sLearnMoveStruct);
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+}
+
+static void HideSpritesAndPrintTeachText(bool8 a)
+{
+ s32 i;
+
+ for (i = 0; i < 16; i++)
+ {
+ gSprites[sLearnMoveStruct->spriteIds[i]].invisible = TRUE;
+ }
+
+ if (!a)
+ {
+ StringExpandPlaceholders(gStringVar4, gText_TeachWhichMoveToPkmn);
+ FillWindowPixelBuffer(3, 0x11);
+ AddTextPrinterParameterized(3, 1, gStringVar4, 0, 1, 0, NULL);
+ }
+}
+
+static void HandleInput(bool8 showContest)
+{
+ s32 itemId = ListMenuHandleInputGetItemId(sLearnMoveStruct->listMenuTask);
+ ListMenuGetScrollAndRow(sLearnMoveStruct->listMenuTask, &sLearnMoveStruct2.listOffset, &sLearnMoveStruct2.listRow);
+
+ switch (itemId)
+ {
+ case LIST_NOTHING_CHOSEN:
+ if (!(gMain.newKeys & (DPAD_LEFT | DPAD_RIGHT)) && !GetLRKeysState())
+ {
+ break;
+ }
+
+ PlaySE(SE_SELECT);
+
+ if (showContest == FALSE)
+ {
+ PutWindowTilemap(1);
+ sLearnMoveStruct->state = 5;
+ sLearnMoveStruct2.showContestInfo = TRUE;
+ }
+ else
+ {
+ PutWindowTilemap(0);
+ sLearnMoveStruct->state = 3;
+ sLearnMoveStruct2.showContestInfo = FALSE;
+ }
+
+ schedule_bg_copy_tilemap_to_vram(1);
+ ShowHideHearts(GetCurrentItemId());
+ break;
+ case LIST_B_PRESSED:
+ PlaySE(SE_SELECT);
+ RemoveScrollArrows();
+ sLearnMoveStruct->state = 12;
+ StringExpandPlaceholders(gStringVar4, gText_GiveUpTeachingNewMove);
+ sub_81D2BF4(gStringVar4);
+ break;
+ default:
+ PlaySE(SE_SELECT);
+ RemoveScrollArrows();
+ sLearnMoveStruct->state = 8;
+ StringCopy(gStringVar2, gMoveNames[itemId]);
+ StringExpandPlaceholders(gStringVar4, gText_TeachX);
+ sub_81D2BF4(gStringVar4);
+ break;
+ }
+}
+
+static s32 GetCurrentItemId(void)
+{
+ return sLearnMoveStruct->menuItems[sLearnMoveStruct2.listRow + sLearnMoveStruct2.listOffset].id;
+}
+
+static void ShowTeachMoveText(bool8 showContest)
+{
+ if (showContest == FALSE)
+ {
+ StringExpandPlaceholders(gStringVar4, gText_TeachWhichMoveToPkmn);
+ FillWindowPixelBuffer(3, 0x11);
+ AddTextPrinterParameterized(3, 1, gStringVar4, 0, 1, 0, NULL);
+ }
+}
+
+static void CreateHearts(void)
+{
+ int i;
+
+ sLearnMoveStruct->scrollArrowTaskId2 = -1;
+ sLearnMoveStruct->scrollArrowTaskId1 = -1;
+ AddScrollArrows();
+
+ for (i = 0; i < 8; i++)
+ {
+ sLearnMoveStruct->spriteIds[i] = CreateSprite(&gUnknown_085CEC10, (i - (i / 4) * 4) * 8 + 104, (i / 4) * 8 + 36, 0);
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ sLearnMoveStruct->spriteIds[i + 8] = CreateSprite(&gUnknown_085CEC10, (i - (i / 4) * 4) * 8 + 104, (i / 4) * 8 + 52, 0);
+ StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i + 8]], 2);
+ }
+
+ for (i = 0; i < 16; i++)
+ {
+ gSprites[sLearnMoveStruct->spriteIds[i]].invisible = TRUE;
+ }
+}
+
+static void AddScrollArrows(void)
+{
+ if (sLearnMoveStruct->scrollArrowTaskId2 == 0xFF)
+ {
+ sLearnMoveStruct->scrollArrowTaskId2 = AddScrollIndicatorArrowPair(&gUnknown_085CEBC0, &sLearnMoveStruct->scrollOffset);
+ }
+
+ if (sLearnMoveStruct->scrollArrowTaskId1 == 0xFF)
+ {
+ gTempScrollArrowTemplate = gUnknown_085CEBD0;
+ gTempScrollArrowTemplate.fullyDownThreshold = sLearnMoveStruct->numMenuChoices - sLearnMoveStruct->numToShowAtOnce;
+ sLearnMoveStruct->scrollArrowTaskId1 = AddScrollIndicatorArrowPair(&gTempScrollArrowTemplate, &sLearnMoveStruct2.listOffset);
+ }
+}
+
+static void RemoveScrollArrows(void)
+{
+ if (sLearnMoveStruct->scrollArrowTaskId2 != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sLearnMoveStruct->scrollArrowTaskId2);
+ sLearnMoveStruct->scrollArrowTaskId2 = 0xFF;
+ }
+
+ if (sLearnMoveStruct->scrollArrowTaskId1 != 0xFF)
+ {
+ RemoveScrollIndicatorArrowPair(sLearnMoveStruct->scrollArrowTaskId1);
+ sLearnMoveStruct->scrollArrowTaskId1 = 0xFF;
+ }
+}
+
+static void CreateMenuItemsList(void)
+{
+ s32 i;
+ u8 nickname[POKEMON_NAME_LENGTH + 1];
+
+ sLearnMoveStruct->numMenuChoices = GetMoveRelearnerMoves(&gPlayerParty[sLearnMoveStruct->partyMon], sLearnMoveStruct->movesToLearn);
+
+ for (i = 0; i < sLearnMoveStruct->numMenuChoices; i++)
+ {
+ sLearnMoveStruct->menuItems[i].name = gMoveNames[sLearnMoveStruct->movesToLearn[i]];
+ sLearnMoveStruct->menuItems[i].id = sLearnMoveStruct->movesToLearn[i];
+ }
+
+ GetMonData(&gPlayerParty[sLearnMoveStruct->partyMon], MON_DATA_NICKNAME, nickname);
+ StringCopy10(gStringVar1, nickname);
+ sLearnMoveStruct->menuItems[sLearnMoveStruct->numMenuChoices].name = gText_Cancel;
+ sLearnMoveStruct->menuItems[sLearnMoveStruct->numMenuChoices].id = LIST_B_PRESSED;
+ sLearnMoveStruct->numMenuChoices++;
+ sLearnMoveStruct->numToShowAtOnce = sub_81D28C8(sLearnMoveStruct->menuItems, sLearnMoveStruct->numMenuChoices);
+}
+
+void ShowHideHearts(s32 item)
+{
+ u16 numHearts;
+ u16 i;
+
+ if (!sLearnMoveStruct2.showContestInfo || item == LIST_B_PRESSED)
+ {
+ for (i = 0; i < 16; i++)
+ {
+ gSprites[sLearnMoveStruct->spriteIds[i]].invisible = TRUE;
+ }
+ }
+ else
+ {
+ numHearts = (u8)(gContestEffects[gContestMoves[item].effect].appeal / 10);
+
+ if (numHearts == 0xFF)
+ {
+ numHearts = 0;
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ if (i < numHearts)
+ {
+ StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i]], 1);
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i]], 0);
+ }
+ gSprites[sLearnMoveStruct->spriteIds[i]].invisible = FALSE;
+ }
+
+ numHearts = (u8)(gContestEffects[gContestMoves[item].effect].jam / 10);
+
+ if (numHearts == 0xFF)
+ {
+ numHearts = 0;
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ if (i < numHearts)
+ {
+ StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i + 8]], 3);
+ }
+ else
+ {
+ StartSpriteAnim(&gSprites[sLearnMoveStruct->spriteIds[i + 8]], 2);
+ }
+ gSprites[sLearnMoveStruct->spriteIds[i + 8]].invisible = FALSE;
+ }
+ }
+}