Decomped FindMoveTarget()

This commit is contained in:
AnonymousRandomPerson 2022-02-13 22:02:17 -05:00
parent 9939c543ce
commit a02346be01
9 changed files with 236 additions and 575 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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