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