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.
		
			
				
	
	
		
			285 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			285 lines
		
	
	
		
			11 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
 | 
						|
//::///////////////////////////////////////////////
 | 
						|
/*
 | 
						|
Evocation
 | 
						|
Level:  Sor/Wiz 7
 | 
						|
Components: V, S
 | 
						|
Casting Time:   1 standard action
 | 
						|
Range:  60 ft.
 | 
						|
Area:   Cone-shaped burst
 | 
						|
Duration:   Instantaneous
 | 
						|
Saving Throw:   See text
 | 
						|
Spell Resistance:   Yes
 | 
						|
This spell causes seven shimmering, intertwined, multicolored beams of light to spray from your hand. Each beam has a different power. Creatures in the area of the spell with 8 HD or less are automatically blinded for 2d4 rounds. Every creature in the area is randomly struck by one or more beams, which have additional effects:
 | 
						|
 | 
						|
1d8    Color of Beam       Effect
 | 
						|
 | 
						|
1      Red                 20 points fire damage(Reflex half)
 | 
						|
2      Orange              40 points acid damage(Reflex half)
 | 
						|
3      Yellow              80 points electricity damage (Reflex half)
 | 
						|
4      Green               Poison (Kills; Fortitude partial, take 1d6 Con damage instead)
 | 
						|
5      Blue                Turned to stone(Fortitude negates)
 | 
						|
6      Indigo              Insane, as insanity spell (Will negates)
 | 
						|
7      Violet              Sent to another plane(Will negates)
 | 
						|
8      Two effects; roll twice more, ignoring any '8' results
 | 
						|
 | 
						|
Updated by AshLancer 1/22/2020 to be PnP accurate
 | 
						|
*/
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
 | 
						|
int ApplyPrismaticEffect(int nEffect, object oTarget,int nDC,int CasterLvl);
 | 
						|
 | 
						|
//:: modified by mr_bumpkin Dec 4, 2003 for PRC stuff
 | 
						|
#include "prc_inc_spells"  
 | 
						|
#include "prc_add_spell_dc"
 | 
						|
