Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
129 lines
4.1 KiB
Plaintext
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));
|
|
}
|
|
}
|