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.
		
			
				
	
	
		
			154 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//::///////////////////////////////////////////////
 | 
						|
//:: 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();
 | 
						|
} |