ff_i_feat
Feat functions.
Helpers to iterate and inspect feats on a creature.
-
void RemoveFeat(object oPC, int nFeatToRemove)
- Parameters:
oPC – PC
nFeatToRemove – A FEAT_* to remove
Remove the feat from PC, and remove it from level granted.
-
int GetArmorFeat(object oArmor)
- Parameters:
oArmor – Item to check
- Returns:
0 on error (not an armor nor shield), otherwise FEAT_SHIELD_PROFICIENCY or FEAT_ARMOR_PROFICIENCY_*
Returns a return FEAT_* depending on the armor or shield passed.
Source code
// @code
#include "ff_i_item"
#include "nwnx_creature"
// -----------------------------------------------------------------------------
//! @brief Remove the feat from PC, and remove it from level granted.
//! @param oPC PC
//! @param nFeatToRemove A `FEAT_*` to remove
void RemoveFeat(object oPC, int nFeatToRemove);
void RemoveFeat(object oPC, int nFeatToRemove)
{
int nFeats = NWNX_Creature_GetFeatCount(oPC);
while (nFeats > 0)
{
int nFeat = NWNX_Creature_GetFeatByIndex(oPC, nFeats - 1);
if (nFeat == nFeatToRemove)
{
int nLevel = NWNX_Creature_GetFeatGrantLevel(oPC, nFeat);
if (nLevel > 0)
NWNX_Creature_RemoveFeatByLevel(oPC, nFeat, nLevel);
NWNX_Creature_RemoveFeat(oPC, nFeat);
}
nFeats--;
}
}
// -----------------------------------------------------------------------------
//! @brief Returns a return FEAT_* depending on the armor or shield passed.
//! @param oArmor Item to check
//! @return 0 on error (not an armor nor shield), otherwise FEAT_SHIELD_PROFICIENCY or FEAT_ARMOR_PROFICIENCY_*
int GetArmorFeat(object oArmor);
int GetArmorFeat(object oArmor)
{
int nBaseType = GetBaseItemType(oArmor);
switch (nBaseType)
{
case BASE_ITEM_ARMOR: break;
case BASE_ITEM_SMALLSHIELD:
case BASE_ITEM_LARGESHIELD:
case BASE_ITEM_TOWERSHIELD: return FEAT_SHIELD_PROFICIENCY;
default:
return 0;
}
int nAC = GetItemBaseAC(oArmor);
if (nAC >= 6)
return FEAT_ARMOR_PROFICIENCY_HEAVY;
if (nAC >= 4)
return FEAT_ARMOR_PROFICIENCY_MEDIUM;
if (nAC >= 1)
return FEAT_ARMOR_PROFICIENCY_LIGHT;
return 0;
}