Merge pull request #164 from AnonymousRandomPerson/main
Some checks failed
build / build (push) Has been cancelled

Moved nonmatching ASM to C files
This commit is contained in:
AnonymousRandomPerson 2025-08-07 23:27:21 -04:00 committed by GitHub
commit 9532c3cbd1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
22 changed files with 2241 additions and 2229 deletions

View File

@ -1,26 +0,0 @@
#pragma once
.public abs
.public AI_CAN_ATTACK_IN_DIRECTION
.public AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS
.public AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
.public AI_POTENTIAL_ATTACK_TARGETS
.public CanAttackInDirection
.public CanSeeTarget
.public DIRECTIONS_XY
.public DUNGEON_PTR
.public DungeonRandInt
.public EntityIsValid__02319F8C
.public GetDirectionTowardsPosition
.public GetEntityMoveTargetAndRange
.public GetMoveTargetAndRange
.public GetMoveTypeForMonster
.public GetTile
.public IqSkillIsEnabled
.public IsAiTargetEligible
.public IsBlinded
.public IsTargetInRange
.public IsUsableWhileTaunted
.public ResetAiCanAttackInDirection
.public StatusCheckerCheck
.public TryAddTargetToAiTargetList
.public WeightMoveWithIqSkills

View File

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

View File

