diff --git a/asm/code_804FD30.s b/asm/code_804FD30.s deleted file mode 100644 index 227cb1211..000000000 --- a/asm/code_804FD30.s +++ /dev/null @@ -1,887 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - - thumb_func_start sub_8051A74 -sub_8051A74: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x4 - adds r4, r0, 0 - adds r6, r2, 0 - adds r7, r3, 0 - ldr r0, [sp, 0x20] - lsls r1, 24 - lsrs r1, 24 - mov r8, r1 - lsls r0, 24 - lsrs r0, 24 - mov r9, r0 - cmp r1, 0xF - bls _08051AA2 - ldrh r0, [r4] - ldr r1, _08051AB4 - ands r1, r0 - movs r0, 0x1 - orrs r1, r0 - strh r1, [r4] -_08051AA2: - mov r0, r8 - cmp r0, 0x45 - bls _08051AAA - b _08051D68 -_08051AAA: - lsls r0, 2 - ldr r1, _08051AB8 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08051AB4: .4byte 0x0000fffc -_08051AB8: .4byte _08051ABC - .align 2, 0 -_08051ABC: - .4byte _08051BF0 - .4byte _08051C0C - .4byte _08051D50 - .4byte _08051E1A - .4byte _08051C20 - .4byte _08051C54 - .4byte _08051C64 - .4byte _08051C74 - .4byte _08051C94 - .4byte _08051D00 - .4byte _08051C7E - .4byte _08051D10 - .4byte _08051D24 - .4byte _08051D50 - .4byte _08051D50 - .4byte _08051E1A - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051D68 - .4byte _08051C94 - .4byte _08051CD4 - .4byte _08051BD4 -_08051BD4: - ldr r0, _08051BFC - ldr r0, [r0] - ldr r2, _08051C00 - adds r1, r0, r2 - strh r6, [r1] - ldr r3, _08051C04 - adds r0, r3 - strh r7, [r0] - movs r0, 0xB - adds r1, r6, 0 - adds r2, r7, 0 - movs r3, 0 - bl sub_8051A24 -_08051BF0: - ldrh r1, [r4] - ldr r0, _08051C08 - ands r0, r1 - movs r1, 0x1 - movs r2, 0 - b _08051D42 - .align 2, 0 -_08051BFC: .4byte gDungeon -_08051C00: .4byte 0x00000684 -_08051C04: .4byte 0x00000686 -_08051C08: .4byte 0x0000fffc -_08051C0C: - ldrh r1, [r4] - ldr r0, _08051C18 - ands r0, r1 - ldr r1, _08051C1C - ands r0, r1 - b _08051D5A - .align 2, 0 -_08051C18: .4byte 0x0000fffc -_08051C1C: .4byte 0x0000feff -_08051C20: - ldrh r1, [r4] - ldr r0, _08051C44 - ands r0, r1 - movs r1, 0x1 - movs r2, 0 - orrs r0, r1 - strh r0, [r4] - ldr r0, _08051C48 - ldr r0, [r0] - ldr r3, _08051C4C - adds r1, r0, r3 - strh r6, [r1] - ldr r1, _08051C50 - adds r0, r1 - strh r7, [r0] - strb r2, [r4, 0x9] - b _08051E1A - .align 2, 0 -_08051C44: .4byte 0x0000fffc -_08051C48: .4byte gDungeon -_08051C4C: .4byte 0x0000e218 -_08051C50: .4byte 0x0000e21a -_08051C54: - ldrh r1, [r4] - ldr r0, _08051C60 - ands r0, r1 - movs r2, 0 - movs r1, 0x2 - b _08051D42 - .align 2, 0 -_08051C60: .4byte 0x0000fffc -_08051C64: - ldrh r1, [r4] - ldr r0, _08051C70 - ands r0, r1 - movs r1, 0x3 - b _08051D58 - .align 2, 0 -_08051C70: .4byte 0x0000fffc -_08051C74: - ldr r1, _08051C8C - movs r0, 0x1 - strb r0, [r1] - bl sub_8049840 -_08051C7E: - ldrh r1, [r4] - ldr r0, _08051C90 - ands r0, r1 - movs r1, 0x3 - orrs r0, r1 - b _08051D56 - .align 2, 0 -_08051C8C: .4byte gUnknown_202F1A8 -_08051C90: .4byte 0x0000fffc -_08051C94: - ldrh r1, [r4] - ldr r0, _08051CC0 - ands r0, r1 - movs r1, 0x1 - orrs r0, r1 - strh r0, [r4] - ldrh r0, [r4, 0x4] - movs r2, 0 - orrs r0, r1 - ldr r1, _08051CC4 - ands r0, r1 - strh r0, [r4, 0x4] - strb r2, [r4, 0x9] - ldr r0, _08051CC8 - ldr r0, [r0] - ldr r2, _08051CCC - adds r1, r0, r2 - strh r6, [r1] - ldr r3, _08051CD0 - adds r0, r3 - strh r7, [r0] - b _08051E1A - .align 2, 0 -_08051CC0: .4byte 0x0000fffc -_08051CC4: .4byte 0x0000fffd -_08051CC8: .4byte gDungeon -_08051CCC: .4byte 0x0000e21c -_08051CD0: .4byte 0x0000e21e -_08051CD4: - ldrh r1, [r4] - movs r2, 0x80 - lsls r2, 4 - adds r0, r2, 0 - orrs r0, r1 - ldr r1, _08051CF8 - ands r0, r1 - movs r1, 0x1 - movs r2, 0 - orrs r0, r1 - strh r0, [r4] - ldrh r1, [r4, 0x4] - ldr r0, _08051CFC - ands r0, r1 - strh r0, [r4, 0x4] - strb r2, [r4, 0x9] - b _08051E1A - .align 2, 0 -_08051CF8: .4byte 0x0000fffc -_08051CFC: .4byte 0x0000fffd -_08051D00: - ldrh r1, [r4] - ldr r0, _08051D0C - ands r0, r1 - movs r1, 0x1 - b _08051D58 - .align 2, 0 -_08051D0C: .4byte 0x0000fffc -_08051D10: - ldrh r1, [r4] - ldr r0, _08051D20 - ands r0, r1 - movs r1, 0x1 - movs r2, 0 - orrs r0, r1 - b _08051D3C - .align 2, 0 -_08051D20: .4byte 0x0000fffc -_08051D24: - ldrh r1, [r4] - ldr r0, _08051D4C - ands r0, r1 - movs r1, 0x1 - orrs r0, r1 - movs r2, 0x80 - lsls r2, 5 - adds r1, r2, 0 - orrs r0, r1 - movs r1, 0x10 - orrs r0, r1 - movs r2, 0 -_08051D3C: - movs r3, 0x80 - lsls r3, 4 - adds r1, r3, 0 -_08051D42: - orrs r0, r1 - strh r0, [r4] - strb r2, [r4, 0x9] - b _08051E1A - .align 2, 0 -_08051D4C: .4byte 0x0000fffc -_08051D50: - ldrh r1, [r4] - ldr r0, _08051D64 - ands r0, r1 -_08051D56: - movs r1, 0x10 -_08051D58: - orrs r0, r1 -_08051D5A: - strh r0, [r4] - movs r0, 0xFF - strb r0, [r4, 0x9] - b _08051E1A - .align 2, 0 -_08051D64: .4byte 0x0000fffc -_08051D68: - mov r0, r8 - subs r0, 0x10 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0xCB - bhi _08051E1A - mov r1, r8 - lsls r0, r1, 4 - ldr r1, _08051DA0 - adds r5, r0, r1 - ldrb r0, [r5, 0xC] - strb r0, [r4, 0x9] - ldrb r1, [r5] - cmp r1, 0 - beq _08051DB8 - mov r2, r9 - cmp r2, 0 - beq _08051DA4 - ldrb r0, [r5] - movs r1, 0x2 - ldrsh r3, [r5, r1] - ldr r1, [r5, 0x4] - str r1, [sp] - adds r1, r6, 0 - adds r2, r7, 0 - bl sub_805193C - b _08051DDC - .align 2, 0 -_08051DA0: .4byte gUnknown_80F6D20 -_08051DA4: - ldr r0, _08051DB0 - ldr r0, [r0] - ldr r2, _08051DB4 - adds r0, r2 - strb r1, [r0] - b _08051DDC - .align 2, 0 -_08051DB0: .4byte gDungeon -_08051DB4: .4byte 0x0000068b -_08051DB8: - ldr r2, [r5, 0x4] - cmp r2, 0 - beq _08051DDC - ldr r0, _08051E2C - ldr r1, [r0] - subs r0, r2, 0x1 - lsls r0, 2 - adds r0, r1, r0 - ldr r3, _08051E30 - adds r0, r3 - strh r6, [r0] - ldr r0, [r5, 0x4] - subs r0, 0x1 - lsls r0, 2 - adds r1, r0 - ldr r0, _08051E34 - adds r1, r0 - strh r7, [r1] -_08051DDC: - movs r1, 0x8 - ldrsh r0, [r5, r1] - cmp r0, 0 - beq _08051DF2 - ldrb r3, [r5, 0xA] - mov r1, r8 - str r1, [sp] - adds r1, r6, 0 - adds r2, r7, 0 - bl sub_8051998 -_08051DF2: - ldrb r0, [r5, 0xB] - cmp r0, 0x14 - beq _08051E08 - mov r2, r9 - cmp r2, 0 - beq _08051E08 - ldrb r3, [r5, 0xD] - adds r1, r6, 0 - adds r2, r7, 0 - bl sub_8051A24 -_08051E08: - ldrb r0, [r5, 0xE] - cmp r0, 0 - beq _08051E1A - ldrh r0, [r4] - ldr r1, _08051E38 - ands r1, r0 - movs r0, 0x2 - orrs r1, r0 - strh r1, [r4] -_08051E1A: - movs r0, 0 - add sp, 0x4 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_08051E2C: .4byte gDungeon -_08051E30: .4byte 0x0000e220 -_08051E34: .4byte 0x0000e222 -_08051E38: .4byte 0x0000fffc - thumb_func_end sub_8051A74 - - thumb_func_start sub_8051E3C -sub_8051E3C: - push {r4-r6,lr} - sub sp, 0x4 - movs r5, 0 -_08051E42: - movs r4, 0 - adds r6, r5, 0x1 -_08051E46: - adds r0, r4, 0 - adds r1, r5, 0 - bl GetTileMut - adds r2, r0, 0 - ldrb r0, [r2, 0xE] - cmp r0, 0xF - bls _08051E66 - adds r1, r0, 0 - movs r0, 0 - str r0, [sp] - adds r0, r2, 0 - adds r2, r4, 0 - adds r3, r5, 0 - bl sub_8051A74 -_08051E66: - adds r4, 0x1 - cmp r4, 0x37 - ble _08051E46 - adds r5, r6, 0 - cmp r5, 0x1F - ble _08051E42 - add sp, 0x4 - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end sub_8051E3C - - thumb_func_start sub_8051E7C -sub_8051E7C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x14 - mov r9, r0 - movs r1, 0x4 - ldrsh r0, [r0, r1] - mov r2, r9 - movs r3, 0x6 - ldrsh r1, [r2, r3] - subs r1, 0x1 - bl GetTileMut - str r0, [sp, 0x8] - ldrh r1, [r0] - movs r0, 0x80 - lsls r0, 5 - ands r0, r1 - cmp r0, 0 - bne _08051EB8 - ldr r0, _08051EB4 - ldr r1, [r0] - mov r0, r9 - bl LogMessageByIdWithPopupCheckUser - b _080520F6 - .align 2, 0 -_08051EB4: .4byte gUnknown_80FDDF0 -_08051EB8: - ldr r0, _08051EF0 - ldr r0, [r0] - ldr r1, _08051EF4 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08051EC8 - b _080520EC -_08051EC8: - mov r2, r9 - ldrh r1, [r2, 0x6] - subs r1, 0x1 - lsls r1, 16 - ldrh r0, [r2, 0x4] - orrs r0, r1 - str r0, [sp, 0x4] - mov r0, r9 - bl GetEntityRoom - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0xC] - mov r3, r9 - movs r1, 0x6 - ldrsh r0, [r3, r1] - adds r6, r0, 0 - subs r6, 0x15 - b _08051FE0 - .align 2, 0 -_08051EF0: .4byte gDungeon -_08051EF4: .4byte 0x00003a09 -_08051EF8: - mov r2, r9 - movs r3, 0x4 - ldrsh r0, [r2, r3] - adds r5, r0, 0 - subs r5, 0x14 - adds r0, 0x14 - adds r1, r6, 0x1 - str r1, [sp, 0x10] - cmp r5, r0 - bgt _08051FD8 - ldr r2, _080520C0 - mov r10, r2 -_08051F10: - mov r0, r10 - ldr r3, [r0] - ldr r1, _080520C4 - adds r0, r3, r1 - ldr r1, [r0] - subs r2, r5, r1 - mov r8, r2 - ldr r2, _080520C8 - adds r0, r3, r2 - ldr r2, [r0] - subs r7, r6, r2 - mov r0, r8 - cmp r0, 0 - blt _08051FCA - cmp r7, 0 - blt _08051FCA - cmp r0, 0x7 - bgt _08051FCA - cmp r7, 0x7 - bgt _08051FCA - adds r0, r1, 0x1 - cmp r5, r0 - blt _08051FCA - adds r0, r2, 0x1 - cmp r6, r0 - blt _08051FCA - ldr r1, _080520CC - adds r0, r3, r1 - ldr r0, [r0] - subs r0, 0x1 - cmp r5, r0 - bge _08051FCA - ldr r2, _080520D0 - adds r0, r3, r2 - ldr r0, [r0] - subs r0, 0x1 - cmp r6, r0 - bge _08051FCA - adds r0, r5, 0 - adds r1, r6, 0 - bl GetTileMut - adds r4, r0, 0 - ldrh r0, [r4] - movs r3, 0x80 - lsls r3, 1 - adds r1, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _08051F9A - mov r0, r10 - ldr r2, [r0] - lsls r1, r7, 1 - adds r1, r7 - lsls r1, 3 - mov r3, r8 - lsls r0, r3, 1 - add r0, r8 - lsls r0, 6 - adds r1, r0 - adds r2, r1 - ldr r1, _080520D4 - adds r0, r2, r1 - ldrh r0, [r0] - strh r0, [r4] - ldr r3, _080520D8 - adds r2, r3 - ldrh r0, [r2] - strh r0, [r4, 0x4] -_08051F9A: - mov r1, r10 - ldr r0, [r1] - mov r2, r8 - lsls r1, r2, 3 - adds r1, r7, r1 - ldr r3, _080520DC - adds r0, r3 - adds r0, r1 - ldrb r1, [r0] - movs r0, 0x1 - str r0, [sp] - adds r0, r4, 0 - adds r2, r5, 0 - adds r3, r6, 0 - bl sub_8051A74 - ldrh r1, [r4, 0x4] - movs r0, 0x3 - orrs r0, r1 - strh r0, [r4, 0x4] - ldr r0, [sp, 0xC] - cmp r0, 0xFF - beq _08051FCA - strb r0, [r4, 0x9] -_08051FCA: - adds r5, 0x1 - mov r2, r9 - movs r3, 0x4 - ldrsh r0, [r2, r3] - adds r0, 0x14 - cmp r5, r0 - ble _08051F10 -_08051FD8: - ldr r6, [sp, 0x10] - mov r1, r9 - movs r2, 0x6 - ldrsh r0, [r1, r2] -_08051FE0: - adds r0, 0x13 - cmp r6, r0 - ble _08051EF8 - mov r3, r9 - movs r1, 0x6 - ldrsh r0, [r3, r1] - adds r6, r0, 0 - subs r6, 0x15 - adds r0, 0x13 - ldr r7, _080520C0 - cmp r6, r0 - bgt _0805207A -_08051FF8: - mov r2, r9 - movs r3, 0x4 - ldrsh r0, [r2, r3] - adds r5, r0, 0 - subs r5, 0x14 - adds r0, 0x14 - adds r1, r6, 0x1 - str r1, [sp, 0x10] - cmp r5, r0 - bgt _0805206C - ldr r7, _080520C0 -_0805200E: - ldr r0, _080520C0 - ldr r4, [r0] - ldr r2, _080520C4 - adds r0, r4, r2 - ldr r2, [r0] - subs r1, r5, r2 - ldr r3, _080520C8 - adds r0, r4, r3 - ldr r3, [r0] - subs r0, r6, r3 - cmp r1, 0 - blt _0805205E - cmp r0, 0 - blt _0805205E - cmp r1, 0x7 - bgt _0805205E - cmp r0, 0x7 - bgt _0805205E - adds r0, r2, 0x1 - cmp r5, r0 - blt _0805205E - adds r0, r3, 0x1 - cmp r6, r0 - blt _0805205E - ldr r1, _080520CC - adds r0, r4, r1 - ldr r0, [r0] - subs r0, 0x1 - cmp r5, r0 - bge _0805205E - ldr r2, _080520D0 - adds r0, r4, r2 - ldr r0, [r0] - subs r0, 0x1 - cmp r6, r0 - bge _0805205E - adds r0, r5, 0 - adds r1, r6, 0 - bl sub_80498A8 -_0805205E: - adds r5, 0x1 - mov r3, r9 - movs r1, 0x4 - ldrsh r0, [r3, r1] - adds r0, 0x14 - cmp r5, r0 - ble _0805200E -_0805206C: - ldr r6, [sp, 0x10] - mov r2, r9 - movs r3, 0x6 - ldrsh r0, [r2, r3] - adds r0, 0x13 - cmp r6, r0 - ble _08051FF8 -_0805207A: - ldr r0, [r7] - ldr r1, _080520E0 - adds r0, r1 - movs r1, 0x1 - strb r1, [r0] - ldr r2, [sp, 0x8] - ldrh r1, [r2] - ldr r0, _080520E4 - ands r0, r1 - strh r0, [r2] - mov r3, r9 - movs r1, 0x4 - ldrsh r0, [r3, r1] - movs r2, 0x6 - ldrsh r1, [r3, r2] - subs r1, 0x1 - bl sub_80498A8 - bl sub_8049B8C - bl sub_8049ED4 - add r0, sp, 0x4 - bl sub_80429FC - ldr r0, _080520E8 - ldr r1, [r0] - mov r0, r9 - bl LogMessageByIdWithPopupCheckUser - movs r0, 0x14 - movs r1, 0x3C - bl sub_803E708 - b _080520F6 - .align 2, 0 -_080520C0: .4byte gDungeon -_080520C4: .4byte 0x0000e250 -_080520C8: .4byte 0x0000e254 -_080520CC: .4byte 0x0000e258 -_080520D0: .4byte 0x0000e25c -_080520D4: .4byte 0x0000e27c -_080520D8: .4byte 0x0000e280 -_080520DC: .4byte 0x0000e87c -_080520E0: .4byte 0x00003a09 -_080520E4: .4byte 0x0000efef -_080520E8: .4byte gUnknown_80FDDD0 -_080520EC: - ldr r0, _08052108 - ldr r1, [r0] - mov r0, r9 - bl LogMessageByIdWithPopupCheckUser -_080520F6: - 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 -_08052108: .4byte gUnknown_80FDDF0 - thumb_func_end sub_8051E7C - - thumb_func_start sub_805210C -sub_805210C: - push {r4-r7,lr} - lsls r0, 24 - lsrs r5, r0, 24 - movs r3, 0 - ldr r7, _080521B4 - movs r4, 0x1 - ldr r2, [r7] -_0805211A: - ldrb r1, [r2] - adds r0, r4, 0 - ands r0, r1 - cmp r0, 0 - beq _0805212A - ldrb r0, [r2, 0x2] - cmp r0, r5 - beq _080521C8 -_0805212A: - adds r2, 0x4 - adds r3, 0x1 - cmp r3, 0x13 - ble _0805211A - movs r3, 0 - ldr r0, _080521B8 - ldr r4, [r0] - movs r6, 0x1 -_0805213A: - movs r0, 0x64 - adds r2, r3, 0 - muls r2, r0 - adds r0, r2, r4 - ldr r1, _080521BC - adds r0, r1 - ldrb r1, [r0] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _0805216C - adds r0, r2, r4 - ldr r1, _080521C0 - adds r0, r1 - ldrb r1, [r0] - adds r0, r6, 0 - ands r0, r1 - adds r1, r2, r4 - cmp r0, 0 - beq _0805216C - ldr r2, _080521C4 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, r5 - beq _080521C8 -_0805216C: - adds r3, 0x1 - cmp r3, 0x3 - ble _0805213A - movs r3, 0 - ldr r0, _080521B8 - ldr r4, [r0] -_08052178: - movs r0, 0x58 - muls r0, r3 - adds r2, r0, r4 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08052196 - adds r0, r2, 0 - adds r0, 0x28 - ldrb r0, [r0] - cmp r0, 0 - beq _08052196 - cmp r0, r5 - beq _080521C8 -_08052196: - adds r3, 0x1 - movs r0, 0xCE - lsls r0, 1 - cmp r3, r0 - ble _08052178 - ldr r0, [r7] - lsls r1, r5, 1 - adds r0, 0x50 - adds r0, r1 - ldrh r0, [r0] - cmp r0, 0 - bne _080521C8 - movs r0, 0 - b _080521CA - .align 2, 0 -_080521B4: .4byte gTeamInventoryRef -_080521B8: .4byte gRecruitedPokemonRef -_080521BC: .4byte 0x00008df8 -_080521C0: .4byte 0x00008e38 -_080521C4: .4byte 0x00008e3a -_080521C8: - movs r0, 0x1 -_080521CA: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_805210C - - .align 2,0 diff --git a/asm/code_807E5AC.s b/asm/code_807E5AC.s index eaf80cb03..084893b9e 100644 --- a/asm/code_807E5AC.s +++ b/asm/code_807E5AC.s @@ -2497,7 +2497,7 @@ _0807FA56: movs r0, 0x11 mov r1, sp movs r2, 0x2 - bl sub_8045684 + bl SpawnTrap cmp r0, 0 beq _0807FA88 str r0, [r4, 0x14] @@ -2508,7 +2508,7 @@ _0807FA56: _0807FA72: mov r1, sp movs r2, 0 - bl sub_8045684 + bl SpawnTrap cmp r0, 0 beq _0807FA88 str r0, [r4, 0x14] diff --git a/include/code_80450F8.h b/include/code_80450F8.h index f86f4a608..e3bfc4be2 100644 --- a/include/code_80450F8.h +++ b/include/code_80450F8.h @@ -3,8 +3,8 @@ #include "structs/dungeon_entity.h" -Entity *sub_8045684(u8 trapID, DungeonPos *pos, u8 c); +Entity *SpawnTrap(u8 trapID, DungeonPos *pos, u8 c); Entity *sub_8045708(DungeonPos *pos); void sub_80457DC(Entity* ent); -#endif // GUARD_CODE_80227B8_H \ No newline at end of file +#endif // GUARD_CODE_80227B8_H diff --git a/include/dungeon_generation.h b/include/dungeon_generation.h index 10a187d2b..9e37dd96a 100644 --- a/include/dungeon_generation.h +++ b/include/dungeon_generation.h @@ -53,5 +53,11 @@ enum SecondaryStructureType { void GenerateFloor(void); bool8 StairsAlwaysReachable(s32 stairsX, s32 stairsY, bool8 markUnreachable); +void sub_804EB30(void); +void sub_8051E3C(void); + +#include "structs/dungeon_entity.h" + +void sub_8051E7C(Entity *pokemon); #endif diff --git a/include/pokemon.h b/include/pokemon.h index 4989129cd..27abf917a 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -105,6 +105,11 @@ static inline bool8 PokemonFlag1(PokemonStruct1 *mon) return (mon->unk0 >> (FLAG_UNK_1 - 1)) & 1; } +static inline bool8 PokemonFlag1Struct2(PokemonStruct2 *mon) +{ + return (mon->unk0 >> (FLAG_UNK_1 - 1)) & 1; +} + static inline bool8 PokemonFlag2(PokemonStruct1 *mon) { return (mon->unk0 >> (FLAG_ON_TEAM - 1)) & 1; diff --git a/ld_script.txt b/ld_script.txt index b2e85654e..79bfe76e5 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -227,7 +227,6 @@ SECTIONS { src/dungeon_map_access.o(.text); src/tile_types.o(.text); src/dungeon_generation.o(.text); - asm/code_804FD30.o(.text); src/dungeon_message.o(.text); src/dungeon_move.o(.text); src/move_actions.o(.text); diff --git a/src/code_80450F8.c b/src/code_80450F8.c index 38f2308b9..4ef646b6b 100644 --- a/src/code_80450F8.c +++ b/src/code_80450F8.c @@ -524,7 +524,7 @@ Entity *sub_804550C(s16 a) ); } -Entity *sub_8045684(u8 trapID, DungeonPos *pos, u8 c) +Entity *SpawnTrap(u8 trapID, DungeonPos *pos, u8 c) { Entity *entity; s32 i; diff --git a/src/dungeon_generation.c b/src/dungeon_generation.c index 84019d8b0..bdb438a9c 100644 --- a/src/dungeon_generation.c +++ b/src/dungeon_generation.c @@ -3,10 +3,13 @@ #include "file_system.h" #include "tile_types.h" #include "dungeon_map_access.h" +#include "dungeon_message.h" #include "dungeon_random.h" +#include "dungeon_util.h" #include "items.h" #include "pokemon.h" #include "code_80450F8.h" +#include "code_803E668.h" #include "constants/direction.h" #include "constants/item.h" #include "constants/monster.h" @@ -17,15 +20,15 @@ extern const u8 gUnknown_80F6DCC[]; extern struct FileArchive gDungeonFileArchive; -extern void ResetFloor(void); -extern void ResetFloor(void); -extern void GenerateOneRoomMonsterHouseFloor(void); -extern void ResolveInvalidSpawns(void); -extern void GenerateTwoRoomsWithMonsterHouseFloor(void); +extern void sub_80460F8(DungeonPos *, Item *, u32); +extern s32 sub_803DA20(s16 species); +extern void sub_8049840(void); +extern void sub_80429FC(DungeonPos *r0); +extern void sub_80498A8(s32, s32); +extern void sub_8049B8C(void); extern u8 GetFloorType(); extern void sub_806C330(s32 a0, s32 a1, s16 a2, u8 a3); -extern const DungeonPos gAdjacentTileOffsets[]; extern const bool8 gUnknown_80F6DD5[][NUM_DIRECTIONS]; enum CardinalDirection @@ -71,48 +74,50 @@ struct GridCell #define GRID_CELL_LEN 15 +static void ResetFloor(void); static void sub_804C790(s32 gridSizeX, s32 gridSizeY, s32 fixedRoomSizeX, s32 fixedRoomSizeY, s32 fixedRoomNumber, FloorProperties *floorProps); static void CreateRoomsAndAnchorsForFixedFloor(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, s32 a5, s32 fixedRoomSizeX, s32 fixedRoomSizeY); -void sub_8051438(struct GridCell *gridCell, s32 fixedRoomNumber); -void sub_8051288(s32 fixedRoomNumber); -void GetGridPositions(s32 *listX, s32 *listY, s32 gridSizeX, s32 gridSizeY); -void InitDungeonGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY); -void GenerateRoomImperfections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY); -void GenerateSecondaryStructure(struct GridCell *gridCell); -void GenerateSecondaryStructures(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY); -void AssignRooms(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 roomsNumber); -void CreateRoomsAndAnchors(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, u32 roomFlags); -void CreateGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, bool8 disableRoomMerging); -void EnsureConnectedGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY); +static void sub_8051438(struct GridCell *gridCell, s32 fixedRoomNumber); +static void sub_8051288(s32 fixedRoomNumber); +static void GetGridPositions(s32 *listX, s32 *listY, s32 gridSizeX, s32 gridSizeY); +static void InitDungeonGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY); +static void GenerateRoomImperfections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY); +static void GenerateSecondaryStructure(struct GridCell *gridCell); +static void GenerateSecondaryStructures(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY); +static void AssignRooms(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 roomsNumber); +static void CreateRoomsAndAnchors(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, u32 roomFlags); +static void CreateGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, bool8 disableRoomMerging); +static void EnsureConnectedGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY); static void AssignRandomGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, FloorProperties *floorProps); -void AssignGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 cursorX, s32 cursorY, FloorProperties *floorProps); -void GenerateMazeRoom(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance); -void GenerateMaze(struct GridCell *gridCell, bool8 useSecondaryTerrain); -void GenerateMazeLine(s32 x0, s32 y0, s32 xMin, s32 yMin, s32 xMax, s32 yMax, bool8 useSecondaryTerrain, u32 roomIndex); -void GenerateKecleonShop(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance); -void GenerateMonsterHouse(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance); -void GenerateExtraHallways(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 numExtraHallways); +static void AssignGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 cursorX, s32 cursorY, FloorProperties *floorProps); +static void GenerateMazeRoom(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance); +static void GenerateMaze(struct GridCell *gridCell, bool8 useSecondaryTerrain); +static void GenerateMazeLine(s32 x0, s32 y0, s32 xMin, s32 yMin, s32 xMax, s32 yMax, bool8 useSecondaryTerrain, u32 roomIndex); +static void GenerateKecleonShop(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance); +static void GenerateMonsterHouse(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance); +static void GenerateExtraHallways(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 numExtraHallways); static void MergeRoomsVertically(s32 roomX, s32 roomY1, s32 room_dy, struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]); -void CreateHallway(s32 startX, s32 startY, s32 endX, s32 endY, bool8 vertical, s32 turnX, s32 turnY); -void EnsureImpassableTilesAreWalls(void); -void sub_804FC74(void); -void sub_804EB30(void); -void FinalizeJunctions(void); -void sub_804B534(s32 a0, s32 a1, s32 a2, s32 a3); -bool8 ProcessFixedRoom(s32 fixedRoomNumber, FloorProperties *floorProps); -void GenerateStandardFloor(s32 a0, s32 a1, FloorProperties *a2); -void GenerateOuterRingFloor(FloorProperties *a0); -void GenerateCrossroadsFloor(FloorProperties *a0); -void GenerateLineFloor(FloorProperties *a0); -void GenerateCrossFloor(FloorProperties *a0); -void GenerateBeetleFloor(FloorProperties *a0); -void GenerateOuterRoomsFloor(s32 gridSizeX_, s32 gridSizeY_, FloorProperties *floorProps); -void sub_8051654(FloorProperties *floorProps); -void GenerateSecondaryTerrainFormations(u32 flag, FloorProperties *floorProps); -void SpawnNonEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse); -void SpawnEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse); -bool8 StairsAlwaysReachable(s32 stairsX, s32 stairsY, bool8 markUnreachable); -void ResetInnerBoundaryTileRows(void); +static void CreateHallway(s32 startX, s32 startY, s32 endX, s32 endY, bool8 vertical, s32 turnX, s32 turnY); +static void EnsureImpassableTilesAreWalls(void); +static void sub_804FC74(void); +static void FinalizeJunctions(void); +static void sub_804B534(s32 a0, s32 a1, s32 a2, s32 a3); +static bool8 ProcessFixedRoom(s32 fixedRoomNumber, FloorProperties *floorProps); +static void GenerateStandardFloor(s32 a0, s32 a1, FloorProperties *a2); +static void GenerateOuterRingFloor(FloorProperties *a0); +static void GenerateCrossroadsFloor(FloorProperties *a0); +static void GenerateLineFloor(FloorProperties *a0); +static void GenerateCrossFloor(FloorProperties *a0); +static void GenerateBeetleFloor(FloorProperties *a0); +static void GenerateOuterRoomsFloor(s32 gridSizeX_, s32 gridSizeY_, FloorProperties *floorProps); +static void sub_8051654(FloorProperties *floorProps); +static void GenerateSecondaryTerrainFormations(u32 flag, FloorProperties *floorProps); +static void SpawnNonEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse); +static void SpawnEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse); +static void ResetInnerBoundaryTileRows(void); +static void GenerateOneRoomMonsterHouseFloor(void); +static void ResolveInvalidSpawns(void); +static void GenerateTwoRoomsWithMonsterHouseFloor(void); EWRAM_DATA bool8 gUnknown_202F1A8 = FALSE; static EWRAM_DATA bool8 sInvalidGeneration = FALSE; @@ -450,7 +455,7 @@ void GenerateFloor(void) CloseFile(gDungeon->unk13568); } -void sub_804B534(s32 xStart, s32 yStart, s32 maxX, s32 maxY) +static void sub_804B534(s32 xStart, s32 yStart, s32 maxX, s32 maxY) { s32 x, y; for (x = xStart; x < maxX; x++) { @@ -490,7 +495,7 @@ void sub_804B534(s32 xStart, s32 yStart, s32 maxX, s32 maxY) * 6. Create additional "extra hallways" with random walks outside of existing rooms * 7. Finalize extra room details with imperfections (unused in vanilla?), and structures with secondary terrain */ -void GenerateStandardFloor(s32 gridSizeX, s32 gridSizeY, FloorProperties *floorProps) +static void GenerateStandardFloor(s32 gridSizeX, s32 gridSizeY, FloorProperties *floorProps) { struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; s32 listX[GRID_CELL_LEN]; @@ -519,7 +524,7 @@ void GenerateStandardFloor(s32 gridSizeX, s32 gridSizeY, FloorProperties *floorP } // GenerateOuterRingFloor - Generates on a 6x4 grid, with the outer border of grid cells being hallways and the inner 4x2 grid being rooms. -void GenerateOuterRingFloor(FloorProperties *floorProps) +static void GenerateOuterRingFloor(FloorProperties *floorProps) { struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; s32 listX[GRID_CELL_LEN]; @@ -668,7 +673,7 @@ void GenerateOuterRingFloor(FloorProperties *floorProps) * GenerateCrossroadsFloor - Generates a floor layout with hallways on the inside and rooms on the outside, with empty corners. * Also nicknamed "Ladder Layout" by some. */ -void GenerateCrossroadsFloor(FloorProperties *floorProps) +static void GenerateCrossroadsFloor(FloorProperties *floorProps) { struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; s32 listX[GRID_CELL_LEN]; @@ -799,7 +804,7 @@ void GenerateCrossroadsFloor(FloorProperties *floorProps) } // GenerateLineFloor - Generates a floor layout with 5 grid cells in a horizontal line. -void GenerateLineFloor(FloorProperties *floorProps) +static void GenerateLineFloor(FloorProperties *floorProps) { struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; s32 listX[GRID_CELL_LEN]; @@ -837,7 +842,7 @@ void GenerateLineFloor(FloorProperties *floorProps) } // GenerateCrossFloor - Generates a floor layout with 5 rooms arranged in a "plus" or "cross" configuration. -void GenerateCrossFloor(FloorProperties *floorProps) +static void GenerateCrossFloor(FloorProperties *floorProps) { struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; s32 listX[GRID_CELL_LEN]; @@ -893,7 +898,7 @@ void GenerateCrossFloor(FloorProperties *floorProps) // GenerateBeetleFloor - Generates a floor layout in a "beetle" shape, with a // 3x3 grid of rooms, a merged center column, and hallways along each row -void GenerateBeetleFloor(FloorProperties *floorProps) +static void GenerateBeetleFloor(FloorProperties *floorProps) { struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; s32 listX[GRID_CELL_LEN]; @@ -976,7 +981,7 @@ static void MergeRoomsVertically(s32 roomX, s32 roomY1, s32 room_dy, struct Grid // GenerateOuterRoomsFloor - Generates a floor layout with a ring of rooms and nothing on the interior. // This layout is bugged and will not properly connect rooms for gridSizeX < 3. -void GenerateOuterRoomsFloor(s32 gridSizeX_, s32 gridSizeY_, FloorProperties *floorProps) +static void GenerateOuterRoomsFloor(s32 gridSizeX_, s32 gridSizeY_, FloorProperties *floorProps) { struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; s32 listX[GRID_CELL_LEN]; @@ -1054,7 +1059,7 @@ void GenerateOuterRoomsFloor(s32 gridSizeX_, s32 gridSizeY_, FloorProperties *fl GenerateSecondaryStructures(grid, gridSizeX, gridSizeY); } -bool8 ProcessFixedRoom(s32 fixedRoomNumber, FloorProperties *floorProps) +static bool8 ProcessFixedRoom(s32 fixedRoomNumber, FloorProperties *floorProps) { s32 fixedRoomSizeX = ((struct FixedRoomsData **)(gDungeon->unk13568->data))[fixedRoomNumber]->x; s32 fixedRoomSizeY = ((struct FixedRoomsData **)(gDungeon->unk13568->data))[fixedRoomNumber]->y; @@ -1118,7 +1123,7 @@ static void sub_804C790(s32 gridSizeX, s32 gridSizeY, s32 fixedRoomSizeX, s32 fi * GenerateOneRoomMonsterHouseFloor - Generates a floor layout with just one large room which is a Monster House. * This generator is used as a fallback if the event generation fails too many times. */ -void GenerateOneRoomMonsterHouseFloor(void) +static void GenerateOneRoomMonsterHouseFloor(void) { s32 x, y; struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; @@ -1144,7 +1149,7 @@ void GenerateOneRoomMonsterHouseFloor(void) } // GenerateTwoRoomsWithMonsterHouseFloor - Generates a floor layout with two rooms (left and right), with one being a Monster House. -void GenerateTwoRoomsWithMonsterHouseFloor(void) +static void GenerateTwoRoomsWithMonsterHouseFloor(void) { struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN]; s32 listX[GRID_CELL_LEN]; @@ -1228,7 +1233,7 @@ void GenerateTwoRoomsWithMonsterHouseFloor(void) * * Repeat 4-8 until a check fails. */ -void GenerateExtraHallways(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 numExtraHallways) +static void GenerateExtraHallways(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 numExtraHallways) { s32 i, j; @@ -1426,7 +1431,7 @@ void GenerateExtraHallways(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s } // GetGridPositions - Determines the starting positions of grid cells based on the given floor grid dimensions -void GetGridPositions(s32 *listX, s32 *listY, s32 gridSizeX, s32 gridSizeY) +static void GetGridPositions(s32 *listX, s32 *listY, s32 gridSizeX, s32 gridSizeY) { s32 i, sum; @@ -1449,7 +1454,7 @@ void GetGridPositions(s32 *listX, s32 *listY, s32 gridSizeX, s32 gridSizeY) * The dungeon grid is an array of grid cells stored in column-major order * (to give contiguous storage to cells with the same x value), with a fixed column size of 15. */ -void InitDungeonGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY) +static void InitDungeonGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY) { s32 x, y; @@ -1502,7 +1507,7 @@ void InitDungeonGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gri */ #define ROOM_BITS_COUNT 256 // Despite max rooms being 32, randomRoomBits can hold up to 256 possible rooms -void AssignRooms(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 roomsNumber) +static void AssignRooms(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 roomsNumber) { bool8 randomRoomBits[ROOM_BITS_COUNT]; s32 i, nShuffles; @@ -1602,7 +1607,7 @@ void AssignRooms(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSiz * * If the room is an anchor, a single tile is placed with a hallway indicator for later. */ -void CreateRoomsAndAnchors(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, u32 roomFlags) +static void CreateRoomsAndAnchors(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, u32 roomFlags) { s32 roomNumber = 0; s32 x, y; @@ -1748,7 +1753,7 @@ void CreateRoomsAndAnchors(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s * * If a room doesn't meet the conditions for the secondary structure chosen, it will be left unchanged. */ -void GenerateSecondaryStructures(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY) +static void GenerateSecondaryStructures(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY) { s32 x, y; @@ -1799,7 +1804,7 @@ static void AssignRandomGridCellConnections(struct GridCell grid[GRID_CELL_LEN][ * */ -void AssignGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 cursorX, s32 cursorY, FloorProperties *floorProps) +static void AssignGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 cursorX, s32 cursorY, FloorProperties *floorProps) { s32 i; s32 x = cursorX; @@ -2031,7 +2036,7 @@ void AssignGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN * Merged rooms take up the full tile space occupied between the two rooms. * */ -void CreateGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, bool8 disableRoomMerging) +static void CreateGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY, bool8 disableRoomMerging) { s32 x, y; @@ -2407,7 +2412,7 @@ void CreateGridCellConnections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN * We pick a random corner, derive our direction from the movement being used, then seek up to 10 tiles for one to replace. * We avoid getting too close to hallways and ensure our cardinal neighbor tiles match what we expect for open terrain. */ -void GenerateRoomImperfections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY) +static void GenerateRoomImperfections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY) { s32 x, y; @@ -2620,7 +2625,7 @@ void GenerateRoomImperfections(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN * * The vertical flag specifies whether the hallway is being generated horizontally or vertically */ -void CreateHallway(s32 x, s32 y, s32 endX, s32 endY, bool8 vertical, s32 turnX_, s32 turnY_) +static void CreateHallway(s32 x, s32 y, s32 endX, s32 endY, bool8 vertical, s32 turnX_, s32 turnY_) { s32 startX = x; s32 startY = y; @@ -2780,7 +2785,7 @@ void CreateHallway(s32 x, s32 y, s32 endX, s32 endY, bool8 vertical, s32 turnX_, * * If no eligible room is found, the room will be removed and filled back in. */ -void EnsureConnectedGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY) +static void EnsureConnectedGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 *listX, s32 *listY) { s32 x, y; @@ -2927,7 +2932,7 @@ void EnsureConnectedGrid(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 * * Otherwise, the tile will be a wall. */ -void SetTerrainObstacleChecked(Tile *tile, bool8 useSecondaryTerrain, u8 roomIndex) +static void SetTerrainObstacleChecked(Tile *tile, bool8 useSecondaryTerrain, u8 roomIndex) { SetTerrainWall(tile); if (useSecondaryTerrain && tile->room == roomIndex) { @@ -2962,7 +2967,7 @@ void SetTerrainObstacleChecked(Tile *tile, bool8 useSecondaryTerrain, u8 roomInd * X | X X X * X | X X X */ -void FinalizeJunctions(void) +static void FinalizeJunctions(void) { s32 x, y; @@ -3066,7 +3071,7 @@ void sub_804EB30(void) * The kecleon shop will occupy the whole room interior, with a one tile margin from the room walls. * Kecleon shop tiles restrict monster and stair spawns. */ -void GenerateKecleonShop(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance) +static void GenerateKecleonShop(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance) { s16 listX[GRID_CELL_LEN]; s16 listY[GRID_CELL_LEN]; @@ -3224,7 +3229,7 @@ void GenerateKecleonShop(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 * A Monster House will be generated in a random room that's valid, connected, not merged, not a maze room, and * is not a few unknown conditions. */ -void GenerateMonsterHouse(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance) +static void GenerateMonsterHouse(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance) { // To spawn a monster house on this floor: // - It must meet the probability chance @@ -3351,7 +3356,7 @@ void GenerateMonsterHouse(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s3 * Candidate maze rooms have to be valid, connected, have odd dimensions, and not have any other features. * If any candidates are found, the game will select one of these rooms and call GenerateMaze. */ -void GenerateMazeRoom(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance) +static void GenerateMazeRoom(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gridSizeX, s32 gridSizeY, s32 chance) { bool8 values[256]; s32 i; @@ -3459,7 +3464,7 @@ void GenerateMazeRoom(struct GridCell grid[GRID_CELL_LEN][GRID_CELL_LEN], s32 gr * surrounded by striples of obstacles (maze walls). * */ -void GenerateMaze(struct GridCell *gridCell, bool8 useSecondaryTerrain) +static void GenerateMaze(struct GridCell *gridCell, bool8 useSecondaryTerrain) { s32 curX, curY; u8 roomIndex; @@ -3550,7 +3555,7 @@ void GenerateMaze(struct GridCell *gridCell, bool8 useSecondaryTerrain) * If an open tile is found, an obstacle is placed between the two tiles, and (x0, y0) moves to the new open tile. * This process continues until no valid open tile can be found. */ -void GenerateMazeLine(s32 x0, s32 y0, s32 xMin, s32 yMin, s32 xMax, s32 yMax, bool8 useSecondaryTerrain, u32 roomIndex) +static void GenerateMazeLine(s32 x0, s32 y0, s32 xMin, s32 yMin, s32 xMax, s32 yMax, bool8 useSecondaryTerrain, u32 roomIndex) { while (1) { s32 direction = DungeonRandInt(NUM_CARDINAL_DIRECTIONS); @@ -3630,7 +3635,7 @@ void GenerateMazeLine(s32 x0, s32 y0, s32 xMin, s32 yMin, s32 xMax, s32 yMax, bo } } -void SetTerrainSecondaryWithFlag(Tile *tile, u32 additionalFlag) +static void SetTerrainSecondaryWithFlag(Tile *tile, u32 additionalFlag) { SetTerrainSecondary(tile); tile->terrainType |= additionalFlag; @@ -3639,7 +3644,7 @@ void SetTerrainSecondaryWithFlag(Tile *tile, u32 additionalFlag) /* * SetSpawnFlag5 - Sets unknown spawn flag 0x5 on all tiles in a room */ -void SetSpawnFlag5(struct GridCell *gridCell) +static void SetSpawnFlag5(struct GridCell *gridCell) { s32 x, y; @@ -3653,7 +3658,7 @@ void SetSpawnFlag5(struct GridCell *gridCell) /* * IsNextToHallway - Checks if a tile DungeonPos is either in a hallway or next to one. */ -bool8 IsNextToHallway(s32 x, s32 y) +static bool8 IsNextToHallway(s32 x, s32 y) { s32 offsetX, offsetY; s32 posX, posY; @@ -3683,7 +3688,7 @@ bool8 IsNextToHallway(s32 x, s32 y) } // See GenerateSecondaryStructures for more information. -void GenerateSecondaryStructure(struct GridCell *gridCell) +static void GenerateSecondaryStructure(struct GridCell *gridCell) { switch (DungeonRandInt(6)) { // Generate a "split room" with two sides separated by a line of water/lava @@ -3888,7 +3893,7 @@ void GenerateSecondaryStructure(struct GridCell *gridCell) * * A tile marked for an item also must not have a trap there */ -void ResolveInvalidSpawns(void) +static void ResolveInvalidSpawns(void) { s32 x, y; @@ -3919,7 +3924,7 @@ void ResolveInvalidSpawns(void) } // Converts Secondary terrain to both secondary and normal. Possibly to note that it's a water tile? -void sub_804FC74(void) +static void sub_804FC74(void) { s32 x, y; @@ -3935,7 +3940,7 @@ void sub_804FC74(void) /* * EnsureImpassableTilesAreWalls - Force all tiles with the impassable flag to be set as walls. */ -void EnsureImpassableTilesAreWalls(void) +static void EnsureImpassableTilesAreWalls(void) { s32 x, y; @@ -3948,7 +3953,7 @@ void EnsureImpassableTilesAreWalls(void) } } -void ResetTile(Tile *tile) +static void ResetTile(Tile *tile) { tile->terrainType = 0; tile->spawnOrVisibilityFlags = 0; @@ -3977,7 +3982,7 @@ static inline bool8 PosIsOutOfBounds(s32 x, s32 y) return FALSE; } -void ResetFloor(void) +static void ResetFloor(void) { s32 x, y; @@ -4028,7 +4033,7 @@ struct PositionU8 /* * ShuffleSpawnPositions - Randomly shuffle an array of spawn positions */ -void ShuffleSpawnPositions(struct PositionU8 *spawns, s32 count) +static void ShuffleSpawnPositions(struct PositionU8 *spawns, s32 count) { s32 i; // Do twice as many swaps as there are items in the array @@ -4058,7 +4063,7 @@ void ShuffleSpawnPositions(struct PositionU8 *spawns, s32 count) */ extern const s16 gUnknown_80F4DA0; extern const s16 gUnknown_80F4DA4; -void SpawnNonEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse) +static void SpawnNonEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse) { struct PositionU8 validSpawns[DUNGEON_MAX_SIZE_X * DUNGEON_MAX_SIZE_Y]; s32 count; @@ -4394,7 +4399,7 @@ void SpawnNonEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse) /* * SpawnEnemies - Spawns all enemies, including those in forced monster houses */ -void SpawnEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse) +static void SpawnEnemies(FloorProperties *floorProps, bool8 isEmptyMonsterHouse) { struct PositionU8 validSpawns[DUNGEON_MAX_SIZE_X * DUNGEON_MAX_SIZE_Y]; s32 count; @@ -4590,7 +4595,7 @@ extern const s32 gUnknown_80F6DF8[8]; // https://decomp.me/scratch/sA4YH - Blue // https://decomp.me/scratch/SNyV8 - Sky #ifdef NONMATCHING -void GenerateSecondaryTerrainFormations(u32 flag, FloorProperties *floorProps) +static void GenerateSecondaryTerrainFormations(u32 flag, FloorProperties *floorProps) { s32 densityN; s32 x, y; @@ -4848,7 +4853,7 @@ void GenerateSecondaryTerrainFormations(u32 flag, FloorProperties *floorProps) } #else -NAKED void GenerateSecondaryTerrainFormations(u32 flag, FloorProperties *floorProps) +NAKED static void GenerateSecondaryTerrainFormations(u32 flag, FloorProperties *floorProps) { asm_unified("\n" " push {r4-r7,lr}\n" @@ -5841,7 +5846,7 @@ static EWRAM_DATA u8 gUnknown_202F1E0 = 0; static EWRAM_DATA u8 gUnknown_202F1E1 = 0; static UNUSED EWRAM_DATA s32 sUnusedEwram = 0; -u8 sub_80511F0(void) +static u8 sub_80511F0(void) { if (gUnknown_202F1E1 != 0) { gUnknown_202F1E1--; @@ -5861,16 +5866,17 @@ u8 sub_80511F0(void) return gUnknown_202F1E0; } -bool8 sub_8051A74(Tile *tile, u8 a1, s32 x, s32 y, u8 a5); +static bool8 PlaceFixedRoomTile(Tile *tile, u8 a1, s32 x, s32 y, u8 a5); +static bool8 sub_805210C(u8 itemId); -bool8 sub_805124C(Tile *tile, u8 a1, s32 x, s32 y, u8 a5) +static bool8 sub_805124C(Tile *tile, u8 a1, s32 x, s32 y, u8 a5) { tile->terrainType |= TERRAIN_TYPE_UNBREAKABLE; tile->unkE = 0; - return sub_8051A74(tile, a1, x, y, a5); + return PlaceFixedRoomTile(tile, a1, x, y, a5); } -void sub_8051288(s32 fixedRoomNumber) +static void sub_8051288(s32 fixedRoomNumber) { s32 x, y; Dungeon *dungeon = gDungeon; @@ -5931,7 +5937,7 @@ void sub_8051288(s32 fixedRoomNumber) FinalizeJunctions(); } -void sub_8051438(struct GridCell *gridCell, s32 fixedRoomNumber) +static void sub_8051438(struct GridCell *gridCell, s32 fixedRoomNumber) { s32 x, y; Dungeon *dungeon = gDungeon; @@ -5987,7 +5993,7 @@ void sub_8051438(struct GridCell *gridCell, s32 fixedRoomNumber) extern const s16 gUnknown_80F57D4[][3][3]; -void sub_8051654(FloorProperties *floorProps) +static void sub_8051654(FloorProperties *floorProps) { s32 i, n; s32 x, y; @@ -6094,7 +6100,7 @@ void sub_8051654(FloorProperties *floorProps) * * This is needed because during generation these soft border walls may have been altered or breached. */ -void ResetInnerBoundaryTileRows(void) +static void ResetInnerBoundaryTileRows(void) { s32 x; @@ -6113,12 +6119,7 @@ void ResetInnerBoundaryTileRows(void) } } -bool8 sub_805210C(u8 itemId); - -extern void sub_80460F8(DungeonPos *, Item *, u32); -extern s32 sub_803DA20(s16 species); - -void sub_805193C(u8 itemId, s32 x, s32 y, s32 quantity, u32 itemFlags) +static void sub_805193C(u8 itemId, s32 x, s32 y, s32 quantity, u32 itemFlags) { Item item; DungeonPos pos = {x, y}; @@ -6139,7 +6140,7 @@ void sub_805193C(u8 itemId, s32 x, s32 y, s32 quantity, u32 itemFlags) } // s16 species memes strike again. Will the fix ever be discovered? -void sub_8051998(s16 species_, s32 x, s32 y, u32 unk2_) +static void sub_8051998(s16 species_, s32 x, s32 y, u32 unk2_, u32 UNUSED unused) { struct unkStruct_806B7F8 unkStruct; s32 species = SpeciesId(species_); @@ -6167,7 +6168,7 @@ void sub_8051998(s16 species_, s32 x, s32 y, u32 unk2_) } } -void sub_8051A24(u8 trapId, s32 x, s32 y, bool8 isVisible) +static void SpawnEnemyTrapAtPos(u8 trapId, s32 x, s32 y, bool8 isVisible) { DungeonPos pos; Entity *trapEntity; @@ -6175,7 +6176,7 @@ void sub_8051A24(u8 trapId, s32 x, s32 y, bool8 isVisible) pos.x = x; pos.y = y; - trapEntity = sub_8045684(trapId, &pos, 0); + trapEntity = SpawnTrap(trapId, &pos, 0); if (trapEntity != NULL) { tile->object = trapEntity; trapEntity->isVisible = isVisible; @@ -6190,59 +6191,58 @@ struct UnkStruct_80F6D20 s16 unk8; u8 unkA; u8 unkB; - u8 fillC; + u8 unkC; u8 unkD; u8 unkE; }; extern const struct UnkStruct_80F6D20 gUnknown_80F6D20[]; -extern void sub_8049840(void); - -bool8 sub_8051A74(Tile *tile, u8 a1, s32 x, s32 y, u8 a5) +// Used to spawn a single tile when generating a fixed room. The tile might contain an item or a monster. +static bool8 PlaceFixedRoomTile(Tile *tile, u8 fixedRoomActionId, s32 x, s32 y, bool8 a5) { - if (a1 > 0xF) { + if (fixedRoomActionId > 0xF) { SetTerrainNormal(tile); } - switch (a1) { + switch (fixedRoomActionId) { case 69: gDungeon->unk644.unk40 = x; gDungeon->unk644.unk42 = y; - sub_8051A24(0xB, x, y, FALSE); + SpawnEnemyTrapAtPos(TRAP_SEAL_TRAP, x, y, FALSE); // fall through case 0: SetTerrainNormal(tile); tile->room = 0; - return FALSE; + break; case 1: SetTerrainWall(tile); tile->terrainType &= ~(TERRAIN_TYPE_UNBREAKABLE); tile->room = CORRIDOR_ROOM; - return FALSE; + break; case 4: SetTerrainNormal(tile); - tile->room = 0; gDungeon->playerSpawn.x = x; - gDungeon->playerSpawn.x = y; + gDungeon->playerSpawn.y = y; tile->room = 0; - return FALSE; + break; case 5: - SetTerrainNormal(tile); + SetTerrainSecondary(tile); tile->room = 0; - return FALSE; + break; case 6: SetTerrainType(tile, TERRAIN_TYPE_SECONDARY | TERRAIN_TYPE_NORMAL); - tile->terrainType &= ~(TERRAIN_TYPE_UNBREAKABLE); tile->room = CORRIDOR_ROOM; - return FALSE; + break; case 7: gUnknown_202F1A8 = 1; sub_8049840(); + // fall through + case 10: SetTerrainType(tile, TERRAIN_TYPE_SECONDARY | TERRAIN_TYPE_NORMAL); tile->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL; tile->room = CORRIDOR_ROOM; - return FALSE; + break; case 8: case 67: SetTerrainNormal(tile); @@ -6251,70 +6251,198 @@ bool8 sub_8051A74(Tile *tile, u8 a1, s32 x, s32 y, u8 a5) tile->room = 0; gDungeon->stairsSpawn.x = x; gDungeon->stairsSpawn.y = y; - return FALSE; + break; case 68: tile->terrainType |= TERRAIN_TYPE_UNK_x800; SetTerrainNormal(tile); tile->spawnOrVisibilityFlags &= ~(SPAWN_FLAG_ITEM); tile->room = 0; - return FALSE; + break; case 9: SetTerrainNormal(tile); tile->room = CORRIDOR_ROOM; - return FALSE; + break; case 11: SetTerrainNormal(tile); tile->terrainType |= TERRAIN_TYPE_UNK_x800; tile->room = 0; - return FALSE; + break; case 12: SetTerrainNormal(tile); tile->terrainType |= TERRAIN_TYPE_UNK_x1000; tile->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL; tile->terrainType |= TERRAIN_TYPE_UNK_x800; tile->room = 0; - return FALSE; + break; case 2: case 13: case 14: SetTerrainWall(tile); tile->terrainType |= TERRAIN_TYPE_IMPASSABLE_WALL; tile->room = CORRIDOR_ROOM; - return FALSE; + break; default: - if (a1 > 16 && a1 < 190) { - if (gUnknown_80F6D20[a1].unk0 != 0) { + if (fixedRoomActionId > 15 && fixedRoomActionId < 220) { + const struct UnkStruct_80F6D20 *ptr = &gUnknown_80F6D20[fixedRoomActionId]; + tile->room = ptr->unkC; + if (ptr->unk0 != 0) { if (a5) { - sub_805193C(gUnknown_80F6D20[a1].unk0, x, y, gUnknown_80F6D20[a1].unk2, gUnknown_80F6D20[a1].unk4); + sub_805193C(ptr->unk0, x, y, ptr->unk2, ptr->unk4); } else { - gDungeon->unk644.unk47 = gUnknown_80F6D20[a1].unk0; + gDungeon->unk644.unk47 = ptr->unk0; } } else { - if (gUnknown_80F6D20[a1].unk4 != 0) { - gDungeon->unkE220[gUnknown_80F6D20[a1].unk4 - 1].x = x; - gDungeon->unkE220[gUnknown_80F6D20[a1].unk4 - 1].y = y; + if (ptr->unk4 != 0) { + gDungeon->unkE220[ptr->unk4 - 1].x = x; + gDungeon->unkE220[ptr->unk4 - 1].y = y; } } - if (gUnknown_80F6D20[a1].unk8 != 0) { - sub_8051998(gUnknown_80F6D20[a1].unk8, x, y, gUnknown_80F6D20[a1].unkA); + if (ptr->unk8 != 0) { + sub_8051998(ptr->unk8, x, y, ptr->unkA, fixedRoomActionId); } - if (gUnknown_80F6D20[a1].unkB != 20 && a5) { - sub_8051A24(gUnknown_80F6D20[a1].unkB, x, y, gUnknown_80F6D20[a1].unkD); + if (ptr->unkB != 20 && a5) { + SpawnEnemyTrapAtPos(ptr->unkB, x, y, ptr->unkD); } - if (gUnknown_80F6D20[a1].unkD != 0) { + if (ptr->unkE != 0) { SetTerrainSecondary(tile); } } break; case 3: case 15: - return FALSE; + break; } return FALSE; } + +void sub_8051E3C(void) +{ + s32 x, y; + + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + Tile *tile = GetTileMut(x, y); + if (tile->unkE > 0xF) { + PlaceFixedRoomTile(tile, tile->unkE, x, y, FALSE); + } + } + } +} + +extern const u8 *const gUnknown_80FDDF0; +extern const u8 *const gUnknown_80FDDD0; + +void sub_8051E7C(Entity *pokemon) +{ + Tile *tile = GetTileMut(pokemon->pos.x, pokemon->pos.y - 1); + + if (!(tile->terrainType & TERRAIN_TYPE_UNK_x1000)) { + LogMessageByIdWithPopupCheckUser(pokemon, gUnknown_80FDDF0); // It can't be used here! + } + else if (!gDungeon->unk3A09) { + s32 x, y; + DungeonPos pos = {pokemon->pos.x, pokemon->pos.y - 1}; + u32 roomId = GetEntityRoom(pokemon); + + for (y = pokemon->pos.y - 21; y <= pokemon->pos.y + 19; y++) { + for (x = pokemon->pos.x -20; x <= pokemon->pos.x + 20; x++) { + Tile *loopTile; + s32 xDiff = x - gDungeon->unkE250.minX; + s32 yDiff = y - gDungeon->unkE250.minY; + + if (xDiff < 0 || yDiff < 0) + continue; + if (xDiff >= 8 || yDiff >= 8) + continue; + if (x < gDungeon->unkE250.minX + 1 || y < gDungeon->unkE250.minY + 1) + continue; + if (x >= gDungeon->unkE250.maxX - 1 || y >= gDungeon->unkE250.maxY - 1) + continue; + + loopTile = GetTileMut(x, y); + if (loopTile->terrainType & TERRAIN_TYPE_UNBREAKABLE) { + loopTile->terrainType = gDungeon->unkE27C[xDiff][yDiff].terrainType; + loopTile->spawnOrVisibilityFlags = gDungeon->unkE27C[xDiff][yDiff].spawnOrVisibilityFlags; + } + + PlaceFixedRoomTile(loopTile, gDungeon->unkE87C[xDiff][yDiff], x, y, TRUE); + loopTile->spawnOrVisibilityFlags |= 3; + if (roomId != CORRIDOR_ROOM) { + loopTile->room = roomId; + } + } + } + + for (y = pokemon->pos.y - 21; y <= pokemon->pos.y + 19; y++) { + for (x = pokemon->pos.x -20; x <= pokemon->pos.x + 20; x++) { + s32 xDiff = x - gDungeon->unkE250.minX; + s32 yDiff = y - gDungeon->unkE250.minY; + + if (xDiff < 0 || yDiff < 0) + continue; + if (xDiff >= 8 || yDiff >= 8) + continue; + if (x < gDungeon->unkE250.minX + 1 || y < gDungeon->unkE250.minY + 1) + continue; + if (x >= gDungeon->unkE250.maxX - 1 || y >= gDungeon->unkE250.maxY - 1) + continue; + + sub_80498A8(x, y); + } + } + + gDungeon->unk3A09 = TRUE; + tile->terrainType &= ~(TERRAIN_TYPE_IMPASSABLE_WALL | TERRAIN_TYPE_UNK_x1000); + sub_80498A8(pokemon->pos.x, pokemon->pos.y - 1); + sub_8049B8C(); + sub_8049ED4(); + sub_80429FC(&pos); + LogMessageByIdWithPopupCheckUser(pokemon, gUnknown_80FDDD0); // The closed corridor was opened! + sub_803E708(0x14, 0x3C); + } + else { + LogMessageByIdWithPopupCheckUser(pokemon, gUnknown_80FDDF0); // It can't be used here! + } +} + +static inline bool8 MonHasItem(PokemonStruct1 *mon) +{ + return (mon->heldItem.id != 0); +} + +static bool8 sub_805210C(u8 itemId) +{ + s32 i; + + for (i = 0; i < INVENTORY_SIZE; i++) { + if (ItemExists(&gTeamInventoryRef->teamItems[i])) { + if (gTeamInventoryRef->teamItems[i].id == itemId) + return TRUE; + } + } + + for (i = 0; i < MAX_TEAM_MEMBERS; i++) { + if (PokemonFlag1Struct2(&gRecruitedPokemonRef->pokemon2[i]) && ItemExists(&gRecruitedPokemonRef->pokemon2[i].itemSlot)) { + if (gRecruitedPokemonRef->pokemon2[i].itemSlot.id == itemId) + return TRUE; + } + } + + for (i = 0; i < NUM_MONSTERS; i++) { + if (PokemonFlag1(&gRecruitedPokemonRef->pokemon[i])) { + if (MonHasItem(&gRecruitedPokemonRef->pokemon[i]) && gRecruitedPokemonRef->pokemon[i].heldItem.id == itemId) + return TRUE; + } + } + + if (gTeamInventoryRef->teamStorage[itemId] != 0) + return TRUE; + + return FALSE; +} diff --git a/src/dungeon_serializer.c b/src/dungeon_serializer.c index e1df58dd4..daec78076 100644 --- a/src/dungeon_serializer.c +++ b/src/dungeon_serializer.c @@ -911,7 +911,7 @@ static void ReadDungeonTraps(DataSerializer *seri) if (trapID != 0xFF) { tile = GetTileMut(pos.x, pos.y); - entity = sub_8045684(trapID, &pos, unk1); + entity = SpawnTrap(trapID, &pos, unk1); if (entity) { tile->object = entity; entity->isVisible = isVisible; diff --git a/src/trap.c b/src/trap.c index 94483397e..9dd484d6a 100644 --- a/src/trap.c +++ b/src/trap.c @@ -138,7 +138,7 @@ bool8 LayTrap(DungeonPos *pos, u8 trapID, u8 param_3) tile->object->isVisible = TRUE; } else { - entity = sub_8045684(trapID,pos,param_3); + entity = SpawnTrap(trapID,pos,param_3); if (entity == NULL) _0807FD6E: return FALSE;