Decomped GetEntityMoveTargetAndRange

This commit is contained in:
AnonymousRandomPerson 2025-06-22 16:25:39 -05:00
parent 7137a02a5a
commit bbbfb856e0
9 changed files with 586 additions and 445 deletions

View File

@ -1,39 +1,20 @@
#pragma once
.public AiConsiderMove
.public AreOrbsAllowed
.public BoostSpeedOneStage
.public DUNGEON_PTR
.public DungeonRandInt
.public EnemyEvolution
.public EntityIsValid__02319F8C
.public EntityIsValid__0231B194
.public ExclusiveItemEffectIsActive__0231A87C
.public GetApparentWeather
.public GetItemMoveId16
.public GetItemToUse
.public GetMoveTargetAndRange
.public GetTreasureBoxChances
.public InitMove
.public IsFloorOver
.public IsMonster__0231A9D4
.public IsMoveRangeString19
.public LogMessageByIdWithPopupCheckParticipants
.public LogMessageByIdWithPopupCheckUser
.public LogMessageByIdWithPopupCheckUserTarget
.public MonsterIsType
.public NATURAL_GIFT_ITEM_TABLE
.public ov29_022E4110
.public ov29_022EB4E8
.public ov29_022FB9E0
.public ov29_022FBAB4
.public ov29_02321274
.public ov29_0232145C
.public ov29_02322374
.public ov29_0232E80C
.public ov29_02344B44
.public RemoveUsedItem
.public SetActionUseMoveAi
.public SubstitutePlaceholderStringTags
.public TryActivateTruant
.public UpdateAiTargetPos
.public WEATHER_BALL_TYPE_TABLE
.public ov29_022EB4E8
.public ov29_022FBAB4
.public ov29_02321274
.public ov29_02322374
.public ov29_02344B44

View File

@ -0,0 +1,20 @@
#pragma once
.public BoostSpeedOneStage
.public DUNGEON_PTR
.public DungeonRandInt
.public EntityIsValid__0231B194
.public GetApparentWeather
.public GetEntityMoveTargetAndRange
.public GetTreasureBoxChances
.public IsMonster__0231A9D4
.public LogMessageByIdWithPopupCheckParticipants
.public LogMessageByIdWithPopupCheckUserTarget
.public NATURAL_GIFT_ITEM_TABLE
.public SetActionUseMoveAi
.public SubstitutePlaceholderStringTags
.public WEATHER_BALL_TYPE_TABLE
.public ov29_022E4110
.public ov29_022FB9E0
.public ov29_0232145C
.public ov29_0232E80C
.public ov29_02344B44

View File

