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.
		
			
				
	
	
		
			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());
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |