Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
170 lines
6.4 KiB
Plaintext
170 lines
6.4 KiB
Plaintext
/*
|
||
----------------
|
||
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 subject’s 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 character’s 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
|
||
}
|