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