pmd-sky/asm/overlay_29_022FACBC.s
2025-09-18 23:59:53 -04:00

705 lines
12 KiB
ArmAsm

.include "asm/macros.inc"
.include "overlay_29_022FACBC.inc"
.text
arm_func_start ov29_022FACBC
ov29_022FACBC: ; 0x022FACBC
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, lr}
sub sp, sp, #4
ldr r1, _022FAD44 ; =DUNGEON_PTR
mov sb, r0
ldr r0, [r1]
mov r8, #0
#ifdef JAPAN
add r0, r0, #0x284
#else
add r0, r0, #0x328
#endif
ldr r5, _022FAD48 ; =0x000003E7
add r7, r0, #0x12800
mov r4, r8
mov r6, #0x48
_022FACE8:
ldr sl, [r7, r8, lsl #2]
mov r0, sl
bl EntityIsValid__022F7364
cmp r0, #0
beq _022FAD28
mov r0, sl
mov r1, r6
bl ExclusiveItemEffectIsActive__022FAC98
cmp r0, #0
beq _022FAD28
mov r0, sl
mov r1, sl
mov r2, r5
mov r3, r4
str sb, [sp]
bl TryIncreaseHp
_022FAD28:
add r0, r8, #1
mov r0, r0, lsl #0x10
mov r8, r0, asr #0x10
cmp r8, #4
blt _022FACE8
add sp, sp, #4
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, pc}
.align 2, 0
_022FAD44: .word DUNGEON_PTR
_022FAD48: .word 0x000003E7
arm_func_end ov29_022FACBC
arm_func_start ov29_022FAD4C
ov29_022FAD4C: ; 0x022FAD4C
#ifdef JAPAN
#define OV29_022FAD4C_OFFSET -0xA4
#else
#define OV29_022FAD4C_OFFSET 0
#endif
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
ldr r1, _022FAF00 ; =DUNGEON_PTR
mov r8, #0
ldr r1, [r1]
sub r3, r8, #1
add r2, r1, #0xcc00
ldrsh r4, [r2, #0xe4 + OV29_022FAD4C_OFFSET]
add r1, r1, #0x328 + OV29_022FAD4C_OFFSET
add r5, r1, #0x12800
cmp r4, r3
ldreqsh r1, [r2, #0xe6 + OV29_022FAD4C_OFFSET]
mov sb, r0
moveq r0, r3
cmpeq r1, r0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
mov r7, #0
mov r4, #0x1a
b _022FADE4
_022FAD94:
ldr r6, [r5, r7, lsl #2]
mov r0, r6
bl EntityIsValid__022F7364
cmp r0, #0
beq _022FADD8
ldr r0, [r6, #0xb4]
ldrb r0, [r0, #0x48]
cmp r0, #0xd9
blo _022FADC0
cmp r0, #0xe4
blo _022FADD8
_022FADC0:
mov r0, r6
mov r1, r4
bl IqSkillIsEnabled
cmp r0, #0
movne r8, #1
bne _022FADEC
_022FADD8:
add r0, r7, #1
mov r0, r0, lsl #0x10
mov r7, r0, asr #0x10
_022FADE4:
cmp r7, #4
blt _022FAD94
_022FADEC:
cmp r8, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
bl GetFloorType
cmp r0, #0
bne _022FAEEC
cmp sb, #0
bne _022FAE14
#ifdef JAPAN
mov r0, r6
mov r1, #0x960
#else
ldr r1, _022FAF04 ; =0x00000C21
mov r0, r6
#endif
bl LogMessageByIdWithPopupCheckUser
_022FAE14:
bl GetLeader
mov r5, r0
add r0, sp, #0
add r1, sp, #2
mov r4, #0
bl GetStairsSpawnPosition
ldrsh r1, [sp]
ldrsh r3, [r5, #4]
ldrsh r2, [sp, #2]
cmp r3, r1
ldreqsh r0, [r5, #6]
cmpeq r0, r2
cmp r3, r1
bne _022FAE58
ldrsh r0, [r5, #6]
cmp r0, r2
movlt r4, #0
_022FAE58:
cmp r3, r1
ldrltsh r0, [r5, #6]
cmplt r0, r2
movlt r4, #1
cmp r3, r1
bge _022FAE7C
ldrsh r0, [r5, #6]
cmp r0, r2
moveq r4, #2
_022FAE7C:
cmp r3, r1
bge _022FAE90
ldrsh r0, [r5, #6]
cmp r0, r2
movgt r4, #3
_022FAE90:
cmp r3, r1
bne _022FAEA4
ldrsh r0, [r5, #6]
cmp r0, r2
movgt r4, #4
_022FAEA4:
cmp r3, r1
ldrgtsh r0, [r5, #6]
cmpgt r0, r2
movgt r4, #5
cmp r3, r1
ble _022FAEC8
ldrsh r0, [r5, #6]
cmp r0, r2
moveq r4, #6
_022FAEC8:
cmp r3, r1
ble _022FAEDC
ldrsh r0, [r5, #6]
cmp r0, r2
movlt r4, #7
_022FAEDC:
mov r0, r5
mov r1, r4
bl ov29_022E6928
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
_022FAEEC:
bl GetFloorType
cmp r0, #1
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
bl GetFloorType
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
.align 2, 0
_022FAF00: .word DUNGEON_PTR
#ifndef JAPAN
_022FAF04: .word 0x00000C21
#endif
arm_func_end ov29_022FAD4C
arm_func_start ov29_022FAF08
ov29_022FAF08: ; 0x022FAF08
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr}
ldr r1, _022FAFC8 ; =DUNGEON_PTR
mov r6, r0
ldr r0, [r1]
mov r5, #0
#ifdef JAPAN
add r0, r0, #0x284
#else
add r0, r0, #0x328
#endif
add r8, r0, #0x12800
bl IsCurrentFixedRoomBossFight
cmp r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
mov sb, r5
mov r7, #0x36
b _022FAF74
_022FAF3C:
ldr r4, [r8, sb, lsl #2]
mov r0, r4
bl EntityIsValid__022F7364
cmp r0, #0
beq _022FAF68
mov r0, r4
mov r1, r7
bl IqSkillIsEnabled
cmp r0, #0
movne r5, #1
bne _022FAF7C
_022FAF68:
add r0, sb, #1
mov r0, r0, lsl #0x10
mov sb, r0, asr #0x10
_022FAF74:
cmp sb, #4
blt _022FAF3C
_022FAF7C:
cmp r5, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
ldr r1, _022FAFC8 ; =DUNGEON_PTR
ldr r0, _022FAFCC ; =0x00012AF8
ldr r1, [r1]
ldrsh r1, [r1, r0]
cmp r1, #0
ldmleia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
cmp r6, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
mov r0, #0
bl SetMessageLogPreprocessorArgsNumberVal
ldr r1, _022FAFD0 ; =0x00000C22
mov r0, r4
bl LogMessageByIdWithPopupCheckUser
mov r0, #0x78
mov r1, #0xa
bl ov29_022EA370
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc}
.align 2, 0
_022FAFC8: .word DUNGEON_PTR
#ifdef JAPAN
_022FAFCC: .word 0x00012A54
_022FAFD0: .word 0x00000961
#else
_022FAFCC: .word 0x00012AF8
_022FAFD0: .word 0x00000C22
#endif
arm_func_end ov29_022FAF08
arm_func_start ov29_022FAFD4
ov29_022FAFD4: ; 0x022FAFD4
stmdb sp!, {r3, lr}
mov r2, #1
mov r3, #0
bl GetTreatmentBetweenMonsters
cmp r0, #0
moveq r0, #1
movne r0, #0
and r0, r0, #0xff
ldmia sp!, {r3, pc}
arm_func_end ov29_022FAFD4
arm_func_start GetTeamMemberWithIqSkill
GetTeamMemberWithIqSkill: ; 0x022FAFF8
stmdb sp!, {r3, r4, r5, r6, r7, lr}
ldr r1, _022FB060 ; =DUNGEON_PTR
mov r4, #0
ldr r1, [r1]
mov r5, r0
#ifdef JAPAN
add r0, r1, #0x284
#else
add r0, r1, #0x328
#endif
mov r7, r4
add r6, r0, #0x12800
b _022FB050
_022FB01C:
ldr r0, [r6, r7, lsl #2]
bl EntityIsValid__022F7364
cmp r0, #0
beq _022FB044
ldr r0, [r6, r7, lsl #2]
mov r1, r5
bl IqSkillIsEnabled
cmp r0, #0
ldrne r4, [r6, r7, lsl #2]
bne _022FB058
_022FB044:
add r0, r7, #1
mov r0, r0, lsl #0x10
mov r7, r0, asr #0x10
_022FB050:
cmp r7, #4
blt _022FB01C
_022FB058:
mov r0, r4
ldmia sp!, {r3, r4, r5, r6, r7, pc}
.align 2, 0
_022FB060: .word DUNGEON_PTR
arm_func_end GetTeamMemberWithIqSkill
arm_func_start TeamMemberHasEnabledIqSkill
TeamMemberHasEnabledIqSkill: ; 0x022FB064
stmdb sp!, {r3, lr}
bl GetTeamMemberWithIqSkill
cmp r0, #0
movne r0, #1
moveq r0, #0
and r0, r0, #0xff
ldmia sp!, {r3, pc}
arm_func_end TeamMemberHasEnabledIqSkill
arm_func_start TeamLeaderIqSkillIsEnabled
TeamLeaderIqSkillIsEnabled: ; 0x022FB080
stmdb sp!, {r4, lr}
mov r4, r0
bl GetLeader
mov r1, r4
bl IqSkillIsEnabled
cmp r0, #0
movne r0, #1
moveq r0, #0
and r0, r0, #0xff
ldmia sp!, {r4, pc}
arm_func_end TeamLeaderIqSkillIsEnabled
arm_func_start CountMovesOutOfPp
CountMovesOutOfPp: ; 0x022FB0A8
stmdb sp!, {r3, lr}
ldr ip, [r0, #0xb4]
mov r0, #0
mov lr, r0
mov r2, r0
mov r3, #1
_022FB0C0:
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
beq _022FB0F4
add r1, ip, lr, lsl #3
#ifdef JAPAN
ldrb r1, [r1, #0x126]
#else
ldrb r1, [r1, #0x12a]
#endif
cmp r1, #0
addeq r0, r0, #1
moveq r0, r0, lsl #0x10
moveq r0, r0, asr #0x10
_022FB0F4:
add r1, lr, #1
mov r1, r1, lsl #0x10
mov lr, r1, asr #0x10
cmp lr, #4
blt _022FB0C0
ldmia sp!, {r3, pc}
arm_func_end CountMovesOutOfPp
arm_func_start HasSuperEffectiveMoveAgainstUser
HasSuperEffectiveMoveAgainstUser: ; 0x022FB10C
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
mov sb, r1
ldr r6, [sb, #0xb4]
mov r7, #0
mov sl, r0
mov r8, r2
#ifdef JAPAN
add r4, r6, #0x120
#else
add r4, r6, #0x124
#endif
mov fp, r7
mov r5, #1
b _022FB198
_022FB134:
add r0, r6, r7, lsl #3
#ifdef JAPAN
ldrb r0, [r0, #0x120]
#else
ldrb r0, [r0, #0x124]
#endif
tst r0, #1
movne r0, r5
moveq r0, fp
tst r0, #0xff
beq _022FB18C
cmp r8, #0
beq _022FB168
add r0, r4, r7, lsl #3
bl HasMaxGinsengBoost99
cmp r0, #0
beq _022FB18C
_022FB168:
add r0, r4, r7, lsl #3
bl GetMoveType
mov r2, r0
mov r0, sb
mov r1, sl
bl GetTypeMatchupBothTypes
cmp r0, #3
moveq r0, #1
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
_022FB18C:
add r0, r7, #1
mov r0, r0, lsl #0x10
mov r7, r0, asr #0x10
_022FB198:
cmp r7, #4
blt _022FB134
mov r0, #0
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
arm_func_end HasSuperEffectiveMoveAgainstUser
arm_func_start ov29_022FB1A8
ov29_022FB1A8: ; 0x022FB1A8
stmdb sp!, {r3, r4, r5, r6, r7, lr}
mov r7, #0
ldr r6, [r0, #0xb4]
mov r4, r7
mov r5, #1
b _022FB204
_022FB1C0:
add r0, r6, r7, lsl #3
#ifdef JAPAN
ldrb r0, [r0, #0x120]
#else
ldrb r0, [r0, #0x124]
#endif
tst r0, #1
movne r0, r5
moveq r0, r4
tst r0, #0xff
beq _022FB1F8
add r0, r6, r7, lsl #3
add r0, r0, #0x100
#ifdef JAPAN
ldrh r0, [r0, #0x24]
#else
ldrh r0, [r0, #0x28]
#endif
bl IsOneHitKoMove
cmp r0, #0
movne r0, #1
ldmneia sp!, {r3, r4, r5, r6, r7, pc}
_022FB1F8:
add r0, r7, #1
mov r0, r0, lsl #0x10
mov r7, r0, asr #0x10
_022FB204:
cmp r7, #4
blt _022FB1C0
mov r0, #0
ldmia sp!, {r3, r4, r5, r6, r7, pc}
arm_func_end ov29_022FB1A8
arm_func_start TryEatItem
TryEatItem: ; 0x022FB214
stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
sub sp, sp, #0x74
mov sl, r0
mov sb, r1
mov r5, #0
bl EntityIsValid__022F7364
cmp r0, #0
beq _022FB244
mov r0, sb
bl EntityIsValid__022F7364
cmp r0, #0
bne _022FB24C
_022FB244:
mov r0, #0
b _022FB508
_022FB24C:
ldr r4, [sb, #0xb4]
ldrb r0, [r4, #6]
cmp r0, #0
ldrsh r0, [r4, #0x66]
beq _022FB31C
cmp r0, #0
beq _022FB504
ldrsh r0, [r4, #0x66]
bl ShouldTryEatItem
cmp r0, #0
beq _022FB504
mov r0, sl
add r1, r4, #0x62
bl CanMonsterUseItem
cmp r0, #0
beq _022FB504
mov r0, r5
mov r1, sl
mov r2, r0
bl SubstitutePlaceholderStringTags
mov r1, sb
mov r0, #1
mov r2, r5
bl SubstitutePlaceholderStringTags
add r1, r4, #0x62
mov r0, #1
bl PrepareItemForPrinting__02345728
ldr r2, _022FB510 ; =0x00000C24
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
ldrh r2, [r4, #0x62]
mov r0, sl
add r1, r4, #0x62
strh r2, [sp, #8]
ldrh r2, [r4, #0x64]
strh r2, [sp, #0xa]
ldrh r2, [r4, #0x66]
strh r2, [sp, #0xc]
bl ov29_0230F9A4
add r0, r4, #0x62
bl ItemZInit
mov r0, r5
str sl, [sp]
add r1, sp, #8
str r1, [sp, #4]
mov r3, sb
mov r1, r0
mov r2, r0
bl ApplyItemEffect
mov r5, #1
b _022FB504
_022FB31C:
bl ShouldTryEatItem
cmp r0, #0
beq _022FB3D4
mov r0, sl
add r1, r4, #0x62
bl CanMonsterUseItem
cmp r0, #0
beq _022FB504
mov r0, r5
mov r1, sl
mov r2, r0
bl SubstitutePlaceholderStringTags
mov r1, sb
mov r0, #1
mov r2, r5
bl SubstitutePlaceholderStringTags
add r1, r4, #0x62
mov r0, #1
bl PrepareItemForPrinting__02345728
ldr r2, _022FB510 ; =0x00000C24
mov r0, sl
mov r1, sb
bl LogMessageByIdWithPopupCheckUserTarget
ldrh r2, [r4, #0x62]
mov r0, sl
add r1, r4, #0x62
strh r2, [sp, #8]
ldrh r2, [r4, #0x64]
strh r2, [sp, #0xa]
ldrh r2, [r4, #0x66]
strh r2, [sp, #0xc]
bl ov29_0230F9A4
add r0, r4, #0x62
bl RemoveEquivItem
add r0, r4, #0x62
bl ItemZInit
mov r0, r5
str sl, [sp]
add r1, sp, #8
str r1, [sp, #4]
mov r3, sb
mov r1, r0
mov r2, r0
bl ApplyItemEffect
mov r5, #1
b _022FB504
_022FB3D4:
bl GetNbItemsInBag
mov r7, r0
mov r6, r5
add r4, sp, #0xe
b _022FB3F8
_022FB3E8:
mov r0, r7
bl RandInt
strb r0, [r4, r6]
add r6, r6, #1
_022FB3F8:
cmp r6, r7
blt _022FB3E8
add r0, sp, #0xe
mov r1, #0
add r0, r0, r7
b _022FB418
_022FB410:
strb r1, [r0, r1]
add r1, r1, #1
_022FB418:
cmp r1, r7
blt _022FB410
mov r8, #0
add r4, sp, #0xe
ldr fp, _022FB514 ; =BAG_ITEMS_PTR_MIRROR
b _022FB4FC
_022FB430:
ldrb r1, [r4, r8]
ldr r3, [fp]
mov r0, #6
smulbb r2, r1, r0
ldr r1, [r3, #0x384]
ldrb r0, [r1, r2]
add r6, r1, r2
tst r0, #1
movne r0, #1
moveq r0, #0
tst r0, #0xff
beq _022FB4F8
ldrb r0, [r6, #1]
cmp r0, #0
bne _022FB4F8
ldrsh r0, [r6, #4]
bl ShouldTryEatItem
cmp r0, #0
beq _022FB4F8
mov r0, sl
mov r1, r6
bl CanMonsterUseItem
cmp r0, #0
beq _022FB504
mov r0, #0
mov r1, sl
mov r2, r0
bl SubstitutePlaceholderStringTags
mov r1, sb
mov r0, #1
mov r2, #0
bl SubstitutePlaceholderStringTags
mov r1, r6
mov r0, #1
bl PrepareItemForPrinting__02345728
mov r0, sl
mov r1, sb
ldr r2, _022FB518 ; =0x00000C25
bl LogMessageByIdWithPopupCheckUserTarget
str sl, [sp]
mov r3, sb
str r6, [sp, #4]
mov r0, #0
mov r1, r0
mov r2, r0
bl ApplyItemEffect
mov r0, r6
bl RemoveEquivItem
mov r5, #1
b _022FB504
_022FB4F8:
add r8, r8, #1
_022FB4FC:
cmp r8, r7, lsl #1
blt _022FB430
_022FB504:
mov r0, r5
_022FB508:
add sp, sp, #0x74
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
#ifdef JAPAN
_022FB510: .word 0x00000963
_022FB514: .word BAG_ITEMS_PTR_MIRROR
_022FB518: .word 0x00000964
#else
_022FB510: .word 0x00000C24
_022FB514: .word BAG_ITEMS_PTR_MIRROR
_022FB518: .word 0x00000C25
#endif
arm_func_end TryEatItem
arm_func_start ov29_022FB51C
ov29_022FB51C: ; 0x022FB51C
stmdb sp!, {r3, lr}
bl GetScenarioBalance
cmp r0, #2
movhs r0, #1
movlo r0, #0
and r0, r0, #0xff
ldmia sp!, {r3, pc}
arm_func_end ov29_022FB51C