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