@ -207,422 +207,3 @@ _0231ACA0: .word 0x00000DFB + OV29_0231A9F8_OFFSET
_0231ACA4: .word 0x00000DFC + OV29_0231A9F8_OFFSET
_0231ACA8: .word 0x00000141
arm_func_end ov29_0231A9F8
arm_func_start GetEntityMoveTargetAndRange
GetEntityMoveTargetAndRange: ; 0x0231ACAC
stmdb sp!, {r4, r5, r6, lr}
mov r5, r1
ldrh r1, [r5, #4]
mov r4, r2
mov r6, r0
cmp r1, #0xed
cmpeq r4, #0
bne _0231ACE0
mov r1, #0xe
bl MonsterIsType
cmp r0, #0
moveq r0, #0x73
ldmeqia sp!, {r4, r5, r6, pc}
_0231ACE0:
mov r0, r5
mov r1, r4
bl GetMoveTargetAndRange
mov r4, r0
mov r0, r5
bl IsMoveRangeString19
cmp r0, #0
beq _0231AD2C
mov r0, r6
mov r1, #0x55
bl ExclusiveItemEffectIsActive__0231A87C
cmp r0, #0
beq _0231AD2C
ldr r0, _0231AD34 ; =0x00000273
cmp r4, r0
subeq r4, r0, #0x12
beq _0231AD2C
cmp r4, #0x73
moveq r4, #0x61
_0231AD2C:
mov r0, r4
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
_0231AD34: .word 0x00000273
arm_func_end GetEntityMoveTargetAndRange
arm_func_start ov29_0231AD38
ov29_0231AD38: ; 0x0231AD38
stmdb sp!, {r4, r5, r6, lr}
mov r6, r0
mov r5, r1
mov r2, #1
bl GetEntityMoveTargetAndRange
and r4, r0, #0xf
mov r0, r6
mov r1, r5
mov r2, #0
bl GetEntityMoveTargetAndRange
cmp r4, #3
and r0, r0, #0xf
cmpne r4, #1
cmpne r0, #4
cmpne r0, #3
cmpne r0, #1
cmpne r0, #6
beq _0231ADA0
mov r0, r6
mov r1, r5
mov r2, #0
bl GetEntityMoveTargetAndRange
and r0, r0, #0xf0
cmp r0, #0x70
movne r0, #0
ldmneia sp!, {r4, r5, r6, pc}
_0231ADA0:
mov r0, #1
ldmia sp!, {r4, r5, r6, pc}
arm_func_end ov29_0231AD38
arm_func_start ov29_0231ADA8
ov29_0231ADA8: ; 0x0231ADA8
stmdb sp!, {r3, r4, r5, lr}
sub sp, sp, #8
ldr r1, [r0, #0xb4]
mov r0, #0
mov r5, r0
#ifdef JAPAN
add r4, r1, #0x120
#else
add r4, r1, #0x124
#endif
mov ip, r0
mov lr, #1
add r2, sp, #0
_0231ADCC:
ldrb r1, [r4, r5, lsl #3]
add r3, r4, r5, lsl #3
tst r1, #1
movne r1, lr
moveq r1, ip
tst r1, #0xff
beq _0231AE00
ldrh r3, [r3, #4]
add r1, r0, #1
mov r0, r0, lsl #1
mov r1, r1, lsl #0x10
strh r3, [r2, r0]
mov r0, r1, lsr #0x10
_0231AE00:
add r1, r5, #1
mov r1, r1, lsl #0x10
mov r5, r1, lsr #0x10
cmp r5, #4
blo _0231ADCC
cmp r0, #0
moveq r0, #0
beq _0231AE34
bl DungeonRandInt
mov r0, r0, lsl #0x10
add r1, sp, #0
mov r0, r0, lsr #0xf
ldrh r0, [r1, r0]
_0231AE34:
add sp, sp, #8
ldmia sp!, {r3, r4, r5, pc}
arm_func_end ov29_0231ADA8
arm_func_start ov29_0231AE3C
ov29_0231AE3C: ; 0x0231AE3C
stmdb sp!, {r3, lr}
ldr ip, [r0, #0xb4]
mov r0, #0
mov lr, r0
mov r2, r0
mov r3, #1
_0231AE54:
add r1, ip, lr, lsl #3
#ifdef JAPAN
ldrb r1, [r1, #0x120]
#else
ldrb r1, [r1, #0x124]
#endif
tst r1, #1
movne r1, r3
moveq r1, r2
tst r1, #0xff
add r1, lr, #1
addne r0, r0, #1
mov r1, r1, lsl #0x10
movne r0, r0, lsl #0x10
mov lr, r1, lsr #0x10
movne r0, r0, lsr #0x10
cmp lr, #4
blo _0231AE54
ldmia sp!, {r3, pc}
arm_func_end ov29_0231AE3C
arm_func_start GetEntityNaturalGiftInfo
GetEntityNaturalGiftInfo: ; 0x0231AE90
stmdb sp!, {r3, r4, r5, lr}
mov r4, r0
bl IsMonster__0231A9D4
cmp r0, #0
ldrne r4, [r4, #0xb4]
ldrnesh r0, [r4, #0x66]
cmpne r0, #0
beq _0231AF00
mov ip, #0
ldr r3, _0231AF08 ; =NATURAL_GIFT_ITEM_TABLE
mov lr, ip
mov r1, #6
_0231AEC0:
smulbb r5, lr, r1
ldrsh r2, [r3, r5]
cmp r2, #0
beq _0231AEF0
ldrsh r0, [r4, #0x66]
cmp r0, r2
moveq ip, #1
beq _0231AEF0
add r0, lr, #1
mov r0, r0, lsl #0x10
mov lr, r0, asr #0x10
b _0231AEC0
_0231AEF0:
cmp ip, #0
ldrne r0, _0231AF08 ; =NATURAL_GIFT_ITEM_TABLE
addne r0, r0, r5
ldmneia sp!, {r3, r4, r5, pc}
_0231AF00:
mov r0, #0
ldmia sp!, {r3, r4, r5, pc}
.align 2, 0
_0231AF08: .word NATURAL_GIFT_ITEM_TABLE
arm_func_end GetEntityNaturalGiftInfo
arm_func_start GetEntityWeatherBallType
GetEntityWeatherBallType: ; 0x0231AF0C
stmdb sp!, {r3, lr}
bl GetApparentWeather
ldr r1, _0231AF20 ; =WEATHER_BALL_TYPE_TABLE
ldrb r0, [r1, r0]
ldmia sp!, {r3, pc}
.align 2, 0
_0231AF20: .word WEATHER_BALL_TYPE_TABLE
arm_func_end GetEntityWeatherBallType
arm_func_start ov29_0231AF24
ov29_0231AF24: ; 0x0231AF24
#ifdef JAPAN
#define OV29_0231AF24_OFFSET -4
#else
#define OV29_0231AF24_OFFSET 0
#endif
stmdb sp!, {r3, r4, r5, r6, lr}
sub sp, sp, #4
mov r6, r0
mov r5, r1
mov r4, r2
bl IsMonster__0231A9D4
cmp r0, #0
beq _0231AFAC
mov r0, r6
mov r1, r5
bl ov29_022FB9E0
mov r1, r0
cmp r4, #0
beq _0231AF98
cmp r1, #0
bge _0231AF98
ldr r4, [r6, #0xb4]
mov r1, #0
mov r2, r1
add r0, r4, #0x4a
bl SetActionUseMoveAi
mov r2, #1
strb r2, [r4, #0x124 + OV29_0231AF24_OFFSET]
add r0, r4, #0x100
mov r1, #0
strh r1, [r0, #0x26 + OV29_0231AF24_OFFSET]
strh r5, [r0, #0x28 + OV29_0231AF24_OFFSET]
strb r2, [r4, #0x12a + OV29_0231AF24_OFFSET]
strb r1, [r4, #0x12b + OV29_0231AF24_OFFSET]
_0231AF98:
mov r3, #0
mov r0, r6
mov r2, #1
str r3, [sp]
bl ov29_0232145C
_0231AFAC:
add sp, sp, #4
ldmia sp!, {r3, r4, r5, r6, pc}
arm_func_end ov29_0231AF24
arm_func_start ov29_0231AFB4
ov29_0231AFB4: ; 0x0231AFB4
stmdb sp!, {r4, lr}
mov ip, #0
ldr r1, _0231B004 ; =DUNGEON_PTR
mov r2, ip
mov r3, ip
_0231AFC8:
ldr r0, [r1]
mov r4, r3
#ifdef JAPAN
add r0, r0, #0x1840
add r0, r0, #0x18000
#else
add r0, r0, #0xe4
add r0, r0, #0x19800
#endif
add lr, r0, ip, lsl #4
_0231AFDC:
str r2, [lr, r4, lsl #3]
add r0, lr, r4, lsl #3
add r4, r4, #1
str r2, [r0, #4]
cmp r4, #2
blt _0231AFDC
add ip, ip, #1
cmp ip, #2
blt _0231AFC8
ldmia sp!, {r4, pc}
.align 2, 0
_0231B004: .word DUNGEON_PTR
arm_func_end ov29_0231AFB4
arm_func_start ov29_0231B008
ov29_0231B008: ; 0x0231B008
stmdb sp!, {r3, r4, r5, lr}
mov lr, #0
ldr r1, _0231B05C ; =DUNGEON_PTR
mov r3, lr
mov r2, #2
mov ip, lr
_0231B020:
ldr r0, [r1]
mov r5, ip
#ifdef JAPAN
add r0, r0, #0x1840
add r0, r0, #0x18000
#else
add r0, r0, #0xe4
add r0, r0, #0x19800
#endif
add r4, r0, lr, lsl #4
_0231B034:
str r3, [r4, r5, lsl #3]
add r0, r4, r5, lsl #3
add r5, r5, #1
str r2, [r0, #4]
cmp r5, #2
blt _0231B034
add lr, lr, #1
cmp lr, #2
blt _0231B020
ldmia sp!, {r3, r4, r5, pc}
.align 2, 0
_0231B05C: .word DUNGEON_PTR
arm_func_end ov29_0231B008
arm_func_start ActivateMotorDrive
ActivateMotorDrive: ; 0x0231B060
stmdb sp!, {r3, r4, lr}
sub sp, sp, #4
#ifdef JAPAN
mov ip, #0x66
mov r4, r0
rsb r2, ip, #0x9e0
#else
ldr r2, _0231B0A0 ; =0x00000C3B
mov ip, #0x66
mov r4, r0
#endif
mov r1, #0
mov r3, #2
str ip, [sp]
bl LogMessageByIdWithPopupCheckParticipants
mov r0, r4
mov r1, r4
mov r2, #0
mov r3, #1
bl BoostSpeedOneStage
add sp, sp, #4
ldmia sp!, {r3, r4, pc}
.align 2, 0
#ifndef JAPAN
_0231B0A0: .word 0x00000C3B
#endif
arm_func_end ActivateMotorDrive
arm_func_start TryActivateFrisk
TryActivateFrisk: ; 0x0231B0A4
stmdb sp!, {r4, r5, r6, lr}
sub sp, sp, #8
mov r5, r0
mov r4, r1
bl EntityIsValid__0231B194
cmp r0, #0
beq _0231B184
mov r0, r4
bl EntityIsValid__0231B194
cmp r0, #0
beq _0231B184
ldr r0, [r5, #0xb4]
ldr r6, [r4, #0xb4]
ldrb r0, [r0, #6]
cmp r0, #0
bne _0231B184
bl ov29_0232E80C
cmp r4, r0
ldrneb r0, [r6, #6]
cmpne r0, #0
beq _0231B184
ldrsh r0, [r6, #0x66]
cmp r0, #0
bne _0231B150
ldrsh r0, [r6, #2]
add r1, sp, #0
bl GetTreasureBoxChances
ldrsh r0, [sp, #4]
cmp r0, #0
ldrlesh r0, [sp, #6]
cmple r0, #0
ble _0231B184
mov r0, r5
bl ov29_022E4110
mov r1, r4
mov r0, #1
mov r2, #0
bl SubstitutePlaceholderStringTags
ldr r2, _0231B18C ; =0x00000C3D
mov r0, r5
mov r1, r4
bl LogMessageByIdWithPopupCheckUserTarget
b _0231B184
_0231B150:
mov r0, r5
bl ov29_022E4110
mov r1, r4
mov r0, #1
mov r2, #0
bl SubstitutePlaceholderStringTags
add r1, r6, #0x62
mov r0, #2
bl ov29_02344B44
ldr r2, _0231B190 ; =0x00000C3C
mov r0, r5
mov r1, r4
bl LogMessageByIdWithPopupCheckUserTarget
_0231B184:
add sp, sp, #8
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
#ifdef JAPAN
_0231B18C: .word 0x0000097C
_0231B190: .word 0x0000097B
#else
_0231B18C: .word 0x00000C3D
_0231B190: .word 0x00000C3C
#endif
arm_func_end TryActivateFrisk

381
asm/overlay_29_0231AD38.s Normal file
View File

@ -0,0 +1,381 @@
.include "asm/macros.inc"
.include "overlay_29_0231AD38.inc"
.text
arm_func_start ov29_0231AD38
ov29_0231AD38: ; 0x0231AD38
stmdb sp!, {r4, r5, r6, lr}
mov r6, r0
mov r5, r1
mov r2, #1
bl GetEntityMoveTargetAndRange
and r4, r0, #0xf
mov r0, r6
mov r1, r5
mov r2, #0
bl GetEntityMoveTargetAndRange
cmp r4, #3
and r0, r0, #0xf
cmpne r4, #1
cmpne r0, #4
cmpne r0, #3
cmpne r0, #1
cmpne r0, #6
beq _0231ADA0
mov r0, r6
mov r1, r5
mov r2, #0
bl GetEntityMoveTargetAndRange
and r0, r0, #0xf0
cmp r0, #0x70
movne r0, #0
ldmneia sp!, {r4, r5, r6, pc}
_0231ADA0:
mov r0, #1
ldmia sp!, {r4, r5, r6, pc}
arm_func_end ov29_0231AD38
arm_func_start ov29_0231ADA8
ov29_0231ADA8: ; 0x0231ADA8
stmdb sp!, {r3, r4, r5, lr}
sub sp, sp, #8
ldr r1, [r0, #0xb4]
mov r0, #0
mov r5, r0
#ifdef JAPAN
add r4, r1, #0x120
#else
add r4, r1, #0x124
#endif
mov ip, r0
mov lr, #1
add r2, sp, #0
_0231ADCC:
ldrb r1, [r4, r5, lsl #3]
add r3, r4, r5, lsl #3
tst r1, #1
movne r1, lr
moveq r1, ip
tst r1, #0xff
beq _0231AE00
ldrh r3, [r3, #4]
add r1, r0, #1
mov r0, r0, lsl #1
mov r1, r1, lsl #0x10
strh r3, [r2, r0]
mov r0, r1, lsr #0x10
_0231AE00:
add r1, r5, #1
mov r1, r1, lsl #0x10
mov r5, r1, lsr #0x10
cmp r5, #4
blo _0231ADCC
cmp r0, #0
moveq r0, #0
beq _0231AE34
bl DungeonRandInt
mov r0, r0, lsl #0x10
add r1, sp, #0
mov r0, r0, lsr #0xf
ldrh r0, [r1, r0]
_0231AE34:
add sp, sp, #8
ldmia sp!, {r3, r4, r5, pc}
arm_func_end ov29_0231ADA8
arm_func_start ov29_0231AE3C
ov29_0231AE3C: ; 0x0231AE3C
stmdb sp!, {r3, lr}
ldr ip, [r0, #0xb4]
mov r0, #0
mov lr, r0
mov r2, r0
mov r3, #1
_0231AE54:
add r1, ip, lr, lsl #3
#ifdef JAPAN
ldrb r1, [r1, #0x120]
#else
ldrb r1, [r1, #0x124]
#endif
tst r1, #1
movne r1, r3
moveq r1, r2
tst r1, #0xff
add r1, lr, #1
addne r0, r0, #1
mov r1, r1, lsl #0x10
movne r0, r0, lsl #0x10
mov lr, r1, lsr #0x10
movne r0, r0, lsr #0x10
cmp lr, #4
blo _0231AE54
ldmia sp!, {r3, pc}
arm_func_end ov29_0231AE3C
arm_func_start GetEntityNaturalGiftInfo
GetEntityNaturalGiftInfo: ; 0x0231AE90
stmdb sp!, {r3, r4, r5, lr}
mov r4, r0
bl IsMonster__0231A9D4
cmp r0, #0
ldrne r4, [r4, #0xb4]
ldrnesh r0, [r4, #0x66]
cmpne r0, #0
beq _0231AF00
mov ip, #0
ldr r3, _0231AF08 ; =NATURAL_GIFT_ITEM_TABLE
mov lr, ip
mov r1, #6
_0231AEC0:
smulbb r5, lr, r1
ldrsh r2, [r3, r5]
cmp r2, #0
beq _0231AEF0
ldrsh r0, [r4, #0x66]
cmp r0, r2
moveq ip, #1
beq _0231AEF0
add r0, lr, #1
mov r0, r0, lsl #0x10
mov lr, r0, asr #0x10
b _0231AEC0
_0231AEF0:
cmp ip, #0
ldrne r0, _0231AF08 ; =NATURAL_GIFT_ITEM_TABLE
addne r0, r0, r5
ldmneia sp!, {r3, r4, r5, pc}
_0231AF00:
mov r0, #0
ldmia sp!, {r3, r4, r5, pc}
.align 2, 0
_0231AF08: .word NATURAL_GIFT_ITEM_TABLE
arm_func_end GetEntityNaturalGiftInfo
arm_func_start GetEntityWeatherBallType
GetEntityWeatherBallType: ; 0x0231AF0C
stmdb sp!, {r3, lr}
bl GetApparentWeather
ldr r1, _0231AF20 ; =WEATHER_BALL_TYPE_TABLE
ldrb r0, [r1, r0]
ldmia sp!, {r3, pc}
.align 2, 0
_0231AF20: .word WEATHER_BALL_TYPE_TABLE
arm_func_end GetEntityWeatherBallType
arm_func_start ov29_0231AF24
ov29_0231AF24: ; 0x0231AF24
#ifdef JAPAN
#define OV29_0231AF24_OFFSET -4
#else
#define OV29_0231AF24_OFFSET 0
#endif
stmdb sp!, {r3, r4, r5, r6, lr}
sub sp, sp, #4
mov r6, r0
mov r5, r1
mov r4, r2
bl IsMonster__0231A9D4
cmp r0, #0
beq _0231AFAC
mov r0, r6
mov r1, r5
bl ov29_022FB9E0
mov r1, r0
cmp r4, #0
beq _0231AF98
cmp r1, #0
bge _0231AF98
ldr r4, [r6, #0xb4]
mov r1, #0
mov r2, r1
add r0, r4, #0x4a
bl SetActionUseMoveAi
mov r2, #1
strb r2, [r4, #0x124 + OV29_0231AF24_OFFSET]
add r0, r4, #0x100
mov r1, #0
strh r1, [r0, #0x26 + OV29_0231AF24_OFFSET]
strh r5, [r0, #0x28 + OV29_0231AF24_OFFSET]
strb r2, [r4, #0x12a + OV29_0231AF24_OFFSET]
strb r1, [r4, #0x12b + OV29_0231AF24_OFFSET]
_0231AF98:
mov r3, #0
mov r0, r6
mov r2, #1
str r3, [sp]
bl ov29_0232145C
_0231AFAC:
add sp, sp, #4
ldmia sp!, {r3, r4, r5, r6, pc}
arm_func_end ov29_0231AF24
arm_func_start ov29_0231AFB4
ov29_0231AFB4: ; 0x0231AFB4
stmdb sp!, {r4, lr}
mov ip, #0
ldr r1, _0231B004 ; =DUNGEON_PTR
mov r2, ip
mov r3, ip
_0231AFC8:
ldr r0, [r1]
mov r4, r3
#ifdef JAPAN
add r0, r0, #0x1840
add r0, r0, #0x18000
#else
add r0, r0, #0xe4
add r0, r0, #0x19800
#endif
add lr, r0, ip, lsl #4
_0231AFDC:
str r2, [lr, r4, lsl #3]
add r0, lr, r4, lsl #3
add r4, r4, #1
str r2, [r0, #4]
cmp r4, #2
blt _0231AFDC
add ip, ip, #1
cmp ip, #2
blt _0231AFC8
ldmia sp!, {r4, pc}
.align 2, 0
_0231B004: .word DUNGEON_PTR
arm_func_end ov29_0231AFB4
arm_func_start ov29_0231B008
ov29_0231B008: ; 0x0231B008
stmdb sp!, {r3, r4, r5, lr}
mov lr, #0
ldr r1, _0231B05C ; =DUNGEON_PTR
mov r3, lr
mov r2, #2
mov ip, lr
_0231B020:
ldr r0, [r1]
mov r5, ip
#ifdef JAPAN
add r0, r0, #0x1840
add r0, r0, #0x18000
#else
add r0, r0, #0xe4
add r0, r0, #0x19800
#endif
add r4, r0, lr, lsl #4
_0231B034:
str r3, [r4, r5, lsl #3]
add r0, r4, r5, lsl #3
add r5, r5, #1
str r2, [r0, #4]
cmp r5, #2
blt _0231B034
add lr, lr, #1
cmp lr, #2
blt _0231B020
ldmia sp!, {r3, r4, r5, pc}
.align 2, 0
_0231B05C: .word DUNGEON_PTR
arm_func_end ov29_0231B008
arm_func_start ActivateMotorDrive
ActivateMotorDrive: ; 0x0231B060
stmdb sp!, {r3, r4, lr}
sub sp, sp, #4
#ifdef JAPAN
mov ip, #0x66
mov r4, r0
rsb r2, ip, #0x9e0
#else
ldr r2, _0231B0A0 ; =0x00000C3B
mov ip, #0x66
mov r4, r0
#endif
mov r1, #0
mov r3, #2
str ip, [sp]
bl LogMessageByIdWithPopupCheckParticipants
mov r0, r4
mov r1, r4
mov r2, #0
mov r3, #1
bl BoostSpeedOneStage
add sp, sp, #4
ldmia sp!, {r3, r4, pc}
.align 2, 0
#ifndef JAPAN
_0231B0A0: .word 0x00000C3B
#endif
arm_func_end ActivateMotorDrive
arm_func_start TryActivateFrisk
TryActivateFrisk: ; 0x0231B0A4
stmdb sp!, {r4, r5, r6, lr}
sub sp, sp, #8
mov r5, r0
mov r4, r1
bl EntityIsValid__0231B194
cmp r0, #0
beq _0231B184
mov r0, r4
bl EntityIsValid__0231B194
cmp r0, #0
beq _0231B184
ldr r0, [r5, #0xb4]
ldr r6, [r4, #0xb4]
ldrb r0, [r0, #6]
cmp r0, #0
bne _0231B184
bl ov29_0232E80C
cmp r4, r0
ldrneb r0, [r6, #6]
cmpne r0, #0
beq _0231B184
ldrsh r0, [r6, #0x66]
cmp r0, #0
bne _0231B150
ldrsh r0, [r6, #2]
add r1, sp, #0
bl GetTreasureBoxChances
ldrsh r0, [sp, #4]
cmp r0, #0
ldrlesh r0, [sp, #6]
cmple r0, #0
ble _0231B184
mov r0, r5
bl ov29_022E4110
mov r1, r4
mov r0, #1
mov r2, #0
bl SubstitutePlaceholderStringTags
ldr r2, _0231B18C ; =0x00000C3D
mov r0, r5
mov r1, r4
bl LogMessageByIdWithPopupCheckUserTarget
b _0231B184
_0231B150:
mov r0, r5
bl ov29_022E4110
mov r1, r4
mov r0, #1
mov r2, #0
bl SubstitutePlaceholderStringTags
add r1, r6, #0x62
mov r0, #2
bl ov29_02344B44
ldr r2, _0231B190 ; =0x00000C3C
mov r0, r5
mov r1, r4
bl LogMessageByIdWithPopupCheckUserTarget
_0231B184:
add sp, sp, #8
ldmia sp!, {r4, r5, r6, pc}
.align 2, 0
#ifdef JAPAN
_0231B18C: .word 0x0000097C
_0231B190: .word 0x0000097B
#else
_0231B18C: .word 0x00000C3D
_0231B190: .word 0x00000C3C
#endif
arm_func_end TryActivateFrisk

View File

@ -1460,6 +1460,143 @@ enum item_data_flag {
ITEM_DATA_FLAG_THROWABLE_AT_ENEMY = 1 << 7,
};
// Exclusive effect ID. These are usually encoded as bitvectors.
// Some of these are unused in-game but still labeled if easy to infer.
// See https://docs.google.com/spreadsheets/d/1XfE0x6JtLKDlCCvp5doNwyFpMX0C2HZCUCiDc1eMb1g
// for a list of exclusive items that map to each effect.
enum exclusive_item_effect_id {
EXCLUSIVE_EFF_STAT_BOOST = 0, // Normal stat boosts; don't have a unique effect
EXCLUSIVE_EFF_NO_PARALYSIS = 1,
EXCLUSIVE_EFF_NO_CONFUSION = 2,
EXCLUSIVE_EFF_NO_INFATUATION = 3,
EXCLUSIVE_EFF_NO_FREEZE = 4,
EXCLUSIVE_EFF_NO_CRITICAL_HITS = 5,
EXCLUSIVE_EFF_HALVED_EXPLOSION_DAMAGE = 6,
EXCLUSIVE_EFF_NO_EXPLOSION_DAMAGE = 7,
EXCLUSIVE_EFF_NO_MOVE_DISABLING = 8,
EXCLUSIVE_EFF_NO_WEATHER_DAMAGE = 9,
EXCLUSIVE_EFF_NO_SLEEP = 10,
EXCLUSIVE_EFF_MAY_POISON_PARALYZE_SLEEP_ATTACKERS = 11,
EXCLUSIVE_EFF_UNUSED_0xC = 12, // Probably "may afflict <some status> on attackers"
EXCLUSIVE_EFF_MAY_SLEEP_ATTACKERS = 13,
EXCLUSIVE_EFF_MAY_NIGHTMARE_ATTACKERS = 14,
EXCLUSIVE_EFF_MAY_BURN_ATTACKERS = 15,
EXCLUSIVE_EFF_MAY_PARALYZE_ATTACKERS = 16,
EXCLUSIVE_EFF_MAY_CONFUSE_ATTACKERS = 17,
EXCLUSIVE_EFF_MAY_INFATUATE_ATTACKERS = 18,
EXCLUSIVE_EFF_MAY_FREEZE_ATTACKERS = 19,
EXCLUSIVE_EFF_MAY_SHADOW_HOLD_ATTACKERS = 20,
EXCLUSIVE_EFF_MAY_CONSTRICT_ATTACKERS = 21,
EXCLUSIVE_EFF_MAY_CRINGE_ATTACKERS = 22,
EXCLUSIVE_EFF_MAY_BLINKER_ATTACKERS = 23,
EXCLUSIVE_EFF_MAY_SEAL_ATTACKER_MOVES = 24,
EXCLUSIVE_EFF_MAY_GO_INVISIBLE_WHEN_ATTACKED = 25,
EXCLUSIVE_EFF_MAY_BOOST_MOVEMENT_SPEED_WHEN_ATTACKED = 26,
EXCLUSIVE_EFF_MAY_WARP_WHEN_ATTACKED = 27,
EXCLUSIVE_EFF_MAY_PERISH_SONG_ATTACKERS = 28,
EXCLUSIVE_EFF_MAY_SLOW_ATTACKERS = 29,
EXCLUSIVE_EFF_HALVED_PHYSICAL_DAMAGE = 30,
EXCLUSIVE_EFF_HALVED_SPECIAL_DAMAGE = 31,
EXCLUSIVE_EFF_COUNTER_PHYSICAL_DAMAGE = 32,
EXCLUSIVE_EFF_MAY_BOUNCE_STATUS_MOVES = 33,
EXCLUSIVE_EFF_MAY_ENDURE = 34,
EXCLUSIVE_EFF_COUNTER_25_PCT_PHYSICAL_DAMAGE = 35,
EXCLUSIVE_EFF_LONG_TOSS = 36,
EXCLUSIVE_EFF_MAY_BOUNCE_MOVES = 37,
EXCLUSIVE_EFF_NO_STAT_DROPS = 38,
EXCLUSIVE_EFF_CONVERSION_2_WHEN_HIT = 39,
EXCLUSIVE_EFF_NO_STATUS_WHEN_CLEAR = 40,
EXCLUSIVE_EFF_NO_STATUS_WHEN_SUNNY = 41,
EXCLUSIVE_EFF_NO_STATUS_WHEN_SANDSTORM = 42,
EXCLUSIVE_EFF_NO_STATUS_WHEN_CLOUDY = 43,
EXCLUSIVE_EFF_NO_STATUS_WHEN_RAINY = 44,
EXCLUSIVE_EFF_NO_STATUS_WHEN_HAIL = 45,
EXCLUSIVE_EFF_NO_STATUS_WHEN_FOGGY = 46,
EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_CLEAR = 47,
EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_SUNNY = 48,
EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_SANDSTORM = 49,
EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_CLOUDY = 50,
EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_RAINY = 51,
EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_HAIL = 52,
EXCLUSIVE_EFF_MOVEMENT_SPEED_BOOST_WHEN_FOGGY = 53,
EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_CLEAR = 54,
EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_SUNNY = 55,
EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_SANDSTORM = 56, // Unused in-game
EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_CLOUDY = 57, // Unused in-game
EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_RAINY = 58,
EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_HAIL = 59,
EXCLUSIVE_EFF_ATTACK_SPEED_BOOST_WHEN_FOGGY = 60, // Unused in-game
EXCLUSIVE_EFF_EVASION_BOOST_WHEN_CLEAR = 61,
EXCLUSIVE_EFF_EVASION_BOOST_WHEN_SUNNY = 62,
EXCLUSIVE_EFF_EVASION_BOOST_WHEN_SANDSTORM = 63,
EXCLUSIVE_EFF_EVASION_BOOST_WHEN_CLOUDY = 64,
EXCLUSIVE_EFF_EVASION_BOOST_WHEN_RAINY = 65,
EXCLUSIVE_EFF_EVASION_BOOST_WHEN_HAIL = 66, // Unused in-game
EXCLUSIVE_EFF_EVASION_BOOST_WHEN_FOGGY = 67,
EXCLUSIVE_EFF_BYPASS_REFLECT_LIGHT_SCREEN = 68,
EXCLUSIVE_EFF_SCRAPPY = 69,
EXCLUSIVE_EFF_MIRACLE_EYE = 70,
EXCLUSIVE_EFF_RESTORE_PP_ON_NEW_FLOORS = 71,
EXCLUSIVE_EFF_RESTORE_HP_ON_NEW_FLOORS = 72,
EXCLUSIVE_EFF_INCREASED_HP_RECOVERY = 73,
EXCLUSIVE_EFF_MAX_PP_BOOST = 74,
EXCLUSIVE_EFF_UNUSED_0x4B = 75,
EXCLUSIVE_EFF_MAX_HP_BOOST_10 = 76,
EXCLUSIVE_EFF_MAX_HP_BOOST_20 = 77, // Unused in-game
EXCLUSIVE_EFF_MAX_HP_BOOST_30 = 78, // Unused in-game
EXCLUSIVE_EFF_EXP_BOOST = 79,
EXCLUSIVE_EFF_EXP_FROM_DAMAGE = 80,
EXCLUSIVE_EFF_MAY_RESTORE_PP_FROM_DAMAGE = 81,
EXCLUSIVE_EFF_MAY_NOT_CONSUME_PP = 82,
EXCLUSIVE_EFF_THROWN_ITEM_PROTECTION = 83,
EXCLUSIVE_EFF_BOUNCE_THROWN_ITEMS = 84,
EXCLUSIVE_EFF_EXTEND_SELF_EFFECTS_TO_TEAM = 85,
EXCLUSIVE_EFF_MORE_TREASURE_DROPS = 86,
EXCLUSIVE_EFF_HP_DRAIN_RECOVERY_BOOST = 87,
EXCLUSIVE_EFF_PRESSURE_BOOST = 88,
EXCLUSIVE_EFF_NO_STATUS = 89,
EXCLUSIVE_EFF_HALVED_DAMAGE = 90,
EXCLUSIVE_EFF_DAMAGE_BOOST_50_PCT = 91,
EXCLUSIVE_EFF_ABSORB_TEAMMATE_POISON = 92,
EXCLUSIVE_EFF_RECOVER_HP_FROM_APPLES_AND_BERRIES = 93,
EXCLUSIVE_EFF_MORE_KECLEON_SHOPS = 94,
EXCLUSIVE_EFF_MORE_HIDDEN_STAIRS = 95,
EXCLUSIVE_EFF_NO_FRIENDLY_FIRE = 96,
EXCLUSIVE_EFF_PICKUP_BOOST = 97,
EXCLUSIVE_EFF_MORE_MONEY_DROPS = 98,
EXCLUSIVE_EFF_UNUSED_0x63 = 99,
EXCLUSIVE_EFF_RECOVER_HP_FROM_WATERY_TERRAIN = 100,
EXCLUSIVE_EFF_HEAL_STATUS_FROM_WATERY_TERRAIN = 101,
EXCLUSIVE_EFF_NO_FIRE_DAMAGE = 102,
EXCLUSIVE_EFF_NO_WATER_DAMAGE = 103,
EXCLUSIVE_EFF_NO_GRASS_DAMAGE = 104,
EXCLUSIVE_EFF_NO_ELECTRIC_DAMAGE = 105,
EXCLUSIVE_EFF_NO_FIGHTING_DAMAGE = 106,
EXCLUSIVE_EFF_NO_GROUND_DAMAGE = 107,
EXCLUSIVE_EFF_NO_FLYING_DAMAGE = 108,
EXCLUSIVE_EFF_NO_PSYCHIC_DAMAGE = 109,
EXCLUSIVE_EFF_NO_GHOST_DAMAGE = 110,
EXCLUSIVE_EFF_NO_DRAGON_DAMAGE = 111,
EXCLUSIVE_EFF_NO_DARK_DAMAGE = 112,
EXCLUSIVE_EFF_NO_STEEL_DAMAGE = 113,
EXCLUSIVE_EFF_ABSORB_FIRE_DAMAGE = 114,
EXCLUSIVE_EFF_ABSORB_WATER_DAMAGE = 115,
EXCLUSIVE_EFF_ABSORB_GRASS_DAMAGE = 116,
EXCLUSIVE_EFF_ABSORB_ELECTRIC_DAMAGE = 117,
EXCLUSIVE_EFF_ABSORB_ICE_DAMAGE = 118,
EXCLUSIVE_EFF_ABSORB_FIGHTING_DAMAGE = 119,
EXCLUSIVE_EFF_ABSORB_GROUND_DAMAGE = 120,
EXCLUSIVE_EFF_ABSORB_FLYING_DAMAGE = 121,
EXCLUSIVE_EFF_ABSORB_PSYCHIC_DAMAGE = 122,
EXCLUSIVE_EFF_ABSORB_BUG_DAMAGE = 123,
EXCLUSIVE_EFF_ABSORB_ROCK_DAMAGE = 124,
EXCLUSIVE_EFF_ABSORB_GHOST_DAMAGE = 125,
EXCLUSIVE_EFF_ABSORB_DRAGON_DAMAGE = 126,
EXCLUSIVE_EFF_ABSORB_DARK_DAMAGE = 127,
EXCLUSIVE_EFF_ABSORB_STEEL_DAMAGE = 128,
EXCLUSIVE_EFF_LAST = 129, // Used as a null-terminator in some places
};
#define GROUND_ITEM_TOOLBOX_INDEX 0x80
#define HELD_ITEM_TOOLBOX_INDEX 0x81
#define INVENTORY_SIZE 52

View File

@ -0,0 +1,13 @@
#ifndef PMDSKY_OVERLAY_29_0231ACAC_H
#define PMDSKY_OVERLAY_29_0231ACAC_H
#include "dungeon_mode.h"
// Gets the move target-and-range field when used by a given entity.
// entity: entity pointer
// move: move pointer
// is_ai: AI flag (same as GetMoveTargetAndRange)
// return: move target and range
u32 GetEntityMoveTargetAndRange(struct entity *entity, struct move *move, bool8 is_ai);
#endif //PMDSKY_OVERLAY_29_0231ACAC_H

View File

@ -427,6 +427,8 @@ Overlay OVY_29
Object asm/overlay_29_0231A7A0.o
Object src/overlay_29_0231A9D4.o
Object asm/overlay_29_0231A9F8.o
Object src/overlay_29_0231ACAC.o
Object asm/overlay_29_0231AD38.o
Object src/overlay_29_0231B194.o
Object asm/overlay_29_0231B1B8.o
Object src/overlay_29_0231B318.o

View File

@ -10,6 +10,7 @@
#include "dungeon_visibility.h"
#include "main_0208655C.h"
#include "move_data.h"
#include "overlay_29_0231ACAC.h"
#include "position_util.h"
extern struct dungeon *DUNGEON_PTR[];
@ -18,7 +19,6 @@ extern u8 AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS[NUM_DIRECTIONS];
extern s32 AI_POTENTIAL_ATTACK_TARGET_WEIGHTS[NUM_DIRECTIONS];
extern struct entity *AI_POTENTIAL_ATTACK_TARGETS[NUM_DIRECTIONS];
extern u16 GetEntityMoveTargetAndRange(struct entity *entity, struct move *move, bool8 is_ai);
extern bool8 IsAffectedByTaunt(struct move *move);
extern bool8 StatusCheckerCheck(struct entity *attacker, struct move *move);
extern u16 GetMoveTargetAndRange(struct move *move, bool8 is_ai);
@ -47,7 +47,7 @@ u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *mon
if (has_status_checker && !StatusCheckerCheck(monster, move))
return move_weight;
if (GetMoveTargetAndRange(move, FALSE) == TARGET_USER + RANGE_USER + AI_CONDITION_HP_25)
if (GetMoveTargetAndRange(move, FALSE) == TARGET_USER | RANGE_USER | AI_CONDITION_HP_25)
{
s32 max_hp = MIN(pokemon_info->max_hp_stat + pokemon_info->max_hp_boost, 999);
if (pokemon_info->hp == max_hp)

26
src/overlay_29_0231ACAC.c Normal file
View File

@ -0,0 +1,26 @@
#include "overlay_29_0231ACAC.h"
#include "item.h"
#include "move_data.h"
extern bool8 MonsterIsType(struct entity *entity, enum type_id type_id);
extern u16 GetMoveTargetAndRange(struct move *move, bool8 is_ai);
extern bool8 IsMoveRangeString19(struct move *move);
bool8 ExclusiveItemEffectIsActive__0231A87C(struct entity *entity, enum exclusive_item_effect_id effect_id);
u32 GetEntityMoveTargetAndRange(struct entity *entity, struct move *move, bool8 is_ai)
{
if (move->id == MOVE_CURSE && !is_ai && !MonsterIsType(entity, TYPE_GHOST))
return TARGET_USER | RANGE_USER;
u16 move_target_and_range = GetMoveTargetAndRange(move, is_ai);
if (IsMoveRangeString19(move) && ExclusiveItemEffectIsActive__0231A87C(entity, EXCLUSIVE_EFF_EXTEND_SELF_EFFECTS_TO_TEAM))
{
if (move_target_and_range == (TARGET_USER | RANGE_USER | AI_CONDITION_HP_25))
move_target_and_range = TARGET_PARTY | RANGE_FLOOR | AI_CONDITION_HP_25;
else if (move_target_and_range == (TARGET_USER | RANGE_USER))
move_target_and_range = TARGET_PARTY | RANGE_FLOOR;
}
return move_target_and_range;
}