PRC8/nwn/nwnprc/trunk/psionics/psi_pow_empfeed.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

130 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.

/*
----------------
Empathic Feedback
psi_pow_empfeed
----------------
19/2/04 by Stratovarius
*/ /** @file
Empathic Feedback
Telepathy [Mind-Affecting]
Level: Psion/wilder 4, psychic warrior 3
Manifesting Time: 1 standard action
Range: Personal
Target: You
Duration: 10 min./level
Power Points: Psion/wilder 7, psychic warrior 5
Metapsionics: Extend
You empathically share your pain and suffering with your attacker. Each time
a creature strikes you in melee, it takes damage equal to the amount it
dealt to you or 5 points, whichever is less. This damage is empathic in
nature, so powers and abilities the attacker may have such as damage
reduction and regeneration do not lessen or change this damage. The damage
from empathic feedback has no type, so even if you took fire damage from a
creature that has immunity to fire, empathic feedback will damage your
attacker.
Augment: For every additional power point you spend, this powers damage
potential increases by 1 point.
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_inc_spells"
const string EMPATHIC_FEEDBACK_VARNAME = "PRC_Power_EmpathicFeedback_Damage";
void DispelMonitor(object oManifester, object oTarget, int nSpellID, int nBeatsRemaining);
void main()
{
// Are we running the manifestation part or the onhit part?
if(GetRunningEvent() != EVENT_ONHIT)
{
// Power use hook
if(!PsiPrePowerCastCode()) return;
object oManifester = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct manifestation manif =
EvaluateManifestation(oManifester, oTarget,
PowerAugmentationProfile(PRC_NO_GENERIC_AUGMENTS,
1, PRC_UNLIMITED_AUGMENTATION
),
METAPSIONIC_EXTEND
);
if(manif.bCanManifest)
{
int nDamage = 5 + manif.nTimesAugOptUsed_1;
effect eDur = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_POSITIVE);
float fDuration = 60.0f * manif.nManifesterLevel;
if(manif.bExtend) fDuration *= 2;
// Get the OnHitCast: Unique on the target's armor / hide
ExecuteScript("prc_keep_onhit_a", oTarget);
// Hook eventscript
AddEventScript(oTarget, EVENT_ONHIT, "psi_pow_empfeed", TRUE, FALSE);
// Set the local variable for the amount of damage transferrable
SetLocalInt(oTarget, EMPATHIC_FEEDBACK_VARNAME, nDamage);
// Do VFX for the monitor to look for
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oTarget, fDuration, TRUE, manif.nSpellID, manif.nManifesterLevel);
// Start effect end monitor
DelayCommand(6.0f, DispelMonitor(oManifester, oTarget, manif.nSpellID, FloatToInt(fDuration) / 6));
}// end if - Successfull manifestation
}// end if - Manifesting a power
// Running the OnHit event
else
{
object oManifester = OBJECT_SELF;
object oItem = GetSpellCastItem();
// Make sure the one doing the triggering hit was someone else
if(GetBaseItemType(oItem) == BASE_ITEM_ARMOR ||
GetBaseItemType(oItem) == BASE_ITEM_CREATUREITEM
)
{
object oTarget = PRCGetSpellTargetObject();
// Mind-affecting immunity check, and must be in melee range
if(!GetIsImmune(oTarget, IMMUNITY_TYPE_MIND_SPELLS) && GetIsInMeleeRange(oManifester, oTarget))
{
int nMaxDamage = GetLocalInt(oManifester, EMPATHIC_FEEDBACK_VARNAME);
int nDamageTaken = GetTotalDamageDealt();
int nDamage = min(nMaxDamage, nDamageTaken);
// Use positive damage, it's unlikelier to be resisted than magic damage
effect eDamage = EffectDamage(nDamage, DAMAGE_TYPE_POSITIVE);
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget);
}// end if - Mind-affecting immunity check
}// end if - Manifester was the one hit in the triggering attack
}// end else - Running OnHit event
}
void DispelMonitor(object oManifester, object oTarget, int nSpellID, int nBeatsRemaining)
{
// Has the power ended since the last beat, or does the duration run out now
if((--nBeatsRemaining == 0) ||
PRCGetDelayedSpellEffectsExpired(nSpellID, oTarget, oManifester)
)
{
if(DEBUG) DoDebug("psi_pow_empfeed: Removing marker");
// Clear the effect presence marker
DeleteLocalInt(oTarget, EMPATHIC_FEEDBACK_VARNAME);
// Remove the eventscript
RemoveEventScript(oTarget, EVENT_ONHIT, "psi_pow_empfeed", TRUE, FALSE);
}
else
DelayCommand(6.0f, DispelMonitor(oManifester, oTarget, nSpellID, nBeatsRemaining));
}