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;
 | |
| }
 | |
| 
 |