Decomped SetDecoyAiTracker

This commit is contained in:
AnonymousRandomPerson
2025-05-28 22:09:57 -04:00
parent c585361b8d
commit 58a940eedb
9 changed files with 558 additions and 548 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

447
asm/overlay_29_022FB5EC.s Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;

35
src/overlay_29_022FB538.c Normal file
View File

@@ -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