From 1aa0b2564fdba0dfd7d7ab0cd9b98840b6bb83bb Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 17 Mar 2025 15:53:18 +0100 Subject: [PATCH] Match handleaction --- asm/handleaction.s | 1858 --------------------------------------- include/code_8002774.h | 4 +- include/ground_main.h | 19 + include/ground_script.h | 2 +- ld_script.txt | 1 - src/code_8002774.c | 6 +- src/ground_main.c | 18 - src/ground_script_1.c | 867 +++++++++++++++++- 8 files changed, 873 insertions(+), 1902 deletions(-) delete mode 100644 asm/handleaction.s diff --git a/asm/handleaction.s b/asm/handleaction.s deleted file mode 100644 index 799142db7..000000000 --- a/asm/handleaction.s +++ /dev/null @@ -1,1858 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - -@ https://decomp.me/scratch/QRjxB - more up to date but incomplete -@ https://decomp.me/scratch/aOcQq - more complete but using outdated definitions - thumb_func_start HandleAction -HandleAction: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x148 - adds r7, r0, 0 - movs r1, 0x26 - ldrsh r0, [r7, r1] - cmp r0, 0 - bne _0809DA8A - bl _0809EAB8 -_0809DA8A: - movs r2, 0x26 - ldrsh r0, [r7, r2] - cmp r0, 0x4 - bls _0809DA96 - bl _0809E9CC -_0809DA96: - lsls r0, 2 - ldr r1, _0809DAA0 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809DAA0: .4byte _0809DAA4 - .align 2, 0 -_0809DAA4: - .4byte _0809E9C6 - .4byte _0809E9C6 - .4byte _0809DAB8 - .4byte _0809E900 - .4byte _0809E9C6 -_0809DAB8: - adds r1, r7, 0 - adds r1, 0x44 - ldrb r0, [r1] - subs r0, 0x3 - adds r6, r1, 0 - cmp r0, 0xED - bls _0809DACA - bl _0809E9D6 -_0809DACA: - lsls r0, 2 - ldr r1, _0809DAD4 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809DAD4: .4byte _0809DAD8 - .align 2, 0 -_0809DAD8: - .4byte _0809E382 - .4byte _0809E3C4 - .4byte _0809E524 - .4byte _0809E464 - .4byte _0809E4B4 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809DED6 - .4byte _0809DED6 - .4byte _0809DED6 - .4byte _0809DED6 - .4byte _0809DED6 - .4byte _0809DED6 - .4byte _0809DED6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E308 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E308 - .4byte _0809E308 - .4byte _0809E308 - .4byte _0809E308 - .4byte _0809E308 - .4byte _0809E308 - .4byte _0809E308 - .4byte _0809E308 - .4byte _0809E308 - .4byte _0809E31C - .4byte _0809E75C - .4byte _0809E33C - .4byte _0809E368 - .4byte _0809E658 - .4byte _0809E6B4 - .4byte _0809E6E8 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809E9D6 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809E9D6 - .4byte _0809DE90 - .4byte _0809DF60 - .4byte _0809DF60 - .4byte _0809DF60 - .4byte _0809DF60 - .4byte _0809DF60 - .4byte _0809DF60 - .4byte _0809DF60 - .4byte _0809E0A2 - .4byte _0809DFDC - .4byte _0809DFDC - .4byte _0809DFDC - .4byte _0809DFDC - .4byte _0809DFDC - .4byte _0809DFDC - .4byte _0809DFDC - .4byte _0809E0A2 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E078 - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E08C - .4byte _0809E0E8 - .4byte _0809E0E8 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809E146 - .4byte _0809E146 - .4byte _0809E146 - .4byte _0809E146 - .4byte _0809E146 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809E9D6 - .4byte _0809E2D0 - .4byte _0809E2D0 - .4byte _0809E2D0 - .4byte _0809E2D0 - .4byte _0809E2D0 - .4byte _0809E2D0 - .4byte _0809E2D0 - .4byte _0809E2D0 - .4byte _0809E2D0 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E798 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E864 - .4byte _0809E864 - .4byte _0809E864 - .4byte _0809E864 - .4byte _0809E864 - .4byte _0809E864 - .4byte _0809E864 - .4byte _0809E9D6 - .4byte _0809E8D8 - .4byte _0809DE90 - .4byte _0809DE90 - .4byte _0809DEA6 - .4byte _0809DEBE - .4byte _0809DED6 - .4byte _0809DEE8 - .4byte _0809DF24 - .4byte _0809DF24 - .4byte _0809E2DE - .4byte _0809E9D6 - .4byte _0809E2DE - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 - .4byte _0809E9D6 -_0809DE90: - adds r1, r7, 0 - adds r1, 0x4E - ldrh r2, [r1] - movs r3, 0 - ldrsh r0, [r1, r3] - cmp r0, 0 - ble _0809DEA2 - bl _0809EAB2 -_0809DEA2: - bl _0809E8F4 -_0809DEA6: - ldr r1, [r7] - ldr r0, [r7, 0x4] - ldr r1, [r1, 0x4C] - bl _call_via_r1 - lsls r0, 24 - cmp r0, 0 - beq _0809DEBA - bl _0809E9D6 -_0809DEBA: - bl _0809E8F4 -_0809DEBE: - ldr r1, [r7] - ldr r0, [r7, 0x4] - ldr r1, [r1, 0x50] - bl _call_via_r1 - lsls r0, 24 - cmp r0, 0 - beq _0809DED2 - bl _0809E9D6 -_0809DED2: - bl _0809E8F4 -_0809DED6: - bl sub_8099B94 - lsls r0, 24 - cmp r0, 0 - beq _0809DEE4 - bl _0809E9D6 -_0809DEE4: - bl _0809E8F4 -_0809DEE8: - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r4-r6} - stm r1!, {r4-r6} - ldr r0, [r0] - str r0, [r1] - add r0, sp, 0x4 - ldrh r0, [r0, 0x2] - bl IsEqualtoBGTrack - lsls r0, 24 - cmp r0, 0 - bne _0809DF06 - bl _0809E8F4 -_0809DF06: - adds r2, r7, 0 - adds r2, 0x50 - ldrh r1, [r2] - adds r0, r1, 0x1 - strh r0, [r2] - lsls r1, 16 - ldr r0, _0809DF20 - cmp r1, r0 - bgt _0809DF1C - bl _0809E9D6 -_0809DF1C: - bl _0809E8F4 - .align 2, 0 -_0809DF20: .4byte 0x2a2f0000 -_0809DF24: - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r0] - str r0, [r1] - add r0, sp, 0x4 - ldrh r0, [r0, 0x2] - bl IsFanfareSEPlaying_1 - lsls r0, 24 - cmp r0, 0 - bne _0809DF42 - bl _0809E8F4 -_0809DF42: - adds r2, r7, 0 - adds r2, 0x50 - ldrh r1, [r2] - adds r0, r1, 0x1 - strh r0, [r2] - lsls r1, 16 - ldr r0, _0809DF5C - cmp r1, r0 - bgt _0809DF58 - bl _0809E9D6 -_0809DF58: - bl _0809E8F4 - .align 2, 0 -_0809DF5C: .4byte 0x0e0f0000 -_0809DF60: - ldr r1, [r7] - ldr r0, [r7, 0x4] - add r5, sp, 0xA4 - ldr r2, [r1, 0xC] - adds r1, r5, 0 - bl _call_via_r2 - ldr r1, [r7, 0x60] - ldr r0, [r5] - subs r1, r0 - add r4, sp, 0xAC - str r1, [r4] - ldr r0, [r7, 0x64] - ldr r1, [r5, 0x4] - subs r0, r1 - str r0, [r4, 0x4] - ldr r1, [r7, 0x54] - adds r0, r4, 0 - bl sub_800290C - ldr r0, [r4] - cmp r0, 0 - bne _0809DF98 - ldr r0, [r4, 0x4] - cmp r0, 0 - bne _0809DF98 - bl _0809E8F4 -_0809DF98: - ldr r1, [r7] - ldr r0, [r7, 0x4] - ldr r2, [r1, 0x48] - adds r1, r4, 0 - bl _call_via_r2 - movs r1, 0x9 - ands r1, r0 - cmp r1, 0 - beq _0809DFB0 - bl _0809E8F4 -_0809DFB0: - ldr r2, [r7] - ldr r0, [r7, 0x4] - movs r1, 0x80 - lsls r1, 5 - ldr r2, [r2, 0x30] - bl _call_via_r2 - adds r2, r7, 0 - adds r2, 0x4E - ldrh r0, [r2] - movs r5, 0 - ldrsh r1, [r2, r5] - cmp r1, 0 - bge _0809DFD0 - bl _0809E9D6 -_0809DFD0: - cmp r1, 0 - ble _0809DFD8 - bl _0809EAAC -_0809DFD8: - bl _0809E8F4 -_0809DFDC: - ldr r1, [r7] - ldr r0, [r7, 0x4] - add r5, sp, 0xB4 - ldr r2, [r1, 0xC] - adds r1, r5, 0 - bl _call_via_r2 - ldr r1, [r7, 0x60] - ldr r0, [r5] - subs r1, r0 - add r4, sp, 0xBC - str r1, [r4] - ldr r0, [r7, 0x64] - ldr r1, [r5, 0x4] - subs r0, r1 - str r0, [r4, 0x4] - ldr r1, [r7, 0x54] - adds r0, r4, 0 - bl sub_800290C - ldr r0, [r4] - adds r5, r4, 0 - cmp r0, 0 - bne _0809E016 - ldr r0, [r5, 0x4] - cmp r0, 0 - bne _0809E016 - bl _0809E8F4 -_0809E016: - ldr r1, [r7] - ldr r0, [r7, 0x4] - ldr r2, [r1, 0x48] - adds r1, r5, 0 - bl _call_via_r2 - adds r4, r0, 0 - adds r0, r5, 0 - bl VecDirection8Radial - lsls r0, 24 - adds r2, r7, 0 - adds r2, 0x4A - asrs r1, r0, 24 - lsrs r0, 24 - strb r0, [r2] - ldr r2, [r7] - ldr r0, [r7, 0x4] - ldr r2, [r2, 0x2C] - bl _call_via_r2 - movs r0, 0x9 - ands r0, r4 - cmp r0, 0 - beq _0809E04C - bl _0809E8F4 -_0809E04C: - ldr r2, [r7] - ldr r0, [r7, 0x4] - movs r1, 0x80 - lsls r1, 5 - ldr r2, [r2, 0x30] - bl _call_via_r2 - adds r2, r7, 0 - adds r2, 0x4E - ldrh r0, [r2] - movs r6, 0 - ldrsh r1, [r2, r6] - cmp r1, 0 - bge _0809E06C - bl _0809E9D6 -_0809E06C: - cmp r1, 0 - ble _0809E074 - bl _0809EAAC -_0809E074: - bl _0809E8F4 -_0809E078: - adds r6, r7, 0 - adds r6, 0x4E - movs r1, 0 - ldrsh r0, [r6, r1] - cmp r0, 0 - ble _0809E088 - bl _0809EA62 -_0809E088: - bl _0809E8F4 -_0809E08C: - movs r2, 0x4E - adds r2, r7 - mov r8, r2 - movs r3, 0 - ldrsh r0, [r2, r3] - cmp r0, 0 - ble _0809E09E - bl _0809E9DA -_0809E09E: - bl _0809E8F4 -_0809E0A2: - ldr r1, [r7] - ldr r0, [r7, 0x4] - add r4, sp, 0xE4 - add r2, sp, 0xE8 - ldr r3, [r1, 0x10] - adds r1, r4, 0 - bl _call_via_r3 - ldr r0, [r7, 0x6C] - ldr r1, [r4] - subs r0, r1 - adds r2, r4, 0 - cmp r0, 0 - bne _0809E0C2 - bl _0809E8F4 -_0809E0C2: - ldr r4, [r7, 0x54] - cmn r0, r4 - bge _0809E0CC - subs r0, r1, r4 - b _0809E0D4 -_0809E0CC: - cmp r0, r4 - ble _0809E0D2 - adds r0, r4, 0 -_0809E0D2: - adds r0, r1, r0 -_0809E0D4: - str r0, [r2] - ldr r2, [r7] - ldr r0, [r7, 0x4] - add r1, sp, 0xE4 - ldr r1, [r1] - ldr r2, [r2, 0x28] - bl _call_via_r2 - bl _0809E9D6 -_0809E0E8: - ldr r1, [r7] - ldr r0, [r7, 0x4] - add r4, sp, 0x14 - ldr r2, [r1, 0x14] - adds r1, r4, 0 - bl _call_via_r2 - movs r1, 0 - ldrsb r1, [r4, r1] - ldr r2, [r7, 0x54] - add r4, sp, 0xEC - adds r0, r4, 0 - bl SetVecFromDirectionSpeed - ldr r2, [r4] - ldr r3, [r4, 0x4] - add r1, sp, 0xF4 - str r2, [r1] - str r3, [r1, 0x4] - ldr r2, [r7] - ldr r0, [r7, 0x4] - ldr r2, [r2, 0x48] - bl _call_via_r2 - movs r1, 0x9 - ands r1, r0 - cmp r1, 0 - beq _0809E124 - bl _0809E8F4 -_0809E124: - ldr r2, [r7] - ldr r0, [r7, 0x4] - movs r1, 0x80 - lsls r1, 5 - ldr r2, [r2, 0x30] - bl _call_via_r2 - adds r1, r7, 0 - adds r1, 0x4E - ldrh r2, [r1] - movs r4, 0 - ldrsh r0, [r1, r4] - cmp r0, 0 - ble _0809E144 - bl _0809EAB2 -_0809E144: - b _0809E8F4 -_0809E146: - adds r1, r7, 0 - adds r1, 0x4E - ldrh r2, [r1] - movs r5, 0 - ldrsh r0, [r1, r5] - mov r10, r1 - cmp r0, 0 - ble _0809E15A - bl _0809EAB2 -_0809E15A: - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - ldr r0, [r0] - str r0, [r1] - movs r4, 0x1 - negs r4, r4 - mov r8, r4 - movs r5, 0 - ldr r1, [r7] - ldr r0, [r7, 0x4] - mov r4, sp - adds r4, 0x15 - ldr r2, [r1, 0x14] - adds r1, r4, 0 - bl _call_via_r2 - add r0, sp, 0x4 - ldrb r0, [r0] - subs r0, 0x91 - mov r9, r4 - cmp r0, 0x4 - bhi _0809E234 - lsls r0, 2 - ldr r1, _0809E194 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809E194: .4byte _0809E198 - .align 2, 0 -_0809E198: - .4byte _0809E1AC - .4byte _0809E1AC - .4byte _0809E1BA - .4byte _0809E1E0 - .4byte _0809E20C -_0809E1AC: - adds r0, r7, 0 - adds r0, 0x71 - ldrb r0, [r0] - lsls r0, 24 - asrs r0, 24 - mov r8, r0 - b _0809E234 -_0809E1BA: - ldr r0, [sp, 0x8] - lsls r0, 16 - asrs r0, 16 - bl sub_80A7AE8 - lsls r0, 16 - asrs r4, r0, 16 - cmp r4, 0 - blt _0809E234 - movs r5, 0x1 - add r1, sp, 0xFC - adds r0, r4, 0 - bl sub_80A8FD8 - add r1, sp, 0x104 - adds r0, r4, 0 - bl sub_80A8F9C - b _0809E234 -_0809E1E0: - ldr r0, [sp, 0x8] - lsls r0, 16 - asrs r0, 16 - bl sub_80A7AE8 - lsls r0, 16 - asrs r0, 16 - cmp r0, 0 - blt _0809E234 - movs r5, 0x1 - add r1, sp, 0xFC - bl sub_80A8FD8 - ldr r0, _0809E208 - ldr r1, [r0, 0x4] - ldr r0, [r0] - add r2, sp, 0x104 - str r0, [r2] - str r1, [r2, 0x4] - b _0809E234 - .align 2, 0 -_0809E208: .4byte gUnknown_81164DC -_0809E20C: - movs r5, 0x1 - ldr r1, [r7] - ldr r0, [r7, 0x4] - add r4, sp, 0xFC - ldr r2, [r1, 0xC] - adds r1, r4, 0 - bl _call_via_r2 - ldr r2, [r7] - ldr r0, [r7, 0x4] - add r1, sp, 0x104 - ldr r2, [r2, 0x8] - bl _call_via_r2 - ldr r0, [sp, 0x8] - lsls r0, 16 - asrs r0, 16 - adds r1, r4, 0 - bl GroundLink_GetPos -_0809E234: - cmp r5, 0 - beq _0809E282 - ldr r1, [r7] - ldr r0, [r7, 0x4] - add r5, sp, 0x10C - ldr r2, [r1, 0xC] - adds r1, r5, 0 - bl _call_via_r2 - ldr r1, [r7] - ldr r0, [r7, 0x4] - add r4, sp, 0x114 - ldr r2, [r1, 0x8] - adds r1, r4, 0 - bl _call_via_r2 - add r6, sp, 0xFC - add r3, sp, 0x104 - adds r0, r5, 0 - adds r1, r4, 0 - adds r2, r6, 0 - bl SizedDeltaDirection8 - lsls r0, 24 - asrs r0, 24 - mov r8, r0 - movs r0, 0x1 - negs r0, r0 - cmp r8, r0 - bne _0809E28C - ldr r3, _0809E2CC - adds r0, r5, 0 - adds r1, r3, 0 - adds r2, r6, 0 - bl SizedDeltaDirection4 - lsls r0, 24 - asrs r0, 24 - mov r8, r0 -_0809E282: - movs r0, 0x1 - negs r0, r0 - cmp r8, r0 - bne _0809E28C - b _0809E8F4 -_0809E28C: - mov r5, r9 - movs r0, 0 - ldrsb r0, [r5, r0] - cmp r8, r0 - bne _0809E298 - b _0809E8F4 -_0809E298: - mov r6, r9 - movs r0, 0 - ldrsb r0, [r6, r0] - add r1, sp, 0x4 - ldrh r2, [r1, 0x2] - lsls r2, 24 - lsrs r2, 24 - mov r1, r8 - bl sub_8002A70 - adds r1, r7, 0 - adds r1, 0x4A - strb r0, [r1] - ldr r2, [r7] - ldr r0, [r7, 0x4] - ldrb r1, [r1] - lsls r1, 24 - asrs r1, 24 - ldr r2, [r2, 0x2C] - bl _call_via_r2 - add r0, sp, 0x4 - ldrb r0, [r0, 0x1] - mov r1, r10 - strh r0, [r1] - b _0809E9CC - .align 2, 0 -_0809E2CC: .4byte gUnknown_81164DC -_0809E2D0: - bl sub_809D234 - lsls r0, 24 - cmp r0, 0 - beq _0809E2DC - b _0809E9D6 -_0809E2DC: - b _0809E8F4 -_0809E2DE: - adds r0, r7, 0 - adds r0, 0x46 - movs r2, 0 - ldrsh r1, [r0, r2] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _0809E2F0 - b _0809E9D6 -_0809E2F0: - ldr r1, _0809E304 - adds r0, r7, 0 - adds r0, 0x4C - movs r3, 0 - ldrsh r0, [r0, r3] - lsls r0, 2 - adds r0, r1 - ldr r1, [r0] - b _0809E8EC - .align 2, 0 -_0809E304: .4byte gUnlockBranchLabels -_0809E308: - adds r0, r7, 0 - adds r0, 0x46 - movs r4, 0 - ldrsh r1, [r0, r4] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _0809E31A - b _0809E9D6 -_0809E31A: - b _0809E8CA -_0809E31C: - adds r0, r7, 0 - adds r0, 0x46 - movs r5, 0 - ldrsh r1, [r0, r5] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _0809E32E - b _0809E9D6 -_0809E32E: - bl sub_8099B94 - lsls r0, 24 - cmp r0, 0 - beq _0809E33A - b _0809E9D6 -_0809E33A: - b _0809E8CA -_0809E33C: - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - ldr r0, [r0] - str r0, [r1] - add r0, sp, 0x4 - ldrb r1, [r0, 0x1] - movs r4, 0x2 - ldrsh r2, [r0, r4] - ldr r3, [sp, 0x8] - adds r0, r7, 0 - bl sub_80A14E8 - adds r1, r0, 0 - cmp r1, 0 - bge _0809E360 - b _0809E9D6 -_0809E360: - movs r0, 0x3 - strh r0, [r7, 0x26] - adds r0, r7, 0 - b _0809E60C -_0809E368: - add r0, sp, 0x11C - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E376 - b _0809E9D6 -_0809E376: - add r0, sp, 0x11C - ldr r1, [r0] - adds r0, r7, 0 - bl ResolveJump - b _0809E8C8 -_0809E382: - add r0, sp, 0x120 - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E390 - b _0809E9D6 -_0809E390: - add r4, sp, 0x120 - ldr r0, [r4] - cmp r0, 0 - blt _0809E3BA - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldr r0, [r0] - str r0, [r1] - ldrb r0, [r4] - bl sub_8002694 - lsls r0, 16 - asrs r0, 16 - add r1, sp, 0x4 - movs r3, 0x2 - ldrsh r2, [r1, r3] - movs r1, 0 - bl GroundMainGroundRequest -_0809E3BA: - ldr r1, [r4] - adds r0, r7, 0 - bl ResolveJump - b _0809E8C8 -_0809E3C4: - adds r4, r7, 0 - adds r4, 0x4C - movs r5, 0 - ldrsh r0, [r4, r5] - cmp r0, 0 - bne _0809E40C - add r0, sp, 0x124 - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E3DE - b _0809E9D6 -_0809E3DE: - add r0, sp, 0x124 - ldr r0, [r0] - cmp r0, 0 - blt _0809E400 - lsls r0, 16 - asrs r0, 16 - bl sub_80A26B8 - adds r2, r0, 0 - lsls r2, 16 - asrs r2, 16 - movs r0, 0 - movs r1, 0x12 - bl SetScriptVarValue - movs r0, 0x1 - b _0809E402 -_0809E400: - ldr r0, _0809E408 -_0809E402: - strh r0, [r4] - b _0809E8CE - .align 2, 0 -_0809E408: .4byte 0x0000ffff -_0809E40C: - cmp r0, 0x1 - bne _0809E464 - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r0] - str r0, [r1] - movs r0, 0 - movs r1, 0x12 - bl GetScriptVarValue - adds r2, r0, 0 - lsls r2, 16 - asrs r4, r2, 16 - lsrs r2, 16 - movs r0, 0 - movs r1, 0x30 - bl GetScriptVarArrayValue - cmp r4, 0x13 - bne _0809E43C - cmp r0, 0 - beq _0809E45A -_0809E43C: - add r0, sp, 0x4 - movs r5, 0x2 - ldrsh r0, [r0, r5] - bl sub_8098DCC - adds r0, r7, 0 - movs r1, 0 - bl ResolveJump - str r0, [r7, 0x28] - movs r0, 0 - movs r1, 0 - bl sub_80A87AC - b _0809E8F4 -_0809E45A: - movs r0, 0 - movs r1, 0x13 - movs r2, 0x13 - bl SetScriptVarValue -_0809E464: - adds r0, r7, 0 - adds r0, 0x4C - movs r2, 0 - ldrsh r1, [r0, r2] - adds r5, r0, 0 - cmp r1, 0 - bne _0809E4B4 - add r0, sp, 0x128 - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E480 - b _0809E9D6 -_0809E480: - add r0, sp, 0x128 - ldr r1, [r0] - cmp r1, 0 - blt _0809E4AA - ldrb r0, [r6] - cmp r0, 0x4 - bne _0809E49A - lsls r0, r1, 16 - asrs r0, 16 - bl sub_80A26B8 - lsls r0, 16 - b _0809E49C -_0809E49A: - lsls r0, r1, 16 -_0809E49C: - asrs r2, r0, 16 - movs r0, 0 - movs r1, 0x13 - bl SetScriptVarValue - movs r0, 0x1 - b _0809E4AC -_0809E4AA: - ldr r0, _0809E4B0 -_0809E4AC: - strh r0, [r5] - b _0809E8CE - .align 2, 0 -_0809E4B0: .4byte 0x0000ffff -_0809E4B4: - adds r0, r7, 0 - adds r0, 0x4C - movs r3, 0 - ldrsh r1, [r0, r3] - adds r5, r0, 0 - cmp r1, 0x1 - beq _0809E4C4 - b _0809E5B8 -_0809E4C4: - movs r0, 0 - movs r1, 0x13 - bl GetScriptVarValue - lsls r0, 16 - asrs r6, r0, 16 - add r4, sp, 0x18 - adds r0, r4, 0 - adds r1, r6, 0 - bl sub_80990EC - lsls r0, 24 - cmp r0, 0 - beq _0809E580 - adds r0, r4, 0 - adds r1, r6, 0 - bl sub_8099220 - movs r0, 0x6 - bl sub_80023E4 - adds r3, r0, 0 - lsls r3, 24 - lsrs r3, 24 - ldrb r0, [r4] - ldr r4, _0809E51C - ldr r2, [r4] - movs r1, 0 - str r1, [sp] - bl sub_809034C - adds r1, r0, 0 - ldr r0, _0809E520 - str r1, [r0] - cmp r1, 0x1 - beq _0809E586 - cmp r1, 0x1 - bcc _0809E580 - cmp r1, 0x2 - bne _0809E5AE - strh r1, [r5] - ldr r2, [r4] - movs r0, 0x9 - b _0809E58E - .align 2, 0 -_0809E51C: .4byte gUnknown_203B4B0 -_0809E520: .4byte gUnknown_2039DA4 -_0809E524: - adds r0, r7, 0 - adds r0, 0x4C - movs r4, 0 - ldrsh r6, [r0, r4] - adds r5, r0, 0 - cmp r6, 0x1 - bne _0809E5B8 - movs r0, 0 - movs r1, 0x14 - bl GetScriptVarValue - lsls r0, 24 - lsrs r0, 24 - bl GetMailatIndex - adds r4, r0, 0 - movs r0, 0x6 - bl sub_80023E4 - adds r3, r0, 0 - lsls r3, 24 - lsrs r3, 24 - ldrb r0, [r4, 0x4] - ldr r4, _0809E578 - ldr r2, [r4] - str r6, [sp] - movs r1, 0 - bl sub_809034C - adds r1, r0, 0 - ldr r0, _0809E57C - str r1, [r0] - cmp r1, 0x1 - beq _0809E586 - cmp r1, 0x1 - bcc _0809E580 - cmp r1, 0x2 - bne _0809E5AE - strh r1, [r5] - ldr r2, [r4] - movs r0, 0x9 - b _0809E58E - .align 2, 0 -_0809E578: .4byte gUnknown_203B4B0 -_0809E57C: .4byte gUnknown_2039DA4 -_0809E580: - movs r0, 0x3 - strh r0, [r5] - b _0809E9CC -_0809E586: - movs r0, 0x4 - strh r0, [r5] - ldr r2, [r4] - movs r0, 0xA -_0809E58E: - movs r1, 0x1 - bl sub_809B1C0 - adds r0, r7, 0 - movs r1, 0x1 - bl GroundScriptCheckLockCondition - lsls r0, 24 - cmp r0, 0 - bne _0809E5A4 - b _0809E9CC -_0809E5A4: - movs r0, 0 - movs r1, 0xB - bl sub_80A87AC - b _0809E9CC -_0809E5AE: - ldr r0, _0809E5B4 - strh r0, [r5] - b _0809E9CC - .align 2, 0 -_0809E5B4: .4byte 0x0000ffff -_0809E5B8: - movs r6, 0 - ldrsh r2, [r5, r6] - cmp r2, 0x2 - bne _0809E5DA - add r0, sp, 0x12C - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E5CE - b _0809E9D6 -_0809E5CE: - add r0, sp, 0x12C - ldr r0, [r0] - cmp r0, 0 - beq _0809E626 - movs r0, 0x3 - b _0809E628 -_0809E5DA: - cmp r2, 0x3 - bne _0809E614 - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r3-r5} - stm r1!, {r3-r5} - ldr r0, [r0] - str r0, [r1] - strh r2, [r7, 0x26] - add r0, sp, 0x4 - movs r6, 0x2 - ldrsh r0, [r0, r6] - bl sub_80999FC - movs r0, 0x70 - movs r1, 0 - bl GroundMap_ExecuteEvent - movs r1, 0x8 - ldrsh r0, [r7, r1] - cmp r0, 0 - bne _0809E608 - b _0809E9CC -_0809E608: - adds r0, r7, 0 - movs r1, 0x1 -_0809E60C: - bl ResolveJump - str r0, [r7, 0x28] - b _0809E9CC -_0809E614: - cmp r2, 0x4 - bne _0809E63C - add r0, sp, 0x130 - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E626 - b _0809E9D6 -_0809E626: - ldr r0, _0809E638 -_0809E628: - strh r0, [r5] - movs r0, 0 - movs r1, 0 - bl sub_80A87AC - bl ScriptPrintNullTextbox - b _0809E9CC - .align 2, 0 -_0809E638: .4byte 0x0000ffff -_0809E63C: - movs r0, 0 - movs r1, 0 - bl sub_8099220 - movs r4, 0x1 - negs r4, r4 - movs r0, 0 - movs r1, 0x13 - adds r2, r4, 0 - bl SetScriptVarValue - adds r0, r7, 0 - adds r1, r4, 0 - b _0809E8EE -_0809E658: - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r0] - str r0, [r1] - add r0, sp, 0x134 - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E672 - b _0809E9D6 -_0809E672: - add r0, sp, 0x134 - ldr r0, [r0] - cmp r0, 0x1 - bne _0809E6A4 - ldr r0, [sp, 0x8] - lsls r0, 16 - asrs r1, r0, 16 - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _0809E6A4 - adds r0, r1, 0 - bl sub_80A8D54 - movs r2, 0 - adds r3, r0, 0 - adds r3, 0x4C - ldr r4, _0809E6B0 -_0809E696: - adds r0, r3, r2 - adds r1, r2, r4 - ldrb r1, [r1] - strb r1, [r0] - adds r2, 0x1 - cmp r2, 0x9 - ble _0809E696 -_0809E6A4: - add r0, sp, 0x134 - ldr r1, [r0] - adds r0, r7, 0 - bl ResolveJump - b _0809E8C8 - .align 2, 0 -_0809E6B0: .4byte gUnknown_2039D98 -_0809E6B4: - add r0, sp, 0x138 - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E6C2 - b _0809E9D6 -_0809E6C2: - add r4, sp, 0x138 - ldr r0, [r4] - cmp r0, 0x1 - bne _0809E6D0 - ldr r0, _0809E6DC - bl SetRescueTeamName -_0809E6D0: - ldr r1, [r4] - adds r0, r7, 0 - bl ResolveJump - b _0809E8C8 - .align 2, 0 -_0809E6DC: .4byte gUnknown_2039D98 -_0809E6E0: - movs r1, 0x2 - add r0, sp, 0x13C - str r1, [r0] - b _0809E74A -_0809E6E8: - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldr r0, [r0] - str r0, [r1] - ldr r5, [sp, 0x10] - add r0, sp, 0x13C - bl sub_809B260 - lsls r0, 24 - cmp r0, 0 - bne _0809E704 - b _0809E9D6 -_0809E704: - add r0, sp, 0x13C - ldr r0, [r0] - cmp r0, 0x1 - bne _0809E74A - add r4, sp, 0x18 - ldr r0, _0809E758 - adds r3, r4, 0 - movs r2, 0 - mov r1, sp - adds r1, 0x27 -_0809E718: - strb r2, [r1] - subs r1, 0x1 - cmp r1, r3 - bge _0809E718 - adds r1, r4, 0 - bl CopyStringtoBuffer - movs r2, 0 - ldrb r0, [r4] - ldrb r3, [r5] - cmp r0, r3 - bne _0809E6E0 - cmp r0, 0 - beq _0809E74A -_0809E734: - adds r2, 0x1 - cmp r2, 0xF - bgt _0809E74A - adds r0, r4, r2 - adds r1, r5, r2 - ldrb r0, [r0] - ldrb r1, [r1] - cmp r0, r1 - bne _0809E6E0 - cmp r0, 0 - bne _0809E734 -_0809E74A: - add r0, sp, 0x13C - ldr r1, [r0] - adds r0, r7, 0 - bl ResolveJump - b _0809E8C8 - .align 2, 0 -_0809E758: .4byte gUnknown_2039D98 -_0809E75C: - adds r2, r7, 0 - adds r2, 0x50 - ldrh r3, [r2] - movs r4, 0 - ldrsh r0, [r2, r4] - cmp r0, 0 - bne _0809E76C - b _0809E872 -_0809E76C: - add r4, sp, 0xA0 - adds r0, r4, 0 - bl sub_809AFFC - lsls r0, 24 - cmp r0, 0 - bne _0809E77C - b _0809E9D6 -_0809E77C: - ldrb r0, [r4] - cmp r0, 0 - bne _0809E784 - b _0809E8CA -_0809E784: - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - ldr r0, [r0] - str r0, [r1] - add r0, sp, 0x4 - movs r4, 0x2 - ldrsh r1, [r0, r4] - b _0809E8C2 -_0809E798: - add r1, sp, 0x4 - ldr r0, [r7, 0x40] - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldr r0, [r0] - str r0, [r1] - adds r2, r7, 0 - adds r2, 0x50 - movs r3, 0 - ldrsh r0, [r2, r3] - adds r4, r2, 0 - cmp r0, 0 - bne _0809E84C - movs r3, 0 - adds r0, r7, 0 - adds r0, 0x4C - movs r5, 0 - ldrsh r2, [r0, r5] - adds r5, r0, 0 - cmp r2, 0 - bge _0809E7CC - ldr r0, [r7, 0x28] - ldrb r0, [r0] - cmp r0, 0xD1 - beq _0809E812 - b _0809E8F4 -_0809E7CC: - ldr r1, [r7, 0x28] - ldrb r0, [r1] - cmp r0, 0xD0 - bne _0809E7F8 - movs r6, 0x2 - ldrsh r0, [r1, r6] - cmp r0, r2 - beq _0809E812 -_0809E7DC: - ldr r0, [r7, 0x28] - adds r1, r0, 0 - adds r1, 0x10 - str r1, [r7, 0x28] - ldrb r0, [r0, 0x10] - cmp r0, 0xD0 - bne _0809E7F8 - movs r0, 0x2 - ldrsh r1, [r1, r0] - movs r2, 0 - ldrsh r0, [r5, r2] - cmp r1, r0 - bne _0809E7DC - movs r3, 0x1 -_0809E7F8: - cmp r3, 0 - bne _0809E812 - ldr r1, [r7, 0x28] - ldrb r0, [r1] - cmp r0, 0xD1 - bne _0809E8F4 -_0809E804: - adds r0, r1, 0 - adds r1, 0x10 - str r1, [r7, 0x28] - ldrb r0, [r0, 0x10] - cmp r0, 0xD1 - beq _0809E804 - b _0809E8F4 -_0809E812: - add r0, sp, 0x4 - ldrb r0, [r0, 0x1] - ldr r1, [sp, 0x8] - lsls r1, 16 - asrs r1, 16 - ldr r2, [r7, 0x28] - ldr r2, [r2, 0xC] - bl ScriptPrintText - lsls r0, 24 - cmp r0, 0 - beq _0809E844 - movs r0, 0 - movs r1, 0xA - bl sub_80A87AC - adds r0, r7, 0 - movs r1, 0 - bl GroundScriptCheckLockCondition - lsls r0, 24 - cmp r0, 0 - beq _0809E844 - movs r0, 0x1 - strh r0, [r4] -_0809E844: - ldr r0, [r7, 0x28] - adds r0, 0x10 - str r0, [r7, 0x28] - b _0809E9CC -_0809E84C: - adds r0, r7, 0 - adds r0, 0x46 - movs r3, 0 - ldrsh r1, [r0, r3] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _0809E85E - b _0809E9D6 -_0809E85E: - movs r0, 0 - strh r0, [r2] - b _0809E8D0 -_0809E864: - adds r2, r7, 0 - adds r2, 0x50 - ldrh r3, [r2] - movs r4, 0 - ldrsh r0, [r2, r4] - cmp r0, 0 - bne _0809E88A -_0809E872: - adds r0, r7, 0 - adds r0, 0x46 - movs r5, 0 - ldrsh r1, [r0, r5] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _0809E884 - b _0809E9D6 -_0809E884: - adds r0, r3, 0x1 - strh r0, [r2] - b _0809E9CC -_0809E88A: - add r0, sp, 0x140 - bl sub_809B18C - lsls r0, 24 - cmp r0, 0 - bne _0809E898 - b _0809E9D6 -_0809E898: - add r0, sp, 0x140 - ldr r3, [r0] - cmp r3, 0 - ble _0809E8CA - adds r0, r7, 0 - adds r0, 0x4C - movs r6, 0 - ldrsh r2, [r0, r6] - ldr r1, [r7, 0x40] - lsls r0, r3, 4 - lsls r2, 4 - adds r2, r1 - add r1, sp, 0x4 - adds r0, r2 - ldm r0!, {r2-r4} - stm r1!, {r2-r4} - ldr r0, [r0] - str r0, [r1] - add r0, sp, 0x4 - movs r5, 0x2 - ldrsh r1, [r0, r5] -_0809E8C2: - adds r0, r7, 0 - bl FindLabel -_0809E8C8: - str r0, [r7, 0x28] -_0809E8CA: - movs r0, 0x3 - strh r0, [r7, 0x26] -_0809E8CE: - movs r0, 0 -_0809E8D0: - movs r1, 0 - bl sub_80A87AC - b _0809E9CC -_0809E8D8: - adds r0, r7, 0 - adds r0, 0x46 - movs r6, 0 - ldrsh r1, [r0, r6] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - bne _0809E9D6 - ldr r0, _0809E8FC - ldr r1, [r0, 0x4] -_0809E8EC: - adds r0, r7, 0 -_0809E8EE: - bl ResolveJump - str r0, [r7, 0x28] -_0809E8F4: - movs r0, 0x3 - strh r0, [r7, 0x26] - b _0809E9CC - .align 2, 0 -_0809E8FC: .4byte gUnlockBranchLabels -_0809E900: - adds r0, r7, 0 - bl ExecuteScriptCommand - strh r0, [r7, 0x26] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0x4 - bhi _0809E9BC - lsls r0, 2 - ldr r1, _0809E91C - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0809E91C: .4byte _0809E920 - .align 2, 0 -_0809E920: - .4byte _0809E934 - .4byte _0809E9B8 - .4byte _0809E9BC - .4byte _0809E9D6 - .4byte _0809E9B4 -_0809E934: - adds r0, r7, 0 - adds r0, 0x86 - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r0, 0 - beq _0809E9AA - adds r4, r7, 0 - adds r4, 0x84 - adds r0, r7, 0 - adds r0, 0x24 - adds r1, r4, 0 - movs r2, 0x60 - bl memcpy - ldr r2, [r7] - ldr r0, [r2, 0x2C] - cmp r0, 0 - beq _0809E98E - adds r5, r7, 0 - adds r5, 0x4A - movs r1, 0 - ldrsb r1, [r5, r1] - movs r0, 0x1 - negs r0, r0 - cmp r1, r0 - beq _0809E98E - ldr r0, [r7, 0x4] - add r1, sp, 0x144 - ldr r2, [r2, 0x18] - bl _call_via_r2 - add r0, sp, 0x144 - ldr r0, [r0] - movs r1, 0x80 - lsls r1, 3 - ands r0, r1 - cmp r0, 0 - beq _0809E98E - ldr r2, [r7] - ldr r0, [r7, 0x4] - movs r1, 0 - ldrsb r1, [r5, r1] - ldr r2, [r2, 0x2C] - bl _call_via_r2 -_0809E98E: - ldr r0, [r7] - ldr r2, [r0, 0x30] - cmp r2, 0 - beq _0809E9A2 - ldr r0, [r7, 0x4] - adds r1, r7, 0 - adds r1, 0x48 - ldrh r1, [r1] - bl _call_via_r2 -_0809E9A2: - adds r0, r4, 0 - bl InitScriptData - b _0809E9D6 -_0809E9AA: - adds r0, r7, 0 - adds r0, 0x24 - bl InitScriptData - b _0809E9D6 -_0809E9B4: - movs r0, 0x4 - b _0809EABA -_0809E9B8: - movs r0, 0x1 - b _0809EABA -_0809E9BC: - adds r1, r7, 0 - adds r1, 0x50 - movs r0, 0 - strh r0, [r1] - b _0809E9CC -_0809E9C6: - movs r2, 0x26 - ldrsh r0, [r7, r2] - b _0809EABA -_0809E9CC: - movs r3, 0x1 - cmp r3, 0 - beq _0809E9D6 - bl _0809DA8A -_0809E9D6: - movs r0, 0x3 - b _0809EABA -_0809E9DA: - ldr r1, [r7] - ldr r0, [r7, 0x4] - add r4, sp, 0xCC - ldr r2, [r1, 0xC] - adds r1, r4, 0 - bl _call_via_r2 - add r5, sp, 0xD4 - adds r1, r7, 0 - adds r1, 0x58 - adds r2, r7, 0 - adds r2, 0x60 - mov r6, r8 - movs r0, 0 - ldrsh r6, [r6, r0] - mov r9, r6 - adds r6, r7, 0 - adds r6, 0x50 - movs r3, 0 - ldrsh r0, [r6, r3] - str r0, [sp] - adds r0, r5, 0 - mov r3, r9 - bl sub_8002934 - ldr r1, [r5] - ldr r0, [r4] - subs r1, r0 - add r0, sp, 0xDC - str r1, [r0] - ldr r1, [r5, 0x4] - ldr r2, [r4, 0x4] - subs r1, r2 - str r1, [r0, 0x4] - bl VecDirection8Radial - lsls r0, 24 - adds r2, r7, 0 - adds r2, 0x4A - asrs r1, r0, 24 - lsrs r0, 24 - strb r0, [r2] - ldr r2, [r7] - ldr r0, [r7, 0x4] - ldr r2, [r2, 0x2C] - bl _call_via_r2 - ldr r1, [r7] - ldr r0, [r7, 0x4] - ldr r2, [r1, 0x24] - adds r1, r5, 0 - bl _call_via_r2 - ldr r2, [r7] - ldr r0, [r7, 0x4] - movs r1, 0x80 - lsls r1, 5 - ldr r2, [r2, 0x30] - bl _call_via_r2 - mov r4, r8 - ldrh r0, [r4] - subs r0, 0x1 - strh r0, [r4] - ldrh r0, [r6] - adds r0, 0x1 - strh r0, [r6] - b _0809E9D6 -_0809EA62: - add r5, sp, 0xC4 - adds r1, r7, 0 - adds r1, 0x58 - adds r2, r7, 0 - adds r2, 0x60 - movs r3, 0 - ldrsh r0, [r6, r3] - mov r8, r0 - adds r4, r7, 0 - adds r4, 0x50 - movs r3, 0 - ldrsh r0, [r4, r3] - str r0, [sp] - adds r0, r5, 0 - mov r3, r8 - bl sub_8002934 - ldr r1, [r7] - ldr r0, [r7, 0x4] - ldr r2, [r1, 0x24] - adds r1, r5, 0 - bl _call_via_r2 - ldr r2, [r7] - ldr r0, [r7, 0x4] - movs r1, 0x80 - lsls r1, 5 - ldr r2, [r2, 0x30] - bl _call_via_r2 - ldrh r0, [r6] - subs r0, 0x1 - strh r0, [r6] - ldrh r0, [r4] - adds r0, 0x1 - strh r0, [r4] - b _0809E9D6 -_0809EAAC: - subs r0, 0x1 - strh r0, [r2] - b _0809E9D6 -_0809EAB2: - subs r0, r2, 0x1 - strh r0, [r1] - b _0809E9D6 -_0809EAB8: - movs r0, 0 -_0809EABA: - add sp, 0x148 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end HandleAction - .align 2, 0 diff --git a/include/code_8002774.h b/include/code_8002774.h index 0d3d6c4d5..5cd4d592b 100644 --- a/include/code_8002774.h +++ b/include/code_8002774.h @@ -9,7 +9,7 @@ s32 VecDirection8Sign(PixelPos *param_1); s32 VecDirection4SignYX(PixelPos *param_1); s8 VecDirection8Radial(PixelPos *param_1); s8 VecDirection4Radial(PixelPos *param_1); -s8 SizedDeltaDirection4(PixelPos *r0, PixelPos *r1, PixelPos *r2, PixelPos *r3); -s8 SizedDeltaDirection8(PixelPos *r0, PixelPos *r1, PixelPos *r2, PixelPos *r3); +s8 SizedDeltaDirection4(const PixelPos *r0, const PixelPos *r1, const PixelPos *r2, const PixelPos *r3); +s8 SizedDeltaDirection8(const PixelPos *r0, const PixelPos *r1, const PixelPos *r2, const PixelPos *r3); #endif diff --git a/include/ground_main.h b/include/ground_main.h index eff853826..2f9a8e140 100644 --- a/include/ground_main.h +++ b/include/ground_main.h @@ -1,6 +1,25 @@ #ifndef GUARD_GROUND_MAIN_H #define GUARD_GROUND_MAIN_H +#include "structs/str_pokemon.h" +#include "structs/str_wonder_mail.h" + +struct unkStruct_20398C8 +{ + u8 unk0; + u8 unk1; + u8 unk2; + u8 unk3; + u8 unk4; + u8 fill5[0xB - 0x5]; + u8 unkB; + u8 unkC; + u8 unkD; + WonderMailSub unk10; + PokemonStruct1 unk18; + u8 fill70[0x88 - 0x70]; +}; + // size: 0xC typedef struct GroundConversionStruct { diff --git a/include/ground_script.h b/include/ground_script.h index 2a7207bda..393cc9444 100644 --- a/include/ground_script.h +++ b/include/ground_script.h @@ -82,7 +82,7 @@ typedef struct CallbackData /* 0x20 */ void (*setPositionBounds)(void*, PixelPos *from, PixelPos *to); /* 0x24 */ bool8 (*moveReal)(void*, PixelPos*); /* 0x28 */ void (*setPosHeight)(void*, u32 height); - /* 0x2C */ s32 (*setDirection)(void*, s8 dir); // direction must be signed char! + /* 0x2C */ s32 (*setDirection)(void*, s32 dir); // direction must be signed char! /* 0x30 */ void (*setEventIndex)(void*, u16); /* 0x34 */ void (*livesOnlyNullsub)(void*, u16); /* 0x38 */ void (*func38)(void*, s16, u32); diff --git a/ld_script.txt b/ld_script.txt index 4148b76df..e4087bd72 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -313,7 +313,6 @@ SECTIONS { asm/code_809C5C4.o(.text); src/code_809D148.o(.text); src/ground_script.o(.text); - asm/handleaction.o(.text); src/ground_script_1.o(.text); asm/ground_script.o(.text); src/ground_script_2.o(.text); diff --git a/src/code_8002774.c b/src/code_8002774.c index 945a3ebc0..5cb7206ba 100644 --- a/src/code_8002774.c +++ b/src/code_8002774.c @@ -334,7 +334,8 @@ s8 VecDirection4Radial(PixelPos *pixelPos) return DIRECTION_SOUTH; } -s8 SizedDeltaDirection4(PixelPos *r0, PixelPos *r1, PixelPos *r2, PixelPos *r3) { +s8 SizedDeltaDirection4(const PixelPos *r0, const PixelPos *r1, const PixelPos *r2, const PixelPos *r3) +{ PixelPos stack; s32 iVar1; s32 iVar2; @@ -377,7 +378,8 @@ s8 SizedDeltaDirection4(PixelPos *r0, PixelPos *r1, PixelPos *r2, PixelPos *r3) return VecDirection4Radial(&stack); } -s8 SizedDeltaDirection8(PixelPos *r0, PixelPos *r1, PixelPos *r2, PixelPos *r3) { +s8 SizedDeltaDirection8(const PixelPos *r0, const PixelPos *r1, const PixelPos *r2, const PixelPos *r3) +{ PixelPos stack; s32 iVar1; s32 iVar2; diff --git a/src/ground_main.c b/src/ground_main.c index 889b308d2..daca5d849 100644 --- a/src/ground_main.c +++ b/src/ground_main.c @@ -16,24 +16,6 @@ #include "pokemon.h" #include "text_util.h" -// size: 0x88 -struct unkStruct_20398C8 -{ - u8 unk0; - u8 unk1; - u8 unk2; - u8 unk3; - u8 unk4; - u8 fill5[0xB - 0x5]; - u8 unkB; - u8 unkC; - u8 unkD; - WonderMailSub unk10; - PokemonStruct1 unk18; - u8 fill70[0x88 - 0x70]; -}; - - EWRAM_DATA u32 gUnknown_20398A8 = {0}; EWRAM_DATA u32 gUnknown_20398AC = {0}; EWRAM_DATA u32 gUnknown_20398B0 = {0}; diff --git a/src/ground_script_1.c b/src/ground_script_1.c index 24c93f877..d95e0a02e 100644 --- a/src/ground_script_1.c +++ b/src/ground_script_1.c @@ -7,6 +7,7 @@ #include "ground_sprite.h" #include "ground_map.h" #include "dungeon.h" +#include "string_format.h" #include "other_random.h" #include "rescue_team_info.h" #include "code_80118A4.h" @@ -17,13 +18,8 @@ #include "ground_main.h" #include "code_80A26CC.h" #include "wigglytuff_shop1.h" - -// Size: unknown -typedef struct UnkAction3D -{ - u8 fill0[0x4C]; - u8 unk4C[10]; -} UnkAction3D; +#include "code_8002774.h" +#include "wonder_mail.h" void GroundMap_Select(s16); void GroundMap_SelectDungeon(s16, DungeonLocation*, u8); @@ -108,7 +104,7 @@ void sub_80A87AC(s32, s32); void sub_80A8BD8(s16, s32*); u32 sub_80A8C2C(); u32 sub_80A8C98(); -UnkAction3D *sub_80A8D54(s16); +PokemonStruct1 *sub_80A8D54(s16); s16 sub_80A8FD8(s32, PixelPos*); s16 sub_80A8F9C(s32, PixelPos*); u32 sub_80A9050(); @@ -121,20 +117,57 @@ void DeleteGroundEvents(void); void DeleteGroundLives(void); void DeleteGroundObjects(void); void DeleteGroundEffects(void); +s32 ExecuteScriptCommand(Action *action); +bool8 IsFanfareSEPlaying_1(u16 songIndex); +bool8 sub_8099B94(void); +bool8 IsEqualtoBGTrack(u16 songIndex); +void sub_800290C(PixelPos *a0, s32 a1); +s32 ExecuteScriptCommand(Action *action); +void InitScriptData(ScriptData *); +bool8 sub_8099B94(void); +void sub_800290C(PixelPos*, s32); +void sub_8002934(PixelPos*, PixelPos*, PixelPos*, s32, s32); +s8 VecDirection8Radial(PixelPos*); +PixelPos SetVecFromDirectionSpeed(s8, s32); +void CopyStringtoBuffer(u8 *buffer, u8 *string); +bool8 sub_8098DCC(u32 speed); +extern const PixelPos gUnknown_81164DC; +extern u32 gUnknown_2039DA4; +extern char *gUnknown_203B4B0; +extern char gUnknown_2039D98[10]; +void sub_8099220(void *param_1, s32 param_2); +extern u32 gUnlockBranchLabels[]; +u8 ScriptPrintNullTextbox(void); +s16 sub_8002694(u8 param_1); // value -> GroundEnter lookup +bool8 sub_809B260(void *dst); +bool8 sub_809B18C(s32 *sp); +bool8 sub_809AFFC(u8 *); +u8 GroundScriptCheckLockCondition(Action *param_1, s16 param_2); +bool8 sub_809D234(void); +s32 GroundLink_GetPos(s32 _arg0, PixelPos *pos); +void sub_80999FC(s32); +bool8 sub_809B1C0(s32, s32, char[12]); +bool8 sub_80023E4(u32 param_1); // some kind of helper for predefined scenario checks +s32 sub_80A14E8(Action *, u8, s32, s32); +void sub_80A87AC(s32, s32); +const ScriptCommand *FindLabel(Action *action, s32 r1); +void SetRescueTeamName(u8 *buffer); +s32 GetScriptVarValue(u8 *localVarBuf, s32 varId); +s32 GetScriptVarArrayValue(u8 *localVarBuf, s32 varId, s32 idx); +void SetScriptVarValue(u8 *localVarBuf, s32 varId, s32 val); +void SetScriptVarArrayValue(u8 *localVarBuf, s32 varId, s32 idx, s32 val); +u32 sub_809034C(s32 dungeonIndex, s32 speciesId_, u8 *buffer, bool32 param_4_, bool32 param_5_); +unkStruct_203B480 * GetMailatIndex(u8 index); +u8 sub_80990EC(struct unkStruct_20398C8 *param_1, s32 param_2); s32 sub_80A14E8(Action *, u8, s32, s32); -s16 HandleAction(void *, DebugLocation *); - -extern int gFormatArgs[10]; extern s16 gCurrentMap; extern s16 gUnknown_2039A32; extern s16 gUnknown_2039A34; extern struct { const char *unk0; s32 unk4; } gChoices[9]; -extern u8 gUnknown_2039D98[12]; -extern PixelPos gUnknown_81164DC; extern char gUnknown_81165D4[]; extern char gUnknown_81165F4[]; extern char gUnknown_811660C[]; @@ -153,6 +186,800 @@ extern ScriptCommand gUnknown_81164E4; EWRAM_INIT static int sNumChoices = 0; +s16 HandleAction(Action *action, DebugLocation *debug) +{ + ScriptCommand cmd; + + if (action->scriptData.savedState) { + bool8 loopContinue = TRUE; + while (loopContinue) { + switch (action->scriptData.savedState) { + case 2: { + switch (action->scriptData.curScriptOp) { + // handled cases (all hex) + // 3, 4, 5, 6, 7, 22..28, 2c, 30..38, 39, 3a, 3b, 3c, 3d, 3e, 3f, + // 58..5b, 5d, 5e, 60, 61..67, 68, 69..6f, 70, 71..76, 77..7c, 7d..82, 83..88, + // 89, 8a, 8b..90, 91..95, 98, 99, 9b..a3, cf, d2..d8, da, db, dc, dd, de, df, + // e0, e1, e2, e3, e5 + // other cases up to 0xf1 immediately break (which breaks again and loops for ExScrCmd) + case 0x58 ... 0x5b: case 0x5d: case 0x5e: case 0x60: + case 0x8b ... 0x90: case 0x98: case 0x99: + case 0xdb: case 0xdc: { + if (action->scriptData.unk2A > 0) { + action->scriptData.unk2A--; + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0xdd: { + if (action->callbacks->func4C_spriteRelatedCheck(action->parentObject)) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0xde: { + if (action->callbacks->func50_spriteRelated(action->parentObject)) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0x22 ... 0x28: + case 0xdf: { + if (sub_8099B94()) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0xe0: { + cmd = *action->scriptData.curPtr; + if (IsEqualtoBGTrack(cmd.argShort)) { + if (action->scriptData.unk2C++ < 10800) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0xe1: case 0xe2: { + cmd = *action->scriptData.curPtr; + if (IsFanfareSEPlaying_1(cmd.argShort)) { + if (action->scriptData.unk2C++ < 3600) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0x61 ... 0x67: { + PixelPos pos, pos2; + action->callbacks->getHitboxCenter(action->parentObject, &pos); + pos2.x = action->scriptData.pos2.x - pos.x; + pos2.y = action->scriptData.pos2.y - pos.y; + sub_800290C(&pos2, action->scriptData.unk30); + if (pos2.x == 0 && pos2.y == 0) { + action->scriptData.savedState = 3; + break; + } + if (action->callbacks->moveRelative(action->parentObject, &pos2) & 9) { + action->scriptData.savedState = 3; + break; + } + action->callbacks->setEventIndex(action->parentObject, 0x1000); + + if (action->scriptData.unk2A >= 0) { + if (action->scriptData.unk2A > 0) { + action->scriptData.unk2A--; + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + } + else { + loopContinue = FALSE; + } + break; + } + case 0x69 ... 0x6f: { + PixelPos pos, pos2; + s32 res; + s32 dir, dirBefore; + s8 dirS8; + action->callbacks->getHitboxCenter(action->parentObject, &pos); + pos2.x = action->scriptData.pos2.x - pos.x; + pos2.y = action->scriptData.pos2.y - pos.y; + sub_800290C(&pos2, action->scriptData.unk30); + if (pos2.x == 0 && pos2.y == 0) { + action->scriptData.savedState = 3; + break; + } + res = action->callbacks->moveRelative(action->parentObject, &pos2); + dir = VecDirection8Radial(&pos2); + dirBefore = action->scriptData.unk26; + dirS8 = dir; + action->scriptData.unk26 = dirS8; + action->callbacks->setDirection(action->parentObject, dir); + if (res & 9) { + action->scriptData.savedState = 3; + break; + } + action->callbacks->setEventIndex(action->parentObject, 0x1000); + + if (action->scriptData.unk2A >= 0) { + if (action->scriptData.unk2A > 0) { + action->scriptData.unk2A--; + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + } + else { + loopContinue = FALSE; + } + break; + } + case 0x71 ... 0x76: + case 0x7d ... 0x82: { + if (action->scriptData.unk2A > 0) { + PixelPos pos; + sub_8002934(&pos, &action->scriptData.pos1, &action->scriptData.pos2, action->scriptData.unk2A, action->scriptData.unk2C); + action->callbacks->moveReal(action->parentObject, &pos); + action->callbacks->setEventIndex(action->parentObject, 0x1000); + action->scriptData.unk2A--; + action->scriptData.unk2C++; + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0x77 ... 0x7c: + case 0x83 ... 0x88: { + if (action->scriptData.unk2A > 0) { + PixelPos pos1, pos2, pos3; + s32 dir, dirBefore; + s8 dirS8; + + action->callbacks->getHitboxCenter(action->parentObject, &pos1); + sub_8002934(&pos2, &action->scriptData.pos1, &action->scriptData.pos2, action->scriptData.unk2A, action->scriptData.unk2C); + pos3.x = pos2.x - pos1.x; + pos3.y = pos2.y - pos1.y; + dir = VecDirection8Radial(&pos3); + dirBefore = action->scriptData.unk26; + dirS8 = dir; + action->scriptData.unk26 = dirS8; + action->callbacks->setDirection(action->parentObject, dir); + action->callbacks->moveReal(action->parentObject, &pos2); + action->callbacks->setEventIndex(action->parentObject, 0x1000); + action->scriptData.unk2A--; + action->scriptData.unk2C++; + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0x68: case 0x70: { + s32 height, unk; + s32 delta; + action->callbacks->getPosHeightAndUnk(action->parentObject, &height, &unk); + delta = action->scriptData.unk48 - height; + if (delta == 0) { + action->scriptData.savedState = 3; + break; + } + // oh wow, cmn instruction + height += (delta < -action->scriptData.unk30) ? -action->scriptData.unk30 : + (delta > action->scriptData.unk30) ? action->scriptData.unk30 : delta; + action->callbacks->setPosHeight(action->parentObject, height); + loopContinue = FALSE; + break; + } + case 0x89: case 0x8a: { + PixelPos pos; + s8 dir; + action->callbacks->getDirection(action->parentObject, &dir); + pos = SetVecFromDirectionSpeed(dir, action->scriptData.unk30); + + if (action->callbacks->moveRelative(action->parentObject, &pos) & 9) { + action->scriptData.savedState = 3; + break; + } + action->callbacks->setEventIndex(action->parentObject, 0x1000); + + if (action->scriptData.unk2A > 0) { + action->scriptData.unk2A--; + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0x91 ... 0x95: { + if (action->scriptData.unk2A > 0) { + action->scriptData.unk2A--; + loopContinue = FALSE; + } + else { + PixelPos pos1, pos2, pos3, pos4; + s32 tmp1, tmp2; + s8 dir; + bool8 flag; + cmd = *action->scriptData.curPtr; + tmp1 = -1; + tmp2 = -1; + flag = FALSE; + action->callbacks->getDirection(action->parentObject, &dir); + // arg1h synthetic + switch (cmd.op) { + case 0x91: case 0x92: { + tmp2 = (s8) action->scriptData.unk4D; + break; + } + case 0x93: { + s16 res; + res = sub_80A7AE8((s16)cmd.arg1); + if (res >= 0) { + flag = TRUE; + sub_80A8FD8(res, &pos1); + sub_80A8F9C(res, &pos2); + } + break; + } + case 0x94: { + s32 res; + res = (s16)sub_80A7AE8((s16)cmd.arg1); + if (res >= 0) { + flag = TRUE; + sub_80A8FD8(res, &pos1); + pos2 = gUnknown_81164DC; + } + break; + } + case 0x95: { + flag = TRUE; + action->callbacks->getHitboxCenter(action->parentObject, &pos1); + action->callbacks->getSize(action->parentObject, &pos2); + GroundLink_GetPos((s16)cmd.arg1, &pos1); + break; + } + } + if (flag) { + action->callbacks->getHitboxCenter(action->parentObject, &pos3); + action->callbacks->getSize(action->parentObject, &pos4); + tmp2 = SizedDeltaDirection8(&pos3, &pos4, &pos1, &pos2); + if (tmp2 == -1) { + tmp2 = SizedDeltaDirection4(&pos3, &gUnknown_81164DC, &pos1, &gUnknown_81164DC); + } + } + if (tmp2 == -1 || tmp2 == dir) { + action->scriptData.savedState = 3; + break; + } + + ASM_MATCH_TRICK(dir); + action->scriptData.unk26 = sub_8002A70(dir, tmp2, (u8)cmd.argShort); + action->callbacks->setDirection(action->parentObject, action->scriptData.unk26); + action->scriptData.unk2A = cmd.argByte; + } + break; + } + case 0x9b ... 0xa3: { + if (sub_809D234()) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + } + break; + } + case 0xe3: case 0xe5: { + if (action->scriptData.unk22 != -1) { + loopContinue = FALSE; + } + else { + action->scriptData.script.ptr = ResolveJump(action, gUnlockBranchLabels[action->scriptData.branchDiscriminant]); + action->scriptData.savedState = 3; + } + break; + } + case 0x2c: case 0x30 ... 0x38: { + if (action->scriptData.unk22 != -1) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + } + break; + } + case 0x39: { + if (action->scriptData.unk22 != -1) { + loopContinue = FALSE; + } + else if (sub_8099B94()) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + } + break; + } + case 0x3b: { + s32 tmp; + cmd = *action->scriptData.curPtr; + tmp = sub_80A14E8(action, cmd.argByte, cmd.argShort, cmd.arg1); + if (tmp < 0) { + loopContinue = FALSE; + } + else { + action->scriptData.savedState = 3; + action->scriptData.script.ptr = ResolveJump(action, tmp); + } + break; + } + case 0x3c: { + s32 val; + if (!sub_809B260(&val)) { + loopContinue = FALSE; + } + else { + action->scriptData.script.ptr = ResolveJump(action, val); + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + } + break; + } + case 0x03: { + s32 val; + if (!sub_809B260(&val)) { + loopContinue = FALSE; + break; + } + if (val >= 0) { + cmd = *action->scriptData.curPtr; + GroundMainGroundRequest((s16)sub_8002694((u8)val), 0, cmd.argShort); + } + action->scriptData.script.ptr = ResolveJump(action, val); + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + break; + } + case 0x04: { + if (action->scriptData.branchDiscriminant == 0) { + s32 val; + if (!sub_809B260(&val)) { + loopContinue = FALSE; + break; + } + if (val >= 0) { + SetScriptVarValue(NULL, 18, sub_80A26B8(val)); + action->scriptData.branchDiscriminant = 1; + } else { + action->scriptData.branchDiscriminant = -1; + } + sub_80A87AC(0, 0); + break; + } + if (action->scriptData.branchDiscriminant == 1) { + s32 dungeonSelect; + s32 dungeonEnterElt; + cmd = *action->scriptData.curPtr; + dungeonSelect = (s16) GetScriptVarValue(NULL, 18); + dungeonEnterElt = GetScriptVarArrayValue(NULL, 48, (u16) dungeonSelect); + if (dungeonSelect != 19 || dungeonEnterElt != 0) { + sub_8098DCC(cmd.argShort); + action->scriptData.script.ptr = ResolveJump(action, 0); + sub_80A87AC(0, 0); + action->scriptData.savedState = 3; + break; + } + SetScriptVarValue(NULL, 19, 19); + } + // fallthrough + } + case 0x06: { + if (action->scriptData.branchDiscriminant == 0) { + s32 val; + s16 disc; + if (!sub_809B260(&val)) { + loopContinue = FALSE; + break; + } + if (val >= 0) { + SetScriptVarValue(NULL, 19, action->scriptData.curScriptOp == 4 ? sub_80A26B8(val) : (s16)val); + disc = 1; + } else { + disc = -1; + } + action->scriptData.branchDiscriminant = disc; + sub_80A87AC(0, 0); + break; + } + // fallthrough + } + case 0x07: { + if (action->scriptData.branchDiscriminant == 1) { + s32 dungeonEnter; + u32 res; + struct unkStruct_20398C8 unkStruct; + dungeonEnter = (s16)GetScriptVarValue(NULL, 19); + if (sub_80990EC(&unkStruct, dungeonEnter)) { + s32 val; + sub_8099220(&unkStruct, dungeonEnter); + val = sub_80023E4(6); + res = sub_809034C(unkStruct.unk0, 0, gUnknown_203B4B0, val, 0); + gUnknown_2039DA4 = res; + switch (res) { + case 2: { + action->scriptData.branchDiscriminant = 2; + sub_809B1C0(9, 1, gUnknown_203B4B0); + if (GroundScriptCheckLockCondition(action, 1)) { + sub_80A87AC(0, 11); + } + break; + } + case 0: { + action->scriptData.branchDiscriminant = 3; + break; + } + case 1: { + action->scriptData.branchDiscriminant = 4; + sub_809B1C0(10, 1, gUnknown_203B4B0); + if (GroundScriptCheckLockCondition(action, 1)) { + sub_80A87AC(0, 11); + } + break; + } + default: { + action->scriptData.branchDiscriminant = -1; + break; + } + } + break; + } + else { + action->scriptData.branchDiscriminant = 3; + break; + } + } + case 0x05: + if (action->scriptData.branchDiscriminant == 1) { + unkStruct_203B480 *ret; + s32 val; + u32 res; + ret = GetMailatIndex(GetScriptVarValue(NULL, 20)); + val = sub_80023E4(6); + res = sub_809034C(ret->unk4.dungeon.id, 0, gUnknown_203B4B0, val, 1); + gUnknown_2039DA4 = res; + switch (res) { + case 2: { + action->scriptData.branchDiscriminant = 2; + sub_809B1C0(9, 1, gUnknown_203B4B0); + if (GroundScriptCheckLockCondition(action, 1)) { + sub_80A87AC(0, 11); + } + break; + } + case 0: { + action->scriptData.branchDiscriminant = 3; + break; + } + case 1: { + action->scriptData.branchDiscriminant = 4; + sub_809B1C0(10, 1, gUnknown_203B4B0); + if (GroundScriptCheckLockCondition(action, 1)) { + sub_80A87AC(0, 11); + } + break; + } + default: { + action->scriptData.branchDiscriminant = -1; + break; + } + } + break; + } + if (action->scriptData.branchDiscriminant == 2) { + u32 val; + if (!sub_809B260(&val)) { + loopContinue = FALSE; + break; + } + + if (val != 0) { + action->scriptData.branchDiscriminant = 3; + sub_80A87AC(0, 0); + ScriptPrintNullTextbox(); + break; + } + else { + action->scriptData.branchDiscriminant = -1; + sub_80A87AC(0, 0); + ScriptPrintNullTextbox(); + break; + } + } + if (action->scriptData.branchDiscriminant == 3) { + cmd = *action->scriptData.curPtr; + action->scriptData.savedState = 3; + sub_80999FC(cmd.argShort); + GroundMap_ExecuteEvent(0x70, 0); + if (action->unk8[0] == 0) continue; + action->scriptData.script.ptr = ResolveJump(action, 1); + break; + } + if (action->scriptData.branchDiscriminant == 4) { + u32 val; + if (!sub_809B260(&val)) { + loopContinue = FALSE; + break; + } + action->scriptData.branchDiscriminant = -1; + sub_80A87AC(0, 0); + ScriptPrintNullTextbox(); + break; + } + + sub_8099220(0, 0); + SetScriptVarValue(NULL, 19, -1); + action->scriptData.script.ptr = ResolveJump(action, -1); + action->scriptData.savedState = 3; + break; + } + case 0x3d: { + s32 val; + cmd = *action->scriptData.curPtr; + if (!sub_809B260(&val)) { + loopContinue = FALSE; + break; + } + if (val == 1) { + s32 id = (s16)cmd.arg1; + if (id != -1) { + PokemonStruct1 *mon = sub_80A8D54(id); + s32 i; + for (i = 0; i < POKEMON_NAME_LENGTH; i++) { + mon->name[i] = gUnknown_2039D98[i]; + } + } + } + action->scriptData.script.ptr = ResolveJump(action, val); + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + break; + } + case 0x3e: { + s32 val; + if (!sub_809B260(&val)) { + loopContinue = FALSE; + break; + } + if (val == 1) { + SetRescueTeamName(gUnknown_2039D98); + } + action->scriptData.script.ptr = ResolveJump(action, val); + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + break; + } + case 0x3f: { + s32 val; + const u8 *ptr; + cmd = *action->scriptData.curPtr; + ptr = cmd.argPtr; + if (sub_809B260(&val)) { + if (val == 1) { + s32 i; + u8 name[16]; + for (i = 0; i < 16; i++) { + name[i] = '\0'; + } + + CopyStringtoBuffer(gUnknown_2039D98, name); + for (i = 0; i < 16; i++) { + if (name[i] != ptr[i]) { + val = 2; + break; + } + if (name[i] == '\0') + break; + } + } + action->scriptData.script.ptr = ResolveJump(action, val); + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + } + else { + loopContinue = FALSE; + } + break; + } + case 0x3a: { + if (action->scriptData.unk2C == 0) { + if (action->scriptData.unk22 != -1) { + loopContinue = FALSE; + } + else { + action->scriptData.unk2C++; + } + } + else { + bool8 c; + if (sub_809AFFC(&c)) { + if (c) { + cmd = *action->scriptData.curPtr; + action->scriptData.script.ptr = FindLabel(action, cmd.argShort); + } + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + } + else { + loopContinue = FALSE; + } + } + break; + } + case 0xcf: { + cmd = *action->scriptData.curPtr; + if (action->scriptData.unk2C == 0) { + bool8 flag = FALSE; + if (action->scriptData.branchDiscriminant < 0) { + if (action->scriptData.script.ptr->op != 0xd1) { + action->scriptData.savedState = 3; + break; + } + } + else { + while (action->scriptData.script.ptr->op == 0xd0) { + if (action->scriptData.script.ptr->argShort == action->scriptData.branchDiscriminant) { + flag = TRUE; + break; + } + action->scriptData.script.ptr++; + } + if (!flag) { + while (action->scriptData.script.ptr->op == 0xd1) { + action->scriptData.script.ptr++; + } + action->scriptData.savedState = 3; + break; + } + } + if (ScriptPrintText(cmd.argByte, (s16) cmd.arg1, action->scriptData.script.ptr->argPtr)) { + sub_80A87AC(0,10); + if (GroundScriptCheckLockCondition(action, 0)) { + action->scriptData.unk2C = 1; + } + } + action->scriptData.script.ptr++; + } + else { + if (action->scriptData.unk22 != -1) { + loopContinue = FALSE; + } + else { + action->scriptData.unk2C = 0; + sub_80A87AC(0, 0); + } + } + break; + } + case 0xd2 ... 0xd8: { + s32 tmp; + if (action->scriptData.unk2C == 0) { + if (action->scriptData.unk22 != -1) { + loopContinue = FALSE; + } + else { + action->scriptData.unk2C++; + } + } + else if (sub_809B18C(&tmp)) { + if (tmp > 0) { + cmd = *(action->scriptData.curPtr + action->scriptData.branchDiscriminant + tmp); + action->scriptData.script.ptr = FindLabel(action, cmd.argShort); + } + action->scriptData.savedState = 3; + sub_80A87AC(0, 0); + } + else { + loopContinue = FALSE; + } + break; + } + case 0xda: { + if (action->scriptData.unk22 != -1) { + loopContinue = FALSE; + } + else { + action->scriptData.script.ptr = ResolveJump(action, gUnlockBranchLabels[1]); + action->scriptData.savedState = 3; + } + break; + } + default: + case 0x08 ... 0x21: case 0x29 ... 0x2b: case 0x2d ... 0x2f: case 0x40 ... 0x57: case 0x5c: case 0x5f: + case 0x96: case 0x97: case 0x9a: case 0xa4 ... 0xce: case 0xd0: case 0xd1: case 0xd9: case 0xe4: case 0xe6 ... 0xf0: { + loopContinue = FALSE; + break; + } + } + break; + } + case 3: { + s32 state = ExecuteScriptCommand(action); + action->scriptData.savedState = state; + switch ((s16)state) { + case 0: { + if (action->scriptData2.savedState) { + action->scriptData = action->scriptData2; + if (action->callbacks->setDirection && action->scriptData.unk26 != -1) { + u32 tmp; + action->callbacks->getFlags(action->parentObject, &tmp); + if (tmp & 0x400) { + action->callbacks->setDirection(action->parentObject, action->scriptData.unk26); + } + } + if (action->callbacks->setEventIndex) { + action->callbacks->setEventIndex(action->parentObject, action->scriptData.unk24); + } + InitScriptData(&action->scriptData2); + } + else { + InitScriptData(&action->scriptData); + } + return 3; + } + case 3: return 3; + case 4: return 4; + case 1: return 1; + case 2: default: { + action->scriptData.unk2C = 0; + break; + } + } + break; + } + case 0: case 1: case 4: { + return action->scriptData.savedState; + } + } + } + return 3; + } + else { + return 0; + } +} + // Return values: // This function returns what's likely an enum, which controls the state of the script engine state machine, and possibly provides information to code calling the engine. // The enum is shared at least with HandleAction. @@ -166,7 +993,8 @@ EWRAM_INIT static int sNumChoices = 0; // This is the only return value that does not return to the script engine caller // - Value 3 returns to the caller, but will give control back to ExecuteScriptCommand when reentering the script ("script not finished") // - Value 4 is some kind of fatal error state, no further scripting progress will happen. This code is always returned to the caller from now on. -s32 ExecuteScriptCommand(Action *action) { +s32 ExecuteScriptCommand(Action *action) +{ ScriptCommand curCmd; ScriptData *scriptData = &action->scriptData; @@ -763,15 +1591,14 @@ s32 ExecuteScriptCommand(Action *action) { return 2; } case 0x3d: { - UnkAction3D *unk; int i; if ((s16)curCmd.arg1 != -1) { - unk = sub_80A8D54(curCmd.arg1); - if (unk != NULL) { - for (i = 0; i < 10; i++) { - gUnknown_2039D98[i] = unk->unk4C[i]; + PokemonStruct1 *mon = sub_80A8D54(curCmd.arg1); + if (mon != NULL) { + for (i = 0; i < POKEMON_NAME_LENGTH; i++) { + gUnknown_2039D98[i] = mon->name[i]; } - gUnknown_2039D98[10] = 0; + gUnknown_2039D98[POKEMON_NAME_LENGTH] = 0; sub_809B1C0(4, 0, gUnknown_2039D98); sub_80A87AC(0, 11); return 2;