Moved ChooseAiMove nonmatching to C file

This commit is contained in:
AnonymousRandomPerson 2025-08-07 19:30:18 -04:00
parent fb220bff0e
commit b0b0b958d2
8 changed files with 533 additions and 504 deletions

View File

@ -4137,502 +4137,3 @@ sub_01FFB62C: ; 0x01FFB62C
.global _01FFB654 .global _01FFB654
_01FFB654: _01FFB654:
.byte 0x05, 0x03, 0x00, 0x00 .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

View File

@ -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

View File

@ -0,0 +1,4 @@
#include <nitro/section.h>
#ifdef SDK_ARM9
#pragma section ITCM begin
#endif

View File

@ -0,0 +1,4 @@
#include <nitro/section.h>
#ifdef SDK_ARM9
#pragma section ITCM end
#endif

View File

@ -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_

View File

@ -189,7 +189,7 @@ Overlay OVY_10
Object asm/overlay_10_rodata_022C4584.o Object asm/overlay_10_rodata_022C4584.o
Object src/dungeon_parameters_1.o Object src/dungeon_parameters_1.o
Object asm/overlay_10_rodata_022C464C.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 Object asm/overlay_10_rodata_022C490C.o
} }
Overlay OVY_11 Overlay OVY_11

View File

@ -4,6 +4,7 @@
#include "dungeon_action.h" #include "dungeon_action.h"
#include "dungeon_action_helper.h" #include "dungeon_action_helper.h"
#include "dungeon_ai_attack.h" #include "dungeon_ai_attack.h"
#include "dungeon_ai_parameters.h"
#include "dungeon_ai_targeting.h" #include "dungeon_ai_targeting.h"
#include "dungeon_capabilities_3.h" #include "dungeon_capabilities_3.h"
#include "dungeon_capabilities_4.h" #include "dungeon_capabilities_4.h"
@ -19,10 +20,6 @@
#define REGULAR_ATTACK_INDEX 4 #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 ov29_02338350(struct entity *monster);
extern bool8 TargetRegularAttack(struct entity *pokemon, u32 *target_dir, bool8 skip_petrified); extern bool8 TargetRegularAttack(struct entity *pokemon, u32 *target_dir, bool8 skip_petrified);
extern void SetActionRegularAttack(struct action_data *monster_action, u8 direction); 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 enum type_id GetMoveTypeForMonster(struct entity *entity, struct move *move);
extern u8 GetMoveAiWeight(struct move *move); extern u8 GetMoveAiWeight(struct move *move);
#ifdef SDK_ARM9
#include <nitro/itcm_begin.h>
#endif //SDK_ARM9
// https://decomp.me/scratch/zg7V6 // https://decomp.me/scratch/zg7V6
#ifdef NONMATCHING #ifdef NONMATCHING
void ChooseAiMove(struct entity *monster) void ChooseAiMove(struct entity *monster)
@ -291,4 +292,500 @@ void ChooseAiMove(struct entity *monster)
UpdateAiTargetPos(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 #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 <nitro/itcm_end.h>
#endif //SDK_ARM9

View File

@ -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 };