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