diff --git a/asm/include/overlay_29_022E1AD4.inc b/asm/include/overlay_29_022E1AD4.inc index cadb7834..f64eab0b 100644 --- a/asm/include/overlay_29_022E1AD4.inc +++ b/asm/include/overlay_29_022E1AD4.inc @@ -1,48 +1,22 @@ #pragma once -.public abs -.public CanSeeInvisibleMonsters -.public DrawMinimapTile .public DUNGEON_PTR .public DungeonGetSpriteIndex .public EntityIsValid__022E1A1C -.public EntityIsValid__022E32E8 -.public GetForcedLossReason .public GetIdleAnimationId .public GetMonsterApparentId -.public GetMonsterName .public GetSpriteSize .public GetTileSafe .public HasDropeyeStatus .public HiddenStairsPresent -.public IsBlinded .public IsPositionActuallyInSight -.public IsPositionInSight -.public ItemIsActive__022E330C +.public PopulateActiveMonsterPtrs +.public SECONDARY_TERRAIN_TYPES .public ov29_022DE954 .public ov29_022DE9F8 .public ov29_022DEA10 .public ov29_022DEA1C -.public ov29_022E34C8 -.public ov29_022E3534 -.public ov29_022E3A58 -.public ov29_022ED82C -.public ov29_022EDF7C -.public ov29_0230040C -.public ov29_023047DC +.public ov29_022E2CA0 +.public ov29_022E2D3C .public ov29_02304830 -.public ov29_02304954 -.public ov29_0233711C -.public ov29_023372A4 -.public ov29_02344BA8 -.public ov29_0234B034 .public ov29_0237C754 .public ov29_0237C79C -.public ov29_0237C84C -.public SECONDARY_TERRAIN_TYPES -.public strcpy -.public StringFromId -.public sub_02009194 -.public sub_020091B0 -.public TeamMemberHasEnabledIqSkill -.public UpdateMinimap -.public UpdateTrapsVisibility diff --git a/asm/include/overlay_29_022E2810.inc b/asm/include/overlay_29_022E2810.inc new file mode 100644 index 00000000..db87dbf6 --- /dev/null +++ b/asm/include/overlay_29_022E2810.inc @@ -0,0 +1,34 @@ +#pragma once +.public CanSeeInvisibleMonsters +.public DUNGEON_PTR +.public DrawMinimapTile +.public EntityIsValid__022E1A1C +.public EntityIsValid__022E32E8 +.public GetForcedLossReason +.public GetMonsterName +.public HasDropeyeStatus +.public IsBlinded +.public IsPositionActuallyInSight +.public IsPositionInSight +.public ItemIsActive__022E330C +.public StringFromId +.public TeamMemberHasEnabledIqSkill +.public UpdateMinimap +.public UpdateTrapsVisibility +.public abs +.public ov29_022E34C8 +.public ov29_022E3534 +.public ov29_022E3A58 +.public ov29_022ED82C +.public ov29_022EDF7C +.public ov29_0230040C +.public ov29_023047DC +.public ov29_02304954 +.public ov29_0233711C +.public ov29_023372A4 +.public ov29_02344BA8 +.public ov29_0234B034 +.public ov29_0237C84C +.public strcpy +.public sub_02009194 +.public sub_020091B0 diff --git a/asm/overlay_29_022E1AD4.s b/asm/overlay_29_022E1AD4.s index acc0f163..f98f609c 100644 --- a/asm/overlay_29_022E1AD4.s +++ b/asm/overlay_29_022E1AD4.s @@ -1068,972 +1068,3 @@ ov29_022E273C: ; 0x022E273C .align 2, 0 _022E2748: .word ShouldDisplayEntity arm_func_end ov29_022E273C - - arm_func_start CanSeeTarget -CanSeeTarget: ; 0x022E274C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl EntityIsValid__022E1A1C - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r4 - bl EntityIsValid__022E1A1C - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #0x20] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r0, [r4] - cmp r0, #1 - bne _022E27F4 - ldr r0, [r5] - cmp r0, #1 - bne _022E27E0 - mov r0, r5 - bl CanSeeInvisibleMonsters - cmp r0, #0 - ldreq r0, [r4, #0xb4] - ldreqb r0, [r0, #0xef] - cmpeq r0, #1 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r5 - mov r1, #1 - bl IsBlinded - cmp r0, #0 - beq _022E27F4 - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} -_022E27E0: - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #0xef] - cmp r0, #1 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} -_022E27F4: - mov r0, r5 - bl HasDropeyeStatus - mov r2, r0 - add r0, r5, #4 - add r1, r4, #4 - bl IsPositionActuallyInSight - ldmia sp!, {r3, r4, r5, pc} - arm_func_end CanSeeTarget - - arm_func_start CanTargetEntity -CanTargetEntity: ; 0x022E2810 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl EntityIsValid__022E1A1C - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r4 - bl EntityIsValid__022E1A1C - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #0x20] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldr r0, [r4] - cmp r0, #1 - bne _022E28B8 - ldr r0, [r5] - cmp r0, #1 - bne _022E28A4 - mov r0, r5 - bl CanSeeInvisibleMonsters - cmp r0, #0 - ldreq r0, [r4, #0xb4] - ldreqb r0, [r0, #0xef] - cmpeq r0, #1 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r5 - mov r1, #1 - bl IsBlinded - cmp r0, #0 - beq _022E28B8 - mov r0, #0 - ldmia sp!, {r3, r4, r5, pc} -_022E28A4: - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #0xef] - cmp r0, #1 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} -_022E28B8: - mov r0, r5 - bl HasDropeyeStatus - mov r2, r0 - add r0, r5, #4 - add r1, r4, #4 - bl IsPositionInSight - ldmia sp!, {r3, r4, r5, pc} - arm_func_end CanTargetEntity - - arm_func_start ov29_022E28D4 -ov29_022E28D4: ; 0x022E28D4 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl EntityIsValid__022E1A1C - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r4 - bl EntityIsValid__022E1A1C - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - ldrb r0, [r4, #0x20] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r5 - bl HasDropeyeStatus - mov r2, r0 - add r0, r5, #4 - add r1, r4, #4 - bl IsPositionActuallyInSight - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_022E28D4 - - arm_func_start ov29_022E2930 -ov29_022E2930: ; 0x022E2930 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl HasDropeyeStatus - mov r2, r0 - mov r1, r4 - add r0, r5, #4 - bl IsPositionActuallyInSight - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_022E2930 - - arm_func_start CanTargetPosition -CanTargetPosition: ; 0x022E2954 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl HasDropeyeStatus - mov r2, r0 - mov r1, r4 - add r0, r5, #4 - bl IsPositionInSight - ldmia sp!, {r3, r4, r5, pc} - arm_func_end CanTargetPosition - - arm_func_start PopulateActiveMonsterPtrs -PopulateActiveMonsterPtrs: ; 0x022E2978 -#ifdef JAPAN -#define OV29_022E2978_OFFSET -0xA4 -#else -#define OV29_022E2978_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r5, #0 - ldr r6, _022E2A34 ; =DUNGEON_PTR - mov r4, r5 -_022E2988: - ldr r0, [r6] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb28 + OV29_022E2978_OFFSET] - mov r0, r7 - bl EntityIsValid__022E1A1C - cmp r0, #0 - ldrne r0, [r6] - add r4, r4, #1 - addne r0, r0, r5, lsl #2 - addne r0, r0, #0x12000 - strne r7, [r0, #0xb78 + OV29_022E2978_OFFSET] - addne r5, r5, #1 - cmp r4, #4 - blt _022E2988 - ldr r6, _022E2A34 ; =DUNGEON_PTR - mov r4, #0 -_022E29CC: - ldr r0, [r6] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb38 + OV29_022E2978_OFFSET] - mov r0, r7 - bl EntityIsValid__022E1A1C - cmp r0, #0 - ldrne r0, [r6] - add r4, r4, #1 - addne r0, r0, r5, lsl #2 - addne r0, r0, #0x12000 - strne r7, [r0, #0xb78 + OV29_022E2978_OFFSET] - addne r5, r5, #1 - cmp r4, #0x10 - blt _022E29CC - mov r2, #0 - ldr r1, _022E2A34 ; =DUNGEON_PTR - b _022E2A28 -_022E2A14: - ldr r0, [r1] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - str r2, [r0, #0xb78 + OV29_022E2978_OFFSET] - add r5, r5, #1 -_022E2A28: - cmp r5, #0x14 - blt _022E2A14 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022E2A34: .word DUNGEON_PTR - arm_func_end PopulateActiveMonsterPtrs - - arm_func_start GetTeamMemberIndex -GetTeamMemberIndex: ; 0x022E2A38 - ldr r1, _022E2A74 ; =DUNGEON_PTR - mov r2, #0 - ldr r3, [r1] - b _022E2A64 -_022E2A48: - add r1, r3, r2, lsl #2 - add r1, r1, #0x12000 -#ifdef JAPAN - ldr r1, [r1, #0xa84] -#else - ldr r1, [r1, #0xb28] -#endif - cmp r0, r1 - moveq r0, r2 - bxeq lr - add r2, r2, #1 -_022E2A64: - cmp r2, #4 - blt _022E2A48 - mvn r0, #0 - bx lr - .align 2, 0 -_022E2A74: .word DUNGEON_PTR - arm_func_end GetTeamMemberIndex - - arm_func_start ov29_022E2A78 -ov29_022E2A78: ; 0x022E2A78 - stmdb sp!, {r4, lr} - ldr r2, [r1] - mov r4, r0 - cmp r2, #1 - beq _022E2AA0 - cmp r2, #2 - beq _022E2AAC - cmp r2, #3 - ldmeqia sp!, {r4, pc} - b _022E2ABC -_022E2AA0: - ldr r1, [r1, #0xb4] - bl GetMonsterName - ldmia sp!, {r4, pc} -_022E2AAC: - ldr r1, [r1, #0xb4] - ldrb r1, [r1] - bl ov29_022ED82C - ldmia sp!, {r4, pc} -_022E2ABC: - ldr r0, _022E2AD4 ; =0x00000A42 - bl StringFromId - mov r1, r0 - mov r0, r4 - bl strcpy - ldmia sp!, {r4, pc} - .align 2, 0 -#ifdef JAPAN -_022E2AD4: .word 0x00000B42 -#else -_022E2AD4: .word 0x00000A42 -#endif - arm_func_end ov29_022E2A78 - - arm_func_start SubstitutePlaceholderStringTags -SubstitutePlaceholderStringTags: ; 0x022E2AD8 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r6, r1 - mov r7, r0 - mov r5, r2 - bl ov29_0234B034 - ldr r1, [r6] - mov r4, r0 - cmp r1, #1 - beq _022E2B10 - cmp r1, #2 - beq _022E2B3C - cmp r1, #3 - beq _022E2B2C - b _022E2B50 -_022E2B10: - mov r1, #0 - str r1, [sp] - ldr r2, [r6, #0xb4] - mov r1, r7 - mov r3, r5 - bl ov29_0230040C - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E2B2C: - ldr r2, [r6, #0xb4] - mov r1, r7 - bl ov29_02344BA8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E2B3C: - ldr r2, [r6, #0xb4] - mov r1, r7 - ldrb r2, [r2] - bl ov29_022EDF7C - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022E2B50: - ldr r0, _022E2B64 ; =0x00000A42 - bl StringFromId - add r1, r4, r7, lsl #2 - str r0, [r1, #0x38] - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -#ifdef JAPAN -_022E2B64: .word 0x00000B42 -#else -_022E2B64: .word 0x00000A42 -#endif - arm_func_end SubstitutePlaceholderStringTags - -#ifdef EUROPE - arm_func_start ov29_022E34A8_EU -ov29_022E34A8_EU: ; 0x022E34A8 - stmdb sp!, {r3, lr} - bl EntityIsValid__022E1A1C - cmp r0, #0 - beq _022E34DC - ldr r0, _022E34E8 ; =0x02354138 - ldr r0, [r0] - ldrb r0, [r0, #8] - cmp r0, #0 - bne _022E34DC - bl GetForcedLossReason - cmp r0, #1 - movne r0, #1 - bne _022E34E0 -_022E34DC: - mov r0, #0 -_022E34E0: - and r0, r0, #0xff - ldmia sp!, {r3, pc} - .align 2, 0 -_022E34E8: .word 0x02354138 - arm_func_end ov29_022E34A8_EU -#endif - - arm_func_start ov29_022E2B68 -ov29_022E2B68: ; 0x022E2B68 -#ifdef JAPAN -#define OV29_022E2B68_OFFSET -0xA4 -#else -#define OV29_022E2B68_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, lr} - ldr r1, _022E2C5C ; =DUNGEON_PTR - movs r5, r0 - ldr r2, [r1] - mov r1, #0 - add r0, r2, #0x21c + OV29_022E2B68_OFFSET - add r4, r0, #0x1a000 - strh r1, [r4, #8] - ldr r0, _022E2C60 ; =0x0001A21C - strh r1, [r4, #0xa] - strh r1, [r2, r0] - strh r1, [r4, #2] - strh r1, [r4, #0xc] - strh r1, [r4, #0xe] - strh r1, [r4, #4] - strh r1, [r4, #6] - str r1, [r4, #0x14] - strb r1, [r4, #0x2f] - mov r0, #1 - strb r0, [r4, #0x30] - strb r0, [r4, #0x31] - str r1, [r4, #0x18] - str r1, [r4, #0x1c] - bne _022E2BF4 - strb r1, [r4, #0x22] - strb r1, [r4, #0x29] - strb r1, [r4, #0x28] - strb r1, [r4, #0x26] - strb r1, [r4, #0x2a] - strb r1, [r4, #0x27] - strb r1, [r4, #0x23] - strb r1, [r4, #0x24] - strb r1, [r4, #0x32] - strb r1, [r4, #0x33] - strb r1, [r4, #0x34] -_022E2BF4: - mov r1, #0 - str r1, [r4, #0x10] - mov r0, #3 - strb r0, [r4, #0x20] - strb r1, [r4, #0x35] - strb r1, [r4, #0x2b] - strb r1, [r4, #0x36] - strb r1, [r4, #0x37] - strb r1, [r4, #0x2d] - mov r0, #1 - strb r0, [r4, #0x2e] - bl ov29_022E2C6C - ldr r1, _022E2C64 ; =0x0000FFFF - ldr r0, _022E2C68 ; =ov29_0237C84C - cmp r5, #0 - str r1, [r0] - ldmneia sp!, {r3, r4, r5, pc} - ldr r0, _022E2C5C ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x28000 - ldrb r0, [r0, #0x6c8 + OV29_022E2B68_OFFSET] - ands r0, r0, #3 - strb r0, [r4, #0x21] - moveq r0, #1 - streqb r0, [r4, #0x24] - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022E2C5C: .word DUNGEON_PTR -_022E2C60: .word 0x0001A21C + OV29_022E2B68_OFFSET -_022E2C64: .word 0x0000FFFF -_022E2C68: .word ov29_0237C84C - arm_func_end ov29_022E2B68 - - arm_func_start ov29_022E2C6C -ov29_022E2C6C: ; 0x022E2C6C - ldr r0, _022E2C9C ; =DUNGEON_PTR - mvn r1, #0 - ldr r0, [r0] -#ifdef JAPAN - add r0, r0, #0x178 -#else - add r0, r0, #0x21c -#endif - add r0, r0, #0x1a000 - strh r1, [r0, #0x3c] - strh r1, [r0, #0x3e] - strh r1, [r0, #0x40] - strh r1, [r0, #0x42] - strh r1, [r0, #0x38] - strh r1, [r0, #0x3a] - bx lr - .align 2, 0 -_022E2C9C: .word DUNGEON_PTR - arm_func_end ov29_022E2C6C - - arm_func_start ov29_022E2CA0 -ov29_022E2CA0: ; 0x022E2CA0 - stmdb sp!, {r4, r5, r6, lr} - ldr r1, _022E2D34 ; =DUNGEON_PTR - mov r4, r0 - ldr r3, [r1] - ldr r0, _022E2D38 ; =0x0001A21C - ldrsh r1, [r4] - ldrsh r2, [r3, r0] -#ifdef JAPAN - add r0, r3, #0x178 -#else - add r0, r3, #0x21c -#endif - add r5, r0, #0x1a000 - sub r0, r2, r1 - ldr r6, [r5, #0x10] - bl abs - cmp r0, #6 - bgt _022E2D2C - ldrsh r1, [r5, #2] - ldrsh r0, [r4, #2] - sub r0, r1, r0 - bl abs - cmp r0, #5 - bgt _022E2D2C - mov r0, r5 - bl ov29_022E3534 - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r4, r5, r6, pc} - cmp r6, #0 - moveq r0, #1 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r6 - bl HasDropeyeStatus - mov r2, r0 - mov r0, r5 - mov r1, r4 - bl IsPositionActuallyInSight - ldmia sp!, {r4, r5, r6, pc} -_022E2D2C: - mov r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022E2D34: .word DUNGEON_PTR -#ifdef JAPAN -_022E2D38: .word 0x0001A178 -#else -_022E2D38: .word 0x0001A21C -#endif - arm_func_end ov29_022E2CA0 - - arm_func_start ov29_022E2D3C -ov29_022E2D3C: ; 0x022E2D3C - stmdb sp!, {r4, r5, r6, lr} - ldr r1, _022E2DD0 ; =DUNGEON_PTR - mov r4, r0 - ldr r3, [r1] - ldr r0, _022E2DD4 ; =0x0001A21C - ldrsh r1, [r4] - ldrsh r2, [r3, r0] -#ifdef JAPAN - add r0, r3, #0x178 -#else - add r0, r3, #0x21c -#endif - add r5, r0, #0x1a000 - sub r0, r2, r1 - ldr r6, [r5, #0x10] - bl abs - cmp r0, #6 - bgt _022E2DC8 - ldrsh r1, [r5, #2] - ldrsh r0, [r4, #2] - sub r0, r1, r0 - bl abs - cmp r0, #6 - bgt _022E2DC8 - mov r0, r5 - bl ov29_022E3534 - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r4, r5, r6, pc} - cmp r6, #0 - moveq r0, #1 - ldmeqia sp!, {r4, r5, r6, pc} - mov r0, r6 - bl HasDropeyeStatus - mov r2, r0 - mov r0, r5 - mov r1, r4 - bl IsPositionActuallyInSight - ldmia sp!, {r4, r5, r6, pc} -_022E2DC8: - mov r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_022E2DD0: .word DUNGEON_PTR -#ifdef JAPAN -_022E2DD4: .word 0x0001A178 -#else -_022E2DD4: .word 0x0001A21C -#endif - arm_func_end ov29_022E2D3C - -#ifndef JAPAN - arm_func_start UpdateMapSurveyorFlag -UpdateMapSurveyorFlag: ; 0x022E2DD8 -#ifdef EUROPE - stmdb sp!, {r4, lr} - ldr r1, _022E2DF8 ; =DUNGEON_PTR - mov r0, #0x41 - ldr r1, [r1] - add r1, r1, #0x1a000 - ldrb r4, [r1, #0x241] - bl TeamMemberHasEnabledIqSkill - ldr r2, _022E2DF8 ; =DUNGEON_PTR - ldr r1, [r2] - add r1, r1, #0x1a000 - strb r0, [r1, #0x241] - ldr r0, [r2] - add r0, r0, #0x1a000 - ldrb r0, [r0, #0x241] - cmp r4, r0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, pc} -#else - stmdb sp!, {r3, lr} - mov r0, #0x41 - bl TeamMemberHasEnabledIqSkill - ldr r1, _022E2DF8 ; =DUNGEON_PTR - ldr r1, [r1] - add r1, r1, #0x1a000 - strb r0, [r1, #0x241] - ldmia sp!, {r3, pc} -#endif - .align 2, 0 -_022E2DF8: .word DUNGEON_PTR - arm_func_end UpdateMapSurveyorFlag -#endif - - arm_func_start ov29_022E2DFC -ov29_022E2DFC: ; 0x022E2DFC - stmdb sp!, {r3, lr} - ldr r1, _022E2E50 ; =DUNGEON_PTR - cmp r0, #0 - ldr r1, [r1] -#ifdef JAPAN - add r1, r1, #0x178 -#else - add r1, r1, #0x21c -#endif - add r1, r1, #0x1a000 - str r0, [r1, #0x10] - moveq r0, #0 - streqb r0, [r1, #0x2f] - beq _022E2E40 - ldr r0, [r0, #0xb4] - ldrb r0, [r0, #7] - cmp r0, #0 - moveq r0, #0 - streqb r0, [r1, #0x2f] - movne r0, #1 - strneb r0, [r1, #0x2f] -_022E2E40: - mov r0, #0 - bl UpdateCamera - bl ov29_022E2C6C - ldmia sp!, {r3, pc} - .align 2, 0 -_022E2E50: .word DUNGEON_PTR - arm_func_end ov29_022E2DFC - - arm_func_start PointCameraToMonster -PointCameraToMonster: ; 0x022E2E54 - stmdb sp!, {r4, lr} - ldr r2, _022E2EC0 ; =DUNGEON_PTR - mov r4, r1 - ldr r1, [r2] - cmp r0, #0 -#ifdef JAPAN - add r1, r1, #0x178 -#else - add r1, r1, #0x21c -#endif - add r2, r1, #0x1a000 - moveq r1, #0 - streqb r1, [r2, #0x2f] - beq _022E2E98 - ldr r1, [r0, #0xb4] - ldrb r1, [r1, #7] - cmp r1, #0 - moveq r1, #0 - streqb r1, [r2, #0x2f] - movne r1, #1 - strneb r1, [r2, #0x2f] -_022E2E98: - str r0, [r2, #0x10] - mov r0, #0 - bl UpdateCamera - bl ov29_022E2C6C - bl ov29_02304954 - cmp r4, #0 - ldmeqia sp!, {r4, pc} - bl UpdateTrapsVisibility - bl UpdateMinimap - ldmia sp!, {r4, pc} - .align 2, 0 -_022E2EC0: .word DUNGEON_PTR - arm_func_end PointCameraToMonster - - arm_func_start UpdateCamera -UpdateCamera: ; 0x022E2EC4 -#ifdef JAPAN -#define UPDATE_CAMERA_OFFSET -0xA4 -#else -#define UPDATE_CAMERA_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x10 - ldr r1, _022E32DC ; =DUNGEON_PTR - str r0, [sp] - ldr r0, [r1] - cmp r0, #0 - beq _022E32D4 - add r0, r0, #0x21c + UPDATE_CAMERA_OFFSET - add r4, r0, #0x1a000 - ldr r5, [r4, #0x10] - cmp r5, #0 - beq _022E32D0 - mov r0, r5 - bl EntityIsValid__022E32E8 - cmp r0, #0 - beq _022E32D0 - ldrb r8, [r4, #0x32] - ldrb sb, [r4, #0x33] - ldrh r0, [r4, #8] - ldr sl, [r5, #0xb4] - mov r6, #0 - strh r0, [r4, #0xc] - ldrh r2, [r4, #0xa] - mov r0, r5 - mov r1, #0x18 - strh r2, [r4, #0xe] - ldrh r2, [r4] - mov fp, r6 - mov r7, r6 - strh r2, [r4, #4] - ldrh r2, [r4, #2] - str r6, [sp, #4] - strh r2, [r4, #6] - ldrsh r2, [r5, #4] - strh r2, [r4] - ldrsh r2, [r5, #6] - strh r2, [r4, #2] - ldr r2, [r5, #0xc] - mov r2, r2, asr #8 - sub r2, r2, #0x80 - strh r2, [r4, #8] - ldr r2, [r5, #0x10] - mov r2, r2, asr #8 - sub r2, r2, #0x6c - strh r2, [r4, #0xa] - ldrb r2, [r4, #0x27] - str r2, [sp, #0xc] - ldrb r2, [r4, #0x26] - str r2, [sp, #8] - bl ItemIsActive__022E330C - cmp r0, #0 - ldrneb r0, [sl, #7] - mov r1, #0 - cmpne r0, #0 - movne r0, #1 - strneb r0, [r4, #0x26] - strneb r0, [r4, #0x27] - ldreqb r0, [sl, #0xf9] - streqb r0, [r4, #0x26] - ldreqb r0, [sl, #0xfa] - streqb r0, [r4, #0x27] - strb r1, [r4, #0x32] - strb r1, [r4, #0x33] - mov r0, r5 - mov r1, #0xe - bl ItemIsActive__022E330C - cmp r0, #0 - ldrneb r0, [sl, #7] - cmpne r0, #0 - movne r0, #1 - strneb r0, [r4, #0x32] - strneb r0, [r4, #0x33] - ldrb r1, [r4, #0x27] - ldr r0, [sp, #0xc] - cmp r0, r1 - ldreqb r0, [r4, #0x32] - ldrb r1, [r4, #0x26] - cmpeq r8, r0 - ldr r0, [sp, #8] - movne r6, #1 - cmp r0, r1 - ldreqb r0, [r4, #0x33] - cmpeq sb, r0 - ldrb r0, [sl, #0xfb] - movne fp, #1 - strb r0, [r4, #0x2a] - ldrb r0, [r4, #0x2d] - ldrb r8, [r4, #0x22] - cmp r0, #0 - bne _022E309C - mov r0, r5 - mov r1, #1 - bl IsBlinded - cmp r0, #0 - movne r0, #1 - movne r2, #0xe - strneb r0, [r4, #0x22] - moveq r2, #0 - ldr r0, _022E32E0 ; =ov29_0237C84C - streqb r2, [r4, #0x22] - ldr r1, [r0] - cmp r1, r2 - beq _022E30A8 - str r2, [r0] - cmp r2, #0xe - mov r0, #2 - mov r1, #0 - bne _022E3088 - bl sub_02009194 - mov r0, #3 - mov r1, #0 - bl sub_02009194 - b _022E30A8 -_022E3088: - bl sub_020091B0 - mov r0, #3 - mov r1, #0 - bl sub_020091B0 - b _022E30A8 -_022E309C: - ldr r1, _022E32E4 ; =0x0000FFFF - ldr r0, _022E32E0 ; =ov29_0237C84C - str r1, [r0] -_022E30A8: - ldrb r0, [r4, #0x22] - ldrb r1, [r4, #0x29] - cmp r8, r0 - ldrb r0, [sl, #0xf1] - movne r7, #1 - cmp r0, #2 - moveq r0, #1 - movne r0, #0 - strb r0, [r4, #0x29] - ldrb r0, [r4, #0x29] - cmp r1, r0 - ldreq r0, _022E32DC ; =DUNGEON_PTR - ldreq r0, [r0] - addeq r0, r0, #0x2c000 - ldreqb r0, [r0, #0xb10 + UPDATE_CAMERA_OFFSET] - cmpeq r0, #0 - beq _022E3108 - bl ov29_023047DC - ldr r0, _022E32DC ; =DUNGEON_PTR - mov r1, #0 - ldr r0, [r0] - mov r7, #1 - add r0, r0, #0x2c000 - strb r1, [r0, #0xb10 + UPDATE_CAMERA_OFFSET] -_022E3108: - mov r0, r5 - ldrb r8, [r4, #0x28] - bl CanSeeInvisibleMonsters - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - strb r0, [r4, #0x28] - ldrb r0, [r4, #0x28] - cmp r8, r0 - movne r7, #1 - strne r7, [sp, #4] - ldrb r8, [r4, #0x34] - mov r0, r5 - bl HasDropeyeStatus - and r1, r0, #0xff - cmp r8, r1 - strb r0, [r4, #0x34] - movne r7, #1 - strne r7, [sp, #4] - ldr r0, [sp, #4] - cmp r0, #0 - beq _022E3168 - bl UpdateTrapsVisibility - bl UpdateMinimap -_022E3168: - cmp r7, #0 - beq _022E3178 - mov r0, #0 - bl ov29_022E3A58 -_022E3178: - ldr r0, [sp] - cmp r0, #0 - beq _022E3228 - ldrb r0, [r4, #0x2c] - cmp r0, #0 - bne _022E3228 - ldrsh r5, [r4, #8] - ldrsh r7, [r4, #0xc] - sub r0, r7, r5 - bl abs - cmp r0, #8 - bge _022E31C0 - ldrsh r1, [r4, #0xe] - ldrsh r0, [r4, #0xa] - sub r0, r1, r0 - bl abs - cmp r0, #8 - blt _022E31D0 -_022E31C0: - bl UpdateTrapsVisibility - mov r0, #1 - strb r0, [r4, #0x2c] - b _022E3228 -_022E31D0: - cmp r7, r5 - bge _022E31E8 - mov r0, #0xff - mov r1, #0 - bl ov29_0233711C - b _022E31F8 -_022E31E8: - ble _022E31F8 - mov r0, #0 - mov r1, r0 - bl ov29_0233711C -_022E31F8: - ldrsh r1, [r4, #0xa] - ldrsh r0, [r4, #0xe] - cmp r0, r1 - bge _022E3218 - mov r0, #0 - mov r1, #0xc0 - bl ov29_023372A4 - b _022E3228 -_022E3218: - ble _022E3228 - mov r0, #0 - mov r1, r0 - bl ov29_023372A4 -_022E3228: - cmp fp, #0 - ldreqsh r1, [r4] - ldreqsh r0, [r4, #4] - cmpeq r1, r0 - ldreqsh r1, [r4, #2] - ldreqsh r0, [r4, #6] - cmpeq r1, r0 - beq _022E3288 - ldr r4, _022E32DC ; =DUNGEON_PTR - mov r5, #0 -_022E3250: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr r7, [r0, #0xb78 + UPDATE_CAMERA_OFFSET] - mov r0, r7 - bl EntityIsValid__022E32E8 - cmp r0, #0 - beq _022E327C - ldrsh r0, [r7, #4] - ldrsh r1, [r7, #6] - bl DrawMinimapTile -_022E327C: - add r5, r5, #1 - cmp r5, #0x14 - blt _022E3250 -_022E3288: - cmp r6, #0 - beq _022E32D0 - ldr r4, _022E32DC ; =DUNGEON_PTR - mov r5, #0 -_022E3298: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 - ldr r6, [r0, #0xbc8 + UPDATE_CAMERA_OFFSET] - mov r0, r6 - bl EntityIsValid__022E32E8 - cmp r0, #0 - beq _022E32C4 - ldrsh r0, [r6, #4] - ldrsh r1, [r6, #6] - bl DrawMinimapTile -_022E32C4: - add r5, r5, #1 - cmp r5, #0x40 - blt _022E3298 -_022E32D0: - bl ov29_022E34C8 -_022E32D4: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022E32DC: .word DUNGEON_PTR -_022E32E0: .word ov29_0237C84C -_022E32E4: .word 0x0000FFFF - arm_func_end UpdateCamera diff --git a/asm/overlay_29_022E2810.s b/asm/overlay_29_022E2810.s new file mode 100644 index 00000000..931e8a34 --- /dev/null +++ b/asm/overlay_29_022E2810.s @@ -0,0 +1,918 @@ + .include "asm/macros.inc" + .include "overlay_29_022E2810.inc" + + .text + + arm_func_start CanTargetEntity +CanTargetEntity: ; 0x022E2810 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl EntityIsValid__022E1A1C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r4 + bl EntityIsValid__022E1A1C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrb r0, [r4, #0x20] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldr r0, [r4] + cmp r0, #1 + bne _022E28B8 + ldr r0, [r5] + cmp r0, #1 + bne _022E28A4 + mov r0, r5 + bl CanSeeInvisibleMonsters + cmp r0, #0 + ldreq r0, [r4, #0xb4] + ldreqb r0, [r0, #0xef] + cmpeq r0, #1 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + mov r1, #1 + bl IsBlinded + cmp r0, #0 + beq _022E28B8 + mov r0, #0 + ldmia sp!, {r3, r4, r5, pc} +_022E28A4: + ldr r0, [r4, #0xb4] + ldrb r0, [r0, #0xef] + cmp r0, #1 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} +_022E28B8: + mov r0, r5 + bl HasDropeyeStatus + mov r2, r0 + add r0, r5, #4 + add r1, r4, #4 + bl IsPositionInSight + ldmia sp!, {r3, r4, r5, pc} + arm_func_end CanTargetEntity + + arm_func_start ov29_022E28D4 +ov29_022E28D4: ; 0x022E28D4 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl EntityIsValid__022E1A1C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r4 + bl EntityIsValid__022E1A1C + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + ldrb r0, [r4, #0x20] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r0, r5 + bl HasDropeyeStatus + mov r2, r0 + add r0, r5, #4 + add r1, r4, #4 + bl IsPositionActuallyInSight + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov29_022E28D4 + + arm_func_start ov29_022E2930 +ov29_022E2930: ; 0x022E2930 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl HasDropeyeStatus + mov r2, r0 + mov r1, r4 + add r0, r5, #4 + bl IsPositionActuallyInSight + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov29_022E2930 + + arm_func_start CanTargetPosition +CanTargetPosition: ; 0x022E2954 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl HasDropeyeStatus + mov r2, r0 + mov r1, r4 + add r0, r5, #4 + bl IsPositionInSight + ldmia sp!, {r3, r4, r5, pc} + arm_func_end CanTargetPosition + + arm_func_start PopulateActiveMonsterPtrs +PopulateActiveMonsterPtrs: ; 0x022E2978 +#ifdef JAPAN +#define OV29_022E2978_OFFSET -0xA4 +#else +#define OV29_022E2978_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r5, #0 + ldr r6, _022E2A34 ; =DUNGEON_PTR + mov r4, r5 +_022E2988: + ldr r0, [r6] + add r0, r0, r4, lsl #2 + add r0, r0, #0x12000 + ldr r7, [r0, #0xb28 + OV29_022E2978_OFFSET] + mov r0, r7 + bl EntityIsValid__022E1A1C + cmp r0, #0 + ldrne r0, [r6] + add r4, r4, #1 + addne r0, r0, r5, lsl #2 + addne r0, r0, #0x12000 + strne r7, [r0, #0xb78 + OV29_022E2978_OFFSET] + addne r5, r5, #1 + cmp r4, #4 + blt _022E2988 + ldr r6, _022E2A34 ; =DUNGEON_PTR + mov r4, #0 +_022E29CC: + ldr r0, [r6] + add r0, r0, r4, lsl #2 + add r0, r0, #0x12000 + ldr r7, [r0, #0xb38 + OV29_022E2978_OFFSET] + mov r0, r7 + bl EntityIsValid__022E1A1C + cmp r0, #0 + ldrne r0, [r6] + add r4, r4, #1 + addne r0, r0, r5, lsl #2 + addne r0, r0, #0x12000 + strne r7, [r0, #0xb78 + OV29_022E2978_OFFSET] + addne r5, r5, #1 + cmp r4, #0x10 + blt _022E29CC + mov r2, #0 + ldr r1, _022E2A34 ; =DUNGEON_PTR + b _022E2A28 +_022E2A14: + ldr r0, [r1] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 + str r2, [r0, #0xb78 + OV29_022E2978_OFFSET] + add r5, r5, #1 +_022E2A28: + cmp r5, #0x14 + blt _022E2A14 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_022E2A34: .word DUNGEON_PTR + arm_func_end PopulateActiveMonsterPtrs + + arm_func_start GetTeamMemberIndex +GetTeamMemberIndex: ; 0x022E2A38 + ldr r1, _022E2A74 ; =DUNGEON_PTR + mov r2, #0 + ldr r3, [r1] + b _022E2A64 +_022E2A48: + add r1, r3, r2, lsl #2 + add r1, r1, #0x12000 +#ifdef JAPAN + ldr r1, [r1, #0xa84] +#else + ldr r1, [r1, #0xb28] +#endif + cmp r0, r1 + moveq r0, r2 + bxeq lr + add r2, r2, #1 +_022E2A64: + cmp r2, #4 + blt _022E2A48 + mvn r0, #0 + bx lr + .align 2, 0 +_022E2A74: .word DUNGEON_PTR + arm_func_end GetTeamMemberIndex + + arm_func_start ov29_022E2A78 +ov29_022E2A78: ; 0x022E2A78 + stmdb sp!, {r4, lr} + ldr r2, [r1] + mov r4, r0 + cmp r2, #1 + beq _022E2AA0 + cmp r2, #2 + beq _022E2AAC + cmp r2, #3 + ldmeqia sp!, {r4, pc} + b _022E2ABC +_022E2AA0: + ldr r1, [r1, #0xb4] + bl GetMonsterName + ldmia sp!, {r4, pc} +_022E2AAC: + ldr r1, [r1, #0xb4] + ldrb r1, [r1] + bl ov29_022ED82C + ldmia sp!, {r4, pc} +_022E2ABC: + ldr r0, _022E2AD4 ; =0x00000A42 + bl StringFromId + mov r1, r0 + mov r0, r4 + bl strcpy + ldmia sp!, {r4, pc} + .align 2, 0 +#ifdef JAPAN +_022E2AD4: .word 0x00000B42 +#else +_022E2AD4: .word 0x00000A42 +#endif + arm_func_end ov29_022E2A78 + + arm_func_start SubstitutePlaceholderStringTags +SubstitutePlaceholderStringTags: ; 0x022E2AD8 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r6, r1 + mov r7, r0 + mov r5, r2 + bl ov29_0234B034 + ldr r1, [r6] + mov r4, r0 + cmp r1, #1 + beq _022E2B10 + cmp r1, #2 + beq _022E2B3C + cmp r1, #3 + beq _022E2B2C + b _022E2B50 +_022E2B10: + mov r1, #0 + str r1, [sp] + ldr r2, [r6, #0xb4] + mov r1, r7 + mov r3, r5 + bl ov29_0230040C + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022E2B2C: + ldr r2, [r6, #0xb4] + mov r1, r7 + bl ov29_02344BA8 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022E2B3C: + ldr r2, [r6, #0xb4] + mov r1, r7 + ldrb r2, [r2] + bl ov29_022EDF7C + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022E2B50: + ldr r0, _022E2B64 ; =0x00000A42 + bl StringFromId + add r1, r4, r7, lsl #2 + str r0, [r1, #0x38] + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +#ifdef JAPAN +_022E2B64: .word 0x00000B42 +#else +_022E2B64: .word 0x00000A42 +#endif + arm_func_end SubstitutePlaceholderStringTags + +#ifdef EUROPE + arm_func_start ov29_022E34A8_EU +ov29_022E34A8_EU: ; 0x022E34A8 + stmdb sp!, {r3, lr} + bl EntityIsValid__022E1A1C + cmp r0, #0 + beq _022E34DC + ldr r0, _022E34E8 ; =0x02354138 + ldr r0, [r0] + ldrb r0, [r0, #8] + cmp r0, #0 + bne _022E34DC + bl GetForcedLossReason + cmp r0, #1 + movne r0, #1 + bne _022E34E0 +_022E34DC: + mov r0, #0 +_022E34E0: + and r0, r0, #0xff + ldmia sp!, {r3, pc} + .align 2, 0 +_022E34E8: .word 0x02354138 + arm_func_end ov29_022E34A8_EU +#endif + + arm_func_start ov29_022E2B68 +ov29_022E2B68: ; 0x022E2B68 +#ifdef JAPAN +#define OV29_022E2B68_OFFSET -0xA4 +#else +#define OV29_022E2B68_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, lr} + ldr r1, _022E2C5C ; =DUNGEON_PTR + movs r5, r0 + ldr r2, [r1] + mov r1, #0 + add r0, r2, #0x21c + OV29_022E2B68_OFFSET + add r4, r0, #0x1a000 + strh r1, [r4, #8] + ldr r0, _022E2C60 ; =0x0001A21C + strh r1, [r4, #0xa] + strh r1, [r2, r0] + strh r1, [r4, #2] + strh r1, [r4, #0xc] + strh r1, [r4, #0xe] + strh r1, [r4, #4] + strh r1, [r4, #6] + str r1, [r4, #0x14] + strb r1, [r4, #0x2f] + mov r0, #1 + strb r0, [r4, #0x30] + strb r0, [r4, #0x31] + str r1, [r4, #0x18] + str r1, [r4, #0x1c] + bne _022E2BF4 + strb r1, [r4, #0x22] + strb r1, [r4, #0x29] + strb r1, [r4, #0x28] + strb r1, [r4, #0x26] + strb r1, [r4, #0x2a] + strb r1, [r4, #0x27] + strb r1, [r4, #0x23] + strb r1, [r4, #0x24] + strb r1, [r4, #0x32] + strb r1, [r4, #0x33] + strb r1, [r4, #0x34] +_022E2BF4: + mov r1, #0 + str r1, [r4, #0x10] + mov r0, #3 + strb r0, [r4, #0x20] + strb r1, [r4, #0x35] + strb r1, [r4, #0x2b] + strb r1, [r4, #0x36] + strb r1, [r4, #0x37] + strb r1, [r4, #0x2d] + mov r0, #1 + strb r0, [r4, #0x2e] + bl ov29_022E2C6C + ldr r1, _022E2C64 ; =0x0000FFFF + ldr r0, _022E2C68 ; =ov29_0237C84C + cmp r5, #0 + str r1, [r0] + ldmneia sp!, {r3, r4, r5, pc} + ldr r0, _022E2C5C ; =DUNGEON_PTR + ldr r0, [r0] + add r0, r0, #0x28000 + ldrb r0, [r0, #0x6c8 + OV29_022E2B68_OFFSET] + ands r0, r0, #3 + strb r0, [r4, #0x21] + moveq r0, #1 + streqb r0, [r4, #0x24] + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_022E2C5C: .word DUNGEON_PTR +_022E2C60: .word 0x0001A21C + OV29_022E2B68_OFFSET +_022E2C64: .word 0x0000FFFF +_022E2C68: .word ov29_0237C84C + arm_func_end ov29_022E2B68 + + arm_func_start ov29_022E2C6C +ov29_022E2C6C: ; 0x022E2C6C + ldr r0, _022E2C9C ; =DUNGEON_PTR + mvn r1, #0 + ldr r0, [r0] +#ifdef JAPAN + add r0, r0, #0x178 +#else + add r0, r0, #0x21c +#endif + add r0, r0, #0x1a000 + strh r1, [r0, #0x3c] + strh r1, [r0, #0x3e] + strh r1, [r0, #0x40] + strh r1, [r0, #0x42] + strh r1, [r0, #0x38] + strh r1, [r0, #0x3a] + bx lr + .align 2, 0 +_022E2C9C: .word DUNGEON_PTR + arm_func_end ov29_022E2C6C + + arm_func_start ov29_022E2CA0 +ov29_022E2CA0: ; 0x022E2CA0 + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _022E2D34 ; =DUNGEON_PTR + mov r4, r0 + ldr r3, [r1] + ldr r0, _022E2D38 ; =0x0001A21C + ldrsh r1, [r4] + ldrsh r2, [r3, r0] +#ifdef JAPAN + add r0, r3, #0x178 +#else + add r0, r3, #0x21c +#endif + add r5, r0, #0x1a000 + sub r0, r2, r1 + ldr r6, [r5, #0x10] + bl abs + cmp r0, #6 + bgt _022E2D2C + ldrsh r1, [r5, #2] + ldrsh r0, [r4, #2] + sub r0, r1, r0 + bl abs + cmp r0, #5 + bgt _022E2D2C + mov r0, r5 + bl ov29_022E3534 + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + cmp r6, #0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + bl HasDropeyeStatus + mov r2, r0 + mov r0, r5 + mov r1, r4 + bl IsPositionActuallyInSight + ldmia sp!, {r4, r5, r6, pc} +_022E2D2C: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_022E2D34: .word DUNGEON_PTR +#ifdef JAPAN +_022E2D38: .word 0x0001A178 +#else +_022E2D38: .word 0x0001A21C +#endif + arm_func_end ov29_022E2CA0 + + arm_func_start ov29_022E2D3C +ov29_022E2D3C: ; 0x022E2D3C + stmdb sp!, {r4, r5, r6, lr} + ldr r1, _022E2DD0 ; =DUNGEON_PTR + mov r4, r0 + ldr r3, [r1] + ldr r0, _022E2DD4 ; =0x0001A21C + ldrsh r1, [r4] + ldrsh r2, [r3, r0] +#ifdef JAPAN + add r0, r3, #0x178 +#else + add r0, r3, #0x21c +#endif + add r5, r0, #0x1a000 + sub r0, r2, r1 + ldr r6, [r5, #0x10] + bl abs + cmp r0, #6 + bgt _022E2DC8 + ldrsh r1, [r5, #2] + ldrsh r0, [r4, #2] + sub r0, r1, r0 + bl abs + cmp r0, #6 + bgt _022E2DC8 + mov r0, r5 + bl ov29_022E3534 + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r4, r5, r6, pc} + cmp r6, #0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, pc} + mov r0, r6 + bl HasDropeyeStatus + mov r2, r0 + mov r0, r5 + mov r1, r4 + bl IsPositionActuallyInSight + ldmia sp!, {r4, r5, r6, pc} +_022E2DC8: + mov r0, #0 + ldmia sp!, {r4, r5, r6, pc} + .align 2, 0 +_022E2DD0: .word DUNGEON_PTR +#ifdef JAPAN +_022E2DD4: .word 0x0001A178 +#else +_022E2DD4: .word 0x0001A21C +#endif + arm_func_end ov29_022E2D3C + +#ifndef JAPAN + arm_func_start UpdateMapSurveyorFlag +UpdateMapSurveyorFlag: ; 0x022E2DD8 +#ifdef EUROPE + stmdb sp!, {r4, lr} + ldr r1, _022E2DF8 ; =DUNGEON_PTR + mov r0, #0x41 + ldr r1, [r1] + add r1, r1, #0x1a000 + ldrb r4, [r1, #0x241] + bl TeamMemberHasEnabledIqSkill + ldr r2, _022E2DF8 ; =DUNGEON_PTR + ldr r1, [r2] + add r1, r1, #0x1a000 + strb r0, [r1, #0x241] + ldr r0, [r2] + add r0, r0, #0x1a000 + ldrb r0, [r0, #0x241] + cmp r4, r0 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff + ldmia sp!, {r4, pc} +#else + stmdb sp!, {r3, lr} + mov r0, #0x41 + bl TeamMemberHasEnabledIqSkill + ldr r1, _022E2DF8 ; =DUNGEON_PTR + ldr r1, [r1] + add r1, r1, #0x1a000 + strb r0, [r1, #0x241] + ldmia sp!, {r3, pc} +#endif + .align 2, 0 +_022E2DF8: .word DUNGEON_PTR + arm_func_end UpdateMapSurveyorFlag +#endif + + arm_func_start ov29_022E2DFC +ov29_022E2DFC: ; 0x022E2DFC + stmdb sp!, {r3, lr} + ldr r1, _022E2E50 ; =DUNGEON_PTR + cmp r0, #0 + ldr r1, [r1] +#ifdef JAPAN + add r1, r1, #0x178 +#else + add r1, r1, #0x21c +#endif + add r1, r1, #0x1a000 + str r0, [r1, #0x10] + moveq r0, #0 + streqb r0, [r1, #0x2f] + beq _022E2E40 + ldr r0, [r0, #0xb4] + ldrb r0, [r0, #7] + cmp r0, #0 + moveq r0, #0 + streqb r0, [r1, #0x2f] + movne r0, #1 + strneb r0, [r1, #0x2f] +_022E2E40: + mov r0, #0 + bl UpdateCamera + bl ov29_022E2C6C + ldmia sp!, {r3, pc} + .align 2, 0 +_022E2E50: .word DUNGEON_PTR + arm_func_end ov29_022E2DFC + + arm_func_start PointCameraToMonster +PointCameraToMonster: ; 0x022E2E54 + stmdb sp!, {r4, lr} + ldr r2, _022E2EC0 ; =DUNGEON_PTR + mov r4, r1 + ldr r1, [r2] + cmp r0, #0 +#ifdef JAPAN + add r1, r1, #0x178 +#else + add r1, r1, #0x21c +#endif + add r2, r1, #0x1a000 + moveq r1, #0 + streqb r1, [r2, #0x2f] + beq _022E2E98 + ldr r1, [r0, #0xb4] + ldrb r1, [r1, #7] + cmp r1, #0 + moveq r1, #0 + streqb r1, [r2, #0x2f] + movne r1, #1 + strneb r1, [r2, #0x2f] +_022E2E98: + str r0, [r2, #0x10] + mov r0, #0 + bl UpdateCamera + bl ov29_022E2C6C + bl ov29_02304954 + cmp r4, #0 + ldmeqia sp!, {r4, pc} + bl UpdateTrapsVisibility + bl UpdateMinimap + ldmia sp!, {r4, pc} + .align 2, 0 +_022E2EC0: .word DUNGEON_PTR + arm_func_end PointCameraToMonster + + arm_func_start UpdateCamera +UpdateCamera: ; 0x022E2EC4 +#ifdef JAPAN +#define UPDATE_CAMERA_OFFSET -0xA4 +#else +#define UPDATE_CAMERA_OFFSET 0 +#endif + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #0x10 + ldr r1, _022E32DC ; =DUNGEON_PTR + str r0, [sp] + ldr r0, [r1] + cmp r0, #0 + beq _022E32D4 + add r0, r0, #0x21c + UPDATE_CAMERA_OFFSET + add r4, r0, #0x1a000 + ldr r5, [r4, #0x10] + cmp r5, #0 + beq _022E32D0 + mov r0, r5 + bl EntityIsValid__022E32E8 + cmp r0, #0 + beq _022E32D0 + ldrb r8, [r4, #0x32] + ldrb sb, [r4, #0x33] + ldrh r0, [r4, #8] + ldr sl, [r5, #0xb4] + mov r6, #0 + strh r0, [r4, #0xc] + ldrh r2, [r4, #0xa] + mov r0, r5 + mov r1, #0x18 + strh r2, [r4, #0xe] + ldrh r2, [r4] + mov fp, r6 + mov r7, r6 + strh r2, [r4, #4] + ldrh r2, [r4, #2] + str r6, [sp, #4] + strh r2, [r4, #6] + ldrsh r2, [r5, #4] + strh r2, [r4] + ldrsh r2, [r5, #6] + strh r2, [r4, #2] + ldr r2, [r5, #0xc] + mov r2, r2, asr #8 + sub r2, r2, #0x80 + strh r2, [r4, #8] + ldr r2, [r5, #0x10] + mov r2, r2, asr #8 + sub r2, r2, #0x6c + strh r2, [r4, #0xa] + ldrb r2, [r4, #0x27] + str r2, [sp, #0xc] + ldrb r2, [r4, #0x26] + str r2, [sp, #8] + bl ItemIsActive__022E330C + cmp r0, #0 + ldrneb r0, [sl, #7] + mov r1, #0 + cmpne r0, #0 + movne r0, #1 + strneb r0, [r4, #0x26] + strneb r0, [r4, #0x27] + ldreqb r0, [sl, #0xf9] + streqb r0, [r4, #0x26] + ldreqb r0, [sl, #0xfa] + streqb r0, [r4, #0x27] + strb r1, [r4, #0x32] + strb r1, [r4, #0x33] + mov r0, r5 + mov r1, #0xe + bl ItemIsActive__022E330C + cmp r0, #0 + ldrneb r0, [sl, #7] + cmpne r0, #0 + movne r0, #1 + strneb r0, [r4, #0x32] + strneb r0, [r4, #0x33] + ldrb r1, [r4, #0x27] + ldr r0, [sp, #0xc] + cmp r0, r1 + ldreqb r0, [r4, #0x32] + ldrb r1, [r4, #0x26] + cmpeq r8, r0 + ldr r0, [sp, #8] + movne r6, #1 + cmp r0, r1 + ldreqb r0, [r4, #0x33] + cmpeq sb, r0 + ldrb r0, [sl, #0xfb] + movne fp, #1 + strb r0, [r4, #0x2a] + ldrb r0, [r4, #0x2d] + ldrb r8, [r4, #0x22] + cmp r0, #0 + bne _022E309C + mov r0, r5 + mov r1, #1 + bl IsBlinded + cmp r0, #0 + movne r0, #1 + movne r2, #0xe + strneb r0, [r4, #0x22] + moveq r2, #0 + ldr r0, _022E32E0 ; =ov29_0237C84C + streqb r2, [r4, #0x22] + ldr r1, [r0] + cmp r1, r2 + beq _022E30A8 + str r2, [r0] + cmp r2, #0xe + mov r0, #2 + mov r1, #0 + bne _022E3088 + bl sub_02009194 + mov r0, #3 + mov r1, #0 + bl sub_02009194 + b _022E30A8 +_022E3088: + bl sub_020091B0 + mov r0, #3 + mov r1, #0 + bl sub_020091B0 + b _022E30A8 +_022E309C: + ldr r1, _022E32E4 ; =0x0000FFFF + ldr r0, _022E32E0 ; =ov29_0237C84C + str r1, [r0] +_022E30A8: + ldrb r0, [r4, #0x22] + ldrb r1, [r4, #0x29] + cmp r8, r0 + ldrb r0, [sl, #0xf1] + movne r7, #1 + cmp r0, #2 + moveq r0, #1 + movne r0, #0 + strb r0, [r4, #0x29] + ldrb r0, [r4, #0x29] + cmp r1, r0 + ldreq r0, _022E32DC ; =DUNGEON_PTR + ldreq r0, [r0] + addeq r0, r0, #0x2c000 + ldreqb r0, [r0, #0xb10 + UPDATE_CAMERA_OFFSET] + cmpeq r0, #0 + beq _022E3108 + bl ov29_023047DC + ldr r0, _022E32DC ; =DUNGEON_PTR + mov r1, #0 + ldr r0, [r0] + mov r7, #1 + add r0, r0, #0x2c000 + strb r1, [r0, #0xb10 + UPDATE_CAMERA_OFFSET] +_022E3108: + mov r0, r5 + ldrb r8, [r4, #0x28] + bl CanSeeInvisibleMonsters + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + strb r0, [r4, #0x28] + ldrb r0, [r4, #0x28] + cmp r8, r0 + movne r7, #1 + strne r7, [sp, #4] + ldrb r8, [r4, #0x34] + mov r0, r5 + bl HasDropeyeStatus + and r1, r0, #0xff + cmp r8, r1 + strb r0, [r4, #0x34] + movne r7, #1 + strne r7, [sp, #4] + ldr r0, [sp, #4] + cmp r0, #0 + beq _022E3168 + bl UpdateTrapsVisibility + bl UpdateMinimap +_022E3168: + cmp r7, #0 + beq _022E3178 + mov r0, #0 + bl ov29_022E3A58 +_022E3178: + ldr r0, [sp] + cmp r0, #0 + beq _022E3228 + ldrb r0, [r4, #0x2c] + cmp r0, #0 + bne _022E3228 + ldrsh r5, [r4, #8] + ldrsh r7, [r4, #0xc] + sub r0, r7, r5 + bl abs + cmp r0, #8 + bge _022E31C0 + ldrsh r1, [r4, #0xe] + ldrsh r0, [r4, #0xa] + sub r0, r1, r0 + bl abs + cmp r0, #8 + blt _022E31D0 +_022E31C0: + bl UpdateTrapsVisibility + mov r0, #1 + strb r0, [r4, #0x2c] + b _022E3228 +_022E31D0: + cmp r7, r5 + bge _022E31E8 + mov r0, #0xff + mov r1, #0 + bl ov29_0233711C + b _022E31F8 +_022E31E8: + ble _022E31F8 + mov r0, #0 + mov r1, r0 + bl ov29_0233711C +_022E31F8: + ldrsh r1, [r4, #0xa] + ldrsh r0, [r4, #0xe] + cmp r0, r1 + bge _022E3218 + mov r0, #0 + mov r1, #0xc0 + bl ov29_023372A4 + b _022E3228 +_022E3218: + ble _022E3228 + mov r0, #0 + mov r1, r0 + bl ov29_023372A4 +_022E3228: + cmp fp, #0 + ldreqsh r1, [r4] + ldreqsh r0, [r4, #4] + cmpeq r1, r0 + ldreqsh r1, [r4, #2] + ldreqsh r0, [r4, #6] + cmpeq r1, r0 + beq _022E3288 + ldr r4, _022E32DC ; =DUNGEON_PTR + mov r5, #0 +_022E3250: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 + ldr r7, [r0, #0xb78 + UPDATE_CAMERA_OFFSET] + mov r0, r7 + bl EntityIsValid__022E32E8 + cmp r0, #0 + beq _022E327C + ldrsh r0, [r7, #4] + ldrsh r1, [r7, #6] + bl DrawMinimapTile +_022E327C: + add r5, r5, #1 + cmp r5, #0x14 + blt _022E3250 +_022E3288: + cmp r6, #0 + beq _022E32D0 + ldr r4, _022E32DC ; =DUNGEON_PTR + mov r5, #0 +_022E3298: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 + ldr r6, [r0, #0xbc8 + UPDATE_CAMERA_OFFSET] + mov r0, r6 + bl EntityIsValid__022E32E8 + cmp r0, #0 + beq _022E32C4 + ldrsh r0, [r6, #4] + ldrsh r1, [r6, #6] + bl DrawMinimapTile +_022E32C4: + add r5, r5, #1 + cmp r5, #0x40 + blt _022E3298 +_022E32D0: + bl ov29_022E34C8 +_022E32D4: + add sp, sp, #0x10 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022E32DC: .word DUNGEON_PTR +_022E32E0: .word ov29_0237C84C +_022E32E4: .word 0x0000FFFF + arm_func_end UpdateCamera diff --git a/include/dungeon_visibility.h b/include/dungeon_visibility.h new file mode 100644 index 00000000..e977f8d6 --- /dev/null +++ b/include/dungeon_visibility.h @@ -0,0 +1,11 @@ +#ifndef PMDSKY_DUNGEON_VISIBILITY_H +#define PMDSKY_DUNGEON_VISIBILITY_H + +#include "dungeon_mode.h" + +// Checks if a given monster can see another monster. +// Calls IsPositionActuallyInSight. Also checks if the user is blinded, if the target is invisible, etc. +// This function is almost the same as CanTargetEntity, the only difference is that the latter calls IsPositionInSight instead. +bool8 CanSeeTarget(struct entity *user, struct entity *target); + +#endif //PMDSKY_DUNGEON_VISIBILITY_H diff --git a/main.lsf b/main.lsf index 2654157c..d588e19d 100644 --- a/main.lsf +++ b/main.lsf @@ -237,6 +237,8 @@ Overlay OVY_29 Object asm/overlay_29_022E0378.o Object src/dg_object.o Object asm/overlay_29_022E1AD4.o + Object src/dungeon_visibility.o + Object asm/overlay_29_022E2810.o Object src/dg_camera.o Object asm/overlay_29_022E333C.o Object src/dg_effect.o diff --git a/src/dungeon_ai.c b/src/dungeon_ai.c index 57499216..e452ef0b 100644 --- a/src/dungeon_ai.c +++ b/src/dungeon_ai.c @@ -5,6 +5,7 @@ #include "dungeon_capabilities_1.h" #include "dungeon_util_static.h" #include "dungeon_util.h" +#include "dungeon_visibility.h" #include "targeting.h" #ifdef JAPAN @@ -28,7 +29,6 @@ extern void ChooseAiMove(struct entity *monster); extern bool8 GetCanMoveFlag(s16 monster_id); extern void AiMovement(struct entity *monster, bool8 show_run_away_effect); extern void SetDecoyAiTracker(struct entity* entity); -extern bool8 CanSeeTarget(struct entity *user, struct entity *target); void RunMonsterAi(struct entity *monster, u32 unused) { diff --git a/src/dungeon_ai_items_1.c b/src/dungeon_ai_items_1.c index 2afd07d6..7e6becde 100644 --- a/src/dungeon_ai_items_1.c +++ b/src/dungeon_ai_items_1.c @@ -4,6 +4,7 @@ #include "dungeon_ai_items.h" #include "dungeon_ai_targeting_1.h" #include "dungeon_util_static.h" +#include "dungeon_visibility.h" #include "item.h" #include "targeting.h" @@ -13,7 +14,6 @@ extern s32 AI_THROWN_ITEM_ACTION_CHOICE_COUNT; extern struct dungeon *DUNGEON_PTR[]; -extern bool8 CanSeeTarget(struct entity *user, struct entity *target); extern bool8 IsTargetInRange(struct entity *user, struct entity *target, s32 direction, s32 n_tiles); extern u32 GetAiUseItemProbability(struct entity *item_consumer, struct item *item, u32 flags); extern s32 abs(s32 value); diff --git a/src/dungeon_visibility.c b/src/dungeon_visibility.c new file mode 100644 index 00000000..6ab404a1 --- /dev/null +++ b/src/dungeon_visibility.c @@ -0,0 +1,36 @@ +#include "dungeon_visibility.h" +#include "dg_object.h" +#include "dungeon_pokemon_attributes_1.h" +#include "dungeon_statuses.h" +#include "dungeon_util_static.h" + +extern bool8 HasDropeyeStatus(struct entity* entity); +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)) + return FALSE; + + if (!EntityIsValid__022E1A1C(target)) + return FALSE; + + if (!target->is_visible) + return FALSE; + + if (target->type == ENTITY_MONSTER) + { + if (user->type == ENTITY_MONSTER) + { + if (!CanSeeInvisibleMonsters(user) && GetEntInfo(target)->invisible_class_status.status == STATUS_INVISIBLE_INVISIBLE) + return FALSE; + + if (IsBlinded(user, TRUE)) + return FALSE; + } + else if (GetEntInfo(target)->invisible_class_status.status == STATUS_INVISIBLE_INVISIBLE) + return FALSE; + } + + return IsPositionActuallyInSight(&user->pos, &target->pos, HasDropeyeStatus(user)); +}