pmd-sky/asm/overlay_29_022EBCE8.s
2025-06-17 22:49:24 -05:00

657 lines
12 KiB
ArmAsm

.include "asm/macros.inc"
.include "overlay_29_022EBCE8.inc"
.text
arm_func_start ov29_022EBCE8
ov29_022EBCE8: ; 0x022EBCE8
ldrh r1, [r0]
cmp r1, #0x15
ldreqb r0, [r0, #4]
bxeq lr
cmp r1, #0x14
ldreqb r0, [r0, #0xa]
mvnne r0, #0
bx lr
arm_func_end ov29_022EBCE8
arm_func_start RunFractionalTurn
RunFractionalTurn: ; 0x022EBD08
#ifdef JAPAN
#define RUN_FRACTIONAL_TURN_OFFSET -0xA4
#define RUN_FRACTIONAL_TURN_OFFSET_2 -4
#else
#define RUN_FRACTIONAL_TURN_OFFSET 0
#define RUN_FRACTIONAL_TURN_OFFSET_2 0
#endif
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
sub sp, sp, #0x40
mov r4, r0
bl IsFloorOver
cmp r0, #0
bne _022EC2F4
bl TrySpawnMonsterAndActivatePlusMinus
bl IsFloorOver
cmp r0, #0
bne _022EC2F4
mov r0, r4
bl RunLeaderTurn
mov r4, r0
bl IsFloorOver
cmp r0, #0
bne _022EC2F4
cmp r4, #0
beq _022EBD60
bl DecrementWindCounter
bl IsFloorOver
cmp r0, #0
bne _022EC2F4
_022EBD60:
bl IsFloorOver
cmp r0, #0
bne _022EC2F4
bl GetLeader
mov r8, r0
bl ov29_02348FD8
mov r5, #0
b _022EBECC
_022EBD80:
ldr r0, _022EC2FC ; =DUNGEON_PTR
ldr r0, [r0]
add r0, r0, r5, lsl #2
add r0, r0, #0x12000
ldr r4, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET]
mov r0, r4
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EBEC8
ldr r6, [r4, #0xb4]
ldrb r0, [r6, #7]
cmp r0, #0
bne _022EBEC8
bl IsFloorOver
cmp r0, #0
bne _022EBED4
ldr r1, _022EC2FC ; =DUNGEON_PTR
mov r0, r4
ldr r1, [r1]
str r4, [r1, #0xc4]
bl sub_01FFBDF4
bl TryActivateArtificialWeatherAbilities
mov r1, #0
mov r0, r4
strb r1, [r6, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
bl CalcSpeedStageWrapper
ldr r1, _022EC2FC ; =DUNGEON_PTR
ldr r3, _022EC300 ; =FRACTIONAL_TURN_SEQUENCE
ldr r2, [r1]
mov r1, #0x32
add r2, r2, #0x700
ldrsh r2, [r2, #0x80]
mla r1, r0, r1, r3
mov r0, r2, lsl #1
ldrsh r0, [r0, r1]
cmp r0, #0
beq _022EBEC8
ldrb r0, [r6, #0x152 + RUN_FRACTIONAL_TURN_OFFSET_2]
cmp r0, #0
bne _022EBEC8
ldrh r0, [r6]
tst r0, #0x8000
bne _022EBEC8
tst r0, #0x4000
bicne r0, r0, #0x4000
strneh r0, [r6]
bne _022EBEC8
mov r1, #0
mov r0, r4
strb r1, [r6, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2]
bl TickStatusAndHealthRegen
mov r0, r4
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EBEC8
mov r0, r4
bl EnemyEvolution
mov r0, r4
mov r1, #1
bl TryRestoreRoostTyping
mov sb, #0
mov r7, sb
mov r6, sb
b _022EBEC0
_022EBE80:
mov r0, r4
mov r1, r7
bl RunMonsterAi
bl IsFloorOver
cmp r0, #0
bne _022EBEC8
mov r0, r4
bl ExecuteMonsterAction
cmp r0, #0
beq _022EBEC8
mov r0, r6
bl TryForcedLoss
bl IsFloorOver
cmp r0, #0
bne _022EBEC8
add sb, sb, #1
_022EBEC0:
cmp sb, #3
blt _022EBE80
_022EBEC8:
add r5, r5, #1
_022EBECC:
cmp r5, #4
blt _022EBD80
_022EBED4:
mov sb, #0
_022EBED8:
mov r3, #0
mov sl, r3
add r2, sp, #0
_022EBEE4:
mov r0, r3, lsl #3
str sl, [r2, r3, lsl #3]
add r3, r3, #1
add r1, r2, r3, lsl #3
add r0, r2, r0
str r1, [r0, #4]
cmp r3, #3
blt _022EBEE4
str sl, [sp, #0x18]
str sl, [sp, #0x1c]
add r4, sp, #0x20
add fp, sp, #0
mov r6, #0
_022EBF18:
ldr r0, _022EC2FC ; =DUNGEON_PTR
ldr r0, [r0]
add r0, r0, sl, lsl #2
add r0, r0, #0x12000
ldr r7, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET]
mov r0, r7
bl EntityIsValid__022EC608
cmp r0, #0
ldrne r1, [r7, #0xb4]
ldrneb r0, [r1, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
cmpne r0, #0
beq _022EBFA8
ldrb r0, [r1, #7]
cmp r0, #0
strneb r6, [r1, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2]
strneb r6, [r1, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
bne _022EBFA8
ldrsh r1, [r8, #6]
ldrsh r0, [r7, #6]
sub r0, r1, r0
bl abs
ldrsh r2, [r8, #4]
ldrsh r1, [r7, #4]
mov r5, r0
sub r0, r2, r1
bl abs
cmp r0, r5
movle r0, r5
cmp r0, #3
movge r0, #2
add r2, fp, r0, lsl #3
ldr r1, [r2, #4]
add r0, r4, sl, lsl #3
str r7, [r4, sl, lsl #3]
str r1, [r0, #4]
str r0, [r2, #4]
_022EBFA8:
add sl, sl, #1
cmp sl, #4
blt _022EBF18
mov r7, #0
add r5, sp, #0
mov sl, #1
mov r6, r7
b _022EC00C
_022EBFC8:
ldr r4, [r5]
cmp r4, #0
beq _022EC008
ldr r2, [r4, #0xb4]
mov r0, r4
strb sl, [r2, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2]
mov r1, sl
strb r7, [r2, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
bl RunMonsterAi
mov r0, r4
bl ExecuteMonsterAction
bl ov29_022EF9C8
mov r0, r6
bl TryForcedLoss
mov r0, r4
bl EntityIsValid__022EC608
_022EC008:
ldr r5, [r5, #4]
_022EC00C:
cmp r5, #0
bne _022EBFC8
add sb, sb, #1
cmp sb, #3
blt _022EBED8
bl IsFloorOver
cmp r0, #0
bne _022EC094
mov r4, #0
ldr r5, _022EC2FC ; =DUNGEON_PTR
mov r6, r4
_022EC038:
ldr r0, [r5]
add r0, r0, r4, lsl #2
add r0, r0, #0x12000
ldr r7, [r0, #0xb28 + RUN_FRACTIONAL_TURN_OFFSET]
mov r0, r7
bl EntityIsValid__022EC608
cmp r0, #0
ldrne r8, [r7, #0xb4]
ldrneb r0, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
cmpne r0, #0
beq _022EC088
mov r0, r7
bl ov29_0230FC24
mov r0, r7
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EC088
mov r0, r7
bl EnemyEvolution
strb r6, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
_022EC088:
add r4, r4, #1
cmp r4, #4
blt _022EC038
_022EC094:
bl IsFloorOver
cmp r0, #0
bne _022EC2F4
mov sb, #0
mov r5, sb
mov r7, sb
ldr r6, _022EC300 ; =FRACTIONAL_TURN_SEQUENCE
mov fp, #0x32
ldr r4, _022EC2FC ; =DUNGEON_PTR
b _022EC1C0
_022EC0BC:
ldr r0, [r4]
add r0, r0, sb, lsl #2
add r0, r0, #0x12000
ldr r8, [r0, #0xb38 + RUN_FRACTIONAL_TURN_OFFSET]
mov r0, r8
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EC1BC
bl IsFloorOver
cmp r0, #0
bne _022EC1C8
ldr sl, [r8, #0xb4]
ldr r1, [r4]
mov r0, r8
str r8, [r1, #0xc4]
bl sub_01FFBDF4
bl TryActivateArtificialWeatherAbilities
ldrh r0, [sl]
tst r0, #0x8000
bne _022EC1BC
tst r0, #0x4000
bicne r0, r0, #0x4000
strneh r0, [sl]
bne _022EC1BC
mov r0, r8
strb r7, [sl, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
bl CalcSpeedStageWrapper
ldr r2, [r4]
mla r1, r0, fp, r6
add r0, r2, #0x700
ldrsh r0, [r0, #0x80]
mov r0, r0, lsl #1
ldrsh r0, [r0, r1]
cmp r0, #0
beq _022EC1BC
ldrb r0, [sl, #0x152 + RUN_FRACTIONAL_TURN_OFFSET_2]
cmp r0, #0
bne _022EC1BC
ldrh r1, [sl]
mov r0, r8
bic r1, r1, #0xc000
strh r1, [sl]
strb r5, [sl, #0x14f + RUN_FRACTIONAL_TURN_OFFSET_2]
bl TickStatusAndHealthRegen
mov r0, r8
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EC1BC
mov r0, r8
bl EnemyEvolution
mov r0, r8
mov r1, #0
bl RunMonsterAi
bl IsFloorOver
cmp r0, #0
bne _022EC1C8
mov r0, r8
bl ExecuteMonsterAction
bl ov29_022EF9C8
mov r0, #0
bl TryForcedLoss
bl IsFloorOver
cmp r0, #0
bne _022EC1C8
_022EC1BC:
add sb, sb, #1
_022EC1C0:
cmp sb, #0x10
blt _022EC0BC
_022EC1C8:
bl IsFloorOver
cmp r0, #0
bne _022EC23C
mov r4, #0
ldr r5, _022EC2FC ; =DUNGEON_PTR
mov r6, r4
_022EC1E0:
ldr r0, [r5]
add r0, r0, r4, lsl #2
add r0, r0, #0x12000
ldr r7, [r0, #0xb38 + RUN_FRACTIONAL_TURN_OFFSET]
mov r0, r7
bl EntityIsValid__022EC608
cmp r0, #0
ldrne r8, [r7, #0xb4]
ldrneb r0, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
cmpne r0, #0
beq _022EC230
mov r0, r7
bl ov29_0230FC24
mov r0, r7
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EC230
mov r0, r7
bl EnemyEvolution
strb r6, [r8, #0x14e + RUN_FRACTIONAL_TURN_OFFSET_2]
_022EC230:
add r4, r4, #1
cmp r4, #0x10
blt _022EC1E0
_022EC23C:
bl IsFloorOver
cmp r0, #0
bne _022EC2F4
ldr r4, _022EC2FC ; =DUNGEON_PTR
ldr r1, _022EC304 ; =ov29_023522B6
ldr r0, [r4]
add r0, r0, #0x700
ldrsh r0, [r0, #0x80]
add r0, r0, #1
mov r0, r0, lsl #1
ldrsh r0, [r1, r0]
cmp r0, #0
beq _022EC2C4
mov r5, #0
b _022EC2A4
_022EC278:
ldr r0, [r4]
add r0, r0, r5, lsl #2
add r0, r0, #0x12000
ldr r0, [r0, #0xb78 + RUN_FRACTIONAL_TURN_OFFSET]
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EC2A0
mov r0, #0
bl DisplayActions
b _022EC2AC
_022EC2A0:
add r5, r5, #1
_022EC2A4:
cmp r5, #0x14
blt _022EC278
_022EC2AC:
mov r0, #1
mov r1, #0
bl TryActivateWeather
bl ov29_022EF9C8
mov r0, #0
bl TryForcedLoss
_022EC2C4:
ldr r1, _022EC2FC ; =DUNGEON_PTR
ldr r0, [r1]
add r0, r0, #0x700
ldrsh r2, [r0, #0x80]
add r2, r2, #1
strh r2, [r0, #0x80]
ldr r0, [r1]
add r0, r0, #0x700
ldrsh r1, [r0, #0x80]
cmp r1, #0x18
moveq r1, #0
streqh r1, [r0, #0x80]
_022EC2F4:
add sp, sp, #0x40
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_022EC2FC: .word DUNGEON_PTR
_022EC300: .word FRACTIONAL_TURN_SEQUENCE
_022EC304: .word ov29_023522B6
arm_func_end RunFractionalTurn
arm_func_start RunLeaderTurn
RunLeaderTurn: ; 0x022EC308
stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr}
mov sl, r0
bl GetLeader
movs r4, r0
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
bl ov29_02348FD8
bl TryActivateArtificialWeatherAbilities
mov r0, r4
bl CalcSpeedStageWrapper
ldr r1, _022EC600 ; =DUNGEON_PTR
ldr r3, _022EC604 ; =FRACTIONAL_TURN_SEQUENCE
ldr r2, [r1]
mov r1, #0x32
add r2, r2, #0x700
mla r1, r0, r1, r3
ldrsh r2, [r2, #0x80]
mov r0, r2, lsl #1
ldrsh r0, [r0, r1]
cmp r0, #0
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
ldr r0, [r4, #0xb4]
#ifdef JAPAN
ldrb r0, [r0, #0x14e]
#else
ldrb r0, [r0, #0x152]
#endif
cmp r0, #0
movne r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
mov r0, r4
mov r1, #1
bl TryRestoreRoostTyping
_022EC380:
bl GetLeader
movs sb, r0
moveq r0, #0
ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
bl sub_01FFBDF4
mov r0, #0
bl DisplayActions
cmp r0, #0
bne _022EC3C8
ldr r0, _022EC600 ; =DUNGEON_PTR
ldr r1, [r0]
ldrb r0, [r1, #0x78b]
cmp r0, #0
ldreqb r0, [r1, #0x78e]
cmpeq r0, #0
beq _022EC3C8
mov r0, #0xc
bl AdvanceFrame
_022EC3C8:
cmp sb, #0
moveq r0, #0
beq _022EC3E8
ldr r0, [sb]
cmp r0, #1
moveq r0, #1
movne r0, #0
and r0, r0, #0xff
_022EC3E8:
cmp r0, #0
ldrne r0, [sb, #0xb4]
movne r1, #0
strneb r1, [r0, #0x101]
bl IsFloorOver
cmp r0, #0
movne r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
ldr r0, _022EC600 ; =DUNGEON_PTR
mov r1, #0
ldr r2, [r0]
cmp sl, #0
str sb, [r2, #0xc4]
ldr r0, [r0]
movne sl, r1
str r1, [r0, #0xc8]
bne _022EC434
mov r0, sb
bl TickStatusAndHealthRegen
_022EC434:
bl IsFloorOver
cmp r0, #0
movne r0, #0
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
bl ov29_022E81F8
mov r0, sb
bl EnemyEvolution
ldr r0, _022EC600 ; =DUNGEON_PTR
mov r1, #1
ldr r0, [r0]
strb r1, [r0, #0x11]
bl SetLeaderAction
ldr r0, _022EC600 ; =DUNGEON_PTR
mov r1, #0
ldr r0, [r0]
strb r1, [r0, #0x11]
bl IsFloorOver
cmp r0, #0
movne r0, #1
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
mov r0, sb
bl ExecuteMonsterAction
bl ov29_022EF9C8
mov r0, #0
bl TryForcedLoss
bl IsFloorOver
cmp r0, #0
movne r0, #1
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
ldr r1, [sb, #0xb4]
ldrh r0, [r1]
tst r0, #0x8000
bicne r0, r0, #0x8000
strneh r0, [r1]
ldrneh r0, [r1]
orrne r0, r0, #0x4000
strneh r0, [r1]
bl IsFloorOver
cmp r0, #0
movne r0, #1
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
ldr r4, _022EC600 ; =DUNGEON_PTR
ldr r1, [r4]
ldrb r0, [r1, #0x10]
cmp r0, #0
beq _022EC59C
mov r7, #0
strb r7, [r1, #0x10]
mov r5, r7
mov fp, r7
b _022EC594
_022EC500:
ldr r0, [r4]
add r0, r0, r7, lsl #2
add r0, r0, #0x12000
#ifdef JAPAN
ldr r6, [r0, #0xad4]
#else
ldr r6, [r0, #0xb78]
#endif
mov r0, r6
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EC590
ldr r8, [r6, #0xb4]
ldrh r0, [r8]
tst r0, #0x8000
beq _022EC590
bl IsFloorOver
cmp r0, #0
bne _022EC59C
mov r0, r6
bl TickStatusAndHealthRegen
mov r0, r6
bl EntityIsValid__022EC608
cmp r0, #0
beq _022EC590
mov r0, r6
bl EnemyEvolution
mov r0, r6
mov r1, r5
bl RunMonsterAi
mov r0, r6
bl ExecuteMonsterAction
mov r0, fp
bl TryForcedLoss
ldrh r0, [r8]
bic r0, r0, #0x8000
strh r0, [r8]
ldrh r0, [r8]
orr r0, r0, #0x4000
strh r0, [r8]
_022EC590:
add r7, r7, #1
_022EC594:
cmp r7, #0x14
blt _022EC500
_022EC59C:
bl IsFloorOver
cmp r0, #0
movne r0, #1
ldmneia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
ldr r0, _022EC600 ; =DUNGEON_PTR
ldr r1, [r0]
ldr r0, [r1, #0xc8]
cmp r0, #0
beq _022EC5DC
bl ChangeLeader
ldr r0, _022EC600 ; =DUNGEON_PTR
mov r1, #0
ldr r0, [r0]
mov sl, #1
str r1, [r0, #0xc8]
b _022EC380
_022EC5DC:
ldr r0, [sb, #0xb4]
ldrb r0, [r0, #0x101]
cmp r0, #0
addne r0, r1, #0x700
movne r1, #0
strneh r1, [r0, #0x80]
bne _022EC380
mov r0, #1
ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_022EC600: .word DUNGEON_PTR
_022EC604: .word FRACTIONAL_TURN_SEQUENCE
arm_func_end RunLeaderTurn