From b7494f9fc19e77a2e75cd7360f6d376c4c3b87f8 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Sun, 26 Oct 2025 21:26:51 -0400 Subject: [PATCH] Decomped CanMoveThroughWalls --- asm/include/overlay_29_022FF8C8.inc | 10 - asm/include/overlay_29_022FF958.inc | 13 + asm/overlay_29_022FF8C8.s | 537 ---------------------------- asm/overlay_29_022FF958.s | 517 ++++++++++++++++++++++++++ include/dungeon_logic_8.h | 9 + main.lsf | 2 + src/dungeon_ai_movement.c | 2 +- src/dungeon_logic_8.c | 19 + 8 files changed, 561 insertions(+), 548 deletions(-) create mode 100644 asm/include/overlay_29_022FF958.inc create mode 100644 asm/overlay_29_022FF958.s create mode 100644 include/dungeon_logic_8.h create mode 100644 src/dungeon_logic_8.c diff --git a/asm/include/overlay_29_022FF8C8.inc b/asm/include/overlay_29_022FF8C8.inc index 1108e329..098f14dd 100644 --- a/asm/include/overlay_29_022FF8C8.inc +++ b/asm/include/overlay_29_022FF8C8.inc @@ -1,12 +1,2 @@ #pragma once -.public DUNGEON_PTR -.public EXCL_ITEM_EFFECTS_WEATHER_MOVE_SPEED_BOOST -.public ExclusiveItemEffectIsActive__022FFF28 -.public GetApparentWeather -.public GetMobilityTypeCheckSlipAndFloating -.public GetSpeedStatus -.public GetTile .public IqSkillIsEnabled -.public IsCurrentTilesetBackground -.public ItemIsActive__022FF898 -.public MonsterIsType diff --git a/asm/include/overlay_29_022FF958.inc b/asm/include/overlay_29_022FF958.inc new file mode 100644 index 00000000..7aafd69a --- /dev/null +++ b/asm/include/overlay_29_022FF958.inc @@ -0,0 +1,13 @@ +#pragma once +.public DUNGEON_PTR +.public EXCL_ITEM_EFFECTS_WEATHER_MOVE_SPEED_BOOST +.public ExclusiveItemEffectIsActive__022FFF28 +.public GetApparentWeather +.public GetMobilityTypeAfterIqSkills +.public GetMobilityTypeCheckSlipAndFloating +.public GetSpeedStatus +.public GetTile +.public IqSkillIsEnabled +.public IsCurrentTilesetBackground +.public ItemIsActive__022FF898 +.public MonsterIsType diff --git a/asm/overlay_29_022FF8C8.s b/asm/overlay_29_022FF8C8.s index 4288feaa..4856cf6b 100644 --- a/asm/overlay_29_022FF8C8.s +++ b/asm/overlay_29_022FF8C8.s @@ -25,540 +25,3 @@ _022FF8EC: ldmia sp!, {r3, r4, r5, pc} arm_func_end GetMobilityTypeAfterIqSkills #endif - - arm_func_start CanMoveThroughWalls -CanMoveThroughWalls: ; 0x022FF908 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r4, [r5, #0xb4] - ldrb r1, [r4, #0xef] - cmp r1, #3 - moveq r0, #1 - ldmeqia sp!, {r3, r4, r5, pc} - mov r1, #0x10 - bl ItemIsActive__022FF898 - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, pc} - ldrsh r1, [r4, #2] - mov r0, r5 - bl GetMobilityTypeCheckSlipAndFloating - cmp r0, #3 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, r4, r5, pc} - arm_func_end CanMoveThroughWalls - - arm_func_start ov29_022FF958 -ov29_022FF958: ; 0x022FF958 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - mov r6, r0 - ldrsh r0, [r7] - ldrsh r1, [r7, #2] - ldr r5, [r6, #0xb4] - bl GetTile - ldrsh r1, [r7] - mov r4, r0 - cmp r1, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - ldrsh r0, [r7, #2] - cmp r0, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - cmp r1, #0x38 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - cmp r0, #0x20 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - ldrh r0, [r4] - tst r0, #0x10 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - ldr r0, [r4, #0xc] - cmp r0, #0 - ldrne r0, [r0] - cmpne r0, #1 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - bl IsCurrentTilesetBackground - cmp r0, #0 - bne _022FFA0C - ldrb r0, [r5, #0xef] - cmp r0, #3 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - mov r1, #0x10 - bl ItemIsActive__022FF898 - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} -_022FFA0C: - ldrsh r1, [r5, #2] - mov r0, r6 - bl GetMobilityTypeCheckSlipAndFloating - ldrh r2, [r4] -#ifdef JAPAN - mov r4, r0 - mov r0, r6 - mov r1, #0xc - and r5, r2, #3 - bl IqSkillIsEnabled - cmp r0, #0 - mov r0, r6 - mov r1, #0xd - movne r4, #2 - bl IqSkillIsEnabled - cmp r0, #0 - movne r4, #3 - cmp r4, #3 - addls pc, pc, r4, lsl #2 -#else - mov r1, r0 - mov r0, r6 - and r4, r2, #3 - bl GetMobilityTypeAfterIqSkills - cmp r0, #3 - addls pc, pc, r0, lsl #2 -#endif - b _022FFA84 -_022FFA38: ; jump table - b _022FFA48 ; case 0 - b _022FFA58 ; case 1 - b _022FFA74 ; case 2 - b _022FFA84 ; case 3 -_022FFA48: -#ifdef JAPAN - cmp r5, #1 -#else - cmp r4, #1 -#endif - bne _022FFA8C - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFA58: -#ifdef JAPAN - cmp r5, #2 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - cmp r5, #1 -#else - cmp r4, #2 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - cmp r4, #1 -#endif - bne _022FFA8C - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFA74: -#ifdef JAPAN - cmp r5, #0 -#else - cmp r4, #0 -#endif - beq _022FFA8C - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFA84: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFA8C: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_022FF958 - - arm_func_start ov29_022FFA94 -ov29_022FFA94: ; 0x022FFA94 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - mov r6, r0 - ldrsh r0, [r7] - ldrsh r1, [r7, #2] - ldr r5, [r6, #0xb4] - bl GetTile - ldrsh r1, [r7] - mov r4, r0 - cmp r1, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - ldrsh r0, [r7, #2] - cmp r0, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - cmp r1, #0x38 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - cmp r0, #0x20 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - ldrh r0, [r4] - tst r0, #0x10 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - ldr r0, [r4, #0xc] - cmp r0, #0 - ldrne r0, [r0] - cmpne r0, #1 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - ldrsh r1, [r5, #2] - mov r0, r6 - bl GetMobilityTypeCheckSlipAndFloating - ldrh r1, [r4] - cmp r0, #3 - and r1, r1, #3 - addls pc, pc, r0, lsl #2 - b _022FFB80 -_022FFB34: ; jump table - b _022FFB44 ; case 0 - b _022FFB54 ; case 1 - b _022FFB70 ; case 2 - b _022FFB70 ; case 3 -_022FFB44: - cmp r1, #1 - bne _022FFB88 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFB54: - cmp r1, #2 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - cmp r1, #1 - bne _022FFB88 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFB70: - cmp r1, #0 - beq _022FFB88 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFB80: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFB88: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_022FFA94 - - arm_func_start ov29_022FFB90 -ov29_022FFB90: ; 0x022FFB90 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - mov r6, r0 - ldrsh r0, [r7] - ldrsh r1, [r7, #2] - ldr r5, [r6, #0xb4] - bl GetTile - ldrsh r1, [r7] - mov r4, r0 - cmp r1, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - ldrsh r0, [r7, #2] - cmp r0, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - cmp r1, #0x38 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - cmp r0, #0x20 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - ldrh r0, [r4] - tst r0, #0x10 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - ldr r0, [r4, #0xc] - cmp r0, #0 - ldrne r0, [r0] - cmpne r0, #1 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - bl IsCurrentTilesetBackground - cmp r0, #0 - bne _022FFC44 - ldrb r0, [r5, #0xef] - cmp r0, #3 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - mov r1, #0x10 - bl ItemIsActive__022FF898 - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} -_022FFC44: - ldrsh r1, [r5, #2] - mov r0, r6 - bl GetMobilityTypeCheckSlipAndFloating - ldrh r2, [r4] -#ifdef JAPAN - mov r4, r0 - mov r0, r6 - mov r1, #0xc - and r5, r2, #3 - bl IqSkillIsEnabled - cmp r0, #0 - mov r0, r6 - mov r1, #0xd - movne r4, #2 - bl IqSkillIsEnabled - cmp r0, #0 - movne r4, #3 - cmp r4, #3 - addls pc, pc, r4, lsl #2 -#else - mov r1, r0 - mov r0, r6 - and r4, r2, #3 - bl GetMobilityTypeAfterIqSkills - cmp r0, #3 - addls pc, pc, r0, lsl #2 -#endif - b _022FFC94 -_022FFC70: ; jump table - b _022FFC80 ; case 0 - b _022FFC80 ; case 1 - b _022FFC80 ; case 2 - b _022FFC94 ; case 3 -_022FFC80: -#ifdef JAPAN - cmp r5, #0 -#else - cmp r4, #0 -#endif - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFC94: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_022FFB90 - - arm_func_start CannotStandOnTile -CannotStandOnTile: ; 0x022FFC9C - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - mov r6, r0 - ldrsh r0, [r7] - ldrsh r1, [r7, #2] - ldr r5, [r6, #0xb4] - bl GetTile - ldrsh r1, [r7] - mov r4, r0 - cmp r1, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - ldrsh r0, [r7, #2] - cmp r0, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - cmp r1, #0x38 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - cmp r0, #0x20 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - ldrh r0, [r4] - tst r0, #0x10 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - ldr r1, [r4, #0xc] - cmp r1, #0 - beq _022FFD38 - ldr r0, [r1] - cmp r0, #1 - bne _022FFD30 - ldr r0, [r1, #0xb4] - cmp r0, r5 - beq _022FFD38 - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFD30: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFD38: - bl IsCurrentTilesetBackground - cmp r0, #0 - bne _022FFD6C - ldrb r0, [r5, #0xef] - cmp r0, #3 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - mov r1, #0x10 - bl ItemIsActive__022FF898 - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} -_022FFD6C: - ldrsh r1, [r5, #2] - mov r0, r6 - bl GetMobilityTypeCheckSlipAndFloating - ldrh r2, [r4] -#ifdef JAPAN - mov r4, r0 - mov r0, r6 - mov r1, #0xc - and r5, r2, #3 - bl IqSkillIsEnabled - cmp r0, #0 - mov r0, r6 - mov r1, #0xd - movne r4, #2 - bl IqSkillIsEnabled - cmp r0, #0 - movne r4, #3 - cmp r4, #3 - addls pc, pc, r4, lsl #2 -#else - mov r1, r0 - mov r0, r6 - and r4, r2, #3 - bl GetMobilityTypeAfterIqSkills - cmp r0, #3 - addls pc, pc, r0, lsl #2 -#endif - b _022FFDE4 -_022FFD98: ; jump table - b _022FFDA8 ; case 0 - b _022FFDB8 ; case 1 - b _022FFDD4 ; case 2 - b _022FFDE4 ; case 3 -_022FFDA8: -#ifdef JAPAN - cmp r5, #1 -#else - cmp r4, #1 -#endif - bne _022FFDEC - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFDB8: -#ifdef JAPAN - cmp r5, #2 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - cmp r5, #1 -#else - cmp r4, #2 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - cmp r4, #1 -#endif - bne _022FFDEC - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFDD4: -#ifdef JAPAN - cmp r5, #0 -#else - cmp r4, #0 -#endif - beq _022FFDEC - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFDE4: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FFDEC: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end CannotStandOnTile - - arm_func_start CalcSpeedStage -CalcSpeedStage: ; 0x022FFDF4 -#ifdef JAPAN -#define CALC_SPEED_STAGE_OFFSET -4 -#else -#define CALC_SPEED_STAGE_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r7, r1 - ldr r6, [r8, #0xb4] - bl GetApparentWeather - mov r4, #0 - mov r5, r0 - mov r1, r4 -_022FFE14: - add r2, r6, r1 - ldrb r0, [r2, #0x119 + CALC_SPEED_STAGE_OFFSET] - add r1, r1, #1 - cmp r0, #0 - ldrb r0, [r2, #0x114 + CALC_SPEED_STAGE_OFFSET] - subne r4, r4, r7 - cmp r0, #0 - addne r4, r4, r7 - cmp r1, #5 - blt _022FFE14 - ldrb r0, [r6, #0xbf] - cmp r0, #4 - ldrsh r0, [r6, #2] - subeq r4, r4, #1 - bl GetSpeedStatus - add r4, r4, r0 - mov r0, r8 - mov r1, #6 - bl MonsterIsType - cmp r0, #0 - beq _022FFE78 - mov r0, r8 - bl GetApparentWeather - cmp r0, #7 - addeq r4, r4, #1 -_022FFE78: - mov r0, r8 - mov r1, #0x3a - bl IqSkillIsEnabled - cmp r0, #0 - ldr r1, _022FFF18 ; =EXCL_ITEM_EFFECTS_WEATHER_MOVE_SPEED_BOOST - addne r4, r4, #1 - ldrb r0, [r1, r5] - cmp r0, #0 - beq _022FFEB0 - ldrb r1, [r1, r5] - mov r0, r8 - bl ExclusiveItemEffectIsActive__022FFF28 - cmp r0, #0 - addne r4, r4, #1 -_022FFEB0: - ldrsh r1, [r6, #4] - ldr r0, _022FFF1C ; =0x000001A5 - cmp r1, r0 - addne r0, r0, #0x72 - cmpne r1, r0 - ldrsh r1, [r6, #2] - ldr r0, _022FFF20 ; =0x0000017F - addeq r4, r4, #1 - cmp r1, r0 - addne r0, r0, #0x258 - cmpne r1, r0 - bne _022FFEFC - ldrb r0, [r6, #6] - cmp r0, #0 - ldrne r0, _022FFF24 ; =DUNGEON_PTR - ldrne r0, [r0] - ldrneb r0, [r0, #0x790] - cmpne r0, #0 - addne r4, r4, #1 -_022FFEFC: - cmp r4, #0 - movlt r4, #0 - cmp r4, #5 - movge r4, #4 - mov r0, r4 - str r4, [r6, #0x110 + CALC_SPEED_STAGE_OFFSET] - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_022FFF18: .word EXCL_ITEM_EFFECTS_WEATHER_MOVE_SPEED_BOOST -_022FFF1C: .word 0x000001A5 -_022FFF20: .word 0x0000017F -_022FFF24: .word DUNGEON_PTR - arm_func_end CalcSpeedStage diff --git a/asm/overlay_29_022FF958.s b/asm/overlay_29_022FF958.s new file mode 100644 index 00000000..e093bcf1 --- /dev/null +++ b/asm/overlay_29_022FF958.s @@ -0,0 +1,517 @@ + .include "asm/macros.inc" + .include "overlay_29_022FF958.inc" + + .text + + arm_func_start ov29_022FF958 +ov29_022FF958: ; 0x022FF958 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r1 + mov r6, r0 + ldrsh r0, [r7] + ldrsh r1, [r7, #2] + ldr r5, [r6, #0xb4] + bl GetTile + ldrsh r1, [r7] + mov r4, r0 + cmp r1, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldrsh r0, [r7, #2] + cmp r0, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + cmp r1, #0x38 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #0x20 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r0, [r4] + tst r0, #0x10 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + ldrne r0, [r0] + cmpne r0, #1 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl IsCurrentTilesetBackground + cmp r0, #0 + bne _022FFA0C + ldrb r0, [r5, #0xef] + cmp r0, #3 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + mov r1, #0x10 + bl ItemIsActive__022FF898 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_022FFA0C: + ldrsh r1, [r5, #2] + mov r0, r6 + bl GetMobilityTypeCheckSlipAndFloating + ldrh r2, [r4] +#ifdef JAPAN + mov r4, r0 + mov r0, r6 + mov r1, #0xc + and r5, r2, #3 + bl IqSkillIsEnabled + cmp r0, #0 + mov r0, r6 + mov r1, #0xd + movne r4, #2 + bl IqSkillIsEnabled + cmp r0, #0 + movne r4, #3 + cmp r4, #3 + addls pc, pc, r4, lsl #2 +#else + mov r1, r0 + mov r0, r6 + and r4, r2, #3 + bl GetMobilityTypeAfterIqSkills + cmp r0, #3 + addls pc, pc, r0, lsl #2 +#endif + b _022FFA84 +_022FFA38: ; jump table + b _022FFA48 ; case 0 + b _022FFA58 ; case 1 + b _022FFA74 ; case 2 + b _022FFA84 ; case 3 +_022FFA48: +#ifdef JAPAN + cmp r5, #1 +#else + cmp r4, #1 +#endif + bne _022FFA8C + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFA58: +#ifdef JAPAN + cmp r5, #2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #1 +#else + cmp r4, #2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #1 +#endif + bne _022FFA8C + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFA74: +#ifdef JAPAN + cmp r5, #0 +#else + cmp r4, #0 +#endif + beq _022FFA8C + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFA84: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFA8C: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov29_022FF958 + + arm_func_start ov29_022FFA94 +ov29_022FFA94: ; 0x022FFA94 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r1 + mov r6, r0 + ldrsh r0, [r7] + ldrsh r1, [r7, #2] + ldr r5, [r6, #0xb4] + bl GetTile + ldrsh r1, [r7] + mov r4, r0 + cmp r1, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldrsh r0, [r7, #2] + cmp r0, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + cmp r1, #0x38 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #0x20 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r0, [r4] + tst r0, #0x10 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + ldrne r0, [r0] + cmpne r0, #1 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldrsh r1, [r5, #2] + mov r0, r6 + bl GetMobilityTypeCheckSlipAndFloating + ldrh r1, [r4] + cmp r0, #3 + and r1, r1, #3 + addls pc, pc, r0, lsl #2 + b _022FFB80 +_022FFB34: ; jump table + b _022FFB44 ; case 0 + b _022FFB54 ; case 1 + b _022FFB70 ; case 2 + b _022FFB70 ; case 3 +_022FFB44: + cmp r1, #1 + bne _022FFB88 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFB54: + cmp r1, #2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r1, #1 + bne _022FFB88 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFB70: + cmp r1, #0 + beq _022FFB88 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFB80: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFB88: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov29_022FFA94 + + arm_func_start ov29_022FFB90 +ov29_022FFB90: ; 0x022FFB90 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r1 + mov r6, r0 + ldrsh r0, [r7] + ldrsh r1, [r7, #2] + ldr r5, [r6, #0xb4] + bl GetTile + ldrsh r1, [r7] + mov r4, r0 + cmp r1, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldrsh r0, [r7, #2] + cmp r0, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + cmp r1, #0x38 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #0x20 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r0, [r4] + tst r0, #0x10 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + ldrne r0, [r0] + cmpne r0, #1 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl IsCurrentTilesetBackground + cmp r0, #0 + bne _022FFC44 + ldrb r0, [r5, #0xef] + cmp r0, #3 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + mov r1, #0x10 + bl ItemIsActive__022FF898 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_022FFC44: + ldrsh r1, [r5, #2] + mov r0, r6 + bl GetMobilityTypeCheckSlipAndFloating + ldrh r2, [r4] +#ifdef JAPAN + mov r4, r0 + mov r0, r6 + mov r1, #0xc + and r5, r2, #3 + bl IqSkillIsEnabled + cmp r0, #0 + mov r0, r6 + mov r1, #0xd + movne r4, #2 + bl IqSkillIsEnabled + cmp r0, #0 + movne r4, #3 + cmp r4, #3 + addls pc, pc, r4, lsl #2 +#else + mov r1, r0 + mov r0, r6 + and r4, r2, #3 + bl GetMobilityTypeAfterIqSkills + cmp r0, #3 + addls pc, pc, r0, lsl #2 +#endif + b _022FFC94 +_022FFC70: ; jump table + b _022FFC80 ; case 0 + b _022FFC80 ; case 1 + b _022FFC80 ; case 2 + b _022FFC94 ; case 3 +_022FFC80: +#ifdef JAPAN + cmp r5, #0 +#else + cmp r4, #0 +#endif + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFC94: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov29_022FFB90 + + arm_func_start CannotStandOnTile +CannotStandOnTile: ; 0x022FFC9C + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r1 + mov r6, r0 + ldrsh r0, [r7] + ldrsh r1, [r7, #2] + ldr r5, [r6, #0xb4] + bl GetTile + ldrsh r1, [r7] + mov r4, r0 + cmp r1, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldrsh r0, [r7, #2] + cmp r0, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + cmp r1, #0x38 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #0x20 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r0, [r4] + tst r0, #0x10 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldr r1, [r4, #0xc] + cmp r1, #0 + beq _022FFD38 + ldr r0, [r1] + cmp r0, #1 + bne _022FFD30 + ldr r0, [r1, #0xb4] + cmp r0, r5 + beq _022FFD38 + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFD30: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFD38: + bl IsCurrentTilesetBackground + cmp r0, #0 + bne _022FFD6C + ldrb r0, [r5, #0xef] + cmp r0, #3 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + mov r1, #0x10 + bl ItemIsActive__022FF898 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_022FFD6C: + ldrsh r1, [r5, #2] + mov r0, r6 + bl GetMobilityTypeCheckSlipAndFloating + ldrh r2, [r4] +#ifdef JAPAN + mov r4, r0 + mov r0, r6 + mov r1, #0xc + and r5, r2, #3 + bl IqSkillIsEnabled + cmp r0, #0 + mov r0, r6 + mov r1, #0xd + movne r4, #2 + bl IqSkillIsEnabled + cmp r0, #0 + movne r4, #3 + cmp r4, #3 + addls pc, pc, r4, lsl #2 +#else + mov r1, r0 + mov r0, r6 + and r4, r2, #3 + bl GetMobilityTypeAfterIqSkills + cmp r0, #3 + addls pc, pc, r0, lsl #2 +#endif + b _022FFDE4 +_022FFD98: ; jump table + b _022FFDA8 ; case 0 + b _022FFDB8 ; case 1 + b _022FFDD4 ; case 2 + b _022FFDE4 ; case 3 +_022FFDA8: +#ifdef JAPAN + cmp r5, #1 +#else + cmp r4, #1 +#endif + bne _022FFDEC + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFDB8: +#ifdef JAPAN + cmp r5, #2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #1 +#else + cmp r4, #2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #1 +#endif + bne _022FFDEC + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFDD4: +#ifdef JAPAN + cmp r5, #0 +#else + cmp r4, #0 +#endif + beq _022FFDEC + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFDE4: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FFDEC: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end CannotStandOnTile + + arm_func_start CalcSpeedStage +CalcSpeedStage: ; 0x022FFDF4 +#ifdef JAPAN +#define CALC_SPEED_STAGE_OFFSET -4 +#else +#define CALC_SPEED_STAGE_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + ldr r6, [r8, #0xb4] + bl GetApparentWeather + mov r4, #0 + mov r5, r0 + mov r1, r4 +_022FFE14: + add r2, r6, r1 + ldrb r0, [r2, #0x119 + CALC_SPEED_STAGE_OFFSET] + add r1, r1, #1 + cmp r0, #0 + ldrb r0, [r2, #0x114 + CALC_SPEED_STAGE_OFFSET] + subne r4, r4, r7 + cmp r0, #0 + addne r4, r4, r7 + cmp r1, #5 + blt _022FFE14 + ldrb r0, [r6, #0xbf] + cmp r0, #4 + ldrsh r0, [r6, #2] + subeq r4, r4, #1 + bl GetSpeedStatus + add r4, r4, r0 + mov r0, r8 + mov r1, #6 + bl MonsterIsType + cmp r0, #0 + beq _022FFE78 + mov r0, r8 + bl GetApparentWeather + cmp r0, #7 + addeq r4, r4, #1 +_022FFE78: + mov r0, r8 + mov r1, #0x3a + bl IqSkillIsEnabled + cmp r0, #0 + ldr r1, _022FFF18 ; =EXCL_ITEM_EFFECTS_WEATHER_MOVE_SPEED_BOOST + addne r4, r4, #1 + ldrb r0, [r1, r5] + cmp r0, #0 + beq _022FFEB0 + ldrb r1, [r1, r5] + mov r0, r8 + bl ExclusiveItemEffectIsActive__022FFF28 + cmp r0, #0 + addne r4, r4, #1 +_022FFEB0: + ldrsh r1, [r6, #4] + ldr r0, _022FFF1C ; =0x000001A5 + cmp r1, r0 + addne r0, r0, #0x72 + cmpne r1, r0 + ldrsh r1, [r6, #2] + ldr r0, _022FFF20 ; =0x0000017F + addeq r4, r4, #1 + cmp r1, r0 + addne r0, r0, #0x258 + cmpne r1, r0 + bne _022FFEFC + ldrb r0, [r6, #6] + cmp r0, #0 + ldrne r0, _022FFF24 ; =DUNGEON_PTR + ldrne r0, [r0] + ldrneb r0, [r0, #0x790] + cmpne r0, #0 + addne r4, r4, #1 +_022FFEFC: + cmp r4, #0 + movlt r4, #0 + cmp r4, #5 + movge r4, #4 + mov r0, r4 + str r4, [r6, #0x110 + CALC_SPEED_STAGE_OFFSET] + ldmia sp!, {r4, r5, r6, r7, r8, pc} + .align 2, 0 +_022FFF18: .word EXCL_ITEM_EFFECTS_WEATHER_MOVE_SPEED_BOOST +_022FFF1C: .word 0x000001A5 +_022FFF20: .word 0x0000017F +_022FFF24: .word DUNGEON_PTR + arm_func_end CalcSpeedStage diff --git a/include/dungeon_logic_8.h b/include/dungeon_logic_8.h new file mode 100644 index 00000000..572e2b79 --- /dev/null +++ b/include/dungeon_logic_8.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_DUNGEON_LOGIC_8_H +#define PMDSKY_DUNGEON_LOGIC_8_H + +#include "dungeon_mode.h" + +// Checks if a given monster can move through walls, including both the innate ability of Ghost types and outside modifiers like Mobile Scarf/Orb. +bool8 CanMoveThroughWalls(struct entity *monster); + +#endif //PMDSKY_DUNGEON_LOGIC_8_H diff --git a/main.lsf b/main.lsf index 6633aa32..30140fee 100644 --- a/main.lsf +++ b/main.lsf @@ -458,6 +458,8 @@ Overlay OVY_29 Object asm/overlay_29_022FF6C4.o Object src/overlay_29_022FF898.o Object asm/overlay_29_022FF8C8.o + Object src/dungeon_logic_8.o + Object asm/overlay_29_022FF958.o Object src/overlay_29_022FFF28.o Object asm/overlay_29_022FFF4C.o Object src/overlay_29_023000E4.o diff --git a/src/dungeon_ai_movement.c b/src/dungeon_ai_movement.c index 3474b83a..f1ea6360 100644 --- a/src/dungeon_ai_movement.c +++ b/src/dungeon_ai_movement.c @@ -8,6 +8,7 @@ #include "dungeon_capabilities_1.h" #include "dungeon_capabilities_4.h" #include "dungeon_logic_7.h" +#include "dungeon_logic_8.h" #include "dungeon_map_access.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_util.h" @@ -50,7 +51,6 @@ extern bool8 CanTargetEntity(struct entity *user, struct entity *target); extern bool8 CanTargetPosition(struct entity *monster, struct position *position); extern bool8 IsPositionWithinTwoTiles(struct position *origin, struct position *target); extern s32 ov29_022FBE04(struct monster*); -extern bool8 CanMoveThroughWalls(struct entity *monster); extern bool8 ShouldAvoidFirstHit(struct entity *monster, bool8 force_avoid); extern bool8 CanSeeTeammate(struct entity *monster); extern struct entity* GetLeaderIfVisible(struct entity *monster); diff --git a/src/dungeon_logic_8.c b/src/dungeon_logic_8.c new file mode 100644 index 00000000..86364acb --- /dev/null +++ b/src/dungeon_logic_8.c @@ -0,0 +1,19 @@ +#include "dungeon_logic_8.h" +#include "dungeon_mobility.h" +#include "dungeon_util_static.h" +#include "overlay_29_022FF898.h" + +bool8 CanMoveThroughWalls(struct entity *monster) +{ + struct monster *pokemon_info = GetEntInfo(monster); + if (pokemon_info->invisible_class_status.status == STATUS_INVISIBLE_MOBILE) + return TRUE; + + if (ItemIsActive__022FF898(monster, ITEM_MOBILE_SCARF)) + return TRUE; + + if (GetMobilityTypeCheckSlipAndFloating(monster, pokemon_info->id) == MOBILITY_INTANGIBLE) + return TRUE; + + return FALSE; +}