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.
125 lines
5.2 KiB
Plaintext
125 lines
5.2 KiB
Plaintext
/////////////////////////////////////////////////
|
|
// Leech Field: On Heartbeat
|
|
// 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();
|
|
object oTarget;
|
|
int nDamage;
|
|
float fDelay;
|
|
|
|
//Capture the first target object in the shape.
|
|
oTarget = GetFirstInPersistentObject();
|
|
|
|
|
|
// If oCaster is not valid
|
|
if( !GetIsObjectValid(oCaster) )
|
|
{
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
DestroyObject( OBJECT_SELF );
|
|
return;
|
|
}
|
|
|
|
//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;
|
|
|
|
|
|
|
|
while( GetIsObjectValid(oTarget) )
|
|
{
|
|
//Declare the spell shape, size and the location.
|
|
if( spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE,
|
|
GetAreaOfEffectCreator()) )
|
|
{
|
|
fDelay = PRCGetRandomDelay(0.5, 2.0);
|
|
//Roll damage.
|
|
// 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.");
|
|
nDamage = d6(4);
|
|
//Adjust damage for Save
|
|
if( PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetEpicSpellSaveDC(GetAreaOfEffectCreator(), oTarget) , //B-chngd to nDC
|
|
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)) );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//Select the next target within the spell shape.
|
|
oTarget = GetNextInPersistentObject();
|
|
}
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
}
|