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

170 lines
6.4 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.

/*
----------------
Psychic Chirurgery - Repair Psychic Damage
psi_pow_psychir
----------------
11/5/05 by Stratovarius
*/ /** @file
Psychic Chirurgery - Repair Psychic Damage
Telepathy [Mind-Affecting]
Level: Telepath 9
Manifesting Time: 1 standard action
Range: Close (25 ft. + 5 ft./2 levels)
Target: One creature
Duration: Instantaneous
Saving Throw: None
Power Resistance: No
Power Points: 17, XP; see text
Metapsionics: None
You can repair psychic damage or grant another creature knowledge of powers
you know, depending on the version of this power you manifest.
Repair Psychic Damage:
You can remove any compulsions and charms affecting the subject.
You can remove all negative levels affecting the subject.
You can also remove all effects penalizing the subjects ability scores,
heal all ability damage, and remove any ability drain affecting the subject.
Psychic chirurgery negates all forms of insanity, confusion, the effect of
such powers as microcosm, and so on.
Transfer Knowledge:
If desired, you can use this power to directly transfer knowledge of a power
you know to another psionic character. You can give a character knowledge of
a power of any level that she can manifest, even if the power is not
normally on the characters power list. Knowledge of powers gained through
psychic chirurgery does not count toward the maximum number of powers a
character can know per level.
XP Cost: Each time you use psychic chirurgery to implant knowledge of a
power in another creature, you pay an XP cost equal to 1,000 x the
level of the power implanted. If you and the subject are both
willing to do so, you can split this cost evenly.
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "spinc_remeffct"
//------------------------------------------------------------------------------
// Doesn't care who the caster was removes the effects of the spell nSpell_ID.
// will ignore the subtype as well...
// GZ: Removed the check that made it remove only one effect.
//------------------------------------------------------------------------------
void PRCRemoveAnySpellEffects(int nSpell_ID, object oTarget)
{
//Declare major variables
effect eAOE;
if(GetHasSpellEffect(nSpell_ID, oTarget))
{
//Search through the valid effects on the target.
eAOE = GetFirstEffect(oTarget);
while (GetIsEffectValid(eAOE))
{
//If the effect was created by the spell then remove it
if(GetEffectSpellId(eAOE) == nSpell_ID)
{
RemoveEffect(oTarget, eAOE);
}
//Get next effect on the target
eAOE = GetNextEffect(oTarget);
}
}
}
void main()
{
/*
Spellcast Hook Code
Added 2004-11-02 by Stratovarius
If you want to make changes to all powers,
check psi_spellhook to find out more
*/
if (!PsiPrePowerCastCode())
{
// If code within the PrePowerCastHook (i.e. UMD) reports FALSE, do not run this spell
return;
}
// End of Spell Cast Hook
object oManifester = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
struct manifestation manif =
EvaluateManifestation(oManifester, oTarget,
PowerAugmentationProfile(),
METAPSIONIC_NONE
);
if(manif.bCanManifest)
{
int nEffectType;
effect eVis = EffectVisualEffect(PSI_FNF_PSYCHIC_CHIRURGY);
effect eTest;
// Let the AI know - Special handling
PRCSignalSpellEvent(oTarget, FALSE, SPELL_GREATER_RESTORATION, oManifester);
// Check for some specific stuff and remove if present
if(GetHasSpellEffect(POWER_DECEREBRATE, oTarget))
PRCRemoveAnySpellEffects(POWER_DECEREBRATE, oTarget);
if(GetHasSpellEffect(POWER_INSANITY, oTarget))
PRCRemoveAnySpellEffects(POWER_INSANITY, oTarget);
if(GetHasSpellEffect(POWER_MICROCOSM, oTarget))
PRCRemoveAnySpellEffects(POWER_MICROCOSM, oTarget);
// Loop over remaining effects, remove any negative ones
eTest = GetFirstEffect(oTarget);
while(GetIsEffectValid(eTest))
{
nEffectType = GetEffectType(eTest);
if(nEffectType == EFFECT_TYPE_ABILITY_DECREASE ||
nEffectType == EFFECT_TYPE_AC_DECREASE ||
nEffectType == EFFECT_TYPE_ATTACK_DECREASE ||
nEffectType == EFFECT_TYPE_DAMAGE_DECREASE ||
nEffectType == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
nEffectType == EFFECT_TYPE_SAVING_THROW_DECREASE ||
nEffectType == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
nEffectType == EFFECT_TYPE_SKILL_DECREASE ||
nEffectType == EFFECT_TYPE_BLINDNESS ||
nEffectType == EFFECT_TYPE_DEAF ||
nEffectType == EFFECT_TYPE_CURSE ||
nEffectType == EFFECT_TYPE_DISEASE ||
nEffectType == EFFECT_TYPE_POISON ||
nEffectType == EFFECT_TYPE_PARALYZE ||
nEffectType == EFFECT_TYPE_CHARMED ||
nEffectType == EFFECT_TYPE_DOMINATED ||
nEffectType == EFFECT_TYPE_DAZED ||
nEffectType == EFFECT_TYPE_CONFUSED ||
nEffectType == EFFECT_TYPE_FRIGHTENED ||
nEffectType == EFFECT_TYPE_NEGATIVELEVEL ||
nEffectType == EFFECT_TYPE_SLOW ||
nEffectType == EFFECT_TYPE_STUNNED
)
{
if(!GetShouldNotBeRemoved(eTest))
RemoveEffect(oTarget, eTest);
}
eTest = GetNextEffect(oTarget);
}// end while - Effect loop
// Apply visuals
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
// Set a marker local and schedule it's removal
SetLocalInt(oTarget, "WasRestored", TRUE);
DelayCommand(HoursToSeconds(1), DeleteLocalInt(oTarget, "WasRestored"));
}// end if - Successfull manifestation
}