diff options
author | YamaArashi <shadow962@live.com> | 2016-12-30 00:02:01 -0800 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2016-12-30 00:02:01 -0800 |
commit | dd6ae92faca208a03f0f32e47b80f1442f546b35 (patch) | |
tree | 9ace052a6695fe2b0265d3b2b202235461524be4 | |
parent | 869a88acb30ec7ee7701efa907dbea09ca83491a (diff) |
decompile sub_80B5578 and sub_80B5684
-rw-r--r-- | asm/script_menu.s | 196 | ||||
-rw-r--r-- | include/menu.h | 2 | ||||
-rw-r--r-- | src/menu.c | 16 | ||||
-rw-r--r-- | src/script_menu.c | 133 |
4 files changed, 111 insertions, 236 deletions
diff --git a/asm/script_menu.s b/asm/script_menu.s index 5f03e65de..46ccadba4 100644 --- a/asm/script_menu.s +++ b/asm/script_menu.s @@ -6,202 +6,6 @@ .text - thumb_func_start sub_80B5578 -sub_80B5578: @ 80B5578 - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - ldr r4, [sp, 0x30] - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - lsls r1, 24 - lsrs r1, 24 - mov r8, r1 - lsls r2, 24 - lsrs r6, r2, 24 - lsls r3, 24 - lsrs r3, 24 - str r3, [sp, 0xC] - lsls r4, 24 - lsrs r5, r4, 24 - movs r7, 0 - ldr r0, _080B55B8 @ =sub_80B5684 - mov r10, r0 - bl FuncIsActiveTask - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _080B55BC - movs r0, 0 - b _080B5670 - .align 2, 0 -_080B55B8: .4byte sub_80B5684 -_080B55BC: - ldr r1, _080B5620 @ =gScriptResult - movs r0, 0xFF - strh r0, [r1] - ldr r0, _080B5624 @ =gMultichoiceLists - lsls r4, r6, 3 - adds r0, r4, r0 - ldrb r6, [r0, 0x4] - ldr r0, [r0] - str r0, [sp] - str r5, [sp, 0x4] - str r7, [sp, 0x8] - mov r0, r9 - mov r1, r8 - adds r2, r6, 0 - movs r3, 0 - bl sub_807274C - mov r0, r10 - movs r1, 0x50 - bl CreateTask - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - lsls r0, r6, 24 - lsrs r1, r0, 24 - lsrs r0, 25 - cmp r0, r5 - bcc _080B55FE - movs r0, 0x1 - ands r0, r6 - cmp r0, 0 - beq _080B5606 -_080B55FE: - cmp r5, 0x1 - beq _080B5606 - cmp r1, r5 - bne _080B5628 -_080B5606: - ldr r0, _080B5624 @ =gMultichoiceLists - adds r0, r4, r0 - ldrb r0, [r0, 0x4] - adds r1, r5, 0 - bl __udivsi3 - lsls r0, 24 - lsrs r0, 23 - adds r0, 0x1 - mov r2, r8 - lsls r1, r2, 24 - b _080B563A - .align 2, 0 -_080B5620: .4byte gScriptResult -_080B5624: .4byte gMultichoiceLists -_080B5628: - adds r0, r6, 0 - adds r1, r5, 0 - bl __udivsi3 - lsls r0, 24 - lsrs r0, 23 - adds r0, 0x3 - mov r3, r8 - lsls r1, r3, 24 -_080B563A: - asrs r1, 24 - adds r1, r0 - lsls r1, 24 - lsrs r7, r1, 24 - adds r0, r5, 0 - bl sub_807288C - lsls r0, 24 - lsrs r0, 24 - ldr r2, _080B5680 @ =gTasks - mov r3, r10 - lsls r1, r3, 2 - add r1, r10 - lsls r1, 3 - adds r1, r2 - mov r2, r9 - strh r2, [r1, 0x8] - mov r3, r8 - strh r3, [r1, 0xA] - add r0, r9 - adds r0, 0x2 - strh r0, [r1, 0xC] - strh r7, [r1, 0xE] - mov r0, sp - ldrh r0, [r0, 0xC] - strh r0, [r1, 0x10] - movs r0, 0x1 -_080B5670: - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_080B5680: .4byte gTasks - thumb_func_end sub_80B5578 - - thumb_func_start sub_80B5684 -sub_80B5684: @ 80B5684 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - bl sub_80727CC - lsls r0, 24 - asrs r1, r0, 24 - movs r0, 0x2 - negs r0, r0 - cmp r1, r0 - beq _080B56F4 - adds r0, 0x1 - cmp r1, r0 - bne _080B56CC - ldr r2, _080B56C4 @ =gTasks - lsls r1, r5, 2 - adds r0, r1, r5 - lsls r0, 3 - adds r0, r2 - movs r2, 0x10 - ldrsh r0, [r0, r2] - adds r4, r1, 0 - cmp r0, 0 - bne _080B56F4 - movs r0, 0x5 - bl PlaySE - ldr r1, _080B56C8 @ =gScriptResult - movs r0, 0x7F - strh r0, [r1] - b _080B56D2 - .align 2, 0 -_080B56C4: .4byte gTasks -_080B56C8: .4byte gScriptResult -_080B56CC: - ldr r0, _080B56FC @ =gScriptResult - strh r1, [r0] - lsls r4, r5, 2 -_080B56D2: - bl sub_8072DEC - ldr r0, _080B5700 @ =gTasks - adds r3, r4, r5 - lsls r3, 3 - adds r3, r0 - ldrb r0, [r3, 0x8] - ldrb r1, [r3, 0xA] - ldrb r2, [r3, 0xC] - ldrb r3, [r3, 0xE] - bl MenuZeroFillWindowRect - adds r0, r5, 0 - bl DestroyTask - bl EnableBothScriptContexts -_080B56F4: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_080B56FC: .4byte gScriptResult -_080B5700: .4byte gTasks - thumb_func_end sub_80B5684 - thumb_func_start sp109_CreatePCMenu sp109_CreatePCMenu: @ 80B5704 push {lr} diff --git a/include/menu.h b/include/menu.h index 3e08cb7eb..7b3525461 100644 --- a/include/menu.h +++ b/include/menu.h @@ -41,7 +41,7 @@ s8 ProcessMenuInput(void); s8 ProcessMenuInputNoWrap(void); u8 MoveMenuCursor3(s8); u8 MoveMenuCursor4(s8); -void sub_807274C(u8, u8, u8, u8, u8 * const [][2], u8, u32); +void sub_807274C(u8, u8, u8, u8, const struct MenuAction[], u8, u32); s8 sub_80727CC(void); u8 sub_807288C(u8); void PrintMenuItems(u8, u8, u8, const struct MenuAction[]); diff --git a/src/menu.c b/src/menu.c index 6b35fd5dd..a06463ba3 100644 --- a/src/menu.c +++ b/src/menu.c @@ -26,8 +26,8 @@ static void MultistepInitMenuWindowInternal(const struct WindowConfig *, u16); static void InitMenuWindowInternal(const struct WindowConfig *, u16); static bool8 sub_80723D4(void); static u8 sub_8072484(u8, u8, u8, u8, u8, u8, u32); -static u8 sub_80724F4(u8, u8, u8, u8 * const [][2], u8); -static void sub_8072620(u8, u8, u8, u8 * const [][2], u8); +static u8 sub_80724F4(u8, u8, u8, const struct MenuAction[], u8); +static void sub_8072620(u8, u8, u8, const struct MenuAction[], u8); static void sub_8072D18(u8, u8); static struct Menu gMenu; @@ -407,7 +407,7 @@ static u8 sub_8072484(u8 a1, u8 a2, u8 menuItemCount, u8 a4, u8 width, u8 a6, u3 return a4; } -static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, u8 * const menuItems[][2], u8 columnCount) +static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) { u8 i; u8 maxWidth; @@ -419,7 +419,7 @@ static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, u8 * const menuItems[][ maxWidth = 0; for (i = 0; i < menuItemCount; i++) { - u8 width = (sub_8072CA4(menuItems[i][0]) + 7) / 8; + u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; if (width > maxWidth) maxWidth = width; @@ -465,7 +465,7 @@ static u8 sub_80724F4(u8 left, u8 top, u8 menuItemCount, u8 * const menuItems[][ return maxWidth; } -static void sub_8072620(u8 left, u8 top, u8 menuItemCount, u8 * const menuItems[][2], u8 columnCount) +static void sub_8072620(u8 left, u8 top, u8 menuItemCount, const struct MenuAction menuItems[], u8 columnCount) { u8 i; u8 maxWidth; @@ -476,7 +476,7 @@ static void sub_8072620(u8 left, u8 top, u8 menuItemCount, u8 * const menuItems[ maxWidth = 0; for (i = 0; i < menuItemCount; i++) { - u8 width = (sub_8072CA4(menuItems[i][0]) + 7) / 8; + u8 width = (sub_8072CA4(menuItems[i].text) + 7) / 8; if (width > maxWidth) maxWidth = width; @@ -495,11 +495,11 @@ static void sub_8072620(u8 left, u8 top, u8 menuItemCount, u8 * const menuItems[ u8 row = 0; u8 j; for (j = 0; i + j < menuItemCount; j += columnCount, row++) - MenuPrint(menuItems[i + j][0], left + gMenu.columnXCoords[i % columnCount], top + 2 * row); + MenuPrint(menuItems[i + j].text, left + gMenu.columnXCoords[i % columnCount], top + 2 * row); } } -void sub_807274C(u8 left, u8 top, u8 menuItemCount, u8 a4, u8 * const menuItems[][2], u8 columnCount, u32 a7) +void sub_807274C(u8 left, u8 top, u8 menuItemCount, u8 a4, const struct MenuAction menuItems[], u8 columnCount, u32 a7) { u8 maxWidth = sub_80724F4(left, top, menuItemCount, menuItems, columnCount); diff --git a/src/script_menu.c b/src/script_menu.c index 1fdaba0c1..d351c3fa4 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -11,7 +11,7 @@ struct MultichoiceListStruct u8 count; }; -extern struct MultichoiceListStruct gMultichoiceLists[]; +extern const struct MultichoiceListStruct gMultichoiceLists[]; extern u16 gScriptResult; @@ -20,6 +20,7 @@ void sub_80B53B4(u8, u8, u8, struct MenuAction *list, u8); void sub_80B52B4(u8); void sub_80B5230(u8, u8, u8, u8, u8, u8); void task_yes_no_maybe(u8); +void sub_80B5684(u8); bool8 sub_80B5054(u8 left, u8 top, u8 var3, u8 var4) { @@ -65,7 +66,7 @@ void DrawMultichoiceMenu(u8 left, u8 top, u8 count, struct MenuAction *list, u8 if(width < newWidth) width = newWidth; } - + right = width; right = (right + left) + 1; @@ -102,14 +103,14 @@ void sub_80B5230(u8 left, u8 top, u8 right, u8 bottom, u8 unkVar, u8 count) void sub_80B52B4(u8 taskId) { s8 var; - + if(!gPaletteFade.active) { if(!gTasks[taskId].data[5]) var = ProcessMenuInputNoWrap(); else var = ProcessMenuInput(); - + if(var != -2) { if(var == -1) @@ -119,8 +120,10 @@ void sub_80B52B4(u8 taskId) PlaySE(5); gScriptResult = 127; } - else - return; + else + { + return; + } } else { @@ -136,14 +139,14 @@ void sub_80B52B4(u8 taskId) bool8 Multichoice(u8 var1, u8 var2, u8 var3, u8 var4) { - if(FuncIsActiveTask(sub_80B52B4) == 1) - return FALSE; - else - { - gScriptResult = 0xFF; - sub_80B53B4(var1, var2, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4); - return TRUE; - } + if(FuncIsActiveTask(sub_80B52B4) == 1) + return FALSE; + else + { + gScriptResult = 0xFF; + sub_80B53B4(var1, var2, gMultichoiceLists[var3].count, gMultichoiceLists[var3].list, var4); + return TRUE; + } } void sub_80B53B4(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4) @@ -172,28 +175,28 @@ void sub_80B53B4(u8 left, u8 top, u8 count, struct MenuAction *list, u8 var4) bool8 yes_no_box(u8 var1, u8 var2) { - u8 taskId; - - if(FuncIsActiveTask(task_yes_no_maybe) == 1) - return FALSE; - else - { - gScriptResult = 0xFF; - DisplayYesNoMenu(var1, var2, 1); - taskId = CreateTask(task_yes_no_maybe, 0x50); - gTasks[taskId].data[0] = var1; - gTasks[taskId].data[1] = var2; - return TRUE; - } + u8 taskId; + + if(FuncIsActiveTask(task_yes_no_maybe) == 1) + return FALSE; + else + { + gScriptResult = 0xFF; + DisplayYesNoMenu(var1, var2, 1); + taskId = CreateTask(task_yes_no_maybe, 0x50); + gTasks[taskId].data[0] = var1; + gTasks[taskId].data[1] = var2; + return TRUE; + } } // unused bool8 IsScriptActive(void) { - if(gScriptResult == 0xFF) - return FALSE; - else - return TRUE; + if(gScriptResult == 0xFF) + return FALSE; + else + return TRUE; } void task_yes_no_maybe(u8 taskId) @@ -227,3 +230,71 @@ void task_yes_no_maybe(u8 taskId) DestroyTask(taskId); EnableBothScriptContexts(); } + +bool8 sub_80B5578(u8 left, u8 top, u8 multichoiceId, u8 a4, u8 columnCount) +{ + u8 bottom = 0; + + if (FuncIsActiveTask(sub_80B5684) == TRUE) + { + return FALSE; + } + else + { + u8 taskId; + u8 width; + + gScriptResult = 255; + + sub_807274C(left, top, gMultichoiceLists[multichoiceId].count, 0, gMultichoiceLists[multichoiceId].list, columnCount, 0); + + taskId = CreateTask(sub_80B5684, 80); + + if (!((gMultichoiceLists[multichoiceId].count >> 1) < columnCount || (gMultichoiceLists[multichoiceId].count & 1)) + || columnCount == 1 || gMultichoiceLists[multichoiceId].count == columnCount) + { + bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 1 + top; + } + else + { + bottom = (2 * (gMultichoiceLists[multichoiceId].count / columnCount)) + 3 + top; + } + + width = sub_807288C(columnCount); + gTasks[taskId].data[0] = left; + gTasks[taskId].data[1] = top; + gTasks[taskId].data[2] = width + left + 2; + gTasks[taskId].data[3] = bottom; + gTasks[taskId].data[4] = a4; + return TRUE; + } +} + +void sub_80B5684(u8 taskId) +{ + s8 var = sub_80727CC(); + + if (var != -2) + { + if (var == -1) + { + if (!gTasks[taskId].data[4]) + { + PlaySE(5); + gScriptResult = 127; + } + else + { + return; + } + } + else + { + gScriptResult = var; + } + sub_8072DEC(); + MenuZeroFillWindowRect(gTasks[taskId].data[0], gTasks[taskId].data[1], gTasks[taskId].data[2], gTasks[taskId].data[3]); + DestroyTask(taskId); + EnableBothScriptContexts(); + } +} |