diff options
-rwxr-xr-x | asm/field_specials.s | 338 | ||||
-rwxr-xr-x | data/field_specials.s | 11 | ||||
-rwxr-xr-x | src/field_specials.c | 237 |
3 files changed, 237 insertions, 349 deletions
diff --git a/asm/field_specials.s b/asm/field_specials.s index 3c8a476cb..3bd35217a 100755 --- a/asm/field_specials.s +++ b/asm/field_specials.s @@ -6,344 +6,6 @@ .text - thumb_func_start ShowGlassWorkshopMenu -ShowGlassWorkshopMenu: @ 810F090 - push {r4,r5,lr} - sub sp, 0x8 - bl ScriptContext2_Enable - movs r0, 0 - movs r1, 0 - movs r2, 0xA - movs r3, 0xB - bl MenuDrawTextWindow - movs r4, 0 - str r4, [sp] - movs r0, 0x9 - str r0, [sp, 0x4] - movs r0, 0 - movs r1, 0x1 - movs r2, 0x1 - movs r3, 0x5 - bl InitMenu - ldr r0, _0810F104 @ =gUnknown_0203925C - strb r4, [r0] - bl sub_80F944C - bl LoadScrollIndicatorPalette - bl sub_810F2B4 - ldr r5, _0810F108 @ =gUnknown_083F83C0 -_0810F0CA: - lsls r0, r4, 2 - adds r0, r5 - ldr r0, [r0] - lsls r2, r4, 1 - adds r2, 0x1 - lsls r2, 24 - lsrs r2, 24 - movs r1, 0x1 - bl MenuPrint - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0x4 - bls _0810F0CA - ldr r1, _0810F10C @ =gUnknown_0203925B - movs r0, 0 - strb r0, [r1] - ldr r1, _0810F110 @ =gUnknown_0203925A - movs r0, 0x8 - strb r0, [r1] - ldr r0, _0810F114 @ =sub_810F118 - movs r1, 0x8 - bl CreateTask - add sp, 0x8 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0810F104: .4byte gUnknown_0203925C -_0810F108: .4byte gUnknown_083F83C0 -_0810F10C: .4byte gUnknown_0203925B -_0810F110: .4byte gUnknown_0203925A -_0810F114: .4byte sub_810F118 - thumb_func_end ShowGlassWorkshopMenu - - thumb_func_start sub_810F118 -sub_810F118: @ 810F118 - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _0810F1E4 @ =gMain - ldrh r0, [r0, 0x2E] - cmp r0, 0x40 - bne _0810F14A - ldr r1, _0810F1E8 @ =gUnknown_0203925B - ldrb r0, [r1] - cmp r0, 0 - beq _0810F14A - subs r0, 0x1 - strb r0, [r1] - bl GetMenuCursorPos - lsls r0, 24 - lsrs r4, r0, 24 - movs r0, 0x1 - negs r0, r0 - bl MoveMenuCursorNoWrap - adds r0, r4, 0 - movs r1, 0x40 - bl sub_810F1F4 -_0810F14A: - ldr r0, _0810F1E4 @ =gMain - ldrh r0, [r0, 0x2E] - cmp r0, 0x80 - bne _0810F17A - ldr r2, _0810F1E8 @ =gUnknown_0203925B - ldrb r1, [r2] - ldr r0, _0810F1EC @ =gUnknown_0203925A - ldrb r0, [r0] - subs r0, 0x1 - cmp r1, r0 - beq _0810F17A - adds r0, r1, 0x1 - strb r0, [r2] - bl GetMenuCursorPos - lsls r0, 24 - lsrs r4, r0, 24 - movs r0, 0x1 - bl MoveMenuCursorNoWrap - adds r0, r4, 0 - movs r1, 0x80 - bl sub_810F1F4 -_0810F17A: - ldr r4, _0810F1E4 @ =gMain - ldrh r1, [r4, 0x2E] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0810F1AE - bl HandleDestroyMenuCursors - ldr r0, _0810F1F0 @ =gScriptResult - ldr r1, _0810F1E8 @ =gUnknown_0203925B - ldrb r1, [r1] - strh r1, [r0] - movs r0, 0x5 - bl PlaySE - bl sub_810EEDC - movs r0, 0 - movs r1, 0 - movs r2, 0x1D - movs r3, 0xC - bl MenuZeroFillWindowRect - adds r0, r5, 0 - bl sub_810EC9C -_0810F1AE: - ldrh r1, [r4, 0x2E] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0810F1DE - bl HandleDestroyMenuCursors - ldr r1, _0810F1F0 @ =gScriptResult - movs r0, 0x7F - strh r0, [r1] - movs r0, 0x5 - bl PlaySE - bl sub_810EEDC - movs r0, 0 - movs r1, 0 - movs r2, 0x1D - movs r3, 0xC - bl MenuZeroFillWindowRect - adds r0, r5, 0 - bl sub_810EC9C -_0810F1DE: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0810F1E4: .4byte gMain -_0810F1E8: .4byte gUnknown_0203925B -_0810F1EC: .4byte gUnknown_0203925A -_0810F1F0: .4byte gScriptResult - thumb_func_end sub_810F118 - - thumb_func_start sub_810F1F4 -sub_810F1F4: @ 810F1F4 - push {r4-r7,lr} - lsls r0, 24 - lsrs r2, r0, 24 - adds r5, r2, 0 - lsls r1, 24 - lsrs r1, 24 - adds r3, r1, 0 - movs r6, 0 - movs r4, 0 - ldr r0, _0810F214 @ =gUnknown_0203925A - ldrb r0, [r0] - cmp r0, 0x4 - bhi _0810F218 - movs r0, 0 - b _0810F282 - .align 2, 0 -_0810F214: .4byte gUnknown_0203925A -_0810F218: - cmp r1, 0x40 - bne _0810F22C - cmp r2, 0 - bne _0810F240 - ldr r0, _0810F228 @ =gUnknown_0203925B - ldrb r4, [r0] - movs r6, 0x1 - b _0810F244 - .align 2, 0 -_0810F228: .4byte gUnknown_0203925B -_0810F22C: - cmp r3, 0x80 - bne _0810F240 - cmp r5, 0x4 - bne _0810F240 - ldr r0, _0810F288 @ =gUnknown_0203925B - ldrb r0, [r0] - subs r0, 0x4 - lsls r0, 24 - lsrs r4, r0, 24 - movs r6, 0x1 -_0810F240: - cmp r6, 0 - beq _0810F280 -_0810F244: - adds r0, r4, 0 - movs r1, 0x5 - bl GlassWorkshopUpdateScrollIndicators - movs r0, 0x2 - movs r1, 0x1 - movs r2, 0x9 - movs r3, 0xA - bl MenuFillWindowRectWithBlankTile - movs r5, 0 - ldr r7, _0810F28C @ =gUnknown_083F83C0 -_0810F25C: - lsls r0, r4, 2 - adds r0, r7 - ldr r0, [r0] - lsls r2, r5, 1 - adds r2, 0x1 - lsls r2, 24 - lsrs r2, 24 - movs r1, 0x1 - bl MenuPrint - adds r0, r4, 0x1 - lsls r0, 24 - lsrs r4, r0, 24 - adds r0, r5, 0x1 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x4 - bls _0810F25C -_0810F280: - adds r0, r6, 0 -_0810F282: - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0810F288: .4byte gUnknown_0203925B -_0810F28C: .4byte gUnknown_083F83C0 - thumb_func_end sub_810F1F4 - - thumb_func_start sub_810F290 -sub_810F290: @ 810F290 - push {lr} - ldr r2, _0810F2B0 @ =gUnknown_0203925C - ldrb r1, [r2] - lsrs r0, r1, 1 - cmp r0, 0x1 - beq _0810F2AC - movs r0, 0x2 - orrs r0, r1 - strb r0, [r2] - movs r0, 0 - movs r1, 0x2C - movs r2, 0x8 - bl CreateVerticalScrollIndicators -_0810F2AC: - pop {r0} - bx r0 - .align 2, 0 -_0810F2B0: .4byte gUnknown_0203925C - thumb_func_end sub_810F290 - - thumb_func_start sub_810F2B4 -sub_810F2B4: @ 810F2B4 - push {lr} - ldr r2, _0810F2D8 @ =gUnknown_0203925C - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _0810F2D2 - movs r0, 0x1 - orrs r0, r1 - strb r0, [r2] - movs r0, 0x1 - movs r1, 0x2C - movs r2, 0x58 - bl CreateVerticalScrollIndicators -_0810F2D2: - pop {r0} - bx r0 - .align 2, 0 -_0810F2D8: .4byte gUnknown_0203925C - thumb_func_end sub_810F2B4 - - thumb_func_start GlassWorkshopUpdateScrollIndicators -GlassWorkshopUpdateScrollIndicators: @ 810F2DC - push {r4,r5,lr} - lsls r0, 24 - lsrs r4, r0, 24 - lsls r1, 24 - lsrs r5, r1, 24 - cmp r4, 0 - bne _0810F300 - ldr r0, _0810F2FC @ =gUnknown_0203925C - ldrb r1, [r0] - movs r2, 0x2 - eors r1, r2 - strb r1, [r0] - movs r0, 0 - bl DestroyVerticalScrollIndicator - b _0810F304 - .align 2, 0 -_0810F2FC: .4byte gUnknown_0203925C -_0810F300: - bl sub_810F290 -_0810F304: - adds r1, r4, r5 - ldr r0, _0810F314 @ =gUnknown_0203925A - ldrb r0, [r0] - cmp r1, r0 - bge _0810F318 - bl sub_810F2B4 - b _0810F32C - .align 2, 0 -_0810F314: .4byte gUnknown_0203925A -_0810F318: - cmp r1, r0 - bne _0810F32C - ldr r0, _0810F334 @ =gUnknown_0203925C - ldrb r1, [r0] - movs r2, 0x1 - eors r1, r2 - strb r1, [r0] - movs r0, 0x1 - bl DestroyVerticalScrollIndicator -_0810F32C: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0810F334: .4byte gUnknown_0203925C - thumb_func_end GlassWorkshopUpdateScrollIndicators - thumb_func_start SpawnCameraDummy SpawnCameraDummy: @ 810F338 push {lr} diff --git a/data/field_specials.s b/data/field_specials.s index 9589e49b7..78cf99e2c 100755 --- a/data/field_specials.s +++ b/data/field_specials.s @@ -3,17 +3,6 @@ .section .rodata - .align 2 -gUnknown_083F83C0:: @ 83F83C0 - .4byte OtherText_BlueFlute - .4byte OtherText_YellowFlute - .4byte OtherText_RedFlute - .4byte OtherText_WhiteFlute - .4byte OtherText_BlackFlute - .4byte OtherText_PrettyChair - .4byte OtherText_PrettyDesk - .4byte gOtherText_CancelNoTerminator - gUnknown_083F83E0:: @ 83F83E0 .byte 12, 2, 4, 5, 1, 8, 7, 11, 3, 10, 9, 6 diff --git a/src/field_specials.c b/src/field_specials.c index 716043d03..ae73c0e25 100755 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1492,3 +1492,240 @@ void IsGrassTypeInParty(void) } gScriptResult = FALSE; } + +const u8 *const gUnknown_083F83C0[] = { + OtherText_BlueFlute, + OtherText_YellowFlute, + OtherText_RedFlute, + OtherText_WhiteFlute, + OtherText_BlackFlute, + OtherText_PrettyChair, + OtherText_PrettyDesk, + gOtherText_CancelNoTerminator +}; + +void sub_810F118(u8); +bool8 sub_810F1F4(u8, u8); +void sub_810F2B4(void); +void GlassWorkshopUpdateScrollIndicators(u8, u8); + +void ShowGlassWorkshopMenu(void) +{ + u8 i; + ScriptContext2_Enable(); + MenuDrawTextWindow(0, 0, 10, 11); + InitMenu(0, 1, 1, 5, 0, 9); + gUnknown_0203925C = 0; + sub_80F944C(); + LoadScrollIndicatorPalette(); + sub_810F2B4(); + for (i=0; i<5; i++) + { + MenuPrint(gUnknown_083F83C0[i], 1, 2 * i + 1); + } + gUnknown_0203925B = 0; + gUnknown_0203925A = ARRAY_COUNT(gUnknown_083F83C0); + CreateTask(sub_810F118, 8); +} + +void sub_810F118(u8 taskId) +{ + u8 prevCursorPos; + if (gMain.newKeys == DPAD_UP && gUnknown_0203925B != 0) + { + gUnknown_0203925B--; + prevCursorPos = GetMenuCursorPos(); + MoveMenuCursorNoWrap(-1); + sub_810F1F4(prevCursorPos, DPAD_UP); + } + if (gMain.newKeys == DPAD_DOWN && gUnknown_0203925B != gUnknown_0203925A - 1) + { + gUnknown_0203925B++; + prevCursorPos = GetMenuCursorPos(); + MoveMenuCursorNoWrap(1); + sub_810F1F4(prevCursorPos, DPAD_DOWN); + } + if (gMain.newKeys & A_BUTTON) + { + HandleDestroyMenuCursors(); + gScriptResult = gUnknown_0203925B; + PlaySE(SE_SELECT); + sub_810EEDC(); + MenuZeroFillWindowRect(0, 0, 29, 12); + sub_810EC9C(taskId); + } + if (gMain.newKeys & B_BUTTON) + { + HandleDestroyMenuCursors(); + gScriptResult = 0x7f; + PlaySE(SE_SELECT); + sub_810EEDC(); + MenuZeroFillWindowRect(0, 0, 29, 12); + sub_810EC9C(taskId); + } +} + +// Second verse, same as the first +#ifdef NONMATCHING +bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput) +{ + u8 i; + u8 flag = 0; + u8 newPos = 0; + if (gUnknown_0203925A < 5) + { + return FALSE; + } + if (dpadInput == DPAD_UP) + { + if (prevCursorPos == 0) + { + newPos = gUnknown_0203925B; + flag = TRUE; + } + } + else if (dpadInput == DPAD_DOWN) + { + if (prevCursorPos == 4) + { + newPos = gUnknown_0203925B - 4; + flag = TRUE; + } + } + if (flag) + { + GlassWorkshopUpdateScrollIndicators(newPos, 5); + MenuFillWindowRectWithBlankTile(2, 1, 9, 10); + for (i=0; i<5; newPos++, i++) + { + MenuPrint(gUnknown_083F83C0[newPos], 1, 2 * i + 1); + } + } + return flag; +} +#else +__attribute__((naked)) +bool8 sub_810F1F4(u8 prevCursorPos, u8 dpadInput) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tlsls r0, 24\n" + "\tlsrs r2, r0, 24\n" + "\tadds r5, r2, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tadds r3, r1, 0\n" + "\tmovs r6, 0\n" + "\tmovs r4, 0\n" + "\tldr r0, _0810F214 @ =gUnknown_0203925A\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0x4\n" + "\tbhi _0810F218\n" + "\tmovs r0, 0\n" + "\tb _0810F282\n" + "\t.align 2, 0\n" + "_0810F214: .4byte gUnknown_0203925A\n" + "_0810F218:\n" + "\tcmp r1, 0x40\n" + "\tbne _0810F22C\n" + "\tcmp r2, 0\n" + "\tbne _0810F240\n" + "\tldr r0, _0810F228 @ =gUnknown_0203925B\n" + "\tldrb r4, [r0]\n" + "\tmovs r6, 0x1\n" + "\tb _0810F244\n" + "\t.align 2, 0\n" + "_0810F228: .4byte gUnknown_0203925B\n" + "_0810F22C:\n" + "\tcmp r3, 0x80\n" + "\tbne _0810F240\n" + "\tcmp r5, 0x4\n" + "\tbne _0810F240\n" + "\tldr r0, _0810F288 @ =gUnknown_0203925B\n" + "\tldrb r0, [r0]\n" + "\tsubs r0, 0x4\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tmovs r6, 0x1\n" + "_0810F240:\n" + "\tcmp r6, 0\n" + "\tbeq _0810F280\n" + "_0810F244:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x5\n" + "\tbl GlassWorkshopUpdateScrollIndicators\n" + "\tmovs r0, 0x2\n" + "\tmovs r1, 0x1\n" + "\tmovs r2, 0x9\n" + "\tmovs r3, 0xA\n" + "\tbl MenuFillWindowRectWithBlankTile\n" + "\tmovs r5, 0\n" + "\tldr r7, _0810F28C @ =gUnknown_083F83C0\n" + "_0810F25C:\n" + "\tlsls r0, r4, 2\n" + "\tadds r0, r7\n" + "\tldr r0, [r0]\n" + "\tlsls r2, r5, 1\n" + "\tadds r2, 0x1\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tmovs r1, 0x1\n" + "\tbl MenuPrint\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r4, r0, 24\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tcmp r5, 0x4\n" + "\tbls _0810F25C\n" + "_0810F280:\n" + "\tadds r0, r6, 0\n" + "_0810F282:\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_0810F288: .4byte gUnknown_0203925B\n" + "_0810F28C: .4byte gUnknown_083F83C0"); +} +#endif + +void sub_810F290(void) +{ + if (gUnknown_0203925C >> 1 != 1) + { + gUnknown_0203925C |= 0x02; + CreateVerticalScrollIndicators(0, 0x2c, 0x08); + } +} + +void sub_810F2B4(void) +{ + if (!(gUnknown_0203925C & 0x01)) + { + gUnknown_0203925C |= 0x01; + CreateVerticalScrollIndicators(1, 0x2c, 0x58); + } +} + +void GlassWorkshopUpdateScrollIndicators(u8 newPos, u8 maxItems) +{ + if (newPos == 0) + { + gUnknown_0203925C ^= 0x02; + DestroyVerticalScrollIndicator(0); + } + else + { + sub_810F290(); + } + if (newPos + maxItems < gUnknown_0203925A) + { + sub_810F2B4(); + } + else if (newPos + maxItems == gUnknown_0203925A) + { + gUnknown_0203925C ^= 0x01; + DestroyVerticalScrollIndicator(1); + } +} |