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.
146 lines
6.0 KiB
Plaintext
146 lines
6.0 KiB
Plaintext
/*
|
||
----------------
|
||
Hail of Crystals
|
||
|
||
prc_pow_hailcrys
|
||
----------------
|
||
|
||
9/4/05 by Stratovarius
|
||
*/ /** @file
|
||
|
||
Hail of Crystals
|
||
|
||
Metacreativity (Creation)
|
||
Level: Shaper 5
|
||
Manifesting Time: 1 standard action
|
||
Range: Medium (100 ft. + 10 ft./ level)
|
||
Area: 20-ft.-radius burst
|
||
Duration: Instantaneous
|
||
Saving Throw: Reflex half
|
||
Power Resistance: No
|
||
Power Points: 9
|
||
Metapsionics: Empower, Maximize, Twin, Widen
|
||
|
||
A tiny ectoplasmic crystal emanates from your outstretched hand and rapidly
|
||
expands to a 2-foot-diameter ball of crystal as it speeds toward the
|
||
location you designate. You can choose to aim this crystal at a single
|
||
target or at a specific point in space.
|
||
|
||
If you aim the crystal at a single target, you must make a ranged touch
|
||
attack to strike the target. Any creature or object struck by the ball of
|
||
crystal takes 5d4 points of bludgeoning damage.
|
||
|
||
Whether the crystal hits its target, misses, or was aimed at a point in
|
||
space, it explodes upon arrival at the location you designated. Anyone
|
||
within 20 feet of the explosion takes 9d4 points of slashing damage from the
|
||
thousands of crystal shards that spray forth.
|
||
|
||
Augment: For every additional power point you spend, this power’s damage
|
||
from the explosion of the crystal increases by 1d4 points.
|
||
*/
|
||
|
||
#include "psi_inc_psifunc"
|
||
#include "psi_inc_pwresist"
|
||
#include "psi_spellhook"
|
||
#include "prc_inc_sp_tch"
|
||
|
||
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 oBallTarget = PRCGetSpellTargetObject();
|
||
struct manifestation manif =
|
||
EvaluateManifestation(oManifester, oBallTarget,
|
||
PowerAugmentationProfile(PRC_NO_GENERIC_AUGMENTS,
|
||
1, PRC_UNLIMITED_AUGMENTATION
|
||
),
|
||
METAPSIONIC_EMPOWER | METAPSIONIC_MAXIMIZE | METAPSIONIC_TWIN | METAPSIONIC_WIDEN
|
||
);
|
||
|
||
if(manif.bCanManifest)
|
||
{
|
||
int nDC = GetManifesterDC(oManifester);
|
||
int nPen = GetPsiPenetration(oManifester);
|
||
int nNumberOfDice_Explode = 9 + manif.nTimesAugOptUsed_1;
|
||
int nNumberOfDice_Ball = 5;
|
||
int nDieSize = 4;
|
||
int nDamage, nTouchAttack;
|
||
location lTarget = PRCGetSpellTargetLocation();
|
||
effect eImpact = EffectVisualEffect(VFX_IMP_DUST_EXPLOSION);
|
||
effect eDamage;
|
||
float fRadius = EvaluateWidenPower(manif, FeetToMeters(20.0f));
|
||
object oExplodeTarget;
|
||
|
||
|
||
// Handle Twin Power
|
||
int nRepeats = manif.bTwin ? 2 : 1;
|
||
for(; nRepeats > 0; nRepeats--)
|
||
{
|
||
// Check if a particular creature was targeted
|
||
if(GetIsObjectValid(oBallTarget))
|
||
{
|
||
// Let the AI know
|
||
PRCSignalSpellEvent(oBallTarget, TRUE, manif.nSpellID, oManifester);
|
||
|
||
// Roll touch attack
|
||
nTouchAttack = PRCDoRangedTouchAttack(oBallTarget);
|
||
if(nTouchAttack > 0)
|
||
{
|
||
// Roll damage
|
||
nDamage = MetaPsionicsDamage(manif, nDieSize, nNumberOfDice_Ball, 0, 0, TRUE, TRUE);
|
||
// Target-specific stuff
|
||
nDamage = GetTargetSpecificChangesToDamage(oBallTarget, oManifester, nDamage, TRUE, FALSE);
|
||
|
||
// Apply the damage and VFX. No Reflex save here, they got hit by a touch attack
|
||
ApplyTouchAttackDamage(oManifester, oBallTarget, nTouchAttack, nDamage, DAMAGE_TYPE_BLUDGEONING);
|
||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oBallTarget);
|
||
}// end if - Touch attack hit
|
||
}// end if - A creature was targeted with the ball
|
||
|
||
// Either way, shrapnel time
|
||
oExplodeTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
||
while(GetIsObjectValid(oExplodeTarget))
|
||
{
|
||
if(spellsIsTarget(oExplodeTarget, SPELL_TARGET_STANDARDHOSTILE, oManifester))
|
||
{
|
||
// Let the AI know
|
||
PRCSignalSpellEvent(oExplodeTarget, TRUE, manif.nSpellID, oManifester);
|
||
|
||
// Roll damage
|
||
nDamage = MetaPsionicsDamage(manif, nDieSize, nNumberOfDice_Explode, 0, 0, TRUE, TRUE);
|
||
// Target-specific stuff
|
||
nDamage = GetTargetSpecificChangesToDamage(oExplodeTarget, oManifester, nDamage, TRUE, FALSE);
|
||
// Adjust damage according to Reflex Save, Evasion or Improved Evasion
|
||
nDamage = PRCGetReflexAdjustedDamage(nDamage, oExplodeTarget, nDC, SAVING_THROW_TYPE_NONE);
|
||
|
||
// Apply effects if the target didn't Evade
|
||
if(nDamage > 0)
|
||
{
|
||
eDamage = EffectDamage(nDamage, DAMAGE_TYPE_SLASHING);
|
||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oExplodeTarget);
|
||
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImpact, oExplodeTarget);
|
||
}// end if - There was still damage remaining to be dealt after adjustments
|
||
}// end if - Difficulty check
|
||
|
||
// Get next target
|
||
oExplodeTarget = MyNextObjectInShape(SHAPE_SPHERE, fRadius, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
||
}// end while - Explosion target loop
|
||
}// end for - Twin Power
|
||
}// end if - Successfull manifestation
|
||
}
|