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.
130 lines
5.0 KiB
Plaintext
130 lines
5.0 KiB
Plaintext
/*
|
||
----------------
|
||
Breath of the Black Dragon
|
||
|
||
psi_pow_blckdrgn
|
||
----------------
|
||
|
||
21/10/04 by Stratovarius
|
||
*/ /** @file
|
||
|
||
Breath of the Black Dragon
|
||
|
||
Psychometabolism [Acid]
|
||
Level: Psion/wilder 6, psychic warrior 6
|
||
Manifesting Time: 1 standard action
|
||
Range: Close (25 ft. + 5 ft./2 levels)
|
||
Area: Cone-shaped burst centered on you
|
||
Duration: Instantaneous
|
||
Saving Throw: Reflex half
|
||
Power Resistance: Yes
|
||
Power Points: 11
|
||
Metapsionics: Empower, Maximize, Twin, Widen
|
||
|
||
Your mouth spews forth vitriolic acid that deals 11d6 points of acid damage
|
||
to any targets in the area.
|
||
|
||
Augment: For every additional power point you spend, this power’s damage
|
||
increases by 1d6 points.
|
||
*/
|
||
|
||
#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(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 = 11 + manif.nTimesAugOptUsed_1;
|
||
int nDieSize = 6;
|
||
int nDamage;
|
||
effect eAcid, eVis = EffectVisualEffect(VFX_IMP_ACID_L);
|
||
float fWidth = EvaluateWidenPower(manif, FeetToMeters(25.0f + (5.0f * (manif.nManifesterLevel / 2))));
|
||
float fDelay;
|
||
location lTargetLocation = GetSpellTargetLocation();
|
||
object oTarget;
|
||
|
||
// Handle Twin Power
|
||
int nRepeats = manif.bTwin ? 2 : 1;
|
||
for(; nRepeats > 0; nRepeats--)
|
||
{
|
||
// Cone, all damageable objects
|
||
oTarget = MyFirstObjectInShape(SHAPE_SPELLCONE, fWidth, lTargetLocation, TRUE,
|
||
OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE
|
||
);
|
||
while(GetIsObjectValid(oTarget))
|
||
{
|
||
// Does not affect the user
|
||
if(oTarget != oManifester)
|
||
{
|
||
// only hostile
|
||
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, GetAreaOfEffectCreator()))
|
||
{
|
||
|
||
//Fire cast spell at event for the specified target
|
||
PRCSignalSpellEvent(oTarget, TRUE, manif.nSpellID, oManifester);
|
||
|
||
//Get the distance between the target and caster to delay the application of effects
|
||
fDelay = GetDistanceBetween(oManifester, oTarget) / 20.0;
|
||
|
||
//Make SR check, and appropriate saving throw(s).
|
||
if(PRCMyResistPower(oManifester, oTarget, nPen, fDelay))
|
||
{
|
||
// Roll damage
|
||
nDamage = MetaPsionicsDamage(manif, nDieSize, nNumberOfDice, 0, 0, TRUE, FALSE);
|
||
//Adjust damage according to Reflex Save, Evasion or Improved Evasion
|
||
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC, SAVING_THROW_TYPE_ACID);
|
||
// Target-specific stuff
|
||
nDamage = GetTargetSpecificChangesToDamage(oTarget, oManifester, nDamage, TRUE, TRUE);
|
||
|
||
// If there's still any damage left to be dealt, deal it
|
||
if(nDamage > 0)
|
||
{
|
||
// Apply effects to the currently selected target.
|
||
eAcid = EffectDamage(nDamage, DAMAGE_TYPE_ACID);
|
||
//Apply delayed effects
|
||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
|
||
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eAcid, oTarget));
|
||
}
|
||
}// end if - SR check
|
||
}
|
||
}// end if - The target gotten is someone else than the manifester
|
||
|
||
//Select the next target within the spell shape.
|
||
oTarget = MyNextObjectInShape(SHAPE_SPELLCONE, fWidth, lTargetLocation, TRUE,
|
||
OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE
|
||
);
|
||
}// end while - Target getting loop
|
||
}// end for - Twin Power
|
||
}// end if - Successfull manifestation
|
||
}
|