@ -1426,7 +1426,7 @@ _0208AAE4:
mov r0, r4
mov r1, r6
mvn r2, #0
bl _dgeq
bl _dgr
bls _0208AB10
ldr r0, [sp, #0xd0]
mov r2, #1
@ -1626,7 +1626,7 @@ sub_0208AD28: ; 0x0208AD28
mov r0, r6
mov r1, r7
mvn r2, #0
bl _dgeq
bl _dgr
bls _0208ADEC
_0208ADE0:
ldr r0, _0208AE04 ; =_022BCA70
@ -2993,7 +2993,7 @@ _0208C104:
mov r3, r1
mov r0, r4
mov r1, sl
bl _dgeq
bl _dgr
bls _0208C238
ldr r0, _0208BA48 ; =0x8800759C
ldr r1, _0208BA4C ; =0x7E37E43C
@ -6338,9 +6338,9 @@ sub_0208EED4: ; 0x0208EED4
bx lr
arm_func_end sub_0208EED4
; Other names: _d_fge
arm_func_start _dgeq
_dgeq: ; 0x0208EEDC
; Other names: _d_fgt
arm_func_start _dgr
_dgr: ; 0x0208EEDC
mov ip, #0x200000
cmn ip, r1, lsl #1
bhs _0208EF50
@ -6384,7 +6384,7 @@ _0208EF64:
cmp r2, #0
bhi _0208EF0C
b _0208EEF0
arm_func_end _dgeq
arm_func_end _dgr
; Other names: _d_fle
arm_func_start _dleq

View File

@ -1,508 +0,0 @@
.include "asm/macros.inc"
.include "overlay_29_02319880.inc"
.text
; https://decomp.me/scratch/jVfou
#ifndef NONMATCHING
arm_func_start AiConsiderMove
AiConsiderMove: ; 0x02319880
#ifdef JAPAN
#define AI_CONSIDER_MOVE_OFFSET -0xA4
#else
#define AI_CONSIDER_MOVE_OFFSET 0
#endif
stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr}
sub sp, sp, #0x2c
mov sl, r1
str r0, [sp, #8]
mov r0, #1
mov sb, r2
ldr r6, [sl, #0xb4]
str r0, [sp, #0x14]
mov r5, #0
bl ResetAiCanAttackInDirection
mov r0, sl
mov r1, sb
mov r2, #1
bl GetEntityMoveTargetAndRange
str r0, [sp, #0x24]
mov r0, sl
mov r1, #8
bl IqSkillIsEnabled
mov r4, r0
ldr r0, [sp, #8]
mov r1, r5
strb r1, [r0]
ldrb r0, [r6, #0xd0]
cmp r0, #5
bne _023198F8
mov r0, sb
bl IsUsableWhileTaunted
cmp r0, #0
moveq r0, #1
beq _02319F64
_023198F8:
cmp r4, #0
beq _02319918
mov r0, sl
mov r1, sb
bl StatusCheckerCheck
cmp r0, #0
moveq r0, #1
beq _02319F64
_02319918:
mov r0, sb
mov r1, #0
bl GetMoveTargetAndRange
ldr r1, _02319F6C ; =0x00000273
cmp r0, r1
bne _02319958
ldrsh r3, [r6, #0x12]
ldrsh r2, [r6, #0x16]
add r0, r1, #0x174
add r2, r3, r2
cmp r2, r0
movgt r2, r0
ldrsh r0, [r6, #0x10]
cmp r0, r2
moveq r0, #1
beq _02319F64
_02319958:
ldr r0, [sp, #0x24]
ands r7, r0, #0xf0
cmpne r7, #0x10
cmpne r7, #0x20
bne _02319A54
mov r0, sl
mov r1, #1
bl IsBlinded
cmp r0, #0
beq _023199C0
ldrb r6, [r6, #0x4c]
ldr r4, _02319F70 ; =AI_CAN_ATTACK_IN_DIRECTION
ldrb r0, [r4, r6]
cmp r0, #0
bne _02319E88
ldr r1, _02319F74 ; =AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS
mov r3, #1
ldr r0, _02319F78 ; =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
mov r2, #0x63
strb r3, [r4, r6]
strb r6, [r1]
str r2, [r0]
mov r1, #0
str r1, [r0, #0x20]
add r5, r5, #1
b _02319E88
_023199C0:
ldr fp, _02319F7C ; =DIRECTIONS_XY
mov r8, #0
_023199C8:
mov r1, r8, lsl #2
add r0, fp, r8, lsl #2
ldrsh r6, [sl, #4]
ldrsh r3, [fp, r1]
ldrsh r2, [sl, #6]
ldrsh r1, [r0, #2]
add r0, r6, r3
add r1, r2, r1
bl GetTile
ldr r6, [r0, #0xc]
cmp r6, #0
beq _02319A44
ldr r0, [r6]
cmp r0, #1
bne _02319A44
cmp r7, #0x10
cmpne r7, #0x20
beq _02319A24
mov r0, sl
mov r1, r8
bl CanAttackInDirection
cmp r0, #0
beq _02319A44
_02319A24:
str sb, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, sl
mov r3, r6
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319A44:
add r8, r8, #1
cmp r8, #8
blt _023199C8
b _02319E88
_02319A54:
cmp r7, #0x30
bne _02319AC8
ldr r7, _02319F80 ; =DUNGEON_PTR
mov r6, #0
_02319A64:
ldr r0, [r7]
add r0, r0, r6, lsl #2
add r0, r0, #0x12000
ldr r8, [r0, #0xb78 + AI_CONSIDER_MOVE_OFFSET]
mov r0, r8
bl EntityIsValid__02319F8C
cmp r0, #0
beq _02319AB8
mov r0, sl
mov r1, r8
bl CanSeeTarget
cmp r0, #0
beq _02319AB8
str sb, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, sl
mov r3, r8
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319AB8:
add r6, r6, #1
cmp r6, #0x14
blt _02319A64
b _02319E88
_02319AC8:
cmp r7, #0x40
bne _02319BB0
mov r8, #0
_02319AD4:
ldr r0, _02319F7C ; =DIRECTIONS_XY
mov r2, r8, lsl #2
add r0, r0, r8, lsl #2
ldrsh r6, [r0, #2]
ldr r0, _02319F7C ; =DIRECTIONS_XY
ldrsh r1, [sl, #6]
ldrsh r7, [r0, r2]
ldrsh r0, [sl, #4]
add r1, r1, r6
add r0, r0, r7
bl GetTile
mov fp, r0
mov r0, sl
mov r1, r8
bl CanAttackInDirection
cmp r0, #0
beq _02319BA0
ldr r3, [fp, #0xc]
cmp r3, #0
beq _02319B58
ldr r0, [r3]
cmp r0, #1
bne _02319B58
str sb, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, sl
str r4, [sp, #4]
mov fp, r5
bl TryAddTargetToAiTargetList
mov r5, r0
cmp fp, r5
bne _02319BA0
_02319B58:
ldrsh r0, [sl, #4]
ldrsh r1, [sl, #6]
add r0, r0, r7, lsl #1
add r1, r1, r6, lsl #1
bl GetTile
ldr r3, [r0, #0xc]
cmp r3, #0
beq _02319BA0
ldr r0, [r3]
cmp r0, #1
bne _02319BA0
str sb, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, sl
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319BA0:
add r8, r8, #1
cmp r8, #8
blt _02319AD4
b _02319E88
_02319BB0:
cmp r7, #0x50
cmpne r7, #0x80
cmpne r7, #0x90
bne _02319E00
cmp r7, #0x50
moveq r0, #0xa
streq r0, [sp, #0xc]
movne r0, #1
strne r0, [sp, #0xc]
cmp r7, #0x90
moveq r0, #2
streq r0, [sp, #0xc]
mov r0, #0
str r0, [sp, #0x20]
mvn r0, #0
str r0, [sp, #0x28]
_02319BF0:
ldr r0, _02319F80 ; =DUNGEON_PTR
ldr r1, [r0]
ldr r0, [sp, #0x20]
add r0, r1, r0, lsl #2
add r0, r0, #0x12000
ldr r0, [r0, #0xb78 + AI_CONSIDER_MOVE_OFFSET]
str r0, [sp, #0x18]
bl EntityIsValid__02319F8C
cmp r0, #0
ldrne r0, [sp, #0x18]
cmpne sl, r0
beq _02319DE8
ldr r1, [sp, #0x18]
add r0, sl, #4
add r1, r1, #4
bl GetDirectionTowardsPosition
ldr r1, _02319F70 ; =AI_CAN_ATTACK_IN_DIRECTION
str r0, [sp, #0x1c]
ldrb r0, [r1, r0]
cmp r0, #0
bne _02319DE8
ldr r1, [sp, #0x18]
mov r0, sl
bl CanSeeTarget
cmp r0, #0
beq _02319DE8
ldr r0, [sp, #0x18]
ldrsh r6, [sl, #4]
ldrsh fp, [r0, #4]
sub r0, r6, fp
bl abs
str r0, [sp, #0x10]
ldr r0, [sp, #0x18]
ldrsh r8, [sl, #6]
ldrsh r7, [r0, #6]
sub r0, r8, r7
bl abs
ldr r1, [sp, #0x10]
cmp r1, r0
movgt r2, r1
movle r2, r0
cmp r2, #0xa
movgt r0, #0
bgt _02319D50
ldr r1, [sp, #0xc]
cmp r2, r1
movgt r0, #0
bgt _02319D50
ldr r1, [sp, #0x10]
cmp r1, r0
ldr r0, [sp, #0x28]
bne _02319CF8
cmp r6, fp
cmplt r8, r7
movlt r0, #1
blt _02319D44
cmp r6, fp
bge _02319CE4
cmp r8, r7
movgt r0, #3
bgt _02319D44
_02319CE4:
cmp r6, fp
cmpgt r8, r7
movgt r0, #5
movle r0, #7
b _02319D44
_02319CF8:
cmp r6, fp
bne _02319D0C
cmp r8, r7
movlt r0, #0
blt _02319D44
_02319D0C:
cmp r6, fp
bge _02319D20
cmp r8, r7
moveq r0, #2
beq _02319D44
_02319D20:
cmp r6, fp
bne _02319D34
cmp r8, r7
movgt r0, #4
bgt _02319D44
_02319D34:
cmp r6, fp
ble _02319D44
cmp r8, r7
moveq r0, #6
_02319D44:
cmp r0, #0
movge r0, #1
movlt r0, #0
_02319D50:
cmp r0, #0
beq _02319DE8
str r4, [sp]
ldr r0, [sp, #0x24]
ldr r2, [sp, #0x18]
mov r1, sl
mov r3, sb
bl IsAiTargetEligible
cmp r0, #0
beq _02319DE8
ldr r1, [sp, #0x18]
ldr r2, [sp, #0x1c]
ldr r3, [sp, #0xc]
mov r0, sl
bl IsTargetInRange
cmp r0, #0
beq _02319DE8
ldr r1, _02319F70 ; =AI_CAN_ATTACK_IN_DIRECTION
ldr r0, [sp, #0x1c]
mov r2, #1
strb r2, [r1, r0]
mov r1, r0
ldr r0, _02319F74 ; =AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS
strb r1, [r0, r5]
mov r0, sl
mov r1, sb
bl GetMoveTypeForMonster
mov r3, r0
ldr r1, [sp, #0x24]
ldr r2, [sp, #0x18]
mov r0, sl
bl WeightMoveWithIqSkills
ldr r1, _02319F84 ; =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
str r0, [r1, r5, lsl #2]
ldr r1, [sp, #0x18]
ldr r0, _02319F88 ; =AI_POTENTIAL_ATTACK_TARGETS
str r1, [r0, r5, lsl #2]
add r5, r5, #1
_02319DE8:
ldr r0, [sp, #0x20]
add r0, r0, #1
str r0, [sp, #0x20]
cmp r0, #0x14
blt _02319BF0
b _02319E88
_02319E00:
cmp r7, #0x60
bne _02319E60
ldr r7, _02319F80 ; =DUNGEON_PTR
mov r6, #0
_02319E10:
ldr r0, [r7]
add r0, r0, r6, lsl #2
add r0, r0, #0x12000
ldr r8, [r0, #0xb78 + AI_CONSIDER_MOVE_OFFSET]
mov r0, r8
bl EntityIsValid__02319F8C
cmp r0, #0
beq _02319E50
str sb, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, sl
mov r3, r8
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319E50:
add r6, r6, #1
cmp r6, #0x14
blt _02319E10
b _02319E88
_02319E60:
cmp r7, #0x70
bne _02319E88
str sb, [sp]
ldr r1, [sp, #0x24]
mov r2, sl
mov r3, sl
mov r0, #0
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319E88:
cmp r5, #0
ldreq r0, [sp, #8]
moveq r1, #0
streqb r1, [r0]
beq _02319F60
mov r0, #0
str r0, [sp, #0x14]
mov r4, r0
ldr r3, _02319F84 ; =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
b _02319EC4
_02319EB0:
ldr r2, [r3, r4, lsl #2]
ldr r1, [sp, #0x14]
add r4, r4, #1
cmp r1, r2
strlt r2, [sp, #0x14]
_02319EC4:
cmp r4, r5
blt _02319EB0
mov r6, #0
mov r2, r6
ldr r4, _02319F84 ; =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
b _02319EF0
_02319EDC:
ldr r3, [r4, r6, lsl #2]
ldr r1, [sp, #0x14]
cmp r1, r3
strne r2, [r4, r6, lsl #2]
add r6, r6, #1
_02319EF0:
cmp r6, r5
blt _02319EDC
mov r3, #0
ldr r2, _02319F84 ; =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
b _02319F10
_02319F04:
ldr r1, [r2, r3, lsl #2]
add r3, r3, #1
add r0, r0, r1
_02319F10:
cmp r3, r5
blt _02319F04
bl DungeonRandInt
mov r3, #0
ldr r2, _02319F84 ; =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
b _02319F38
_02319F28:
ldr r1, [r2, r3, lsl #2]
subs r0, r0, r1
bmi _02319F40
add r3, r3, #1
_02319F38:
cmp r3, r5
blt _02319F28
_02319F40:
ldr r1, _02319F74 ; =AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS
ldr r0, [sp, #8]
mov r2, #1
strb r2, [r0]
ldrb r2, [r1, r3]
mov r1, #8
strb r2, [r0, #1]
str r1, [r0, #4]
_02319F60:
ldr r0, [sp, #0x14]
_02319F64:
add sp, sp, #0x2c
ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc}
.align 2, 0
_02319F6C: .word 0x00000273
_02319F70: .word AI_CAN_ATTACK_IN_DIRECTION
_02319F74: .word AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS
_02319F78: .word AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
_02319F7C: .word DIRECTIONS_XY
_02319F80: .word DUNGEON_PTR
_02319F84: .word AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
_02319F88: .word AI_POTENTIAL_ATTACK_TARGETS
arm_func_end AiConsiderMove
#endif

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,8 @@ AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS:
.space 0x8
.global AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
AI_POTENTIAL_ATTACK_TARGET_WEIGHTS:
.global AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2
AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2:
.space 0x20
.global AI_POTENTIAL_ATTACK_TARGETS
AI_POTENTIAL_ATTACK_TARGETS:

View File

@ -12,6 +12,8 @@ struct ai_possible_move
s32 weight;
};
// Sets all values in AI_CAN_ATTACK_IN_DIRECTION to false.
void ResetAiCanAttackInDirection();
// The AI uses this function to check if a move has any potential targets, to calculate the list of potential targets and to calculate the move's special weight. The weight is calculated using WeightMoveWithIqSkills.
// This function also sets the flag can_be_used on the ai_possible_move struct if it makes sense to use it.
// The weight returned by this function is not the same as GetMoveAiWeight. If the AI does not have Weak-Type Picker, AiConsiderMove is called after the AI has selected which move it will use (using GetMoveAiWeight). It determines whether it makes sense for the AI to actually use the chosen move (i.e., whether targets are in range), and which direction the AI will use the move in if so. The return value of this function is not used anywhere in this case.

View File

@ -1,7 +0,0 @@
#ifndef PMDSKY_DUNGEON_AI_ATTACK_2_H
#define PMDSKY_DUNGEON_AI_ATTACK_2_H
// Sets all values in AI_CAN_ATTACK_IN_DIRECTION to false.
void ResetAiCanAttackInDirection();
#endif //PMDSKY_DUNGEON_AI_ATTACK_2_H

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

@ -3,6 +3,10 @@
#include "dungeon_mode.h"
// Determines if using a given move against its intended targets would be redundant because all of them already have the effect caused by said move. Used for moves that affect the user or allies.
// attacker: Pointer to the entity that is considering using 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 all the targets already have.
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);

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 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
@ -474,8 +474,6 @@ Overlay OVY_29
Object src/overlay_29_02318E4C.o
Object asm/overlay_29_02318E70.o
Object src/inflict_status.o
Object src/dungeon_ai_attack_2.o
Object asm/overlay_29_02319880.o
Object src/dungeon_ai_attack.o
Object asm/overlay_29_0231A364.o
Object src/dungeon_ai_attack_1.o

View File

@ -1,7 +1,6 @@
#include "dungeon_ai_attack.h"
#include "dg_random.h"
#include "dungeon_ai_attack_1.h"
#include "dungeon_ai_attack_2.h"
#include "dungeon_ai_targeting_1.h"
#include "dungeon_capabilities_4.h"
#include "dungeon_logic.h"
@ -32,6 +31,14 @@ extern bool8 ov29_023007DC(struct entity *entity);
extern bool8 IsMonsterSleeping(struct entity *monster);
extern u8 GetMoveAccuracyOrAiChance(struct move *move, u32 which);
void ResetAiCanAttackInDirection()
{
for (s32 i = 0; i < NUM_DIRECTIONS; i++)
{
AI_CAN_ATTACK_IN_DIRECTION[i] = FALSE;
}
}
// https://decomp.me/scratch/jVfou
#ifdef NONMATCHING
u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *monster, struct move *move)
@ -252,6 +259,501 @@ u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *mon
return move_weight;
}
#else
// AI_POTENTIAL_ATTACK_TARGET_WEIGHTS is defined two separate times in the ASM, so define it twice here to match.
extern s32 AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2[NUM_DIRECTIONS];
asm u32 AiConsiderMove(struct ai_possible_move *ai_possible_move, struct entity *monster, struct move *move)
{
#ifdef JAPAN
#define AI_CONSIDER_MOVE_OFFSET -0xA4
#else
#define AI_CONSIDER_MOVE_OFFSET 0
#endif
stmdb sp!, {r4, r5, r6, r7, r8, r9, r10, r11, lr}
sub sp, sp, #0x2c
mov r10, r1
str r0, [sp, #8]
mov r0, #1
mov r9, r2
ldr r6, [r10, #0xb4]
str r0, [sp, #0x14]
mov r5, #0
bl ResetAiCanAttackInDirection
mov r0, r10
mov r1, r9
mov r2, #1
bl GetEntityMoveTargetAndRange
str r0, [sp, #0x24]
mov r0, r10
mov r1, #8
bl IqSkillIsEnabled
mov r4, r0
ldr r0, [sp, #8]
mov r1, r5
strb r1, [r0]
ldrb r0, [r6, #0xd0]
cmp r0, #5
bne _023198F8
mov r0, r9
bl IsUsableWhileTaunted
cmp r0, #0
moveq r0, #1
beq _02319F64
_023198F8:
cmp r4, #0
beq _02319918
mov r0, r10
mov r1, r9
bl StatusCheckerCheck
cmp r0, #0
moveq r0, #1
beq _02319F64
_02319918:
mov r0, r9
mov r1, #0
bl GetMoveTargetAndRange
ldr r1, =0x00000273
cmp r0, r1
bne _02319958
ldrsh r3, [r6, #0x12]
ldrsh r2, [r6, #0x16]
add r0, r1, #0x174
add r2, r3, r2
cmp r2, r0
movgt r2, r0
ldrsh r0, [r6, #0x10]
cmp r0, r2
moveq r0, #1
beq _02319F64
_02319958:
ldr r0, [sp, #0x24]
ands r7, r0, #0xf0
cmpne r7, #0x10
cmpne r7, #0x20
bne _02319A54
mov r0, r10
mov r1, #1
bl IsBlinded
cmp r0, #0
beq _023199C0
ldrb r6, [r6, #0x4c]
ldr r4, =AI_CAN_ATTACK_IN_DIRECTION
ldrb r0, [r4, r6]
cmp r0, #0
bne _02319E88
ldr r1, =AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS
mov r3, #1
ldr r0, =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS
mov r2, #0x63
strb r3, [r4, r6]
strb r6, [r1]
str r2, [r0]
mov r1, #0
str r1, [r0, #0x20]
add r5, r5, #1
b _02319E88
_023199C0:
ldr r11, =DIRECTIONS_XY
mov r8, #0
_023199C8:
mov r1, r8, lsl #2
add r0, r11, r8, lsl #2
ldrsh r6, [r10, #4]
ldrsh r3, [r11, r1]
ldrsh r2, [r10, #6]
ldrsh r1, [r0, #2]
add r0, r6, r3
add r1, r2, r1
bl GetTile
ldr r6, [r0, #0xc]
cmp r6, #0
beq _02319A44
ldr r0, [r6]
cmp r0, #1
bne _02319A44
cmp r7, #0x10
cmpne r7, #0x20
beq _02319A24
mov r0, r10
mov r1, r8
bl CanAttackInDirection
cmp r0, #0
beq _02319A44
_02319A24:
str r9, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, r10
mov r3, r6
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319A44:
add r8, r8, #1
cmp r8, #8
blt _023199C8
b _02319E88
_02319A54:
cmp r7, #0x30
bne _02319AC8
ldr r7, =DUNGEON_PTR
mov r6, #0
_02319A64:
ldr r0, [r7]
add r0, r0, r6, lsl #2
add r0, r0, #0x12000
ldr r8, [r0, #0xb78 + AI_CONSIDER_MOVE_OFFSET]
mov r0, r8
bl EntityIsValid__02319F8C
cmp r0, #0
beq _02319AB8
mov r0, r10
mov r1, r8
bl CanSeeTarget
cmp r0, #0
beq _02319AB8
str r9, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, r10
mov r3, r8
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319AB8:
add r6, r6, #1
cmp r6, #0x14
blt _02319A64
b _02319E88
_02319AC8:
cmp r7, #0x40
bne _02319BB0
mov r8, #0
_02319AD4:
ldr r0, =DIRECTIONS_XY
mov r2, r8, lsl #2
add r0, r0, r8, lsl #2
ldrsh r6, [r0, #2]
ldr r0, =DIRECTIONS_XY
ldrsh r1, [r10, #6]
ldrsh r7, [r0, r2]
ldrsh r0, [r10, #4]
add r1, r1, r6
add r0, r0, r7
bl GetTile
mov r11, r0
mov r0, r10
mov r1, r8
bl CanAttackInDirection
cmp r0, #0
beq _02319BA0
ldr r3, [r11, #0xc]
cmp r3, #0
beq _02319B58
ldr r0, [r3]
cmp r0, #1
bne _02319B58
str r9, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, r10
str r4, [sp, #4]
mov r11, r5
bl TryAddTargetToAiTargetList
mov r5, r0
cmp r11, r5
bne _02319BA0
_02319B58:
ldrsh r0, [r10, #4]
ldrsh r1, [r10, #6]
add r0, r0, r7, lsl #1
add r1, r1, r6, lsl #1
bl GetTile
ldr r3, [r0, #0xc]
cmp r3, #0
beq _02319BA0
ldr r0, [r3]
cmp r0, #1
bne _02319BA0
str r9, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, r10
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319BA0:
add r8, r8, #1
cmp r8, #8
blt _02319AD4
b _02319E88
_02319BB0:
cmp r7, #0x50
cmpne r7, #0x80
cmpne r7, #0x90
bne _02319E00
cmp r7, #0x50
moveq r0, #0xa
streq r0, [sp, #0xc]
movne r0, #1
strne r0, [sp, #0xc]
cmp r7, #0x90
moveq r0, #2
streq r0, [sp, #0xc]
mov r0, #0
str r0, [sp, #0x20]
mvn r0, #0
str r0, [sp, #0x28]
_02319BF0:
ldr r0, =DUNGEON_PTR
ldr r1, [r0]
ldr r0, [sp, #0x20]
add r0, r1, r0, lsl #2
add r0, r0, #0x12000
ldr r0, [r0, #0xb78 + AI_CONSIDER_MOVE_OFFSET]
str r0, [sp, #0x18]
bl EntityIsValid__02319F8C
cmp r0, #0
ldrne r0, [sp, #0x18]
cmpne r10, r0
beq _02319DE8
ldr r1, [sp, #0x18]
add r0, r10, #4
add r1, r1, #4
bl GetDirectionTowardsPosition
ldr r1, =AI_CAN_ATTACK_IN_DIRECTION
str r0, [sp, #0x1c]
ldrb r0, [r1, r0]
cmp r0, #0
bne _02319DE8
ldr r1, [sp, #0x18]
mov r0, r10
bl CanSeeTarget
cmp r0, #0
beq _02319DE8
ldr r0, [sp, #0x18]
ldrsh r6, [r10, #4]
ldrsh r11, [r0, #4]
sub r0, r6, r11
bl abs
str r0, [sp, #0x10]
ldr r0, [sp, #0x18]
ldrsh r8, [r10, #6]
ldrsh r7, [r0, #6]
sub r0, r8, r7
bl abs
ldr r1, [sp, #0x10]
cmp r1, r0
movgt r2, r1
movle r2, r0
cmp r2, #0xa
movgt r0, #0
bgt _02319D50
ldr r1, [sp, #0xc]
cmp r2, r1
movgt r0, #0
bgt _02319D50
ldr r1, [sp, #0x10]
cmp r1, r0
ldr r0, [sp, #0x28]
bne _02319CF8
cmp r6, r11
cmplt r8, r7
movlt r0, #1
blt _02319D44
cmp r6, r11
bge _02319CE4
cmp r8, r7
movgt r0, #3
bgt _02319D44
_02319CE4:
cmp r6, r11
cmpgt r8, r7
movgt r0, #5
movle r0, #7
b _02319D44
_02319CF8:
cmp r6, r11
bne _02319D0C
cmp r8, r7
movlt r0, #0
blt _02319D44
_02319D0C:
cmp r6, r11
bge _02319D20
cmp r8, r7
moveq r0, #2
beq _02319D44
_02319D20:
cmp r6, r11
bne _02319D34
cmp r8, r7
movgt r0, #4
bgt _02319D44
_02319D34:
cmp r6, r11
ble _02319D44
cmp r8, r7
moveq r0, #6
_02319D44:
cmp r0, #0
movge r0, #1
movlt r0, #0
_02319D50:
cmp r0, #0
beq _02319DE8
str r4, [sp]
ldr r0, [sp, #0x24]
ldr r2, [sp, #0x18]
mov r1, r10
mov r3, r9
bl IsAiTargetEligible
cmp r0, #0
beq _02319DE8
ldr r1, [sp, #0x18]
ldr r2, [sp, #0x1c]
ldr r3, [sp, #0xc]
mov r0, r10
bl IsTargetInRange
cmp r0, #0
beq _02319DE8
ldr r1, =AI_CAN_ATTACK_IN_DIRECTION
ldr r0, [sp, #0x1c]
mov r2, #1
strb r2, [r1, r0]
mov r1, r0
ldr r0, =AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS
strb r1, [r0, r5]
mov r0, r10
mov r1, r9
bl GetMoveTypeForMonster
mov r3, r0
ldr r1, [sp, #0x24]
ldr r2, [sp, #0x18]
mov r0, r10
bl WeightMoveWithIqSkills
ldr r1, =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2
str r0, [r1, r5, lsl #2]
ldr r1, [sp, #0x18]
ldr r0, =AI_POTENTIAL_ATTACK_TARGETS
str r1, [r0, r5, lsl #2]
add r5, r5, #1
_02319DE8:
ldr r0, [sp, #0x20]
add r0, r0, #1
str r0, [sp, #0x20]
cmp r0, #0x14
blt _02319BF0
b _02319E88
_02319E00:
cmp r7, #0x60
bne _02319E60
ldr r7, =DUNGEON_PTR
mov r6, #0
_02319E10:
ldr r0, [r7]
add r0, r0, r6, lsl #2
add r0, r0, #0x12000
ldr r8, [r0, #0xb78 + AI_CONSIDER_MOVE_OFFSET]
mov r0, r8
bl EntityIsValid__02319F8C
cmp r0, #0
beq _02319E50
str r9, [sp]
ldr r1, [sp, #0x24]
mov r0, r5
mov r2, r10
mov r3, r8
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319E50:
add r6, r6, #1
cmp r6, #0x14
blt _02319E10
b _02319E88
_02319E60:
cmp r7, #0x70
bne _02319E88
str r9, [sp]
ldr r1, [sp, #0x24]
mov r2, r10
mov r3, r10
mov r0, #0
str r4, [sp, #4]
bl TryAddTargetToAiTargetList
mov r5, r0
_02319E88:
cmp r5, #0
ldreq r0, [sp, #8]
moveq r1, #0
streqb r1, [r0]
beq _02319F60
mov r0, #0
str r0, [sp, #0x14]
mov r4, r0
ldr r3, =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2
b _02319EC4
_02319EB0:
ldr r2, [r3, r4, lsl #2]
ldr r1, [sp, #0x14]
add r4, r4, #1
cmp r1, r2
strlt r2, [sp, #0x14]
_02319EC4:
cmp r4, r5
blt _02319EB0
mov r6, #0
mov r2, r6
ldr r4, =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2
b _02319EF0
_02319EDC:
ldr r3, [r4, r6, lsl #2]
ldr r1, [sp, #0x14]
cmp r1, r3
strne r2, [r4, r6, lsl #2]
add r6, r6, #1
_02319EF0:
cmp r6, r5
blt _02319EDC
mov r3, #0
ldr r2, =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2
b _02319F10
_02319F04:
ldr r1, [r2, r3, lsl #2]
add r3, r3, #1
add r0, r0, r1
_02319F10:
cmp r3, r5
blt _02319F04
bl DungeonRandInt
mov r3, #0
ldr r2, =AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2
b _02319F38
_02319F28:
ldr r1, [r2, r3, lsl #2]
subs r0, r0, r1
bmi _02319F40
add r3, r3, #1
_02319F38:
cmp r3, r5
blt _02319F28
_02319F40:
ldr r1, =AI_POTENTIAL_ATTACK_TARGET_DIRECTIONS
ldr r0, [sp, #8]
mov r2, #1
strb r2, [r0]
ldrb r2, [r1, r3]
mov r1, #8
strb r2, [r0, #1]
str r1, [r0, #4]
_02319F60:
ldr r0, [sp, #0x14]
_02319F64:
add sp, sp, #0x2c
ldmia sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
}
#endif
bool8 EntityIsValid__02319F8C(struct entity *entity)

View File

@ -1,13 +0,0 @@
#include "dungeon_ai_attack_2.h"
#include "direction.h"
#include "util.h"
extern bool8 AI_CAN_ATTACK_IN_DIRECTION[NUM_DIRECTIONS];
void ResetAiCanAttackInDirection()
{
for (s32 i = 0; i < NUM_DIRECTIONS; i++)
{
AI_CAN_ATTACK_IN_DIRECTION[i] = FALSE;
}
}

View File

@ -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 <nitro/itcm_begin.h>
#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 <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 };

File diff suppressed because it is too large Load Diff

View File

@ -109,12 +109,7 @@ new_asm_header = f"""\t.include "asm/macros.inc"
new_asm_name = f'{new_asm_base_name}.s'
new_asm_lines = original_lines[function_end_line + 1:]
if nonmatching:
original_asm_lines = original_lines[:function_end_line + 1]
original_asm_lines.append('#endif\n')
original_asm_lines[function_start_line] = '#ifndef NONMATCHING\n' + original_asm_lines[function_start_line]
else:
original_asm_lines = original_lines[:function_start_line - 1]
original_asm_lines = original_lines[:function_start_line - 1]
with open(LSF_FILE_PATH, 'r') as lsf_file:
lsf_lines = lsf_file.readlines()
@ -177,9 +172,39 @@ 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):
# 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')
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]
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
# .align is not needed in embedded ASM
if '.align' in asm_lines[-1]:
asm_lines = asm_lines[:-1]
asm_string = str.join('', asm_lines)
function_body = f"""#ifdef NONMATCHING
{function_body}
#else
asm {function_header}
{{
{asm_string}}}
#endif"""
# Add the extracted function to a .h and .c file.

View File

@ -17,7 +17,7 @@ LANGUAGE_KEYS_PMDSKY_DEBUG_TO_XMAP = {
LANGUAGE_KEYS_XMAP_TO_PMDSKY_DEBUG = {value: key for key, value in LANGUAGE_KEYS_PMDSKY_DEBUG_TO_XMAP.items()}
# Symbols with duplicate addresses that should be ignored.
SYMBOL_BLACKLIST = set([
PMDSKY_DEBUG_SYMBOL_BLACKLIST = set([
'GAME_STATE_VALUES',
'MEMORY_ALLOCATION_TABLE'
])
@ -81,7 +81,7 @@ def read_pmdsky_debug_symbols() -> Dict[str, Dict[str, Dict[int, SymbolDetails]]
addresses: int | List[int] = symbol['address'][language]
symbol_name: str = symbol['name']
if symbol_name in SYMBOL_BLACKLIST:
if symbol_name in PMDSKY_DEBUG_SYMBOL_BLACKLIST:
continue
if 'aliases' in symbol:

View File

@ -8,6 +8,11 @@ HEADER_FOLDER = 'include'
XMAP_PATH_ARM7 = os.path.join('sub', 'build', 'arm7.nef.xMAP')
MAIN_LSF_PATH = 'main.lsf'
# Symbols with duplicate addresses that should be ignored.
XMAP_SYMBOL_BLACKLIST = set([
'AI_POTENTIAL_ATTACK_TARGET_WEIGHTS_2'
])
"""
Dictionary format:
{
@ -78,6 +83,10 @@ def read_xmap_symbols_for_language(language: str) -> Dict[str, Dict[int, SymbolD
elif current_section is not None and line.startswith(' ') and ('.text' in line or '.itcm' in line or line_is_data(line)) and len(line) > 28 and line[28] not in NON_FUNCTION_SYMBOLS:
symbol_split = line[28:-1].split('\t')
symbol_name = symbol_split[0]
if symbol_name in XMAP_SYMBOL_BLACKLIST:
continue
symbol_address = int(line[2:10], 16)
if line_is_data(line):
if not symbol_name.startswith('$'):