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.
283 lines
11 KiB
Plaintext
283 lines
11 KiB
Plaintext
/*:://////////////////////////////////////////////
|
|
//:: Name Spell Turning Include
|
|
//:: FileName SMP_INC_TURNING
|
|
//:://////////////////////////////////////////////
|
|
This includes the functions to let spells turn back from the target
|
|
to the caster!
|
|
|
|
From 3.5 rules:
|
|
|
|
Spell Turning
|
|
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.
|
|
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Jasperre
|
|
//:: Created On: October
|
|
//::////////////////////////////////////////////*/
|
|
|
|
// Note: Need to complete
|
|
|
|
const string SMP_SPELL_TURNING_TEMP_OFF = "SMP_SPELL_TURNING_TEMP_OFF";
|
|
const string SMP_SPELL_TURNING_AMOUNT = "SMP_SPELL_TURNING_AMOUNT";
|
|
const string SMP_SPELL_TURNING_FRACTION = "SMP_SPELL_TURNING_FRACTION";
|
|
const string SMP_RIFT_TARGET = "SMP_RIFT_TARGET";
|
|
|
|
#include "SMP_INC_CONSTANT"
|
|
|
|
// SMP_INC_TURNING. This checks for the spell "Spell Turning" and does a check
|
|
// based on it. Each spell has to be done on a case-by-case basis.
|
|
// It will return:
|
|
// 0 = No effect - (EG: Not present), should affect target normally.
|
|
// 1 = Spell drains away without effect.
|
|
// (Can be: Both turning effects are rendered nonfunctional for 1d4 minutes.)
|
|
// (Can be: Both of you go through a rift into another plane.)
|
|
// 2 = Affect the caster only, full power.
|
|
// 3 = Affects the caster OR the target, a % type thing. Set on local that can be
|
|
// retrieved. If damaging, part damage each. If not, % chance to affect either.
|
|
// 4 = Spell affects both people equally at full effect.
|
|
// * The remaing power is automatically decreased.
|
|
int SMP_SpellTurningCheck(object oCaster, object oTarget, int nSpellLevel, float fDelay = 0.0);
|
|
|
|
// SMP_INC_TURNING. Remove all effects from SMP_SPELL_SPELL_TURNING
|
|
void SMP_SpellTurningRemoveSpellTurning(object oTarget);
|
|
|
|
// SMP_INC_TURNING. Sends both players to the rift, IF THERE IS ONE.
|
|
// * TRUE if they are moved to the rift.
|
|
int SMP_SpellTurningMoveToRift(object oCaster, object oTarget);
|
|
|
|
// SMP_INC_TURNING. Renders both non-functional for the time
|
|
void SMP_SpellTurningRenderTurningUnfunctonal(object oCaster, object oTarget);
|
|
|
|
// SMP_INC_TURNING. Decreases the stored integer by 1
|
|
// * Deletes if it would be 0.
|
|
void SMP_SpellTurningReduceInteger(object oTarget, string sStored);
|
|
|
|
// This checks for the spell "Spell Turning" and does a check
|
|
// based on it. Each spell has to be done on a case-by-case basis.
|
|
// It will return:
|
|
// 0 = No effect - (EG: Not present), should affect target normally.
|
|
// 1 = Spell drains away without effect.
|
|
// (Can be: Both turning effects are rendered nonfunctional for 1d4 minutes.)
|
|
// (Can be: Both of you go through a rift into another plane.)
|
|
// 2 = Affect the caster only, full power.
|
|
// 3 = Affects the caster OR the target, a % type thing. Set on local that can be
|
|
// retrieved. If damaging, part damage each. If not, % chance to affect either.
|
|
// 4 = Spell affects both people equally at full effect.
|
|
// * The remaing power is automatically decreased.
|
|
int SMP_SpellTurningCheck(object oCaster, object oTarget, int nSpellLevel, float fDelay = 0.0)
|
|
{
|
|
// Does the target have the effects
|
|
if(GetHasSpellEffect(SMP_SPELL_SPELL_TURNING, oTarget) &&
|
|
!GetLocalInt(oTarget, SMP_SPELL_TURNING_TEMP_OFF))
|
|
{
|
|
// We first check if they already have spell turning too (and it is
|
|
// activated) If so, will maybe do one of 4 random things!
|
|
if(GetHasSpellEffect(SMP_SPELL_SPELL_TURNING, oCaster) &&
|
|
!GetLocalInt(oCaster, SMP_SPELL_TURNING_TEMP_OFF))
|
|
{
|
|
/*
|
|
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.
|
|
*/
|
|
// Roll dice
|
|
int nDice = d100();
|
|
|
|
// "Spell drains away without effect." - return 1
|
|
if(nDice <= 70)
|
|
{
|
|
return 1;
|
|
}
|
|
// "Spell affects both of you equally at full effect." - return 4
|
|
else if(nDice <= 80)
|
|
{
|
|
return 4;
|
|
}
|
|
// "Both turning effects are rendered nonfunctional for 1d4 minutes." - return 1
|
|
else if(nDice <= 97)
|
|
{
|
|
// We set an integer for a cirain amount of time
|
|
SMP_SpellTurningRenderTurningUnfunctonal(oCaster, oTarget);
|
|
return 1;
|
|
}
|
|
// "Both of you go through a rift into another plane." - return 1
|
|
else //if(nDice <= 100)
|
|
{
|
|
// Use function
|
|
SMP_SpellTurningMoveToRift(oCaster, oTarget);
|
|
return 1;
|
|
}
|
|
}
|
|
// Must be, of course, not a cantrip
|
|
else if(nSpellLevel > 0)
|
|
{
|
|
// Normal spell turning!
|
|
int nTurnPower = GetLocalInt(oTarget, SMP_SPELL_TURNING_AMOUNT);
|
|
|
|
// Get new power - this minus spell level
|
|
int nNewPower = nTurnPower - nSpellLevel;
|
|
|
|
// Remove now, if <= 0
|
|
if(nNewPower <= 0)
|
|
{
|
|
// Remove it
|
|
SMP_SpellTurningRemoveSpellTurning(oTarget);
|
|
}
|
|
|
|
// We check the spell power
|
|
if(nNewPower >= 0)
|
|
{
|
|
// If we have any normal left, we "rebound" normally...
|
|
// return 2 - Affect the caster only, full power.
|
|
return 2;
|
|
}
|
|
else //if(nNewPower < 0)
|
|
{
|
|
/* Must be a fraction.
|
|
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.
|
|
*/
|
|
// Divide by spell level
|
|
float fFraction = IntToFloat(nNewPower) / IntToFloat(nSpellLevel);
|
|
|
|
// Set it
|
|
SetLocalFloat(oCaster, SMP_SPELL_TURNING_FRACTION, fFraction);
|
|
|
|
// 3 = Affects the caster OR the target, a % type thing. Set on local that can be
|
|
// retrieved. If damaging, part damage each. If not, % chance to affect either.
|
|
return 3;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Can trip, always stop
|
|
// return 2 - Affect the caster only, full power.
|
|
return 2;
|
|
}
|
|
}
|
|
// Return nothing - error
|
|
return FALSE;
|
|
}
|
|
|
|
// Remove all effects from SMP_SPELL_SPELL_TURNING
|
|
void SMP_SpellTurningRemoveSpellTurning(object oTarget)
|
|
{
|
|
//Declare major variables
|
|
effect eCheck = GetFirstEffect(oTarget);;
|
|
//Search through the valid effects on the target.
|
|
while(GetIsEffectValid(eCheck))
|
|
{
|
|
//If the effect was created by the spell then remove it
|
|
if(GetEffectSpellId(eCheck) == SMP_SPELL_SPELL_TURNING)
|
|
{
|
|
RemoveEffect(oTarget, eCheck);
|
|
}
|
|
//Get next effect on the target
|
|
eCheck = GetNextEffect(oTarget);
|
|
}
|
|
}
|
|
|
|
// Sends both players to the rift, IF THERE IS ONE.
|
|
// * TRUE if they are moved to the rift.
|
|
int SMP_SpellTurningMoveToRift(object oCaster, object oTarget)
|
|
{
|
|
object oWP = GetObjectByTag(SMP_RIFT_TARGET);
|
|
if(GetIsObjectValid(oWP))
|
|
{
|
|
location lWP = GetLocation(oWP);
|
|
// Move the caster
|
|
AssignCommand(oCaster, ClearAllActions());
|
|
AssignCommand(oCaster, JumpToLocation(lWP));
|
|
// Move the target
|
|
AssignCommand(oTarget, ClearAllActions());
|
|
AssignCommand(oTarget, JumpToLocation(lWP));
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
// Renders both non-functional for the time
|
|
void SMP_SpellTurningRenderTurningUnfunctonal(object oCaster, object oTarget)
|
|
{
|
|
// 1d4 minutes - same for both
|
|
float fMinutes = TurnsToSeconds(d4());
|
|
|
|
// We increase the stored integer by 1 for caster
|
|
int nStored = GetLocalInt(oCaster, SMP_SPELL_TURNING_TEMP_OFF) + 1;
|
|
SetLocalInt(oCaster, SMP_SPELL_TURNING_TEMP_OFF, nStored);
|
|
|
|
// We increase the stored integer by 1 for target
|
|
nStored = GetLocalInt(oTarget, SMP_SPELL_TURNING_TEMP_OFF) + 1;
|
|
SetLocalInt(oTarget, SMP_SPELL_TURNING_TEMP_OFF, nStored);
|
|
|
|
// Delay the reduction.
|
|
DelayCommand(fMinutes, SMP_SpellTurningReduceInteger(oCaster, SMP_SPELL_TURNING_TEMP_OFF));
|
|
DelayCommand(fMinutes, SMP_SpellTurningReduceInteger(oTarget, SMP_SPELL_TURNING_TEMP_OFF));
|
|
}
|
|
|
|
// Decreases the stored integer by 1
|
|
// * Deletes if it would be 0.
|
|
void SMP_SpellTurningReduceInteger(object oTarget, string sStored)
|
|
{
|
|
int nInteger = GetLocalInt(oTarget, SMP_SPELL_TURNING_TEMP_OFF) - 1;
|
|
if(nInteger <= 0)
|
|
{
|
|
DeleteLocalInt(oTarget, SMP_SPELL_TURNING_TEMP_OFF);
|
|
}
|
|
else
|
|
{
|
|
SetLocalInt(oTarget, SMP_SPELL_TURNING_TEMP_OFF, nInteger);
|
|
}
|
|
}
|
|
|
|
// End of file Debug lines. Uncomment below "/*" with "//" and compile.
|
|
/*
|
|
void main()
|
|
{
|
|
return;
|
|
}
|
|
//*/
|