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.
111 lines
4.0 KiB
Plaintext
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);
|
|
}
|
|
|
|
} |