PRC8/nwn/nwnprc/trunk/spells/sp_deathknell.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

130 lines
4.6 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Death Knell
//:: sp_deathknell.nss
//:://////////////////////////////////////////////
/*
Death Knell
Necromancy [Death, Evil]
Level: Clr 2, Death 2
Components: V, S
Casting Time: 1 standard action
Range: Touch
Target: Living creature touched
Duration: Instantaneous/10 minutes per HD
of subject; see text
Saving Throw: Will negates
Spell Resistance: Yes
You draw forth the ebbing life force of a creature
and use it to fuel your own power. Upon casting
this spell, you touch a living creature that has
-1 or fewer hit points. If the subject fails its
saving throw, it dies, and you gain 1d8 temporary
hit points and a +2 bonus to Strength.
Additionally, your effective caster level goes up
by +1, improving spell effects dependent on caster
level. (This increase in effective caster level
does not grant you access to more spells.) These
effects last for 10 minutes per HD of the subject
creature.
*/
//:://////////////////////////////////////////////
//:: Created By: Stratovarius
//:: Created On: Sept 13, 2004
//:://////////////////////////////////////////////
#include "prc_inc_sp_tch"
#include "prc_sp_func"
#include "prc_add_spell_dc"
int DoSpell(object oCaster, object oTarget, int nCasterLevel)
{
int iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
if(iAttackRoll)
{
int nMetaMagic = PRCGetMetaMagicFeat();
int nPenetr = nCasterLevel + SPGetPenetr();
float fDuration = TurnsToSeconds(GetHitDice(oTarget));
if(nMetaMagic & METAMAGIC_EXTEND)
fDuration *= 2;
int nBonus = d8(1);
if(nMetaMagic & METAMAGIC_MAXIMIZE)
nBonus = 8;
if(nMetaMagic & METAMAGIC_EMPOWER)
nBonus += (nBonus / 2);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, 2);
effect eHP = EffectTemporaryHitpoints(nBonus);
effect eVis2 = EffectVisualEffect(VFX_IMP_DEATH_L);
effect eVis = EffectVisualEffect(VFX_IMP_HOLY_AID);
effect eLink = EffectLinkEffects(eStr, eDur);
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_DEATH_KNELL));
if(GetCurrentHitPoints(oTarget) < 10 && PRCGetIsAliveCreature(oTarget))
{
if(!PRCDoResistSpell(oCaster, oTarget, nPenetr))
{
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, PRCGetSaveDC(oTarget, oCaster), SAVING_THROW_TYPE_DEATH))
{
//Apply the VFX impact and effects
DeathlessFrenzyCheck(oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget);
if(GetIsDead(oTarget))
{
//Remove previous bonuses
PRCRemoveEffectsFromSpell(oCaster, SPELL_DEATH_KNELL);
//Apply the bonuses to the PC
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oCaster);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oCaster, fDuration, TRUE, SPELL_DEATH_KNELL, nCasterLevel);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eHP, oCaster, fDuration, TRUE, SPELL_DEATH_KNELL, nCasterLevel);
}
}
}
}
else
{
FloatingTextStringOnCreature("*Death Knell failure: The target isn't weak enough*", oCaster, FALSE);
}
}
return iAttackRoll; //return TRUE if spell charges should be decremented
}
void main()
{
if (!X2PreSpellCastCode()) return;
PRCSetSchool(SPELL_SCHOOL_NECROMANCY);
object oCaster = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nCasterLevel = PRCGetCasterLevel(oCaster);
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags
if(!nEvent) //normal cast
{
if(GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget)
{ //holding the charge, casting spell on self
SetLocalSpellVariables(oCaster, 1); //change 1 to number of charges
return;
}
DoSpell(oCaster, oTarget, nCasterLevel);
}
else
{
if(nEvent & PRC_SPELL_EVENT_ATTACK)
{
if(DoSpell(oCaster, oTarget, nCasterLevel))
DecrementSpellCharges(oCaster);
}
}
PRCSetSchool();
}