From c31bd7d9bca6acc701b19b825479fa882cf727b9 Mon Sep 17 00:00:00 2001 From: AnonymousRandomPerson Date: Mon, 1 Sep 2025 23:37:20 -0400 Subject: [PATCH] Added nonmatching for StatusCheckerCheckOnTarget --- asm/include/overlay_29_02333FD0.inc | 6 - asm/include/overlay_29_02334CAC.inc | 1 + asm/overlay_29_02333FD0.s | 989 -------------- asm/overlay_29_02334CAC.s | 34 + include/dungeon_mode.h | 3 + include/math.h | 7 + include/move_checks.h | 6 + main.lsf | 2 +- src/dungeon_ai_attack.c | 1 - src/move_checks.c | 1345 ++++++++++++++++++++ tools/extract_function/extract_function.py | 19 +- 11 files changed, 1408 insertions(+), 1005 deletions(-) delete mode 100644 asm/include/overlay_29_02333FD0.inc create mode 100644 asm/include/overlay_29_02334CAC.inc delete mode 100644 asm/overlay_29_02333FD0.s create mode 100644 asm/overlay_29_02334CAC.s create mode 100644 include/math.h diff --git a/asm/include/overlay_29_02333FD0.inc b/asm/include/overlay_29_02333FD0.inc deleted file mode 100644 index d63a18eb..00000000 --- a/asm/include/overlay_29_02333FD0.inc +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once -.public GendersEqualNotGenderless -.public GravityIsActive -.public IsMonsterSleeping -.public IsThawingMove -.public MonsterIsType diff --git a/asm/include/overlay_29_02334CAC.inc b/asm/include/overlay_29_02334CAC.inc new file mode 100644 index 00000000..6f70f09b --- /dev/null +++ b/asm/include/overlay_29_02334CAC.inc @@ -0,0 +1 @@ +#pragma once diff --git a/asm/overlay_29_02333FD0.s b/asm/overlay_29_02333FD0.s deleted file mode 100644 index b7b29843..00000000 --- a/asm/overlay_29_02333FD0.s +++ /dev/null @@ -1,989 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02333FD0.inc" - - .text - - arm_func_start StatusCheckerCheckOnTarget -StatusCheckerCheckOnTarget: ; 0x02333FD0 -#ifdef JAPAN -#define OV29_02333FD0_OFFSET -4 -#else -#define OV29_02333FD0_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r1 - ldr r5, [r6, #0xb4] - mov r7, r0 - ldrb r0, [r5, #0xc4] - mov r8, r2 - ldr r4, [r7, #0xb4] - cmp r0, #1 - bne _02334008 - mov r0, r8 - bl IsThawingMove - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r4, r5, r6, r7, r8, pc} -_02334008: - ldrh r1, [r8, #4] - ldr r0, _02334CA4 ; =0x0000010A - cmp r1, r0 - bgt _0233429C - bge _023349A4 - cmp r1, #0x8a - bgt _023341C8 - bge _023349F4 - cmp r1, #0x56 - bgt _02334164 - bge _023347B0 - cmp r1, #0x4f - bgt _02334140 - bge _023344D0 - cmp r1, #0x3b - bgt _02334134 - bge _0233473C - cmp r1, #0x36 - addls pc, pc, r1, lsl #2 - b _02334C9C -_02334058: ; jump table - b _02334C9C ; case 0 - b _02334C9C ; case 1 - b _02334C9C ; case 2 - b _023344E8 ; case 3 - b _023344D0 ; case 4 - b _02334510 ; case 5 - b _02334C9C ; case 6 - b _02334C9C ; case 7 - b _02334C9C ; case 8 - b _02334C9C ; case 9 - b _02334524 ; case 10 - b _02334538 ; case 11 - b _02334C9C ; case 12 - b _02334A74 ; case 13 - b _02334C9C ; case 14 - b _02334C9C ; case 15 - b _02334C9C ; case 16 - b _0233454C ; case 17 - b _02334C9C ; case 18 - b _02334C9C ; case 19 - b _02334574 ; case 20 - b _02334588 ; case 21 - b _023345A0 ; case 22 - b _02334618 ; case 23 - b _02334A74 ; case 24 - b _02334C9C ; case 25 - b _02334C9C ; case 26 - b _02334630 ; case 27 - b _02334C9C ; case 28 - b _02334C9C ; case 29 - b _02334C9C ; case 30 - b _02334C9C ; case 31 - b _02334C9C ; case 32 - b _02334644 ; case 33 - b _023344D0 ; case 34 - b _02334658 ; case 35 - b _02334C9C ; case 36 - b _023346C0 ; case 37 - b _02334C9C ; case 38 - b _02334C9C ; case 39 - b _02334C9C ; case 40 - b _02334C9C ; case 41 - b _02334C9C ; case 42 - b _023346D4 ; case 43 - b _02334C9C ; case 44 - b _02334A74 ; case 45 - b _02334C9C ; case 46 - b _023346F0 ; case 47 - b _02334C9C ; case 48 - b _02334C9C ; case 49 - b _02334C9C ; case 50 - b _02334C9C ; case 51 - b _02334C9C ; case 52 - b _02334C9C ; case 53 - b _02334704 ; case 54 -_02334134: - cmp r1, #0x42 - beq _02334750 - b _02334C9C -_02334140: - cmp r1, #0x54 - bgt _02334158 - bge _023344D0 - cmp r1, #0x53 - beq _02334780 - b _02334C9C -_02334158: - cmp r1, #0x55 - beq _02334794 - b _02334C9C -_02334164: - cmp r1, #0x6f - bgt _02334194 - bge _023344D0 - cmp r1, #0x59 - bgt _02334188 - bge _023347B0 - cmp r1, #0x58 - beq _023347C4 - b _02334C9C -_02334188: - cmp r1, #0x6a - beq _02334618 - b _02334C9C -_02334194: - cmp r1, #0x73 - bgt _023341AC - bge _02334830 - cmp r1, #0x70 - beq _0233481C - b _02334C9C -_023341AC: - cmp r1, #0x7a - bgt _023341BC - beq _0233476C - b _02334C9C -_023341BC: - cmp r1, #0x7c - beq _0233473C - b _02334C9C -_023341C8: - cmp r1, #0xc5 - bgt _02334238 - bge _02334A40 - cmp r1, #0xac - bgt _02334204 - bge _023348B8 - cmp r1, #0x92 - bgt _023341F8 - bge _023348A4 - cmp r1, #0x8e - beq _023348A4 - b _02334C9C -_023341F8: - cmp r1, #0xab - beq _02334A74 - b _02334C9C -_02334204: - cmp r1, #0xc0 - bgt _0233421C - bge _0233473C - cmp r1, #0xbf - beq _02334A74 - b _02334C9C -_0233421C: - cmp r1, #0xc2 - bgt _0233422C - beq _023347B0 - b _02334C9C -_0233422C: - cmp r1, #0xc4 - beq _02334A54 - b _02334C9C -_02334238: - cmp r1, #0xdc - bgt _02334268 - bge _0233493C - cmp r1, #0xd1 - bgt _0233425C - bge _023348CC - cmp r1, #0xc7 - beq _02334A54 - b _02334C9C -_0233425C: - cmp r1, #0xd9 - beq _02334928 - b _02334C9C -_02334268: - cmp r1, #0xe7 - bgt _02334280 - bge _023344D0 - cmp r1, #0xe0 - beq _0233476C - b _02334C9C -_02334280: - cmp r1, #0xed - bgt _02334290 - beq _02334960 - b _02334C9C -_02334290: - cmp r1, #0xf9 - beq _02334908 - b _02334C9C -_0233429C: - add r2, r0, #0xb5 - cmp r1, r2 - bgt _023343B8 - bge _02334AB0 - add r2, r0, #0x31 - cmp r1, r2 - bgt _0233432C - bge _02334704 - add r2, r0, #0xf - cmp r1, r2 - bgt _023342FC - bge _0233473C - add r2, r0, #7 - cmp r1, r2 - bgt _023342EC - bge _023348A4 - add r0, r0, #1 - cmp r1, r0 - beq _02334928 - b _02334C9C -_023342EC: - add r0, r0, #8 - cmp r1, r0 - beq _02334A74 - b _02334C9C -_023342FC: - add r2, r0, #0x1c - cmp r1, r2 - bgt _0233431C - bge _02334A20 - add r0, r0, #0x1b - cmp r1, r0 - beq _023349E0 - b _02334C9C -_0233431C: - add r0, r0, #0x30 - cmp r1, r0 - beq _023349B8 - b _02334C9C -_0233432C: - add r2, r0, #0x55 - cmp r1, r2 - bgt _0233436C - bge _02334618 - add r2, r0, #0x3d - cmp r1, r2 - bgt _0233435C - bge _023349F4 - add r0, r0, #0x3c - cmp r1, r0 - beq _02334A0C - b _02334C9C -_0233435C: - add r0, r0, #0x3f - cmp r1, r0 - beq _023349CC - b _02334C9C -_0233436C: - add r2, r0, #0x74 - cmp r1, r2 - bgt _0233438C - bge _02334A74 - add r0, r0, #0x71 - cmp r1, r0 - beq _023349A4 - b _02334C9C -_0233438C: - add r2, r0, #0xac - cmp r1, r2 - bgt _023343A8 - add r0, r0, #0xac - cmp r1, r0 - beq _02334A88 - b _02334C9C -_023343A8: - add r0, r0, #0xad - cmp r1, r0 - beq _02334A9C - b _02334C9C -_023343B8: - add r2, r0, #0xe3 - cmp r1, r2 - bgt _02334450 - bge _02334B64 - add r2, r0, #0xc8 - cmp r1, r2 - bgt _02334408 - bge _02334B00 - add r2, r0, #0xb8 - cmp r1, r2 - bgt _023343FC - add r0, r0, #0xb8 - cmp r1, r0 - bge _02334AEC - cmp r1, #0x1c0 - beq _02334AC4 - b _02334C9C -_023343FC: - cmp r1, #0x1c8 - beq _02334524 - b _02334C9C -_02334408: - add r2, r0, #0xd8 - cmp r1, r2 - bgt _02334428 - bge _023348CC - add r0, r0, #0xd4 - cmp r1, r0 - beq _02334B14 - b _02334C9C -_02334428: - add r2, r0, #0xd9 - cmp r1, r2 - bgt _02334444 - add r0, r0, #0xd9 - cmp r1, r0 - beq _023344D0 - b _02334C9C -_02334444: - cmp r1, #0x1ec - beq _02334B28 - b _02334C9C -_02334450: - add r2, r0, #0xf8 - cmp r1, r2 - bgt _02334494 - bge _02334C00 - add r2, r0, #0xf0 - cmp r1, r2 - bgt _02334484 - add r0, r0, #0xf0 - cmp r1, r0 - bge _02334B78 - cmp r1, #0x1f8 - beq _0233481C - b _02334C9C -_02334484: - add r0, r0, #0xf7 - cmp r1, r0 - beq _02334BD8 - b _02334C9C -_02334494: - cmp r1, #0x210 - bgt _023344B0 - bge _02334C18 - ldr r0, _02334CA8 ; =0x0000020D - cmp r1, r0 - beq _023349F4 - b _02334C9C -_023344B0: - cmp r1, #0x214 - bgt _023344C0 - beq _02334C60 - b _02334C9C -_023344C0: - add r0, r0, #0x10c - cmp r1, r0 - beq _02334C74 - b _02334C9C -_023344D0: - mov r0, r6 - bl IsMonsterSleeping - cmp r0, #0 - beq _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023344E8: - ldrb r0, [r5, #0xbd] - cmp r0, #4 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - mov r0, r6 - bl IsMonsterSleeping - cmp r0, #0 - beq _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334510: - ldrb r0, [r5, #0xbd] - cmp r0, #3 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334524: - ldrsh r0, [r5, #0x2e] - cmp r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334538: - ldr r0, [r5, #0x34] - cmp r0, #0x3f - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0233454C: - ldrb r0, [r5, #0xd0] - cmp r0, #6 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - add r0, r5, #0x124 + OV29_02333FD0_OFFSET - bl HasLastUsedMove - cmp r0, #0 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334574: - ldrsh r0, [r5, #0x10] - cmp r0, #2 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334588: - ldrsh r1, [r5, #0x10] - ldrsh r0, [r4, #0x10] - cmp r1, r0 - bgt _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023345A0: - mov r3, #0 - mov r0, r3 - mov r1, #1 - b _023345DC -_023345B0: - add r2, r5, r3, lsl #3 - ldrb r2, [r2, #0x124 + OV29_02333FD0_OFFSET] - tst r2, #1 - movne r4, r1 - moveq r4, r0 - tst r4, #0xff - beq _023345D8 - tst r2, #0x20 - movne r0, #1 - bne _023345F4 -_023345D8: - add r3, r3, #1 -_023345DC: - cmp r3, #4 - blt _023345B0 - ldrb r0, [r5, #0x144 + OV29_02333FD0_OFFSET] - tst r0, #0x20 - movne r0, #1 - moveq r0, #0 -_023345F4: - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r4, r5, r6, r7, r8, pc} - add r0, r5, #0x124 + OV29_02333FD0_OFFSET - bl HasLastUsedMove - cmp r0, #0 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334618: - ldr r0, [r6, #0xb4] - ldr r0, [r0, #0x110 + OV29_02333FD0_OFFSET] - cmp r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334630: - ldr r0, [r5, #0x3c] - cmp r0, #0x3f - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334644: - ldrsh r0, [r5, #0x2a] - cmp r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334658: - mov r4, #0 - add r3, r5, #0x124 + OV29_02333FD0_OFFSET - mov r1, r4 - mov r2, #1 - b _023346A4 -_0233466C: - ldrb r5, [r3, r4, lsl #3] - add r0, r3, r4, lsl #3 - tst r5, #1 - movne r6, r2 - moveq r6, r1 - tst r6, #0xff - beq _023346A0 - tst r5, #0x10 - beq _023346A0 - ldrb r0, [r0, #6] - cmp r0, #0 - moveq r0, #1 - beq _023346B0 -_023346A0: - add r4, r4, #1 -_023346A4: - cmp r4, #4 - blt _0233466C - mov r0, #0 -_023346B0: - cmp r0, #0 - beq _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023346C0: - ldrb r0, [r5, #0xec] - cmp r0, #2 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023346D4: - ldr r0, [r5, #0x34] - cmp r0, #0x3f - ldrlt r0, [r5, #0x38] - cmplt r0, #0x3f - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023346F0: - ldrb r0, [r5, #0xbf] - cmp r0, #1 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334704: - ldrb r0, [r5, #0x5e] - cmp r0, #0xe - ldrneb r0, [r5, #0x5f] - cmpne r0, #0xe - bne _02334728 - ldrb r0, [r5, #0xfe] - cmp r0, #0 - moveq r0, #1 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} -_02334728: - ldrsh r0, [r5, #0x2e] - cmp r0, #0xa - bgt _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0233473C: - ldrb r0, [r5, #0xbf] - cmp r0, #4 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334750: - ldrsh r1, [r5, #0x10] - ldrsh r0, [r4, #0x10] - sub r0, r1, r0 - cmp r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0233476C: - ldrsh r0, [r5, #0x28] - cmp r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334780: - ldrsh r0, [r5, #0x2a] - cmp r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334794: - ldrsh r0, [r5, #0x24] - cmp r0, #1 - ldrltsh r0, [r5, #0x28] - cmplt r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023347B0: - ldrb r0, [r5, #0xc4] - cmp r0, #2 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023347C4: - mov r2, #0 - b _02334804 -_023347CC: - add r1, r5, r2, lsl #1 - ldrsh r0, [r1, #0x24] - cmp r0, #0xa - ldrgesh r0, [r1, #0x28] - cmpge r0, #0xa - ldrgesh r0, [r1, #0x2c] - cmpge r0, #0xa - addge r1, r5, r2, lsl #2 - ldrge r0, [r1, #0x34] - cmpge r0, #0x100 - ldrge r0, [r1, #0x3c] - cmpge r0, #0x100 - blt _0233480C - add r2, r2, #1 -_02334804: - cmp r2, #2 - blt _023347CC -_0233480C: - cmp r2, #2 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0233481C: - ldrb r0, [r5, #0xbd] - cmp r0, #2 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334830: - mov r0, #0 - b _0233488C -_02334838: - add r6, r4, r0, lsl #1 - add r3, r5, r0, lsl #1 - ldrsh r2, [r6, #0x24] - ldrsh r1, [r3, #0x24] - cmp r2, r1 - ldrgesh r2, [r6, #0x28] - ldrgesh r1, [r3, #0x28] - cmpge r2, r1 - ldrgesh r2, [r6, #0x2c] - ldrgesh r1, [r3, #0x2c] - cmpge r2, r1 - addge r6, r4, r0, lsl #2 - addge r3, r5, r0, lsl #2 - ldrge r2, [r6, #0x34] - ldrge r1, [r3, #0x34] - cmpge r2, r1 - ldrge r2, [r6, #0x3c] - ldrge r1, [r3, #0x3c] - cmpge r2, r1 - blt _02334894 - add r0, r0, #1 -_0233488C: - cmp r0, #2 - blt _02334838 -_02334894: - cmp r0, #2 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023348A4: - ldrsh r0, [r5, #0x2c] - cmp r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023348B8: - ldrb r0, [r5, #0xd0] - cmp r0, #5 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023348CC: - ldrb r0, [r4, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldrb r0, [r5, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334908: - ldrb r0, [r5, #0x62] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334928: - ldrsh r0, [r5, #0x24] - cmp r0, #1 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_0233493C: - ldrb r1, [r4, #0x60] - ldrb r0, [r5, #0x60] - cmp r1, r0 - ldreqb r1, [r4, #0x61] - ldreqb r0, [r5, #0x61] - cmpeq r1, r0 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334960: - mov r0, r7 - mov r1, #0xe - bl MonsterIsType - cmp r0, #0 - beq _02334988 - ldrb r0, [r5, #0xd8] - cmp r0, #1 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334988: - ldrsh r0, [r4, #0x24] - cmp r0, #0x13 - ldrgtsh r0, [r4, #0x28] - cmpgt r0, #0x13 - ble _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023349A4: - ldrb r0, [r5, #0xd0] - cmp r0, #3 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023349B8: - ldrsh r0, [r5, #0x10] - cmp r0, #2 - bge _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023349CC: - ldrb r0, [r5, #0xe0] - cmp r0, #1 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023349E0: -#ifdef JAPAN - ldrb r0, [r5, #0x105] -#else - ldrb r0, [r5, #0x106] -#endif - cmp r0, #0 - beq _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_023349F4: - add r0, r5, #0x124 + OV29_02333FD0_OFFSET - bl HasLastUsedMove - cmp r0, #0 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334A0C: - ldrb r0, [r5, #0xd0] - cmp r0, #7 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334A20: - ldrb r0, [r5, #0xc4] - cmp r0, #3 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - cmp r0, #4 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334A40: - ldrb r0, [r5, #0xbf] - cmp r0, #3 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334A54: - ldrb r0, [r5, #0xbf] - cmp r0, #2 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - cmp r0, #3 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334A74: - ldrb r0, [r5, #0xd0] - cmp r0, #2 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334A88: - ldrb r0, [r5, #0xd8] - cmp r0, #4 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334A9C: - ldrb r0, [r5, #0xd8] - cmp r0, #4 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334AB0: - ldrb r0, [r5, #0xd5] - cmp r0, #0x11 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334AC4: - ldrsh r3, [r4, #0x28] - ldrsh r2, [r4, #0x2a] - ldrsh r1, [r5, #0x28] - ldrsh r0, [r5, #0x2a] - add r2, r3, r2 - add r0, r1, r0 - cmp r2, r0 - blt _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334AEC: - ldrb r0, [r5, #0xd8] - cmp r0, #5 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334B00: - ldrb r0, [r5, #0xd8] - cmp r0, #6 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334B14: - bl GravityIsActive - cmp r0, #0 - beq _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334B28: - mov r2, #0 - b _02334B4C -_02334B30: - add r1, r5, r2, lsl #1 - ldrsh r0, [r1, #0x24] - cmp r0, #0x14 - ldrgesh r0, [r1, #0x28] - cmpge r0, #0x14 - blt _02334B54 - add r2, r2, #1 -_02334B4C: - cmp r2, #2 - blt _02334B30 -_02334B54: - cmp r2, #2 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334B64: - ldrb r0, [r5, #0xf7] - cmp r0, #1 - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334B78: - ldrsh r3, [r4, #0x28] - ldrsh r1, [r4, #0x2a] - ldrsh r2, [r5, #0x28] - ldrsh r0, [r5, #0x2a] - add r1, r3, r1 - mov r1, r1, lsl #0x10 - add r0, r2, r0 - mov r2, r0, lsl #0x10 - ldrsh r6, [r4, #0x24] - ldrsh r0, [r4, #0x26] - ldrsh r4, [r5, #0x24] - ldrsh r3, [r5, #0x26] - add r0, r6, r0 - mov r0, r0, lsl #0x10 - add r3, r4, r3 - mov r4, r1, asr #0x10 - mov r1, r3, lsl #0x10 - mov r2, r2, asr #0x10 - add r3, r4, r0, asr #16 - add r0, r2, r1, asr #16 - cmp r3, r0 - blt _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334BD8: - ldrsh r3, [r4, #0x24] - ldrsh r2, [r4, #0x26] - ldrsh r1, [r5, #0x24] - ldrsh r0, [r5, #0x26] - add r2, r3, r2 - add r0, r1, r0 - cmp r2, r0 - blt _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334C00: - ldrsh r1, [r4, #0x24] - ldrsh r0, [r4, #0x28] - cmp r1, r0 - blt _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334C18: - ldrb r0, [r5, #0x5e] - cmp r0, #0x10 - ldrneb r0, [r5, #0x5f] - cmpne r0, #0x10 - bne _02334C4C - ldrb r0, [r5, #0xf5] - cmp r0, #1 - bne _02334C9C - ldrsh r0, [r5, #0x2e] - cmp r0, #0xa - bgt _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334C4C: - ldrsh r0, [r5, #0x2e] - cmp r0, #0xa - bgt _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334C60: - ldrb r0, [r5, #0xd5] - cmp r0, #0xf - bne _02334C9C - mov r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, pc} -_02334C74: - ldrsh r0, [r5, #0x26] - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r4, r5, r6, r7, r8, pc} - ldrsh r0, [r4, #2] - ldrsh r1, [r5, #2] - bl GendersEqualNotGenderless - cmp r0, #0 - movne r0, #0 - ldmneia sp!, {r4, r5, r6, r7, r8, pc} -_02334C9C: - mov r0, #1 - ldmia sp!, {r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02334CA4: .word 0x0000010A -_02334CA8: .word 0x0000020D - arm_func_end StatusCheckerCheckOnTarget - - arm_func_start HasLastUsedMove -HasLastUsedMove: ; 0x02334CAC - stmdb sp!, {r3, lr} - mov r3, #0 - mov r1, r3 - mov r2, #1 - b _02334CE8 -_02334CC0: - ldrb ip, [r0, r3, lsl #3] - tst ip, #1 - movne lr, r2 - moveq lr, r1 - tst lr, #0xff - beq _02334CE4 - tst ip, #0x10 - movne r0, #1 - ldmneia sp!, {r3, pc} -_02334CE4: - add r3, r3, #1 -_02334CE8: - cmp r3, #4 - blt _02334CC0 - ldrb r0, [r0, #0x20] - tst r0, #0x10 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end HasLastUsedMove diff --git a/asm/overlay_29_02334CAC.s b/asm/overlay_29_02334CAC.s new file mode 100644 index 00000000..9410188a --- /dev/null +++ b/asm/overlay_29_02334CAC.s @@ -0,0 +1,34 @@ + .include "asm/macros.inc" + .include "overlay_29_02334CAC.inc" + + .text + + arm_func_start HasLastUsedMove +HasLastUsedMove: ; 0x02334CAC + stmdb sp!, {r3, lr} + mov r3, #0 + mov r1, r3 + mov r2, #1 + b _02334CE8 +_02334CC0: + ldrb ip, [r0, r3, lsl #3] + tst ip, #1 + movne lr, r2 + moveq lr, r1 + tst lr, #0xff + beq _02334CE4 + tst ip, #0x10 + movne r0, #1 + ldmneia sp!, {r3, pc} +_02334CE4: + add r3, r3, #1 +_02334CE8: + cmp r3, #4 + blt _02334CC0 + ldrb r0, [r0, #0x20] + tst r0, #0x10 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff + ldmia sp!, {r3, pc} + arm_func_end HasLastUsedMove diff --git a/include/dungeon_mode.h b/include/dungeon_mode.h index b4f964e7..6eb106a1 100644 --- a/include/dungeon_mode.h +++ b/include/dungeon_mode.h @@ -10,6 +10,9 @@ #define NUM_PICKED_IQ_SKILLS 3 #define MAX_MON_MOVES 4 + +#define STAT_MULTIPLIER_THRESHOLD 0.249 // one tick less than 0.25 +#define DEFAULT_STAT_STAGE 10 #define MAX_STAT_STAGE 20 #define MAX_SPEED_STAGE 4 #define NUM_SPEED_COUNTERS 5 diff --git a/include/math.h b/include/math.h new file mode 100644 index 00000000..86f2e358 --- /dev/null +++ b/include/math.h @@ -0,0 +1,7 @@ +#ifndef PMDSKY_MATH_H +#define PMDSKY_MATH_H + +#define F248LessThanFloat(x, y) (x < (int)(y * 0x100)) +#define F248LessThanInt(x, y) (x < 0x100 * y) + +#endif //PMDSKY_MATH_H \ No newline at end of file diff --git a/include/move_checks.h b/include/move_checks.h index e7933a4a..2f029db3 100644 --- a/include/move_checks.h +++ b/include/move_checks.h @@ -10,5 +10,11 @@ bool8 StatusCheckerCheck(struct entity *attacker, struct move *move); // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02333FAC(struct entity *entity); +// Determines if using a given move against its intended target would be redundant because all of them already have the effect caused by said move. Used for moves that affect enemies. +// attacker: Pointer to the entity that is considering using the move +// target: Pointer to the entity being targeted by the move +// move: Move pointer +// return: True if it makes sense to use the move, false if it would be redundant given the effects it causes and the effects that the target already has. +bool8 StatusCheckerCheckOnTarget(struct entity *attacker, struct entity *target, struct move *move); #endif //PMDSKY_MOVE_CHECKS_H diff --git a/main.lsf b/main.lsf index eac3f1b3..95bb5154 100644 --- a/main.lsf +++ b/main.lsf @@ -537,7 +537,7 @@ Overlay OVY_29 Object src/overlay_29_023329E8.o Object asm/overlay_29_02332A0C.o Object src/move_checks.o - Object asm/overlay_29_02333FD0.o + Object asm/overlay_29_02334CAC.o Object src/weather.o Object asm/overlay_29_02334D58.o Object src/overlay_29_023350D8.o diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c index 8e400d5b..468bde77 100644 --- a/src/dungeon_ai_attack.c +++ b/src/dungeon_ai_attack.c @@ -26,7 +26,6 @@ extern struct entity *AI_POTENTIAL_ATTACK_TARGETS[NUM_DIRECTIONS]; extern enum type_id GetMoveTypeForMonster(struct entity *entity, struct move *move); extern s32 WeightMoveWithIqSkills(struct entity *user, s32 move_ai_range, struct entity *target, enum type_id move_type); -extern bool8 StatusCheckerCheckOnTarget(struct entity *attacker, struct entity *target, struct move *move); extern bool8 ov29_023007DC(struct entity *entity); extern bool8 IsMonsterSleeping(struct entity *monster); extern u8 GetMoveAccuracyOrAiChance(struct move *move, u32 which); diff --git a/src/move_checks.c b/src/move_checks.c index adf64179..43f2740c 100644 --- a/src/move_checks.c +++ b/src/move_checks.c @@ -7,13 +7,19 @@ #include "dungeon_util_static.h" #include "dungeon_visibility.h" #include "inflict_status.h" +#include "math.h" #include "number_util.h" +#include "overlay_29_02338390.h" #include "run_dungeon_1.h" #include "tileset.h" #include "trap.h" #include "weather.h" extern bool8 ov29_023007DC(struct entity *entity); +extern bool8 IsThawingMove(struct move *move); +extern bool8 IsMonsterSleeping(struct entity* monster); +extern bool8 HasLastUsedMove(struct move *moves); +extern bool8 GendersEqualNotGenderless(s16 monster1, s16 monster2); // https://decomp.me/scratch/TnODN #ifdef NONMATCHING @@ -1617,3 +1623,1342 @@ bool8 EntityIsValid__02333FAC(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +// https://decomp.me/scratch/t6Dx2 +#ifdef NONMATCHING +bool8 StatusCheckerCheckOnTarget(struct entity *attacker, struct entity *target, struct move *move) +{ + struct monster *user_data = GetEntInfo(attacker); + struct monster *target_data = GetEntInfo(target); + if (target_data->frozen_class_status.freeze == STATUS_FROZEN_FROZEN && IsThawingMove(move)) + return FALSE; + + s32 i; + switch (move->id) + { + case MOVE_DARK_VOID: + case MOVE_GRASSWHISTLE: + case MOVE_HYPNOSIS: + case MOVE_LOVELY_KISS: + case MOVE_SING: + case MOVE_SLEEP_POWDER: + case MOVE_SPORE: + if (IsMonsterSleeping(target)) + return FALSE; + break; + case MOVE_YAWN: + if (target_data->sleep_class_status.sleep == STATUS_YAWNING) + return FALSE; + if (IsMonsterSleeping(target)) + return FALSE; + break; + case MOVE_NIGHTMARE: + if (target_data->sleep_class_status.sleep == STATUS_NIGHTMARE) + return FALSE; + break; + case MOVE_DEFOG: + case MOVE_SWEET_SCENT: + if (target_data->stat_modifiers.hit_chance_stages[STAT_STAGE_EVASION] < 1) + return FALSE; + break; + case MOVE_CHARM: + if (F248LessThanFloat(target_data->stat_modifiers.offensive_multipliers[STAT_STAGE_ATK], STAT_MULTIPLIER_THRESHOLD)) + return FALSE; + break; + case MOVE_ENCORE: + if (target_data->cringe_class_status.cringe == STATUS_CRINGE_ENCORE) + return FALSE; + if (!HasLastUsedMove(target_data->moves.moves)) + return FALSE; + break; + case MOVE_SUPER_FANG: + if (target_data->hp < 2) + return FALSE; + break; + case MOVE_PAIN_SPLIT: + if (target_data->hp <= user_data->hp) + return FALSE; + break; + case MOVE_TORMENT: + bool8 has_disabled_move = FALSE; + for (i = 0; i < MAX_MON_MOVES; i++) + { + struct move *move = &target_data->moves.moves[i]; + if (MoveExists(move) && + move->flags0 & MOVE_FLAG_DISABLED) + { + has_disabled_move = TRUE; + goto end_has_disabled_move; + } + } + if (target_data->moves.struggle_move_flags & MOVE_FLAG_DISABLED) + has_disabled_move = TRUE; + else + has_disabled_move = FALSE; + end_has_disabled_move: + + if (has_disabled_move) + return FALSE; + + if (!HasLastUsedMove(target_data->moves.moves)) + return FALSE; + break; + case MOVE_COTTON_SPORE: + case MOVE_SCARY_FACE: + case MOVE_STRING_SHOT: + if (GetEntInfo(target)->speed_stage < 1) + return FALSE; + break; + case MOVE_SCREECH: + if (F248LessThanFloat(target_data->stat_modifiers.defensive_multipliers[STAT_STAGE_DEF], STAT_MULTIPLIER_THRESHOLD)) + return FALSE; + break; + case MOVE_FAKE_TEARS: + if (target_data->stat_modifiers.defensive_stages[STAT_STAGE_SP_DEF] < 1) + return FALSE; + break; + case MOVE_SPITE: + bool8 last_used_move_out_of_pp; + for (i = 0; i < MAX_MON_MOVES; i++) + { + struct move *move = &target_data->moves.moves[i]; + if (MoveExists(move) && + move->flags0 & MOVE_FLAG_LAST_USED && + move->pp == 0) + { + last_used_move_out_of_pp = TRUE; + goto end_last_use_move_out_of_pp; + } + } + last_used_move_out_of_pp = FALSE; + + end_last_use_move_out_of_pp: + if (last_used_move_out_of_pp) + return FALSE; + break; + case MOVE_SMOKESCREEN: + if (target_data->sure_shot_class_status.sure_shot == STATUS_SURE_SHOT_WHIFFER) + return FALSE; + break; + case MOVE_MEMENTO: + if (F248LessThanFloat(target_data->stat_modifiers.offensive_multipliers[STAT_STAGE_ATK], STAT_MULTIPLIER_THRESHOLD) && + F248LessThanFloat(target_data->stat_modifiers.offensive_multipliers[STAT_STAGE_SP_ATK], STAT_MULTIPLIER_THRESHOLD)) + return FALSE; + break; + case MOVE_WILL_O_WISP: + if (target_data->burn_class_status.burn == STATUS_BURN) + return FALSE; + break; + case MOVE_FORESIGHT: + case MOVE_ODOR_SLEUTH: + if (target_data->types[0] == TYPE_GHOST || target_data->types[1] == TYPE_GHOST) + { + if (!target_data->exposed) + return TRUE; + } + if (target_data->stat_modifiers.hit_chance_stages[STAT_STAGE_EVASION] <= DEFAULT_STAT_STAGE) + return FALSE; + break; + case MOVE_DISABLE: + case MOVE_GLARE: + case MOVE_STUN_SPORE: + case MOVE_THUNDER_WAVE: + if (target_data->burn_class_status.burn == STATUS_BURN_PARALYSIS) + return FALSE; + break; + case MOVE_ENDEAVOR: + if (target_data->hp - user_data->hp < 1) + return FALSE; + break; + case MOVE_LEER: + case MOVE_TAIL_WHIP: + if (target_data->stat_modifiers.defensive_stages[STAT_STAGE_DEF] < 1) + return FALSE; + break; + case MOVE_METAL_SOUND: + if (target_data->stat_modifiers.defensive_stages[STAT_STAGE_SP_DEF] < 1) + return FALSE; + break; + case MOVE_TICKLE: + if (target_data->stat_modifiers.offensive_stages[STAT_STAGE_ATK] < 1 && + target_data->stat_modifiers.defensive_stages[STAT_STAGE_DEF] < 1) + return FALSE; + break; + case MOVE_BLOCK: + case MOVE_MEAN_LOOK: + case MOVE_SPIDER_WEB: // Remove? + if (target_data->frozen_class_status.freeze == STATUS_FROZEN_SHADOW_HOLD) + return FALSE; + break; + case MOVE_HAZE: + for (i = 0; i < 2; i++) + { + if (target_data->stat_modifiers.offensive_stages[i] < DEFAULT_STAT_STAGE) + break; + if (target_data->stat_modifiers.defensive_stages[i] < DEFAULT_STAT_STAGE) + break; + if (target_data->stat_modifiers.hit_chance_stages[i] < DEFAULT_STAT_STAGE || + F248LessThanInt(target_data->stat_modifiers.offensive_multipliers[i], 1) || + F248LessThanInt(target_data->stat_modifiers.defensive_multipliers[i], 1)) + break; + } + if (i == 2) + return FALSE; + break; + case MOVE_UPROAR: + case MOVE_WORRY_SEED: + if (target_data->sleep_class_status.sleep == STATUS_SLEEPLESS) + return FALSE; + break; + case MOVE_PSYCH_UP: + for (i = 0; i < 2; i++) + { + if (user_data->stat_modifiers.offensive_stages[i] < target_data->stat_modifiers.offensive_stages[i]) + break; + if (user_data->stat_modifiers.defensive_stages[i] < target_data->stat_modifiers.defensive_stages[i] || + user_data->stat_modifiers.hit_chance_stages[i] < target_data->stat_modifiers.hit_chance_stages[i] || + user_data->stat_modifiers.offensive_multipliers[i] < target_data->stat_modifiers.offensive_multipliers[i] || + user_data->stat_modifiers.defensive_multipliers[i] < target_data->stat_modifiers.defensive_multipliers[i]) + break; + } + if (i == 2) + return FALSE; + break; + case MOVE_FLASH: + case MOVE_KINESIS: // Remove? + case MOVE_SAND_ATTACK: + if (target_data->stat_modifiers.hit_chance_stages[STAT_STAGE_ACCURACY] < 1) + return FALSE; + break; + case MOVE_TAUNT: + if (target_data->cringe_class_status.cringe == STATUS_CRINGE_TAUNTED) + return FALSE; + break; + case MOVE_SWITCHEROO: + case MOVE_TRICK: + if (!ItemExists(user_data->held_item.flags)) + return FALSE; + if (!ItemExists(target_data->held_item.flags)) + return FALSE; + break; + case MOVE_KNOCK_OFF: + if (!ItemExists(target_data->held_item.flags)) + return FALSE; + break; + case MOVE_FEATHERDANCE: + case MOVE_GROWL: + if (target_data->stat_modifiers.offensive_stages[STAT_STAGE_ATK] < 1) + return FALSE; + break; + case MOVE_ROLE_PLAY: + if (user_data->abilities[0] == target_data->abilities[0] && + user_data->abilities[1] == target_data->abilities[1]) + return FALSE; + break; + case MOVE_CURSE: + if (MonsterIsType(attacker, TYPE_GHOST)) + { + if (target_data->curse_class_status.curse == STATUS_CURSE_CURSED) + return FALSE; + } + else if (user_data->stat_modifiers.offensive_stages[STAT_STAGE_ATK] > MAX_STAT_STAGE - 1 && + user_data->stat_modifiers.defensive_stages[STAT_STAGE_DEF] > MAX_STAT_STAGE - 1) + return FALSE; + break; + case MOVE_IMPRISON: + case MOVE_OBSERVER: + if (target_data->cringe_class_status.cringe == STATUS_CRINGE_PAUSED) + return FALSE; + break; + case MOVE_FALSE_SWIPE: + if (target_data->hp < 2) + return FALSE; + break; + case MOVE_LEECH_SEED: + if (target_data->leech_seed_class_status.leech_seed == STATUS_LEECH_SEED_LEECH_SEED) + return FALSE; + break; + case MOVE_PERISH_SONG: + if (target_data->perish_song_turns != 0) + return FALSE; + break; + case MOVE_COPYCAT: + case MOVE_MIMIC: + case MOVE_SKETCH: // Remove? + if (!HasLastUsedMove(target_data->moves.moves)) + return FALSE; + break; + case MOVE_ATTRACT: + if (target_data->cringe_class_status.cringe == STATUS_CRINGE_INFATUATED) + return FALSE; + break; + case MOVE_WRAP: + if (target_data->frozen_class_status.freeze == STATUS_FROZEN_WRAP) + return FALSE; + if (target_data->frozen_class_status.freeze == STATUS_FROZEN_WRAPPED) + return FALSE; + break; + case MOVE_TOXIC: + if (target_data->burn_class_status.burn == STATUS_BURN_BADLY_POISONED) + return FALSE; + break; + case MOVE_POISON_GAS: + case MOVE_POISONPOWDER: + if (target_data->burn_class_status.burn == STATUS_BURN_POISONED) + return FALSE; + if (target_data->burn_class_status.burn == STATUS_BURN_BADLY_POISONED) + return FALSE; + break; + case MOVE_CONFUSE_RAY: + case MOVE_FLATTER: + case MOVE_SUPERSONIC: + case MOVE_SWAGGER: + case MOVE_SWEET_KISS: + case MOVE_TEETER_DANCE: + case MOVE_TOTTER: + if (target_data->cringe_class_status.cringe == STATUS_CRINGE_CONFUSED) + return FALSE; + break; + case MOVE_GASTRO_ACID: + if (target_data->curse_class_status.curse == STATUS_CURSE_GASTRO_ACID) + return FALSE; + break; + case MOVE_HEALING_WISH: + if (target_data->curse_class_status.curse == STATUS_CURSE_GASTRO_ACID) + return FALSE; + break; + case MOVE_LUCKY_CHANT: + if (target_data->reflect_class_status.reflect == STATUS_REFLECT_LUCKY_CHANT) + return FALSE; + break; + case MOVE_GUARD_SWAP: + if (user_data->stat_modifiers.defensive_stages[STAT_STAGE_DEF] + user_data->stat_modifiers.defensive_stages[STAT_STAGE_SP_DEF] >= + target_data->stat_modifiers.defensive_stages[STAT_STAGE_DEF] + target_data->stat_modifiers.defensive_stages[STAT_STAGE_SP_DEF]) + return FALSE; + break; + case MOVE_HEAL_BLOCK: + if (target_data->curse_class_status.curse == STATUS_CURSE_HEAL_BLOCK) + return FALSE; + break; + case MOVE_EMBARGO: + if (target_data->curse_class_status.curse == STATUS_CURSE_EMBARGO) + return FALSE; + break; + case MOVE_GRAVITY: + if (GravityIsActive()) + return FALSE; + break; + case MOVE_ACUPRESSURE: + for (i = 0; i < NUM_STATS_PER_CATEGORY; i++) + { + if (target_data->stat_modifiers.offensive_stages[i] < MAX_STAT_STAGE || + target_data->stat_modifiers.defensive_stages[i] < MAX_STAT_STAGE) + break; + } + if (i == NUM_STATS_PER_CATEGORY) + return FALSE; + break; + case MOVE_MAGNET_RISE: + if (target_data->magnet_rise == TRUE) + return FALSE; + break; + case MOVE_HEART_SWAP: + s16 user_offensive_stages = + user_data->stat_modifiers.offensive_stages[STAT_STAGE_ATK] + + user_data->stat_modifiers.offensive_stages[STAT_STAGE_SP_ATK]; + s16 user_defensive_stages = + user_data->stat_modifiers.defensive_stages[STAT_STAGE_DEF] + + user_data->stat_modifiers.defensive_stages[STAT_STAGE_SP_DEF]; + s16 target_offensive_stages = + target_data->stat_modifiers.offensive_stages[STAT_STAGE_ATK] + + target_data->stat_modifiers.offensive_stages[STAT_STAGE_SP_ATK]; + s16 target_defensive_stages = + target_data->stat_modifiers.defensive_stages[STAT_STAGE_DEF] + + target_data->stat_modifiers.defensive_stages[STAT_STAGE_SP_DEF]; + if (user_offensive_stages + user_defensive_stages >= target_offensive_stages + target_defensive_stages) + return FALSE; + break; + case MOVE_POWER_SWAP: + if (user_data->stat_modifiers.offensive_stages[STAT_STAGE_ATK] + user_data->stat_modifiers.offensive_stages[STAT_STAGE_SP_ATK] >= + target_data->stat_modifiers.offensive_stages[STAT_STAGE_ATK] + target_data->stat_modifiers.offensive_stages[STAT_STAGE_SP_ATK]) + return FALSE; + break; + case MOVE_POWER_TRICK: + if (user_data->stat_modifiers.offensive_stages[STAT_STAGE_ATK] >= user_data->stat_modifiers.defensive_stages[STAT_STAGE_DEF]) + return FALSE; + break; + case MOVE_MIRACLE_EYE: + if (target_data->types[0] == TYPE_DARK || target_data->types[1] == TYPE_DARK) + { + if (target_data->miracle_eye == TRUE && target_data->stat_modifiers.hit_chance_stages[STAT_STAGE_EVASION] <= DEFAULT_STAT_STAGE) + return FALSE; + } + else if (target_data->stat_modifiers.hit_chance_stages[STAT_STAGE_EVASION] <= DEFAULT_STAT_STAGE) + return FALSE; + break; + case MOVE_METAL_BURST: + if (target_data->reflect_class_status.reflect == STATUS_REFLECT_METAL_BURST) + return FALSE; + break; + case MOVE_CAPTIVATE: + if (target_data->stat_modifiers.offensive_stages[STAT_STAGE_SP_ATK] == 0) + return FALSE; + if (GendersEqualNotGenderless(user_data->id, target_data->id)) + return FALSE; + break; + } + return TRUE; +} +#else +asm bool8 StatusCheckerCheckOnTarget(struct entity *attacker, struct entity *target, struct move *move) +{ +#ifdef JAPAN +#define OV29_02333FD0_OFFSET -4 +#else +#define OV29_02333FD0_OFFSET 0 +#endif + stmdb sp!, {r4, r5, r6, r7, r8, lr} + mov r6, r1 + ldr r5, [r6, #0xb4] + mov r7, r0 + ldrb r0, [r5, #0xc4] + mov r8, r2 + ldr r4, [r7, #0xb4] + cmp r0, #1 + bne _02334008 + mov r0, r8 + bl IsThawingMove + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} +_02334008: + ldrh r1, [r8, #4] + ldr r0, =0x0000010A + cmp r1, r0 + bgt _0233429C + bge _023349A4 + cmp r1, #0x8a + bgt _023341C8 + bge _023349F4 + cmp r1, #0x56 + bgt _02334164 + bge _023347B0 + cmp r1, #0x4f + bgt _02334140 + bge _023344D0 + cmp r1, #0x3b + bgt _02334134 + bge _0233473C + cmp r1, #0x36 + addls pc, pc, r1, lsl #2 + b _02334C9C +_02334058: + b _02334C9C + b _02334C9C + b _02334C9C + b _023344E8 + b _023344D0 + b _02334510 + b _02334C9C + b _02334C9C + b _02334C9C + b _02334C9C + b _02334524 + b _02334538 + b _02334C9C + b _02334A74 + b _02334C9C + b _02334C9C + b _02334C9C + b _0233454C + b _02334C9C + b _02334C9C + b _02334574 + b _02334588 + b _023345A0 + b _02334618 + b _02334A74 + b _02334C9C + b _02334C9C + b _02334630 + b _02334C9C + b _02334C9C + b _02334C9C + b _02334C9C + b _02334C9C + b _02334644 + b _023344D0 + b _02334658 + b _02334C9C + b _023346C0 + b _02334C9C + b _02334C9C + b _02334C9C + b _02334C9C + b _02334C9C + b _023346D4 + b _02334C9C + b _02334A74 + b _02334C9C + b _023346F0 + b _02334C9C + b _02334C9C + b _02334C9C + b _02334C9C + b _02334C9C + b _02334C9C + b _02334704 +_02334134: + cmp r1, #0x42 + beq _02334750 + b _02334C9C +_02334140: + cmp r1, #0x54 + bgt _02334158 + bge _023344D0 + cmp r1, #0x53 + beq _02334780 + b _02334C9C +_02334158: + cmp r1, #0x55 + beq _02334794 + b _02334C9C +_02334164: + cmp r1, #0x6f + bgt _02334194 + bge _023344D0 + cmp r1, #0x59 + bgt _02334188 + bge _023347B0 + cmp r1, #0x58 + beq _023347C4 + b _02334C9C +_02334188: + cmp r1, #0x6a + beq _02334618 + b _02334C9C +_02334194: + cmp r1, #0x73 + bgt _023341AC + bge _02334830 + cmp r1, #0x70 + beq _0233481C + b _02334C9C +_023341AC: + cmp r1, #0x7a + bgt _023341BC + beq _0233476C + b _02334C9C +_023341BC: + cmp r1, #0x7c + beq _0233473C + b _02334C9C +_023341C8: + cmp r1, #0xc5 + bgt _02334238 + bge _02334A40 + cmp r1, #0xac + bgt _02334204 + bge _023348B8 + cmp r1, #0x92 + bgt _023341F8 + bge _023348A4 + cmp r1, #0x8e + beq _023348A4 + b _02334C9C +_023341F8: + cmp r1, #0xab + beq _02334A74 + b _02334C9C +_02334204: + cmp r1, #0xc0 + bgt _0233421C + bge _0233473C + cmp r1, #0xbf + beq _02334A74 + b _02334C9C +_0233421C: + cmp r1, #0xc2 + bgt _0233422C + beq _023347B0 + b _02334C9C +_0233422C: + cmp r1, #0xc4 + beq _02334A54 + b _02334C9C +_02334238: + cmp r1, #0xdc + bgt _02334268 + bge _0233493C + cmp r1, #0xd1 + bgt _0233425C + bge _023348CC + cmp r1, #0xc7 + beq _02334A54 + b _02334C9C +_0233425C: + cmp r1, #0xd9 + beq _02334928 + b _02334C9C +_02334268: + cmp r1, #0xe7 + bgt _02334280 + bge _023344D0 + cmp r1, #0xe0 + beq _0233476C + b _02334C9C +_02334280: + cmp r1, #0xed + bgt _02334290 + beq _02334960 + b _02334C9C +_02334290: + cmp r1, #0xf9 + beq _02334908 + b _02334C9C +_0233429C: + add r2, r0, #0xb5 + cmp r1, r2 + bgt _023343B8 + bge _02334AB0 + add r2, r0, #0x31 + cmp r1, r2 + bgt _0233432C + bge _02334704 + add r2, r0, #0xf + cmp r1, r2 + bgt _023342FC + bge _0233473C + add r2, r0, #7 + cmp r1, r2 + bgt _023342EC + bge _023348A4 + add r0, r0, #1 + cmp r1, r0 + beq _02334928 + b _02334C9C +_023342EC: + add r0, r0, #8 + cmp r1, r0 + beq _02334A74 + b _02334C9C +_023342FC: + add r2, r0, #0x1c + cmp r1, r2 + bgt _0233431C + bge _02334A20 + add r0, r0, #0x1b + cmp r1, r0 + beq _023349E0 + b _02334C9C +_0233431C: + add r0, r0, #0x30 + cmp r1, r0 + beq _023349B8 + b _02334C9C +_0233432C: + add r2, r0, #0x55 + cmp r1, r2 + bgt _0233436C + bge _02334618 + add r2, r0, #0x3d + cmp r1, r2 + bgt _0233435C + bge _023349F4 + add r0, r0, #0x3c + cmp r1, r0 + beq _02334A0C + b _02334C9C +_0233435C: + add r0, r0, #0x3f + cmp r1, r0 + beq _023349CC + b _02334C9C +_0233436C: + add r2, r0, #0x74 + cmp r1, r2 + bgt _0233438C + bge _02334A74 + add r0, r0, #0x71 + cmp r1, r0 + beq _023349A4 + b _02334C9C +_0233438C: + add r2, r0, #0xac + cmp r1, r2 + bgt _023343A8 + add r0, r0, #0xac + cmp r1, r0 + beq _02334A88 + b _02334C9C +_023343A8: + add r0, r0, #0xad + cmp r1, r0 + beq _02334A9C + b _02334C9C +_023343B8: + add r2, r0, #0xe3 + cmp r1, r2 + bgt _02334450 + bge _02334B64 + add r2, r0, #0xc8 + cmp r1, r2 + bgt _02334408 + bge _02334B00 + add r2, r0, #0xb8 + cmp r1, r2 + bgt _023343FC + add r0, r0, #0xb8 + cmp r1, r0 + bge _02334AEC + cmp r1, #0x1c0 + beq _02334AC4 + b _02334C9C +_023343FC: + cmp r1, #0x1c8 + beq _02334524 + b _02334C9C +_02334408: + add r2, r0, #0xd8 + cmp r1, r2 + bgt _02334428 + bge _023348CC + add r0, r0, #0xd4 + cmp r1, r0 + beq _02334B14 + b _02334C9C +_02334428: + add r2, r0, #0xd9 + cmp r1, r2 + bgt _02334444 + add r0, r0, #0xd9 + cmp r1, r0 + beq _023344D0 + b _02334C9C +_02334444: + cmp r1, #0x1ec + beq _02334B28 + b _02334C9C +_02334450: + add r2, r0, #0xf8 + cmp r1, r2 + bgt _02334494 + bge _02334C00 + add r2, r0, #0xf0 + cmp r1, r2 + bgt _02334484 + add r0, r0, #0xf0 + cmp r1, r0 + bge _02334B78 + cmp r1, #0x1f8 + beq _0233481C + b _02334C9C +_02334484: + add r0, r0, #0xf7 + cmp r1, r0 + beq _02334BD8 + b _02334C9C +_02334494: + cmp r1, #0x210 + bgt _023344B0 + bge _02334C18 + ldr r0, =0x0000020D + cmp r1, r0 + beq _023349F4 + b _02334C9C +_023344B0: + cmp r1, #0x214 + bgt _023344C0 + beq _02334C60 + b _02334C9C +_023344C0: + add r0, r0, #0x10c + cmp r1, r0 + beq _02334C74 + b _02334C9C +_023344D0: + mov r0, r6 + bl IsMonsterSleeping + cmp r0, #0 + beq _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023344E8: + ldrb r0, [r5, #0xbd] + cmp r0, #4 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + mov r0, r6 + bl IsMonsterSleeping + cmp r0, #0 + beq _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334510: + ldrb r0, [r5, #0xbd] + cmp r0, #3 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334524: + ldrsh r0, [r5, #0x2e] + cmp r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334538: + ldr r0, [r5, #0x34] + cmp r0, #0x3f + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0233454C: + ldrb r0, [r5, #0xd0] + cmp r0, #6 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + add r0, r5, #0x124 + OV29_02333FD0_OFFSET + bl HasLastUsedMove + cmp r0, #0 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334574: + ldrsh r0, [r5, #0x10] + cmp r0, #2 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334588: + ldrsh r1, [r5, #0x10] + ldrsh r0, [r4, #0x10] + cmp r1, r0 + bgt _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023345A0: + mov r3, #0 + mov r0, r3 + mov r1, #1 + b _023345DC +_023345B0: + add r2, r5, r3, lsl #3 + ldrb r2, [r2, #0x124 + OV29_02333FD0_OFFSET] + tst r2, #1 + movne r4, r1 + moveq r4, r0 + tst r4, #0xff + beq _023345D8 + tst r2, #0x20 + movne r0, #1 + bne _023345F4 +_023345D8: + add r3, r3, #1 +_023345DC: + cmp r3, #4 + blt _023345B0 + ldrb r0, [r5, #0x144 + OV29_02333FD0_OFFSET] + tst r0, #0x20 + movne r0, #1 + moveq r0, #0 +_023345F4: + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} + add r0, r5, #0x124 + OV29_02333FD0_OFFSET + bl HasLastUsedMove + cmp r0, #0 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334618: + ldr r0, [r6, #0xb4] + ldr r0, [r0, #0x110 + OV29_02333FD0_OFFSET] + cmp r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334630: + ldr r0, [r5, #0x3c] + cmp r0, #0x3f + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334644: + ldrsh r0, [r5, #0x2a] + cmp r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334658: + mov r4, #0 + add r3, r5, #0x124 + OV29_02333FD0_OFFSET + mov r1, r4 + mov r2, #1 + b _023346A4 +_0233466C: + ldrb r5, [r3, r4, lsl #3] + add r0, r3, r4, lsl #3 + tst r5, #1 + movne r6, r2 + moveq r6, r1 + tst r6, #0xff + beq _023346A0 + tst r5, #0x10 + beq _023346A0 + ldrb r0, [r0, #6] + cmp r0, #0 + moveq r0, #1 + beq _023346B0 +_023346A0: + add r4, r4, #1 +_023346A4: + cmp r4, #4 + blt _0233466C + mov r0, #0 +_023346B0: + cmp r0, #0 + beq _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023346C0: + ldrb r0, [r5, #0xec] + cmp r0, #2 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023346D4: + ldr r0, [r5, #0x34] + cmp r0, #0x3f + ldrlt r0, [r5, #0x38] + cmplt r0, #0x3f + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023346F0: + ldrb r0, [r5, #0xbf] + cmp r0, #1 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334704: + ldrb r0, [r5, #0x5e] + cmp r0, #0xe + ldrneb r0, [r5, #0x5f] + cmpne r0, #0xe + bne _02334728 + ldrb r0, [r5, #0xfe] + cmp r0, #0 + moveq r0, #1 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} +_02334728: + ldrsh r0, [r5, #0x2e] + cmp r0, #0xa + bgt _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0233473C: + ldrb r0, [r5, #0xbf] + cmp r0, #4 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334750: + ldrsh r1, [r5, #0x10] + ldrsh r0, [r4, #0x10] + sub r0, r1, r0 + cmp r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0233476C: + ldrsh r0, [r5, #0x28] + cmp r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334780: + ldrsh r0, [r5, #0x2a] + cmp r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334794: + ldrsh r0, [r5, #0x24] + cmp r0, #1 + ldrltsh r0, [r5, #0x28] + cmplt r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023347B0: + ldrb r0, [r5, #0xc4] + cmp r0, #2 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023347C4: + mov r2, #0 + b _02334804 +_023347CC: + add r1, r5, r2, lsl #1 + ldrsh r0, [r1, #0x24] + cmp r0, #0xa + ldrgesh r0, [r1, #0x28] + cmpge r0, #0xa + ldrgesh r0, [r1, #0x2c] + cmpge r0, #0xa + addge r1, r5, r2, lsl #2 + ldrge r0, [r1, #0x34] + cmpge r0, #0x100 + ldrge r0, [r1, #0x3c] + cmpge r0, #0x100 + blt _0233480C + add r2, r2, #1 +_02334804: + cmp r2, #2 + blt _023347CC +_0233480C: + cmp r2, #2 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0233481C: + ldrb r0, [r5, #0xbd] + cmp r0, #2 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334830: + mov r0, #0 + b _0233488C +_02334838: + add r6, r4, r0, lsl #1 + add r3, r5, r0, lsl #1 + ldrsh r2, [r6, #0x24] + ldrsh r1, [r3, #0x24] + cmp r2, r1 + ldrgesh r2, [r6, #0x28] + ldrgesh r1, [r3, #0x28] + cmpge r2, r1 + ldrgesh r2, [r6, #0x2c] + ldrgesh r1, [r3, #0x2c] + cmpge r2, r1 + addge r6, r4, r0, lsl #2 + addge r3, r5, r0, lsl #2 + ldrge r2, [r6, #0x34] + ldrge r1, [r3, #0x34] + cmpge r2, r1 + ldrge r2, [r6, #0x3c] + ldrge r1, [r3, #0x3c] + cmpge r2, r1 + blt _02334894 + add r0, r0, #1 +_0233488C: + cmp r0, #2 + blt _02334838 +_02334894: + cmp r0, #2 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023348A4: + ldrsh r0, [r5, #0x2c] + cmp r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023348B8: + ldrb r0, [r5, #0xd0] + cmp r0, #5 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023348CC: + ldrb r0, [r4, #0x62] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldrb r0, [r5, #0x62] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334908: + ldrb r0, [r5, #0x62] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334928: + ldrsh r0, [r5, #0x24] + cmp r0, #1 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_0233493C: + ldrb r1, [r4, #0x60] + ldrb r0, [r5, #0x60] + cmp r1, r0 + ldreqb r1, [r4, #0x61] + ldreqb r0, [r5, #0x61] + cmpeq r1, r0 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334960: + mov r0, r7 + mov r1, #0xe + bl MonsterIsType + cmp r0, #0 + beq _02334988 + ldrb r0, [r5, #0xd8] + cmp r0, #1 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334988: + ldrsh r0, [r4, #0x24] + cmp r0, #0x13 + ldrgtsh r0, [r4, #0x28] + cmpgt r0, #0x13 + ble _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023349A4: + ldrb r0, [r5, #0xd0] + cmp r0, #3 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023349B8: + ldrsh r0, [r5, #0x10] + cmp r0, #2 + bge _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023349CC: + ldrb r0, [r5, #0xe0] + cmp r0, #1 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023349E0: +#ifdef JAPAN + ldrb r0, [r5, #0x105] +#else + ldrb r0, [r5, #0x106] +#endif + cmp r0, #0 + beq _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_023349F4: + add r0, r5, #0x124 + OV29_02333FD0_OFFSET + bl HasLastUsedMove + cmp r0, #0 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334A0C: + ldrb r0, [r5, #0xd0] + cmp r0, #7 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334A20: + ldrb r0, [r5, #0xc4] + cmp r0, #3 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + cmp r0, #4 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334A40: + ldrb r0, [r5, #0xbf] + cmp r0, #3 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334A54: + ldrb r0, [r5, #0xbf] + cmp r0, #2 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + cmp r0, #3 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334A74: + ldrb r0, [r5, #0xd0] + cmp r0, #2 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334A88: + ldrb r0, [r5, #0xd8] + cmp r0, #4 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334A9C: + ldrb r0, [r5, #0xd8] + cmp r0, #4 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334AB0: + ldrb r0, [r5, #0xd5] + cmp r0, #0x11 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334AC4: + ldrsh r3, [r4, #0x28] + ldrsh r2, [r4, #0x2a] + ldrsh r1, [r5, #0x28] + ldrsh r0, [r5, #0x2a] + add r2, r3, r2 + add r0, r1, r0 + cmp r2, r0 + blt _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334AEC: + ldrb r0, [r5, #0xd8] + cmp r0, #5 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334B00: + ldrb r0, [r5, #0xd8] + cmp r0, #6 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334B14: + bl GravityIsActive + cmp r0, #0 + beq _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334B28: + mov r2, #0 + b _02334B4C +_02334B30: + add r1, r5, r2, lsl #1 + ldrsh r0, [r1, #0x24] + cmp r0, #0x14 + ldrgesh r0, [r1, #0x28] + cmpge r0, #0x14 + blt _02334B54 + add r2, r2, #1 +_02334B4C: + cmp r2, #2 + blt _02334B30 +_02334B54: + cmp r2, #2 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334B64: + ldrb r0, [r5, #0xf7] + cmp r0, #1 + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334B78: + ldrsh r3, [r4, #0x28] + ldrsh r1, [r4, #0x2a] + ldrsh r2, [r5, #0x28] + ldrsh r0, [r5, #0x2a] + add r1, r3, r1 + mov r1, r1, lsl #0x10 + add r0, r2, r0 + mov r2, r0, lsl #0x10 + ldrsh r6, [r4, #0x24] + ldrsh r0, [r4, #0x26] + ldrsh r4, [r5, #0x24] + ldrsh r3, [r5, #0x26] + add r0, r6, r0 + mov r0, r0, lsl #0x10 + add r3, r4, r3 + mov r4, r1, asr #0x10 + mov r1, r3, lsl #0x10 + mov r2, r2, asr #0x10 + add r3, r4, r0, asr #16 + add r0, r2, r1, asr #16 + cmp r3, r0 + blt _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334BD8: + ldrsh r3, [r4, #0x24] + ldrsh r2, [r4, #0x26] + ldrsh r1, [r5, #0x24] + ldrsh r0, [r5, #0x26] + add r2, r3, r2 + add r0, r1, r0 + cmp r2, r0 + blt _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334C00: + ldrsh r1, [r4, #0x24] + ldrsh r0, [r4, #0x28] + cmp r1, r0 + blt _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334C18: + ldrb r0, [r5, #0x5e] + cmp r0, #0x10 + ldrneb r0, [r5, #0x5f] + cmpne r0, #0x10 + bne _02334C4C + ldrb r0, [r5, #0xf5] + cmp r0, #1 + bne _02334C9C + ldrsh r0, [r5, #0x2e] + cmp r0, #0xa + bgt _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334C4C: + ldrsh r0, [r5, #0x2e] + cmp r0, #0xa + bgt _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334C60: + ldrb r0, [r5, #0xd5] + cmp r0, #0xf + bne _02334C9C + mov r0, #0 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +_02334C74: + ldrsh r0, [r5, #0x26] + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r4, r5, r6, r7, r8, pc} + ldrsh r0, [r4, #2] + ldrsh r1, [r5, #2] + bl GendersEqualNotGenderless + cmp r0, #0 + movne r0, #0 + ldmneia sp!, {r4, r5, r6, r7, r8, pc} +_02334C9C: + mov r0, #1 + ldmia sp!, {r4, r5, r6, r7, r8, pc} +} +#endif diff --git a/tools/extract_function/extract_function.py b/tools/extract_function/extract_function.py index c0f55a31..ec28b513 100644 --- a/tools/extract_function/extract_function.py +++ b/tools/extract_function/extract_function.py @@ -175,29 +175,32 @@ function_body = f"""{function_header} if nonmatching: asm_lines = original_lines[function_start_line + 2 : function_end_line - 1] - for i, line in enumerate(asm_lines): + modified_asm_lines = [] + for line in asm_lines: + # .align is not needed in embedded ASM + if '.align' in line: + continue + # Replace some register mnemonics with numbered registers. These don't work when ASM is embedded in C. if not line.startswith('bl') and line.startswith('\t'): space_index = line.find(' ') line = line[:space_index] + line[space_index:].replace('sb', 'r9').replace('sl', 'r10').replace('fp', 'r11') + # Replacing "sl" can corrupt lsl instructions, so correct these. + line = line.replace('lr10', 'lsl') semicolon_index = line.find(';') if semicolon_index >= 0: if 'jump table' in line or 'case' in line: # Jump tables have comments, but semicolons are not recognized as comment markers in embedded ASM, so remove them. - line = line[:semicolon_index - 1] + line = line[:semicolon_index - 1] + '\n' else: # Replace word values at the end of the function. # They are conveniently already included within the ASM as comments. line = line[:line.find('_')] + line[semicolon_index + 2:] - asm_lines[i] = line + modified_asm_lines.append(line) - # .align is not needed in embedded ASM - if '.align' in asm_lines[-1]: - asm_lines = asm_lines[:-1] - - asm_string = str.join('', asm_lines) + asm_string = str.join('', modified_asm_lines) function_body = f"""#ifdef NONMATCHING {function_body}