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

199 lines
7.2 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*:://////////////////////////////////////////////
//:: Spell Name Warding Whip
//:: Spell FileName XXX_S_WardingWhi
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Transmutation
Also known as: Luskaris Warding Whip
Level: Sor/Wiz 8
Components: V, S
Casting Time: 1 standard action
Range: Long (40M)
Target: A single creature
Duration: 1 round/5 levels
Saving Throw: No
Spell Resistance: No
Source: Various (rmilsop)
This spell strips a creature of its magical protections, removing one
protection of up to 7th level for each round it is active. It always removes
the highest level protection that it can. Protections removed by this spell
include spell turning, globe of invulnerability, repulsion, stoneskin, minor
globe of invulnerability and similar spells.
Only one whip from one caster can affect a target at once. This spell
bypasses spell turning and similar effects.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
Sort of like Spell Breach.
It strips effects - 1 per 5 levels, highest first.
Powerful, because it doesn't dispel bad effects, nor need any kind
of dispel check.
Spells "Dispelled" in order:
X 9 - Absolute Immunity (9)
X 8 - Greater Guardian Mantal (8)
X - Iron Body (8)
X - Mind Blank (8)
/ 7 - Spell turning (7)
- Guardian Mantal (7)
- Repulstion (7)
- Antilife Shell (6)
6 - Globe of Invulnerability (6)
4 - Stoneskin (4)
- Fire Shield (4)
- Lesser Globe of Invunrability (4)
3 - Protection from Energy (3)
2 - Protection from Arrows (2)
- Blur (2)
- Resist Energy (2)
1 - Shield (1)
- Mage Armor (1)
- Protection from Chaos (1)
- Protection from Evil (1)
- Protection from Good (1)
- Protection from Law (1)
0 - Resistance (0)
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "SMP_INC_SPELLS"
// Delayed for 6 seconds, this runs itself until oTarget is dead,
// or they don't have the spell's effect anymore.
void SMP_RunWhipImpact(object oTarget, object oCaster);
// Get the spell from this list, best to worst, 1 = best.
// * MAX_SPELLS_IN_LIST is the limit of nListNo.
// Returns SPELL_INVALID on none found.
int GetSpellFromList(int nListNo);
const int MAX_SPELLS_IN_LIST = 19;
void main()
{
// Spell hook check.
if(!SMP_SpellHookCheck(SMP_SPELL_WARDING_WHIP)) return;
// Declare Major Variables
object oCaster = OBJECT_SELF;
object oTarget = GetSpellTargetObject();
int nCasterLevel = SMP_GetCasterLevel();
// Duration is 1 round/5 levels..
float fDuration = 0.5 + SMP_GetDuration(SMP_ROUNDS, nCasterLevel/5, FALSE);
// Delcare Effects
effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_NEGATIVE);
// PvP Check
if(!GetIsReactionTypeFriendly(oTarget) &&
// Make sure they are not immune to spells
!SMP_TotalSpellImmunity(oTarget))
{
//Fire spell cast at event for target
SMP_SignalSpellCastAt(oTarget, SMP_SPELL_WARDING_WHIP);
// Duration effect. Cannot stack
if(!SMP_GetHasSpellEffectFromCaster(SMP_SPELL_WARDING_WHIP, oTarget, oCaster))
{
// Apply new one
SMP_ApplyDuration(oTarget, eDur, fDuration);
// Run impact now.
SMP_RunWhipImpact(oTarget, oCaster);
}
else
{
// Cannot affect again. Only imact is done.
FloatingTextStringOnCreature("*You cannot have more then one whip on a target at once*", oTarget, FALSE);
return;
}
}
}
// Delayed for 6 seconds, this runs itself until oTarget is dead,
// or they don't have the spell's effect anymore.
void SMP_RunWhipImpact(object oTarget, object oCaster)
{
// Check if dead or validity of oTarget.
if(!GetIsDead(oTarget) && GetIsObjectValid(oTarget))
{
// Check the caster.
if(GetIsObjectValid(oCaster))
{
// Check if they have the effect
if(SMP_GetHasSpellEffectFromCaster(SMP_SPELL_WARDING_WHIP, oTarget, oCaster))
{
// Fire spell cast at event for target
SMP_SignalSpellCastAt(oTarget, SMP_SPELL_WARDING_WHIP);
// Remove the highest spell on the target.
// List is above.
int nCnt, nSpellRemove, bBreak;
for(nCnt = 1; nCnt <= MAX_SPELLS_IN_LIST && bBreak != TRUE; nCnt++)
{
nSpellRemove = GetSpellFromList(nCnt);
if(nSpellRemove == SPELL_INVALID)
{
bBreak = TRUE;
}
else
{
// Remove the next one
bBreak = SMP_RemoveSpellEffectsFromTarget(GetSpellFromList(nCnt), oTarget);
}
}
// Run it again in 6 seconds.
DelayCommand(6.0, SMP_RunWhipImpact(oTarget, oCaster));
}
}
else
{
// Remove the spells effects
SMP_PRCRemoveSpellEffects(SMP_SPELL_WARDING_WHIP, oCaster, oTarget);
}
}
}
// Get the spell from this list, best to worst, 1 = best.
// * MAX_SPELLS_IN_LIST is the limit of nListNo.
// Returns SPELL_INVALID on none found.
int GetSpellFromList(int nListNo)
{
switch(nListNo)
{
// Note: These are levels 8 and 9, so not included, but might be useful
// another time.
//case 1: { return SMP_SPELL_ABSOLUTE_IMMUNITY; } break;
//case 2: { return SMP_SPELL_GUARDIAN_MANTLE_GREATER; } break;
//case 3: { return SMP_SPELL_IRON_BODY; } break;
//case 4: { return SMP_SPELL_MIND_BLANK; } break;
// Start of level 7 and below spells.
case 1: { return SMP_SPELL_SPELL_TURNING; } break;
case 2: { return SMP_SPELL_GUARDIAN_MANTLE; } break;
case 3: { return SMP_SPELL_REPULSION; } break;
case 4: { return SMP_SPELL_ANTILIFE_SHELL; } break;
case 5: { return SMP_SPELL_GLOBE_OF_INVUNRABILITY; } break;
case 6: { return SMP_SPELL_GLOBE_OF_INVUNRABILITY_LESSER; } break;
case 7: { return SMP_SPELL_STONESKIN; } break;
case 8: { return SMP_SPELL_FIRE_SHIELD; } break;// Note: Check if it removes any sub-spells.
case 9: { return SMP_SPELL_PROTECTION_FROM_ENERGY; } break;// Note: Check if it removes any sub-spells.
case 10: { return SMP_SPELL_RESIST_ENERGY; } break;// Note: Check if it removes any sub-spells.
case 11: { return SMP_SPELL_PROTECTION_FROM_ARROWS; } break;
case 12: { return SMP_SPELL_BLUR; } break;
case 13: { return SMP_SPELL_SHIELD; } break;
case 14: { return SMP_SPELL_MAGE_ARMOR; } break;
case 15: { return SMP_SPELL_PROTECTION_FROM_EVIL; } break;// Note: all seperate anyway.
case 16: { return SMP_SPELL_PROTECTION_FROM_GOOD; } break;
case 17: { return SMP_SPELL_PROTECTION_FROM_LAW; } break;
case 18: { return SMP_SPELL_PROTECTION_FROM_CHAOS; } break;
case 19: { return SMP_SPELL_RESISTANCE; } break;
}
return SPELL_INVALID;
}