PRC8/nwn/nwnprc/trunk/scripts/prc_reservtch.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

105 lines
3.9 KiB
Plaintext

//Spell script for reserve feat touch attacks
//prc_reservtch
//by ebonfowl
//Dedicated to Edgar, the real Ebonfowl
#include "prc_sp_func"
#include "prc_inc_sp_tch"
#include "prc_add_spell_dc"
void main()
{
object oPC = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nSpellID = PRCGetSpellId();
effect eEffect, eLink, eVis, eVisFail;
int nDamageType, iAttackRoll, nDuration, nPartial, nDC;
int nDamage = 0;
//Define individual spell parameters
switch (nSpellID)
{
case SPELL_CLAP_OF_THUNDER:
{
nDamage = d6(GetLocalInt(oPC, "ClapOfThunderBonus"));
nDamageType = DAMAGE_TYPE_SONIC;
nDuration = 1;
nPartial = 0;
nDC = 10 + GetLocalInt(oPC, "ClapOfThunderBonus") + GetDCAbilityModForClass(GetPrimarySpellcastingClass(oPC), oPC);
eEffect = EffectDeaf();
eEffect = SupernaturalEffect(eEffect);
eVis = EffectVisualEffect(VFX_IMP_ACID_S);
eVisFail = EffectVisualEffect(VFX_IMP_STUN);
if (!GetLocalInt(oPC, "ClapOfThunderBonus"))
{
FloatingTextStringOnCreature("You do not have a spell available of adequate level or type", oPC, FALSE);
return;
}
break;
}
case SPELL_SICKENING_GRASP:
{
nDuration = GetLocalInt(oPC, "SickeningGraspBonus");
nPartial = 1;
nDC = 10 + GetLocalInt(oPC, "SickeningGraspBonus") + GetDCAbilityModForClass(GetPrimarySpellcastingClass(oPC), oPC);
eEffect = EffectAttackDecrease(2);
eEffect = EffectLinkEffects(EffectDamageDecrease(2, DAMAGE_TYPE_SLASHING), eEffect);
eEffect = EffectLinkEffects(EffectSavingThrowDecrease(SAVING_THROW_ALL, 2), eEffect);
eEffect = EffectLinkEffects(EffectSkillDecrease(SKILL_ALL_SKILLS, 2), eEffect);
eEffect = SupernaturalEffect(eEffect);
eVis = EffectVisualEffect(VFX_IMP_ACID_S);
eVisFail = EffectVisualEffect(VFX_IMP_STUN);
//Sanity checks
if (!GetLocalInt(oPC, "SickeningGraspBonus"))
{
FloatingTextStringOnCreature("You do not have a spell available of adequate level or type", oPC, FALSE);
return;
}
if (GetLocalInt(oTarget, "HasSickeningGrasp") == TRUE)
{
FloatingTextStringOnCreature("Target is already sickened", oPC, FALSE);
return;
}
break;
}
}
if (GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
{
SignalEvent(oTarget, EventSpellCastAt(oPC, nSpellID, TRUE));
iAttackRoll = PRCDoMeleeTouchAttack(oTarget);
if (iAttackRoll > 0)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
if (nDamage > 0) ApplyTouchAttackDamage(oPC, oTarget, iAttackRoll, nDamage, nDamageType);
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, RoundsToSeconds(nDuration));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisFail, oTarget);
if (nPartial == 1)
{
SetLocalInt(oTarget, "HasSickeningGrasp", TRUE);
DelayCommand(RoundsToSeconds(nDuration), DeleteLocalInt(oTarget, "HasSickeningGrasp"));
}
}
else if (nPartial == 1)
{
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, RoundsToSeconds(1));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisFail, oTarget);
SetLocalInt(oTarget, "HasSickeningGrasp", TRUE);
DelayCommand(6.0, DeleteLocalInt(oTarget, "HasSickeningGrasp"));
}
}
}
}