From a02346be01efa13b6d969a89be642e3450f7ca35 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Sun, 13 Feb 2022 22:02:17 -0500 Subject: Decomped FindMoveTarget() --- asm/code_807C04C.s | 1297 ------------------------------------------- asm/code_807C4A0.s | 742 +++++++++++++++++++++++++ include/dungeon_ai_attack.h | 9 + include/map.h | 2 +- include/moves.h | 2 + ld_script.txt | 2 +- src/dungeon_ai_attack.c | 219 +++++++- src/dungeon_ai_items.c | 8 +- src/moves.c | 4 +- sym_ewram.txt | 6 +- 10 files changed, 976 insertions(+), 1315 deletions(-) delete mode 100644 asm/code_807C04C.s create mode 100644 asm/code_807C4A0.s diff --git a/asm/code_807C04C.s b/asm/code_807C04C.s deleted file mode 100644 index 80e75af..0000000 --- a/asm/code_807C04C.s +++ /dev/null @@ -1,1297 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start FindMoveTarget -FindMoveTarget: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1C - str r0, [sp, 0x8] - adds r6, r1, 0 - mov r10, r2 - movs r0, 0x1 - str r0, [sp, 0x10] - ldr r4, [r6, 0x70] - movs r1, 0 - mov r8, r1 - ldr r1, _0807C0C8 - movs r2, 0 - adds r0, r1, 0x7 -_0807C06E: - strb r2, [r0] - subs r0, 0x1 - cmp r0, r1 - bge _0807C06E - adds r0, r6, 0 - mov r1, r10 - movs r2, 0x1 - bl GetTargetingFlags - lsls r0, 16 - asrs r0, 16 - str r0, [sp, 0xC] - adds r0, r6, 0 - movs r1, 0x8 - bl HasIQSkill - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x14] - movs r0, 0 - ldr r2, [sp, 0x8] - strb r0, [r2] - adds r0, r4, 0 - adds r0, 0xBC - ldrb r0, [r0] - cmp r0, 0x5 - bne _0807C0B0 - mov r0, r10 - bl GetMoveDealsDirectDamage - lsls r0, 24 - cmp r0, 0 - beq _0807C0C4 -_0807C0B0: - ldr r3, [sp, 0x14] - cmp r3, 0 - beq _0807C0CC - adds r0, r6, 0 - mov r1, r10 - bl CanUseWithStatusChecker - lsls r0, 24 - cmp r0, 0 - bne _0807C0CC -_0807C0C4: - movs r0, 0x1 - b _0807C48C - .align 2, 0 -_0807C0C8: .4byte gCanAttackInDirection -_0807C0CC: - movs r0, 0xF0 - ldr r1, [sp, 0xC] - ands r0, r1 - cmp r0, 0 - beq _0807C0DE - cmp r0, 0x10 - beq _0807C0DE - cmp r0, 0x20 - bne _0807C19C -_0807C0DE: - adds r0, r4, 0 - adds r0, 0xE8 - ldrb r1, [r0] - cmp r1, 0x1 - bne _0807C128 - subs r0, 0xA2 - ldrb r7, [r0] - ldr r0, _0807C118 - adds r0, r7, r0 - ldrb r3, [r0] - cmp r3, 0 - beq _0807C0F8 - b _0807C3F6 -_0807C0F8: - strb r1, [r0] - ldr r0, _0807C11C - add r0, r8 - strb r7, [r0] - ldr r0, _0807C120 - mov r4, r8 - lsls r2, r4, 2 - adds r0, r2, r0 - movs r1, 0x63 - str r1, [r0] - ldr r0, _0807C124 - adds r2, r0 - str r3, [r2] - movs r0, 0x1 - add r8, r0 - b _0807C3F6 - .align 2, 0 -_0807C118: .4byte gCanAttackInDirection -_0807C11C: .4byte gUnknown_202F388 -_0807C120: .4byte gPotentialTargetWeights_2 -_0807C124: .4byte gUnknown_202F3B0 -_0807C128: - movs r7, 0 - movs r0, 0xF0 - ldr r1, [sp, 0xC] - ands r0, r1 - lsls r5, r0, 16 -_0807C132: - movs r2, 0x4 - ldrsh r0, [r6, r2] - ldr r1, _0807C198 - lsls r2, r7, 2 - adds r2, r1 - movs r3, 0 - ldrsh r1, [r2, r3] - adds r0, r1 - movs r4, 0x6 - ldrsh r1, [r6, r4] - movs r3, 0x2 - ldrsh r2, [r2, r3] - adds r1, r2 - bl GetMapTileAtPosition - ldr r4, [r0, 0x10] - cmp r4, 0 - beq _0807C18E - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0x1 - bne _0807C18E - asrs r0, r5, 16 - cmp r0, 0x10 - beq _0807C178 - cmp r0, 0x20 - beq _0807C178 - adds r0, r6, 0 - adds r1, r7, 0 - bl CanAttackInFront - lsls r0, 24 - cmp r0, 0 - beq _0807C18E -_0807C178: - mov r0, r10 - str r0, [sp] - ldr r1, [sp, 0x14] - str r1, [sp, 0x4] - mov r0, r8 - ldr r1, [sp, 0xC] - adds r2, r6, 0 - adds r3, r4, 0 - bl WeightMoveIfUsable - mov r8, r0 -_0807C18E: - adds r7, 0x1 - cmp r7, 0x7 - ble _0807C132 - b _0807C3F6 - .align 2, 0 -_0807C198: .4byte gAdjacentTileOffsets -_0807C19C: - cmp r0, 0x30 - bne _0807C1F0 - movs r5, 0 -_0807C1A2: - ldr r0, _0807C1E8 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _0807C1EC - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807C1E0 - adds r0, r6, 0 - adds r1, r4, 0 - bl CanSee - lsls r0, 24 - cmp r0, 0 - beq _0807C1E0 - mov r3, r10 - str r3, [sp] - ldr r0, [sp, 0x14] - str r0, [sp, 0x4] - mov r0, r8 - ldr r1, [sp, 0xC] - adds r2, r6, 0 - adds r3, r4, 0 - bl WeightMoveIfUsable - mov r8, r0 -_0807C1E0: - adds r5, 0x1 - cmp r5, 0x13 - ble _0807C1A2 - b _0807C3F6 - .align 2, 0 -_0807C1E8: .4byte gDungeonGlobalData -_0807C1EC: .4byte 0x000135cc -_0807C1F0: - cmp r0, 0x40 - bne _0807C2A8 - movs r7, 0 - ldr r1, _0807C2A4 - mov r9, r1 -_0807C1FA: - movs r2, 0x4 - ldrsh r0, [r6, r2] - mov r3, r9 - movs r4, 0 - ldrsh r1, [r3, r4] - adds r0, r1 - movs r2, 0x6 - ldrsh r1, [r6, r2] - movs r4, 0x2 - ldrsh r2, [r3, r4] - adds r1, r2 - bl GetMapTileAtPosition - adds r4, r0, 0 - adds r0, r6, 0 - adds r1, r7, 0 - bl CanAttackInFront - lsls r0, 24 - cmp r0, 0 - beq _0807C296 - ldr r5, [r4, 0x10] - cmp r5, 0 - beq _0807C250 - adds r0, r5, 0 - bl GetEntityType - cmp r0, 0x1 - bne _0807C250 - mov r4, r8 - mov r0, r10 - str r0, [sp] - ldr r1, [sp, 0x14] - str r1, [sp, 0x4] - adds r0, r4, 0 - ldr r1, [sp, 0xC] - adds r2, r6, 0 - adds r3, r5, 0 - bl WeightMoveIfUsable - mov r8, r0 - cmp r4, r8 - bne _0807C296 -_0807C250: - movs r2, 0x4 - ldrsh r0, [r6, r2] - mov r3, r9 - movs r4, 0 - ldrsh r1, [r3, r4] - lsls r1, 1 - adds r0, r1 - movs r2, 0x6 - ldrsh r1, [r6, r2] - movs r4, 0x2 - ldrsh r2, [r3, r4] - lsls r2, 1 - adds r1, r2 - bl GetMapTileAtPosition - adds r4, r0, 0 - ldr r5, [r4, 0x10] - cmp r5, 0 - beq _0807C296 - adds r0, r5, 0 - bl GetEntityType - cmp r0, 0x1 - bne _0807C296 - mov r0, r10 - str r0, [sp] - ldr r1, [sp, 0x14] - str r1, [sp, 0x4] - mov r0, r8 - ldr r1, [sp, 0xC] - adds r2, r6, 0 - adds r3, r5, 0 - bl WeightMoveIfUsable - mov r8, r0 -_0807C296: - movs r2, 0x4 - add r9, r2 - adds r7, 0x1 - cmp r7, 0x7 - ble _0807C1FA - b _0807C3F6 - .align 2, 0 -_0807C2A4: .4byte gAdjacentTileOffsets -_0807C2A8: - cmp r0, 0x50 - beq _0807C2B0 - cmp r0, 0x80 - bne _0807C394 -_0807C2B0: - movs r3, 0x1 - str r3, [sp, 0x18] - cmp r0, 0x50 - bne _0807C2BC - movs r4, 0xA - str r4, [sp, 0x18] -_0807C2BC: - movs r0, 0 - mov r9, r0 -_0807C2C0: - ldr r0, _0807C37C - ldr r0, [r0] - mov r2, r9 - lsls r1, r2, 2 - ldr r3, _0807C380 - adds r0, r3 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807C370 - cmp r6, r4 - beq _0807C370 - adds r1, r4, 0x4 - adds r0, r6, 0x4 - bl CalculateFacingDir - adds r5, r0, 0 - ldr r0, _0807C384 - adds r7, r5, r0 - ldrb r0, [r7] - cmp r0, 0 - bne _0807C370 - adds r0, r6, 0 - adds r1, r4, 0 - bl CanSee - lsls r0, 24 - cmp r0, 0 - beq _0807C370 - adds r0, r6, 0 - adds r1, r4, 0 - ldr r2, [sp, 0x18] - bl IsTargetInLineRange - lsls r0, 24 - cmp r0, 0 - beq _0807C370 - ldr r0, [sp, 0x14] - str r0, [sp] - ldr r0, [sp, 0xC] - adds r1, r6, 0 - adds r2, r4, 0 - mov r3, r10 - bl CanUseStatusMove - lsls r0, 24 - cmp r0, 0 - beq _0807C370 - adds r0, r6, 0 - adds r1, r4, 0 - adds r2, r5, 0 - ldr r3, [sp, 0x18] - bl IsTargetStraightAhead - lsls r0, 24 - cmp r0, 0 - beq _0807C370 - movs r0, 0x1 - strb r0, [r7] - ldr r0, _0807C388 - add r0, r8 - strb r5, [r0] - adds r0, r6, 0 - mov r1, r10 - bl GetMoveTypeForPokemon - adds r3, r0, 0 - lsls r3, 24 - lsrs r3, 24 - adds r0, r6, 0 - ldr r1, [sp, 0xC] - adds r2, r4, 0 - bl WeightMove - ldr r1, _0807C38C - mov r3, r8 - lsls r2, r3, 2 - adds r1, r2, r1 - str r0, [r1] - ldr r0, _0807C390 - adds r2, r0 - str r4, [r2] - movs r4, 0x1 - add r8, r4 -_0807C370: - movs r0, 0x1 - add r9, r0 - mov r1, r9 - cmp r1, 0x13 - ble _0807C2C0 - b _0807C3F6 - .align 2, 0 -_0807C37C: .4byte gDungeonGlobalData -_0807C380: .4byte 0x000135cc -_0807C384: .4byte gCanAttackInDirection -_0807C388: .4byte gUnknown_202F388 -_0807C38C: .4byte gPotentialTargetWeights_2 -_0807C390: .4byte gUnknown_202F3B0 -_0807C394: - cmp r0, 0x60 - bne _0807C3DC - movs r5, 0 -_0807C39A: - ldr r0, _0807C3D4 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _0807C3D8 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807C3CA - mov r3, r10 - str r3, [sp] - ldr r0, [sp, 0x14] - str r0, [sp, 0x4] - mov r0, r8 - ldr r1, [sp, 0xC] - adds r2, r6, 0 - adds r3, r4, 0 - bl WeightMoveIfUsable - mov r8, r0 -_0807C3CA: - adds r5, 0x1 - cmp r5, 0x13 - ble _0807C39A - b _0807C3F6 - .align 2, 0 -_0807C3D4: .4byte gDungeonGlobalData -_0807C3D8: .4byte 0x000135cc -_0807C3DC: - cmp r0, 0x70 - bne _0807C3F6 - mov r1, r10 - str r1, [sp] - ldr r2, [sp, 0x14] - str r2, [sp, 0x4] - mov r0, r8 - ldr r1, [sp, 0xC] - adds r2, r6, 0 - adds r3, r6, 0 - bl WeightMoveIfUsable - mov r8, r0 -_0807C3F6: - mov r3, r8 - cmp r3, 0 - bne _0807C402 - ldr r4, [sp, 0x8] - strb r3, [r4] - b _0807C48A -_0807C402: - movs r4, 0 - movs r3, 0 - mov r0, r8 - cmp r0, 0 - ble _0807C420 - ldr r2, _0807C464 - mov r1, r8 -_0807C410: - ldr r0, [r2] - cmp r3, r0 - bge _0807C418 - adds r3, r0, 0 -_0807C418: - adds r2, 0x4 - subs r1, 0x1 - cmp r1, 0 - bne _0807C410 -_0807C420: - mov r1, r8 - cmp r1, 0 - ble _0807C43A - movs r5, 0 - ldr r2, _0807C464 -_0807C42A: - ldr r0, [r2] - cmp r3, r0 - beq _0807C432 - str r5, [r2] -_0807C432: - adds r2, 0x4 - subs r1, 0x1 - cmp r1, 0 - bne _0807C42A -_0807C43A: - str r3, [sp, 0x10] - mov r2, r8 - cmp r2, 0 - ble _0807C450 - ldr r2, _0807C464 - mov r1, r8 -_0807C446: - ldm r2!, {r0} - adds r4, r0 - subs r1, 0x1 - cmp r1, 0 - bne _0807C446 -_0807C450: - adds r0, r4, 0 - bl DungeonRandomCapped - adds r2, r0, 0 - movs r1, 0 - cmp r1, r8 - bge _0807C478 - ldr r3, _0807C464 - b _0807C470 - .align 2, 0 -_0807C464: .4byte gPotentialTargetWeights_2 -_0807C468: - adds r3, 0x4 - adds r1, 0x1 - cmp r1, r8 - bge _0807C478 -_0807C470: - ldr r0, [r3] - subs r2, r0 - cmp r2, 0 - bge _0807C468 -_0807C478: - movs r0, 0x1 - ldr r3, [sp, 0x8] - strb r0, [r3] - ldr r0, _0807C49C - adds r0, r1, r0 - ldrb r0, [r0] - strb r0, [r3, 0x1] - movs r0, 0x8 - str r0, [r3, 0x4] -_0807C48A: - ldr r0, [sp, 0x10] -_0807C48C: - add sp, 0x1C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0807C49C: .4byte gUnknown_202F388 - thumb_func_end FindMoveTarget - - thumb_func_start IsTargetInLineRange -IsTargetInLineRange: - push {r4-r7,lr} - adds r4, r0, 0 - adds r5, r1, 0 - movs r0, 0x4 - ldrsh r1, [r4, r0] - movs r3, 0x4 - ldrsh r0, [r5, r3] - subs r3, r1, r0 - cmp r3, 0 - bge _0807C4B6 - negs r3, r3 -_0807C4B6: - movs r6, 0x6 - ldrsh r1, [r4, r6] - movs r7, 0x6 - ldrsh r0, [r5, r7] - subs r1, r0 - cmp r1, 0 - bge _0807C4C6 - negs r1, r1 -_0807C4C6: - adds r0, r1, 0 - cmp r1, r3 - bge _0807C4CE - adds r0, r3, 0 -_0807C4CE: - cmp r0, 0xA - bgt _0807C578 - cmp r0, r2 - bgt _0807C578 - movs r6, 0x1 - negs r6, r6 - cmp r3, r1 - bne _0807C516 - movs r0, 0x4 - ldrsh r1, [r4, r0] - movs r2, 0x4 - ldrsh r0, [r5, r2] - ldrh r2, [r4, 0x4] - ldrh r3, [r5, 0x4] - cmp r1, r0 - bge _0807C4FE - movs r6, 0x6 - ldrsh r1, [r4, r6] - movs r7, 0x6 - ldrsh r0, [r5, r7] - cmp r1, r0 - blt _0807C574 - cmp r1, r0 - bgt _0807C574 -_0807C4FE: - lsls r1, r2, 16 - lsls r0, r3, 16 - movs r6, 0x7 - cmp r1, r0 - ble _0807C570 - movs r0, 0x6 - ldrsh r1, [r4, r0] - movs r2, 0x6 - ldrsh r0, [r5, r2] - cmp r1, r0 - ble _0807C570 - b _0807C574 -_0807C516: - movs r3, 0x4 - ldrsh r1, [r4, r3] - movs r7, 0x4 - ldrsh r0, [r5, r7] - ldrh r2, [r4, 0x4] - ldrh r3, [r5, 0x4] - cmp r1, r0 - bne _0807C532 - movs r0, 0x6 - ldrsh r1, [r4, r0] - movs r7, 0x6 - ldrsh r0, [r5, r7] - cmp r1, r0 - blt _0807C574 -_0807C532: - lsls r1, r2, 16 - lsls r0, r3, 16 - cmp r1, r0 - bge _0807C546 - movs r0, 0x6 - ldrsh r1, [r4, r0] - movs r7, 0x6 - ldrsh r0, [r5, r7] - cmp r1, r0 - beq _0807C574 -_0807C546: - lsls r1, r2, 16 - lsls r0, r3, 16 - cmp r1, r0 - bne _0807C55A - movs r0, 0x6 - ldrsh r1, [r4, r0] - movs r7, 0x6 - ldrsh r0, [r5, r7] - cmp r1, r0 - bgt _0807C574 -_0807C55A: - lsls r1, r2, 16 - lsls r0, r3, 16 - cmp r1, r0 - ble _0807C570 - movs r0, 0x6 - ldrsh r1, [r4, r0] - movs r2, 0x6 - ldrsh r0, [r5, r2] - cmp r1, r0 - bne _0807C570 - movs r6, 0x6 -_0807C570: - cmp r6, 0 - blt _0807C578 -_0807C574: - movs r0, 0x1 - b _0807C57A -_0807C578: - movs r0, 0 -_0807C57A: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end IsTargetInLineRange - - thumb_func_start WeightMoveIfUsable -WeightMoveIfUsable: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x4 - adds r6, r0, 0 - adds r5, r2, 0 - adds r7, r3, 0 - ldr r0, [sp, 0x28] - lsls r1, 16 - asrs r1, 16 - mov r9, r1 - lsls r0, 24 - lsrs r0, 24 - mov r10, r0 - ldr r2, [r5, 0x70] - ldr r1, [r5, 0x4] - ldr r0, [r7, 0x4] - cmp r1, r0 - beq _0807C5BC - movs r0, 0xF0 - mov r1, r9 - ands r0, r1 - cmp r0, 0x30 - beq _0807C5BC - cmp r0, 0x60 - beq _0807C5BC - cmp r0, 0x70 - bne _0807C5C4 -_0807C5BC: - adds r0, r2, 0 - adds r0, 0x46 - ldrb r4, [r0] - b _0807C5CE -_0807C5C4: - adds r0, r5, 0x4 - adds r1, r7, 0x4 - bl CalculateFacingDir - adds r4, r0, 0 -_0807C5CE: - ldr r0, _0807C638 - adds r0, r4 - mov r8, r0 - ldrb r0, [r0] - cmp r0, 0 - bne _0807C624 - mov r0, r10 - str r0, [sp] - mov r0, r9 - adds r1, r5, 0 - adds r2, r7, 0 - ldr r3, [sp, 0x24] - bl CanUseStatusMove - lsls r0, 24 - cmp r0, 0 - beq _0807C624 - movs r0, 0x1 - mov r1, r8 - strb r0, [r1] - ldr r0, _0807C63C - adds r0, r6, r0 - strb r4, [r0] - adds r0, r5, 0 - ldr r1, [sp, 0x24] - bl GetMoveTypeForPokemon - adds r3, r0, 0 - lsls r3, 24 - lsrs r3, 24 - adds r0, r5, 0 - mov r1, r9 - adds r2, r7, 0 - bl WeightMove - ldr r1, _0807C640 - lsls r2, r6, 2 - adds r1, r2, r1 - str r0, [r1] - ldr r0, _0807C644 - adds r2, r0 - str r7, [r2] - adds r6, 0x1 -_0807C624: - adds r0, r6, 0 - add sp, 0x4 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0807C638: .4byte gCanAttackInDirection -_0807C63C: .4byte gUnknown_202F388 -_0807C640: .4byte gPotentialTargetWeights_2 -_0807C644: .4byte gUnknown_202F3B0 - thumb_func_end WeightMoveIfUsable - - thumb_func_start CanUseStatusMove -CanUseStatusMove: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r5, r1, 0 - adds r4, r2, 0 - mov r8, r3 - ldr r1, [sp, 0x1C] - lsls r0, 16 - asrs r6, r0, 16 - lsls r1, 24 - lsrs r1, 24 - mov r9, r1 - movs r7, 0 - movs r0, 0xF - ands r0, r6 - adds r1, r0, 0 - cmp r1, 0 - bne _0807C686 - adds r0, r5, 0 - adds r1, r4, 0 - movs r2, 0 - movs r3, 0x1 - bl CanTarget - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _0807C6E0 - movs r7, 0x1 - b _0807C6E4 -_0807C686: - cmp r1, 0x1 - beq _0807C6BE - cmp r1, 0x2 - bne _0807C692 - ldr r1, [r4, 0x70] - b _0807C69C -_0807C692: - cmp r1, 0x5 - bne _0807C6B6 - ldr r1, [r4, 0x70] - cmp r5, r4 - beq _0807C6B2 -_0807C69C: - movs r7, 0x1 - ldrb r0, [r1, 0x8] - cmp r0, 0x1 - beq _0807C6B2 - adds r0, r1, 0 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x4 - beq _0807C6B2 - cmp r0, 0x1 - bne _0807C6E0 -_0807C6B2: - movs r0, 0 - b _0807C7A0 -_0807C6B6: - cmp r1, 0x6 - bne _0807C6D4 - cmp r5, r4 - beq _0807C6B2 -_0807C6BE: - adds r0, r5, 0 - adds r1, r4, 0 - movs r2, 0 - movs r3, 0x1 - bl CanTarget - lsls r0, 24 - cmp r0, 0 - bne _0807C6E0 - movs r7, 0x1 - b _0807C6E4 -_0807C6D4: - subs r0, 0x3 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0x1 - bhi _0807C6E0 - movs r7, 0x1 -_0807C6E0: - cmp r7, 0 - beq _0807C79E -_0807C6E4: - mov r0, r9 - cmp r0, 0 - beq _0807C77C - adds r0, r5, 0 - adds r1, r4, 0 - mov r2, r8 - bl CanUseWithStatusChecker_2 - lsls r0, 24 - cmp r0, 0 - beq _0807C6B2 - movs r1, 0xF0 - lsls r1, 4 - ands r1, r6 - movs r0, 0x80 - lsls r0, 1 - cmp r1, r0 - beq _0807C78A - movs r0, 0x80 - lsls r0, 2 - cmp r1, r0 - beq _0807C76E - movs r0, 0xC0 - lsls r0, 2 - cmp r1, r0 - bne _0807C720 - adds r0, r4, 0 - bl HasNegativeStatus - b _0807C774 -_0807C720: - movs r0, 0x80 - lsls r0, 3 - cmp r1, r0 - bne _0807C730 - adds r0, r4, 0 - bl IsSleeping - b _0807C774 -_0807C730: - movs r0, 0xC0 - lsls r0, 3 - cmp r1, r0 - bne _0807C75A - ldr r1, [r4, 0x70] - adds r0, r1, 0 - adds r0, 0x5C - ldrb r0, [r0] - cmp r0, 0xE - beq _0807C74E - adds r0, r1, 0 - adds r0, 0x5D - ldrb r0, [r0] - cmp r0, 0xE - bne _0807C6B2 -_0807C74E: - adds r0, r1, 0 - adds r0, 0xF5 - ldrb r0, [r0] - cmp r0, 0 - beq _0807C79E - b _0807C6B2 -_0807C75A: - movs r0, 0xA0 - lsls r0, 3 - cmp r1, r0 - bne _0807C79E - adds r0, r4, 0 - bl HasNegativeStatus - lsls r0, 24 - cmp r0, 0 - bne _0807C79E -_0807C76E: - adds r0, r4, 0 - bl HasQuarterHPOrLess -_0807C774: - lsls r0, 24 - cmp r0, 0 - bne _0807C79E - b _0807C6B2 -_0807C77C: - movs r0, 0xF0 - lsls r0, 4 - ands r0, r6 - movs r1, 0x80 - lsls r1, 1 - cmp r0, r1 - bne _0807C79E -_0807C78A: - mov r0, r8 - movs r1, 0x2 - bl GetMoveAccuracy - adds r4, r0, 0 - movs r0, 0x64 - bl DungeonRandomCapped - cmp r0, r4 - bge _0807C6B2 -_0807C79E: - adds r0, r7, 0 -_0807C7A0: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end CanUseStatusMove - - thumb_func_start WeightMove -WeightMove: - push {r4-r7,lr} - mov r7, r9 - mov r6, r8 - push {r6,r7} - adds r5, r0, 0 - mov r8, r2 - lsls r1, 16 - asrs r1, 16 - lsls r3, 24 - lsrs r3, 24 - mov r9, r3 - movs r6, 0x1 - ldr r4, [r2, 0x70] - adds r7, r4, 0 - ldrb r0, [r4, 0x6] - cmp r0, 0 - beq _0807C7D6 - movs r0, 0xF - ands r0, r1 - cmp r0, 0 - beq _0807C7DA -_0807C7D6: - movs r0, 0x1 - b _0807C848 -_0807C7DA: - adds r0, r5, 0 - movs r1, 0x9 - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _0807C804 - ldr r0, _0807C7FC - ldr r0, [r0] - movs r2, 0x2 - ldrsh r1, [r4, r2] - ldr r2, _0807C800 - adds r0, r2 - adds r0, r1 - ldrb r6, [r0] - b _0807C846 - .align 2, 0 -_0807C7FC: .4byte gDungeonGlobalData -_0807C800: .4byte 0x0000363c -_0807C804: - adds r0, r5, 0 - movs r1, 0xA - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _0807C828 - ldrb r1, [r7, 0xE] - movs r2, 0xC - negs r2, r2 - adds r0, r2, 0 - subs r0, r1 - lsls r0, 24 - lsrs r6, r0, 24 - cmp r6, 0 - bne _0807C846 - movs r6, 0x1 - b _0807C846 -_0807C828: - adds r0, r5, 0 - movs r1, 0xB - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _0807C846 - adds r0, r5, 0 - mov r1, r8 - mov r2, r9 - bl WeightWeakTypePicker - adds r0, 0x1 - lsls r0, 24 - lsrs r6, r0, 24 -_0807C846: - adds r0, r6, 0 -_0807C848: - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end WeightMove - - thumb_func_start TargetRegularAttack -TargetRegularAttack: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x50 - adds r7, r0, 0 - str r1, [sp, 0x40] - lsls r2, 24 - lsrs r2, 24 - str r2, [sp, 0x44] - ldr r0, [r7, 0x70] - movs r1, 0 - mov r8, r1 - adds r1, r0, 0 - adds r1, 0x46 - ldrb r6, [r1] - adds r0, 0xE8 - ldrb r0, [r0] - movs r3, 0x8 - mov r10, r3 - cmp r0, 0x1 - bne _0807C886 - movs r0, 0x1 - mov r10, r0 -_0807C886: - movs r4, 0 - adds r0, r7, 0 - movs r1, 0x9 - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - bne _0807C8A4 - adds r0, r7, 0 - movs r1, 0xA - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _0807C8A6 -_0807C8A4: - movs r4, 0x1 -_0807C8A6: - str r4, [sp, 0x48] - adds r0, r7, 0 - movs r1, 0x8 - bl HasIQSkill - lsls r0, 24 - lsrs r0, 24 - str r0, [sp, 0x4C] - movs r1, 0 - mov r9, r1 - cmp r9, r10 - bge _0807C952 -_0807C8BE: - movs r0, 0x7 - ands r6, r0 - movs r3, 0x4 - ldrsh r0, [r7, r3] - ldr r1, _0807C95C - lsls r2, r6, 2 - adds r2, r1 - movs r3, 0 - ldrsh r1, [r2, r3] - adds r0, r1 - movs r3, 0x6 - ldrsh r1, [r7, r3] - movs r3, 0x2 - ldrsh r2, [r2, r3] - adds r1, r2 - bl GetMapTileAtPosition - ldr r5, [r0, 0x10] - cmp r5, 0 - beq _0807C948 - adds r0, r5, 0 - bl GetEntityType - cmp r0, 0x1 - bne _0807C948 - adds r0, r7, 0 - adds r1, r6, 0 - bl CanAttackInFront - lsls r0, 24 - cmp r0, 0 - beq _0807C948 - adds r0, r7, 0 - adds r1, r5, 0 - movs r2, 0 - ldr r3, [sp, 0x44] - bl CanTarget - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bne _0807C948 - ldr r0, [sp, 0x4C] - cmp r0, 0 - beq _0807C922 - ldr r0, [r5, 0x70] - adds r0, 0xB0 - ldrb r0, [r0] - cmp r0, 0x1 - beq _0807C948 -_0807C922: - mov r1, r8 - lsls r4, r1, 2 - mov r3, sp - adds r0, r3, r4 - str r6, [r0] - adds r0, r7, 0 - movs r1, 0 - adds r2, r5, 0 - movs r3, 0 - bl WeightMove - add r1, sp, 0x20 - adds r1, r4 - str r0, [r1] - ldr r0, [sp, 0x48] - cmp r0, 0 - beq _0807C960 - movs r1, 0x1 - add r8, r1 -_0807C948: - movs r3, 0x1 - add r9, r3 - adds r6, 0x1 - cmp r9, r10 - blt _0807C8BE -_0807C952: - mov r0, r8 - cmp r0, 0 - bne _0807C966 - movs r0, 0 - b _0807C9E8 - .align 2, 0 -_0807C95C: .4byte gAdjacentTileOffsets -_0807C960: - ldr r1, [sp, 0x40] - str r6, [r1] - b _0807C9E6 -_0807C966: - movs r4, 0 - movs r3, 0 - mov r0, r8 - cmp r0, 0 - ble _0807C984 - add r1, sp, 0x20 - mov r2, r8 -_0807C974: - ldr r0, [r1] - cmp r3, r0 - bge _0807C97C - adds r3, r0, 0 -_0807C97C: - adds r1, 0x4 - subs r2, 0x1 - cmp r2, 0 - bne _0807C974 -_0807C984: - mov r1, r8 - cmp r1, 0 - ble _0807C9A0 - movs r5, 0 - add r1, sp, 0x20 - mov r2, r8 -_0807C990: - ldr r0, [r1] - cmp r3, r0 - beq _0807C998 - str r5, [r1] -_0807C998: - adds r1, 0x4 - subs r2, 0x1 - cmp r2, 0 - bne _0807C990 -_0807C9A0: - mov r3, r8 - cmp r3, 0 - ble _0807C9B4 - add r1, sp, 0x20 - mov r2, r8 -_0807C9AA: - ldm r1!, {r0} - adds r4, r0 - subs r2, 0x1 - cmp r2, 0 - bne _0807C9AA -_0807C9B4: - adds r0, r4, 0 - bl DungeonRandomCapped - adds r1, r0, 0 - movs r2, 0 - cmp r2, r8 - bge _0807C9DC - ldr r0, [sp, 0x20] - subs r1, r0 - cmp r1, 0 - blt _0807C9DC - add r3, sp, 0x20 -_0807C9CC: - adds r3, 0x4 - adds r2, 0x1 - cmp r2, r8 - bge _0807C9DC - ldr r0, [r3] - subs r1, r0 - cmp r1, 0 - bge _0807C9CC -_0807C9DC: - lsls r0, r2, 2 - add r0, sp - ldr r0, [r0] - ldr r1, [sp, 0x40] - str r0, [r1] -_0807C9E6: - movs r0, 0x1 -_0807C9E8: - add sp, 0x50 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end TargetRegularAttack - - .align 2, 0 \ No newline at end of file diff --git a/asm/code_807C4A0.s b/asm/code_807C4A0.s new file mode 100644 index 0000000..ef16f46 --- /dev/null +++ b/asm/code_807C4A0.s @@ -0,0 +1,742 @@ + #include "asm/constants/gba_constants.inc" + #include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start IsTargetInLineRange +IsTargetInLineRange: + push {r4-r7,lr} + adds r4, r0, 0 + adds r5, r1, 0 + movs r0, 0x4 + ldrsh r1, [r4, r0] + movs r3, 0x4 + ldrsh r0, [r5, r3] + subs r3, r1, r0 + cmp r3, 0 + bge _0807C4B6 + negs r3, r3 +_0807C4B6: + movs r6, 0x6 + ldrsh r1, [r4, r6] + movs r7, 0x6 + ldrsh r0, [r5, r7] + subs r1, r0 + cmp r1, 0 + bge _0807C4C6 + negs r1, r1 +_0807C4C6: + adds r0, r1, 0 + cmp r1, r3 + bge _0807C4CE + adds r0, r3, 0 +_0807C4CE: + cmp r0, 0xA + bgt _0807C578 + cmp r0, r2 + bgt _0807C578 + movs r6, 0x1 + negs r6, r6 + cmp r3, r1 + bne _0807C516 + movs r0, 0x4 + ldrsh r1, [r4, r0] + movs r2, 0x4 + ldrsh r0, [r5, r2] + ldrh r2, [r4, 0x4] + ldrh r3, [r5, 0x4] + cmp r1, r0 + bge _0807C4FE + movs r6, 0x6 + ldrsh r1, [r4, r6] + movs r7, 0x6 + ldrsh r0, [r5, r7] + cmp r1, r0 + blt _0807C574 + cmp r1, r0 + bgt _0807C574 +_0807C4FE: + lsls r1, r2, 16 + lsls r0, r3, 16 + movs r6, 0x7 + cmp r1, r0 + ble _0807C570 + movs r0, 0x6 + ldrsh r1, [r4, r0] + movs r2, 0x6 + ldrsh r0, [r5, r2] + cmp r1, r0 + ble _0807C570 + b _0807C574 +_0807C516: + movs r3, 0x4 + ldrsh r1, [r4, r3] + movs r7, 0x4 + ldrsh r0, [r5, r7] + ldrh r2, [r4, 0x4] + ldrh r3, [r5, 0x4] + cmp r1, r0 + bne _0807C532 + movs r0, 0x6 + ldrsh r1, [r4, r0] + movs r7, 0x6 + ldrsh r0, [r5, r7] + cmp r1, r0 + blt _0807C574 +_0807C532: + lsls r1, r2, 16 + lsls r0, r3, 16 + cmp r1, r0 + bge _0807C546 + movs r0, 0x6 + ldrsh r1, [r4, r0] + movs r7, 0x6 + ldrsh r0, [r5, r7] + cmp r1, r0 + beq _0807C574 +_0807C546: + lsls r1, r2, 16 + lsls r0, r3, 16 + cmp r1, r0 + bne _0807C55A + movs r0, 0x6 + ldrsh r1, [r4, r0] + movs r7, 0x6 + ldrsh r0, [r5, r7] + cmp r1, r0 + bgt _0807C574 +_0807C55A: + lsls r1, r2, 16 + lsls r0, r3, 16 + cmp r1, r0 + ble _0807C570 + movs r0, 0x6 + ldrsh r1, [r4, r0] + movs r2, 0x6 + ldrsh r0, [r5, r2] + cmp r1, r0 + bne _0807C570 + movs r6, 0x6 +_0807C570: + cmp r6, 0 + blt _0807C578 +_0807C574: + movs r0, 0x1 + b _0807C57A +_0807C578: + movs r0, 0 +_0807C57A: + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end IsTargetInLineRange + + thumb_func_start WeightMoveIfUsable +WeightMoveIfUsable: + push {r4-r7,lr} + mov r7, r10 + mov r6, r9 + mov r5, r8 + push {r5-r7} + sub sp, 0x4 + adds r6, r0, 0 + adds r5, r2, 0 + adds r7, r3, 0 + ldr r0, [sp, 0x28] + lsls r1, 16 + asrs r1, 16 + mov r9, r1 + lsls r0, 24 + lsrs r0, 24 + mov r10, r0 + ldr r2, [r5, 0x70] + ldr r1, [r5, 0x4] + ldr r0, [r7, 0x4] + cmp r1, r0 + beq _0807C5BC + movs r0, 0xF0 + mov r1, r9 + ands r0, r1 + cmp r0, 0x30 + beq _0807C5BC + cmp r0, 0x60 + beq _0807C5BC + cmp r0, 0x70 + bne _0807C5C4 +_0807C5BC: + adds r0, r2, 0 + adds r0, 0x46 + ldrb r4, [r0] + b _0807C5CE +_0807C5C4: + adds r0, r5, 0x4 + adds r1, r7, 0x4 + bl CalculateFacingDir + adds r4, r0, 0 +_0807C5CE: + ldr r0, _0807C638 + adds r0, r4 + mov r8, r0 + ldrb r0, [r0] + cmp r0, 0 + bne _0807C624 + mov r0, r10 + str r0, [sp] + mov r0, r9 + adds r1, r5, 0 + adds r2, r7, 0 + ldr r3, [sp, 0x24] + bl CanUseStatusMove + lsls r0, 24 + cmp r0, 0 + beq _0807C624 + movs r0, 0x1 + mov r1, r8 + strb r0, [r1] + ldr r0, _0807C63C + adds r0, r6, r0 + strb r4, [r0] + adds r0, r5, 0 + ldr r1, [sp, 0x24] + bl GetMoveTypeForPokemon + adds r3, r0, 0 + lsls r3, 24 + lsrs r3, 24 + adds r0, r5, 0 + mov r1, r9 + adds r2, r7, 0 + bl WeightMove + ldr r1, _0807C640 + lsls r2, r6, 2 + adds r1, r2, r1 + str r0, [r1] + ldr r0, _0807C644 + adds r2, r0 + str r7, [r2] + adds r6, 0x1 +_0807C624: + adds r0, r6, 0 + add sp, 0x4 + pop {r3-r5} + mov r8, r3 + mov r9, r4 + mov r10, r5 + pop {r4-r7} + pop {r1} + bx r1 + .align 2, 0 +_0807C638: .4byte gCanAttackInDirection +_0807C63C: .4byte gPotentialAttackTargetDirections +_0807C640: .4byte gPotentialTargetWeights_2 +_0807C644: .4byte gPotentialTargets + thumb_func_end WeightMoveIfUsable + + thumb_func_start CanUseStatusMove +CanUseStatusMove: + push {r4-r7,lr} + mov r7, r9 + mov r6, r8 + push {r6,r7} + adds r5, r1, 0 + adds r4, r2, 0 + mov r8, r3 + ldr r1, [sp, 0x1C] + lsls r0, 16 + asrs r6, r0, 16 + lsls r1, 24 + lsrs r1, 24 + mov r9, r1 + movs r7, 0 + movs r0, 0xF + ands r0, r6 + adds r1, r0, 0 + cmp r1, 0 + bne _0807C686 + adds r0, r5, 0 + adds r1, r4, 0 + movs r2, 0 + movs r3, 0x1 + bl CanTarget + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x1 + bne _0807C6E0 + movs r7, 0x1 + b _0807C6E4 +_0807C686: + cmp r1, 0x1 + beq _0807C6BE + cmp r1, 0x2 + bne _0807C692 + ldr r1, [r4, 0x70] + b _0807C69C +_0807C692: + cmp r1, 0x5 + bne _0807C6B6 + ldr r1, [r4, 0x70] + cmp r5, r4 + beq _0807C6B2 +_0807C69C: + movs r7, 0x1 + ldrb r0, [r1, 0x8] + cmp r0, 0x1 + beq _0807C6B2 + adds r0, r1, 0 + adds r0, 0xA4 + ldrb r0, [r0] + cmp r0, 0x4 + beq _0807C6B2 + cmp r0, 0x1 + bne _0807C6E0 +_0807C6B2: + movs r0, 0 + b _0807C7A0 +_0807C6B6: + cmp r1, 0x6 + bne _0807C6D4 + cmp r5, r4 + beq _0807C6B2 +_0807C6BE: + adds r0, r5, 0 + adds r1, r4, 0 + movs r2, 0 + movs r3, 0x1 + bl CanTarget + lsls r0, 24 + cmp r0, 0 + bne _0807C6E0 + movs r7, 0x1 + b _0807C6E4 +_0807C6D4: + subs r0, 0x3 + lsls r0, 16 + lsrs r0, 16 + cmp r0, 0x1 + bhi _0807C6E0 + movs r7, 0x1 +_0807C6E0: + cmp r7, 0 + beq _0807C79E +_0807C6E4: + mov r0, r9 + cmp r0, 0 + beq _0807C77C + adds r0, r5, 0 + adds r1, r4, 0 + mov r2, r8 + bl CanUseWithStatusChecker_2 + lsls r0, 24 + cmp r0, 0 + beq _0807C6B2 + movs r1, 0xF0 + lsls r1, 4 + ands r1, r6 + movs r0, 0x80 + lsls r0, 1 + cmp r1, r0 + beq _0807C78A + movs r0, 0x80 + lsls r0, 2 + cmp r1, r0 + beq _0807C76E + movs r0, 0xC0 + lsls r0, 2 + cmp r1, r0 + bne _0807C720 + adds r0, r4, 0 + bl HasNegativeStatus + b _0807C774 +_0807C720: + movs r0, 0x80 + lsls r0, 3 + cmp r1, r0 + bne _0807C730 + adds r0, r4, 0 + bl IsSleeping + b _0807C774 +_0807C730: + movs r0, 0xC0 + lsls r0, 3 + cmp r1, r0 + bne _0807C75A + ldr r1, [r4, 0x70] + adds r0, r1, 0 + adds r0, 0x5C + ldrb r0, [r0] + cmp r0, 0xE + beq _0807C74E + adds r0, r1, 0 + adds r0, 0x5D + ldrb r0, [r0] + cmp r0, 0xE + bne _0807C6B2 +_0807C74E: + adds r0, r1, 0 + adds r0, 0xF5 + ldrb r0, [r0] + cmp r0, 0 + beq _0807C79E + b _0807C6B2 +_0807C75A: + movs r0, 0xA0 + lsls r0, 3 + cmp r1, r0 + bne _0807C79E + adds r0, r4, 0 + bl HasNegativeStatus + lsls r0, 24 + cmp r0, 0 + bne _0807C79E +_0807C76E: + adds r0, r4, 0 + bl HasQuarterHPOrLess +_0807C774: + lsls r0, 24 + cmp r0, 0 + bne _0807C79E + b _0807C6B2 +_0807C77C: + movs r0, 0xF0 + lsls r0, 4 + ands r0, r6 + movs r1, 0x80 + lsls r1, 1 + cmp r0, r1 + bne _0807C79E +_0807C78A: + mov r0, r8 + movs r1, 0x2 + bl GetMoveAccuracy + adds r4, r0, 0 + movs r0, 0x64 + bl DungeonRandomCapped + cmp r0, r4 + bge _0807C6B2 +_0807C79E: + adds r0, r7, 0 +_0807C7A0: + pop {r3,r4} + mov r8, r3 + mov r9, r4 + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end CanUseStatusMove + + thumb_func_start WeightMove +WeightMove: + push {r4-r7,lr} + mov r7, r9 + mov r6, r8 + push {r6,r7} + adds r5, r0, 0 + mov r8, r2 + lsls r1, 16 + asrs r1, 16 + lsls r3, 24 + lsrs r3, 24 + mov r9, r3 + movs r6, 0x1 + ldr r4, [r2, 0x70] + adds r7, r4, 0 + ldrb r0, [r4, 0x6] + cmp r0, 0 + beq _0807C7D6 + movs r0, 0xF + ands r0, r1 + cmp r0, 0 + beq _0807C7DA +_0807C7D6: + movs r0, 0x1 + b _0807C848 +_0807C7DA: + adds r0, r5, 0 + movs r1, 0x9 + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _0807C804 + ldr r0, _0807C7FC + ldr r0, [r0] + movs r2, 0x2 + ldrsh r1, [r4, r2] + ldr r2, _0807C800 + adds r0, r2 + adds r0, r1 + ldrb r6, [r0] + b _0807C846 + .align 2, 0 +_0807C7FC: .4byte gDungeonGlobalData +_0807C800: .4byte 0x0000363c +_0807C804: + adds r0, r5, 0 + movs r1, 0xA + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _0807C828 + ldrb r1, [r7, 0xE] + movs r2, 0xC + negs r2, r2 + adds r0, r2, 0 + subs r0, r1 + lsls r0, 24 + lsrs r6, r0, 24 + cmp r6, 0 + bne _0807C846 + movs r6, 0x1 + b _0807C846 +_0807C828: + adds r0, r5, 0 + movs r1, 0xB + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _0807C846 + adds r0, r5, 0 + mov r1, r8 + mov r2, r9 + bl WeightWeakTypePicker + adds r0, 0x1 + lsls r0, 24 + lsrs r6, r0, 24 +_0807C846: + adds r0, r6, 0 +_0807C848: + pop {r3,r4} + mov r8, r3 + mov r9, r4 + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end WeightMove + + thumb_func_start TargetRegularAttack +TargetRegularAttack: + push {r4-r7,lr} + mov r7, r10 + mov r6, r9 + mov r5, r8 + push {r5-r7} + sub sp, 0x50 + adds r7, r0, 0 + str r1, [sp, 0x40] + lsls r2, 24 + lsrs r2, 24 + str r2, [sp, 0x44] + ldr r0, [r7, 0x70] + movs r1, 0 + mov r8, r1 + adds r1, r0, 0 + adds r1, 0x46 + ldrb r6, [r1] + adds r0, 0xE8 + ldrb r0, [r0] + movs r3, 0x8 + mov r10, r3 + cmp r0, 0x1 + bne _0807C886 + movs r0, 0x1 + mov r10, r0 +_0807C886: + movs r4, 0 + adds r0, r7, 0 + movs r1, 0x9 + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + bne _0807C8A4 + adds r0, r7, 0 + movs r1, 0xA + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _0807C8A6 +_0807C8A4: + movs r4, 0x1 +_0807C8A6: + str r4, [sp, 0x48] + adds r0, r7, 0 + movs r1, 0x8 + bl HasIQSkill + lsls r0, 24 + lsrs r0, 24 + str r0, [sp, 0x4C] + movs r1, 0 + mov r9, r1 + cmp r9, r10 + bge _0807C952 +_0807C8BE: + movs r0, 0x7 + ands r6, r0 + movs r3, 0x4 + ldrsh r0, [r7, r3] + ldr r1, _0807C95C + lsls r2, r6, 2 + adds r2, r1 + movs r3, 0 + ldrsh r1, [r2, r3] + adds r0, r1 + movs r3, 0x6 + ldrsh r1, [r7, r3] + movs r3, 0x2 + ldrsh r2, [r2, r3] + adds r1, r2 + bl GetMapTileAtPosition + ldr r5, [r0, 0x10] + cmp r5, 0 + beq _0807C948 + adds r0, r5, 0 + bl GetEntityType + cmp r0, 0x1 + bne _0807C948 + adds r0, r7, 0 + adds r1, r6, 0 + bl CanAttackInFront + lsls r0, 24 + cmp r0, 0 + beq _0807C948 + adds r0, r7, 0 + adds r1, r5, 0 + movs r2, 0 + ldr r3, [sp, 0x44] + bl CanTarget + lsls r0, 24 + lsrs r0, 24 + cmp r0, 0x1 + bne _0807C948 + ldr r0, [sp, 0x4C] + cmp r0, 0 + beq _0807C922 + ldr r0, [r5, 0x70] + adds r0, 0xB0 + ldrb r0, [r0] + cmp r0, 0x1 + beq _0807C948 +_0807C922: + mov r1, r8 + lsls r4, r1, 2 + mov r3, sp + adds r0, r3, r4 + str r6, [r0] + adds r0, r7, 0 + movs r1, 0 + adds r2, r5, 0 + movs r3, 0 + bl WeightMove + add r1, sp, 0x20 + adds r1, r4 + str r0, [r1] + ldr r0, [sp, 0x48] + cmp r0, 0 + beq _0807C960 + movs r1, 0x1 + add r8, r1 +_0807C948: + movs r3, 0x1 + add r9, r3 + adds r6, 0x1 + cmp r9, r10 + blt _0807C8BE +_0807C952: + mov r0, r8 + cmp r0, 0 + bne _0807C966 + movs r0, 0 + b _0807C9E8 + .align 2, 0 +_0807C95C: .4byte gAdjacentTileOffsets +_0807C960: + ldr r1, [sp, 0x40] + str r6, [r1] + b _0807C9E6 +_0807C966: + movs r4, 0 + movs r3, 0 + mov r0, r8 + cmp r0, 0 + ble _0807C984 + add r1, sp, 0x20 + mov r2, r8 +_0807C974: + ldr r0, [r1] + cmp r3, r0 + bge _0807C97C + adds r3, r0, 0 +_0807C97C: + adds r1, 0x4 + subs r2, 0x1 + cmp r2, 0 + bne _0807C974 +_0807C984: + mov r1, r8 + cmp r1, 0 + ble _0807C9A0 + movs r5, 0 + add r1, sp, 0x20 + mov r2, r8 +_0807C990: + ldr r0, [r1] + cmp r3, r0 + beq _0807C998 + str r5, [r1] +_0807C998: + adds r1, 0x4 + subs r2, 0x1 + cmp r2, 0 + bne _0807C990 +_0807C9A0: + mov r3, r8 + cmp r3, 0 + ble _0807C9B4 + add r1, sp, 0x20 + mov r2, r8 +_0807C9AA: + ldm r1!, {r0} + adds r4, r0 + subs r2, 0x1 + cmp r2, 0 + bne _0807C9AA +_0807C9B4: + adds r0, r4, 0 + bl DungeonRandomCapped + adds r1, r0, 0 + movs r2, 0 + cmp r2, r8 + bge _0807C9DC + ldr r0, [sp, 0x20] + subs r1, r0 + cmp r1, 0 + blt _0807C9DC + add r3, sp, 0x20 +_0807C9CC: + adds r3, 0x4 + adds r2, 0x1 + cmp r2, r8 + bge _0807C9DC + ldr r0, [r3] + subs r1, r0 + cmp r1, 0 + bge _0807C9CC +_0807C9DC: + lsls r0, r2, 2 + add r0, sp + ldr r0, [r0] + ldr r1, [sp, 0x40] + str r0, [r1] +_0807C9E6: + movs r0, 0x1 +_0807C9E8: + add sp, 0x50 + pop {r3-r5} + mov r8, r3 + mov r9, r4 + mov r10, r5 + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end TargetRegularAttack + + .align 2, 0 \ No newline at end of file diff --git a/include/dungeon_ai_attack.h b/include/dungeon_ai_attack.h index 77b53fc..1878889 100644 --- a/include/dungeon_ai_attack.h +++ b/include/dungeon_ai_attack.h @@ -3,7 +3,16 @@ #include "dungeon_entity.h" +struct MoveTargetResults +{ + bool8 moveUsable; + u8 targetDir; + s32 moveWeight; +}; + // 0x7BB94 void DecideAttack(struct DungeonEntity *pokemon); +// 0x7C04C +s32 FindMoveTarget(struct MoveTargetResults *moveTargetResults, struct DungeonEntity *pokemon, struct PokemonMove *move); #endif diff --git a/include/map.h b/include/map.h index 9122f00..3601a14 100644 --- a/include/map.h +++ b/include/map.h @@ -38,7 +38,7 @@ struct MapTile u8 unk8; /* 0x9 */ u8 roomIndex; // Bitwise flags for whether Pokémon can move to an adjacent tile. Bits correspond to directions in direction.h. - // Different sets of flags are used for Pokémon that can cross special terrain, corresponding to Cthe rossableTerrain enum. + // Different sets of flags are used for Pokémon that can cross special terrain, corresponding to the CrossableTerrain enum. /* 0xA */ u8 canMoveAdjacent[NUM_CROSSABLE_TERRAIN]; u8 fillE[0x10 - 0xE]; /* 0x10 */ struct DungeonEntity *pokemon; // Pokémon on the tile. diff --git a/include/moves.h b/include/moves.h index 847f167..c86f986 100644 --- a/include/moves.h +++ b/include/moves.h @@ -9,5 +9,7 @@ void InitPokemonMove(struct PokemonMove *move, u16 moveID); u8 GetMoveWeight(struct PokemonMove *move); // 0x92BF4 u32 GetMoveMaxPP(struct PokemonMove *move); +// 0x92C54 +bool8 GetMoveDealsDirectDamage(struct PokemonMove *move); #endif diff --git a/ld_script.txt b/ld_script.txt index 714e0d4..1e4693f 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -234,7 +234,7 @@ SECTIONS { src/dungeon_ai_movement.o(.text); asm/code_8075BA4.o(.text); src/dungeon_ai_attack.o(.text); - asm/code_807C04C.o(.text); + asm/code_807C4A0.o(.text); src/dungeon_ai_attack_1.o(.text); asm/code_807CABC.o(.text); src/dungeon_range.o(.text); diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c index 416d4da..5667d75 100644 --- a/src/dungeon_ai_attack.c +++ b/src/dungeon_ai_attack.c @@ -11,12 +11,18 @@ #include "charge_move.h" #include "dungeon_action.h" #include "dungeon_ai.h" +#include "dungeon_ai_attack_1.h" #include "dungeon_capabilities_1.h" +#include "dungeon_global_data.h" +#include "dungeon_map_access.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_random.h" #include "dungeon_random_1.h" +#include "dungeon_util.h" +#include "dungeon_visibility.h" #include "moves.h" +#include "position_util.h" #include "status_checks.h" #include "targeting.h" @@ -24,16 +30,21 @@ const s16 gRegularAttackWeights[] = {100, 20, 30, 40, 50}; -struct MoveTargetResults -{ - bool8 moveUsable; - u8 targetDir; - s32 moveWeight; -}; +extern bool8 gCanAttackInDirection[NUM_DIRECTIONS]; +extern s32 gNumPotentialTargets; +extern s32 gPotentialTargetWeights_2[NUM_DIRECTIONS]; +extern u8 gPotentialAttackTargetDirections[NUM_DIRECTIONS]; +extern struct DungeonEntity *gPotentialTargets[NUM_DIRECTIONS]; -extern s32 FindMoveTarget(struct MoveTargetResults*, struct DungeonEntity*, struct PokemonMove*); extern bool8 IsMoveUsable(struct DungeonEntity*, s32, bool8); extern bool8 TargetRegularAttack(struct DungeonEntity*, u32*, bool8); +extern s16 GetTargetingFlags(struct DungeonEntity*, struct PokemonMove*, bool8); +extern bool8 CanUseWithStatusChecker(struct DungeonEntity*, struct PokemonMove*); +extern bool8 CanAttackInFront(struct DungeonEntity*, s32); +extern s32 WeightMoveIfUsable(s32, s32, struct DungeonEntity*, struct DungeonEntity*, struct PokemonMove*, bool8); +extern bool8 IsTargetInLineRange(struct DungeonEntity*, struct DungeonEntity*, s32); +extern bool8 CanUseStatusMove(s32, struct DungeonEntity*, struct DungeonEntity*, struct PokemonMove*, bool8); +extern s32 WeightMove(struct DungeonEntity*, s32, struct DungeonEntity*, u8); void DecideAttack(struct DungeonEntity *pokemon) { @@ -320,3 +331,197 @@ void DecideAttack(struct DungeonEntity *pokemon) TargetTileInFront(pokemon); } } + +s32 FindMoveTarget(struct MoveTargetResults *moveTargetResults, struct DungeonEntity *pokemon, struct PokemonMove *move) +{ + s32 targetingFlags; + s32 moveWeight = 1; + struct DungeonEntityData *pokemonData = pokemon->entityData; + s32 numPotentialTargets = 0; + s32 i; + bool8 hasStatusChecker; + s32 rangeTargetingFlags; + s32 rangeTargetingFlags2; + for (i = 0; i < NUM_DIRECTIONS; i++) + { + gCanAttackInDirection[i] = FALSE; + } + targetingFlags = GetTargetingFlags(pokemon, move, TRUE); + hasStatusChecker = HasIQSkill(pokemon, IQ_SKILL_STATUS_CHECKER); + moveTargetResults->moveUsable = FALSE; + if ((pokemonData->volatileStatus == VOLATILE_STATUS_TAUNTED && !GetMoveDealsDirectDamage(move)) || + (hasStatusChecker && !CanUseWithStatusChecker(pokemon, move))) + { + return 1; + } + rangeTargetingFlags = targetingFlags & 0xF0; + if (rangeTargetingFlags == TARGETING_FLAG_TARGET_OTHER || + rangeTargetingFlags == TARGETING_FLAG_TARGET_FRONTAL_CONE || + rangeTargetingFlags == TARGETING_FLAG_TARGET_AROUND) + { + if (pokemonData->eyesightStatus == EYESIGHT_STATUS_BLINKER) + { + u8 facingDir = pokemonData->action.facingDir; + i = facingDir; // Fixes a regswap. + if (!gCanAttackInDirection[i]) + { + gCanAttackInDirection[i] = TRUE; + gPotentialAttackTargetDirections[numPotentialTargets] = i; + gPotentialTargetWeights_2[numPotentialTargets] = 99; + gPotentialTargets[numPotentialTargets] = NULL; + numPotentialTargets++; + } + } + else + { + for (i = 0; i < NUM_DIRECTIONS; i++) + { + // Double assignment to fix a regswap. + s16 rangeTargetingFlags = rangeTargetingFlags2 = targetingFlags & 0xF0; + struct MapTile *adjacentTile = GetMapTileAtPosition(pokemon->posWorld.x + gAdjacentTileOffsets[i].x, + pokemon->posWorld.y + gAdjacentTileOffsets[i].y); + struct DungeonEntity *adjacentPokemon = adjacentTile->pokemon; + if (adjacentPokemon != NULL && GetEntityType(adjacentPokemon) == ENTITY_POKEMON) + { + if (rangeTargetingFlags != TARGETING_FLAG_TARGET_FRONTAL_CONE && + rangeTargetingFlags != TARGETING_FLAG_TARGET_AROUND) + { + if (!CanAttackInFront(pokemon, i)) + { + continue; + } + } + numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, adjacentPokemon, move, hasStatusChecker); + } + } + } + } + else if (rangeTargetingFlags == TARGETING_FLAG_TARGET_ROOM) + { + s32 i; + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) + { + struct DungeonEntity *target = gDungeonGlobalData->allPokemon[i]; + if (EntityExists(target) && CanSee(pokemon, target)) + { + numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, target, move, hasStatusChecker); + } + } + } + else if (rangeTargetingFlags == TARGETING_FLAG_TARGET_2_TILES_AHEAD) + { + for (i = 0; i < NUM_DIRECTIONS; i++) + { + struct MapTile *targetTile = GetMapTileAtPosition(pokemon->posWorld.x + gAdjacentTileOffsets[i].x, + pokemon->posWorld.y + gAdjacentTileOffsets[i].y); + if (CanAttackInFront(pokemon, i)) + { + struct DungeonEntity *targetPokemon = targetTile->pokemon; + if (targetPokemon != NULL && GetEntityType(targetPokemon) == ENTITY_POKEMON) + { + s32 prevNumPotentialTargets = numPotentialTargets; + numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, targetPokemon, move, hasStatusChecker); + if (prevNumPotentialTargets != numPotentialTargets) + { + continue; + } + } + targetTile = GetMapTileAtPosition(pokemon->posWorld.x + gAdjacentTileOffsets[i].x * 2, + pokemon->posWorld.y + gAdjacentTileOffsets[i].y * 2); + targetPokemon = targetTile->pokemon; + if (targetPokemon != NULL && GetEntityType(targetPokemon) == ENTITY_POKEMON) + { + numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, targetPokemon, move, hasStatusChecker); + } + } + } + } + else if (rangeTargetingFlags == TARGETING_FLAG_TARGET_LINE || rangeTargetingFlags == TARGETING_FLAG_CUT_CORNERS) + { + s32 maxRange = 1; + s32 i; + if (rangeTargetingFlags == TARGETING_FLAG_TARGET_LINE) + { + maxRange = 10; + } + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) + { + struct DungeonEntity *target = gDungeonGlobalData->allPokemon[i]; + if (EntityExists(target) && pokemon != target) + { + s32 facingDir = CalculateFacingDir(&pokemon->posWorld, &target->posWorld); + if (!gCanAttackInDirection[facingDir] && + CanSee(pokemon, target) && + IsTargetInLineRange(pokemon, target, maxRange) && + CanUseStatusMove(targetingFlags, pokemon, target, move, hasStatusChecker) && + IsTargetStraightAhead(pokemon, target, facingDir, maxRange)) + { + gCanAttackInDirection[facingDir] = TRUE; + gPotentialAttackTargetDirections[numPotentialTargets] = facingDir; + gPotentialTargetWeights_2[numPotentialTargets] = WeightMove(pokemon, targetingFlags, target, GetMoveTypeForPokemon(pokemon, move)); + gPotentialTargets[numPotentialTargets] = target; + numPotentialTargets++; + } + } + } + } + else if (rangeTargetingFlags == TARGETING_FLAG_TARGET_FLOOR) + { + s32 i; + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) + { + struct DungeonEntity *target = gDungeonGlobalData->allPokemon[i]; + if (EntityExists(target)) + { + numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, target, move, hasStatusChecker); + } + } + } + else if (rangeTargetingFlags == TARGETING_FLAG_SELF_HEAL) + { + numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, pokemon, move, hasStatusChecker); + } + if (numPotentialTargets == 0) + { + moveTargetResults->moveUsable = FALSE; + } + else + { + s32 totalWeight = 0; + s32 maxWeight = 0; + s32 weightCounter; + s32 i; + for (i = 0; i < numPotentialTargets; i++) + { + if (maxWeight < gPotentialTargetWeights_2[i]) + { + maxWeight = gPotentialTargetWeights_2[i]; + } + } + for (i = 0; i < numPotentialTargets; i++) + { + if (maxWeight != gPotentialTargetWeights_2[i]) + { + gPotentialTargetWeights_2[i] = 0; + } + } + moveWeight = maxWeight; + for (i = 0; i < numPotentialTargets; i++) + { + totalWeight += gPotentialTargetWeights_2[i]; + } + weightCounter = DungeonRandomCapped(totalWeight); + for (i = 0; i < numPotentialTargets; i++) + { + weightCounter -= gPotentialTargetWeights_2[i]; + if (weightCounter < 0) + { + break; + } + } + moveTargetResults->moveUsable = TRUE; + moveTargetResults->targetDir = gPotentialAttackTargetDirections[i]; + moveTargetResults->moveWeight = 8; + } + return moveWeight; +} \ No newline at end of file diff --git a/src/dungeon_ai_items.c b/src/dungeon_ai_items.c index 2b1bb71..5e60708 100644 --- a/src/dungeon_ai_items.c +++ b/src/dungeon_ai_items.c @@ -40,7 +40,7 @@ extern void sub_8077274(struct DungeonEntity *, struct DungeonEntity *); extern s32 gNumPotentialTargets; extern u32 gPotentialTargetWeights[NUM_DIRECTIONS]; -extern u32 gPotentialTargetDirections[NUM_DIRECTIONS]; +extern u32 gPotentialItemTargetDirections[NUM_DIRECTIONS]; extern bool8 gTargetAhead[NUM_DIRECTIONS]; extern struct TeamInventory *gTeamInventory_203B460; @@ -101,7 +101,7 @@ void DecideUseItem(struct DungeonEntity *pokemon) pokemonData->action.actionUseIndex = selectedToolboxIndex; pokemonData->action.lastItemThrowPosition.x = pokemon->posWorld.x; pokemonData->action.lastItemThrowPosition.y = pokemon->posWorld.y; - pokemonData->action.facingDir = gPotentialTargetDirections[targetIndex] & DIRECTION_MASK; + pokemonData->action.facingDir = gPotentialItemTargetDirections[targetIndex] & DIRECTION_MASK; break; } } @@ -261,7 +261,7 @@ void DecideUseItem(struct DungeonEntity *pokemon) pokemonData->action.actionUseIndex = selectedToolboxIndex; pokemonData->action.lastItemThrowPosition.x = pokemon->posWorld.x; pokemonData->action.lastItemThrowPosition.y = pokemon->posWorld.y; - pokemonData->action.facingDir = gPotentialTargetDirections[targetIndex] & DIRECTION_MASK; + pokemonData->action.facingDir = gPotentialItemTargetDirections[targetIndex] & DIRECTION_MASK; return; } } @@ -421,7 +421,7 @@ void TargetThrownItem(struct DungeonEntity *pokemon, struct DungeonEntity *targe u32 itemWeight; u32 *targetWeight; gTargetAhead[targetDirection] = TRUE; - gPotentialTargetDirections[gNumPotentialTargets] = targetDirection; + gPotentialItemTargetDirections[gNumPotentialTargets] = targetDirection; targetWeight = &gPotentialTargetWeights[gNumPotentialTargets]; itemWeight = !ignoreRollChance ? EvaluateItem(targetPokemon, item, targetingFlags) : 100; *targetWeight = itemWeight; diff --git a/src/moves.c b/src/moves.c index 54927d8..2a0703b 100644 --- a/src/moves.c +++ b/src/moves.c @@ -271,12 +271,12 @@ u8 GetMoveCriticalHitChance(struct PokemonMove *move) return gMovesData[move->moveID].criticalHitChance; } -u8 GetMoveCannotHitFrozen(struct PokemonMove *move) +bool8 GetMoveCannotHitFrozen(struct PokemonMove *move) { return gMovesData[move->moveID].cannotHitFrozen; } -u8 GetMoveDealsDirectDamage(struct PokemonMove *move) +bool8 GetMoveDealsDirectDamage(struct PokemonMove *move) { return gMovesData[move->moveID].dealsDirectDamage; } diff --git a/sym_ewram.txt b/sym_ewram.txt index d9b257e..bacec19 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -846,7 +846,7 @@ gUnknown_202F32C = .; /* 202F32C */ gUnknown_202F32D = .; /* 202F32D */ . += 0x3; -gPotentialTargetDirections = .; /* 202F330 */ +gPotentialItemTargetDirections = .; /* 202F330 */ . += 0x20; gTargetAhead = .; /* 202F350 */ @@ -861,13 +861,13 @@ gUnknown_202F378 = .; /* 202F378 */ gCanAttackInDirection = .; /* 202F380 */ . += 0x8; -gUnknown_202F388 = .; /* 202F388 */ +gPotentialAttackTargetDirections = .; /* 202F388 */ . += 0x8; gPotentialTargetWeights_2 = .; /* 202F390 */ . += 0x20; -gUnknown_202F3B0 = .; /* 202F3B0 */ +gPotentialTargets = .; /* 202F3B0 */ . += 0x20; gUnknown_202F3D0 = .; /* 202F3D0 */ -- cgit v1.2.3