PRC8/nwn/nwnprc/trunk/epicspellscripts/ss_ep_hellball.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

115 lines
4.9 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Hellball
//:: X2_S2_HELLBALL
//:: Copyright (c) 2003 Bioware Corp.
//:://////////////////////////////////////////////
//:: Created By: Andrew Noobs, Georg Zoeller
//:: Created On: 2003-08-20
//:://////////////////////////////////////////////
/*
Altered by Boneshank, for purposes of the Epic Spellcasting project.
*/
#include "prc_alterations"
#include "inc_epicspells"
void main()
{
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
if (!X2PreSpellCastCode())
{
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
return;
}
if (GetCanCastSpell(OBJECT_SELF, SPELL_EPIC_HELBALL))
{
//Declare major variables
int nDamage1, nDamage2, nDamage3, nDamage4;
float fDelay;
effect eExplode = EffectVisualEffect(464);
effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M);
effect eVis2 = EffectVisualEffect(VFX_IMP_ACID_L);
effect eVis3 = EffectVisualEffect(VFX_IMP_SONIC);
// if this option has been enabled, the caster will take damage for casting
// epic spells, as descripbed in the ELHB
if (GetPRCSwitch(PRC_EPIC_BACKLASH_DAMAGE) == TRUE)
{
effect eCast = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
int nDamage5 = d6(10);
effect eDam5 = EffectDamage(nDamage5, DAMAGE_TYPE_NEGATIVE);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eCast, OBJECT_SELF);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam5, OBJECT_SELF);
}
effect eDam1, eDam2, eDam3, eDam4, eDam5, eKnock;
eKnock= EffectKnockdown();
location lTarget = PRCGetSpellTargetLocation();
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, lTarget);
object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 20.0f, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
int nTotalDamage;
while (GetIsObjectValid(oTarget))
{
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
{
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId()));
fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20 + 0.5f;
//Roll damage for each target
nDamage1 = d6(10);
nDamage2 = d6(10);
nDamage3 = d6(10);
nDamage4 = d6(10);
// no we don't care about evasion. there is no evasion to hellball
if (PRCMySavingThrow(SAVING_THROW_REFLEX,oTarget,GetEpicSpellSaveDC(OBJECT_SELF, oTarget),SAVING_THROW_TYPE_SPELL,OBJECT_SELF,fDelay) >0)
{
nDamage1 /=2;
nDamage2 /=2;
nDamage3 /=2;
nDamage4 /=2;
}
nTotalDamage = nDamage1+nDamage2+nDamage3+nDamage4;
//Set the damage effect
eDam1 = EffectDamage(nDamage1, DAMAGE_TYPE_ACID);
eDam2 = EffectDamage(nDamage2, DAMAGE_TYPE_ELECTRICAL);
eDam3 = EffectDamage(nDamage3, DAMAGE_TYPE_FIRE);
eDam4 = EffectDamage(nDamage4, DAMAGE_TYPE_SONIC);
if(nTotalDamage > 0)
{
if (nTotalDamage > 50)
{
DelayCommand(fDelay+0.3f, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oTarget,3.0f, TRUE, -1, GetTotalCastingLevel(OBJECT_SELF)));
}
// Apply effects to the currently selected target.
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam1, oTarget));
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam2, oTarget));
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam3, oTarget));
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam4, oTarget));
//This visual effect is applied to the target object not the location as above. This visual effect
//represents the flame that erupts on the target not on the ground.
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
DelayCommand(fDelay+0.2f, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget));
DelayCommand(fDelay+0.5f, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis3, oTarget));
}
}
//Select the next target within the spell shape.
oTarget = GetNextObjectInShape(SHAPE_SPHERE, 20.0f, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
}
}
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
}