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.
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);
|
|
}
|
|
}
|