PRC8/nwn/nwnprc/trunk/newspellbook/inv_painslumber.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

112 lines
4.0 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Sleep
//:: NW_S0_Sleep
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
Goes through the area and sleeps the lowest 4+d4
HD of creatures first.
*/
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: March 7 , 2001
//:://////////////////////////////////////////////
//:: Last Updated By: Preston Watamaniuk, On: April 11, 2001
//:: VFX Pass By: Preston W, On: June 25, 2001
//:: modified by mr_bumpkin Dec 4, 2003
#include "prc_inc_spells"
#include "prc_alterations"
#include "inv_inc_invfunc"
#include "inv_invokehook"
void DoSleepCheck(object oTarget, int nSleepCheck, object oCaster)
{
if(nSleepCheck != GetLocalInt(oTarget, "nSleepCheck"))
return;
int nDC = GetInvocationSaveDC(oTarget, oCaster);
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, (nDC), SAVING_THROW_TYPE_MIND_SPELLS))
{
DelayCommand(HoursToSeconds(24), DoSleepCheck(oTarget, nSleepCheck, oCaster));
}
else
{
DeleteLocalInt(oTarget, "PainfulSleep");
PRCRemoveSpellEffects(INVOKE_PAINFUL_SLUMBER_OF_AGES, oCaster, oTarget);
}
}
void DoDamageCheck(object oTarget, int nSleepCheck)
{
if(nSleepCheck != GetLocalInt(oTarget, "nSleepCheck"))
return;
if(!PRCGetHasEffect(EFFECT_TYPE_SLEEP, oTarget))
{
if(DEBUG) DoDebug("inv_painslumber: Target awakened unnaturally");
effect eSleepDam = EffectDamage(GetLocalInt(oTarget, "PainfulSleep"), DAMAGE_TYPE_MAGICAL);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eSleepDam, oTarget);
DeleteLocalInt(oTarget, "PainfulSleep");
}
else
DelayCommand(3.0, DoDamageCheck(oTarget, nSleepCheck));
}
void main()
{
if (!PreInvocationCastCode()) return;
//Declare major variables
object oTarget = PRCGetSpellTargetObject();
effect eImpact = EffectVisualEffect(VFX_FNF_LOS_NORMAL_20);
effect eSleep = EffectSleep();
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eVis = EffectVisualEffect(VFX_IMP_SLEEP);
effect eLink = EffectLinkEffects(eSleep, eMind);
eLink = EffectLinkEffects(eLink, eDur);
// * Moved the linking for the ZZZZs into the later code
// * so that they won't appear if creature immune
int CasterLvl = GetInvokerLevel(OBJECT_SELF, GetInvokingClass());
int nPenetr = CasterLvl + SPGetPenetr();
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eImpact, PRCGetSpellTargetLocation());
string sSpellLocal = "BIOWARE_SPELL_LOCAL_SLEEP_" + ObjectToString(OBJECT_SELF);
//Get the first target in the spell area
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, INVOKE_PAINFUL_SLUMBER_OF_AGES));
//Make SR check
if (!PRCDoResistSpell(OBJECT_SELF, oTarget, nPenetr))
{
int nDC = GetInvocationSaveDC(oTarget,OBJECT_SELF);
//Make Will save
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, (nDC), SAVING_THROW_TYPE_MIND_SPELLS))
{
if (GetIsImmune(oTarget, IMMUNITY_TYPE_SLEEP) == FALSE)
{
effect eLink2 = EffectLinkEffects(eLink, eVis);
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink2, oTarget, 0.0,TRUE,-1,CasterLvl);
SetLocalInt(oTarget, "PainfulSleep", CasterLvl);
//set up the 24 hour saving throws
int nSleepCheck = GetLocalInt(oTarget, "nSleepCheck");
if(nSleepCheck > 30) nSleepCheck = 1;
DelayCommand(3.0, DoDamageCheck(oTarget, nSleepCheck));
SetLocalInt(oTarget, "nSleepCheck", nSleepCheck);
DelayCommand(HoursToSeconds(24), DoSleepCheck(oTarget, nSleepCheck, OBJECT_SELF));
}
else
// * even though I am immune apply just the sleep effect for the immunity message
{
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSleep, oTarget, 6.0,TRUE,-1,CasterLvl);
}
}
}
}