forked from Jaysyn/PRC8
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.
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;
|
|
}
|
|
|