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.
		
			
				
	
	
		
			98 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*
 | 
						||
18/02/19 by Stratovarius
 | 
						||
 | 
						||
Prison of Night
 | 
						||
 | 
						||
Master, Ebon Walls 
 | 
						||
Level/School: 7th/Conjuration (Creation) 
 | 
						||
Range: Close (25 ft. + 5 ft./2 levels) 
 | 
						||
Target: One Huge or smaller creature 
 | 
						||
Duration: 1 round/level
 | 
						||
Saving Throw: Fortitude negates; see text 
 | 
						||
Spell Resistance: Yes
 | 
						||
 | 
						||
You solidify extraplanar shadow, creating a solid prison of darkness.
 | 
						||
 | 
						||
This mystery immobilizes the subject in a prison of shadowstuff. This prison blocks both line of effect and line of sight to the creature inside it, and is impenetrable from the 
 | 
						||
outside. The creature inside the prison takes 1d6 points of cold damage at the beginning of each round that it remains inside the prison. Once each round as a standard action, a 
 | 
						||
creature caught in the prison can attempt a Fortitude saving throw against the spell’s original DC to break out of the prison. Success means that the creature can move out of the 
 | 
						||
prison, and it fades to nothingness. Failure means that the creature takes 1d4 points of Constitution damage and remains trapped.
 | 
						||
*/
 | 
						||
 | 
						||
#include "shd_inc_shdfunc"
 | 
						||
#include "shd_mysthook"
 | 
						||
 | 
						||
void PrisonNight(struct mystery myst, object oTarget, int nCount)
 | 
						||
{
 | 
						||
    SPApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, MetashadowsDamage(myst, 6, 1), DAMAGE_TYPE_COLD), oTarget);
 | 
						||
    
 | 
						||
    if((--nCount == -1)                                         || // Is the power expiring now
 | 
						||
       PRCGetDelayedSpellEffectsExpired(MYST_PRISON_NIGHT, oTarget, myst.oShadow)  || // Or has it expired already
 | 
						||
       (PRCMySavingThrow(SAVING_THROW_FORT, oTarget, myst.nSaveDC, SAVING_THROW_TYPE_SPELL))       // Or does the creature succeed at its Save
 | 
						||
       )
 | 
						||
    {
 | 
						||
        if(DEBUG) DoDebug("psi_pow_timehop: Power expired or Wis check succeeded, clearing");
 | 
						||
 | 
						||
        // Remove the effects
 | 
						||
        PRCRemoveSpellEffects(MYST_PRISON_NIGHT, myst.oShadow, oTarget);
 | 
						||
    }
 | 
						||
    else
 | 
						||
    {
 | 
						||
        ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, d4(), DURATION_TYPE_PERMANENT, TRUE);    
 | 
						||
        DelayCommand(6.0f, PrisonNight(myst, oTarget, nCount));    
 | 
						||
    }    
 | 
						||
}
 | 
						||
 | 
						||
void main()
 | 
						||
{
 | 
						||
    if(!ShadPreMystCastCode()) return;
 | 
						||
 | 
						||
    object oShadow      = OBJECT_SELF;
 | 
						||
    object oTarget      = PRCGetSpellTargetObject();
 | 
						||
    struct mystery myst = EvaluateMystery(oShadow, oTarget, (METASHADOW_EXTEND | METASHADOW_EMPOWER | METASHADOW_MAXIMIZE));
 | 
						||
 | 
						||
    if(myst.bCanMyst)
 | 
						||
    {
 | 
						||
        myst.fDur = RoundsToSeconds(myst.nShadowcasterLevel);
 | 
						||
        if(myst.bExtend) myst.fDur *= 2;   
 | 
						||
        myst.nPen = ShadowSRPen(oShadow, myst.nShadowcasterLevel);
 | 
						||
        SignalEvent(oTarget, EventSpellCastAt(oShadow, myst.nMystId));
 | 
						||
        myst.oShadow = oShadow;
 | 
						||
        myst.nSaveDC = GetShadowcasterDC(oShadow);
 | 
						||
        
 | 
						||
        if (PRCGetCreatureSize(oTarget) > CREATURE_SIZE_HUGE)
 | 
						||
        {
 | 
						||
            FloatingTextStringOnCreature("The target creature is too large for Prison of Night", oShadow, FALSE);
 | 
						||
            return;
 | 
						||
        }
 | 
						||
        
 | 
						||
        myst.eLink      =                               EffectCutsceneParalyze();
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectCutsceneGhost());
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectEthereal());
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectSpellImmunity(SPELL_ALL_SPELLS));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ACID,        100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_BLUDGEONING, 100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_DIVINE,      100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_ELECTRICAL,  100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE,        100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_MAGICAL,     100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_NEGATIVE,    100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_PIERCING,    100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_POSITIVE,    100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SLASHING,    100));
 | 
						||
        myst.eLink      = EffectLinkEffects(myst.eLink, EffectDamageImmunityIncrease(DAMAGE_TYPE_SONIC,       100)); 
 | 
						||
        
 | 
						||
        // Only creatures, and PvP check.
 | 
						||
        if(spellsIsTarget(oTarget, SPELL_TARGET_SELECTIVEHOSTILE, oShadow))
 | 
						||
        {
 | 
						||
            // Check Spell Resistance
 | 
						||
            if(!PRCDoResistSpell(oShadow, oTarget, myst.nPen))
 | 
						||
            {                
 | 
						||
                // Apply effect. Not dispellable
 | 
						||
               SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, myst.eLink, oTarget, myst.fDur, FALSE);
 | 
						||
               // Start Heartbeat
 | 
						||
               DelayCommand(6.0f, PrisonNight(myst, oTarget, (FloatToInt(myst.fDur) / 6) - 1));
 | 
						||
            }    
 | 
						||
        }        
 | 
						||
    }
 | 
						||
} |