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.
500 lines
20 KiB
Plaintext
500 lines
20 KiB
Plaintext
/*
|
|
Smite Evil: Once per day, a paladin of 2nd level or higher may
|
|
attempt to smite evil with one normal melee attack. She adds her
|
|
Charisma modifier (if positive) to her attack roll and deals 1 extra
|
|
point of damage per level. For example, a 13th-level paladin armed
|
|
with a longsword would deal 1d8+13 points of damage, plus any
|
|
additional bonuses for high Strength or magical effects that
|
|
normally apply. If the paladin accidentally smites a creature that is
|
|
not evil, the smite has no effect but it is still used up for that day.
|
|
*/
|
|
/*
|
|
Good
|
|
Anti-paldin
|
|
Blackguard
|
|
Fiendish Template
|
|
Half-fiend Template
|
|
Evil
|
|
Paladin
|
|
Fist of Raziel
|
|
Celestial Template
|
|
Half-celestial Template
|
|
Undead
|
|
Soldier of Light
|
|
Infidel
|
|
Champion of Bane
|
|
Champion of Torm
|
|
CW Samurai
|
|
Kiai
|
|
*/
|
|
|
|
const int SMITE_TYPE_GOOD_ANTIPALADIN = 11;
|
|
const int SMITE_TYPE_GOOD_BLACKGUARD = 12; //not used, biowares is adequate
|
|
const int SMITE_TYPE_GOOD_TEMPLATE_FIENDISH = 13;
|
|
const int SMITE_TYPE_GOOD_TEMPLATE_HALF_FIEND = 14;
|
|
|
|
const int SMITE_TYPE_EVIL_PALADIN = 21; //not used, biowares is adequate
|
|
const int SMITE_TYPE_EVIL_FIST_OF_RAZIEL = 22;
|
|
const int SMITE_TYPE_EVIL_TEMPLATE_CELESTIAL = 23;
|
|
const int SMITE_TYPE_EVIL_TEMPLATE_HALF_CELESTIAL = 24;
|
|
|
|
const int SMITE_TYPE_UNDEAD = 31;
|
|
|
|
const int SMITE_TYPE_INFIDEL = 41;
|
|
|
|
const int SMITE_TYPE_KIAI = 51;
|
|
const int SMITE_TYPE_CRUSADER = 52;
|
|
const int SMITE_TYPE_SHADOWBANE = 53;
|
|
const int SMITE_TYPE_KILLOREN = 54;
|
|
const int SMITE_TYPE_TEMPLATE_MINERAL = 55;
|
|
const int SMITE_TYPE_CULTIST = 56;
|
|
const int SMITE_TYPE_SOULBORN = 57;
|
|
const int SMITE_TYPE_CHAOS = 58;
|
|
const int SMITE_TYPE_RAMETHENE = 59;
|
|
const int SMITE_TYPE_ANDRAS = 60;
|
|
const int SMITE_TYPE_TRIAD = 61;
|
|
const int SMITE_TYPE_DESHARIS = 62;
|
|
|
|
//this calculates damage and stuff from class and type
|
|
//takes epic smiting feats etc into account
|
|
//takes FoR special smiteing abilities into account too
|
|
//It DOES NOT decrease smites remaining
|
|
void DoSmite(object oPC, object oTarget, int nType);
|
|
|
|
#include "prc_inc_combat"
|
|
#include "prc_inc_racial"
|
|
#include "bnd_inc_bndfunc"
|
|
#include "prc_inc_factotum"
|
|
|
|
void DoSmite(object oPC, object oTarget, int nType)
|
|
{
|
|
effect eSmite; //effect OnHit
|
|
int nDamage;
|
|
int nDamageType;
|
|
int nAttack;
|
|
object oWeapon = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
|
string sHit;
|
|
string sMiss;
|
|
string sFailedTarget;
|
|
string sFailedSmiter;
|
|
int nTargetInvalid = !GetIsObjectValid(oTarget);
|
|
int nSmiterInvalid = !GetIsObjectValid(oPC);
|
|
if(nType == SMITE_TYPE_EVIL_FIST_OF_RAZIEL
|
|
|| nType == SMITE_TYPE_EVIL_PALADIN
|
|
|| nType == SMITE_TYPE_EVIL_TEMPLATE_CELESTIAL
|
|
|| nType == SMITE_TYPE_EVIL_TEMPLATE_HALF_CELESTIAL)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
|
|
if(nType == SMITE_TYPE_EVIL_PALADIN)
|
|
{
|
|
nDamage = GetLevelByClass(CLASS_TYPE_PALADIN, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_DIVINE_CHAMPION, oPC);
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 1;
|
|
}
|
|
else if(nType == SMITE_TYPE_EVIL_FIST_OF_RAZIEL)
|
|
{
|
|
nDamage = GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_PALADIN, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_DIVINE_CHAMPION, oPC);
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 1;
|
|
}
|
|
else if(nType == SMITE_TYPE_EVIL_TEMPLATE_CELESTIAL)
|
|
{
|
|
nDamage = GetHitDice(oPC);
|
|
if(nDamage > 20)
|
|
nDamage = 20;
|
|
}
|
|
else if(nType == SMITE_TYPE_EVIL_TEMPLATE_HALF_CELESTIAL)
|
|
{
|
|
nDamage = GetHitDice(oPC);
|
|
if(nDamage > 20)
|
|
nDamage = 20;
|
|
}
|
|
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Smite Failed: target is not Evil";
|
|
sFailedSmiter = "Smite Failed: you are not Good";
|
|
sHit = "Smite Evil Hit";
|
|
sMiss = "Smite Evil Missed";
|
|
if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_EVIL)
|
|
nTargetInvalid = TRUE;
|
|
if(GetAlignmentGoodEvil(oPC) != ALIGNMENT_GOOD)
|
|
nSmiterInvalid = TRUE;
|
|
|
|
//Fist of Raziel special stuff
|
|
if(nType == SMITE_TYPE_EVIL_FIST_OF_RAZIEL)
|
|
{
|
|
int nClass = GetLevelByClass(CLASS_TYPE_FISTRAZIEL, oPC);
|
|
//good aligned weapon (+1 enhancement to break DR)
|
|
if(nClass)
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyEnhancementBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL, 1), oWeapon, 0.1);
|
|
|
|
//criticals always hit
|
|
if(nClass >= 3)
|
|
SetLocalInt(oPC, "FistOfRazielSpecialSmiteCritical", TRUE);
|
|
|
|
//2d8 vs outsiders or undead
|
|
if(nClass >= 7 && (MyPRCGetRacialType(oTarget) == RACIAL_TYPE_OUTSIDER || MyPRCGetRacialType(oTarget) == RACIAL_TYPE_UNDEAD))
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL, DAMAGE_TYPE_DIVINE, IP_CONST_DAMAGEBONUS_2d8), oWeapon, 0.1);
|
|
|
|
//these are either or, not both
|
|
else if(nClass >= 5)
|
|
AddItemProperty(DURATION_TYPE_TEMPORARY, ItemPropertyDamageBonusVsAlign(IP_CONST_ALIGNMENTGROUP_EVIL, DAMAGE_TYPE_DIVINE, IP_CONST_DAMAGEBONUS_2d6), oWeapon, 0.1);
|
|
|
|
//chain bolt stuff
|
|
if(nClass >= 9)
|
|
{
|
|
int nTargetCount = 5;
|
|
int i = 1;
|
|
object oSecondTarget = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oPC, i);
|
|
//GetFirstObjectInShape(SHAPE_SPHERE,
|
|
// RADIUS_SIZE_LARGE, GetLocation(oPC), TRUE, OBJECT_TYPE_CREATURE);
|
|
while(GetIsObjectValid(oSecondTarget) && nTargetCount > 0 && GetDistanceBetween(oPC, oSecondTarget) < FeetToMeters(30.0))
|
|
{
|
|
if(GetAlignmentGoodEvil(oSecondTarget) == ALIGNMENT_EVIL && oTarget != oSecondTarget)
|
|
{
|
|
int nDamage;
|
|
if(MyPRCGetRacialType(oSecondTarget) == RACIAL_TYPE_OUTSIDER || MyPRCGetRacialType(oSecondTarget) == RACIAL_TYPE_UNDEAD)
|
|
nDamage = d8(2);
|
|
else
|
|
nDamage = d6(2);
|
|
nDamage = PRCGetReflexAdjustedDamage(nDamage, oSecondTarget, 15+(GetAbilityModifier(ABILITY_CHARISMA, oPC)/2), SAVING_THROW_TYPE_NONE, oPC);
|
|
effect eDamage = EffectDamage(nDamage, DAMAGE_TYPE_DIVINE);
|
|
effect eBeam = EffectBeam(VFX_BEAM_HOLY, oPC, BODY_NODE_HAND);
|
|
effect eVFX = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oSecondTarget);
|
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBeam, oSecondTarget, 0.5);
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVFX, oSecondTarget);
|
|
nTargetCount --;
|
|
}
|
|
i++;
|
|
oSecondTarget = GetNearestCreature(CREATURE_TYPE_REPUTATION, REPUTATION_TYPE_ENEMY, oPC, i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_GOOD_ANTIPALADIN
|
|
|| nType == SMITE_TYPE_GOOD_BLACKGUARD)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
if(nType == SMITE_TYPE_GOOD_BLACKGUARD)
|
|
{
|
|
nDamage = GetLevelByClass(CLASS_TYPE_BLACKGUARD, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_ANTI_PALADIN, oPC);
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 1;
|
|
}
|
|
else if(nType == SMITE_TYPE_GOOD_ANTIPALADIN)
|
|
{
|
|
nDamage = GetLevelByClass(CLASS_TYPE_ANTI_PALADIN, oPC)
|
|
+ GetLevelByClass(CLASS_TYPE_BLACKGUARD, oPC);
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 1;
|
|
}
|
|
else if(nType == SMITE_TYPE_GOOD_TEMPLATE_FIENDISH)
|
|
{
|
|
nDamage = GetHitDice(oPC);
|
|
if(nDamage > 20)
|
|
nDamage = 20;
|
|
}
|
|
else if(nType == SMITE_TYPE_GOOD_TEMPLATE_HALF_FIEND)
|
|
{
|
|
nDamage = GetHitDice(oPC);
|
|
if(nDamage > 20)
|
|
nDamage = 20;
|
|
}
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Smite Failed: target is not Good";
|
|
sFailedSmiter = "Smite Failed: you are not Evil";
|
|
sHit = "Smite Good Hit";
|
|
sMiss = "Smite Good Missed";
|
|
if(GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD)
|
|
nTargetInvalid = TRUE;
|
|
if(GetAlignmentGoodEvil(OBJECT_SELF) != ALIGNMENT_EVIL)
|
|
nSmiterInvalid = TRUE;
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_UNDEAD)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
nAttack = GetAbilityModifier(ABILITY_WISDOM, oPC);
|
|
nDamage = GetLevelByClass(CLASS_TYPE_SOLDIER_OF_LIGHT, oPC);
|
|
nDamageType = DAMAGE_TYPE_POSITIVE;
|
|
sFailedTarget = "Smite Failed: target is not Undead";
|
|
sFailedSmiter = "Smite Failed: you are not Good";
|
|
sHit = "Smite Undead Hit";
|
|
sMiss = "Smite Undead Missed";
|
|
if(MyPRCGetRacialType(oTarget) != RACIAL_TYPE_UNDEAD)
|
|
nTargetInvalid = TRUE;
|
|
if(GetAlignmentGoodEvil(OBJECT_SELF) != ALIGNMENT_GOOD)
|
|
nSmiterInvalid = TRUE;
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_INFIDEL)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
nDamage = GetLevelByClass(CLASS_TYPE_DIVINE_CHAMPION, oPC) //CoT
|
|
+ GetLevelByClass(CLASS_TYPE_PALADIN, oPC);
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
string sDeity = "Torm";
|
|
nDamageType = DAMAGE_TYPE_POSITIVE;
|
|
if(nAttack < 1)
|
|
nAttack = 1;
|
|
sFailedTarget = "Smite Failed: target has the same deity";
|
|
sFailedSmiter = "Smite Failed: you do not follow your deity";
|
|
sHit = "Smite Infidel Hit";
|
|
sMiss = "Smite Infidel Missed";
|
|
if(GetStringLowerCase(GetDeity(oTarget))== GetStringLowerCase(GetDeity(oPC)))
|
|
nTargetInvalid = TRUE;
|
|
if(GetStringLowerCase(GetDeity(oPC)) != GetStringLowerCase(sDeity))
|
|
nSmiterInvalid = TRUE;
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_KIAI)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
nDamage = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nDamage < 1)
|
|
nDamage = 1;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 1;
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Failed: you are not Lawful";
|
|
sHit = "Kiai Smite Hit";
|
|
sMiss = "Kiai Smite Missed";
|
|
if(GetAlignmentLawChaos(OBJECT_SELF) != ALIGNMENT_LAWFUL)
|
|
nSmiterInvalid = TRUE;
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_CRUSADER)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
nDamage = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nDamage < 1)
|
|
nDamage = 0; // Can't go negative
|
|
nAttack = GetLevelByClass(CLASS_TYPE_CRUSADER, oPC);
|
|
|
|
// Factotum Cunning Brilliance
|
|
if (GetIsAbilitySaved(oPC, FEAT_CRUSADER_SMITE))
|
|
nAttack = GetLevelByClass(CLASS_TYPE_FACTOTUM);
|
|
|
|
nDamageType = DAMAGE_TYPE_MAGICAL;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Failed: Report Error";
|
|
sHit = "Crusader Smite Hit";
|
|
sMiss = "Crusader Smite Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_SHADOWBANE)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
nDamage = GetLevelByClass(CLASS_TYPE_SHADOWBANE_INQUISITOR, oPC);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Failed: You don't exist";
|
|
sHit = "Shadowbane Smite Hit";
|
|
sMiss = "Shadowbane Smite Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_KILLOREN)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_DIVINE);
|
|
nDamage = GetHitDice(oPC);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_MAGICAL;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Aspect of the Destroyer Failed: You don't exist";
|
|
sHit = "Aspect of the Destroyer Hit";
|
|
sMiss = "Aspect of the Destroyer Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_TEMPLATE_MINERAL)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_IMP_ACID_L);
|
|
nDamage = GetHitDice(oPC);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CONSTITUTION, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_MAGICAL;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Earth Strike Failed";
|
|
sHit = "Earth Strike Hit";
|
|
sMiss = "Earth Strike Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_CULTIST)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_FROST);
|
|
nDamage = GetLevelByClass(CLASS_TYPE_CULTIST_SHATTERED_PEAK, oPC);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_MAGICAL;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Mage Failed: You don't exist";
|
|
sHit = "Smite Mage Hit";
|
|
sMiss = "Smite Mage Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_SOULBORN)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_FNF_STRIKE_HOLY);
|
|
nDamage = GetLevelByClass(CLASS_TYPE_SOULBORN, oPC);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Opposition Failed: You don't exist";
|
|
sHit = "Smite Opposition Hit";
|
|
sMiss = "Smite Opposition Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_CHAOS)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_FNF_STRIKE_HOLY);
|
|
nDamage = GetLevelByClass(CLASS_TYPE_SAPPHIRE_HIERARCH, oPC);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Chaos Failed: You don't exist";
|
|
sHit = "Smite Chaos Hit";
|
|
sMiss = "Smite Chaos Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_RAMETHENE)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_COM_HIT_FIRE);
|
|
nDamage = d6(PRCGetCreatureSize(oTarget)-3);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_MAGICAL;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Dragon Smite Failed: You don't exist";
|
|
sHit = "Dragon Smite Hit";
|
|
sMiss = "Dragon Smite Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_ANDRAS)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_FNF_STRIKE_HOLY);
|
|
nDamage = GetBinderLevel(oPC, VESTIGE_ANDRAS);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Good or Evil Failed: You don't exist";
|
|
sHit = "Smite Good or Evil Hit";
|
|
sMiss = "Smite Good or Evil Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_TRIAD)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_FNF_STRIKE_HOLY);
|
|
nDamage = GetBinderLevel(oPC, VESTIGE_THETRIAD);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Evil Failed: You don't exist";
|
|
sHit = "Smite Evil Hit";
|
|
sMiss = "Smite Evil Missed";
|
|
}
|
|
|
|
else if(nType == SMITE_TYPE_DESHARIS)
|
|
{
|
|
eSmite = EffectVisualEffect(VFX_FNF_STRIKE_HOLY);
|
|
nDamage = GetBinderLevel(oPC, VESTIGE_DESHARIS);
|
|
if(nDamage < 1)
|
|
nDamage = 0;
|
|
nAttack = GetAbilityModifier(ABILITY_CHARISMA, oPC);
|
|
if(nAttack < 1)
|
|
nAttack = 0;
|
|
nDamageType = DAMAGE_TYPE_DIVINE;
|
|
sFailedTarget = "Target cannot be invalid";
|
|
sFailedSmiter = "Smite Natural Soul Failed: You don't exist";
|
|
sHit = "Smite Natural Soul Hit";
|
|
sMiss = "Smite Natural Soul Missed";
|
|
}
|
|
|
|
//check target is valid
|
|
//and show message if not
|
|
if(nTargetInvalid)
|
|
FloatingTextStringOnCreature(sFailedTarget, oPC);
|
|
|
|
//check smiter is valid
|
|
//and show message if not
|
|
else if(nSmiterInvalid)
|
|
FloatingTextStringOnCreature(sFailedSmiter, oPC);
|
|
|
|
//check for ranged weapon
|
|
//ranged smite was never finished
|
|
//if it was, here would be the place to put it!
|
|
else if (GetWeaponRanged(oWeapon) && !GetHasFeat(FEAT_RANGED_SMITE, oPC))
|
|
FloatingTextStringOnCreature("Smite Failed: cannot use ranged weapon", oPC);
|
|
|
|
//passed checks, do the actual smite
|
|
else
|
|
{
|
|
// Extra smite damage
|
|
nDamage += GetEssentiaInvestedFeat(oPC, FEAT_SAPPHIRE_SMITE);
|
|
//add epic smiting damage
|
|
int iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_1) ? 2:1;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_2) ? 3:iEpicSmite;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_3) ? 4:iEpicSmite;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_4) ? 5:iEpicSmite;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_5) ? 6:iEpicSmite;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_6) ? 7:iEpicSmite;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_7) ? 8:iEpicSmite;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_8) ? 9:iEpicSmite;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_9) ? 10:iEpicSmite;
|
|
iEpicSmite = GetHasFeat(FEAT_EPIC_GREAT_SMITING_10)? 11:iEpicSmite;
|
|
nDamage *= iEpicSmite;
|
|
|
|
//Double damage if has Devastating Smite active
|
|
if(GetHasSpellEffect(SPELL_DEVASTATING_SMITE, oPC)) nDamage += nDamage;
|
|
|
|
//whew, now we can do the actual smite through the combat engine
|
|
PerformAttackRound(oTarget, oPC, eSmite, 0.0, nAttack, nDamage, nDamageType, FALSE, sHit, sMiss);
|
|
|
|
// Target is valid and we know it's an enemy and we're in combat
|
|
DelayCommand(0.25, AssignCommand(oPC, ActionAttack(oTarget)));
|
|
}
|
|
} |