From 58a940eedbbabe2917f338026577ffb99dd5454a Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Wed, 28 May 2025 22:09:57 -0400 Subject: [PATCH] Decomped SetDecoyAiTracker --- asm/include/overlay_29_022F9744.inc | 49 ++- asm/include/overlay_29_022FB5EC.inc | 21 ++ asm/overlay_29_022F9744.s | 498 ---------------------------- asm/overlay_29_022FB5EC.s | 447 +++++++++++++++++++++++++ include/dungeon_action.h | 2 +- include/overlay_29_022FB538.h | 12 + main.lsf | 2 + src/dungeon_ai.c | 40 +-- src/overlay_29_022FB538.c | 35 ++ 9 files changed, 558 insertions(+), 548 deletions(-) create mode 100644 asm/include/overlay_29_022FB5EC.inc create mode 100644 asm/overlay_29_022FB5EC.s create mode 100644 include/overlay_29_022FB538.h create mode 100644 src/overlay_29_022FB538.c diff --git a/asm/include/overlay_29_022F9744.inc b/asm/include/overlay_29_022F9744.inc index 5a1fe5eb..3b3895cd 100644 --- a/asm/include/overlay_29_022F9744.inc +++ b/asm/include/overlay_29_022F9744.inc @@ -1,5 +1,4 @@ #pragma once -.public _020A1870 .public AbilityIsActiveVeneer .public AdvanceFrame .public AiMovement @@ -9,18 +8,16 @@ .public BELLY_DRAIN_IN_WALLS_INT .public CanMonsterSpawn .public CanMonsterUseItem -.public CanSeeTarget .public CeilFixedPoint .public ChangeMonsterAnimation .public CheckTeamMemberIdx .public CheckVariousStatuses .public CheckVariousStatuses2 .public Conversion2IsActive -.public DefenderAbilityIsActive__022F96CC .public DIRECTIONS_XY -.public DiscoverMinimap -.public DisplayAnimatedNumbers .public DUNGEON_PTR +.public DefenderAbilityIsActive__022F96CC +.public DiscoverMinimap .public DungeonRandInt .public EnableIqSkill .public EndBurnClassStatus @@ -43,13 +40,10 @@ .public GetMaxPpWrapper .public GetMobilityType .public GetMonsterEvoStatus -.public GetMoveBasePp .public GetMoveType .public GetMoveTypeForMonster .public GetNbItemsInBag .public GetScenarioBalance -.public GetScenarioBalanceVeneer -.public GetSpawnThreshold .public GetStairsRoom .public GetStairsSpawnPosition .public GetTile @@ -62,18 +56,32 @@ .public IqSkillIsEnabled .public IsCurrentFixedRoomBossFight .public IsFullFloorFixedRoom -.public IsMonster__022F9720 .public IsMonsterIdInNormalRange .public IsMonsterSleeping .public IsOneHitKoMove -.public IsSecretBazaarNpcBehavior .public ItemZInit .public LogMessageByIdWithPopup .public LogMessageByIdWithPopupCheckUser .public LogMessageByIdWithPopupCheckUserTarget +.public PointCameraToMonster +.public RandInt +.public RemoveEquivItem +.public RestoreAllMovePP +.public SECONDARY_TERRAIN_TYPES +.public SetActionPassTurnOrWalk +.public ShouldDisplayEntityWrapper +.public ShouldTryEatItem +.public ShowPpRestoreEffect +.public SubFixedPoint +.public SubstitutePlaceholderStringTags +.public TryIncreaseHp +.public TryInflictBurnStatus +.public TryInflictPausedStatus +.public UpdateCamera +.public UpdateMinimap +.public UpdateStatusIconFlags .public ov29_022E0A04 .public ov29_022E4160 -.public ov29_022E576C .public ov29_022E68BC .public ov29_022E68D8 .public ov29_022E6928 @@ -90,31 +98,12 @@ .public ov29_02307DD0 .public ov29_0230F9A4 .public ov29_02344B44 -.public ov29_02348100 .public ov29_0234B034 .public ov29_0234B084 .public ov29_0234B09C -.public PointCameraToMonster -.public RandInt -.public RemoveEquivItem -.public RestoreAllMovePP -.public SECONDARY_TERRAIN_TYPES -.public SetActionPassTurnOrWalk -.public ShouldDisplayEntityWrapper -.public ShouldTryEatItem -.public ShowPpRestoreEffect .public sub_0201405C .public sub_02017C50 .public sub_0204AEF0 .public sub_02050FF8 .public sub_02052E2C .public sub_02056228 -.public SubFixedPoint -.public SubstitutePlaceholderStringTags -.public TryIncreaseHp -.public TryInflictBurnStatus -.public TryInflictPausedStatus -.public UpdateCamera -.public UpdateMapSurveyorFlag -.public UpdateMinimap -.public UpdateStatusIconFlags diff --git a/asm/include/overlay_29_022FB5EC.inc b/asm/include/overlay_29_022FB5EC.inc new file mode 100644 index 00000000..f8b882e6 --- /dev/null +++ b/asm/include/overlay_29_022FB5EC.inc @@ -0,0 +1,21 @@ +#pragma once +.public Conversion2IsActive +.public DIRECTIONS_XY +.public DUNGEON_PTR +.public DisplayAnimatedNumbers +.public EntityIsValid__022F7364 +.public GetMaxPp +.public GetMoveBasePp +.public GetScenarioBalanceVeneer +.public GetSpawnThreshold +.public GetTile +.public IqSkillIsEnabled +.public IsMonster__022F9720 +.public IsSecretBazaarNpcBehavior +.public TeamMemberHasEnabledIqSkill +.public UpdateMapSurveyorFlag +.public UpdateMinimap +.public _020A1870 +.public ov29_022E576C +.public ov29_02307CE0 +.public ov29_02348100 diff --git a/asm/overlay_29_022F9744.s b/asm/overlay_29_022F9744.s index c3f5408c..420e98b0 100644 --- a/asm/overlay_29_022F9744.s +++ b/asm/overlay_29_022F9744.s @@ -2519,501 +2519,3 @@ ov29_022FB51C: ; 0x022FB51C and r0, r0, #0xff ldmia sp!, {r3, pc} arm_func_end ov29_022FB51C - -#ifndef JAPAN - arm_func_start SetDecoyAiTracker -SetDecoyAiTracker: ; 0x022FB538 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r0 - bl EntityIsValid__022F7364 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldr r5, [r6, #0xb4] - mov r4, #0 - ldr r7, _022FB5E8 ; =DUNGEON_PTR - strb r4, [r5, #0x10c] - ldr r0, [r7] - add r0, r0, #0x3000 - ldrb r0, [r0, #0xe38] - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - b _022FB5DC -_022FB574: - ldr r0, [r7] - add r0, r0, r4, lsl #2 - add r0, r0, #0x12000 - ldr r8, [r0, #0xb78] - mov r0, r8 - bl EntityIsValid__022F7364 - cmp r0, #0 - cmpne r8, r6 - beq _022FB5D8 - ldr r0, [r8, #0xb4] - ldrb r0, [r0, #0xd8] - cmp r0, #2 - bne _022FB5D8 - mov r0, r6 - mov r1, r8 - bl CanSeeTarget - cmp r0, #0 - beq _022FB5D8 - ldr r0, [r8, #0xb4] - ldrb r0, [r0, #0xd9] - cmp r0, #0 - movne r0, #2 - moveq r0, #1 - strb r0, [r5, #0x10c] - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_022FB5D8: - add r4, r4, #1 -_022FB5DC: - cmp r4, #0x14 - blt _022FB574 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_022FB5E8: .word DUNGEON_PTR - arm_func_end SetDecoyAiTracker -#endif - - arm_func_start CheckSpawnThreshold -CheckSpawnThreshold: ; 0x022FB5EC - stmdb sp!, {r4, lr} - bl GetSpawnThreshold - mov r4, r0 - bl GetScenarioBalanceVeneer - cmp r4, r0 - movls r0, #1 - movhi r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, pc} - arm_func_end CheckSpawnThreshold - - arm_func_start HasLowHealth -HasLowHealth: ; 0x022FB610 - stmdb sp!, {r4, lr} - mov r4, r0 - bl EntityIsValid__022F7364 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - ldr r0, [r4] - cmp r0, #1 - movne r0, #0 - ldmneia sp!, {r4, pc} - ldr r3, [r4, #0xb4] - ldr r0, _022FB674 ; =0x000003E7 - ldrsh r2, [r3, #0x12] - ldrsh r1, [r3, #0x16] - add r2, r2, r1 - cmp r2, r0 - movgt r2, r0 - mov r0, r2, asr #1 - ldrsh r1, [r3, #0x10] - add r0, r2, r0, lsr #30 - cmp r1, r0, asr #2 - movlt r0, #1 - movge r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, pc} - .align 2, 0 -_022FB674: .word 0x000003E7 - arm_func_end HasLowHealth - - arm_func_start AreEntitiesAdjacent -AreEntitiesAdjacent: ; 0x022FB678 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r0 - mov r6, r1 - mov r5, #0 - ldr r4, _022FB6E0 ; =DIRECTIONS_XY - b _022FB6D0 -_022FB690: - mov r1, r5, lsl #2 - add r0, r4, r5, lsl #2 - ldrsh r3, [r4, r1] - ldrsh ip, [r7, #4] - ldrsh r1, [r0, #2] - ldrsh r2, [r7, #6] - add r0, ip, r3 - add r1, r2, r1 - bl GetTile - ldr r0, [r0, #0xc] - cmp r0, r6 - moveq r0, #1 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 -_022FB6D0: - cmp r5, #8 - blt _022FB690 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - .align 2, 0 -_022FB6E0: .word DIRECTIONS_XY - arm_func_end AreEntitiesAdjacent - - arm_func_start ov29_022FB6E4 -ov29_022FB6E4: ; 0x022FB6E4 - stmdb sp!, {r4, lr} - mov r4, r0 - bl IsMonster__022F9720 - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #0x48] - cmp r0, #0xd6 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - ldmia sp!, {r4, pc} - arm_func_end ov29_022FB6E4 - - arm_func_start ov29_022FB718 -ov29_022FB718: ; 0x022FB718 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov sl, r0 - bl EntityIsValid__022F7364 - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr sb, [sl, #0xb4] - mov r1, #0 - mov r0, sl - strh r1, [sb, #0x16] - bl Conversion2IsActive - mov r6, r0 - mov r0, sl - mov r1, #0x38 - ldr r4, [sl, #0xb4] - bl IqSkillIsEnabled - cmp r0, #0 - ldrne r0, _022FB834 ; =_020A1870 - mov r8, #0 - ldrnesh r1, [r4, #0x16] - ldrnesh r0, [r0] -#ifdef JAPAN - add r5, r4, #0x120 -#else - add r5, r4, #0x124 -#endif - mov fp, r8 - addne r0, r1, r0 - strneh r0, [r4, #0x16] - mov r4, #1 -_022FB77C: - ldrb r0, [r5, r8, lsl #3] - add r7, r5, r8, lsl #3 - tst r0, #1 - movne r0, r4 - moveq r0, fp - tst r0, #0xff - beq _022FB7C0 - ldrh r2, [r7, #2] - mov r0, sl - mov r1, #0x39 - bic r2, r2, #0x100 - strh r2, [r7, #2] - bl IqSkillIsEnabled - cmp r0, #0 - ldrneh r0, [r7, #2] - orrne r0, r0, #0x100 - strneh r0, [r7, #2] -_022FB7C0: - add r0, r8, #1 - mov r0, r0, lsl #0x10 - mov r8, r0, asr #0x10 - cmp r8, #4 - blt _022FB77C - mov r0, sl - bl ov29_02348100 - cmp r6, #2 - bne _022FB7FC - mov r0, sl - bl Conversion2IsActive - cmp r0, #0 - bne _022FB7FC - mov r0, sl - bl ov29_02307CE0 -_022FB7FC: - ldrsh r1, [sb, #0x12] - ldrsh r0, [sb, #0x16] - ldr r2, _022FB838 ; =0x000003E7 - add r1, r1, r0 - cmp r1, r2 - ldrsh r0, [sb, #0x10] - movle r2, r1 - cmp r0, r2 - ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - ldr r0, _022FB838 ; =0x000003E7 - cmp r1, r0 - movgt r1, r0 - strh r1, [sb, #0x10] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_022FB834: .word _020A1870 -_022FB838: .word 0x000003E7 - arm_func_end ov29_022FB718 - - arm_func_start ov29_022FB83C -ov29_022FB83C: ; 0x022FB83C - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} - mov sl, r0 - mov sb, r1 - bl EntityIsValid__022F7364 - cmp r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldr r8, [sl, #0xb4] - mov r7, #0 -#ifdef JAPAN - add r6, r8, #0x120 -#else - add r6, r8, #0x124 -#endif - mov r4, r7 - mov r5, #1 -_022FB868: - ldrb r0, [r6, r7, lsl #3] - mov r1, r7, lsl #3 - tst r0, #1 - movne r0, r5 - moveq r0, r4 - tst r0, #0xff - beq _022FB88C - add r0, r6, r1 - bl GetMoveBasePp -_022FB88C: - add r0, r7, #1 - mov r0, r0, lsl #0x10 - mov r7, r0, asr #0x10 - cmp r7, #4 - blt _022FB868 - mov r0, sl - bl ov29_022FB718 - cmp sb, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - ldrsh r2, [r8, #0x12] - ldrsh r1, [r8, #0x16] - ldr r0, _022FB91C ; =0x000003E7 - mov sb, #0 - add r1, r2, r1 - cmp r1, r0 - movgt r1, r0 - strh r1, [r8, #0x10] -#ifdef JAPAN - add r6, r8, #0x120 -#else - add r6, r8, #0x124 -#endif - mov r4, sb - mov r5, #1 -_022FB8DC: - ldrb r0, [r6, sb, lsl #3] - add r7, r6, sb, lsl #3 - tst r0, #1 - movne r0, r5 - moveq r0, r4 - tst r0, #0xff - beq _022FB904 - mov r0, r7 - bl GetMaxPp - strb r0, [r7, #6] -_022FB904: - add r0, sb, #1 - mov r0, r0, lsl #0x10 - mov sb, r0, asr #0x10 - cmp sb, #4 - blt _022FB8DC - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} - .align 2, 0 -_022FB91C: .word 0x000003E7 - arm_func_end ov29_022FB83C - - arm_func_start ov29_022FB920 -ov29_022FB920: ; 0x022FB920 -#ifdef EUROPE - stmdb sp!, {r4, r5, r6, lr} - ldr r5, _022FB980 ; =DUNGEON_PTR - mov r4, r0 - mov r6, #0 -_022FC33C_EU: - ldr r0, [r5] - add r0, r0, r6, lsl #2 - add r0, r0, #0x12000 - ldr r0, [r0, #0xb28] - bl ov29_022FB718 - add r0, r6, #1 - mov r0, r0, lsl #0x10 - mov r6, r0, asr #0x10 - cmp r6, #4 - blt _022FC33C_EU - bl UpdateMapSurveyorFlag - cmp r0, #0 - cmpne r4, #0 - ldmeqia sp!, {r4, r5, r6, pc} - bl UpdateMinimap - ldmia sp!, {r4, r5, r6, pc} -#else - stmdb sp!, {r3, r4, r5, lr} - ldr r4, _022FB980 ; =DUNGEON_PTR - mov r5, #0 -_022FB92C: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r0, [r0, #0xa84] -#else - ldr r0, [r0, #0xb28] -#endif - bl ov29_022FB718 - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, asr #0x10 - cmp r5, #4 - blt _022FB92C - mov r0, #0x41 - bl TeamMemberHasEnabledIqSkill - cmp r0, #0 - ldrne r0, _022FB980 ; =DUNGEON_PTR - movne r1, #1 - ldreq r0, _022FB980 ; =DUNGEON_PTR - moveq r1, #0 - ldr r0, [r0] - add r0, r0, #0x1a000 -#ifdef JAPAN - strb r1, [r0, #0x19d] -#else - strb r1, [r0, #0x241] -#endif - ldmia sp!, {r3, r4, r5, pc} -#endif - .align 2, 0 -_022FB980: .word DUNGEON_PTR - arm_func_end ov29_022FB920 - - arm_func_start ov29_022FB984 -ov29_022FB984: ; 0x022FB984 - mov r0, #0 - bx lr - arm_func_end ov29_022FB984 - - arm_func_start ov29_022FB98C -ov29_022FB98C: ; 0x022FB98C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r2, #1 - ldr r0, _022FB9B8 ; =0x0000270F - mov r4, r1 - sub r3, r2, #2 - bl DisplayAnimatedNumbers - mov r0, r5 - mov r1, r4 - bl ov29_022E576C - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_022FB9B8: .word 0x0000270F - arm_func_end ov29_022FB98C - - arm_func_start ov29_022FB9BC -ov29_022FB9BC: ; 0x022FB9BC - stmdb sp!, {r3, lr} - ldr r0, [r0, #0xb4] - ldrb r0, [r0, #0xbc] - bl IsSecretBazaarNpcBehavior - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end ov29_022FB9BC - - arm_func_start ov29_022FB9E0 -ov29_022FB9E0: ; 0x022FB9E0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - bl IsMonster__022F9720 - cmp r0, #0 - beq _022FBA4C - ldr r1, [r5, #0xb4] - mov r0, #0 -#ifdef JAPAN - add ip, r1, #0x120 -#else - add ip, r1, #0x124 -#endif - mov r2, r0 - mov r3, #1 - b _022FBA44 -_022FBA10: - ldrb r1, [ip, r0, lsl #3] - add lr, ip, r0, lsl #3 - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - beq _022FBA38 - ldrh r1, [lr, #4] - cmp r1, r4 - ldmeqia sp!, {r3, r4, r5, pc} -_022FBA38: - add r0, r0, #1 - mov r0, r0, lsl #0x10 - mov r0, r0, asr #0x10 -_022FBA44: - cmp r0, #4 - blt _022FBA10 -_022FBA4C: - mvn r0, #0 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_022FB9E0 - - arm_func_start ov29_022FBA54 -ov29_022FBA54: ; 0x022FBA54 - stmdb sp!, {r3, lr} - bl ov29_022FB9E0 - cmp r0, #0 - movge r0, #1 - movlt r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end ov29_022FBA54 - - arm_func_start ov29_022FBA70 -ov29_022FBA70: ; 0x022FBA70 - stmdb sp!, {r4, lr} - mov r4, r0 - bl IsMonster__022F9720 - cmp r0, #0 - beq _022FBAAC - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #0x48] - cmp r0, #0xfa - moveq r0, #1 - ldmeqia sp!, {r4, pc} - cmp r0, #0xd9 - blo _022FBAAC - cmp r0, #0xe4 - movlo r0, #1 - ldmloia sp!, {r4, pc} -_022FBAAC: - mov r0, #0 - ldmia sp!, {r4, pc} - arm_func_end ov29_022FBA70 - - arm_func_start ov29_022FBAB4 -ov29_022FBAB4: ; 0x022FBAB4 - ldr r2, [r0, #0xb4] - cmp r2, #0 - addne r0, r2, #0x100 - movne r1, #0 -#ifdef JAPAN - strneh r1, [r0, #0x8e] - strne r1, [r2, #0x188] -#else - strneh r1, [r0, #0x92] - strne r1, [r2, #0x18c] -#endif - bx lr - arm_func_end ov29_022FBAB4 diff --git a/asm/overlay_29_022FB5EC.s b/asm/overlay_29_022FB5EC.s new file mode 100644 index 00000000..a9eb2563 --- /dev/null +++ b/asm/overlay_29_022FB5EC.s @@ -0,0 +1,447 @@ + .include "asm/macros.inc" + .include "overlay_29_022FB5EC.inc" + + .text + + arm_func_start CheckSpawnThreshold +CheckSpawnThreshold: ; 0x022FB5EC + stmdb sp!, {r4, lr} + bl GetSpawnThreshold + mov r4, r0 + bl GetScenarioBalanceVeneer + cmp r4, r0 + movls r0, #1 + movhi r0, #0 + and r0, r0, #0xff + ldmia sp!, {r4, pc} + arm_func_end CheckSpawnThreshold + + arm_func_start HasLowHealth +HasLowHealth: ; 0x022FB610 + stmdb sp!, {r4, lr} + mov r4, r0 + bl EntityIsValid__022F7364 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4] + cmp r0, #1 + movne r0, #0 + ldmneia sp!, {r4, pc} + ldr r3, [r4, #0xb4] + ldr r0, _022FB674 ; =0x000003E7 + ldrsh r2, [r3, #0x12] + ldrsh r1, [r3, #0x16] + add r2, r2, r1 + cmp r2, r0 + movgt r2, r0 + mov r0, r2, asr #1 + ldrsh r1, [r3, #0x10] + add r0, r2, r0, lsr #30 + cmp r1, r0, asr #2 + movlt r0, #1 + movge r0, #0 + and r0, r0, #0xff + ldmia sp!, {r4, pc} + .align 2, 0 +_022FB674: .word 0x000003E7 + arm_func_end HasLowHealth + + arm_func_start AreEntitiesAdjacent +AreEntitiesAdjacent: ; 0x022FB678 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r0 + mov r6, r1 + mov r5, #0 + ldr r4, _022FB6E0 ; =DIRECTIONS_XY + b _022FB6D0 +_022FB690: + mov r1, r5, lsl #2 + add r0, r4, r5, lsl #2 + ldrsh r3, [r4, r1] + ldrsh ip, [r7, #4] + ldrsh r1, [r0, #2] + ldrsh r2, [r7, #6] + add r0, ip, r3 + add r1, r2, r1 + bl GetTile + ldr r0, [r0, #0xc] + cmp r0, r6 + moveq r0, #1 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + add r0, r5, #1 + mov r0, r0, lsl #0x10 + mov r5, r0, asr #0x10 +_022FB6D0: + cmp r5, #8 + blt _022FB690 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + .align 2, 0 +_022FB6E0: .word DIRECTIONS_XY + arm_func_end AreEntitiesAdjacent + + arm_func_start ov29_022FB6E4 +ov29_022FB6E4: ; 0x022FB6E4 + stmdb sp!, {r4, lr} + mov r4, r0 + bl IsMonster__022F9720 + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + ldr r0, [r4, #0xb4] + ldrb r0, [r0, #0x48] + cmp r0, #0xd6 + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + ldmia sp!, {r4, pc} + arm_func_end ov29_022FB6E4 + + arm_func_start ov29_022FB718 +ov29_022FB718: ; 0x022FB718 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + mov sl, r0 + bl EntityIsValid__022F7364 + cmp r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr sb, [sl, #0xb4] + mov r1, #0 + mov r0, sl + strh r1, [sb, #0x16] + bl Conversion2IsActive + mov r6, r0 + mov r0, sl + mov r1, #0x38 + ldr r4, [sl, #0xb4] + bl IqSkillIsEnabled + cmp r0, #0 + ldrne r0, _022FB834 ; =_020A1870 + mov r8, #0 + ldrnesh r1, [r4, #0x16] + ldrnesh r0, [r0] +#ifdef JAPAN + add r5, r4, #0x120 +#else + add r5, r4, #0x124 +#endif + mov fp, r8 + addne r0, r1, r0 + strneh r0, [r4, #0x16] + mov r4, #1 +_022FB77C: + ldrb r0, [r5, r8, lsl #3] + add r7, r5, r8, lsl #3 + tst r0, #1 + movne r0, r4 + moveq r0, fp + tst r0, #0xff + beq _022FB7C0 + ldrh r2, [r7, #2] + mov r0, sl + mov r1, #0x39 + bic r2, r2, #0x100 + strh r2, [r7, #2] + bl IqSkillIsEnabled + cmp r0, #0 + ldrneh r0, [r7, #2] + orrne r0, r0, #0x100 + strneh r0, [r7, #2] +_022FB7C0: + add r0, r8, #1 + mov r0, r0, lsl #0x10 + mov r8, r0, asr #0x10 + cmp r8, #4 + blt _022FB77C + mov r0, sl + bl ov29_02348100 + cmp r6, #2 + bne _022FB7FC + mov r0, sl + bl Conversion2IsActive + cmp r0, #0 + bne _022FB7FC + mov r0, sl + bl ov29_02307CE0 +_022FB7FC: + ldrsh r1, [sb, #0x12] + ldrsh r0, [sb, #0x16] + ldr r2, _022FB838 ; =0x000003E7 + add r1, r1, r0 + cmp r1, r2 + ldrsh r0, [sb, #0x10] + movle r2, r1 + cmp r0, r2 + ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + ldr r0, _022FB838 ; =0x000003E7 + cmp r1, r0 + movgt r1, r0 + strh r1, [sb, #0x10] + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + .align 2, 0 +_022FB834: .word _020A1870 +_022FB838: .word 0x000003E7 + arm_func_end ov29_022FB718 + + arm_func_start ov29_022FB83C +ov29_022FB83C: ; 0x022FB83C + stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, lr} + mov sl, r0 + mov sb, r1 + bl EntityIsValid__022F7364 + cmp r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldr r8, [sl, #0xb4] + mov r7, #0 +#ifdef JAPAN + add r6, r8, #0x120 +#else + add r6, r8, #0x124 +#endif + mov r4, r7 + mov r5, #1 +_022FB868: + ldrb r0, [r6, r7, lsl #3] + mov r1, r7, lsl #3 + tst r0, #1 + movne r0, r5 + moveq r0, r4 + tst r0, #0xff + beq _022FB88C + add r0, r6, r1 + bl GetMoveBasePp +_022FB88C: + add r0, r7, #1 + mov r0, r0, lsl #0x10 + mov r7, r0, asr #0x10 + cmp r7, #4 + blt _022FB868 + mov r0, sl + bl ov29_022FB718 + cmp sb, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + ldrsh r2, [r8, #0x12] + ldrsh r1, [r8, #0x16] + ldr r0, _022FB91C ; =0x000003E7 + mov sb, #0 + add r1, r2, r1 + cmp r1, r0 + movgt r1, r0 + strh r1, [r8, #0x10] +#ifdef JAPAN + add r6, r8, #0x120 +#else + add r6, r8, #0x124 +#endif + mov r4, sb + mov r5, #1 +_022FB8DC: + ldrb r0, [r6, sb, lsl #3] + add r7, r6, sb, lsl #3 + tst r0, #1 + movne r0, r5 + moveq r0, r4 + tst r0, #0xff + beq _022FB904 + mov r0, r7 + bl GetMaxPp + strb r0, [r7, #6] +_022FB904: + add r0, sb, #1 + mov r0, r0, lsl #0x10 + mov sb, r0, asr #0x10 + cmp sb, #4 + blt _022FB8DC + ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, pc} + .align 2, 0 +_022FB91C: .word 0x000003E7 + arm_func_end ov29_022FB83C + + arm_func_start ov29_022FB920 +ov29_022FB920: ; 0x022FB920 +#ifdef EUROPE + stmdb sp!, {r4, r5, r6, lr} + ldr r5, _022FB980 ; =DUNGEON_PTR + mov r4, r0 + mov r6, #0 +_022FC33C_EU: + ldr r0, [r5] + add r0, r0, r6, lsl #2 + add r0, r0, #0x12000 + ldr r0, [r0, #0xb28] + bl ov29_022FB718 + add r0, r6, #1 + mov r0, r0, lsl #0x10 + mov r6, r0, asr #0x10 + cmp r6, #4 + blt _022FC33C_EU + bl UpdateMapSurveyorFlag + cmp r0, #0 + cmpne r4, #0 + ldmeqia sp!, {r4, r5, r6, pc} + bl UpdateMinimap + ldmia sp!, {r4, r5, r6, pc} +#else + stmdb sp!, {r3, r4, r5, lr} + ldr r4, _022FB980 ; =DUNGEON_PTR + mov r5, #0 +_022FB92C: + ldr r0, [r4] + add r0, r0, r5, lsl #2 + add r0, r0, #0x12000 +#ifdef JAPAN + ldr r0, [r0, #0xa84] +#else + ldr r0, [r0, #0xb28] +#endif + bl ov29_022FB718 + add r0, r5, #1 + mov r0, r0, lsl #0x10 + mov r5, r0, asr #0x10 + cmp r5, #4 + blt _022FB92C + mov r0, #0x41 + bl TeamMemberHasEnabledIqSkill + cmp r0, #0 + ldrne r0, _022FB980 ; =DUNGEON_PTR + movne r1, #1 + ldreq r0, _022FB980 ; =DUNGEON_PTR + moveq r1, #0 + ldr r0, [r0] + add r0, r0, #0x1a000 +#ifdef JAPAN + strb r1, [r0, #0x19d] +#else + strb r1, [r0, #0x241] +#endif + ldmia sp!, {r3, r4, r5, pc} +#endif + .align 2, 0 +_022FB980: .word DUNGEON_PTR + arm_func_end ov29_022FB920 + + arm_func_start ov29_022FB984 +ov29_022FB984: ; 0x022FB984 + mov r0, #0 + bx lr + arm_func_end ov29_022FB984 + + arm_func_start ov29_022FB98C +ov29_022FB98C: ; 0x022FB98C + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r2, #1 + ldr r0, _022FB9B8 ; =0x0000270F + mov r4, r1 + sub r3, r2, #2 + bl DisplayAnimatedNumbers + mov r0, r5 + mov r1, r4 + bl ov29_022E576C + ldmia sp!, {r3, r4, r5, pc} + .align 2, 0 +_022FB9B8: .word 0x0000270F + arm_func_end ov29_022FB98C + + arm_func_start ov29_022FB9BC +ov29_022FB9BC: ; 0x022FB9BC + stmdb sp!, {r3, lr} + ldr r0, [r0, #0xb4] + ldrb r0, [r0, #0xbc] + bl IsSecretBazaarNpcBehavior + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff + ldmia sp!, {r3, pc} + arm_func_end ov29_022FB9BC + + arm_func_start ov29_022FB9E0 +ov29_022FB9E0: ; 0x022FB9E0 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + mov r4, r1 + bl IsMonster__022F9720 + cmp r0, #0 + beq _022FBA4C + ldr r1, [r5, #0xb4] + mov r0, #0 +#ifdef JAPAN + add ip, r1, #0x120 +#else + add ip, r1, #0x124 +#endif + mov r2, r0 + mov r3, #1 + b _022FBA44 +_022FBA10: + ldrb r1, [ip, r0, lsl #3] + add lr, ip, r0, lsl #3 + tst r1, #1 + movne r1, r3 + moveq r1, r2 + tst r1, #0xff + beq _022FBA38 + ldrh r1, [lr, #4] + cmp r1, r4 + ldmeqia sp!, {r3, r4, r5, pc} +_022FBA38: + add r0, r0, #1 + mov r0, r0, lsl #0x10 + mov r0, r0, asr #0x10 +_022FBA44: + cmp r0, #4 + blt _022FBA10 +_022FBA4C: + mvn r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end ov29_022FB9E0 + + arm_func_start ov29_022FBA54 +ov29_022FBA54: ; 0x022FBA54 + stmdb sp!, {r3, lr} + bl ov29_022FB9E0 + cmp r0, #0 + movge r0, #1 + movlt r0, #0 + and r0, r0, #0xff + ldmia sp!, {r3, pc} + arm_func_end ov29_022FBA54 + + arm_func_start ov29_022FBA70 +ov29_022FBA70: ; 0x022FBA70 + stmdb sp!, {r4, lr} + mov r4, r0 + bl IsMonster__022F9720 + cmp r0, #0 + beq _022FBAAC + ldr r0, [r4, #0xb4] + ldrb r0, [r0, #0x48] + cmp r0, #0xfa + moveq r0, #1 + ldmeqia sp!, {r4, pc} + cmp r0, #0xd9 + blo _022FBAAC + cmp r0, #0xe4 + movlo r0, #1 + ldmloia sp!, {r4, pc} +_022FBAAC: + mov r0, #0 + ldmia sp!, {r4, pc} + arm_func_end ov29_022FBA70 + + arm_func_start ov29_022FBAB4 +ov29_022FBAB4: ; 0x022FBAB4 + ldr r2, [r0, #0xb4] + cmp r2, #0 + addne r0, r2, #0x100 + movne r1, #0 +#ifdef JAPAN + strneh r1, [r0, #0x8e] + strne r1, [r2, #0x188] +#else + strneh r1, [r0, #0x92] + strne r1, [r2, #0x18c] +#endif + bx lr + arm_func_end ov29_022FBAB4 diff --git a/include/dungeon_action.h b/include/dungeon_action.h index a44a91f4..2980e219 100644 --- a/include/dungeon_action.h +++ b/include/dungeon_action.h @@ -13,6 +13,6 @@ void ClearMonsterActionFields(struct action_data *monster_action); // // action_pointer: Pointer to the monster's action field // action: Value to set monster::action::action_id to. -void SetMonsterActionFields(struct action_data *monster_action, enum action action); +void SetMonsterActionFields(struct action_data *monster_action, enum action action_id); #endif //PMDSKY_DUNGEON_ACTION_H diff --git a/include/overlay_29_022FB538.h b/include/overlay_29_022FB538.h new file mode 100644 index 00000000..478a4a99 --- /dev/null +++ b/include/overlay_29_022FB538.h @@ -0,0 +1,12 @@ +#ifndef PMDSKY_OVERLAY_29_022FB538_H +#define PMDSKY_OVERLAY_29_022FB538_H + +#include "dungeon_mode.h" + +#ifndef JAPAN +// If there is a decoy on the floor that the entity can see, sets the entity's decoy_ai_tracker to 1 or 2, +// depending on whether the attacker who caused the decoy status is on the team or not, respectively. +void SetDecoyAiTracker(struct entity* entity); +#endif + +#endif //PMDSKY_OVERLAY_29_022FB538_H diff --git a/main.lsf b/main.lsf index 20645a6b..35b3910f 100644 --- a/main.lsf +++ b/main.lsf @@ -301,6 +301,8 @@ Overlay OVY_29 Object asm/overlay_29_022F7388.o Object src/overlay_29_022F9720.o Object asm/overlay_29_022F9744.o + Object src/overlay_29_022FB538.o + Object asm/overlay_29_022FB5EC.o Object src/joined_at_checks.o Object asm/overlay_29_022FBB1C.o Object src/overlay_29_022FC99C.o diff --git a/src/dungeon_ai.c b/src/dungeon_ai.c index 6ce76f3f..db9040f8 100644 --- a/src/dungeon_ai.c +++ b/src/dungeon_ai.c @@ -9,6 +9,7 @@ #include "dungeon_util_static.h" #include "dungeon_util.h" #include "dungeon_visibility.h" +#include "overlay_29_022FB538.h" #include "status_checks.h" #include "targeting.h" @@ -29,7 +30,6 @@ extern void SetActionPassTurnOrWalk(struct action_data *monster_action, s16 mons 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); void RunMonsterAi(struct entity *monster, u32 unused) { @@ -37,12 +37,12 @@ void RunMonsterAi(struct entity *monster, u32 unused) if (pokemon_info->flags & MOVEMENT_FLAG_SWAPPING_PLACES_PETRIFIED_ALLY) { if (pokemon_info->frozen_class_status.freeze == STATUS_FROZEN_PETRIFIED) - { EndFrozenClassStatus(monster, monster, TRUE); - } return; } + pokemon_info->decoy_ai_tracker = DECOY_AI_NONE; + if (pokemon_info->monster_behavior <= BEHAVIOR_FIXED_ENEMY || ShouldRunMonsterAi(monster)) { if (pokemon_info->monster_behavior != BEHAVIOR_RESCUE_TARGET && pokemon_info->use_held_item) @@ -54,12 +54,13 @@ void RunMonsterAi(struct entity *monster, u32 unused) LogMessageByIdWithPopupCheckUser(monster, CANNOT_USE_ITEM_MESSAGE); return; } + AiDecideUseItem(monster); + if (pokemon_info->action.action_id != ACTION_NOTHING) - { return; - } } + if (!HasStatusThatPreventsActing(monster)) { #ifdef JAPAN @@ -70,13 +71,10 @@ void RunMonsterAi(struct entity *monster, u32 unused) struct entity *target = DUNGEON_PTR[0]->active_monster_ptrs[i]; bool8 entity_is_valid; if (target == NULL) - { entity_is_valid = FALSE; - } else - { entity_is_valid = target->type != ENTITY_NOTHING; - } + if (entity_is_valid && GetEntInfo(target)->curse_class_status.curse == STATUS_CURSE_DECOY && CanSeeTarget(monster, target)) @@ -89,7 +87,9 @@ void RunMonsterAi(struct entity *monster, u32 unused) #else SetDecoyAiTracker(monster); #endif + ClearMonsterActionFields(&pokemon_info->action); + if (pokemon_info->monster_behavior == BEHAVIOR_RESCUE_TARGET) { SetActionPassTurnOrWalk(&pokemon_info->action, pokemon_info->id); @@ -98,27 +98,27 @@ void RunMonsterAi(struct entity *monster, u32 unused) pokemon_info->target_pos.y = monster->pos.y - 1; return; } + AiDecideUseItem(monster); + if (pokemon_info->action.action_id == ACTION_NOTHING) { if (!IqSkillIsEnabled(monster, IQ_DEDICATED_TRAVELER)) { ChooseAiMove(monster); + if (pokemon_info->action.action_id != ACTION_NOTHING) - { return; - } + if (pokemon_info->cringe_class_status.cringe == STATUS_CRINGE_CONFUSED) - { SetActionPassTurnOrWalk(&pokemon_info->action, pokemon_info->id); - } else { if (!GetCanMoveFlag(pokemon_info->id)) - { return; - } + AiMovement(monster, TRUE); + if (pokemon_info->is_not_team_member && IqSkillIsEnabled(monster, IQ_EXCLUSIVE_MOVE_USER) && pokemon_info->action.action_id <= ACTION_PASS_TURN) { SubstitutePlaceholderStringTags(0, monster, 0); @@ -127,20 +127,21 @@ void RunMonsterAi(struct entity *monster, u32 unused) } return; } + if (pokemon_info->cringe_class_status.cringe == STATUS_CRINGE_CONFUSED) { SetActionPassTurnOrWalk(&pokemon_info->action, pokemon_info->id); return; } + if (GetCanMoveFlag(pokemon_info->id)) - { AiMovement(monster, TRUE); - } + if (pokemon_info->action.action_id != ACTION_NOTHING && pokemon_info->action.action_id != ACTION_PASS_TURN) - { return; - } + ChooseAiMove(monster); + if (GetCanMoveFlag(pokemon_info->id) && pokemon_info->is_not_team_member && IqSkillIsEnabled(monster, IQ_EXCLUSIVE_MOVE_USER) && @@ -149,6 +150,7 @@ void RunMonsterAi(struct entity *monster, u32 unused) SubstitutePlaceholderStringTags(0, monster, 0); LogMessageByIdWithPopupCheckUser(monster, WATCHING_CAREFULLY_MESSAGE); } + if (pokemon_info->action.action_id != ACTION_NOTHING && pokemon_info->action.action_id != ACTION_PASS_TURN) { pokemon_info->ai_not_next_to_target = FALSE; diff --git a/src/overlay_29_022FB538.c b/src/overlay_29_022FB538.c new file mode 100644 index 00000000..d256f391 --- /dev/null +++ b/src/overlay_29_022FB538.c @@ -0,0 +1,35 @@ +#include "overlay_29_022FB538.h" +#include "dungeon.h" +#include "dungeon_util_static.h" +#include "dungeon_visibility.h" +#include "overlay_29_022F7364.h" +#include "targeting.h" + +extern struct dungeon *DUNGEON_PTR[]; + +#ifndef JAPAN +void SetDecoyAiTracker(struct entity* entity) +{ + if (!EntityIsValid__022F7364(entity)) + return; + + struct monster *pokemon_info = GetEntInfo(entity); + pokemon_info->decoy_ai_tracker = DECOY_AI_NONE; + + if (!DUNGEON_PTR[0]->decoy_is_active) + return; + + for (s32 i = 0; i < DUNGEON_MAX_POKEMON; i++) + { + struct entity *target = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__022F7364(target) && + target != entity && + GetEntInfo(target)->curse_class_status.curse == STATUS_CURSE_DECOY && + CanSeeTarget(entity, target)) + { + pokemon_info->decoy_ai_tracker = GetEntInfo(target)->curse_class_status.curse_applier_non_team_member_flag ? DECOY_AI_WILD : DECOY_AI_TEAM; + break; + } + } +} +#endif