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.
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);
|
|
}
|
|
|
|
} |