#include "prc_inc_spells"
#include "prc_add_spell_dc"
void main()
{
    // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
    if (!X2PreSpellCastCode()) return;

    PRCSetSchool(SPELL_SCHOOL_CONJURATION);

    // Apply a burst visual effect at the target location.
    location lTarget = PRCGetSpellTargetLocation();
    effect eImpact = EffectVisualEffect(VFX_FNF_GLITTERDUST);
    ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, lTarget);

    int nCasterLvl = PRCGetCasterLevel(OBJECT_SELF);

    // Determine the spell's duration.
    float fDuration = PRCGetMetaMagicDuration(RoundsToSeconds(nCasterLvl));

    effect eBlindness = EffectLinkEffects(EffectBlindness(),
        EffectVisualEffect(VFX_DUR_BLIND));
    effect eHidePenalty = EffectLinkEffects(EffectSkillDecrease(SKILL_HIDE, 40),
        EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE));

    object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lTarget);
    while(GetIsObjectValid(oTarget))
    {
        if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
        {
            PRCSignalSpellEvent(oTarget);

            // Apply impact vfx.
            DelayCommand(0.5, ApplyEffectToObject(DURATION_TYPE_INSTANT,
                EffectVisualEffect(VFX_IMP_SPARKS), oTarget));

            // Creatures take the hide penalty whether they save or not.
            SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHidePenalty, oTarget, fDuration,TRUE,-1,nCasterLvl);

            // Creatures that are invisible become visible whether they save or not.  We do
            // this by looping through all the creature's effects looking for invisibility
            // effects and removing them.
            effect eTarget = GetFirstEffect(oTarget);
            while (GetIsEffectValid(eTarget))
            {
                int nType = GetEffectType(eTarget);
                if (EFFECT_TYPE_INVISIBILITY == nType || EFFECT_TYPE_IMPROVEDINVISIBILITY == nType)
                    RemoveEffect (oTarget, eTarget);

                eTarget = GetNextEffect(oTarget);
            }

            // Let the creature make a will save, if it fails it's blinded.
            if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget,OBJECT_SELF)))
                SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlindness, oTarget, fDuration,TRUE,-1,nCasterLvl);
        }

        oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, lTarget);
    }

    PRCSetSchool();
}