PRC8/nwn/nwnprc/trunk/newspellbook/bnd_vest_dahlsh.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

73 lines
3.1 KiB
Plaintext

/*
1/03/21 by Stratovarius
Dahlver Nar, the Tortured One
Once a human binder, Dahlver-Nar now grants powers just as other vestiges do. He gives his summoners tough skin, a frightening moan, protections against madness,
and the ability to share injuries with allies.
Shield Self: At will as a standard action, you can designate one creature within 10 feet per effective binder level to share the damage you take. As long as the
subject creature remains within range, you take only half damage from all effects that deal hit point damage, and it takes the rest. The effect ends immediately
if you designate another creature or if either you or the subject dies. Any damage dealt to you after the effect ends is no longer split between you and the subject,
but damage already split is not reassigned to you. You can affect one creature at a time with this ability. An unwilling target of this ability
can attempt a Will save to negate the effect.
*/
#include "bnd_inc_bndfunc"
void DispelMonitor(object oBinder, object oTarget, int nSpellID, int nBinderLevel);
void main()
{
object oBinder = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nDC = GetBinderDC(oBinder, VESTIGE_DAHLVERNAR);
int nSpellID = GetSpellId();
int nBinderLevel = GetBinderLevel(oBinder, VESTIGE_DAHLVERNAR);
effect eDurPos = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);
effect eDurNeg = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_NEGATIVE);
// Let the AI know
PRCSignalSpellEvent(oTarget, TRUE, nSpellID, oBinder);
// Save - Fortitude negates, or it's an ally
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_NONE) || GetIsFriend(oBinder, oTarget))
{
// Get the OnHitCast: Unique on the manifester's armor / hide
ExecuteScript("prc_keep_onhit_a", oBinder);
// Hook eventscript
AddEventScript(oBinder, EVENT_ONHIT, "psi_pow_shrpnaux", TRUE, FALSE);
// Store the target for use in the damage script
SetLocalObject(oBinder, "PRC_Power_SharePain_Target", oTarget);
// Do VFX for the monitor to look for
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDurNeg, oTarget);
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eDurPos, oBinder);
// Start effect end monitor
DelayCommand(6.0f, DispelMonitor(oBinder, oTarget, nSpellID, nBinderLevel));
}
}
void DispelMonitor(object oBinder, object oTarget, int nSpellID, int nBinderLevel)
{
// The conditions that can end the effect
if(GetIsDead(oTarget) ||
GetDistanceBetween(oBinder, oTarget) > FeetToMeters(10.0 * nBinderLevel))
{
if(DEBUG) DoDebug("bnd_vest_dahlsh: Effect expired, clearing");
// Clear the target local
DeleteLocalObject(oBinder, "PRC_Power_SharePain_Target");
// Remove the eventscript
RemoveEventScript(oBinder, EVENT_ONHIT, "psi_pow_shrpnaux", TRUE, FALSE);
// Remove remaining effects
PRCRemoveSpellEffects(nSpellID, oBinder, oTarget);
PRCRemoveSpellEffects(nSpellID, oBinder, oBinder);
}
else
DelayCommand(6.0f, DispelMonitor(oBinder, oTarget, nSpellID, nBinderLevel));
}