Updated AMS marker feats. Removed arcane & divine marker feats. Updated Dread Necromancer for epic progression. Updated weapon baseitem models. Updated new weapons for crafting & npc equip. Updated prefix. Updated release archive.
153 lines
5.9 KiB
Plaintext
153 lines
5.9 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Circle of Death
|
|
//:: NW_S0_CircDeath
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
The caster slays a number of HD worth of creatures
|
|
equal to 1d4 times level. The creature gets a
|
|
Fort Save or dies.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Preston Watamaniuk
|
|
//:: Created On: June 1, 2001
|
|
//:://////////////////////////////////////////////
|
|
//:: Last Updated By: Aidan Scanlan
|
|
//:: VFX Pass By: Preston W, On: June 20, 2001
|
|
//:: Update Pass By: Preston W, On: July 25, 2001
|
|
|
|
|
|
//:: modified by mr_bumpkin Dec 4, 2003
|
|
#include "prc_inc_spells"
|
|
#include "prc_add_spell_dc"
|
|
|
|
|
|
|
|
|
|
|
|
void main()
|
|
{
|
|
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_NECROMANCY);
|
|
/*
|
|
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 oTarget;
|
|
object oLowest;
|
|
effect eDeath = EffectDeath();
|
|
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
|
|
effect eFNF = EffectVisualEffect(VFX_FNF_LOS_EVIL_20);
|
|
int bContinueLoop = FALSE; //Used to determine if we have a next valid target
|
|
int CasterLvl = PRCGetCasterLevel(OBJECT_SELF);
|
|
|
|
int nHD = d4(CasterLvl); //Roll to see how many HD worth of creature will be killed
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int nCurrentHD;
|
|
int bAlreadyAffected;
|
|
int nMax = 10;// maximun hd creature affected, set this to 9 so that a lower HD creature is chosen automatically
|
|
//Also 9 is the maximum HD a creature can have and still be affected by the spell
|
|
float fDelay;
|
|
string sIdentifier = GetTag(OBJECT_SELF);
|
|
|
|
//Enter Metamagic conditions
|
|
if ((nMetaMagic & METAMAGIC_MAXIMIZE))
|
|
{
|
|
nHD = 4 * CasterLvl;
|
|
}
|
|
if ((nMetaMagic & METAMAGIC_EMPOWER))
|
|
{
|
|
nHD = nHD + (nHD/2); //Damage/Healing is +50%
|
|
}
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eFNF, PRCGetSpellTargetLocation());
|
|
//Check for at least one valid object to start the main loop
|
|
oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, PRCGetSpellTargetLocation());
|
|
if (GetIsObjectValid(oTarget))
|
|
{
|
|
bContinueLoop = TRUE;
|
|
}
|
|
// The above checks to see if there is at least one valid target. If no value target exists we do not enter
|
|
// the loop.
|
|
|
|
|
|
CasterLvl +=SPGetPenetr();
|
|
|
|
|
|
while ((nHD > 0) && (bContinueLoop))
|
|
{
|
|
int nLow = nMax; //Set nLow to the lowest HD creature in the last pass through the loop
|
|
bContinueLoop = FALSE; //Set this to false so that the loop only continues in the case of new low HD creature
|
|
//Get first target creature in loop
|
|
oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, PRCGetSpellTargetLocation());
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
//Make sure the currect target is not an enemy
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF) && oTarget != OBJECT_SELF)
|
|
{
|
|
//Get a local set on the creature that checks if the spell has already allowed them to save
|
|
bAlreadyAffected = GetLocalInt(oTarget, "bDEATH" + sIdentifier);
|
|
if (!bAlreadyAffected)
|
|
{
|
|
nCurrentHD = GetHitDice(oTarget);
|
|
//If the selected creature is of lower HD then the current nLow value and
|
|
//the HD of the creature is of less HD than the number of HD available for
|
|
//the spell to affect then set the creature as the currect primary target
|
|
if(nCurrentHD < nLow && nCurrentHD <= nHD)
|
|
{
|
|
nLow = nCurrentHD;
|
|
oLowest = oTarget;
|
|
bContinueLoop = TRUE;
|
|
}
|
|
}
|
|
}
|
|
//Get next target in shape to test for a new
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, PRCGetSpellTargetLocation());
|
|
}
|
|
//Check to make sure that oLowest has changed
|
|
if(bContinueLoop == TRUE)
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oLowest, EventSpellCastAt(OBJECT_SELF, SPELL_CIRCLE_OF_DEATH));
|
|
fDelay = PRCGetRandomDelay();
|
|
if(!PRCDoResistSpell(OBJECT_SELF, oLowest,CasterLvl, fDelay))
|
|
{
|
|
int nDC = PRCGetSaveDC(oTarget,OBJECT_SELF);
|
|
//Make a Fort Save versus death effects
|
|
if(!PRCMySavingThrow(SAVING_THROW_FORT, oLowest, nDC, SAVING_THROW_TYPE_DEATH, OBJECT_SELF, fDelay))
|
|
{
|
|
DeathlessFrenzyCheck(oTarget);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oLowest);
|
|
//DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oLowest));
|
|
}
|
|
}
|
|
//Even if the target made their save mark them as having been affected by the spell
|
|
SetLocalInt(oLowest, "bDEATH" + sIdentifier, TRUE);
|
|
//Destroy the local after 1/4 of a second in case other Circles of Death are cast on
|
|
//the creature laster
|
|
DelayCommand(fDelay + 0.25, DeleteLocalInt(oLowest, "bDEATH" + sIdentifier));
|
|
//Adjust the number of HD that have been affected by the spell
|
|
nHD = nHD - GetHitDice(oLowest);
|
|
oLowest = OBJECT_INVALID;
|
|
}
|
|
}
|
|
|
|
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
// Getting rid of the local integer storing the spellschool name
|
|
}
|