diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/code_80521D0_1.c | 4 | ||||
-rw-r--r-- | src/dungeon_ai_attack.c | 77 | ||||
-rw-r--r-- | src/dungeon_ai_items.c | 2 | ||||
-rw-r--r-- | src/dungeon_movement.c | 4 |
4 files changed, 82 insertions, 5 deletions
diff --git a/src/code_80521D0_1.c b/src/code_80521D0_1.c index ac9ebef..2b23a14 100644 --- a/src/code_80521D0_1.c +++ b/src/code_80521D0_1.c @@ -208,7 +208,7 @@ void sub_808BCE4(void) struct MapTile *puVar1; puVar1 = GetMapEntity(gDungeonGlobalData->unkE23C, gDungeonGlobalData->unkE23E); - puVar1->tileType &= ~(TILE_TYPE_FLOOR | TILE_TYPE_UNK_1); + puVar1->tileType &= ~(TILE_TYPE_FLOOR | TILE_TYPE_LIQUID); puVar1->tileType |= TILE_TYPE_MAP_EDGE; puVar1->tileType &= ~TILE_TYPE_STAIRS; sub_8049884(); @@ -222,7 +222,7 @@ void sub_808BD38(void) struct MapTile *puVar1; puVar1 = GetMapEntity(gDungeonGlobalData->unkE23C, gDungeonGlobalData->unkE23E); - puVar1->tileType &= ~(TILE_TYPE_FLOOR | TILE_TYPE_UNK_1); + puVar1->tileType &= ~(TILE_TYPE_FLOOR | TILE_TYPE_LIQUID); puVar1->tileType |= TILE_TYPE_FLOOR; puVar1->tileType &= ~TILE_TYPE_MAP_EDGE; puVar1->tileType |= TILE_TYPE_STAIRS; diff --git a/src/dungeon_ai_attack.c b/src/dungeon_ai_attack.c new file mode 100644 index 0000000..48ccdfe --- /dev/null +++ b/src/dungeon_ai_attack.c @@ -0,0 +1,77 @@ +#include "global.h" +#include "dungeon_ai_attack.h" + +#include "constants/iq_skill.h" +#include "dungeon_global_data.h" +#include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes_1.h" + +extern struct Position gAdjacentTileOffsets[8]; + +bool8 IsTargetStraightAhead(struct DungeonEntity *pokemon, struct DungeonEntity *targetPokemon, s32 facingDir, s32 maxRange) +{ + s32 posDiffX = pokemon->posWorld.x - targetPokemon->posWorld.x; + s32 effectiveMaxRange; + if (posDiffX < 0) + { + posDiffX = -posDiffX; + } + effectiveMaxRange = pokemon->posWorld.y - targetPokemon->posWorld.y; + if (effectiveMaxRange < 0) + { + effectiveMaxRange = -effectiveMaxRange; + } + if (effectiveMaxRange < posDiffX) + { + effectiveMaxRange = posDiffX; + } + if (effectiveMaxRange > maxRange) + { + effectiveMaxRange = maxRange; + } + if (!HasIQSkill(pokemon, IQ_SKILL_COURSE_CHECKER)) + { + // BUG: effectiveMaxRange is already capped at maxRange, so this condition always evaluates to TRUE. + // The AI also has range checks elsewhere, so this doesn't become an issue in most cases. + // If the AI has the Long Toss or Pierce statuses and Course Checker is disabled, + // this incorrect check causes the AI to throw items at targets further than 10 tiles away. + if (effectiveMaxRange <= maxRange) + { + return TRUE; + } + } + else + { + s32 currentPosX = pokemon->posWorld.x; + s32 currentPosY = pokemon->posWorld.y; + s32 adjacentTileOffsetX = gAdjacentTileOffsets[facingDir].x; + s32 adjacentTileOffsetY = gAdjacentTileOffsets[facingDir].y; + s32 i; + for (i = 0; i <= effectiveMaxRange; i++) + { + struct MapTile *mapTile; + currentPosX += adjacentTileOffsetX; + currentPosY += adjacentTileOffsetY; + if (currentPosX <= 0 || currentPosY <= 0 || + currentPosX >= DUNGEON_MAX_SIZE_X - 1 || currentPosY >= DUNGEON_MAX_SIZE_Y - 1) + { + break; + } + while (0); // Extra label needed to swap branch locations in ASM. + mapTile = GetMapTileAtPosition(currentPosX, currentPosY); + if (!(mapTile->tileType & (TILE_TYPE_FLOOR | TILE_TYPE_LIQUID))) + { + break; + } + if (mapTile->pokemon == targetPokemon) + { + return TRUE; + } + if (mapTile->pokemon != NULL) + { + break; + } + } + } + return FALSE; +} diff --git a/src/dungeon_ai_items.c b/src/dungeon_ai_items.c index e0202ee..56e4447 100644 --- a/src/dungeon_ai_items.c +++ b/src/dungeon_ai_items.c @@ -7,6 +7,7 @@ #include "constants/targeting.h" #include "dungeon_action.h" #include "dungeon_ai_1.h" +#include "dungeon_ai_attack.h" #include "dungeon_ai_items.h" #include "dungeon_capabilities.h" #include "dungeon_capabilities_1.h" @@ -36,7 +37,6 @@ enum ItemTargetFlag extern s32 CalculateFacingDir(struct Position*, struct Position*); extern u32 EvaluateItem(struct DungeonEntity*, struct ItemSlot*, u32); extern void sub_8077274(struct DungeonEntity *, struct DungeonEntity *); -extern bool8 IsTargetStraightAhead(struct DungeonEntity*, struct DungeonEntity*, s32, s32); extern s32 gNumPotentialTargets; extern u32 gPotentialTargetWeights[NUM_DIRECTIONS]; diff --git a/src/dungeon_movement.c b/src/dungeon_movement.c index 1601cff..bcf6163 100644 --- a/src/dungeon_movement.c +++ b/src/dungeon_movement.c @@ -51,7 +51,7 @@ u32 sub_8075818(struct DungeonEntity *entity) { tile = GetMapEntityForDungeonEntity(entity); if(HasIQSkill(entity, IQ_SKILL_SUPER_MOBILE)) - if(!(tile->tileType & (TILE_TYPE_FLOOR | TILE_TYPE_UNK_1))) + if(!(tile->tileType & (TILE_TYPE_FLOOR | TILE_TYPE_LIQUID))) return 1; subEntity = tile->mapObject; if(subEntity != NULL) @@ -95,7 +95,7 @@ flag_check: { if(!(entityData->heldItem.itemFlags & ITEM_FLAG_EXISTS)) { - if(!(tile->tileType & (TILE_TYPE_FLOOR | TILE_TYPE_UNK_1))) + if(!(tile->tileType & (TILE_TYPE_FLOOR | TILE_TYPE_LIQUID))) { if(entityData->isEnemy) break; |