diff options
author | AnonymousRandomPerson <chenghanngan.us@gmail.com> | 2022-02-21 15:59:34 -0500 |
---|---|---|
committer | AnonymousRandomPerson <chenghanngan.us@gmail.com> | 2022-02-21 17:03:34 -0500 |
commit | 598a588589cb581b269f2e46373c657ec897a3a3 (patch) | |
tree | 7a7cc3f2b8fc689e764b2a09f20233897f8ada9c | |
parent | 33d2d6175067e75cd222b8f05234221ec2d2b82b (diff) |
Decomped CanAttackInFront()
-rw-r--r-- | asm/code_8057144.s | 6 | ||||
-rw-r--r-- | asm/code_805CEB8.s | 2 | ||||
-rw-r--r-- | asm/code_8070E3C.s | 418 | ||||
-rw-r--r-- | asm/code_8071214.s | 311 | ||||
-rw-r--r-- | data/data_8106FB5.s | 10 | ||||
-rw-r--r-- | data/data_8106FDD.s | 6 | ||||
-rw-r--r-- | include/dungeon_ai_targeting.h | 9 | ||||
-rw-r--r-- | include/dungeon_ai_targeting_1.h (renamed from include/dungeon_ai.h) | 4 | ||||
-rw-r--r-- | include/dungeon_ai_targeting_2.h (renamed from include/dungeon_ai_1.h) | 4 | ||||
-rwxr-xr-x | ld_script.txt | 10 | ||||
-rw-r--r-- | src/dungeon_ai_attack.c | 8 | ||||
-rw-r--r-- | src/dungeon_ai_item_weight.c | 2 | ||||
-rw-r--r-- | src/dungeon_ai_items.c | 2 | ||||
-rw-r--r-- | src/dungeon_ai_targeting.c | 62 | ||||
-rw-r--r-- | src/dungeon_ai_targeting_1.c (renamed from src/dungeon_ai.c) | 2 | ||||
-rw-r--r-- | src/dungeon_ai_targeting_2.c (renamed from src/dungeon_ai_1.c) | 2 | ||||
-rw-r--r-- | src/dungeon_capabilities_1.c | 6 |
17 files changed, 415 insertions, 449 deletions
diff --git a/asm/code_8057144.s b/asm/code_8057144.s index e3b2bf9..dc65f27 100644 --- a/asm/code_8057144.s +++ b/asm/code_8057144.s @@ -285,8 +285,8 @@ _08057340: bx r1 thumb_func_end sub_8057308 - thumb_func_start IsMoveUsable -IsMoveUsable: + thumb_func_start IsMoveUsable_1 +IsMoveUsable_1: push {r4-r7,lr} mov r7, r8 push {r7} @@ -357,7 +357,7 @@ _080573C0: pop {r4-r7} pop {r1} bx r1 - thumb_func_end IsMoveUsable + thumb_func_end IsMoveUsable_1 thumb_func_start IsMoveUsable_2 IsMoveUsable_2: diff --git a/asm/code_805CEB8.s b/asm/code_805CEB8.s index 6448a5c..d318b14 100644 --- a/asm/code_805CEB8.s +++ b/asm/code_805CEB8.s @@ -12715,7 +12715,7 @@ _0806376A: bgt _08063788 mov r0, r8 movs r2, 0x1 - bl IsMoveUsable + bl IsMoveUsable_1 lsls r0, 24 lsrs r0, 24 negs r1, r0 diff --git a/asm/code_8070E3C.s b/asm/code_8070E3C.s index 3f644aa..5c8a0a7 100644 --- a/asm/code_8070E3C.s +++ b/asm/code_8070E3C.s @@ -394,420 +394,4 @@ _08071132: bx r1 thumb_func_end sub_8071058 - thumb_func_start CanAttackInFront -CanAttackInFront: - push {r4-r6,lr} - adds r4, r0, 0 - adds r6, r1, 0 - ldr r0, [r4, 0x70] - movs r1, 0x2 - ldrsh r0, [r0, r1] - bl GetCrossableTerrain - lsls r0, 24 - lsrs r5, r0, 24 - cmp r5, 0x1 - bhi _08071152 - movs r5, 0x2 -_08071152: - movs r2, 0x4 - ldrsh r0, [r4, r2] - ldr r1, _080711B0 - lsls r2, r6, 2 - adds r2, r1 - movs r3, 0 - ldrsh r1, [r2, r3] - adds r0, r1 - movs r3, 0x6 - ldrsh r1, [r4, r3] - movs r3, 0x2 - ldrsh r2, [r2, r3] - adds r1, r2 - bl GetMapTile_1 - adds r2, r0, 0 - ldrh r1, [r2] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _0807120C - ldr r0, [r2, 0x10] - cmp r0, 0 - beq _0807118A - bl GetEntityType - cmp r0, 0x1 - bne _0807120C -_0807118A: - bl IsFixedDungeon - lsls r0, 24 - cmp r0, 0 - bne _080711DC - ldr r0, [r4, 0x70] - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x3 - beq _080711AC - adds r0, r4, 0 - movs r1, 0x9 - bl HasItem - lsls r0, 24 - cmp r0, 0 - beq _080711B4 -_080711AC: - movs r5, 0x3 - b _080711DC - .align 2, 0 -_080711B0: .4byte gAdjacentTileOffsets -_080711B4: - adds r0, r4, 0 - movs r1, 0xC - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - bne _080711DA - adds r0, r4, 0 - movs r1, 0xD - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _080711DC - movs r0, 0x1 - ands r0, r6 - movs r5, 0x3 - cmp r0, 0 - beq _080711DC -_080711DA: - movs r5, 0x2 -_080711DC: - movs r1, 0x4 - ldrsh r0, [r4, r1] - movs r2, 0x6 - ldrsh r1, [r4, r2] - bl GetMapTile_1 - adds r2, r0, 0 - adds r1, r2, 0 - adds r1, 0xA - adds r1, r5 - ldr r2, _08071208 - movs r0, 0x7 - ands r0, r6 - adds r0, r2 - ldrb r1, [r1] - ldrb r0, [r0] - ands r0, r1 - cmp r0, 0 - beq _0807120C - movs r0, 0x1 - b _0807120E - .align 2, 0 -_08071208: .4byte gDirectionBitMasks_2 -_0807120C: - movs r0, 0 -_0807120E: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end CanAttackInFront - - thumb_func_start CanMoveForward -CanMoveForward: - push {r4-r7,lr} - mov r7, r8 - push {r7} - adds r4, r0, 0 - adds r7, r1, 0 - mov r8, r2 - ldr r0, [r4, 0x70] - movs r1, 0x2 - ldrsh r0, [r0, r1] - bl GetCrossableTerrain - lsls r0, 24 - lsrs r6, r0, 24 - movs r0, 0 - mov r2, r8 - strb r0, [r2] - movs r3, 0x4 - ldrsh r0, [r4, r3] - ldr r1, _0807130C - lsls r2, r7, 2 - adds r2, r1 - movs r3, 0 - ldrsh r1, [r2, r3] - adds r0, r1 - movs r3, 0x6 - ldrsh r1, [r4, r3] - movs r3, 0x2 - ldrsh r2, [r2, r3] - adds r1, r2 - bl GetMapTile_1 - adds r5, r0, 0 - ldrh r1, [r5] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - beq _08071260 - b _0807137E -_08071260: - movs r0, 0x40 - ands r0, r1 - cmp r0, 0 - beq _08071286 - ldr r0, _08071310 - ldr r0, [r0] - ldr r1, _08071314 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - bne _08071286 - adds r0, r4, 0 - movs r1, 0xF - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _08071286 - b _0807137E -_08071286: - ldr r0, [r5, 0x14] - cmp r0, 0 - beq _080712B8 - adds r0, r4, 0 - movs r1, 0xE - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _080712B8 - ldr r0, [r5, 0x14] - bl GetEntityType - cmp r0, 0x2 - bne _080712B8 - ldr r0, [r5, 0x14] - adds r0, 0x20 - ldrb r0, [r0] - cmp r0, 0 - bne _0807137E - ldr r0, [r4, 0x70] - adds r0, 0xE8 - ldrb r0, [r0] - cmp r0, 0x3 - beq _0807137E -_080712B8: - ldrh r1, [r5] - movs r0, 0x3 - ands r0, r1 - cmp r0, 0x2 - bne _080712E6 - ldr r1, _08071318 - ldr r0, _08071310 - ldr r0, [r0] - ldr r2, _0807131C - adds r0, r2 - movs r3, 0 - ldrsh r0, [r0, r3] - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0x1 - bne _080712E6 - adds r0, r4, 0 - movs r1, 0x14 - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - bne _0807137E -_080712E6: - bl IsFixedDungeon - lsls r0, 24 - cmp r0, 0 - bne _08071348 - ldr r0, [r4, 0x70] - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x3 - beq _08071308 - adds r0, r4, 0 - movs r1, 0x9 - bl HasItem - lsls r0, 24 - cmp r0, 0 - beq _08071320 -_08071308: - movs r6, 0x3 - b _08071348 - .align 2, 0 -_0807130C: .4byte gAdjacentTileOffsets -_08071310: .4byte gDungeonGlobalData -_08071314: .4byte 0x00000671 -_08071318: .4byte gDungeonWaterType -_0807131C: .4byte 0x00003a0e -_08071320: - adds r0, r4, 0 - movs r1, 0xC - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - bne _08071346 - adds r0, r4, 0 - movs r1, 0xD - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _08071348 - movs r0, 0x1 - ands r0, r7 - movs r6, 0x3 - cmp r0, 0 - beq _08071348 -_08071346: - movs r6, 0x2 -_08071348: - movs r1, 0x4 - ldrsh r0, [r4, r1] - movs r2, 0x6 - ldrsh r1, [r4, r2] - bl GetMapTile_1 - adds r0, 0xA - adds r0, r6 - ldr r2, _08071374 - movs r1, 0x7 - ands r1, r7 - adds r1, r2 - ldrb r2, [r0] - ldrb r0, [r1] - ands r0, r2 - cmp r0, 0 - beq _0807137E - ldr r0, [r5, 0x10] - cmp r0, 0 - bne _08071378 - movs r0, 0x1 - b _08071380 - .align 2, 0 -_08071374: .4byte gDirectionBitMasks_3 -_08071378: - movs r0, 0x1 - mov r3, r8 - strb r0, [r3] -_0807137E: - movs r0, 0 -_08071380: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end CanMoveForward - - thumb_func_start IsAtJunction -IsAtJunction: - push {r4,r5,lr} - adds r4, r0, 0 - ldr r0, [r4, 0x70] - movs r1, 0x2 - ldrsh r0, [r0, r1] - bl GetCrossableTerrain - lsls r0, 24 - lsrs r5, r0, 24 - bl IsFixedDungeon - lsls r0, 24 - cmp r0, 0 - bne _080713E2 - ldr r0, [r4, 0x70] - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x3 - beq _080713E0 - adds r0, r4, 0 - movs r1, 0x9 - bl HasItem - lsls r0, 24 - cmp r0, 0 - bne _080713E0 - adds r0, r4, 0 - movs r1, 0xC - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _080713D2 - movs r5, 0x2 - b _080713E2 -_080713D2: - adds r0, r4, 0 - movs r1, 0xD - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _080713E2 -_080713E0: - movs r5, 0x3 -_080713E2: - cmp r5, 0x3 - bne _08071408 - ldr r4, [r4, 0x70] - movs r0, 0x64 - bl DungeonRandomCapped - movs r1, 0xFD - lsls r1, 1 - adds r2, r4, r1 - ldrh r1, [r2] - adds r1, r0 - strh r1, [r2] - lsls r1, 16 - asrs r1, 16 - cmp r1, 0xC7 - ble _08071458 - movs r0, 0 - strh r0, [r2] - b _08071468 -_08071408: - ldr r1, _0807145C - ldr r0, _08071460 - ldr r0, [r0] - ldr r2, _08071464 - adds r0, r2 - movs r2, 0 - ldrsh r0, [r0, r2] - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0x1 - bne _08071432 - cmp r5, 0x1 - bne _08071432 - adds r0, r4, 0 - movs r1, 0x14 - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _08071432 - movs r5, 0 -_08071432: - movs r1, 0x4 - ldrsh r0, [r4, r1] - movs r2, 0x6 - ldrsh r1, [r4, r2] - bl GetMapTile_1 - adds r0, 0xA - adds r0, r5 - ldrb r0, [r0] - cmp r0, 0x54 - beq _08071468 - cmp r0, 0x51 - beq _08071468 - cmp r0, 0x45 - beq _08071468 - cmp r0, 0x15 - beq _08071468 - cmp r0, 0x55 - beq _08071468 -_08071458: - movs r0, 0 - b _0807146A - .align 2, 0 -_0807145C: .4byte gDungeonWaterType -_08071460: .4byte gDungeonGlobalData -_08071464: .4byte 0x00003a0e -_08071468: - movs r0, 0x1 -_0807146A: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end IsAtJunction - - .align 2, 0 + .align 2, 0
\ No newline at end of file diff --git a/asm/code_8071214.s b/asm/code_8071214.s new file mode 100644 index 0000000..a32189f --- /dev/null +++ b/asm/code_8071214.s @@ -0,0 +1,311 @@ + #include "asm/constants/gba_constants.inc" + #include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start CanMoveForward +CanMoveForward: + push {r4-r7,lr} + mov r7, r8 + push {r7} + adds r4, r0, 0 + adds r7, r1, 0 + mov r8, r2 + ldr r0, [r4, 0x70] + movs r1, 0x2 + ldrsh r0, [r0, r1] + bl GetCrossableTerrain + lsls r0, 24 + lsrs r6, r0, 24 + movs r0, 0 + mov r2, r8 + strb r0, [r2] + movs r3, 0x4 + ldrsh r0, [r4, r3] + ldr r1, _0807130C + lsls r2, r7, 2 + adds r2, r1 + movs r3, 0 + ldrsh r1, [r2, r3] + adds r0, r1 + movs r3, 0x6 + ldrsh r1, [r4, r3] + movs r3, 0x2 + ldrsh r2, [r2, r3] + adds r1, r2 + bl GetMapTile_1 + adds r5, r0, 0 + ldrh r1, [r5] + movs r0, 0x10 + ands r0, r1 + cmp r0, 0 + beq _08071260 + b _0807137E +_08071260: + movs r0, 0x40 + ands r0, r1 + cmp r0, 0 + beq _08071286 + ldr r0, _08071310 + ldr r0, [r0] + ldr r1, _08071314 + adds r0, r1 + ldrb r0, [r0] + cmp r0, 0 + bne _08071286 + adds r0, r4, 0 + movs r1, 0xF + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _08071286 + b _0807137E +_08071286: + ldr r0, [r5, 0x14] + cmp r0, 0 + beq _080712B8 + adds r0, r4, 0 + movs r1, 0xE + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _080712B8 + ldr r0, [r5, 0x14] + bl GetEntityType + cmp r0, 0x2 + bne _080712B8 + ldr r0, [r5, 0x14] + adds r0, 0x20 + ldrb r0, [r0] + cmp r0, 0 + bne _0807137E + ldr r0, [r4, 0x70] + adds r0, 0xE8 + ldrb r0, [r0] + cmp r0, 0x3 + beq _0807137E +_080712B8: + ldrh r1, [r5] + movs r0, 0x3 + ands r0, r1 + cmp r0, 0x2 + bne _080712E6 + ldr r1, _08071318 + ldr r0, _08071310 + ldr r0, [r0] + ldr r2, _0807131C + adds r0, r2 + movs r3, 0 + ldrsh r0, [r0, r3] + adds r0, r1 + ldrb r0, [r0] + cmp r0, 0x1 + bne _080712E6 + adds r0, r4, 0 + movs r1, 0x14 + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + bne _0807137E +_080712E6: + bl IsFixedDungeon + lsls r0, 24 + cmp r0, 0 + bne _08071348 + ldr r0, [r4, 0x70] + adds r0, 0xE4 + ldrb r0, [r0] + cmp r0, 0x3 + beq _08071308 + adds r0, r4, 0 + movs r1, 0x9 + bl HasItem + lsls r0, 24 + cmp r0, 0 + beq _08071320 +_08071308: + movs r6, 0x3 + b _08071348 + .align 2, 0 +_0807130C: .4byte gAdjacentTileOffsets +_08071310: .4byte gDungeonGlobalData +_08071314: .4byte 0x00000671 +_08071318: .4byte gDungeonWaterType +_0807131C: .4byte 0x00003a0e +_08071320: + adds r0, r4, 0 + movs r1, 0xC + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + bne _08071346 + adds r0, r4, 0 + movs r1, 0xD + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _08071348 + movs r0, 0x1 + ands r0, r7 + movs r6, 0x3 + cmp r0, 0 + beq _08071348 +_08071346: + movs r6, 0x2 +_08071348: + movs r1, 0x4 + ldrsh r0, [r4, r1] + movs r2, 0x6 + ldrsh r1, [r4, r2] + bl GetMapTile_1 + adds r0, 0xA + adds r0, r6 + ldr r2, _08071374 + movs r1, 0x7 + ands r1, r7 + adds r1, r2 + ldrb r2, [r0] + ldrb r0, [r1] + ands r0, r2 + cmp r0, 0 + beq _0807137E + ldr r0, [r5, 0x10] + cmp r0, 0 + bne _08071378 + movs r0, 0x1 + b _08071380 + .align 2, 0 +_08071374: .4byte gDirectionBitMasks_3 +_08071378: + movs r0, 0x1 + mov r3, r8 + strb r0, [r3] +_0807137E: + movs r0, 0 +_08071380: + pop {r3} + mov r8, r3 + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end CanMoveForward + + thumb_func_start IsAtJunction +IsAtJunction: + push {r4,r5,lr} + adds r4, r0, 0 + ldr r0, [r4, 0x70] + movs r1, 0x2 + ldrsh r0, [r0, r1] + bl GetCrossableTerrain + lsls r0, 24 + lsrs r5, r0, 24 + bl IsFixedDungeon + lsls r0, 24 + cmp r0, 0 + bne _080713E2 + ldr r0, [r4, 0x70] + adds r0, 0xE4 + ldrb r0, [r0] + cmp r0, 0x3 + beq _080713E0 + adds r0, r4, 0 + movs r1, 0x9 + bl HasItem + lsls r0, 24 + cmp r0, 0 + bne _080713E0 + adds r0, r4, 0 + movs r1, 0xC + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _080713D2 + movs r5, 0x2 + b _080713E2 +_080713D2: + adds r0, r4, 0 + movs r1, 0xD + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _080713E2 +_080713E0: + movs r5, 0x3 +_080713E2: + cmp r5, 0x3 + bne _08071408 + ldr r4, [r4, 0x70] + movs r0, 0x64 + bl DungeonRandomCapped + movs r1, 0xFD + lsls r1, 1 + adds r2, r4, r1 + ldrh r1, [r2] + adds r1, r0 + strh r1, [r2] + lsls r1, 16 + asrs r1, 16 + cmp r1, 0xC7 + ble _08071458 + movs r0, 0 + strh r0, [r2] + b _08071468 +_08071408: + ldr r1, _0807145C + ldr r0, _08071460 + ldr r0, [r0] + ldr r2, _08071464 + adds r0, r2 + movs r2, 0 + ldrsh r0, [r0, r2] + adds r0, r1 + ldrb r0, [r0] + cmp r0, 0x1 + bne _08071432 + cmp r5, 0x1 + bne _08071432 + adds r0, r4, 0 + movs r1, 0x14 + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _08071432 + movs r5, 0 +_08071432: + movs r1, 0x4 + ldrsh r0, [r4, r1] + movs r2, 0x6 + ldrsh r1, [r4, r2] + bl GetMapTile_1 + adds r0, 0xA + adds r0, r5 + ldrb r0, [r0] + cmp r0, 0x54 + beq _08071468 + cmp r0, 0x51 + beq _08071468 + cmp r0, 0x45 + beq _08071468 + cmp r0, 0x15 + beq _08071468 + cmp r0, 0x55 + beq _08071468 +_08071458: + movs r0, 0 + b _0807146A + .align 2, 0 +_0807145C: .4byte gDungeonWaterType +_08071460: .4byte gDungeonGlobalData +_08071464: .4byte 0x00003a0e +_08071468: + movs r0, 0x1 +_0807146A: + pop {r4,r5} + pop {r1} + bx r1 + thumb_func_end IsAtJunction + + .align 2, 0 diff --git a/data/data_8106FB5.s b/data/data_8106FB5.s index dc32b18..e958b9f 100644 --- a/data/data_8106FB5.s +++ b/data/data_8106FB5.s @@ -19,13 +19,3 @@ gUnknown_8106FC5: @ 8106FC5 gUnknown_8106FCD: @ 8106FCD @ replacing .incbin "baserom.gba", 0x00106fcd, 0x8 .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 - - .global gDirectionBitMasks_2 -gDirectionBitMasks_2: @ 8106FD5 -@ replacing .incbin "baserom.gba", 0x00106fd5, 0x8 - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 - - .global gDirectionBitMasks_3 -gDirectionBitMasks_3: @ 8106FDD -@ replacing .incbin "baserom.gba", 0x00106fdd, 0x8 - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 diff --git a/data/data_8106FDD.s b/data/data_8106FDD.s new file mode 100644 index 0000000..4e984ab --- /dev/null +++ b/data/data_8106FDD.s @@ -0,0 +1,6 @@ + .section .rodata + + .global gDirectionBitMasks_3 +gDirectionBitMasks_3: @ 8106FDD +@ replacing .incbin "baserom.gba", 0x00106fdd, 0x8 + .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
\ No newline at end of file diff --git a/include/dungeon_ai_targeting.h b/include/dungeon_ai_targeting.h new file mode 100644 index 0000000..945c490 --- /dev/null +++ b/include/dungeon_ai_targeting.h @@ -0,0 +1,9 @@ +#ifndef GUARD_DUNGEON_AI_TARGETING_H +#define GUARD_DUNGEON_AI_TARGETING_H + +#include "dungeon_entity.h" + +// 0x71138 +bool8 CanAttackInFront(struct DungeonEntity *pokemon, s32 direction); + +#endif diff --git a/include/dungeon_ai.h b/include/dungeon_ai_targeting_1.h index e3f7a37..49b700f 100644 --- a/include/dungeon_ai.h +++ b/include/dungeon_ai_targeting_1.h @@ -1,5 +1,5 @@ -#ifndef GUARD_DUNGEON_AI_H -#define GUARD_DUNGEON_AI_H +#ifndef GUARD_DUNGEON_AI_TARGETING_1_H +#define GUARD_DUNGEON_AI_TARGETING_1_H #include "dungeon_entity.h" diff --git a/include/dungeon_ai_1.h b/include/dungeon_ai_targeting_2.h index dace65a..c314646 100644 --- a/include/dungeon_ai_1.h +++ b/include/dungeon_ai_targeting_2.h @@ -1,5 +1,5 @@ -#ifndef GUARD_DUNGEON_AI_1_H -#define GUARD_DUNGEON_AI_1_H +#ifndef GUARD_DUNGEON_AI_TARGETING_2_H +#define GUARD_DUNGEON_AI_TARGETING_2_H #include "dungeon_entity.h" diff --git a/ld_script.txt b/ld_script.txt index cb2019c..71a1ad7 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -224,9 +224,11 @@ SECTIONS { asm/code_8070BC0.o(.text); src/dungeon_capabilities_1.o(.text); asm/code_8070E3C.o(.text); - src/dungeon_ai.o(.text); + src/dungeon_ai_targeting.o(.text); + asm/code_8071214.o(.text); + src/dungeon_ai_targeting_1.o(.text); asm/code_8071518.o(.text); - src/dungeon_ai_1.o(.text); + src/dungeon_ai_targeting_2.o(.text); asm/code_807167C.o(.text); src/dungeon_pokemon_attributes.o(.text); asm/code_80718D8.o(.text); @@ -423,7 +425,9 @@ SECTIONS { data/data_8106A4C.o(.rodata); src/dungeon_capabilities_1.o(.rodata); data/data_8106FB5.o(.rodata); - src/dungeon_ai_1.o(.rodata); + src/dungeon_ai_targeting.o(.rodata); + data/data_8106FDD.o(.rodata); + src/dungeon_ai_targeting_2.o(.rodata); data/data_8107010.o(.rodata); src/friend_area.o(.rodata); data/data_810AC60.o(.rodata); diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c index 092bab5..7368e66 100644 --- a/src/dungeon_ai_attack.c +++ b/src/dungeon_ai_attack.c @@ -10,7 +10,8 @@ #include "constants/type.h" #include "charge_move.h" #include "dungeon_action.h" -#include "dungeon_ai.h" +#include "dungeon_ai_targeting.h" +#include "dungeon_ai_targeting_1.h" #include "dungeon_ai_attack_1.h" #include "dungeon_capabilities_1.h" #include "dungeon_global_data.h" @@ -37,9 +38,8 @@ extern s32 gPotentialTargetWeights_2[NUM_DIRECTIONS]; extern u8 gPotentialAttackTargetDirections[NUM_DIRECTIONS]; extern struct DungeonEntity *gPotentialTargets[NUM_DIRECTIONS]; -extern bool8 IsMoveUsable(struct DungeonEntity*, s32, bool8); +extern bool8 IsMoveUsable_1(struct DungeonEntity*, s32, bool8); extern bool8 TargetRegularAttack(struct DungeonEntity*, u32*, bool8); -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); @@ -182,7 +182,7 @@ void DecideAttack(struct DungeonEntity *pokemon) move = &pokemonData->moves[i]; if (move->moveFlags & MOVE_FLAG_EXISTS && willNotUnlinkMove[i] && - IsMoveUsable(pokemon, i, hasPPChecker) && + IsMoveUsable_1(pokemon, i, hasPPChecker) && move->moveFlags & MOVE_FLAG_ENABLED) { moveTargetResults[i].moveUsable = TRUE; diff --git a/src/dungeon_ai_item_weight.c b/src/dungeon_ai_item_weight.c index 08652b2..ce79ad4 100644 --- a/src/dungeon_ai_item_weight.c +++ b/src/dungeon_ai_item_weight.c @@ -3,7 +3,7 @@ #include "constants/status.h" #include "constants/targeting.h" -#include "dungeon_ai_1.h" +#include "dungeon_ai_targeting_2.h" #include "dungeon_map_access.h" #include "dungeon_pokemon_attributes.h" #include "dungeon_util.h" diff --git a/src/dungeon_ai_items.c b/src/dungeon_ai_items.c index 52aacc4..0135c62 100644 --- a/src/dungeon_ai_items.c +++ b/src/dungeon_ai_items.c @@ -6,10 +6,10 @@ #include "constants/status.h" #include "constants/targeting.h" #include "dungeon_action.h" -#include "dungeon_ai_1.h" #include "dungeon_ai_attack_1.h" #include "dungeon_ai_item_weight.h" #include "dungeon_ai_items.h" +#include "dungeon_ai_targeting_2.h" #include "dungeon_capabilities.h" #include "dungeon_capabilities_1.h" #include "dungeon_entity.h" diff --git a/src/dungeon_ai_targeting.c b/src/dungeon_ai_targeting.c new file mode 100644 index 0000000..ec5abd9 --- /dev/null +++ b/src/dungeon_ai_targeting.c @@ -0,0 +1,62 @@ +#include "global.h" +#include "dungeon_ai_targeting.h" + +#include "constants/iq_skill.h" +#include "constants/item.h" +#include "constants/status.h" +#include "dungeon_engine.h" +#include "dungeon_items.h" +#include "dungeon_map_access.h" +#include "dungeon_movement.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_util.h" +#include "map.h" + +const u8 gDirectionBitMasks_2[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; + +bool8 CanAttackInFront(struct DungeonEntity *pokemon, s32 direction) +{ + u8 crossableTerrain = GetCrossableTerrain(pokemon->entityData->entityID); + struct MapTile *tile; + if (crossableTerrain < CROSSABLE_TERRAIN_CREVICE) + { + crossableTerrain = CROSSABLE_TERRAIN_CREVICE; + } + tile = GetMapTile_1(pokemon->posWorld.x + gAdjacentTileOffsets[direction].x, + pokemon->posWorld.y + gAdjacentTileOffsets[direction].y); + if (!(tile->tileType & TILE_TYPE_MAP_EDGE) && + (tile->pokemon == NULL || GetEntityType(tile->pokemon) == ENTITY_POKEMON)) + { + if (!IsFixedDungeon()) + { + if (pokemon->entityData->transformStatus == TRANSFORM_STATUS_MOBILE || + HasItem(pokemon, ITEM_ID_MOBILE_SCARF)) + { + crossableTerrain = CROSSABLE_TERRAIN_WALL; + } + else if (HasIQSkill(pokemon, IQ_SKILL_ALL_TERRAIN_HIKER)) + { + // BUG: If the Pokémon is a Ghost type that can normally attack through walls, + // All-Terrain Hiker/Super Mobile may make the AI think it can't attack through walls. + crossableTerrain = CROSSABLE_TERRAIN_CREVICE; + } + else if (HasIQSkill(pokemon, IQ_SKILL_SUPER_MOBILE)) + { + if ((direction & 1) != 0) + { + crossableTerrain = CROSSABLE_TERRAIN_CREVICE; + } + else + { + crossableTerrain = CROSSABLE_TERRAIN_WALL; + } + } + } + tile = GetMapTile_1(pokemon->posWorld.x, pokemon->posWorld.y); + if (tile->canMoveAdjacent[crossableTerrain] & gDirectionBitMasks_2[direction & DIRECTION_MASK]) + { + return TRUE; + } + } + return FALSE; +} diff --git a/src/dungeon_ai.c b/src/dungeon_ai_targeting_1.c index b2e3b2e..5ff76b0 100644 --- a/src/dungeon_ai.c +++ b/src/dungeon_ai_targeting_1.c @@ -1,5 +1,5 @@ #include "global.h" -#include "dungeon_ai.h" +#include "dungeon_ai_targeting_1.h" #include "constants/ability.h" #include "constants/tactic.h" diff --git a/src/dungeon_ai_1.c b/src/dungeon_ai_targeting_2.c index 78c899f..83319e1 100644 --- a/src/dungeon_ai_1.c +++ b/src/dungeon_ai_targeting_2.c @@ -1,5 +1,5 @@ #include "global.h" -#include "dungeon_ai_1.h" +#include "dungeon_ai_targeting_2.h" #include "constants/status.h" #include "constants/targeting.h" diff --git a/src/dungeon_capabilities_1.c b/src/dungeon_capabilities_1.c index 605f9e9..ef566fe 100644 --- a/src/dungeon_capabilities_1.c +++ b/src/dungeon_capabilities_1.c @@ -5,7 +5,7 @@ #include "constants/iq_skill.h" #include "constants/status.h" #include "charge_move.h" -#include "dungeon_ai.h" +#include "dungeon_ai_targeting_1.h" #include "dungeon_capabilities.h" #include "dungeon_engine.h" #include "dungeon_items.h" @@ -15,7 +15,7 @@ #include "dungeon_util.h" #include "map.h" -const u8 gDirectionBitMasks[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; +const u8 gDirectionBitMasks_1[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; static inline bool8 JoinLocationCannotUseItems(struct DungeonEntityData *pokemonData) { @@ -119,7 +119,7 @@ bool8 CanMoveInDirection(struct DungeonEntity *pokemon, u32 facingDir) } } currentMapTile = GetMapTile_1(pokemon->posWorld.x, pokemon->posWorld.y); - if (!(currentMapTile->canMoveAdjacent[crossableTerrain] & gDirectionBitMasks[facingDir & DIRECTION_MASK])) + if (!(currentMapTile->canMoveAdjacent[crossableTerrain] & gDirectionBitMasks_1[facingDir & DIRECTION_MASK])) { return FALSE; } |