summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xasm/field_specials.s338
-rwxr-xr-xdata/field_specials.s11
-rwxr-xr-xsrc/field_specials.c237
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);
+ }
+}