PRC8/nwn/nwnprc/trunk/smp/phs_s_wailofbnsh.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

91 lines
3.3 KiB
Plaintext

/*:://////////////////////////////////////////////
//:: Spell Name Wail of the Banshee
//:: Spell FileName PHS_S_WailofBnsh
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
13.33M radius! 8M range, Death, sonic and fortitude negates - death save.
1 creature/level. Spell resistance = yes.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Massive AOE!
Anyway, this does death to all allies or enemies, who are not dead,
who can hear us (not the other way around) so do not have to be in LOS.
Visual on self, however!
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Spell Hook Check.
if(!PHS_SpellHookCheck(PHS_SPELL_WAIL_OF_THE_BANSHEE)) return;
// Declare major variables
object oCaster = OBJECT_SELF;
object oTarget;
location lTarget = GetSpellTargetLocation();// Should be OBJECT_SELF's location
int nCasterLevel = PHS_GetCasterLevel();
int nSpellSaveDC = PHS_GetSpellSaveDC();
float fDelay, fDistance;
int nCnt, nTargetsAffected;
// Declare effects
effect eDeath = EffectDeath();
effect eDeathVis = EffectVisualEffect(VFX_IMP_DEATH);
// Apply AOE visual
effect eImpact = EffectVisualEffect(VFX_FNF_WAIL_O_BANSHEES);
PHS_ApplyLocationVFX(lTarget, eImpact);
// Get nearest to location, up to nCasterLevel of targets, and loop
nCnt = 1;
oTarget = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, lTarget, nCnt);
while(GetIsObjectValid(oTarget) && nTargetsAffected < nCasterLevel)
{
// Check distance
fDistance = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget));
if(fDistance <= 13.33)
{
fDelay = fDistance/30;
// Check reaction and make sure it is not us
if(!GetIsReactionTypeFriendly(oTarget) && oTarget != oCaster &&
PHS_GetIsAliveCreature(oTarget))
{
// Signal spell cast at
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_WAIL_OF_THE_BANSHEE);
// Check if they can hear us!
if(GetObjectHeard(oCaster, oTarget) &&
PHS_GetCanHear(oTarget))
{
// Check spell resistance and immunity
if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay))
{
// Fortitude death save
if(!PHS_SavingThrow(SAVING_THROW_FORT, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_DEATH, oCaster, fDelay))
{
// Apply death as failed
DelayCommand(fDelay, PHS_ApplyInstantAndVFX(oTarget, eDeathVis, eDeath));
}
}
}
// Add one to targets affected (even if they cannot hear it). It
// only affects any alive things.
nTargetsAffected++;
}
nCnt++;
oTarget = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, lTarget, nCnt);
}
else
{
nCnt = nCasterLevel;
}
}
}