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.
82 lines
3.3 KiB
Plaintext
82 lines
3.3 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Name Terrifying Roar
|
|
//:: FileName inv_dra_terrroar.nss
|
|
//::///////////////////////////////////////////////
|
|
/*
|
|
|
|
Greater Invocation
|
|
5th Level Spell
|
|
|
|
You utter a powerful roar that fills a 30' cone.
|
|
All creatures whose hit dice are equal to or less
|
|
than your caster level become panicked for 1 round.
|
|
If they succeed on a Will save they are shaken for
|
|
one round. This is a mind-affecting fear effect.
|
|
|
|
*/
|
|
//::///////////////////////////////////////////////
|
|
|
|
#include "inv_inc_invfunc"
|
|
#include "inv_invokehook"
|
|
|
|
void main()
|
|
{
|
|
if(!PreInvocationCastCode()) return;
|
|
|
|
// shaken -2 attack,weapon dmg,save.
|
|
// panicked -2 save + flee away ,50 % drop object holding
|
|
|
|
//Declare major variables
|
|
object oCaster = OBJECT_SELF;
|
|
location lTarget = PRCGetSpellTargetLocation();
|
|
int CasterLvl = GetInvokerLevel(oCaster, GetInvokingClass());
|
|
int nPenetr = CasterLvl + SPGetPenetr();
|
|
float fDuration = RoundsToSeconds(CasterLvl);
|
|
float fRange = FeetToMeters(30.0);
|
|
float fDelay;
|
|
effect eVis = EffectVisualEffect(VFX_IMP_FEAR_S);
|
|
effect eFear = EffectFrightened();
|
|
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_FEAR);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
|
effect eSaveD = EffectSavingThrowDecrease(SAVING_THROW_ALL,2);
|
|
effect eShaken = EffectShaken();
|
|
|
|
//Link the panicked effects
|
|
effect eLink = EffectLinkEffects(eFear, eMind);
|
|
eLink = EffectLinkEffects(eLink, eSaveD);
|
|
eLink = EffectLinkEffects(eLink, eDur);
|
|
//Link the shaken effects
|
|
effect eLink2 = EffectLinkEffects(eShaken, eDur);
|
|
|
|
//Get first target in the spell cone
|
|
object oTarget = MyFirstObjectInShape(SHAPE_SPELLCONE, fRange, lTarget, TRUE, OBJECT_TYPE_CREATURE, GetPosition(OBJECT_SELF));
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCaster)
|
|
&& !(GetHitDice(oTarget) > CasterLvl))
|
|
{
|
|
fDelay = GetDistanceBetween(oCaster, oTarget)/20;
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oCaster, INVOKE_TERRIFYING_ROAR));
|
|
//Make SR Check
|
|
if(!PRCDoResistSpell(oCaster, oTarget, nPenetr, fDelay))
|
|
{
|
|
//Make a will save - if failed, panicked
|
|
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, GetInvocationSaveDC(oTarget, oCaster), SAVING_THROW_TYPE_FEAR, oCaster, fDelay))
|
|
{
|
|
//Apply the linked effects and the VFX impact
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, 6.0, TRUE, -1, CasterLvl));
|
|
}
|
|
//otherwise shaken
|
|
else
|
|
{
|
|
//Apply the linked effects and the VFX impact
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink2, oTarget, 6.0, TRUE, -1, CasterLvl));
|
|
}
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
|
|
}
|
|
}
|
|
//Get next target in the spell cone
|
|
oTarget = MyNextObjectInShape(SHAPE_SPELLCONE, fRange, lTarget, TRUE, OBJECT_TYPE_CREATURE, GetPosition(oCaster));
|
|
}
|
|
} |