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