From ae8d7534a4338ffd411ba1c573516168eba1f5d4 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Sun, 16 Mar 2025 15:46:10 +0100 Subject: [PATCH] sub_8068FE0 --- asm/code_805D8C8_1.s | 1125 --------------------------------- include/constants/monster.h | 1 + include/structs/str_dungeon.h | 3 +- ld_script.txt | 1 - src/code_805D8C8.c | 353 ++++++++++- 5 files changed, 355 insertions(+), 1128 deletions(-) delete mode 100644 asm/code_805D8C8_1.s diff --git a/asm/code_805D8C8_1.s b/asm/code_805D8C8_1.s deleted file mode 100644 index 7919959d7..000000000 --- a/asm/code_805D8C8_1.s +++ /dev/null @@ -1,1125 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - - thumb_func_start sub_8068BDC -sub_8068BDC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - ldr r4, _08068CC4 - add sp, r4 - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x220] - movs r1, 0 - mov r0, sp - adds r0, 0x39 -_08068BF6: - strb r1, [r0] - subs r0, 0x1 - cmp r0, sp - bge _08068BF6 - movs r6, 0 - ldr r0, _08068CC8 - mov r8, r0 - movs r7, 0x1 -_08068C06: - movs r0, 0x64 - muls r0, r6 - ldr r1, _08068CCC - adds r0, r1 - mov r2, r8 - ldr r1, [r2] - adds r4, r1, r0 - ldrb r1, [r4] - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - beq _08068C50 - movs r3, 0xA - ldrsh r0, [r4, r3] - bl sub_806A564 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0 - bne _08068C50 - adds r4, 0x40 - ldrb r1, [r4] - adds r0, r7, 0 - ands r0, r1 - cmp r0, 0 - beq _08068C50 - ldrb r0, [r4, 0x2] - cmp r0, 0x69 - bne _08068C50 - adds r0, r4, 0 - bl GetMoneyValue - bl AddToTeamMoney - strb r5, [r4, 0x2] - strb r5, [r4, 0x1] - strb r5, [r4] -_08068C50: - adds r6, 0x1 - cmp r6, 0x3 - ble _08068C06 - movs r6, 0 - movs r5, 0x1 -_08068C5A: - ldr r1, _08068CC8 - movs r0, 0x64 - muls r0, r6 - ldr r2, _08068CCC - adds r0, r2 - ldr r1, [r1] - adds r4, r1, r0 - ldrb r1, [r4] - adds r0, r5, 0 - ands r0, r1 - cmp r0, 0 - beq _08068CFE - movs r3, 0xA - ldrsh r0, [r4, r3] - bl sub_806A564 - lsls r0, 24 - cmp r0, 0 - bne _08068CFE - ldr r1, _08068CD0 - adds r0, r1, 0 - ldrh r2, [r4, 0xE] - adds r0, r2 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x2 - bhi _08068C96 - movs r0, 0xBC - lsls r0, 1 - strh r0, [r4, 0xE] -_08068C96: - movs r3, 0xA - ldrsh r0, [r4, r3] - bl sub_806A58C - lsls r0, 24 - cmp r0, 0 - beq _08068CE8 - ldr r0, _08068CD4 - ldr r0, [r0] - ldr r1, _08068CD8 - adds r0, r1 - ldrb r0, [r0] - bl IsLevelResetTo1 - lsls r0, 24 - cmp r0, 0 - beq _08068CDC - movs r2, 0xA - ldrsh r0, [r4, r2] - adds r1, r4, 0 - bl sub_808DFDC - b _08068CFE - .align 2, 0 -_08068CC4: .4byte 0xfffffdd8 -_08068CC8: .4byte gRecruitedPokemonRef -_08068CCC: .4byte 0x00008df8 -_08068CD0: .4byte 0xfffffe87 -_08068CD4: .4byte gDungeon -_08068CD8: .4byte 0x00000644 -_08068CDC: - movs r3, 0xA - ldrsh r0, [r4, r3] - adds r1, r4, 0 - bl xxx_pokemon2_to_pokemonstruct_index_808DF2C - b _08068CFE -_08068CE8: - ldr r0, [sp, 0x220] - cmp r0, 0 - beq _08068CFE - movs r1, 0xE - ldrsh r0, [r4, r1] - bl GetFriendArea - lsls r0, 24 - lsrs r0, 24 - add r0, sp - strb r5, [r0] -_08068CFE: - adds r6, 0x1 - cmp r6, 0x3 - ble _08068C5A - movs r1, 0 -_08068D06: - lsls r0, r1, 24 - lsrs r0, 24 - mov r8, r0 - mov r0, sp - add r0, r8 - ldrb r0, [r0] - adds r1, 0x1 - str r1, [sp, 0x224] - cmp r0, 0 - bne _08068D1C - b _08068F08 -_08068D1C: - mov r0, r8 - add r1, sp, 0x1F0 - movs r2, 0x1 - movs r3, 0x1 - bl sub_8092404 - mov r0, r8 - add r1, sp, 0x214 - movs r2, 0 - movs r3, 0 - bl GetFriendAreaCapacity2 - movs r7, 0 - add r1, sp, 0x1F0 - ldrh r0, [r1] - ldr r2, _08068E10 - cmp r0, r2 - beq _08068D60 - ldr r0, _08068E14 - ldr r3, [r0] - adds r5, r2, 0 - add r2, sp, 0x3C - movs r4, 0x58 -_08068D4A: - ldrh r0, [r1] - muls r0, r4 - adds r0, r3, r0 - stm r2!, {r0} - adds r1, 0x2 - adds r7, 0x1 - cmp r7, 0x14 - bgt _08068D60 - ldrh r0, [r1] - cmp r0, r5 - bne _08068D4A -_08068D60: - movs r6, 0 - ldr r2, _08068E14 - mov r10, r2 - movs r3, 0 - mov r9, r3 -_08068D6A: - movs r0, 0x64 - muls r0, r6 - ldr r1, _08068E18 - adds r0, r1 - mov r2, r10 - ldr r1, [r2] - adds r5, r1, r0 - ldrb r1, [r5] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08068DD6 - movs r3, 0xA - ldrsh r0, [r5, r3] - bl sub_806A5A4 - lsls r0, 24 - cmp r0, 0 - beq _08068DD6 - movs r1, 0xE - ldrsh r0, [r5, r1] - bl GetFriendArea - lsls r0, 24 - lsrs r0, 24 - cmp r0, r8 - bne _08068DD6 - ldr r2, [sp, 0x220] - cmp r2, 0 - beq _08068DD6 - add r4, sp, 0x3C - lsls r0, r7, 2 - adds r4, r0 - add r0, sp, 0x90 - movs r1, 0x58 - muls r1, r6 - adds r0, r1 - str r0, [r4] - adds r1, r5, 0 - bl xxx_pokemon2_to_pokemonstruct_808DF44 - ldr r2, [r4] - ldrh r0, [r2] - movs r3, 0x80 - lsls r3, 7 - adds r1, r3, 0 - orrs r0, r1 - strh r0, [r2] - ldr r0, [r4] - mov r1, r9 - strb r1, [r0, 0xC] - ldr r0, [r4] - strb r1, [r0, 0x10] - adds r7, 0x1 -_08068DD6: - adds r6, 0x1 - cmp r6, 0x3 - ble _08068D6A - add r0, sp, 0x214 - movs r2, 0 - ldrsh r0, [r0, r2] - cmp r7, r0 - bgt _08068E1C - cmp r7, 0 - bgt _08068DEC - b _08068F08 -_08068DEC: - add r5, sp, 0x3C - movs r3, 0x80 - lsls r3, 7 - adds r6, r3, 0 - adds r4, r7, 0 -_08068DF6: - ldr r1, [r5] - ldrh r0, [r1] - ands r0, r6 - cmp r0, 0 - beq _08068E06 - adds r0, r1, 0 - bl sub_808D1DC -_08068E06: - adds r5, 0x4 - subs r4, 0x1 - cmp r4, 0 - bne _08068DF6 - b _08068F08 - .align 2, 0 -_08068E10: .4byte 0x0000ffff -_08068E14: .4byte gRecruitedPokemonRef -_08068E18: .4byte 0x00008df8 -_08068E1C: - ldr r0, _08068E78 - mov r1, r8 - movs r2, 0 - bl WriteFriendAreaName - ldr r0, _08068E7C - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonMessage - add r4, sp, 0x3C -_08068E34: - add r0, sp, 0x214 - movs r2, 0 - ldrsh r1, [r0, r2] - subs r1, r7, r1 - mov r0, r8 - adds r2, r7, 0 - adds r3, r4, 0 - bl sub_8067A80 - movs r6, 0 - cmp r6, r7 - bge _08068E8E - movs r5, 0x80 - lsls r5, 8 - adds r3, r4, 0 -_08068E52: - ldr r2, [r3] - ldrh r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08068E86 - adds r0, r5, 0 - ands r0, r1 - cmp r0, 0 - beq _08068E86 - ldrb r0, [r2, 0x4] - subs r0, 0x44 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bhi _08068E80 - movs r0, 0x1 - b _08068E82 - .align 2, 0 -_08068E78: .4byte gFormatBuffer_Items -_08068E7C: .4byte gUnknown_80FE1A4 -_08068E80: - movs r0, 0 -_08068E82: - cmp r0, 0 - bne _08068E8E -_08068E86: - adds r3, 0x4 - adds r6, 0x1 - cmp r6, r7 - blt _08068E52 -_08068E8E: - cmp r6, r7 - beq _08068EA2 - ldr r0, _08068F24 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonYesNoMessage - cmp r0, 0x1 - bne _08068E34 -_08068EA2: - cmp r7, 0 - ble _08068ED4 - movs r3, 0x80 - lsls r3, 8 - mov r9, r3 - adds r3, r4, 0 - movs r0, 0x1 - mov r8, r0 - movs r5, 0 - adds r6, r7, 0 -_08068EB6: - ldr r2, [r3] - ldrh r1, [r2] - mov r0, r8 - ands r0, r1 - cmp r0, 0 - beq _08068ECC - mov r0, r9 - ands r0, r1 - cmp r0, 0 - beq _08068ECC - strh r5, [r2] -_08068ECC: - adds r3, 0x4 - subs r6, 0x1 - cmp r6, 0 - bne _08068EB6 -_08068ED4: - cmp r7, 0 - ble _08068F08 - movs r1, 0x80 - lsls r1, 7 - adds r5, r1, 0 - adds r6, r7, 0 -_08068EE0: - ldr r2, [r4] - ldrh r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08068F00 - adds r0, r1, 0 - ands r0, r5 - cmp r0, 0 - beq _08068F00 - adds r0, r2, 0 - bl sub_808D1DC - ldr r1, [r4] - movs r0, 0 - strh r0, [r1] -_08068F00: - adds r4, 0x4 - subs r6, 0x1 - cmp r6, 0 - bne _08068EE0 -_08068F08: - ldr r1, [sp, 0x224] - cmp r1, 0x39 - bgt _08068F10 - b _08068D06 -_08068F10: - movs r3, 0x8A - lsls r3, 2 - add sp, r3 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08068F24: .4byte gUnknown_80FE20C - thumb_func_end sub_8068BDC - - thumb_func_start sub_8068F28 -sub_8068F28: - push {r4-r7,lr} - movs r6, 0 - ldr r7, _08068F5C -_08068F2E: - movs r0, 0x64 - muls r0, r6 - ldr r1, _08068F60 - adds r0, r1 - ldr r1, [r7] - adds r4, r1, r0 - ldrb r1, [r4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08068F74 - movs r1, 0xA - ldrsh r0, [r4, r1] - bl sub_806A564 - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0 - beq _08068F64 - movs r0, 0 - strh r0, [r4] - b _08068F74 - .align 2, 0 -_08068F5C: .4byte gRecruitedPokemonRef -_08068F60: .4byte 0x00008df8 -_08068F64: - movs r1, 0xA - ldrsh r0, [r4, r1] - bl sub_806A538 - lsls r0, 24 - cmp r0, 0 - beq _08068F74 - strh r5, [r4] -_08068F74: - adds r6, 0x1 - cmp r6, 0x3 - ble _08068F2E - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_8068F28 - - thumb_func_start sub_8068F80 -sub_8068F80: - push {r4,r5,lr} - bl GetLeader - adds r5, r0, 0 - ldr r0, _08068FD4 - ldr r4, [r0] - ldr r1, _08068FD8 - adds r0, r4, r1 - movs r1, 0 - strb r1, [r0] - ldr r2, _08068FDC - adds r0, r4, r2 - strb r1, [r0] - adds r2, 0x6 - adds r0, r4, r2 - strb r1, [r0] - adds r0, r4, 0 - adds r0, 0xC0 - str r1, [r0] - cmp r5, 0 - beq _08068FCC - adds r0, r5, 0 - bl GetTileAtEntitySafe - ldrh r0, [r0] - lsrs r0, 5 - movs r1, 0x1 - ands r0, r1 - movs r2, 0xD3 - lsls r2, 3 - adds r1, r4, r2 - strb r0, [r1] - adds r2, 0x1 - adds r1, r4, r2 - strb r0, [r1] - adds r0, r5, 0x4 - bl sub_804AC20 -_08068FCC: - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08068FD4: .4byte gDungeon -_08068FD8: .4byte 0x0000066c -_08068FDC: .4byte 0x0000066d - thumb_func_end sub_8068F80 - - thumb_func_start sub_8068FE0 -sub_8068FE0: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x84 - mov r8, r0 - str r2, [sp, 0x74] - lsls r1, 16 - asrs r1, 16 - mov r9, r1 - ldr r7, [r0, 0x70] - bl GetTileAtEntitySafe - adds r4, r0, 0 - ldr r0, [sp, 0x74] - cmp r0, 0 - bne _0806900E - mov r0, sp - bl sub_80457DC - mov r1, sp - str r1, [sp, 0x74] -_0806900E: - ldr r0, [r4, 0x10] - cmp r0, r8 - bne _08069018 - movs r0, 0 - str r0, [r4, 0x10] -_08069018: - mov r2, r8 - movs r3, 0x4 - ldrsh r0, [r2, r3] - movs r3, 0x6 - ldrsh r1, [r2, r3] - bl ShowDungeonMapAtPos - movs r5, 0 - adds r6, r7, 0 - adds r6, 0xC8 - movs r0, 0xB0 - adds r0, r7 - mov r10, r0 - mov r1, r8 - adds r1, 0x22 - str r1, [sp, 0x80] - mov r2, r8 - adds r2, 0x20 - str r2, [sp, 0x7C] - adds r3, r7, 0 - adds r3, 0x40 - str r3, [sp, 0x78] -_08069044: - ldr r0, _080690E4 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _080690E8 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - cmp r4, 0 - beq _08069072 - adds r0, r4, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _08069072 - ldr r0, [r4, 0x70] - adds r1, r0, 0 - adds r1, 0x80 - ldr r0, [r1] - cmp r0, r8 - bne _08069072 - movs r0, 0 - str r0, [r1] -_08069072: - adds r5, 0x1 - cmp r5, 0x13 - ble _08069044 - ldrb r0, [r6] - cmp r0, 0x2 - bne _0806908A - ldr r0, _080690E4 - ldr r0, [r0] - ldr r3, _080690EC - adds r0, r3 - movs r1, 0 - strb r1, [r0] -_0806908A: - mov r1, r10 - ldrb r0, [r1] - subs r0, 0x3 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bhi _080690A2 - adds r0, r7, 0 - adds r0, 0x9C - ldr r0, [r0] - bl sub_8076CB4 -_080690A2: - mov r0, r8 - bl sub_8078084 - movs r0, 0 - ldr r2, [sp, 0x80] - strb r0, [r2] - ldr r3, [sp, 0x7C] - strb r0, [r3] - ldr r1, _080690F0 - str r0, [r1] - ldr r1, [sp, 0x78] - ldrb r0, [r1] - cmp r0, 0x41 - bne _080690FC - ldr r3, _080690E4 - ldr r2, [r3] - ldr r1, _080690F4 - adds r0, r2, r1 - ldrb r1, [r0] - cmp r1, 0 - bne _080690FC - movs r0, 0x1 - strb r0, [r2, 0x10] - strh r1, [r7, 0xE] - ldr r0, [r3] - ldr r2, _080690F8 - adds r0, r2 - mov r1, r8 - movs r2, 0 - bl SubstitutePlaceholderStringTags - b _08069484 - .align 2, 0 -_080690E4: .4byte gDungeon -_080690E8: .4byte 0x000135cc -_080690EC: .4byte 0x000037fc -_080690F0: .4byte gLeaderPointer -_080690F4: .4byte 0x0000065c -_080690F8: .4byte 0x000005f4 -_080690FC: - ldrb r0, [r7, 0x7] - cmp r0, 0 - bne _08069104 - b _0806928E -_08069104: - movs r0, 0x3C - movs r1, 0x49 - bl sub_803E708 - bl DisplayMessageLog - ldr r5, _08069198 - ldr r2, [r5] - ldrb r0, [r2, 0x6] - cmp r0, 0 - bne _080691C8 - ldr r3, _0806919C - adds r0, r2, r3 - ldrb r0, [r0] - cmp r0, 0 - bne _080691E0 - movs r0, 0x87 - lsls r0, 2 - cmp r9, r0 - beq _080691E0 - adds r0, 0x6 - cmp r9, r0 - beq _080691E0 - subs r0, 0x4 - cmp r9, r0 - beq _080691E0 - ldr r1, _080691A0 - adds r0, r2, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _080691E0 - ldr r6, _080691A4 - adds r0, r2, r6 - movs r1, 0 - ldrsb r1, [r0, r1] - cmp r1, 0 - blt _080691E0 - adds r3, 0xA - adds r0, r2, r3 - ldrb r0, [r0] - cmp r0, 0x1 - beq _080691E0 - cmp r1, 0 - ble _080691B4 - ldr r0, _080691A8 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonYesNoMessage - adds r4, r0, 0 - cmp r4, 0x1 - bne _080691E0 - ldr r0, _080691AC - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonMessage - ldr r0, [r5] - strb r4, [r0, 0x4] - ldr r0, [r5] - strb r4, [r0, 0x6] - ldr r0, [r5] - ldr r1, _080691B0 - adds r0, r1 - strb r4, [r0] - ldr r1, [r5] - adds r1, r6 - ldrb r0, [r1] - subs r0, 0x1 - strb r0, [r1] - b _08069484 - .align 2, 0 -_08069198: .4byte gDungeon -_0806919C: .4byte 0x0000066e -_080691A0: .4byte 0x00003a0d -_080691A4: .4byte 0x0000067b -_080691A8: .4byte gUnknown_80FE268 -_080691AC: .4byte gUnknown_80FE28C -_080691B0: .4byte 0x00000654 -_080691B4: - ldr r0, _080691C4 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl DisplayDungeonMessage - b _080691E0 - .align 2, 0 -_080691C4: .4byte gUnknown_80FE2D0 -_080691C8: - movs r1, 0x1 - strb r1, [r2, 0x4] - ldr r0, [r5] - strb r1, [r0, 0x6] - ldr r0, [r5] - ldr r2, _080691DC - adds r0, r2 - strb r1, [r0] - b _08069484 - .align 2, 0 -_080691DC: .4byte 0x00000654 -_080691E0: - mov r0, r9 - ldr r1, [sp, 0x74] - mov r2, r8 - bl sub_8083AB0 - ldr r0, _080691F8 - cmp r9, r0 - bne _0806928E - movs r6, 0 - movs r5, 0 - b _080691FE - .align 2, 0 -_080691F8: .4byte 0x0000021f -_080691FC: - adds r5, 0x1 -_080691FE: - cmp r5, 0x3 - bgt _08069228 - ldr r0, _080692C4 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r3, _080692C8 - adds r0, r3 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityIsValid - lsls r0, 24 - cmp r0, 0 - beq _080691FC - ldr r6, [r4, 0x70] - adds r0, r6, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x41 - bne _080691FC -_08069228: - cmp r6, 0 - beq _0806928E - ldr r5, _080692CC - ldrb r0, [r6, 0xA] - movs r1, 0x64 - muls r1, r0 - ldr r2, _080692D0 - adds r1, r2 - ldr r2, [r5] - adds r4, r2, r1 - adds r1, r6, 0 - bl sub_806C264 - movs r3, 0xA - ldrsh r0, [r4, r3] - bl sub_806A58C - lsls r0, 24 - cmp r0, 0 - beq _0806928A - ldr r0, _080692C4 - ldr r0, [r0] - ldr r1, _080692D4 - adds r0, r1 - ldrb r0, [r0] - bl IsLevelResetTo1 - lsls r0, 24 - cmp r0, 0 - bne _0806926E - movs r2, 0xA - ldrsh r0, [r4, r2] - adds r1, r4, 0 - bl xxx_pokemon2_to_pokemonstruct_index_808DF2C -_0806926E: - bl IsMakuhitaTrainingMaze - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0 - bne _0806928A - movs r3, 0xA - ldrsh r1, [r4, r3] - movs r0, 0x58 - muls r0, r1 - ldr r1, [r5] - adds r0, r1 - adds r0, 0x28 - strb r2, [r0] -_0806928A: - movs r0, 0 - strh r0, [r4] -_0806928E: - ldrb r0, [r7, 0x6] - cmp r0, 0 - beq _080692DC - movs r5, 0 - movs r1, 0xB4 - lsls r1, 1 - adds r0, r7, r1 - movs r2, 0x98 - adds r2, r7 - mov r10, r2 - ldrb r3, [r0] - cmp r5, r3 - bge _0806930A - ldr r4, _080692D8 - subs r1, 0x1 - adds r2, r7, r1 - movs r3, 0 - adds r1, r0, 0 -_080692B2: - ldrb r0, [r2] - adds r0, r5 - adds r0, r4 - strb r3, [r0] - adds r5, 0x1 - ldrb r0, [r1] - cmp r5, r0 - blt _080692B2 - b _0806930A - .align 2, 0 -_080692C4: .4byte gDungeon -_080692C8: .4byte 0x0001357c -_080692CC: .4byte gRecruitedPokemonRef -_080692D0: .4byte 0x00008df8 -_080692D4: .4byte 0x00000644 -_080692D8: .4byte gUnknown_202EE76 -_080692DC: - movs r5, 0 - movs r1, 0xB4 - lsls r1, 1 - adds r0, r7, r1 - movs r2, 0x98 - adds r2, r7 - mov r10, r2 - ldrb r3, [r0] - cmp r5, r3 - bge _0806930A - ldr r4, _0806932C - subs r1, 0x1 - adds r2, r7, r1 - movs r3, 0 - adds r1, r0, 0 -_080692FA: - ldrb r0, [r2] - adds r0, r5 - adds r0, r4 - strb r3, [r0] - adds r5, 0x1 - ldrb r0, [r1] - cmp r5, r0 - blt _080692FA -_0806930A: - ldr r1, [sp, 0x78] - ldrb r0, [r1] - cmp r0, 0x4A - bne _08069338 - ldr r2, _08069330 - ldr r1, [r2] - movs r0, 0x2 - strb r0, [r1, 0x10] - ldr r0, [r2] - ldr r2, _08069334 - adds r0, r2 - mov r1, r8 - movs r2, 0 - bl SubstitutePlaceholderStringTags - b _08069352 - .align 2, 0 -_0806932C: .4byte gUnknown_202EE70 -_08069330: .4byte gDungeon -_08069334: .4byte 0x000005f4 -_08069338: - cmp r0, 0x47 - bne _08069352 - ldr r2, _08069494 - ldr r1, [r2] - movs r0, 0x3 - strb r0, [r1, 0x10] - ldr r0, [r2] - ldr r3, _08069498 - adds r0, r3 - mov r1, r8 - movs r2, 0 - bl SubstitutePlaceholderStringTags -_08069352: - bl GetLeader - cmp r0, 0 - beq _080693C6 - movs r0, 0x87 - lsls r0, 2 - cmp r9, r0 - beq _080693C6 - ldrb r0, [r7, 0x7] - cmp r0, 0 - bne _080693C6 - ldr r4, _08069494 - ldr r0, [r4] - ldrb r0, [r0, 0x10] - cmp r0, 0 - bne _080693C6 - adds r0, r7, 0 - adds r0, 0xA4 - ldrb r1, [r0] - movs r2, 0 - movs r0, 0xFA - lsls r0, 1 - cmp r9, r0 - bne _08069384 - movs r2, 0x1 -_08069384: - mov r0, r8 - bl sub_8084E00 - ldr r1, _0806949C - adds r0, r1, 0 - ldrh r2, [r7, 0x4] - adds r0, r2 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x2 - bhi _080693C6 - bl IsBossFight - lsls r0, 24 - cmp r0, 0 - bne _080693C6 - ldrb r0, [r7, 0x6] - cmp r0, 0 - beq _080693CC - ldr r0, [r4] - ldr r3, _080694A0 - adds r0, r3 - movs r1, 0x1 - strb r1, [r0] - ldr r0, _080694A4 - ldr r1, [r0] - mov r0, r8 - bl DisplayDungeonLoggableMessageTrue - bl sub_803E178 - bl sub_8049ED4 -_080693C6: - ldrb r0, [r7, 0x6] - cmp r0, 0 - bne _08069466 -_080693CC: - ldr r6, _080694A8 - ldrb r0, [r7, 0xA] - movs r1, 0x64 - muls r1, r0 - ldr r2, _080694AC - adds r1, r2 - ldr r2, [r6] - adds r4, r2, r1 - adds r1, r7, 0 - bl sub_806C264 - movs r3, 0xA - ldrsh r0, [r4, r3] - bl sub_806A58C - lsls r0, 24 - cmp r0, 0 - beq _08069462 - ldr r5, _08069494 - ldr r0, [r5] - ldr r1, _080694B0 - adds r0, r1 - ldrb r0, [r0] - bl IsLevelResetTo1 - lsls r0, 24 - cmp r0, 0 - bne _0806940E - movs r2, 0xA - ldrsh r0, [r4, r2] - adds r1, r4, 0 - bl xxx_pokemon2_to_pokemonstruct_index_808DF2C -_0806940E: - bl IsMakuhitaTrainingMaze - lsls r0, 24 - lsrs r2, r0, 24 - cmp r2, 0 - bne _0806942A - movs r3, 0xA - ldrsh r1, [r4, r3] - movs r0, 0x58 - muls r0, r1 - ldr r1, [r6] - adds r0, r1 - adds r0, 0x28 - strb r2, [r0] -_0806942A: - ldrb r1, [r7, 0x7] - negs r0, r1 - orrs r0, r1 - lsrs r1, r0, 31 - ldr r0, [r5] - ldr r2, _080694B4 - adds r0, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _08069448 - ldr r3, [sp, 0x78] - ldrb r0, [r3] - cmp r0, 0x41 - bne _08069448 - movs r1, 0x1 -_08069448: - cmp r1, 0 - bne _08069462 - movs r0, 0xA - ldrsh r1, [r4, r0] - movs r0, 0x58 - muls r1, r0 - ldr r0, _080694A8 - ldr r0, [r0] - adds r1, r0 - ldrh r2, [r1] - ldr r0, _080694B8 - ands r0, r2 - strh r0, [r1] -_08069462: - movs r0, 0 - strh r0, [r4] -_08069466: - mov r1, r10 - ldr r0, [r1] - bl DeletePokemonDungeonSprite - ldr r0, _080694BC - movs r2, 0 - str r2, [r0] - ldr r0, _08069494 - ldr r1, [r0] - movs r0, 0x1 - strb r0, [r1, 0xC] - mov r3, r8 - str r2, [r3] - bl sub_8045ACC -_08069484: - add sp, 0x84 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08069494: .4byte gDungeon -_08069498: .4byte 0x000005f4 -_0806949C: .4byte 0xfffffe5f -_080694A0: .4byte 0x000037fe -_080694A4: .4byte gUnknown_80FA580 -_080694A8: .4byte gRecruitedPokemonRef -_080694AC: .4byte 0x00008df8 -_080694B0: .4byte 0x00000644 -_080694B4: .4byte 0x0000065c -_080694B8: .4byte 0x0000fffd -_080694BC: .4byte gLeaderPointer - thumb_func_end sub_8068FE0 - - .align 2,0 diff --git a/include/constants/monster.h b/include/constants/monster.h index 68088c976..34f4cc617 100644 --- a/include/constants/monster.h +++ b/include/constants/monster.h @@ -431,5 +431,6 @@ #define MONSTER_MAX (MONSTER_RAYQUAZA_CUTSCENE + 1) #define IS_CASTFORM_FORM_MONSTER(id)((id == MONSTER_CASTFORM_SNOWY || id == MONSTER_CASTFORM_SUNNY || id == MONSTER_CASTFORM_RAINY)) +#define IS_DEOXYS_FORM_MONSTER(id)((id == MONSTER_DEOXYS_ATTACK || id == MONSTER_DEOXYS_DEFENSE || id == MONSTER_DEOXYS_SPEED)) #endif // GUARD_CONSTANTS_MONSTER_H diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index 845800a51..f3b59439f 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -388,7 +388,8 @@ typedef struct Dungeon u32 unk18[(0xB8 - 0x18) / 4]; Entity *unkB8; Entity *unkBC; - u8 fillC0[0x134 - 0xC0]; + s32 unkC0; + u8 fillC4[0x134 - 0xC4]; struct unkStruct_Dungeon134_sub unk134; /* 0x17C */ RGB colorRamp[COLOR_RAMP_COUNT]; /* 0x57C */ unkDungeon57C unk57C; diff --git a/ld_script.txt b/ld_script.txt index b05cc561e..74086c401 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -234,7 +234,6 @@ SECTIONS { src/dungeon_menu_recruitment.o(.text); src/code_8066D04.o(.text); src/code_805D8C8.o(.text); - asm/code_805D8C8_1.o(.text); src/code_8069D4C.o(.text); src/targeting.o(.text); src/code_8069E0C.o(.text); diff --git a/src/code_805D8C8.c b/src/code_805D8C8.c index b8f9ab8d5..c0b65d3ee 100644 --- a/src/code_805D8C8.c +++ b/src/code_805D8C8.c @@ -9,6 +9,7 @@ #include "text.h" #include "moves.h" #include "string_format.h" +#include "friend_area.h" #include "code_80450F8.h" #include "code_8045A00.h" #include "code_803E668.h" @@ -19,6 +20,7 @@ #include "dungeon_leader.h" #include "dungeon_message.h" #include "constants/dungeon.h" +#include "constants/friend_area.h" // monster_sbin.s // data_8106A4C.s @@ -347,4 +349,353 @@ void sub_8068A84(PokemonStruct1 *pokemon) } } -// +extern bool8 sub_806A564(s32 r0); +extern void sub_808DFDC(s32 a1, PokemonStruct2* a2); +extern void xxx_pokemon2_to_pokemonstruct_808DF44(PokemonStruct1*, PokemonStruct2*); +extern void sub_8067A80(u8 a0, s32 a1, s32 a2, PokemonStruct1 **a3); +extern bool8 sub_806A5A4(s32 r0); +extern u8 sub_806A538(s32); + +extern const u8 *const gUnknown_80FE1A4; +extern const u8 *const gUnknown_80FE20C; + +static inline bool8 IsUnkDungeon(u8 joinedDungeon) +{ + if (joinedDungeon == DUNGEON_POKEMON_SQUARE || joinedDungeon == DUNGEON_HOWLING_FOREST_2) + return TRUE; + else + return FALSE; +} + +void sub_8068BDC(bool8 a0) +{ + bool8 spArr[NUM_FRIEND_AREAS]; + PokemonStruct1 *monPointers[21]; + PokemonStruct1 mon1Structs[MAX_TEAM_MEMBERS]; + u16 arr2[18]; + FriendAreaCapacity areaCapacity; + s32 i, j, id; + + for (i = 0; i < NUM_FRIEND_AREAS; i++) { + spArr[i] = FALSE; + } + + for (id = 0; id < MAX_TEAM_MEMBERS; id++) { + PokemonStruct2 *monPtr = &gRecruitedPokemonRef->pokemon2[id]; + if (PokemonFlag1Struct2(monPtr) && !sub_806A564(monPtr->unkA)) { + Item *monItem = &monPtr->itemSlot; + if (ItemExists(monItem) && monItem->id == ITEM_POKE) { + AddToTeamMoney(GetMoneyValue(monItem)); + ZeroOutItem(monItem); + } + } + } + + for (id = 0; id < MAX_TEAM_MEMBERS; id++) { + PokemonStruct2 *monPtr = &gRecruitedPokemonRef->pokemon2[id]; + if (PokemonFlag1Struct2(monPtr) && !sub_806A564(monPtr->unkA)) { + if (IS_CASTFORM_FORM_MONSTER(monPtr->speciesNum)) { + monPtr->speciesNum = MONSTER_CASTFORM; + } + + if (sub_806A58C(monPtr->unkA)) { + if (IsLevelResetTo1(gDungeon->unk644.dungeonLocation.id)) { + sub_808DFDC(monPtr->unkA, monPtr); + } + else { + xxx_pokemon2_to_pokemonstruct_index_808DF2C(monPtr->unkA, monPtr); + } + } + else { + if (a0) { + spArr[GetFriendArea(monPtr->speciesNum)] = TRUE; + } + } + } + } + + for (i = 0; i < NUM_FRIEND_AREAS; i++) { + u8 friendAreaId = i; + if (!spArr[friendAreaId]) + continue; + + sub_8092404(friendAreaId, arr2, TRUE, TRUE); + GetFriendAreaCapacity2(friendAreaId, &areaCapacity, FALSE, FALSE); + for (j = 0; j < 21 && arr2[j] != 0xFFFF; j++) { + monPointers[j] = &gRecruitedPokemonRef->pokemon[arr2[j]]; + } + + for (id = 0; id < MAX_TEAM_MEMBERS; id++) { + PokemonStruct2 *monPtr = &gRecruitedPokemonRef->pokemon2[id]; + if (PokemonFlag1Struct2(monPtr) && sub_806A5A4(monPtr->unkA) && GetFriendArea(monPtr->speciesNum) == friendAreaId && a0) { + monPointers[j] = &mon1Structs[id]; + xxx_pokemon2_to_pokemonstruct_808DF44(monPointers[j], monPtr); + monPointers[j]->unk0 |= 0x4000; + monPointers[j]->unkC[0].level = 0; + monPointers[j]->unkC[1].level = 0; + j++; + } + } + + if (j <= areaCapacity.maxPokemon) { + s32 k; + for (k = 0; k < j; k++) { + if (monPointers[k]->unk0 & 0x4000) { + sub_808D1DC(monPointers[k]); + } + } + } + else { + WriteFriendAreaName(gFormatBuffer_Items[0], friendAreaId, FALSE); + DisplayDungeonMessage(NULL, gUnknown_80FE1A4, TRUE); // The Friend Area is full, a friend must be released. + while (1) { + sub_8067A80(friendAreaId, j - areaCapacity.maxPokemon, j, monPointers); + for (id = 0; id < j; id++) { + PokemonStruct1 *monPtr = monPointers[id]; + if (PokemonFlag1(monPtr) && (monPtr->unk0 & 0x8000)) { + if (IsUnkDungeon(monPtr->dungeonLocation.id)) { + break; + } + } + } + + if (id == j) + break; + if (DisplayDungeonYesNoMessage(NULL, gUnknown_80FE20C, TRUE) == TRUE) // If you dismiss this mon, it may never join you again. Bid farewell to it? + break; + } + + for (id = 0; id < j; id++) { + if (PokemonFlag1(monPointers[id]) && (monPointers[id]->unk0 & 0x8000)) { + monPointers[id]->unk0 = 0; + } + } + for (id = 0; id < j; id++) { + if (PokemonFlag1(monPointers[id]) && (monPointers[id]->unk0 & 0x4000)) { + sub_808D1DC(monPointers[id]); + monPointers[id]->unk0 = 0; + } + } + } + } +} + +void sub_8068F28(void) +{ + s32 i; + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + PokemonStruct2 *monStruct2Ptr = &gRecruitedPokemonRef->pokemon2[i]; + if(PokemonFlag1Struct2(monStruct2Ptr)) { + if (sub_806A564(monStruct2Ptr->unkA)) { + monStruct2Ptr->unk0 = 0; + } + else if (sub_806A538(monStruct2Ptr->unkA)) { + monStruct2Ptr->unk0 = 0; + } + } + } +} + +void sub_8068F80(void) +{ + Entity *leader = GetLeader(); + Dungeon *dungeon = gDungeon; + + dungeon->unk644.unk28 = 0; + dungeon->unk644.unk29 = 0; + dungeon->unk644.unk2F = 0; + dungeon->unkC0 = 0; + if (leader != NULL) { + bool8 isShop = (GetTileAtEntitySafe(leader)->terrainType & TERRAIN_TYPE_SHOP) != 0; + dungeon->unk644.unk54 = isShop; + dungeon->unk644.unk55 = isShop; + sub_804AC20(&leader->pos); + } +} + +static inline void ClearOnTeamFlag(PokemonStruct1 *mon) +{ + mon->unk0 &= ~(FLAG_ON_TEAM); +} + +static inline void ClearMonItemId(PokemonStruct1 *mon) +{ + mon->heldItem.id = ITEM_NOTHING; +} + +void sub_8068FE0(Entity *entity, s32 param_2, Entity *param_3) +{ + u16 joinId; + Entity EStack_a4; + s32 i; + s32 unkArg = (s16) param_2; + EntityInfo *entInfo = GetEntInfo(entity); + Tile *tile = GetTileAtEntitySafe(entity); + if (param_3 == NULL) { + sub_80457DC(&EStack_a4); + param_3 = &EStack_a4; + } + if (tile->monster == entity) { + tile->monster = NULL; + } + + ShowDungeonMapAtPos(entity->pos.x,entity->pos.y); + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + Entity *mon = gDungeon->activePokemon[i]; + if (mon != NULL && EntityIsValid(mon)) { + EntityInfo *info = GetEntInfo(mon); + if (info->aiTarget.aiTarget == entity) { + info->aiTarget.aiTarget = NULL; + } + } + } + if (entInfo->curseClassStatus.status == STATUS_DECOY) { + gDungeon->decoyIsActive = FALSE; + } + if (entInfo->frozenClassStatus.status == STATUS_WRAP || entInfo->frozenClassStatus.status == STATUS_WRAPPED) { + sub_8076CB4(entInfo->unk9C); + } + + sub_8078084(entity); + entity->unk22 = 0; + entity->isVisible = FALSE; + gLeaderPointer = NULL; + joinId = entInfo->joinedAt.id; + if (joinId == DUNGEON_JOIN_LOCATION_PARTNER && gDungeon->unk644.unk18 == 0) { + gDungeon->unk10 = 1; + entInfo->HP = 0; + SubstitutePlaceholderStringTags(gDungeon->faintStringBuffer,entity,0); + return; + } + + #ifndef NONMATCHING + // Yeah, this is just agbcc at its finest... + joinId = entity->isVisible; joinId = entity->unk22;joinId = entity->isVisible; joinId = entity->unk22;joinId = entity->isVisible; joinId = entity->unk22; + #endif + if (entInfo->isTeamLeader) { + sub_803E708(0x3c,0x49); + DisplayMessageLog(); + if (gDungeon->unk6 == 0) { + if (gDungeon->unk644.unk2A == 0 + && unkArg != 0x21c + && unkArg != 0x222 + && unkArg != 0x21e + && gDungeon->unk3A0D == 0 + && gDungeon->unk644.unk37 >= 0 + && gDungeon->unk644.unk34 != TRUE) + { + if (gDungeon->unk644.unk37 > 0) { + if (DisplayDungeonYesNoMessage(NULL,*gUnknown_80FE268,1) == 1) { + DisplayDungeonMessage(NULL,*gUnknown_80FE28C,1); + gDungeon->unk4 = 1; + gDungeon->unk6 = 1; + gDungeon->unk644.unk10 = 1; + gDungeon->unk644.unk37 -= 1; + return; + } + } + else { + DisplayDungeonMessage(NULL,*gUnknown_80FE2D0,1); + } + } + } + else { + gDungeon->unk4 = 1; + gDungeon->unk6 = 1; + gDungeon->unk644.unk10 = 1; + return; + } + + sub_8083AB0(unkArg,param_3,entity); + if (unkArg == 0x21f) { + EntityInfo *partnerInfo = NULL; + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + Entity *teamMon = gDungeon->teamPokemon[i]; + if (EntityIsValid(teamMon)) { + partnerInfo = GetEntInfo(teamMon); + if (partnerInfo->joinedAt.id == DUNGEON_JOIN_LOCATION_PARTNER) + break; + } + } + if (partnerInfo != NULL) { + PokemonStruct2 *partnerStruct = &gRecruitedPokemonRef->pokemon2[partnerInfo->teamIndex]; + sub_806C264(partnerInfo->teamIndex,partnerInfo); + if (sub_806A58C(partnerStruct->unkA) != 0) { + if (IsLevelResetTo1(gDungeon->unk644.dungeonLocation.id) == 0) { + xxx_pokemon2_to_pokemonstruct_index_808DF2C(partnerStruct->unkA, partnerStruct); + } + if (!IsMakuhitaTrainingMaze()) { + ClearMonItemId(&gRecruitedPokemonRef->pokemon[partnerStruct->unkA]); + } + } + partnerStruct->unk0 = 0; + } + } + } + + if (entInfo->isNotTeamMember) { + for (i = 0; i < entInfo->unk168; i++) { + gUnknown_202EE76[entInfo->unk167 + i] = 0; + } + } + else { + for (i = 0; i < entInfo->unk168; i++) { + gUnknown_202EE70[entInfo->unk167 + i] = 0; + } + } + + if (entInfo->joinedAt.id == DUNGEON_JOIN_LOCATION_CLIENT_POKEMON) { + gDungeon->unk10 = 2; + SubstitutePlaceholderStringTags(gDungeon->faintStringBuffer,entity,0); + } + else if (entInfo->joinedAt.id == DUNGEON_RESCUE_TEAM_BASE) { + gDungeon->unk10 = 3; + SubstitutePlaceholderStringTags(gDungeon->faintStringBuffer,entity,0); + } + + if (GetLeader() != NULL && unkArg != 0x21c && !entInfo->isTeamLeader && !gDungeon->unk10) { + sub_8084E00(entity,entInfo->monsterBehavior, unkArg == 500); + if (IS_DEOXYS_FORM_MONSTER(entInfo->apparentID) && !IsBossFight() && entInfo->isNotTeamMember) { + gDungeon->deoxysDefeat = 1; + DisplayDungeonLoggableMessageTrue(entity,*gUnknown_80FA580); + sub_803E178(); + sub_8049ED4(); + } + } + + if (!entInfo->isNotTeamMember) { + PokemonStruct2 *mon2Ptr = &gRecruitedPokemonRef->pokemon2[entInfo->teamIndex]; + sub_806C264(entInfo->teamIndex,entInfo); + if (sub_806A58C(mon2Ptr->unkA) != 0) { + bool8 uVar10; + + if (IsLevelResetTo1(gDungeon->unk644.dungeonLocation.id) == 0) { + xxx_pokemon2_to_pokemonstruct_index_808DF2C(mon2Ptr->unkA, mon2Ptr); + } + if (!IsMakuhitaTrainingMaze()) { + ClearMonItemId(&gRecruitedPokemonRef->pokemon[mon2Ptr->unkA]); + } + + uVar10 = FALSE; + if (entInfo->isTeamLeader) { + uVar10 = TRUE; + } + if (gDungeon->unk644.unk18 == 0 && entInfo->joinedAt.id == DUNGEON_JOIN_LOCATION_PARTNER) { + uVar10 = TRUE; + } + + if (!uVar10) { + ClearOnTeamFlag(&gRecruitedPokemonRef->pokemon[mon2Ptr->unkA]); + } + } + mon2Ptr->unk0 = 0; + } + + DeletePokemonDungeonSprite(entInfo->unk98); + gLeaderPointer = 0; + gDungeon->unkC = 1; + entity->type = ENTITY_NOTHING; + sub_8045ACC(); +}