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<63>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<65>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
|
|||
|
}
|