PRC8/nwn/nwnprc/trunk/epicspellscripts/tm_s0_epleecha.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

110 lines
4.5 KiB
Plaintext

/////////////////////////////////////////////////
// Leech Field: On Enter
// tm_s0_epleech.nss
//-----------------------------------------------
// Created By: Nron Ksr
// Created On: 03/15/2004
// Description: An AoE that saps the life of those in the
// field and transfers it to the caster.
/////////////////////////////////////////////////
// Last Updated: 03/15/2004, Nron Ksr
/////////////////////////////////////////////////
#include "prc_alterations"
//#include "x2_inc_spellhook"
#include "inc_epicspells"
void main()
{
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_NECROMANCY);
//Declare major variables
object oCaster = GetAreaOfEffectCreator();
int nDamage;
object oTarget;
float fDelay;
//Capture the first target object in the shape.
oTarget = GetEnteringObject();
//Declare and assign personal impact visual effect.
effect eVisHeal = EffectVisualEffect( VFX_IMP_HEALING_M );
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
effect eBad = EffectVisualEffect( VFX_IMP_NEGATIVE_ENERGY );
effect eDam, eHeal;
//Declare major variables
//Declare the spell shape, size and the location.
if( spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCaster) )
{
fDelay = PRCGetRandomDelay(0.5, 2.0);
// Apply effects to the currently selected target.
// * any undead should be healed, not just Friendlies
if( MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD
|| (GetHasFeat(FEAT_TOMB_TAINTED_SOUL, oTarget) && GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD)
|| GetLocalInt(oTarget, "AcererakHealing"))
{
//Fire cast spell at event for the specified target
SignalEvent( oTarget,
EventSpellCastAt(OBJECT_SELF, SPELL_NEGATIVE_ENERGY_BURST) );
//Set the heal effect
eHeal = EffectHeal(d6(4));
DelayCommand( fDelay,
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget) );
DelayCommand( fDelay,
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVisHeal, oTarget) );
DelayCommand( fDelay,
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eDur, oTarget) );
}
else
{
if( !PRCDoResistSpell(oCaster, oTarget, GetTotalCastingLevel(oCaster)+SPGetPenetr(oCaster), fDelay) )
{
// Debug message.
SendMessageToPC(oCaster, "Not resisted.");
//Roll damage.
nDamage = d6(4);
//Adjust damage for Save
if( PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetEpicSpellSaveDC(GetAreaOfEffectCreator(), oTarget),
SAVING_THROW_TYPE_NEGATIVE, oCaster, fDelay) )
{
nDamage /= 2;
if (GetHasMettle(oTarget, SAVING_THROW_WILL)) // Ignores partial effects
{
nDamage = 0;
}
}
//Fire cast spell at event for the specified target
SignalEvent( oTarget,
EventSpellCastAt(OBJECT_SELF, SPELL_NEGATIVE_ENERGY_BURST) );
//Set the damage effect
eDam = EffectDamage( nDamage, DAMAGE_TYPE_NEGATIVE );
// Apply effects to the currently selected target.
DelayCommand( fDelay,
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget) );
//This visual effect is applied to the target object not the location as above.
DelayCommand( fDelay,
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eBad, oTarget) );
// Heal the caster
if( GetCurrentHitPoints(oCaster) <= GetMaxHitPoints(oCaster) * 2 )
{
eHeal = EffectTemporaryHitpoints(nDamage);
DelayCommand( 2.1,
SPApplyEffectToObject(DURATION_TYPE_INSTANT,
eVisHeal, oCaster) );
DelayCommand( 2.1,
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY,
eHeal, oCaster,
TurnsToSeconds(GetTotalCastingLevel(oCaster)), TRUE, -1, GetTotalCastingLevel(OBJECT_SELF)) );
}
}
}
}
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
}