//:://///////////////////////////////////////////// //:: Hellball //:: X2_S2_HELLBALL //:: Copyright (c) 2003 Bioware Corp. //::////////////////////////////////////////////// //:: Created By: Andrew Noobs, Georg Zoeller //:: Created On: 2003-08-20 //::////////////////////////////////////////////// /* Altered by Boneshank, for purposes of the Epic Spellcasting project. */ #include "prc_alterations" #include "inc_epicspells" void main() { DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION); if (!X2PreSpellCastCode()) { DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); return; } if (GetCanCastSpell(OBJECT_SELF, SPELL_EPIC_HELBALL)) { //Declare major variables int nDamage1, nDamage2, nDamage3, nDamage4; float fDelay; effect eExplode = EffectVisualEffect(464); effect eVis = EffectVisualEffect(VFX_IMP_FLAME_M); effect eVis2 = EffectVisualEffect(VFX_IMP_ACID_L); effect eVis3 = EffectVisualEffect(VFX_IMP_SONIC); // if this option has been enabled, the caster will take damage for casting // epic spells, as descripbed in the ELHB if (GetPRCSwitch(PRC_EPIC_BACKLASH_DAMAGE) == TRUE) { effect eCast = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY); int nDamage5 = d6(10); effect eDam5 = EffectDamage(nDamage5, DAMAGE_TYPE_NEGATIVE); SPApplyEffectToObject(DURATION_TYPE_INSTANT, eCast, OBJECT_SELF); SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam5, OBJECT_SELF); } effect eDam1, eDam2, eDam3, eDam4, eDam5, eKnock; eKnock= EffectKnockdown(); location lTarget = PRCGetSpellTargetLocation(); ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eExplode, lTarget); object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 20.0f, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); int nTotalDamage; while (GetIsObjectValid(oTarget)) { if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF)) { SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, PRCGetSpellId())); fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20 + 0.5f; //Roll damage for each target nDamage1 = d6(10); nDamage2 = d6(10); nDamage3 = d6(10); nDamage4 = d6(10); // no we don't care about evasion. there is no evasion to hellball if (PRCMySavingThrow(SAVING_THROW_REFLEX,oTarget,GetEpicSpellSaveDC(OBJECT_SELF, oTarget),SAVING_THROW_TYPE_SPELL,OBJECT_SELF,fDelay) >0) { nDamage1 /=2; nDamage2 /=2; nDamage3 /=2; nDamage4 /=2; } nTotalDamage = nDamage1+nDamage2+nDamage3+nDamage4; //Set the damage effect eDam1 = EffectDamage(nDamage1, DAMAGE_TYPE_ACID); eDam2 = EffectDamage(nDamage2, DAMAGE_TYPE_ELECTRICAL); eDam3 = EffectDamage(nDamage3, DAMAGE_TYPE_FIRE); eDam4 = EffectDamage(nDamage4, DAMAGE_TYPE_SONIC); if(nTotalDamage > 0) { if (nTotalDamage > 50) { DelayCommand(fDelay+0.3f, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eKnock, oTarget,3.0f, TRUE, -1, GetTotalCastingLevel(OBJECT_SELF))); } // Apply effects to the currently selected target. DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam1, oTarget)); DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam2, oTarget)); DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam3, oTarget)); DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam4, 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, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget)); DelayCommand(fDelay+0.2f, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis2, oTarget)); DelayCommand(fDelay+0.5f, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis3, oTarget)); } } //Select the next target within the spell shape. oTarget = GetNextObjectInShape(SHAPE_SPHERE, 20.0f, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE); } } DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR"); }