// Metabreath Feats - Not implemented yet. 
/** const int FEAT_CLINGING_BREATH         = 5000;
const int FEAT_LINGERING_BREATH        = 5001;
const int FEAT_ENLARGE_BREATH          = 5002;
const int FEAT_HEIGHTEN_BREATH         = 5003;
const int FEAT_MAXIMIZE_BREATH         = 5004;
const int FEAT_QUICKEN_BREATH          = 5005;
const int FEAT_RECOVER_BREATH          = 5006;
const int FEAT_SHAPE_BREATH            = 5007;
const int FEAT_SPLIT_BREATH            = 5008;
const int FEAT_SPREADING_BREATH        = 5009;
const int FEAT_EXTEND_SPREADING_BREATH = 5010;
const int FEAT_TEMPEST_BREATH          = 5011; **/

// Dragon Shaman Aura flag
//const int DRAGON_SHAMAN_AURA_ACTIVE    = 5000;

#include "prc_inc_nwscript"

int GetIsDragonblooded(object oPC);

// returns the damage type of dragon that the PC has a totem for. Checks for the presence of the
// various feats that are present indicating such. This is necessary for determining the type
// of breath weapon and the type of damage immunity.
int GetDragonDamageType(int nTotem);

// Used to create a flag on the caster and store the Aura currently being run.
//int StartDragonShamanAura(object oCaster, int nSpellId);

// Resets the available ToV points; for use after rest or on enter.
void ResetTouchOfVitality(object oPC);

// Applies any metabreath feats that the dragon shaman may have to his breathweapon
//int ApplyMetaBreathFeatMods( int nDuration, object oCaster );

int GetIsDragonblooded(object oPC)
{
    int nRace = GetRacialType(oPC);
    if(nRace == RACIAL_TYPE_KOBOLD
    || nRace == RACIAL_TYPE_SPELLSCALE
    || nRace == RACIAL_TYPE_DRAGONBORN
    || nRace == RACIAL_TYPE_STONEHUNTER_GNOME
    || nRace == RACIAL_TYPE_SILVERBROW_HUMAN
    || nRace == RACIAL_TYPE_FORESTLORD_ELF
    || nRace == RACIAL_TYPE_FIREBLOOD_DWARF
    || nRace == RACIAL_TYPE_GLIMMERSKIN_HALFING
    || nRace == RACIAL_TYPE_FROSTBLOOD_ORC
    || nRace == RACIAL_TYPE_SUNSCORCH_HOBGOBLIN
    || nRace == RACIAL_TYPE_VILETOOTH_LIZARDFOLK)
        return TRUE;

    if(GetLevelByClass(CLASS_TYPE_DRAGON_DISCIPLE, oPC) > 9)
        return TRUE;

    if(GetHasFeat(FEAT_DRAGONTOUCHED, oPC)
    || GetHasFeat(FEAT_DRACONIC_DEVOTEE, oPC)
    || GetHasFeat(FEAT_DRAGON, oPC)
    || GetHasFeat(DRAGON_BLOODED, oPC))
        return TRUE;

    //Draconic Heritage qualifies for dragonblood
    if(GetHasFeat(FEAT_DRACONIC_HERITAGE_BK, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_BL, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_GR, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_RD, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_WH, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_AM, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_CR, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_EM, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_SA, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_TP, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_BS, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_BZ, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_CP, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_GD, oPC)
    || GetHasFeat(FEAT_DRACONIC_HERITAGE_SR, oPC))
        return TRUE;

    return FALSE;
}

