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

233 lines
8.2 KiB
Plaintext

//Spell script for reserve feat ranged abilities
//prc_reservshrt
//by ebonfowl
//Dedicated to Edgar, the real Ebonfowl
#include "prc_sp_func"
#include "prc_inc_sp_tch"
#include "prc_add_spell_dc"
void main()
{
object oPC = OBJECT_SELF;
object oTarget = PRCGetSpellTargetObject();
int nSpellID = PRCGetSpellId();
int bSave = FALSE;
effect eEffect, eEffectSave, eVis, eVisFail;
int nBonus, nDuration, nDC, nSaveType, nMissChance, nRace, nShaken;
int nPartial = 0;
//Define individual spell parameters
switch (nSpellID)
{
case SPELL_PROTECTIVE_WARD:
{
nBonus = GetLocalInt(oPC, "ProtectiveWardBonus");
nDuration = 1;
nPartial = 0;
eEffect = EffectACIncrease(nBonus, AC_DODGE_BONUS);
eEffect = SupernaturalEffect(eEffect);
eVis = EffectVisualEffect(VFX_IMP_AC_BONUS);
if (nBonus == 0)
{
FloatingTextStringOnCreature("You do not have a spell available of adequate level or type", oPC, FALSE);
return;
}
break;
}
case SPELL_SHADOW_VEIL:
{
nBonus = GetLocalInt(oPC, "ShadowVeilBonus");
nDuration = 1;
bSave = TRUE;
nSaveType = SAVING_THROW_WILL;
nDC = 10 + nBonus + GetDCAbilityModForClass(GetPrimarySpellcastingClass(oPC), oPC);
eEffect = EffectBlindness();
eEffect = SupernaturalEffect(eEffect);
eVisFail = EffectVisualEffect(VFX_IMP_BLIND_DEAF_M);
if (nBonus == 0)
{
FloatingTextStringOnCreature("You do not have a spell available of adequate level or type", oPC, FALSE);
return;
}
break;
}
case SPELL_TOUCH_OF_DISTRACTION:
{
nBonus = GetLocalInt(oPC, "TouchOfDistractionBonus");
nDuration = 1;
eEffect = EffectAttackDecrease(2);
eEffect = SupernaturalEffect(eEffect);
eVis = EffectVisualEffect(VFX_IMP_CONFUSION_S);
if (nBonus == 0)
{
FloatingTextStringOnCreature("You do not have a spell available of adequate level or type", oPC, FALSE);
return;
}
SetLocalInt(oTarget, "HasTouchOfDistraction", TRUE);
DelayCommand(RoundsToSeconds(nBonus), DeleteLocalInt(oTarget, "HasTouchOfDistraction"));
break;
}
case SPELL_UMBRAL_SHROUD:
{
nBonus = GetLocalInt(oPC, "UmbralShroudBonus");
nMissChance = nBonus*5;
nDuration = 1;
bSave = TRUE;
nSaveType = SAVING_THROW_WILL;
nDC = 10 + nBonus + GetDCAbilityModForClass(GetPrimarySpellcastingClass(oPC), oPC);
nRace = MyPRCGetRacialType(oTarget);
eEffect = EffectMissChance(nMissChance);
eEffect = SupernaturalEffect(eEffect);
eVisFail = EffectVisualEffect(VFX_IMP_BLIND_DEAF_M);
if (nBonus == 0)
{
FloatingTextStringOnCreature("You do not have a spell available of adequate level or type", oPC, FALSE);
return;
}
if (GetIsImmune(oTarget, IMMUNITY_TYPE_BLINDNESS) || (nRace == RACIAL_TYPE_OOZE))
{
FloatingTextStringOnCreature("The creature is immune to Umbral Shroud", oPC, FALSE);
return;
}
break;
}
case SPELL_CHARNEL_MIASMA:
{
nBonus = GetLocalInt(oPC, "CharnelMiasmaBonus");
nDuration = 10;
bSave = TRUE;
nSaveType = SAVING_THROW_WILL;
nDC = 10 + nBonus + GetDCAbilityModForClass(GetPrimarySpellcastingClass(oPC), oPC);
nShaken = GetIsShaken(oTarget);
nPartial = 1;
if (nShaken == FALSE)
{
eEffect = EffectShaken();
eEffect = SupernaturalEffect(eEffect);
}
else if (nShaken == TRUE)
{
eEffect = EffectFrightened();
eEffect = SupernaturalEffect(eEffect);
}
eVisFail = EffectVisualEffect(VFX_IMP_NEGATIVE_ENERGY);
if (nBonus == 0)
{
FloatingTextStringOnCreature("You do not have a spell available of adequate level or type", oPC, FALSE);
return;
}
if (GetLocalInt(oTarget, "CharnelMiasmaSaved") == TRUE)
{
FloatingTextStringOnCreature("This target cannot be affected by Charnel Miasma again for 24 hours", oPC, FALSE);
return;
}
break;
}
case SPELL_DROWNING_GLANCE:
{
nBonus = GetLocalInt(oPC, "DrowningGlanceBonus");
nDuration = 1;
bSave = TRUE;
nSaveType = SAVING_THROW_FORT;
nDC = 10 + nBonus + GetDCAbilityModForClass(GetPrimarySpellcastingClass(oPC), oPC);
nPartial = 1;
nRace = MyPRCGetRacialType(oTarget);
eEffect = EffectExhausted();
eEffect = SupernaturalEffect(eEffect);
eEffectSave = EffectFatigue();
eEffectSave = SupernaturalEffect(eEffectSave);
eVis = EffectVisualEffect(VFX_IMP_FROST_S);
eVisFail = EffectVisualEffect(VFX_IMP_FROST_S);
if (nBonus == 0)
{
FloatingTextStringOnCreature("You do not have a spell available of adequate level or type", oPC, FALSE);
return;
}
if (GetLocalInt(oTarget, "HasDrowningGlance") == TRUE)
{
FloatingTextStringOnCreature("This target cannot be affected by Drowning Glance again for 24 hours", oPC, FALSE);
return;
}
if ((nRace == RACIAL_TYPE_CONSTRUCT) || (nRace == RACIAL_TYPE_OOZE) || (nRace == RACIAL_TYPE_ELEMENTAL) || (nRace == RACIAL_TYPE_UNDEAD))
{
FloatingTextStringOnCreature("The creature is immune to Drowning Glance", oPC, FALSE);
return;
}
break;
}
}
if (GetObjectType(oTarget) == OBJECT_TYPE_CREATURE)
{
SignalEvent(oTarget, EventSpellCastAt(oPC, nSpellID, TRUE));
if (bSave && !PRCMySavingThrow(nSaveType, oTarget, nDC, SAVING_THROW_TYPE_NONE))
{
//Remove existing spell effects to prevent stacking
GZPRCRemoveSpellEffects(nSpellID, oTarget, FALSE);
//Apply Effects
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisFail, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, RoundsToSeconds(nDuration));
if (nSpellID == SPELL_DROWNING_GLANCE)
{
SetLocalInt(oTarget, "HasDrowningGlance", TRUE);
DelayCommand(HoursToSeconds(24), DeleteLocalInt(oTarget, "HasDrowningGlance"));
}
}
else if (nPartial == 1)
{
//Add partial effects on made save here
if (nSpellID == SPELL_DROWNING_GLANCE)
{
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffectSave, oTarget, RoundsToSeconds(nDuration));
SetLocalInt(oTarget, "HasDrowningGlance", TRUE);
DelayCommand(HoursToSeconds(24), DeleteLocalInt(oTarget, "HasDrowningGlance"));
}
//Set preventers if needed
if (nSpellID == SPELL_CHARNEL_MIASMA)
{
SetLocalInt(oTarget, "CharnelMiasmaSaved", TRUE);
DelayCommand(HoursToSeconds(24), DeleteLocalInt(oTarget, "CharnelMiasmaSaved"));
}
}
else if (bSave == FALSE)
{
//Remove existing spell effects to prevent stacking
GZPRCRemoveSpellEffects(nSpellID, oTarget, FALSE);
//Apply effects
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eEffect, oTarget, RoundsToSeconds(nDuration));
}
}
}