Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
147 lines
6.2 KiB
Plaintext
147 lines
6.2 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Power Word, Kill
|
|
//:: NW_S0_PWKill
|
|
//:: Copyright (c) 2001 Bioware Corp.
|
|
//:://////////////////////////////////////////////
|
|
/*
|
|
// When power word, kill is uttered, you can either
|
|
// target a single creature or let the spell affect a
|
|
// group.
|
|
// If power word, kill is targeted at a single creature,
|
|
// that creature dies if it has 100 or fewer hit points.
|
|
// If the power word, kill is cast as an area spell, it
|
|
// kills creatures in a 15-foot-radius sphere. It only
|
|
// kills creatures that have 20 or fewer hit points, and
|
|
// only up to a total of 200 hit points of such
|
|
// creatures. The spell affects creatures with the lowest.
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Noel Borstad
|
|
//:: Created On: Dec 18, 2000
|
|
//:://////////////////////////////////////////////
|
|
//:: VFX Pass By: Preston W, On: June 22, 2001
|
|
//:: Update Pass By: Preston W, On: Aug 3, 2001
|
|
|
|
//:: modified by mr_bumpkin Dec 4, 2003 for PRC stuff
|
|
#include "prc_inc_spells"
|
|
|
|
void main()
|
|
{
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_DIVINATION);
|
|
/*
|
|
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 = PRCGetSpellTargetObject();
|
|
int nCasterLvl = PRCGetCasterLevel(OBJECT_SELF);
|
|
int nDamageDealt = 0;
|
|
int nHitpoints, nMin;
|
|
object oWeakest;
|
|
effect eDeath = EffectDeath();
|
|
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
|
|
effect eWord = EffectVisualEffect(VFX_FNF_PWKILL);
|
|
float fDelay;
|
|
int bKill;
|
|
nCasterLvl +=SPGetPenetr();
|
|
|
|
//Apply the VFX impact
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eWord, PRCGetSpellTargetLocation());
|
|
//Check for the single creature or area targeting of the spell
|
|
if (GetIsObjectValid(oTarget))
|
|
{
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_POWER_WORD_KILL));
|
|
//Check the creatures HP
|
|
if ( GetCurrentHitPoints(oTarget) <= 100 )
|
|
{
|
|
if(!PRCDoResistSpell(OBJECT_SELF, oTarget,nCasterLvl))
|
|
{
|
|
DeathlessFrenzyCheck(oTarget);
|
|
|
|
//Apply the death effect and the VFX impact
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), oTarget);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//Continue through the while loop while the damage deal is less than 200.
|
|
while (nDamageDealt < 200)
|
|
{
|
|
//Set nMin higher than the highest HP amount allowed
|
|
nMin = 25;
|
|
oWeakest = OBJECT_INVALID;
|
|
//Get the first target in the spell area
|
|
oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, PRCGetSpellTargetLocation());
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
//Make sure the target avoids all allies.
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, OBJECT_SELF))
|
|
{
|
|
bKill = GetLocalInt(oTarget, "NW_SPELL_PW_KILL_" + GetTag(OBJECT_SELF));
|
|
//Get the HP of the current target
|
|
nHitpoints = GetCurrentHitPoints(oTarget);
|
|
//Check if the currently selected target is lower in HP than the weakest stored creature
|
|
if ((nHitpoints < nMin) && ((nHitpoints > 0) && (nHitpoints <= 20)) && bKill == FALSE)
|
|
{
|
|
nMin = nHitpoints;
|
|
oWeakest = oTarget;
|
|
}
|
|
}
|
|
//Get next target in the spell area
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_LARGE, PRCGetSpellTargetLocation());
|
|
}
|
|
//If no weak targets are available then break out of the loop
|
|
if (!GetIsObjectValid(oWeakest))
|
|
{
|
|
nDamageDealt = 250;
|
|
}
|
|
else
|
|
{
|
|
fDelay = PRCGetRandomDelay(0.75, 2.0);
|
|
SetLocalInt(oWeakest, "NW_SPELL_PW_KILL_" + GetTag(OBJECT_SELF), TRUE);
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oWeakest, EventSpellCastAt(OBJECT_SELF, SPELL_POWER_WORD_KILL));
|
|
if(!PRCDoResistSpell(OBJECT_SELF, oWeakest,0, fDelay))
|
|
{
|
|
DeathlessFrenzyCheck(oTarget);
|
|
|
|
//Apply the VFX impact and death effect
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oWeakest));
|
|
if(!GetIsImmune(oWeakest, IMMUNITY_TYPE_DEATH))
|
|
{
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oWeakest));
|
|
}
|
|
//Add the creatures HP to the total
|
|
nDamageDealt = nDamageDealt + nMin;
|
|
string sTag = "NW_SPELL_PW_KILL_" + GetTag(OBJECT_SELF);
|
|
DelayCommand(fDelay + 0.25, DeleteLocalInt(oWeakest, sTag));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
// Getting rid of the integer used to hold the spells spell school
|
|
}
|