PRC8_fork/nwn/nwnprc/trunk/psionics/psi_pow_shttrmb.nss
Jaysyn904 e641b42f84 Exalted update
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.
2025-01-29 22:46:38 -05:00

131 lines
4.8 KiB
Plaintext

/*
----------------
Shatter Mind Blank
psi_pow_shttrmb
----------------
27/3/05 by Stratovarius
*/ /** @file
Shatter Mind Blank
Telepathy
Level: Psion/wilder 5
Manifesting Time: 1 standard action
Range: 30 ft.
Area: 30-ft.-radius burst centered on you
Duration: Instantaneous
Saving Throw: Will negates
Power Resistance: Yes
Power Points: 9
Metapsionics: Twin, Widen
This power can negate a mind blank affecting the target. If the target fails
its save and does not overcome your attempt with its power resistance, you
can shatter the mind blank by making a successful check (1d20 + your
manifester level, maximum +20) against a DC equal to 11 + the manifester
level of the creator of the mind blank effect. If you succeed, the psionic
mind blank or personal mind blank ends, allowing you to affect the target
thereafter with mind-affecting powers.
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_inc_spells"
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;
struct manifestation manif =
EvaluateManifestation(oManifester, OBJECT_INVALID,
PowerAugmentationProfile(),
METAPSIONIC_TWIN | METAPSIONIC_WIDEN
);
if(manif.bCanManifest)
{
int nDC = GetManifesterDC(oManifester);
int nPen = GetPsiPenetration(oManifester);
int nDispelLevel = PRCMax(manif.nManifesterLevel, 20);
int nEffectSID, nRemoveDC;
effect eVisLink = EffectVisualEffect(VFX_IMP_BREACH);
eVisLink = EffectLinkEffects(eVisLink, EffectVisualEffect(VFX_FNF_DISPEL));
effect eTest;
float fRadius = EvaluateWidenPower(manif, FeetToMeters(30.0f));
location lTarget = PRCGetSpellTargetLocation();
object oTarget, oCreator;
// Handle Twin Power
int nRepeats = manif.bTwin ? 2 : 1;
for(; nRepeats > 0; nRepeats--)
{
oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
// Let the AI know
PRCSignalSpellEvent(oTarget, TRUE, manif.nSpellID, oManifester);
// Check Power Resistance
if(PRCMyResistPower(oManifester, oTarget, nPen))
{
// Save - Will negates
if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
eTest = GetFirstEffect(oTarget);
while(GetIsEffectValid(eTest))
{
nEffectSID = GetEffectSpellId(eTest);
oCreator = GetEffectCreator(eTest);
nRemoveDC = 0; // Reset DC
// Spells, get caster level
if(nEffectSID == SPELL_MIND_BLANK ||
nEffectSID == SPELL_LESSER_MIND_BLANK
)
{
nRemoveDC = 11 + GetLevelByTypeArcane(oCreator); // Assume the mind blanks are always arcane.
}
// Powers, get manifester level
else if(nEffectSID == POWER_MINDBLANKPERSONAL ||
nEffectSID == POWER_PSIMINDBLANK
)
{
nRemoveDC = 11 + GetHighestManifesterLevel(oCreator);
}
// Check if the effect is of a removable type
if(nRemoveDC)
{
if((d20() + nDispelLevel) >= nRemoveDC)
RemoveEffect(oTarget, eTest);
}
// Get next effect
eTest = GetNextEffect(oTarget);
}// end while - Effect loop
}// end if - Save
}// end if - SR check
// Select the next target
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE, OBJECT_TYPE_CREATURE);
}// end while - Target loop
}// end for - Twin Power
}// end if - Successfull manifestation
}