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.
		
			
				
	
	
		
			271 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			271 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //::///////////////////////////////////////////////
 | |
| //:: Name      Prismatic Ray
 | |
| //:: FileName  sp_prismat_ray.nss
 | |
| //:://////////////////////////////////////////////
 | |
| /**@file Prismatic Ray
 | |
| Evocation
 | |
| Level: Sorcerer/wizard 5
 | |
| Components: V, S
 | |
| Casting Time: 1 standard action
 | |
| Range: Medium (100 ft. + 10 ft./level)
 | |
| Effect: Ray
 | |
| Duration: Instantaneous
 | |
| Saving Throw: See text
 | |
| Spell Resistance: Yes
 | |
| 
 | |
| A single beam of brilliantly colored
 | |
| light shoots from your outstretched
 | |
| hand. You must succeed on a ranged touch
 | |
| attack with the ray to strike a target.
 | |
| On a successful attack, a creature with
 | |
| 6 Hit Dice or fewer is blinded for 2d4
 | |
| rounds by the prismatic ray in addition
 | |
| to suffering a randomly determined
 | |
| effect:
 | |
| 
 | |
| 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
 | |
| 
 | |
| Author:    Tenjac
 | |
| Created:   7/6/07
 | |
| */
 | |
| //:://////////////////////////////////////////////
 | |
| //:://////////////////////////////////////////////
 | |
| 
 | |
| void DoRay(object oTarget, int nSaveDC, int nRoll, int nCasterLvl, object oPC);
 | |
| 
 | |
| #include "prc_inc_sp_tch"
 | |
| #include "prc_add_spell_dc"
 | |
| void main()
 | |
| {
 | |
|        if(!X2PreSpellCastCode()) return;
 | |
| 
 | |
|        PRCSetSchool(SPELL_SCHOOL_EVOCATION);
 | |
| 
 | |
|        object oPC = OBJECT_SELF;
 | |
|        object oTarget = PRCGetSpellTargetObject();
 | |
|        int nCasterLvl = PRCGetCasterLevel(oPC);
 | |
|        int nRoll = d8(1);
 | |
|        int bTwoRolls = FALSE;
 | |
|        int nBeamVisualEffect;
 | |
|        int nSaveDC = PRCGetSaveDC(oTarget, oPC);
 | |
|        int nTouch = PRCDoRangedTouchAttack(oTarget);
 | |
|        int nHD = GetHitDice(oTarget);
 | |
|        int nRoll2;
 | |
| 
 | |
|        switch(nRoll)
 | |
|        {
 | |
|                case 1: nBeamVisualEffect = VFX_BEAM_EVIL;
 | |
|                        break;
 | |
| 
 | |
|                case 2: nBeamVisualEffect = VFX_BEAM_FIRE;
 | |
|                        break;
 | |
| 
 | |
|                case 3: nBeamVisualEffect = VFX_BEAM_SILENT_HOLY;
 | |
|                        break;
 | |
| 
 | |
|                case 4: nBeamVisualEffect = VFX_BEAM_DISINTEGRATE;
 | |
|                        break;
 | |
| 
 | |
|                case 5: nBeamVisualEffect = VFX_BEAM_SILENT_COLD;
 | |
|                        break;
 | |
| 
 | |
|                case 6: nBeamVisualEffect = VFX_BEAM_ODD;
 | |
|                        break;
 | |
| 
 | |
|                case 7: nBeamVisualEffect = VFX_BEAM_MIND;
 | |
|                        break;
 | |
| 
 | |
|                case 8: break;
 | |
|        }
 | |
| 
 | |
|        //VFX
 | |
|        effect eVis = EffectBeam(nBeamVisualEffect, oPC, BODY_NODE_HAND, !nTouch);
 | |
|        ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
 | |
| 
 | |
|        if(nTouch)
 | |
|        {
 | |
|                 //SR check
 | |
|                 if(!PRCDoResistSpell(oPC, oTarget, (nCasterLvl + SPGetPenetr())))
 | |
|                 {
 | |
| 
 | |
|                         //blind
 | |
|                         if(nHD < 7)  SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oTarget, RoundsToSeconds(d4(2)));
 | |
| 
 | |
|                         if(nRoll == 8)
 | |
|                         {
 | |
|                                 bTwoRolls = TRUE;
 | |
|                                 nRoll2 = d8(1);
 | |
| 
 | |
|                                 while(nRoll == 8)
 | |
|                                 {
 | |
|                                         nRoll = d8(1);
 | |
|                                 }
 | |
|                                 while (nRoll2 == 8)
 | |
|                                 {
 | |
|                                         nRoll2 = d8(1);
 | |
|                                 }
 | |
|                         }
 | |
| 
 | |
|                         DoRay(oTarget, nSaveDC, nRoll, nCasterLvl, oPC);
 | |
| 
 | |
|                         if(bTwoRolls == TRUE)
 | |
|                         {
 | |
|                                 if(!GetIsDead(oTarget)) //because let's face it; chances are good they are....
 | |
|                                 {
 | |
|                                         DoRay(oTarget, nSaveDC, nRoll2, nCasterLvl, oPC);
 | |
|                                 }
 | |
|                         }
 | |
|                 }
 | |
|         }
 | |
