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