PRC8/nwn/nwnprc/trunk/epicspellscripts/ss_ep_singsunder.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
Updated AMS marker feats.  Removed arcane & divine marker feats.  Updated Dread Necromancer for epic progression. Updated weapon baseitem models.  Updated new weapons for crafting & npc equip.
 Updated prefix.  Updated release archive.
2024-02-11 14:01:05 -05:00

90 lines
3.8 KiB
Plaintext

//:://////////////////////////////////////////////
//:: 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;
}