/*
    prc_pyro

    Passive feats for pyrokineticist

    By: Flaming_Sword
    Created: Dec 6, 2007
    Modified: Dec 7, 2007
*/

#include "prc_alterations"
#include "prc_x2_itemprop"

void main()
{
    object oPC = OBJECT_SELF;
    object oTemp;
    int iClassLevel = (GetLevelByClass(CLASS_TYPE_PYROKINETICIST, oPC));
    if(iClassLevel < 1)
        return;

    int iEquip = GetLocalInt(oPC,"ONEQUIP");  //2 = equip, 1 = unequip
    int iRest = GetLocalInt(oPC,"ONREST");  //1 = rest finished
    int iEnter = GetLocalInt(oPC,"ONENTER");  //1 = entering

    /*if(iEquip == 2) //equip
    {
        if(DEBUG) DoDebug("prc_pyro: Equip event, Proficiency check for other whips");
        oTemp = GetPCItemLastEquipped();
        if(GetBaseItemType(oTemp) == BASE_ITEM_WHIP && GetTag(oTemp) != "PRC_PYRO_LASH_WHIP" && !GetHasFeat(FEAT_WEAPON_PROFICIENCY_EXOTIC, oPC))
        {
            SendMessageToPC(oPC, "You are not proficient with exotic weapons.");
            if(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC) == oTemp)
                ForceUnequip(oPC, oTemp, INVENTORY_SLOT_RIGHTHAND);
            else
                ForceUnequip(oPC, oTemp, INVENTORY_SLOT_LEFTHAND);
        }
    }*/
    if(iEquip == 1) //OnUnEquip - fires before item is unequipped
    {
        if(DEBUG) DoDebug("prc_pyro: Unequip event, clearing temporary itemprops, destroying lash");
        oTemp = GetPCItemLastUnequipped();
        IPRemoveAllItemProperties(oTemp, DURATION_TYPE_TEMPORARY);
        if(GetTag(oTemp) == "PRC_PYRO_LASH_WHIP")   //Fire Lash is destroyed on unequip or unacquire
            MyDestroyObject(oTemp);
    }
    object oSkin = GetPCSkin(oPC);
    int iDamageType;
    int iIPSaveType;
    int iIPDamgeType;
    int iImpactVFX;
    int iImpactBigVFX;
    int iVis;
    int iBeam;
    int iSave;
    int iBurst;
    string sString;
    if(DEBUG) DoDebug("prc_pyro: Initialisation");
    if(GetHasFeat(FEAT_PYRO_PYROKINETICIST, oPC))
    {
        iDamageType = DAMAGE_TYPE_FIRE;
        iIPSaveType = IP_CONST_SAVEVS_FIRE;
        iIPDamgeType = IP_CONST_DAMAGETYPE_FIRE;
        iImpactVFX = VFX_IMP_FLAME_S;
        iImpactBigVFX = VFX_IMP_FLAME_M;
        iVis = ITEM_VISUAL_FIRE;
        iBeam = VFX_BEAM_FIRE;
        iSave = SAVING_THROW_TYPE_FIRE;
        iBurst = VFX_FNF_FIRESTORM;
        sString = "Fire";
    }
    else if(GetHasFeat(FEAT_PYRO_CRYOKINETICIST, oPC))
    {
        iDamageType =  DAMAGE_TYPE_COLD;
        iIPSaveType = IP_CONST_SAVEVS_COLD;
        iIPDamgeType = IP_CONST_DAMAGETYPE_COLD;
        iImpactVFX = VFX_IMP_FROST_S;
        iImpactBigVFX = VFX_IMP_FROST_L;
        iVis = ITEM_VISUAL_COLD;
        iBeam = VFX_BEAM_COLD;
        iSave = SAVING_THROW_TYPE_COLD;
        iBurst = VFX_FNF_ICESTORM;
        sString = "Cold";
    }
    else if(GetHasFeat(FEAT_PYRO_SONOKINETICIST, oPC))
    {
        iDamageType =  DAMAGE_TYPE_SONIC;
        iIPSaveType = IP_CONST_SAVEVS_SONIC;
        iIPDamgeType = IP_CONST_DAMAGETYPE_SONIC;
        iImpactVFX = VFX_IMP_SONIC;
        iImpactBigVFX = VFX_IMP_SILENCE;
        iVis = ITEM_VISUAL_SONIC;
        iBeam = VFX_BEAM_MIND;
        iSave = SAVING_THROW_TYPE_SONIC;
        iBurst = VFX_FNF_SOUND_BURST;
        sString = "Sonic";
    }
    else if(GetHasFeat(FEAT_PYRO_ELECTROKINETICIST, oPC))
    {
        iDamageType =  DAMAGE_TYPE_ELECTRICAL;
        iIPSaveType = IP_CONST_SAVEVS_ELECTRICAL;
        iIPDamgeType = IP_CONST_DAMAGETYPE_ELECTRICAL;
        iImpactVFX = VFX_IMP_LIGHTNING_S;
        iImpactBigVFX = VFX_IMP_LIGHTNING_M;
        iVis = ITEM_VISUAL_ELECTRICAL;
        iBeam = VFX_BEAM_LIGHTNING;
        iSave = SAVING_THROW_TYPE_ELECTRICITY;
        iBurst = VFX_FNF_DISPEL_GREATER;
        sString = "Lightning";
    }
    else if(GetHasFeat(FEAT_PYRO_ACETOKINETICIST, oPC))
    {
        iDamageType =  DAMAGE_TYPE_ACID;
        iIPSaveType = IP_CONST_SAVEVS_ACID;
        iIPDamgeType = IP_CONST_DAMAGETYPE_ACID;
        iImpactVFX = VFX_IMP_ACID_S;
        iImpactBigVFX = VFX_IMP_ACID_L;
        iVis = ITEM_VISUAL_ACID;
        iBeam = VFX_BEAM_EVIL;
        iSave = SAVING_THROW_TYPE_ACID;
        iBurst = VFX_FNF_HORRID_WILTING;
        sString = "Acid";
    }
    else
    {
        if(DEBUG) DoDebug("prc_pyro: ERROR, character does not have element feat");
        return;
    }
    if(DEBUG) DoDebug("prc_pyro: Setting persistent local vars");
    SetPersistantLocalInt(oPC, "PyroDamageType", iDamageType);
    SetPersistantLocalInt(oPC, "PyroImpactVFX", iImpactVFX);
    SetPersistantLocalInt(oPC, "PyroImpactBigVFX", iImpactBigVFX);
    SetPersistantLocalInt(oPC, "PyroVis", iVis);
    SetPersistantLocalInt(oPC, "PyroBeam", iBeam);
    SetPersistantLocalInt(oPC, "PyroSave", iSave);
    SetPersistantLocalInt(oPC, "PyroBurst", iBurst);
    SetPersistantLocalString(oPC, "PyroString", sString);

    if(iClassLevel >= 2)
    {
        if(DEBUG) DoDebug("prc_pyro: Adding itemprops to hide");
        //Fire Adaptation
        int bFear = (iClassLevel >= 7); //Fear No Fire
        IPSafeAddItemProperty(oSkin, ItemPropertyBonusSavingThrowVsX(iIPSaveType, bFear ? 8 : 4));
        IPSafeAddItemProperty(oSkin, ItemPropertyDamageResistance(iIPDamgeType, bFear ? IP_CONST_DAMAGERESIST_20 : IP_CONST_DAMAGERESIST_10));

        if(DEBUG) DoDebug("prc_pyro: Adding itemprops to gaunts/weapons/ammo");
        //Hand Afire
        IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_ARMS, oPC), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
        if(iClassLevel >= 4)
        {   //Weapon Afire
            IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
            IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC), ItemPropertyVisualEffect(iVis), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
            IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
            IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_BULLETS, oPC), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
            IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
        }
        if(iClassLevel >= 5 && GetLocalInt(oPC, "PRC_Pyro_Nimbus"))
        {
            if(DEBUG) DoDebug("prc_pyro: Adding itemprops to armour");
            IPSafeAddItemProperty(GetItemInSlot(INVENTORY_SLOT_CHEST, oPC), ItemPropertyOnHitCastSpell(IP_CONST_ONHIT_CASTSPELL_ONHIT_UNIQUEPOWER, 1), 99999.0, X2_IP_ADDPROP_POLICY_KEEP_EXISTING, FALSE, FALSE);
        }
    }
}