PRC8/trunk/spells/sp_ray_exhst.nss

122 lines
3.2 KiB
Plaintext
Raw Normal View History

//::///////////////////////////////////////////////
//:: Name Ray of Exhaustion
//:: FileName sp_ray_exhst.nss
//:://////////////////////////////////////////////
/**@file Ray of Exhaustion
Necromancy
Level: Sor/Wiz 3, Duskblade 3
Components: V, S, M
Casting Time: 1 standard action
Range: Close (25 ft. + 5 ft./2 levels)
Effect: Ray
Duration: 1 min./level
Saving Throw: Fortitude partial; see text
Spell Resistance: Yes
A black ray projects from your pointing finger. You
must succeed on a ranged touch attack with the ray
to strike a target.
The subject is immediately exhausted for the spell<6C>s
duration. A successful Fortitude save means the
creature is only fatigued.
A character that is already fatigued instead becomes
exhausted.
This spell has no effect on a creature that is
already exhausted. Unlike normal exhaustion or fatigue,
the effect ends as soon as the spell<6C>s duration expires.
Material Component
A drop of sweat.
**/
//::////////////////////////////////////////////////
//:: Author: Tenjac
//:: Date : 29.9.06
//::////////////////////////////////////////////////
#include "prc_inc_sp_tch"
#include "prc_sp_func"
#include "prc_add_spell_dc"
int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
{
int nMetaMagic = PRCGetMetaMagicFeat();
int nSaveDC = PRCGetSaveDC(oTarget, oCaster);
int nPenetr = nCasterLevel + SPGetPenetr();
effect eLink = EffectExhausted();
float fDur = (60.0f * nCasterLevel);
if(nMetaMagic & METAMAGIC_EXTEND)
{
fDur += fDur;
}
PRCSignalSpellEvent(oTarget, TRUE);
//INSERT SPELL CODE HERE
int iAttackRoll = PRCDoRangedTouchAttack(oTarget);
//Beam
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_BLACK, oCaster, BODY_NODE_HAND, !iAttackRoll), oTarget, 1.0f);
if (iAttackRoll > 0 && PRCGetIsAliveCreature(oTarget))
{
//Touch attack code goes here
if(!PRCDoResistSpell(OBJECT_SELF, oTarget, nPenetr))
{
effect eSpeed = EffectMovementSpeedDecrease(50);
int nDrain = 6;
//Fort save
if(PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nSaveDC, SAVING_THROW_TYPE_SPELL))
{
if(GetHasMettle(oTarget, SAVING_THROW_FORT))
{
PRCSetSchool();
return iAttackRoll;
}
else
{
eLink = EffectFatigue();
}
}
eLink = MagicalEffect(eLink);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDur);
}
}
return iAttackRoll; //return TRUE if spell charges should be decremented
}
void main()
{
object oCaster = OBJECT_SELF;
int nCasterLevel = PRCGetCasterLevel(oCaster);
PRCSetSchool(SPELL_SCHOOL_NECROMANCY);
if (!X2PreSpellCastCode()) return;
object oTarget = PRCGetSpellTargetObject();
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags
if(!nEvent) //normal cast
{
if(GetLocalInt(oCaster, PRC_SPELL_HOLD) && oCaster == oTarget)
{//holding the charge, casting spell on self
SetLocalSpellVariables(oCaster, 1); //change 1 to number of charges
return;
}
DoSpell(oCaster, oTarget, nCasterLevel, nEvent);
}
else
{
if(nEvent & PRC_SPELL_EVENT_ATTACK)
{
if(DoSpell(oCaster, oTarget, nCasterLevel, nEvent))
DecrementSpellCharges(oCaster);
}
}
PRCSetSchool();
}