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.
148 lines
5.3 KiB
Plaintext
148 lines
5.3 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Sunbeam
|
|
//:: s_Sunbeam.nss
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
//:: All creatures in the beam are struck blind and suffer 4d6 points of damage. (A successful
|
|
//:: Reflex save negates the blindness and reduces the damage by half.) Creatures to whom sunlight
|
|
//:: is harmful or unnatural suffer double damage.
|
|
//::
|
|
//:: Undead creatures caught within the ray are dealt 1d6 points of damage per caster level
|
|
//:: (maximum 20d6), or half damage if a Reflex save is successful. In addition, the ray results in
|
|
//:: the total destruction of undead creatures specifically affected by sunlight if they fail their saves.
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Keith Soleski
|
|
//:: Created On: Feb 22, 2001
|
|
//:://////////////////////////////////////////////
|
|
//:: Last Modified By: Keith Soleski, On: March 21, 2001
|
|
//:: VFX Pass By: Preston W, On: June 25, 2001
|
|
|
|
//:: modified by mr_bumpkin Dec 4, 2003
|
|
#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())
|
|
{
|
|
// If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
|
|
return;
|
|
}
|
|
|
|
// End of Spell Cast Hook
|
|
|
|
|
|
//Declare major variables
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
|
|
effect eVis2 = EffectVisualEffect(VFX_IMP_SUNSTRIKE);
|
|
effect eStrike = EffectVisualEffect(VFX_FNF_SUNBEAM);
|
|
effect eDam;
|
|
effect eBlind = EffectBlindness();
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
|
effect eLink = EffectLinkEffects(eBlind, eDur);
|
|
int CasterLvl = PRCGetCasterLevel(OBJECT_SELF);
|
|
int nDamage;
|
|
int nOrgDam;
|
|
int nMax;
|
|
float fDelay;
|
|
int nBlindLength = 3;
|
|
|
|
|
|
int nPenetr = CasterLvl + SPGetPenetr();
|
|
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eStrike, PRCGetSpellTargetLocation());
|
|
//Get the first target in the spell area
|
|
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, PRCGetSpellTargetLocation());
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
|
|
int nCasterLevel= CasterLvl;
|
|
//Limit caster level
|
|
if (nCasterLevel > 20)
|
|
{
|
|
nCasterLevel = 20;
|
|
}
|
|
|
|
// Make a faction check
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
|
|
{
|
|
fDelay = PRCGetRandomDelay(1.0, 2.0);
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_SUNBEAM));
|
|
//Make an SR check
|
|
if ( ! PRCDoResistSpell(OBJECT_SELF, oTarget,nPenetr, 1.0))
|
|
{
|
|
//Check if the target is an undead
|
|
if (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
|
|
{
|
|
//Roll damage and save
|
|
nDamage = d6(nCasterLevel);
|
|
nMax = 6;
|
|
}
|
|
else
|
|
{
|
|
//Roll damage and save
|
|
nDamage = d6(3);
|
|
nOrgDam = nDamage;
|
|
nMax = 6;
|
|
nCasterLevel = 3;
|
|
//Get the adjusted damage due to Reflex Save, Evasion or Improved Evasion
|
|
}
|
|
|
|
//Do metamagic checks
|
|
if ((nMetaMagic & METAMAGIC_MAXIMIZE))
|
|
{
|
|
nDamage = nMax * nCasterLevel;
|
|
}
|
|
if ((nMetaMagic & METAMAGIC_EMPOWER))
|
|
{
|
|
nDamage = nDamage + (nDamage/2);
|
|
}
|
|
|
|
nDamage += SpellDamagePerDice(OBJECT_SELF, nCasterLevel);
|
|
int nDC = PRCGetSaveDC(oTarget,OBJECT_SELF);
|
|
|
|
//Check that a reflex save was made.
|
|
if(PRCMySavingThrow(SAVING_THROW_REFLEX, oTarget, (nDC), SAVING_THROW_TYPE_DIVINE, OBJECT_SELF, 1.0) == 0)
|
|
{
|
|
DelayCommand(1.0, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(nBlindLength),TRUE,-1,CasterLvl));
|
|
}
|
|
else
|
|
{
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, 0, SAVING_THROW_TYPE_DIVINE);
|
|
}
|
|
//Set damage effect
|
|
eDam = PRCEffectDamage(oTarget, nDamage, DAMAGE_TYPE_DIVINE);
|
|
if(nDamage > 0)
|
|
{
|
|
//Apply the damage effect and VFX impact
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget));
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
|
|
PRCBonusDamage(oTarget);
|
|
}
|
|
}
|
|
}
|
|
//Get the next target in the spell area
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, PRCGetSpellTargetLocation());
|
|
}
|
|
|
|
|
|
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
// Getting rid of the integer used to hold the spells spell school
|
|
}
|