/*::////////////////////////////////////////////// //:: Spell Name Enervation //:: Spell FileName PHS_S_Enervation //::////////////////////////////////////////////// //:: In Game Spell desctiption //::////////////////////////////////////////////// Necromancy Level: Sor/Wiz 4 Components: V, S Casting Time: 1 standard action Range: Close (8M) Effect: Ray of negative energy Duration: 1 hour/level Saving Throw: None Spell Resistance: Yes You point your finger and utter the incantation, releasing a black ray of crackling negative energy that suppresses the life force of any living creature it strikes. You must make a ranged touch attack to hit. If the attack succeeds, the subject gains 1d4 negative levels (not modified by a critical on any touch attack rolls). If the subject has at least as many negative levels as HD, it dies. Each negative level gives a creature a -1 penalty on attack rolls, saving throws, skill checks, ability checks, and effective level (for determining the power, duration, DC, and other details of spells or special abilities). Additionally, a spellcaster loses one spell or spell slot from his or her highest available level. Negative levels stack. Assuming the subject survives, it regains lost levels after a number of hours equal to your caster level (maximum 15 hours). Usually, negative levels have a chance of permanently draining the victim�s levels, but the negative levels from enervation don�t last long enough to do so. An undead creature struck by the ray gains 1d4x5 temporary hit points for 1 hour. //::////////////////////////////////////////////// //:: Spell Effects Applied / Notes //::////////////////////////////////////////////// Delayed application of the effect, so it stacks. Can be cast if they have the effect. The temp HP also stacks! //::////////////////////////////////////////////// //:: Created By: Jasperre //::////////////////////////////////////////////*/ #include "PHS_INC_SPELLS" void main() { // Spell Hook Check. if(!PHS_SpellHookCheck(PHS_SPELL_ENERVATION)) return; // Declare major variables object oCaster = OBJECT_SELF; object oTarget = GetSpellTargetObject(); int nSpellSaveDC = PHS_GetSpellSaveDC(); int nCasterLevel = PHS_GetCasterLevel(); int nMetaMagic = PHS_GetMetaMagicFeat(); // 1d4 negative levels int nNegativeLevels = PHS_MaximizeOrEmpower(4, 1, nMetaMagic); // Duration in hours (max 15) float fDuration = PHS_GetDuration(PHS_HOURS, PHS_LimitInteger(nCasterLevel, 15), nMetaMagic); // 1 hour float fDurationHP = PHS_GetDuration(PHS_HOURS, 1, nMetaMagic); // Delay is Range based float fDelay = GetDistanceToObject(oTarget)/10; // Declare effects effect eNegativeLevels = EffectNegativeLevel(nNegativeLevels); effect eNegativeVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY); effect eNegativeBeam; // Good effects effect eTempHP = EffectTemporaryHitpoints(nNegativeLevels * 5); effect eTempHPCessate = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE); effect eTempHPVis = EffectVisualEffect(VFX_IMP_EVIL_HELP); // Link good effect eLinkHP = EffectLinkEffects(eTempHP, eTempHPCessate); // Signal event PHS_SignalSpellCastAt(oTarget, PHS_SPELL_ENERVATION); // Touch beam effect PHS_ApplyTouchBeam(oTarget, VFX_BEAM_EVIL, nTouch); // Ray ranged Touch attack if(PHS_SpellTouchAttack(PHS_TOUCH_RAY, oTarget, TRUE) && // Make sure they are not immune to spells !PHS_TotalSpellImmunity(oTarget)) { // Undead check (if undead, we always apply temp HP) if(GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD) { // Temp HP DelayCommand(fDelay, PHS_ApplyDurationAndVFX(oTarget, eTempHPVis, eLinkHP, fDurationHP)); } // Reaction type check else if(!GetIsReactionTypeFriendly(oTarget)) { // Else we will check spell resistance and immunty, then apply if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay)) { // Apply DelayCommand(fDelay, PHS_ApplyDurationAndVFX(oTarget, eNegativeVis, eNegativeLevels, fDuration)); } } } }