diff --git a/asm/code_803E724.s b/asm/code_803E724.s index 2c9578003..b148e780f 100644 --- a/asm/code_803E724.s +++ b/asm/code_803E724.s @@ -6,954 +6,7 @@ .text - thumb_func_start sub_803F7BC -sub_803F7BC: - push {r4-r6,lr} - sub sp, 0x10 - ldr r6, _0803F800 - ldr r4, [r6] - ldr r0, _0803F804 - adds r5, r4, r0 - movs r1, 0 - ldrsh r0, [r5, r1] - movs r2, 0x2 - ldrsh r1, [r5, r2] - bl GetTile - ldrb r1, [r0, 0x9] - ldr r2, _0803F808 - adds r0, r4, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0803F7F4 - adds r2, 0x1 - adds r0, r4, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0803F7F4 - adds r2, 0xB - adds r0, r4, r2 - ldrb r0, [r0] - cmp r0, 0 - beq _0803F80C -_0803F7F4: - movs r0, 0 - movs r1, 0 - bl sub_8005838 - b _0803F86A - .align 2, 0 -_0803F800: .4byte gDungeon -_0803F804: .4byte 0x000181e8 -_0803F808: .4byte 0x0001820b -_0803F80C: - cmp r1, 0xFF - bne _0803F82C - ldr r1, _0803F828 - adds r0, r4, r1 - ldrb r0, [r0] - movs r1, 0x2 - cmp r0, 0x2 - bne _0803F81E - movs r1, 0x1 -_0803F81E: - movs r0, 0 - bl sub_8005838 - b _0803F86A - .align 2, 0 -_0803F828: .4byte 0x00018209 -_0803F82C: - lsls r0, r1, 3 - subs r0, r1 - lsls r0, 2 - ldr r2, _0803F874 - adds r0, r2 - ldr r2, [r6] - adds r2, r0 - movs r0, 0x8 - ldrsh r1, [r5, r0] - ldr r0, [r2, 0xC] - subs r0, r1 - str r0, [sp] - movs r0, 0xA - ldrsh r1, [r5, r0] - ldr r0, [r2, 0x10] - subs r0, r1 - str r0, [sp, 0x4] - movs r0, 0x8 - ldrsh r1, [r5, r0] - ldr r0, [r2, 0x14] - subs r0, r1 - str r0, [sp, 0x8] - movs r0, 0xA - ldrsh r1, [r5, r0] - ldr r0, [r2, 0x18] - subs r0, r1 - str r0, [sp, 0xC] - mov r0, sp - movs r1, 0x3 - bl sub_8005838 -_0803F86A: - add sp, 0x10 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_0803F874: .4byte 0x000104c4 - thumb_func_end sub_803F7BC - thumb_func_start sub_803F878 -sub_803F878: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r2, r0, 0 - adds r6, r1, 0 - ldr r0, _0803F92C - ldr r7, [r0] - ldr r0, _0803F930 - adds r5, r7, r0 - ldr r0, [r5, 0x8] - str r0, [r5, 0xC] - ldr r0, [r5] - str r0, [r5, 0x4] - adds r0, r2, 0 - cmp r2, 0 - bge _0803F89A - adds r0, 0xFF -_0803F89A: - asrs r0, 8 - subs r0, 0x78 - movs r1, 0 - mov r8, r1 - strh r0, [r5, 0x8] - adds r0, r6, 0 - cmp r6, 0 - bge _0803F8AC - adds r0, 0xFF -_0803F8AC: - asrs r0, 8 - subs r0, 0x60 - strh r0, [r5, 0xA] - movs r4, 0xC0 - lsls r4, 5 - adds r0, r2, 0 - adds r1, r4, 0 - bl __divsi3 - strh r0, [r5] - adds r0, r6, 0 - adds r1, r4, 0 - bl __divsi3 - strh r0, [r5, 0x2] - ldr r2, _0803F934 - adds r0, r7, r2 - mov r1, r8 - strb r1, [r0] - adds r2, 0x1 - adds r0, r7, r2 - strb r1, [r0] - ldr r1, _0803F938 - adds r0, r7, r1 - mov r2, r8 - strb r2, [r0] - adds r1, 0x5 - adds r0, r7, r1 - strb r2, [r0] - ldr r1, _0803F93C - ldr r0, [r1] - cmp r0, 0 - beq _0803F8F6 - movs r0, 0 - str r0, [r1] - bl SetBGOBJEnableFlags -_0803F8F6: - movs r2, 0xC - ldrsh r1, [r5, r2] - movs r2, 0x8 - ldrsh r0, [r5, r2] - subs r1, r0 - cmp r1, 0 - bge _0803F906 - negs r1, r1 -_0803F906: - cmp r1, 0x7 - bgt _0803F91E - movs r0, 0xE - ldrsh r1, [r5, r0] - movs r2, 0xA - ldrsh r0, [r5, r2] - subs r1, r0 - cmp r1, 0 - bge _0803F91A - negs r1, r1 -_0803F91A: - cmp r1, 0x7 - ble _0803F940 -_0803F91E: - bl sub_8049ED4 - adds r1, r5, 0 - adds r1, 0x2B - movs r0, 0x1 - strb r0, [r1] - b _0803F984 - .align 2, 0 -_0803F92C: .4byte gDungeon -_0803F930: .4byte 0x000181e8 -_0803F934: .4byte 0x0001820d -_0803F938: .4byte 0x00018211 -_0803F93C: .4byte gUnknown_202EDFC -_0803F940: - movs r0, 0xC - ldrsh r1, [r5, r0] - movs r2, 0x8 - ldrsh r0, [r5, r2] - cmp r1, r0 - bge _0803F956 - movs r0, 0xF0 - movs r1, 0 - bl sub_804A1F0 - b _0803F962 -_0803F956: - cmp r1, r0 - ble _0803F962 - movs r0, 0 - movs r1, 0 - bl sub_804A1F0 -_0803F962: - movs r0, 0xE - ldrsh r1, [r5, r0] - movs r2, 0xA - ldrsh r0, [r5, r2] - cmp r1, r0 - bge _0803F978 - movs r0, 0 - movs r1, 0xA0 - bl sub_804A49C - b _0803F984 -_0803F978: - cmp r1, r0 - ble _0803F984 - movs r0, 0 - movs r1, 0 - bl sub_804A49C -_0803F984: - bl sub_803F7BC - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_803F878 - - thumb_func_start GetCameraXPos -GetCameraXPos: - ldr r0, _0803F9A8 - ldr r0, [r0] - ldr r1, _0803F9AC - adds r0, r1 - movs r1, 0x8 - ldrsh r0, [r0, r1] - adds r0, 0x78 - lsls r0, 8 - bx lr - .align 2, 0 -_0803F9A8: .4byte gDungeon -_0803F9AC: .4byte 0x000181e8 - thumb_func_end GetCameraXPos - - thumb_func_start GetCameraYPos -GetCameraYPos: - ldr r0, _0803F9C4 - ldr r0, [r0] - ldr r1, _0803F9C8 - adds r0, r1 - movs r1, 0xA - ldrsh r0, [r0, r1] - adds r0, 0x60 - lsls r0, 8 - bx lr - .align 2, 0 -_0803F9C4: .4byte gDungeon -_0803F9C8: .4byte 0x000181e8 - thumb_func_end GetCameraYPos - - thumb_func_start sub_803F9CC -sub_803F9CC: - push {r4,r5,lr} - ldr r0, _0803FA24 - ldr r1, [r0] - ldr r2, _0803FA28 - adds r0, r1, r2 - ldr r4, [r0] - movs r5, 0 - ldr r2, _0803FA2C - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0803FA0C - ldr r2, _0803FA30 - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - bne _0803FA0C - bl sub_800EC74 - lsls r0, 24 - cmp r0, 0 - bne _0803FA0C - cmp r4, 0 - beq _0803FA08 - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0x1 - bne _0803FA08 - movs r5, 0x1 -_0803FA08: - cmp r5, 0 - bne _0803FA38 -_0803FA0C: - ldr r0, _0803FA34 - movs r2, 0 - adds r0, 0x2 - movs r1, 0x1C -_0803FA14: - strh r2, [r0] - adds r0, 0x2 - subs r1, 0x1 - cmp r1, 0 - bge _0803FA14 - bl sub_803F38C - b _0803FA3C - .align 2, 0 -_0803FA24: .4byte gDungeon -_0803FA28: .4byte 0x000181f8 -_0803FA2C: .4byte 0x0001356c -_0803FA30: .4byte 0x00018218 -_0803FA34: .4byte gUnknown_202B038 -_0803FA38: - bl sub_803FB74 -_0803FA3C: - ldr r1, _0803FA48 - movs r0, 0x1 - strb r0, [r1] - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_0803FA48: .4byte gUnknown_20274A5 - thumb_func_end sub_803F9CC - - thumb_func_start sub_803FA4C -sub_803FA4C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x28 - adds r4, r0, 0 - mov r8, r1 - lsls r2, 24 - lsrs r2, 24 - mov r12, r2 - ldr r0, _0803FB4C - ldr r3, [r0] - ldr r0, _0803FB50 - adds r0, r3, r0 - str r0, [sp, 0x24] - ldr r7, _0803FB54 - mov r1, sp - ldr r0, _0803FB58 - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldm r0!, {r2,r5,r6} - stm r1!, {r2,r5,r6} - ldr r0, _0803FB5C - mov r10, r0 - ldr r1, _0803FB60 - mov r9, r1 - ldr r2, [sp, 0x24] - movs r5, 0x3E - ldrsh r0, [r2, r5] - cmp r4, r0 - bne _0803FA9C - ldr r6, _0803FB64 - adds r0, r3, r6 - movs r1, 0 - ldrsh r0, [r0, r1] - cmp r8, r0 - beq _0803FB3A -_0803FA9C: - mov r2, r12 - cmp r2, 0 - bne _0803FAA6 - ldr r5, _0803FB68 - mov r9, r5 -_0803FAA6: - ldr r6, [sp, 0x24] - strh r4, [r6, 0x3E] - ldr r1, _0803FB64 - adds r0, r3, r1 - mov r2, r8 - strh r2, [r0] - mov r5, r8 - cmp r5, 0x5F - ble _0803FAC8 - movs r5, 0x60 - lsls r0, r4, 1 - adds r0, r4 - lsls r0, 5 - mov r1, r8 - bl __divsi3 - adds r4, r0, 0 -_0803FAC8: - movs r3, 0 - mov r8, r3 - movs r6, 0x58 - mov r12, r6 -_0803FAD0: - ldr r6, _0803FB6C - adds r2, r4, 0 - adds r0, r5, 0 - cmp r4, 0x7 - ble _0803FADC - movs r2, 0x8 -_0803FADC: - cmp r5, 0x7 - ble _0803FAE2 - movs r0, 0x8 -_0803FAE2: - lsls r0, 2 - mov r3, sp - adds r1, r3, r0 - lsls r0, r2, 2 - add r0, sp - ldr r2, [r0] - ldr r3, [r1] - adds r1, r3, 0 - bics r1, r2 - mov r0, r10 - ands r1, r0 - mov r0, r9 - ands r0, r2 - orrs r0, r1 - ands r6, r3 - mov r1, r8 - stm r7!, {r1} - stm r7!, {r6} - stm r7!, {r0} - stm r7!, {r0} - stm r7!, {r0} - stm r7!, {r0} - stm r7!, {r6} - stm r7!, {r1} - subs r4, 0x8 - subs r5, 0x8 - cmp r4, 0 - bge _0803FB1C - movs r4, 0 -_0803FB1C: - cmp r5, 0 - bge _0803FB22 - movs r5, 0 -_0803FB22: - movs r2, 0x8 - negs r2, r2 - add r12, r2 - mov r3, r12 - cmp r3, 0 - bge _0803FAD0 - ldr r0, _0803FB70 - movs r2, 0xC0 - lsls r2, 1 - ldr r1, _0803FB54 - bl sub_80098BC -_0803FB3A: - add sp, 0x28 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803FB4C: .4byte gDungeon -_0803FB50: .4byte 0x000181e8 -_0803FB54: .4byte gUnknown_3001018 -_0803FB58: .4byte gUnknown_80F6490 -_0803FB5C: .4byte 0x22222222 -_0803FB60: .4byte 0x44444444 -_0803FB64: .4byte 0x00018228 -_0803FB68: .4byte 0x55555555 -_0803FB6C: .4byte 0x77777777 -_0803FB70: .4byte 0x06005980 - thumb_func_end sub_803FA4C - - thumb_func_start sub_803FB74 -sub_803FB74: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - ldr r0, _0803FBE8 - ldr r0, [r0] - ldr r1, _0803FBEC - adds r7, r0, r1 - movs r4, 0 - movs r2, 0 - str r2, [sp] - ldr r0, [r7, 0x10] - ldr r0, [r0, 0x70] - movs r1, 0xE - ldrsh r3, [r0, r1] - mov r9, r3 - movs r3, 0x10 - ldrsh r2, [r0, r3] - mov r8, r2 - ldrb r1, [r0, 0x9] - mov r10, r1 - movs r2, 0xE - ldrsh r1, [r0, r2] - cmp r1, 0 - ble _0803FBBA - mov r0, r8 - cmp r0, 0 - bge _0803FBB2 - adds r0, 0x3 -_0803FBB2: - asrs r0, 2 - cmp r1, r0 - bgt _0803FBBA - movs r4, 0x1 -_0803FBBA: - ldr r0, [r7, 0x10] - ldr r0, [r0, 0x70] - movs r3, 0x9E - lsls r3, 1 - adds r0, r3 - ldr r0, [r0] - bl FixedPointToInt - cmp r0, 0 - bne _0803FBD2 - movs r0, 0x1 - str r0, [sp] -_0803FBD2: - cmp r4, 0 - beq _0803FBF4 - ldr r0, _0803FBF0 - ldr r0, [r0] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0803FBF4 - movs r5, 0x20 - movs r6, 0x20 - b _0803FBF8 - .align 2, 0 -_0803FBE8: .4byte gDungeon -_0803FBEC: .4byte 0x000181e8 -_0803FBF0: .4byte gUnknown_202EDCC -_0803FBF4: - movs r5, 0 - movs r6, 0 -_0803FBF8: - ldr r1, [sp] - cmp r1, 0 - beq _0803FC0E - ldr r0, _0803FC20 - ldr r0, [r0] - movs r1, 0x10 - ands r0, r1 - cmp r0, 0 - beq _0803FC0E - movs r5, 0x30 - movs r6, 0x30 -_0803FC0E: - cmp r5, 0 - bne _0803FC30 - adds r0, r7, 0 - adds r0, 0x2A - ldrb r0, [r0] - cmp r0, 0 - beq _0803FC24 - movs r5, 0x60 - b _0803FC30 - .align 2, 0 -_0803FC20: .4byte gUnknown_202EDCC -_0803FC24: - ldr r0, _0803FCE4 - ldr r0, [r0] - ldrb r0, [r0, 0xB] - cmp r0, 0 - beq _0803FC30 - movs r5, 0x40 -_0803FC30: - cmp r6, 0 - bne _0803FC40 - ldr r0, _0803FCE4 - ldr r0, [r0] - ldrb r0, [r0, 0xB] - cmp r0, 0 - beq _0803FC40 - movs r6, 0x40 -_0803FC40: - movs r2, 0x36 - ldrsh r0, [r7, r2] - cmp r0, r5 - beq _0803FC78 - strh r5, [r7, 0x36] - lsls r5, 2 - ldr r4, _0803FCE8 - adds r1, r5, r4 - movs r0, 0xFC - bl SetBGPaletteBufferColorArray - adds r1, r4, 0x4 - adds r1, r5, r1 - movs r0, 0xFD - bl SetBGPaletteBufferColorArray - adds r1, r4, 0 - adds r1, 0x8 - adds r1, r5, r1 - movs r0, 0xFE - bl SetBGPaletteBufferColorArray - adds r4, 0xC - adds r5, r4 - movs r0, 0xFF - adds r1, r5, 0 - bl SetBGPaletteBufferColorArray -_0803FC78: - movs r3, 0x38 - ldrsh r0, [r7, r3] - cmp r0, r6 - beq _0803FCB0 - strh r6, [r7, 0x38] - lsls r5, r6, 2 - ldr r4, _0803FCE8 - adds r1, r5, r4 - movs r0, 0xFC - bl nullsub_5 - adds r1, r4, 0x4 - adds r1, r5, r1 - movs r0, 0xFD - bl nullsub_5 - adds r1, r4, 0 - adds r1, 0x8 - adds r1, r5, r1 - movs r0, 0xFE - bl nullsub_5 - adds r4, 0xC - adds r5, r4 - movs r0, 0xFF - adds r1, r5, 0 - bl nullsub_5 -_0803FCB0: - ldr r5, _0803FCEC - ldr r0, _0803FCF0 - ldr r2, [r0] - ldr r0, _0803FCF4 - adds r1, r2, r0 - movs r3, 0x14 - ldrsh r0, [r2, r3] - ldrb r1, [r1] - adds r6, r0, r1 - movs r1, 0x3A - ldrsh r0, [r7, r1] - adds r4, r7, 0 - adds r4, 0x2E - cmp r0, r6 - beq _0803FD3E - strh r6, [r7, 0x3A] - ldr r3, _0803FCF8 - adds r0, r2, r3 - ldrb r0, [r0] - bl IsStairDirectionUp - lsls r0, 24 - cmp r0, 0 - beq _0803FCFC - movs r0, 0 - b _0803FD00 - .align 2, 0 -_0803FCE4: .4byte gGameOptionsRef -_0803FCE8: .4byte gUnknown_202D068 -_0803FCEC: .4byte gUnknown_202B038 -_0803FCF0: .4byte gDungeon -_0803FCF4: .4byte 0x00000645 -_0803FCF8: .4byte 0x00000644 -_0803FCFC: - ldr r1, _0803FD20 - adds r0, r1, 0 -_0803FD00: - strh r0, [r5, 0x2] - cmp r6, 0x9 - bgt _0803FD28 - adds r1, r5, 0x4 - adds r4, r7, 0 - adds r4, 0x2E - ldrb r2, [r4] - adds r0, r6, 0 - movs r3, 0x1 - bl sub_803FE30 - ldr r2, _0803FD24 - adds r0, r2, 0 - strh r0, [r5, 0x6] - b _0803FD3E - .align 2, 0 -_0803FD20: .4byte 0x0000f2be -_0803FD24: .4byte 0x0000f2b8 -_0803FD28: - adds r1, r5, 0x4 - adds r4, r7, 0 - adds r4, 0x2E - ldrb r2, [r4] - adds r0, r6, 0 - movs r3, 0 - bl sub_803FE30 - ldr r3, _0803FE10 - adds r0, r3, 0 - strh r0, [r5, 0x8] -_0803FD3E: - movs r1, 0x3C - ldrsh r0, [r7, r1] - cmp r0, r10 - beq _0803FD64 - mov r2, r10 - strh r2, [r7, 0x3C] - ldr r3, _0803FE14 - adds r0, r3, 0 - strh r0, [r5, 0xA] - ldr r1, _0803FE18 - adds r0, r1, 0 - strh r0, [r5, 0xC] - adds r1, r5, 0 - adds r1, 0xE - ldrb r2, [r4] - mov r0, r10 - movs r3, 0 - bl sub_803FE30 -_0803FD64: - movs r2, 0x3E - ldrsh r0, [r7, r2] - cmp r0, r9 - beq _0803FD84 - ldr r3, _0803FE1C - adds r0, r3, 0 - strh r0, [r5, 0x12] - ldr r1, _0803FE20 - adds r0, r1, 0 - strh r0, [r5, 0x14] - adds r1, r5, 0 - adds r1, 0x16 - ldrb r2, [r4] - mov r0, r9 - bl sub_803FF18 -_0803FD84: - adds r6, r7, 0 - adds r6, 0x40 - movs r2, 0 - ldrsh r0, [r6, r2] - cmp r0, r8 - beq _0803FDA2 - ldr r3, _0803FE24 - adds r0, r3, 0 - strh r0, [r5, 0x1C] - adds r1, r5, 0 - adds r1, 0x1E - ldrb r2, [r4] - mov r0, r8 - bl sub_803FF18 -_0803FDA2: - ldrb r2, [r4] - mov r0, r9 - mov r1, r8 - bl sub_803FA4C - mov r0, r8 - strh r0, [r6] - mov r1, r9 - strh r1, [r7, 0x3E] - mov r0, r8 - cmp r0, 0 - bge _0803FDBC - adds r0, 0x7 -_0803FDBC: - asrs r1, r0, 3 - adds r4, r7, 0 - adds r4, 0x42 - strh r1, [r4] - movs r0, 0x7 - mov r2, r8 - ands r2, r0 - cmp r2, 0 - beq _0803FDD2 - adds r0, r1, 0x1 - strh r0, [r4] -_0803FDD2: - movs r3, 0 - ldrsh r0, [r4, r3] - cmp r0, 0xB - ble _0803FDDE - movs r0, 0xC - strh r0, [r4] -_0803FDDE: - movs r1, 0 - ldr r0, _0803FE28 - movs r2, 0xB3 - lsls r2, 2 - adds r4, r2, 0 - ldr r2, _0803FE2C - adds r3, r2, 0 - adds r2, r0, 0 - adds r2, 0x24 -_0803FDF0: - adds r0, r1, r4 - orrs r0, r3 - strh r0, [r2] - adds r2, 0x2 - adds r1, 0x1 - cmp r1, 0xB - ble _0803FDF0 - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803FE10: .4byte 0x0000f2b8 -_0803FE14: .4byte 0x0000f2b9 -_0803FE18: .4byte 0x0000f2ba -_0803FE1C: .4byte 0x0000f2bb -_0803FE20: .4byte 0x0000f2bc -_0803FE24: .4byte 0x0000f2bd -_0803FE28: .4byte gUnknown_202B038 -_0803FE2C: .4byte 0xfffff000 - thumb_func_end sub_803FB74 - - thumb_func_start sub_803FE30 -sub_803FE30: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r5, r0, 0 - adds r4, r1, 0 - lsls r2, 24 - lsrs r2, 24 - adds r1, r2, 0 - lsls r3, 24 - lsrs r3, 24 - mov r12, r3 - movs r0, 0 - cmp r2, 0 - bne _0803FE4E - movs r0, 0x37 -_0803FE4E: - cmp r5, 0x64 - ble _0803FE70 - cmp r2, 0 - beq _0803FE60 - ldr r1, _0803FE5C - adds r0, r1, 0 - b _0803FE64 - .align 2, 0 -_0803FE5C: .4byte 0x0000f291 -_0803FE60: - ldr r2, _0803FE6C - adds r0, r2, 0 -_0803FE64: - strh r0, [r4] - strh r0, [r4, 0x2] - b _0803FF00 - .align 2, 0 -_0803FE6C: .4byte 0x0000f2c8 -_0803FE70: - cmp r5, 0x64 - bne _0803FEBC - ldr r1, _0803FE84 - adds r0, r1, 0 - strh r0, [r4] - ldr r2, _0803FE88 - adds r0, r2, 0 - strh r0, [r4, 0x2] - b _0803FF00 - .align 2, 0 -_0803FE84: .4byte 0x0000f294 -_0803FE88: .4byte 0x0000f295 -_0803FE8C: - ldr r1, _0803FEB4 - lsls r0, r6, 3 - adds r0, r6 - adds r0, r2 - lsls r0, 1 - adds r0, r1 - ldrh r0, [r0] - strh r0, [r4] - subs r0, r5, r3 - adds r0, r7 - movs r1, 0x96 - lsls r1, 2 - adds r0, r1 - ldr r2, _0803FEB8 - adds r1, r2, 0 - orrs r0, r1 - mov r1, r8 - strh r0, [r1] - b _0803FF00 - .align 2, 0 -_0803FEB4: .4byte gUnknown_80F64D8 -_0803FEB8: .4byte 0xfffff000 -_0803FEBC: - adds r2, r4, 0x2 - mov r8, r2 - adds r7, r0, 0 - adds r7, 0x30 - cmp r5, 0x9 - ble _0803FEE2 - movs r6, 0 - cmp r1, 0 - bne _0803FED0 - movs r6, 0x1 -_0803FED0: - movs r2, 0 - ldr r0, _0803FF0C -_0803FED4: - ldr r3, [r0] - cmp r3, r5 - ble _0803FE8C - adds r0, 0x4 - adds r2, 0x1 - cmp r2, 0x8 - ble _0803FED4 -_0803FEE2: - mov r0, r12 - cmp r0, 0 - bne _0803FEF0 - ldr r1, _0803FF10 - adds r0, r1, 0 - strh r0, [r4] - adds r4, 0x2 -_0803FEF0: - adds r0, r5, r7 - movs r2, 0x96 - lsls r2, 2 - adds r0, r2 - ldr r2, _0803FF14 - adds r1, r2, 0 - orrs r0, r1 - strh r0, [r4] -_0803FF00: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0803FF0C: .4byte gUnknown_80F64B4 -_0803FF10: .4byte 0x0000f278 -_0803FF14: .4byte 0xfffff000 - thumb_func_end sub_803FE30 thumb_func_start sub_803FF18 sub_803FF18: diff --git a/include/structs/str_dungeon.h b/include/structs/str_dungeon.h index af8290545..bb9ff0069 100644 --- a/include/structs/str_dungeon.h +++ b/include/structs/str_dungeon.h @@ -118,6 +118,7 @@ typedef struct UnkDungeonGlobal_unk181E8_sub s16 unk3C; // x3C s16 unk3E; // x3E s16 unk40; // x40 + s16 unk42; // x42 } UnkDungeonGlobal_unk181E8_sub; // x44 // Sizeof: 0x1C diff --git a/src/code_803E724.c b/src/code_803E724.c index 1c26bf1d5..c6fc3b295 100644 --- a/src/code_803E724.c +++ b/src/code_803E724.c @@ -9,10 +9,13 @@ #include "code_8009804.h" #include "code_803E46C.h" #include "dungeon_util.h" +#include "code_800E9E4.h" #include "dungeon_pokemon_attributes.h" +#include "dungeon_map_access.h" #include "sprite.h" #include "bg_control.h" #include "game_options.h" +#include "code_800558C.h" #include "dungeon_range.h" #include "code_806CD90.h" #include "dungeon_items.h" @@ -1073,4 +1076,360 @@ void sub_803F580(u8 a0) sub_803F7BC(); } +void sub_803F7BC(void) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + Tile *tile = GetTile(strPtr->cameraPos.x, strPtr->cameraPos.y); + u32 roomId = tile->room; + + if (strPtr->unk1820B != 0 || strPtr->unk1820C != 0 || strPtr->unk18217 != 0) { + sub_8005838(NULL, 0); + } + else if (roomId == 0xFF) { + u32 kind = (strPtr->visibilityRange == 2) ? 1 : 2; + sub_8005838(NULL, kind); + } + else { + s32 sp[4]; + RoomData *room = &gDungeon->roomData[roomId]; + + sp[0] = room->unkC - strPtr->cameraPixelPos.x; + sp[1] = room->unk10 - strPtr->cameraPixelPos.y; + sp[2] = room->unk14 - strPtr->cameraPixelPos.x; + sp[3] = room->unk18 - strPtr->cameraPixelPos.y; + sub_8005838(sp, 3); + } +} + +void sub_803F878(s32 a0, s32 a1) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + + strPtr->cameraPixelPosMirror = strPtr->cameraPixelPos; + strPtr->cameraPosMirror = strPtr->cameraPos; + strPtr->cameraPixelPos.x = (a0 / 256) - 120; + strPtr->cameraPixelPos.y = (a1 / 256) - 96; + strPtr->cameraPos.x = a0 / 6144; + strPtr->cameraPos.y = a1 / 6144; + strPtr->unk1820D = 0; + strPtr->unk1820E = 0; + strPtr->unk18211 = 0; + strPtr->unk18216 = 0; + + if (gUnknown_202EDFC != 0) { + gUnknown_202EDFC = 0; + SetBGOBJEnableFlags(0); + } + + if (abs(strPtr->cameraPixelPosMirror.x - strPtr->cameraPixelPos.x) > 7 || abs(strPtr->cameraPixelPosMirror.y - strPtr->cameraPixelPos.y) > 7) { + sub_8049ED4(); + strPtr->unk18213 = 1; + } + else { + if (strPtr->cameraPixelPosMirror.x < strPtr->cameraPixelPos.x) { + sub_804A1F0(240, 0); + } + else if (strPtr->cameraPixelPosMirror.x > strPtr->cameraPixelPos.x) { + sub_804A1F0(0, 0); + } + + if (strPtr->cameraPixelPosMirror.y < strPtr->cameraPixelPos.y) { + sub_804A49C(0, 160); + } + else if (strPtr->cameraPixelPosMirror.y > strPtr->cameraPixelPos.y) { + sub_804A49C(0, 0); + } + } + + sub_803F7BC(); +} + +s32 GetCameraXPos(void) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + return (strPtr->cameraPixelPos.x + 120) * 256; +} + +s32 GetCameraYPos(void) +{ + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + return (strPtr->cameraPixelPos.y + 96) * 256; +} + +void sub_803FB74(void); +extern u8 gUnknown_20274A5; + +void sub_803F9CC(void) +{ + s32 i; + Entity *cameraTarget = gDungeon->unk181e8.cameraTarget; + bool32 r5 = FALSE; + + if (gDungeon->unk1356C != 0 || gDungeon->unk181e8.unk18218 != 0 || sub_800EC74() != 0) { + r5 = FALSE; + } + else if (cameraTarget != NULL && GetEntityType(cameraTarget) == ENTITY_MONSTER) { + r5 = TRUE; + } + + if (!r5) { + for (i = 1; i < 30; i++) { + gUnknown_202B038[0][0][i] = 0; + } + sub_803F38C(); + } + else { + sub_803FB74(); + } + + gUnknown_20274A5 = 1; +} + +extern u32 gUnknown_3001018[]; +extern const u32 gUnknown_80F6490[]; + +void sub_803FA4C(s32 a0, s32 a1, bool8 a2) +{ + s32 i; + s32 r5; + u32 r10, r9; + u32 sp[9]; + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + u32 *dst = gUnknown_3001018; + memcpy(sp, gUnknown_80F6490, sizeof(sp)); + + r10 = 0x22222222; + r9 = 0x44444444; + if (a0 == strPtr->unk3E && a1 == strPtr->unk40) + return; + if (!a2) { + r9 = 0x55555555; + } + + strPtr->unk3E = a0; + strPtr->unk40 = a1; + r5 = a1; + if (r5 >= 96) { + r5 = 96; + a0 = (a0 * 96) / a1; + } + + for (i = 0; i < 96; i += 8) { + u32 val0, val1; + u32 val6 = 0x77777777; + s32 id1 = a0; + s32 id2 = r5; + + if (a0 >= 8) { + id1 = 8; + } + if (r5 >= 8) { + id2 = 8; + } + + val1 = sp[id2] & ~(sp[id1]); + val1 &= r10; + val0 = (sp[id1] & r9) | val1; + val6 = sp[id2] & val6; + *(dst++) = 0; + *(dst++) = val6; + *(dst++) = val0; + *(dst++) = val0; + *(dst++) = val0; + *(dst++) = val0; + *(dst++) = val6; + *(dst++) = 0; + + a0 -= 8; + r5 -= 8; + if (a0 < 0) { + a0 = 0; + } + if (r5 < 0) { + r5 = 0; + } + } + sub_80098BC((void *) VRAM + 0x5980, gUnknown_3001018, 0x180); +} + +extern s32 gUnknown_202EDCC; + +// 2d array? possibly the same as gUnknown_202D06C TODO: merge the variables +extern u8 gUnknown_202D068[]; + +void sub_803FE30(s32 a0, u16 *a1, u8 a2, u8 a3); +void sub_803FF18(s32 a0, u16 *a1, u8 a2); + +void sub_803FB74(void) +{ + s32 i; + u16 *arrPtr; + s32 r5, r6, unkFloor; + UnkDungeonGlobal_unk181E8_sub *strPtr = &gDungeon->unk181e8; + bool32 lowHp = FALSE; + bool32 hungry = FALSE; + EntityInfo *entInfo = GetEntInfo(strPtr->cameraTarget); + s32 hp = entInfo->HP; + s32 maxHp = entInfo->maxHPStat; + s32 level = entInfo->level; + + if (entInfo->HP > 0 && entInfo->HP <= entInfo->maxHPStat / 4) { + lowHp = TRUE; + } + // reloaded again + entInfo = GetEntInfo(strPtr->cameraTarget); + if (FixedPointToInt(entInfo->belly) == 0) { + hungry = TRUE; + } + + if (lowHp && (gUnknown_202EDCC & 16) != 0) { + r5 = 32, r6 = 32; + } + else { + r5 = 0, r6 = 0; + } + + if (hungry && (gUnknown_202EDCC & 16) != 0) { + r5 = 48, r6 = 48; + } + + if (r5 == 0) { + if (strPtr->unk18212 != 0) { + r5 = 96; + } + else if (gGameOptionsRef->playerGender != MALE) { + r5 = 64; + } + } + + if (r6 == 0) { + if (gGameOptionsRef->playerGender != MALE) { + r6 = 64; + } + } + + if (strPtr->unk36 != r5) { + strPtr->unk36 = r5; + SetBGPaletteBufferColorArray(0xFC, &gUnknown_202D068[0 + r5 * 4]); + SetBGPaletteBufferColorArray(0xFD, &gUnknown_202D068[4 + r5 * 4]); + SetBGPaletteBufferColorArray(0xFE, &gUnknown_202D068[8 + r5 * 4]); + SetBGPaletteBufferColorArray(0xFF, &gUnknown_202D068[12 + r5 * 4]); + } + + if (strPtr->unk38 != r6) { + strPtr->unk38 = r6; + nullsub_5(0xFC, &gUnknown_202D068[0 + r6 * 4]); + nullsub_5(0xFD, &gUnknown_202D068[4 + r6 * 4]); + nullsub_5(0xFE, &gUnknown_202D068[8 + r6 * 4]); + nullsub_5(0xFF, &gUnknown_202D068[12 + r6 * 4]); + } + + arrPtr = gUnknown_202B038[0][0]; + unkFloor = gDungeon->unk14 + gDungeon->dungeonLocation.floor; + if (strPtr->unk3A != unkFloor) { + strPtr->unk3A = unkFloor; + if (IsStairDirectionUp(gDungeon->dungeonLocation.id)) { + arrPtr[1] = 0; + } + else { + arrPtr[1] = 0xF2BE; + } + + if (unkFloor < 10) { + sub_803FE30(unkFloor, &arrPtr[2], strPtr->unk18216, 1); + arrPtr[3] = 0xF2B8; + } + else { + sub_803FE30(unkFloor, &arrPtr[2], strPtr->unk18216, 0); + arrPtr[4] = 0xF2B8; + } + } + + if (strPtr->unk3C != level) { + strPtr->unk3C = level; + arrPtr[5] = 0xF2B9; + arrPtr[6] = 0xF2BA; + sub_803FE30(level, &arrPtr[7], strPtr->unk18216, 0); + } + + if (strPtr->unk3E != hp) { + arrPtr[9] = 0xF2BB; + arrPtr[10] = 0xF2BC; + sub_803FF18(hp, &arrPtr[11], strPtr->unk18216); + } + + if (strPtr->unk40 != maxHp) { + arrPtr[14] = 0xF2BD; + sub_803FF18(maxHp, &arrPtr[15], strPtr->unk18216); + } + + sub_803FA4C(hp, maxHp, strPtr->unk18216); + strPtr->unk40 = maxHp; + strPtr->unk3E = hp; + strPtr->unk42 = maxHp / 8; + if (maxHp % 8 != 0) { + strPtr->unk42++; + } + + if (strPtr->unk42 >= 12) { + strPtr->unk42 = 12; + } + + for (i = 0; i < 12; i++) { + gUnknown_202B038[0][0][18 + i] = (0x2CC + i) | 0xF000; + } +} + +extern const s32 gUnknown_80F64B4[]; +extern const u16 gUnknown_80F64D8[][9]; + +void sub_803FE30(s32 a0, u16 *a1, u8 a2, u8 a3) +{ + s32 var = 0; + if (!a2) { + var = 55; + } + + if (a0 > 100) { + if (a2) { + a1[0] = 0xF291; + a1[1] = 0xF291; + } + else { + a1[0] = 0xF2C8; + a1[1] = 0xF2C8; + } + } + else if (a0 == 100) { + a1[0] = 0xF294; + a1[1] = 0xF295; + } + else { + // I thought 'ptr' was a compiler generated variable, but I couldn't match the function without declaring it. + u16 *ptr = a1 + 1; + s32 r7 = var + 48; + + if (a0 >= 10) { + s32 i; + s32 arrId = (a2 == 0) ? 1 : 0; + + for (i = 0; i < 9; i++) { + #ifndef NONMATCHING + a1++;a1--; // Good old matching trick. + #endif // NONMATCHING + if (gUnknown_80F64B4[i] <= a0) { + *a1 = gUnknown_80F64D8[arrId][i]; + *ptr = (((a0 - gUnknown_80F64B4[i]) + r7) + 0x258) | 0xF000; + return; + } + } + } + if (a3 == 0) { + *(a1++) = 0xF278; + } + + *a1 = (a0 + r7 + 0x258) | 0xF000; + } +} + //