summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/code_807C4A0.s (renamed from asm/code_807C04C.s)559
-rw-r--r--include/dungeon_ai_attack.h9
-rw-r--r--include/map.h2
-rw-r--r--include/moves.h2
-rwxr-xr-xld_script.txt2
-rw-r--r--src/dungeon_ai_attack.c219
-rw-r--r--src/dungeon_ai_items.c8
-rw-r--r--src/moves.c4
-rw-r--r--sym_ewram.txt6
9 files changed, 236 insertions, 575 deletions
diff --git a/asm/code_807C04C.s b/asm/code_807C4A0.s
index 80e75af..ef16f46 100644
--- a/asm/code_807C04C.s
+++ b/asm/code_807C4A0.s
@@ -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
diff --git a/include/dungeon_ai_attack.h b/include/dungeon_ai_attack.h
index 77b53fc..1878889 100644
--- a/include/dungeon_ai_attack.h
+++ b/include/dungeon_ai_attack.h
@@ -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
diff --git a/include/map.h b/include/map.h
index 9122f00..3601a14 100644
--- a/include/map.h
+++ b/include/map.h
@@ -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.
diff --git a/include/moves.h b/include/moves.h
index 847f167..c86f986 100644
--- a/include/moves.h
+++ b/include/moves.h
@@ -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
diff --git a/ld_script.txt b/ld_script.txt
index 714e0d4..1e4693f 100755
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -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);
diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c
index 416d4da..5667d75 100644
--- a/src/dungeon_ai_attack.c
+++ b/src/dungeon_ai_attack.c
@@ -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;
+} \ No newline at end of file
diff --git a/src/dungeon_ai_items.c b/src/dungeon_ai_items.c
index 2b1bb71..5e60708 100644
--- a/src/dungeon_ai_items.c
+++ b/src/dungeon_ai_items.c
@@ -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;
diff --git a/src/moves.c b/src/moves.c
index 54927d8..2a0703b 100644
--- a/src/moves.c
+++ b/src/moves.c
@@ -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;
}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index d9b257e..bacec19 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -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 */