PRC8/nwn/nwnprc/trunk/spells/sp_prismat_ray.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

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