//::///////////////////////////////////////////////
//:: Frightful Prescence
//:: prc_hext_fright.nss
//:://////////////////////////////////////////////
//:: Causes an area of fear that applies either the
//:: Fear effect or the Doom effect.
//:://////////////////////////////////////////////
//:: Created By: Stratovarius
//:: Created On: July 10, 2004
//:://////////////////////////////////////////////

#include "prc_alterations"
#include "x2_inc_spellhook"

void main()
{
    //Declare major variables
    int nDur = d6(5);
    float fDuration = RoundsToSeconds(nDur);
    effect eVis = EffectVisualEffect(VFX_IMP_FEAR_S);
    effect eFear = EffectFrightened();
    effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR);
    effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20);
    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
    float fDelay;
    //Link the fear and mind effects
    effect eLink = EffectLinkEffects(eFear, eMind);
    eLink = EffectLinkEffects(eLink, eDur);

    effect eVisD = EffectVisualEffect(VFX_IMP_DOOM);
    effect eLinkD = EffectShaken();
    int nLevel = GetLevelByClass(CLASS_TYPE_HEXTOR, OBJECT_SELF);
    float fRadius = FeetToMeters(IntToFloat(5*nLevel));


    int nDC = (10 + nLevel + GetAbilityModifier(ABILITY_CHARISMA, OBJECT_SELF));

    object oTarget;

    //Apply Impact
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, PRCGetSpellTargetLocation());
    //Get first target in the spell cone
    oTarget = GetFirstObjectInShape(SHAPE_SPHERE, fRadius, PRCGetSpellTargetLocation(), TRUE);
    while(GetIsObjectValid(oTarget))
    {
        if (!GetLevelByClass(CLASS_TYPE_HEXTOR, oTarget))
        {
            fDelay = PRCGetRandomDelay();
            //Fire cast spell at event for the specified target
            SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_FEAR));
                //Make a will save
                if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_FEAR, OBJECT_SELF, fDelay))
                {
                    //Apply the linked effects and the VFX impact
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration));
        	}
        	else if (GetHasMettle(oTarget, SAVING_THROW_WILL))
        	{
        		ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_WILL_SAVING_THROW_USE), oTarget);
        	}
                else
        	{
                	ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLinkD, oTarget, fDuration);
                	ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisD, oTarget);
        	}
        }
        //Get next target in the spell cone
        oTarget = GetNextObjectInShape(SHAPE_SPHERE, fRadius, PRCGetSpellTargetLocation(), TRUE);
    }
}