Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
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));
|
|
}
|
|
}
|
|
}
|
|
} |