From 6e0a890e51b40711d3d30657a83a4d6c04f5683b Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Wed, 12 Mar 2025 23:41:58 -0400 Subject: [PATCH 1/2] Decomped IsPositionActuallyInSight --- asm/include/overlay_29_022E37DC.inc | 72 +++-- asm/include/overlay_29_022E91A4.inc | 14 + asm/overlay_29_022E37DC.s | 395 ---------------------------- asm/overlay_29_022E91A4.s | 333 +++++++++++++++++++++++ include/dungeon_range.h | 8 + include/map.h | 6 + main.lsf | 2 + src/dungeon_range.c | 33 +++ src/dungeon_visibility.c | 3 +- 9 files changed, 428 insertions(+), 438 deletions(-) create mode 100644 asm/include/overlay_29_022E91A4.inc create mode 100644 asm/overlay_29_022E91A4.s create mode 100644 include/dungeon_range.h create mode 100644 include/map.h create mode 100644 src/dungeon_range.c diff --git a/asm/include/overlay_29_022E37DC.inc b/asm/include/overlay_29_022E37DC.inc index 155ebe9e..24566e71 100644 --- a/asm/include/overlay_29_022E37DC.inc +++ b/asm/include/overlay_29_022E37DC.inc @@ -1,6 +1,4 @@ #pragma once -.public _020AFC4C -.public abs .public AdvanceFrame .public AnimationHasMoreFrames .public CanMonsterSpawn @@ -11,9 +9,9 @@ .public CloseTextBox2 .public CreateTextBox .public DIRECTIONS_XY +.public DUNGEON_PTR .public DisplayAnimatedNumbers .public DrawTextInWindow -.public DUNGEON_PTR .public DungeonFloorToGroupFloor .public DungeonGetSpriteIndex .public DungeonGetTotalSpriteFileSize @@ -22,13 +20,13 @@ .public DungeonRngSetPrimary .public DungeonRngSetSecondary .public EntityIsValid__022E37B8 -.public EntityIsValid__022E95F4 .public FloorNumberIsEven .public GetEffectAnimationField0x19 .public GetFloorType .public GetIdleAnimationId .public GetItemCategoryVeneer .public GetKecleonIdToSpawnByFloor +.public GetLeader .public GetMonsterGenderVeneer .public GetMonsterIdFromSpawnEntry .public GetMonsterLevelFromSpawnEntry @@ -39,8 +37,6 @@ .public GetSecondFormIfValid .public GetSpriteFileSize .public GetSpriteSize -.public GetTile -.public GetVisibilityRange .public HandleSir0Translation .public InitPreprocessorArgs .public IsBossFight @@ -52,7 +48,6 @@ .public IsFullFloorFixedRoom .public IsInSpawnList .public IsItemForSpecialSpawnInBag -.public LEADER_PTR .public LoadFileFromRom .public LoadFixedRoom .public LogMessageByIdWithPopup @@ -61,6 +56,35 @@ .public MemZero .public MonsterIsType .public NeedsItemToSpawn +.public PlayEffectAnimationEntity +.public RandIntSafe +.public STATUS_ICON_ARRAY_BIDE +.public STATUS_ICON_ARRAY_BLINDED +.public STATUS_ICON_ARRAY_BURN +.public STATUS_ICON_ARRAY_CRINGE +.public STATUS_ICON_ARRAY_CURSE +.public STATUS_ICON_ARRAY_FREEZE +.public STATUS_ICON_ARRAY_INVISIBLE +.public STATUS_ICON_ARRAY_LEECH_SEED +.public STATUS_ICON_ARRAY_LONG_TOSS +.public STATUS_ICON_ARRAY_MAGNET_RISE +.public STATUS_ICON_ARRAY_MIRACLE_EYE +.public STATUS_ICON_ARRAY_MUZZLED +.public STATUS_ICON_ARRAY_REFLECT +.public STATUS_ICON_ARRAY_SLEEP +.public STATUS_ICON_ARRAY_SURE_SHOT +.public SetMinimapDataE447 +.public SetMinimapDataE448 +.public SetMonsterId +.public ShouldDisplayEntityWrapper +.public StartFadeDungeonWrapper +.public StringFromId +.public SubstitutePlaceholderStringTags +.public TOP_SCREEN_STATUS_PTR +.public UnloadFile +.public UpdateMinimap +.public UpdateWindow +.public abs .public ov10_022BDC68 .public ov10_022BDE50 .public ov10_022BEC08 @@ -129,37 +153,8 @@ .public ov29_0235354C .public ov29_02353558 .public ov29_0237C850 -.public ov29_0237C888 -.public ov29_0237C88A -.public ov29_0237C88E -.public ov29_0237C890 -.public ov29_0237C892 -.public PlayEffectAnimationEntity -.public RandIntSafe -.public SetMinimapDataE447 -.public SetMinimapDataE448 -.public SetMonsterId -.public ShouldDisplayEntityWrapper -.public StartFadeDungeonWrapper -.public STATUS_ICON_ARRAY_BIDE -.public STATUS_ICON_ARRAY_BLINDED -.public STATUS_ICON_ARRAY_BURN -.public STATUS_ICON_ARRAY_CRINGE -.public STATUS_ICON_ARRAY_CURSE -.public STATUS_ICON_ARRAY_FREEZE -.public STATUS_ICON_ARRAY_INVISIBLE -.public STATUS_ICON_ARRAY_LEECH_SEED -.public STATUS_ICON_ARRAY_LONG_TOSS -.public STATUS_ICON_ARRAY_MAGNET_RISE -.public STATUS_ICON_ARRAY_MIRACLE_EYE -.public STATUS_ICON_ARRAY_MUZZLED -.public STATUS_ICON_ARRAY_REFLECT -.public STATUS_ICON_ARRAY_SLEEP -.public STATUS_ICON_ARRAY_SURE_SHOT -.public StringFromId .public sub_0200B330 .public sub_0200B3D4 -.public sub_0201B9F8 .public sub_0201C000 .public sub_0201CF90 .public sub_0201D034 @@ -169,8 +164,3 @@ .public sub_02048400 .public sub_0204AEA0 .public sub_0204AF58 -.public SubstitutePlaceholderStringTags -.public TOP_SCREEN_STATUS_PTR -.public UnloadFile -.public UpdateMinimap -.public UpdateWindow diff --git a/asm/include/overlay_29_022E91A4.inc b/asm/include/overlay_29_022E91A4.inc new file mode 100644 index 00000000..e4b2bebd --- /dev/null +++ b/asm/include/overlay_29_022E91A4.inc @@ -0,0 +1,14 @@ +#pragma once +.public DUNGEON_PTR +.public EntityIsValid__022E95F4 +.public GetTile +.public GetVisibilityRange +.public LEADER_PTR +.public _020AFC4C +.public abs +.public ov29_0237C888 +.public ov29_0237C88A +.public ov29_0237C88E +.public ov29_0237C890 +.public ov29_0237C892 +.public sub_0201B9F8 diff --git a/asm/overlay_29_022E37DC.s b/asm/overlay_29_022E37DC.s index 47a392ac..ae99687d 100644 --- a/asm/overlay_29_022E37DC.s +++ b/asm/overlay_29_022E37DC.s @@ -7301,398 +7301,3 @@ GetChebyshevDistance: ; 0x022E908C mov r0, r4 ldmia sp!, {r3, r4, r5, pc} arm_func_end GetChebyshevDistance - - arm_func_start IsPositionActuallyInSight -IsPositionActuallyInSight: ; 0x022E90CC - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r4, r1 - mov r6, r2 - bl GetVisibilityRange - mov r5, r0 - ldrsh r0, [r7] - ldrsh r1, [r7, #2] - bl GetTile - cmp r6, #0 - ldrb ip, [r0, #7] - bne _022E9104 - cmp ip, #0xff - bne _022E913C -_022E9104: - ldrsh r1, [r7] - ldrsh r0, [r4] - sub r0, r1, r0 - bl abs - cmp r0, r5 - bgt _022E9198 - ldrsh r1, [r7, #2] - ldrsh r0, [r4, #2] - sub r0, r1, r0 - bl abs - cmp r0, r5 - bgt _022E9198 - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E913C: - ldr r0, _022E91A0 ; =DUNGEON_PTR - mov r1, #0x1c - ldr r0, [r0] - ldrsh r2, [r4] -#ifdef JAPAN - add r0, r0, #0x244 -#else - add r0, r0, #0x2e8 -#endif - add r0, r0, #0xec00 - mla r3, ip, r1, r0 - ldrsh r0, [r3, #2] - sub r0, r0, #1 - cmp r0, r2 - ldrlesh r0, [r3, #4] - ldrlesh r1, [r4, #2] - suble r0, r0, #1 - cmple r0, r1 - bgt _022E9198 - ldrsh r0, [r3, #6] - add r0, r0, #1 - cmp r0, r2 - ldrgtsh r0, [r3, #8] - addgt r0, r0, #1 - cmpgt r0, r1 - movgt r0, #1 - ldmgtia sp!, {r3, r4, r5, r6, r7, pc} -_022E9198: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022E91A0: .word DUNGEON_PTR - arm_func_end IsPositionActuallyInSight - - arm_func_start IsPositionInSight -IsPositionInSight: ; 0x022E91A4 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r5, r0 - mov r4, r1 - ldrsh r0, [r5] - ldrsh r1, [r5, #2] - mov r7, r2 - bl GetTile - ldrb r6, [r0, #7] - cmp r6, #0xff - beq _022E9230 - cmp r7, #0 - bne _022E9230 - ldr r0, _022E9294 ; =DUNGEON_PTR - mov r1, #0x1c - ldr r0, [r0] - ldrsh r2, [r4] -#ifdef JAPAN - add r0, r0, #0x244 -#else - add r0, r0, #0x2e8 -#endif - add r0, r0, #0xec00 - mla r3, r6, r1, r0 - ldrsh r0, [r3, #2] - sub r0, r0, #1 - cmp r0, r2 - ldrlesh r0, [r3, #4] - ldrlesh r1, [r4, #2] - suble r0, r0, #1 - cmple r0, r1 - bgt _022E9230 - ldrsh r0, [r3, #6] - add r0, r0, #1 - cmp r0, r2 - ldrgtsh r0, [r3, #8] - addgt r0, r0, #1 - cmpgt r0, r1 - movgt r0, #1 - ldmgtia sp!, {r3, r4, r5, r6, r7, pc} -_022E9230: - ldrsh r1, [r5, #2] - ldrsh r0, [r4, #2] - sub r0, r1, r0 - bl abs - ldrsh r2, [r5] - ldrsh r1, [r4] - mov r6, r0 - sub r0, r2, r1 - bl abs - cmp r0, r6 - movle r0, r6 - cmp r0, #2 - movgt r0, #0 - ldmgtia sp!, {r3, r4, r5, r6, r7, pc} - bne _022E928C - mov r0, r5 - mov r1, r4 - bl ov29_022E935C - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E928C: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022E9294: .word DUNGEON_PTR - arm_func_end IsPositionInSight - - arm_func_start ov29_022E9298 -ov29_022E9298: ; 0x022E9298 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r5, r0 - mov r4, r1 - ldrsh r0, [r5] - ldrsh r1, [r5, #2] - mov r7, r2 - bl GetTile - mov r6, r0 - bl GetVisibilityRange - cmp r7, #0 - ldrb r2, [r6, #7] - bne _022E92D0 - cmp r2, #0xff - bne _022E930C -_022E92D0: - ldrsh r1, [r5] - sub r1, r1, r0 - str r1, [r4] - ldrsh r1, [r5] - add r1, r1, r0 - add r1, r1, #1 - str r1, [r4, #8] - ldrsh r1, [r5, #2] - sub r1, r1, r0 - str r1, [r4, #4] - ldrsh r1, [r5, #2] - add r0, r1, r0 - add r0, r0, #1 - str r0, [r4, #0xc] - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E930C: - ldr r0, _022E9358 ; =DUNGEON_PTR - mov r1, #0x1c - ldr r0, [r0] -#ifdef JAPAN - add r0, r0, #0x244 -#else - add r0, r0, #0x2e8 -#endif - add r0, r0, #0xec00 - mla r1, r2, r1, r0 - ldrsh r0, [r1, #2] - sub r0, r0, #1 - str r0, [r4] - ldrsh r0, [r1, #6] - add r0, r0, #2 - str r0, [r4, #8] - ldrsh r0, [r1, #4] - sub r0, r0, #1 - str r0, [r4, #4] - ldrsh r0, [r1, #8] - add r0, r0, #2 - str r0, [r4, #0xc] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022E9358: .word DUNGEON_PTR - arm_func_end ov29_022E9298 - - arm_func_start ov29_022E935C -ov29_022E935C: ; 0x022E935C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r7, r1 - ldrsh r4, [r8] - ldrsh r0, [r7] - sub r0, r4, r0 - bl abs - mov r6, r0 - cmp r6, #1 - bgt _022E93A0 - ldrsh r1, [r8, #2] - ldrsh r0, [r7, #2] - sub r0, r1, r0 - bl abs - cmp r0, #1 - movle r0, #1 - ldmleia sp!, {r4, r5, r6, r7, r8, pc} -_022E93A0: - ldrsh r5, [r8, #2] - ldrsh r0, [r7, #2] - sub r0, r5, r0 - bl abs - cmp r6, r0 - movle r6, r0 - cmp r6, #2 - bne _022E9480 - mov r6, #0 - b _022E9410 -_022E93C8: - ldrsh r0, [r7] - cmp r4, r0 - addlt r4, r4, #1 - cmp r4, r0 - ldrsh r0, [r7, #2] - subgt r4, r4, #1 - cmp r5, r0 - addlt r5, r5, #1 - cmp r5, r0 - subgt r5, r5, #1 - mov r0, r4 - mov r1, r5 - bl GetTile - ldrh r0, [r0] - tst r0, #3 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - add r6, r6, #1 -_022E9410: - cmp r6, #2 - blt _022E93C8 - ldrsh r4, [r7] - ldrsh r5, [r7, #2] - mov r6, #0 - b _022E9470 -_022E9428: - ldrsh r0, [r8] - cmp r4, r0 - addlt r4, r4, #1 - cmp r4, r0 - ldrsh r0, [r8, #2] - subgt r4, r4, #1 - cmp r5, r0 - addlt r5, r5, #1 - cmp r5, r0 - subgt r5, r5, #1 - mov r0, r4 - mov r1, r5 - bl GetTile - ldrh r0, [r0] - tst r0, #3 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - add r6, r6, #1 -_022E9470: - cmp r6, #2 - blt _022E9428 - mov r0, #1 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_022E9480: - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - arm_func_end ov29_022E935C - - arm_func_start ov29_022E9488 -ov29_022E9488: ; 0x022E9488 - stmdb sp!, {r3, r4, r5, lr} - ldr ip, _022E955C ; =DUNGEON_PTR - ldr r3, _022E9560 ; =0x0001A224 - ldr r4, [ip] - add ip, r3, #2 - ldrsh r3, [r4, r3] - ldrsh r4, [r4, ip] - mvn lr, #0xf - sub r3, r0, r3 - sub r0, r1, r4 - cmp r3, lr - cmpge r0, lr - blt _022E9554 - rsb r1, lr, #0xff - cmp r3, r1 - cmplt r0, #0xd0 - bge _022E9554 - mov r1, #0xc - mul ip, r2, r1 - ldr r4, _022E9564 ; =ov29_0237C88A - ldr r5, _022E9568 ; =ov29_0237C890 - ldrh r2, [r4, ip] - sub r1, r1, #0x20c - ldrsh r5, [r5, ip] - and r1, r2, r1 - strh r1, [r4, ip] - add r1, r3, r5 - ldrh r2, [r4, ip] - and r1, r1, lr, lsr #23 - ldr r3, _022E956C ; =ov29_0237C88E - orr r1, r2, r1 - strh r1, [r4, ip] - ldr r1, _022E9570 ; =ov29_0237C892 - ldrh r4, [r3, ip] - ldrsh lr, [r1, ip] - ldr r1, _022E9574 ; =0xFFFF000F - ldr r2, _022E9578 ; =_020AFC4C - and r1, r4, r1 - strh r1, [r3, ip] - add r0, r0, lr - ldr r1, _022E957C ; =ov29_0237C888 - mov lr, r0, lsl #0x14 - ldrh r4, [r3, ip] - ldr r0, [r2] - add r1, r1, ip - orr r4, r4, lr, lsr #16 - mov r2, #0 - strh r4, [r3, ip] - bl sub_0201B9F8 - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022E9554: - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022E955C: .word DUNGEON_PTR -#ifdef JAPAN -_022E9560: .word 0x0001A180 -#else -_022E9560: .word 0x0001A224 -#endif -_022E9564: .word ov29_0237C88A -_022E9568: .word ov29_0237C890 -_022E956C: .word ov29_0237C88E -_022E9570: .word ov29_0237C892 -_022E9574: .word 0xFFFF000F -_022E9578: .word _020AFC4C -_022E957C: .word ov29_0237C888 - arm_func_end ov29_022E9488 - - arm_func_start GetLeader -GetLeader: ; 0x022E9580 - stmdb sp!, {r4, r5, r6, lr} - ldr r0, _022E95EC ; =LEADER_PTR - ldr r0, [r0] - cmp r0, #0 - ldmneia sp!, {r4, r5, r6, pc} - mov r5, #0 - ldr r4, _022E95F0 ; =DUNGEON_PTR - b _022E95DC -_022E95A0: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xa84] -#else - ldr r6, [r0, #0xb28] -#endif - mov r0, r6 - bl EntityIsValid__022E95F4 - cmp r0, #0 - ldrne r0, [r6, #0xb4] - ldrneb r0, [r0, #7] - cmpne r0, #0 - ldrne r1, _022E95EC ; =LEADER_PTR - movne r0, r6 - strne r6, [r1] - ldmneia sp!, {r4, r5, r6, pc} - add r5, r5, #1 -_022E95DC: - cmp r5, #4 - blt _022E95A0 - mov r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022E95EC: .word LEADER_PTR -_022E95F0: .word DUNGEON_PTR - arm_func_end GetLeader diff --git a/asm/overlay_29_022E91A4.s b/asm/overlay_29_022E91A4.s new file mode 100644 index 00000000..af8c26ad --- /dev/null +++ b/asm/overlay_29_022E91A4.s @@ -0,0 +1,333 @@ + .include "asm/macros.inc" + .include "overlay_29_022E91A4.inc" + + .text + + arm_func_start IsPositionInSight +IsPositionInSight: ; 0x022E91A4 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + mov r4, r1 + ldrsh r0, [r5] + ldrsh r1, [r5, #2] + mov r7, r2 + bl GetTile + ldrb r6, [r0, #7] + cmp r6, #0xff + beq _022E9230 + cmp r7, #0 + bne _022E9230 + ldr r0, _022E9294 ; =DUNGEON_PTR + mov r1, #0x1c + ldr r0, [r0] + ldrsh r2, [r4] +#ifdef JAPAN + add r0, r0, #0x244 +#else + add r0, r0, #0x2e8 +#endif + add r0, r0, #0xec00 + mla r3, r6, r1, r0 + ldrsh r0, [r3, #2] + sub r0, r0, #1 + cmp r0, r2 + ldrlesh r0, [r3, #4] + ldrlesh r1, [r4, #2] + suble r0, r0, #1 + cmple r0, r1 + bgt _022E9230 + ldrsh r0, [r3, #6] + add r0, r0, #1 + cmp r0, r2 + ldrgtsh r0, [r3, #8] + addgt r0, r0, #1 + cmpgt r0, r1 + movgt r0, #1 + ldmgtia sp!, {r3, r4, r5, r6, r7, pc} +_022E9230: + ldrsh r1, [r5, #2] + ldrsh r0, [r4, #2] + sub r0, r1, r0 + bl abs + ldrsh r2, [r5] + ldrsh r1, [r4] + mov r6, r0 + sub r0, r2, r1 + bl abs + cmp r0, r6 + movle r0, r6 + cmp r0, #2 + movgt r0, #0 + ldmgtia sp!, {r3, r4, r5, r6, r7, pc} + bne _022E928C + mov r0, r5 + mov r1, r4 + bl ov29_022E935C + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022E928C: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_022E9294: .word DUNGEON_PTR + arm_func_end IsPositionInSight + + arm_func_start ov29_022E9298 +ov29_022E9298: ; 0x022E9298 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, r0 + mov r4, r1 + ldrsh r0, [r5] + ldrsh r1, [r5, #2] + mov r7, r2 + bl GetTile + mov r6, r0 + bl GetVisibilityRange + cmp r7, #0 + ldrb r2, [r6, #7] + bne _022E92D0 + cmp r2, #0xff + bne _022E930C +_022E92D0: + ldrsh r1, [r5] + sub r1, r1, r0 + str r1, [r4] + ldrsh r1, [r5] + add r1, r1, r0 + add r1, r1, #1 + str r1, [r4, #8] + ldrsh r1, [r5, #2] + sub r1, r1, r0 + str r1, [r4, #4] + ldrsh r1, [r5, #2] + add r0, r1, r0 + add r0, r0, #1 + str r0, [r4, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022E930C: + ldr r0, _022E9358 ; =DUNGEON_PTR + mov r1, #0x1c + ldr r0, [r0] +#ifdef JAPAN + add r0, r0, #0x244 +#else + add r0, r0, #0x2e8 +#endif + add r0, r0, #0xec00 + mla r1, r2, r1, r0 + ldrsh r0, [r1, #2] + sub r0, r0, #1 + str r0, [r4] + ldrsh r0, [r1, #6] + add r0, r0, #2 + str r0, [r4, #8] + ldrsh r0, [r1, #4] + sub r0, r0, #1 + str r0, [r4, #4] + ldrsh r0, [r1, #8] + add r0, r0, #2 + str r0, [r4, #0xc] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_022E9358: .word DUNGEON_PTR + arm_func_end ov29_022E9298 + + arm_func_start ov29_022E935C +ov29_022E935C: ; 0x022E935C + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r8, r0 + mov r7, r1 + ldrsh r4, [r8] + ldrsh r0, [r7] + sub r0, r4, r0 + bl abs + mov r6, r0 + cmp r6, #1 + bgt _022E93A0 + ldrsh r1, [r8, #2] + ldrsh r0, [r7, #2] + sub r0, r1, r0 + bl abs + cmp r0, #1 + movle r0, #1 + ldmleia sp!, {r4, r5, r6, r7, r8, pc} +_022E93A0: + ldrsh r5, [r8, #2] + ldrsh r0, [r7, #2] + sub r0, r5, r0 + bl abs + cmp r6, r0 + movle r6, r0 + cmp r6, #2 + bne _022E9480 + mov r6, #0 + b _022E9410 +_022E93C8: + ldrsh r0, [r7] + cmp r4, r0 + addlt r4, r4, #1 + cmp r4, r0 + ldrsh r0, [r7, #2] + subgt r4, r4, #1 + cmp r5, r0 + addlt r5, r5, #1 + cmp r5, r0 + subgt r5, r5, #1 + mov r0, r4 + mov r1, r5 + bl GetTile + ldrh r0, [r0] + tst r0, #3 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r6, r6, #1 +_022E9410: + cmp r6, #2 + blt _022E93C8 + ldrsh r4, [r7] + ldrsh r5, [r7, #2] + mov r6, #0 + b _022E9470 +_022E9428: + ldrsh r0, [r8] + cmp r4, r0 + addlt r4, r4, #1 + cmp r4, r0 + ldrsh r0, [r8, #2] + subgt r4, r4, #1 + cmp r5, r0 + addlt r5, r5, #1 + cmp r5, r0 + subgt r5, r5, #1 + mov r0, r4 + mov r1, r5 + bl GetTile + ldrh r0, [r0] + tst r0, #3 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r6, r6, #1 +_022E9470: + cmp r6, #2 + blt _022E9428 + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_022E9480: + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} + arm_func_end ov29_022E935C + + arm_func_start ov29_022E9488 +ov29_022E9488: ; 0x022E9488 + stmdb sp!, {r3, r4, r5, lr} + ldr ip, _022E955C ; =DUNGEON_PTR + ldr r3, _022E9560 ; =0x0001A224 + ldr r4, [ip] + add ip, r3, #2 + ldrsh r3, [r4, r3] + ldrsh r4, [r4, ip] + mvn lr, #0xf + sub r3, r0, r3 + sub r0, r1, r4 + cmp r3, lr + cmpge r0, lr + blt _022E9554 + rsb r1, lr, #0xff + cmp r3, r1 + cmplt r0, #0xd0 + bge _022E9554 + mov r1, #0xc + mul ip, r2, r1 + ldr r4, _022E9564 ; =ov29_0237C88A + ldr r5, _022E9568 ; =ov29_0237C890 + ldrh r2, [r4, ip] + sub r1, r1, #0x20c + ldrsh r5, [r5, ip] + and r1, r2, r1 + strh r1, [r4, ip] + add r1, r3, r5 + ldrh r2, [r4, ip] + and r1, r1, lr, lsr #23 + ldr r3, _022E956C ; =ov29_0237C88E + orr r1, r2, r1 + strh r1, [r4, ip] + ldr r1, _022E9570 ; =ov29_0237C892 + ldrh r4, [r3, ip] + ldrsh lr, [r1, ip] + ldr r1, _022E9574 ; =0xFFFF000F + ldr r2, _022E9578 ; =_020AFC4C + and r1, r4, r1 + strh r1, [r3, ip] + add r0, r0, lr + ldr r1, _022E957C ; =ov29_0237C888 + mov lr, r0, lsl #0x14 + ldrh r4, [r3, ip] + ldr r0, [r2] + add r1, r1, ip + orr r4, r4, lr, lsr #16 + mov r2, #0 + strh r4, [r3, ip] + bl sub_0201B9F8 + mov r0, #1 + ldmia sp!, {r3, r4, r5, pc} +_022E9554: + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_022E955C: .word DUNGEON_PTR +#ifdef JAPAN +_022E9560: .word 0x0001A180 +#else +_022E9560: .word 0x0001A224 +#endif +_022E9564: .word ov29_0237C88A +_022E9568: .word ov29_0237C890 +_022E956C: .word ov29_0237C88E +_022E9570: .word ov29_0237C892 +_022E9574: .word 0xFFFF000F +_022E9578: .word _020AFC4C +_022E957C: .word ov29_0237C888 + arm_func_end ov29_022E9488 + + arm_func_start GetLeader +GetLeader: ; 0x022E9580 + stmdb sp!, {r4, r5, r6, lr} + ldr r0, _022E95EC ; =LEADER_PTR + ldr r0, [r0] + cmp r0, #0 + ldmneia sp!, {r4, r5, r6, pc} + mov r5, #0 + ldr r4, _022E95F0 ; =DUNGEON_PTR + b _022E95DC +_022E95A0: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r6, [r0, #0xa84] +#else + ldr r6, [r0, #0xb28] +#endif + mov r0, r6 + bl EntityIsValid__022E95F4 + cmp r0, #0 + ldrne r0, [r6, #0xb4] + ldrneb r0, [r0, #7] + cmpne r0, #0 + ldrne r1, _022E95EC ; =LEADER_PTR + movne r0, r6 + strne r6, [r1] + ldmneia sp!, {r4, r5, r6, pc} + add r5, r5, #1 +_022E95DC: + cmp r5, #4 + blt _022E95A0 + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_022E95EC: .word LEADER_PTR +_022E95F0: .word DUNGEON_PTR + arm_func_end GetLeader diff --git a/include/dungeon_range.h b/include/dungeon_range.h new file mode 100644 index 00000000..7308dea5 --- /dev/null +++ b/include/dungeon_range.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_DUNGEON_RANGE_H +#define PMDSKY_DUNGEON_RANGE_H + +#include "dungeon_mode.h" + +bool8 IsPositionActuallyInSight(struct position *origin, struct position *target, bool8 user_has_dropeye); + +#endif //PMDSKY_DUNGEON_RANGE_H diff --git a/include/map.h b/include/map.h new file mode 100644 index 00000000..77a49357 --- /dev/null +++ b/include/map.h @@ -0,0 +1,6 @@ +#ifndef PMDSKY_MAP_H +#define PMDSKY_MAP_H + +#define CORRIDOR_ROOM 0xFF + +#endif //PMDSKY_MAP_H diff --git a/main.lsf b/main.lsf index 477bb131..3a8012f3 100644 --- a/main.lsf +++ b/main.lsf @@ -243,6 +243,8 @@ Overlay OVY_29 Object asm/overlay_29_022E333C.o Object src/dg_effect.o Object asm/overlay_29_022E37DC.o + Object src/dungeon_range.o + Object asm/overlay_29_022E91A4.o Object src/dg_uty.o Object asm/overlay_29_022E9618.o Object src/overlay_29_022EA9EC.o diff --git a/src/dungeon_range.c b/src/dungeon_range.c new file mode 100644 index 00000000..57cc1147 --- /dev/null +++ b/src/dungeon_range.c @@ -0,0 +1,33 @@ +#include "dungeon_range.h" +#include "dungeon.h" +#include "map.h" + +extern struct dungeon *DUNGEON_PTR[]; + +extern s16 GetVisibilityRange(); +extern struct tile* GetTile(int x, int y); +extern s32 abs(s32 value); + +bool8 IsPositionActuallyInSight(struct position *origin, struct position *target, bool8 user_has_dropeye) +{ + u8 origin_room; + s16 visibility = GetVisibilityRange(); + const struct tile *tile_1; + + tile_1 = GetTile(origin->x, origin->y); + origin_room = tile_1->room; + if (user_has_dropeye || origin_room == CORRIDOR_ROOM) + { + if (abs(origin->x - target->x) <= visibility && abs(origin->y - target->y) <= visibility) + return TRUE; + } + else + { + struct room_data *origin_room_data = &DUNGEON_PTR[0]->room_data[origin_room]; + if (origin_room_data->bottom_right_corner.x - 1 <= target->x && origin_room_data->bottom_right_corner.y - 1 <= target->y && + origin_room_data->top_left_corner.x + 1 > target->x && origin_room_data->top_left_corner.y + 1 > target->y) + return TRUE; + } + + return FALSE; +} diff --git a/src/dungeon_visibility.c b/src/dungeon_visibility.c index 44d0054e..bd453fcf 100644 --- a/src/dungeon_visibility.c +++ b/src/dungeon_visibility.c @@ -1,11 +1,10 @@ #include "dungeon_visibility.h" #include "dg_object.h" #include "dungeon_pokemon_attributes_1.h" +#include "dungeon_range.h" #include "dungeon_statuses.h" #include "dungeon_util_static.h" -extern bool8 IsPositionActuallyInSight(struct position *pos1, struct position *pos2, bool8 user_has_dropeye); - bool8 CanSeeTarget(struct entity *user, struct entity *target) { if (!EntityIsValid__022E1A1C(user)) From 8305ee8a40fafc80660d2f89db30f5e3cf118624 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Wed, 12 Mar 2025 23:57:27 -0400 Subject: [PATCH 2/2] Decomped GetVisibilityRange --- ...9_022E333C.inc => overlay_29_022E335C.inc} | 0 ...ay_29_022E333C.s => overlay_29_022E335C.s} | 19 +------------------ include/dg_camera.h | 1 + main.lsf | 2 +- src/dg_camera.c | 12 ++++++++++++ src/dungeon_range.c | 2 +- 6 files changed, 16 insertions(+), 20 deletions(-) rename asm/include/{overlay_29_022E333C.inc => overlay_29_022E335C.inc} (100%) rename asm/{overlay_29_022E333C.s => overlay_29_022E335C.s} (95%) diff --git a/asm/include/overlay_29_022E333C.inc b/asm/include/overlay_29_022E335C.inc similarity index 100% rename from asm/include/overlay_29_022E333C.inc rename to asm/include/overlay_29_022E335C.inc diff --git a/asm/overlay_29_022E333C.s b/asm/overlay_29_022E335C.s similarity index 95% rename from asm/overlay_29_022E333C.s rename to asm/overlay_29_022E335C.s index f536135a..b6b709c4 100644 --- a/asm/overlay_29_022E333C.s +++ b/asm/overlay_29_022E335C.s @@ -1,25 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022E333C.inc" + .include "overlay_29_022E335C.inc" .text - arm_func_start GetVisibilityRange -GetVisibilityRange: ; 0x022E333C - ldr r0, _022E3358 ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x1a000 -#ifdef JAPAN - ldrb r0, [r0, #0x199] -#else - ldrb r0, [r0, #0x23d] -#endif - cmp r0, #0 - moveq r0, #2 - bx lr - .align 2, 0 -_022E3358: .word DUNGEON_PTR - arm_func_end GetVisibilityRange - arm_func_start ov29_022E335C ov29_022E335C: ; 0x022E335C #ifdef JAPAN diff --git a/include/dg_camera.h b/include/dg_camera.h index 992588c1..7477db2f 100644 --- a/include/dg_camera.h +++ b/include/dg_camera.h @@ -7,5 +7,6 @@ bool8 EntityIsValid__022E32E8(struct entity *entity); // Checks if a monster is holding a certain item that isn't disabled by Klutz. bool8 ItemIsActive__022E330C(struct entity *entity, enum item_id item_id); +s16 GetVisibilityRange(); #endif //PMDSKY_OVERLAY_29_022E32E8_H diff --git a/main.lsf b/main.lsf index 3a8012f3..5acfc94f 100644 --- a/main.lsf +++ b/main.lsf @@ -240,7 +240,7 @@ Overlay OVY_29 Object src/dungeon_visibility.o Object asm/overlay_29_022E2810.o Object src/dg_camera.o - Object asm/overlay_29_022E333C.o + Object asm/overlay_29_022E335C.o Object src/dg_effect.o Object asm/overlay_29_022E37DC.o Object src/dungeon_range.o diff --git a/src/dg_camera.c b/src/dg_camera.c index 8939b844..b6ee9e5f 100644 --- a/src/dg_camera.c +++ b/src/dg_camera.c @@ -1,7 +1,10 @@ #include "dg_camera.h" +#include "dungeon.h" #include "dungeon_items.h" #include "dungeon_pokemon_attributes.h" +extern struct dungeon *DUNGEON_PTR[]; + // file starts at 0x022e26b68 bool8 EntityIsValid__022E32E8(struct entity *entity) @@ -19,3 +22,12 @@ bool8 ItemIsActive__022E330C(struct entity *entity, enum item_id item_id) return HasHeldItem(entity, item_id); } + +s16 GetVisibilityRange() +{ + s16 visibility_range = DUNGEON_PTR[0]->display_data.visibility_range; + if (visibility_range == 0) + return 2; + + return visibility_range; +} diff --git a/src/dungeon_range.c b/src/dungeon_range.c index 57cc1147..4235b605 100644 --- a/src/dungeon_range.c +++ b/src/dungeon_range.c @@ -1,10 +1,10 @@ #include "dungeon_range.h" +#include "dg_camera.h" #include "dungeon.h" #include "map.h" extern struct dungeon *DUNGEON_PTR[]; -extern s16 GetVisibilityRange(); extern struct tile* GetTile(int x, int y); extern s32 abs(s32 value);