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.
71 lines
3.0 KiB
Plaintext
71 lines
3.0 KiB
Plaintext
/*
|
|
18/02/19 by Stratovarius
|
|
|
|
Ephemeral Storm
|
|
|
|
Master, Breath of Twilight
|
|
Level/School: 9th/Evocation
|
|
Range: Close (25 ft. + 5 ft./2 levels)
|
|
Target: One living creature/2 levels, no two of which are more than 20 ft. apart
|
|
Duration: Instantaneous
|
|
Saving Throw: Fortitude partial
|
|
Spell Resistance: Yes
|
|
|
|
The air explodes with shadowy tendrils that slice like blades.
|
|
|
|
Targets of ephemeral storm must make a Fortitude save or die. Those who succeed take 5d6 points of damage.
|
|
*/
|
|
|
|
#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_NONE);
|
|
|
|
if(myst.bCanMyst)
|
|
{
|
|
myst.nPen = ShadowSRPen(oShadow, myst.nShadowcasterLevel);
|
|
effect eDeath = SupernaturalEffect(EffectDeath(TRUE));
|
|
effect eImplode= EffectVisualEffect(VFX_DUR_ANTILIFE_SHELL);
|
|
effect eVis = EffectVisualEffect(VFX_IMP_NEGBLAST_ENERGY);
|
|
//Apply the implode effect
|
|
ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eImplode, PRCGetSpellTargetLocation(), 3.0);
|
|
int nCount = 0;
|
|
//Get the first target in the shape
|
|
oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, PRCGetSpellTargetLocation());
|
|
while (GetIsObjectValid(oTarget) && 11 > nCount)
|
|
{
|
|
int nRacialType = MyPRCGetRacialType(oTarget);
|
|
// Has to be alive
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oShadow) && !(nRacialType == RACIAL_TYPE_UNDEAD || (nRacialType == RACIAL_TYPE_CONSTRUCT && !GetIsWarforged(oTarget))))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oShadow, myst.nMystId));
|
|
float fDelay = PRCGetRandomDelay(0.4, 1.2);
|
|
//Make SR check
|
|
if (!PRCDoResistSpell(oShadow, oTarget, myst.nPen, fDelay))
|
|
{
|
|
//Make Reflex save
|
|
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, GetShadowcasterDC(oShadow), SAVING_THROW_TYPE_DEATH, oShadow, fDelay))
|
|
{
|
|
DeathlessFrenzyCheck(oTarget);
|
|
|
|
//Apply death effect and the VFX impact
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget));
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
|
|
}
|
|
else
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, d6(5), DAMAGE_TYPE_MAGICAL), oTarget));
|
|
}
|
|
nCount++; //Only count living creatures
|
|
}
|
|
//Get next target in the shape
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_MEDIUM, PRCGetSpellTargetLocation());
|
|
}
|
|
}
|
|
} |