//:://///////////////////////////////////////////// //:: 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; }