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.
91 lines
3.2 KiB
Plaintext
91 lines
3.2 KiB
Plaintext
/*
|
|
13/02/19 by Stratovarius
|
|
|
|
Umbral Touch
|
|
|
|
Apprentice, Touch of Twilight
|
|
Level/School: 3rd/Conjuration
|
|
Range: Touch
|
|
Target: Creature or creatures touched
|
|
Duration: 1 minute/level (D); see text
|
|
Saving Throw: Fortitude partial
|
|
Spell Resistance: Yes
|
|
|
|
Darkness surrounds your hand, turning it into a deadly weapon.
|
|
|
|
Umbral touch infuses one of your hands with dark, shadowy energy, allowing you to make debilitating melee touch attacks. A successful strike deals 5d6 points of damage to a
|
|
target, which must succeed on a Fortitude saving throw or also be slowed for one round. You may make one touch attack per caster level.
|
|
|
|
*/
|
|
|
|
#include "shd_inc_shdfunc"
|
|
#include "shd_mysthook"
|
|
#include "prc_inc_sp_tch"
|
|
#include "prc_sp_func"
|
|
|
|
int DoMyst(object oShadow, object oTarget, struct mystery myst)
|
|
{
|
|
myst.fDur = RoundsToSeconds(1);
|
|
if(myst.bExtend) myst.fDur *= 2;
|
|
myst.nPen = ShadowSRPen(oShadow, myst.nShadowcasterLevel);
|
|
|
|
SignalEvent(oTarget, EventSpellCastAt(oShadow, myst.nMystId));
|
|
|
|
int nAttack = PRCDoMeleeTouchAttack(oTarget);
|
|
if (nAttack > 0)
|
|
{
|
|
// Only creatures, and PvP check.
|
|
if(!GetIsReactionTypeFriendly(oTarget))
|
|
{
|
|
// Check Spell Resistance
|
|
if(!PRCDoResistSpell(oShadow, oTarget, myst.nPen) || myst.bIgnoreSR)
|
|
{
|
|
int nDamage = MetashadowsDamage(myst, 6, 5);
|
|
ApplyTouchAttackDamage(oShadow, oTarget, nAttack, nDamage, DAMAGE_TYPE_MAGICAL);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY), oTarget);
|
|
|
|
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, GetShadowcasterDC(oShadow), SAVING_THROW_TYPE_SPELL))
|
|
{
|
|
myst.eLink = EffectSlow();
|
|
if (myst.bIgnoreSR) myst.eLink = SupernaturalEffect(myst.eLink);
|
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, myst.eLink, oTarget, myst.fDur, TRUE, myst.nMystId, myst.nShadowcasterLevel);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return nAttack;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
if(!ShadPreMystCastCode()) return;
|
|
object oShadow = OBJECT_SELF;
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
struct mystery myst;
|
|
int nEvent = GetLocalInt(oShadow, PRC_SPELL_EVENT); //use bitwise & to extract flags
|
|
if(!nEvent) //normal cast
|
|
{
|
|
myst = EvaluateMystery(oShadow, oTarget, (METASHADOW_EXTEND | METASHADOW_EMPOWER | METASHADOW_MAXIMIZE));
|
|
|
|
if(myst.bCanMyst)
|
|
{
|
|
if(GetLocalInt(oShadow, PRC_SPELL_HOLD) && oShadow == oTarget)
|
|
{ //holding the charge, mystesting power on self
|
|
SetLocalSpellVariables(oShadow, myst.nShadowcasterLevel); //change 1 to number of charges
|
|
SetLocalMystery(oShadow, MYST_HOLD_MYST+"5", myst);
|
|
return;
|
|
}
|
|
DoMyst(oShadow, oTarget, myst);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(nEvent & PRC_SPELL_EVENT_ATTACK)
|
|
{
|
|
myst = GetLocalMystery(oShadow, MYST_HOLD_MYST+"5");
|
|
if(DoMyst(oShadow, oTarget, myst))
|
|
DecrementSpellCharges(oShadow);
|
|
}
|
|
}
|
|
} |