//::///////////////////////////////////////////////
//:: [Acolyte of the Skin Feats]
//:: [prc_acolyte.nss]
//:://////////////////////////////////////////////
//:: Check to see which Acolyte of the Skin feats a creature
//:: has and apply the appropriate bonuses.
//:://////////////////////////////////////////////
//:: Created By: Aaon Graywolf
//:: Created On: Dec 28, 2003
//:://////////////////////////////////////////////
#include "prc_feat_const"
#include "inc_item_props"

// * Applies the Acolyte's AC bonuses as CompositeBonuses on object's skin.
// * iLevel = integer AC Bonus
void AcolyteFiendSkin(object oPC, object oSkin, int iLevel)
{
    if(GetLocalInt(oSkin, "AcolyteSkinBonus") == iLevel) return;

    SetCompositeBonus(oSkin, "AcolyteSkinBonus", iLevel, ITEM_PROPERTY_AC_BONUS);
}

// * Applies the Acolyte's damage reduction bonuses as CompositeBonuses on object's skin.
// * iLevel = IP_CONST_DAMAGEREDUCTION_*
void AcolyteSymbiosis(object oPC, object oSkin, int iLevel)
{
    if(GetLocalInt(oSkin, "AcolyteSymbBonus") == iLevel) return;

    RemoveSpecificProperty(oSkin, ITEM_PROPERTY_DAMAGE_REDUCTION, GetLocalInt(oSkin, "AcolyteSymbBonus"), IP_CONST_DAMAGESOAK_20_HP, 1, "AcolyteSymbBonus");
    AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDamageReduction(iLevel, IP_CONST_DAMAGESOAK_20_HP), oSkin);
    SetLocalInt(oSkin, "AcolyteSymbBonus", iLevel);
}

// * Applies the Acolyte's stat bonuses as CompositeBonuses on object's skin.
// * Currently only valid for Con, Dex and Int
// * iLevel = integer stat bonus
void AcolyteDexBonus(object oPC, object oSkin, int iLevel)
{
    string sFlag = "AcolyteStatBonusDex";
    int iTest = GetPersistantLocalInt(oPC, "NWNX_AcolyteDex");
    int nDiff = iLevel - iTest;

    if(nDiff != 0)
        SetCompositeBonus(oSkin, sFlag, nDiff, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_DEX);
}

void AcolyteConBonus(object oPC, object oSkin, int iLevel)
{
    string sFlag = "AcolyteStatBonusCon";
    int iTest = GetPersistantLocalInt(oPC, "NWNX_AcolyteCon");
    int nDiff = iLevel - iTest;

    if(nDiff != 0)
        SetCompositeBonus(oSkin, sFlag, nDiff, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_CON);
}

void AcolyteIntBonus(object oPC, object oSkin, int iLevel)
{
    string sFlag = "AcolyteStatBonusInt";
    int iTest = GetPersistantLocalInt(oPC, "NWNX_AcolyteInt");
    int nDiff = iLevel - iTest;

    if(nDiff != 0)
        SetCompositeBonus(oSkin, sFlag, nDiff, ITEM_PROPERTY_ABILITY_BONUS, IP_CONST_ABILITY_INT);
}


// * Applies the Acolyte's resistance bonuses as CompositeBonuses on object's skin.
// * Currently only valid for Cold, Fire, Acid and Electric
// * Resistance level is hardcodded to 20
// * iType = IP_CONST_DAMAGETYPE_*
void AcolyteResistance(object oPC, object oSkin, int iType)
{
    string sFlag;
    if(iType == IP_CONST_DAMAGETYPE_COLD) sFlag = "AcolyteResistanceCold";
    if(iType == IP_CONST_DAMAGETYPE_FIRE) sFlag = "AcolyteResistanceFire";
    if(iType == IP_CONST_DAMAGETYPE_ACID) sFlag = "AcolyteResistanceAcid";
    if(iType == IP_CONST_DAMAGETYPE_ELECTRICAL) sFlag = "AcolyteResistanceElectric";

    if(GetLocalInt(oSkin, sFlag) == TRUE) return;

    AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyDamageResistance(iType, IP_CONST_DAMAGERESIST_20), oSkin);
    SetLocalInt(oSkin, sFlag, TRUE);
}

void main()
{
    object oPC = OBJECT_SELF;

    int bFSkin = GetHasFeat(FEAT_WEAR_FIEND, oPC)           ? 1 : 0;
        bFSkin = GetHasFeat(FEAT_SKIN_ADAPTION, oPC)        ? 2 : bFSkin;

    int bSymbi = GetHasFeat(FEAT_SYMBIOSIS, oPC)            ? IP_CONST_DAMAGEREDUCTION_1  : -1;
        bSymbi = GetHasFeat(FEAT_EPIC_SYMBIOSIS_1, oPC)     ? IP_CONST_DAMAGEREDUCTION_2  : bSymbi;
        bSymbi = GetHasFeat(FEAT_EPIC_SYMBIOSIS_2, oPC)     ? IP_CONST_DAMAGEREDUCTION_3  : bSymbi;
        bSymbi = GetHasFeat(FEAT_EPIC_SYMBIOSIS_3, oPC)     ? IP_CONST_DAMAGEREDUCTION_4  : bSymbi;
        bSymbi = GetHasFeat(FEAT_EPIC_SYMBIOSIS_4, oPC)     ? IP_CONST_DAMAGEREDUCTION_5  : bSymbi;

    int bStCon = GetHasFeat(FEAT_SKIN_ADAPTION, oPC)        ? 2 : 0;
        bStCon = GetHasFeat(FEAT_EPIC_CON_1, oPC)           ? 4 : bStCon;
        bStCon = GetHasFeat(FEAT_EPIC_CON_2, oPC)           ? 6 : bStCon;
        bStCon = GetHasFeat(FEAT_EPIC_CON_3, oPC)           ? 8 : bStCon;

    int bStDex = GetHasFeat(FEAT_WEAR_FIEND, oPC)           ? 2 : 0;

    int bStInt = GetHasFeat(FEAT_EPIC_INT_1, oPC)           ? 2 : 0;
        bStInt = GetHasFeat(FEAT_EPIC_INT_2, oPC)           ? 4 : bStInt;

    int bResCo = GetHasFeat(FEAT_COLD_RESISTANT, oPC);
    int bResFl = GetHasFeat(FEAT_FLAME_RESISTANT, oPC);
    int bResAc = GetHasFeat(FEAT_ACID_RESISTANT, oPC);
    int bResEl = GetHasFeat(FEAT_ELEC_RESISTANT, oPC);

    object oSkin = GetPCSkin(oPC);

    //if(bFSkin > 0) AcolyteFiendSkin(oPC, oSkin, bFSkin);
    if(bSymbi > -1) AcolyteSymbiosis(oPC, oSkin, bSymbi);
    //if(bStCon > 0) AcolyteConBonus(oPC, oSkin, bStCon);
    //if(bStDex > 0) AcolyteDexBonus(oPC, oSkin, bStDex);
    //if(bStInt > 0) AcolyteIntBonus(oPC, oSkin, bStInt);
    if(bResCo) AcolyteResistance(oPC, oSkin, IP_CONST_DAMAGETYPE_COLD);
    if(bResFl) AcolyteResistance(oPC, oSkin, IP_CONST_DAMAGETYPE_FIRE);
    if(bResAc) AcolyteResistance(oPC, oSkin, IP_CONST_DAMAGETYPE_ACID);
    if(bResEl) AcolyteResistance(oPC, oSkin, IP_CONST_DAMAGETYPE_ELECTRICAL);
}