//:://///////////////////////////////////////////// //:: x1_s2_deatharrow //:: Copyright (c) 2001 Bioware Corp. //::////////////////////////////////////////////// /* Seeker Arrow - creates an arrow that automatically hits target. - At level 4 the arrow does +2 magic damage - at level 5 the arrow does +3 magic damage - normal arrow damage, based on base item type - Must have shortbow or longbow in hand. */ //::////////////////////////////////////////////// //:: Created By: //:: Created On: //::////////////////////////////////////////////// #include "X0_I0_SPELLS" #include "prc_x2_itemprop" #include "x2_inc_spellhook" void main() { object oCaster = OBJECT_SELF; int nCasterLvl = GetLevelByClass(CLASS_TYPE_ARCANE_ARCHER,oCaster); nCasterLvl = nCasterLvl +10; int nBonus = 0; nBonus = ArcaneArcherCalculateBonus() ; object oTarget = GetSpellTargetObject(); if (GetIsObjectValid(oTarget) == TRUE) { // *** TURNING THE DEATHARROW INTO AN OVERPOWERED BOMBARD *** int nDamage; float fDelay; effect eExplode = EffectVisualEffect(VFX_FNF_METEOR_SWARM); effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M); effect eDam; //Get the spell target location as opposed to the spell target. location lTarget = GetSpellTargetLocation(); //Limit Caster level for the purposes of damage if (nCasterLvl > 40) { nCasterLvl = 40; } //Apply the fireball explosion at the location captured above. ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, lTarget); //Declare the spell shape, size and the location. Capture the first target object in the shape. object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); //Cycle through the targets within the spell shape until an invalid object is captured. while (GetIsObjectValid(oTarget)) { if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF) == TRUE) { //Fire cast spell at event for the specified target SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, GetSpellId())); //Get the distance between the explosion and the target to calculate delay fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20; if (!MyResistSpell(OBJECT_SELF, oTarget, fDelay)) { //Roll damage for each target nDamage = d8(nCasterLvl)+30; nDamage = nDamage*3; if ( nCasterLvl > 19 ) { nDamage = (nDamage*3)/2; } if ( nCasterLvl > 29 ) { nDamage = (nDamage*3)/2; } //Adjust the damage based on the Reflex Save, Evasion and Improved Evasion. nDamage = GetReflexAdjustedDamage(nDamage, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_ALL); //Set the damage effect eDam = EffectDamage(nDamage, DAMAGE_TYPE_BLUDGEONING); if(nDamage > 0) { // Apply effects to the currently selected target. DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget)); //This visual effect is applied to the target object not the location as above. This visual effect //represents the flame that erupts on the target not on the ground. DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); } } } //Select the next target within the spell shape. oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_GARGANTUAN, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); } } }