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.
233 lines
8.2 KiB
Plaintext
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));
|
|
}
|
|
}
|
|
} |