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.
104 lines
3.6 KiB
Plaintext
104 lines
3.6 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Name Eldritch Blast - Normal
|
|
//:: FileName inv_eldtch_blast.nss
|
|
//:://////////////////////////////////////////////
|
|
#include "inv_inc_invfunc"
|
|
#include "inv_invokehook"
|
|
|
|
void main()
|
|
{
|
|
object oPC = OBJECT_SELF;
|
|
SetLocalInt(oPC, PRC_INVOKING_CLASS, CLASS_TYPE_WARLOCK + 1);
|
|
|
|
if(!PreInvocationCastCode()) return;
|
|
|
|
if(!CheckTurnUndeadUses(oPC, 1))
|
|
{
|
|
SpeakStringByStrRef(40550);//"This ability is tied to your turn undead ability, which has no more uses for today."
|
|
return;
|
|
}
|
|
|
|
location lTargetArea = GetLocation(oPC);
|
|
int bSculptor = GetHasFeat(FEAT_ELDRITCH_SCULPTOR, oPC);
|
|
|
|
float fRange, fDelay;
|
|
int nImpVFX, nDamage, nRace;
|
|
effect eHealVFX = EffectVisualEffect(VFX_IMP_HEALING_M);
|
|
effect eHarmVFX = EffectVisualEffect(VFX_IMP_SUNSTRIKE);
|
|
|
|
if(bSculptor)
|
|
{
|
|
fRange = FeetToMeters(40.0);
|
|
nImpVFX = VFX_FNF_LOS_HOLY_30;
|
|
}
|
|
else
|
|
{
|
|
fRange = FeetToMeters(20.0);
|
|
nImpVFX = VFX_FNF_LOS_HOLY_20;
|
|
}
|
|
|
|
//calculate DC for essence effects
|
|
int nInvLevel = GetInvokerLevel(oPC, CLASS_TYPE_WARLOCK);
|
|
int nDmgDice = GetBlastDamageDices(oPC, nInvLevel);
|
|
int nPenetr = nInvLevel + SPGetPenetr();
|
|
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, EffectVisualEffect(nImpVFX), lTargetArea);
|
|
|
|
//Get first target in spell area
|
|
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRange, lTargetArea, TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
fDelay = GetDistanceBetween(oPC, oTarget)/20;
|
|
nDamage = d6(nDmgDice);
|
|
|
|
nRace = MyPRCGetRacialType(oTarget);
|
|
if(nRace == RACIAL_TYPE_UNDEAD)
|
|
{
|
|
if(!GetIsReactionTypeFriendly(oTarget))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oPC, INVOKE_HEALING_BLAST));
|
|
|
|
if(!PRCDoResistSpell(oPC, oTarget, nPenetr, fDelay))
|
|
{
|
|
//Apply damage effect and VFX impact
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDamage, DAMAGE_TYPE_POSITIVE), oTarget));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eHarmVFX, oTarget));
|
|
}
|
|
}
|
|
}
|
|
else if((nRace == RACIAL_TYPE_CONSTRUCT && !GetIsWarforged(oTarget))
|
|
|| GetHasFeat(FEAT_IMPROVED_FORTIFICATION, oTarget))
|
|
{
|
|
//nothing
|
|
}
|
|
else if(!GetIsReactionTypeHostile(oTarget) || GetFactionEqual(oTarget)
|
|
&& (GetHasFeat(FEAT_TOMB_TAINTED_SOUL, oTarget) && GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oPC, INVOKE_HEALING_BLAST, FALSE));
|
|
|
|
if(GetIsWarforged(oTarget))
|
|
nDamage /= 2;
|
|
|
|
//Apply heal effect and VFX impact
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectHeal(nDamage), oTarget));
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eHealVFX, oTarget));
|
|
}
|
|
|
|
//Get next target in spell area
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRange, lTargetArea, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
|
|
/*if(bSculptor)
|
|
{
|
|
if(!GetLocalInt(oPC, "UsingSecondBlast"))
|
|
{
|
|
SetLocalInt(oPC, "UsingSecondBlast", TRUE);
|
|
UseInvocation(INVOKE_HEALING_BLAST, CLASS_TYPE_WARLOCK, 0, TRUE);
|
|
}
|
|
else
|
|
DeleteLocalInt(oPC, "UsingSecondBlast");
|
|
}*/
|
|
}
|