PRC8_fork/nwn/nwnprc/trunk/psionics/psi_pow_mttrag.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

129 lines
4.1 KiB
Plaintext

/*
----------------
Matter Agitation
psi_pow_mttrag
----------------
6/12/04 by Stratovarius
*/ /** @file
Matter Agitation
Psychokinesis
Level: Psion/wilder 1
Manifesting Time: 1 standard action
Range: Close (25 ft. + 5 ft./2 levels)
Target: One object or creature
Duration: 1 round/level
Saving Throw: None
Power Resistance: Yes
Power Points: 1
Metapsionics: Extend
You can excite the structure of an object, heating it to the point of
combustion over time. The agitation grows more intense in the second and
third rounds after you manifest the power, as described below.
1st Round: Readily flammable material (paper, dry grass, tinder, torches)
ignites. Skin reddens. (1 point of fire damage)
2nd Round: Wood smolders and smokes, metal becomes hot to the touch, skin
blisters, hair smolders, paint shrivels, water boils. (1d4 points
of fire damage)
3rd and Subsequent Rounds: Wood ignites, metal scorches. Skin burns and hair
ignites, lead melts. (1d6 points of fire damage)
*/
#include "psi_inc_psifunc"
#include "psi_inc_pwresist"
#include "psi_spellhook"
#include "prc_inc_spells"
void RunImpact(object oManifester, object oTarget, int nSpellID, int nLastBeat, int nCurrentBeat = 0);
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_EXTEND
);
if(manif.bCanManifest)
{
int nPen = GetPsiPenetration(oManifester);
int nBeats = manif.nManifesterLevel;
if(manif.bExtend) nBeats *= 2;
effect eVis = EffectVisualEffect(VFX_IMP_FLAME_S);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
float fDuration = 6.0f * nBeats;
// Let the AI know
PRCSignalSpellEvent(oTarget, TRUE, manif.nSpellID, oManifester);
// SR check
if(PRCMyResistPower(oManifester, oTarget, nPen))
{
// Apply impact VFX
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
// Apply an effect for the heartbeat to track
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oTarget, fDuration, TRUE, manif.nSpellID, manif.nManifesterLevel);
// Start impact heartbeat
RunImpact(oManifester, oTarget, manif.nSpellID, nBeats);
}// end if - SR check
}// end if - Successfull manifestation
}
void RunImpact(object oManifester, object oTarget, int nSpellID, int nLastBeat, int nCurrentBeat = 0)
{
// Check for expiration
if(nCurrentBeat++ <= nLastBeat &&
!PRCGetDelayedSpellEffectsExpired(nSpellID, oTarget, oManifester)
)
{
// Determine damage
int nDamage;
switch(nCurrentBeat)
{
case 0: nDamage = 1; break;
case 1: nDamage = d4(); break;
default: nDamage = d6(); break;
}
// Create effects
effect eFlame = EffectVisualEffect(VFX_IMP_FLAME_S);
effect eSmoke = EffectVisualEffect(VFX_DUR_SMOKE);
effect eDam = EffectDamage(nDamage, DAMAGE_TYPE_FIRE);
// Apply VFX
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eFlame, oTarget);
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eSmoke, oTarget, 6.0f, FALSE);
// Apply damage
SPApplyEffectToObject (DURATION_TYPE_INSTANT, eDam, oTarget);
// Schedule next impact
DelayCommand(6.0f, RunImpact(oManifester, oTarget, nSpellID, nLastBeat, nCurrentBeat));
}
}