summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_specials.s500
-rw-r--r--common_syms/field_specials.txt2
-rw-r--r--data/maps/CeruleanCity_House1/scripts.inc2
-rw-r--r--data/maps/CeruleanCity_House5/scripts.inc2
-rw-r--r--data/maps/SilphCo_Elevator/scripts.inc2
-rw-r--r--data/specials.inc2
-rw-r--r--src/field_specials.c289
-rw-r--r--sym_common.txt7
-rw-r--r--sym_ewram.txt12
9 files changed, 297 insertions, 521 deletions
diff --git a/asm/field_specials.s b/asm/field_specials.s
index 5e17271e6..79f66d386 100644
--- a/asm/field_specials.s
+++ b/asm/field_specials.s
@@ -5,506 +5,6 @@
.text
- thumb_func_start sub_80CB7C4
-sub_80CB7C4: @ 80CB7C4
- push {r4,r5,lr}
- ldr r0, _080CB808 @ =sub_809D6D4
- bl sub_81119D4
- lsls r0, 24
- lsrs r0, 24
- cmp r0, 0x1
- bne _080CB7D6
- b _080CB8F8
-_080CB7D6:
- ldr r0, _080CB80C @ =sub_80CB904
- movs r1, 0x8
- bl CreateTask
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- ldr r1, _080CB810 @ =gTasks
- adds r3, r0, r1
- ldr r0, _080CB814 @ =gSpecialVar_0x8004
- ldrh r4, [r0]
- cmp r4, 0x3
- beq _080CB886
- cmp r4, 0x3
- bgt _080CB818
- cmp r4, 0x1
- beq _080CB842
- cmp r4, 0x1
- bgt _080CB870
- cmp r4, 0
- beq _080CB82A
- b _080CB8EC
- .align 2, 0
-_080CB808: .4byte sub_809D6D4
-_080CB80C: .4byte sub_80CB904
-_080CB810: .4byte gTasks
-_080CB814: .4byte gSpecialVar_0x8004
-_080CB818:
- cmp r4, 0x5
- beq _080CB8B4
- cmp r4, 0x5
- blt _080CB89E
- cmp r4, 0x6
- beq _080CB8D2
- cmp r4, 0x63
- beq _080CB8F8
- b _080CB8EC
-_080CB82A:
- movs r0, 0x4
- strh r0, [r3, 0x8]
- movs r0, 0x9
- strh r0, [r3, 0xA]
- movs r1, 0x1
- strh r1, [r3, 0xC]
- strh r1, [r3, 0xE]
- movs r0, 0xC
- strh r0, [r3, 0x10]
- movs r0, 0x7
- strh r0, [r3, 0x12]
- b _080CB8E6
-_080CB842:
- movs r2, 0
- movs r0, 0x7
- strh r0, [r3, 0x8]
- movs r1, 0xC
- strh r1, [r3, 0xA]
- strh r4, [r3, 0xC]
- strh r4, [r3, 0xE]
- movs r0, 0x8
- strh r0, [r3, 0x10]
- strh r1, [r3, 0x12]
- strh r2, [r3, 0x14]
- strh r5, [r3, 0x26]
- ldr r0, _080CB868 @ =sElevatorScroll
- ldrh r0, [r0]
- strh r0, [r3, 0x16]
- ldr r0, _080CB86C @ =sElevatorCursorPos
- ldrh r0, [r0]
- strh r0, [r3, 0x18]
- b _080CB8F8
- .align 2, 0
-_080CB868: .4byte sElevatorScroll
-_080CB86C: .4byte sElevatorCursorPos
-_080CB870:
- movs r1, 0
- movs r0, 0x4
- strh r0, [r3, 0x8]
- strh r0, [r3, 0xA]
- movs r0, 0x1
- strh r0, [r3, 0xC]
- strh r0, [r3, 0xE]
- movs r0, 0x8
- strh r0, [r3, 0x10]
- strh r0, [r3, 0x12]
- b _080CB8E6
-_080CB886:
- movs r1, 0
- movs r0, 0x4
- strh r0, [r3, 0x8]
- movs r0, 0x6
- strh r0, [r3, 0xA]
- movs r0, 0x1
- strh r0, [r3, 0xC]
- strh r0, [r3, 0xE]
- movs r0, 0x8
- strh r0, [r3, 0x10]
- strh r0, [r3, 0x12]
- b _080CB8E6
-_080CB89E:
- movs r0, 0x4
- strh r0, [r3, 0x8]
- strh r0, [r3, 0xA]
- movs r1, 0x1
- strh r1, [r3, 0xC]
- strh r1, [r3, 0xE]
- movs r0, 0x11
- strh r0, [r3, 0x10]
- movs r0, 0x8
- strh r0, [r3, 0x12]
- b _080CB8E6
-_080CB8B4:
- movs r2, 0
- movs r0, 0x7
- strh r0, [r3, 0x8]
- movs r1, 0xC
- strh r1, [r3, 0xA]
- movs r0, 0x10
- strh r0, [r3, 0xC]
- movs r0, 0x1
- strh r0, [r3, 0xE]
- movs r0, 0x11
- strh r0, [r3, 0x10]
- strh r1, [r3, 0x12]
- strh r2, [r3, 0x14]
- strh r5, [r3, 0x26]
- b _080CB8F8
-_080CB8D2:
- movs r1, 0
- movs r0, 0x3
- strh r0, [r3, 0x8]
- strh r0, [r3, 0xA]
- movs r0, 0x1
- strh r0, [r3, 0xC]
- strh r0, [r3, 0xE]
- movs r0, 0x8
- strh r0, [r3, 0x10]
- strh r4, [r3, 0x12]
-_080CB8E6:
- strh r1, [r3, 0x14]
- strh r5, [r3, 0x26]
- b _080CB8F8
-_080CB8EC:
- ldr r1, _080CB900 @ =gSpecialVar_Result
- movs r0, 0x7F
- strh r0, [r1]
- adds r0, r5, 0
- bl DestroyTask
-_080CB8F8:
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_080CB900: .4byte gSpecialVar_Result
- thumb_func_end sub_80CB7C4
-
- thumb_func_start sub_80CB904
-sub_80CB904: @ 80CB904
- push {r4-r7,lr}
- mov r7, r10
- mov r6, r9
- mov r5, r8
- push {r5-r7}
- sub sp, 0x20
- lsls r0, 24
- lsrs r7, r0, 24
- lsls r0, r7, 2
- adds r0, r7
- lsls r0, 3
- ldr r1, _080CB934 @ =gTasks
- adds r5, r0, r1
- bl ScriptContext2_Enable
- ldr r0, _080CB938 @ =gSpecialVar_0x8004
- ldrh r0, [r0]
- cmp r0, 0x1
- bne _080CB944
- ldr r0, _080CB93C @ =gUnknown_2039A18
- ldr r1, _080CB940 @ =sElevatorScroll
- ldrh r1, [r1]
- strh r1, [r0]
- b _080CB94A
- .align 2, 0
-_080CB934: .4byte gTasks
-_080CB938: .4byte gSpecialVar_0x8004
-_080CB93C: .4byte gUnknown_2039A18
-_080CB940: .4byte sElevatorScroll
-_080CB944:
- ldr r1, _080CBA60 @ =gUnknown_2039A18
- movs r0, 0
- strh r0, [r1]
-_080CB94A:
- ldr r4, _080CBA64 @ =gUnknown_2039A14
- movs r1, 0xA
- ldrsh r0, [r5, r1]
- lsls r0, 3
- bl AllocZeroed
- str r0, [r4]
- bl sub_80CBA7C
- movs r6, 0
- movs r4, 0
- movs r2, 0xA
- ldrsh r0, [r5, r2]
- lsls r3, r7, 2
- mov r10, r3
- add r1, sp, 0x18
- mov r9, r1
- cmp r6, r0
- bge _080CB9AE
- ldr r2, _080CBA68 @ =gUnknown_83F5BCC
- mov r8, r2
-_080CB974:
- ldr r0, _080CBA64 @ =gUnknown_2039A14
- ldr r0, [r0]
- lsls r3, r4, 3
- adds r3, r0
- lsls r2, r4, 2
- ldr r0, _080CBA6C @ =gSpecialVar_0x8004
- ldrh r1, [r0]
- lsls r0, r1, 1
- adds r0, r1
- lsls r0, 4
- adds r2, r0
- add r2, r8
- ldr r1, [r2]
- str r1, [r3]
- str r4, [r3, 0x4]
- movs r0, 0x2
- movs r2, 0
- bl GetStringWidth
- cmp r0, r6
- ble _080CB9A0
- adds r6, r0, 0
-_080CB9A0:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- movs r3, 0xA
- ldrsh r0, [r5, r3]
- cmp r4, r0
- blt _080CB974
-_080CB9AE:
- adds r0, r6, 0
- adds r0, 0x9
- cmp r0, 0
- bge _080CB9B8
- adds r0, 0x7
-_080CB9B8:
- asrs r0, 3
- adds r2, r0, 0x1
- strh r2, [r5, 0x10]
- movs r1, 0xC
- ldrsh r0, [r5, r1]
- movs r3, 0x10
- ldrsh r1, [r5, r3]
- adds r0, r1
- cmp r0, 0x1D
- ble _080CB9D2
- movs r0, 0x1D
- subs r0, r2
- strh r0, [r5, 0xC]
-_080CB9D2:
- ldrb r2, [r5, 0xC]
- ldrb r3, [r5, 0xE]
- ldrb r0, [r5, 0x10]
- str r0, [sp]
- ldrb r0, [r5, 0x12]
- str r0, [sp, 0x4]
- movs r0, 0xF
- str r0, [sp, 0x8]
- movs r0, 0x38
- str r0, [sp, 0xC]
- add r0, sp, 0x10
- movs r1, 0
- bl SetWindowTemplateFields
- ldr r0, [sp, 0x10]
- ldr r1, [sp, 0x14]
- str r0, [sp, 0x18]
- str r1, [sp, 0x1C]
- mov r0, r9
- bl AddWindow
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r5, 0x22]
- movs r1, 0
- bl SetStdWindowBorderStyle
- ldr r4, _080CBA70 @ =gUnknown_3005360
- ldrh r0, [r5, 0xA]
- strh r0, [r4, 0xC]
- ldrh r0, [r5, 0x8]
- strh r0, [r4, 0xE]
- ldrh r0, [r5, 0x22]
- strb r0, [r4, 0x10]
- adds r0, r7, 0
- bl sub_80CBCC0
- ldrh r1, [r5, 0x16]
- ldrh r2, [r5, 0x18]
- adds r0, r4, 0
- bl ListMenuInit
- lsls r0, 24
- lsrs r0, 24
- strh r0, [r5, 0x24]
- ldrh r0, [r5, 0x22]
- lsls r0, 24
- lsrs r0, 24
- bl PutWindowTilemap
- ldrh r0, [r5, 0x22]
- lsls r0, 24
- lsrs r0, 24
- movs r1, 0x3
- bl CopyWindowToVram
- ldr r1, _080CBA74 @ =gTasks
- mov r2, r10
- adds r0, r2, r7
- lsls r0, 3
- adds r0, r1
- ldr r1, _080CBA78 @ =sub_80CBB28
- str r1, [r0]
- add sp, 0x20
- pop {r3-r5}
- mov r8, r3
- mov r9, r4
- mov r10, r5
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_080CBA60: .4byte gUnknown_2039A18
-_080CBA64: .4byte gUnknown_2039A14
-_080CBA68: .4byte gUnknown_83F5BCC
-_080CBA6C: .4byte gSpecialVar_0x8004
-_080CBA70: .4byte gUnknown_3005360
-_080CBA74: .4byte gTasks
-_080CBA78: .4byte sub_80CBB28
- thumb_func_end sub_80CB904
-
- thumb_func_start sub_80CBA7C
-sub_80CBA7C: @ 80CBA7C
- ldr r2, _080CBAD0 @ =gUnknown_3005360
- ldr r0, _080CBAD4 @ =gUnknown_2039A14
- ldr r0, [r0]
- str r0, [r2]
- ldr r0, _080CBAD8 @ =sub_80CBADC
- str r0, [r2, 0x4]
- movs r0, 0
- str r0, [r2, 0x8]
- movs r1, 0
- movs r0, 0x1
- strh r0, [r2, 0xC]
- strh r0, [r2, 0xE]
- strb r1, [r2, 0x10]
- strb r1, [r2, 0x11]
- movs r0, 0x8
- strb r0, [r2, 0x12]
- strb r1, [r2, 0x13]
- movs r0, 0x20
- strb r0, [r2, 0x14]
- movs r3, 0x1
- movs r0, 0x31
- strb r0, [r2, 0x15]
- ldrb r1, [r2, 0x16]
- subs r0, 0x39
- ands r0, r1
- orrs r0, r3
- movs r1, 0x39
- negs r1, r1
- ands r0, r1
- movs r3, 0x3F
- ands r0, r3
- strb r0, [r2, 0x16]
- ldrb r1, [r2, 0x17]
- movs r0, 0x40
- negs r0, r0
- ands r0, r1
- movs r1, 0x2
- orrs r0, r1
- ands r0, r3
- strb r0, [r2, 0x17]
- bx lr
- .align 2, 0
-_080CBAD0: .4byte gUnknown_3005360
-_080CBAD4: .4byte gUnknown_2039A14
-_080CBAD8: .4byte sub_80CBADC
- thumb_func_end sub_80CBA7C
-
- thumb_func_start sub_80CBADC
-sub_80CBADC: @ 80CBADC
- push {r4,lr}
- movs r0, 0x5
- bl PlaySE
- ldr r0, _080CBB18 @ =sub_80CBB28
- bl FindTaskIdByFunc
- lsls r0, 24
- lsrs r1, r0, 24
- cmp r1, 0xFF
- beq _080CBB12
- lsls r0, r1, 2
- adds r0, r1
- lsls r0, 3
- ldr r1, _080CBB1C @ =gTasks
- adds r0, r1
- ldrh r0, [r0, 0x24]
- lsls r0, 24
- lsrs r0, 24
- ldr r4, _080CBB20 @ =gUnknown_3005378
- adds r1, r4, 0
- movs r2, 0
- bl ListMenuGetScrollAndRow
- ldr r1, _080CBB24 @ =gUnknown_2039A18
- ldrh r0, [r4]
- strh r0, [r1]
-_080CBB12:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_080CBB18: .4byte sub_80CBB28
-_080CBB1C: .4byte gTasks
-_080CBB20: .4byte gUnknown_3005378
-_080CBB24: .4byte gUnknown_2039A18
- thumb_func_end sub_80CBADC
-
- thumb_func_start sub_80CBB28
-sub_80CBB28: @ 80CBB28
- push {r4-r6,lr}
- lsls r0, 24
- lsrs r5, r0, 24
- lsls r0, r5, 2
- adds r0, r5
- lsls r0, 3
- ldr r1, _080CBB54 @ =gTasks
- adds r6, r0, r1
- ldrh r0, [r6, 0x24]
- lsls r0, 24
- lsrs r0, 24
- bl ListMenu_ProcessInput
- adds r4, r0, 0
- movs r0, 0x2
- negs r0, r0
- cmp r4, r0
- beq _080CBB58
- adds r0, 0x1
- cmp r4, r0
- bne _080CBB6C
- b _080CBBA2
- .align 2, 0
-_080CBB54: .4byte gTasks
-_080CBB58:
- ldr r1, _080CBB68 @ =gSpecialVar_Result
- movs r0, 0x7F
- strh r0, [r1]
- movs r0, 0x5
- bl PlaySE
- b _080CBB88
- .align 2, 0
-_080CBB68: .4byte gSpecialVar_Result
-_080CBB6C:
- ldr r0, _080CBB90 @ =gSpecialVar_Result
- strh r4, [r0]
- movs r0, 0x5
- bl PlaySE
- movs r1, 0x14
- ldrsh r0, [r6, r1]
- cmp r0, 0
- beq _080CBB88
- movs r1, 0xA
- ldrsh r0, [r6, r1]
- subs r0, 0x1
- cmp r4, r0
- bne _080CBB94
-_080CBB88:
- adds r0, r5, 0
- bl sub_80CBBAC
- b _080CBBA2
- .align 2, 0
-_080CBB90: .4byte gSpecialVar_Result
-_080CBB94:
- adds r0, r5, 0
- bl sub_80CBD50
- ldr r0, _080CBBA8 @ =sub_80CBC2C
- str r0, [r6]
- bl EnableBothScriptContexts
-_080CBBA2:
- pop {r4-r6}
- pop {r0}
- bx r0
- .align 2, 0
-_080CBBA8: .4byte sub_80CBC2C
- thumb_func_end sub_80CBB28
-
thumb_func_start sub_80CBBAC
sub_80CBBAC: @ 80CBBAC
push {r4,r5,lr}
diff --git a/common_syms/field_specials.txt b/common_syms/field_specials.txt
new file mode 100644
index 000000000..e47053762
--- /dev/null
+++ b/common_syms/field_specials.txt
@@ -0,0 +1,2 @@
+gUnknown_3005360
+gUnknown_3005378
diff --git a/data/maps/CeruleanCity_House1/scripts.inc b/data/maps/CeruleanCity_House1/scripts.inc
index 18bc90fb6..04577bf37 100644
--- a/data/maps/CeruleanCity_House1/scripts.inc
+++ b/data/maps/CeruleanCity_House1/scripts.inc
@@ -8,7 +8,7 @@ CeruleanCity_House1_EventScript_16A7F0:: @ 816A7F0
message Text_191967
waitmessage
setvar VAR_0x8004, 0
- special sub_80CB7C4
+ special Special_ListMenu
waitstate
switch VAR_RESULT
case 0, EventScript_16A8FB
diff --git a/data/maps/CeruleanCity_House5/scripts.inc b/data/maps/CeruleanCity_House5/scripts.inc
index 1f5d8899a..79cd75785 100644
--- a/data/maps/CeruleanCity_House5/scripts.inc
+++ b/data/maps/CeruleanCity_House5/scripts.inc
@@ -40,7 +40,7 @@ EventScript_16AEC8:: @ 816AEC8
message Text_1932F4
waitmessage
setvar VAR_0x8004, 5
- special sub_80CB7C4
+ special Special_ListMenu
waitstate
switch VAR_RESULT
case 0, EventScript_16AF6C
diff --git a/data/maps/SilphCo_Elevator/scripts.inc b/data/maps/SilphCo_Elevator/scripts.inc
index 3202bdeb8..4d75eec38 100644
--- a/data/maps/SilphCo_Elevator/scripts.inc
+++ b/data/maps/SilphCo_Elevator/scripts.inc
@@ -12,7 +12,7 @@ SilphCo_Elevator_EventScript_161F6F:: @ 8161F6F
waitmessage
setvar VAR_0x8004, 1
specialvar VAR_RESULT, Special_InitElevatorFloorSelectMenuPos
- special sub_80CB7C4
+ special Special_ListMenu
waitstate
switch VAR_RESULT
case 0, EventScript_1621BF
diff --git a/data/specials.inc b/data/specials.inc
index 20dd3facb..b0eac8922 100644
--- a/data/specials.inc
+++ b/data/specials.inc
@@ -353,7 +353,7 @@ gSpecials:: @ 815FD60
def_special sub_810B82C
def_special sub_807F904
def_special Special_ForcePlayerOntoBike
- def_special sub_80CB7C4
+ def_special Special_ListMenu
def_special sub_80CBC5C
def_special sub_80CADC4
def_special Special_SetVermilionTrashCans
diff --git a/src/field_specials.c b/src/field_specials.c
index 0aa1f81d1..7decaee7b 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -1,5 +1,7 @@
#include "global.h"
+#include "malloc.h"
#include "quest_log.h"
+#include "list_menu.h"
#include "diploma.h"
#include "script.h"
#include "field_player_avatar.h"
@@ -26,6 +28,7 @@
#include "window.h"
#include "text_window.h"
#include "menu.h"
+#include "new_menu_helpers.h"
#include "constants/songs.h"
#include "constants/species.h"
#include "constants/items.h"
@@ -35,6 +38,13 @@
EWRAM_DATA u8 sElevatorCurrentFloorWindowId = 0;
EWRAM_DATA u16 sElevatorScroll = 0;
EWRAM_DATA u16 sElevatorCursorPos = 0;
+EWRAM_DATA struct ListMenuItem * gUnknown_2039A14 = NULL;
+EWRAM_DATA u16 gUnknown_2039A18 = 0;
+EWRAM_DATA u8 gUnknown_2039A1A = 0;
+EWRAM_DATA u8 gUnknown_2039A1B = 0;
+
+struct ListMenuTemplate gUnknown_3005360;
+u16 gUnknown_3005378;
static void Task_AnimatePcTurnOn(u8 taskId);
static void PcTurnOnUpdateMetatileId(bool16 flag);
@@ -45,8 +55,17 @@ static u16 SampleResortGoregeousReward(void);
static void Task_ElevatorShake(u8 taskId);
static void AnimateElevatorWindowView(u16 nfloors, bool8 direction);
static void Task_AnimateElevatorWindowView(u8 taskId);
+static void Task_CreateScriptListMenu(u8 taskId);
+void sub_80CBA7C(void);
+void sub_80CBADC(s32 nothing, bool8 is, struct ListMenu * used);
+void sub_80CBB28(u8 taskId);
+void sub_80CBBAC(u8 taskId);
+void sub_80CBC2C(u8 taskId);
+void sub_80CBCC0(u8 taskId);
+void sub_80CBD50(u8 taskId);
u16 GetStarterPokemon(u16 starterIdx);
+extern const u8 *const gUnknown_83F5BCC[][12];
extern const u8 sSlotMachineIndices[22];
extern const u16 sResortGorgeousDeluxeRewards[6];
extern const struct WindowTemplate sElevatorCurrentFloorWindowTemplate;
@@ -953,3 +972,273 @@ static void Task_AnimateElevatorWindowView(u8 taskId)
}
data[1]++;
}
+
+void Special_ListMenu(void)
+{
+ u8 taskId;
+ struct Task * task;
+ if (sub_81119D4(sub_809D6D4) != TRUE)
+ {
+ taskId = CreateTask(Task_CreateScriptListMenu, 8);
+ task = &gTasks[taskId];
+ switch (gSpecialVar_0x8004)
+ {
+ case 0:
+ task->data[0] = 4;
+ task->data[1] = 9;
+ task->data[2] = 1;
+ task->data[3] = 1;
+ task->data[4] = 12;
+ task->data[5] = 7;
+ task->data[6] = 1;
+ task->data[15] = taskId;
+ break;
+ case 1:
+ task->data[0] = 7;
+ task->data[1] = 12;
+ task->data[2] = 1;
+ task->data[3] = 1;
+ task->data[4] = 8;
+ task->data[5] = 12;
+ task->data[6] = 0;
+ task->data[15] = taskId;
+ task->data[7] = sElevatorScroll;
+ task->data[8] = sElevatorCursorPos;
+ break;
+ case 2:
+ task->data[0] = 4;
+ task->data[1] = 4;
+ task->data[2] = 1;
+ task->data[3] = 1;
+ task->data[4] = 8;
+ task->data[5] = 8;
+ task->data[6] = 0;
+ task->data[15] = taskId;
+ break;
+ case 3:
+ task->data[0] = 4;
+ task->data[1] = 6;
+ task->data[2] = 1;
+ task->data[3] = 1;
+ task->data[4] = 8;
+ task->data[5] = 8;
+ task->data[6] = 0;
+ task->data[15] = taskId;
+ break;
+ case 4:
+ task->data[0] = 4;
+ task->data[1] = 4;
+ task->data[2] = 1;
+ task->data[3] = 1;
+ task->data[4] = 17;
+ task->data[5] = 8;
+ task->data[6] = 1;
+ task->data[15] = taskId;
+ break;
+ case 5:
+ task->data[0] = 7;
+ task->data[1] = 12;
+ task->data[2] = 16;
+ task->data[3] = 1;
+ task->data[4] = 17;
+ task->data[5] = 12;
+ task->data[6] = 0;
+ task->data[15] = taskId;
+ break;
+ case 6:
+ task->data[0] = 3;
+ task->data[1] = 3;
+ task->data[2] = 1;
+ task->data[3] = 1;
+ task->data[4] = 8;
+ task->data[5] = 6;
+ task->data[6] = 0;
+ task->data[15] = taskId;
+ break;
+ case 99:
+ break;
+ default:
+ gSpecialVar_Result = 0x7F;
+ DestroyTask(taskId);
+ break;
+ }
+ }
+}
+
+static void Task_CreateScriptListMenu(u8 taskId)
+{
+ struct WindowTemplate template;
+ u8 i;
+ s32 width;
+ s32 mwidth;
+ struct Task * task = &gTasks[taskId];
+ u8 windowId;
+ ScriptContext2_Enable();
+ if (gSpecialVar_0x8004 == 1)
+ gUnknown_2039A18 = sElevatorScroll;
+ else
+ gUnknown_2039A18 = 0;
+ gUnknown_2039A14 = AllocZeroed(task->data[1] * sizeof(struct ListMenuItem));
+ sub_80CBA7C();
+ mwidth = 0;
+ for (i = 0; i < task->data[1]; i++)
+ {
+ gUnknown_2039A14[i].label = gUnknown_83F5BCC[gSpecialVar_0x8004][i];
+ gUnknown_2039A14[i].index = i;
+ width = GetStringWidth(2, gUnknown_2039A14[i].label, 0);
+ if (width > mwidth)
+ mwidth = width;
+ }
+ task->data[4] = (mwidth + 9) / 8 + 1;
+ if (task->data[2] + task->data[4] > 29)
+ task->data[2] = 29 - task->data[4];
+ template = SetWindowTemplateFields(0, task->data[2], task->data[3], task->data[4], task->data[5], 15, 0x038);
+ task->data[13] = windowId = AddWindow(&template);
+ SetStdWindowBorderStyle(task->data[13], 0);
+ gUnknown_3005360.totalItems = task->data[1];
+ gUnknown_3005360.maxShowed = task->data[0];
+ gUnknown_3005360.windowId = task->data[13];
+ sub_80CBCC0(taskId);
+ task->data[14] = ListMenuInit(&gUnknown_3005360, task->data[7], task->data[8]);
+ PutWindowTilemap(task->data[13]);
+ CopyWindowToVram(task->data[13], 3);
+ gTasks[taskId].func = sub_80CBB28;
+}
+
+void sub_80CBA7C(void)
+{
+ gUnknown_3005360.items = gUnknown_2039A14;
+ gUnknown_3005360.moveCursorFunc = sub_80CBADC;
+ gUnknown_3005360.itemPrintFunc = NULL;
+ gUnknown_3005360.totalItems = 1;
+ gUnknown_3005360.maxShowed = 1;
+ gUnknown_3005360.windowId = 0;
+ gUnknown_3005360.header_X = 0;
+ gUnknown_3005360.item_X = 8;
+ gUnknown_3005360.cursor_X = 0;
+ gUnknown_3005360.upText_Y = 0;
+ gUnknown_3005360.cursorPal = 2;
+ gUnknown_3005360.fillValue = 1;
+ gUnknown_3005360.cursorShadowPal = 3;
+ gUnknown_3005360.lettersSpacing = 1;
+ gUnknown_3005360.itemVerticalPadding = 0;
+ gUnknown_3005360.scrollMultiple = 0;
+ gUnknown_3005360.fontId = 2;
+ gUnknown_3005360.cursorKind = 0;
+}
+
+void sub_80CBADC(s32 nothing, bool8 is, struct ListMenu * used)
+{
+ u8 taskId;
+ struct Task * task;
+ PlaySE(SE_SELECT);
+ taskId = FindTaskIdByFunc(sub_80CBB28);
+ if (taskId != 0xFF)
+ {
+ task = &gTasks[taskId];
+ ListMenuGetScrollAndRow(task->data[14], &gUnknown_3005378, NULL);
+ gUnknown_2039A18 = gUnknown_3005378;
+ }
+}
+
+#ifdef NONMATCHING
+// task should be in r6, taskId in r5
+void sub_80CBB28(u8 taskId)
+{
+ struct Task * task = &gTasks[taskId];
+ s32 input = ListMenu_ProcessInput(task->data[14]);
+ switch (input)
+ {
+ case -1:
+ break;
+ case -2:
+ gSpecialVar_Result = 0x7F;
+ PlaySE(SE_SELECT);
+ sub_80CBBAC(taskId);
+ break;
+ default:
+ gSpecialVar_Result = input;
+ PlaySE(SE_SELECT);
+ if (task->data[6] == 0 || input == task->data[1] - 1)
+ {
+ sub_80CBBAC(taskId);
+ }
+ else
+ {
+ sub_80CBD50(taskId);
+ task->func = sub_80CBC2C;
+ EnableBothScriptContexts();
+ }
+ break;
+ }
+}
+#else
+NAKED
+void sub_80CBB28(u8 taskId)
+{
+ asm_unified("\tpush {r4-r6,lr}\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r5, r0, 24\n"
+ "\tlsls r0, r5, 2\n"
+ "\tadds r0, r5\n"
+ "\tlsls r0, 3\n"
+ "\tldr r1, _080CBB54 @ =gTasks\n"
+ "\tadds r6, r0, r1\n"
+ "\tldrh r0, [r6, 0x24]\n"
+ "\tlsls r0, 24\n"
+ "\tlsrs r0, 24\n"
+ "\tbl ListMenu_ProcessInput\n"
+ "\tadds r4, r0, 0\n"
+ "\tmovs r0, 0x2\n"
+ "\tnegs r0, r0\n"
+ "\tcmp r4, r0\n"
+ "\tbeq _080CBB58\n"
+ "\tadds r0, 0x1\n"
+ "\tcmp r4, r0\n"
+ "\tbne _080CBB6C\n"
+ "\tb _080CBBA2\n"
+ "\t.align 2, 0\n"
+ "_080CBB54: .4byte gTasks\n"
+ "_080CBB58:\n"
+ "\tldr r1, _080CBB68 @ =gSpecialVar_Result\n"
+ "\tmovs r0, 0x7F\n"
+ "\tstrh r0, [r1]\n"
+ "\tmovs r0, 0x5\n"
+ "\tbl PlaySE\n"
+ "\tb _080CBB88\n"
+ "\t.align 2, 0\n"
+ "_080CBB68: .4byte gSpecialVar_Result\n"
+ "_080CBB6C:\n"
+ "\tldr r0, _080CBB90 @ =gSpecialVar_Result\n"
+ "\tstrh r4, [r0]\n"
+ "\tmovs r0, 0x5\n"
+ "\tbl PlaySE\n"
+ "\tmovs r1, 0x14\n"
+ "\tldrsh r0, [r6, r1]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _080CBB88\n"
+ "\tmovs r1, 0xA\n"
+ "\tldrsh r0, [r6, r1]\n"
+ "\tsubs r0, 0x1\n"
+ "\tcmp r4, r0\n"
+ "\tbne _080CBB94\n"
+ "_080CBB88:\n"
+ "\tadds r0, r5, 0\n"
+ "\tbl sub_80CBBAC\n"
+ "\tb _080CBBA2\n"
+ "\t.align 2, 0\n"
+ "_080CBB90: .4byte gSpecialVar_Result\n"
+ "_080CBB94:\n"
+ "\tadds r0, r5, 0\n"
+ "\tbl sub_80CBD50\n"
+ "\tldr r0, _080CBBA8 @ =sub_80CBC2C\n"
+ "\tstr r0, [r6]\n"
+ "\tbl EnableBothScriptContexts\n"
+ "_080CBBA2:\n"
+ "\tpop {r4-r6}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+ "_080CBBA8: .4byte sub_80CBC2C");
+}
+#endif //NONMATCHING
diff --git a/sym_common.txt b/sym_common.txt
index 7e3d83488..96ac36e1c 100644
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -120,11 +120,8 @@ gUnknown_3005350: @ 3005350
gUnknown_3005354: @ 3005354
.space 0xC
-gUnknown_3005360: @ 3005360
- .space 0x18
-
-gUnknown_3005378: @ 3005378
- .space 0x4
+ .align 2
+ .include "field_specials.o"
gUnknown_300537C: @ 300537C
.space 0x4
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 1e8576c70..1d7f2aaec 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -851,18 +851,6 @@ gPlayerFacingPosition: @ 2039A04
.include "src/field_specials.o"
.align 2
-gUnknown_2039A14: @ 2039A14
- .space 0x4
-
-gUnknown_2039A18: @ 2039A18
- .space 0x2
-
-gUnknown_2039A1A: @ 2039A1A
- .space 0x1
-
-gUnknown_2039A1B: @ 2039A1B
- .space 0x1
-
.include "src/battle_records.o"
gUnknown_2039A20: @ 2039A20