int GetDragonDamageType(int nTotem)
{
    int nDamageType = nTotem == FEAT_DRAGONSHAMAN_BLACK  ? DAMAGE_TYPE_ACID:
                      nTotem == FEAT_DRAGONSHAMAN_BLUE   ? DAMAGE_TYPE_ELECTRICAL:
                      nTotem == FEAT_DRAGONSHAMAN_BRASS  ? DAMAGE_TYPE_FIRE:
                      nTotem == FEAT_DRAGONSHAMAN_BRONZE ? DAMAGE_TYPE_ELECTRICAL:
                      nTotem == FEAT_DRAGONSHAMAN_COPPER ? DAMAGE_TYPE_ACID:
                      nTotem == FEAT_DRAGONSHAMAN_GOLD   ? DAMAGE_TYPE_FIRE:
                      nTotem == FEAT_DRAGONSHAMAN_GREEN  ? DAMAGE_TYPE_ACID:
                      nTotem == FEAT_DRAGONSHAMAN_RED    ? DAMAGE_TYPE_FIRE:
                      nTotem == FEAT_DRAGONSHAMAN_SILVER ? DAMAGE_TYPE_COLD:
                      nTotem == FEAT_DRAGONSHAMAN_WHITE  ? DAMAGE_TYPE_COLD:
                      -1;

    return nDamageType;
}

void ResetTouchOfVitality(object oPC)
{
    if(GetHasFeat(FEAT_DRAGONSHAMAN_TOUCHVITALITY, oPC))
    {
        int nChaBonus = GetAbilityModifier(ABILITY_CHARISMA, oPC);
        if(nChaBonus < 0) nChaBonus = 0;
        int nVitPoints = 2 * GetLevelByClass(CLASS_TYPE_DRAGON_SHAMAN, oPC) * nChaBonus;
        SetLocalInt(oPC, "DRAGON_SHAMAN_TOUCH_REMAIN", nVitPoints);
        string sMes = "Healing power: " + IntToString(nVitPoints) + " points.";
        FloatingTextStringOnCreature(sMes, oPC, FALSE);
    }
	if(GetHasFeat(FEAT_ABERRANT_DURABLE_FORM, oPC))  
		ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectTemporaryHitpoints(GetAberrantFeatCount(oPC)), oPC);    
}

int GetMarshalAuraPower(object oPC)
{
   int iMarshalLevel = GetLevelByClass(CLASS_TYPE_MARSHAL, oPC);
   int nBonus;
    if(iMarshalLevel > 19)
        nBonus = iMarshalLevel / 5;
    else if(iMarshalLevel > 13)
        nBonus = 3;
    else if(iMarshalLevel > 6)
        nBonus = 2;
    else if(iMarshalLevel > 1)
        nBonus = 1;

    return nBonus;
}

int GetDragonShamanAuraPower(object oPC)
{
    int iDragonShamanLevel = GetLevelByClass(CLASS_TYPE_DRAGON_SHAMAN, oPC);
    int nBonus = (iDragonShamanLevel / 5) + 1;

    return nBonus;
}

int GetExtraAuraPower(object oPC)
{
    int nBonus;
    if(GetIsDragonblooded(oPC))
    {
        int nHD = GetHitDice(oPC);
        if(nHD > 19)
            nBonus = 4;
        else if(nHD > 13)
            nBonus = 3;
        else if(nHD > 6)
            nBonus = 2;
        else
            nBonus = 1;
    }

    return nBonus;
 }  

int GetAuraBonus(object oPC)
{
    int nAuraBonus = GetDragonShamanAuraPower(oPC);
    int nMarshalBonus = GetMarshalAuraPower(oPC);
    int nExtraBonus = GetExtraAuraPower(oPC);

    if(nMarshalBonus > nAuraBonus)
        nAuraBonus = nMarshalBonus;

    if(nExtraBonus > nAuraBonus)
        nAuraBonus = nExtraBonus;

    return nAuraBonus;
}

object GetAuraObject(object oShaman, string sTag)
{
    location lTarget = GetLocation(oShaman);
    object oAura = GetFirstObjectInShape(SHAPE_SPHERE, 1.0f, lTarget, FALSE, OBJECT_TYPE_AREA_OF_EFFECT);
    while(GetIsObjectValid(oAura))
    {
        if((GetAreaOfEffectCreator(oAura) == oShaman) //was cast by shaman
        && GetTag(oAura) == sTag                      //it's a draconic aura
        && !GetLocalInt(oAura, "SpellID"))          //and was not setup before
        {
            return oAura;
        }
        oAura = GetNextObjectInShape(SHAPE_SPHERE, 1.0f, lTarget, FALSE, OBJECT_TYPE_AREA_OF_EFFECT);
    }
    return OBJECT_INVALID;
}