187 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//::///////////////////////////////////////////////
 | 
						|
//:: Prismatic Spray
 | 
						|
//:: [NW_S0_PrisSpray.nss]
 | 
						|
//:: Copyright (c) 2000 Bioware Corp.
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//:: Sends out a prismatic cone that has a random
 | 
						|
//:: effect for each target struck.
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//:: Created By: Preston Watamaniuk
 | 
						|
//:: Created On: Dec 19, 2000
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//:: Last Updated By: Preston Watamaniuk, On: April 11, 2001
 | 
						|
//:: Last Updated By: Aidan Scanlan On: April 11, 2001
 | 
						|
//:: Last Updated By: Preston Watamaniuk, On: June 11, 2001
 | 
						|
 | 
						|
// Modified by Olblach to conform 3rd Ed. PHB October, 9, 2003
 | 
						|
 | 
						|
int ApplyPrismaticEffect(int nEffect, object oTarget);
 | 
						|
 | 
						|
#include "X0_I0_SPELLS"
 | 
						|
void main()
 | 
						|
{
 | 
						|
    //Declare major variables
 | 
						|
    object oTarget;
 | 
						|
    int nCasterLevel = GetCasterLevel(OBJECT_SELF);
 | 
						|
    int nMetaMagic = GetMetaMagicFeat();
 | 
						|
    int nRandom;
 | 
						|
    int nHD;
 | 
						|
    int nVisual;
 | 
						|
    effect eVisual;
 | 
						|
    int bTwoEffects;
 | 
						|
    //Set the delay to apply to effects based on the distance to the target
 | 
						|
    float fDelay = 0.5 + GetDistanceBetween(OBJECT_SELF, oTarget)/20;
 | 
						|
    //Get first target in the spell area
 | 
						|
    oTarget = GetFirstObjectInShape(SHAPE_SPELLCONE, 11.0, GetSpellTargetLocation());
 | 
						|
    while (GetIsObjectValid(oTarget))
 | 
						|
    {
 | 
						|
        if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
 | 
						|
        {
 | 
						|
            //Fire cast spell at event for the specified target
 | 
						|
            SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_PRISMATIC_SPRAY));
 | 
						|
            //Make an SR check
 | 
						|
            if (!MyResistSpell(OBJECT_SELF, oTarget, fDelay) && (oTarget != OBJECT_SELF))
 | 
						|
            {
 | 
						|
                //Blind the target if they are less than 9 HD
 | 
						|
                nHD = GetHitDice(oTarget);
 | 
						|
                if (nHD <= 8)
 | 
						|
                {
 | 
						|
                    ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oTarget, RoundsToSeconds(d4()+d4()));
 | 
						|
                }
 | 
						|
                //Determine if 1 or 2 effects are going to be applied
 | 
						|
                nRandom = d8();
 | 
						|
                if(nRandom == 8)
 | 
						|
                {
 | 
						|
                    //Get the visual effect
 | 
						|
                    nVisual = ApplyPrismaticEffect(Random(7) + 1, oTarget);
 | 
						|
                    nVisual = ApplyPrismaticEffect(Random(7) + 1, oTarget);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    //Get the visual effect
 | 
						|
                    nVisual = ApplyPrismaticEffect(nRandom, oTarget);
 | 
						|
                }
 | 
						|
                //Set the visual effect
 | 
						|
                if(nVisual != 0)
 | 
						|
                {
 | 
						|
                    eVisual = EffectVisualEffect(nVisual);
 | 
						|
                    //Apply the visual effect
 | 
						|
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget));
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        //Get next target in the spell area
 | 
						|
        oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 11.0, GetSpellTargetLocation());
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
//  ApplyPrismaticEffect
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
/*  Given a reference integer and a target, this function will apply the effect
 | 
						|
    of corresponding prismatic cone to the target.  To have any effect the
 | 
						|
    reference integer (nEffect) must be from 1 to 7.*/
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
//  Created By: Aidan Scanlan On: April 11, 2001
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
int ApplyPrismaticEffect(int nEffect, object oTarget)
 | 
						|
{
 | 
						|
    int nDamage;
 | 
						|
    effect ePrism;
 | 
						|
    effect eVis;
 | 
						|
    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
 | 
						|
    effect eLink;
 | 
						|
    int nVis;
 | 
						|
    float fDelay = 0.5 + GetDistanceBetween(OBJECT_SELF, oTarget)/20;
 | 
						|
    //Based on the random number passed in, apply the appropriate effect and set the visual to
 | 
						|
    //the correct constant
 | 
						|
    switch(nEffect)
 | 
						|
    {
 | 
						|
        case 1://fire
 | 
						|
            nDamage = 20;
 | 
						|
            nVis = VFX_IMP_FLAME_S;
 | 
						|
            nDamage = GetReflexAdjustedDamage(nDamage, oTarget, GetSpellSaveDC(),SAVING_THROW_TYPE_FIRE);
 | 
						|
            ePrism = EffectDamage(nDamage, DAMAGE_TYPE_FIRE);
 | 
						|
            DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
 | 
						|
        break;
 | 
						|
        case 2: //Acid
 | 
						|
            nDamage = 40;
 | 
						|
            nVis = VFX_IMP_ACID_L;
 | 
						|
            nDamage = GetReflexAdjustedDamage(nDamage, oTarget, GetSpellSaveDC(),SAVING_THROW_TYPE_ACID);
 | 
						|
            ePrism = EffectDamage(nDamage, DAMAGE_TYPE_ACID);
 | 
						|
            DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
 | 
						|
        break;
 | 
						|
        case 3: //Electricity
 | 
						|
            nDamage = 80;
 | 
						|
            nVis = VFX_IMP_LIGHTNING_S;
 | 
						|
            nDamage = GetReflexAdjustedDamage(nDamage, oTarget, GetSpellSaveDC(),SAVING_THROW_TYPE_ELECTRICITY);
 | 
						|
            ePrism = EffectDamage(nDamage, DAMAGE_TYPE_ELECTRICAL);
 | 
						|
            DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
 | 
						|
        break;
 | 
						|
        case 4: //Poison
 | 
						|
            {
 | 
						|
                if (MySavingThrow(SAVING_THROW_FORT, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_POISON) == 0)
 | 
						|
                {
 | 
						|
                    if (GetIsImmune(oTarget, IMMUNITY_TYPE_POISON)) {
 | 
						|
                        ePrism = EffectPoison(POISON_BEBILITH_VENOM);
 | 
						|
                        DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
 | 
						|
                    }
 | 
						|
                    else {
 | 
						|
                        ePrism = EffectDeath();
 | 
						|
                        DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                else {
 | 
						|
                    nDamage = 20 ;
 | 
						|
                    effect ePoison = EffectDamage(nDamage, DAMAGE_TYPE_MAGICAL); //poison
 | 
						|
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePoison, oTarget));
 | 
						|
                }
 | 
						|
            }
 | 
						|
        break;
 | 
						|
        case 5: //Paralyze
 | 
						|
            {
 | 
						|
                effect eDur2 = EffectVisualEffect(VFX_DUR_PARALYZED);
 | 
						|
                if (MySavingThrow(SAVING_THROW_FORT, oTarget, GetSpellSaveDC()) == 0)
 | 
						|
                {
 | 
						|
                    ePrism = EffectParalyze();
 | 
						|
                    eLink = EffectLinkEffects(eDur, ePrism);
 | 
						|
                    eLink = EffectLinkEffects(eLink, eDur2);
 | 
						|
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget));
 | 
						|
                }
 | 
						|
            }
 | 
						|
        break;
 | 
						|
        case 6: //Feeblemind
 | 
						|
            {
 | 
						|
                effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
 | 
						|
                ePrism = EffectConfused();
 | 
						|
                eLink = EffectLinkEffects(eMind, ePrism);
 | 
						|
                eLink = EffectLinkEffects(eLink, eDur);
 | 
						|
 | 
						|
                if (!/*Will Save*/ MySavingThrow(SAVING_THROW_WILL, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_MIND_SPELLS, OBJECT_SELF, fDelay))
 | 
						|
                {
 | 
						|
                    nVis = VFX_IMP_CONFUSION_S;
 | 
						|
                    DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget));
 | 
						|
                }
 | 
						|
            }
 | 
						|
        break;
 | 
						|
        case 7: //Sent to outer plane
 | 
						|
            {
 | 
						|
                if (!/*Will Save*/ MySavingThrow(SAVING_THROW_WILL, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_NONE, OBJECT_SELF, fDelay))
 | 
						|
                {
 | 
						|
                    //nVis = VFX_IMP_DEATH;
 | 
						|
                    nVis = VFX_IMP_UNSUMMON ;
 | 
						|
                    if (!GetIsPC(oTarget))
 | 
						|
                        DestroyObject(oTarget, fDelay+0.3) ;
 | 
						|
                    else {
 | 
						|
                    object oPlane = GetWaypointByTag("WP_PLANE") ;
 | 
						|
                        DelayCommand(fDelay, AssignCommand(oTarget, ActionJumpToObject(oPlane)));
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    return nVis;
 | 
						|
}
 | 
						|
 |