//:://////////////////////////////////////////////
//:: FileName: "ss_ep_singsunder"
/*   Purpose: Singular Sunder - spell target's an enemy's equipment, and
        irrevocably destroys a single item, on a failed will save.
*/
//:://////////////////////////////////////////////
//:: Created By: Boneshank
//:: Last Updated On: March 11, 2004
//:://////////////////////////////////////////////
#include "prc_alterations"
#include "inc_epicspells"

object GetSunderTarget(object oTarget);

void main()
{
    DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
    SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_TRANSMUTATION);

    if (!X2PreSpellCastCode())
    {
        DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
        return;
    }
    if (GetCanCastSpell(OBJECT_SELF, SPELL_EPIC_SINGSUN))
    {
        object oTarget = PRCGetSpellTargetObject();
        effect eImp = EffectVisualEffect(VFX_IMP_BREACH);
        effect eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_S);
        object oItem = GetSunderTarget(oTarget);
    SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId()));
        // Does the target have an equipped item to sunder?
        if (oItem != OBJECT_INVALID)
        {
            // SR check.
            if (!PRCDoResistSpell(OBJECT_SELF, oTarget, GetTotalCastingLevel(OBJECT_SELF)+SPGetPenetr(OBJECT_SELF)))
            {
                // Will save.
                if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetEpicSpellSaveDC(OBJECT_SELF, oTarget)))
                {
                    SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImp, oTarget);
                    SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
                    DestroyObject(oItem, 1.0);
                }
            }
        }
        else
            SendMessageToPC(OBJECT_SELF,
                "That creature has nothing equipped to sunder!");
    }
    DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
}

object GetSunderTarget(object oTarget)
{
    object oItem = OBJECT_INVALID;
    object oTemp;
    // Search for item hierarchy, lowest to highest priority, and non-plot.
    oTemp = GetItemInSlot(12, oTarget); // Bullets
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(13, oTarget); // Bolts
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(11, oTarget); // Arrows
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(7, oTarget); // Left ring
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(8, oTarget); // Right ring
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(0, oTarget); // Helmet
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(10, oTarget); // Belt
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(2, oTarget); // Boots
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(6, oTarget); // Cloak
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(9, oTarget); // Neck
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(3, oTarget); // Arms (gauntlets)
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(5, oTarget); // Left (off) hand
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(1, oTarget); // Armor
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    oTemp = GetItemInSlot(4, oTarget); // Right (main) hand
    if (oTemp != OBJECT_INVALID && !GetPlotFlag(oTemp)) oItem = oTemp;
    return oItem;
}