From baeacbe2f10ef69468d3bdb223d8ca74c963e9d6 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 12 Nov 2021 12:40:36 -0500 Subject: Clean up pokenav general menus, organize pokenav graphics --- src/pokenav_match_call_ui.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/pokenav_match_call_ui.c') diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index 47226ca72..ce3db25c5 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -94,8 +94,8 @@ u32 LoopedTask_sub_81C8870(s32 state); u32 LoopedTask_sub_81C8A28(s32 state); u32 LoopedTask_PrintCheckPageInfo(s32 state); -static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/arrows_matchcall.gbapal"); -static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/arrows_matchcall.4bpp.lz"); +static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/list_arrows.gbapal"); +static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.lz"); EWRAM_DATA u32 gUnknown_0203CF44 = 0; -- cgit v1.2.3 From da5752fd0d94a1b7fdef354b7fe4bfb055b4a545 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 12 Nov 2021 17:28:06 -0500 Subject: Start match call menu doc --- src/pokenav_match_call_ui.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/pokenav_match_call_ui.c') diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index ce3db25c5..83720f4cf 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -468,10 +468,10 @@ void sub_81C877C(void) structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8870, 6); } -void PrintCheckPageInfo(s16 a0) +void PrintCheckPageInfo(s16 delta) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - structPtr->unk888.windowTopIndex += a0; + structPtr->unk888.windowTopIndex += delta; structPtr->unk89C = 0; structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_PrintCheckPageInfo, 6); } -- cgit v1.2.3 From 3b91d8fdaf2a1e13c4af938dfb867d407ccb280f Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 12 Nov 2021 20:24:14 -0500 Subject: Start pokenav list ui doc --- src/pokenav_match_call_ui.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'src/pokenav_match_call_ui.c') diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index 83720f4cf..2cf6bf24e 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -49,7 +49,7 @@ struct PokenavSub17Substruct u32 loopedTaskId; s32 unk2C; u32 unk30; - void (*unk34)(struct PokenavMatchCallEntries *, u8*); + void (*unk34)(struct PokenavMatchCallEntry *, u8*); void (*unk38)(u16, u32, u32); struct Sprite *rightArrow; struct Sprite *upArrow; @@ -57,7 +57,6 @@ struct PokenavSub17Substruct u8 unkTextBuffer[0x40]; }; -// Generally at index 0x11 (17) struct PokenavSub17 { struct PokenavSub17Substruct list; @@ -68,7 +67,7 @@ struct PokenavSub17 }; void sub_81C82E4(struct PokenavSub17 *matchCall); -bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *a0, const struct BgTemplate *a1, struct PokenavListTemplate *a2, s32 a3); +static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *a0, const struct BgTemplate *a1, struct PokenavListTemplate *a2, s32 a3); void InitMatchCallWindowState(struct MatchCallWindowState *a0, struct PokenavListTemplate *a1); void SpriteCB_MatchCallUpArrow(struct Sprite *sprite); void SpriteCB_MatchCallDownArrow(struct Sprite *sprite); @@ -963,13 +962,13 @@ void InitMatchCallWindowState(struct MatchCallWindowState *dst, struct PokenavLi } } -bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, const struct BgTemplate *bgTemplate, struct PokenavListTemplate *template, s32 a3) +static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, const struct BgTemplate *bgTemplate, struct PokenavListTemplate *template, s32 a3) { struct WindowTemplate window; dest->listWindow.bg = bgTemplate->bg; dest->listWindow.unk6 = a3; - dest->unk34 = template->listFunc.unk10_2; + dest->unk34 = template->listFunc.bufferMatchCallItemFunc; dest->unk38 = template->unk14; dest->listWindow.unk1 = template->fillValue; dest->listWindow.unk2 = template->item_X; -- cgit v1.2.3 From ec051575683a781d912ded5837936f409057539e Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 13 Nov 2021 11:27:11 -0500 Subject: Move pokenav list item union out of list struct --- src/pokenav_match_call_ui.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src/pokenav_match_call_ui.c') diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index 2cf6bf24e..8392b613c 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -49,7 +49,7 @@ struct PokenavSub17Substruct u32 loopedTaskId; s32 unk2C; u32 unk30; - void (*unk34)(struct PokenavMatchCallEntry *, u8*); + PokenavListItemBufferFunc unk34; void (*unk38)(u16, u32, u32); struct Sprite *rightArrow; struct Sprite *upArrow; @@ -936,7 +936,7 @@ void ToggleMatchCallVerticalArrows(bool32 shouldHide) void InitMatchCallWindowState(struct MatchCallWindowState *dst, struct PokenavListTemplate *template) { - dst->unk10 = template->list.matchCallEntries; + dst->unk10 = template->list; dst->windowTopIndex = template->unk6; dst->listLength = template->count; dst->unkC = template->unk8; @@ -968,7 +968,7 @@ static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, co dest->listWindow.bg = bgTemplate->bg; dest->listWindow.unk6 = a3; - dest->unk34 = template->listFunc.bufferMatchCallItemFunc; + dest->unk34 = template->bufferItemFunc; dest->unk38 = template->unk14; dest->listWindow.unk1 = template->fillValue; dest->listWindow.unk2 = template->item_X; -- cgit v1.2.3 From b3e593dff5cf8f062afe5b03bb38937f5c23f4ec Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 13 Nov 2021 12:52:41 -0500 Subject: Continue pokenav list ui doc --- src/pokenav_match_call_ui.c | 650 ++++++++++++++++++++++---------------------- 1 file changed, 332 insertions(+), 318 deletions(-) (limited to 'src/pokenav_match_call_ui.c') diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index 8392b613c..70e541b55 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -8,23 +8,24 @@ #include "decompress.h" #include "international_string_util.h" -// TODO: This UI isnt just for match call, seems to be the general pokenav list UI +#define GFXTAG_ARROW 10 +#define PALTAG_ARROW 20 struct PokenavListMenuWindow { u8 bg; - u8 unk1; - u8 unk2; - u8 unk3; - u8 unk4; + u8 fillValue; + u8 x; + u8 y; + u8 width; u8 fontId; - u16 unk6; + u16 tileOffset; u16 windowId; u16 unkA; - u16 unkC; - u16 unkE; + u16 numPrinted; + u16 numToPrint; }; -struct MatchCallWindowState { +struct PokenavListWindowState { // The index of the element at the top of the window. u16 windowTopIndex; u16 listLength; @@ -33,203 +34,203 @@ struct MatchCallWindowState { u16 selectedIndexOffset; u16 visibleEntries; u16 unkA; - u32 unkC; - void * unk10; + u32 listItemSize; + void * listPtr; }; struct PokenavSub17Substruct { struct PokenavListMenuWindow listWindow; u32 unk10; - u32 unk14; - u32 unk18; - void * unk1C; - s32 unk20; - s32 unk24; + u32 printIndex; + u32 itemSize; + void * listPtr; + s32 startBgY; + s32 endBgY; u32 loopedTaskId; - s32 unk2C; - u32 unk30; - PokenavListItemBufferFunc unk34; - void (*unk38)(u16, u32, u32); + s32 moveDelta; + u32 bgMoveType; + PokenavListBufferItemFunc bufferItemFunc; + void (*iconDrawFunc)(u16, u32, u32); struct Sprite *rightArrow; struct Sprite *upArrow; struct Sprite *downArrow; - u8 unkTextBuffer[0x40]; + u8 itemTextBuffer[64]; }; struct PokenavSub17 { struct PokenavSub17Substruct list; - u8 tilemapBuffer[0x800]; - struct MatchCallWindowState unk888; + u8 tilemapBuffer[BG_SCREEN_SIZE]; + struct PokenavListWindowState windowState; s32 unk89C; u32 loopedTaskId; }; -void sub_81C82E4(struct PokenavSub17 *matchCall); -static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *a0, const struct BgTemplate *a1, struct PokenavListTemplate *a2, s32 a3); -void InitMatchCallWindowState(struct MatchCallWindowState *a0, struct PokenavListTemplate *a1); -void SpriteCB_MatchCallUpArrow(struct Sprite *sprite); -void SpriteCB_MatchCallDownArrow(struct Sprite *sprite); -void SpriteCB_MatchCallRightArrow(struct Sprite *sprite); -void ToggleMatchCallArrows(struct PokenavSub17Substruct *a0, u32 a1); -void DestroyMatchCallListArrows(struct PokenavSub17Substruct *a0); -void CreateMatchCallArrowSprites(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1); -void sub_81C8ED0(void); -static void PrintMatchCallFlavorText(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1, u32 a2); -void PrintMatchCallFieldNames(struct PokenavSub17Substruct *a0, u32 a1); -void sub_81C8D4C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1); -void sub_81C8CB4(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1); -void sub_81C8B70(struct PokenavListMenuWindow *a0, s32 a1, s32 a2); -void sub_81C8568(s32 a0, struct PokenavSub17Substruct *a1); -void sub_81C83AC(void * a0, u32 a1, u32 a2, u32 a3, u32 a4, struct PokenavSub17Substruct *a5); -void sub_81C837C(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *a1); -void sub_81C835C(struct PokenavListMenuWindow *a0); -u32 LoopedTask_sub_81C8254(s32 state); -bool32 sub_81C83E0(void); -u32 LoopedTask_sub_81C83F0(s32 state); -u32 LoopedTask_sub_81C85A0(s32 state); -u32 LoopedTask_sub_81C8870(s32 state); -u32 LoopedTask_sub_81C8A28(s32 state); -u32 LoopedTask_PrintCheckPageInfo(s32 state); - -static const u16 sMatchcallArrowPaletteData[] = INCBIN_U16("graphics/pokenav/list_arrows.gbapal"); -static const u32 sMatchcallArrowSpriteSheetData[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.lz"); - -EWRAM_DATA u32 gUnknown_0203CF44 = 0; - -bool32 sub_81C81D4(const struct BgTemplate *arg0, struct PokenavListTemplate *arg1, s32 arg2) -{ - struct PokenavSub17 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_LIST, sizeof(struct PokenavSub17)); +static void InitPokenavListBg(struct PokenavSub17 *); +static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *, const struct BgTemplate *, struct PokenavListTemplate *, s32); +static void InitPokenavListWindowState(struct PokenavListWindowState *, struct PokenavListTemplate *); +static void SpriteCB_UpArrow(struct Sprite *); +static void SpriteCB_DownArrow(struct Sprite *); +static void SpriteCB_RightArrow(struct Sprite *); +static void ToggleListArrows(struct PokenavSub17Substruct *, u32); +static void DestroyListArrows(struct PokenavSub17Substruct *); +static void CreateListArrowSprites(struct PokenavListWindowState *, struct PokenavSub17Substruct *); +static void LoadListArrowGfx(void); +static void PrintMatchCallFlavorText(struct PokenavListWindowState *, struct PokenavSub17Substruct *, u32); +static void PrintMatchCallFieldNames(struct PokenavSub17Substruct *, u32); +static void PrintMatchCallListTrainerName(struct PokenavListWindowState *, struct PokenavSub17Substruct *); +static void PrintCheckPageTrainerName(struct PokenavListWindowState *, struct PokenavSub17Substruct *); +static void sub_81C8B70(struct PokenavListMenuWindow *, s32, s32); +static void CreateMoveListWindowTask(s32, struct PokenavSub17Substruct *); +static void PrintListItems(void *, u32, u32, u32, u32, struct PokenavSub17Substruct *); +static void InitListItems(struct PokenavListWindowState *, struct PokenavSub17Substruct *); +static void InitPokenavListWindow(struct PokenavListMenuWindow *); +static u32 LoopedTask_CreatePokenavList(s32); +static bool32 IsPrintListItemsTaskActive(void); +static u32 LoopedTask_PrintListItems(s32); +static u32 LoopedTask_MoveListWindow(s32); +static u32 LoopedTask_sub_81C8870(s32); +static u32 LoopedTask_sub_81C8A28(s32); +static u32 LoopedTask_PrintCheckPageInfo(s32); + +static const u16 sListArrow_Pal[] = INCBIN_U16("graphics/pokenav/list_arrows.gbapal"); +static const u32 sListArrow_Gfx[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.lz"); + +static EWRAM_DATA u32 gUnknown_0203CF44 = 0; + +bool32 CreatePokenavList(const struct BgTemplate *bgTemplate, struct PokenavListTemplate *listTemplate, s32 tileOffset) +{ + struct PokenavSub17 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_LIST, sizeof(struct PokenavSub17)); if (structPtr == NULL) return FALSE; - InitMatchCallWindowState(&structPtr->unk888, arg1); - if (!CopyPokenavListMenuTemplate(&structPtr->list, arg0, arg1, arg2)) + InitPokenavListWindowState(&structPtr->windowState, listTemplate); + if (!CopyPokenavListMenuTemplate(&structPtr->list, bgTemplate, listTemplate, tileOffset)) return FALSE; - CreateLoopedTask(LoopedTask_sub_81C8254, 6); + CreateLoopedTask(LoopedTask_CreatePokenavList, 6); return TRUE; } -bool32 sub_81C8224(void) +bool32 IsCreatePokenavListTaskActive(void) { - return FuncIsActiveLoopedTask(LoopedTask_sub_81C8254); + return FuncIsActiveLoopedTask(LoopedTask_CreatePokenavList); } -void sub_81C8234(void) +void DestroyPokenavList(void) { - struct PokenavSub17 *structPtr; - - structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - DestroyMatchCallListArrows(&structPtr->list); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + DestroyListArrows(&structPtr->list); RemoveWindow(structPtr->list.listWindow.windowId); - FreePokenavSubstruct(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + FreePokenavSubstruct(POKENAV_SUBSTRUCT_LIST); } -u32 LoopedTask_sub_81C8254(s32 state) +static u32 LoopedTask_CreatePokenavList(s32 state) { struct PokenavSub17 *structPtr; if (IsDma3ManagerBusyWithBgCopy()) return LT_PAUSE; - structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); switch (state) { case 0: - sub_81C82E4(structPtr); + InitPokenavListBg(structPtr); return LT_INC_AND_PAUSE; case 1: - sub_81C835C(&structPtr->list.listWindow); + InitPokenavListWindow(&structPtr->list.listWindow); return LT_INC_AND_PAUSE; case 2: - sub_81C837C(&structPtr->unk888, &structPtr->list); + InitListItems(&structPtr->windowState, &structPtr->list); return LT_INC_AND_PAUSE; case 3: - if (sub_81C83E0()) + if (IsPrintListItemsTaskActive()) { return LT_PAUSE; } else { - sub_81C8ED0(); + LoadListArrowGfx(); return LT_INC_AND_CONTINUE; } case 4: - CreateMatchCallArrowSprites(&structPtr->unk888, &structPtr->list); + CreateListArrowSprites(&structPtr->windowState, &structPtr->list); return LT_FINISH; default: return LT_FINISH; } } -void sub_81C82E4(struct PokenavSub17 *matchCall) +static void InitPokenavListBg(struct PokenavSub17 *a0) { - u16 tileNum = (matchCall->list.listWindow.unk1 << 12) | matchCall->list.listWindow.unk6; - BgDmaFill(matchCall->list.listWindow.bg, PIXEL_FILL(1), matchCall->list.listWindow.unk6, 1); - BgDmaFill(matchCall->list.listWindow.bg, PIXEL_FILL(4), matchCall->list.listWindow.unk6 + 1, 1); - SetBgTilemapBuffer(matchCall->list.listWindow.bg, matchCall->tilemapBuffer); - FillBgTilemapBufferRect_Palette0(matchCall->list.listWindow.bg, tileNum, 0, 0, 32, 32); - ChangeBgY(matchCall->list.listWindow.bg, 0, BG_COORD_SET); - ChangeBgX(matchCall->list.listWindow.bg, 0, BG_COORD_SET); - ChangeBgY(matchCall->list.listWindow.bg, matchCall->list.listWindow.unk3 << 11, BG_COORD_SUB); - CopyBgTilemapBufferToVram(matchCall->list.listWindow.bg); + u16 tileNum = (a0->list.listWindow.fillValue << 12) | a0->list.listWindow.tileOffset; + BgDmaFill(a0->list.listWindow.bg, PIXEL_FILL(1), a0->list.listWindow.tileOffset, 1); + BgDmaFill(a0->list.listWindow.bg, PIXEL_FILL(4), a0->list.listWindow.tileOffset + 1, 1); + SetBgTilemapBuffer(a0->list.listWindow.bg, a0->tilemapBuffer); + FillBgTilemapBufferRect_Palette0(a0->list.listWindow.bg, tileNum, 0, 0, 32, 32); + ChangeBgY(a0->list.listWindow.bg, 0, BG_COORD_SET); + ChangeBgX(a0->list.listWindow.bg, 0, BG_COORD_SET); + ChangeBgY(a0->list.listWindow.bg, a0->list.listWindow.y << 11, BG_COORD_SUB); + CopyBgTilemapBufferToVram(a0->list.listWindow.bg); } -void sub_81C835C(struct PokenavListMenuWindow *listWindow) +static void InitPokenavListWindow(struct PokenavListMenuWindow *listWindow) { FillWindowPixelBuffer(listWindow->windowId, PIXEL_FILL(1)); PutWindowTilemap(listWindow->windowId); CopyWindowToVram(listWindow->windowId, COPYWIN_MAP); } -void sub_81C837C(struct MatchCallWindowState *state, struct PokenavSub17Substruct *a1) +static void InitListItems(struct PokenavListWindowState *windowState, struct PokenavSub17Substruct *a1) { - s32 arg2 = state->listLength - state->windowTopIndex; - if (arg2 > state->visibleEntries) - arg2 = state->visibleEntries; + s32 numToPrint = windowState->listLength - windowState->windowTopIndex; + if (numToPrint > windowState->visibleEntries) + numToPrint = windowState->visibleEntries; - sub_81C83AC(state->unk10, state->windowTopIndex, arg2, state->unkC, 0, a1); + PrintListItems(windowState->listPtr, windowState->windowTopIndex, numToPrint, windowState->listItemSize, 0, a1); } -void sub_81C83AC(void * a0, u32 a1, u32 a2, u32 a3, u32 a4, struct PokenavSub17Substruct *list) +static void PrintListItems(void * listPtr, u32 topIndex, u32 numItems, u32 itemSize, u32 a4, struct PokenavSub17Substruct *list) { - if (a2 == 0) + if (numItems == 0) return; - list->unk1C = a0 + a1 * a3; - list->unk18 = a3; - list->listWindow.unkC = 0; - list->listWindow.unkE = a2; - list->unk14 = a1; + list->listPtr = listPtr + topIndex * itemSize; + list->itemSize = itemSize; + list->listWindow.numPrinted = 0; + list->listWindow.numToPrint = numItems; + list->printIndex = topIndex; list->unk10 = a4; - CreateLoopedTask(LoopedTask_sub_81C83F0, 5); + CreateLoopedTask(LoopedTask_PrintListItems, 5); } -bool32 sub_81C83E0(void) +static bool32 IsPrintListItemsTaskActive(void) { - return FuncIsActiveLoopedTask(LoopedTask_sub_81C83F0); + return FuncIsActiveLoopedTask(LoopedTask_PrintListItems); } -u32 LoopedTask_sub_81C83F0(s32 state) +static u32 LoopedTask_PrintListItems(s32 state) { u32 v1; - struct PokenavSub17Substruct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + struct PokenavSub17Substruct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); switch (state) { case 0: - v1 = (structPtr->listWindow.unkA + structPtr->listWindow.unkC + structPtr->unk10) & 0xF; - structPtr->unk34(structPtr->unk1C, structPtr->unkTextBuffer); - if (structPtr->unk38 != NULL) - structPtr->unk38(structPtr->listWindow.windowId, structPtr->unk14, v1); + v1 = (structPtr->listWindow.unkA + structPtr->listWindow.numPrinted + structPtr->unk10) & 0xF; + structPtr->bufferItemFunc(structPtr->listPtr, structPtr->itemTextBuffer); + if (structPtr->iconDrawFunc != NULL) + structPtr->iconDrawFunc(structPtr->listWindow.windowId, structPtr->printIndex, v1); - AddTextPrinterParameterized(structPtr->listWindow.windowId, structPtr->listWindow.fontId, structPtr->unkTextBuffer, 8, (v1 << 4) + 1, 255, NULL); - if (++structPtr->listWindow.unkC >= structPtr->listWindow.unkE) + AddTextPrinterParameterized(structPtr->listWindow.windowId, structPtr->listWindow.fontId, structPtr->itemTextBuffer, 8, (v1 << 4) + 1, 255, NULL); + if (++structPtr->listWindow.numPrinted >= structPtr->listWindow.numToPrint) { - if (structPtr->unk38 != NULL) + // Finished printing items. If icons were being drawn, draw the + // window tilemap and graphics. Otherwise just do the graphics + if (structPtr->iconDrawFunc != NULL) CopyWindowToVram(structPtr->listWindow.windowId, COPYWIN_FULL); else CopyWindowToVram(structPtr->listWindow.windowId, COPYWIN_GFX); @@ -237,8 +238,8 @@ u32 LoopedTask_sub_81C83F0(s32 state) } else { - structPtr->unk1C += structPtr->unk18; - structPtr->unk14++; + structPtr->listPtr += structPtr->itemSize; + structPtr->printIndex++; return LT_CONTINUE; } case 1: @@ -251,88 +252,88 @@ u32 LoopedTask_sub_81C83F0(s32 state) bool32 ShouldShowUpArrow(void) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - return (structPtr->unk888.windowTopIndex != 0); + return (structPtr->windowState.windowTopIndex != 0); } bool32 ShouldShowDownArrow(void) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - struct MatchCallWindowState *subPtr = &structPtr->unk888; + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + struct PokenavListWindowState *subPtr = &structPtr->windowState; return (subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength); } -void MatchCall_MoveWindow(s32 a0, bool32 a1) +static void MoveListWindow(s32 delta, bool32 a1) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - struct MatchCallWindowState *subPtr = &structPtr->unk888; + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + struct PokenavListWindowState *subPtr = &structPtr->windowState; - if (a0 < 0) + if (delta < 0) { - if (subPtr->windowTopIndex + a0 < 0) - a0 = -1 * subPtr->windowTopIndex; + if (subPtr->windowTopIndex + delta < 0) + delta = -1 * subPtr->windowTopIndex; if (a1) - sub_81C83AC(subPtr->unk10, subPtr->windowTopIndex + a0, a0 * -1, subPtr->unkC, a0, &structPtr->list); + PrintListItems(subPtr->listPtr, subPtr->windowTopIndex + delta, delta * -1, subPtr->listItemSize, delta, &structPtr->list); } else if (a1) { s32 temp = gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries; - if (temp + a0 >= subPtr->listLength) - a0 = subPtr->listLength - temp; + if (temp + delta >= subPtr->listLength) + delta = subPtr->listLength - temp; - sub_81C83AC(subPtr->unk10, gUnknown_0203CF44, a0, subPtr->unkC, subPtr->visibleEntries, &structPtr->list); + PrintListItems(subPtr->listPtr, gUnknown_0203CF44, delta, subPtr->listItemSize, subPtr->visibleEntries, &structPtr->list); } - sub_81C8568(a0, &structPtr->list); - subPtr->windowTopIndex += a0; + CreateMoveListWindowTask(delta, &structPtr->list); + subPtr->windowTopIndex += delta; } -void sub_81C8568(s32 a0, struct PokenavSub17Substruct *list) +static void CreateMoveListWindowTask(s32 delta, struct PokenavSub17Substruct *list) { - list->unk20 = GetBgY(list->listWindow.bg); - list->unk24 = list->unk20 + (a0 << 12); - if (a0 > 0) - list->unk30 = BG_COORD_ADD; + list->startBgY = GetBgY(list->listWindow.bg); + list->endBgY = list->startBgY + (delta << 12); + if (delta > 0) + list->bgMoveType = BG_COORD_ADD; else - list->unk30 = BG_COORD_SUB; - list->unk2C = a0; - list->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C85A0, 6); + list->bgMoveType = BG_COORD_SUB; + list->moveDelta = delta; + list->loopedTaskId = CreateLoopedTask(LoopedTask_MoveListWindow, 6); } -u32 LoopedTask_sub_81C85A0(s32 state) +static u32 LoopedTask_MoveListWindow(s32 state) { - s32 y, v1; - bool32 flag; - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + s32 oldY, newY; + bool32 finished; + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); struct PokenavSub17Substruct *subPtr = &structPtr->list; switch (state) { case 0: - if (!sub_81C83E0()) + if (!IsPrintListItemsTaskActive()) return LT_INC_AND_CONTINUE; return LT_PAUSE; case 1: - flag = FALSE; - y = GetBgY(subPtr->listWindow.bg); - v1 = ChangeBgY(subPtr->listWindow.bg, 0x1000, subPtr->unk30); - if (subPtr->unk30 == BG_COORD_SUB) + finished = FALSE; + oldY = GetBgY(subPtr->listWindow.bg); + newY = ChangeBgY(subPtr->listWindow.bg, 0x1000, subPtr->bgMoveType); + if (subPtr->bgMoveType == BG_COORD_SUB) { - if ((y > subPtr->unk24 || y <= subPtr->unk20) && v1 <= subPtr->unk24) - flag = TRUE; + if ((oldY > subPtr->endBgY || oldY <= subPtr->startBgY) && newY <= subPtr->endBgY) + finished = TRUE; } else // BG_COORD_ADD { - if ((y < subPtr->unk24 || y >= subPtr->unk20) && v1 >= subPtr->unk24) - flag = TRUE; + if ((oldY < subPtr->endBgY || oldY >= subPtr->startBgY) && newY >= subPtr->endBgY) + finished = TRUE; } - if (flag) + if (finished) { - subPtr->listWindow.unkA = (subPtr->listWindow.unkA + subPtr->unk2C) & 0xF; - ChangeBgY(subPtr->listWindow.bg, subPtr->unk24, BG_COORD_SET); + subPtr->listWindow.unkA = (subPtr->listWindow.unkA + subPtr->moveDelta) & 0xF; + ChangeBgY(subPtr->listWindow.bg, subPtr->endBgY, BG_COORD_SET); return LT_FINISH; } return LT_PAUSE; @@ -340,21 +341,21 @@ u32 LoopedTask_sub_81C85A0(s32 state) return LT_FINISH; } -bool32 IsMonListLoopedTaskActive(void) +bool32 IsMovePokenavListWindowTaskActive(void) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); return IsLoopedTaskActive(structPtr->list.loopedTaskId); } -struct MatchCallWindowState *GetMatchCallWindowStruct(void) +static struct PokenavListWindowState *GetPokenavListWindowState(void) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - return &structPtr->unk888; + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + return &structPtr->windowState; } -int MatchCall_MoveCursorUp(void) +int PokenavList_MoveCursorUp(void) { - struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct(); + struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); if (structPtr->selectedIndexOffset != 0) { @@ -363,15 +364,15 @@ int MatchCall_MoveCursorUp(void) } if (ShouldShowUpArrow()) { - MatchCall_MoveWindow(-1, TRUE); + MoveListWindow(-1, TRUE); return 2; } return 0; } -int MatchCall_MoveCursorDown(void) +int PokenavList_MoveCursorDown(void) { - struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct(); + struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); if (structPtr->windowTopIndex + structPtr->selectedIndexOffset >= structPtr->listLength - 1) return 0; @@ -382,16 +383,16 @@ int MatchCall_MoveCursorDown(void) } if (ShouldShowDownArrow()) { - MatchCall_MoveWindow(1, TRUE); + MoveListWindow(1, TRUE); return 2; } return 0; } -int MatchCall_PageUp(void) +int PokenavList_PageUp(void) { s32 scroll; - struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct(); + struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); if (ShouldShowUpArrow()) { @@ -399,7 +400,7 @@ int MatchCall_PageUp(void) scroll = structPtr->visibleEntries; else scroll = structPtr->windowTopIndex; - MatchCall_MoveWindow(scroll * -1, TRUE); + MoveListWindow(scroll * -1, TRUE); return 2; } else if (structPtr->selectedIndexOffset != 0) @@ -410,9 +411,9 @@ int MatchCall_PageUp(void) return 0; } -int MatchCall_PageDown(void) +int PokenavList_PageDown(void) { - struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct(); + struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); if (ShouldShowDownArrow()) { @@ -421,7 +422,7 @@ int MatchCall_PageDown(void) if (windowBottomIndex <= structPtr->unk4) scroll = structPtr->visibleEntries; - MatchCall_MoveWindow(scroll, TRUE); + MoveListWindow(scroll, TRUE); return 2; } else @@ -448,66 +449,65 @@ int MatchCall_PageDown(void) u32 GetSelectedPokenavListIndex(void) { - struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct(); + struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); return structPtr->windowTopIndex + structPtr->selectedIndexOffset; } u32 GetMatchCallListTopIndex(void) { - struct MatchCallWindowState *structPtr = GetMatchCallWindowStruct(); + struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); return structPtr->windowTopIndex; } void sub_81C877C(void) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); structPtr->unk89C = 0; structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8870, 6); } void PrintCheckPageInfo(s16 delta) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - structPtr->unk888.windowTopIndex += delta; + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + structPtr->windowState.windowTopIndex += delta; structPtr->unk89C = 0; structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_PrintCheckPageInfo, 6); } void sub_81C87F0(void) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); structPtr->unk89C = 0; structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8A28, 6); } bool32 IsMatchCallListTaskActive(void) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); return IsLoopedTaskActive(structPtr->loopedTaskId); } -void sub_81C8838(void) +void PokenavList_DrawCurrentItemIcon(void) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - struct MatchCallWindowState *subPtr = &structPtr->unk888; - structPtr->list.unk38(structPtr->list.listWindow.windowId, subPtr->windowTopIndex + subPtr->selectedIndexOffset, (structPtr->list.listWindow.unkA + subPtr->selectedIndexOffset) & 0xF); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + struct PokenavListWindowState *subPtr = &structPtr->windowState; + structPtr->list.iconDrawFunc(structPtr->list.listWindow.windowId, subPtr->windowTopIndex + subPtr->selectedIndexOffset, (structPtr->list.listWindow.unkA + subPtr->selectedIndexOffset) & 0xF); CopyWindowToVram(structPtr->list.listWindow.windowId, COPYWIN_MAP); } -// TODO: -u32 LoopedTask_sub_81C8870(s32 state) +static u32 LoopedTask_sub_81C8870(s32 state) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); switch (state) { case 0: - ToggleMatchCallArrows(&structPtr->list, 1); + ToggleListArrows(&structPtr->list, 1); // fall-through case 1: - if (structPtr->unk89C != structPtr->unk888.selectedIndexOffset) + if (structPtr->unk89C != structPtr->windowState.selectedIndexOffset) sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, 1); structPtr->unk89C++; @@ -515,10 +515,10 @@ u32 LoopedTask_sub_81C8870(s32 state) case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - if (structPtr->unk89C != structPtr->unk888.visibleEntries) + if (structPtr->unk89C != structPtr->windowState.visibleEntries) return 6; - if (structPtr->unk888.selectedIndexOffset != 0) - sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, structPtr->unk888.selectedIndexOffset); + if (structPtr->windowState.selectedIndexOffset != 0) + sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, structPtr->windowState.selectedIndexOffset); return LT_INC_AND_PAUSE; } @@ -526,55 +526,55 @@ u32 LoopedTask_sub_81C8870(s32 state) case 3: if (!IsDma3ManagerBusyWithBgCopy()) { - if (structPtr->unk888.selectedIndexOffset != 0) + if (structPtr->windowState.selectedIndexOffset != 0) { - MatchCall_MoveWindow(structPtr->unk888.selectedIndexOffset, FALSE); + MoveListWindow(structPtr->windowState.selectedIndexOffset, FALSE); return LT_INC_AND_PAUSE; } return LT_FINISH; } return LT_PAUSE; case 4: - if (IsMonListLoopedTaskActive()) + if (IsMovePokenavListWindowTaskActive()) return LT_PAUSE; - structPtr->unk888.selectedIndexOffset = 0; + structPtr->windowState.selectedIndexOffset = 0; return LT_FINISH; } return LT_FINISH; } -u32 LoopedTask_PrintCheckPageInfo(s32 state) +static u32 LoopedTask_PrintCheckPageInfo(s32 state) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); if (IsDma3ManagerBusyWithBgCopy()) return LT_PAUSE; switch (state) { case 0: - sub_81C8CB4(&structPtr->unk888, &structPtr->list); + PrintCheckPageTrainerName(&structPtr->windowState, &structPtr->list); break; case 1: PrintMatchCallFieldNames(&structPtr->list, 0); break; case 2: - PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_STRATEGY); + PrintMatchCallFlavorText(&structPtr->windowState, &structPtr->list, CHECK_PAGE_STRATEGY); break; case 3: PrintMatchCallFieldNames(&structPtr->list, 1); break; case 4: - PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_POKEMON); + PrintMatchCallFlavorText(&structPtr->windowState, &structPtr->list, CHECK_PAGE_POKEMON); break; case 5: PrintMatchCallFieldNames(&structPtr->list, 2); break; case 6: - PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_INTRO_1); + PrintMatchCallFlavorText(&structPtr->windowState, &structPtr->list, CHECK_PAGE_INTRO_1); break; case 7: - PrintMatchCallFlavorText(&structPtr->unk888, &structPtr->list, CHECK_PAGE_INTRO_2); + PrintMatchCallFlavorText(&structPtr->windowState, &structPtr->list, CHECK_PAGE_INTRO_2); break; default: return LT_FINISH; @@ -582,95 +582,95 @@ u32 LoopedTask_PrintCheckPageInfo(s32 state) return LT_INC_AND_PAUSE; } -u32 LoopedTask_sub_81C8A28(s32 state) +static u32 LoopedTask_sub_81C8A28(s32 state) { struct PokenavSub17 *structPtr; - struct MatchCallWindowState *subPtr888; + struct PokenavListWindowState *windowState; struct PokenavSub17Substruct *subPtr0; s32 r5, *ptr; if (IsDma3ManagerBusyWithBgCopy()) return LT_PAUSE; - structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - subPtr888 = &structPtr->unk888; + structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + windowState = &structPtr->windowState; subPtr0 = &structPtr->list; switch (state) { case 0: - sub_81C8D4C(subPtr888, subPtr0); + PrintMatchCallListTrainerName(windowState, subPtr0); return LT_INC_AND_PAUSE; case 1: ptr = &structPtr->unk89C; - if (++(*ptr) < structPtr->unk888.visibleEntries) + if (++(*ptr) < structPtr->windowState.visibleEntries) { sub_81C8B70(&subPtr0->listWindow, *ptr, 1); return LT_PAUSE; } *ptr = 0; - if (subPtr888->listLength <= subPtr888->visibleEntries) + if (windowState->listLength <= windowState->visibleEntries) { - if (subPtr888->windowTopIndex != 0) + if (windowState->windowTopIndex != 0) { - s32 r4 = subPtr888->windowTopIndex; + s32 r4 = windowState->windowTopIndex; r5 = -r4; sub_81C8B70(&subPtr0->listWindow, r5, r4); - subPtr888->selectedIndexOffset = r4; + windowState->selectedIndexOffset = r4; *ptr = r5; return LT_INC_AND_PAUSE; } } else { - if (subPtr888->windowTopIndex + subPtr888->visibleEntries > subPtr888->listLength) + if (windowState->windowTopIndex + windowState->visibleEntries > windowState->listLength) { - s32 r4 = subPtr888->windowTopIndex + subPtr888->visibleEntries - subPtr888->listLength; + s32 r4 = windowState->windowTopIndex + windowState->visibleEntries - windowState->listLength; r5 = -r4; sub_81C8B70(&subPtr0->listWindow, r5, r4); - subPtr888->selectedIndexOffset = r4; + windowState->selectedIndexOffset = r4; *ptr = r5; return LT_INC_AND_PAUSE; } } return 9; case 2: - MatchCall_MoveWindow(structPtr->unk89C, FALSE); + MoveListWindow(structPtr->unk89C, FALSE); return LT_INC_AND_PAUSE; case 3: - if (!IsMonListLoopedTaskActive()) + if (!IsMovePokenavListWindowTaskActive()) { structPtr->unk89C = 0; return 1; } return 2; case 4: - sub_81C83AC(subPtr888->unk10, subPtr888->windowTopIndex + structPtr->unk89C, 1, subPtr888->unkC, structPtr->unk89C, &structPtr->list); + PrintListItems(windowState->listPtr, windowState->windowTopIndex + structPtr->unk89C, 1, windowState->listItemSize, structPtr->unk89C, &structPtr->list); return LT_INC_AND_PAUSE; case 5: - if (sub_81C83E0()) + if (IsPrintListItemsTaskActive()) return LT_PAUSE; - if (++structPtr->unk89C >= subPtr888->listLength || structPtr->unk89C >= subPtr888->visibleEntries) + if (++structPtr->unk89C >= windowState->listLength || structPtr->unk89C >= windowState->visibleEntries) return LT_INC_AND_CONTINUE; return 9; case 6: - ToggleMatchCallArrows(subPtr0, 0); + ToggleListArrows(subPtr0, 0); return LT_FINISH; } return LT_FINISH; } -void sub_81C8B70(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2) +static void sub_81C8B70(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2) { - u8 *v1 = (u8*)GetWindowAttribute(listWindow->windowId, WINDOW_TILE_DATA); - u32 v2 = listWindow->unk4 * 64; + u8 *tileData = (u8*)GetWindowAttribute(listWindow->windowId, WINDOW_TILE_DATA); + u32 v2 = listWindow->width * 64; a1 = (listWindow->unkA + a1) & 0xF; if (a1 + a2 <= 16) { - CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, a2 * v2); + CpuFastFill8(PIXEL_FILL(1), tileData + a1 * v2, a2 * v2); CopyWindowToVram(listWindow->windowId, COPYWIN_GFX); } else @@ -678,8 +678,8 @@ void sub_81C8B70(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2) u32 v3 = 16 - a1; u32 v4 = a2 - v3; - CpuFastFill8(PIXEL_FILL(1), v1 + a1 * v2, v3 * v2); - CpuFastFill8(PIXEL_FILL(1), v1, v4 * v2); + CpuFastFill8(PIXEL_FILL(1), tileData + a1 * v2, v3 * v2); + CpuFastFill8(PIXEL_FILL(1), tileData, v4 * v2); CopyWindowToVram(listWindow->windowId, COPYWIN_GFX); } @@ -693,50 +693,56 @@ void sub_81C8C64(struct PokenavListMenuWindow *listWindow, u32 a1) { u16 var; u16 *v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(listWindow->windowId, WINDOW_BG)); - v1 += ((listWindow->unkA << 6) + listWindow->unk2) - 1; + v1 += ((listWindow->unkA << 6) + listWindow->x) - 1; if (a1 != 0) - var = (listWindow->unk1 << 12) | (listWindow->unk6 + 1); + var = (listWindow->fillValue << 12) | (listWindow->tileOffset + 1); else - var = (listWindow->unk1 << 12) | (listWindow->unk6); + var = (listWindow->fillValue << 12) | (listWindow->tileOffset); v1[0] = var; v1[0x20] = var; } -void sub_81C8CB4(struct MatchCallWindowState *state, struct PokenavSub17Substruct *list) +// Print the trainer's name and title at the top of their check page +static void PrintCheckPageTrainerName(struct PokenavListWindowState *state, struct PokenavSub17Substruct *list) { u8 colors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_RED}; - list->unk34(state->unk10 + state->unkC * state->windowTopIndex, list->unkTextBuffer); - list->unk38(list->listWindow.windowId, state->windowTopIndex, list->listWindow.unkA); - FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(4), 0, list->listWindow.unkA * 16, list->listWindow.unk4 * 8, 16); - AddTextPrinterParameterized3(list->listWindow.windowId, list->listWindow.fontId, 8, (list->listWindow.unkA * 16) + 1, colors, TEXT_SKIP_DRAW, list->unkTextBuffer); + list->bufferItemFunc(state->listPtr + state->listItemSize * state->windowTopIndex, list->itemTextBuffer); + list->iconDrawFunc(list->listWindow.windowId, state->windowTopIndex, list->listWindow.unkA); + FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(4), 0, list->listWindow.unkA * 16, list->listWindow.width * 8, 16); + AddTextPrinterParameterized3(list->listWindow.windowId, list->listWindow.fontId, 8, (list->listWindow.unkA * 16) + 1, colors, TEXT_SKIP_DRAW, list->itemTextBuffer); sub_81C8C64(&list->listWindow, 1); - CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_FULL, 0, list->listWindow.unkA * 2, list->listWindow.unk4, 2); + CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_FULL, 0, list->listWindow.unkA * 2, list->listWindow.width, 2); } -void sub_81C8D4C(struct MatchCallWindowState *state, struct PokenavSub17Substruct *list) +// Print the trainer's name and title for the list (to replace the check page name and title, which has a red background) +static void PrintMatchCallListTrainerName(struct PokenavListWindowState *state, struct PokenavSub17Substruct *list) { - list->unk34(state->unk10 + state->unkC * state->windowTopIndex, list->unkTextBuffer); - FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, list->listWindow.unkA * 16, list->listWindow.unk4 * 8, 16); - AddTextPrinterParameterized(list->listWindow.windowId, list->listWindow.fontId, list->unkTextBuffer, 8, list->listWindow.unkA * 16 + 1, TEXT_SKIP_DRAW, NULL); + list->bufferItemFunc(state->listPtr + state->listItemSize * state->windowTopIndex, list->itemTextBuffer); + FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, list->listWindow.unkA * 16, list->listWindow.width * 8, 16); + AddTextPrinterParameterized(list->listWindow.windowId, list->listWindow.fontId, list->itemTextBuffer, 8, list->listWindow.unkA * 16 + 1, TEXT_SKIP_DRAW, NULL); sub_81C8C64(&list->listWindow, 0); CopyWindowToVram(list->listWindow.windowId, COPYWIN_FULL); } -void PrintMatchCallFieldNames(struct PokenavSub17Substruct *list, u32 fieldId) +static void PrintMatchCallFieldNames(struct PokenavSub17Substruct *list, u32 fieldId) { - const u8 *fieldNames[] = {gText_PokenavMatchCall_Strategy, gText_PokenavMatchCall_TrainerPokemon, gText_PokenavMatchCall_SelfIntroduction}; + const u8 *fieldNames[] = { + gText_PokenavMatchCall_Strategy, + gText_PokenavMatchCall_TrainerPokemon, + gText_PokenavMatchCall_SelfIntroduction + }; u8 colors[3] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}; u32 top = (list->listWindow.unkA + 1 + (fieldId * 2)) & 0xF; - FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, top << 4, list->listWindow.unk4, 16); + FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, top << 4, list->listWindow.width, 16); AddTextPrinterParameterized3(list->listWindow.windowId, FONT_NARROW, 2, (top << 4) + 1, colors, TEXT_SKIP_DRAW, fieldNames[fieldId]); - CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, top << 1, list->listWindow.unk4, 2); + CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, top << 1, list->listWindow.width, 2); } -static void PrintMatchCallFlavorText(struct MatchCallWindowState *a0, struct PokenavSub17Substruct *list, u32 checkPageEntry) +static void PrintMatchCallFlavorText(struct PokenavListWindowState *a0, struct PokenavSub17Substruct *list, u32 checkPageEntry) { // lines 1, 3, and 5 are the field names printed by PrintMatchCallFieldNames static const u8 lineOffsets[CHECK_PAGE_ENTRY_COUNT] = @@ -752,31 +758,31 @@ static void PrintMatchCallFlavorText(struct MatchCallWindowState *a0, struct Pok if (str != NULL) { - FillWindowTilesByRow(list->listWindow.windowId, 1, r6 * 2, list->listWindow.unk4 - 1, 2); + FillWindowTilesByRow(list->listWindow.windowId, 1, r6 * 2, list->listWindow.width - 1, 2); AddTextPrinterParameterized(list->listWindow.windowId, FONT_NARROW, str, 2, (r6 << 4) + 1, TEXT_SKIP_DRAW, NULL); - CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, r6 * 2, list->listWindow.unk4, 2); + CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, r6 * 2, list->listWindow.width, 2); } } -static const struct CompressedSpriteSheet sMatchcallArrowSpriteSheets[] = +static const struct CompressedSpriteSheet sListArrowSpriteSheets[] = { { - .data = sMatchcallArrowSpriteSheetData, + .data = sListArrow_Gfx, .size = 192, - .tag = 0xA + .tag = GFXTAG_ARROW } }; -static const struct SpritePalette sMatchcallArrowPalettes[] = +static const struct SpritePalette sListArrowPalettes[] = { { - .data = sMatchcallArrowPaletteData, - .tag = 0x14 + .data = sListArrow_Pal, + .tag = PALTAG_ARROW }, {} }; -static const struct OamData sMatchCallRightArrowSpriteOam = +static const struct OamData sOamData_RightArrow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -790,18 +796,18 @@ static const struct OamData sMatchCallRightArrowSpriteOam = .paletteNum = 0 }; -static const struct SpriteTemplate sMatchCallRightArrowSprite = +static const struct SpriteTemplate sSpriteTemplate_RightArrow = { - .tileTag = 0xA, - .paletteTag = 0x14, - .oam = &sMatchCallRightArrowSpriteOam, + .tileTag = GFXTAG_ARROW, + .paletteTag = PALTAG_ARROW, + .oam = &sOamData_RightArrow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_MatchCallRightArrow + .callback = SpriteCB_RightArrow }; -static const struct OamData sMatchCallUpDownArrowSpriteOam = +static const struct OamData sOamData_UpDownArrow = { .y = 0, .affineMode = ST_OAM_AFFINE_OFF, @@ -815,60 +821,60 @@ static const struct OamData sMatchCallUpDownArrowSpriteOam = .paletteNum = 0 }; -static const struct SpriteTemplate sMatchCallUpDownArrowSprite = +static const struct SpriteTemplate sSpriteTemplate_UpDownArrow = { - .tileTag = 0xA, - .paletteTag = 0x14, - .oam = &sMatchCallUpDownArrowSpriteOam, + .tileTag = GFXTAG_ARROW, + .paletteTag = PALTAG_ARROW, + .oam = &sOamData_UpDownArrow, .anims = gDummySpriteAnimTable, .images = NULL, .affineAnims = gDummySpriteAffineAnimTable, .callback = SpriteCallbackDummy }; -void sub_81C8ED0(void) +static void LoadListArrowGfx(void) { u32 i; const struct CompressedSpriteSheet *ptr; - for (i = 0, ptr = sMatchcallArrowSpriteSheets; i < ARRAY_COUNT(sMatchcallArrowSpriteSheets); ptr++, i++) + for (i = 0, ptr = sListArrowSpriteSheets; i < ARRAY_COUNT(sListArrowSpriteSheets); ptr++, i++) LoadCompressedSpriteSheet(ptr); - Pokenav_AllocAndLoadPalettes(sMatchcallArrowPalettes); + Pokenav_AllocAndLoadPalettes(sListArrowPalettes); } -void CreateMatchCallArrowSprites(struct MatchCallWindowState *windowState, struct PokenavSub17Substruct *list) +static void CreateListArrowSprites(struct PokenavListWindowState *windowState, struct PokenavSub17Substruct *list) { u32 spriteId; s16 x; - spriteId = CreateSprite(&sMatchCallRightArrowSprite, list->listWindow.unk2 * 8 + 3, (list->listWindow.unk3 + 1) * 8, 7); + spriteId = CreateSprite(&sSpriteTemplate_RightArrow, list->listWindow.x * 8 + 3, (list->listWindow.y + 1) * 8, 7); list->rightArrow = &gSprites[spriteId]; - x = list->listWindow.unk2 * 8 + (list->listWindow.unk4 - 1) * 4; - spriteId = CreateSprite(&sMatchCallUpDownArrowSprite, x, list->listWindow.unk3 * 8 + windowState->visibleEntries * 16, 7); + x = list->listWindow.x * 8 + (list->listWindow.width - 1) * 4; + spriteId = CreateSprite(&sSpriteTemplate_UpDownArrow, x, list->listWindow.y * 8 + windowState->visibleEntries * 16, 7); list->downArrow = &gSprites[spriteId]; list->downArrow->oam.tileNum += 2; - list->downArrow->callback = SpriteCB_MatchCallDownArrow; + list->downArrow->callback = SpriteCB_DownArrow; - spriteId = CreateSprite(&sMatchCallUpDownArrowSprite, x, list->listWindow.unk3 * 8, 7); + spriteId = CreateSprite(&sSpriteTemplate_UpDownArrow, x, list->listWindow.y * 8, 7); list->upArrow = &gSprites[spriteId]; list->upArrow->oam.tileNum += 4; - list->upArrow->callback = SpriteCB_MatchCallUpArrow; + list->upArrow->callback = SpriteCB_UpArrow; } -void DestroyMatchCallListArrows(struct PokenavSub17Substruct *list) +static void DestroyListArrows(struct PokenavSub17Substruct *list) { DestroySprite(list->rightArrow); DestroySprite(list->upArrow); DestroySprite(list->downArrow); - FreeSpriteTilesByTag(0xA); - FreeSpritePaletteByTag(0x14); + FreeSpriteTilesByTag(GFXTAG_ARROW); + FreeSpritePaletteByTag(PALTAG_ARROW); } -void ToggleMatchCallArrows(struct PokenavSub17Substruct *list, bool32 shouldHide) +static void ToggleListArrows(struct PokenavSub17Substruct *list, bool32 invisible) { - if (shouldHide) + if (invisible) { list->rightArrow->callback = SpriteCallbackDummy; list->upArrow->callback = SpriteCallbackDummy; @@ -876,76 +882,84 @@ void ToggleMatchCallArrows(struct PokenavSub17Substruct *list, bool32 shouldHide } else { - list->rightArrow->callback = SpriteCB_MatchCallRightArrow; - list->upArrow->callback = SpriteCB_MatchCallUpArrow; - list->downArrow->callback = SpriteCB_MatchCallDownArrow; + list->rightArrow->callback = SpriteCB_RightArrow; + list->upArrow->callback = SpriteCB_UpArrow; + list->downArrow->callback = SpriteCB_DownArrow; } - list->rightArrow->invisible = shouldHide; - list->upArrow->invisible = shouldHide; - list->downArrow->invisible = shouldHide; + list->rightArrow->invisible = invisible; + list->upArrow->invisible = invisible; + list->downArrow->invisible = invisible; } -void SpriteCB_MatchCallRightArrow(struct Sprite *sprite) +static void SpriteCB_RightArrow(struct Sprite *sprite) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - sprite->y2 = structPtr->unk888.selectedIndexOffset << 4; + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + sprite->y2 = structPtr->windowState.selectedIndexOffset << 4; } -void SpriteCB_MatchCallDownArrow(struct Sprite *sprite) +#define sTimer data[0] +#define sOffset data[1] +#define sInvisible data[7] + +static void SpriteCB_DownArrow(struct Sprite *sprite) { - if (sprite->data[7] == 0 && ShouldShowDownArrow()) + if (!sprite->sInvisible && ShouldShowDownArrow()) sprite->invisible = FALSE; else sprite->invisible = TRUE; - if (++sprite->data[0] > 3) + if (++sprite->sTimer > 3) { s16 offset; - sprite->data[0] = 0; - offset = (sprite->data[1] + 1) & 7; - sprite->data[1] = offset; + sprite->sTimer = 0; + offset = (sprite->sOffset + 1) & 7; + sprite->sOffset = offset; sprite->y2 = offset; } } -void SpriteCB_MatchCallUpArrow(struct Sprite *sprite) +static void SpriteCB_UpArrow(struct Sprite *sprite) { - if (sprite->data[7] == 0 && ShouldShowUpArrow()) + if (!sprite->sInvisible && ShouldShowUpArrow()) sprite->invisible = FALSE; else sprite->invisible = TRUE; - if (++sprite->data[0] > 3) + if (++sprite->sTimer > 3) { s16 offset; - sprite->data[0] = 0; - offset = (sprite->data[1] + 1) & 7; - sprite->data[1] = offset; + sprite->sTimer = 0; + offset = (sprite->sOffset + 1) & 7; + sprite->sOffset = offset; sprite->y2 = -1 * offset; } } -void ToggleMatchCallVerticalArrows(bool32 shouldHide) +void PokenavList_ToggleVerticalArrows(bool32 invisible) { - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_MATCH_CALL_LIST); - structPtr->list.upArrow->data[7] = shouldHide; - structPtr->list.downArrow->data[7] = shouldHide; + struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); + structPtr->list.upArrow->sInvisible = invisible; + structPtr->list.downArrow->sInvisible = invisible; } -void InitMatchCallWindowState(struct MatchCallWindowState *dst, struct PokenavListTemplate *template) +#undef sTimer +#undef sOffset +#undef sInvisible + +static void InitPokenavListWindowState(struct PokenavListWindowState *dst, struct PokenavListTemplate *template) { - dst->unk10 = template->list; - dst->windowTopIndex = template->unk6; + dst->listPtr = template->list; + dst->windowTopIndex = template->startIndex; dst->listLength = template->count; - dst->unkC = template->unk8; + dst->listItemSize = template->itemSize; dst->visibleEntries = template->maxShowed; if (dst->visibleEntries >= dst->listLength) { dst->windowTopIndex = 0; dst->unk4 = 0; - dst->selectedIndexOffset = template->unk6; + dst->selectedIndexOffset = template->startIndex; } else { @@ -953,7 +967,7 @@ void InitMatchCallWindowState(struct MatchCallWindowState *dst, struct PokenavLi if (dst->windowTopIndex + dst->visibleEntries > dst->listLength) { dst->selectedIndexOffset = dst->windowTopIndex + dst->visibleEntries - dst->listLength; - dst->windowTopIndex = template->unk6 - dst->selectedIndexOffset; + dst->windowTopIndex = template->startIndex - dst->selectedIndexOffset; } else { @@ -962,18 +976,18 @@ void InitMatchCallWindowState(struct MatchCallWindowState *dst, struct PokenavLi } } -static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, const struct BgTemplate *bgTemplate, struct PokenavListTemplate *template, s32 a3) +static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, const struct BgTemplate *bgTemplate, struct PokenavListTemplate *template, s32 tileOffset) { struct WindowTemplate window; dest->listWindow.bg = bgTemplate->bg; - dest->listWindow.unk6 = a3; - dest->unk34 = template->bufferItemFunc; - dest->unk38 = template->unk14; - dest->listWindow.unk1 = template->fillValue; - dest->listWindow.unk2 = template->item_X; - dest->listWindow.unk3 = template->listTop; - dest->listWindow.unk4 = template->windowWidth; + dest->listWindow.tileOffset = tileOffset; + dest->bufferItemFunc = template->bufferItemFunc; + dest->iconDrawFunc = template->iconDrawFunc; + dest->listWindow.fillValue = template->fillValue; + dest->listWindow.x = template->item_X; + dest->listWindow.y = template->listTop; + dest->listWindow.width = template->windowWidth; dest->listWindow.fontId = template->fontId; window.bg = bgTemplate->bg; @@ -982,7 +996,7 @@ static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, co window.width = template->windowWidth; window.height = 32; window.paletteNum = template->fillValue; - window.baseBlock = a3 + 2; + window.baseBlock = tileOffset + 2; dest->listWindow.windowId = AddWindow(&window); if (dest->listWindow.windowId == WINDOW_NONE) -- cgit v1.2.3 From d4d42342839719389596f26cc291b89e77f69813 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sun, 14 Nov 2021 22:21:50 -0500 Subject: Finish pokenav list ui doc --- src/pokenav_match_call_ui.c | 187 ++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 93 deletions(-) (limited to 'src/pokenav_match_call_ui.c') diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c index 70e541b55..97437e3cd 100644 --- a/src/pokenav_match_call_ui.c +++ b/src/pokenav_match_call_ui.c @@ -29,11 +29,10 @@ struct PokenavListWindowState { // The index of the element at the top of the window. u16 windowTopIndex; u16 listLength; - u16 unk4; + u16 entriesOffscreen; // The index of the cursor, relative to the top of the window. u16 selectedIndexOffset; - u16 visibleEntries; - u16 unkA; + u16 entriesOnscreen; u32 listItemSize; void * listPtr; }; @@ -63,7 +62,7 @@ struct PokenavSub17 struct PokenavSub17Substruct list; u8 tilemapBuffer[BG_SCREEN_SIZE]; struct PokenavListWindowState windowState; - s32 unk89C; + s32 eraseIndex; u32 loopedTaskId; }; @@ -81,7 +80,7 @@ static void PrintMatchCallFlavorText(struct PokenavListWindowState *, struct Pok static void PrintMatchCallFieldNames(struct PokenavSub17Substruct *, u32); static void PrintMatchCallListTrainerName(struct PokenavListWindowState *, struct PokenavSub17Substruct *); static void PrintCheckPageTrainerName(struct PokenavListWindowState *, struct PokenavSub17Substruct *); -static void sub_81C8B70(struct PokenavListMenuWindow *, s32, s32); +static void EraseListEntry(struct PokenavListMenuWindow *, s32, s32); static void CreateMoveListWindowTask(s32, struct PokenavSub17Substruct *); static void PrintListItems(void *, u32, u32, u32, u32, struct PokenavSub17Substruct *); static void InitListItems(struct PokenavListWindowState *, struct PokenavSub17Substruct *); @@ -90,14 +89,14 @@ static u32 LoopedTask_CreatePokenavList(s32); static bool32 IsPrintListItemsTaskActive(void); static u32 LoopedTask_PrintListItems(s32); static u32 LoopedTask_MoveListWindow(s32); -static u32 LoopedTask_sub_81C8870(s32); -static u32 LoopedTask_sub_81C8A28(s32); +static u32 LoopedTask_EraseListForCheckPage(s32); +static u32 LoopedTask_ReshowListFromCheckPage(s32); static u32 LoopedTask_PrintCheckPageInfo(s32); static const u16 sListArrow_Pal[] = INCBIN_U16("graphics/pokenav/list_arrows.gbapal"); static const u32 sListArrow_Gfx[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.lz"); -static EWRAM_DATA u32 gUnknown_0203CF44 = 0; +static EWRAM_DATA u32 sMoveWindowDownIndex = 0; // Read, but pointlessly bool32 CreatePokenavList(const struct BgTemplate *bgTemplate, struct PokenavListTemplate *listTemplate, s32 tileOffset) { @@ -187,8 +186,8 @@ static void InitPokenavListWindow(struct PokenavListMenuWindow *listWindow) static void InitListItems(struct PokenavListWindowState *windowState, struct PokenavSub17Substruct *a1) { s32 numToPrint = windowState->listLength - windowState->windowTopIndex; - if (numToPrint > windowState->visibleEntries) - numToPrint = windowState->visibleEntries; + if (numToPrint > windowState->entriesOnscreen) + numToPrint = windowState->entriesOnscreen; PrintListItems(windowState->listPtr, windowState->windowTopIndex, numToPrint, windowState->listItemSize, 0, a1); } @@ -214,18 +213,18 @@ static bool32 IsPrintListItemsTaskActive(void) static u32 LoopedTask_PrintListItems(s32 state) { - u32 v1; + u32 row; struct PokenavSub17Substruct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); switch (state) { case 0: - v1 = (structPtr->listWindow.unkA + structPtr->listWindow.numPrinted + structPtr->unk10) & 0xF; + row = (structPtr->listWindow.unkA + structPtr->listWindow.numPrinted + structPtr->unk10) & 0xF; structPtr->bufferItemFunc(structPtr->listPtr, structPtr->itemTextBuffer); if (structPtr->iconDrawFunc != NULL) - structPtr->iconDrawFunc(structPtr->listWindow.windowId, structPtr->printIndex, v1); + structPtr->iconDrawFunc(structPtr->listWindow.windowId, structPtr->printIndex, row); - AddTextPrinterParameterized(structPtr->listWindow.windowId, structPtr->listWindow.fontId, structPtr->itemTextBuffer, 8, (v1 << 4) + 1, 255, NULL); + AddTextPrinterParameterized(structPtr->listWindow.windowId, structPtr->listWindow.fontId, structPtr->itemTextBuffer, 8, (row << 4) + 1, TEXT_SKIP_DRAW, NULL); if (++structPtr->listWindow.numPrinted >= structPtr->listWindow.numToPrint) { // Finished printing items. If icons were being drawn, draw the @@ -250,22 +249,22 @@ static u32 LoopedTask_PrintListItems(s32 state) return LT_FINISH; } -bool32 ShouldShowUpArrow(void) +static bool32 ShouldShowUpArrow(void) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); return (structPtr->windowState.windowTopIndex != 0); } -bool32 ShouldShowDownArrow(void) +static bool32 ShouldShowDownArrow(void) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); struct PokenavListWindowState *subPtr = &structPtr->windowState; - return (subPtr->windowTopIndex + subPtr->visibleEntries < subPtr->listLength); + return (subPtr->windowTopIndex + subPtr->entriesOnscreen < subPtr->listLength); } -static void MoveListWindow(s32 delta, bool32 a1) +static void MoveListWindow(s32 delta, bool32 printItems) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); struct PokenavListWindowState *subPtr = &structPtr->windowState; @@ -274,16 +273,16 @@ static void MoveListWindow(s32 delta, bool32 a1) { if (subPtr->windowTopIndex + delta < 0) delta = -1 * subPtr->windowTopIndex; - if (a1) + if (printItems) PrintListItems(subPtr->listPtr, subPtr->windowTopIndex + delta, delta * -1, subPtr->listItemSize, delta, &structPtr->list); } - else if (a1) + else if (printItems) { - s32 temp = gUnknown_0203CF44 = subPtr->windowTopIndex + subPtr->visibleEntries; - if (temp + delta >= subPtr->listLength) - delta = subPtr->listLength - temp; + s32 index = sMoveWindowDownIndex = subPtr->windowTopIndex + subPtr->entriesOnscreen; + if (index + delta >= subPtr->listLength) + delta = subPtr->listLength - index; - PrintListItems(subPtr->listPtr, gUnknown_0203CF44, delta, subPtr->listItemSize, subPtr->visibleEntries, &structPtr->list); + PrintListItems(subPtr->listPtr, index, delta, subPtr->listItemSize, subPtr->entriesOnscreen, &structPtr->list); } CreateMoveListWindowTask(delta, &structPtr->list); @@ -341,7 +340,7 @@ static u32 LoopedTask_MoveListWindow(s32 state) return LT_FINISH; } -bool32 IsMovePokenavListWindowTaskActive(void) +bool32 PokenavList_IsMoveWindowTaskActive(void) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); return IsLoopedTaskActive(structPtr->list.loopedTaskId); @@ -376,7 +375,7 @@ int PokenavList_MoveCursorDown(void) if (structPtr->windowTopIndex + structPtr->selectedIndexOffset >= structPtr->listLength - 1) return 0; - if (structPtr->selectedIndexOffset < structPtr->visibleEntries - 1) + if (structPtr->selectedIndexOffset < structPtr->entriesOnscreen - 1) { structPtr->selectedIndexOffset++; return 1; @@ -396,8 +395,8 @@ int PokenavList_PageUp(void) if (ShouldShowUpArrow()) { - if (structPtr->windowTopIndex >= structPtr->visibleEntries) - scroll = structPtr->visibleEntries; + if (structPtr->windowTopIndex >= structPtr->entriesOnscreen) + scroll = structPtr->entriesOnscreen; else scroll = structPtr->windowTopIndex; MoveListWindow(scroll * -1, TRUE); @@ -417,21 +416,21 @@ int PokenavList_PageDown(void) if (ShouldShowDownArrow()) { - s32 windowBottomIndex = structPtr->windowTopIndex + structPtr->visibleEntries; - s32 scroll = structPtr->unk4 - structPtr->windowTopIndex; + s32 windowBottomIndex = structPtr->windowTopIndex + structPtr->entriesOnscreen; + s32 scroll = structPtr->entriesOffscreen - structPtr->windowTopIndex; - if (windowBottomIndex <= structPtr->unk4) - scroll = structPtr->visibleEntries; + if (windowBottomIndex <= structPtr->entriesOffscreen) + scroll = structPtr->entriesOnscreen; MoveListWindow(scroll, TRUE); return 2; } else { s32 cursor, lastVisibleIndex; - if (structPtr->listLength >= structPtr->visibleEntries) + if (structPtr->listLength >= structPtr->entriesOnscreen) { cursor = structPtr->selectedIndexOffset; - lastVisibleIndex = structPtr->visibleEntries; + lastVisibleIndex = structPtr->entriesOnscreen; } else { @@ -447,43 +446,43 @@ int PokenavList_PageDown(void) } } -u32 GetSelectedPokenavListIndex(void) +u32 PokenavList_GetSelectedIndex(void) { struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); return structPtr->windowTopIndex + structPtr->selectedIndexOffset; } -u32 GetMatchCallListTopIndex(void) +u32 PokenavList_GetTopIndex(void) { struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); return structPtr->windowTopIndex; } -void sub_81C877C(void) +void PokenavList_EraseListForCheckPage(void) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - structPtr->unk89C = 0; - structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8870, 6); + structPtr->eraseIndex = 0; + structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_EraseListForCheckPage, 6); } void PrintCheckPageInfo(s16 delta) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); structPtr->windowState.windowTopIndex += delta; - structPtr->unk89C = 0; + structPtr->eraseIndex = 0; structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_PrintCheckPageInfo, 6); } -void sub_81C87F0(void) +void PokenavList_ReshowListFromCheckPage(void) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - structPtr->unk89C = 0; - structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_sub_81C8A28, 6); + structPtr->eraseIndex = 0; + structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_ReshowListFromCheckPage, 6); } -bool32 IsMatchCallListTaskActive(void) +bool32 PokenavList_IsTaskActive(void) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); return IsLoopedTaskActive(structPtr->loopedTaskId); @@ -497,7 +496,7 @@ void PokenavList_DrawCurrentItemIcon(void) CopyWindowToVram(structPtr->list.listWindow.windowId, COPYWIN_MAP); } -static u32 LoopedTask_sub_81C8870(s32 state) +static u32 LoopedTask_EraseListForCheckPage(s32 state) { struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); @@ -507,18 +506,18 @@ static u32 LoopedTask_sub_81C8870(s32 state) ToggleListArrows(&structPtr->list, 1); // fall-through case 1: - if (structPtr->unk89C != structPtr->windowState.selectedIndexOffset) - sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, 1); + if (structPtr->eraseIndex != structPtr->windowState.selectedIndexOffset) + EraseListEntry(&structPtr->list.listWindow, structPtr->eraseIndex, 1); - structPtr->unk89C++; + structPtr->eraseIndex++; return LT_INC_AND_PAUSE; case 2: if (!IsDma3ManagerBusyWithBgCopy()) { - if (structPtr->unk89C != structPtr->windowState.visibleEntries) - return 6; + if (structPtr->eraseIndex != structPtr->windowState.entriesOnscreen) + return LT_SET_STATE(1); if (structPtr->windowState.selectedIndexOffset != 0) - sub_81C8B70(&structPtr->list.listWindow, structPtr->unk89C, structPtr->windowState.selectedIndexOffset); + EraseListEntry(&structPtr->list.listWindow, structPtr->eraseIndex, structPtr->windowState.selectedIndexOffset); return LT_INC_AND_PAUSE; } @@ -535,7 +534,7 @@ static u32 LoopedTask_sub_81C8870(s32 state) } return LT_PAUSE; case 4: - if (IsMovePokenavListWindowTaskActive()) + if (PokenavList_IsMoveWindowTaskActive()) return LT_PAUSE; structPtr->windowState.selectedIndexOffset = 0; @@ -582,7 +581,7 @@ static u32 LoopedTask_PrintCheckPageInfo(s32 state) return LT_INC_AND_PAUSE; } -static u32 LoopedTask_sub_81C8A28(s32 state) +static u32 LoopedTask_ReshowListFromCheckPage(s32 state) { struct PokenavSub17 *structPtr; struct PokenavListWindowState *windowState; @@ -599,24 +598,26 @@ static u32 LoopedTask_sub_81C8A28(s32 state) switch (state) { case 0: + // Rewrite the name of the trainer whose check page was just being viewed. + // This is done to erase the red background it had. PrintMatchCallListTrainerName(windowState, subPtr0); return LT_INC_AND_PAUSE; case 1: - ptr = &structPtr->unk89C; - if (++(*ptr) < structPtr->windowState.visibleEntries) + ptr = &structPtr->eraseIndex; + if (++(*ptr) < structPtr->windowState.entriesOnscreen) { - sub_81C8B70(&subPtr0->listWindow, *ptr, 1); + EraseListEntry(&subPtr0->listWindow, *ptr, 1); return LT_PAUSE; } *ptr = 0; - if (windowState->listLength <= windowState->visibleEntries) + if (windowState->listLength <= windowState->entriesOnscreen) { if (windowState->windowTopIndex != 0) { s32 r4 = windowState->windowTopIndex; r5 = -r4; - sub_81C8B70(&subPtr0->listWindow, r5, r4); + EraseListEntry(&subPtr0->listWindow, r5, r4); windowState->selectedIndexOffset = r4; *ptr = r5; return LT_INC_AND_PAUSE; @@ -624,36 +625,36 @@ static u32 LoopedTask_sub_81C8A28(s32 state) } else { - if (windowState->windowTopIndex + windowState->visibleEntries > windowState->listLength) + if (windowState->windowTopIndex + windowState->entriesOnscreen > windowState->listLength) { - s32 r4 = windowState->windowTopIndex + windowState->visibleEntries - windowState->listLength; + s32 r4 = windowState->windowTopIndex + windowState->entriesOnscreen - windowState->listLength; r5 = -r4; - sub_81C8B70(&subPtr0->listWindow, r5, r4); + EraseListEntry(&subPtr0->listWindow, r5, r4); windowState->selectedIndexOffset = r4; *ptr = r5; return LT_INC_AND_PAUSE; } } - return 9; + return LT_SET_STATE(4); case 2: - MoveListWindow(structPtr->unk89C, FALSE); + MoveListWindow(structPtr->eraseIndex, FALSE); return LT_INC_AND_PAUSE; case 3: - if (!IsMovePokenavListWindowTaskActive()) + if (!PokenavList_IsMoveWindowTaskActive()) { - structPtr->unk89C = 0; - return 1; + structPtr->eraseIndex = 0; + return LT_INC_AND_CONTINUE; } - return 2; + return LT_PAUSE; case 4: - PrintListItems(windowState->listPtr, windowState->windowTopIndex + structPtr->unk89C, 1, windowState->listItemSize, structPtr->unk89C, &structPtr->list); + PrintListItems(windowState->listPtr, windowState->windowTopIndex + structPtr->eraseIndex, 1, windowState->listItemSize, structPtr->eraseIndex, &structPtr->list); return LT_INC_AND_PAUSE; case 5: if (IsPrintListItemsTaskActive()) return LT_PAUSE; - if (++structPtr->unk89C >= windowState->listLength || structPtr->unk89C >= windowState->visibleEntries) + if (++structPtr->eraseIndex >= windowState->listLength || structPtr->eraseIndex >= windowState->entriesOnscreen) return LT_INC_AND_CONTINUE; - return 9; + return LT_SET_STATE(4); case 6: ToggleListArrows(subPtr0, 0); return LT_FINISH; @@ -662,15 +663,15 @@ static u32 LoopedTask_sub_81C8A28(s32 state) return LT_FINISH; } -static void sub_81C8B70(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2) +static void EraseListEntry(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2) { u8 *tileData = (u8*)GetWindowAttribute(listWindow->windowId, WINDOW_TILE_DATA); - u32 v2 = listWindow->width * 64; + u32 width = listWindow->width * 64; a1 = (listWindow->unkA + a1) & 0xF; if (a1 + a2 <= 16) { - CpuFastFill8(PIXEL_FILL(1), tileData + a1 * v2, a2 * v2); + CpuFastFill8(PIXEL_FILL(1), tileData + a1 * width, a2 * width); CopyWindowToVram(listWindow->windowId, COPYWIN_GFX); } else @@ -678,8 +679,8 @@ static void sub_81C8B70(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2 u32 v3 = 16 - a1; u32 v4 = a2 - v3; - CpuFastFill8(PIXEL_FILL(1), tileData + a1 * v2, v3 * v2); - CpuFastFill8(PIXEL_FILL(1), tileData, v4 * v2); + CpuFastFill8(PIXEL_FILL(1), tileData + a1 * width, v3 * width); + CpuFastFill8(PIXEL_FILL(1), tileData, v4 * width); CopyWindowToVram(listWindow->windowId, COPYWIN_GFX); } @@ -689,19 +690,20 @@ static void sub_81C8B70(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2 CopyWindowToVram(listWindow->windowId, COPYWIN_MAP); } -void sub_81C8C64(struct PokenavListMenuWindow *listWindow, u32 a1) +// Pointless +static void SetListMarginTile(struct PokenavListMenuWindow *listWindow, bool32 draw) { u16 var; - u16 *v1 = (u16*)GetBgTilemapBuffer(GetWindowAttribute(listWindow->windowId, WINDOW_BG)); - v1 += ((listWindow->unkA << 6) + listWindow->x) - 1; + u16 *tilemapBuffer = (u16*)GetBgTilemapBuffer(GetWindowAttribute(listWindow->windowId, WINDOW_BG)); + tilemapBuffer += (listWindow->unkA << 6) + listWindow->x - 1; - if (a1 != 0) + if (draw) var = (listWindow->fillValue << 12) | (listWindow->tileOffset + 1); else var = (listWindow->fillValue << 12) | (listWindow->tileOffset); - v1[0] = var; - v1[0x20] = var; + tilemapBuffer[0] = var; + tilemapBuffer[0x20] = var; } // Print the trainer's name and title at the top of their check page @@ -713,7 +715,7 @@ static void PrintCheckPageTrainerName(struct PokenavListWindowState *state, stru list->iconDrawFunc(list->listWindow.windowId, state->windowTopIndex, list->listWindow.unkA); FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(4), 0, list->listWindow.unkA * 16, list->listWindow.width * 8, 16); AddTextPrinterParameterized3(list->listWindow.windowId, list->listWindow.fontId, 8, (list->listWindow.unkA * 16) + 1, colors, TEXT_SKIP_DRAW, list->itemTextBuffer); - sub_81C8C64(&list->listWindow, 1); + SetListMarginTile(&list->listWindow, TRUE); CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_FULL, 0, list->listWindow.unkA * 2, list->listWindow.width, 2); } @@ -723,7 +725,7 @@ static void PrintMatchCallListTrainerName(struct PokenavListWindowState *state, list->bufferItemFunc(state->listPtr + state->listItemSize * state->windowTopIndex, list->itemTextBuffer); FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, list->listWindow.unkA * 16, list->listWindow.width * 8, 16); AddTextPrinterParameterized(list->listWindow.windowId, list->listWindow.fontId, list->itemTextBuffer, 8, list->listWindow.unkA * 16 + 1, TEXT_SKIP_DRAW, NULL); - sub_81C8C64(&list->listWindow, 0); + SetListMarginTile(&list->listWindow, FALSE); CopyWindowToVram(list->listWindow.windowId, COPYWIN_FULL); } @@ -745,8 +747,7 @@ static void PrintMatchCallFieldNames(struct PokenavSub17Substruct *list, u32 fie static void PrintMatchCallFlavorText(struct PokenavListWindowState *a0, struct PokenavSub17Substruct *list, u32 checkPageEntry) { // lines 1, 3, and 5 are the field names printed by PrintMatchCallFieldNames - static const u8 lineOffsets[CHECK_PAGE_ENTRY_COUNT] = - { + static const u8 lineOffsets[CHECK_PAGE_ENTRY_COUNT] = { [CHECK_PAGE_STRATEGY] = 2, [CHECK_PAGE_POKEMON] = 4, [CHECK_PAGE_INTRO_1] = 6, @@ -768,7 +769,7 @@ static const struct CompressedSpriteSheet sListArrowSpriteSheets[] = { { .data = sListArrow_Gfx, - .size = 192, + .size = 0xC0, .tag = GFXTAG_ARROW } }; @@ -852,7 +853,7 @@ static void CreateListArrowSprites(struct PokenavListWindowState *windowState, s list->rightArrow = &gSprites[spriteId]; x = list->listWindow.x * 8 + (list->listWindow.width - 1) * 4; - spriteId = CreateSprite(&sSpriteTemplate_UpDownArrow, x, list->listWindow.y * 8 + windowState->visibleEntries * 16, 7); + spriteId = CreateSprite(&sSpriteTemplate_UpDownArrow, x, list->listWindow.y * 8 + windowState->entriesOnscreen * 16, 7); list->downArrow = &gSprites[spriteId]; list->downArrow->oam.tileNum += 2; list->downArrow->callback = SpriteCB_DownArrow; @@ -954,19 +955,19 @@ static void InitPokenavListWindowState(struct PokenavListWindowState *dst, struc dst->windowTopIndex = template->startIndex; dst->listLength = template->count; dst->listItemSize = template->itemSize; - dst->visibleEntries = template->maxShowed; - if (dst->visibleEntries >= dst->listLength) + dst->entriesOnscreen = template->maxShowed; + if (dst->entriesOnscreen >= dst->listLength) { dst->windowTopIndex = 0; - dst->unk4 = 0; + dst->entriesOffscreen = 0; dst->selectedIndexOffset = template->startIndex; } else { - dst->unk4 = dst->listLength - dst->visibleEntries; - if (dst->windowTopIndex + dst->visibleEntries > dst->listLength) + dst->entriesOffscreen = dst->listLength - dst->entriesOnscreen; + if (dst->windowTopIndex + dst->entriesOnscreen > dst->listLength) { - dst->selectedIndexOffset = dst->windowTopIndex + dst->visibleEntries - dst->listLength; + dst->selectedIndexOffset = dst->windowTopIndex + dst->entriesOnscreen - dst->listLength; dst->windowTopIndex = template->startIndex - dst->selectedIndexOffset; } else -- cgit v1.2.3 From c779d03b3e9032254bbd7a08f4c9203e14373933 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 15 Nov 2021 00:21:40 -0500 Subject: Rename pokenav_match_call_ui --- src/pokenav_match_call_ui.c | 1011 ------------------------------------------- 1 file changed, 1011 deletions(-) delete mode 100644 src/pokenav_match_call_ui.c (limited to 'src/pokenav_match_call_ui.c') diff --git a/src/pokenav_match_call_ui.c b/src/pokenav_match_call_ui.c deleted file mode 100644 index 97437e3cd..000000000 --- a/src/pokenav_match_call_ui.c +++ /dev/null @@ -1,1011 +0,0 @@ -#include "global.h" -#include "pokenav.h" -#include "window.h" -#include "strings.h" -#include "text.h" -#include "bg.h" -#include "menu.h" -#include "decompress.h" -#include "international_string_util.h" - -#define GFXTAG_ARROW 10 -#define PALTAG_ARROW 20 - -struct PokenavListMenuWindow { - u8 bg; - u8 fillValue; - u8 x; - u8 y; - u8 width; - u8 fontId; - u16 tileOffset; - u16 windowId; - u16 unkA; - u16 numPrinted; - u16 numToPrint; -}; - -struct PokenavListWindowState { - // The index of the element at the top of the window. - u16 windowTopIndex; - u16 listLength; - u16 entriesOffscreen; - // The index of the cursor, relative to the top of the window. - u16 selectedIndexOffset; - u16 entriesOnscreen; - u32 listItemSize; - void * listPtr; -}; - -struct PokenavSub17Substruct -{ - struct PokenavListMenuWindow listWindow; - u32 unk10; - u32 printIndex; - u32 itemSize; - void * listPtr; - s32 startBgY; - s32 endBgY; - u32 loopedTaskId; - s32 moveDelta; - u32 bgMoveType; - PokenavListBufferItemFunc bufferItemFunc; - void (*iconDrawFunc)(u16, u32, u32); - struct Sprite *rightArrow; - struct Sprite *upArrow; - struct Sprite *downArrow; - u8 itemTextBuffer[64]; -}; - -struct PokenavSub17 -{ - struct PokenavSub17Substruct list; - u8 tilemapBuffer[BG_SCREEN_SIZE]; - struct PokenavListWindowState windowState; - s32 eraseIndex; - u32 loopedTaskId; -}; - -static void InitPokenavListBg(struct PokenavSub17 *); -static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *, const struct BgTemplate *, struct PokenavListTemplate *, s32); -static void InitPokenavListWindowState(struct PokenavListWindowState *, struct PokenavListTemplate *); -static void SpriteCB_UpArrow(struct Sprite *); -static void SpriteCB_DownArrow(struct Sprite *); -static void SpriteCB_RightArrow(struct Sprite *); -static void ToggleListArrows(struct PokenavSub17Substruct *, u32); -static void DestroyListArrows(struct PokenavSub17Substruct *); -static void CreateListArrowSprites(struct PokenavListWindowState *, struct PokenavSub17Substruct *); -static void LoadListArrowGfx(void); -static void PrintMatchCallFlavorText(struct PokenavListWindowState *, struct PokenavSub17Substruct *, u32); -static void PrintMatchCallFieldNames(struct PokenavSub17Substruct *, u32); -static void PrintMatchCallListTrainerName(struct PokenavListWindowState *, struct PokenavSub17Substruct *); -static void PrintCheckPageTrainerName(struct PokenavListWindowState *, struct PokenavSub17Substruct *); -static void EraseListEntry(struct PokenavListMenuWindow *, s32, s32); -static void CreateMoveListWindowTask(s32, struct PokenavSub17Substruct *); -static void PrintListItems(void *, u32, u32, u32, u32, struct PokenavSub17Substruct *); -static void InitListItems(struct PokenavListWindowState *, struct PokenavSub17Substruct *); -static void InitPokenavListWindow(struct PokenavListMenuWindow *); -static u32 LoopedTask_CreatePokenavList(s32); -static bool32 IsPrintListItemsTaskActive(void); -static u32 LoopedTask_PrintListItems(s32); -static u32 LoopedTask_MoveListWindow(s32); -static u32 LoopedTask_EraseListForCheckPage(s32); -static u32 LoopedTask_ReshowListFromCheckPage(s32); -static u32 LoopedTask_PrintCheckPageInfo(s32); - -static const u16 sListArrow_Pal[] = INCBIN_U16("graphics/pokenav/list_arrows.gbapal"); -static const u32 sListArrow_Gfx[] = INCBIN_U32("graphics/pokenav/list_arrows.4bpp.lz"); - -static EWRAM_DATA u32 sMoveWindowDownIndex = 0; // Read, but pointlessly - -bool32 CreatePokenavList(const struct BgTemplate *bgTemplate, struct PokenavListTemplate *listTemplate, s32 tileOffset) -{ - struct PokenavSub17 *structPtr = AllocSubstruct(POKENAV_SUBSTRUCT_LIST, sizeof(struct PokenavSub17)); - if (structPtr == NULL) - return FALSE; - - InitPokenavListWindowState(&structPtr->windowState, listTemplate); - if (!CopyPokenavListMenuTemplate(&structPtr->list, bgTemplate, listTemplate, tileOffset)) - return FALSE; - - CreateLoopedTask(LoopedTask_CreatePokenavList, 6); - return TRUE; -} - -bool32 IsCreatePokenavListTaskActive(void) -{ - return FuncIsActiveLoopedTask(LoopedTask_CreatePokenavList); -} - -void DestroyPokenavList(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - DestroyListArrows(&structPtr->list); - RemoveWindow(structPtr->list.listWindow.windowId); - FreePokenavSubstruct(POKENAV_SUBSTRUCT_LIST); -} - -static u32 LoopedTask_CreatePokenavList(s32 state) -{ - struct PokenavSub17 *structPtr; - - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - - structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - - switch (state) - { - case 0: - InitPokenavListBg(structPtr); - return LT_INC_AND_PAUSE; - case 1: - InitPokenavListWindow(&structPtr->list.listWindow); - return LT_INC_AND_PAUSE; - case 2: - InitListItems(&structPtr->windowState, &structPtr->list); - return LT_INC_AND_PAUSE; - case 3: - if (IsPrintListItemsTaskActive()) - { - return LT_PAUSE; - } - else - { - LoadListArrowGfx(); - return LT_INC_AND_CONTINUE; - } - case 4: - CreateListArrowSprites(&structPtr->windowState, &structPtr->list); - return LT_FINISH; - default: - return LT_FINISH; - } -} - -static void InitPokenavListBg(struct PokenavSub17 *a0) -{ - u16 tileNum = (a0->list.listWindow.fillValue << 12) | a0->list.listWindow.tileOffset; - BgDmaFill(a0->list.listWindow.bg, PIXEL_FILL(1), a0->list.listWindow.tileOffset, 1); - BgDmaFill(a0->list.listWindow.bg, PIXEL_FILL(4), a0->list.listWindow.tileOffset + 1, 1); - SetBgTilemapBuffer(a0->list.listWindow.bg, a0->tilemapBuffer); - FillBgTilemapBufferRect_Palette0(a0->list.listWindow.bg, tileNum, 0, 0, 32, 32); - ChangeBgY(a0->list.listWindow.bg, 0, BG_COORD_SET); - ChangeBgX(a0->list.listWindow.bg, 0, BG_COORD_SET); - ChangeBgY(a0->list.listWindow.bg, a0->list.listWindow.y << 11, BG_COORD_SUB); - CopyBgTilemapBufferToVram(a0->list.listWindow.bg); -} - -static void InitPokenavListWindow(struct PokenavListMenuWindow *listWindow) -{ - FillWindowPixelBuffer(listWindow->windowId, PIXEL_FILL(1)); - PutWindowTilemap(listWindow->windowId); - CopyWindowToVram(listWindow->windowId, COPYWIN_MAP); -} - -static void InitListItems(struct PokenavListWindowState *windowState, struct PokenavSub17Substruct *a1) -{ - s32 numToPrint = windowState->listLength - windowState->windowTopIndex; - if (numToPrint > windowState->entriesOnscreen) - numToPrint = windowState->entriesOnscreen; - - PrintListItems(windowState->listPtr, windowState->windowTopIndex, numToPrint, windowState->listItemSize, 0, a1); -} - -static void PrintListItems(void * listPtr, u32 topIndex, u32 numItems, u32 itemSize, u32 a4, struct PokenavSub17Substruct *list) -{ - if (numItems == 0) - return; - - list->listPtr = listPtr + topIndex * itemSize; - list->itemSize = itemSize; - list->listWindow.numPrinted = 0; - list->listWindow.numToPrint = numItems; - list->printIndex = topIndex; - list->unk10 = a4; - CreateLoopedTask(LoopedTask_PrintListItems, 5); -} - -static bool32 IsPrintListItemsTaskActive(void) -{ - return FuncIsActiveLoopedTask(LoopedTask_PrintListItems); -} - -static u32 LoopedTask_PrintListItems(s32 state) -{ - u32 row; - struct PokenavSub17Substruct *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - - switch (state) - { - case 0: - row = (structPtr->listWindow.unkA + structPtr->listWindow.numPrinted + structPtr->unk10) & 0xF; - structPtr->bufferItemFunc(structPtr->listPtr, structPtr->itemTextBuffer); - if (structPtr->iconDrawFunc != NULL) - structPtr->iconDrawFunc(structPtr->listWindow.windowId, structPtr->printIndex, row); - - AddTextPrinterParameterized(structPtr->listWindow.windowId, structPtr->listWindow.fontId, structPtr->itemTextBuffer, 8, (row << 4) + 1, TEXT_SKIP_DRAW, NULL); - if (++structPtr->listWindow.numPrinted >= structPtr->listWindow.numToPrint) - { - // Finished printing items. If icons were being drawn, draw the - // window tilemap and graphics. Otherwise just do the graphics - if (structPtr->iconDrawFunc != NULL) - CopyWindowToVram(structPtr->listWindow.windowId, COPYWIN_FULL); - else - CopyWindowToVram(structPtr->listWindow.windowId, COPYWIN_GFX); - return LT_INC_AND_PAUSE; - } - else - { - structPtr->listPtr += structPtr->itemSize; - structPtr->printIndex++; - return LT_CONTINUE; - } - case 1: - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - return LT_FINISH; - } - return LT_FINISH; -} - -static bool32 ShouldShowUpArrow(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - - return (structPtr->windowState.windowTopIndex != 0); -} - -static bool32 ShouldShowDownArrow(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - struct PokenavListWindowState *subPtr = &structPtr->windowState; - - return (subPtr->windowTopIndex + subPtr->entriesOnscreen < subPtr->listLength); -} - -static void MoveListWindow(s32 delta, bool32 printItems) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - struct PokenavListWindowState *subPtr = &structPtr->windowState; - - if (delta < 0) - { - if (subPtr->windowTopIndex + delta < 0) - delta = -1 * subPtr->windowTopIndex; - if (printItems) - PrintListItems(subPtr->listPtr, subPtr->windowTopIndex + delta, delta * -1, subPtr->listItemSize, delta, &structPtr->list); - } - else if (printItems) - { - s32 index = sMoveWindowDownIndex = subPtr->windowTopIndex + subPtr->entriesOnscreen; - if (index + delta >= subPtr->listLength) - delta = subPtr->listLength - index; - - PrintListItems(subPtr->listPtr, index, delta, subPtr->listItemSize, subPtr->entriesOnscreen, &structPtr->list); - } - - CreateMoveListWindowTask(delta, &structPtr->list); - subPtr->windowTopIndex += delta; -} - -static void CreateMoveListWindowTask(s32 delta, struct PokenavSub17Substruct *list) -{ - list->startBgY = GetBgY(list->listWindow.bg); - list->endBgY = list->startBgY + (delta << 12); - if (delta > 0) - list->bgMoveType = BG_COORD_ADD; - else - list->bgMoveType = BG_COORD_SUB; - list->moveDelta = delta; - list->loopedTaskId = CreateLoopedTask(LoopedTask_MoveListWindow, 6); -} - -static u32 LoopedTask_MoveListWindow(s32 state) -{ - s32 oldY, newY; - bool32 finished; - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - struct PokenavSub17Substruct *subPtr = &structPtr->list; - - switch (state) - { - case 0: - if (!IsPrintListItemsTaskActive()) - return LT_INC_AND_CONTINUE; - return LT_PAUSE; - case 1: - finished = FALSE; - oldY = GetBgY(subPtr->listWindow.bg); - newY = ChangeBgY(subPtr->listWindow.bg, 0x1000, subPtr->bgMoveType); - if (subPtr->bgMoveType == BG_COORD_SUB) - { - if ((oldY > subPtr->endBgY || oldY <= subPtr->startBgY) && newY <= subPtr->endBgY) - finished = TRUE; - } - else // BG_COORD_ADD - { - if ((oldY < subPtr->endBgY || oldY >= subPtr->startBgY) && newY >= subPtr->endBgY) - finished = TRUE; - } - - if (finished) - { - subPtr->listWindow.unkA = (subPtr->listWindow.unkA + subPtr->moveDelta) & 0xF; - ChangeBgY(subPtr->listWindow.bg, subPtr->endBgY, BG_COORD_SET); - return LT_FINISH; - } - return LT_PAUSE; - } - return LT_FINISH; -} - -bool32 PokenavList_IsMoveWindowTaskActive(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - return IsLoopedTaskActive(structPtr->list.loopedTaskId); -} - -static struct PokenavListWindowState *GetPokenavListWindowState(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - return &structPtr->windowState; -} - -int PokenavList_MoveCursorUp(void) -{ - struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); - - if (structPtr->selectedIndexOffset != 0) - { - structPtr->selectedIndexOffset--; - return 1; - } - if (ShouldShowUpArrow()) - { - MoveListWindow(-1, TRUE); - return 2; - } - return 0; -} - -int PokenavList_MoveCursorDown(void) -{ - struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); - - if (structPtr->windowTopIndex + structPtr->selectedIndexOffset >= structPtr->listLength - 1) - return 0; - if (structPtr->selectedIndexOffset < structPtr->entriesOnscreen - 1) - { - structPtr->selectedIndexOffset++; - return 1; - } - if (ShouldShowDownArrow()) - { - MoveListWindow(1, TRUE); - return 2; - } - return 0; -} - -int PokenavList_PageUp(void) -{ - s32 scroll; - struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); - - if (ShouldShowUpArrow()) - { - if (structPtr->windowTopIndex >= structPtr->entriesOnscreen) - scroll = structPtr->entriesOnscreen; - else - scroll = structPtr->windowTopIndex; - MoveListWindow(scroll * -1, TRUE); - return 2; - } - else if (structPtr->selectedIndexOffset != 0) - { - structPtr->selectedIndexOffset = 0; - return 1; - } - return 0; -} - -int PokenavList_PageDown(void) -{ - struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); - - if (ShouldShowDownArrow()) - { - s32 windowBottomIndex = structPtr->windowTopIndex + structPtr->entriesOnscreen; - s32 scroll = structPtr->entriesOffscreen - structPtr->windowTopIndex; - - if (windowBottomIndex <= structPtr->entriesOffscreen) - scroll = structPtr->entriesOnscreen; - MoveListWindow(scroll, TRUE); - return 2; - } - else - { - s32 cursor, lastVisibleIndex; - if (structPtr->listLength >= structPtr->entriesOnscreen) - { - cursor = structPtr->selectedIndexOffset; - lastVisibleIndex = structPtr->entriesOnscreen; - } - else - { - cursor = structPtr->selectedIndexOffset; - lastVisibleIndex = structPtr->listLength; - } - lastVisibleIndex -= 1; - if (cursor >= lastVisibleIndex) - return 0; - - structPtr->selectedIndexOffset = lastVisibleIndex; - return 1; - } -} - -u32 PokenavList_GetSelectedIndex(void) -{ - struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); - - return structPtr->windowTopIndex + structPtr->selectedIndexOffset; -} - -u32 PokenavList_GetTopIndex(void) -{ - struct PokenavListWindowState *structPtr = GetPokenavListWindowState(); - - return structPtr->windowTopIndex; -} - -void PokenavList_EraseListForCheckPage(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - structPtr->eraseIndex = 0; - structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_EraseListForCheckPage, 6); -} - -void PrintCheckPageInfo(s16 delta) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - structPtr->windowState.windowTopIndex += delta; - structPtr->eraseIndex = 0; - structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_PrintCheckPageInfo, 6); -} - -void PokenavList_ReshowListFromCheckPage(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - structPtr->eraseIndex = 0; - structPtr->loopedTaskId = CreateLoopedTask(LoopedTask_ReshowListFromCheckPage, 6); -} - -bool32 PokenavList_IsTaskActive(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - return IsLoopedTaskActive(structPtr->loopedTaskId); -} - -void PokenavList_DrawCurrentItemIcon(void) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - struct PokenavListWindowState *subPtr = &structPtr->windowState; - structPtr->list.iconDrawFunc(structPtr->list.listWindow.windowId, subPtr->windowTopIndex + subPtr->selectedIndexOffset, (structPtr->list.listWindow.unkA + subPtr->selectedIndexOffset) & 0xF); - CopyWindowToVram(structPtr->list.listWindow.windowId, COPYWIN_MAP); -} - -static u32 LoopedTask_EraseListForCheckPage(s32 state) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - - switch (state) - { - case 0: - ToggleListArrows(&structPtr->list, 1); - // fall-through - case 1: - if (structPtr->eraseIndex != structPtr->windowState.selectedIndexOffset) - EraseListEntry(&structPtr->list.listWindow, structPtr->eraseIndex, 1); - - structPtr->eraseIndex++; - return LT_INC_AND_PAUSE; - case 2: - if (!IsDma3ManagerBusyWithBgCopy()) - { - if (structPtr->eraseIndex != structPtr->windowState.entriesOnscreen) - return LT_SET_STATE(1); - if (structPtr->windowState.selectedIndexOffset != 0) - EraseListEntry(&structPtr->list.listWindow, structPtr->eraseIndex, structPtr->windowState.selectedIndexOffset); - - return LT_INC_AND_PAUSE; - } - return LT_PAUSE; - case 3: - if (!IsDma3ManagerBusyWithBgCopy()) - { - if (structPtr->windowState.selectedIndexOffset != 0) - { - MoveListWindow(structPtr->windowState.selectedIndexOffset, FALSE); - return LT_INC_AND_PAUSE; - } - return LT_FINISH; - } - return LT_PAUSE; - case 4: - if (PokenavList_IsMoveWindowTaskActive()) - return LT_PAUSE; - - structPtr->windowState.selectedIndexOffset = 0; - return LT_FINISH; - } - return LT_FINISH; -} - -static u32 LoopedTask_PrintCheckPageInfo(s32 state) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - - switch (state) - { - case 0: - PrintCheckPageTrainerName(&structPtr->windowState, &structPtr->list); - break; - case 1: - PrintMatchCallFieldNames(&structPtr->list, 0); - break; - case 2: - PrintMatchCallFlavorText(&structPtr->windowState, &structPtr->list, CHECK_PAGE_STRATEGY); - break; - case 3: - PrintMatchCallFieldNames(&structPtr->list, 1); - break; - case 4: - PrintMatchCallFlavorText(&structPtr->windowState, &structPtr->list, CHECK_PAGE_POKEMON); - break; - case 5: - PrintMatchCallFieldNames(&structPtr->list, 2); - break; - case 6: - PrintMatchCallFlavorText(&structPtr->windowState, &structPtr->list, CHECK_PAGE_INTRO_1); - break; - case 7: - PrintMatchCallFlavorText(&structPtr->windowState, &structPtr->list, CHECK_PAGE_INTRO_2); - break; - default: - return LT_FINISH; - } - return LT_INC_AND_PAUSE; -} - -static u32 LoopedTask_ReshowListFromCheckPage(s32 state) -{ - struct PokenavSub17 *structPtr; - struct PokenavListWindowState *windowState; - struct PokenavSub17Substruct *subPtr0; - s32 r5, *ptr; - - if (IsDma3ManagerBusyWithBgCopy()) - return LT_PAUSE; - - structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - windowState = &structPtr->windowState; - subPtr0 = &structPtr->list; - - switch (state) - { - case 0: - // Rewrite the name of the trainer whose check page was just being viewed. - // This is done to erase the red background it had. - PrintMatchCallListTrainerName(windowState, subPtr0); - return LT_INC_AND_PAUSE; - case 1: - ptr = &structPtr->eraseIndex; - if (++(*ptr) < structPtr->windowState.entriesOnscreen) - { - EraseListEntry(&subPtr0->listWindow, *ptr, 1); - return LT_PAUSE; - } - - *ptr = 0; - if (windowState->listLength <= windowState->entriesOnscreen) - { - if (windowState->windowTopIndex != 0) - { - s32 r4 = windowState->windowTopIndex; - r5 = -r4; - EraseListEntry(&subPtr0->listWindow, r5, r4); - windowState->selectedIndexOffset = r4; - *ptr = r5; - return LT_INC_AND_PAUSE; - } - } - else - { - if (windowState->windowTopIndex + windowState->entriesOnscreen > windowState->listLength) - { - s32 r4 = windowState->windowTopIndex + windowState->entriesOnscreen - windowState->listLength; - r5 = -r4; - EraseListEntry(&subPtr0->listWindow, r5, r4); - windowState->selectedIndexOffset = r4; - *ptr = r5; - return LT_INC_AND_PAUSE; - } - } - return LT_SET_STATE(4); - case 2: - MoveListWindow(structPtr->eraseIndex, FALSE); - return LT_INC_AND_PAUSE; - case 3: - if (!PokenavList_IsMoveWindowTaskActive()) - { - structPtr->eraseIndex = 0; - return LT_INC_AND_CONTINUE; - } - return LT_PAUSE; - case 4: - PrintListItems(windowState->listPtr, windowState->windowTopIndex + structPtr->eraseIndex, 1, windowState->listItemSize, structPtr->eraseIndex, &structPtr->list); - return LT_INC_AND_PAUSE; - case 5: - if (IsPrintListItemsTaskActive()) - return LT_PAUSE; - if (++structPtr->eraseIndex >= windowState->listLength || structPtr->eraseIndex >= windowState->entriesOnscreen) - return LT_INC_AND_CONTINUE; - return LT_SET_STATE(4); - case 6: - ToggleListArrows(subPtr0, 0); - return LT_FINISH; - } - - return LT_FINISH; -} - -static void EraseListEntry(struct PokenavListMenuWindow *listWindow, s32 a1, s32 a2) -{ - u8 *tileData = (u8*)GetWindowAttribute(listWindow->windowId, WINDOW_TILE_DATA); - u32 width = listWindow->width * 64; - - a1 = (listWindow->unkA + a1) & 0xF; - if (a1 + a2 <= 16) - { - CpuFastFill8(PIXEL_FILL(1), tileData + a1 * width, a2 * width); - CopyWindowToVram(listWindow->windowId, COPYWIN_GFX); - } - else - { - u32 v3 = 16 - a1; - u32 v4 = a2 - v3; - - CpuFastFill8(PIXEL_FILL(1), tileData + a1 * width, v3 * width); - CpuFastFill8(PIXEL_FILL(1), tileData, v4 * width); - CopyWindowToVram(listWindow->windowId, COPYWIN_GFX); - } - - for (a2--; a2 != -1; a1 = (a1 + 1) & 0xF, a2--) - ClearRematchPokeballIcon(listWindow->windowId, a1); - - CopyWindowToVram(listWindow->windowId, COPYWIN_MAP); -} - -// Pointless -static void SetListMarginTile(struct PokenavListMenuWindow *listWindow, bool32 draw) -{ - u16 var; - u16 *tilemapBuffer = (u16*)GetBgTilemapBuffer(GetWindowAttribute(listWindow->windowId, WINDOW_BG)); - tilemapBuffer += (listWindow->unkA << 6) + listWindow->x - 1; - - if (draw) - var = (listWindow->fillValue << 12) | (listWindow->tileOffset + 1); - else - var = (listWindow->fillValue << 12) | (listWindow->tileOffset); - - tilemapBuffer[0] = var; - tilemapBuffer[0x20] = var; -} - -// Print the trainer's name and title at the top of their check page -static void PrintCheckPageTrainerName(struct PokenavListWindowState *state, struct PokenavSub17Substruct *list) -{ - u8 colors[3] = {TEXT_COLOR_TRANSPARENT, TEXT_COLOR_DARK_GRAY, TEXT_COLOR_LIGHT_RED}; - - list->bufferItemFunc(state->listPtr + state->listItemSize * state->windowTopIndex, list->itemTextBuffer); - list->iconDrawFunc(list->listWindow.windowId, state->windowTopIndex, list->listWindow.unkA); - FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(4), 0, list->listWindow.unkA * 16, list->listWindow.width * 8, 16); - AddTextPrinterParameterized3(list->listWindow.windowId, list->listWindow.fontId, 8, (list->listWindow.unkA * 16) + 1, colors, TEXT_SKIP_DRAW, list->itemTextBuffer); - SetListMarginTile(&list->listWindow, TRUE); - CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_FULL, 0, list->listWindow.unkA * 2, list->listWindow.width, 2); -} - -// Print the trainer's name and title for the list (to replace the check page name and title, which has a red background) -static void PrintMatchCallListTrainerName(struct PokenavListWindowState *state, struct PokenavSub17Substruct *list) -{ - list->bufferItemFunc(state->listPtr + state->listItemSize * state->windowTopIndex, list->itemTextBuffer); - FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, list->listWindow.unkA * 16, list->listWindow.width * 8, 16); - AddTextPrinterParameterized(list->listWindow.windowId, list->listWindow.fontId, list->itemTextBuffer, 8, list->listWindow.unkA * 16 + 1, TEXT_SKIP_DRAW, NULL); - SetListMarginTile(&list->listWindow, FALSE); - CopyWindowToVram(list->listWindow.windowId, COPYWIN_FULL); -} - -static void PrintMatchCallFieldNames(struct PokenavSub17Substruct *list, u32 fieldId) -{ - const u8 *fieldNames[] = { - gText_PokenavMatchCall_Strategy, - gText_PokenavMatchCall_TrainerPokemon, - gText_PokenavMatchCall_SelfIntroduction - }; - u8 colors[3] = {TEXT_COLOR_WHITE, TEXT_COLOR_RED, TEXT_COLOR_LIGHT_RED}; - u32 top = (list->listWindow.unkA + 1 + (fieldId * 2)) & 0xF; - - FillWindowPixelRect(list->listWindow.windowId, PIXEL_FILL(1), 0, top << 4, list->listWindow.width, 16); - AddTextPrinterParameterized3(list->listWindow.windowId, FONT_NARROW, 2, (top << 4) + 1, colors, TEXT_SKIP_DRAW, fieldNames[fieldId]); - CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, top << 1, list->listWindow.width, 2); -} - -static void PrintMatchCallFlavorText(struct PokenavListWindowState *a0, struct PokenavSub17Substruct *list, u32 checkPageEntry) -{ - // lines 1, 3, and 5 are the field names printed by PrintMatchCallFieldNames - static const u8 lineOffsets[CHECK_PAGE_ENTRY_COUNT] = { - [CHECK_PAGE_STRATEGY] = 2, - [CHECK_PAGE_POKEMON] = 4, - [CHECK_PAGE_INTRO_1] = 6, - [CHECK_PAGE_INTRO_2] = 7 - }; - - u32 r6 = (list->listWindow.unkA + lineOffsets[checkPageEntry]) & 0xF; - const u8 *str = GetMatchCallFlavorText(a0->windowTopIndex, checkPageEntry); - - if (str != NULL) - { - FillWindowTilesByRow(list->listWindow.windowId, 1, r6 * 2, list->listWindow.width - 1, 2); - AddTextPrinterParameterized(list->listWindow.windowId, FONT_NARROW, str, 2, (r6 << 4) + 1, TEXT_SKIP_DRAW, NULL); - CopyWindowRectToVram(list->listWindow.windowId, COPYWIN_GFX, 0, r6 * 2, list->listWindow.width, 2); - } -} - -static const struct CompressedSpriteSheet sListArrowSpriteSheets[] = -{ - { - .data = sListArrow_Gfx, - .size = 0xC0, - .tag = GFXTAG_ARROW - } -}; - -static const struct SpritePalette sListArrowPalettes[] = -{ - { - .data = sListArrow_Pal, - .tag = PALTAG_ARROW - }, - {} -}; - -static const struct OamData sOamData_RightArrow = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(8x16), - .x = 0, - .size = SPRITE_SIZE(8x16), - .tileNum = 0, - .priority = 2, - .paletteNum = 0 -}; - -static const struct SpriteTemplate sSpriteTemplate_RightArrow = -{ - .tileTag = GFXTAG_ARROW, - .paletteTag = PALTAG_ARROW, - .oam = &sOamData_RightArrow, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCB_RightArrow -}; - -static const struct OamData sOamData_UpDownArrow = -{ - .y = 0, - .affineMode = ST_OAM_AFFINE_OFF, - .objMode = ST_OAM_OBJ_NORMAL, - .bpp = ST_OAM_4BPP, - .shape = SPRITE_SHAPE(16x8), - .x = 0, - .size = SPRITE_SIZE(16x8), - .tileNum = 0, - .priority = 2, - .paletteNum = 0 -}; - -static const struct SpriteTemplate sSpriteTemplate_UpDownArrow = -{ - .tileTag = GFXTAG_ARROW, - .paletteTag = PALTAG_ARROW, - .oam = &sOamData_UpDownArrow, - .anims = gDummySpriteAnimTable, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - -static void LoadListArrowGfx(void) -{ - u32 i; - const struct CompressedSpriteSheet *ptr; - - for (i = 0, ptr = sListArrowSpriteSheets; i < ARRAY_COUNT(sListArrowSpriteSheets); ptr++, i++) - LoadCompressedSpriteSheet(ptr); - - Pokenav_AllocAndLoadPalettes(sListArrowPalettes); -} - -static void CreateListArrowSprites(struct PokenavListWindowState *windowState, struct PokenavSub17Substruct *list) -{ - u32 spriteId; - s16 x; - - spriteId = CreateSprite(&sSpriteTemplate_RightArrow, list->listWindow.x * 8 + 3, (list->listWindow.y + 1) * 8, 7); - list->rightArrow = &gSprites[spriteId]; - - x = list->listWindow.x * 8 + (list->listWindow.width - 1) * 4; - spriteId = CreateSprite(&sSpriteTemplate_UpDownArrow, x, list->listWindow.y * 8 + windowState->entriesOnscreen * 16, 7); - list->downArrow = &gSprites[spriteId]; - list->downArrow->oam.tileNum += 2; - list->downArrow->callback = SpriteCB_DownArrow; - - spriteId = CreateSprite(&sSpriteTemplate_UpDownArrow, x, list->listWindow.y * 8, 7); - list->upArrow = &gSprites[spriteId]; - list->upArrow->oam.tileNum += 4; - list->upArrow->callback = SpriteCB_UpArrow; -} - -static void DestroyListArrows(struct PokenavSub17Substruct *list) -{ - DestroySprite(list->rightArrow); - DestroySprite(list->upArrow); - DestroySprite(list->downArrow); - FreeSpriteTilesByTag(GFXTAG_ARROW); - FreeSpritePaletteByTag(PALTAG_ARROW); -} - -static void ToggleListArrows(struct PokenavSub17Substruct *list, bool32 invisible) -{ - if (invisible) - { - list->rightArrow->callback = SpriteCallbackDummy; - list->upArrow->callback = SpriteCallbackDummy; - list->downArrow->callback = SpriteCallbackDummy; - } - else - { - list->rightArrow->callback = SpriteCB_RightArrow; - list->upArrow->callback = SpriteCB_UpArrow; - list->downArrow->callback = SpriteCB_DownArrow; - } - list->rightArrow->invisible = invisible; - list->upArrow->invisible = invisible; - list->downArrow->invisible = invisible; -} - -static void SpriteCB_RightArrow(struct Sprite *sprite) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - sprite->y2 = structPtr->windowState.selectedIndexOffset << 4; -} - -#define sTimer data[0] -#define sOffset data[1] -#define sInvisible data[7] - -static void SpriteCB_DownArrow(struct Sprite *sprite) -{ - if (!sprite->sInvisible && ShouldShowDownArrow()) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - - if (++sprite->sTimer > 3) - { - s16 offset; - - sprite->sTimer = 0; - offset = (sprite->sOffset + 1) & 7; - sprite->sOffset = offset; - sprite->y2 = offset; - } -} - -static void SpriteCB_UpArrow(struct Sprite *sprite) -{ - if (!sprite->sInvisible && ShouldShowUpArrow()) - sprite->invisible = FALSE; - else - sprite->invisible = TRUE; - - if (++sprite->sTimer > 3) - { - s16 offset; - - sprite->sTimer = 0; - offset = (sprite->sOffset + 1) & 7; - sprite->sOffset = offset; - sprite->y2 = -1 * offset; - } -} - -void PokenavList_ToggleVerticalArrows(bool32 invisible) -{ - struct PokenavSub17 *structPtr = GetSubstructPtr(POKENAV_SUBSTRUCT_LIST); - structPtr->list.upArrow->sInvisible = invisible; - structPtr->list.downArrow->sInvisible = invisible; -} - -#undef sTimer -#undef sOffset -#undef sInvisible - -static void InitPokenavListWindowState(struct PokenavListWindowState *dst, struct PokenavListTemplate *template) -{ - dst->listPtr = template->list; - dst->windowTopIndex = template->startIndex; - dst->listLength = template->count; - dst->listItemSize = template->itemSize; - dst->entriesOnscreen = template->maxShowed; - if (dst->entriesOnscreen >= dst->listLength) - { - dst->windowTopIndex = 0; - dst->entriesOffscreen = 0; - dst->selectedIndexOffset = template->startIndex; - } - else - { - dst->entriesOffscreen = dst->listLength - dst->entriesOnscreen; - if (dst->windowTopIndex + dst->entriesOnscreen > dst->listLength) - { - dst->selectedIndexOffset = dst->windowTopIndex + dst->entriesOnscreen - dst->listLength; - dst->windowTopIndex = template->startIndex - dst->selectedIndexOffset; - } - else - { - dst->selectedIndexOffset = 0; - } - } -} - -static bool32 CopyPokenavListMenuTemplate(struct PokenavSub17Substruct *dest, const struct BgTemplate *bgTemplate, struct PokenavListTemplate *template, s32 tileOffset) -{ - struct WindowTemplate window; - - dest->listWindow.bg = bgTemplate->bg; - dest->listWindow.tileOffset = tileOffset; - dest->bufferItemFunc = template->bufferItemFunc; - dest->iconDrawFunc = template->iconDrawFunc; - dest->listWindow.fillValue = template->fillValue; - dest->listWindow.x = template->item_X; - dest->listWindow.y = template->listTop; - dest->listWindow.width = template->windowWidth; - dest->listWindow.fontId = template->fontId; - - window.bg = bgTemplate->bg; - window.tilemapLeft = template->item_X; - window.tilemapTop = 0; - window.width = template->windowWidth; - window.height = 32; - window.paletteNum = template->fillValue; - window.baseBlock = tileOffset + 2; - - dest->listWindow.windowId = AddWindow(&window); - if (dest->listWindow.windowId == WINDOW_NONE) - return FALSE; - - dest->listWindow.unkA = 0; - dest->rightArrow = NULL; - dest->upArrow = NULL; - dest->downArrow = NULL; - return 1; -} -- cgit v1.2.3