Initial upload.
Adding base PRC 4.19a files to repository.
This commit is contained in:
154
trunk/spells/sp_lahms_fd.nss
Normal file
154
trunk/spells/sp_lahms_fd.nss
Normal file
@@ -0,0 +1,154 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Name: Lahm's Finger Darts
|
||||
//:: Filename: sp_lahms_fd.nss
|
||||
//::///////////////////////////////////////////////
|
||||
/**@file Lahm's Finger Darts
|
||||
Transmutation [Evil]
|
||||
Level: Corrupt 2
|
||||
Components: V S, Corrupt
|
||||
Casting Time: 1 action
|
||||
Range: Medium (100 ft. + 10 ft./level)
|
||||
Targets: Up to five creatures, no two of which can
|
||||
be more than 15 ft. apart
|
||||
Duration: Instantaneous
|
||||
Saving Throw: None
|
||||
Spell Resistance: Yes
|
||||
|
||||
The caster's finger becomes a dangerous projectile
|
||||
that flies from her hand and unerringly strikes its
|
||||
target. The dart deals 1d4 points of Dexterity
|
||||
damage. Creatures without fingers cannot cast this
|
||||
spell.
|
||||
|
||||
The dart strikes unerringly, even if the target is
|
||||
in melee or has partial cover or concealment.
|
||||
Inanimate objects (locks, doors, and so forth)
|
||||
cannot be damaged by the spell.
|
||||
|
||||
For every three caster levels beyond 1st, the caster
|
||||
gains an additional dart by losing an additional
|
||||
finger: two at 4th level, three at 7th level, four
|
||||
at 10th level, and the maximum of five darts at 13th
|
||||
level or higher. If the caster shoots multiple darts,
|
||||
she can have them strike a single creature or several
|
||||
creatures. A single dart can strike only one creature.
|
||||
The caster must designate targets before checking for
|
||||
spell resistance or damage.
|
||||
|
||||
Fingers lost to this spell grow back when the
|
||||
corruption cost is healed, at the rate of one finger
|
||||
per point of Strength damage healed.
|
||||
|
||||
Corruption Cost: 1 point of Strength damage per dart,
|
||||
plus the loss of one finger per dart. A hand with one
|
||||
or no fingers is useless.
|
||||
|
||||
@author Written By: Tenjac
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "prc_inc_spells"
|
||||
|
||||
void main()
|
||||
{
|
||||
//Spellhook
|
||||
if(!X2PreSpellCastCode()) return;
|
||||
|
||||
PRCSetSchool(SPELL_SCHOOL_TRANSMUTATION);
|
||||
|
||||
object oPC = OBJECT_SELF;
|
||||
object oTarget = PRCGetSpellTargetObject();
|
||||
int nLFingers = (GetPersistantLocalInt(oPC, "FINGERS_LEFT_HAND") - 1);
|
||||
int nRFingers = (GetPersistantLocalInt(oPC, "FINGERS_RIGHT_HAND")- 1);
|
||||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
||||
int nFingers = 1;
|
||||
int nDam;
|
||||
effect eVis = EffectVisualEffect(VFX_IMP_MAGBLUE);
|
||||
effect eMissile = EffectVisualEffect(VFX_IMP_MIRV);
|
||||
effect eDam = EffectAbilityDecrease(ABILITY_DEXTERITY, nDam);
|
||||
float fDist = GetDistanceBetween(OBJECT_SELF, oTarget);
|
||||
float fDelay = fDist/(3.0 * log(fDist) + 2.0);
|
||||
float fDelay2, fTime;
|
||||
location lTarget = PRCGetSpellTargetLocation();
|
||||
|
||||
PRCSignalSpellEvent(oTarget,TRUE, SPELL_LAHMS_FINGER_DARTS, oPC);
|
||||
|
||||
//Set up fingers if it hasn't been done before
|
||||
if (GetPersistantLocalInt(oPC, "FINGERS_LEFT_HAND") < 1)
|
||||
{
|
||||
SetPersistantLocalInt(oPC, "FINGERS_LEFT_HAND", 6);
|
||||
SetPersistantLocalInt(oPC, "FINGERS_RIGHT_HAND", 6);
|
||||
nLFingers = 5;
|
||||
nRFingers = 5;
|
||||
}
|
||||
|
||||
//Spell Resistance, no save
|
||||
if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
|
||||
{
|
||||
//Calculate fingers used
|
||||
if(nCasterLvl > 3) nFingers++;
|
||||
if(nCasterLvl > 6) nFingers++;
|
||||
if(nCasterLvl > 9) nFingers++;
|
||||
if(nCasterLvl > 12) nFingers++;
|
||||
|
||||
//gotta set up a new counter because nFingers is used later
|
||||
int nCounter = nFingers;
|
||||
|
||||
//Determine which hand to screw up
|
||||
if(nLFingers >= nFingers)
|
||||
{
|
||||
nLFingers -= nFingers;
|
||||
SetPersistantLocalInt(oPC, "FINGERS_LEFT_HAND", nLFingers);
|
||||
}
|
||||
|
||||
else if(nRFingers >= nFingers)
|
||||
{
|
||||
nRFingers -= nFingers;
|
||||
SetPersistantLocalInt(oPC, "FINGERS_RIGHT_HAND", nRFingers);
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
SendMessageToPC(oPC, "You do not have enough fingers left to cast this spell");
|
||||
nCounter = 0;
|
||||
}
|
||||
|
||||
//Damage loop
|
||||
while(nCounter > 0)
|
||||
{
|
||||
nDam = d4(1);
|
||||
|
||||
//Apply the MIRV and damage effect
|
||||
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eVis, oTarget));
|
||||
DelayCommand(fDelay2, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eMissile, oTarget));
|
||||
DelayCommand(fTime, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget));
|
||||
|
||||
// Play the sound of a dart hitting
|
||||
DelayCommand(fTime, PlaySound("cb_ht_dart1"));
|
||||
|
||||
//decrement nCounter to handle loop termination
|
||||
nCounter--;
|
||||
}
|
||||
|
||||
//Determine usefullness of remaining stumps
|
||||
if(nLFingers < 2)
|
||||
{
|
||||
//mark left hand useless
|
||||
SetPersistantLocalInt(oPC, "LEFT_HAND_USELESS", 1);
|
||||
}
|
||||
|
||||
if(nRFingers < 2)
|
||||
{
|
||||
//mark right hand useless
|
||||
SetPersistantLocalInt(oPC, "RIGHT_HAND_USELESS", 1);
|
||||
}
|
||||
}
|
||||
|
||||
//Corrupt spells get mandatory 10 pt evil adjustment, regardless of switch
|
||||
AdjustAlignment(oPC, ALIGNMENT_EVIL, 10, FALSE);
|
||||
|
||||
//SPEvilShift(oPC);
|
||||
DoCorruptionCost(oPC, ABILITY_STRENGTH, nFingers, 0);
|
||||
PRCSetSchool();
|
||||
}
|
Reference in New Issue
Block a user