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.
104 lines
3.8 KiB
Plaintext
104 lines
3.8 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Burning Bolt
|
|
//:: sp_burnbol.nss
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
Caster Level(s): Wizard / Sorcerer 1
|
|
Innate Level: 1
|
|
School: Evocation
|
|
Descriptor(s): Fire
|
|
Component(s): Verbal, Somatic
|
|
Range: Long
|
|
Target: Single
|
|
Duration: Instant
|
|
Save: None
|
|
Spell Resistance: Yes
|
|
|
|
The caster creates a bolt of fire that is aimed
|
|
at the target with a ranged touch attack. After
|
|
level 1, the spell creates 1 additional missile
|
|
every two caster levels. Bolts do 1D4+1 points
|
|
of fire damage each.
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
|
|
#include "prc_inc_sp_tch"
|
|
|
|
void main()
|
|
{
|
|
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
|
if (!X2PreSpellCastCode()) return;
|
|
|
|
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
|
|
|
object oCaster = OBJECT_SELF;
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
|
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCaster))
|
|
{
|
|
// Declare major variables
|
|
int nCasterLvl = PRCGetCasterLevel(oCaster);
|
|
int nPenetr= nCasterLvl + SPGetPenetr();
|
|
float fDist = GetDistanceBetween(oCaster, oTarget);
|
|
float fDelay = fDist/(3.0 * log(fDist) + 2.0);
|
|
effect eMissile = EffectVisualEffect(VFX_IMP_MIRV_FLAME);
|
|
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_BURNING_BOLT));
|
|
|
|
//Make SR Check
|
|
if (!PRCDoResistSpell(oCaster, oTarget, nPenetr, fDelay))
|
|
{
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int nCnt;
|
|
int nMissiles = (nCasterLvl + 1)/2;
|
|
float fDelay2, fTime;
|
|
effect eVis = EffectVisualEffect(VFX_IMP_FLAME_S);
|
|
|
|
// Get the proper damage type adjusted for classes/feats.
|
|
int nDamageType = ChangedElementalDamage(oCaster, DAMAGE_TYPE_FIRE);
|
|
|
|
//Apply a single damage hit for each missile instead of as a single mass
|
|
for (nCnt = 1; nCnt <= nMissiles; nCnt++)
|
|
{
|
|
fTime = fDelay;
|
|
fDelay2 += 0.1;
|
|
fTime += fDelay2;
|
|
|
|
int nTouchAttack = PRCDoRangedTouchAttack(oTarget);
|
|
if (nTouchAttack > 0)
|
|
{
|
|
int nDamage = d4(1) + 1;
|
|
if(nMetaMagic & METAMAGIC_MAXIMIZE)
|
|
nDamage = 5;
|
|
if(nMetaMagic & METAMAGIC_EMPOWER)
|
|
nDamage += (nDamage/2);
|
|
nDamage += SpellDamagePerDice(oCaster, 1);
|
|
// if this is the first target / first attack do sneak damage
|
|
if(nCnt == 1)
|
|
{
|
|
ApplyTouchAttackDamage(oCaster, oTarget, nTouchAttack, nDamage, nDamageType);
|
|
}
|
|
else
|
|
nDamage *= nTouchAttack;
|
|
|
|
// apply the damage and the damage visual effect.
|
|
effect eDamage = PRCEffectDamage(oTarget, nDamage, nDamageType);
|
|
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget));
|
|
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
|
|
}
|
|
// Always apply the MIRV effect because we're trying to hit the target whether we
|
|
// actually succeed or not.
|
|
DelayCommand(fDelay2, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget));
|
|
}
|
|
}
|
|
else
|
|
// SR check failed, have to make animation for missiles but no damage.
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget);
|
|
}
|
|
PRCSetSchool();
|
|
}
|