mirror of
https://github.com/pret/pmd-red.git
synced 2026-04-24 23:17:03 -05:00
Decomped FindMoveTarget()
This commit is contained in:
parent
9939c543ce
commit
a02346be01
|
|
@ -5,561 +5,6 @@
|
|||
|
||||
.text
|
||||
|
||||
thumb_func_start FindMoveTarget
|
||||
FindMoveTarget:
|
||||
push {r4-r7,lr}
|
||||
mov r7, r10
|
||||
mov r6, r9
|
||||
mov r5, r8
|
||||
push {r5-r7}
|
||||
sub sp, 0x1C
|
||||
str r0, [sp, 0x8]
|
||||
adds r6, r1, 0
|
||||
mov r10, r2
|
||||
movs r0, 0x1
|
||||
str r0, [sp, 0x10]
|
||||
ldr r4, [r6, 0x70]
|
||||
movs r1, 0
|
||||
mov r8, r1
|
||||
ldr r1, _0807C0C8
|
||||
movs r2, 0
|
||||
adds r0, r1, 0x7
|
||||
_0807C06E:
|
||||
strb r2, [r0]
|
||||
subs r0, 0x1
|
||||
cmp r0, r1
|
||||
bge _0807C06E
|
||||
adds r0, r6, 0
|
||||
mov r1, r10
|
||||
movs r2, 0x1
|
||||
bl GetTargetingFlags
|
||||
lsls r0, 16
|
||||
asrs r0, 16
|
||||
str r0, [sp, 0xC]
|
||||
adds r0, r6, 0
|
||||
movs r1, 0x8
|
||||
bl HasIQSkill
|
||||
lsls r0, 24
|
||||
lsrs r0, 24
|
||||
str r0, [sp, 0x14]
|
||||
movs r0, 0
|
||||
ldr r2, [sp, 0x8]
|
||||
strb r0, [r2]
|
||||
adds r0, r4, 0
|
||||
adds r0, 0xBC
|
||||
ldrb r0, [r0]
|
||||
cmp r0, 0x5
|
||||
bne _0807C0B0
|
||||
mov r0, r10
|
||||
bl GetMoveDealsDirectDamage
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C0C4
|
||||
_0807C0B0:
|
||||
ldr r3, [sp, 0x14]
|
||||
cmp r3, 0
|
||||
beq _0807C0CC
|
||||
adds r0, r6, 0
|
||||
mov r1, r10
|
||||
bl CanUseWithStatusChecker
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
bne _0807C0CC
|
||||
_0807C0C4:
|
||||
movs r0, 0x1
|
||||
b _0807C48C
|
||||
.align 2, 0
|
||||
_0807C0C8: .4byte gCanAttackInDirection
|
||||
_0807C0CC:
|
||||
movs r0, 0xF0
|
||||
ldr r1, [sp, 0xC]
|
||||
ands r0, r1
|
||||
cmp r0, 0
|
||||
beq _0807C0DE
|
||||
cmp r0, 0x10
|
||||
beq _0807C0DE
|
||||
cmp r0, 0x20
|
||||
bne _0807C19C
|
||||
_0807C0DE:
|
||||
adds r0, r4, 0
|
||||
adds r0, 0xE8
|
||||
ldrb r1, [r0]
|
||||
cmp r1, 0x1
|
||||
bne _0807C128
|
||||
subs r0, 0xA2
|
||||
ldrb r7, [r0]
|
||||
ldr r0, _0807C118
|
||||
adds r0, r7, r0
|
||||
ldrb r3, [r0]
|
||||
cmp r3, 0
|
||||
beq _0807C0F8
|
||||
b _0807C3F6
|
||||
_0807C0F8:
|
||||
strb r1, [r0]
|
||||
ldr r0, _0807C11C
|
||||
add r0, r8
|
||||
strb r7, [r0]
|
||||
ldr r0, _0807C120
|
||||
mov r4, r8
|
||||
lsls r2, r4, 2
|
||||
adds r0, r2, r0
|
||||
movs r1, 0x63
|
||||
str r1, [r0]
|
||||
ldr r0, _0807C124
|
||||
adds r2, r0
|
||||
str r3, [r2]
|
||||
movs r0, 0x1
|
||||
add r8, r0
|
||||
b _0807C3F6
|
||||
.align 2, 0
|
||||
_0807C118: .4byte gCanAttackInDirection
|
||||
_0807C11C: .4byte gUnknown_202F388
|
||||
_0807C120: .4byte gPotentialTargetWeights_2
|
||||
_0807C124: .4byte gUnknown_202F3B0
|
||||
_0807C128:
|
||||
movs r7, 0
|
||||
movs r0, 0xF0
|
||||
ldr r1, [sp, 0xC]
|
||||
ands r0, r1
|
||||
lsls r5, r0, 16
|
||||
_0807C132:
|
||||
movs r2, 0x4
|
||||
ldrsh r0, [r6, r2]
|
||||
ldr r1, _0807C198
|
||||
lsls r2, r7, 2
|
||||
adds r2, r1
|
||||
movs r3, 0
|
||||
ldrsh r1, [r2, r3]
|
||||
adds r0, r1
|
||||
movs r4, 0x6
|
||||
ldrsh r1, [r6, r4]
|
||||
movs r3, 0x2
|
||||
ldrsh r2, [r2, r3]
|
||||
adds r1, r2
|
||||
bl GetMapTileAtPosition
|
||||
ldr r4, [r0, 0x10]
|
||||
cmp r4, 0
|
||||
beq _0807C18E
|
||||
adds r0, r4, 0
|
||||
bl GetEntityType
|
||||
cmp r0, 0x1
|
||||
bne _0807C18E
|
||||
asrs r0, r5, 16
|
||||
cmp r0, 0x10
|
||||
beq _0807C178
|
||||
cmp r0, 0x20
|
||||
beq _0807C178
|
||||
adds r0, r6, 0
|
||||
adds r1, r7, 0
|
||||
bl CanAttackInFront
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C18E
|
||||
_0807C178:
|
||||
mov r0, r10
|
||||
str r0, [sp]
|
||||
ldr r1, [sp, 0x14]
|
||||
str r1, [sp, 0x4]
|
||||
mov r0, r8
|
||||
ldr r1, [sp, 0xC]
|
||||
adds r2, r6, 0
|
||||
adds r3, r4, 0
|
||||
bl WeightMoveIfUsable
|
||||
mov r8, r0
|
||||
_0807C18E:
|
||||
adds r7, 0x1
|
||||
cmp r7, 0x7
|
||||
ble _0807C132
|
||||
b _0807C3F6
|
||||
.align 2, 0
|
||||
_0807C198: .4byte gAdjacentTileOffsets
|
||||
_0807C19C:
|
||||
cmp r0, 0x30
|
||||
bne _0807C1F0
|
||||
movs r5, 0
|
||||
_0807C1A2:
|
||||
ldr r0, _0807C1E8
|
||||
ldr r0, [r0]
|
||||
lsls r1, r5, 2
|
||||
ldr r2, _0807C1EC
|
||||
adds r0, r2
|
||||
adds r0, r1
|
||||
ldr r4, [r0]
|
||||
adds r0, r4, 0
|
||||
bl EntityExists
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C1E0
|
||||
adds r0, r6, 0
|
||||
adds r1, r4, 0
|
||||
bl CanSee
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C1E0
|
||||
mov r3, r10
|
||||
str r3, [sp]
|
||||
ldr r0, [sp, 0x14]
|
||||
str r0, [sp, 0x4]
|
||||
mov r0, r8
|
||||
ldr r1, [sp, 0xC]
|
||||
adds r2, r6, 0
|
||||
adds r3, r4, 0
|
||||
bl WeightMoveIfUsable
|
||||
mov r8, r0
|
||||
_0807C1E0:
|
||||
adds r5, 0x1
|
||||
cmp r5, 0x13
|
||||
ble _0807C1A2
|
||||
b _0807C3F6
|
||||
.align 2, 0
|
||||
_0807C1E8: .4byte gDungeonGlobalData
|
||||
_0807C1EC: .4byte 0x000135cc
|
||||
_0807C1F0:
|
||||
cmp r0, 0x40
|
||||
bne _0807C2A8
|
||||
movs r7, 0
|
||||
ldr r1, _0807C2A4
|
||||
mov r9, r1
|
||||
_0807C1FA:
|
||||
movs r2, 0x4
|
||||
ldrsh r0, [r6, r2]
|
||||
mov r3, r9
|
||||
movs r4, 0
|
||||
ldrsh r1, [r3, r4]
|
||||
adds r0, r1
|
||||
movs r2, 0x6
|
||||
ldrsh r1, [r6, r2]
|
||||
movs r4, 0x2
|
||||
ldrsh r2, [r3, r4]
|
||||
adds r1, r2
|
||||
bl GetMapTileAtPosition
|
||||
adds r4, r0, 0
|
||||
adds r0, r6, 0
|
||||
adds r1, r7, 0
|
||||
bl CanAttackInFront
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C296
|
||||
ldr r5, [r4, 0x10]
|
||||
cmp r5, 0
|
||||
beq _0807C250
|
||||
adds r0, r5, 0
|
||||
bl GetEntityType
|
||||
cmp r0, 0x1
|
||||
bne _0807C250
|
||||
mov r4, r8
|
||||
mov r0, r10
|
||||
str r0, [sp]
|
||||
ldr r1, [sp, 0x14]
|
||||
str r1, [sp, 0x4]
|
||||
adds r0, r4, 0
|
||||
ldr r1, [sp, 0xC]
|
||||
adds r2, r6, 0
|
||||
adds r3, r5, 0
|
||||
bl WeightMoveIfUsable
|
||||
mov r8, r0
|
||||
cmp r4, r8
|
||||
bne _0807C296
|
||||
_0807C250:
|
||||
movs r2, 0x4
|
||||
ldrsh r0, [r6, r2]
|
||||
mov r3, r9
|
||||
movs r4, 0
|
||||
ldrsh r1, [r3, r4]
|
||||
lsls r1, 1
|
||||
adds r0, r1
|
||||
movs r2, 0x6
|
||||
ldrsh r1, [r6, r2]
|
||||
movs r4, 0x2
|
||||
ldrsh r2, [r3, r4]
|
||||
lsls r2, 1
|
||||
adds r1, r2
|
||||
bl GetMapTileAtPosition
|
||||
adds r4, r0, 0
|
||||
ldr r5, [r4, 0x10]
|
||||
cmp r5, 0
|
||||
beq _0807C296
|
||||
adds r0, r5, 0
|
||||
bl GetEntityType
|
||||
cmp r0, 0x1
|
||||
bne _0807C296
|
||||
mov r0, r10
|
||||
str r0, [sp]
|
||||
ldr r1, [sp, 0x14]
|
||||
str r1, [sp, 0x4]
|
||||
mov r0, r8
|
||||
ldr r1, [sp, 0xC]
|
||||
adds r2, r6, 0
|
||||
adds r3, r5, 0
|
||||
bl WeightMoveIfUsable
|
||||
mov r8, r0
|
||||
_0807C296:
|
||||
movs r2, 0x4
|
||||
add r9, r2
|
||||
adds r7, 0x1
|
||||
cmp r7, 0x7
|
||||
ble _0807C1FA
|
||||
b _0807C3F6
|
||||
.align 2, 0
|
||||
_0807C2A4: .4byte gAdjacentTileOffsets
|
||||
_0807C2A8:
|
||||
cmp r0, 0x50
|
||||
beq _0807C2B0
|
||||
cmp r0, 0x80
|
||||
bne _0807C394
|
||||
_0807C2B0:
|
||||
movs r3, 0x1
|
||||
str r3, [sp, 0x18]
|
||||
cmp r0, 0x50
|
||||
bne _0807C2BC
|
||||
movs r4, 0xA
|
||||
str r4, [sp, 0x18]
|
||||
_0807C2BC:
|
||||
movs r0, 0
|
||||
mov r9, r0
|
||||
_0807C2C0:
|
||||
ldr r0, _0807C37C
|
||||
ldr r0, [r0]
|
||||
mov r2, r9
|
||||
lsls r1, r2, 2
|
||||
ldr r3, _0807C380
|
||||
adds r0, r3
|
||||
adds r0, r1
|
||||
ldr r4, [r0]
|
||||
adds r0, r4, 0
|
||||
bl EntityExists
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C370
|
||||
cmp r6, r4
|
||||
beq _0807C370
|
||||
adds r1, r4, 0x4
|
||||
adds r0, r6, 0x4
|
||||
bl CalculateFacingDir
|
||||
adds r5, r0, 0
|
||||
ldr r0, _0807C384
|
||||
adds r7, r5, r0
|
||||
ldrb r0, [r7]
|
||||
cmp r0, 0
|
||||
bne _0807C370
|
||||
adds r0, r6, 0
|
||||
adds r1, r4, 0
|
||||
bl CanSee
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C370
|
||||
adds r0, r6, 0
|
||||
adds r1, r4, 0
|
||||
ldr r2, [sp, 0x18]
|
||||
bl IsTargetInLineRange
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C370
|
||||
ldr r0, [sp, 0x14]
|
||||
str r0, [sp]
|
||||
ldr r0, [sp, 0xC]
|
||||
adds r1, r6, 0
|
||||
adds r2, r4, 0
|
||||
mov r3, r10
|
||||
bl CanUseStatusMove
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C370
|
||||
adds r0, r6, 0
|
||||
adds r1, r4, 0
|
||||
adds r2, r5, 0
|
||||
ldr r3, [sp, 0x18]
|
||||
bl IsTargetStraightAhead
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C370
|
||||
movs r0, 0x1
|
||||
strb r0, [r7]
|
||||
ldr r0, _0807C388
|
||||
add r0, r8
|
||||
strb r5, [r0]
|
||||
adds r0, r6, 0
|
||||
mov r1, r10
|
||||
bl GetMoveTypeForPokemon
|
||||
adds r3, r0, 0
|
||||
lsls r3, 24
|
||||
lsrs r3, 24
|
||||
adds r0, r6, 0
|
||||
ldr r1, [sp, 0xC]
|
||||
adds r2, r4, 0
|
||||
bl WeightMove
|
||||
ldr r1, _0807C38C
|
||||
mov r3, r8
|
||||
lsls r2, r3, 2
|
||||
adds r1, r2, r1
|
||||
str r0, [r1]
|
||||
ldr r0, _0807C390
|
||||
adds r2, r0
|
||||
str r4, [r2]
|
||||
movs r4, 0x1
|
||||
add r8, r4
|
||||
_0807C370:
|
||||
movs r0, 0x1
|
||||
add r9, r0
|
||||
mov r1, r9
|
||||
cmp r1, 0x13
|
||||
ble _0807C2C0
|
||||
b _0807C3F6
|
||||
.align 2, 0
|
||||
_0807C37C: .4byte gDungeonGlobalData
|
||||
_0807C380: .4byte 0x000135cc
|
||||
_0807C384: .4byte gCanAttackInDirection
|
||||
_0807C388: .4byte gUnknown_202F388
|
||||
_0807C38C: .4byte gPotentialTargetWeights_2
|
||||
_0807C390: .4byte gUnknown_202F3B0
|
||||
_0807C394:
|
||||
cmp r0, 0x60
|
||||
bne _0807C3DC
|
||||
movs r5, 0
|
||||
_0807C39A:
|
||||
ldr r0, _0807C3D4
|
||||
ldr r0, [r0]
|
||||
lsls r1, r5, 2
|
||||
ldr r2, _0807C3D8
|
||||
adds r0, r2
|
||||
adds r0, r1
|
||||
ldr r4, [r0]
|
||||
adds r0, r4, 0
|
||||
bl EntityExists
|
||||
lsls r0, 24
|
||||
cmp r0, 0
|
||||
beq _0807C3CA
|
||||
mov r3, r10
|
||||
str r3, [sp]
|
||||
ldr r0, [sp, 0x14]
|
||||
str r0, [sp, 0x4]
|
||||
mov r0, r8
|
||||
ldr r1, [sp, 0xC]
|
||||
adds r2, r6, 0
|
||||
adds r3, r4, 0
|
||||
bl WeightMoveIfUsable
|
||||
mov r8, r0
|
||||
_0807C3CA:
|
||||
adds r5, 0x1
|
||||
cmp r5, 0x13
|
||||
ble _0807C39A
|
||||
b _0807C3F6
|
||||
.align 2, 0
|
||||
_0807C3D4: .4byte gDungeonGlobalData
|
||||
_0807C3D8: .4byte 0x000135cc
|
||||
_0807C3DC:
|
||||
cmp r0, 0x70
|
||||
bne _0807C3F6
|
||||
mov r1, r10
|
||||
str r1, [sp]
|
||||
ldr r2, [sp, 0x14]
|
||||
str r2, [sp, 0x4]
|
||||
mov r0, r8
|
||||
ldr r1, [sp, 0xC]
|
||||
adds r2, r6, 0
|
||||
adds r3, r6, 0
|
||||
bl WeightMoveIfUsable
|
||||
mov r8, r0
|
||||
_0807C3F6:
|
||||
mov r3, r8
|
||||
cmp r3, 0
|
||||
bne _0807C402
|
||||
ldr r4, [sp, 0x8]
|
||||
strb r3, [r4]
|
||||
b _0807C48A
|
||||
_0807C402:
|
||||
movs r4, 0
|
||||
movs r3, 0
|
||||
mov r0, r8
|
||||
cmp r0, 0
|
||||
ble _0807C420
|
||||
ldr r2, _0807C464
|
||||
mov r1, r8
|
||||
_0807C410:
|
||||
ldr r0, [r2]
|
||||
cmp r3, r0
|
||||
bge _0807C418
|
||||
adds r3, r0, 0
|
||||
_0807C418:
|
||||
adds r2, 0x4
|
||||
subs r1, 0x1
|
||||
cmp r1, 0
|
||||
bne _0807C410
|
||||
_0807C420:
|
||||
mov r1, r8
|
||||
cmp r1, 0
|
||||
ble _0807C43A
|
||||
movs r5, 0
|
||||
ldr r2, _0807C464
|
||||
_0807C42A:
|
||||
ldr r0, [r2]
|
||||
cmp r3, r0
|
||||
beq _0807C432
|
||||
str r5, [r2]
|
||||
_0807C432:
|
||||
adds r2, 0x4
|
||||
subs r1, 0x1
|
||||
cmp r1, 0
|
||||
bne _0807C42A
|
||||
_0807C43A:
|
||||
str r3, [sp, 0x10]
|
||||
mov r2, r8
|
||||
cmp r2, 0
|
||||
ble _0807C450
|
||||
ldr r2, _0807C464
|
||||
mov r1, r8
|
||||
_0807C446:
|
||||
ldm r2!, {r0}
|
||||
adds r4, r0
|
||||
subs r1, 0x1
|
||||
cmp r1, 0
|
||||
bne _0807C446
|
||||
_0807C450:
|
||||
adds r0, r4, 0
|
||||
bl DungeonRandomCapped
|
||||
adds r2, r0, 0
|
||||
movs r1, 0
|
||||
cmp r1, r8
|
||||
bge _0807C478
|
||||
ldr r3, _0807C464
|
||||
b _0807C470
|
||||
.align 2, 0
|
||||
_0807C464: .4byte gPotentialTargetWeights_2
|
||||
_0807C468:
|
||||
adds r3, 0x4
|
||||
adds r1, 0x1
|
||||
cmp r1, r8
|
||||
bge _0807C478
|
||||
_0807C470:
|
||||
ldr r0, [r3]
|
||||
subs r2, r0
|
||||
cmp r2, 0
|
||||
bge _0807C468
|
||||
_0807C478:
|
||||
movs r0, 0x1
|
||||
ldr r3, [sp, 0x8]
|
||||
strb r0, [r3]
|
||||
ldr r0, _0807C49C
|
||||
adds r0, r1, r0
|
||||
ldrb r0, [r0]
|
||||
strb r0, [r3, 0x1]
|
||||
movs r0, 0x8
|
||||
str r0, [r3, 0x4]
|
||||
_0807C48A:
|
||||
ldr r0, [sp, 0x10]
|
||||
_0807C48C:
|
||||
add sp, 0x1C
|
||||
pop {r3-r5}
|
||||
mov r8, r3
|
||||
mov r9, r4
|
||||
mov r10, r5
|
||||
pop {r4-r7}
|
||||
pop {r1}
|
||||
bx r1
|
||||
.align 2, 0
|
||||
_0807C49C: .4byte gUnknown_202F388
|
||||
thumb_func_end FindMoveTarget
|
||||
|
||||
thumb_func_start IsTargetInLineRange
|
||||
IsTargetInLineRange:
|
||||
push {r4-r7,lr}
|
||||
|
|
@ -783,9 +228,9 @@ _0807C624:
|
|||
bx r1
|
||||
.align 2, 0
|
||||
_0807C638: .4byte gCanAttackInDirection
|
||||
_0807C63C: .4byte gUnknown_202F388
|
||||
_0807C63C: .4byte gPotentialAttackTargetDirections
|
||||
_0807C640: .4byte gPotentialTargetWeights_2
|
||||
_0807C644: .4byte gUnknown_202F3B0
|
||||
_0807C644: .4byte gPotentialTargets
|
||||
thumb_func_end WeightMoveIfUsable
|
||||
|
||||
thumb_func_start CanUseStatusMove
|
||||
|
|
@ -3,7 +3,16 @@
|
|||
|
||||
#include "dungeon_entity.h"
|
||||
|
||||
struct MoveTargetResults
|
||||
{
|
||||
bool8 moveUsable;
|
||||
u8 targetDir;
|
||||
s32 moveWeight;
|
||||
};
|
||||
|
||||
// 0x7BB94
|
||||
void DecideAttack(struct DungeonEntity *pokemon);
|
||||
// 0x7C04C
|
||||
s32 FindMoveTarget(struct MoveTargetResults *moveTargetResults, struct DungeonEntity *pokemon, struct PokemonMove *move);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ struct MapTile
|
|||
u8 unk8;
|
||||
/* 0x9 */ u8 roomIndex;
|
||||
// Bitwise flags for whether Pokémon can move to an adjacent tile. Bits correspond to directions in direction.h.
|
||||
// Different sets of flags are used for Pokémon that can cross special terrain, corresponding to Cthe rossableTerrain enum.
|
||||
// Different sets of flags are used for Pokémon that can cross special terrain, corresponding to the CrossableTerrain enum.
|
||||
/* 0xA */ u8 canMoveAdjacent[NUM_CROSSABLE_TERRAIN];
|
||||
u8 fillE[0x10 - 0xE];
|
||||
/* 0x10 */ struct DungeonEntity *pokemon; // Pokémon on the tile.
|
||||
|
|
|
|||
|
|
@ -9,5 +9,7 @@ void InitPokemonMove(struct PokemonMove *move, u16 moveID);
|
|||
u8 GetMoveWeight(struct PokemonMove *move);
|
||||
// 0x92BF4
|
||||
u32 GetMoveMaxPP(struct PokemonMove *move);
|
||||
// 0x92C54
|
||||
bool8 GetMoveDealsDirectDamage(struct PokemonMove *move);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -234,7 +234,7 @@ SECTIONS {
|
|||
src/dungeon_ai_movement.o(.text);
|
||||
asm/code_8075BA4.o(.text);
|
||||
src/dungeon_ai_attack.o(.text);
|
||||
asm/code_807C04C.o(.text);
|
||||
asm/code_807C4A0.o(.text);
|
||||
src/dungeon_ai_attack_1.o(.text);
|
||||
asm/code_807CABC.o(.text);
|
||||
src/dungeon_range.o(.text);
|
||||
|
|
|
|||
|
|
@ -11,12 +11,18 @@
|
|||
#include "charge_move.h"
|
||||
#include "dungeon_action.h"
|
||||
#include "dungeon_ai.h"
|
||||
#include "dungeon_ai_attack_1.h"
|
||||
#include "dungeon_capabilities_1.h"
|
||||
#include "dungeon_global_data.h"
|
||||
#include "dungeon_map_access.h"
|
||||
#include "dungeon_pokemon_attributes.h"
|
||||
#include "dungeon_pokemon_attributes_1.h"
|
||||
#include "dungeon_random.h"
|
||||
#include "dungeon_random_1.h"
|
||||
#include "dungeon_util.h"
|
||||
#include "dungeon_visibility.h"
|
||||
#include "moves.h"
|
||||
#include "position_util.h"
|
||||
#include "status_checks.h"
|
||||
#include "targeting.h"
|
||||
|
||||
|
|
@ -24,16 +30,21 @@
|
|||
|
||||
const s16 gRegularAttackWeights[] = {100, 20, 30, 40, 50};
|
||||
|
||||
struct MoveTargetResults
|
||||
{
|
||||
bool8 moveUsable;
|
||||
u8 targetDir;
|
||||
s32 moveWeight;
|
||||
};
|
||||
extern bool8 gCanAttackInDirection[NUM_DIRECTIONS];
|
||||
extern s32 gNumPotentialTargets;
|
||||
extern s32 gPotentialTargetWeights_2[NUM_DIRECTIONS];
|
||||
extern u8 gPotentialAttackTargetDirections[NUM_DIRECTIONS];
|
||||
extern struct DungeonEntity *gPotentialTargets[NUM_DIRECTIONS];
|
||||
|
||||
extern s32 FindMoveTarget(struct MoveTargetResults*, struct DungeonEntity*, struct PokemonMove*);
|
||||
extern bool8 IsMoveUsable(struct DungeonEntity*, s32, bool8);
|
||||
extern bool8 TargetRegularAttack(struct DungeonEntity*, u32*, bool8);
|
||||
extern s16 GetTargetingFlags(struct DungeonEntity*, struct PokemonMove*, bool8);
|
||||
extern bool8 CanUseWithStatusChecker(struct DungeonEntity*, struct PokemonMove*);
|
||||
extern bool8 CanAttackInFront(struct DungeonEntity*, s32);
|
||||
extern s32 WeightMoveIfUsable(s32, s32, struct DungeonEntity*, struct DungeonEntity*, struct PokemonMove*, bool8);
|
||||
extern bool8 IsTargetInLineRange(struct DungeonEntity*, struct DungeonEntity*, s32);
|
||||
extern bool8 CanUseStatusMove(s32, struct DungeonEntity*, struct DungeonEntity*, struct PokemonMove*, bool8);
|
||||
extern s32 WeightMove(struct DungeonEntity*, s32, struct DungeonEntity*, u8);
|
||||
|
||||
void DecideAttack(struct DungeonEntity *pokemon)
|
||||
{
|
||||
|
|
@ -320,3 +331,197 @@ void DecideAttack(struct DungeonEntity *pokemon)
|
|||
TargetTileInFront(pokemon);
|
||||
}
|
||||
}
|
||||
|
||||
s32 FindMoveTarget(struct MoveTargetResults *moveTargetResults, struct DungeonEntity *pokemon, struct PokemonMove *move)
|
||||
{
|
||||
s32 targetingFlags;
|
||||
s32 moveWeight = 1;
|
||||
struct DungeonEntityData *pokemonData = pokemon->entityData;
|
||||
s32 numPotentialTargets = 0;
|
||||
s32 i;
|
||||
bool8 hasStatusChecker;
|
||||
s32 rangeTargetingFlags;
|
||||
s32 rangeTargetingFlags2;
|
||||
for (i = 0; i < NUM_DIRECTIONS; i++)
|
||||
{
|
||||
gCanAttackInDirection[i] = FALSE;
|
||||
}
|
||||
targetingFlags = GetTargetingFlags(pokemon, move, TRUE);
|
||||
hasStatusChecker = HasIQSkill(pokemon, IQ_SKILL_STATUS_CHECKER);
|
||||
moveTargetResults->moveUsable = FALSE;
|
||||
if ((pokemonData->volatileStatus == VOLATILE_STATUS_TAUNTED && !GetMoveDealsDirectDamage(move)) ||
|
||||
(hasStatusChecker && !CanUseWithStatusChecker(pokemon, move)))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
rangeTargetingFlags = targetingFlags & 0xF0;
|
||||
if (rangeTargetingFlags == TARGETING_FLAG_TARGET_OTHER ||
|
||||
rangeTargetingFlags == TARGETING_FLAG_TARGET_FRONTAL_CONE ||
|
||||
rangeTargetingFlags == TARGETING_FLAG_TARGET_AROUND)
|
||||
{
|
||||
if (pokemonData->eyesightStatus == EYESIGHT_STATUS_BLINKER)
|
||||
{
|
||||
u8 facingDir = pokemonData->action.facingDir;
|
||||
i = facingDir; // Fixes a regswap.
|
||||
if (!gCanAttackInDirection[i])
|
||||
{
|
||||
gCanAttackInDirection[i] = TRUE;
|
||||
gPotentialAttackTargetDirections[numPotentialTargets] = i;
|
||||
gPotentialTargetWeights_2[numPotentialTargets] = 99;
|
||||
gPotentialTargets[numPotentialTargets] = NULL;
|
||||
numPotentialTargets++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < NUM_DIRECTIONS; i++)
|
||||
{
|
||||
// Double assignment to fix a regswap.
|
||||
s16 rangeTargetingFlags = rangeTargetingFlags2 = targetingFlags & 0xF0;
|
||||
struct MapTile *adjacentTile = GetMapTileAtPosition(pokemon->posWorld.x + gAdjacentTileOffsets[i].x,
|
||||
pokemon->posWorld.y + gAdjacentTileOffsets[i].y);
|
||||
struct DungeonEntity *adjacentPokemon = adjacentTile->pokemon;
|
||||
if (adjacentPokemon != NULL && GetEntityType(adjacentPokemon) == ENTITY_POKEMON)
|
||||
{
|
||||
if (rangeTargetingFlags != TARGETING_FLAG_TARGET_FRONTAL_CONE &&
|
||||
rangeTargetingFlags != TARGETING_FLAG_TARGET_AROUND)
|
||||
{
|
||||
if (!CanAttackInFront(pokemon, i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, adjacentPokemon, move, hasStatusChecker);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (rangeTargetingFlags == TARGETING_FLAG_TARGET_ROOM)
|
||||
{
|
||||
s32 i;
|
||||
for (i = 0; i < DUNGEON_MAX_POKEMON; i++)
|
||||
{
|
||||
struct DungeonEntity *target = gDungeonGlobalData->allPokemon[i];
|
||||
if (EntityExists(target) && CanSee(pokemon, target))
|
||||
{
|
||||
numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, target, move, hasStatusChecker);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (rangeTargetingFlags == TARGETING_FLAG_TARGET_2_TILES_AHEAD)
|
||||
{
|
||||
for (i = 0; i < NUM_DIRECTIONS; i++)
|
||||
{
|
||||
struct MapTile *targetTile = GetMapTileAtPosition(pokemon->posWorld.x + gAdjacentTileOffsets[i].x,
|
||||
pokemon->posWorld.y + gAdjacentTileOffsets[i].y);
|
||||
if (CanAttackInFront(pokemon, i))
|
||||
{
|
||||
struct DungeonEntity *targetPokemon = targetTile->pokemon;
|
||||
if (targetPokemon != NULL && GetEntityType(targetPokemon) == ENTITY_POKEMON)
|
||||
{
|
||||
s32 prevNumPotentialTargets = numPotentialTargets;
|
||||
numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, targetPokemon, move, hasStatusChecker);
|
||||
if (prevNumPotentialTargets != numPotentialTargets)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
targetTile = GetMapTileAtPosition(pokemon->posWorld.x + gAdjacentTileOffsets[i].x * 2,
|
||||
pokemon->posWorld.y + gAdjacentTileOffsets[i].y * 2);
|
||||
targetPokemon = targetTile->pokemon;
|
||||
if (targetPokemon != NULL && GetEntityType(targetPokemon) == ENTITY_POKEMON)
|
||||
{
|
||||
numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, targetPokemon, move, hasStatusChecker);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (rangeTargetingFlags == TARGETING_FLAG_TARGET_LINE || rangeTargetingFlags == TARGETING_FLAG_CUT_CORNERS)
|
||||
{
|
||||
s32 maxRange = 1;
|
||||
s32 i;
|
||||
if (rangeTargetingFlags == TARGETING_FLAG_TARGET_LINE)
|
||||
{
|
||||
maxRange = 10;
|
||||
}
|
||||
for (i = 0; i < DUNGEON_MAX_POKEMON; i++)
|
||||
{
|
||||
struct DungeonEntity *target = gDungeonGlobalData->allPokemon[i];
|
||||
if (EntityExists(target) && pokemon != target)
|
||||
{
|
||||
s32 facingDir = CalculateFacingDir(&pokemon->posWorld, &target->posWorld);
|
||||
if (!gCanAttackInDirection[facingDir] &&
|
||||
CanSee(pokemon, target) &&
|
||||
IsTargetInLineRange(pokemon, target, maxRange) &&
|
||||
CanUseStatusMove(targetingFlags, pokemon, target, move, hasStatusChecker) &&
|
||||
IsTargetStraightAhead(pokemon, target, facingDir, maxRange))
|
||||
{
|
||||
gCanAttackInDirection[facingDir] = TRUE;
|
||||
gPotentialAttackTargetDirections[numPotentialTargets] = facingDir;
|
||||
gPotentialTargetWeights_2[numPotentialTargets] = WeightMove(pokemon, targetingFlags, target, GetMoveTypeForPokemon(pokemon, move));
|
||||
gPotentialTargets[numPotentialTargets] = target;
|
||||
numPotentialTargets++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (rangeTargetingFlags == TARGETING_FLAG_TARGET_FLOOR)
|
||||
{
|
||||
s32 i;
|
||||
for (i = 0; i < DUNGEON_MAX_POKEMON; i++)
|
||||
{
|
||||
struct DungeonEntity *target = gDungeonGlobalData->allPokemon[i];
|
||||
if (EntityExists(target))
|
||||
{
|
||||
numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, target, move, hasStatusChecker);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (rangeTargetingFlags == TARGETING_FLAG_SELF_HEAL)
|
||||
{
|
||||
numPotentialTargets = WeightMoveIfUsable(numPotentialTargets, targetingFlags, pokemon, pokemon, move, hasStatusChecker);
|
||||
}
|
||||
if (numPotentialTargets == 0)
|
||||
{
|
||||
moveTargetResults->moveUsable = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
s32 totalWeight = 0;
|
||||
s32 maxWeight = 0;
|
||||
s32 weightCounter;
|
||||
s32 i;
|
||||
for (i = 0; i < numPotentialTargets; i++)
|
||||
{
|
||||
if (maxWeight < gPotentialTargetWeights_2[i])
|
||||
{
|
||||
maxWeight = gPotentialTargetWeights_2[i];
|
||||
}
|
||||
}
|
||||
for (i = 0; i < numPotentialTargets; i++)
|
||||
{
|
||||
if (maxWeight != gPotentialTargetWeights_2[i])
|
||||
{
|
||||
gPotentialTargetWeights_2[i] = 0;
|
||||
}
|
||||
}
|
||||
moveWeight = maxWeight;
|
||||
for (i = 0; i < numPotentialTargets; i++)
|
||||
{
|
||||
totalWeight += gPotentialTargetWeights_2[i];
|
||||
}
|
||||
weightCounter = DungeonRandomCapped(totalWeight);
|
||||
for (i = 0; i < numPotentialTargets; i++)
|
||||
{
|
||||
weightCounter -= gPotentialTargetWeights_2[i];
|
||||
if (weightCounter < 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
moveTargetResults->moveUsable = TRUE;
|
||||
moveTargetResults->targetDir = gPotentialAttackTargetDirections[i];
|
||||
moveTargetResults->moveWeight = 8;
|
||||
}
|
||||
return moveWeight;
|
||||
}
|
||||
|
|
@ -40,7 +40,7 @@ extern void sub_8077274(struct DungeonEntity *, struct DungeonEntity *);
|
|||
|
||||
extern s32 gNumPotentialTargets;
|
||||
extern u32 gPotentialTargetWeights[NUM_DIRECTIONS];
|
||||
extern u32 gPotentialTargetDirections[NUM_DIRECTIONS];
|
||||
extern u32 gPotentialItemTargetDirections[NUM_DIRECTIONS];
|
||||
extern bool8 gTargetAhead[NUM_DIRECTIONS];
|
||||
extern struct TeamInventory *gTeamInventory_203B460;
|
||||
|
||||
|
|
@ -101,7 +101,7 @@ void DecideUseItem(struct DungeonEntity *pokemon)
|
|||
pokemonData->action.actionUseIndex = selectedToolboxIndex;
|
||||
pokemonData->action.lastItemThrowPosition.x = pokemon->posWorld.x;
|
||||
pokemonData->action.lastItemThrowPosition.y = pokemon->posWorld.y;
|
||||
pokemonData->action.facingDir = gPotentialTargetDirections[targetIndex] & DIRECTION_MASK;
|
||||
pokemonData->action.facingDir = gPotentialItemTargetDirections[targetIndex] & DIRECTION_MASK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -261,7 +261,7 @@ void DecideUseItem(struct DungeonEntity *pokemon)
|
|||
pokemonData->action.actionUseIndex = selectedToolboxIndex;
|
||||
pokemonData->action.lastItemThrowPosition.x = pokemon->posWorld.x;
|
||||
pokemonData->action.lastItemThrowPosition.y = pokemon->posWorld.y;
|
||||
pokemonData->action.facingDir = gPotentialTargetDirections[targetIndex] & DIRECTION_MASK;
|
||||
pokemonData->action.facingDir = gPotentialItemTargetDirections[targetIndex] & DIRECTION_MASK;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
@ -421,7 +421,7 @@ void TargetThrownItem(struct DungeonEntity *pokemon, struct DungeonEntity *targe
|
|||
u32 itemWeight;
|
||||
u32 *targetWeight;
|
||||
gTargetAhead[targetDirection] = TRUE;
|
||||
gPotentialTargetDirections[gNumPotentialTargets] = targetDirection;
|
||||
gPotentialItemTargetDirections[gNumPotentialTargets] = targetDirection;
|
||||
targetWeight = &gPotentialTargetWeights[gNumPotentialTargets];
|
||||
itemWeight = !ignoreRollChance ? EvaluateItem(targetPokemon, item, targetingFlags) : 100;
|
||||
*targetWeight = itemWeight;
|
||||
|
|
|
|||
|
|
@ -271,12 +271,12 @@ u8 GetMoveCriticalHitChance(struct PokemonMove *move)
|
|||
return gMovesData[move->moveID].criticalHitChance;
|
||||
}
|
||||
|
||||
u8 GetMoveCannotHitFrozen(struct PokemonMove *move)
|
||||
bool8 GetMoveCannotHitFrozen(struct PokemonMove *move)
|
||||
{
|
||||
return gMovesData[move->moveID].cannotHitFrozen;
|
||||
}
|
||||
|
||||
u8 GetMoveDealsDirectDamage(struct PokemonMove *move)
|
||||
bool8 GetMoveDealsDirectDamage(struct PokemonMove *move)
|
||||
{
|
||||
return gMovesData[move->moveID].dealsDirectDamage;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -846,7 +846,7 @@ gUnknown_202F32C = .; /* 202F32C */
|
|||
gUnknown_202F32D = .; /* 202F32D */
|
||||
. += 0x3;
|
||||
|
||||
gPotentialTargetDirections = .; /* 202F330 */
|
||||
gPotentialItemTargetDirections = .; /* 202F330 */
|
||||
. += 0x20;
|
||||
|
||||
gTargetAhead = .; /* 202F350 */
|
||||
|
|
@ -861,13 +861,13 @@ gUnknown_202F378 = .; /* 202F378 */
|
|||
gCanAttackInDirection = .; /* 202F380 */
|
||||
. += 0x8;
|
||||
|
||||
gUnknown_202F388 = .; /* 202F388 */
|
||||
gPotentialAttackTargetDirections = .; /* 202F388 */
|
||||
. += 0x8;
|
||||
|
||||
gPotentialTargetWeights_2 = .; /* 202F390 */
|
||||
. += 0x20;
|
||||
|
||||
gUnknown_202F3B0 = .; /* 202F3B0 */
|
||||
gPotentialTargets = .; /* 202F3B0 */
|
||||
. += 0x20;
|
||||
|
||||
gUnknown_202F3D0 = .; /* 202F3D0 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user