PRC8/nwn/nwnprc/trunk/newspellbook/inv_painslumber.nss
Jaysyn904 2caeb8941c 2025/05/13 Update
Updated TF Shadowlord's prereq 2da.
Fixed CW Samurai's TWF levelup issue.
Added CW Samurai's skill 2DA back in.
Cleaned up ECL 2DA.
Fixed prereq bug with Imp Crit Eagle Claw.
Added Ability Focus feats for all Shapes, Essences & Invocations with DCs.
Fixed bug with 6th slot of crafting spells prereqs.
Added Reth Dekala HD to Initiator total.
Removed Dark Sun race files.
Updated all racial outsiders, monstrous humanoids, aberrations, giants, humanoids and fey to have the correct weapon & armor profs.
2025-05-13 23:05:31 -04:00

114 lines
4.1 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 (GetHasFeat(FEAT_ABFOC_PAINFUL_SLUMBER_OF_THE_AGES, oCaster)) nDC += 2;
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);
}
}
}
}