diff options
Diffstat (limited to 'src/list_menu.c')
-rw-r--r-- | src/list_menu.c | 300 |
1 files changed, 252 insertions, 48 deletions
diff --git a/src/list_menu.c b/src/list_menu.c index 91cc2532a..9b9921c8f 100644 --- a/src/list_menu.c +++ b/src/list_menu.c @@ -6,8 +6,11 @@ #include "main.h" #include "task.h" #include "menu_indicators.h" +#include "strings.h" +#include "sound.h" +#include "constants/songs.h" -struct ListMenuStruct +struct UnknownMysteryGiftLinkMenuStruct { s32 field_0; u8 field_4; @@ -15,27 +18,33 @@ struct ListMenuStruct u8 field_6; }; -struct UnknownListMenuStruct +struct UnknownListMenuPals { - u8 x; - u8 y; - u8 width; - u8 height; - u8 palNum; + u8 cursorPal:4; + u8 fillValue:4; + u8 cursorShadowPal:4; + u8 lettersSpacing:6; + u8 field_2_2:6; // unused + u8 fontId:7; + u8 field_3_7:1; }; -extern struct ListMenuStruct gUnknown_0203CE84; +extern struct UnknownMysteryGiftLinkMenuStruct gUnknown_0203CE84; // this file's functions -u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow); -bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown); -void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count); -void ListMenuDrawCursor(struct ListMenu *list); -void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 a2); -u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind); +static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow); +static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown); +static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count); +static void ListMenuDrawCursor(struct ListMenu *list); +static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 a2); +static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind); + +// IWRAM common +struct UnknownListMenuPals gUnknown_03006300; +struct ListMenuTemplate gMultiuseListMenuTemplate; // code -void ListMenuDummyTask(u8 taskId) +static void ListMenuDummyTask(u8 taskId) { } @@ -111,7 +120,7 @@ u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 } // unused -u8 ListMenuInitWithWindows(struct ListMenuTemplate *listMenuTemplate, struct UnknownListMenuStruct *arg1, u16 scrollOffset, u16 selectedRow) +u8 ListMenuInitWithWindows(struct ListMenuTemplate *listMenuTemplate, struct UnknownListMenuWindowStruct *arg1, u16 scrollOffset, u16 selectedRow) { s32 i; @@ -208,19 +217,19 @@ void sub_81AE70C(u8 listTaskId) { struct ListMenu *list = (void*) gTasks[listTaskId].data; - FillWindowPixelBuffer(list->template.windowId, (list->template.fillPal << 4) | (list->template.fillPal)); + FillWindowPixelBuffer(list->template.windowId, (list->template.fillValue << 4) | (list->template.fillValue)); ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed); ListMenuDrawCursor(list); CopyWindowToVram(list->template.windowId, 2); } // unused -void ChangeListMenuPals(u8 listTaskId, u8 cursorPal, u8 fillPal, u8 cursorShadowPal) +void ChangeListMenuPals(u8 listTaskId, u8 cursorPal, u8 fillValue, u8 cursorShadowPal) { struct ListMenu *list = (void*) gTasks[listTaskId].data; list->template.cursorPal = cursorPal; - list->template.fillPal = fillPal; + list->template.fillValue = fillValue; list->template.cursorShadowPal = cursorShadowPal; } @@ -283,20 +292,7 @@ u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId) return list->selectedRow * yMultiplier + list->template.upText_Y; } -struct ListMenuPals -{ - u8 field_0_0:4; - u8 field_0_4:4; - u8 field_1_0:4; - u8 lettersSpacing:6; - u8 field_2_2:6; - u8 fontId:7; - u8 field_3_7:1; -}; - -extern struct ListMenuPals gUnknown_03006300; - -u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow) +static u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow) { u8 listTaskId = CreateTask(ListMenuDummyTask, 0); struct ListMenu *list = (void*) gTasks[listTaskId].data; @@ -309,9 +305,9 @@ u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOff list->unk_1E = 0xFF; list->unk_1F = 0; - gUnknown_03006300.field_0_0 = list->template.cursorPal; - gUnknown_03006300.field_0_4 = list->template.fillPal; - gUnknown_03006300.field_1_0 = list->template.cursorShadowPal; + gUnknown_03006300.cursorPal = list->template.cursorPal; + gUnknown_03006300.fillValue = list->template.fillValue; + gUnknown_03006300.cursorShadowPal = list->template.cursorShadowPal; gUnknown_03006300.lettersSpacing = list->template.lettersSpacing; gUnknown_03006300.fontId = list->template.fontId; gUnknown_03006300.field_3_7 = 0; @@ -319,7 +315,7 @@ u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOff if (list->template.totalItems < list->template.maxShowed) list->template.maxShowed = list->template.totalItems; - FillWindowPixelBuffer(list->template.windowId, (list->template.fillPal << 4) | (list->template.fillPal)); + FillWindowPixelBuffer(list->template.windowId, (list->template.fillValue << 4) | (list->template.fillValue)); ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed); ListMenuDrawCursor(list); ListMenuCallSelectionChangedCallback(list, 1); @@ -327,14 +323,14 @@ u8 ListMenuInitInternal(struct ListMenuTemplate *listMenuTemplate, u16 scrollOff return listTaskId; } -void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y) +static void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y) { u8 colors[3]; if (gUnknown_03006300.field_3_7) { - colors[0] = gUnknown_03006300.field_0_4; - colors[1] = gUnknown_03006300.field_0_0; - colors[2] = gUnknown_03006300.field_1_0; + colors[0] = gUnknown_03006300.fillValue; + colors[1] = gUnknown_03006300.cursorPal; + colors[2] = gUnknown_03006300.cursorShadowPal; AddTextPrinterParameterized2(list->template.windowId, gUnknown_03006300.fontId, x, y, @@ -345,7 +341,7 @@ void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y) } else { - colors[0] = list->template.fillPal; + colors[0] = list->template.fillValue; colors[1] = list->template.cursorPal; colors[2] = list->template.cursorShadowPal; AddTextPrinterParameterized2(list->template.windowId, @@ -356,7 +352,7 @@ void ListMenuPrint(struct ListMenu *list, const u8 *str, u8 x, u8 y) } } -void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count) +static void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u16 count) { s32 i; u8 x, y; @@ -378,12 +374,10 @@ void ListMenuPrintEntries(struct ListMenu *list, u16 startIndex, u16 yOffset, u1 } } -extern const u8 gText_SelectorArrow2[]; - -void ListMenuDrawCursor(struct ListMenu *list) +static void ListMenuDrawCursor(struct ListMenu *list) { u8 yMultiplier = GetFontAttribute(list->template.fontId, 1) + list->template.unk_16_3; - u8 x = list->template.cursor_Y; + u8 x = list->template.cursor_X; u8 y = list->selectedRow * yMultiplier + list->template.upText_Y; switch (list->template.cursorKind) { @@ -409,7 +403,7 @@ void ListMenuDrawCursor(struct ListMenu *list) } } -u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind) +static u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind) { struct CursorStruct cursor; @@ -423,3 +417,213 @@ u8 ListMenuAddCursorObject(struct ListMenu *list, u32 cursorKind) return ListMenuAddCursorObjectInternal(&cursor, cursorKind); } + +static void ListMenuErasePrintedCursor(struct ListMenu *list, u16 selectedRow) +{ + u8 cursorKind = list->template.cursorKind; + if (cursorKind == 0) + { + u8 yMultiplier = GetFontAttribute(list->template.fontId, 1) + list->template.unk_16_3; + u8 width = GetMenuCursorDimensionByFont(list->template.fontId, 0); + u8 height = GetMenuCursorDimensionByFont(list->template.fontId, 1); + FillWindowPixelRect(list->template.windowId, + (list->template.fillValue << 4) | (list->template.fillValue), + list->template.cursor_X, + selectedRow * yMultiplier + list->template.upText_Y, + width, + height); + } +} + +static u8 ListMenuUpdateSelectedRowIndexAndScrollOffset(struct ListMenu *list, bool8 movingDown) +{ + u16 selectedRow = list->selectedRow; + u16 scrollOffset = list->scrollOffset; + u16 newRow; + u32 newScroll; + + if (!movingDown) + { + if (list->template.maxShowed == 1) + newRow = 0; + else + newRow = list->template.maxShowed - ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)) - 1; + + if (scrollOffset == 0) + { + while (selectedRow != 0) + { + selectedRow--; + if (list->template.items[scrollOffset + selectedRow].id != -3) + { + list->selectedRow = selectedRow; + return 1; + } + } + + return 0; + } + else + { + while (selectedRow > newRow) + { + selectedRow--; + if (list->template.items[scrollOffset + selectedRow].id != -3) + { + list->selectedRow = selectedRow; + return 1; + } + } + + newScroll = scrollOffset - 1; + } + } + else + { + if (list->template.maxShowed == 1) + newRow = 0; + else + newRow = ((list->template.maxShowed / 2) + (list->template.maxShowed % 2)); + + if (scrollOffset == list->template.totalItems - list->template.maxShowed) + { + while (selectedRow < list->template.maxShowed - 1) + { + selectedRow++; + if (list->template.items[scrollOffset + selectedRow].id != -3) + { + list->selectedRow = selectedRow; + return 1; + } + } + + return 0; + } + else + { + while (selectedRow < newRow) + { + selectedRow++; + if (list->template.items[scrollOffset + selectedRow].id != -3) + { + list->selectedRow = selectedRow; + return 1; + } + } + + newScroll = scrollOffset + 1; + } + } + + list->selectedRow = newRow; + list->scrollOffset = newScroll; + return 2; +} + +static void ListMenuScroll(struct ListMenu *list, u8 count, bool8 movingDown) +{ + if (count >= list->template.maxShowed) + { + FillWindowPixelBuffer(list->template.windowId, (list->template.fillValue << 4) | (list->template.fillValue)); + ListMenuPrintEntries(list, list->scrollOffset, 0, list->template.maxShowed); + } + else + { + u8 yMultiplier = GetFontAttribute(list->template.fontId, 1) + list->template.unk_16_3; + + if (!movingDown) + { + u16 y, width, height; + + ScrollWindow(list->template.windowId, 1, count * yMultiplier, (list->template.fillValue << 4) | (list->template.fillValue)); + ListMenuPrintEntries(list, list->scrollOffset, 0, count); + + y = (list->template.maxShowed * yMultiplier) + list->template.upText_Y; + width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8; + height = (GetWindowAttribute(list->template.windowId, WINDOW_HEIGHT) * 8) - y; + FillWindowPixelRect(list->template.windowId, + (list->template.fillValue << 4) | (list->template.fillValue), + 0, y, width, height); + } + else + { + u16 width; + + ScrollWindow(list->template.windowId, 0, count * yMultiplier, (list->template.fillValue << 4) | (list->template.fillValue)); + ListMenuPrintEntries(list, list->scrollOffset + (list->template.maxShowed - count), list->template.maxShowed - count, count); + + width = GetWindowAttribute(list->template.windowId, WINDOW_WIDTH) * 8; + FillWindowPixelRect(list->template.windowId, + (list->template.fillValue << 4) | (list->template.fillValue), + 0, 0, width, list->template.upText_Y); + } + } +} + +static bool8 ListMenuChangeSelection(struct ListMenu *list, bool8 updateCursorAndCallCallback, u8 count, bool8 movingDown) +{ + u16 oldSelectedRow; + u8 selectionChange, i, cursorCount; + + oldSelectedRow = list->selectedRow; + cursorCount = 0; + selectionChange = 0; + for (i = 0; i < count; i++) + { + do + { + u8 ret = ListMenuUpdateSelectedRowIndexAndScrollOffset(list, movingDown); + selectionChange |= ret; + if (ret != 2) + break; + cursorCount++; + } while (list->template.items[list->scrollOffset + list->selectedRow].id == -3); + } + + if (updateCursorAndCallCallback) + { + switch (selectionChange) + { + case 0: + default: + return TRUE; + case 1: + ListMenuErasePrintedCursor(list, oldSelectedRow); + ListMenuDrawCursor(list); + ListMenuCallSelectionChangedCallback(list, 0); + CopyWindowToVram(list->template.windowId, 2); + break; + case 2: + case 3: + ListMenuErasePrintedCursor(list, oldSelectedRow); + ListMenuScroll(list, cursorCount, movingDown); + ListMenuDrawCursor(list); + ListMenuCallSelectionChangedCallback(list, 0); + CopyWindowToVram(list->template.windowId, 2); + break; + } + } + + return FALSE; +} + +static void ListMenuCallSelectionChangedCallback(struct ListMenu *list, u8 a2) +{ + if (list->template.moveCursorFunc != NULL) + list->template.moveCursorFunc(list->template.items[list->scrollOffset + list->selectedRow].id, a2, list); +} + +// unused +void sub_81AF028(u8 cursorPal, u8 fillValue, u8 cursorShadowPal) +{ + gUnknown_03006300.cursorPal = cursorPal; + gUnknown_03006300.fillValue = fillValue; + gUnknown_03006300.cursorShadowPal = cursorShadowPal; + gUnknown_03006300.field_3_7 = 1; +} + +void sub_81AF078(s32 arg0, u8 arg1, struct ListMenu *list) +{ + if (!arg1) + PlaySE(SE_SELECT); +} |