Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
94 lines
4.0 KiB
Plaintext
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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |