/*
    Celebrant of Sharess Fascinate. Fascinates creatures (1/3 levels)
*/

#include "prc_inc_spells"  

void DoConcLoop(object oPC, float fDur, int nCounter, object oTarget, int nSpellId)
{
    if((nCounter == 0) || GetBreakConcentrationCheck(oPC) > 0)
    {
        PRCRemoveSpellEffects(nSpellId, oPC, oTarget);
    }
    
    else
    {
        nCounter--;
        DelayCommand(6.0f, DoConcLoop(oPC, fDur, nCounter, oTarget, nSpellId));
    }
}

void main()
{
	object oPC = OBJECT_SELF;
	DecrementRemainingFeatUses(oPC, FEAT_CELEBRANT_SHARESS_CONFUSE);
	DecrementRemainingFeatUses(oPC, FEAT_CELEBRANT_SHARESS_DOMINATE);

    //Declare major variables
    effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20);
    effect eSleep =  EffectFascinate();
    effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
    effect eVis = EffectVisualEffect(VFX_IMP_SLEEP);

    effect eLink = EffectLinkEffects(eSleep, eMind);
    eLink = EffectLinkEffects(eLink, eDur);

    int nDuration = 1;
    location lTarget = GetLocation(oPC);
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, lTarget);
    int nDC = GetSkillRank(SKILL_PERFORM, oPC) + d20();
    int nClass = GetLevelByClass(CLASS_TYPE_CELEBRANT_SHARESS, oPC);
    int nTargets = 1;
    if (nClass >= 4)  nTargets++;
    if (nClass >= 7)  nTargets++;
    if (nClass >= 10) nTargets++;
    int nCount;
    int nSpellId = PRCGetSpellId();

    object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
    //Cycle through the targets within the spell shape until an invalid object is captured.
    while (GetIsObjectValid(oTarget) && nTargets > nCount)
    {
        if (spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oPC) && oTarget != oPC)
        {
            //Fire cast spell at event for the specified target
            SignalEvent(oTarget, EventSpellCastAt(oPC, nSpellId));
             
            //Make Will Save to negate effect
            if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_MIND_SPELLS))
            {
                ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, HoursToSeconds(nDuration));
                //Start conc monitor
                DelayCommand(6.0f, DoConcLoop(oPC, HoursToSeconds(nDuration), 600, oTarget, nSpellId));
            } 
            nCount++;
        }
       //Select the next target within the spell shape.
       oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE);
    }
}