forked from Jaysyn/PRC8
84 lines
3.5 KiB
Plaintext
84 lines
3.5 KiB
Plaintext
|
/*
|
|||
|
----------------
|
|||
|
Cadence of the Thunder Drake
|
|||
|
Acolyte of the Ego level 2+
|
|||
|
|
|||
|
true_ego_fort
|
|||
|
----------------
|
|||
|
|
|||
|
3/1/20 by Stratovarius
|
|||
|
|
|||
|
Type of Feat: Class
|
|||
|
Prerequisite: Acolye of the Ego 2+
|
|||
|
Specifics: You can make a single breath weapon attack<63> specifically, a 20-foot cone of painful noise that deals 2d6 points of
|
|||
|
sonic damage per morphic cadence you know. The Reflex save to halve the damage is DC 10 + your acolyte of the ego class level + your Con modifier + the number of morphic cadences you know.
|
|||
|
Use: Selected.
|
|||
|
*/
|
|||
|
|
|||
|
#include "true_inc_trufunc"
|
|||
|
#include "true_utterhook"
|
|||
|
|
|||
|
void main()
|
|||
|
{
|
|||
|
/*
|
|||
|
Spellcast Hook Code
|
|||
|
Added 2006-7-19 by Stratovarius
|
|||
|
If you want to make changes to all utterances
|
|||
|
check true_utterhook to find out more
|
|||
|
|
|||
|
*/
|
|||
|
|
|||
|
if (!TruePreUtterCastCode())
|
|||
|
{
|
|||
|
// If code within the PreUtterCastHook (i.e. UMD) reports FALSE, do not run this spell
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// End of Spell Cast Hook
|
|||
|
|
|||
|
object oTrueSpeaker = OBJECT_SELF;
|
|||
|
object oTarget = PRCGetSpellTargetObject();
|
|||
|
// Cadences always use personal truenames, even when targeting another creature
|
|||
|
struct utterance utter = EvaluateUtterance(oTrueSpeaker,
|
|||
|
oTrueSpeaker,
|
|||
|
METAUTTERANCE_NONE/* Use METAUTTERANCE_NONE if it has no Metautterance usable*/,
|
|||
|
LEXICON_EVOLVING_MIND /* Uses the same DC formula*/);
|
|||
|
|
|||
|
if(utter.bCanUtter)
|
|||
|
{
|
|||
|
int nClass = GetLevelByClass(CLASS_TYPE_ACOLYTE_EGO, oTrueSpeaker);
|
|||
|
int nDice = GetCadenceCount(oTrueSpeaker);
|
|||
|
// Figure out where the cone was targetted.
|
|||
|
location lTargetLocation = PRCGetSpellTargetLocation();
|
|||
|
int nSaveDC = 10 + nClass + nDice + GetAbilityModifier(ABILITY_CONSTITUTION, oTrueSpeaker);
|
|||
|
|
|||
|
oTarget = MyFirstObjectInShape(SHAPE_SPELLCONE, FeetToMeters(20.0), lTargetLocation, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|||
|
while(GetIsObjectValid(oTarget))
|
|||
|
{
|
|||
|
if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oTrueSpeaker))
|
|||
|
{
|
|||
|
//Get the distance between the target and caster to delay the application of effects
|
|||
|
float fDelay = PRCGetSpellEffectDelay(lTargetLocation, oTarget);
|
|||
|
// Roll damage for each target
|
|||
|
int nDamage = d6(nDice * 2);
|
|||
|
|
|||
|
// Adjust damage according to Reflex Save, Evasion or Improved Evasion
|
|||
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nSaveDC, SAVING_THROW_TYPE_SONIC);
|
|||
|
|
|||
|
// Apply effects to the currently selected target.
|
|||
|
if(nDamage > 0)
|
|||
|
{
|
|||
|
effect eDamage = PRCEffectDamage(oTarget, nDamage, DAMAGE_TYPE_SONIC);
|
|||
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_SONIC), oTarget));
|
|||
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oTarget));
|
|||
|
}
|
|||
|
}
|
|||
|
//Select the next target within the spell shape.
|
|||
|
oTarget = MyNextObjectInShape(SHAPE_SPELLCONE, FeetToMeters(20.0), lTargetLocation, FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
|||
|
}
|
|||
|
|
|||
|
// Mark for the Law of Sequence. This only happens if the cadence succeeds, which is why its down here.
|
|||
|
DoLawOfSequence(oTrueSpeaker, utter.nSpellId, utter.fDur);
|
|||
|
}// end if - Successful utterance
|
|||
|
}
|