diff --git a/asm/include/overlay_29_022EB44C.inc b/asm/include/overlay_29_022EB44C.inc index a4d7fe8c..c87c3a64 100644 --- a/asm/include/overlay_29_022EB44C.inc +++ b/asm/include/overlay_29_022EB44C.inc @@ -1,52 +1,26 @@ #pragma once -.public abs -.public AdvanceFrame -.public CalcSpeedStageWrapper -.public ChangeLeader -.public DecrementWindCounter -.public DisplayActions .public DUNGEON_PTR -.public EnemyEvolution -.public EntityIsValid__022EC608 -.public ExecuteMonsterAction -.public FRACTIONAL_TURN_SEQUENCE .public GetEquivItemIndex .public GetItemAtIdx .public GetItemCategoryVeneer .public GetItemInfo -.public GetLeader .public GetTile -.public IsFloorOver -.public IsHM .public ITEM_CATEGORY_ACTIONS +.public IsHM .public ItemZInit -.public ov29_022E81F8 -.public ov29_022EF9C8 -.public ov29_0230FC24 +.public RemoveEmptyItemsInBagWrapper +.public RemoveEquivItemNoHole +.public RemoveGroundItem +.public RemoveItem +.public SetItemAcquired +.public SetMonsterActionFields +.public ShouldDisplayEntityWrapper +.public SpawnItem .public ov29_02347040 -.public ov29_02348FD8 .public ov29_02352074 -.public ov29_023522B6 .public ov29_0237C918 .public ov29_0237C91C .public ov29_0237C91E .public ov29_0237C920 .public ov29_0237C922 .public ov29_0237C96C -.public RemoveEmptyItemsInBagWrapper -.public RemoveEquivItemNoHole -.public RemoveGroundItem -.public RemoveItem -.public RunMonsterAi -.public SetItemAcquired -.public SetLeaderAction -.public SetMonsterActionFields -.public ShouldDisplayEntityWrapper -.public SpawnItem -.public sub_01FFBDF4 -.public TickStatusAndHealthRegen -.public TryActivateArtificialWeatherAbilities -.public TryActivateWeather -.public TryForcedLoss -.public TryRestoreRoostTyping -.public TrySpawnMonsterAndActivatePlusMinus diff --git a/asm/include/overlay_29_022EBCE8.inc b/asm/include/overlay_29_022EBCE8.inc new file mode 100644 index 00000000..3fc6677c --- /dev/null +++ b/asm/include/overlay_29_022EBCE8.inc @@ -0,0 +1,28 @@ +#pragma once +.public AdvanceFrame +.public CalcSpeedStageWrapper +.public ChangeLeader +.public DUNGEON_PTR +.public DecrementWindCounter +.public DisplayActions +.public EnemyEvolution +.public EntityIsValid__022EC608 +.public ExecuteMonsterAction +.public FRACTIONAL_TURN_SEQUENCE +.public GetLeader +.public IsFloorOver +.public RunMonsterAi +.public SetLeaderAction +.public TickStatusAndHealthRegen +.public TryActivateArtificialWeatherAbilities +.public TryActivateWeather +.public TryForcedLoss +.public TryRestoreRoostTyping +.public TrySpawnMonsterAndActivatePlusMinus +.public abs +.public ov29_022E81F8 +.public ov29_022EF9C8 +.public ov29_0230FC24 +.public ov29_02348FD8 +.public ov29_023522B6 +.public sub_01FFBDF4 diff --git a/asm/overlay_29_022EB44C.s b/asm/overlay_29_022EB44C.s index 09057c6f..b143594d 100644 --- a/asm/overlay_29_022EB44C.s +++ b/asm/overlay_29_022EB44C.s @@ -732,670 +732,3 @@ SetActionUseMovePlayer: ; 0x022EBC98 strb r4, [r6, #0xa] ldmia sp!, {r4, r5, r6, pc} arm_func_end SetActionUseMovePlayer - - arm_func_start SetActionUseMoveAi -SetActionUseMoveAi: ; 0x022EBCBC - stmdb sp!, {r4, r5, r6, lr} - mov r5, r1 - mov r1, #0x15 - mov r6, r0 - mov r4, r2 - bl SetMonsterActionFields - cmp r4, #0xff - strb r5, [r6, #4] - andne r0, r4, #7 - strneb r0, [r6, #2] - ldmia sp!, {r4, r5, r6, pc} - arm_func_end SetActionUseMoveAi - - 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 diff --git a/asm/overlay_29_022EBCE8.s b/asm/overlay_29_022EBCE8.s new file mode 100644 index 00000000..e2f5e0d7 --- /dev/null +++ b/asm/overlay_29_022EBCE8.s @@ -0,0 +1,656 @@ + .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 diff --git a/include/direction.h b/include/direction.h index 1f87c0b5..fec1e4f1 100644 --- a/include/direction.h +++ b/include/direction.h @@ -17,5 +17,6 @@ enum direction_id { #define DIRECTION_MASK 7 #define NUM_DIRECTIONS 8 +#define DIR_NONE_UNSIGNED 0xFF #endif //PMDSKY_DIRECTION_H \ No newline at end of file diff --git a/include/dungeon_action_helper.h b/include/dungeon_action_helper.h new file mode 100644 index 00000000..aff4352c --- /dev/null +++ b/include/dungeon_action_helper.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_DUNGEON_ACTION_HELPER_H +#define PMDSKY_DUNGEON_ACTION_HELPER_H + +#include "dungeon_mode.h" + +void SetActionUseMoveAi(struct action_data *monster_action, s16 move_index, u8 direction); + +#endif //PMDSKY_DUNGEON_ACTION_HELPER_H diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index 00efc7e7..495fedca 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -105,7 +105,6 @@ struct action_parameter { struct action_data { enum action action_id; // 0x0: Action ID u8 direction; // 0x2: Direction in which the action will be performed - u8 field_0x3; struct action_parameter action_parameters[2]; // 0x4: Parameters for the action // 0x10: Position of the target that the Pokémon wants throw an item at. struct position item_target_position; diff --git a/main.lsf b/main.lsf index a425d0e1..76fd9f31 100644 --- a/main.lsf +++ b/main.lsf @@ -294,6 +294,8 @@ Overlay OVY_29 Object asm/overlay_29_022EAB50.o Object src/dungeon_action.o Object asm/overlay_29_022EB44C.o + Object src/dungeon_action_helper.o + Object asm/overlay_29_022EBCE8.o Object src/overlay_29_022EC608.o Object asm/overlay_29_022EC62C.o Object src/overlay_29_022ECDC0.o diff --git a/src/dungeon_action_helper.c b/src/dungeon_action_helper.c new file mode 100644 index 00000000..afe0fab5 --- /dev/null +++ b/src/dungeon_action_helper.c @@ -0,0 +1,11 @@ +#include "dungeon_action_helper.h" +#include "direction.h" +#include "dungeon_action.h" + +void SetActionUseMoveAi(struct action_data *monster_action, s16 move_index, u8 direction) +{ + SetMonsterActionFields(monster_action, ACTION_USE_MOVE_AI); + monster_action->action_parameters[0].action_use_idx = move_index; + if (direction != DIR_NONE_UNSIGNED) + monster_action->direction = direction & DIRECTION_MASK; +} diff --git a/src/dungeon_ai_itcm.c b/src/dungeon_ai_itcm.c index cfac6cc7..8a80382b 100644 --- a/src/dungeon_ai_itcm.c +++ b/src/dungeon_ai_itcm.c @@ -2,6 +2,7 @@ #include "dg_random.h" #include "direction.h" #include "dungeon_action.h" +#include "dungeon_action_helper.h" #include "dungeon_ai_targeting.h" #include "dungeon_capabilities_3.h" #include "dungeon_capabilities_4.h" @@ -14,11 +15,12 @@ #define REGULAR_ATTACK_INDEX 4 +// The weight of the regular attack in the weighted random when the AI is deciding which move to use, depending on how many other attacks the AI can currently use. +// Each index in the array corresponds to the number of attacks (0-4) the AI can use (i.e., is enabled and has PP remaining). const s16 AI_REGULAR_ATTACK_WEIGHTS[5] = { 100, 20, 30, 40, 50 }; extern struct dungeon *DUNGEON_PTR[]; -extern void SetActionUseMoveAi(struct action_data *monster_action, s16 move_index, u8 direction); extern void UpdateAiTargetPos(struct entity *monster); extern void InitMove(struct move *move, enum move_id move_id); extern u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *monster, struct move *move); diff --git a/src/dungeon_capabilities_3.c b/src/dungeon_capabilities_3.c index 6a194ddb..56dc22e2 100644 --- a/src/dungeon_capabilities_3.c +++ b/src/dungeon_capabilities_3.c @@ -107,7 +107,7 @@ enum mobility_type GetDirectionalMobilityType(struct entity* monster, enum mobil else if (mobility != MOBILITY_INTANGIBLE && IqSkillIsEnabled(monster, IQ_ALL_TERRAIN_HIKER)) mobility = MOBILITY_HOVERING; else if (IqSkillIsEnabled(monster, IQ_ABSOLUTE_MOVER)) { - if (direction == 0xFF) + if (direction == DIR_NONE_UNSIGNED) mobility = MOBILITY_INTANGIBLE; else if (direction & 1) // Absolute Mover can't break walls diagonally.