//:: left its elemental damage alone, since it's already determined randomly.
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void main()
 | 
						|
{
 | 
						|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
 | 
						|
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
 | 
						|
/*
 | 
						|
  Spellcast Hook Code
 | 
						|
  Added 2003-06-20 by Georg
 | 
						|
  If you want to make changes to all spells,
 | 
						|
  check x2_inc_spellhook.nss to find out more
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
    if (!X2PreSpellCastCode())
 | 
						|
    {
 | 
						|
    // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
 | 
						|
        return;
 | 
						|
    }
 | 
						|
 | 
						|
// End of Spell Cast Hook
 | 
						|
 | 
						|
 | 
						|
    //Declare major variables
 | 
						|
    object oTarget;
 | 
						|
    int CasterLvl = PRCGetCasterLevel(OBJECT_SELF);
 | 
						|
 | 
						|
   
 | 
						|
 | 
						|
    int nMetaMagic = PRCGetMetaMagicFeat();
 | 
						|
    int nRandom;
 | 
						|
    int nHD;
 | 
						|
    int nVisual;
 | 
						|
    effect eVisual;
 | 
						|
    int bTwoEffects;
 | 
						|
    int nPenetr = CasterLvl + SPGetPenetr();
 | 
						|
    
 | 
						|
    //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 = MyFirstObjectInShape(SHAPE_SPELLCONE, 18.28f, PRCGetSpellTargetLocation());
 | 
						|
    while (GetIsObjectValid(oTarget))
 | 
						|
    {
 | 
						|
        if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF) && (oTarget != OBJECT_SELF))
 | 
						|
        {
 | 
						|
            //Fire cast spell at event for the specified target
 | 
						|
            SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_PRISMATIC_SPRAY));
 | 
						|
            //Make an SR check
 | 
						|
            if (!PRCDoResistSpell(OBJECT_SELF, oTarget,nPenetr, fDelay))
 | 
						|
            {
 | 
						|
                 int nDC = PRCGetSaveDC(oTarget,OBJECT_SELF);
 | 
						|
                //Blind the target if they are less than 9 HD
 | 
						|
                nHD = GetHitDice(oTarget);
 | 
						|
                if (nHD <= 8)
 | 
						|
                {
 | 
						|
                    SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oTarget, RoundsToSeconds(d4(2)),TRUE,-1,CasterLvl);
 | 
						|
                }
 | 
						|
                //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,nDC,CasterLvl);
 | 
						|
                    nVisual = ApplyPrismaticEffect(Random(7) + 1, oTarget,nDC,CasterLvl);
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    //Get the visual effect
 | 
						|
                    nVisual = ApplyPrismaticEffect(nRandom, oTarget,nDC,CasterLvl);
 | 
						|
                }
 | 
						|
                //Set the visual effect
 | 
						|
                if(nVisual != 0)
 | 
						|
                {
 | 
						|
                    eVisual = EffectVisualEffect(nVisual);
 | 
						|
                    //Apply the visual effect
 | 
						|
                    DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget));
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        //Get next target in the spell area
 | 
						|
        oTarget = MyNextObjectInShape(SHAPE_SPELLCONE, 18.28f, PRCGetSpellTargetLocation());
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
 | 
						|
// Getting rid of the integer used to hold the spells spell school
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////////////////////////
 | 
						|
//  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 nDC,int CasterLvl)
 | 
						|
{
 | 
						|
    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;
 | 
						|
    PRCBonusDamage(oTarget);
 | 
						|
    //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;
 | 
						|
            //nDamage += ApplySpellBetrayalStrikeDamage(oTarget, OBJECT_SELF, FALSE);
 | 
						|
            nVis = VFX_IMP_FLAME_S;
 | 
						|
            nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, nDC,SAVING_THROW_TYPE_FIRE);
 | 
						|
            ePrism = PRCEffectDamage(oTarget, nDamage, DAMAGE_TYPE_FIRE);
 | 
						|
            DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
 | 
						|
        break;
 | 
						|
        case 2: //Acid
 | 
						|
            nDamage = 40;
 | 
						|
            //nDamage += ApplySpellBetrayalStrikeDamage(oTarget, OBJECT_SELF, FALSE);
 | 
						|
            nVis = VFX_IMP_ACID_L;
 | 
						|
            nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, (nDC),SAVING_THROW_TYPE_ACID);
 | 
						|
            ePrism = PRCEffectDamage(oTarget, nDamage, DAMAGE_TYPE_ACID);
 | 
						|
            DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
 | 
						|
        break;
 | 
						|
        case 3: //Electricity
 | 
						|
            nDamage = 80;
 | 
						|
            //nDamage += ApplySpellBetrayalStrikeDamage(oTarget, OBJECT_SELF, FALSE);
 | 
						|
            nVis = VFX_IMP_LIGHTNING_S;
 | 
						|
            nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, (nDC),SAVING_THROW_TYPE_ELECTRICITY);
 | 
						|
            ePrism = PRCEffectDamage(oTarget, nDamage, DAMAGE_TYPE_ELECTRICAL);
 | 
						|
            DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
 | 
						|
        break;
 | 
						|
        case 4: //Poison
 | 
						|
            {
 | 
						|
                if (PRCGetIsAliveCreature(oTarget) && !GetIsImmune(oTarget, IMMUNITY_TYPE_POISON))
 | 
						|
                {
 | 
						|
                    if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_POISON))
 | 
						|
                    {
 | 
						|
                        DeathlessFrenzyCheck(oTarget);
 | 
						|
                        ApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(EffectDeath()), oTarget);
 | 
						|
                    }
 | 
						|
 | 
						|
                    else ApplyAbilityDamage(oTarget, ABILITY_CONSTITUTION, d6(1), DURATION_TYPE_TEMPORARY, TRUE, -1.0);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        break;
 | 
						|
        case 5: //Petrification
 | 
						|
            {
 | 
						|
                PRCDoPetrification(CasterLvl, OBJECT_SELF, oTarget, SPELL_PRISMATIC_SPRAY, nDC);
 | 
						|
            }
 | 
						|
        break;
 | 
						|
        case 6: //Insanity
 | 
						|
            {
 | 
						|
                if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_SPELL))
 | 
						|
                {
 | 
						|
                    effect eVis = EffectVisualEffect(VFX_IMP_CONFUSION_S);
 | 
						|
                    effect eConfuse = PRCEffectConfused();
 | 
						|
                    effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
 | 
						|
                    effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
 | 
						|
                    effect eLink = EffectLinkEffects(eMind, eConfuse);
 | 
						|
                           eLink = EffectLinkEffects(eLink, eDur);
 | 
						|
                           eLink = SupernaturalEffect(eLink);
 | 
						|
 | 
						|
                    SPApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oTarget, 0.0, TRUE, -1, CasterLvl);
 | 
						|
                    SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        break;
 | 
						|
        case 7: //Banish
 | 
						|
            {
 | 
						|
                if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nDC, SAVING_THROW_TYPE_SPELL))
 | 
						|
                {
 | 
						|
                    ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY), oTarget);
 | 
						|
                    ApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectCutsceneGhost(), oTarget);
 | 
						|
                    ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_UNSUMMON), oTarget);
 | 
						|
 | 
						|
                    int nMessageRoll = d6(1);
 | 
						|
                    int nTalk;
 | 
						|
 | 
						|
                    switch(nMessageRoll)
 | 
						|
                    {
 | 
						|
                        case 1:
 | 
						|
                        {
 | 
						|
                            nTalk = 1729332;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
 | 
						|
                        case 2:
 | 
						|
                        {
 | 
						|
                            nTalk = 1729333;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
 | 
						|
                        case 3:
 | 
						|
                        {
 | 
						|
                            nTalk = 1729334;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
 | 
						|
                        case 4:
 | 
						|
                        {
 | 
						|
                            nTalk = 1729335;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
 | 
						|
                        case 5:
 | 
						|
                        {
 | 
						|
                            nTalk = 1729336;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
 | 
						|
                        case 6:
 | 
						|
                        {
 | 
						|
                            nTalk = 1729337;
 | 
						|
                            break;
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
 | 
						|
                    //Death Popup
 | 
						|
                    DelayCommand(2.75, PopUpDeathGUIPanel(oTarget, FALSE , TRUE, nTalk));
 | 
						|
                    DelayCommand(2.75, ExecuteScript("prc_ondeath", oTarget));
 | 
						|
                }
 | 
						|
            }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    return nVis;
 | 
						|
}
 | 
						|
 |