From 7988b3b49cababd6e2c85734a1203fab1dff3298 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 24 Oct 2024 13:35:23 +0200 Subject: [PATCH] sub_80566F8 --- asm/dungeon_message.s | 864 ------------------------------------------ src/dungeon_message.c | 516 ++++++++++++++++++++++++- 2 files changed, 506 insertions(+), 874 deletions(-) diff --git a/asm/dungeon_message.s b/asm/dungeon_message.s index 692769a52..0c47f3cc9 100644 --- a/asm/dungeon_message.s +++ b/asm/dungeon_message.s @@ -2,872 +2,8 @@ #include "asm/macros.inc" .syntax unified - .text - thumb_func_start sub_8056468 -sub_8056468: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r6, r0, 0 - mov r8, r1 - mov r9, r2 - adds r4, r3, 0 - ldr r0, [sp, 0x28] - lsls r0, 24 - lsrs r0, 24 - str r0, [sp] - movs r0, 0 - mov r10, r0 - adds r0, r6, 0 - bl sub_8045888 - lsls r0, 24 - lsrs r0, 24 - negs r1, r0 - orrs r1, r0 - lsrs r7, r1, 31 - mov r2, r9 - cmp r2, 0 - beq _08056518 - movs r5, 0 - b _080564A6 -_080564A2: - adds r4, 0x4 - adds r5, 0x1 -_080564A6: - cmp r5, 0x40 - bgt _080564BC - ldr r0, [r4] - cmp r0, 0 - beq _080564BC - bl sub_8045888 - lsls r0, 24 - cmp r0, 0 - beq _080564A2 - movs r7, 0x1 -_080564BC: - cmp r7, 0 - beq _080564F2 - ldr r0, _080564DC - ldr r1, [r6, 0x70] - movs r2, 0 - bl SetMessageArgument_2 - ldr r0, [sp, 0x24] - cmp r0, 0 - bne _080564E4 - ldr r0, _080564E0 - mov r1, r8 - movs r2, 0 - bl sub_80928C0 - b _080564F2 - .align 2, 0 -_080564DC: .4byte gAvailablePokemonNames -_080564E0: .4byte gFormatItems -_080564E4: - ldr r0, _08056508 - ldr r2, [sp, 0x24] - lsls r1, r2, 24 - lsrs r1, 24 - movs r2, 0 - bl BufferItemName -_080564F2: - mov r0, r8 - ldrh r1, [r0, 0x2] - ldr r0, _0805650C - cmp r1, r0 - beq _08056510 - adds r0, r6, 0 - mov r1, r9 - bl DisplayDungeonLoggableMessageTrue - b _08056518 - .align 2, 0 -_08056508: .4byte gFormatItems -_0805650C: .4byte 0x00000163 -_08056510: - adds r0, r6, 0 - mov r1, r9 - bl DisplayDungeonLoggableMessageFalse -_08056518: - cmp r7, 0 - beq _08056544 - ldr r2, [sp] - cmp r2, 0 - beq _0805652A - adds r0, r6, 0 - mov r1, r8 - movs r2, 0x1 - b _08056530 -_0805652A: - adds r0, r6, 0 - mov r1, r8 - movs r2, 0 -_08056530: - bl sub_8040BB0 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - adds r0, r6, 0 - mov r1, r8 - bl sub_8040DA0 - b _08056550 -_08056544: - ldr r0, [r6, 0x70] - adds r0, 0x46 - ldrb r1, [r0] - adds r0, r6, 0 - bl sub_806CE68 -_08056550: - mov r0, r10 - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8056468 - - thumb_func_start sub_8056564 -sub_8056564: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - sub sp, 0x18 - adds r6, r0, 0 - adds r5, r1, 0 - adds r7, r2, 0 - adds r4, r3, 0 - ldr r0, [r6, 0x70] - mov r8, r0 - ldr r0, _08056680 - ldr r0, [r0] - ldr r1, _08056684 - adds r0, r1 - ldrb r0, [r0] - mov r9, r0 - cmp r0, 0 - beq _0805658C - b _080566E4 -_0805658C: - mov r2, r8 - movs r1, 0x4 - ldrsh r0, [r2, r1] - bl GetBodySize - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bls _080565A4 - cmp r4, 0x1 - bne _080565A4 - b _080566E4 -_080565A4: - ldrh r4, [r7, 0x2] - adds r0, r6, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - movs r2, 0x1 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - bl sub_800ECB8 - movs r2, 0x6 - ldrsh r4, [r0, r2] - movs r1, 0 - ldrsh r0, [r5, r1] - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 11 - movs r0, 0x2 - ldrsh r2, [r5, r0] - lsls r0, r2, 1 - adds r0, r2 - lsls r0, 11 - movs r2, 0x80 - lsls r2, 5 - adds r3, r0, r2 - movs r2, 0xC0 - lsls r2, 4 - adds r0, r1, r2 - cmp r0, 0 - bge _080565EC - adds r0, 0xFF -_080565EC: - lsls r0, 8 - lsrs r0, 16 - ldr r1, _08056688 - ldr r2, [sp, 0x14] - ands r2, r1 - orrs r2, r0 - str r2, [sp, 0x14] - adds r0, r3, 0 - cmp r0, 0 - bge _08056602 - adds r0, 0xFF -_08056602: - lsls r0, 8 - lsrs r0, 16 - lsls r0, 16 - ldr r1, _0805668C - ands r2, r1 - orrs r2, r0 - str r2, [sp, 0x14] - cmp r4, 0 - beq _080566E4 - ldrh r4, [r7, 0x2] - adds r0, r6, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - movs r2, 0x1 - bl sub_80412E0 - lsls r0, 16 - lsrs r0, 16 - bl sub_800EF10 - bl sub_800EF64 - movs r0, 0x5E - bl sub_803E46C - mov r0, r8 - movs r1, 0x4 - ldrsh r5, [r0, r1] - ldrh r4, [r7, 0x2] - adds r0, r6, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - movs r2, 0x1 - bl sub_80412E0 - adds r1, r0, 0 - lsls r1, 16 - lsrs r1, 16 - adds r0, r5, 0 - bl sub_800E710 - adds r2, r0, 0 - movs r0, 0x1 - negs r0, r0 - cmp r2, r0 - beq _08056690 - add r0, sp, 0x8 - adds r1, r6, 0 - adds r1, 0x28 - lsls r2, 24 - lsrs r2, 24 - bl sub_800569C - b _08056694 - .align 2, 0 -_08056680: .4byte gDungeon -_08056684: .4byte 0x0001820a -_08056688: .4byte 0xffff0000 -_0805668C: .4byte 0x0000ffff -_08056690: - mov r2, r9 - str r2, [sp, 0x8] -_08056694: - ldrh r4, [r7, 0x2] - adds r0, r6, 0 - bl GetApparentWeather - adds r1, r0, 0 - lsls r1, 24 - lsrs r1, 24 - adds r0, r4, 0 - movs r2, 0x1 - bl sub_80412E0 - mov r1, sp - strh r0, [r1] - mov r2, r8 - ldrh r0, [r2, 0x4] - strh r0, [r1, 0x2] - ldr r0, [r6, 0xC] - cmp r0, 0 - bge _080566BC - adds r0, 0xFF -_080566BC: - asrs r0, 8 - strh r0, [r1, 0x4] - mov r1, sp - ldr r0, [r6, 0x10] - cmp r0, 0 - bge _080566CA - adds r0, 0xFF -_080566CA: - asrs r0, 8 - strh r0, [r1, 0x6] - mov r0, r8 - adds r0, 0x46 - ldrb r0, [r0] - str r0, [sp, 0xC] - movs r0, 0 - str r0, [sp, 0x10] - add r1, sp, 0x14 - mov r0, sp - bl sub_800E308 - b _080566E8 -_080566E4: - movs r0, 0x1 - negs r0, r0 -_080566E8: - add sp, 0x18 - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8056564 - - thumb_func_start sub_80566F8 -sub_80566F8: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x54 - mov r10, r0 - str r1, [sp, 0x1C] - str r2, [sp, 0x20] - lsls r3, 24 - lsrs r3, 24 - str r3, [sp, 0x24] - movs r0, 0 - str r0, [sp, 0x34] - movs r7, 0 - mov r1, r10 - ldr r6, [r1, 0x70] - ldr r2, [sp, 0x1C] - ldrh r0, [r2, 0x2] - bl sub_800ED20 - movs r1, 0x2 - str r1, [sp, 0x44] - cmp r0, 0x1 - beq _08056736 - movs r2, 0x6 - str r2, [sp, 0x44] - cmp r0, 0x2 - bne _08056736 - movs r0, 0x3 - str r0, [sp, 0x44] -_08056736: - mov r1, r10 - ldrh r0, [r1, 0x6] - lsls r0, 16 - ldrh r3, [r1, 0x4] - orrs r3, r0 - str r3, [sp, 0xC] - ldr r1, _08056814 - adds r2, r6, 0 - adds r2, 0x46 - ldrb r0, [r2] - lsls r0, 2 - adds r0, r1 - movs r1, 0 - ldrsh r6, [r0, r1] - str r6, [sp, 0x28] - movs r1, 0x2 - ldrsh r6, [r0, r1] - str r6, [sp, 0x2C] - movs r6, 0 - str r6, [sp, 0x30] - mov r8, r2 - ldr r0, [sp, 0x20] - cmp r6, r0 - bge _080567EC - add r0, sp, 0xC - movs r2, 0 - ldrsh r1, [r0, r2] - cmp r1, 0 - blt _080567EC - asrs r0, r3, 16 - cmp r0, 0 - blt _080567EC - cmp r1, 0x37 - bgt _080567EC - cmp r0, 0x1F - bgt _080567EC - add r6, sp, 0xC -_08056780: - ldrh r0, [r6] - ldr r1, [sp, 0x28] - adds r0, r1 - lsls r0, 16 - lsrs r0, 16 - ldr r2, _08056818 - ands r2, r3 - orrs r2, r0 - asrs r0, r2, 16 - ldr r1, [sp, 0x2C] - adds r0, r1 - lsls r0, 16 - ldr r1, _0805681C - ands r1, r2 - orrs r1, r0 - str r1, [sp, 0xC] - adds r7, 0x1 - movs r2, 0 - ldrsh r0, [r6, r2] - asrs r1, 16 - bl GetTile - adds r2, r0, 0 - ldrh r1, [r2] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _080567EC - ldr r0, [r2, 0x10] - cmp r0, 0 - beq _080567C6 - bl GetEntityType - cmp r0, 0x1 - beq _080567EC -_080567C6: - ldr r0, [sp, 0x30] - adds r0, 0x1 - str r0, [sp, 0x30] - ldr r1, [sp, 0x20] - cmp r0, r1 - bge _080567EC - movs r0, 0 - ldrsh r2, [r6, r0] - cmp r2, 0 - blt _080567EC - ldr r0, [sp, 0xC] - asrs r1, r0, 16 - adds r3, r0, 0 - cmp r1, 0 - blt _080567EC - cmp r2, 0x37 - bgt _080567EC - cmp r1, 0x1F - ble _08056780 -_080567EC: - ldr r2, [sp, 0x1C] - ldrh r1, [r2, 0x2] - mov r0, r10 - bl sub_805755C - lsls r0, 24 - cmp r0, 0 - beq _08056820 - mov r0, r10 - ldr r1, [sp, 0x1C] - bl MoveMatchesChargingStatus - lsls r0, 24 - cmp r0, 0 - bne _08056820 - movs r6, 0x1 - negs r6, r6 - str r6, [sp, 0x40] - b _0805682E - .align 2, 0 -_08056814: .4byte gAdjacentTileOffsets -_08056818: .4byte 0xffff0000 -_0805681C: .4byte 0x0000ffff -_08056820: - mov r0, r10 - add r1, sp, 0xC - ldr r2, [sp, 0x1C] - ldr r3, [sp, 0x20] - bl sub_8056564 - str r0, [sp, 0x40] -_0805682E: - mov r0, r10 - ldrh r1, [r0, 0x4] - add r0, sp, 0xC - strh r1, [r0] - mov r2, r10 - ldrh r1, [r2, 0x6] - strh r1, [r0, 0x2] - ldr r1, _08056874 - mov r6, r8 - ldrb r0, [r6] - lsls r0, 2 - adds r0, r1 - movs r2, 0 - ldrsh r1, [r0, r2] - str r1, [sp, 0x28] - movs r1, 0x2 - ldrsh r6, [r0, r1] - str r6, [sp, 0x2C] - movs r0, 0x18 - ldr r1, [sp, 0x44] - bl __divsi3 - adds r1, r7, 0 - muls r1, r0 - ldr r2, [sp, 0x20] - cmp r2, 0x1 - ble _08056878 - adds r6, r1, 0 - adds r6, 0x8 - str r6, [sp, 0x38] - cmp r6, 0x3F - ble _0805687C - movs r0, 0x40 - str r0, [sp, 0x38] - b _0805687C - .align 2, 0 -_08056874: .4byte gAdjacentTileOffsets -_08056878: - movs r2, 0x20 - str r2, [sp, 0x38] -_0805687C: - movs r6, 0 - mov r9, r6 - movs r0, 0x80 - lsls r0, 12 - bl __divsi3 - str r0, [sp, 0x48] - ldr r1, _0805696C - mov r2, r8 - ldrb r0, [r2] - lsls r0, 2 - adds r0, r1 - ldr r0, [r0] - str r0, [sp, 0x3C] - ldr r0, _08056970 - ldr r0, [r0] - ldr r6, _08056974 - adds r0, r6 - movs r1, 0x1 - strb r1, [r0] - movs r0, 0 - str r0, [sp, 0x30] - ldr r1, [sp, 0x20] - cmp r0, r1 - blt _080568B0 - b _08056AB6 -_080568B0: - add r0, sp, 0xC - movs r2, 0 - ldrsh r1, [r0, r2] - cmp r1, 0 - bge _080568BC - b _08056AB6 -_080568BC: - ldrh r0, [r0, 0x2] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0 - bge _080568C8 - b _08056AB6 -_080568C8: - cmp r1, 0x37 - ble _080568CE - b _08056AB6 -_080568CE: - cmp r0, 0x1F - ble _080568D4 - b _08056AB6 -_080568D4: - add r7, sp, 0xC -_080568D6: - ldr r6, [sp, 0xC] - ldrh r0, [r7] - ldr r1, [sp, 0x28] - adds r0, r1 - strh r0, [r7] - ldrh r0, [r7, 0x2] - ldr r2, [sp, 0x2C] - adds r0, r2 - strh r0, [r7, 0x2] - add r0, sp, 0xC - bl sub_803F428 - lsls r0, 24 - cmp r0, 0 - bne _080568F6 - b _08056A00 -_080568F6: - ldr r0, _08056970 - ldr r0, [r0] - ldr r1, _08056978 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08056906 - b _08056A00 -_08056906: - lsls r1, r6, 16 - asrs r1, 16 - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - movs r2, 0xC0 - lsls r2, 4 - adds r4, r0, r2 - asrs r1, r6, 16 - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 11 - movs r6, 0x80 - lsls r6, 5 - adds r5, r0, r6 - ldr r1, [sp, 0x28] - lsls r0, r1, 8 - ldr r6, [sp, 0x44] - adds r2, r6, 0 - muls r2, r0 - str r2, [sp, 0x4C] - ldr r1, [sp, 0x2C] - lsls r0, r1, 8 - adds r2, r6, 0 - muls r2, r0 - str r2, [sp, 0x50] - movs r6, 0 - movs r0, 0x18 - ldr r1, [sp, 0x44] - bl __divsi3 - mov r8, r0 - cmp r6, r8 - bge _08056A0E -_0805694A: - ldr r0, [sp, 0x40] - cmp r0, 0 - blt _080569D4 - ldr r1, [sp, 0x24] - cmp r1, 0 - beq _0805697C - mov r0, r9 - cmp r0, 0 - bge _0805695E - adds r0, 0xFF -_0805695E: - asrs r0, 8 - bl sin_abs_4096 - ldr r2, [sp, 0x38] - adds r3, r0, 0 - muls r3, r2 - b _0805697E - .align 2, 0 -_0805696C: .4byte gUnknown_81069D4 -_08056970: .4byte gDungeon -_08056974: .4byte 0x0001c05e -_08056978: .4byte 0x0001820a -_0805697C: - movs r3, 0 -_0805697E: - adds r0, r4, 0 - cmp r4, 0 - bge _08056986 - adds r0, 0xFF -_08056986: - lsls r0, 8 - lsrs r0, 16 - ldr r1, _080569F0 - ldr r2, [sp, 0x10] - ands r2, r1 - orrs r2, r0 - str r2, [sp, 0x10] - subs r0, r5, r3 - cmp r0, 0 - bge _0805699C - adds r0, 0xFF -_0805699C: - lsls r0, 8 - lsrs r0, 16 - lsls r0, 16 - ldr r1, _080569F4 - ands r2, r1 - orrs r2, r0 - str r2, [sp, 0x10] - adds r2, r5, 0 - cmp r2, 0 - bge _080569B2 - adds r2, 0xFF -_080569B2: - asrs r2, 8 - ldr r0, _080569F8 - ldr r0, [r0] - ldr r1, _080569FC - adds r0, r1 - movs r1, 0 - ldrsh r0, [r0, r1] - subs r2, r0 - lsrs r0, r2, 31 - adds r2, r0 - asrs r2, 1 - ldr r0, [sp, 0x3C] - adds r2, r0 - ldr r0, [sp, 0x40] - add r1, sp, 0x10 - bl sub_800E3AC -_080569D4: - movs r0, 0x30 - bl sub_803E46C - ldr r1, [sp, 0x4C] - adds r4, r1 - ldr r2, [sp, 0x50] - adds r5, r2 - ldr r0, [sp, 0x48] - add r9, r0 - adds r6, 0x1 - cmp r6, r8 - blt _0805694A - b _08056A0E - .align 2, 0 -_080569F0: .4byte 0xffff0000 -_080569F4: .4byte 0x0000ffff -_080569F8: .4byte gDungeon -_080569FC: .4byte 0x000181f2 -_08056A00: - movs r0, 0x18 - ldr r1, [sp, 0x44] - bl __divsi3 - ldr r1, [sp, 0x48] - muls r0, r1 - add r9, r0 -_08056A0E: - movs r2, 0 - ldrsh r0, [r7, r2] - movs r6, 0x2 - ldrsh r1, [r7, r6] - bl GetTile - adds r6, r0, 0 - ldrh r1, [r6] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0 - beq _08056AB6 - ldr r0, [r6, 0x10] - cmp r0, 0 - beq _08056A8E - bl GetEntityType - cmp r0, 0x1 - bne _08056A8E - ldr r0, [r6, 0x10] - ldr r1, [sp, 0x1C] - bl sub_80571F0 - lsls r0, 24 - cmp r0, 0 - bne _08056A8E - ldr r0, [sp, 0x34] - cmp r0, 0 - bgt _08056AB6 - movs r4, 0 - mov r2, r10 - ldr r1, [r2, 0x70] - adds r0, r1, 0 - adds r0, 0xBC - ldrb r2, [r0] - cmp r2, 0x2 - beq _08056A64 - adds r0, 0x2C - ldrb r0, [r0] - cmp r0, 0x1 - beq _08056A64 - cmp r2, 0x4 - bne _08056A66 -_08056A64: - movs r4, 0x1 -_08056A66: - mov r0, r10 - ldr r1, [sp, 0x1C] - movs r2, 0 - bl GetMoveTargetAndRangeForPokemon - adds r2, r0, 0 - lsls r2, 16 - asrs r2, 16 - ldr r0, [r6, 0x10] - str r0, [sp] - ldr r6, [sp, 0x1C] - str r6, [sp, 0x4] - str r4, [sp, 0x8] - ldr r0, [sp, 0x34] - add r1, sp, 0x14 - mov r3, r10 - bl sub_8056F80 - str r0, [sp, 0x34] - b _08056AB6 -_08056A8E: - ldr r0, [sp, 0x30] - adds r0, 0x1 - str r0, [sp, 0x30] - ldr r1, [sp, 0x20] - cmp r0, r1 - bge _08056AB6 - movs r2, 0 - ldrsh r1, [r7, r2] - cmp r1, 0 - blt _08056AB6 - ldrh r0, [r7, 0x2] - lsls r0, 16 - asrs r0, 16 - cmp r0, 0 - blt _08056AB6 - cmp r1, 0x37 - bgt _08056AB6 - cmp r0, 0x1F - bgt _08056AB6 - b _080568D6 -_08056AB6: - ldr r6, [sp, 0x40] - cmp r6, 0 - blt _08056AC2 - adds r0, r6, 0 - bl sub_800DC14 -_08056AC2: - movs r0, 0x1 - bl sub_804178C - ldr r0, _08056AF4 - ldr r0, [r0] - ldr r1, _08056AF8 - adds r0, r1 - movs r2, 0 - strb r2, [r0] - ldr r6, [sp, 0x34] - cmp r6, 0 - ble _08056AFC - lsls r1, r6, 2 - add r0, sp, 0x14 - adds r1, r0 - str r2, [r1] - ldr r1, [sp, 0x78] - str r1, [sp] - mov r1, r10 - ldr r2, [sp, 0x1C] - ldr r3, [sp, 0x74] - bl sub_8053704 - b _08056B22 - .align 2, 0 -_08056AF4: .4byte gDungeon -_08056AF8: .4byte 0x0001c05e -_08056AFC: - ldr r0, [sp, 0x20] - cmp r0, 0x1 - bne _08056B22 - add r0, sp, 0xC - bl sub_803F428 - lsls r0, 24 - cmp r0, 0 - beq _08056B22 - movs r0, 0x1 - movs r1, 0x4A - bl sub_803E708 - mov r0, r10 - movs r1, 0 - ldr r2, [sp, 0x1C] - add r3, sp, 0xC - bl sub_8041168 -_08056B22: - add sp, 0x54 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - thumb_func_end sub_80566F8 - thumb_func_start sub_8056B34 sub_8056B34: push {r4-r7,lr} diff --git a/src/dungeon_message.c b/src/dungeon_message.c index bed0ae760..99c32c35c 100644 --- a/src/dungeon_message.c +++ b/src/dungeon_message.c @@ -1098,8 +1098,11 @@ static void CreateMessageLogArrow(bool8 upArrow, s32 y) #include "targeting_flags.h" #include "targeting.h" #include "called_move_data.h" +#include "dungeon_map_access.h" +#include "math.h" +#include "code_800DAC0.h" -NAKED void sub_8053704(s32 *sp, Entity *entity, Move *move, s32 itemId, s32 a4) +NAKED void sub_8053704(Entity **unkArray, Entity *entity, Move *move, s32 itemId, s32 a4) { asm_unified("\n" " push {r4-r7,lr}\n" @@ -4524,7 +4527,7 @@ extern s16 sub_8057600(Move *move, s32 itemID); extern void sub_803ED30(s32, Entity *r0, u8, s32); extern void sub_8042238(Entity *pokemon, Entity *target); extern void sub_806A1E8(Entity *pokemon); -extern void sub_80574C4(s32 *a0, s32 a1); +extern void sub_80574C4(Entity **a0, Entity *a1); extern const u8 *const gUnknown_80F9688; @@ -4800,7 +4803,7 @@ bool32 sub_8055A00(Entity *entity, s32 firstMoveId, s32 var_34, s32 itemId, s32 } if (unkBefore == gUnknown_202F208) { - if (!itemId) { + if (itemId == 0) { TryDisplayDungeonLoggableMessage(entity, gUnknown_80FC690); // The currMove failed! } else { @@ -4941,9 +4944,9 @@ extern s32 gMetronomeCalledArrayId; extern void sub_806ACE8(Entity *entity, Move *move); extern s32 sub_8057070(Move *move); -bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, s32 *unkArray, bool32 itemId, bool8 arg_4, bool32 unused); +bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, Entity **unkArray, bool32 itemId, bool8 arg_4, bool32 unused); bool8 sub_805744C(Entity * pokemon, Move *move, bool8 param_3); -void sub_8056CE8(s32 *, Entity * pokemon, Move *move); +void sub_8056CE8(Entity **, Entity * pokemon, Move *move); void sub_80566F8(Entity*, Move *, s32 a2, bool8 a3, s32 a4, s32 a5); extern s32 gUnknown_202F214; @@ -4957,10 +4960,12 @@ extern u8 gUnknown_202F21A; extern u8 gUnknown_202F220; extern u8 gUnknown_202F221; +bool8 sub_805755C(Entity* pokemon,u16 param_2); + bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg_0, struct Move *move) { s32 i; - s32 var_144[65]; //???? + Entity *var_144[65]; //???? const u8 *msg; Move metronomeMove, naturePwrMove; s32 var_2C; @@ -4969,7 +4974,7 @@ bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg bool8 moveUsable; msg = NULL; - var_144[0] = 0; + var_144[0] = NULL; sub_804178C(1); if (move->id == MOVE_METRONOME) { @@ -5023,7 +5028,7 @@ bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg moveUsable = sub_805744C(entity, move, TRUE); } else { - if (!itemId) { + if (itemId == 0) { msg = GetMoveUseText(move->id); } else { @@ -5045,7 +5050,7 @@ bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg } else if (!moveUsable) { SetMessageArgument_2(gAvailablePokemonNames, GetEntInfo(entity), 0); - if (!itemId) { + if (itemId == 0) { sub_80928C0(gFormatItems, move, NULL); TryDisplayDungeonLoggableMessage(entity, msg); sub_803E708(0xA, 0x3F); @@ -5102,7 +5107,7 @@ bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg var_144[0] = 0; if (var_28 == 0 || var_28 == 1) { sub_8056CE8(var_144, entity, move); - sub_80574C4(var_144, (s32) entity); // Todo fix sub_80574C4 + sub_80574C4(var_144, entity); // Todo fix sub_80574C4 if (i != 0 && var_24 != 0 && var_144[0] == 0) break; } @@ -5151,4 +5156,495 @@ bool8 sub_8055FA0(struct Entity *entity, u32 r6, s32 itemId, u32 var_30, u32 arg return TRUE; } +extern bool8 sub_8040BB0(Entity *entity, Move *move, bool8); +extern void sub_8040DA0(Entity *entity, Move *move); + +bool8 sub_8056468(Entity *entity, Move *move, const u8 *str, Entity **unkArray, bool32 itemId, bool8 arg_4, bool32 unused) +{ + s32 i; + bool8 ret = FALSE; + bool32 r7 = (sub_8045888(entity) != FALSE); + + if (str != NULL) { + for (i = 0; i < 65; i++) { + if (unkArray[i] == NULL) { + break; + } + if (sub_8045888(unkArray[i])) { + r7 = TRUE; + break; + } + } + + if (r7) { + SetMessageArgument_2(gAvailablePokemonNames, GetEntInfo(entity), 0); + if (itemId == 0) { + sub_80928C0(gFormatItems, move, NULL); + } + else { + BufferItemName(gFormatItems, itemId, NULL); + } + } + + if (move->id != MOVE_REGULAR_ATTACK) { + DisplayDungeonLoggableMessageTrue(entity, str); + } + else { + DisplayDungeonLoggableMessageFalse(entity, str); + } + } + + if (r7) { + if (arg_4) { + ret = sub_8040BB0(entity, move, TRUE); + } + else { + ret = sub_8040BB0(entity, move, FALSE); + } + sub_8040DA0(entity, move); + } + else { + sub_806CE68(entity, GetEntInfo(entity)->action.direction); + } + + return ret; +} + +extern u16 sub_80412E0(u16 moveId, u8 weather, u8 a2); +extern void sub_800569C(Position *, EntitySpriteInfo *, u8); + +struct UnkStruct_sub_800E308_1 +{ + s16 unk0; + s16 unk2; + Position unk4; + Position unk8; + s32 unkC; + s32 unk10; +}; + +// Maybe Position? Maybe not, sub_800E308 is called only by sub_8056564, so :shrug: +struct UnkStruct_sub_800E308_2 +{ + s16 u0; + s16 u2; +}; + +extern s32 sub_800E308(struct UnkStruct_sub_800E308_1 *, struct UnkStruct_sub_800E308_2 *); +extern u8 GetBodySize(s16 index); +extern void sub_800EF10(u16 r0); +extern s32 sub_800E710(s16 a0, u16 a1); + +#ifdef NONMATCHING // https://decomp.me/scratch/fTUsI +s32 sub_8056564(Entity *entity, Position *pos, Move *move, s32 r4) +{ + struct UnkStruct_sub_800E308_1 unkSp1; + struct UnkStruct_sub_800E308_2 unkSp2; + EntityInfo *entInfo = GetEntInfo(entity); + + if (!gDungeon->unk181e8.blinded && (GetBodySize(entInfo->apparentID) < 4 || r4 == 1)) { + unkStruct_80BDBC4 *unkStruct = sub_800ECB8(sub_80412E0(move->id, GetApparentWeather(entity), 1)); + s32 unk6 = unkStruct->unk6; + // This part with unkPos doesn't match + Position32 unkPos = {pos->x * 0x1800, pos->y * 0x1800}; + + unkPos.x += 0x1000; + unkPos.y += 0xC00; + + unkSp2.u0 = unkPos.x / 256; + unkSp2.u2 = unkPos.y / 256; + + if (unk6 != 0) { + s32 someRetVal; + + sub_800EF10(sub_80412E0(move->id, GetApparentWeather(entity), 1)); + sub_803E46C(0x5E); + someRetVal = sub_800E710(entInfo->apparentID, sub_80412E0(move->id, GetApparentWeather(entity), 1)); + if (someRetVal != -1) { + sub_800569C(&unkSp1.unk8, &entity->spriteInfo, someRetVal); + } + else { + unkSp1.unk8 = (Position) {0}; + } + unkSp1.unk0 = sub_80412E0(move->id, GetApparentWeather(entity), 1); + unkSp1.unk2 = entInfo->apparentID; + unkSp1.unk4.x = entity->pixelPos.x / 256; + unkSp1.unk4.y = entity->pixelPos.y / 256; + unkSp1.unkC = entInfo->action.direction; + unkSp1.unk10 = 0; + + return sub_800E308(&unkSp1, &unkSp2); + } + } + + return -1; +} +#else +NAKED s32 sub_8056564(Entity *entity, Position *pos, Move *move, s32 r4) +{ + asm_unified("push {r4-r7,lr}\n" + " mov r7, r9\n" + " mov r6, r8\n" + " push {r6,r7}\n" + " sub sp, 0x18\n" + " adds r6, r0, 0\n" + " adds r5, r1, 0\n" + " adds r7, r2, 0\n" + " adds r4, r3, 0\n" + " ldr r0, [r6, 0x70]\n" + " mov r8, r0\n" + " ldr r0, _08056680\n" + " ldr r0, [r0]\n" + " ldr r1, _08056684\n" + " adds r0, r1\n" + " ldrb r0, [r0]\n" + " mov r9, r0\n" + " cmp r0, 0\n" + " beq _0805658C\n" + " b _080566E4\n" + "_0805658C:\n" + " mov r2, r8\n" + " movs r1, 0x4\n" + " ldrsh r0, [r2, r1]\n" + " bl GetBodySize\n" + " lsls r0, 24\n" + " lsrs r0, 24\n" + " cmp r0, 0x3\n" + " bls _080565A4\n" + " cmp r4, 0x1\n" + " bne _080565A4\n" + " b _080566E4\n" + "_080565A4:\n" + " ldrh r4, [r7, 0x2]\n" + " adds r0, r6, 0\n" + " bl GetApparentWeather\n" + " adds r1, r0, 0\n" + " lsls r1, 24\n" + " lsrs r1, 24\n" + " adds r0, r4, 0\n" + " movs r2, 0x1\n" + " bl sub_80412E0\n" + " lsls r0, 16\n" + " lsrs r0, 16\n" + " bl sub_800ECB8\n" + " movs r2, 0x6\n" + " ldrsh r4, [r0, r2]\n" + " movs r1, 0\n" + " ldrsh r0, [r5, r1]\n" + " lsls r1, r0, 1\n" + " adds r1, r0\n" + " lsls r1, 11\n" + " movs r0, 0x2\n" + " ldrsh r2, [r5, r0]\n" + " lsls r0, r2, 1\n" + " adds r0, r2\n" + " lsls r0, 11\n" + " movs r2, 0x80\n" + " lsls r2, 5\n" + " adds r3, r0, r2\n" + " movs r2, 0xC0\n" + " lsls r2, 4\n" + " adds r0, r1, r2\n" + " cmp r0, 0\n" + " bge _080565EC\n" + " adds r0, 0xFF\n" + "_080565EC:\n" + " lsls r0, 8\n" + " lsrs r0, 16\n" + " ldr r1, _08056688\n" + " ldr r2, [sp, 0x14]\n" + " ands r2, r1\n" + " orrs r2, r0\n" + " str r2, [sp, 0x14]\n" + " adds r0, r3, 0\n" + " cmp r0, 0\n" + " bge _08056602\n" + " adds r0, 0xFF\n" + "_08056602:\n" + " lsls r0, 8\n" + " lsrs r0, 16\n" + " lsls r0, 16\n" + " ldr r1, _0805668C\n" + " ands r2, r1\n" + " orrs r2, r0\n" + " str r2, [sp, 0x14]\n" + " cmp r4, 0\n" + " beq _080566E4\n" + " ldrh r4, [r7, 0x2]\n" + " adds r0, r6, 0\n" + " bl GetApparentWeather\n" + " adds r1, r0, 0\n" + " lsls r1, 24\n" + " lsrs r1, 24\n" + " adds r0, r4, 0\n" + " movs r2, 0x1\n" + " bl sub_80412E0\n" + " lsls r0, 16\n" + " lsrs r0, 16\n" + " bl sub_800EF10\n" + " bl sub_800EF64\n" + " movs r0, 0x5E\n" + " bl sub_803E46C\n" + " mov r0, r8\n" + " movs r1, 0x4\n" + " ldrsh r5, [r0, r1]\n" + " ldrh r4, [r7, 0x2]\n" + " adds r0, r6, 0\n" + " bl GetApparentWeather\n" + " adds r1, r0, 0\n" + " lsls r1, 24\n" + " lsrs r1, 24\n" + " adds r0, r4, 0\n" + " movs r2, 0x1\n" + " bl sub_80412E0\n" + " adds r1, r0, 0\n" + " lsls r1, 16\n" + " lsrs r1, 16\n" + " adds r0, r5, 0\n" + " bl sub_800E710\n" + " adds r2, r0, 0\n" + " movs r0, 0x1\n" + " negs r0, r0\n" + " cmp r2, r0\n" + " beq _08056690\n" + " add r0, sp, 0x8\n" + " adds r1, r6, 0\n" + " adds r1, 0x28\n" + " lsls r2, 24\n" + " lsrs r2, 24\n" + " bl sub_800569C\n" + " b _08056694\n" + " .align 2, 0\n" + "_08056680: .4byte gDungeon\n" + "_08056684: .4byte 0x0001820a\n" + "_08056688: .4byte 0xffff0000\n" + "_0805668C: .4byte 0x0000ffff\n" + "_08056690:\n" + " mov r2, r9\n" + " str r2, [sp, 0x8]\n" + "_08056694:\n" + " ldrh r4, [r7, 0x2]\n" + " adds r0, r6, 0\n" + " bl GetApparentWeather\n" + " adds r1, r0, 0\n" + " lsls r1, 24\n" + " lsrs r1, 24\n" + " adds r0, r4, 0\n" + " movs r2, 0x1\n" + " bl sub_80412E0\n" + " mov r1, sp\n" + " strh r0, [r1]\n" + " mov r2, r8\n" + " ldrh r0, [r2, 0x4]\n" + " strh r0, [r1, 0x2]\n" + " ldr r0, [r6, 0xC]\n" + " cmp r0, 0\n" + " bge _080566BC\n" + " adds r0, 0xFF\n" + "_080566BC:\n" + " asrs r0, 8\n" + " strh r0, [r1, 0x4]\n" + " mov r1, sp\n" + " ldr r0, [r6, 0x10]\n" + " cmp r0, 0\n" + " bge _080566CA\n" + " adds r0, 0xFF\n" + "_080566CA:\n" + " asrs r0, 8\n" + " strh r0, [r1, 0x6]\n" + " mov r0, r8\n" + " adds r0, 0x46\n" + " ldrb r0, [r0]\n" + " str r0, [sp, 0xC]\n" + " movs r0, 0\n" + " str r0, [sp, 0x10]\n" + " add r1, sp, 0x14\n" + " mov r0, sp\n" + " bl sub_800E308\n" + " b _080566E8\n" + "_080566E4:\n" + " movs r0, 0x1\n" + " negs r0, r0\n" + "_080566E8:\n" + " add sp, 0x18\n" + " pop {r3,r4}\n" + " mov r8, r3\n" + " mov r9, r4\n" + " pop {r4-r7}\n" + " pop {r1}\n" + " bx r1"); +} +#endif // NONMATCHING + +extern s32 sub_800ED20(u16 param_1); + +extern const s32 gUnknown_81069D4[]; + +extern void sub_800E3AC(s32 a0, Position *pos, s32 a2); +extern void sub_8041168(Entity *entity, Entity *entity2, Move *,Position *); + +s32 sub_8056F80(s32 a0, Entity **entitiesArray, s16 target, Entity *entity1, Entity *entity2, Move *move, bool8 arg8); + +void sub_80566F8(Entity *entity, Move *move, s32 a2, bool8 a3, s32 itemId, s32 a5) +{ + Position var_68; + Position var_64; + Entity *var_60[2]; + s32 var_4C, var_48; + s32 i, j; + s32 var_40; + s32 var_3C; + s32 var_38; + s32 var_34; + s32 var_30; + s32 var_2C; + s32 var_28, var_24; + s32 someCount; + EntityInfo *entInfo; + s32 unkRetVal; + s32 divResult; + s32 r9; + + var_40 = 0; + someCount = 0; + entInfo = GetEntInfo(entity); + unkRetVal = sub_800ED20(move->id); + var_30 = 2; + if (unkRetVal != 1) { + var_30 = 6; + if (unkRetVal == 2) { + var_30 = 3; + } + } + + var_68.x = entity->pos.x; + var_68.y = entity->pos.y; + var_4C = gAdjacentTileOffsets[entInfo->action.direction].x; + var_48 = gAdjacentTileOffsets[entInfo->action.direction].y; + for (i = 0; i < a2; i++) + { + Tile *tile; + + if (var_68.x < 0 || var_68.y < 0 || var_68.x > 55 || var_68.y > 31) + break; + + var_68.x += var_4C; + var_68.y += var_48; + someCount++; + tile = GetTile(var_68.x, var_68.y); + if (!(tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY))) + break; + if (tile->monster != NULL && GetEntityType(tile->monster) == ENTITY_MONSTER) + break; + } + + if (sub_805755C(entity, move->id) && !MoveMatchesChargingStatus(entity, move)) { + var_34 = -1; + } + else { + var_34 = sub_8056564(entity, &var_68, move, a2); + } + + var_68.x = entity->pos.x; + var_68.y = entity->pos.y; + var_4C = gAdjacentTileOffsets[entInfo->action.direction].x; + var_48 = gAdjacentTileOffsets[entInfo->action.direction].y; + divResult = someCount * (24 / var_30); + if (a2 > 1) { + var_3C = divResult + 8; + if (var_3C >= 64) { + var_3C = 64; + } + } + else { + var_3C = 32; + } + + r9 = 0; + var_2C = 0x80000 / divResult; + var_38 = gUnknown_81069D4[entInfo->action.direction]; + gDungeon->unk1BDD4.unk1C05E = 1; + + for (i = 0; i < a2; i++) + { + Position var_68Before; + Tile *tile; + + if (var_68.x < 0 || var_68.y < 0 || var_68.x > 55 || var_68.y > 31) + break; + + var_68Before = var_68; + var_68.x += var_4C; + var_68.y += var_48; + if (sub_803F428(&var_68) && !gDungeon->unk181e8.blinded) { + Position32 pos32; + pos32.x = (var_68Before.x * 0x1800) + 0xC00; + pos32.y = (var_68Before.y * 0x1800) + 0x1000; + var_28 = var_30 * (var_4C << 8); + var_24 = var_30 * (var_48 << 8); + for (j = 0; j < 24 / var_30; j++) { + if (var_34 >= 0) { + s32 r3; + s32 r2; + + if (a3 != 0) { + r3 = sin_abs_4096(r9 / 256) * var_3C; + } + else { + r3 = 0; + } + var_64.x = pos32.x / 256; + var_64.y = (pos32.y - r3) / 256; + r2 = pos32.y / 256; + r2 -= gDungeon->unk181e8.cameraPixelPos.y; + r2 /= 2; + sub_800E3AC(var_34, &var_64, r2 + var_38); + } + sub_803E46C(0x30); + pos32.x += var_28; + pos32.y += var_24; + r9 += var_2C; + } + } + else { + r9 += (24 / var_30) * var_2C; + } + + tile = GetTile(var_68.x, var_68.y); + if (!(tile->terrainType & (TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY))) + break; + if (tile->monster != NULL && GetEntityType(tile->monster) == ENTITY_MONSTER && !sub_80571F0(tile->monster, move)) { + if (var_40 <= 0) { + bool8 r4 = FALSE; + s32 target; + EntityInfo *entInfo = GetEntInfo(entity); + if (entInfo->volatileStatus.volatileStatus == STATUS_CONFUSED + || entInfo->eyesightStatus.eyesightStatus == STATUS_BLINKER + || entInfo->volatileStatus.volatileStatus == STATUS_COWERING) + { + r4 = TRUE; + } + target = GetMoveTargetAndRangeForPokemon(entity, move, FALSE); + var_40 = sub_8056F80(var_40, var_60, target, entity, tile->monster, move, r4); + } + break; + } + } + + if (var_34 >= 0) { + sub_800DC14(var_34); + } + sub_804178C(1); + gDungeon->unk1BDD4.unk1C05E = 0; + + if (var_40 > 0) { + var_60[var_40] = NULL; + sub_8053704(var_60, entity, move, itemId, a5); + } + else if (a2 == 1 && sub_803F428(&var_68)) { + sub_803E708(1, 0x4A); + sub_8041168(entity, NULL, move, &var_68); + } +} + //