Files
PRC8/nwn/nwnprc/trunk/psionics/psi_pow_empfeed.nss
Jaysyn904 c437270cd1 2026/05/28 Afternoon update
Updated damagtypes.2da for CEP3 reserved rows.
Added and setup Darkvision icon.
Added and setup Ultravision icon.
Added spell icon for Thicket of Blades.
Fixed Blacklight, Cloud of the Archeai, Darkness, Deeper Darkness, Damning Darkness, Utterdark, Grasping Shadows, Dawn and Dusk and Child of Shadow and Light for Telflammar Shadowlord's Shadow Blur and Shadow Sight abilities.
Updated Blacklight's TLK entry.
Created a constant for Shadow Discorporation.
Fixed Shadow Time never ending on the targets.
Updated prc_inc_combat to use monk iterative progression if warranted.
Updated PRCGetIsRealSpellKnownByClass() to handle Sublime Chord better. (@Lightbeard)
Added class heartbeat script for Shadowlord to handle Shadow Blur and Shadow Sight.
Added ShadowlordEffects() to prc_inc_spells.
Added constants for new damagetypes.
Completely rewrote Verminlord's Vermin Domination.
Fixed duration for Empathic Feedback.
Fixed Morality Undone to not break characters over a server reset.
2026-05-28 16:27:19 -04:00

130 lines
5.0 KiB
Plaintext
Raw 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 = 600.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 = PRCMin(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));
}