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

132 lines
4.9 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.

/*
----------------
Compression
psi_pow_compress
----------------
4/12/05 by Stratovarius
*/ /** @file
Compression
Psychometabolism
Level: Psychic warrior 1
Manifesting Time: 1 standard action
Range: Personal
Target: You
Duration: 1 round/level
Power Points: 1
Metapsionics: Extend
This power causes instant diminution, halving your height, length, and width
and dividing your weight by 8. This decrease changes your size category to
the next smaller one. You gain a +2 size bonus to Dexterity, a -2 size
penalty to Strength (to a minimum effective Strength score of 1), a +1 size
bonus on attack rolls, and a +1 size bonus to Armor Class due to your
reduced size. This power doesnt change your speed.
Multiple effects that reduce size do not stack, which means (among other
things) that you cant use a second manifestation of this power to further
reduce yourself.
Augment: You can augment this power in one or more of the following ways.
1. If you spend 6 additional power points, this power decreases your size by
two size categories. You gain a +4 size bonus to Dexterity, a -4 size
penalty to Strength (to a minimum effective Strength score of 1), a +2
size bonus on attack rolls, and a +2 size bonus to Armor Class due to
your reduced size.
2. If you spend 2 additional power points, this powers duration is 1 minute
per level rather than 1 round per level.
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_inc_function"
void DispelMonitor(object oManifester, object oTarget, int nSpellID, int nBeatsRemaining);
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(PRC_NO_GENERIC_AUGMENTS,
6, 1,
2, 1
),
METAPSIONIC_EXTEND
);
if(manif.bCanManifest)
{
int nCategories = 1 + manif.nTimesAugOptUsed_1;
effect eLink = EffectAttackIncrease(nCategories);
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_SANCTUARY));
eLink = EffectLinkEffects(eLink, EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE));
eLink = EffectLinkEffects(eLink, EffectAbilityIncrease(ABILITY_DEXTERITY, 2 * nCategories));
eLink = EffectLinkEffects(eLink, EffectAbilityDecrease(ABILITY_STRENGTH, 2 * nCategories));
eLink = EffectLinkEffects(eLink, EffectACIncrease(nCategories));
float fDuration = (manif.nTimesAugOptUsed_2 == 1 ? 60.0f : 6.0f) * manif.nManifesterLevel;
if(manif.bExtend) fDuration *= 2;
// Fail to do anything if the target is already under the effects of Compression
if(GetLocalInt(oTarget, "PRC_Power_Compression_SizeReduction"))
{
// "Target is already under effect of the Compression power!"
FloatingTextStrRefOnCreature(16826654, oManifester, FALSE);
return;
}
// Apply effects
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDuration, TRUE, manif.nSpellID, manif.nManifesterLevel);
// Set local int for PRCGetCreatureSize()
SetLocalInt(oTarget, "PRC_Power_Compression_SizeReduction", nCategories);
// Size has changed, evaluate PrC feats again
EvalPRCFeats(oTarget);
// Start power end monitor HB
DelayCommand(6.0f, DispelMonitor(oManifester, oTarget, manif.nSpellID, FloatToInt(fDuration) / 6));
}// end if - Successfull manifestation
}
void DispelMonitor(object oManifester, object oTarget, int nSpellID, int nBeatsRemaining)
{
// Has the power ended since the last beat, or does the duration run out now
if((--nBeatsRemaining == 0) ||
PRCGetDelayedSpellEffectsExpired(nSpellID, oTarget, oManifester)
)
{
if(DEBUG) DoDebug("psi_pow_compress: Power expired, clearing");
// Clear the marker
DeleteLocalInt(oTarget, "PRC_Power_Compression_SizeReduction");
// Size has changed, evaluate PrC feats again
EvalPRCFeats(oTarget);
}
else
DelayCommand(6.0f, DispelMonitor(oManifester, oTarget, nSpellID, nBeatsRemaining));
}