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

99 lines
4.9 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Epic Spell: Godsmite
//:: Author: Boneshank (Don Armstrong)
#include "prc_alterations"
//#include "x2_inc_spellhook"
#include "inc_epicspells"
#include "x0_i0_position"
void main()
{
if (!X2PreSpellCastCode()) return;
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
object oCaster = OBJECT_SELF;
if(GetCanCastSpell(oCaster, SPELL_EPIC_GODSMIT))
{
//Declare major variables
object oTarget = PRCGetSpellTargetObject();
int nSpellPower = GetTotalCastingLevel(oCaster);
int nDam, iCAling, iTAling;
object oArea = GetArea(oTarget);
location lTarget;
// if this option has been enabled, the caster will take backlash damage
if(GetPRCSwitch(PRC_EPIC_BACKLASH_DAMAGE))
{
effect eCast = EffectVisualEffect(VFX_IMP_DIVINE_STRIKE_HOLY);
int nDamage = d4(nSpellPower);
effect eDam = EffectDamage(nDamage, DAMAGE_TYPE_DIVINE);
DelayCommand(3.0, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eCast, oCaster));
DelayCommand(3.0, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oCaster));
}
//Fire cast spell at event for the specified target
SignalEvent(oTarget, EventSpellCastAt(oCaster, PRCGetSpellId()));
//Roll damage
iCAling = GetAlignmentGoodEvil(oCaster);
iTAling = GetAlignmentGoodEvil(oTarget);
if(iCAling == iTAling)
nDam = d4(nSpellPower);
else if(iCAling == ALIGNMENT_NEUTRAL || iTAling == ALIGNMENT_NEUTRAL)
nDam = d6(nSpellPower);
else
nDam = d8(nSpellPower);
iCAling = GetAlignmentLawChaos(oCaster);
iTAling = GetAlignmentLawChaos(oTarget);
if(iCAling == iTAling)
nDam += d4(nSpellPower);
else if(iCAling == ALIGNMENT_NEUTRAL || iTAling == ALIGNMENT_NEUTRAL)
nDam += d6(nSpellPower);
else
nDam += d8(nSpellPower);
//Set damage effect
if(PRCMySavingThrow(SAVING_THROW_FORT, oTarget, GetEpicSpellSaveDC(oCaster, oTarget), SAVING_THROW_TYPE_SPELL, oCaster))
{
nDam /=2;
// This script does nothing if it has Mettle, bail
if(GetHasMettle(oTarget, SAVING_THROW_FORT))
nDam = 0;
}
effect eDam = EffectDamage(nDam, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_PLUS_TWENTY);
lTarget = GetRandomLocation(oArea, oTarget, 4.0);
DelayCommand(0.4, ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lTarget));
lTarget = GetRandomLocation(oArea, oTarget, 3.5);
DelayCommand(0.8, ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lTarget));
lTarget = GetRandomLocation(oArea, oTarget, 3.0);
DelayCommand(1.2, ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lTarget));
lTarget = GetRandomLocation(oArea, oTarget, 2.5);
DelayCommand(1.6, ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lTarget));
lTarget = GetRandomLocation(oArea, oTarget, 2.0);
DelayCommand(2.0, ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lTarget));
lTarget = GetRandomLocation(oArea, oTarget, 1.5);
DelayCommand(2.4, ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lTarget));
lTarget = GetRandomLocation(oArea, oTarget, 1.0);
DelayCommand(2.7, ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lTarget));
lTarget = GetRandomLocation(oArea, oTarget, 0.5);
DelayCommand(3.0, ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_LIGHTNING_M), lTarget));
ApplyEffectAtLocation (DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_SCREEN_SHAKE), GetLocation(oTarget));
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_INTERPOSING_HAND), oTarget, 0.75, TRUE, -1, nSpellPower);
DelayCommand(0.75, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_GRASPING_HAND), oTarget, 1.0, TRUE, -1, nSpellPower));
DelayCommand(1.75, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_CLENCHED_FIST), oTarget, 0.75, TRUE, -1, nSpellPower));
DelayCommand(2.5, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_DUR_BIGBYS_CRUSHING_HAND), oTarget, 1.0, TRUE, -1, nSpellPower));
DelayCommand(3.0, SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_HIT_DIVINE), oTarget));
DelayCommand(3.0, SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_COM_CHUNK_STONE_MEDIUM), oTarget));
DelayCommand(3.1, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
}
PRCSetSchool();
}