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.
95 lines
3.8 KiB
Plaintext
95 lines
3.8 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Scintillating Sphere
|
|
//:: X2_S0_ScntSphere
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
// A scintillating sphere is a burst of electricity
|
|
// that detonates with a low roar and inflicts 1d6
|
|
// points of damage per caster level (maximum of 10d6)
|
|
// to all creatures within the area. Unattended objects
|
|
// also take damage. The explosion creates almost no pressure.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Andrew Nobbs
|
|
//:: Created On: Nov 25 , 2002
|
|
//:://////////////////////////////////////////////
|
|
//:: Last Updated By: Andrew Nobbs, 02/06/2003
|
|
//:: altered by mr_bumpkin Dec 4, 2003 for prc stuff
|
|
#include "prc_inc_spells"
|
|
#include "prc_add_spell_dc"
|
|
|
|
void ApplyDamage(object oTarget, effect eDamage)
|
|
{
|
|
effect eVis = EffectVisualEffect(VFX_IMP_LIGHTNING_S);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
|
PRCBonusDamage(oTarget);
|
|
}
|
|
|
|
void main()
|
|
{
|
|
if(!X2PreSpellCastCode()) return;
|
|
|
|
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
|
|
|
//Declare major variables
|
|
object oCaster = OBJECT_SELF;
|
|
location lTarget = PRCGetSpellTargetLocation();
|
|
int nCasterLvl = PRCGetCasterLevel(oCaster);
|
|
int nPenetr = nCasterLvl + SPGetPenetr();
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int EleDmg = ChangedElementalDamage(oCaster, DAMAGE_TYPE_ELECTRICAL);
|
|
int nSaveType = ChangedSaveType(EleDmg);
|
|
int nDamage;
|
|
float fDelay;
|
|
effect eDam;
|
|
|
|
//Limit Caster level for the purposes of damage
|
|
if (nCasterLvl > 10)
|
|
nCasterLvl = 10;
|
|
|
|
//Apply the fireball explosion at the location captured above.
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_ELECTRIC_EXPLOSION), lTarget);
|
|
|
|
//Cycle through the targets within the spell shape until an invalid object is captured.
|
|
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCaster))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_SCINTILLATING_SPHERE));
|
|
|
|
if (!PRCDoResistSpell(oCaster, oTarget, nPenetr, fDelay))
|
|
{
|
|
//Roll damage for each target
|
|
nDamage = d6(nCasterLvl);
|
|
//Resolve metamagic
|
|
if(nMetaMagic & METAMAGIC_MAXIMIZE)
|
|
nDamage = 6 * nCasterLvl;
|
|
if(nMetaMagic & METAMAGIC_EMPOWER)
|
|
nDamage += nDamage / 2;
|
|
nDamage += SpellDamagePerDice(oCaster, nCasterLvl);
|
|
|
|
|
|
int nDC = PRCGetSaveDC(oTarget, oCaster);
|
|
//Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC, nSaveType);
|
|
|
|
if(nDamage > 0)
|
|
{
|
|
//Get the distance between the explosion and the target to calculate delay
|
|
fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
|
|
//Set the damage effect
|
|
eDam = PRCEffectDamage(oTarget, nDamage, EleDmg);
|
|
// Apply effects to the currently selected target.
|
|
DelayCommand(fDelay, ApplyDamage(oTarget, eDam));
|
|
}
|
|
}
|
|
}
|
|
//Select the next target within the spell shape.
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|
}
|
|
PRCSetSchool();
|
|
} |