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.
130 lines
4.6 KiB
Plaintext
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();
|
|
} |