From 3dc536c92cb1fb29e49591eeebb6c56d2ca286d2 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Tue, 5 Nov 2024 10:54:24 +0100 Subject: [PATCH] sub_806F370 --- asm/code_806E8B0.s | 1160 -------------------------------------------- ld_script.txt | 1 - src/code_806E8B0.c | 220 ++++++--- 3 files changed, 163 insertions(+), 1218 deletions(-) delete mode 100644 asm/code_806E8B0.s diff --git a/asm/code_806E8B0.s b/asm/code_806E8B0.s deleted file mode 100644 index a155a5157..000000000 --- a/asm/code_806E8B0.s +++ /dev/null @@ -1,1160 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start sub_806EAF4 -sub_806EAF4: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x8C - str r0, [sp, 0x70] - mov r9, r1 - adds r7, r3, 0 - ldr r0, [sp, 0xB8] - ldr r1, [sp, 0xBC] - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0x74] - lsls r0, 16 - lsrs r4, r0, 16 - lsls r1, 24 - lsrs r1, 24 - str r1, [sp, 0x78] - ldr r0, [sp, 0x70] - ldr r0, [r0, 0x70] - mov r10, r0 - mov r1, r9 - ldr r1, [r1, 0x70] - str r1, [sp, 0x7C] - adds r0, r2, 0 - bl IsTypePhysical - movs r2, 0 - str r2, [sp, 0x80] - lsls r0, 24 - cmp r0, 0 - bne _0806EB3A - movs r3, 0x1 - str r3, [sp, 0x80] -_0806EB3A: - bl sub_806F500 - mov r6, r10 - ldrb r0, [r6, 0x7] - cmp r0, 0 - bne _0806EB72 - movs r0, 0x9E - lsls r0, 1 - add r0, r10 - ldr r0, [r0] - bl FixedPointToInt - adds r1, r0, 0 - cmp r1, 0 - bne _0806EB72 - movs r0, 0x1 - ldr r2, [sp, 0xB0] - str r0, [r2] - str r1, [r2, 0x4] - movs r0, 0x2 - str r0, [r2, 0x8] - add r3, sp, 0x74 - ldrb r3, [r3] - strb r3, [r2, 0xC] - strb r1, [r2, 0xD] - strb r1, [r2, 0xE] - strb r1, [r2, 0xF] - b _0806F294 -_0806EB72: - ldr r0, _0806EBA4 - cmp r4, r0 - bne _0806EBA8 - mov r0, r9 - movs r1, 0x35 - bl HasAbility - lsls r0, 24 - cmp r0, 0 - beq _0806EBA8 - movs r0, 0x1 - ldr r6, [sp, 0xB0] - str r0, [r6] - movs r1, 0 - str r1, [r6, 0x4] - movs r0, 0x2 - str r0, [r6, 0x8] - add r0, sp, 0x74 - ldrb r0, [r0] - strb r0, [r6, 0xC] - strb r1, [r6, 0xD] - strb r1, [r6, 0xE] - strb r1, [r6, 0xF] - b _0806F294 - .align 2, 0 -_0806EBA4: .4byte 0x00000163 -_0806EBA8: - add r1, sp, 0x74 - ldrb r2, [r1] - ldr r1, [sp, 0xB0] - strb r2, [r1, 0xC] - ldr r1, _0806EDA4 - ldr r0, [r1] - movs r2, 0x9A - lsls r2, 1 - adds r0, r2 - add r3, sp, 0x74 - ldrb r3, [r3] - strb r3, [r0] - ldr r2, [r1] - movs r6, 0x9C - lsls r6, 1 - adds r0, r2, r6 - ldr r1, [sp, 0x80] - str r1, [r0] - lsls r1, 1 - mov r0, r10 - adds r0, 0x1C - adds r0, r1 - movs r3, 0 - ldrsh r4, [r0, r3] - mov r8, r1 - ldr r6, [sp, 0x78] - cmp r6, 0 - beq _0806EBF8 - ldr r0, [sp, 0x74] - cmp r0, 0x2 - bne _0806EBF8 - mov r1, r10 - movs r3, 0x28 - ldrsh r0, [r1, r3] - adds r4, r0 - ldrh r1, [r1, 0x28] - movs r6, 0xA2 - lsls r6, 1 - adds r0, r2, r6 - strh r1, [r0] -_0806EBF8: - mov r0, r10 - movs r2, 0x4 - ldrsh r1, [r0, r2] - ldr r0, _0806EDA8 - cmp r1, r0 - bne _0806EC06 - adds r4, 0x2 -_0806EC06: - movs r0, 0xD1 - lsls r0, 1 - cmp r1, r0 - bne _0806EC10 - subs r4, 0x2 -_0806EC10: - ldr r0, _0806EDAC - cmp r1, r0 - bne _0806EC18 - subs r4, 0x2 -_0806EC18: - cmp r4, 0 - bge _0806EC1E - movs r4, 0 -_0806EC1E: - cmp r4, 0x14 - ble _0806EC24 - movs r4, 0x14 -_0806EC24: - ldr r6, _0806EDA4 - ldr r0, [r6] - movs r3, 0x9F - lsls r3, 1 - adds r0, r3 - strb r4, [r0] - ldr r1, [r6] - mov r5, r10 - adds r5, 0x14 - ldr r0, [sp, 0x80] - adds r2, r5, r0 - ldrb r0, [r2] - adds r0, r7 - adds r3, 0x2 - adds r1, r3 - strh r0, [r1] - ldrb r0, [r2] - adds r0, r7 - lsls r0, 8 - ldr r2, _0806EDB0 - lsls r1, r4, 2 - adds r1, r2 - ldr r1, [r1] - bl s24_8_mul - adds r2, r0, 0 - ldr r0, [sp, 0x80] - lsls r4, r0, 2 - mov r0, r10 - adds r0, 0x2C - adds r0, r4 - ldr r1, [r0] - adds r0, r2, 0 - bl s24_8_mul - adds r2, r0, 0 - str r5, [sp, 0x88] - cmp r2, 0 - bge _0806EC74 - adds r0, 0xFF -_0806EC74: - asrs r0, 8 - str r0, [sp, 0x8] - ldr r0, [sp, 0x7C] - adds r0, 0x20 - add r0, r8 - movs r1, 0 - ldrsh r3, [r0, r1] - ldr r2, [sp, 0x80] - cmp r2, 0 - bne _0806ECA0 - ldr r0, [sp, 0x7C] - adds r0, 0xC0 - ldrb r0, [r0] - cmp r0, 0x6 - bne _0806ECA0 - ldr r0, [r6] - movs r6, 0xBD - lsls r6, 1 - adds r1, r0, r6 - movs r0, 0x1 - strb r0, [r1] - adds r3, 0x1 -_0806ECA0: - ldr r0, [sp, 0x7C] - movs r2, 0x4 - ldrsh r1, [r0, r2] - ldr r0, _0806EDA8 - cmp r1, r0 - bne _0806ECAE - subs r3, 0x2 -_0806ECAE: - movs r0, 0xD1 - lsls r0, 1 - cmp r1, r0 - bne _0806ECB8 - adds r3, 0x2 -_0806ECB8: - ldr r0, _0806EDAC - cmp r1, r0 - bne _0806ECC0 - subs r3, 0x2 -_0806ECC0: - cmp r3, 0 - bge _0806ECC6 - movs r3, 0 -_0806ECC6: - cmp r3, 0x14 - ble _0806ECCC - movs r3, 0x14 -_0806ECCC: - ldr r5, _0806EDA4 - ldr r0, [r5] - ldr r6, _0806EDB4 - adds r0, r6 - strb r3, [r0] - ldr r2, [r5] - ldr r0, [sp, 0x7C] - adds r0, 0x16 - ldr r1, [sp, 0x80] - adds r0, r1 - ldrb r1, [r0] - adds r6, 0x3 - adds r2, r6 - strh r1, [r2] - ldrb r0, [r0] - lsls r0, 8 - ldr r2, _0806EDB8 - lsls r1, r3, 2 - adds r1, r2 - ldr r1, [r1] - bl s24_8_mul - adds r2, r0, 0 - ldr r0, [sp, 0x7C] - adds r0, 0x34 - adds r0, r4 - ldr r1, [r0] - adds r0, r2, 0 - bl s24_8_mul - cmp r0, 0 - bge _0806ED0E - adds r0, 0xFF -_0806ED0E: - asrs r0, 8 - str r0, [sp, 0xC] - movs r0, 0x64 - bl DungeonRandInt - str r0, [sp, 0x84] - ldr r0, [sp, 0x80] - cmp r0, 0 - bne _0806EDC8 - ldr r0, [sp, 0x70] - movs r1, 0x13 - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806ED4A - ldr r2, _0806EDBC - movs r3, 0 - ldrsh r1, [r2, r3] - ldr r0, [sp, 0x8] - adds r0, r1 - str r0, [sp, 0x8] - ldr r1, [r5] - movs r6, 0xB0 - lsls r6, 1 - adds r1, r6 - ldrb r0, [r2] - ldrb r2, [r1] - adds r0, r2 - strb r0, [r1] -_0806ED4A: - ldr r0, [sp, 0x70] - movs r1, 0x2B - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806ED74 - ldr r2, _0806EDC0 - movs r3, 0 - ldrsh r1, [r2, r3] - ldr r0, [sp, 0x8] - adds r0, r1 - str r0, [sp, 0x8] - ldr r1, [r5] - movs r6, 0xB0 - lsls r6, 1 - adds r1, r6 - ldrb r0, [r2] - ldrb r2, [r1] - adds r0, r2 - strb r0, [r1] -_0806ED74: - ldr r3, [sp, 0x78] - cmp r3, 0 - beq _0806EE4A - mov r0, r9 - movs r1, 0x1E - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806EE4A - ldr r2, _0806EDC4 - movs r6, 0 - ldrsh r1, [r2, r6] - ldr r0, [sp, 0xC] - adds r0, r1 - str r0, [sp, 0xC] - ldr r0, [r5] - movs r3, 0xB1 - lsls r3, 1 - adds r1, r0, r3 - ldrb r0, [r2] - ldrb r6, [r1] - adds r0, r6 - b _0806EE48 - .align 2, 0 -_0806EDA4: .4byte gDungeon -_0806EDA8: .4byte 0x000001a1 -_0806EDAC: .4byte 0x000001a3 -_0806EDB0: .4byte gUnknown_80F504C -_0806EDB4: .4byte 0x0000013f -_0806EDB8: .4byte gUnknown_80F50A0 -_0806EDBC: .4byte gUnknown_810AC60 -_0806EDC0: .4byte gUnknown_810AC68 -_0806EDC4: .4byte gUnknown_810AC64 -_0806EDC8: - ldr r0, [sp, 0x78] - cmp r0, 0 - beq _0806EDF6 - mov r0, r9 - movs r1, 0x22 - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806EDF6 - ldr r2, _0806EEF8 - movs r3, 0 - ldrsh r1, [r2, r3] - ldr r0, [sp, 0xC] - adds r0, r1 - str r0, [sp, 0xC] - ldr r0, [r5] - ldr r6, _0806EEFC - adds r1, r0, r6 - ldrb r0, [r2] - ldrb r2, [r1] - adds r0, r2 - strb r0, [r1] -_0806EDF6: - ldr r0, [sp, 0x70] - movs r1, 0x21 - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806EE20 - ldr r2, _0806EF00 - movs r3, 0 - ldrsh r1, [r2, r3] - ldr r0, [sp, 0x8] - adds r0, r1 - str r0, [sp, 0x8] - ldr r0, _0806EF04 - ldr r0, [r0] - ldr r6, _0806EF08 - adds r1, r0, r6 - ldrb r0, [r2] - ldrb r2, [r1] - adds r0, r2 - strb r0, [r1] -_0806EE20: - ldr r0, [sp, 0x70] - movs r1, 0x2B - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806EE4A - ldr r2, _0806EF0C - movs r3, 0 - ldrsh r1, [r2, r3] - ldr r0, [sp, 0x8] - adds r0, r1 - str r0, [sp, 0x8] - ldr r0, _0806EF04 - ldr r0, [r0] - ldr r6, _0806EF08 - adds r1, r0, r6 - ldrb r0, [r2] - ldrb r2, [r1] - adds r0, r2 -_0806EE48: - strb r0, [r1] -_0806EE4A: - ldr r0, _0806EF04 - ldr r2, [r0] - movs r3, 0xA3 - lsls r3, 1 - adds r1, r2, r3 - add r0, sp, 0x8 - ldrh r0, [r0] - strh r0, [r1] - movs r6, 0xA4 - lsls r6, 1 - adds r1, r2, r6 - add r4, sp, 0xC - ldrh r0, [r4] - strh r0, [r1] - ldr r0, [sp, 0x8] - cmp r0, 0 - bge _0806EE70 - movs r0, 0 - str r0, [sp, 0x8] -_0806EE70: - ldr r1, _0806EF10 - ldr r0, [sp, 0x8] - cmp r0, r1 - ble _0806EE7C - ldr r0, _0806EF14 - str r0, [sp, 0x8] -_0806EE7C: - movs r3, 0xA8 - lsls r3, 1 - add r3, r10 - ldrh r2, [r3] - ldr r1, _0806EF18 - adds r0, r1, 0 - ands r0, r2 - strh r0, [r3] - movs r2, 0xA7 - lsls r2, 1 - add r2, r10 - ldrh r0, [r2] - ands r1, r0 - strh r1, [r2] - str r4, [sp] - ldr r0, [sp, 0x84] - str r0, [sp, 0x4] - ldr r0, [sp, 0x70] - mov r1, r9 - ldr r2, [sp, 0x74] - add r3, sp, 0x8 - bl sub_806E8B0 - add r5, sp, 0x10 - ldr r1, [sp, 0x8] - ldr r0, [sp, 0xC] - subs r1, r0 - adds r0, r5, 0 - bl sub_800A020 - add r4, sp, 0x18 - adds r0, r4, 0 - movs r1, 0x8 - bl sub_800A020 - adds r0, r5, 0 - adds r1, r5, 0 - adds r2, r4, 0 - bl sub_800A3F0 - mov r1, r10 - ldrb r6, [r1, 0x6] - mov r8, r5 - adds r7, r4, 0 - cmp r6, 0 - bne _0806EF20 - ldrb r1, [r1, 0x9] - adds r0, r7, 0 - bl sub_800A020 - str r6, [sp, 0x20] - ldr r0, _0806EF1C - add r2, sp, 0x20 - str r0, [r2, 0x4] - adds r0, r7, 0 - adds r1, r7, 0 - bl sub_800A34C - mov r2, r10 - ldrb r0, [r2, 0x9] - lsls r0, 1 - b _0806EF60 - .align 2, 0 -_0806EEF8: .4byte gUnknown_810AC66 -_0806EEFC: .4byte 0x00000163 -_0806EF00: .4byte gUnknown_810AC62 -_0806EF04: .4byte gDungeon -_0806EF08: .4byte 0x00000161 -_0806EF0C: .4byte gUnknown_810AC68 -_0806EF10: .4byte 0x000003e6 -_0806EF14: .4byte 0x000003e7 -_0806EF18: .4byte 0x0000feff -_0806EF1C: .4byte 0x0000aaaa -_0806EF20: - ldr r3, [sp, 0x88] - ldr r6, [sp, 0x80] - adds r0, r3, r6 - ldrb r0, [r0] - str r0, [sp, 0x28] - movs r0, 0x1 - str r0, [sp, 0x2C] - add r3, sp, 0x28 - add r0, sp, 0x2C - str r0, [sp] - ldr r0, [sp, 0x84] - str r0, [sp, 0x4] - ldr r0, [sp, 0x70] - mov r1, r9 - ldr r2, [sp, 0x74] - bl sub_806E8B0 - ldr r1, [sp, 0x28] - adds r0, r7, 0 - bl sub_800A020 - add r4, sp, 0x20 - adds r0, r4, 0 - movs r1, 0x3 - bl sub_800A020 - adds r0, r7, 0 - adds r1, r7, 0 - adds r2, r4, 0 - bl sub_800A3F0 - ldr r0, [sp, 0x28] -_0806EF60: - movs r1, 0x3 - bl __divsi3 - adds r6, r0, 0 - add r5, sp, 0x30 - adds r0, r5, 0 - mov r1, r8 - adds r2, r7, 0 - bl sub_800A6D0 - ldr r4, _0806F098 - ldr r0, [r4] - movs r1, 0xA5 - lsls r1, 1 - adds r0, r1 - movs r2, 0 - mov r8, r2 - strh r6, [r0] - adds r0, r5, 0 - bl sub_800A048 - ldr r1, [r4] - movs r3, 0xA6 - lsls r3, 1 - adds r1, r3 - strh r0, [r1] - ldr r0, [sp, 0x30] - ldr r1, [sp, 0x34] - str r0, [sp, 0x38] - str r1, [sp, 0x3C] - str r0, [sp, 0x48] - str r1, [sp, 0x4C] - add r6, sp, 0x38 - adds r0, r6, 0 - adds r1, r6, 0 - adds r2, r6, 0 - bl sub_800A34C - mov r0, r8 - str r0, [sp, 0x40] - ldr r0, _0806F09C - add r5, sp, 0x40 - str r0, [r5, 0x4] - adds r0, r6, 0 - adds r1, r6, 0 - adds r2, r5, 0 - bl sub_800A34C - adds r0, r5, 0 - movs r1, 0x2 - bl sub_800A020 - add r4, sp, 0x48 - adds r0, r4, 0 - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_800A34C - ldr r1, [sp, 0xC] - adds r0, r5, 0 - bl sub_800A020 - adds r0, r4, 0 - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_800A6F0 - adds r0, r5, 0 - movs r1, 0xA - bl sub_800A020 - adds r0, r4, 0 - adds r1, r4, 0 - adds r2, r5, 0 - bl sub_800A6D0 - add r5, sp, 0x50 - adds r0, r5, 0 - adds r1, r6, 0 - adds r2, r4, 0 - bl sub_800A6D0 - ldr r4, _0806F0A0 - adds r0, r4, 0 - adds r1, r5, 0 - bl sub_800A2F0 - lsls r0, 24 - mov r8, r5 - cmp r0, 0 - beq _0806F01E - ldr r0, [r4] - ldr r1, [r4, 0x4] - str r0, [sp, 0x50] - str r1, [sp, 0x54] -_0806F01E: - ldr r4, _0806F0A4 - mov r0, r8 - adds r1, r4, 0 - bl sub_800A2F0 - lsls r0, 24 - cmp r0, 0 - beq _0806F036 - ldr r0, [r4] - ldr r1, [r4, 0x4] - str r0, [sp, 0x50] - str r1, [sp, 0x54] -_0806F036: - add r4, sp, 0x58 - ldr r1, [sp, 0xB0] - str r1, [sp] - adds r0, r4, 0 - ldr r1, [sp, 0x70] - mov r2, r9 - ldr r3, [sp, 0x74] - bl sub_806E100 - lsls r0, 24 - lsrs r5, r0, 24 - adds r7, r4, 0 - ldr r2, [sp, 0x74] - cmp r2, 0x2 - bne _0806F0BC - mov r0, r9 - bl GetFlashFireStatus - lsls r0, 24 - lsrs r4, r0, 24 - cmp r4, 0 - beq _0806F0BC - ldr r3, [sp, 0x7C] - movs r6, 0xA9 - lsls r6, 1 - adds r1, r3, r6 - ldrb r0, [r1] - cmp r0, 0 - bne _0806F0BC - ldr r0, [sp, 0x78] - cmp r0, 0 - beq _0806F118 - movs r0, 0x1 - strb r0, [r1] - ldr r0, _0806F0A8 - mov r1, r9 - movs r2, 0 - bl SetMessageArgument - cmp r4, 0x1 - bne _0806F0B0 - ldr r0, _0806F0AC - ldr r2, [r0] - ldr r0, [sp, 0x70] - mov r1, r9 - bl TryDisplayDungeonLoggableMessage3 - b _0806F0BC - .align 2, 0 -_0806F098: .4byte gDungeon -_0806F09C: .4byte 0x00000ccc -_0806F0A0: .4byte gUnknown_8106F24 -_0806F0A4: .4byte gUnknown_8106F04 -_0806F0A8: .4byte gFormatBuffer_Monsters + 0x50 -_0806F0AC: .4byte gUnknown_80FAE00 -_0806F0B0: - ldr r0, _0806F15C - ldr r2, [r0] - ldr r0, [sp, 0x70] - mov r1, r9 - bl TryDisplayDungeonLoggableMessage3 -_0806F0BC: - ldr r1, [sp, 0x78] - cmp r1, 0 - beq _0806F118 - ldr r2, [sp, 0x80] - cmp r2, 0 - bne _0806F0EE - ldr r0, [sp, 0x7C] - adds r0, 0xC4 - ldrb r4, [r0] - cmp r4, 0x1 - bne _0806F0EE - mov r0, r9 - bl sub_8041B74 - ldr r2, _0806F160 - adds r0, r7, 0 - adds r1, r7, 0 - bl sub_800A34C - ldr r0, _0806F164 - ldr r0, [r0] - movs r3, 0xB3 - lsls r3, 1 - adds r0, r3 - strb r4, [r0] -_0806F0EE: - ldr r6, [sp, 0x80] - cmp r6, 0x1 - bne _0806F118 - ldr r0, [sp, 0x7C] - adds r0, 0xC4 - ldrb r0, [r0] - cmp r0, 0x3 - bne _0806F118 - mov r0, r9 - bl sub_8041B5C - ldr r2, _0806F160 - adds r0, r7, 0 - adds r1, r7, 0 - bl sub_800A34C - ldr r0, _0806F164 - ldr r0, [r0] - ldr r1, _0806F168 - adds r0, r1 - strb r6, [r0] -_0806F118: - mov r0, r9 - movs r1, 0xC - bl HasAbility - lsls r0, 24 - cmp r0, 0 - bne _0806F1F4 - mov r0, r9 - movs r1, 0x13 - bl HasAbility - lsls r0, 24 - cmp r0, 0 - bne _0806F1F4 - mov r3, r10 - ldrb r0, [r3, 0x6] - ldr r4, [sp, 0xAC] - cmp r0, 0 - beq _0806F140 - movs r4, 0 -_0806F140: - mov r0, r10 - adds r0, 0xDC - ldrb r0, [r0] - cmp r0, 0x4 - bne _0806F170 - ldr r4, _0806F16C - ldr r0, _0806F164 - ldr r0, [r0] - movs r6, 0xB4 - lsls r6, 1 - adds r0, r6 - movs r1, 0x1 - strb r1, [r0] - b _0806F1DA - .align 2, 0 -_0806F15C: .4byte gUnknown_80FADD8 -_0806F160: .4byte gUnknown_8106F1C -_0806F164: .4byte gDungeon -_0806F168: .4byte 0x00000167 -_0806F16C: .4byte 0x000003e7 -_0806F170: - ldr r0, [sp, 0x70] - movs r1, 0xC - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806F194 - ldr r0, _0806F2A4 - movs r1, 0 - ldrsh r0, [r0, r1] - adds r4, r0 - ldr r0, _0806F2A8 - ldr r0, [r0] - movs r2, 0xB2 - lsls r2, 1 - adds r0, r2 - movs r1, 0x1 - strb r1, [r0] -_0806F194: - mov r0, r9 - movs r1, 0xD - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - beq _0806F1B6 - ldr r0, _0806F2A4 - movs r3, 0 - ldrsh r0, [r0, r3] - adds r4, r0 - ldr r0, _0806F2A8 - ldr r0, [r0] - ldr r6, _0806F2AC - adds r1, r0, r6 - movs r0, 0x1 - strb r0, [r1] -_0806F1B6: - cmp r5, 0 - beq _0806F1DA - ldr r0, [sp, 0x70] - movs r1, 0x1 - bl IQSkillIsEnabled - lsls r0, 24 - cmp r0, 0 - beq _0806F1DA - ldr r0, _0806F2B0 - movs r1, 0 - ldrsh r4, [r0, r1] - ldr r0, _0806F2A8 - ldr r0, [r0] - ldr r2, _0806F2B4 - adds r1, r0, r2 - movs r0, 0x1 - strb r0, [r1] -_0806F1DA: - movs r0, 0x64 - bl DungeonRandInt - cmp r0, r4 - bge _0806F1F4 - ldr r2, _0806F2B8 - adds r0, r7, 0 - adds r1, r7, 0 - bl sub_800A34C - movs r0, 0x1 - ldr r3, [sp, 0xB0] - strb r0, [r3, 0xD] -_0806F1F4: - mov r0, r8 - bl sub_800A048 - ldr r5, _0806F2A8 - ldr r1, [r5] - movs r6, 0xAA - lsls r6, 1 - adds r1, r6 - str r0, [r1] - mov r0, r8 - mov r1, r8 - adds r2, r7, 0 - bl sub_800A34C - ldr r0, [r5] - movs r1, 0xAE - lsls r1, 1 - adds r0, r1 - ldr r2, [sp, 0xB4] - str r2, [r0] - add r4, sp, 0x60 - adds r0, r4, 0 - adds r1, r2, 0 - bl sub_800A088 - mov r0, r8 - mov r1, r8 - adds r2, r4, 0 - bl sub_800A34C - mov r0, r8 - bl sub_800A048 - ldr r1, [r5] - movs r3, 0xA8 - lsls r3, 1 - adds r1, r3 - str r0, [r1] - movs r0, 0x80 - lsls r0, 7 - bl DungeonRandInt - movs r6, 0 - str r6, [sp, 0x58] - movs r1, 0xE0 - lsls r1, 8 - adds r0, r1 - str r0, [r7, 0x4] - mov r0, r8 - mov r1, r8 - adds r2, r7, 0 - bl sub_800A34C - add r4, sp, 0x68 - adds r0, r4, 0 - movs r1, 0x64 - bl sub_800A020 - adds r0, r7, 0 - adds r1, r4, 0 - adds r2, r7, 0 - bl sub_800A34C - adds r0, r7, 0 - bl sub_800A048 - ldr r1, [r5] - movs r2, 0xAC - lsls r2, 1 - adds r1, r2 - str r0, [r1] - mov r0, r8 - bl sub_800A048 - ldr r3, [sp, 0xB0] - str r0, [r3] - str r6, [r3, 0x4] - cmp r0, 0 - bne _0806F294 - strb r0, [r3, 0xD] -_0806F294: - add sp, 0x8C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806F2A4: .4byte gUnknown_80F4DAE -_0806F2A8: .4byte gDungeon -_0806F2AC: .4byte 0x00000165 -_0806F2B0: .4byte gUnknown_80F4DB0 -_0806F2B4: .4byte 0x00000169 -_0806F2B8: .4byte gUnknown_8106F14 - thumb_func_end sub_806EAF4 - - thumb_func_start sub_806F2BC -sub_806F2BC: - push {r4-r7,lr} - mov r7, r8 - push {r7} - sub sp, 0x14 - adds r5, r0, 0 - mov r12, r1 - ldr r7, [sp, 0x2C] - lsls r2, 24 - lsrs r4, r2, 24 - adds r6, r3, 0 - cmp r6, 0 - bgt _0806F2D6 - movs r6, 0x1 -_0806F2D6: - ldr r0, _0806F320 - cmp r6, r0 - ble _0806F2DE - adds r6, r0, 0 -_0806F2DE: - movs r0, 0 - mov r8, r0 - strb r4, [r7, 0xC] - str r7, [sp] - add r0, sp, 0x4 - adds r1, r5, 0 - mov r2, r12 - adds r3, r4, 0 - bl sub_806E100 - add r4, sp, 0xC - adds r0, r4, 0 - adds r1, r6, 0 - bl sub_800A020 - adds r0, r4, 0 - adds r1, r4, 0 - add r2, sp, 0x4 - bl sub_800A34C - adds r0, r4, 0 - bl sub_800A048 - str r0, [r7] - mov r0, r8 - str r0, [r7, 0x4] - add sp, 0x14 - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0806F320: .4byte 0x000003e7 - thumb_func_end sub_806F2BC - - thumb_func_start DealDamageToEntity -DealDamageToEntity: - push {r4-r6,lr} - mov r6, r8 - push {r6} - sub sp, 0x94 - mov r8, r0 - adds r5, r1, 0 - adds r6, r2, 0 - lsls r4, r3, 16 - asrs r4, 16 - add r0, sp, 0x10 - bl sub_80457DC - add r2, sp, 0x84 - str r5, [sp, 0x84] - movs r0, 0x2 - str r0, [r2, 0x8] - movs r0, 0 - strb r0, [r2, 0xC] - str r6, [r2, 0x4] - strb r0, [r2, 0xD] - strb r0, [r2, 0xE] - strb r0, [r2, 0xF] - str r0, [sp] - str r4, [sp, 0x4] - str r0, [sp, 0x8] - str r0, [sp, 0xC] - add r0, sp, 0x10 - mov r1, r8 - movs r3, 0 - bl HandleDealingDamage - add sp, 0x94 - pop {r3} - mov r8, r3 - pop {r4-r6} - pop {r0} - bx r0 - thumb_func_end DealDamageToEntity - - thumb_func_start sub_806F370 -sub_806F370: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x2C - mov r10, r0 - adds r7, r1, 0 - mov r9, r3 - ldr r0, [sp, 0x50] - ldr r1, [sp, 0x54] - ldr r3, [sp, 0x58] - lsls r0, 24 - lsrs r4, r0, 24 - lsls r1, 16 - asrs r1, 16 - mov r8, r1 - adds r5, r2, 0 - movs r0, 0x2 - str r0, [sp, 0x18] - str r3, [sp, 0x14] - add r0, sp, 0x10 - movs r1, 0 - strb r4, [r0, 0xC] - strb r1, [r0, 0xD] - strb r1, [r0, 0xE] - cmp r4, 0 - beq _0806F3FC - ldr r1, [r7, 0x70] - movs r2, 0 - lsls r0, r4, 3 - mov r3, sp - adds r3, 0x20 - str r3, [sp, 0x28] - ldr r6, _0806F408 - mov r12, r6 - adds r1, 0x5C - adds r0, r4 - lsls r3, r0, 2 - ldr r4, [sp, 0x28] -_0806F3C0: - adds r0, r1, r2 - ldrb r0, [r0] - lsls r0, 1 - adds r0, r3 - add r0, r12 - movs r6, 0 - ldrsh r0, [r0, r6] - stm r4!, {r0} - adds r2, 0x1 - cmp r2, 0x1 - ble _0806F3C0 - adds r0, r7, 0 - movs r1, 0x35 - bl HasAbility - lsls r0, 24 - cmp r0, 0 - beq _0806F3FC - ldr r2, _0806F40C - ldr r1, [sp, 0x28] - ldr r0, [r1, 0x4] - lsls r0, 2 - ldr r1, [sp, 0x20] - lsls r1, 4 - adds r0, r1 - adds r0, r2 - ldr r0, [r0] - cmp r0, 0x3 - beq _0806F3FC - movs r5, 0 -_0806F3FC: - str r5, [sp, 0x10] - cmp r5, 0 - bne _0806F410 - add r1, sp, 0x10 - movs r0, 0x1 - b _0806F414 - .align 2, 0 -_0806F408: .4byte gTypeEffectivenessChart -_0806F40C: .4byte gUnknown_80F54B4 -_0806F410: - add r1, sp, 0x10 - movs r0, 0 -_0806F414: - strb r0, [r1, 0xF] - mov r3, r9 - str r3, [sp] - mov r6, r8 - str r6, [sp, 0x4] - ldr r0, [sp, 0x5C] - str r0, [sp, 0x8] - ldr r0, [sp, 0x60] - str r0, [sp, 0xC] - mov r0, r10 - adds r1, r7, 0 - add r2, sp, 0x10 - movs r3, 0 - bl HandleDealingDamage - ldr r0, [sp, 0x4C] - cmp r0, 0 - beq _0806F440 - add r0, sp, 0x10 - ldrb r0, [r0, 0xF] - ldr r1, [sp, 0x4C] - strb r0, [r1] -_0806F440: - add sp, 0x2C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_806F370 - - .align 2,0 diff --git a/ld_script.txt b/ld_script.txt index 77ff0e155..37b242d81 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -249,7 +249,6 @@ SECTIONS { src/code_806CD90.o(.text); src/type_effectiveness.o(.text); src/code_806E8B0.o(.text); - asm/code_806E8B0.o(.text); src/code_806FDF4.o(.text); src/status_checks.o(.text); src/dungeon_movement.o(.text); diff --git a/src/code_806E8B0.c b/src/code_806E8B0.c index 2eef6af38..ca1870596 100644 --- a/src/code_806E8B0.c +++ b/src/code_806E8B0.c @@ -145,12 +145,15 @@ extern void sub_800A34C(struct unkStruct_80943A8 *param_1, struct unkStruct_8094 extern void sub_800A6F0(struct unkStruct_80943A8 *param_1, struct unkStruct_80943A8 *param_2, struct unkStruct_80943A8 *param3); extern void sub_800A088(struct unkStruct_80943A8 *param_1, u32 param_2); extern u32 sub_800A048(struct unkStruct_80943A8 *param_1); -extern bool8 sub_800A2F0(const struct unkStruct_80943A8*, struct unkStruct_80943A8*); +extern bool8 sub_800A2F0(const struct unkStruct_80943A8*, const struct unkStruct_80943A8*); extern bool8 sub_806E100(struct unkStruct_80943A8 *param_1, Entity *pokemon, Entity *target, u8 type, struct DamageStruct *dmgStruct); extern void sub_8041B74(Entity *pokemon); extern void sub_8041B5C(Entity *pokemon); +extern void HandleDealingDamage(Entity *attacker, Entity *target, struct DamageStruct *dmgStruct, bool32 isFalseSwipe, bool32 giveExp, s16 arg4, bool32 arg8, s32 argC); +extern void sub_80457DC(Entity *); extern const s32 gUnknown_80F504C[]; +extern const s32 gUnknown_80F50A0[]; extern const s16 gUnknown_810AC60; extern const s16 gUnknown_810AC68; extern const s16 gUnknown_810AC64; @@ -166,41 +169,39 @@ extern const struct unkStruct_80943A8 gUnknown_8106F14; extern const u8 *const gUnknown_80FAE00; extern const u8 *const gUnknown_80FADD8; -void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u32 critChance, struct DamageStruct *dmgStruct, u32 arg_8, u16 moveId, bool8 arg_10) +static inline void SetDamageOne(struct DamageStruct *dmgStruct, u8 moveType) +{ + dmgStruct->dmg = 1; + dmgStruct->residualDmgType = 0; + dmgStruct->typeEffectiveness = EFFECTIVENESS_NEUTRAL; + dmgStruct->type = moveType; + dmgStruct->isCrit = FALSE; + dmgStruct->unkE = 0; + dmgStruct->unkF = 0; +} + +void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, s32 movePower, s32 critChance, struct DamageStruct *dmgStruct, s32 arg8, u16 moveId, bool8 arg_10) { EntityInfo *attackerInfo = GetEntInfo(attacker); EntityInfo *targetInfo = GetEntInfo(target); - bool32 physicalMove = (IsTypePhysical(moveType) != FALSE); + s32 splitIndex = (!IsTypePhysical(moveType)) ? 1 : 0; sub_806F500(); if (!attackerInfo->isTeamLeader && FixedPointToInt(attackerInfo->belly) == 0) { - dmgStruct->dmg = 1; - dmgStruct->residualDmgType = 0; - dmgStruct->typeEffectiveness = EFFECTIVENESS_NEUTRAL; - dmgStruct->type = moveType; - dmgStruct->isCrit = FALSE; - dmgStruct->unkE = 0; - dmgStruct->unkF = 0; + SetDamageOne(dmgStruct, moveType); } else if (moveId == MOVE_REGULAR_ATTACK && HasAbility(target, ABILITY_WONDER_GUARD)) { - dmgStruct->dmg = 1; - dmgStruct->residualDmgType = 0; - dmgStruct->typeEffectiveness = EFFECTIVENESS_NEUTRAL; - dmgStruct->type = moveType; - dmgStruct->isCrit = FALSE; - dmgStruct->unkE = 0; - dmgStruct->unkF = 0; + SetDamageOne(dmgStruct, moveType); } else { s32 atkStatStage, defStatStage; - s32 atkStatCalc, defStatCalc; + s32 statCalc; s32 atkStat, defStat; s32 rand; + s32 r6; struct unkStruct_80943A8 unkSp1; struct unkStruct_80943A8 unkSp2; struct unkStruct_80943A8 unkSp3; - s32 r6; - s32 unkAtkStat2, unkDefStat2; struct unkStruct_80943A8 unkSp4; struct unkStruct_80943A8 unkSp5; struct unkStruct_80943A8 unkSp6; @@ -213,9 +214,9 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u dmgStruct->type = moveType; gDungeon->unk134.unk134 = moveType; - gDungeon->unk134.unk138 = physicalMove; + gDungeon->unk134.unk138 = splitIndex; - atkStatStage = attackerInfo->offensiveStages[physicalMove]; + atkStatStage = attackerInfo->offensiveStages[splitIndex]; if (arg_10 && moveType == TYPE_FIRE) { atkStatStage += attackerInfo->flashFireBoost; gDungeon->unk134.unk140[2] = attackerInfo->flashFireBoost; @@ -234,13 +235,13 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u if (atkStatStage > 20) atkStatStage = 20; gDungeon->unk134.unk13E[0] = atkStatStage; - gDungeon->unk134.unk140[0] = attackerInfo->atk[physicalMove] + movePower; - atkStatCalc = s24_8_mul((attackerInfo->atk[physicalMove] + movePower) * 256, gUnknown_80F504C[atkStatStage]); - atkStatCalc = s24_8_mul(atkStatCalc, attackerInfo->offensiveMultipliers[physicalMove]); - atkStat = atkStatCalc / 8; + gDungeon->unk134.unk140[0] = attackerInfo->atk[splitIndex] + movePower; + statCalc = s24_8_mul((attackerInfo->atk[splitIndex] + movePower) * 256, gUnknown_80F504C[atkStatStage]); + statCalc = s24_8_mul(statCalc, attackerInfo->offensiveMultipliers[splitIndex]); + atkStat = statCalc / 256; - defStatStage = targetInfo->defensiveStages[physicalMove]; - if (targetInfo->charging.chargingStatus == STATUS_SKULL_BASH) { + defStatStage = targetInfo->defensiveStages[splitIndex]; + if (splitIndex == 0 && targetInfo->charging.chargingStatus == STATUS_SKULL_BASH) { gDungeon->unk134.unk17A = 1; defStatStage++; } @@ -250,7 +251,7 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u if (targetInfo->apparentID == MONSTER_DEOXYS_DEFENSE) { defStatStage += 2; } - if (attackerInfo->apparentID == MONSTER_DEOXYS_SPEED) { + if (targetInfo->apparentID == MONSTER_DEOXYS_SPEED) { defStatStage -= 2; } @@ -258,13 +259,13 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u if (defStatStage > 20) defStatStage = 20; gDungeon->unk134.unk13E[1] = defStatStage; - gDungeon->unk134.unk140[1] = targetInfo->def[physicalMove]; - defStatCalc = s24_8_mul((targetInfo->def[physicalMove]) * 256, gUnknown_80F504C[defStatStage]); - defStatCalc = s24_8_mul(defStatCalc, targetInfo->defensiveMultipliers[physicalMove]); - defStat = defStatCalc / 8; + gDungeon->unk134.unk140[1] = targetInfo->def[splitIndex]; + statCalc = s24_8_mul((targetInfo->def[splitIndex]) * 256, gUnknown_80F50A0[defStatStage]); + statCalc = s24_8_mul(statCalc, targetInfo->defensiveMultipliers[splitIndex]); + defStat = statCalc / 256; rand = DungeonRandInt(100); - if (physicalMove) { + if (splitIndex == 0) { if (HasHeldItem(attacker, ITEM_POWER_BAND)) { atkStat += gUnknown_810AC60; gDungeon->unk134.unk160 += gUnknown_810AC60; @@ -304,16 +305,16 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u sub_800A020(&unkSp1, atkStat - defStat); sub_800A020(&unkSp2, 8); sub_800A3F0(&unkSp1, &unkSp1, &unkSp2); - if (attackerInfo->isNotTeamMember) { - sub_800A020(&unkSp2, attackerInfo->teamIndex); + if (!attackerInfo->isNotTeamMember) { + sub_800A020(&unkSp2, attackerInfo->level); unkSp3.s0 = 0; unkSp3.s4 = 0xAAAA; sub_800A34C(&unkSp2, &unkSp2, &unkSp3); - r6 = (attackerInfo->teamIndex * 2) / 3; + r6 = (attackerInfo->level * 2) / 3; } else { - unkAtkStat2 = attackerInfo->atk[physicalMove]; - unkDefStat2 = 1; + s32 unkAtkStat2 = attackerInfo->atk[splitIndex]; + s32 unkDefStat2 = 1; sub_806E8B0(attacker, target, moveType, &unkAtkStat2, &unkDefStat2, rand); sub_800A020(&unkSp2, unkAtkStat2); sub_800A020(&unkSp3, 3); @@ -322,7 +323,7 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u } sub_800A6D0(&unkSp4, &unkSp1, &unkSp2); gDungeon->unk134.unk140[5] = r6; - gDungeon->unk134.unk140[6] = sub_800A048(&unkSp1); + gDungeon->unk134.unk140[6] = sub_800A048(&unkSp4); unkSp5 = unkSp4; unkSp7 = unkSp4; sub_800A34C(&unkSp5, &unkSp5, &unkSp5); @@ -334,11 +335,12 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u sub_800A020(&unkSp6, defStat); sub_800A6F0(&unkSp7, &unkSp7, &unkSp6); sub_800A020(&unkSp6, 10); - sub_800A6D0(&unkSp8, &unkSp5, &unkSp6); + sub_800A6D0(&unkSp7, &unkSp7, &unkSp6); + sub_800A6D0(&unkSp8, &unkSp5, &unkSp7); if (sub_800A2F0(&gUnknown_8106F24, &unkSp8)) { unkSp8 = gUnknown_8106F24; } - if (sub_800A2F0(&gUnknown_8106F04, &unkSp8)) { + if (sub_800A2F0(&unkSp8, &gUnknown_8106F04)) { unkSp8 = gUnknown_8106F04; } r5 = sub_806E100(&unkSp9, attacker, target, moveType, dmgStruct); @@ -356,19 +358,30 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u } } } - if (arg_10 && !physicalMove && targetInfo->protection.protectionStatus == STATUS_REFLECT) { - sub_8041B74(target); - sub_800A34C(&unkSp9, &unkSp9, &gUnknown_8106F1C); - gDungeon->unk134.unk166 = 1; - } - if (arg_10 && physicalMove == TRUE && targetInfo->protection.protectionStatus == STATUS_LIGHT_SCREEN) { - sub_8041B5C(target); - sub_800A34C(&unkSp9, &unkSp9, &gUnknown_8106F1C); - gDungeon->unk134.unk167 = 1; + if (arg_10) { + if (splitIndex == 0 && targetInfo->protection.protectionStatus == STATUS_REFLECT) { + sub_8041B74(target); + sub_800A34C(&unkSp9, &unkSp9, &gUnknown_8106F1C); + gDungeon->unk134.unk166 = 1; + } + if (splitIndex == 1 && targetInfo->protection.protectionStatus == STATUS_LIGHT_SCREEN) { + sub_8041B5C(target); + sub_800A34C(&unkSp9, &unkSp9, &gUnknown_8106F1C); + gDungeon->unk134.unk167 = 1; + } } + // Check crit if (!HasAbility(target, ABILITY_BATTLE_ARMOR) && !HasAbility(target, ABILITY_SHELL_ARMOR)) { - s32 critOdds = (attackerInfo->isNotTeamMember) ? critChance : 0; + s32 critOdds; + + if (attackerInfo->isNotTeamMember) { + critOdds = 0; + } + else { + critOdds = critChance; + } + if (attackerInfo->moveStatus.moveStatus == STATUS_FOCUS_ENERGY) { critOdds = 999; gDungeon->unk134.unk168 = 1; @@ -378,12 +391,12 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u critOdds += gUnknown_80F4DAE; gDungeon->unk134.unk164 = 1; } - if (HasHeldItem(attacker, ITEM_PATSY_BAND)) { + if (HasHeldItem(target, ITEM_PATSY_BAND)) { critOdds += gUnknown_80F4DAE; gDungeon->unk134.unk165 = 1; } if (r5 && IQSkillIsEnabled(attacker, IQ_TYPE_ADVANTAGE_MASTER)) { - critOdds += gUnknown_80F4DB0; + critOdds = gUnknown_80F4DB0; gDungeon->unk134.unk169 = 1; } } @@ -395,9 +408,22 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u gDungeon->unk134.unk154 = sub_800A048(&unkSp8); sub_800A34C(&unkSp8, &unkSp8, &unkSp9); - gDungeon->unk134.unk15C = arg_8; - sub_800A088(&unkSp10, arg_8); - sub_800A34C(&unkSp8, &unkSp8, &unkSp10); + { + // Ugly hack needed to match + #ifdef NONMATCHING + s32 arg8_Match; + #else + register s32 arg8_Match asm("r2"); + #endif // NONMATCHING + + gDungeon->unk134.unk15C = arg8_Match = arg8; + ASM_MATCH_TRICK(arg8); + sub_800A088(&unkSp10, arg8_Match); + sub_800A34C(&unkSp8, &unkSp8, &unkSp10); + } + + // ALSO needed to match. unk694 chosen randomly and it worked with matching. + ASM_MATCH_TRICK(gDungeon->unk694); gDungeon->unk134.unk150 = sub_800A048(&unkSp8); { s32 rnd = DungeonRandInt(0x4000); @@ -406,8 +432,10 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u } sub_800A34C(&unkSp8, &unkSp8, &unkSp9); sub_800A020(&unkSp11, 100); + sub_800A34C(&unkSp9, &unkSp11, &unkSp9); gDungeon->unk134.unk158 = sub_800A048(&unkSp9); + dmgStruct->dmg = sub_800A048(&unkSp8); dmgStruct->residualDmgType = 0; if (dmgStruct->dmg == 0) { @@ -415,3 +443,81 @@ void sub_806EAF4(Entity *attacker, Entity *target, u8 moveType, u32 movePower, u } } } + +void sub_806F2BC(Entity *attacker, Entity *target, u8 moveType, s32 a2, struct DamageStruct *dmgStruct) +{ + struct unkStruct_80943A8 unkSp1; + struct unkStruct_80943A8 unkSp2; + s32 a2New = a2; + + if (a2New <= 0) a2New = 1; + if (a2New > 999) a2New = 999; + + dmgStruct->type = moveType; + sub_806E100(&unkSp1, attacker, target, moveType, dmgStruct); + sub_800A020(&unkSp2, a2New); + sub_800A34C(&unkSp2, &unkSp2, &unkSp1); + dmgStruct->dmg = sub_800A048(&unkSp2); + dmgStruct->residualDmgType = 0; +} + +void DealDamageToEntity(Entity *entity, s32 dmg, s32 r6, s16 r4) +{ + Entity spEntity; + struct DamageStruct dmgStruct; + s32 r4_ = r4; + + sub_80457DC(&spEntity); + dmgStruct.dmg = dmg; + dmgStruct.typeEffectiveness = EFFECTIVENESS_NEUTRAL; + dmgStruct.type = TYPE_NONE; + dmgStruct.residualDmgType = r6; + dmgStruct.isCrit = FALSE; + dmgStruct.unkE = 0; + dmgStruct.unkF = 0; + HandleDealingDamage(&spEntity, entity, &dmgStruct, FALSE, FALSE, r4_, FALSE, 0); +} + +extern const s32 gUnknown_80F54B4[NUM_EFFECTIVENESS][NUM_EFFECTIVENESS]; + +void sub_806F370(Entity *pokemon, Entity *target, s32 dmg, s32 r9, u8 *arg_0, u8 moveType, s16 arg_8, s32 arg_C, s32 arg_10, s32 arg_14) +{ + s32 i; + struct DamageStruct dmgStruct; + s32 arg_8_ = arg_8; + s32 dmgNew = dmg; + + dmgStruct.typeEffectiveness = EFFECTIVENESS_NEUTRAL; + dmgStruct.residualDmgType = arg_C; + dmgStruct.type = moveType; + dmgStruct.isCrit = FALSE; + dmgStruct.unkE = 0; + + if (moveType != TYPE_NONE) { + s32 typeEffectiveness[2]; + EntityInfo *targetInfo = GetEntInfo(target); + for (i = 0; i < 2; i++) { + s32 effectiv = gTypeEffectivenessChart[moveType][targetInfo->types[i]]; + typeEffectiveness[i] = effectiv; + } + if (HasAbility(target, ABILITY_WONDER_GUARD)) { + if (gUnknown_80F54B4[typeEffectiveness[0]][typeEffectiveness[1]] != EFFECTIVENESS_SUPER) { + dmgNew = 0; + } + } + } + + dmgStruct.dmg = dmgNew; + if (dmgNew == 0) { + dmgStruct.unkF = 1; + } + else { + dmgStruct.unkF = 0; + } + + HandleDealingDamage(pokemon, target, &dmgStruct, FALSE, r9, arg_8_, arg_10, arg_14); + if (arg_0 != NULL) { + *arg_0 = dmgStruct.unkF; + } +} +//