forked from Jaysyn/PRC8
Updated Vow of Poverty. Added Sanctify Ki Strike, Holy Strike, Fist of Heavens, Vow of Abstinence, Vow of Chastity & Gift of Faith. (@fenac). Turned off the Taunt & Parry skills. Re-disabled AC & save bonuses from Tumble & Spellcraft. Updated min() & max() to PRCmin() & PRCmax() to not conflict with similarly named NUI adjacent functions. Set Point Blank Shot to 30' per PnP. Added icon for Chosen of Evil. Started work on Hidden Talent. Created Psionics function cheatsheet. Updated release archive.
130 lines
5.0 KiB
Plaintext
130 lines
5.0 KiB
Plaintext
/*
|
||
----------------
|
||
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 power’s 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 = 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));
|
||
}
|