From 7ed1870fb14d4bb41e4346d978dbf52ef3556ba5 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Thu, 22 May 2025 00:02:20 -0400 Subject: [PATCH] Decomped HasStatusThatPreventsActing --- asm/include/overlay_29_022FEDBC.inc | 20 +- asm/include/overlay_29_022FF3F4.inc | 15 + asm/overlay_29_022FEDBC.s | 573 ---------------------------- asm/overlay_29_022FF3F4.s | 405 ++++++++++++++++++++ include/dungeon_mode.h | 2 +- include/status_checks.h | 9 + main.lsf | 2 + src/dungeon_ai.c | 2 +- src/status_checks.c | 111 ++++++ 9 files changed, 546 insertions(+), 593 deletions(-) create mode 100644 asm/include/overlay_29_022FF3F4.inc create mode 100644 asm/overlay_29_022FF3F4.s create mode 100644 include/status_checks.h create mode 100644 src/status_checks.c diff --git a/asm/include/overlay_29_022FEDBC.inc b/asm/include/overlay_29_022FEDBC.inc index 7c0fcafe..2001ecf7 100644 --- a/asm/include/overlay_29_022FEDBC.inc +++ b/asm/include/overlay_29_022FEDBC.inc @@ -1,30 +1,14 @@ #pragma once .public ActivateFlashFire -.public CanMonsterMoveInDirection .public CanMonsterUseMove -.public ChooseAiMove .public DUNGEON_PTR .public DungeonRandInt .public EntityIsValid__022FED98 -.public GetMobilityType -.public GetMobilityTypeAfterIqSkills -.public GetTile -.public IqSkillIsEnabled -.public IsBlinded -.public IsChargingTwoTurnMove -.public IsCurrentTilesetBackground -.public IsFloating .public IsMonsterSleeping -.public ItemIsActive__022FF898 .public LogMessageByIdWithPopupCheckUser +.public SubstitutePlaceholderStringTags +.public TickStatusTurnCounter .public ov29_022E56A0 .public ov29_022FAA04 .public ov29_02300DCC -.public ov29_02318D58 .public ov29_02322374 -.public ov29_0237C9B8 -.public SetActionPassTurnOrWalk -.public SetActionUseMovePlayer -.public SetMonsterActionFields -.public SubstitutePlaceholderStringTags -.public TickStatusTurnCounter diff --git a/asm/include/overlay_29_022FF3F4.inc b/asm/include/overlay_29_022FF3F4.inc new file mode 100644 index 00000000..3c029a7a --- /dev/null +++ b/asm/include/overlay_29_022FF3F4.inc @@ -0,0 +1,15 @@ +#pragma once +.public GetMobilityType +.public GetMobilityTypeAfterIqSkills +.public GetTile +.public IqSkillIsEnabled +.public IsChargingTwoTurnMove +.public IsCurrentTilesetBackground +.public IsFloating +.public ItemIsActive__022FF898 +.public LogMessageByIdWithPopupCheckUser +.public SetActionUseMovePlayer +.public SetMonsterActionFields +.public SubstitutePlaceholderStringTags +.public ov29_02318D58 +.public ov29_0237C9B8 diff --git a/asm/overlay_29_022FEDBC.s b/asm/overlay_29_022FEDBC.s index ef775920..0ec405a9 100644 --- a/asm/overlay_29_022FEDBC.s +++ b/asm/overlay_29_022FEDBC.s @@ -336,576 +336,3 @@ _022FF1B4: .align 2, 0 _022FF1C4: .word DUNGEON_PTR arm_func_end TryActivateFlashFireOnAllMonsters - - arm_func_start HasStatusThatPreventsActing -HasStatusThatPreventsActing: ; 0x022FF1C8 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r0, #0 - ldr r4, [r5, #0xb4] - mov r1, r5 - mov r2, r0 - bl SubstitutePlaceholderStringTags - add r0, r4, #0x4a - mov r1, #1 - bl SetMonsterActionFields - ldrb r0, [r4, #0xbd] - cmp r0, #1 - cmpne r0, #3 - cmpne r0, #5 - bne _022FF20C - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF20C: - ldrb r0, [r4, #0xc4] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - b _022FF27C -_022FF21C: ; jump table - b _022FF27C ; case 0 - b _022FF238 ; case 1 - b _022FF27C ; case 2 - b _022FF24C ; case 3 - b _022FF260 ; case 4 - b _022FF27C ; case 5 - b _022FF274 ; case 6 -_022FF238: - ldr r1, _022FF3DC ; =0x00000C28 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF24C: - ldr r1, _022FF3E0 ; =0x00000C29 - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF260: - ldr r1, _022FF3E4 ; =0x00000C2A - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF274: - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF27C: - ldrb r0, [r4, #0xd0] - cmp r0, #3 - beq _022FF294 - cmp r0, #7 - beq _022FF2A8 - b _022FF2BC -_022FF294: - ldr r1, _022FF3E8 ; =0x00000C2B - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF2A8: - ldr r1, _022FF3EC ; =0x00000C2C - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF2BC: - ldrb r0, [r4, #0xd2] - cmp r0, #1 - bne _022FF2DC - ldr r1, _022FF3F0 ; =0x00000C2D - mov r0, r5 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF2DC: - ldrb r0, [r4, #0xd8] - cmp r0, #2 - bne _022FF320 - ldrsh r1, [r4, #2] - add r0, r4, #0x4a - bl SetActionPassTurnOrWalk - mov r0, #8 - bl DungeonRandInt - strb r0, [r4, #0x4c] - ldrsh r2, [r5, #4] - add r1, r4, #0x100 - mov r0, #1 -#ifdef JAPAN - strh r2, [r1, #0x7a] - ldrsh r2, [r5, #6] - sub r2, r2, #1 - strh r2, [r1, #0x7c] -#else - strh r2, [r1, #0x7e] - ldrsh r2, [r5, #6] - sub r2, r2, #1 - strh r2, [r1, #0x80] -#endif - ldmia sp!, {r3, r4, r5, pc} -_022FF320: - ldrb r0, [r4, #9] - cmp r0, #1 - moveq r0, #1 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r5 - mov r1, #1 - bl IsBlinded - cmp r0, #0 - beq _022FF3AC - ldrb r1, [r4, #0x4c] - mov r0, r5 - bl CanMonsterMoveInDirection - cmp r0, #0 - beq _022FF368 - ldrsh r1, [r4, #2] - add r0, r4, #0x4a - bl SetActionPassTurnOrWalk - b _022FF3A4 -_022FF368: - mov r0, #2 - bl DungeonRandInt - cmp r0, #0 - beq _022FF39C - mov r0, #8 - bl DungeonRandInt - and r1, r0, #0xff - and r0, r1, #7 - strb r0, [r4, #0x4c] - ldrsh r1, [r4, #2] - add r0, r4, #0x4a - bl SetActionPassTurnOrWalk - b _022FF3A4 -_022FF39C: - mov r0, r5 - bl ChooseAiMove -_022FF3A4: - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} -_022FF3AC: - ldrb r0, [r4, #0xf1] - cmp r0, #2 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, pc} - ldrsh r1, [r4, #2] - add r0, r4, #0x4a - bl SetActionPassTurnOrWalk - mov r0, #8 - bl DungeonRandInt - strb r0, [r4, #0x4c] - mov r0, #1 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#ifdef JAPAN -#define HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -0x2C1 -#else -#define HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET 0 -#endif -_022FF3DC: .word 0x00000C28 + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -_022FF3E0: .word 0x00000C29 + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -_022FF3E4: .word 0x00000C2A + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -_022FF3E8: .word 0x00000C2B + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -_022FF3EC: .word 0x00000C2C + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -_022FF3F0: .word 0x00000C2D + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET - arm_func_end HasStatusThatPreventsActing - - arm_func_start ov29_022FF3F4 -ov29_022FF3F4: ; 0x022FF3F4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} - mov r7, r0 - mov r4, #0 - ldr r6, [r7, #0xb4] - mov r0, r4 - mov r1, r7 - mov r2, r4 - bl SubstitutePlaceholderStringTags - add r0, r6, #0x4a - mov r1, #1 - bl SetMonsterActionFields - ldrb r0, [r6, #0xbd] - cmp r0, #1 - cmpne r0, #3 - cmpne r0, #5 - bne _022FF448 - ldr r1, _022FF60C ; =0x00000C2E - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF448: - ldrb r0, [r6, #0xc4] - cmp r0, #6 - addls pc, pc, r0, lsl #2 - b _022FF4B8 -_022FF458: ; jump table - b _022FF4B8 ; case 0 - b _022FF474 ; case 1 - b _022FF4B8 ; case 2 - b _022FF488 ; case 3 - b _022FF49C ; case 4 - b _022FF4B8 ; case 5 - b _022FF4B0 ; case 6 -_022FF474: - ldr r1, _022FF610 ; =0x00000C28 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF488: - ldr r1, _022FF614 ; =0x00000C29 - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF49C: - ldr r1, _022FF618 ; =0x00000C2A - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF4B0: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF4B8: - ldrb r0, [r6, #0xd0] - cmp r0, #8 - addls pc, pc, r0, lsl #2 - b _022FF51C -_022FF4C8: ; jump table - b _022FF51C ; case 0 - b _022FF51C ; case 1 - b _022FF4EC ; case 2 - b _022FF4F4 ; case 3 - b _022FF51C ; case 4 - b _022FF51C ; case 5 - b _022FF51C ; case 6 - b _022FF508 ; case 7 - b _022FF51C ; case 8 -_022FF4EC: - mov r4, #1 - b _022FF51C -_022FF4F4: - ldr r1, _022FF61C ; =0x00000C2B - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF508: - ldr r1, _022FF620 ; =0x00000C2C - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF51C: - ldrb r0, [r6, #0xd2] - cmp r0, #1 - bne _022FF53C - ldr r1, _022FF624 ; =0x00000C2D - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF53C: - cmp r0, #0 - cmpne r0, #0xb - cmpne r0, #0xc - beq _022FF604 - cmp r4, #0 - beq _022FF564 - ldr r1, _022FF628 ; =0x00000C2F - mov r0, r7 - bl LogMessageByIdWithPopupCheckUser - b _022FF5FC -_022FF564: - mov r5, #0 -#ifdef JAPAN - add r4, r6, #0x120 -#else - add r4, r6, #0x124 -#endif - mov r8, r5 - mov sb, #1 - b _022FF5F4 -_022FF578: - ldrb r0, [r4, r5, lsl #3] - mov r1, r5, lsl #3 - tst r0, #1 - movne r0, sb - moveq r0, r8 - tst r0, #0xff - beq _022FF5F0 - mov r0, r7 - add r1, r4, r1 - bl IsChargingTwoTurnMove - cmp r0, #0 - beq _022FF5F0 - ldrb r0, [r6, #0xd4] - cmp r0, r5 - bne _022FF5F0 - b _022FF5CC -_022FF5B8: - add r0, r6, r5, lsl #3 -#ifdef JAPAN - ldrb r0, [r0, #0x120] -#else - ldrb r0, [r0, #0x124] -#endif - tst r0, #2 - beq _022FF5D4 - sub r5, r5, #1 -_022FF5CC: - cmp r5, #0 - bgt _022FF5B8 -_022FF5D4: - ldrb r1, [r6, #0x4e] - mov r2, r5, lsl #0x10 - add r0, r6, #0x4a - mov r2, r2, asr #0x10 - bl SetActionUseMovePlayer - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} -_022FF5F0: - add r5, r5, #1 -_022FF5F4: - cmp r5, #4 - blt _022FF578 -_022FF5FC: - mov r0, r7 - bl ov29_02318D58 -_022FF604: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -#ifdef JAPAN -#define OV29_022FF3F4_OFFSET -0x2C1 -#else -#define OV29_022FF3F4_OFFSET 0 -#endif -_022FF60C: .word 0x00000C2E + OV29_022FF3F4_OFFSET -_022FF610: .word 0x00000C28 + OV29_022FF3F4_OFFSET -_022FF614: .word 0x00000C29 + OV29_022FF3F4_OFFSET -_022FF618: .word 0x00000C2A + OV29_022FF3F4_OFFSET -_022FF61C: .word 0x00000C2B + OV29_022FF3F4_OFFSET -_022FF620: .word 0x00000C2C + OV29_022FF3F4_OFFSET -_022FF624: .word 0x00000C2D + OV29_022FF3F4_OFFSET -_022FF628: .word 0x00000C2F + OV29_022FF3F4_OFFSET - arm_func_end ov29_022FF3F4 - - arm_func_start GetMobilityTypeCheckSlip -GetMobilityTypeCheckSlip: ; 0x022FF62C - stmdb sp!, {r4, lr} - mov r4, r1 - bl GetMobilityType - cmp r4, #0 - beq _022FF660 - cmp r0, #0 - cmpne r0, #4 - moveq r1, #1 - movne r1, #0 - tst r1, #0xff - ldrne r0, _022FF670 ; =ov29_0237C9B8 - ldrneb r0, [r0, #5] - ldmneia sp!, {r4, pc} -_022FF660: - cmp r0, #4 - ldrhs r1, _022FF670 ; =ov29_0237C9B8 - ldrhsb r0, [r1, r0] - ldmia sp!, {r4, pc} - .align 2, 0 -_022FF670: .word ov29_0237C9B8 - arm_func_end GetMobilityTypeCheckSlip - - arm_func_start GetMobilityTypeCheckSlipAndFloating -GetMobilityTypeCheckSlipAndFloating: ; 0x022FF674 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - ldr r0, [r5, #0xb4] - ldrb r0, [r0, #0xef] - cmp r0, #4 - moveq r2, #1 - movne r2, #0 - mov r0, r1 - and r1, r2, #0xff - bl GetMobilityTypeCheckSlip - mov r4, r0 - cmp r4, #3 - beq _022FF6BC - mov r0, r5 - bl IsFloating - cmp r0, #0 - movne r0, #2 - ldmneia sp!, {r3, r4, r5, pc} -_022FF6BC: - mov r0, r4 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end GetMobilityTypeCheckSlipAndFloating - - arm_func_start IsInvalidSpawnTile -IsInvalidSpawnTile: ; 0x022FF6C4 - stmdb sp!, {r4, lr} - mov r4, r1 - ldr r1, [r4, #0xc] - cmp r1, #0 - movne r0, #1 - ldmneia sp!, {r4, pc} - ldrh r1, [r4] - tst r1, #0x10 - movne r0, #1 - ldmneia sp!, {r4, pc} - mov r1, #0 - bl GetMobilityTypeCheckSlip - ldrh r1, [r4] - cmp r0, #3 - and r1, r1, #3 - addls pc, pc, r0, lsl #2 - b _022FF754 -_022FF708: ; jump table - b _022FF718 ; case 0 - b _022FF728 ; case 1 - b _022FF744 ; case 2 - b _022FF754 ; case 3 -_022FF718: - cmp r1, #1 - bne _022FF75C - mov r0, #0 - ldmia sp!, {r4, pc} -_022FF728: - cmp r1, #2 - moveq r0, #0 - ldmeqia sp!, {r4, pc} - cmp r1, #1 - bne _022FF75C - mov r0, #0 - ldmia sp!, {r4, pc} -_022FF744: - cmp r1, #0 - beq _022FF75C - mov r0, #0 - ldmia sp!, {r4, pc} -_022FF754: - mov r0, #0 - ldmia sp!, {r4, pc} -_022FF75C: - mov r0, #1 - ldmia sp!, {r4, pc} - arm_func_end IsInvalidSpawnTile - - arm_func_start ov29_022FF764 -ov29_022FF764: ; 0x022FF764 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov r7, r1 - mov r6, r0 - ldrsh r0, [r7] - ldrsh r1, [r7, #2] - ldr r5, [r6, #0xb4] - bl GetTile - ldrsh r1, [r7] - mov r4, r0 - cmp r1, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - ldrsh r0, [r7, #2] - cmp r0, #0 - movlt r0, #1 - ldmltia sp!, {r3, r4, r5, r6, r7, pc} - cmp r1, #0x38 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - cmp r0, #0x20 - movge r0, #1 - ldmgeia sp!, {r3, r4, r5, r6, r7, pc} - ldr r0, [r4, #0xc] - cmp r0, #0 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - ldrh r0, [r4] - tst r0, #0x10 - movne r0, #1 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} - bl IsCurrentTilesetBackground - cmp r0, #0 - bne _022FF810 - ldrb r0, [r5, #0xef] - cmp r0, #3 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - mov r0, r6 - mov r1, #0x10 - bl ItemIsActive__022FF898 - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r3, r4, r5, r6, r7, pc} -_022FF810: - ldrsh r1, [r5, #2] - mov r0, r6 - bl GetMobilityTypeCheckSlipAndFloating - ldrh r2, [r4] -#ifdef JAPAN - mov r4, r0 - mov r0, r6 - mov r1, #0xc - and r5, r2, #3 - bl IqSkillIsEnabled - cmp r0, #0 - mov r0, r6 - mov r1, #0xd - movne r4, #2 - bl IqSkillIsEnabled - cmp r0, #0 - movne r4, #3 - cmp r4, #3 - addls pc, pc, r4, lsl #2 -#else - mov r1, r0 - mov r0, r6 - and r4, r2, #3 - bl GetMobilityTypeAfterIqSkills - cmp r0, #3 - addls pc, pc, r0, lsl #2 -#endif - b _022FF888 -_022FF83C: ; jump table - b _022FF84C ; case 0 - b _022FF85C ; case 1 - b _022FF878 ; case 2 - b _022FF888 ; case 3 -_022FF84C: -#ifdef JAPAN - cmp r5, #1 -#else - cmp r4, #1 -#endif - bne _022FF890 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FF85C: -#ifdef JAPAN - cmp r5, #2 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - cmp r5, #1 -#else - cmp r4, #2 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, pc} - cmp r4, #1 -#endif - bne _022FF890 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FF878: -#ifdef JAPAN - cmp r5, #0 -#else - cmp r4, #0 -#endif - beq _022FF890 - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FF888: - mov r0, #0 - ldmia sp!, {r3, r4, r5, r6, r7, pc} -_022FF890: - mov r0, #1 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end ov29_022FF764 diff --git a/asm/overlay_29_022FF3F4.s b/asm/overlay_29_022FF3F4.s new file mode 100644 index 00000000..bcde087c --- /dev/null +++ b/asm/overlay_29_022FF3F4.s @@ -0,0 +1,405 @@ + .include "asm/macros.inc" + .include "overlay_29_022FF3F4.inc" + + .text + + arm_func_start ov29_022FF3F4 +ov29_022FF3F4: ; 0x022FF3F4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, lr} + mov r7, r0 + mov r4, #0 + ldr r6, [r7, #0xb4] + mov r0, r4 + mov r1, r7 + mov r2, r4 + bl SubstitutePlaceholderStringTags + add r0, r6, #0x4a + mov r1, #1 + bl SetMonsterActionFields + ldrb r0, [r6, #0xbd] + cmp r0, #1 + cmpne r0, #3 + cmpne r0, #5 + bne _022FF448 + ldr r1, _022FF60C ; =0x00000C2E + mov r0, r7 + bl LogMessageByIdWithPopupCheckUser + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF448: + ldrb r0, [r6, #0xc4] + cmp r0, #6 + addls pc, pc, r0, lsl #2 + b _022FF4B8 +_022FF458: ; jump table + b _022FF4B8 ; case 0 + b _022FF474 ; case 1 + b _022FF4B8 ; case 2 + b _022FF488 ; case 3 + b _022FF49C ; case 4 + b _022FF4B8 ; case 5 + b _022FF4B0 ; case 6 +_022FF474: + ldr r1, _022FF610 ; =0x00000C28 + mov r0, r7 + bl LogMessageByIdWithPopupCheckUser + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF488: + ldr r1, _022FF614 ; =0x00000C29 + mov r0, r7 + bl LogMessageByIdWithPopupCheckUser + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF49C: + ldr r1, _022FF618 ; =0x00000C2A + mov r0, r7 + bl LogMessageByIdWithPopupCheckUser + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF4B0: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF4B8: + ldrb r0, [r6, #0xd0] + cmp r0, #8 + addls pc, pc, r0, lsl #2 + b _022FF51C +_022FF4C8: ; jump table + b _022FF51C ; case 0 + b _022FF51C ; case 1 + b _022FF4EC ; case 2 + b _022FF4F4 ; case 3 + b _022FF51C ; case 4 + b _022FF51C ; case 5 + b _022FF51C ; case 6 + b _022FF508 ; case 7 + b _022FF51C ; case 8 +_022FF4EC: + mov r4, #1 + b _022FF51C +_022FF4F4: + ldr r1, _022FF61C ; =0x00000C2B + mov r0, r7 + bl LogMessageByIdWithPopupCheckUser + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF508: + ldr r1, _022FF620 ; =0x00000C2C + mov r0, r7 + bl LogMessageByIdWithPopupCheckUser + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF51C: + ldrb r0, [r6, #0xd2] + cmp r0, #1 + bne _022FF53C + ldr r1, _022FF624 ; =0x00000C2D + mov r0, r7 + bl LogMessageByIdWithPopupCheckUser + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF53C: + cmp r0, #0 + cmpne r0, #0xb + cmpne r0, #0xc + beq _022FF604 + cmp r4, #0 + beq _022FF564 + ldr r1, _022FF628 ; =0x00000C2F + mov r0, r7 + bl LogMessageByIdWithPopupCheckUser + b _022FF5FC +_022FF564: + mov r5, #0 +#ifdef JAPAN + add r4, r6, #0x120 +#else + add r4, r6, #0x124 +#endif + mov r8, r5 + mov sb, #1 + b _022FF5F4 +_022FF578: + ldrb r0, [r4, r5, lsl #3] + mov r1, r5, lsl #3 + tst r0, #1 + movne r0, sb + moveq r0, r8 + tst r0, #0xff + beq _022FF5F0 + mov r0, r7 + add r1, r4, r1 + bl IsChargingTwoTurnMove + cmp r0, #0 + beq _022FF5F0 + ldrb r0, [r6, #0xd4] + cmp r0, r5 + bne _022FF5F0 + b _022FF5CC +_022FF5B8: + add r0, r6, r5, lsl #3 +#ifdef JAPAN + ldrb r0, [r0, #0x120] +#else + ldrb r0, [r0, #0x124] +#endif + tst r0, #2 + beq _022FF5D4 + sub r5, r5, #1 +_022FF5CC: + cmp r5, #0 + bgt _022FF5B8 +_022FF5D4: + ldrb r1, [r6, #0x4e] + mov r2, r5, lsl #0x10 + add r0, r6, #0x4a + mov r2, r2, asr #0x10 + bl SetActionUseMovePlayer + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} +_022FF5F0: + add r5, r5, #1 +_022FF5F4: + cmp r5, #4 + blt _022FF578 +_022FF5FC: + mov r0, r7 + bl ov29_02318D58 +_022FF604: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, pc} + .align 2, 0 +#ifdef JAPAN +#define OV29_022FF3F4_OFFSET -0x2C1 +#else +#define OV29_022FF3F4_OFFSET 0 +#endif +_022FF60C: .word 0x00000C2E + OV29_022FF3F4_OFFSET +_022FF610: .word 0x00000C28 + OV29_022FF3F4_OFFSET +_022FF614: .word 0x00000C29 + OV29_022FF3F4_OFFSET +_022FF618: .word 0x00000C2A + OV29_022FF3F4_OFFSET +_022FF61C: .word 0x00000C2B + OV29_022FF3F4_OFFSET +_022FF620: .word 0x00000C2C + OV29_022FF3F4_OFFSET +_022FF624: .word 0x00000C2D + OV29_022FF3F4_OFFSET +_022FF628: .word 0x00000C2F + OV29_022FF3F4_OFFSET + arm_func_end ov29_022FF3F4 + + arm_func_start GetMobilityTypeCheckSlip +GetMobilityTypeCheckSlip: ; 0x022FF62C + stmdb sp!, {r4, lr} + mov r4, r1 + bl GetMobilityType + cmp r4, #0 + beq _022FF660 + cmp r0, #0 + cmpne r0, #4 + moveq r1, #1 + movne r1, #0 + tst r1, #0xff + ldrne r0, _022FF670 ; =ov29_0237C9B8 + ldrneb r0, [r0, #5] + ldmneia sp!, {r4, pc} +_022FF660: + cmp r0, #4 + ldrhs r1, _022FF670 ; =ov29_0237C9B8 + ldrhsb r0, [r1, r0] + ldmia sp!, {r4, pc} + .align 2, 0 +_022FF670: .word ov29_0237C9B8 + arm_func_end GetMobilityTypeCheckSlip + + arm_func_start GetMobilityTypeCheckSlipAndFloating +GetMobilityTypeCheckSlipAndFloating: ; 0x022FF674 + stmdb sp!, {r3, r4, r5, lr} + mov r5, r0 + ldr r0, [r5, #0xb4] + ldrb r0, [r0, #0xef] + cmp r0, #4 + moveq r2, #1 + movne r2, #0 + mov r0, r1 + and r1, r2, #0xff + bl GetMobilityTypeCheckSlip + mov r4, r0 + cmp r4, #3 + beq _022FF6BC + mov r0, r5 + bl IsFloating + cmp r0, #0 + movne r0, #2 + ldmneia sp!, {r3, r4, r5, pc} +_022FF6BC: + mov r0, r4 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end GetMobilityTypeCheckSlipAndFloating + + arm_func_start IsInvalidSpawnTile +IsInvalidSpawnTile: ; 0x022FF6C4 + stmdb sp!, {r4, lr} + mov r4, r1 + ldr r1, [r4, #0xc] + cmp r1, #0 + movne r0, #1 + ldmneia sp!, {r4, pc} + ldrh r1, [r4] + tst r1, #0x10 + movne r0, #1 + ldmneia sp!, {r4, pc} + mov r1, #0 + bl GetMobilityTypeCheckSlip + ldrh r1, [r4] + cmp r0, #3 + and r1, r1, #3 + addls pc, pc, r0, lsl #2 + b _022FF754 +_022FF708: ; jump table + b _022FF718 ; case 0 + b _022FF728 ; case 1 + b _022FF744 ; case 2 + b _022FF754 ; case 3 +_022FF718: + cmp r1, #1 + bne _022FF75C + mov r0, #0 + ldmia sp!, {r4, pc} +_022FF728: + cmp r1, #2 + moveq r0, #0 + ldmeqia sp!, {r4, pc} + cmp r1, #1 + bne _022FF75C + mov r0, #0 + ldmia sp!, {r4, pc} +_022FF744: + cmp r1, #0 + beq _022FF75C + mov r0, #0 + ldmia sp!, {r4, pc} +_022FF754: + mov r0, #0 + ldmia sp!, {r4, pc} +_022FF75C: + mov r0, #1 + ldmia sp!, {r4, pc} + arm_func_end IsInvalidSpawnTile + + arm_func_start ov29_022FF764 +ov29_022FF764: ; 0x022FF764 + stmdb sp!, {r3, r4, r5, r6, r7, lr} + mov r7, r1 + mov r6, r0 + ldrsh r0, [r7] + ldrsh r1, [r7, #2] + ldr r5, [r6, #0xb4] + bl GetTile + ldrsh r1, [r7] + mov r4, r0 + cmp r1, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + ldrsh r0, [r7, #2] + cmp r0, #0 + movlt r0, #1 + ldmltia sp!, {r3, r4, r5, r6, r7, pc} + cmp r1, #0x38 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + cmp r0, #0x20 + movge r0, #1 + ldmgeia sp!, {r3, r4, r5, r6, r7, pc} + ldr r0, [r4, #0xc] + cmp r0, #0 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + ldrh r0, [r4] + tst r0, #0x10 + movne r0, #1 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} + bl IsCurrentTilesetBackground + cmp r0, #0 + bne _022FF810 + ldrb r0, [r5, #0xef] + cmp r0, #3 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + mov r0, r6 + mov r1, #0x10 + bl ItemIsActive__022FF898 + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r3, r4, r5, r6, r7, pc} +_022FF810: + ldrsh r1, [r5, #2] + mov r0, r6 + bl GetMobilityTypeCheckSlipAndFloating + ldrh r2, [r4] +#ifdef JAPAN + mov r4, r0 + mov r0, r6 + mov r1, #0xc + and r5, r2, #3 + bl IqSkillIsEnabled + cmp r0, #0 + mov r0, r6 + mov r1, #0xd + movne r4, #2 + bl IqSkillIsEnabled + cmp r0, #0 + movne r4, #3 + cmp r4, #3 + addls pc, pc, r4, lsl #2 +#else + mov r1, r0 + mov r0, r6 + and r4, r2, #3 + bl GetMobilityTypeAfterIqSkills + cmp r0, #3 + addls pc, pc, r0, lsl #2 +#endif + b _022FF888 +_022FF83C: ; jump table + b _022FF84C ; case 0 + b _022FF85C ; case 1 + b _022FF878 ; case 2 + b _022FF888 ; case 3 +_022FF84C: +#ifdef JAPAN + cmp r5, #1 +#else + cmp r4, #1 +#endif + bne _022FF890 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FF85C: +#ifdef JAPAN + cmp r5, #2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r5, #1 +#else + cmp r4, #2 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, pc} + cmp r4, #1 +#endif + bne _022FF890 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FF878: +#ifdef JAPAN + cmp r5, #0 +#else + cmp r4, #0 +#endif + beq _022FF890 + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FF888: + mov r0, #0 + ldmia sp!, {r3, r4, r5, r6, r7, pc} +_022FF890: + mov r0, #1 + ldmia sp!, {r3, r4, r5, r6, r7, pc} + arm_func_end ov29_022FF764 diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index 38ebe341..00efc7e7 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -104,7 +104,7 @@ struct action_parameter { // Contains data used to describe an action taken by a monster. struct action_data { enum action action_id; // 0x0: Action ID - enum direction_id direction; // 0x2: Direction in which the action will be performed + 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. diff --git a/include/status_checks.h b/include/status_checks.h new file mode 100644 index 00000000..f7911e2e --- /dev/null +++ b/include/status_checks.h @@ -0,0 +1,9 @@ +#ifndef PMDSKY_STATUS_CHECKS_H +#define PMDSKY_STATUS_CHECKS_H + +#include "dungeon_mode.h" + +// Returns true if the monster has any status problem that prevents it from acting +bool8 HasStatusThatPreventsActing(struct entity *monster); + +#endif //PMDSKY_STATUS_CHECKS_H diff --git a/main.lsf b/main.lsf index d9f7ea06..09a569a9 100644 --- a/main.lsf +++ b/main.lsf @@ -305,6 +305,8 @@ Overlay OVY_29 Object asm/overlay_29_022FE4BC.o Object src/overlay_29_022FED98.o Object asm/overlay_29_022FEDBC.o + Object src/status_checks.o + Object asm/overlay_29_022FF3F4.o Object src/overlay_29_022FF898.o Object asm/overlay_29_022FF8C8.o Object src/overlay_29_023000E4.o diff --git a/src/dungeon_ai.c b/src/dungeon_ai.c index 40d233ca..14df187f 100644 --- a/src/dungeon_ai.c +++ b/src/dungeon_ai.c @@ -8,6 +8,7 @@ #include "dungeon_util_static.h" #include "dungeon_util.h" #include "dungeon_visibility.h" +#include "status_checks.h" #include "targeting.h" #ifdef JAPAN @@ -23,7 +24,6 @@ extern struct dungeon *DUNGEON_PTR[]; extern void EndFrozenClassStatus(struct entity *user, struct entity *target, bool8 log); extern void SubstitutePlaceholderStringTags(u8 *string_id, struct entity *entity, u32 param_3); extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); -extern bool8 HasStatusThatPreventsActing(struct entity *monster); extern void ClearMonsterActionFields(struct action_data *monster_action); extern void SetActionPassTurnOrWalk(struct action_data *monster_action, s16 monster_id); extern void ChooseAiMove(struct entity *monster); diff --git a/src/status_checks.c b/src/status_checks.c new file mode 100644 index 00000000..7249eafc --- /dev/null +++ b/src/status_checks.c @@ -0,0 +1,111 @@ +#include "status_checks.h" +#include "dg_random.h" +#include "dungeon_action.h" +#include "dungeon_statuses.h" +#include "dungeon_util_static.h" + +#ifdef JAPAN +#define HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET -0x2C1 +#else +#define HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET 0 +#endif + +#define FROZEN_MESSAGE (0xC28 + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) +#define WRAPPED_AROUND_MESSAGE (0xC29 + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) +#define WRAPPED_BY_MESSAGE (0xC2A + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) +#define PAUSED_MESSAGE (0xC2B + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) +#define INFATUATED_MESSAGE (0xC2C + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) +#define BIDE_MESSAGE (0xC2D + HAS_STATUS_THAT_PREVENTS_ACTING_OFFSET) + +extern void SubstitutePlaceholderStringTags(u8 *string_id, struct entity *entity, u32 param_3); +extern void LogMessageByIdWithPopupCheckUser(struct entity *user, u32 message_id); +extern void SetActionPassTurnOrWalk(struct action_data *monster_action, s16 monster_id); +extern bool8 CanMonsterMoveInDirection(struct entity *monster, u8 direction); +extern void ChooseAiMove(struct entity *monster); + +bool8 HasStatusThatPreventsActing(struct entity *monster) +{ + struct monster *pokemon_info = GetEntInfo(monster); + SubstitutePlaceholderStringTags(0, monster, 0); + SetMonsterActionFields(&pokemon_info->action, ACTION_PASS_TURN); + + switch (pokemon_info->sleep_class_status.sleep) + { + case STATUS_SLEEP_NIGHTMARE: + case STATUS_SLEEP_SLEEP: + case STATUS_SLEEP_NAPPING: + return TRUE; + } + + switch (pokemon_info->frozen_class_status.freeze) + { + case STATUS_FROZEN_FROZEN: + LogMessageByIdWithPopupCheckUser(monster, FROZEN_MESSAGE); + return TRUE; + case STATUS_FROZEN_WRAP: + LogMessageByIdWithPopupCheckUser(monster, WRAPPED_AROUND_MESSAGE); + return TRUE; + case STATUS_FROZEN_WRAPPED: + LogMessageByIdWithPopupCheckUser(monster, WRAPPED_BY_MESSAGE); + return TRUE; + case STATUS_FROZEN_PETRIFIED: + return TRUE; + } + + switch (pokemon_info->cringe_class_status.cringe) + { + case STATUS_CRINGE_PAUSED: + LogMessageByIdWithPopupCheckUser(monster, PAUSED_MESSAGE); + return TRUE; + case STATUS_CRINGE_INFATUATED: + LogMessageByIdWithPopupCheckUser(monster, INFATUATED_MESSAGE); + return TRUE; + } + + if (pokemon_info->bide_class_status.bide == STATUS_TWO_TURN_BIDE) + { + LogMessageByIdWithPopupCheckUser(monster, BIDE_MESSAGE); + return TRUE; + } + + if (pokemon_info->curse_class_status.curse == STATUS_CURSE_DECOY) + { + SetActionPassTurnOrWalk(&pokemon_info->action, pokemon_info->id); + pokemon_info->action.direction = DungeonRandInt(NUM_DIRECTIONS); + pokemon_info->target_pos.x = monster->pos.x; + pokemon_info->target_pos.y = monster->pos.y - 1; + return TRUE; + } + + if (pokemon_info->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER) + return TRUE; + + if (IsBlinded(monster, TRUE)) + { + if (CanMonsterMoveInDirection(monster, pokemon_info->action.direction)) + { + SetActionPassTurnOrWalk(&pokemon_info->action, pokemon_info->id); + } + else if (DungeonRandInt(2) != 0) + { + pokemon_info->action.direction = DungeonRandInt(NUM_DIRECTIONS); + pokemon_info->action.direction = pokemon_info->action.direction & DIRECTION_MASK; + SetActionPassTurnOrWalk(&pokemon_info->action, pokemon_info->id); + } + else + { + ChooseAiMove(monster); + } + + return TRUE; + } + + if (pokemon_info->blinker_class_status.blinded == STATUS_BLINKER_CROSS_EYED) + { + SetActionPassTurnOrWalk(&pokemon_info->action, pokemon_info->id); + pokemon_info->action.direction = DungeonRandInt(NUM_DIRECTIONS); + return TRUE; + } + + return FALSE; +}