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

124 lines
4.8 KiB
Plaintext

/*:://////////////////////////////////////////////
//:: Spell Name Spell Turning
//:: Spell FileName PHS_S_SplTurning
//:://////////////////////////////////////////////
//:: In Game Spell desctiption
//:://////////////////////////////////////////////
Abjuration
Level: Luck 7, Magic 7, Sor/Wiz 7
Components: V, S, M/DF
Casting Time: 1 standard action
Range: Personal
Target: You
Duration: Until expended or 10 min./level
Spells and spell-like effects targeted on you are turned back upon the
original caster. The abjuration turns only spells that have you as a target.
Effect and area spells are not affected. Spell turning also fails to stop
touch range spells.
From seven to ten (1d4+6) spell levels are affected by the turning. The
exact number is rolled secretly.
When you are targeted by a spell of higher level than the amount of spell
turning you have left, that spell is partially turned. The subtract the
amount of spell turning left from the spell level of the incoming spell,
then divide the result by the spell level of the incoming spell to see what
fraction of the effect gets through. For damaging spells, you and the caster
each take a fraction of the damage. For nondamaging spells, each of you has
a proportional chance to be affected.
If you and a spellcasting attacker are both warded by spell turning effects
in operation, a resonating field is created.
Roll randomly to determine the result.
d% Effect
01-70 Spell drains away without effect.
71-80 Spell affects both of you equally at full effect.
81-97 Both turning effects are rendered nonfunctional for 1d4 minutes.
98-100 Both of you go through a rift into another plane.
Arcane Material Component: A small silver mirror.
//:://////////////////////////////////////////////
//:: Spell Effects Applied / Notes
//:://////////////////////////////////////////////
This is done on a spell-by-spell basis, although the removal of numbers
is easy enough (and it always rebounds cantrips if not touch attacks!)
spell turning only affects spells with a Target: line (and a range greater
then touch), it never effects spells with a Area: or Effect: line.
Simplified now. This is how it should work:
- Each spell will check if the opponent has the effects. If so:
- Rifts may occur - check if caster also has turning!
- Else:
- Check if nullified and sent back to caster. If so, we do NOT assign
the enemy to do the damage (although Effects such as Magic Missile
might be). Why? Well, the CASTER casts the spell - thus he is the one
that created the energy, and thus does the damage.
- Duration effects apply as stated. Damage is divided as stated, this
could mean some complicated parts of code - all on a Case by Case
basis!
- Note: Spell Resistance, saves ETC applies! Of corse,
PHS_SpellResistanceCheck(oCaster, oCaster); would be wierd, but oh well!
- Saves are done AFTER damage is "halved" or whatevered (for the rift)
and will be delayed appopriatly if there is a projectile, else
might as well do it instantly.
Notes on each spell are under:
//:://////////////////////////////////////////////
//:: Spell Turning Notes
//:://////////////////////////////////////////////
In each spell description.
Not affected:
- AOE Spells
- Touch spells
- Spells without SR checks (thus nothing can stop it)
- Spells which don't just affect one target
(For ease, I'll make even things like AOE Magic Missile
- NOT "Effect:" or "Area:" spells
Spells affected ALL (A-Z):
- Baleful Polymorph
- Bestow Curse
//:://////////////////////////////////////////////
//:: Created By: Jasperre
//::////////////////////////////////////////////*/
#include "PHS_INC_SPELLS"
void main()
{
// Spell Hook Check.
if(!PHS_SpellHookCheck(PHS_SPELL_SPELL_TURNING)) return;
// Declare major variables
object oCaster = OBJECT_SELF;
object oTarget = GetSpellTargetObject(); // Should always be us.
int nMetaMagic = PHS_GetMetaMagicFeat();
int nCasterLevel = PHS_GetCasterLevel();
// Declare effects
effect eDur = EffectVisualEffect(VFX_DUR_SPELLTURNING);
// 10 minutes/level
float fDuration = PHS_GetDuration(PHS_MINUTES, nCasterLevel * 10, nMetaMagic);
// Randomise the amount of levels to bounce - hidden!
int nLevelsToBounce = PHS_MaximizeOrEmpower(4, 1, nMetaMagic, 6);
// This will remove the previous ones.
PHS_RemoveSpellEffectsFromTarget(PHS_SPELL_SPELL_TURNING, oTarget);
// Apply the linked effects. And set up local integers.
SetLocalInt(oTarget, PHS_SPELL_TURNING_AMOUNT, nLevelsToBounce);
PHS_ApplyDuration(oTarget, eDur, fDuration);
}