forked from Jaysyn/PRC8
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.
155 lines
5.6 KiB
Plaintext
155 lines
5.6 KiB
Plaintext
/*:://////////////////////////////////////////////
|
|
//:: Spell Name Vitae Grenade
|
|
//:: Spell FileName XXX_S_VitaeGren
|
|
//:://////////////////////////////////////////////
|
|
//:: In Game Spell desctiption
|
|
//:://////////////////////////////////////////////
|
|
Transmutation
|
|
Level: Sor/Wiz 5
|
|
Components: V, S, F, M
|
|
Casting Time: 1 standard action
|
|
Range: Medium (20M)
|
|
Area: 6.67M-radius (20-ft) spread, centered on 1 target creature
|
|
Duration: Instantaneous
|
|
Saving Throw: Fortitude partial
|
|
Spell Resistance: Yes
|
|
Source: Various (Andvaranaut)
|
|
|
|
Upon casting this spell, a small vial of your own blood flies throught the
|
|
air towards a designated target, which it strikes unerringly. In flight,
|
|
the blood crystalizes and begins to become explosively unstable due to the
|
|
magical energies channelled into it. Upon impact, the vial and blood
|
|
crystals detonate, dealing 1d6 points of damage per 2 levels (to a maximum
|
|
of 10d6) to all within the area of effect. This is non-elemental damage, and
|
|
thus not subject to damage reduction from such spells as Protection from
|
|
Elements.
|
|
|
|
Additionally, all those unfortunate enough to be caught in the blast are
|
|
knocked prone and coated with a fine, dust-like coating of the blood - until
|
|
recently - contained within the vial. Unless completely washed off, by
|
|
resting, or after 24 hours, the blood begins to reek, and will give a -4
|
|
penalty to hide checks until the blood is removed.
|
|
|
|
A successful fortitude save halves the damage dealt by this spell, and
|
|
prevents the character from falling prone.
|
|
|
|
The focus and material component for this spell is a small vial of your own
|
|
blood (roughly 2hp worth).
|
|
//:://////////////////////////////////////////////
|
|
//:: Spell Effects Applied / Notes
|
|
//:://////////////////////////////////////////////
|
|
Perfectly fine.
|
|
|
|
Originally it was +4 to people tracking them, but I think -4 to hide checks
|
|
are just as fine.
|
|
|
|
That part isn't savable against. The proneness is, and the damage is.
|
|
|
|
Need blood effects (eeewww!)
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Jasperre
|
|
//::////////////////////////////////////////////*/
|
|
|
|
#include "SMP_INC_SPELLS"
|
|
|
|
void main()
|
|
{
|
|
// Spell Hook Check.
|
|
if(!SMP_SpellHookCheck(SMP_SPELL_VITAE_GRENADE)) return;
|
|
|
|
// Declare major variables
|
|
object oCaster = OBJECT_SELF;
|
|
object oTarget;
|
|
location lTarget = GetSpellTargetLocation();
|
|
int nCasterLevel = SMP_GetCasterLevel();
|
|
int nSpellSaveDC = SMP_GetSpellSaveDC();
|
|
int nMetaMagic = SMP_GetMetaMagicFeat();
|
|
int nDam;
|
|
float fDelay;
|
|
|
|
// Duration of blood
|
|
float fDurationBlood = HoursToSeconds(24);
|
|
// Duration of proneness
|
|
float fDurationProne = RoundsToSeconds(1);
|
|
|
|
// 2 HP damage
|
|
int nCurrentHP = GetCurrentHitPoints(oCaster);
|
|
|
|
// Need to do damage
|
|
if(nCurrentHP <= 2)
|
|
{
|
|
// Not enough HP
|
|
FloatingTextStringOnCreature("*You cannot draw enough blood to throw*", oCaster, FALSE);
|
|
return;
|
|
}
|
|
|
|
// Damage for HP
|
|
FloatingTextStringOnCreature("*You draw blood to throw*", oCaster, FALSE);
|
|
|
|
// Do the damage (2HP worth).
|
|
effect eDamage = EffectDamage(2);
|
|
SMP_ApplyInstant(oTarget, eDamage);
|
|
|
|
// Limit dice to 10d6, per 2 caster levels
|
|
int nDice = SMP_LimitInteger(nCasterLevel/2, 10);
|
|
|
|
// Declare Effects
|
|
effect eVis = EffectVisualEffect(VFX_COM_CHUNK_RED_LARGE);
|
|
effect eKnockdown = EffectKnockdown();
|
|
effect eHide = EffectSkillDecrease(SKILL_HIDE, 4);
|
|
|
|
// Apply AOE visual
|
|
effect eImpact = EffectVisualEffect(SMP_VFX_FNF_VITAE_GRENADE);
|
|
SMP_ApplyLocationVFX(lTarget, eImpact);
|
|
|
|
// Get all targets in a sphere, 6.67M radius, creature.
|
|
oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 6.67, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
// Loop targets
|
|
while(GetIsObjectValid(oTarget))
|
|
{
|
|
// PvP Check
|
|
if(!GetIsReactionTypeFriendly(oTarget, oCaster) &&
|
|
// Make sure they are not immune to spells
|
|
!SMP_TotalSpellImmunity(oTarget))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SMP_SignalSpellCastAt(oTarget, SMP_SPELL_VITAE_GRENADE);
|
|
|
|
//Get the distance between the explosion and the target to calculate delay
|
|
fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
|
|
|
|
// Spell resistance And immunity checking.
|
|
if(!SMP_SpellResistanceCheck(oCaster, oTarget, fDelay))
|
|
{
|
|
// Remove old hide penalties
|
|
SMP_RemoveSpecificEffectFromSpell(EFFECT_TYPE_SKILL_DECREASE, SMP_SPELL_VITAE_GRENADE, oTarget);
|
|
|
|
// Always apply the -4 to hide
|
|
DelayCommand(fDelay, SMP_ApplyDurationAndVFX(oTarget, eVis, eHide, fDurationBlood));
|
|
|
|
// Roll damage for each target
|
|
nDam = SMP_MaximizeOrEmpower(6, nDice, nMetaMagic);
|
|
|
|
// Fortitide save
|
|
if(SMP_SavingThrow(SAVING_THROW_FORT, oTarget, nSpellSaveDC))
|
|
{
|
|
// Half damage
|
|
nDam /= 2;
|
|
|
|
// No Proneness
|
|
}
|
|
else
|
|
{
|
|
// Proneness
|
|
DelayCommand(fDelay, SMP_ApplyDuration(oTarget, eKnockdown, fDurationProne));
|
|
}
|
|
|
|
// Apply effects to the currently selected target.
|
|
DelayCommand(fDelay, SMP_ApplyDamageToObject(oTarget, nDam, DAMAGE_TYPE_MAGICAL));
|
|
}
|
|
}
|
|
// Get Next Target
|
|
oTarget = GetNextObjectInShape(SHAPE_SPHERE, 6.67, lTarget, TRUE, OBJECT_TYPE_CREATURE);
|
|
}
|
|
}
|