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

165 lines
6.2 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Gedlee's Electric Loop
//:: X2_S0_ElecLoop
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
You create a small stroke of lightning that
cycles through all creatures in the area of effect.
The spell deals 1d6 points of damage per 2 caster
levels (maximum 5d6). Those who fail their Reflex
saves must succeed at a Will save or be stunned
for 1 round.
Spell is standard hostile, so if you use it
in hardcore mode, it will zap yourself!
*/
//:://////////////////////////////////////////////
//:: Created By: Georg Zoeller
//:: Created On: Oct 19 2003
//:://////////////////////////////////////////////
//:: modified by mr_bumpkin Dec 4, 2003 for prc stuff
#include "prc_inc_spells"
#include "prc_add_spell_dc"
void main()
{
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
//--------------------------------------------------------------------------
// Spellcast Hook Code
// Added 2003-06-20 by Georg
// If you want to make changes to all spells, check x2_inc_spellhook.nss to
// find out more
//--------------------------------------------------------------------------
if (!X2PreSpellCastCode())
{
return;
}
// End of Spell Cast Hook
location lTarget = PRCGetSpellTargetLocation();
effect eStrike = EffectVisualEffect(VFX_IMP_LIGHTNING_S);
int nMetaMagic = PRCGetMetaMagicFeat();
float fDelay;
effect eBeam;
int nDamage;
int nPotential;
effect eDam;
object oLastValid;
effect eStun = EffectLinkEffects(EffectVisualEffect(VFX_IMP_STUN),EffectStunned());
//--------------------------------------------------------------------------
// Calculate Damage Dice. 1d per 2 caster levels, max 5d
//--------------------------------------------------------------------------
int CasterLvl = PRCGetCasterLevel(OBJECT_SELF);
int EleDmg = ChangedElementalDamage(OBJECT_SELF, DAMAGE_TYPE_ELECTRICAL);
int nNumDice = CasterLvl/2;
if (nNumDice<1)
{
nNumDice = 1;
}
else if (nNumDice >5)
{
nNumDice = 5;
}
CasterLvl +=SPGetPenetr();
//--------------------------------------------------------------------------
// Loop through all targets
//--------------------------------------------------------------------------
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while (GetIsObjectValid(oTarget))
{
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
{
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId()));
//------------------------------------------------------------------
// Calculate delay until spell hits current target. If we are the
// first target, the delay is the time until the spell hits us
//------------------------------------------------------------------
if (GetIsObjectValid(oLastValid))
{
fDelay += 0.2f;
fDelay += GetDistanceBetweenLocations(GetLocation(oLastValid), GetLocation(oTarget))/20;
}
else
{
fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
}
//------------------------------------------------------------------
// If there was a previous target, draw a lightning beam between us
// and iterate delay so it appears that the beam is jumping from
// target to target
//------------------------------------------------------------------
if (GetIsObjectValid(oLastValid))
{
eBeam = EffectBeam(VFX_BEAM_LIGHTNING, oLastValid, BODY_NODE_CHEST);
DelayCommand(fDelay,SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam,oTarget,1.5f));
}
if (!PRCDoResistSpell(OBJECT_SELF, oTarget,CasterLvl, fDelay))
{
int nDC = PRCGetSaveDC(oTarget,OBJECT_SELF);
nPotential = PRCMaximizeOrEmpower(6, nNumDice, nMetaMagic);
nPotential += SpellDamagePerDice(OBJECT_SELF, nNumDice);
//nPotential += ApplySpellBetrayalStrikeDamage(oTarget, OBJECT_SELF);
nDamage = PRCGetReflexAdjustedDamage(nPotential, oTarget, (nDC), SAVING_THROW_TYPE_ELECTRICITY);
//--------------------------------------------------------------
// If we failed the reflex save, we save vs will or are stunned
// for one round
//--------------------------------------------------------------
if (nPotential == nDamage || (GetHasFeat(FEAT_IMPROVED_EVASION,oTarget) && nDamage == (nPotential/2)))
{
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, (nDC), SAVING_THROW_TYPE_MIND_SPELLS, OBJECT_SELF, fDelay))
{
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY,eStun,oTarget, RoundsToSeconds(1)));
}
}
if (nDamage >0)
{
eDam = PRCEffectDamage(oTarget, nDamage, EleDmg);
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
PRCBonusDamage(oTarget);
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eStrike, oTarget));
}
}
//------------------------------------------------------------------
// Store Target to make it appear that the lightning bolt is jumping
// from target to target
//------------------------------------------------------------------
oLastValid = oTarget;
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_SMALL, lTarget, TRUE, OBJECT_TYPE_CREATURE );
}
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
// Erasing the variable used to store the spell's spell school
}