mirror of
https://github.com/pret/pmd-red.git
synced 2026-07-09 21:56:06 -05:00
105 lines
2.6 KiB
C
105 lines
2.6 KiB
C
#include "global.h"
|
|
#include "move_util.h"
|
|
|
|
#include "constants/ability.h"
|
|
#include "constants/move_id.h"
|
|
#include "constants/status.h"
|
|
#include "moves.h"
|
|
#include "dungeon_util.h"
|
|
#include "dungeon_pokemon_attributes.h"
|
|
#include "dungeon_random.h"
|
|
|
|
bool8 sub_8057308(struct DungeonEntity *pokemon, s32 chance)
|
|
{
|
|
if(!EntityExists(pokemon))
|
|
return FALSE;
|
|
if(chance == 0)
|
|
return TRUE;
|
|
if(HasAbility(pokemon, ABILITY_SERENE_GRACE))
|
|
return RollPercentChance_2(chance * 2);
|
|
else
|
|
return RollPercentChance_2(chance);
|
|
}
|
|
|
|
bool8 IsMoveIndexUsable(struct DungeonEntity *pokemon, s32 moveIndex, bool8 hasPPChecker)
|
|
{
|
|
struct DungeonEntityData *pokemonData = pokemon->entityData;
|
|
struct PokemonMove *move = &pokemonData->moves[moveIndex];
|
|
s32 i;
|
|
if (!(move->moveFlags & MOVE_FLAG_EXISTS))
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (move->moveFlags & MOVE_FLAG_LINKED)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (move->moveFlags & MOVE_FLAG_DISABLED ||
|
|
move->moveFlags2 & MOVE_FLAG_SEALED)
|
|
{
|
|
return FALSE;
|
|
}
|
|
goto initMoveIndex;
|
|
returnTrue:
|
|
return TRUE;
|
|
initMoveIndex:
|
|
i = 0;
|
|
goto checkMoveUsable;
|
|
incMoveIndex:
|
|
i++;
|
|
checkMoveUsable:
|
|
if (i >= MAX_MON_MOVES)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (IsMoveUsable(pokemon, move, hasPPChecker))
|
|
{
|
|
goto returnTrue;
|
|
}
|
|
move++;
|
|
if ((u32) move >= (u32) &pokemonData->struggleMoveFlags || !(move->moveFlags & MOVE_FLAG_LINKED))
|
|
{
|
|
return FALSE;
|
|
}
|
|
goto incMoveIndex;
|
|
}
|
|
|
|
bool8 IsMoveUsable(struct DungeonEntity *pokemon, struct PokemonMove *move, bool8 hasPPChecker)
|
|
{
|
|
struct DungeonEntityData *pokemonData = pokemon->entityData;
|
|
if (move->moveID == MOVE_REGULAR_ATTACK)
|
|
{
|
|
return TRUE;
|
|
}
|
|
if (move->moveFlags & MOVE_FLAG_DISABLED || move->moveFlags2 & MOVE_FLAG_SEALED)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (hasPPChecker)
|
|
{
|
|
if (move->PP == 0)
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (pokemonData->volatileStatus == VOLATILE_STATUS_TAUNTED && !MoveDealsDirectDamage(move))
|
|
{
|
|
return FALSE;
|
|
}
|
|
if (pokemonData->volatileStatus == VOLATILE_STATUS_ENCORE)
|
|
{
|
|
if (move->moveID == MOVE_STRUGGLE)
|
|
{
|
|
if (!(pokemonData->struggleMoveFlags & MOVE_FLAG_LAST_USED))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
else if (!(move->moveFlags & MOVE_FLAG_LAST_USED))
|
|
{
|
|
return FALSE;
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|