Added Regenerate Ring spell. Added Regenerate Circle spell. Added Leonal's Roar spell. Added Summon Nature's Ally I-IX spells. Added Lion of Talisid PrC. Added Favored of the Companions Feat. Corrected Regenerate Serious Wounds level. Corrected Regenerate Critical Wounds level. Removed Baelnorn class and added Baelnorn template.
144 lines
5.7 KiB
Plaintext
144 lines
5.7 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Leonal's Roar
|
|
//:: [sp_leonalsroar.nss]
|
|
//:: Created by: Jaysyn
|
|
//:: Created on: 2025-08-01 19:06:26
|
|
//:://////////////////////////////////////////////
|
|
//::
|
|
/*
|
|
Leonal's Roar
|
|
(Book of Exalted Deeds)
|
|
|
|
Evocation [Good, Sonic]
|
|
Level: Druid 8,
|
|
Components: V
|
|
Casting Time: 1 standard action
|
|
Range: 40 ft.
|
|
Target: Nongood creatures in a 40-ft.-radius spread centered on you
|
|
Duration: Instantaneous
|
|
Saving Throw: Fortitude partial
|
|
Spell Resistance: Yes
|
|
|
|
This spell has the effect of a holy word, and it additionally
|
|
deals 2d6 points of sonic damage to nongood creatures in the area.
|
|
A successful Fortitude saving throw negates the sonic damage, but
|
|
not the other effects of the spell.
|
|
|
|
*/
|
|
//:
|
|
//::///////////////////////////////////////////////
|
|
#include "prc_inc_spells"
|
|
#include "prc_alterations"
|
|
#include "prc_add_spell_dc"
|
|
|
|
void main()
|
|
{
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
SetLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR", SPELL_SCHOOL_EVOCATION);
|
|
|
|
if (!X2PreSpellCastCode()) return;
|
|
|
|
object oTarget;
|
|
object oCaster = OBJECT_SELF;
|
|
|
|
int nSpellId = PRCGetSpellId();
|
|
int CasterLvl = PRCGetCasterLevel(oCaster);
|
|
int nPenetr = CasterLvl + SPGetPenetr();
|
|
int nSaveDC;// = PRCGetSpellSaveDC(9999 /*SPELL_LEONALS_ROAR*/, SPELL_SCHOOL_EVOCATION, oCaster);
|
|
int n35ed = GetPRCSwitch(PRC_35ED_WORD_OF_FAITH);
|
|
|
|
// Spell visuals
|
|
effect eDeaf = EffectDeaf();
|
|
effect eStun = EffectStunned();
|
|
effect eConfuse = PRCEffectConfused();
|
|
effect eDeath = EffectDeath();
|
|
effect eVis = EffectVisualEffect(VFX_IMP_DEATH);
|
|
effect eSmite = EffectVisualEffect(VFX_FNF_WORD);
|
|
effect eSonicVFX = EffectVisualEffect(VFX_IMP_SONIC);
|
|
effect eUnsummon = EffectVisualEffect(VFX_IMP_UNSUMMON);
|
|
effect eMind = EffectVisualEffect(VFX_DUR_MIND_AFFECTING_DISABLED);
|
|
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
|
|
effect eLink;
|
|
|
|
if(nSpellId == SPELL_FOT_LEONALS_ROAR)
|
|
{
|
|
int nCHA = GetAbilityModifier(ABILITY_CHARISMA, oCaster);
|
|
nSaveDC = 20 + nCHA;
|
|
}
|
|
else
|
|
{
|
|
int nSaveDC = PRCGetSpellSaveDC(SPELL_LEONALS_ROAR, SPELL_SCHOOL_EVOCATION, oCaster);
|
|
}
|
|
|
|
ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eSmite, PRCGetSpellTargetLocation());
|
|
|
|
oTarget = MyFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, PRCGetSpellTargetLocation());
|
|
while (GetIsObjectValid(oTarget))
|
|
{
|
|
if (spellsIsTarget(oTarget, SPELL_TARGET_STANDARDHOSTILE, oCaster)
|
|
&& GetAlignmentGoodEvil(oTarget) != ALIGNMENT_GOOD)
|
|
{
|
|
float fDelay = PRCGetRandomDelay(0.5, 2.0);
|
|
SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_LEONALS_ROAR));
|
|
|
|
if (!PRCDoResistSpell(oCaster, oTarget, nPenetr, fDelay))
|
|
{
|
|
// Added: Leonal's Roar Sonic Damage (Fort negates)
|
|
if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nSaveDC, SAVING_THROW_TYPE_SONIC, oCaster, fDelay))
|
|
{
|
|
int nDmg = d6(2);
|
|
effect eSonicDmg = EffectDamage(nDmg, DAMAGE_TYPE_SONIC);
|
|
effect eSonicLink = EffectLinkEffects(eSonicVFX, eSonicDmg);
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eSonicLink, oTarget));
|
|
}
|
|
|
|
// Retain Holy Word's VFX sonic flash for hit feedback
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eSonicVFX, oTarget);
|
|
|
|
if (GetIsObjectValid(GetMaster(oTarget)))
|
|
{
|
|
if (GetAssociateType(oTarget) == ASSOCIATE_TYPE_SUMMONED)
|
|
{
|
|
DeathlessFrenzyCheck(oTarget);
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eUnsummon, oTarget));
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, SupernaturalEffect(eDeath), oTarget));
|
|
}
|
|
}
|
|
else if (!PRCGetHasEffect(EFFECT_TYPE_DEAF, oTarget))
|
|
{
|
|
int nHD = GetHitDice(oTarget);
|
|
|
|
// Deaf 1d4 rounds
|
|
eLink = EffectLinkEffects(eDur, eDeaf);
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(d4()), TRUE, -1, CasterLvl));
|
|
|
|
if ((nHD < 12 && !n35ed) || (n35ed && nHD < CasterLvl))
|
|
{
|
|
eLink = EffectLinkEffects(eMind, eStun);
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(1), TRUE, -1, CasterLvl));
|
|
}
|
|
|
|
if ((nHD < 8 && n35ed) || (n35ed && nHD < CasterLvl - 5))
|
|
{
|
|
eLink = EffectLinkEffects(eSonicVFX, eConfuse);
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, TurnsToSeconds(d10()), TRUE, -1, CasterLvl));
|
|
}
|
|
|
|
if ((nHD < 4 && n35ed) || (n35ed && nHD < CasterLvl - 10))
|
|
{
|
|
DeathlessFrenzyCheck(oTarget);
|
|
if (!GetIsImmune(oTarget, IMMUNITY_TYPE_DEATH))
|
|
{
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget));
|
|
DelayCommand(fDelay, SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oTarget));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
oTarget = MyNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_COLOSSAL, PRCGetSpellTargetLocation());
|
|
}
|
|
|
|
DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
|
|
}
|