From afb9fbeaf8a81fc30aabe723bd9e4be8bf54c2bc Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 18 Feb 2025 14:39:43 +0100 Subject: [PATCH] sub_8067A80 --- asm/code_8066D04.s | 921 ----------------------------------------- include/dungeon_move.h | 9 + src/code_8066D04.c | 428 +++++++++++++++++++ src/dungeon_move.c | 2 +- 4 files changed, 438 insertions(+), 922 deletions(-) create mode 100644 include/dungeon_move.h diff --git a/asm/code_8066D04.s b/asm/code_8066D04.s index c56cce373..5a293ca66 100644 --- a/asm/code_8066D04.s +++ b/asm/code_8066D04.s @@ -5,927 +5,6 @@ .text - - - thumb_func_start sub_8067794 -sub_8067794: - push {r4-r7,lr} - sub sp, 0x40 - adds r7, r1, 0 - ldr r4, [r7, 0x70] - cmp r7, 0 - bne _080677B4 - ldr r0, _080677B0 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonMessage - b _0806786C - .align 2, 0 -_080677B0: .4byte gCannotFarewell -_080677B4: - ldr r0, _080677F0 - adds r1, r7, 0 - movs r2, 0 - bl SubstitutePlaceholderStringTags - ldr r0, _080677F4 - ldr r5, [r0] - ldr r0, _080677F8 - ldr r6, [r0] - ldrb r2, [r4, 0xA] - cmp r2, 0 - blt _08067834 - ldr r1, _080677FC - movs r0, 0x64 - muls r0, r2 - ldr r2, _08067800 - adds r0, r2 - ldr r1, [r1] - adds r4, r1, r0 - movs r1, 0xA - ldrsh r0, [r4, r1] - bl sub_806A564 - lsls r0, 24 - cmp r0, 0 - beq _0806780C - ldr r0, _08067804 - ldr r5, [r0] - ldr r0, _08067808 - b _08067832 - .align 2, 0 -_080677F0: .4byte gFormatBuffer_Monsters -_080677F4: .4byte gSayFarewellQ -_080677F8: .4byte gUnknown_80F913C -_080677FC: .4byte gRecruitedPokemonRef -_08067800: .4byte 0x00008df8 -_08067804: .4byte gUnknown_80F9114 -_08067808: .4byte gMonDisappointedAndLeft -_0806780C: - movs r2, 0xA - ldrsh r0, [r4, r2] - bl sub_806A58C - lsls r0, 24 - cmp r0, 0 - beq _08067834 - bl IsMakuhitaTrainingMaze - lsls r0, 24 - cmp r0, 0 - beq _0806782C - ldr r0, _08067828 - b _0806782E - .align 2, 0 -_08067828: .4byte gSendMonBackQ -_0806782C: - ldr r0, _08067874 -_0806782E: - ldr r5, [r0] - ldr r0, _08067878 -_08067832: - ldr r6, [r0] -_08067834: - movs r0, 0 - adds r1, r5, 0 - movs r2, 0 - bl DisplayDungeonYesNoMessage - cmp r0, 0x1 - bne _0806786C - ldr r4, _0806787C - mov r0, sp - adds r1, r4, 0 - movs r2, 0x40 - bl strncpy - ldr r1, _08067880 - adds r0, r7, 0 - movs r2, 0 - bl sub_8068FE0 - adds r0, r4, 0 - mov r1, sp - movs r2, 0x40 - bl strncpy - movs r0, 0 - adds r1, r6, 0 - movs r2, 0x1 - bl DisplayDungeonMessage -_0806786C: - add sp, 0x40 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08067874: .4byte gSendMonBackWithItemQ -_08067878: .4byte gMonWentBack -_0806787C: .4byte gFormatBuffer_Monsters -_08067880: .4byte 0x0000021d - thumb_func_end sub_8067794 - - thumb_func_start HandleUseMovePlayerAction -HandleUseMovePlayerAction: - push {r4-r6,lr} - sub sp, 0x4 - adds r5, r0, 0 - movs r6, 0 - b _0806789A -_0806788E: - ldr r1, _08067900 - adds r0, r4, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _080678C6 - adds r6, 0x1 -_0806789A: - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8070828 - cmp r6, r0 - bge _080678C6 - ldr r4, [r5, 0x70] - adds r0, r4, 0 - adds r0, 0x50 - ldrb r1, [r0] - movs r0, 0 - str r0, [sp] - adds r0, r5, 0 - movs r2, 0x1 - movs r3, 0 - bl sub_8055A00 - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - beq _0806788E -_080678C6: - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8057588 - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - bne _080678F6 - adds r0, r5, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _080678F0 - ldr r0, [r5, 0x70] - adds r0, 0x50 - ldrb r1, [r0] - adds r0, r5, 0 - bl sub_806A9B4 -_080678F0: - adds r0, r5, 0 - bl sub_806A1B0 -_080678F6: - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08067900: .4byte 0x00000159 - thumb_func_end HandleUseMovePlayerAction - - thumb_func_start sub_8067904 -sub_8067904: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x14 - adds r5, r0, 0 - lsls r1, 16 - lsrs r1, 16 - mov r9, r1 - ldr r6, [r5, 0x70] - ldr r1, _08067940 - movs r0, 0 - str r0, [r1] - add r0, sp, 0x8 - mov r1, r9 - bl InitPokemonMove - adds r0, r6, 0 - adds r0, 0xBC - ldrb r0, [r0] - cmp r0, 0x1 - bne _0806794C - ldr r0, _08067944 - adds r1, r5, 0 - movs r2, 0 - bl SubstitutePlaceholderStringTags - ldr r0, _08067948 - b _08067962 - .align 2, 0 -_08067940: .4byte gUnknown_202F208 -_08067944: .4byte gFormatBuffer_Monsters -_08067948: .4byte gMonCringing -_0806794C: - adds r0, r6, 0 - adds r0, 0xAC - ldrb r0, [r0] - cmp r0, 0x4 - bne _08067974 - ldr r0, _0806796C - adds r1, r5, 0 - movs r2, 0 - bl SubstitutePlaceholderStringTags - ldr r0, _08067970 -_08067962: - ldr r1, [r0] - adds r0, r5, 0 - bl LogMessageByIdWithPopupCheckUser - b _08067A56 - .align 2, 0 -_0806796C: .4byte gFormatBuffer_Monsters -_08067970: .4byte gMonParalyzed -_08067974: - movs r0, 0xB0 - lsls r0, 1 - movs r1, 0 - mov r10, r1 - cmp r9, r0 - bne _08067984 - movs r2, 0x1 - mov r10, r2 -_08067984: - movs r0, 0 - mov r8, r0 - movs r7, 0 - add r4, sp, 0x8 - b _080679D2 -_0806798E: - movs r1, 0xBC - lsls r1, 1 - adds r0, r6, r1 - strh r7, [r0] - ldrb r0, [r4] - movs r1, 0x8 - orrs r0, r1 - orrs r0, r7 - movs r1, 0x4 - orrs r0, r1 - strb r0, [r4] - movs r0, 0xA - strb r0, [r4, 0x4] - str r7, [sp] - str r4, [sp, 0x4] - adds r0, r5, 0 - mov r1, r10 - movs r2, 0 - movs r3, 0 - bl TryUseChosenMove - adds r0, r5, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _080679DE - ldr r2, _08067A68 - adds r0, r6, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _080679DE - movs r0, 0x1 - add r8, r0 -_080679D2: - adds r0, r5, 0 - movs r1, 0x1 - bl sub_8070828 - cmp r8, r0 - blt _0806798E -_080679DE: - adds r0, r5, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _08067A56 - movs r0, 0xB0 - lsls r0, 1 - cmp r9, r0 - bne _08067A04 - ldr r0, _08067A6C - ldr r0, [r0] - cmp r0, 0 - bne _08067A04 - ldr r0, _08067A70 - ldr r1, [r0] - adds r0, r5, 0 - bl LogMessageByIdWithPopupCheckUser -_08067A04: - ldrb r0, [r6, 0x7] - cmp r0, 0 - beq _08067A50 - movs r0, 0xB0 - lsls r0, 1 - cmp r9, r0 - beq _08067A50 - ldr r4, _08067A74 - adds r3, r6, 0 - adds r3, 0x46 - ldrb r0, [r3] - lsls r0, 2 - adds r0, r4 - ldrh r0, [r0] - ldrh r1, [r5, 0x4] - adds r0, r1 - lsls r0, 16 - lsrs r0, 16 - ldr r2, _08067A78 - ldr r1, [sp, 0x10] - ands r1, r2 - orrs r1, r0 - str r1, [sp, 0x10] - ldrb r0, [r3] - lsls r0, 2 - adds r0, r4 - ldrh r0, [r0, 0x2] - ldrh r2, [r5, 0x6] - adds r0, r2 - lsls r0, 16 - ldr r2, _08067A7C - ands r1, r2 - orrs r1, r0 - str r1, [sp, 0x10] - add r0, sp, 0x10 - movs r1, 0x1 - bl sub_807FE44 -_08067A50: - adds r0, r5, 0 - bl sub_8071DA4 -_08067A56: - add sp, 0x14 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08067A68: .4byte 0x00000159 -_08067A6C: .4byte gUnknown_202F208 -_08067A70: .4byte gUnknown_80FC690 -_08067A74: .4byte gAdjacentTileOffsets -_08067A78: .4byte 0xffff0000 -_08067A7C: .4byte 0x0000ffff - thumb_func_end sub_8067904 - - thumb_func_start sub_8067A80 -sub_8067A80: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x6C - str r1, [sp, 0x68] - mov r8, r2 - mov r9, r3 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x64] - ldr r1, _08067AC8 - add r0, sp, 0x4 - movs r2, 0x60 - bl memcpy - ldr r1, _08067ACC - movs r0, 0 - str r0, [r1] - mov r10, r0 - cmp r10, r8 - blt _08067AB0 - b _08067ED8 -_08067AB0: - ldr r5, _08067AD0 - mov r4, r9 - mov r3, r8 -_08067AB6: - ldm r4!, {r2} - ldrh r1, [r2] - adds r0, r5, 0 - ands r0, r1 - strh r0, [r2] - subs r3, 0x1 - cmp r3, 0 - bne _08067AB6 - b _08067ED8 - .align 2, 0 -_08067AC8: .4byte gUnknown_8106DC8 -_08067ACC: .4byte gUnknown_202F30C -_08067AD0: .4byte 0x00007fff -_08067AD4: - movs r7, 0 - ldr r1, _08067B98 - movs r0, 0x1 - strb r0, [r1] - strb r7, [r1, 0x1] - movs r0, 0xE - strb r0, [r1, 0x2] - strb r7, [r1, 0x3] - add r0, sp, 0x4 - movs r1, 0x1 - bl sub_803ECB4 - ldr r5, _08067B9C - ldr r2, [r5] - ldr r0, [sp, 0x68] - str r0, [sp] - ldr r0, [sp, 0x64] - mov r1, r9 - mov r3, r8 - bl sub_8067F00 - ldr r4, _08067BA0 - mov r0, r8 - cmp r0, 0x8 - ble _08067B08 - movs r0, 0x8 -_08067B08: - strh r0, [r4, 0x1A] - mov r1, r10 - strh r1, [r4, 0x18] - movs r0, 0x8 - strh r0, [r4, 0x1C] - strh r7, [r4, 0x1E] - strh r7, [r4, 0x20] - strh r7, [r4, 0x4] - movs r0, 0x12 - strh r0, [r4, 0x6] - strh r7, [r4, 0xC] - strh r7, [r4, 0xE] - strh r7, [r4, 0x14] - str r7, [r4] - adds r0, r4, 0 - adds r0, 0x28 - bl sub_801317C - adds r0, r4, 0 - movs r1, 0 - bl sub_80137B0 - adds r6, r5, 0 -_08067B36: - ldr r0, _08067BA0 - bl AddMenuCursorSprite - movs r5, 0 - movs r7, 0 - ldr r0, [r6] - mov r2, r8 - subs r0, r2, r0 - cmp r0, 0x8 - ble _08067B50 - movs r5, 0x1 - bl sub_80684C4 -_08067B50: - ldr r0, [r6] - cmp r0, 0 - beq _08067B5C - movs r7, 0x1 - bl sub_8068344 -_08067B5C: - movs r0, 0 - ldr r1, _08067BA4 - bl sub_8014140 - adds r4, r0, 0 - movs r0, 0x37 - bl sub_803E46C - cmp r4, 0x2 - bne _08067BAC - cmp r5, 0 - beq _08067BAC - ldr r0, [r6] - mov r3, r8 - subs r0, r3, r0 - cmp r0, 0x8 - ble _08067BF0 - ldr r5, _08067BA8 - movs r4, 0x5 -_08067B82: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x37 - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08067B82 - b _08067BEA - .align 2, 0 -_08067B98: .4byte gUnknown_202F308 -_08067B9C: .4byte gUnknown_202F30C -_08067BA0: .4byte gUnknown_202EE10 -_08067BA4: .4byte gUnknown_8106DA4 -_08067BA8: .4byte gIwramTextFunc1 -_08067BAC: - ldr r0, _08067BF8 - ldrh r1, [r0, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08067C0C - movs r0, 0x1 - bl sub_8083CE0 - ldr r1, _08067BFC - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r0, 0x7 - bne _08067C04 - ldr r0, [r6] - mov r3, r8 - subs r0, r3, r0 - cmp r0, 0x8 - ble _08067BF0 - ldr r5, _08067C00 - movs r4, 0x5 -_08067BD6: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x37 - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08067BD6 -_08067BEA: - ldr r0, [r6] - adds r0, 0x1 - str r0, [r6] -_08067BF0: - movs r7, 0 - movs r0, 0x7 - mov r10, r0 - b _08067CF6 - .align 2, 0 -_08067BF8: .4byte gRealInputs -_08067BFC: .4byte gUnknown_202EE10 -_08067C00: .4byte gIwramTextFunc1 -_08067C04: - adds r0, r1, 0 - movs r1, 0 - bl sub_80136E0 -_08067C0C: - cmp r4, 0x1 - bne _08067C44 - cmp r7, 0 - beq _08067C44 - ldr r0, [r6] - cmp r0, 0 - beq _08067C38 - ldr r5, _08067C40 - movs r4, 0x5 -_08067C1E: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x37 - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08067C1E - ldr r0, [r6] - subs r0, 0x1 - str r0, [r6] -_08067C38: - movs r7, 0 - movs r1, 0 - mov r10, r1 - b _08067CF6 - .align 2, 0 -_08067C40: .4byte gIwramTextFunc2 -_08067C44: - ldr r0, _08067C8C - ldrh r1, [r0, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08067CA0 - movs r0, 0x1 - bl sub_8083CE0 - ldr r1, _08067C90 - movs r2, 0x18 - ldrsh r0, [r1, r2] - cmp r0, 0 - bne _08067C98 - ldr r0, [r6] - cmp r0, 0 - beq _08067C84 - ldr r5, _08067C94 - movs r4, 0x5 -_08067C6A: - ldr r1, [r5] - movs r0, 0 - bl _call_via_r1 - movs r0, 0x37 - bl sub_803E46C - subs r4, 0x1 - cmp r4, 0 - bge _08067C6A - ldr r0, [r6] - subs r0, 0x1 - str r0, [r6] -_08067C84: - movs r7, 0 - movs r3, 0 - mov r10, r3 - b _08067CF6 - .align 2, 0 -_08067C8C: .4byte gRealInputs -_08067C90: .4byte gUnknown_202EE10 -_08067C94: .4byte gIwramTextFunc2 -_08067C98: - adds r0, r1, 0 - movs r1, 0 - bl sub_8013744 -_08067CA0: - bl sub_80048C8 - lsls r0, 24 - cmp r0, 0 - beq _08067CAC - b _08067B36 -_08067CAC: - ldr r0, _08067CD4 - ldrh r1, [r0, 0x2] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - bne _08067D40 - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08067CCC - ldr r2, _08067CD8 - adds r0, r2, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08067CDC -_08067CCC: - bl sub_8083D08 - movs r7, 0x1 - b _08067CF6 - .align 2, 0 -_08067CD4: .4byte gRealInputs -_08067CD8: .4byte gUnknown_202EE10 -_08067CDC: - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08067CF0 - adds r0, r2, 0 - adds r0, 0x2A - ldrb r0, [r0] - cmp r0, 0 - bne _08067CF0 - b _08067B36 -_08067CF0: - bl sub_8083D30 - movs r7, 0x2 -_08067CF6: - ldr r4, _08067D34 - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x37 - bl sub_803E46C - cmp r7, 0 - bne _08067D0A - b _08067AD4 -_08067D0A: - cmp r7, 0x2 - bne _08067D48 - movs r1, 0x18 - ldrsh r0, [r4, r1] - mov r10, r0 - ldr r0, _08067D38 - ldr r0, [r0] - ldr r2, [sp, 0x68] - cmp r0, r2 - bge _08067D20 - b _08067AD4 -_08067D20: - ldr r0, _08067D3C - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonYesNoMessage - cmp r0, 0x1 - bne _08067D32 - b _08067ED8 -_08067D32: - b _08067AD4 - .align 2, 0 -_08067D34: .4byte gUnknown_202EE10 -_08067D38: .4byte gUnknown_202F310 -_08067D3C: .4byte gUnknown_80FDFB8 -_08067D40: - bl sub_8083D1C - movs r7, 0x3 - b _08067CF6 -_08067D48: - cmp r7, 0x3 - bne _08067D64 - movs r0, 0x18 - ldrsh r3, [r4, r0] - mov r10, r3 - ldr r0, _08067D60 - ldr r0, [r0] - add r0, r10 - lsls r0, 2 - add r0, r9 - b _08067ED0 - .align 2, 0 -_08067D60: .4byte gUnknown_202F30C -_08067D64: - movs r2, 0x18 - ldrsh r1, [r4, r2] - mov r10, r1 - ldr r0, _08067DAC - ldr r0, [r0] - adds r4, r0, r1 - ldr r1, _08067DB0 - movs r0, 0 - str r0, [r1] - movs r0, 0x29 - movs r1, 0 - bl sub_8044F5C - movs r0, 0x2A - movs r1, 0 - bl sub_8044F5C - movs r0, 0x40 - movs r1, 0 - bl sub_8044F5C - lsls r0, r4, 2 - add r0, r9 - ldr r0, [r0] - ldrh r0, [r0] - movs r3, 0x80 - lsls r3, 8 - adds r1, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _08067DBC - movs r0, 0x29 - bl sub_8044FF0 - b _08067DC2 - .align 2, 0 -_08067DAC: .4byte gUnknown_202F30C -_08067DB0: .4byte gUnknown_202EE6C -_08067DB4: - bl sub_8083D08 - movs r7, 0x1 - b _08067E6E -_08067DBC: - movs r0, 0x2A - bl sub_8044FF0 -_08067DC2: - lsls r0, r4, 2 - mov r2, r9 - adds r1, r0, r2 - ldr r2, [r1] - ldrb r1, [r2, 0x2] - adds r6, r0, 0 - cmp r1, 0 - bne _08067DDC - ldrb r1, [r2, 0x4] - cmp r1, 0x40 - beq _08067DDC - cmp r1, 0x41 - bne _08067DE2 -_08067DDC: - movs r0, 0x29 - bl sub_8044FF0 -_08067DE2: - bl sub_8045064 - add r0, sp, 0x4 - movs r1, 0x15 - bl sub_805FC30 - ldr r4, _08067EA0 - ldr r5, _08067EA4 - adds r7, r4, 0 - adds r7, 0x2A -_08067DF6: - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x37 - bl sub_803E46C - ldrh r1, [r5, 0x4] - movs r0, 0x80 - ands r0, r1 - cmp r0, 0 - beq _08067E1A - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80136E0 -_08067E1A: - ldrh r1, [r5, 0x4] - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08067E32 - movs r0, 0x1 - bl sub_8083CE0 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_8013744 -_08067E32: - ldrh r1, [r5, 0x2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - bne _08067E46 - adds r0, r4, 0 - adds r0, 0x29 - ldrb r0, [r0] - cmp r0, 0 - beq _08067E58 -_08067E46: - movs r3, 0x18 - ldrsh r0, [r4, r3] - bl sub_8044F3C - lsls r0, 24 - cmp r0, 0 - bne _08067DB4 - bl sub_8083D30 -_08067E58: - ldrh r1, [r5, 0x2] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08067E68 - ldrb r0, [r7] - cmp r0, 0 - beq _08067DF6 -_08067E68: - bl sub_8083D30 - movs r7, 0 -_08067E6E: - ldr r4, _08067EA0 - adds r0, r4, 0 - bl AddMenuCursorSprite - movs r0, 0x37 - bl sub_803E46C - cmp r7, 0 - bne _08067E82 - b _08067AD4 -_08067E82: - movs r1, 0x18 - ldrsh r0, [r4, r1] - cmp r0, 0 - bne _08067EA8 - mov r2, r9 - adds r0, r6, r2 - ldr r1, [r0] - ldrh r2, [r1] - movs r3, 0x80 - lsls r3, 8 - adds r0, r3, 0 - orrs r0, r2 - strh r0, [r1] - b _08067EBC - .align 2, 0 -_08067EA0: .4byte gUnknown_202EE10 -_08067EA4: .4byte gRealInputs -_08067EA8: - cmp r0, 0x1 - bne _08067ECC - mov r1, r9 - adds r0, r6, r1 - ldr r2, [r0] - ldrh r0, [r2] - ldr r3, _08067EC8 - adds r1, r3, 0 - ands r0, r1 - strh r0, [r2] -_08067EBC: - mov r0, r8 - mov r1, r9 - bl sub_8068310 - b _08067AD4 - .align 2, 0 -_08067EC8: .4byte 0x00007fff -_08067ECC: - mov r1, r9 - adds r0, r6, r1 -_08067ED0: - ldr r0, [r0] - bl sub_806806C - b _08067AD4 -_08067ED8: - mov r0, r8 - mov r1, r9 - bl sub_8068310 - ldr r0, _08067EFC - ldr r0, [r0] - ldr r2, [sp, 0x68] - cmp r0, r2 - bge _08067EEC - b _08067AD4 -_08067EEC: - add sp, 0x6C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08067EFC: .4byte gUnknown_202F310 - thumb_func_end sub_8067A80 - thumb_func_start sub_8067F00 sub_8067F00: push {r4-r7,lr} diff --git a/include/dungeon_move.h b/include/dungeon_move.h new file mode 100644 index 000000000..ccb15e650 --- /dev/null +++ b/include/dungeon_move.h @@ -0,0 +1,9 @@ +#ifndef GUARD_DUNGEON_MOVE_H +#define GUARD_DUNGEON_MOVE_H + +#include "structs/str_pokemon.h" +#include "structs/str_moves.h" + +bool8 TryUseChosenMove(struct Entity *attacker, u32 r6, s32 itemId, u32 var_30, bool32 isLinkedMove, struct Move *move); + +#endif diff --git a/src/code_8066D04.c b/src/code_8066D04.c index 7f7f3990d..241510c94 100644 --- a/src/code_8066D04.c +++ b/src/code_8066D04.c @@ -10,17 +10,27 @@ #include "position_util.h" #include "dungeon_util.h" #include "items.h" +#include "input.h" +#include "text.h" +#include "code_803E46C.h" #include "string_format.h" #include "dungeon_leader.h" #include "status_checks_1.h" #include "dungeon_ai_targeting.h" +#include "dungeon_engine.h" +#include "dungeon_move.h" #include "dungeon_items.h" #include "dungeon_random.h" #include "code_8077274_1.h" #include "code_8084778.h" +#include "pokemon.h" +#include "trap.h" +#include "moves.h" +#include "menu_input.h" #include "dungeon_capabilities.h" #include "constants/item.h" #include "constants/dungeon.h" +#include "constants/move_id.h" extern u8 *gUnknown_80F8BE0[]; extern u8 *gUnknown_80FF76C[]; @@ -46,16 +56,40 @@ extern u8 *gNoExchangesHere[]; extern u8 *gSwappedGroundItem[]; extern const u8 *const gMonThrewItem2; extern const u8 *const gMonThrewItem1; +extern const u8 *const gCannotFarewell; +extern const u8 *const gSayFarewellQ; +extern const u8 *const gUnknown_80FDFB8; +extern const u8 *const gUnknown_80F913C; extern const u8 *const gCannotTalk; extern const u8 *const gUnknown_80FE008; +extern const u8 *const gUnknown_80FDF74; extern const u8 *const gUnknown_80FF674; +extern const u8 *const gUnknown_80F9114; +extern const u8 *const gMonDisappointedAndLeft; +extern const u8 *const gSendMonBackQ; +extern const u8 *const gSendMonBackWithItemQ; +extern const u8 *const gMonWentBack; +extern const u8 *const gMonCringing; +extern const u8 *const gMonParalyzed; +extern const u8 *const gUnknown_80FC690; +extern s32 gUnknown_202EE6C; + +extern void sub_8071DA4(Entity *); +extern void sub_806A1B0(Entity *); +extern void sub_806A9B4(Entity *, u32); +extern void sub_8057588(Entity * pokemon, u8 param_2); +extern void sub_8068FE0(Entity *, u32, Entity *r2); +extern bool8 sub_806A58C(s16 a0); +extern bool8 sub_806A564(s16 r0); extern void sub_8045C08(u8 *buffer, Item *item); extern bool8 sub_8045888(Entity *); extern Item *sub_8044D90(Entity *, s32, u32); void sub_8045BF8(u8 *, Item *); u8 sub_8048D50(); +void sub_8044FF0(u16 param_1); u8 * sub_80464AC(); +void sub_8044F5C(u16 param_1, u8 param_2); void sub_8044DF0(); void sub_8042208(Entity *pokemon, u8 r1); void sub_803E708(); @@ -67,6 +101,8 @@ extern void sub_806A6E8(Entity *); extern void sub_8044DF0(Entity *, u32, u32); extern void sub_8045DB4(DungeonPos *, u32); extern bool8 sub_80461C8(DungeonPos *, u32); +extern bool32 sub_8055A00(Entity *attacker, s32 firstMoveId, s32 var_34, s32 itemId, s32 arg_0); +extern bool8 sub_8044B28(void); void HandlePickUpPlayerAction(Entity *entity) { @@ -735,3 +771,395 @@ void sub_8067768(ActionContainer *a0) Entity *targetEntity = gDungeon->teamPokemon[a0->actionParameters[0].actionUseIndex]; sub_8067794(GetLeader(), targetEntity, 0); } + +void sub_8067794(Entity *entity, Entity *targetEntity, s32 a2) +{ + const u8 *stringPtr1; + const u8 *stringPtr2; + s32 teamIndex; + EntityInfo *info2 = GetEntInfo(targetEntity); + + if (targetEntity == NULL) { + DisplayDungeonMessage(NULL, gCannotFarewell, TRUE); + return; + } + + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], targetEntity, 0); + stringPtr1 = gSayFarewellQ; + stringPtr2 = gUnknown_80F913C; + teamIndex = info2->teamIndex; + if (teamIndex >= 0) { + PokemonStruct2 *pokeStruct = &gRecruitedPokemonRef->pokemon2[teamIndex]; + if (sub_806A564(pokeStruct->unkA)) { + stringPtr1 = gUnknown_80F9114; + stringPtr2 = gMonDisappointedAndLeft; + } + else if (sub_806A58C(pokeStruct->unkA)) { + if (IsMakuhitaTrainingMaze()) { + stringPtr1 = gSendMonBackQ; + } + else { + stringPtr1 = gSendMonBackWithItemQ; + } + stringPtr2 = gMonWentBack; + } + } + + if (DisplayDungeonYesNoMessage(NULL, stringPtr1, FALSE) == 1) { + u8 tempText[64]; + + strncpy(tempText, gFormatBuffer_Monsters[0], sizeof(tempText)); + sub_8068FE0(targetEntity, 0x21D, 0); + strncpy(gFormatBuffer_Monsters[0], tempText, sizeof(tempText)); + DisplayDungeonMessage(NULL, stringPtr2, TRUE); + } +} + +void HandleUseMovePlayerAction(Entity *entity) +{ + s32 i = 0; + + while (i < sub_8070828(entity, TRUE)) { + EntityInfo *info = GetEntInfo(entity); + + sub_8055A00(entity, info->action.actionParameters[1].actionUseIndex, 1, 0, 0); + if (sub_8044B28()) { + break; + } + if (info->unk159 != 0) { + break; + } + i++; + } + + sub_8057588(entity, 1); + if (!sub_8044B28()) { + if (EntityIsValid(entity)) { + sub_806A9B4(entity, GetEntInfo(entity)->action.actionParameters[1].actionUseIndex); + } + sub_806A1B0(entity); + } +} + +extern u32 gUnknown_202F208; + +void sub_8067904(Entity *entity, u16 moveId) +{ + Move move; + EntityInfo *info = GetEntInfo(entity); + + gUnknown_202F208 = 0; + InitPokemonMove(&move, moveId); + if (info->cringeClassStatus.status == STATUS_CRINGE) { + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], entity, 0); + LogMessageByIdWithPopupCheckUser(entity, gMonCringing); + } + else if (info->burnClassStatus.status == STATUS_PARALYSIS) { + SubstitutePlaceholderStringTags(gFormatBuffer_Monsters[0], entity, 0); + LogMessageByIdWithPopupCheckUser(entity, gMonParalyzed); + } + else { + s32 i; + bool32 isStrugle; + + if (moveId == MOVE_STRUGGLE) { + isStrugle = TRUE; + } + else { + isStrugle = FALSE; + } + + i = 0; + while (i < sub_8070828(entity, TRUE)) { + info->abilityEffectFlags = 0; + move.moveFlags |= 8; + move.moveFlags |= 4; + move.PP = 10; + TryUseChosenMove(entity, isStrugle, 0, 0, FALSE, &move); + + if (!EntityIsValid(entity) || info->unk159 != 0) { + break; + } + i++; + } + + if (EntityIsValid(entity)) { + if (moveId == MOVE_STRUGGLE && gUnknown_202F208 == 0) { + LogMessageByIdWithPopupCheckUser(entity, gUnknown_80FC690); + } + if (info->isTeamLeader && moveId != MOVE_STRUGGLE) { + DungeonPos pos; + + pos.x = entity->pos.x + gAdjacentTileOffsets[info->action.direction].x; + pos.y = entity->pos.y + gAdjacentTileOffsets[info->action.direction].y; + sub_807FE44(&pos, 1); + } + sub_8071DA4(entity); + } + } +} + +typedef struct UnkTextStruct3 { + UnkTextStruct2 a0[4]; +} UnkTextStruct3; + +extern void sub_80684C4(void); +void sub_8045064(void); +extern void sub_8083CE0(u8 param_1); +extern void sub_8068344(void); +bool8 sub_8044F3C(s32 param_1); +void sub_8068310(s32 a0, PokemonStruct1 **a1); +void sub_8067F00(s32 a0, PokemonStruct1 **a1, s32 a2, s32 a3, s32 a4); +extern void sub_803ECB4(UnkTextStruct3 *a0, u8 a1); +u32 sub_8014140(s32 a0, const void *a1); +void sub_8083D1C(void); +void sub_8083D08(void); +void sub_8083D30(void); +void sub_806806C(PokemonStruct1 *a0); +void sub_805FC30(UnkTextStruct3 *a0, s32 a1); + +extern const u8 gUnknown_8106DA4[]; +extern MenuInputStruct gUnknown_202EE10; +extern const UnkTextStruct3 gUnknown_8106DC8; +extern s32 gUnknown_202F30C; +extern s32 gUnknown_202F310; +extern u8 gUnknown_202F308[]; + +void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3) +{ + s32 i; + s32 r10; + UnkTextStruct3 spTxtStruct = gUnknown_8106DC8; + + gUnknown_202F30C = 0; + r10 = 0; + for (i = 0; i < a2; i++) { + a3[i]->unk0 &= ~(0x8000); + } + + while (1) { + sub_8068310(a2, a3); + if (gUnknown_202F310 >= a1) + break; + while (1) { + s32 r7 = 0, r5 = 0; + + gUnknown_202F308[0] = 1; + gUnknown_202F308[1] = 0; + gUnknown_202F308[2] = 0xE; + gUnknown_202F308[3] = 0; + + ASM_MATCH_TRICK(r7); + + sub_803ECB4(&spTxtStruct, 1); + sub_8067F00(a0, a3, gUnknown_202F30C, a2, a1); + gUnknown_202EE10.unk1A = min(a2, 8); + gUnknown_202EE10.menuIndex = r10; + gUnknown_202EE10.unk1C = 8; + gUnknown_202EE10.unk1E = 0; + gUnknown_202EE10.unk20 = 0; + gUnknown_202EE10.unk4 = 0; + gUnknown_202EE10.unk6 = 18; + gUnknown_202EE10.unkC = 0; + gUnknown_202EE10.unkE = 0; + gUnknown_202EE10.unk14.x = 0; + gUnknown_202EE10.unk0 = 0; + sub_801317C(&gUnknown_202EE10.unk28); + sub_80137B0(&gUnknown_202EE10, 0); + while (1) { + s32 r4; + + AddMenuCursorSprite(&gUnknown_202EE10); + r5 = 0; + r7 = 0; + if (a2 - gUnknown_202F30C > 8) { + r5 = 1; + sub_80684C4(); + } + if (gUnknown_202F30C != 0) { + r7 = 1; + sub_8068344(); + } + + r4 = sub_8014140(0, gUnknown_8106DA4); + sub_803E46C(0x37); + if (r4 == 2 && r5) { + if (a2 - gUnknown_202F30C > 8) { + s32 i; + for (i = 0; i < 6; i++) { + gIwramTextFunc1(0); + sub_803E46C(0x37); + } + gUnknown_202F30C++; + } + r7 = 0; + r10 = 7; + break; + } + if (gRealInputs.repeated & DPAD_DOWN) { + sub_8083CE0(1); + if (gUnknown_202EE10.menuIndex == 7) { + if (a2 - gUnknown_202F30C > 8) { + s32 i; + for (i = 0; i < 6; i++) { + gIwramTextFunc1(0); + sub_803E46C(0x37); + } + gUnknown_202F30C++; + } + r7 = 0; + r10 = 7; + break; + } + sub_80136E0(&gUnknown_202EE10, 0); + } + + if (r4 == 1 && r7 != 0) { + if (gUnknown_202F30C != 0) { + s32 i; + for (i = 0; i < 6; i++) { + gIwramTextFunc2(0); + sub_803E46C(0x37); + } + gUnknown_202F30C--; + } + r7 = 0; + r10 = 0; + break; + } + if (gRealInputs.repeated & DPAD_UP) { + sub_8083CE0(1); + if (gUnknown_202EE10.menuIndex == 0) { + if (gUnknown_202F30C != 0) { + s32 i; + for (i = 0; i < 6; i++) { + gIwramTextFunc2(0); + sub_803E46C(0x37); + } + gUnknown_202F30C--; + } + r7 = 0; + r10 = 0; + break; + } + sub_8013744(&gUnknown_202EE10, 0); + } + + if (sub_80048C8()) { + continue; + } + + if (gRealInputs.pressed & START_BUTTON) { + sub_8083D1C(); + r7 = 3; + break; + } + if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { + sub_8083D08(); + r7 = 1; + break; + } + if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { + sub_8083D30(); + r7 = 2; + break; + } + } + + AddMenuCursorSprite(&gUnknown_202EE10); + sub_803E46C(0x37); + if (r7 == 0) { + continue; + } + else if (r7 == 2) { + r10 = gUnknown_202EE10.menuIndex; + if (gUnknown_202F310 < a1) { + continue; + } + + if (DisplayDungeonYesNoMessage(NULL, gUnknown_80FDFB8, TRUE) == 1) { + break; + } + else { + continue; + } + } + else if (r7 == 3) { + r10 = gUnknown_202EE10.menuIndex; + sub_806806C(a3[gUnknown_202F30C + r10]); + continue; + } + else { + s32 arrId; + u8 locIdIsPartner; + + r10 = gUnknown_202EE10.menuIndex; + arrId = gUnknown_202F30C + r10; + gUnknown_202EE6C = 0; + sub_8044F5C(0x29, 0); + sub_8044F5C(0x2A, 0); + sub_8044F5C(0x40, 0); + if (a3[arrId]->unk0 & 0x8000) { + sub_8044FF0(0x29); + } + else { + sub_8044FF0(0x2A); + } + + // This unnecessary variable is required to match. + locIdIsPartner = DUNGEON_JOIN_LOCATION_PARTNER; + if (a3[arrId]->isTeamLeader || (a3[arrId]->dungeonLocation.id == DUNGEON_JOIN_LOCATION_LEADER || a3[arrId]->dungeonLocation.id == locIdIsPartner)) { + sub_8044FF0(0x29); + } + + sub_8045064(); + sub_805FC30(&spTxtStruct, 0x15); + + while (1) { + AddMenuCursorSprite(&gUnknown_202EE10); + sub_803E46C(0x37); + + if (gRealInputs.repeated & DPAD_DOWN) { + sub_8083CE0(1); + sub_80136E0(&gUnknown_202EE10, 1); + } + if (gRealInputs.repeated & DPAD_UP) { + sub_8083CE0(1); + sub_8013744(&gUnknown_202EE10, 1); + } + + if ((gRealInputs.pressed & A_BUTTON) || gUnknown_202EE10.unk28.a_button) { + if (sub_8044F3C(gUnknown_202EE10.menuIndex)) { + sub_8083D08(); + r7 = 1; + break; + } + sub_8083D30(); + } + if ((gRealInputs.pressed & B_BUTTON) || gUnknown_202EE10.unk28.b_button) { + sub_8083D30(); + r7 = 0; + break; + } + } + + AddMenuCursorSprite(&gUnknown_202EE10); + sub_803E46C(0x37); + if (r7 != 0) { + if (gUnknown_202EE10.menuIndex == 0) { + a3[arrId]->unk0 |= 0x8000; + sub_8068310(a2, a3); + } + else if (gUnknown_202EE10.menuIndex == 1) { + a3[arrId]->unk0 &= ~(0x8000); + sub_8068310(a2, a3); + } + else { + sub_806806C(a3[arrId]); + } + } + continue; + } + } + } +} diff --git a/src/dungeon_move.c b/src/dungeon_move.c index 3ef1630e9..8f30f6abf 100644 --- a/src/dungeon_move.c +++ b/src/dungeon_move.c @@ -1,4 +1,5 @@ #include "global.h" +#include "dungeon_move.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_util.h" #include "dungeon_message.h" @@ -304,7 +305,6 @@ s32 HandleDamagingMove(Entity *, Entity *, Move *, s24_8, s32); static s32 TryHitTarget(Entity *attacker, Entity *target, Move *move, struct DamageStruct *dmgStruct, s16 unk); static void TriggerTargetAbilityEffect(Entity *attacker); static bool8 AccuracyCalc(Entity *attacker, Entity *target, Move *move, s32 accuracyType, bool8 selfAlwaysHits); -bool8 TryUseChosenMove(struct Entity *attacker, u32 r6, s32 itemId, u32 var_30, bool32 isLinkedMove, struct Move *move); bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, Entity **unkArray, bool32 itemId, bool8 arg_4, bool32 unused); bool8 sub_805744C(Entity * pokemon, Move *move, bool8 param_3); static void SetTargetsForMove(Entity **targetsArray, Entity *attacker, Move *move);