diff options
-rw-r--r-- | asm/field_specials.s | 500 | ||||
-rw-r--r-- | common_syms/field_specials.txt | 2 | ||||
-rw-r--r-- | data/maps/CeruleanCity_House1/scripts.inc | 2 | ||||
-rw-r--r-- | data/maps/CeruleanCity_House5/scripts.inc | 2 | ||||
-rw-r--r-- | data/maps/SilphCo_Elevator/scripts.inc | 2 | ||||
-rw-r--r-- | data/specials.inc | 2 | ||||
-rw-r--r-- | src/field_specials.c | 289 | ||||
-rw-r--r-- | sym_common.txt | 7 | ||||
-rw-r--r-- | sym_ewram.txt | 12 |
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 |