152 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //::///////////////////////////////////////////////
 | |
| //:: Negative Energy Burst
 | |
| //:: NW_S0_NegBurst
 | |
| //:: Copyright (c) 2001 Bioware Corp.
 | |
| //:://////////////////////////////////////////////
 | |
| /*
 | |
|     The caster releases a burst of negative energy
 | |
|     at a specified point doing 1d8 + 1 / level
 | |
|     negative energy damage
 | |
| */
 | |
| //:://////////////////////////////////////////////
 | |
| //:: Created By: Preston Watamaniuk
 | |
| //:: Created On: Sept 13, 2001
 | |
| //:://////////////////////////////////////////////
 | |
| 
 | |
| #include "ke_spell_factor"
 | |
| 
 | |
| #include "X0_I0_SPELLS"
 | |
| #include "x2_inc_spellhook"
 | |
| 
 | |
| void main()
 | |
| {
 | |
| 
 | |
| /*
 | |
|   Spellcast Hook Code
 | |
|   Added 2003-06-20 by Georg
 | |
|   If you want to make changes to all spells,
 | |
|   check x2_inc_spellhook.nss to find out more
 | |
| 
 | |
| */
 | |
| 
 | |
|     if (!X2PreSpellCastCode())
 | |
|     {
 | |
|     // If code within the PreSpellCastHook (i.e. UMD) reports FALSE, do not run this spell
 | |
|         return;
 | |
|     }
 | |
| 
 | |
| // End of Spell Cast Hook
 | |
| 
 | |
| 
 | |
|     //Declare major variables
 | |
|     object oCaster = OBJECT_SELF;
 | |
|     int nCasterLvl = GetCasterLevel(oCaster);
 | |
|     int nMetaMagic = GetMetaMagicFeat();
 | |
|     int nDamage;
 | |
|     int nAdditionalLevelDamage;
 | |
|     float fDelay;
 | |
|     effect eExplode = EffectVisualEffect(VFX_FNF_LOS_EVIL_20); //Replace with Negative Pulse
 | |
|     effect eVis = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
 | |
|     effect eVisHeal = EffectVisualEffect(VFX_IMP_HEALING_M);
 | |
|     effect eDam, eHeal;
 | |
|     int nStr = nCasterLvl / 8;
 | |
|     if (nStr == 0)
 | |
|     {
 | |
|         nStr = 1;
 | |
|     }
 | |
| 
 | |
|     effect eStr = EffectAbilityIncrease(ABILITY_STRENGTH, nStr);
 | |
|     effect eStr_Low = EffectAbilityDecrease(ABILITY_STRENGTH, nStr);
 | |
|     effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
 | |
|     effect eDur2 = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
 | |
| 
 | |
|     effect eGood = EffectLinkEffects(eStr, eDur);
 | |
|     effect eBad = EffectLinkEffects(eStr_Low, eDur2);
 | |
| 
 | |
|     //Get the spell target location as opposed to the spell target.
 | |
|     location lTarget = GetSpellTargetLocation();
 | |
|     //Apply the 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_HUGE, lTarget);
 | |
|     //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))
 | |
|        {
 | |
|             //Roll damage for each target
 | |
|             nDamage = ((d6(nCasterLvl)+30)*11)/10;
 | |
|             //Resolve metamagic
 | |
|             if (nMetaMagic == METAMAGIC_MAXIMIZE)
 | |
|             {
 | |
|                 nDamage = ((6*(nCasterLvl)+30)*11)/10;
 | |
|             }
 | |
|                 else if (nMetaMagic == METAMAGIC_EMPOWER)
 | |
|             {
 | |
|                nDamage = nDamage + (nDamage / 2);
 | |
|             }
 | |
|             if(MySavingThrow(SAVING_THROW_WILL, oTarget, GetSpellSaveDC(), SAVING_THROW_TYPE_NEGATIVE, OBJECT_SELF, fDelay))
 | |
|             {
 | |
|                 nDamage /= 2;
 | |
|             }
 | |
| 
 | |
|             //starting the grand circus of importing and converting back and forth //
 | |
| 
 | |
|                 float fDamage = IntToFloat(nDamage);
 | |
| 
 | |
|                 // multiplaying damage with fFactor //
 | |
| 
 | |
|                 float fFactor = CalculateFactor();
 | |
| 
 | |
|                 fDamage = fDamage * fFactor;
 | |
| 
 | |
|                 // converting the float damage back to INT damage so we can use it again //
 | |
| 
 | |
|                 int nDamage2 = FloatToInt(fDamage);
 | |
| 
 | |
|                // Done and remember to change nDamage with nDamage2 below :) //
 | |
| 
 | |
| 
 | |
|             //Get the distance between the explosion and the target to calculate delay
 | |
|             fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
 | |
| 
 | |
|             // * any undead should be healed, not just Friendlies
 | |
|             if (GetRacialType(oTarget) == RACIAL_TYPE_UNDEAD)
 | |
|             {
 | |
|                 //Fire cast spell at event for the specified target
 | |
|                 SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_NEGATIVE_ENERGY_BURST, FALSE));
 | |
|                 //Set the heal effect
 | |
|                 eHeal = EffectHeal(nDamage2);
 | |
|                 DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, 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, eVisHeal, oTarget));
 | |
|                 DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGood, oTarget));
 | |
|             }
 | |
|             else
 | |
|             if(spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
 | |
|             {
 | |
|                 if(GetRacialType(oTarget) != RACIAL_TYPE_UNDEAD)
 | |
|                 {
 | |
|                     if(!MyResistSpell(OBJECT_SELF, oTarget, fDelay))
 | |
|                     {
 | |
|                         //Fire cast spell at event for the specified target
 | |
|                         SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_NEGATIVE_ENERGY_BURST));
 | |
|                         //Set the damage effect
 | |
|                         eDam = EffectDamage(nDamage2, DAMAGE_TYPE_NEGATIVE);
 | |
|                         // 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));
 | |
|                         DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_PERMANENT, eBad, oTarget));
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|        //Select the next target within the spell shape.
 | |
|        oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, lTarget);
 | |
|     }
 | |
| }
 |