Further file organization
Further file organization
This commit is contained in:
154
nwn/nwnprc/trunk/smp/xxx_s_vitaegrena.nss
Normal file
154
nwn/nwnprc/trunk/smp/xxx_s_vitaegrena.nss
Normal file
@@ -0,0 +1,154 @@
|
||||
/*:://////////////////////////////////////////////
|
||||
//:: 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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user