Changed folder name.
Changed folder name.
This commit is contained in:
521
_module/nss/spellfunc_inc.nss
Normal file
521
_module/nss/spellfunc_inc.nss
Normal file
@@ -0,0 +1,521 @@
|
||||
///Created by Genisys / Guile 6/13/08
|
||||
///(Friday the 13th *crosses fingers*)
|
||||
/////////////////////////////////////
|
||||
|
||||
#include "nw_i0_spells"
|
||||
#include "epicdc_inc"
|
||||
|
||||
/*
|
||||
This magnificent include saves you time and reduces the length of the "myhook"
|
||||
script by using functions instead of retyping everything! Just follow the
|
||||
examples of the functions (copy / paste) to utlize the various functions below
|
||||
in the "myhook" script. I created several generic functions to create generic
|
||||
effects for spells that you do not wish the original version to run, but wanted
|
||||
to create your own effects for that spell.
|
||||
|
||||
The options I have set within this include script (See below const int)
|
||||
allows you to adjust most spells to epic casting. (if applicable)
|
||||
Due to the nature of some area of effect spells only the target of the spell
|
||||
will recieve the epic damage bonus, like cone of cold / issacs missles, etc,
|
||||
unlike fireball, icestorm, etc. they don't have a sphere, and it would be too
|
||||
much work to script each specific type of sphere, so I just created a huge
|
||||
sphere as the area of effect for most spells, and added the area damage to those
|
||||
spells, all other damage dealing spells that aren't a large sphere will just
|
||||
deal extra damage to the target only, please read below for more information.
|
||||
|
||||
NOTE: the functions directly below options are the function which you can use
|
||||
to create generic effect for spells that you do not wish to use the original
|
||||
spell.
|
||||
|
||||
*/
|
||||
/////////////////BEGIN OPTIONS/////////////////////
|
||||
|
||||
/*
|
||||
This int is a Magical Damage Bonus added to the normal damage dealt by spells.
|
||||
This one took me a while to figure out, but it's been simplified for you..
|
||||
the # below is the # of levels the caster needs beyond level 20 to gain
|
||||
an additional d8 dmg / # of Epic Levels (defined by eBon int)
|
||||
ie. if set to a 3 a level 29 caster would get + 3d8 additional damage
|
||||
set this constant to 21 to disable. (ie no bonus!) */
|
||||
const int eBon = 3;
|
||||
|
||||
/*
|
||||
This determinues How much bonus damage is dealt by all dmg dealing spells.
|
||||
Note: this dice is multiplied by the # of Epic Levels (set directly above)
|
||||
Here are the only possible combinations of damage, change the eDam # to adjust
|
||||
0 = disabled / 1 = 1d4 / 2 = 1d6 / 3 = 1d8 / 4 = 1d10 / 5 = 1d12
|
||||
6 = 2d8 / 7 = 2d10 / 8 = 2d12 / 9 = 2d20 */
|
||||
const int zDam = 2;
|
||||
|
||||
|
||||
///////////////END OPTIONS////////////////////
|
||||
|
||||
////////Protypes (Defined)////////
|
||||
//NOTE:The following functions go in the spell case { } for a single spell
|
||||
//You will see the code goes here in green, this is where any spell code goes.
|
||||
|
||||
//This function is more or less for a generic spell effect, it's intended use
|
||||
//is for spells that will not run normally because you are creating your own
|
||||
//version of the actual spell, this function is used for spells that are
|
||||
//targeting one target.(This is for single target spells only!)
|
||||
//Example of use.. DoTVisual();
|
||||
void DoTVisual()
|
||||
{
|
||||
object aTarget = GetSpellTargetObject();
|
||||
effect aVis;
|
||||
int nInt;
|
||||
nInt = GetObjectType(aTarget);
|
||||
|
||||
//This effect creates a red explosion of gas at the target object..
|
||||
aVis = EffectVisualEffect(VFX_FNF_GAS_EXPLOSION_EVIL);
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, aVis, aTarget, 0.0f);
|
||||
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//This function is more or less for a generic spell effect, it's intended use
|
||||
//is for spells that will not run normally because you are creating your own
|
||||
//version of the actual spell, this function is used for spells that are
|
||||
//an area of effect. (Despite it targeting a person or location)
|
||||
//Example of use in the "myhook" script.. DoAVisual(GetSpellTargetLocation());
|
||||
void DoAVisual(location aLocation)
|
||||
{
|
||||
aLocation = GetSpellTargetLocation();
|
||||
effect aVis;
|
||||
|
||||
//Visual Effect - Power Word Kill (cool visual :)
|
||||
aVis = EffectVisualEffect(VFX_FNF_PWKILL);
|
||||
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, aVis, aLocation, 0.0f);
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
//This simple function applies damage to the target based upon the level
|
||||
//of the caster, note it's positive damage, so it's less likely to be resisted
|
||||
//though they still are allowed to resist the spell and make a save for half!
|
||||
//this function was designed for a generic application of damage for a
|
||||
//generic spell effect you create in replacement of a normal spell.
|
||||
//NOTE: This spell is for single target only spells!
|
||||
//Example of Use in the "myhook" script, DoTDmg();
|
||||
|
||||
void DoTDmg()
|
||||
{
|
||||
object aTarget = GetSpellTargetObject();
|
||||
int nTType = GetObjectType(aTarget);
|
||||
int aLvl = GetCasterLevel(OBJECT_SELF);
|
||||
int nLvl;
|
||||
int fDC;
|
||||
|
||||
if(aLvl<1)
|
||||
{aLvl = 1;}
|
||||
else
|
||||
{aLvl = GetCasterLevel(OBJECT_SELF);}
|
||||
|
||||
//Cap the damage at 20 X Damage Dice Maximum (see below)
|
||||
if(aLvl >20)
|
||||
{ nLvl = 20; }
|
||||
else {nLvl = GetCasterLevel(OBJECT_SELF);}
|
||||
|
||||
//The /2 # below represents a division of levels, if you change this # you will
|
||||
//change how many times damage is multiplied right now it's 1/2 of levels..
|
||||
int oLvl = nLvl;
|
||||
//Damage Dice: You can change the dice to d4(2) = 2d4 / d8(1) = 1d8/ etc.
|
||||
int cInt = d6(1)* oLvl;
|
||||
int dInt = cInt;
|
||||
int nDmg = dInt;
|
||||
|
||||
int aDC = aLvl - 20;
|
||||
int bDC = aDC / eDC;
|
||||
int cDC = GetSpellSaveDC();
|
||||
int dDC = cDC + bDC;
|
||||
|
||||
if(bDC >0)
|
||||
{
|
||||
fDC = dDC;
|
||||
}
|
||||
|
||||
else
|
||||
{fDC = cDC;}
|
||||
|
||||
|
||||
if(GetMetaMagicFeat()==METAMAGIC_MAXIMIZE)
|
||||
{
|
||||
nDmg = 6 * oLvl; //Please change the # here if you modified the dice above.
|
||||
}
|
||||
if(GetMetaMagicFeat()==METAMAGIC_EMPOWER)
|
||||
{
|
||||
nDmg = d8(oLvl);//Please change this d# if you modified the dice above.
|
||||
}
|
||||
|
||||
effect eDmg;
|
||||
eDmg = EffectDamage(nDmg, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY);
|
||||
|
||||
//Check For Spell Resistance...
|
||||
if(!MyResistSpell(OBJECT_SELF, aTarget))
|
||||
{
|
||||
//If they don't make a Fortitude saving throw, apply normal dmg..
|
||||
if (!FortitudeSave(aTarget, fDC, SAVING_THROW_TYPE_ALL))
|
||||
{
|
||||
if(!GetIsPC(aTarget) && nTType == OBJECT_TYPE_CREATURE )
|
||||
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, aTarget));
|
||||
}
|
||||
|
||||
//Otherwise they obviously made the save..
|
||||
else
|
||||
{
|
||||
//Apply 1/2 damage only!
|
||||
int oDmg = nDmg /2;
|
||||
eDmg = EffectDamage(oDmg, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY);
|
||||
if(!GetIsPC(aTarget) && nTType == OBJECT_TYPE_CREATURE )
|
||||
DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, aTarget));
|
||||
}
|
||||
}
|
||||
|
||||
//End void DoTDmg function..
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
//This function allows you do damage to all in the area of effect (huge)
|
||||
//It's intended uses is within the "myhook" script to replace the effects
|
||||
//of a spell that you do not wish to run normally, don't forget to use a
|
||||
//visual effect as well! (See above functions)
|
||||
//Example use: DoAreaDmg();
|
||||
void DoAreaDmg()
|
||||
{
|
||||
object aTarget = GetSpellTargetObject();
|
||||
object bTarget;
|
||||
int nTType;
|
||||
location aLocation = GetSpellTargetLocation();
|
||||
int aLvl = GetCasterLevel(OBJECT_SELF);
|
||||
int bLvl;
|
||||
int nLvl;
|
||||
int fDC;
|
||||
|
||||
//Minimum 1 damage dice (to prevent madness!)
|
||||
if(aLvl<1)
|
||||
{bLvl = 1;}
|
||||
else
|
||||
{bLvl = GetCasterLevel(OBJECT_SELF);}
|
||||
|
||||
int aDC = bLvl - 20;
|
||||
int bDC = aDC / eDC;
|
||||
int cDC = GetSpellSaveDC();
|
||||
int dDC = cDC + bDC;
|
||||
|
||||
if(bDC >0)
|
||||
{
|
||||
fDC = dDC;
|
||||
}
|
||||
|
||||
else
|
||||
{fDC = cDC;}
|
||||
|
||||
float fDelay = 0.8;
|
||||
|
||||
|
||||
//Cap the damage to Level 20 X Damage Dice (See Below)
|
||||
if(GetCasterLevel(OBJECT_SELF) >30)
|
||||
{ nLvl = 20; }
|
||||
else {nLvl = GetCasterLevel(OBJECT_SELF);}
|
||||
|
||||
int oLvl = nLvl;
|
||||
//Damage Dice: You can change the dice to d4(2) = 2d4 / d8(1) = 1d8/ etc.
|
||||
int cInt = d6(1); //Set to d6 because it's an area of effect!
|
||||
int dInt = (cInt * oLvl);
|
||||
int nDmg = dInt;
|
||||
int mDmg = oLvl * 6;//This is the maximized dmg (adjust if you change dice above!)
|
||||
int fDmg = d8(oLvl);//This is empowered dmg(adjust if you change the dice above!)
|
||||
|
||||
if(GetMetaMagicFeat()==METAMAGIC_MAXIMIZE)
|
||||
{
|
||||
nDmg = mDmg; //Note you will need to change this if you change the dice above.
|
||||
//ie. if you make the dice above 2d4 then make this 8 (max dmg)
|
||||
}
|
||||
if(GetMetaMagicFeat()==METAMAGIC_EMPOWER)
|
||||
{
|
||||
nDmg = fDmg; //This dice is empowered (The next highest dice)
|
||||
}
|
||||
|
||||
effect eDmg;
|
||||
eDmg = EffectDamage(nDmg, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY);
|
||||
|
||||
bTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, aLocation,
|
||||
FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
||||
|
||||
while(GetIsObjectValid(bTarget))
|
||||
{
|
||||
nTType = GetObjectType(bTarget);
|
||||
//This effect will not be applied to the caster...
|
||||
if(bTarget != OBJECT_SELF)
|
||||
{
|
||||
if(GetIsReactionTypeHostile(bTarget, OBJECT_SELF))
|
||||
{
|
||||
//If the Target doesn't resist the spell...
|
||||
if(!ResistSpell(OBJECT_SELF, bTarget))
|
||||
{
|
||||
//Allow them a will save (casters have a better chance to save..)
|
||||
if (!ReflexSave(bTarget, fDC, SAVING_THROW_TYPE_ALL))
|
||||
{
|
||||
if(!GetIsPC(bTarget)&& nTType == OBJECT_TYPE_CREATURE)
|
||||
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, bTarget));
|
||||
}
|
||||
|
||||
//Otherwise they made the save, so do 1/2 dmg..
|
||||
else
|
||||
{
|
||||
//Apply 1/2 damage only!
|
||||
int oDmg = nDmg / 2;
|
||||
eDmg = EffectDamage(oDmg, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY);
|
||||
if(!GetIsPC(bTarget) && nTType == OBJECT_TYPE_CREATURE)
|
||||
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, bTarget));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Continue Loop..
|
||||
bTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, aLocation,
|
||||
FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
// DO NOT TOUCH ANYTHING BELOW THIS LINE!!! (Adjustable At Top)
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
//This function is part of the main spell hoooking script "myhook"
|
||||
//You should not change anything within this script other than damage amount
|
||||
void DoBonusDmg(object aTarget)
|
||||
{
|
||||
object aTarget = GetSpellTargetObject();
|
||||
int cLvl = GetCasterLevel(OBJECT_SELF);
|
||||
int dLvl = cLvl -20;
|
||||
int aInt = eDC -1;
|
||||
int bInt = dLvl -aInt;
|
||||
int aDC = GetSpellSaveDC();
|
||||
int dBonus = dLvl / eDC;
|
||||
int eDBon;
|
||||
int eBonus;
|
||||
float fDelay;
|
||||
|
||||
int eDam;
|
||||
|
||||
if(zDam ==0)
|
||||
{eDam = 0; }
|
||||
else if(zDam ==1)
|
||||
{eDam = d4(1);}
|
||||
else if(zDam ==2)
|
||||
{eDam = d6(1);}
|
||||
else if(zDam ==3)
|
||||
{eDam = d8(1);}
|
||||
else if(zDam ==4)
|
||||
{eDam = d10(1);}
|
||||
else if(zDam ==5)
|
||||
{eDam = d12(1);}
|
||||
else if(zDam ==6)
|
||||
{eDam = d8(2);}
|
||||
else if(zDam ==7)
|
||||
{eDam = d10(2);}
|
||||
else if(zDam ==8)
|
||||
{eDam = d12(2);}
|
||||
else if(zDam ==9)
|
||||
{eDam = d20(1);}
|
||||
else
|
||||
{eDam = d4(1);}
|
||||
|
||||
if (bInt>0)
|
||||
{eBonus = dBonus;
|
||||
eDBon = dLvl / eBon;
|
||||
}
|
||||
else
|
||||
{eBonus = 0;
|
||||
eDBon = 0;
|
||||
}
|
||||
|
||||
int nDmg;
|
||||
|
||||
int fDam = (eDam * eDBon);
|
||||
int mDmg = (eDBon * 8);
|
||||
int eDamg = fDam +2;
|
||||
|
||||
//Apply the epic DC bonus to the saving throw DC.
|
||||
int nSpellDC = aDC + eBonus;
|
||||
|
||||
|
||||
if(eDBon >0)
|
||||
{
|
||||
nDmg = fDam;
|
||||
}
|
||||
else
|
||||
{
|
||||
nDmg = 0;
|
||||
}
|
||||
|
||||
|
||||
if(GetMetaMagicFeat()==METAMAGIC_MAXIMIZE)
|
||||
{
|
||||
nDmg = mDmg;
|
||||
}
|
||||
if(GetMetaMagicFeat()==METAMAGIC_EMPOWER)
|
||||
{
|
||||
nDmg = eDamg;
|
||||
}
|
||||
|
||||
effect eDmg;
|
||||
eDmg = EffectDamage(nDmg, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_ENERGY);
|
||||
|
||||
//Check For Spell Resistance...
|
||||
if(!ResistSpell(OBJECT_SELF, aTarget))
|
||||
{
|
||||
//Allow them a will save (casters have a better chance to save..)
|
||||
if (!WillSave(aTarget, nSpellDC, SAVING_THROW_TYPE_ALL))
|
||||
{
|
||||
if(!GetIsPC(aTarget))
|
||||
{
|
||||
DelayCommand(0.9, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, aTarget));
|
||||
}
|
||||
}
|
||||
|
||||
//Otherwise they made the save, so do 1/2 dmg..
|
||||
else
|
||||
{
|
||||
//Apply 1/2 damage only!
|
||||
int oDmg = nDmg / 2;
|
||||
eDmg = EffectDamage(oDmg, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_ENERGY);
|
||||
if(!GetIsPC(aTarget))
|
||||
{
|
||||
DelayCommand(0.9, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, aTarget));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//End Prototype
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void DoAreaBonusDmg(location aLocation)
|
||||
{
|
||||
object aTarget = GetSpellTargetObject();
|
||||
object bTarget;
|
||||
aLocation = GetSpellTargetLocation();
|
||||
int nTType;
|
||||
int cLvl = GetCasterLevel(OBJECT_SELF);
|
||||
int dLvl = cLvl - 20;
|
||||
int aInt = eDC - 1;
|
||||
int bInt = dLvl - aInt;
|
||||
int aDC = GetSpellSaveDC();
|
||||
int dBonus = dLvl / eDC;
|
||||
int eDBon;
|
||||
int eBonus;
|
||||
float fDelay = 1.2;
|
||||
|
||||
|
||||
if (bInt>0)
|
||||
{eBonus = dBonus;
|
||||
eDBon = dLvl / eBon;
|
||||
}
|
||||
else
|
||||
{eBonus = 0;
|
||||
eDBon = 0;
|
||||
}
|
||||
|
||||
//Apply the epic DC bonus to the saving throw DC.
|
||||
int nSpellDC = aDC + eBonus;
|
||||
|
||||
int eDam;
|
||||
|
||||
if(zDam ==0)
|
||||
{eDam = 0; }
|
||||
else if(zDam ==1)
|
||||
{eDam = d4(1);}
|
||||
else if(zDam ==2)
|
||||
{eDam = d6(1);}
|
||||
else if(zDam ==3)
|
||||
{eDam = d8(1);}
|
||||
else if(zDam ==4)
|
||||
{eDam = d10(1);}
|
||||
else if(zDam ==5)
|
||||
{eDam = d12(1);}
|
||||
else if(zDam ==6)
|
||||
{eDam = d8(2);}
|
||||
else if(zDam ==7)
|
||||
{eDam = d10(2);}
|
||||
else if(zDam ==8)
|
||||
{eDam = d12(2);}
|
||||
else if(zDam ==9)
|
||||
{eDam = d20(1);}
|
||||
else
|
||||
{eDam = d4(1);}
|
||||
|
||||
int nDmg;
|
||||
|
||||
int fDam = (eDam * eDBon);
|
||||
int mDmg = (eDBon * 8);
|
||||
int eDamg = fDam +2;
|
||||
|
||||
|
||||
if(eDBon >0)
|
||||
{
|
||||
nDmg = fDam;
|
||||
}
|
||||
else
|
||||
{
|
||||
nDmg = 0;
|
||||
}
|
||||
|
||||
|
||||
if(GetMetaMagicFeat()==METAMAGIC_MAXIMIZE)
|
||||
{
|
||||
nDmg = mDmg;
|
||||
}
|
||||
if(GetMetaMagicFeat()==METAMAGIC_EMPOWER)
|
||||
{
|
||||
nDmg = eDamg;
|
||||
}
|
||||
|
||||
effect eDmg;
|
||||
eDmg = EffectDamage(nDmg, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_ENERGY);
|
||||
|
||||
bTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, aLocation,
|
||||
TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
||||
|
||||
while(GetIsObjectValid(bTarget))
|
||||
{
|
||||
nTType = GetObjectType(bTarget);
|
||||
//Let's make sure they are a standard hostile target..
|
||||
if(GetIsReactionTypeHostile(bTarget, OBJECT_SELF))
|
||||
{
|
||||
//If the Target doesn't resist the spell...
|
||||
if(!ResistSpell(OBJECT_SELF, bTarget))
|
||||
{
|
||||
//Allow them a will save (casters have a better chance to save..)
|
||||
if (!WillSave(bTarget, nSpellDC, SAVING_THROW_TYPE_ALL))
|
||||
{
|
||||
if(!GetIsPC(bTarget) && nTType == OBJECT_TYPE_CREATURE)
|
||||
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, bTarget, 0.0f));
|
||||
}
|
||||
|
||||
//Otherwise they made the save, so do 1/2 dmg..
|
||||
else
|
||||
{
|
||||
//Apply 1/2 damage only!
|
||||
int oDmg = nDmg / 2;
|
||||
eDmg = EffectDamage(oDmg, DAMAGE_TYPE_MAGICAL, DAMAGE_POWER_ENERGY);
|
||||
if(!GetIsPC(bTarget) && nTType == OBJECT_TYPE_CREATURE)
|
||||
DelayCommand(fDelay, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDmg, bTarget, 0.0f));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Continue Loop..
|
||||
bTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, aLocation,
|
||||
FALSE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
|
||||
}
|
||||
|
||||
//End Prototype
|
||||
}
|
||||
|
Reference in New Issue
Block a user