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.
99 lines
4.9 KiB
Plaintext
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();
|
|
}
|