PRC8/nwn/nwnprc/trunk/smp/phs_s_goodhope.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

115 lines
4.3 KiB
Plaintext

/*:://////////////////////////////////////////////
//:: Spell Name Good Hope
//:: Spell FileName phs_s_goodhope
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
1 living ally/level. 5M radius. 1 min/level. 20M range.
The spell affects the nearest to the target location first. This spell
instills powerful hope in the subjects. Each affected creature gains
a +2 morale bonus on saving throws, attack rolls, skill checks, and weapon
damage rolls.
Good hope counters and dispels crushing despair.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Like bless really, but song!
We apply song visual effect to the bard too, for a few seconds that is, and
a few seconds to those affected.
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Spell Hook Check.
if(!PHS_SpellHookCheck(PHS_SPELL_GOOD_HOPE)) return;
// Delcare Major Variables.
object oCaster = OBJECT_SELF;
location lTarget = GetSpellTargetLocation();
object oTarget;
int nMetaMagic = PHS_GetMetaMagicFeat();
int nCasterLevel = PHS_GetCasterLevel();
int nCnt, nTotalAffected;
float fDelay;
// Duration in turns
float fDuration = PHS_GetDuration(PHS_MINUTES, nCasterLevel, nMetaMagic);
// Delcare Effects
// "+2 morale bonus on saving throws, attack rolls, skill
// checks, and weapon damage rolls"
effect eSkills = EffectSkillIncrease(SKILL_ALL_SKILLS, 2);
effect eAttack = EffectAttackIncrease(2);
effect eDamage = EffectDamageIncrease(2, DAMAGE_TYPE_SONIC);
effect eSave = EffectSavingThrowIncrease(SAVING_THROW_ALL, 2);
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
// This is applied as a short visual effect.
effect eSong = EffectVisualEffect(VFX_DUR_BARD_SONG);
// This is the dispel effect used when they have crushing dispare.
effect eDispel = EffectVisualEffect(VFX_IMP_HEAD_SONIC);
effect eLink = EffectLinkEffects(eSkills, eAttack);
eLink = EffectLinkEffects(eLink, eDamage);
eLink = EffectLinkEffects(eLink, eSave);
eLink = EffectLinkEffects(eLink, eDur);
// Apply song to caster always
PHS_ApplyDuration(oTarget, eSong, 6.0);
// Loop targets
nCnt = 1;
// Get all nearest allies up to nCasterLevel.
// - We use nearest, as GetFirst/Next object in shape may get allies we
// didn't want to target (although unlikely)
oTarget = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, lTarget, nCnt);
// Loop targets - 5M radius
while(GetIsObjectValid(oTarget) && nTotalAffected < nCasterLevel &&
GetDistanceBetweenLocations(lTarget, GetLocation(oTarget)) <= RADIUS_SIZE_LARGE)
{
// Faction check
if(GetFactionEqual(oTarget) || GetIsFriend(oTarget) || oTarget == oCaster)
{
// Add one to those affected
nTotalAffected++;
//Fire cast spell at event for the specified target
PHS_SignalSpellCastAt(oTarget, PHS_SPELL_GOOD_HOPE, FALSE);
// Delay for visuals and effects.
fDelay = GetDistanceBetween(oCaster, oTarget)/20;
// If we can dispel Crushing Dispare, do so
if(PHS_RemoveSpellEffectsFromTarget(PHS_SPELL_CRUSHING_DISPARE, oTarget, fDelay))
{
// Apply effect if we remove any.
DelayCommand(fDelay, PHS_ApplyVFX(oTarget, eDispel));
}
else
{
// Remove previous castings
PHS_RemoveSpellEffectsFromTarget(PHS_SPELL_GOOD_HOPE, oTarget);
// Apply the VFX impact and effects
if(oTarget != oCaster)
{
DelayCommand(fDelay, PHS_ApplyDuration(oTarget, eSong, 6.0));
}
// Apply link instantly
PHS_ApplyDuration(oTarget, eLink, fDuration);
}
}
// Loop targets
nCnt++;
// Get all nearest allies up to nCasterLevel.
oTarget = GetNearestObjectToLocation(OBJECT_TYPE_CREATURE, lTarget, nCnt);
}
}