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.
163 lines
6.5 KiB
Plaintext
163 lines
6.5 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Prismatic Dragon Prismatic Breath
|
|
//:: X2_S1_PrisSpray
|
|
//:: Copyright (c) 2003 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
//:: Sends out a prismatic cone that has a random
|
|
//:: effect for each target struck.
|
|
//:: Save is HD
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Georg Zoeller
|
|
//:: Created On: Aug 09, 2003
|
|
//:://////////////////////////////////////////////
|
|
|
|
int ApplyPrismaticEffect(int nEffect, object oTarget);
|
|
#include "prc_inc_spells"
|
|
|
|
void main()
|
|
{
|
|
//Declare major variables
|
|
object oTarget;
|
|
int nCasterLevel = 8;
|
|
int nRandom;
|
|
int nHD;
|
|
int nVisual;
|
|
effect eVisual;
|
|
int bTwoEffects;
|
|
|
|
//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 = GetFirstObjectInShape(SHAPE_SPELLCONE, 20.0, GetSpellTargetLocation());
|
|
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, GetSpellId()));
|
|
//Make an SR check
|
|
//Blind the target if they are less than 9 HD
|
|
nHD = GetHitDice(oTarget);
|
|
if (nHD <= 8)
|
|
{
|
|
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBlindness(), oTarget, RoundsToSeconds(nCasterLevel));
|
|
}
|
|
//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);
|
|
nVisual = ApplyPrismaticEffect(Random(7) + 1, oTarget);
|
|
}
|
|
else
|
|
{
|
|
//Get the visual effect
|
|
nVisual = ApplyPrismaticEffect(nRandom, oTarget);
|
|
}
|
|
//Set the visual effect
|
|
if(nVisual != 0)
|
|
{
|
|
eVisual = EffectVisualEffect(nVisual);
|
|
//Apply the visual effect
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oTarget));
|
|
}
|
|
}
|
|
//Get next target in the spell area
|
|
oTarget = GetNextObjectInShape(SHAPE_SPELLCONE, 20.0, GetSpellTargetLocation());
|
|
}
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// 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 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;
|
|
//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;
|
|
nVis = VFX_IMP_FLAME_S;
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, 31,SAVING_THROW_TYPE_FIRE);
|
|
ePrism = EffectDamage(nDamage, DAMAGE_TYPE_FIRE);
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
|
|
break;
|
|
case 2: //Acid
|
|
nDamage = 40;
|
|
nVis = VFX_IMP_ACID_L;
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, 31,SAVING_THROW_TYPE_ACID);
|
|
ePrism = EffectDamage(nDamage, DAMAGE_TYPE_ACID);
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
|
|
break;
|
|
case 3: //Electricity
|
|
nDamage = 80;
|
|
nVis = VFX_IMP_LIGHTNING_S;
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oTarget, 31,SAVING_THROW_TYPE_ELECTRICITY);
|
|
ePrism = EffectDamage(nDamage, DAMAGE_TYPE_ELECTRICAL);
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
|
|
break;
|
|
case 4: //Poison
|
|
{
|
|
effect ePoison = EffectPoison(POISON_BEBILITH_VENOM);
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePoison, oTarget));
|
|
}
|
|
break;
|
|
case 5: //Paralyze
|
|
{
|
|
effect eDur2 = EffectVisualEffect(VFX_DUR_PARALYZED);
|
|
if (PRCMySavingThrow(SAVING_THROW_FORT, oTarget, 31) == 0)
|
|
{
|
|
ePrism = EffectParalyze();
|
|
eLink = EffectLinkEffects(eDur, ePrism);
|
|
eLink = EffectLinkEffects(eLink, eDur2);
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(10)));
|
|
}
|
|
}
|
|
break;
|
|
case 6: //Confusion
|
|
{
|
|
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
|
|
ePrism = PRCEffectConfused();
|
|
eLink = EffectLinkEffects(eMind, ePrism);
|
|
eLink = EffectLinkEffects(eLink, eDur);
|
|
|
|
if (!/*Will Save*/ PRCMySavingThrow(SAVING_THROW_WILL, oTarget, 31, SAVING_THROW_TYPE_MIND_SPELLS, OBJECT_SELF, fDelay))
|
|
{
|
|
nVis = VFX_IMP_CONFUSION_S;
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(10)));
|
|
}
|
|
}
|
|
break;
|
|
case 7: //Death
|
|
{
|
|
if (!/*Will Save*/ PRCMySavingThrow(SAVING_THROW_WILL, oTarget, 31, SAVING_THROW_TYPE_DEATH, OBJECT_SELF, fDelay))
|
|
{
|
|
DeathlessFrenzyCheck(oTarget);
|
|
//nVis = VFX_IMP_DEATH;
|
|
ePrism = EffectDeath();
|
|
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, ePrism, oTarget));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
return nVis;
|
|
}
|
|
|