PRC8/nwn/nwnprc/trunk/scripts/prc_sergrd_boom.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

111 lines
4.0 KiB
Plaintext

//::///////////////////////////////////////////////
//:: Serene Guardian - Release Trigger
//:://////////////////////////////////////////////
/*
Does the appropriate resonance release
*/
//:://////////////////////////////////////////////
//:: Created By: Stratovarius
//:: Created On: Sep 9, 2018
//:://////////////////////////////////////////////
#include "prc_inc_spells"
void ResonanceTrigger(object oPC, object oTarget, int nResType, int nClass, int nRes)
{
// int nRes = GetLocalInt(oTarget, "Resonance");
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
effect eImp = EffectVisualEffect(VFX_IMP_REDUCE_ABILITY_SCORE);
if ((nResType == SPELL_SERENE_PAIN || nResType == 0) && (!GetIsImmune(oTarget, IMMUNITY_TYPE_CRITICAL_HIT)
&& !GetIsImmune(oTarget, IMMUNITY_TYPE_SNEAK_ATTACK))) // Pain, default, doesn't work on critical or sneak immune
{
eDur = EffectLinkEffects(eDur, EffectAttackDecrease(nRes));
eDur = EffectLinkEffects(eDur, EffectSavingThrowDecrease(SAVING_THROW_ALL, nRes));
}
else if (nResType == SPELL_SERENE_DAMAGE) // Damage
{
if (nClass >= 6) // Double damage for Traumatic
eImp = EffectLinkEffects(eImp, EffectDamage(d6(nRes*2)));
else
eImp = EffectLinkEffects(eImp, EffectDamage(d6(nRes)));
}
else if (nResType == SPELL_SERENE_STAGGER) // Stagger
{
int nSlow = 33 * nRes;
if (nSlow >= 99) // Target is immobile
{
eDur = EffectLinkEffects(eDur, EffectCutsceneImmobilize());
}
else
{
eDur = EffectLinkEffects(eDur, EffectMovementSpeedDecrease(nSlow));
}
}
else if (nResType == SPELL_SERENE_CONFOUND) // Confound
{
eDur = EffectLinkEffects(eDur, PRCEffectConfused());
}
else if (nResType == SPELL_SERENE_SOUL) // Soul
{
int nHD = GetHitDice(oTarget);
DeathlessFrenzyCheck(oTarget);
if ((nRes * 2) >= nHD) // Can kill creatures with 2 HD per point of Res
{
int nDC = 10 + nClass + GetAbilityModifier(ABILITY_WISDOM, oPC);
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_DEATH)) // Do the save
eImp = EffectLinkEffects(eImp, EffectDeath());
}
}
//Apply the impact
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eImp, oTarget);
// Only some have duration effects
if (nResType == SPELL_SERENE_PAIN || nResType == SPELL_SERENE_STAGGER || nResType == SPELL_SERENE_CONFOUND)
{
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eDur, oTarget, RoundsToSeconds(nRes), FALSE);
}
DeleteLocalInt(oTarget, "Resonance"); // We've used them all up
}
void main()
{
object oPC = OBJECT_SELF;
int nClass = GetLevelByClass(CLASS_TYPE_SERENE_GUARDIAN, oPC);
int nResType = PRCGetSpellId();
string sMes = "Error, Debug";
if (nResType == SPELL_SERENE_PAIN)
sMes = "Painful Release Activated";
else if (nResType == SPELL_SERENE_DAMAGE)
{
sMes = "Damaging Release Activated";
if (nClass >= 6)
sMes = "Tramautic Release Activated";
}
else if (nResType == SPELL_SERENE_STAGGER)
sMes = "Staggering Release Activated";
else if (nResType == SPELL_SERENE_CONFOUND)
sMes = "Confounding Release Activated";
else if (nResType == SPELL_SERENE_SOUL)
sMes = "Soul Release Activated";
FloatingTextStringOnCreature(sMes, oPC, FALSE);
location lLoc = GetLocation(oPC);
object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, FeetToMeters(100.0), lLoc, FALSE, OBJECT_TYPE_CREATURE);
while(GetIsObjectValid(oTarget))
{
int nRes = GetLocalInt(oTarget, "Resonance");
if (nRes > 0) // Make sure they have Resonance
{
ResonanceTrigger(oPC, oTarget, nResType, nClass, nRes);
}
oTarget = MyNextObjectInShape(SHAPE_SPHERE, FeetToMeters(100.0), lLoc, FALSE, OBJECT_TYPE_CREATURE);
}
}