From 154c44250512828d56f5431188a7907cd149ef10 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Tue, 25 Jan 2022 22:46:40 -0500 Subject: Decomped CanMoveInDirection() --- asm/code_8057824.s | 4 +- asm/code_8070D04.s | 918 --------------------------------------- asm/code_8070E3C.s | 813 ++++++++++++++++++++++++++++++++++ asm/code_80718D8.s | 2 +- data/data_8106A4C.s | 35 -- data/data_8106FB5.s | 31 ++ include/dungeon_capabilities_1.h | 2 + include/map.h | 48 +- ld_script.txt | 4 +- src/dungeon_capabilities_1.c | 51 +++ src/dungeon_util.c | 2 +- src/status_checks.c | 4 +- 12 files changed, 929 insertions(+), 985 deletions(-) delete mode 100644 asm/code_8070D04.s create mode 100644 asm/code_8070E3C.s create mode 100644 data/data_8106FB5.s diff --git a/asm/code_8057824.s b/asm/code_8057824.s index 84d3407..2856506 100644 --- a/asm/code_8057824.s +++ b/asm/code_8057824.s @@ -12949,7 +12949,7 @@ _0805E0C2: mov r0, r10 adds r1, r5, 0 str r3, [sp, 0x20] - bl CanMoveForward2 + bl CanMoveInDirection lsls r0, 24 ldr r3, [sp, 0x20] cmp r0, 0 @@ -14878,7 +14878,7 @@ _0805EFF6: bne _0805F008 mov r0, r8 adds r1, r4, 0 - bl CanMoveForward2 + bl CanMoveInDirection lsls r0, 24 cmp r0, 0 beq _0805F014 diff --git a/asm/code_8070D04.s b/asm/code_8070D04.s deleted file mode 100644 index ce9f343..0000000 --- a/asm/code_8070D04.s +++ /dev/null @@ -1,918 +0,0 @@ - #include "asm/constants/gba_constants.inc" - #include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start CanMoveForward2 -CanMoveForward2: - 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 - movs r2, 0x4 - ldrsh r0, [r4, r2] - ldr r1, _08070DD8 - 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 GetMapTileAtPosition - adds r2, r0, 0 - ldrh r1, [r2] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08070E34 - ldr r0, [r2, 0x10] - cmp r0, 0 - bne _08070E34 - bl IsFixedDungeon - lsls r0, 24 - cmp r0, 0 - bne _08070E04 - ldr r0, [r4, 0x70] - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x3 - beq _08070DD2 - adds r0, r4, 0 - movs r1, 0x9 - bl HasItem - lsls r0, 24 - cmp r0, 0 - beq _08070DDC -_08070DD2: - movs r5, 0x3 - b _08070E04 - .align 2, 0 -_08070DD8: .4byte gAdjacentTileOffsets -_08070DDC: - adds r0, r4, 0 - movs r1, 0xC - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - bne _08070E02 - adds r0, r4, 0 - movs r1, 0xD - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _08070E04 - movs r0, 0x1 - ands r0, r6 - movs r5, 0x3 - cmp r0, 0 - beq _08070E04 -_08070E02: - movs r5, 0x2 -_08070E04: - movs r1, 0x4 - ldrsh r0, [r4, r1] - movs r2, 0x6 - ldrsh r1, [r4, r2] - bl GetMapTileAtPosition - adds r2, r0, 0 - adds r1, r2, 0 - adds r1, 0xA - adds r1, r5 - ldr r2, _08070E30 - movs r0, 0x7 - ands r0, r6 - adds r0, r2 - ldrb r1, [r1] - ldrb r0, [r0] - ands r0, r1 - cmp r0, 0 - beq _08070E34 - movs r0, 0x1 - b _08070E36 - .align 2, 0 -_08070E30: .4byte gDirectionBitMasks -_08070E34: - movs r0, 0 -_08070E36: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end CanMoveForward2 - - thumb_func_start sub_8070E3C -sub_8070E3C: - push {r4-r7,lr} - adds r4, r0, 0 - adds r6, r1, 0 - adds r7, r2, 0 - ldr r0, [r4, 0x70] - movs r1, 0x2 - ldrsh r0, [r0, r1] - bl GetCrossableTerrain - lsls r0, 24 - lsrs r5, r0, 24 - movs r2, 0 - ldrsh r0, [r6, r2] - ldr r1, _08070EB0 - lsls r2, r7, 2 - adds r2, r1 - movs r3, 0 - ldrsh r1, [r2, r3] - adds r0, r1 - movs r3, 0x2 - ldrsh r1, [r6, r3] - movs r3, 0x2 - ldrsh r2, [r2, r3] - adds r1, r2 - bl GetMapTileAtPosition - adds r2, r0, 0 - ldrh r1, [r2] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08070F0C - ldr r0, [r2, 0x10] - cmp r0, 0 - beq _08070E8A - bl GetEntityType - cmp r0, 0x1 - bne _08070F0C -_08070E8A: - bl IsFixedDungeon - lsls r0, 24 - cmp r0, 0 - bne _08070EDC - ldr r0, [r4, 0x70] - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x3 - beq _08070EAC - adds r0, r4, 0 - movs r1, 0x9 - bl HasItem - lsls r0, 24 - cmp r0, 0 - beq _08070EB4 -_08070EAC: - movs r5, 0x3 - b _08070EDC - .align 2, 0 -_08070EB0: .4byte gAdjacentTileOffsets -_08070EB4: - adds r0, r4, 0 - movs r1, 0xC - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - bne _08070EDA - adds r0, r4, 0 - movs r1, 0xD - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _08070EDC - movs r0, 0x1 - ands r0, r7 - movs r5, 0x3 - cmp r0, 0 - beq _08070EDC -_08070EDA: - movs r5, 0x2 -_08070EDC: - movs r1, 0 - ldrsh r0, [r6, r1] - movs r2, 0x2 - ldrsh r1, [r6, r2] - bl GetMapTileAtPosition - adds r2, r0, 0 - adds r1, r2, 0 - adds r1, 0xA - adds r1, r5 - ldr r2, _08070F08 - movs r0, 0x7 - ands r0, r7 - adds r0, r2 - ldrb r1, [r1] - ldrb r0, [r0] - ands r0, r1 - cmp r0, 0 - beq _08070F0C - movs r0, 0x1 - b _08070F0E - .align 2, 0 -_08070F08: .4byte gUnknown_8106FB5 -_08070F0C: - movs r0, 0 -_08070F0E: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8070E3C - - thumb_func_start sub_8070F14 -sub_8070F14: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - movs r1, 0x4 - ldrsh r0, [r4, r1] - ldr r1, _08070F70 - lsls r2, r5, 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 GetMapTileAtPosition - adds r2, r0, 0 - ldrh r1, [r2] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08070F78 - ldr r0, [r2, 0x10] - cmp r0, 0 - bne _08070F78 - movs r1, 0x4 - ldrsh r0, [r4, r1] - movs r2, 0x6 - ldrsh r1, [r4, r2] - bl GetMapTileAtPosition - adds r2, r0, 0 - ldr r1, _08070F74 - movs r0, 0x7 - ands r0, r5 - adds r0, r1 - ldrb r1, [r2, 0xA] - ldrb r0, [r0] - ands r0, r1 - cmp r0, 0 - beq _08070F78 - movs r0, 0x1 - b _08070F7A - .align 2, 0 -_08070F70: .4byte gAdjacentTileOffsets -_08070F74: .4byte gUnknown_8106FBD -_08070F78: - movs r0, 0 -_08070F7A: - pop {r4,r5} - pop {r1} - bx r1 - thumb_func_end sub_8070F14 - - thumb_func_start sub_8070F80 -sub_8070F80: - 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 - movs r2, 0x4 - ldrsh r0, [r4, r2] - ldr r1, _08070FF4 - 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 GetMapTileAtPosition - adds r2, r0, 0 - ldrh r1, [r2] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08071050 - ldr r0, [r2, 0x10] - cmp r0, 0 - beq _08070FCC - bl GetEntityType - cmp r0, 0x1 - bne _08071050 -_08070FCC: - bl IsFixedDungeon - lsls r0, 24 - cmp r0, 0 - bne _08071020 - ldr r0, [r4, 0x70] - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x3 - beq _08070FEE - adds r0, r4, 0 - movs r1, 0x9 - bl HasItem - lsls r0, 24 - cmp r0, 0 - beq _08070FF8 -_08070FEE: - movs r5, 0x3 - b _08071020 - .align 2, 0 -_08070FF4: .4byte gAdjacentTileOffsets -_08070FF8: - adds r0, r4, 0 - movs r1, 0xC - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - bne _0807101E - adds r0, r4, 0 - movs r1, 0xD - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _08071020 - movs r0, 0x1 - ands r0, r6 - movs r5, 0x3 - cmp r0, 0 - beq _08071020 -_0807101E: - movs r5, 0x2 -_08071020: - movs r1, 0x4 - ldrsh r0, [r4, r1] - movs r2, 0x6 - ldrsh r1, [r4, r2] - bl GetMapTileAtPosition - adds r2, r0, 0 - adds r1, r2, 0 - adds r1, 0xA - adds r1, r5 - ldr r2, _0807104C - movs r0, 0x7 - ands r0, r6 - adds r0, r2 - ldrb r1, [r1] - ldrb r0, [r0] - ands r0, r1 - cmp r0, 0 - beq _08071050 - movs r0, 0x1 - b _08071052 - .align 2, 0 -_0807104C: .4byte gUnknown_8106FC5 -_08071050: - movs r0, 0 -_08071052: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_8070F80 - - thumb_func_start sub_8071058 -sub_8071058: - push {r4-r7,lr} - adds r5, r0, 0 - adds r7, r1, 0 - ldr r0, [r5, 0x70] - movs r1, 0x2 - ldrsh r0, [r0, r1] - bl GetCrossableTerrain - lsls r0, 24 - lsrs r6, r0, 24 - movs r2, 0x4 - ldrsh r0, [r5, r2] - ldr r1, _080710D4 - lsls r2, r7, 2 - adds r2, r1 - movs r3, 0 - ldrsh r1, [r2, r3] - adds r0, r1 - movs r3, 0x6 - ldrsh r1, [r5, r3] - movs r3, 0x2 - ldrsh r2, [r2, r3] - adds r1, r2 - bl GetMapTileAtPosition - adds r4, r0, 0 - ldrh r1, [r4] - movs r0, 0x10 - ands r0, r1 - cmp r0, 0 - bne _08071130 - ldr r0, [r4, 0x10] - cmp r0, 0 - beq _080710AE - bl GetEntityType - cmp r0, 0x1 - beq _080710AE - ldr r0, [r4, 0x10] - ldr r0, [r0, 0x70] - ldrb r0, [r0, 0x6] - cmp r0, 0 - bne _08071130 -_080710AE: - bl IsFixedDungeon - lsls r0, 24 - cmp r0, 0 - bne _08071100 - ldr r0, [r5, 0x70] - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x3 - beq _080710D0 - adds r0, r5, 0 - movs r1, 0x9 - bl HasItem - lsls r0, 24 - cmp r0, 0 - beq _080710D8 -_080710D0: - movs r6, 0x3 - b _08071100 - .align 2, 0 -_080710D4: .4byte gAdjacentTileOffsets -_080710D8: - adds r0, r5, 0 - movs r1, 0xC - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - bne _080710FE - adds r0, r5, 0 - movs r1, 0xD - bl HasIQSkill - lsls r0, 24 - cmp r0, 0 - beq _08071100 - movs r0, 0x1 - ands r0, r7 - movs r6, 0x3 - cmp r0, 0 - beq _08071100 -_080710FE: - movs r6, 0x2 -_08071100: - movs r1, 0x4 - ldrsh r0, [r5, r1] - movs r2, 0x6 - ldrsh r1, [r5, r2] - bl GetMapTileAtPosition - adds r4, r0, 0 - adds r1, r4, 0 - adds r1, 0xA - adds r1, r6 - ldr r2, _0807112C - movs r0, 0x7 - ands r0, r7 - adds r0, r2 - ldrb r1, [r1] - ldrb r0, [r0] - ands r0, r1 - cmp r0, 0 - beq _08071130 - movs r0, 0x1 - b _08071132 - .align 2, 0 -_0807112C: .4byte gUnknown_8106FCD -_08071130: - movs r0, 0 -_08071132: - pop {r4-r7} - pop {r1} - 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 GetMapTileAtPosition - 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 GetMapTileAtPosition - 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 GetMapTileAtPosition - 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 GetMapTileAtPosition - 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 GetMapTileAtPosition - 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/asm/code_8070E3C.s b/asm/code_8070E3C.s new file mode 100644 index 0000000..7af381e --- /dev/null +++ b/asm/code_8070E3C.s @@ -0,0 +1,813 @@ + #include "asm/constants/gba_constants.inc" + #include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start sub_8070E3C +sub_8070E3C: + push {r4-r7,lr} + adds r4, r0, 0 + adds r6, r1, 0 + adds r7, r2, 0 + ldr r0, [r4, 0x70] + movs r1, 0x2 + ldrsh r0, [r0, r1] + bl GetCrossableTerrain + lsls r0, 24 + lsrs r5, r0, 24 + movs r2, 0 + ldrsh r0, [r6, r2] + ldr r1, _08070EB0 + lsls r2, r7, 2 + adds r2, r1 + movs r3, 0 + ldrsh r1, [r2, r3] + adds r0, r1 + movs r3, 0x2 + ldrsh r1, [r6, r3] + movs r3, 0x2 + ldrsh r2, [r2, r3] + adds r1, r2 + bl GetMapTileAtPosition + adds r2, r0, 0 + ldrh r1, [r2] + movs r0, 0x10 + ands r0, r1 + cmp r0, 0 + bne _08070F0C + ldr r0, [r2, 0x10] + cmp r0, 0 + beq _08070E8A + bl GetEntityType + cmp r0, 0x1 + bne _08070F0C +_08070E8A: + bl IsFixedDungeon + lsls r0, 24 + cmp r0, 0 + bne _08070EDC + ldr r0, [r4, 0x70] + adds r0, 0xE4 + ldrb r0, [r0] + cmp r0, 0x3 + beq _08070EAC + adds r0, r4, 0 + movs r1, 0x9 + bl HasItem + lsls r0, 24 + cmp r0, 0 + beq _08070EB4 +_08070EAC: + movs r5, 0x3 + b _08070EDC + .align 2, 0 +_08070EB0: .4byte gAdjacentTileOffsets +_08070EB4: + adds r0, r4, 0 + movs r1, 0xC + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + bne _08070EDA + adds r0, r4, 0 + movs r1, 0xD + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _08070EDC + movs r0, 0x1 + ands r0, r7 + movs r5, 0x3 + cmp r0, 0 + beq _08070EDC +_08070EDA: + movs r5, 0x2 +_08070EDC: + movs r1, 0 + ldrsh r0, [r6, r1] + movs r2, 0x2 + ldrsh r1, [r6, r2] + bl GetMapTileAtPosition + adds r2, r0, 0 + adds r1, r2, 0 + adds r1, 0xA + adds r1, r5 + ldr r2, _08070F08 + movs r0, 0x7 + ands r0, r7 + adds r0, r2 + ldrb r1, [r1] + ldrb r0, [r0] + ands r0, r1 + cmp r0, 0 + beq _08070F0C + movs r0, 0x1 + b _08070F0E + .align 2, 0 +_08070F08: .4byte gUnknown_8106FB5 +_08070F0C: + movs r0, 0 +_08070F0E: + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end sub_8070E3C + + thumb_func_start sub_8070F14 +sub_8070F14: + push {r4,r5,lr} + adds r4, r0, 0 + adds r5, r1, 0 + movs r1, 0x4 + ldrsh r0, [r4, r1] + ldr r1, _08070F70 + lsls r2, r5, 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 GetMapTileAtPosition + adds r2, r0, 0 + ldrh r1, [r2] + movs r0, 0x10 + ands r0, r1 + cmp r0, 0 + bne _08070F78 + ldr r0, [r2, 0x10] + cmp r0, 0 + bne _08070F78 + movs r1, 0x4 + ldrsh r0, [r4, r1] + movs r2, 0x6 + ldrsh r1, [r4, r2] + bl GetMapTileAtPosition + adds r2, r0, 0 + ldr r1, _08070F74 + movs r0, 0x7 + ands r0, r5 + adds r0, r1 + ldrb r1, [r2, 0xA] + ldrb r0, [r0] + ands r0, r1 + cmp r0, 0 + beq _08070F78 + movs r0, 0x1 + b _08070F7A + .align 2, 0 +_08070F70: .4byte gAdjacentTileOffsets +_08070F74: .4byte gUnknown_8106FBD +_08070F78: + movs r0, 0 +_08070F7A: + pop {r4,r5} + pop {r1} + bx r1 + thumb_func_end sub_8070F14 + + thumb_func_start sub_8070F80 +sub_8070F80: + 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 + movs r2, 0x4 + ldrsh r0, [r4, r2] + ldr r1, _08070FF4 + 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 GetMapTileAtPosition + adds r2, r0, 0 + ldrh r1, [r2] + movs r0, 0x10 + ands r0, r1 + cmp r0, 0 + bne _08071050 + ldr r0, [r2, 0x10] + cmp r0, 0 + beq _08070FCC + bl GetEntityType + cmp r0, 0x1 + bne _08071050 +_08070FCC: + bl IsFixedDungeon + lsls r0, 24 + cmp r0, 0 + bne _08071020 + ldr r0, [r4, 0x70] + adds r0, 0xE4 + ldrb r0, [r0] + cmp r0, 0x3 + beq _08070FEE + adds r0, r4, 0 + movs r1, 0x9 + bl HasItem + lsls r0, 24 + cmp r0, 0 + beq _08070FF8 +_08070FEE: + movs r5, 0x3 + b _08071020 + .align 2, 0 +_08070FF4: .4byte gAdjacentTileOffsets +_08070FF8: + adds r0, r4, 0 + movs r1, 0xC + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + bne _0807101E + adds r0, r4, 0 + movs r1, 0xD + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _08071020 + movs r0, 0x1 + ands r0, r6 + movs r5, 0x3 + cmp r0, 0 + beq _08071020 +_0807101E: + movs r5, 0x2 +_08071020: + movs r1, 0x4 + ldrsh r0, [r4, r1] + movs r2, 0x6 + ldrsh r1, [r4, r2] + bl GetMapTileAtPosition + adds r2, r0, 0 + adds r1, r2, 0 + adds r1, 0xA + adds r1, r5 + ldr r2, _0807104C + movs r0, 0x7 + ands r0, r6 + adds r0, r2 + ldrb r1, [r1] + ldrb r0, [r0] + ands r0, r1 + cmp r0, 0 + beq _08071050 + movs r0, 0x1 + b _08071052 + .align 2, 0 +_0807104C: .4byte gUnknown_8106FC5 +_08071050: + movs r0, 0 +_08071052: + pop {r4-r6} + pop {r1} + bx r1 + thumb_func_end sub_8070F80 + + thumb_func_start sub_8071058 +sub_8071058: + push {r4-r7,lr} + adds r5, r0, 0 + adds r7, r1, 0 + ldr r0, [r5, 0x70] + movs r1, 0x2 + ldrsh r0, [r0, r1] + bl GetCrossableTerrain + lsls r0, 24 + lsrs r6, r0, 24 + movs r2, 0x4 + ldrsh r0, [r5, r2] + ldr r1, _080710D4 + lsls r2, r7, 2 + adds r2, r1 + movs r3, 0 + ldrsh r1, [r2, r3] + adds r0, r1 + movs r3, 0x6 + ldrsh r1, [r5, r3] + movs r3, 0x2 + ldrsh r2, [r2, r3] + adds r1, r2 + bl GetMapTileAtPosition + adds r4, r0, 0 + ldrh r1, [r4] + movs r0, 0x10 + ands r0, r1 + cmp r0, 0 + bne _08071130 + ldr r0, [r4, 0x10] + cmp r0, 0 + beq _080710AE + bl GetEntityType + cmp r0, 0x1 + beq _080710AE + ldr r0, [r4, 0x10] + ldr r0, [r0, 0x70] + ldrb r0, [r0, 0x6] + cmp r0, 0 + bne _08071130 +_080710AE: + bl IsFixedDungeon + lsls r0, 24 + cmp r0, 0 + bne _08071100 + ldr r0, [r5, 0x70] + adds r0, 0xE4 + ldrb r0, [r0] + cmp r0, 0x3 + beq _080710D0 + adds r0, r5, 0 + movs r1, 0x9 + bl HasItem + lsls r0, 24 + cmp r0, 0 + beq _080710D8 +_080710D0: + movs r6, 0x3 + b _08071100 + .align 2, 0 +_080710D4: .4byte gAdjacentTileOffsets +_080710D8: + adds r0, r5, 0 + movs r1, 0xC + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + bne _080710FE + adds r0, r5, 0 + movs r1, 0xD + bl HasIQSkill + lsls r0, 24 + cmp r0, 0 + beq _08071100 + movs r0, 0x1 + ands r0, r7 + movs r6, 0x3 + cmp r0, 0 + beq _08071100 +_080710FE: + movs r6, 0x2 +_08071100: + movs r1, 0x4 + ldrsh r0, [r5, r1] + movs r2, 0x6 + ldrsh r1, [r5, r2] + bl GetMapTileAtPosition + adds r4, r0, 0 + adds r1, r4, 0 + adds r1, 0xA + adds r1, r6 + ldr r2, _0807112C + movs r0, 0x7 + ands r0, r7 + adds r0, r2 + ldrb r1, [r1] + ldrb r0, [r0] + ands r0, r1 + cmp r0, 0 + beq _08071130 + movs r0, 0x1 + b _08071132 + .align 2, 0 +_0807112C: .4byte gUnknown_8106FCD +_08071130: + movs r0, 0 +_08071132: + pop {r4-r7} + pop {r1} + 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 GetMapTileAtPosition + 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 GetMapTileAtPosition + 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 GetMapTileAtPosition + 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 GetMapTileAtPosition + 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 GetMapTileAtPosition + 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/asm/code_80718D8.s b/asm/code_80718D8.s index 4ee7f09..030fd72 100644 --- a/asm/code_80718D8.s +++ b/asm/code_80718D8.s @@ -2652,7 +2652,7 @@ _08072F84: bne _08072FCC adds r0, r4, 0 adds r1, r3, 0 - bl CanMoveForward2 + bl CanMoveInDirection lsls r0, 24 cmp r0, 0 bne _08072FCC diff --git a/data/data_8106A4C.s b/data/data_8106A4C.s index 902cb73..d8e604b 100644 --- a/data/data_8106A4C.s +++ b/data/data_8106A4C.s @@ -362,38 +362,3 @@ gUnknown_8106F7C: @ 8106F7C .global gUnknown_8106FA4 gUnknown_8106FA4: @ 8106FA4 .string "{COLOR_2}%c%s{END_COLOR_TEXT_2}\0" - - .global gDirectionBitMasks -gDirectionBitMasks: @ 8106FAD -@ replacing .incbin "baserom.gba", 0x00106fad, 0x8 - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 - - .global gUnknown_8106FB5 -gUnknown_8106FB5: @ 8106FB5 -@ replacing .incbin "baserom.gba", 0x00106fb5, 0x8 - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 - - .global gUnknown_8106FBD -gUnknown_8106FBD: @ 8106FBD -@ replacing .incbin "baserom.gba", 0x00106fbd, 0x8 - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 - - .global gUnknown_8106FC5 -gUnknown_8106FC5: @ 8106FC5 -@ replacing .incbin "baserom.gba", 0x00106fc5, 0x8 - .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 - - .global gUnknown_8106FCD -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_8106FB5.s b/data/data_8106FB5.s new file mode 100644 index 0000000..dc32b18 --- /dev/null +++ b/data/data_8106FB5.s @@ -0,0 +1,31 @@ + .section .rodata + + .global gUnknown_8106FB5 +gUnknown_8106FB5: @ 8106FB5 +@ replacing .incbin "baserom.gba", 0x00106fb5, 0x8 + .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 + + .global gUnknown_8106FBD +gUnknown_8106FBD: @ 8106FBD +@ replacing .incbin "baserom.gba", 0x00106fbd, 0x8 + .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 + + .global gUnknown_8106FC5 +gUnknown_8106FC5: @ 8106FC5 +@ replacing .incbin "baserom.gba", 0x00106fc5, 0x8 + .byte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 + + .global gUnknown_8106FCD +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/include/dungeon_capabilities_1.h b/include/dungeon_capabilities_1.h index 1d10a0f..c19391b 100644 --- a/include/dungeon_capabilities_1.h +++ b/include/dungeon_capabilities_1.h @@ -7,5 +7,7 @@ bool8 CannotUseItems(struct DungeonEntity *pokemon); // 0x70CD0 bool8 CannotAct(struct DungeonEntity *pokemon); +// 0x70D6C +bool8 CanMoveInDirection(struct DungeonEntity *pokemon, u32 facingDir); #endif diff --git a/include/map.h b/include/map.h index bb991ff..9122f00 100644 --- a/include/map.h +++ b/include/map.h @@ -7,6 +7,27 @@ #define MAX_ROOM_COUNT 24 // Empirical max, not sure if the code supports any more. #define CORRIDOR_ROOM_INDEX 0xFF +enum TileType +{ + TILE_TYPE_FLOOR = 1 << 0, + TILE_TYPE_LIQUID = 1 << 1, // Water or lava depending on the dungeon. + TILE_TYPE_UNK_2 = 1 << 2, + TILE_TYPE_ROOM_EXIT = 1 << 3, + TILE_TYPE_MAP_EDGE = 1 << 4, + TILE_TYPE_SHOP = 1 << 5, + TILE_TYPE_MONSTER_HOUSE = 1 << 6, + TILE_TYPE_STAIRS = 1 << 9 +}; + +enum CrossableTerrain +{ + CROSSABLE_TERRAIN_REGULAR = 0, + CROSSABLE_TERRAIN_LIQUID = 1, + CROSSABLE_TERRAIN_CREVICE = 2, + CROSSABLE_TERRAIN_WALL = 3, + NUM_CROSSABLE_TERRAIN +}; + struct MapTile { // Uses the TileType bit flags. @@ -17,11 +38,8 @@ 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. - /* 0xA */ u8 canMoveAdjacent; - /* 0xB */ u8 canMoveAdjacentLiquid; - /* 0xC */ u8 canMoveAdjacentCrevice; - /* 0xD */ u8 canMoveAdjacentWall; + // Different sets of flags are used for Pokémon that can cross special terrain, corresponding to Cthe rossableTerrain enum. + /* 0xA */ u8 canMoveAdjacent[NUM_CROSSABLE_TERRAIN]; u8 fillE[0x10 - 0xE]; /* 0x10 */ struct DungeonEntity *pokemon; // Pokémon on the tile. /* 0x14 */ struct DungeonEntity *mapObject; // Item or trap on the tile. @@ -39,24 +57,4 @@ struct MapRoom u8 fillA[0x1A - 0xA]; }; -enum TileType -{ - TILE_TYPE_FLOOR = 1 << 0, - TILE_TYPE_LIQUID = 1 << 1, // Water or lava depending on the dungeon. - TILE_TYPE_UNK_2 = 1 << 2, - TILE_TYPE_ROOM_EXIT = 1 << 3, - TILE_TYPE_MAP_EDGE = 1 << 4, - TILE_TYPE_SHOP = 1 << 5, - TILE_TYPE_MONSTER_HOUSE = 1 << 6, - TILE_TYPE_STAIRS = 1 << 9 -}; - -enum CrossableTerrain -{ - CROSSABLE_TERRAIN_REGULAR = 0, - CROSSABLE_TERRAIN_LIQUID = 1, - CROSSABLE_TERRAIN_CREVICE = 2, - CROSSABLE_TERRAIN_WALL = 3, -}; - #endif diff --git a/ld_script.txt b/ld_script.txt index 23ea939..6562b0f 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -214,7 +214,7 @@ SECTIONS { src/dungeon_capabilities.o(.text); asm/code_8070BC0.o(.text); src/dungeon_capabilities_1.o(.text); - asm/code_8070D04.o(.text); + asm/code_8070E3C.o(.text); src/dungeon_ai.o(.text); asm/code_8071518.o(.text); src/dungeon_ai_1.o(.text); @@ -400,6 +400,8 @@ SECTIONS { data/data_80F59C8.o(.rodata); src/charge_move.o(.rodata); data/data_8106A4C.o(.rodata); + src/dungeon_capabilities_1.o(.rodata); + data/data_8106FB5.o(.rodata); src/dungeon_ai_1.o(.rodata); data/data_8107010.o(.rodata); src/friend_area.o(.rodata); diff --git a/src/dungeon_capabilities_1.c b/src/dungeon_capabilities_1.c index 721bdcb..7ad12d8 100644 --- a/src/dungeon_capabilities_1.c +++ b/src/dungeon_capabilities_1.c @@ -2,10 +2,21 @@ #include "dungeon_capabilities_1.h" #include "constants/dungeon.h" +#include "constants/iq_skill.h" #include "constants/status.h" #include "charge_move.h" #include "dungeon_ai.h" #include "dungeon_capabilities.h" +#include "dungeon_items.h" +#include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_util.h" +#include "map.h" + +const u8 gDirectionBitMasks[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; + +extern u8 GetCrossableTerrain(s16); +extern bool8 IsFixedDungeon(); static inline bool8 JoinLocationCannotUseItems(struct DungeonEntityData *pokemonData) { @@ -75,3 +86,43 @@ bool8 CannotAttack(struct DungeonEntity *pokemon, bool8 skipSleep) } return TRUE; } + +bool8 CanMoveInDirection(struct DungeonEntity *pokemon, u32 facingDir) +{ + u8 crossableTerrain = GetCrossableTerrain(pokemon->entityData->entityID); + struct MapTile *currentMapTile = GetMapTileAtPosition(pokemon->posWorld.x + gAdjacentTileOffsets[facingDir].x, + pokemon->posWorld.y + gAdjacentTileOffsets[facingDir].y); + if (currentMapTile->tileType & TILE_TYPE_MAP_EDGE || currentMapTile->pokemon != NULL) + { + return FALSE; + } + 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)) + { + crossableTerrain = CROSSABLE_TERRAIN_CREVICE; + } + else if (HasIQSkill(pokemon, IQ_SKILL_SUPER_MOBILE)) + { + if (facingDir & 1) + { + // Super Mobile can't break walls diagonally. + crossableTerrain = CROSSABLE_TERRAIN_CREVICE; + } + else + { + crossableTerrain = CROSSABLE_TERRAIN_WALL; + } + } + } + currentMapTile = GetMapTileAtPosition(pokemon->posWorld.x, pokemon->posWorld.y); + if (!(currentMapTile->canMoveAdjacent[crossableTerrain] & gDirectionBitMasks[facingDir & DIRECTION_MASK])) + { + return FALSE; + } + return TRUE; +} diff --git a/src/dungeon_util.c b/src/dungeon_util.c index 5b6bd5a..c5b5695 100644 --- a/src/dungeon_util.c +++ b/src/dungeon_util.c @@ -3,7 +3,7 @@ #include "dungeon_map_access.h" -const struct Position gAdjacentTileOffsets[NUM_DIRECTIONS] = { +const struct Position gAdjacentTileOffsets[] = { {0, 1}, {1, 1}, {1, 0}, diff --git a/src/status_checks.c b/src/status_checks.c index ed39e99..b371934 100644 --- a/src/status_checks.c +++ b/src/status_checks.c @@ -6,6 +6,7 @@ #include "constants/status.h" #include "code_80521D0.h" #include "dungeon_action.h" +#include "dungeon_capabilities_1.h" #include "dungeon_random.h" extern char *gPtrFrozenMessage; @@ -17,7 +18,6 @@ extern char *gPtrInfatuatedMessage; extern char gAvailablePokemonNames[]; extern void SetMessageArgument(char[], struct DungeonEntity*, u32); -extern bool8 CanMoveForward2(struct DungeonEntity*, u8); extern void DecideAttack(struct DungeonEntity*); bool8 HasStatusAffectingActions(struct DungeonEntity *pokemon) @@ -74,7 +74,7 @@ bool8 HasStatusAffectingActions(struct DungeonEntity *pokemon) } if (pokemonData->eyesightStatus == EYESIGHT_STATUS_BLINKER) { - if (!CanMoveForward2(pokemon, pokemonData->action.facingDir)) + if (!CanMoveInDirection(pokemon, pokemonData->action.facingDir)) { if (DungeonRandomCapped(2) != 0) { -- cgit v1.2.3