PRC8_fork/nwn/nwnprc/trunk/smp/phs_s_harm.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

155 lines
5.0 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*:://////////////////////////////////////////////
//:: Spell Name Harm
//:: Spell FileName PHS_S_Harm
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Necromancy
Level: Clr 6, Destruction 6
Components: V, S
Casting Time: 1 standard action
Range: Touch
Target: Creature touched
Duration: Instantaneous
Saving Throw: Will half; see text
Spell Resistance: Yes
Harm charges a subject with negative energy that deals 10 points of damage
per caster level (to a maximum of 150 points at 15th level). If the creature
successfully saves, harm deals half this amount, but it cannot reduce the
targets hit points to less than 1.
If used on an undead creature, harm acts like heal.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
3.5 rules are much fairer now.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Spell Hook Check.
if(!PHS_SpellHookCheck(PHS_SPELL_HARM)) return;
// Declare Major Variables
object oCaster = OBJECT_SELF;
object oTarget = GetSpellTargetObject();
int nSpellSaveDC = PHS_GetSpellSaveDC();
int nCasterLevel = PHS_GetCasterLevel();
int nTargetHP = GetCurrentHitPoints(oTarget);
int nMaxHealHarm = PHS_LimitInteger(nCasterLevel * 10);
int nTouch;
// Declare effects
effect eHeal = EffectHeal(nMaxHealHarm);
effect eHealVis = EffectVisualEffect(VFX_IMP_HEALING_X);
effect eCheck;
int nEffectType, nEffectSpellID;
// Check if the target is alive
if(PHS_GetIsAliveCreature(oTarget))
{
// Signal spell cast at
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_HEAL);
// Touch melee attack
nTouch = PHS_SpellTouchAttack(PHS_TOUCH_MELEE, oTarget, TRUE);
// Visual effects hit/miss
PHS_ApplyTouchVisual(oTarget, VFX_IMP_SUNSTRIKE, nTouch);
// Does it hit?
if(nTouch)
{
// Double damage on critical!
if(nTouch == 2)
{
nMaxHealHarm *= 2;
}
// PvP check
if(!GetIsReactionTypeFriendly(oTarget))
{
// Spell resistance
if(!PHS_SpellResistanceCheck(oCaster, oTarget))
{
// Check will save
if(PHS_SavingThrow(SAVING_THROW_WILL, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_NEGATIVE))
{
// Half damage
nMaxHealHarm /= 2;
}
// Declare damage
// - Cannot be able to kill them
if(nTargetHP > 1)
{
if(nMaxHealHarm > nTargetHP)
{
nMaxHealHarm = nTargetHP - 1;
}
// Apply damage
PHS_ApplyDamageToObject(oTarget, nMaxHealHarm, DAMAGE_TYPE_NEGATIVE);
}
}
}
}
}
// Must be undead to heal
else if(GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
{
// We remove all the things in a effect loop.
// ability damage, blinded, confused,
// dazed, dazzled, deafened, diseased, exhausted, fatigued, feebleminded,
// insanity, nauseated, sickened, stunned, and poisoned.
eCheck = GetFirstEffect(oTarget);
// Loop effects
while(GetIsEffectValid(eCheck))
{
nEffectType = GetEffectType(eCheck);
nEffectSpellID = GetEffectSpellId(eCheck);
// Remove cirtain spells
switch(nEffectSpellID)
{
case PHS_SPELL_INSANITY:
case PHS_SPELL_FEEBLEMIND:
// - Dazzeled
//case PHS_SPELL_FLARE:
RemoveEffect(oTarget, eCheck);
break;
// Other effects
default:
{
// Remove cirtain effects
switch(nEffectType)
{
case EFFECT_TYPE_DAZED:
case EFFECT_TYPE_DEAF:
case EFFECT_TYPE_DISEASE:
case EFFECT_TYPE_STUNNED:
case EFFECT_TYPE_POISON:
{
RemoveEffect(oTarget, eCheck);
}
break;
}
}
break;
}
// Get next effect
eCheck = GetNextEffect(oTarget);
}
// Remove fatige
PHS_RemoveFatigue(oTarget);
// We heal damage after
PHS_ApplyInstantAndVFX(oTarget, eHealVis, eHeal);
}
}