From 690749ce7cd30f546795e0764e3445eadd2f1353 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Sat, 31 May 2025 22:37:46 -0400 Subject: [PATCH] Decomped GetMobilityTypeCheckSlipAndFloating --- asm/include/overlay_29_022FF3F4.inc | 6 - asm/include/overlay_29_022FF6C4.inc | 8 ++ asm/overlay_29_022FF3F4.s | 195 ---------------------------- asm/overlay_29_022FF6C4.s | 174 +++++++++++++++++++++++++ include/dungeon_mobility.h | 8 ++ main.lsf | 2 + src/dungeon_logic_3.c | 2 +- src/dungeon_mobility.c | 14 ++ 8 files changed, 207 insertions(+), 202 deletions(-) create mode 100644 asm/include/overlay_29_022FF6C4.inc create mode 100644 asm/overlay_29_022FF6C4.s create mode 100644 include/dungeon_mobility.h create mode 100644 src/dungeon_mobility.c diff --git a/asm/include/overlay_29_022FF3F4.inc b/asm/include/overlay_29_022FF3F4.inc index 3c029a7a..3d894479 100644 --- a/asm/include/overlay_29_022FF3F4.inc +++ b/asm/include/overlay_29_022FF3F4.inc @@ -1,12 +1,6 @@ #pragma once .public GetMobilityType -.public GetMobilityTypeAfterIqSkills -.public GetTile -.public IqSkillIsEnabled .public IsChargingTwoTurnMove -.public IsCurrentTilesetBackground -.public IsFloating -.public ItemIsActive__022FF898 .public LogMessageByIdWithPopupCheckUser .public SetActionUseMovePlayer .public SetMonsterActionFields diff --git a/asm/include/overlay_29_022FF6C4.inc b/asm/include/overlay_29_022FF6C4.inc new file mode 100644 index 00000000..deaafed3 --- /dev/null +++ b/asm/include/overlay_29_022FF6C4.inc @@ -0,0 +1,8 @@ +#pragma once +.public GetMobilityTypeAfterIqSkills +.public GetMobilityTypeCheckSlip +.public GetMobilityTypeCheckSlipAndFloating +.public GetTile +.public IqSkillIsEnabled +.public IsCurrentTilesetBackground +.public ItemIsActive__022FF898 diff --git a/asm/overlay_29_022FF3F4.s b/asm/overlay_29_022FF3F4.s index bcde087c..b6802f15 100644 --- a/asm/overlay_29_022FF3F4.s +++ b/asm/overlay_29_022FF3F4.s @@ -208,198 +208,3 @@ _022FF660: .align 2, 0 _022FF670: .word ov29_0237C9B8 arm_func_end GetMobilityTypeCheckSlip - - arm_func_start GetMobilityTypeCheckSlipAndFloating -GetMobilityTypeCheckSlipAndFloating: ; 0x022FF674 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r0, [r5, #0xb4] - ldrb r0, [r0, #0xef] - cmp r0, #4 - moveq r2, #1 - movne r2, #0 - mov r0, r1 - and r1, r2, #0xff - bl GetMobilityTypeCheckSlip - mov r4, r0 - cmp r4, #3 - beq _022FF6BC - mov r0, r5 - bl IsFloating - cmp r0, #0 - movne r0, #2 - ldmneia sp!, {r3, r4, r5, pc} -_022FF6BC: - mov r0, r4 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end GetMobilityTypeCheckSlipAndFloating - - arm_func_start IsInvalidSpawnTile -IsInvalidSpawnTile: ; 0x022FF6C4 - stmdb sp!, {r4, lr} - mov r4, r1 - ldr r1, [r4, #0xc] - cmp r1, #0 - movne r0, #1 - ldmneia sp!, {r4, pc} - ldrh r1, [r4] - tst r1, #0x10 - movne r0, #1 - ldmneia sp!, {r4, pc} - mov r1, #0 - bl GetMobilityTypeCheckSlip - ldrh r1, [r4] - cmp r0, #3 - and r1, r1, #3 - addls pc, pc, r0, lsl #2 - b _022FF754 -_022FF708: ; jump table - b _022FF718 ; case 0 - b _022FF728 ; case 1 - b _022FF744 ; case 2 - b _022FF754 ; case 3 -_022FF718: - cmp r1, #1 - bne _022FF75C - mov r0, #0 - ldmia sp!, {r4, pc} -_022FF728: - cmp r1, #2 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r1, #1 - bne _022FF75C - mov r0, #0 - ldmia sp!, {r4, pc} -_022FF744: - cmp r1, #0 - beq _022FF75C - mov r0, #0 - ldmia sp!, {r4, pc} -_022FF754: - mov r0, #0 - ldmia sp!, {r4, pc} -_022FF75C: - mov r0, #1 - ldmia sp!, {r4, pc} - arm_func_end IsInvalidSpawnTile - - arm_func_start ov29_022FF764 -ov29_022FF764: ; 0x022FF764 - 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} - ldr r0, [r4, #0xc] - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - ldrh r0, [r4] - tst r0, #0x10 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - bl IsCurrentTilesetBackground - cmp r0, #0 - bne _022FF810 - 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} -_022FF810: - 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 _022FF888 -_022FF83C: ; jump table - b _022FF84C ; case 0 - b _022FF85C ; case 1 - b _022FF878 ; case 2 - b _022FF888 ; case 3 -_022FF84C: -#ifdef JAPAN - cmp r5, #1 -#else - cmp r4, #1 -#endif - bne _022FF890 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FF85C: -#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 _022FF890 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FF878: -#ifdef JAPAN - cmp r5, #0 -#else - cmp r4, #0 -#endif - beq _022FF890 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FF888: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FF890: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_022FF764 diff --git a/asm/overlay_29_022FF6C4.s b/asm/overlay_29_022FF6C4.s new file mode 100644 index 00000000..a65e539e --- /dev/null +++ b/asm/overlay_29_022FF6C4.s @@ -0,0 +1,174 @@ + .include "asm/macros.inc" + .include "overlay_29_022FF6C4.inc" + + .text + + arm_func_start IsInvalidSpawnTile +IsInvalidSpawnTile: ; 0x022FF6C4 + stmdb sp!, {r4, lr} + mov r4, r1 + ldr r1, [r4, #0xc] + cmp r1, #0 + movne r0, #1 + ldmneia sp!, {r4, pc} + ldrh r1, [r4] + tst r1, #0x10 + movne r0, #1 + ldmneia sp!, {r4, pc} + mov r1, #0 + bl GetMobilityTypeCheckSlip + ldrh r1, [r4] + cmp r0, #3 + and r1, r1, #3 + addls pc, pc, r0, lsl #2 + b _022FF754 +_022FF708: ; jump table + b _022FF718 ; case 0 + b _022FF728 ; case 1 + b _022FF744 ; case 2 + b _022FF754 ; case 3 +_022FF718: + cmp r1, #1 + bne _022FF75C + mov r0, #0 + ldmia sp!, {r4, pc} +_022FF728: + cmp r1, #2 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r1, #1 + bne _022FF75C + mov r0, #0 + ldmia sp!, {r4, pc} +_022FF744: + cmp r1, #0 + beq _022FF75C + mov r0, #0 + ldmia sp!, {r4, pc} +_022FF754: + mov r0, #0 + ldmia sp!, {r4, pc} +_022FF75C: + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end IsInvalidSpawnTile + + arm_func_start ov29_022FF764 +ov29_022FF764: ; 0x022FF764 + 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} + ldr r0, [r4, #0xc] + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r0, [r4] + tst r0, #0x10 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl IsCurrentTilesetBackground + cmp r0, #0 + bne _022FF810 + 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} +_022FF810: + 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 _022FF888 +_022FF83C: ; jump table + b _022FF84C ; case 0 + b _022FF85C ; case 1 + b _022FF878 ; case 2 + b _022FF888 ; case 3 +_022FF84C: +#ifdef JAPAN + cmp r5, #1 +#else + cmp r4, #1 +#endif + bne _022FF890 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FF85C: +#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 _022FF890 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FF878: +#ifdef JAPAN + cmp r5, #0 +#else + cmp r4, #0 +#endif + beq _022FF890 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FF888: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FF890: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov29_022FF764 diff --git a/include/dungeon_mobility.h b/include/dungeon_mobility.h new file mode 100644 index 00000000..81dcb9dc --- /dev/null +++ b/include/dungeon_mobility.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_DUNGEON_MOBILITY_H +#define PMDSKY_DUNGEON_MOBILITY_H + +#include "dungeon_mode.h" + +enum mobility_type GetMobilityTypeCheckSlipAndFloating(struct entity *monster, s16 species); + +#endif //PMDSKY_DUNGEON_MOBILITY_H diff --git a/main.lsf b/main.lsf index d4a849ce..4fce1e9b 100644 --- a/main.lsf +++ b/main.lsf @@ -315,6 +315,8 @@ Overlay OVY_29 Object asm/overlay_29_022FEDBC.o Object src/status_checks.o Object asm/overlay_29_022FF3F4.o + Object src/dungeon_mobility.o + Object asm/overlay_29_022FF6C4.o Object src/overlay_29_022FF898.o Object asm/overlay_29_022FF8C8.o Object src/overlay_29_023000E4.o diff --git a/src/dungeon_logic_3.c b/src/dungeon_logic_3.c index ebf4a649..87540f3d 100644 --- a/src/dungeon_logic_3.c +++ b/src/dungeon_logic_3.c @@ -1,5 +1,6 @@ #include "dungeon_logic_3.h" #include "dungeon_map_access.h" +#include "dungeon_mobility.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_util.h" #include "dungeon_util_static.h" @@ -7,7 +8,6 @@ static const u8 DIRECTIONAL_BIT_MASKS[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80}; -extern enum mobility_type GetMobilityTypeCheckSlipAndFloating(struct entity *monster, s16 species); extern enum mobility_type GetDirectionalMobilityType(struct entity* monster, enum mobility_type base_mobility, u8 direction); extern bool8 IsCurrentTilesetBackground(void); diff --git a/src/dungeon_mobility.c b/src/dungeon_mobility.c new file mode 100644 index 00000000..52627dfb --- /dev/null +++ b/src/dungeon_mobility.c @@ -0,0 +1,14 @@ +#include "dungeon_mobility.h" +#include "dungeon_util_static.h" + +extern enum mobility_type GetMobilityTypeCheckSlip(s16 species, bool8 walk_on_water); +extern bool8 IsFloating(struct entity *entity); + +enum mobility_type GetMobilityTypeCheckSlipAndFloating(struct entity *monster, s16 species) +{ + struct monster *entity_info = GetEntInfo(monster); + enum mobility_type mobility_type = GetMobilityTypeCheckSlip(species, entity_info->invisible_class_status.status == STATUS_INVISIBLE_SLIP); + if (mobility_type != MOBILITY_INTANGIBLE && IsFloating(monster)) + return MOBILITY_HOVERING; + return mobility_type; +}