PRC8/nwn/nwnprc/trunk/users/Tenjac/spells/sp_castigate.nss
Jaysyn904 6ec137a24e Updated AMS marker feats
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.
2024-02-11 14:01:05 -05:00

98 lines
3.0 KiB
Plaintext

//:://////////////////////////////////////////////
//:: Name Castigate
//:: FileName sp_castigate.nss
//:://////////////////////////////////////////////
/** @file Evocation [Sonic]
Level: Cleric 4, Paladin 4, Purification 4,
Components: V,
Casting Time: 1 standard action
Range: 10 ft.
Area: 10-ft.-radius burst centered on you
Duration: Instantaneous
Saving Throw: Fortitude half
Spell Resistance: Yes
Shouting your deity's teachings, you rebuke your foes with the magic
of your sacred words.
This spell has no effect on creatures that cannot hear.
All creatures whose alignment differs from yours on both
the law—chaos and the good—evil axes take 1d4 points of damage
per caster level (maximum 10d4). All creatures whose alignment
differs from yours on one component take half damage, and this
spell does not deal damage to those who share your alignment.
A Fortitude saving throw reduces damage by half.
*/
//:://////////////////////////////////////////////
//:: Created By: Tenjac
//:: Created On: 1/28/21
//:://////////////////////////////////////////////
#include "prc_sp_func"
#include "prc_add_spell_dc"
void main()
{
if(!X2PreSpellCastCode()) return;
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
object oPC = OBJECT_SELF;
int nCasterLvl = PRCGetCasterLevel(oPC);
int nDC = PRCGetSaveDC(oTarget, oPC);
float fDur = 3600 * nCasterLvl;
int nMetaMagic = PRCGetMetaMagicFeat();
if(nMetaMagic & METAMAGIC_EXTEND) fDur += fDur;
location lLoc = PRCGetSpellTargetLocation();
int nAlignGE = GetAlignmentGoodEvil(oPC);
int nAlignLC = GetAlignmentLawChaos(oPC);
int nTargetAlignGE;
int nTargetAlignLC;
int nDam;
int nLevels = min(10, nCasterLvl);
float fRadius = FeetToMeters(10);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_FNF_HOWL_WAR_CRY), oPC);
object oTarget = (MyFirstObjectInShape(SHAPE_SPHERE, fRadius. lLoc, FALSE));
while(GetIsObjectValid(oTarget))
{
//Not deaf
if(GetHasEffect(EFFECT_TYPE_DEAF, oTarget) == FALSE)
{
//SR
if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
{
nTargetAlignGE = GetAlignmentGoodEvil(oTarget);
nTargetAlignLC = GetAlignmentLawChaos(oTarget);
//Test alignment differences
//Both
if(nAlignGE != nTargetAlignGE) && (nAlignLC != nTargetAlignLC)
{
nDam = d4(nLevels);
}
//Half for one
else if(nAlignGE != nTargetAlignGE) || (nAlignLC != nTargetAlignLC)
{
nDam = d4(nLevels)/2;
}
//save for half
if(PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_DIVINE))
{
nDam = nDam/2;
}
if(nDam > 0)
{
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDamage(nDam, DAMAGE_TYPE_DIVINE), oTarget);
SPApplyEffectToObject(DURATION_TYPE_INSTANT, EffectvisualEffect(VFX_IMP_HEAD_HOLY), oTarget);
}
}
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRadius. lLoc, FALSE);
}
PRCSetSchool();
}