PRC8/nwn/nwnprc/trunk/newspellbook/shd_myst_vcshd.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

94 lines
4.0 KiB
Plaintext

/*
12/02/19 by Stratovarius
Voice of Shadow
Apprentice, Ebon Whispers
Level/School: 1st/Enchantment (Compulsion) [Mind-Affecting]
Range: Close (25 ft. + 5 ft./2 levels)
Target: One creature
Duration: 1 round
Saving Throw: Will negates
Spell Resistance: Yes
By speaking via a conduit through the Plane of Shadow, you deliver a commanding message.
This mystery functions like the spell command, except if cast on undead or constructs. They are dazed for the duration.
*/
#include "shd_inc_shdfunc"
#include "shd_mysthook"
void main()
{
if(!ShadPreMystCastCode()) return;
object oShadow = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct mystery myst = EvaluateMystery(oShadow, oTarget, METASHADOW_EXTEND);
if(myst.bCanMyst)
{
myst.fDur = RoundsToSeconds(1);
if(myst.bExtend) myst.fDur *= 2;
myst.nPen = ShadowSRPen(oShadow, myst.nShadowcasterLevel);
SignalEvent(oTarget, EventSpellCastAt(oShadow, myst.nMystId));
// Only creatures, and PvP check.
if(!GetIsReactionTypeFriendly(oTarget))
{
// Check Spell Resistance
if(!PRCDoResistSpell(oShadow, oTarget, myst.nPen) || myst.bIgnoreSR)
{
if (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD || MyPRCGetRacialType(oTarget) == RACIAL_TYPE_CONSTRUCT)
{
if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetShadowcasterDC(oShadow), SAVING_THROW_TYPE_NONE))
{
effect eVis = EffectVisualEffect(VFX_IMP_CONFUSION_S);
myst.eLink = EffectLinkEffects(EffectDazed(), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED));
if (myst.bIgnoreSR) myst.eLink = SupernaturalEffect(myst.eLink);
object oItem = GetItemInSlot(INVENTORY_SLOT_CARMOUR, oTarget);
int nRemove = FALSE;
itemproperty ip = GetFirstItemProperty(oItem);
while(GetIsItemPropertyValid(ip))
{
if (GetItemPropertyType(ip) == ITEM_PROPERTY_IMMUNITY_MISCELLANEOUS && GetItemPropertySubType(ip) == IP_CONST_IMMUNITYMISC_MINDSPELLS)
{
RemoveItemProperty(oItem, ip);
nRemove = TRUE;
}
if (GetItemPropertyType(ip) == ITEM_PROPERTY_MIND_BLANK)
{
RemoveItemProperty(oItem, ip);
nRemove = TRUE;
}
ip = GetNextItemProperty(oItem);
}
AssignCommand(oTarget, ClearAllActions(TRUE));
effect eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE), EffectCharmed());
DelayCommand(0.25, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, myst.eLink, oTarget, myst.fDur, TRUE, myst.nMystId, myst.nShadowcasterLevel));
if (nRemove) DelayCommand(1.0, AddItemProperty(DURATION_TYPE_PERMANENT, ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS), oItem));
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
}
}
else
{
if (!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetShadowcasterDC(oShadow), SAVING_THROW_TYPE_MIND_SPELLS))
{
effect eVis = EffectVisualEffect(VFX_IMP_CONFUSION_S);
myst.eLink = EffectLinkEffects(EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE), EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED));
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, myst.eLink, oTarget, myst.fDur, TRUE, myst.nMystId, myst.nShadowcasterLevel);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
DoCommandSpell(oShadow, oTarget, myst.nMystId, FloatToInt(myst.fDur/6.0), myst.nShadowcasterLevel);
}
}
}
}
}
}