|         PRCSetSchool();
 | |
| }
 | |
| 
 | |
| void DoRay(object oTarget, int nSaveDC, int nRoll, int nCasterLvl, object oPC)
 | |
| {
 | |
|         int nDam;
 | |
|         switch(nRoll)
 | |
|         {
 | |
|                 case 1:
 | |
|                 {
 | |
|                         nDam = 20;
 | |
| 
 | |
|                         if(PRCMySavingThrow(SAVING_THROW_REFLEX, oTarget, nSaveDC, SAVING_THROW_TYPE_FIRE))
 | |
|                         {
 | |
|                                 nDam = nDam/2;
 | |
|                         }
 | |
| 
 | |
|                         ApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_FIRE), oTarget);
 | |
|                         break;
 | |
|                 }
 | |
| 
 | |
|                 case 2:
 | |
|                 {
 | |
|                         nDam = 40;
 | |
| 
 | |
|                         if(PRCMySavingThrow(SAVING_THROW_REFLEX, oTarget, nSaveDC, SAVING_THROW_TYPE_ACID))
 | |
|                         {
 | |
|                                 nDam = nDam/2;
 | |
|                         }
 | |
| 
 | |
|                         ApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_ACID), oTarget);
 | |
|                         break;
 | |
|                 }
 | |
| 
 | |
|                 case 3:
 | |
|                 {
 | |
|                         nDam = 80;
 | |
| 
 | |
|                         if(PRCMySavingThrow(SAVING_THROW_REFLEX, oTarget, nSaveDC, SAVING_THROW_TYPE_ELECTRICITY))
 | |
|                         {
 | |
|                                 nDam = nDam/2;
 | |
|                         }
 | |
| 
 | |
|                         ApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_ELECTRICAL), oTarget);
 | |
|                         break;
 | |
|                 }
 | |
| 
 | |
|                 case 4:
 | |
|                 {
 | |
|                         if (PRCGetIsAliveCreature(oTarget) && (GetIsImmune(oTarget, IMMUNITY_TYPE_POISON) == FALSE))
 | |
|                         {
 | |
|                             if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nSaveDC, 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:
 | |
|                 {
 | |
|                         PRCDoPetrification(nCasterLvl, oPC, oTarget, SPELL_PRISMATIC_RAY, nSaveDC);
 | |
|                         break;
 | |
|                 }
 | |
| 
 | |
|                 case 6:
 | |
|                 {
 | |
|                         if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nSaveDC, 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,nCasterLvl);
 | |
|                                 SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
 | |
|                         }
 | |
|                         break;
 | |
|                 }
 | |
| 
 | |
|                 case 7:
 | |
|                 {
 | |
|                         if(!PRCMySavingThrow(SAVING_THROW_WILL, oTarget, nSaveDC, 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));
 | |
|                         }
 | |
|                 }
 | |
|         }
 | |
| } |