diff --git a/asm/itcm.s b/asm/itcm.s index ba07977f..8d26d3ec 100644 --- a/asm/itcm.s +++ b/asm/itcm.s @@ -4137,502 +4137,3 @@ sub_01FFB62C: ; 0x01FFB62C .global _01FFB654 _01FFB654: .byte 0x05, 0x03, 0x00, 0x00 - -; https://decomp.me/scratch/zg7V6 -#ifndef NONMATCHING - arm_func_start ChooseAiMove -ChooseAiMove: ; 0x01FFB658 -#ifdef JAPAN -#define CHOOSE_AI_MOVE_OFFSET -4 -#else -#define CHOOSE_AI_MOVE_OFFSET 0 -#endif - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x44 - ldr r1, _01FFBD14 ; =DUNGEON_PTR - mov sl, r0 - ldr r0, [r1] - ldr r7, [sl, #0xb4] - add r0, r0, #0x4000 -#ifdef JAPAN - ldrb r0, [r0, #0x36] -#else - ldrb r0, [r0, #0xda] -#endif - bl AreMovesEnabled - cmp r0, #0 - beq _01FFBD0C - mov r0, sl - mov r1, #0 - bl MonsterCannotAttack - cmp r0, #0 - bne _01FFBD0C - mov r0, sl - mov r1, #1 - bl ShouldMonsterRunAwayAndShowEffect - cmp r0, #0 - bne _01FFBD0C - ldr r0, [sl, #0xb4] - ldrb r0, [r0, #0xbc] - cmp r0, #3 - bne _01FFB6CC - mov r0, sl - bl IsMonsterCornered - cmp r0, #0 - bne _01FFBD0C -_01FFB6CC: - mov r0, sl - mov r1, #8 - bl IsTacticSet - cmp r0, #0 - bne _01FFBD0C - ldrb r0, [r7, #0xd0] - cmp r0, #2 - bne _01FFB700 - ldr r0, _01FFBD18 ; =AI_CONFUSED_NO_ATTACK_CHANCE - ldrsh r0, [r0] - bl DungeonRandOutcome__022EAB20 - cmp r0, #0 - bne _01FFBD0C -_01FFB700: - ldrb r0, [r7, #0xd2] - cmp r0, #0 - beq _01FFB7A8 - mov r8, #0 - add r6, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET - mov r4, r8 - mov r5, #1 - b _01FFB7A0 -_01FFB720: - ldrb r0, [r6, r8, lsl #3] - mov r1, r8, lsl #3 - tst r0, #1 - movne r0, r5 - moveq r0, r4 - tst r0, #0xff - beq _01FFB79C - mov r0, sl - add r1, r6, r1 - bl IsChargingTwoTurnMove - cmp r0, #0 - beq _01FFB79C - ldrb r0, [r7, #0xd4] - cmp r0, r8 - bne _01FFB79C - b _01FFB774 -_01FFB760: - add r0, r7, r8, lsl #3 - ldrb r0, [r0, #0x124 + CHOOSE_AI_MOVE_OFFSET] - tst r0, #2 - beq _01FFB77C - sub r8, r8, #1 -_01FFB774: - cmp r8, #0 - bgt _01FFB760 -_01FFB77C: - ldrb r2, [r7, #0x4c] - mov r1, r8, lsl #0x10 - add r0, r7, #0x4a - mov r1, r1, asr #0x10 - bl SetActionUseMoveAi - mov r0, sl - bl UpdateAiTargetPos - b _01FFBD0C -_01FFB79C: - add r8, r8, #1 -_01FFB7A0: - cmp r8, #4 - blt _01FFB720 -_01FFB7A8: - mov r5, #0 - str r5, [sp] - mov r0, r5 - add r4, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET - mov r2, r5 - mov r3, #1 -_01FFB7C0: - ldrb r1, [r4, r0, lsl #3] - add r6, r4, r0, lsl #3 - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - beq _01FFB7F8 - ldrb r1, [r6] - tst r1, #4 - ldrne r1, [sp] - addne r1, r1, #1 - strne r1, [sp] - ldrb r1, [r6, #6] - add r5, r5, r1 -_01FFB7F8: - add r0, r0, #1 - cmp r0, #4 - blt _01FFB7C0 - cmp r5, #0 - bne _01FFB84C - add r0, sp, #0x14 - mov r1, #0x160 - bl InitMove - add r0, sp, #0x1c - add r2, sp, #0x14 - mov r1, sl - bl AiConsiderMove - ldrb r0, [sp, #0x1c] - cmp r0, #0 - beq _01FFBD0C - ldrb r1, [sp, #0x1d] - add r0, r7, #0x4a - bl SetActionStruggle - mov r0, sl - bl UpdateAiTargetPos - b _01FFBD0C -_01FFB84C: - mov r0, sl - mov r1, #0xb - bl IqSkillIsEnabled - mov r5, r0 - mov r0, sl - mov r1, #0x17 - bl IqSkillIsEnabled - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - mov r8, #0 - and r0, r0, #0xff - str r0, [sp, #4] - mov r2, r8 - mov r1, #1 - add r0, sp, #0xc -_01FFB88C: - strb r1, [r0, r2] - add r2, r2, #1 - cmp r2, #4 - blt _01FFB88C - ldr r0, [sp, #4] - cmp r0, #0 - beq _01FFB96C - mov r2, #0 - mov r3, r2 - mov r4, #0x63 - add r0, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET - mov sb, r2 - add r6, sp, #0xc - mov lr, #1 - b _01FFB938 -_01FFB8C8: - ldrb ip, [r0, r3, lsl #3] - add r1, r0, r3, lsl #3 - tst ip, #1 - movne ip, lr - moveq ip, #0 - tst ip, #0xff - beq _01FFB940 - cmp r3, #0 - beq _01FFB928 - ldrb ip, [r1] - tst ip, #2 - bne _01FFB928 - add ip, r2, #1 - cmp ip, r3 - cmplt r4, #2 - bge _01FFB91C - b _01FFB914 -_01FFB90C: - strb sb, [r6, r2] - add r2, r2, #1 -_01FFB914: - cmp r2, r3 - blt _01FFB90C -_01FFB91C: - ldrb r4, [r1, #6] - mov r2, r3 - b _01FFB934 -_01FFB928: - ldrb r1, [r1, #6] - cmp r4, r1 - movge r4, r1 -_01FFB934: - add r3, r3, #1 -_01FFB938: - cmp r3, #4 - blt _01FFB8C8 -_01FFB940: - add r0, r2, #1 - cmp r0, r3 - cmplt r4, #2 - bge _01FFB96C - mov r1, #0 - add r0, sp, #0xc - b _01FFB964 -_01FFB95C: - strb r1, [r0, r2] - add r2, r2, #1 -_01FFB964: - cmp r2, r3 - blt _01FFB95C -_01FFB96C: - add r0, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET - mov sb, #0 - str r0, [sp, #8] - add r4, sp, #0x1c -_01FFB97C: - mov r0, #0 - strb r0, [r4, sb, lsl #3] - ldr r0, [sp, #8] - add r6, r0, sb, lsl #3 - ldrb r0, [r0, sb, lsl #3] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - addne r0, sp, #0xc - ldrneb r0, [r0, sb] - cmpne r0, #0 - beq _01FFBA7C - ldr r2, [sp, #4] - mov r0, sl - mov r1, sb - bl CanAiUseMove - cmp r0, #0 - beq _01FFBA7C - ldrb r0, [r6] - tst r0, #4 - beq _01FFBA7C - mov r0, #1 - strb r0, [r4, sb, lsl #3] - ldrb r0, [r7, #0xd2] - mov r2, sb, lsl #3 - cmp r0, #0xb - bne _01FFBA38 - ldrh r0, [r6, #4] - cmp r0, #0x80 - addeq r1, r4, r2 - moveq r0, #0 - streq r0, [r1, #4] - beq _01FFBA7C - mov r0, sl - mov r1, r6 - bl GetMoveTypeForMonster - cmp r0, #5 - addne r1, r4, sb, lsl #3 - movne r0, #1 - strne r0, [r1, #4] - bne _01FFBA70 - mov r0, r6 - bl GetMoveAiWeight - add r1, r4, sb, lsl #3 - str r0, [r1, #4] - b _01FFBA70 -_01FFBA38: - cmp r5, #0 - beq _01FFBA60 - ldr r1, [sp, #8] - add r0, r4, r2 - add r2, r1, r2 - mov r1, sl - bl AiConsiderMove - add r1, r4, sb, lsl #3 - str r0, [r1, #4] - b _01FFBA70 -_01FFBA60: - mov r0, r6 - bl GetMoveAiWeight - add r1, r4, sb, lsl #3 - str r0, [r1, #4] -_01FFBA70: - add r0, r4, sb, lsl #3 - ldr r0, [r0, #4] - add r8, r8, r0 -_01FFBA7C: - add sb, sb, #1 - cmp sb, #4 - blt _01FFB97C - mov r2, #0 - mov r0, sl - mov r1, #0x17 - str r2, [sp, #0x40] - bl IqSkillIsEnabled - cmp r0, #0 - bne _01FFBAF0 - ldrb r0, [r7, #0xd2] - cmp r0, #0xb - beq _01FFBAF0 - mov r1, #1 - strb r1, [sp, #0x3c] - ldrb r0, [r7, #0xd2] - cmp r0, #0xb - streq r1, [sp, #0x40] - beq _01FFBAE8 - cmp r5, #0 - movne r0, #2 - strne r0, [sp, #0x40] - ldreq r0, [sp] - ldreq r1, _01FFBD1C ; =AI_REGULAR_ATTACK_WEIGHTS - moveq r0, r0, lsl #1 - ldreqsh r0, [r1, r0] - streq r0, [sp, #0x40] -_01FFBAE8: - ldr r0, [sp, #0x40] - add r8, r8, r0 -_01FFBAF0: - cmp r5, #0 - beq _01FFBB80 - mov r0, #0 - mov r8, r0 - mov r5, r0 - mov r2, r0 - add r3, sp, #0x1c -_01FFBB0C: - ldrb r1, [r3, r5, lsl #3] - mov r4, r5, lsl #3 - cmp r1, #0 - add r1, r3, r4 - streq r2, [r1, #4] - beq _01FFBB30 - ldr r1, [r1, #4] - cmp r0, r1 - movlt r0, r1 -_01FFBB30: - add r5, r5, #1 - cmp r5, #5 - blt _01FFBB0C - mov r1, #0 - mov r3, r1 - add r5, sp, #0x1c -_01FFBB48: - ldrb r2, [r5, r1, lsl #3] - mov r4, r1, lsl #3 - cmp r2, #0 - beq _01FFBB74 - add r4, r5, r4 - ldr r2, [r4, #4] - cmp r0, r2 - strne r3, [r4, #4] - add r2, r5, r1, lsl #3 - ldr r2, [r2, #4] - add r8, r8, r2 -_01FFBB74: - add r1, r1, #1 - cmp r1, #5 - blt _01FFBB48 -_01FFBB80: - cmp r8, #0 - beq _01FFBD0C - mov r0, r8 - bl DungeonRandInt - mov r5, r0 - mov r4, #0 - mov r0, sl - mov r1, #0x4e - mov r6, r4 - bl AbilityIsActiveVeneer - cmp r0, #0 - beq _01FFBBD8 - mov r0, sl - bl ov29_02338350 - cmp r0, #0 - bne _01FFBBD8 - mov r6, #1 - add r1, sp, #0x10 - mov r0, sl - mov r2, r6 - bl TargetRegularAttack - mov fp, r0 -_01FFBBD8: - cmp r6, #0 - bne _01FFBC10 - mov r0, sl - mov r1, #0x17 - bl IqSkillIsEnabled - cmp r0, #0 - movne fp, #0 - strne fp, [sp, #0x10] - bne _01FFBC10 - add r1, sp, #0x10 - mov r0, sl - mov r2, #1 - bl TargetRegularAttack - mov fp, r0 -_01FFBC10: - mov r8, #0 - add r3, sp, #0x1c - b _01FFBCE4 -_01FFBC1C: - ldrb r0, [r3, r8, lsl #3] - mov r2, r8, lsl #3 - cmp r0, #0 - addne r0, r3, r2 - ldrne r1, [r0, #4] - cmpne r1, #0 - beq _01FFBCE0 - add r4, r4, r1 - cmp r4, r5 - blt _01FFBCE0 - cmp r6, #0 - bne _01FFBC54 - cmp r8, #4 - bne _01FFBC78 -_01FFBC54: - cmp fp, #0 - beq _01FFBCEC - ldr r1, [sp, #0x10] - add r0, r7, #0x4a - and r1, r1, #0xff - bl SetActionRegularAttack - mov r0, sl - bl UpdateAiTargetPos - b _01FFBD0C -_01FFBC78: - add r3, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET - mov r1, sl - add r2, r3, r2 - bl AiConsiderMove - add r0, sp, #0x1c - ldrb r0, [r0, r8, lsl #3] - cmp r0, #0 - beq _01FFBCEC - mov r1, r8 - b _01FFBCB4 -_01FFBCA0: - add r0, r7, r1, lsl #3 - ldrb r0, [r0, #0x124 + CHOOSE_AI_MOVE_OFFSET] - tst r0, #2 - beq _01FFBCBC - sub r1, r1, #1 -_01FFBCB4: - cmp r1, #0 - bgt _01FFBCA0 -_01FFBCBC: - add r0, sp, #0x1d - ldrb r2, [r0, r8, lsl #3] - mov r1, r1, lsl #0x10 - add r0, r7, #0x4a - mov r1, r1, asr #0x10 - bl SetActionUseMoveAi - mov r0, sl - bl UpdateAiTargetPos - b _01FFBD0C -_01FFBCE0: - add r8, r8, #1 -_01FFBCE4: - cmp r8, #5 - blt _01FFBC1C -_01FFBCEC: - cmp fp, #0 - beq _01FFBD0C - ldr r1, [sp, #0x10] - add r0, r7, #0x4a - and r1, r1, #0xff - bl SetActionRegularAttack - mov r0, sl - bl UpdateAiTargetPos -_01FFBD0C: - add sp, sp, #0x44 - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_01FFBD14: .word DUNGEON_PTR -_01FFBD18: .word AI_CONFUSED_NO_ATTACK_CHANCE -_01FFBD1C: .word AI_REGULAR_ATTACK_WEIGHTS - arm_func_end ChooseAiMove -#endif diff --git a/include/dungeon_ai_parameters.h b/include/dungeon_ai_parameters.h new file mode 100644 index 00000000..84a27d5e --- /dev/null +++ b/include/dungeon_ai_parameters.h @@ -0,0 +1,6 @@ +#ifndef PMDSKY_DUNGEON_AI_PARAMETERS_H +#define PMDSKY_DUNGEON_AI_PARAMETERS_H + +extern const s16 AI_REGULAR_ATTACK_WEIGHTS[5]; + +#endif //PMDSKY_DUNGEON_AI_PARAMETERS_H \ No newline at end of file diff --git a/lib/include/nitro/itcm_begin.h b/lib/include/nitro/itcm_begin.h new file mode 100644 index 00000000..582c8bcf --- /dev/null +++ b/lib/include/nitro/itcm_begin.h @@ -0,0 +1,4 @@ +#include +#ifdef SDK_ARM9 +#pragma section ITCM begin +#endif diff --git a/lib/include/nitro/itcm_end.h b/lib/include/nitro/itcm_end.h new file mode 100644 index 00000000..ad3474e0 --- /dev/null +++ b/lib/include/nitro/itcm_end.h @@ -0,0 +1,4 @@ +#include +#ifdef SDK_ARM9 +#pragma section ITCM end +#endif diff --git a/lib/include/nitro/section.h b/lib/include/nitro/section.h new file mode 100644 index 00000000..d3318a46 --- /dev/null +++ b/lib/include/nitro/section.h @@ -0,0 +1,14 @@ +#ifndef NITRO_SECTION_H_ +#define NITRO_SECTION_H_ + +#ifdef SDK_ARM9 +#pragma define_section ITCM ".itcm" ".itcm.bss" abs32 RWX +#pragma define_section DTCM ".dtcm" ".dtcm.bss" abs32 RWX +#else +#pragma define_section WRAM ".wram" ".wram.bss" abs32 RWX +#endif + +#pragma define_section PARENT ".parent" abs32 RWX +#pragma define_section VERSION ".version" abs32 RWX + +#endif //NITRO_SECTION_H_ diff --git a/main.lsf b/main.lsf index ed4cce31..90c4d1ea 100644 --- a/main.lsf +++ b/main.lsf @@ -189,7 +189,7 @@ Overlay OVY_10 Object asm/overlay_10_rodata_022C4584.o Object src/dungeon_parameters_1.o Object asm/overlay_10_rodata_022C464C.o - Object src/dungeon_ai_itcm.o + Object src/dungeon_ai_parameters.o Object asm/overlay_10_rodata_022C490C.o } Overlay OVY_11 diff --git a/src/dungeon_ai_itcm.c b/src/dungeon_ai_itcm.c index 42ad0148..c260d6d5 100644 --- a/src/dungeon_ai_itcm.c +++ b/src/dungeon_ai_itcm.c @@ -4,6 +4,7 @@ #include "dungeon_action.h" #include "dungeon_action_helper.h" #include "dungeon_ai_attack.h" +#include "dungeon_ai_parameters.h" #include "dungeon_ai_targeting.h" #include "dungeon_capabilities_3.h" #include "dungeon_capabilities_4.h" @@ -19,10 +20,6 @@ #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 bool8 ov29_02338350(struct entity *monster); extern bool8 TargetRegularAttack(struct entity *pokemon, u32 *target_dir, bool8 skip_petrified); extern void SetActionRegularAttack(struct action_data *monster_action, u8 direction); @@ -31,6 +28,10 @@ extern bool8 CanAiUseMove(struct entity *monster, u32 move_index, bool8 extra_ch extern enum type_id GetMoveTypeForMonster(struct entity *entity, struct move *move); extern u8 GetMoveAiWeight(struct move *move); +#ifdef SDK_ARM9 +#include +#endif //SDK_ARM9 + // https://decomp.me/scratch/zg7V6 #ifdef NONMATCHING void ChooseAiMove(struct entity *monster) @@ -291,4 +292,500 @@ void ChooseAiMove(struct entity *monster) UpdateAiTargetPos(monster); } } +#else +asm void ChooseAiMove(struct entity *monster) +{ +#ifdef JAPAN +#define CHOOSE_AI_MOVE_OFFSET -4 +#else +#define CHOOSE_AI_MOVE_OFFSET 0 #endif + stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr} + sub sp, sp, #0x44 + ldr r1, =DUNGEON_PTR + mov r10, r0 + ldr r0, [r1] + ldr r7, [r10, #0xb4] + add r0, r0, #0x4000 +#ifdef JAPAN + ldrb r0, [r0, #0x36] +#else + ldrb r0, [r0, #0xda] +#endif + bl AreMovesEnabled + cmp r0, #0 + beq _01FFBD0C + mov r0, r10 + mov r1, #0 + bl MonsterCannotAttack + cmp r0, #0 + bne _01FFBD0C + mov r0, r10 + mov r1, #1 + bl ShouldMonsterRunAwayAndShowEffect + cmp r0, #0 + bne _01FFBD0C + ldr r0, [r10, #0xb4] + ldrb r0, [r0, #0xbc] + cmp r0, #3 + bne _01FFB6CC + mov r0, r10 + bl IsMonsterCornered + cmp r0, #0 + bne _01FFBD0C +_01FFB6CC: + mov r0, r10 + mov r1, #8 + bl IsTacticSet + cmp r0, #0 + bne _01FFBD0C + ldrb r0, [r7, #0xd0] + cmp r0, #2 + bne _01FFB700 + ldr r0, =AI_CONFUSED_NO_ATTACK_CHANCE + ldrsh r0, [r0] + bl DungeonRandOutcome__022EAB20 + cmp r0, #0 + bne _01FFBD0C +_01FFB700: + ldrb r0, [r7, #0xd2] + cmp r0, #0 + beq _01FFB7A8 + mov r8, #0 + add r6, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET + mov r4, r8 + mov r5, #1 + b _01FFB7A0 +_01FFB720: + ldrb r0, [r6, r8, lsl #3] + mov r1, r8, lsl #3 + tst r0, #1 + movne r0, r5 + moveq r0, r4 + tst r0, #0xff + beq _01FFB79C + mov r0, r10 + add r1, r6, r1 + bl IsChargingTwoTurnMove + cmp r0, #0 + beq _01FFB79C + ldrb r0, [r7, #0xd4] + cmp r0, r8 + bne _01FFB79C + b _01FFB774 +_01FFB760: + add r0, r7, r8, lsl #3 + ldrb r0, [r0, #0x124 + CHOOSE_AI_MOVE_OFFSET] + tst r0, #2 + beq _01FFB77C + sub r8, r8, #1 +_01FFB774: + cmp r8, #0 + bgt _01FFB760 +_01FFB77C: + ldrb r2, [r7, #0x4c] + mov r1, r8, lsl #0x10 + add r0, r7, #0x4a + mov r1, r1, asr #0x10 + bl SetActionUseMoveAi + mov r0, r10 + bl UpdateAiTargetPos + b _01FFBD0C +_01FFB79C: + add r8, r8, #1 +_01FFB7A0: + cmp r8, #4 + blt _01FFB720 +_01FFB7A8: + mov r5, #0 + str r5, [sp] + mov r0, r5 + add r4, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET + mov r2, r5 + mov r3, #1 +_01FFB7C0: + ldrb r1, [r4, r0, lsl #3] + add r6, r4, r0, lsl #3 + tst r1, #1 + movne r1, r3 + moveq r1, r2 + tst r1, #0xff + beq _01FFB7F8 + ldrb r1, [r6] + tst r1, #4 + ldrne r1, [sp] + addne r1, r1, #1 + strne r1, [sp] + ldrb r1, [r6, #6] + add r5, r5, r1 +_01FFB7F8: + add r0, r0, #1 + cmp r0, #4 + blt _01FFB7C0 + cmp r5, #0 + bne _01FFB84C + add r0, sp, #0x14 + mov r1, #0x160 + bl InitMove + add r0, sp, #0x1c + add r2, sp, #0x14 + mov r1, r10 + bl AiConsiderMove + ldrb r0, [sp, #0x1c] + cmp r0, #0 + beq _01FFBD0C + ldrb r1, [sp, #0x1d] + add r0, r7, #0x4a + bl SetActionStruggle + mov r0, r10 + bl UpdateAiTargetPos + b _01FFBD0C +_01FFB84C: + mov r0, r10 + mov r1, #0xb + bl IqSkillIsEnabled + mov r5, r0 + mov r0, r10 + mov r1, #0x17 + bl IqSkillIsEnabled + cmp r0, #0 + movne r0, #1 + moveq r0, #0 + mov r8, #0 + and r0, r0, #0xff + str r0, [sp, #4] + mov r2, r8 + mov r1, #1 + add r0, sp, #0xc +_01FFB88C: + strb r1, [r0, r2] + add r2, r2, #1 + cmp r2, #4 + blt _01FFB88C + ldr r0, [sp, #4] + cmp r0, #0 + beq _01FFB96C + mov r2, #0 + mov r3, r2 + mov r4, #0x63 + add r0, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET + mov r9, r2 + add r6, sp, #0xc + mov lr, #1 + b _01FFB938 +_01FFB8C8: + ldrb ip, [r0, r3, lsl #3] + add r1, r0, r3, lsl #3 + tst ip, #1 + movne ip, lr + moveq ip, #0 + tst ip, #0xff + beq _01FFB940 + cmp r3, #0 + beq _01FFB928 + ldrb ip, [r1] + tst ip, #2 + bne _01FFB928 + add ip, r2, #1 + cmp ip, r3 + cmplt r4, #2 + bge _01FFB91C + b _01FFB914 +_01FFB90C: + strb r9, [r6, r2] + add r2, r2, #1 +_01FFB914: + cmp r2, r3 + blt _01FFB90C +_01FFB91C: + ldrb r4, [r1, #6] + mov r2, r3 + b _01FFB934 +_01FFB928: + ldrb r1, [r1, #6] + cmp r4, r1 + movge r4, r1 +_01FFB934: + add r3, r3, #1 +_01FFB938: + cmp r3, #4 + blt _01FFB8C8 +_01FFB940: + add r0, r2, #1 + cmp r0, r3 + cmplt r4, #2 + bge _01FFB96C + mov r1, #0 + add r0, sp, #0xc + b _01FFB964 +_01FFB95C: + strb r1, [r0, r2] + add r2, r2, #1 +_01FFB964: + cmp r2, r3 + blt _01FFB95C +_01FFB96C: + add r0, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET + mov r9, #0 + str r0, [sp, #8] + add r4, sp, #0x1c +_01FFB97C: + mov r0, #0 + strb r0, [r4, r9, lsl #3] + ldr r0, [sp, #8] + add r6, r0, r9, lsl #3 + ldrb r0, [r0, r9, lsl #3] + tst r0, #1 + movne r0, #1 + moveq r0, #0 + tst r0, #0xff + addne r0, sp, #0xc + ldrneb r0, [r0, r9] + cmpne r0, #0 + beq _01FFBA7C + ldr r2, [sp, #4] + mov r0, r10 + mov r1, r9 + bl CanAiUseMove + cmp r0, #0 + beq _01FFBA7C + ldrb r0, [r6] + tst r0, #4 + beq _01FFBA7C + mov r0, #1 + strb r0, [r4, r9, lsl #3] + ldrb r0, [r7, #0xd2] + mov r2, r9, lsl #3 + cmp r0, #0xb + bne _01FFBA38 + ldrh r0, [r6, #4] + cmp r0, #0x80 + addeq r1, r4, r2 + moveq r0, #0 + streq r0, [r1, #4] + beq _01FFBA7C + mov r0, r10 + mov r1, r6 + bl GetMoveTypeForMonster + cmp r0, #5 + addne r1, r4, r9, lsl #3 + movne r0, #1 + strne r0, [r1, #4] + bne _01FFBA70 + mov r0, r6 + bl GetMoveAiWeight + add r1, r4, r9, lsl #3 + str r0, [r1, #4] + b _01FFBA70 +_01FFBA38: + cmp r5, #0 + beq _01FFBA60 + ldr r1, [sp, #8] + add r0, r4, r2 + add r2, r1, r2 + mov r1, r10 + bl AiConsiderMove + add r1, r4, r9, lsl #3 + str r0, [r1, #4] + b _01FFBA70 +_01FFBA60: + mov r0, r6 + bl GetMoveAiWeight + add r1, r4, r9, lsl #3 + str r0, [r1, #4] +_01FFBA70: + add r0, r4, r9, lsl #3 + ldr r0, [r0, #4] + add r8, r8, r0 +_01FFBA7C: + add r9, r9, #1 + cmp r9, #4 + blt _01FFB97C + mov r2, #0 + mov r0, r10 + mov r1, #0x17 + str r2, [sp, #0x40] + bl IqSkillIsEnabled + cmp r0, #0 + bne _01FFBAF0 + ldrb r0, [r7, #0xd2] + cmp r0, #0xb + beq _01FFBAF0 + mov r1, #1 + strb r1, [sp, #0x3c] + ldrb r0, [r7, #0xd2] + cmp r0, #0xb + streq r1, [sp, #0x40] + beq _01FFBAE8 + cmp r5, #0 + movne r0, #2 + strne r0, [sp, #0x40] + ldreq r0, [sp] + ldreq r1, =AI_REGULAR_ATTACK_WEIGHTS + moveq r0, r0, lsl #1 + ldreqsh r0, [r1, r0] + streq r0, [sp, #0x40] +_01FFBAE8: + ldr r0, [sp, #0x40] + add r8, r8, r0 +_01FFBAF0: + cmp r5, #0 + beq _01FFBB80 + mov r0, #0 + mov r8, r0 + mov r5, r0 + mov r2, r0 + add r3, sp, #0x1c +_01FFBB0C: + ldrb r1, [r3, r5, lsl #3] + mov r4, r5, lsl #3 + cmp r1, #0 + add r1, r3, r4 + streq r2, [r1, #4] + beq _01FFBB30 + ldr r1, [r1, #4] + cmp r0, r1 + movlt r0, r1 +_01FFBB30: + add r5, r5, #1 + cmp r5, #5 + blt _01FFBB0C + mov r1, #0 + mov r3, r1 + add r5, sp, #0x1c +_01FFBB48: + ldrb r2, [r5, r1, lsl #3] + mov r4, r1, lsl #3 + cmp r2, #0 + beq _01FFBB74 + add r4, r5, r4 + ldr r2, [r4, #4] + cmp r0, r2 + strne r3, [r4, #4] + add r2, r5, r1, lsl #3 + ldr r2, [r2, #4] + add r8, r8, r2 +_01FFBB74: + add r1, r1, #1 + cmp r1, #5 + blt _01FFBB48 +_01FFBB80: + cmp r8, #0 + beq _01FFBD0C + mov r0, r8 + bl DungeonRandInt + mov r5, r0 + mov r4, #0 + mov r0, r10 + mov r1, #0x4e + mov r6, r4 + bl AbilityIsActiveVeneer + cmp r0, #0 + beq _01FFBBD8 + mov r0, r10 + bl ov29_02338350 + cmp r0, #0 + bne _01FFBBD8 + mov r6, #1 + add r1, sp, #0x10 + mov r0, r10 + mov r2, r6 + bl TargetRegularAttack + mov r11, r0 +_01FFBBD8: + cmp r6, #0 + bne _01FFBC10 + mov r0, r10 + mov r1, #0x17 + bl IqSkillIsEnabled + cmp r0, #0 + movne r11, #0 + strne r11, [sp, #0x10] + bne _01FFBC10 + add r1, sp, #0x10 + mov r0, r10 + mov r2, #1 + bl TargetRegularAttack + mov r11, r0 +_01FFBC10: + mov r8, #0 + add r3, sp, #0x1c + b _01FFBCE4 +_01FFBC1C: + ldrb r0, [r3, r8, lsl #3] + mov r2, r8, lsl #3 + cmp r0, #0 + addne r0, r3, r2 + ldrne r1, [r0, #4] + cmpne r1, #0 + beq _01FFBCE0 + add r4, r4, r1 + cmp r4, r5 + blt _01FFBCE0 + cmp r6, #0 + bne _01FFBC54 + cmp r8, #4 + bne _01FFBC78 +_01FFBC54: + cmp r11, #0 + beq _01FFBCEC + ldr r1, [sp, #0x10] + add r0, r7, #0x4a + and r1, r1, #0xff + bl SetActionRegularAttack + mov r0, r10 + bl UpdateAiTargetPos + b _01FFBD0C +_01FFBC78: + add r3, r7, #0x124 + CHOOSE_AI_MOVE_OFFSET + mov r1, r10 + add r2, r3, r2 + bl AiConsiderMove + add r0, sp, #0x1c + ldrb r0, [r0, r8, lsl #3] + cmp r0, #0 + beq _01FFBCEC + mov r1, r8 + b _01FFBCB4 +_01FFBCA0: + add r0, r7, r1, lsl #3 + ldrb r0, [r0, #0x124 + CHOOSE_AI_MOVE_OFFSET] + tst r0, #2 + beq _01FFBCBC + sub r1, r1, #1 +_01FFBCB4: + cmp r1, #0 + bgt _01FFBCA0 +_01FFBCBC: + add r0, sp, #0x1d + ldrb r2, [r0, r8, lsl #3] + mov r1, r1, lsl #0x10 + add r0, r7, #0x4a + mov r1, r1, asr #0x10 + bl SetActionUseMoveAi + mov r0, r10 + bl UpdateAiTargetPos + b _01FFBD0C +_01FFBCE0: + add r8, r8, #1 +_01FFBCE4: + cmp r8, #5 + blt _01FFBC1C +_01FFBCEC: + cmp r11, #0 + beq _01FFBD0C + ldr r1, [sp, #0x10] + add r0, r7, #0x4a + and r1, r1, #0xff + bl SetActionRegularAttack + mov r0, r10 + bl UpdateAiTargetPos +_01FFBD0C: + add sp, sp, #0x44 + ldmia sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc} +} +#endif + +#ifdef SDK_ARM9 +#include +#endif //SDK_ARM9 diff --git a/src/dungeon_ai_parameters.c b/src/dungeon_ai_parameters.c new file mode 100644 index 00000000..e9b4c907 --- /dev/null +++ b/src/dungeon_ai_parameters.c @@ -0,0 +1,3 @@ +// 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 }; \ No newline at end of file