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.
1015 lines
53 KiB
Plaintext
1015 lines
53 KiB
Plaintext
/*:://////////////////////////////////////////////
|
||
//:: Spell Name Pre-spell hook
|
||
//:: Spell FileName SMP_INC_SPLLHOOK
|
||
//:://////////////////////////////////////////////
|
||
//:: Notes
|
||
//:://////////////////////////////////////////////
|
||
The call in this script is called before each spell.
|
||
|
||
It can return TRUE or FALSE.
|
||
|
||
- TRUE - the spell can be cast normally
|
||
- FALSE - the spell will not cast correctly, and the spellscript will not run.
|
||
|
||
This will not actually fire the script SMP_SPELLHOOK, but the function
|
||
SMP_SpellHookCheck() will.
|
||
|
||
Thusly, you only need to edit SMP_SPELLHOOK to have edits to the spellhook.
|
||
//:://////////////////////////////////////////////
|
||
//:: Created By: Jasperre
|
||
//::////////////////////////////////////////////*/
|
||
|
||
// - Contains the normal Use Magical Device checks
|
||
#include "SMP_INC_UMDCHECK"
|
||
// Array things for names
|
||
#include "SMP_INC_ARRAY"
|
||
|
||
// Include the default spell includes too
|
||
#include "SMP_INC_SPELLS"
|
||
|
||
// SMP_INC_SPLLHOOK. Checks if a paladin, or cleric, casting the spell has an item of divine focus.
|
||
int SMP_DivineFocusCheck(string sSpellName);
|
||
|
||
// SMP_INC_SPLLHOOK. This checks Blink effects - there is a 50% chance a spell
|
||
// just will not affect them! :-)
|
||
// - Of course, seeing eathreal (True Seeing, ETC) eliminates this
|
||
// - Returns TRUE if they pass the test, FALSE means that oTarget is blinked :-)
|
||
int SMP_BlinkCheck(object oTarget, object oCaster = OBJECT_SELF);
|
||
|
||
// SMP_INC_SPLLHOOK. This will check if the area is toggled to be wild magic,
|
||
// and if so, do random effects.
|
||
// * FALSE if wild magic check was failed, so something special happened
|
||
// * TRUE if the pass was sucessful, or no wild magic.
|
||
int SMP_WildMagicAreaSurge(object oCasterArea, object oCaster = OBJECT_SELF);
|
||
|
||
// SMP_INC_SPLLHOOK. Check for concentration - that is, if we don't concentrate,
|
||
// then something will happen, but this will not stop the spell cast operating.
|
||
// * Will not return anything. The in-built checks here will not stop the spell,
|
||
// but will stop another that is being concentrated upon.
|
||
void SMP_SpecialConcentrationChecks(object oCaster = OBJECT_SELF);
|
||
|
||
// SMP_INC_SPLLHOOK. This makes sure the caster isn't in some kind of state that
|
||
// stops spells being cast, such as Entanglement, which are not handled under
|
||
// the normal concentration checks via. damage.
|
||
// * TRUE means they passed, no bad effects or sucess at passing the DC checks
|
||
// * FALSE means some bad effect if possed on the caster, or a failed check.
|
||
// Note: Make sure the spell hook applies a special visual when FALSE is returned.
|
||
int SMP_BreakConcentrationCheck(int nSpellLevel, object oCaster = OBJECT_SELF);
|
||
|
||
// SMP_INC_SPLLHOOK. We check for the spells SMP_SPELL_SPELL_CURSE and
|
||
// SMP_SPELL_SPELL_CURSE_GREATER, and do 1d6 + nSpellLevel, or
|
||
// 2d6 + (2*nSpellLevel) in damage, half for will save.
|
||
// * No return value
|
||
// * Only works if a normal spell class, and no item.
|
||
void SMP_SpellCurseCheck(int nSpellLevel, int nCasterClass, object oCastItem, object oCaster = OBJECT_SELF);
|
||
|
||
// SMP_INC_SPLLHOOK. This will check if this spell is a cleric is casting it.
|
||
// - We can cast a limit of 1 Domain spell a day.
|
||
// (NOT IN: We can cast a limit of XXX spells - 1 for other spells, using normal slots.)
|
||
// TRUE if the check failed and they cannot cast it.
|
||
int SMP_DomainSpellCheck(int nSpellId, object oCastItem, int nSpellCastClass, object oCaster = OBJECT_SELF);
|
||
// SMP_INC_SPLLHOOK. Get if nSpellId is a domain spell. Returns TRUE if it is.
|
||
int SMP_GetIsDomainSpell(int nSpellId);
|
||
// SMP_INC_SPLLHOOK. Removes ALL domain spells from nLevel on oTarget - removes the casting of them that is!
|
||
void SMP_RemoveDomainSpells(object oTarget, int nLevel);
|
||
|
||
// SMP_INC_SPLLHOOK. This will check if, casting from a spell scroll, they have
|
||
// the correct stats to do so.
|
||
// Do this before UMD. Returns FALSE if they are using UMD or it was used
|
||
// sucessfully, or FALSE if they tried to use it and failed a check or something.
|
||
// * TRUE = Can cast this spell according to this.
|
||
// * FALSE = Failed, no spell script.
|
||
int SMP_SpellScrollCastingCheck(int nSpellId, int nSpellLevel, object oCastItem, int nSpellCastClass, object oCaster = OBJECT_SELF);
|
||
|
||
// SMP_INC_SPLLHOOK. Returns the level of the spell on the scroll. Of course,
|
||
// there is only ever one level a scroll can be - it can have only one spell to cast on it.
|
||
int SMP_GetSpellScrollLevel(object oScroll);
|
||
|
||
// Checks if a paladin, or cleric, casting the spell has an item of divine focus.
|
||
int SMP_DivineFocusCheck(string sSpellName)
|
||
{
|
||
// Make sure it wasn't cast from an item
|
||
if(GetIsObjectValid(GetSpellCastItem())) return TRUE;
|
||
|
||
int nCasterClass = GetLastSpellCastClass();
|
||
|
||
if(nCasterClass == CLASS_TYPE_CLERIC ||
|
||
nCasterClass == CLASS_TYPE_PALADIN)
|
||
{
|
||
// If this returns FALSE, the focus failed.
|
||
if(!SMP_ComponentExactItem(SMP_ITEM_DIVINE_FOCUS, "Item of Divine Focus", sSpellName))
|
||
{
|
||
effect eVis = EffectVisualEffect(VFX_IMP_MAGIC_RESISTANCE_USE);
|
||
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, OBJECT_SELF);
|
||
return FALSE;
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
// This checks Blink effects - there is a 50% chance a spell just will not
|
||
// affect them! :-)
|
||
// - Of course, seeing eathreal (True Seeing, ETC) eliminates this
|
||
// - Returns TRUE if they pass the test, FALSE means that oTarget is blinked :-)
|
||
int SMP_BlinkCheck(object oTarget, object oCaster = OBJECT_SELF)
|
||
{
|
||
if(GetHasSpellEffect(SMP_SPELL_BLINK, oTarget))
|
||
{
|
||
// Spells which stop Blinking:
|
||
if(!GetHasSpellEffect(SMP_SPELL_TRUE_SEEING, oCaster) &&
|
||
// Hide effect - Trueseeing
|
||
!GetItemHasItemProperty(GetItemInSlot(INVENTORY_SLOT_CARMOUR, oCaster), ITEM_PROPERTY_TRUE_SEEING))
|
||
{
|
||
// Make the 50% check
|
||
if(d2() == 1)
|
||
{
|
||
// Pass!
|
||
SendMessageToPC(oTarget, "Your blinking upset someones attempt to cast a spell at you");
|
||
SendMessageToPC(oCaster, GetName(oTarget) + " was blinking, and was not in this plane at the time!");
|
||
return FALSE;
|
||
}
|
||
// we don't report a pass - it is like Inside Knowledge, knowing
|
||
// that they are blinking (yeah, right). It is really, just more
|
||
// annoying, as many messages could possibly come up for many blinkers
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
// This will check if the area is toggled to be wild magic, and if so, do random
|
||
// effects.
|
||
// * FALSE if wild magic check was failed, so something special happened
|
||
// * TRUE if the pass was sucessful, or no wild magic.
|
||
int SMP_WildMagicAreaSurge(object oCasterArea, object oCaster = OBJECT_SELF)
|
||
{
|
||
// Get if the area has the wildmagic check flag
|
||
// - This is also the % for failure
|
||
int nWildPercent = GetLocalInt(oCasterArea, "SMP_AREA_WILDMAGIC");
|
||
int nDice;
|
||
|
||
// Check if there is a 1% or higher failure rate
|
||
if(nWildPercent > FALSE)
|
||
{
|
||
// Check dice
|
||
nDice = d100();
|
||
if(nDice <= nWildPercent)
|
||
{
|
||
// We fail! Floating text, damage, and visual
|
||
// - Executed script
|
||
ExecuteScript(SMP_WILD_MAGIC_SCRIPT, oCaster);
|
||
// Also stop the spell
|
||
return FALSE;
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
// Check for concentration - that is, if we don't concentrate, then something
|
||
// will happen.
|
||
// * Will not return anything. The in-built checks here will not stop the spell,
|
||
// but will stop another that is being concentrated upon.
|
||
void SMP_SpecialConcentrationChecks(object oCaster = OBJECT_SELF)
|
||
{
|
||
// * At the moment we got only one concentration spell, black blade of disaster
|
||
|
||
object oAssoc = GetAssociate(ASSOCIATE_TYPE_SUMMONED, oCaster);
|
||
if (GetIsObjectValid(oAssoc) && GetIsPC(oCaster)) // only applies to PCS
|
||
{
|
||
if(GetTag(oAssoc) == "x2_s_bblade") // black blade of disaster
|
||
{
|
||
if (GetLocalInt(OBJECT_SELF,"X2_L_CREATURE_NEEDS_CONCENTRATION"))
|
||
{
|
||
SignalEvent(oAssoc,EventUserDefined(1));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// This makes sure the caster isn't in some kind of state that stops spells
|
||
// being cast, such as Entanglement, which are not handled under the normal
|
||
// concentration checks via. damage.
|
||
// * TRUE means they passed, no bad effects or sucess at passing the DC checks
|
||
// * FALSE means some bad effect if possed on the caster, or a failed check.
|
||
// Note: Make sure the spell hook applies a special visual when FALSE is returned.
|
||
int SMP_BreakConcentrationCheck(int nSpellLevel, object oCaster = OBJECT_SELF)
|
||
{
|
||
// Checks for status effects and spells which induce extra concentration
|
||
// checks.
|
||
|
||
// - Entanglement has an extra DC 15 concentration check
|
||
if(SMP_GetHasEffect(EFFECT_TYPE_ENTANGLE, oCaster))
|
||
{
|
||
// DC15
|
||
if(!GetIsSkillSuccessful(oCaster, SKILL_CONCENTRATION, 15))
|
||
{
|
||
// Failed
|
||
FloatingTextStringOnCreature("*Entanglement Concentration failed*", oCaster, FALSE);
|
||
return FALSE;
|
||
}
|
||
else
|
||
{
|
||
// Passed
|
||
FloatingTextStringOnCreature("*Entanglement Concentration passed*", oCaster, FALSE);
|
||
}
|
||
}
|
||
|
||
// * TRUE means successful pass
|
||
return TRUE;
|
||
}
|
||
|
||
// We check for the spells SMP_SPELL_SPELL_CURSE and SMP_SPELL_SPELL_CURSE_GREATER,
|
||
// and do 1d6 + nSpellLevel, or 2d6 + (2*nSpellLevel) in damage, half for will save.
|
||
// * No return value
|
||
// * Only works if a normal spell class, and no item.
|
||
void SMP_SpellCurseCheck(int nSpellLevel, int nCasterClass, object oCastItem, object oCaster = OBJECT_SELF)
|
||
{
|
||
// We do not do it if they cast from an item, or cast from a special ability.
|
||
if(GetIsObjectValid(oCastItem) ||
|
||
nCasterClass == CLASS_TYPE_INVALID)
|
||
{
|
||
return;
|
||
}
|
||
|
||
// So, we check for the spell
|
||
object oEnemy;
|
||
int nSpellSaveDC, nDam;
|
||
effect eDam;
|
||
|
||
// - Greater Spell Curse
|
||
if(GetHasSpellEffect(SMP_SPELL_SPELL_CURSE_GREATER, oCaster))
|
||
{
|
||
// Make sure the caster is valid.
|
||
oEnemy = SMP_FirstCasterOfSpellEffect(SMP_SPELL_SPELL_CURSE_GREATER, oCaster);
|
||
|
||
// Validity
|
||
if(GetIsObjectValid(oEnemy))
|
||
{
|
||
// We check for will save DC
|
||
nSpellSaveDC = GetLocalInt(oEnemy, "SMP_SPELL_CAST_SPELL_SAVEDC" + IntToString(SMP_SPELL_SPELL_CURSE_GREATER));
|
||
|
||
// Make sure its 10 or more
|
||
if(nSpellSaveDC < 10) nSpellSaveDC = 10;
|
||
|
||
// Get damage
|
||
// 2d6 + 2 * spell level
|
||
nDam = SMP_MaximizeOrEmpower(6, 2, FALSE, nSpellLevel * 2);
|
||
|
||
// Do the save for half damage
|
||
nDam = SMP_GetAdjustedDamage(SAVING_THROW_WILL, nDam, oCaster, nSpellSaveDC, SAVING_THROW_TYPE_NONE, oEnemy);
|
||
|
||
// Do damage
|
||
if(nDam > 0)
|
||
{
|
||
eDam = EffectDamage(nDam);
|
||
AssignCommand(oEnemy, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oCaster));
|
||
}
|
||
// Stop!
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
// Else, cannot be valid greater spell curse. Need enemy.
|
||
SMP_RemoveSpellEffectsFromTarget(SMP_SPELL_SPELL_CURSE_GREATER, oCaster);
|
||
}
|
||
}
|
||
// Now check the normal version, 1d6 + spell level in damage.
|
||
if(GetHasSpellEffect(SMP_SPELL_SPELL_CURSE, oCaster))
|
||
{
|
||
// Make sure the cast is valid.
|
||
oEnemy = SMP_FirstCasterOfSpellEffect(SMP_SPELL_SPELL_CURSE, oCaster);
|
||
|
||
// Validity
|
||
if(GetIsObjectValid(oEnemy))
|
||
{
|
||
// We check for will save DC
|
||
nSpellSaveDC = GetLocalInt(oEnemy, "SMP_SPELL_CAST_SPELL_SAVEDC" + IntToString(SMP_SPELL_SPELL_CURSE));
|
||
|
||
// Make sure its 10 or more
|
||
if(nSpellSaveDC < 10) nSpellSaveDC = 10;
|
||
|
||
// Get damage
|
||
// 1d6 + spell level
|
||
nDam = SMP_MaximizeOrEmpower(6, 1, FALSE, nSpellLevel);
|
||
|
||
// Do the save for half damage
|
||
nDam = SMP_GetAdjustedDamage(SAVING_THROW_WILL, nDam, oCaster, nSpellSaveDC, SAVING_THROW_TYPE_NONE, oEnemy);
|
||
|
||
// Do damage
|
||
if(nDam > 0)
|
||
{
|
||
eDam = EffectDamage(nDam);
|
||
AssignCommand(oEnemy, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oCaster));
|
||
}
|
||
// Stop!
|
||
return;
|
||
}
|
||
else
|
||
{
|
||
// Else, cannot be valid greater spell curse. Need enemy.
|
||
SMP_RemoveSpellEffectsFromTarget(SMP_SPELL_SPELL_CURSE, oCaster);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
// This will check if this spell is a Domain spell, and a cleric is casting it.
|
||
// - No items will be used.
|
||
// - If so, we will not be able to use more then one per rest.
|
||
int SMP_DomainSpellCheck(int nSpellId, object oCastItem, int nSpellCastClass, object oCaster = OBJECT_SELF)
|
||
{
|
||
// PCs only
|
||
if(!GetIsPC(oCaster)) return TRUE;
|
||
|
||
// Module setting, if we have no setting to use this, ignore it
|
||
if(!SMP_SettingGetGlobal(SMP_SETTING_DOMAIN_SPELL_LIMIT_ENFORCE)) return TRUE;
|
||
|
||
// If they are not casting as a cleric, or using a valid item (EG: scroll)
|
||
// we do not need this
|
||
if(nSpellCastClass != CLASS_TYPE_CLERIC || GetIsObjectValid(oCastItem)) return TRUE;
|
||
|
||
// We are a cleric casting a normal spell...thus will be a clerical stored
|
||
// spell (A normal one, spontaeous one, or a domain one!)
|
||
|
||
// Check the spell by nSpellId to see if it is a domain spell.
|
||
if(SMP_GetIsDomainSpell(nSpellId))
|
||
{
|
||
// Get domain spell level
|
||
int nLevel = SMP_ArrayGetSpellLevel(nSpellId, CLASS_TYPE_INVALID);
|
||
|
||
// Remove other domain spells from this level
|
||
SMP_RemoveDomainSpells(oCaster, nLevel);
|
||
}
|
||
|
||
// If this is a normal cleric spell (checked now) from whatever level, we
|
||
// will make sure, if this is the first casting of a cleric spell from that
|
||
// level, we remove all but 1 domain spell, oh, and make sure that at least
|
||
// 1 of the spells are a domain spell from that level.
|
||
|
||
// * Need to test for wisdom bonuses, slots, etc. To see if it was the first
|
||
// spell. Note, it could be abused - however, extra wisdom is only tempoary,
|
||
// so we'll not check for bonus to wisdom from effects, only items and
|
||
// inherant bonuses (Maybe just take off all temp wisdom bonuses...by applying
|
||
// a +12 bonus, then removing it?)
|
||
|
||
// Therefore: If we rest, it'll check again on the first casting of a spell
|
||
// from that level. no need for rest event changing.
|
||
|
||
// True, we can cast the spell
|
||
return TRUE;
|
||
}
|
||
|
||
// Get if nSpellId is a domain spell. Returns TRUE if it is.
|
||
int SMP_GetIsDomainSpell(int nSpellId)
|
||
{
|
||
switch(nSpellId)
|
||
{
|
||
// Air
|
||
case SMP_SPELL_DOMAIN_AIR_OBSCURING_MIST:
|
||
case SMP_SPELL_DOMAIN_AIR_WIND_WALL:
|
||
case SMP_SPELL_DOMAIN_AIR_GASEOUS_FORM:
|
||
case SMP_SPELL_DOMAIN_AIR_AIR_WALK:
|
||
case SMP_SPELL_DOMAIN_AIR_CONTROL_WINDS:
|
||
case SMP_SPELL_DOMAIN_AIR_CHAIN_LIGHTNING:
|
||
case SMP_SPELL_DOMAIN_AIR_CONTROL_WEATHER:
|
||
case SMP_SPELL_DOMAIN_AIR_WHIRLWIND:
|
||
case SMP_SPELL_DOMAIN_AIR_ELEMENTAL_SWARM:
|
||
// Animal
|
||
case SMP_SPELL_DOMAIN_ANIMAL_CALM_ANIMALS:
|
||
case SMP_SPELL_DOMAIN_ANIMAL_HOLD_ANIMAL:
|
||
case SMP_SPELL_DOMAIN_ANIMAL_DOMINATE_ANIMAL:
|
||
case SMP_SPELL_DOMAIN_ANIMAL_SUMMON_NATURES_ALLY_IV:
|
||
case SMP_SPELL_DOMAIN_ANIMAL_COMMUNE_WITH_NATURE:
|
||
case SMP_SPELL_DOMAIN_ANIMAL_ANTILIFE_SHELL:
|
||
case SMP_SPELL_DOMAIN_ANIMAL_ANIMAL_SHAPES:
|
||
case SMP_SPELL_DOMAIN_ANIMAL_SUMMON_NATURES_ALLY_VII:
|
||
case SMP_SPELL_DOMAIN_ANIMAL_SHAPECHANGE:
|
||
// Chaos
|
||
case SMP_SPELL_DOMAIN_CHAOS_PROTECTION_FROM_LAW:
|
||
case SMP_SPELL_DOMAIN_CHAOS_SHATTER:
|
||
case SMP_SPELL_DOMAIN_CHAOS_MAGIC_CIRCLE_AGAINST_LAW:
|
||
case SMP_SPELL_DOMAIN_CHAOS_CHAOS_HAMMER:
|
||
case SMP_SPELL_DOMAIN_CHAOS_DISPEL_LAW:
|
||
case SMP_SPELL_DOMAIN_CHAOS_ANIMATE_OBJECTS:
|
||
case SMP_SPELL_DOMAIN_CHAOS_WORD_OF_CHAOS:
|
||
case SMP_SPELL_DOMAIN_CHAOS_CLOAK_OF_CHAOS:
|
||
case SMP_SPELL_DOMAIN_CHAOS_SUMMON_MONSTER_IX:
|
||
// Death
|
||
case SMP_SPELL_DOMAIN_DEATH_CAUSE_FEAR:
|
||
case SMP_SPELL_DOMAIN_DEATH_DEATH_KNELL:
|
||
case SMP_SPELL_DOMAIN_DEATH_ANIMATE_DEAD:
|
||
case SMP_SPELL_DOMAIN_DEATH_DEATH_WARD:
|
||
case SMP_SPELL_DOMAIN_DEATH_SLAY_LIVING:
|
||
case SMP_SPELL_DOMAIN_DEATH_CREATE_UNDEAD:
|
||
case SMP_SPELL_DOMAIN_DEATH_DESTRUCTION:
|
||
case SMP_SPELL_DOMAIN_DEATH_CREATE_GREATER_UNDEAD:
|
||
case SMP_SPELL_DOMAIN_DEATH_WAIL_OF_THE_BANSHEE:
|
||
// Destruction
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_INFLICT_LIGHT_WOUNDS:
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_SHATTER:
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_CONTAGION:
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_INFLICT_CRITICAL_WOUNDS:
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_INFLICT_LIGHT_WOUNDS_MASS:
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_HARM:
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_DISINTEGRATE:
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_EARTHQUAKE:
|
||
case SMP_SPELL_DOMAIN_DESTRUCTION_IMPLOSION:
|
||
// Earth
|
||
case SMP_SPELL_DOMAIN_EARTH_MAGIC_STONE:
|
||
case SMP_SPELL_DOMAIN_EARTH_SOFTEN_EARTH_AND_STONE:
|
||
case SMP_SPELL_DOMAIN_EARTH_STONE_SHAPE:
|
||
case SMP_SPELL_DOMAIN_EARTH_SPIKE_STONES:
|
||
case SMP_SPELL_DOMAIN_EARTH_WALL_OF_STONE:
|
||
case SMP_SPELL_DOMAIN_EARTH_STONESKIN:
|
||
case SMP_SPELL_DOMAIN_EARTH_EARTHQUAKE:
|
||
case SMP_SPELL_DOMAIN_EARTH_IRON_BODY:
|
||
case SMP_SPELL_DOMAIN_EARTH_ELEMENTAL_SWARM:
|
||
// Evil
|
||
case SMP_SPELL_DOMAIN_EVIL_PROTECTION_FROM_GOOD:
|
||
case SMP_SPELL_DOMAIN_EVIL_DESECRATE:
|
||
case SMP_SPELL_DOMAIN_EVIL_MAGIC_CIRCLE_AGAINST_GOOD:
|
||
case SMP_SPELL_DOMAIN_EVIL_UNHOLY_BLIGHT:
|
||
case SMP_SPELL_DOMAIN_EVIL_DISPEL_GOOD:
|
||
case SMP_SPELL_DOMAIN_EVIL_CREATE_UNDEAD:
|
||
case SMP_SPELL_DOMAIN_EVIL_BLASPHEMY:
|
||
case SMP_SPELL_DOMAIN_EVIL_UNHOLY_AURA:
|
||
case SMP_SPELL_DOMAIN_EVIL_SUMMON_MONSTER_IX:
|
||
// Fire
|
||
case SMP_SPELL_DOMAIN_FIRE_BURNING_HANDS:
|
||
case SMP_SPELL_DOMAIN_FIRE_PRODUCE_FLAME:
|
||
case SMP_SPELL_DOMAIN_FIRE_RESIST_ENERGY:
|
||
case SMP_SPELL_DOMAIN_FIRE_WALL_OF_FIRE:
|
||
case SMP_SPELL_DOMAIN_FIRE_FIRE_SHIELD:
|
||
case SMP_SPELL_DOMAIN_FIRE_FIRE_SEEDS:
|
||
case SMP_SPELL_DOMAIN_FIRE_FIRE_STORM:
|
||
case SMP_SPELL_DOMAIN_FIRE_INCENDIARY_CLOUD:
|
||
case SMP_SPELL_DOMAIN_FIRE_ELEMENTAL_SWARM:
|
||
// Good
|
||
case SMP_SPELL_DOMAIN_GOOD_PROTECTION_FROM_EVIL:
|
||
case SMP_SPELL_DOMAIN_GOOD_AID:
|
||
case SMP_SPELL_DOMAIN_GOOD_MAGIC_CIRCLE_AGAINST_EVIL:
|
||
case SMP_SPELL_DOMAIN_GOOD_HOLY_SMITE:
|
||
case SMP_SPELL_DOMAIN_GOOD_DISPEL_EVIL:
|
||
case SMP_SPELL_DOMAIN_GOOD_BLADE_BARRIER:
|
||
case SMP_SPELL_DOMAIN_GOOD_HOLY_WORD:
|
||
case SMP_SPELL_DOMAIN_GOOD_HOLY_AURA:
|
||
case SMP_SPELL_DOMAIN_GOOD_SUMMON_MONSTER_IX:
|
||
// Healing
|
||
case SMP_SPELL_DOMAIN_HEALING_CURE_LIGHT_WOUNDS:
|
||
case SMP_SPELL_DOMAIN_HEALING_CURE_MODERATE_WOUNDS:
|
||
case SMP_SPELL_DOMAIN_HEALING_CURE_SERIOUS_WOUNDS:
|
||
case SMP_SPELL_DOMAIN_HEALING_CURE_CRITICAL_WOUNDS:
|
||
case SMP_SPELL_DOMAIN_HEALING_CURE_LIGHT_WOUNDS_MASS:
|
||
case SMP_SPELL_DOMAIN_HEALING_HEAL:
|
||
case SMP_SPELL_DOMAIN_HEALING_REGENERATE:
|
||
case SMP_SPELL_DOMAIN_HEALING_CURE_CRITICAL_WOUNDS_MASS:
|
||
case SMP_SPELL_DOMAIN_HEALING_HEAL_MASS:
|
||
// Knowledge
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_DETECT_SECRET_DOOS:
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_DETECT_THOUGHTS:
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_CLAIRAUDIENCE_CLAIRVOYANCE:
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_DIVINATION:
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_TRUE_SEEING:
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_FIND_THE_PATH:
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_LEGEND_LORE:
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_DISCERN_LOCATION:
|
||
case SMP_SPELL_DOMAIN_KNOWLEDGE_FORESIGHT:
|
||
// Law
|
||
case SMP_SPELL_DOMAIN_LAW_PROTECTION_FROM_CHAOS:
|
||
case SMP_SPELL_DOMAIN_LAW_CALM_EMOTIONS:
|
||
case SMP_SPELL_DOMAIN_LAW_MAGIC_CIRCLE_AGAINST_CHAOS:
|
||
case SMP_SPELL_DOMAIN_LAW_ORDERS_WRATH:
|
||
case SMP_SPELL_DOMAIN_LAW_DISPEL_CHAOS:
|
||
case SMP_SPELL_DOMAIN_LAW_HOLD_MONSTER:
|
||
case SMP_SPELL_DOMAIN_LAW_DICTUM:
|
||
case SMP_SPELL_DOMAIN_LAW_SHIELD_OF_LAW:
|
||
case SMP_SPELL_DOMAIN_LAW_SUMMON_MONSTER_IX:
|
||
// Luck
|
||
case SMP_SPELL_DOMAIN_LUCK_ENTROPIC_SHIELD:
|
||
case SMP_SPELL_DOMAIN_LUCK_AID:
|
||
case SMP_SPELL_DOMAIN_LUCK_PROTECTION_FROM_ENERGY:
|
||
case SMP_SPELL_DOMAIN_LUCK_FREEDOM_OF_MOVEMENT:
|
||
case SMP_SPELL_DOMAIN_LUCK_BREAK_ENCHANTMENT:
|
||
case SMP_SPELL_DOMAIN_LUCK_MISLEAD:
|
||
case SMP_SPELL_DOMAIN_LUCK_SPELL_TURNING:
|
||
case SMP_SPELL_DOMAIN_LUCK_MOMENT_OF_PRESCIENCE:
|
||
case SMP_SPELL_DOMAIN_LUCK_MIRACLE:
|
||
// Magic
|
||
case SMP_SPELL_DOMAIN_MAGIC_MAGIC_AURA:
|
||
case SMP_SPELL_DOMAIN_MAGIC_IDENTIFY:
|
||
case SMP_SPELL_DOMAIN_MAGIC_DISPEL_MAGIC:
|
||
case SMP_SPELL_DOMAIN_MAGIC_IMBUNE_WITH_SPELL_ABILITY:
|
||
case SMP_SPELL_DOMAIN_MAGIC_SPELL_RESISTANCE:
|
||
case SMP_SPELL_DOMAIN_MAGIC_ANTIMAGIC_FIELD:
|
||
case SMP_SPELL_DOMAIN_MAGIC_SPELL_TURNING:
|
||
case SMP_SPELL_DOMAIN_MAGIC_PROTECTION_FROM_SPELLS:
|
||
case SMP_SPELL_DOMAIN_MAGIC_MAGES_DISJUNCTION:
|
||
// Plant
|
||
case SMP_SPELL_DOMAIN_PLANT_ENTANGLE:
|
||
case SMP_SPELL_DOMAIN_PLANT_BARKSKIN:
|
||
case SMP_SPELL_DOMAIN_PLANT_PLANT_GROWTH:
|
||
case SMP_SPELL_DOMAIN_PLANT_COMMAND_PLANTS:
|
||
case SMP_SPELL_DOMAIN_PLANT_WALL_OF_THORNS:
|
||
case SMP_SPELL_DOMAIN_PLANT_REPEL_WOOD:
|
||
case SMP_SPELL_DOMAIN_PLANT_ANIMATE_PLANTS:
|
||
case SMP_SPELL_DOMAIN_PLANT_CONTROL_PLANTS:
|
||
case SMP_SPELL_DOMAIN_PLANT_SHAMBLER:
|
||
// Protection
|
||
case SMP_SPELL_DOMAIN_PROTECTION_SANCTUARY:
|
||
case SMP_SPELL_DOMAIN_PROTECTION_SHIELD_OTHER:
|
||
case SMP_SPELL_DOMAIN_PROTECTION_PROTECTION_FROM_ENERGY:
|
||
case SMP_SPELL_DOMAIN_PROTECTION_SPELL_IMMUNITY:
|
||
case SMP_SPELL_DOMAIN_PROTECTION_SPELL_RESISTANCE:
|
||
case SMP_SPELL_DOMAIN_PROTECTION_ANTIMAGIC_FIELD:
|
||
case SMP_SPELL_DOMAIN_PROTECTION_REPULSION:
|
||
case SMP_SPELL_DOMAIN_PROTECTION_MIND_BLANK:
|
||
case SMP_SPELL_DOMAIN_PROTECTION_PRISMATIC_SPHERE:
|
||
// Strength
|
||
case SMP_SPELL_DOMAIN_STRENGTH_ENLARGE_PERSON:
|
||
case SMP_SPELL_DOMAIN_STRENGTH_BULLS_STRENGTH:
|
||
case SMP_SPELL_DOMAIN_STRENGTH_MAGIC_VESTMENT:
|
||
case SMP_SPELL_DOMAIN_STRENGTH_SPELL_IMMUNITY:
|
||
case SMP_SPELL_DOMAIN_STRENGTH_RIGHTEOUS_MIGHT:
|
||
case SMP_SPELL_DOMAIN_STRENGTH_STONESKIN:
|
||
case SMP_SPELL_DOMAIN_STRENGTH_GRASPING_HAND:
|
||
case SMP_SPELL_DOMAIN_STRENGTH_CLENCHED_FIST:
|
||
case SMP_SPELL_DOMAIN_STRENGTH_CRUSHING_HAND:
|
||
// Sun
|
||
case SMP_SPELL_DOMAIN_SUN_ENDURE_ELEMENTS:
|
||
case SMP_SPELL_DOMAIN_SUN_HEAT_METAL:
|
||
case SMP_SPELL_DOMAIN_SUN_SEARING_LIGHT:
|
||
case SMP_SPELL_DOMAIN_SUN_FIRE_SHIELD:
|
||
case SMP_SPELL_DOMAIN_SUN_FLAME_STRIKE:
|
||
case SMP_SPELL_DOMAIN_SUN_FIRE_SEEDS:
|
||
case SMP_SPELL_DOMAIN_SUN_SUNBEAM:
|
||
case SMP_SPELL_DOMAIN_SUN_SUNBURST:
|
||
case SMP_SPELL_DOMAIN_SUN_PRISMATIC_SPHERE:
|
||
// Travel
|
||
case SMP_SPELL_DOMAIN_TRAVEL_LONGSTRIDER:
|
||
case SMP_SPELL_DOMAIN_TRAVEL_LOCATE_OBJECT:
|
||
case SMP_SPELL_DOMAIN_TRAVEL_FLY:
|
||
case SMP_SPELL_DOMAIN_TRAVEL_DIMENSION_DOOR:
|
||
case SMP_SPELL_DOMAIN_TRAVEL_TELEPORT:
|
||
case SMP_SPELL_DOMAIN_TRAVEL_FIND_THE_PATH:
|
||
case SMP_SPELL_DOMAIN_TRAVEL_TELEPORT_GREATER:
|
||
case SMP_SPELL_DOMAIN_TRAVEL_PHASE_DOOR:
|
||
case SMP_SPELL_DOMAIN_TRAVEL_ASTRAL_PROJECTION:
|
||
// Trickery
|
||
case SMP_SPELL_DOMAIN_TRICKERY_DISGUISE_SELF:
|
||
case SMP_SPELL_DOMAIN_TRICKERY_INVISIBILITY:
|
||
case SMP_SPELL_DOMAIN_TRICKERY_NONDETECTION:
|
||
case SMP_SPELL_DOMAIN_TRICKERY_CONFUSION:
|
||
case SMP_SPELL_DOMAIN_TRICKERY_FALSE_VISION:
|
||
case SMP_SPELL_DOMAIN_TRICKERY_MISLEAD:
|
||
case SMP_SPELL_DOMAIN_TRICKERY_SCREEN:
|
||
case SMP_SPELL_DOMAIN_TRICKERY_POLYMORPH_ANY_OBJECT:
|
||
case SMP_SPELL_DOMAIN_TRICKERY_TIME_STOP:
|
||
// War
|
||
case SMP_SPELL_DOMAIN_WAR_MAGIC_WEAPON:
|
||
case SMP_SPELL_DOMAIN_WAR_SPIRITUAL_WEAPON:
|
||
case SMP_SPELL_DOMAIN_WAR_MAGIC_VESTMENT:
|
||
case SMP_SPELL_DOMAIN_WAR_DIVINE_POWER:
|
||
case SMP_SPELL_DOMAIN_WAR_FLAME_STRIKE:
|
||
case SMP_SPELL_DOMAIN_WAR_BLADE_BARRIER:
|
||
case SMP_SPELL_DOMAIN_WAR_POWER_WORD_BLIND:
|
||
case SMP_SPELL_DOMAIN_WAR_POWER_WORD_STUN:
|
||
case SMP_SPELL_DOMAIN_WAR_POWER_WORD_KILL:
|
||
// War
|
||
case SMP_SPELL_DOMAIN_WATER_OBSCURING_MIST:
|
||
case SMP_SPELL_DOMAIN_WATER_FOG_CLOUD:
|
||
case SMP_SPELL_DOMAIN_WATER_WATER_BREATHING:
|
||
case SMP_SPELL_DOMAIN_WATER_CONTROL_WATER:
|
||
case SMP_SPELL_DOMAIN_WATER_ICE_STORM:
|
||
case SMP_SPELL_DOMAIN_WATER_CONE_OF_COLD:
|
||
case SMP_SPELL_DOMAIN_WATER_ACID_FOG:
|
||
case SMP_SPELL_DOMAIN_WATER_HORRID_WILTING:
|
||
case SMP_SPELL_DOMAIN_WATER_ELEMENTAL_SWARM:
|
||
{
|
||
return TRUE;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
// Removes ALL domain spells from nLevel on oTarget - removes the casting of them that is!
|
||
void SMP_RemoveDomainSpells(object oTarget, int nLevel)
|
||
{
|
||
switch(nLevel)
|
||
{
|
||
case 1:
|
||
{
|
||
// Remove all level 1 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_OBSCURING_MIST);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_CALM_ANIMALS);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_PROTECTION_FROM_LAW);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_CAUSE_FEAR);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_INFLICT_LIGHT_WOUNDS);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_MAGIC_STONE);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_PROTECTION_FROM_GOOD);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_BURNING_HANDS);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_PROTECTION_FROM_EVIL);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_CURE_LIGHT_WOUNDS);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_DETECT_SECRET_DOOS);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_PROTECTION_FROM_CHAOS);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_ENTROPIC_SHIELD);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_MAGIC_AURA);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_ENTANGLE);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_SANCTUARY);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_ENLARGE_PERSON);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_ENDURE_ELEMENTS);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_LONGSTRIDER);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_DISGUISE_SELF);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_MAGIC_WEAPON);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_OBSCURING_MIST);// Water
|
||
}
|
||
break;
|
||
case 2:
|
||
{
|
||
// Remove all level 2 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_WIND_WALL);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_HOLD_ANIMAL);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_SHATTER);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_DEATH_KNELL);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_SHATTER);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_SOFTEN_EARTH_AND_STONE);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_DESECRATE);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_PRODUCE_FLAME);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_AID);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_CURE_MODERATE_WOUNDS);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_DETECT_THOUGHTS);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_CALM_EMOTIONS);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_AID);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_IDENTIFY);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_BARKSKIN);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_SHIELD_OTHER);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_BULLS_STRENGTH);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_HEAT_METAL);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_LOCATE_OBJECT);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_INVISIBILITY);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_SPIRITUAL_WEAPON);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_FOG_CLOUD);// Water
|
||
}
|
||
break;
|
||
case 3:
|
||
{
|
||
// Remove all level 3 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_GASEOUS_FORM);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_DOMINATE_ANIMAL);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_MAGIC_CIRCLE_AGAINST_LAW);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_ANIMATE_DEAD);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_CONTAGION);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_STONE_SHAPE);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_MAGIC_CIRCLE_AGAINST_GOOD);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_RESIST_ENERGY);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_MAGIC_CIRCLE_AGAINST_EVIL);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_CURE_SERIOUS_WOUNDS);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_CLAIRAUDIENCE_CLAIRVOYANCE);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_MAGIC_CIRCLE_AGAINST_CHAOS);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_PROTECTION_FROM_ENERGY);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_DISPEL_MAGIC);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_PLANT_GROWTH);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_PROTECTION_FROM_ENERGY);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_MAGIC_VESTMENT);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_SEARING_LIGHT);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_FLY);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_NONDETECTION);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_MAGIC_VESTMENT);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_WATER_BREATHING);// Water
|
||
}
|
||
break;
|
||
case 4:
|
||
{
|
||
// Remove all level 4 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_AIR_WALK);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_SUMMON_NATURES_ALLY_IV);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_CHAOS_HAMMER);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_DEATH_WARD);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_INFLICT_CRITICAL_WOUNDS);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_SPIKE_STONES);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_UNHOLY_BLIGHT);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_WALL_OF_FIRE);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_HOLY_SMITE);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_CURE_CRITICAL_WOUNDS);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_DIVINATION);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_ORDERS_WRATH);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_FREEDOM_OF_MOVEMENT);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_IMBUNE_WITH_SPELL_ABILITY);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_COMMAND_PLANTS);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_SPELL_IMMUNITY);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_SPELL_IMMUNITY);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_FIRE_SHIELD);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_DIMENSION_DOOR);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_CONFUSION);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_DIVINE_POWER);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_CONTROL_WATER);// Water
|
||
}
|
||
break;
|
||
case 5:
|
||
{
|
||
// Remove all level 5 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_CONTROL_WINDS);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_COMMUNE_WITH_NATURE);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_DISPEL_LAW);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_SLAY_LIVING);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_INFLICT_LIGHT_WOUNDS_MASS);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_WALL_OF_STONE);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_DISPEL_GOOD);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_FIRE_SHIELD);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_DISPEL_EVIL);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_CURE_LIGHT_WOUNDS_MASS);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_TRUE_SEEING);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_DISPEL_CHAOS);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_BREAK_ENCHANTMENT);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_SPELL_RESISTANCE);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_WALL_OF_THORNS);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_SPELL_RESISTANCE);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_RIGHTEOUS_MIGHT);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_FLAME_STRIKE);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_TELEPORT);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_FALSE_VISION);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_FLAME_STRIKE);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_ICE_STORM);// Water
|
||
}
|
||
break;
|
||
case 6:
|
||
{
|
||
// Remove all level 6 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_CHAIN_LIGHTNING);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_ANTILIFE_SHELL);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_ANIMATE_OBJECTS);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_CREATE_UNDEAD);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_HARM);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_STONESKIN);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_CREATE_UNDEAD);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_FIRE_SEEDS);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_BLADE_BARRIER);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_HEAL);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_FIND_THE_PATH);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_HOLD_MONSTER);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_MISLEAD);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_ANTIMAGIC_FIELD);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_REPEL_WOOD);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_ANTIMAGIC_FIELD);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_STONESKIN);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_FIRE_SEEDS);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_FIND_THE_PATH);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_MISLEAD);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_BLADE_BARRIER);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_CONE_OF_COLD);// Water
|
||
}
|
||
break;
|
||
case 7:
|
||
{
|
||
// Remove all level 7 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_CONTROL_WEATHER);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_ANIMAL_SHAPES);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_WORD_OF_CHAOS);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_DESTRUCTION);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_DISINTEGRATE);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_EARTHQUAKE);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_BLASPHEMY);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_FIRE_STORM);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_HOLY_WORD);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_REGENERATE);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_LEGEND_LORE);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_DICTUM);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_SPELL_TURNING);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_SPELL_TURNING);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_ANIMATE_PLANTS);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_REPULSION);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_GRASPING_HAND);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_SUNBEAM);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_TELEPORT_GREATER);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_SCREEN);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_POWER_WORD_BLIND);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_ACID_FOG);// Water
|
||
}
|
||
break;
|
||
case 8:
|
||
{
|
||
// Remove all level 8 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_WHIRLWIND);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_SUMMON_NATURES_ALLY_VII);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_CLOAK_OF_CHAOS);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_CREATE_GREATER_UNDEAD);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_EARTHQUAKE);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_IRON_BODY);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_UNHOLY_AURA);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_INCENDIARY_CLOUD);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_HOLY_AURA);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_CURE_CRITICAL_WOUNDS_MASS);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_DISCERN_LOCATION);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_SHIELD_OF_LAW);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_MOMENT_OF_PRESCIENCE);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_PROTECTION_FROM_SPELLS);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_CONTROL_PLANTS);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_MIND_BLANK);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_CLENCHED_FIST);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_SUNBURST);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_PHASE_DOOR);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_POLYMORPH_ANY_OBJECT);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_POWER_WORD_STUN);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_HORRID_WILTING);// Water
|
||
}
|
||
break;
|
||
case 9:
|
||
{
|
||
// Remove all level 9 domain spells
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_AIR_ELEMENTAL_SWARM);// Air
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_ANIMAL_SHAPECHANGE);// Animal
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_CHAOS_SUMMON_MONSTER_IX);// Chaos
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DEATH_WAIL_OF_THE_BANSHEE);// Death
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_DESTRUCTION_IMPLOSION);// Destruction
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EARTH_ELEMENTAL_SWARM);// Earth
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_EVIL_SUMMON_MONSTER_IX);// Evil
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_FIRE_ELEMENTAL_SWARM);// Fire
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_GOOD_SUMMON_MONSTER_IX);// Good
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_HEALING_HEAL_MASS);// Healing
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_KNOWLEDGE_FORESIGHT);// Knowledge
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LAW_SUMMON_MONSTER_IX);// Law
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_LUCK_MIRACLE);// Luck
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_MAGIC_MAGES_DISJUNCTION);// Magic
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PLANT_SHAMBLER);// Plant
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_PROTECTION_PRISMATIC_SPHERE);// Protection
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_STRENGTH_CRUSHING_HAND);// Strength
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_SUN_PRISMATIC_SPHERE);// Sun
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRAVEL_ASTRAL_PROJECTION);// Travel
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_TRICKERY_TIME_STOP);// Trickery
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WAR_POWER_WORD_KILL);// War
|
||
SMP_DecrementAllRemainingSpellUses(oTarget, SMP_SPELL_DOMAIN_WATER_ELEMENTAL_SWARM);// Water
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
// This will check if, casting from a spell scroll, they have the correct stats
|
||
// to do so.
|
||
// Do this before UMD. Returns FALSE if they are using UMD or it was used
|
||
// sucessfully, or FALSE if they tried to use it and failed a check or something.
|
||
int SMP_SpellScrollCastingCheck(int nSpellId, int nSpellLevel, object oCastItem, int nSpellCastClass, object oCaster = OBJECT_SELF)
|
||
{
|
||
/*
|
||
To have any chance of activating a scroll spell, the scroll user must meet
|
||
the following requirements.
|
||
|
||
* The spell must be of the correct type (arcane or divine). Arcane
|
||
spellcasters (wizards, sorcerers, and bards) can only use scrolls
|
||
containing arcane spells, and divine spellcasters (clerics, druids,
|
||
paladins, and rangers) can only use scrolls containing divine spells.
|
||
(The type of scroll a character creates is also determined by his or her
|
||
class.)
|
||
* The user must have the spell on his or her class list.
|
||
* The user must have the requisite ability score.
|
||
|
||
If the user meets all the requirements noted above, and her caster level is
|
||
at least equal to the spell<6C>s caster level, she can automatically activate
|
||
the spell without a check. If she meets all three requirements but her own
|
||
caster level is lower than the scroll spell<6C>s caster level, then she has to
|
||
make a caster level check (DC = scroll<6C>s caster level + 1) to cast the spell
|
||
successfully. If she fails, she must make a DC 5 Wisdom check to avoid a
|
||
mishap (see Scroll Mishaps, below). A natural roll of 1 always fails,
|
||
whatever the modifiers.
|
||
*/
|
||
// Is it a scroll?
|
||
if(GetBaseItemType(oCastItem) == BASE_ITEM_SCROLL)
|
||
{
|
||
// No: Not a scroll. Can cast normally.
|
||
return TRUE;
|
||
}
|
||
|
||
// Has it any restrictions on class?
|
||
if(!GetItemHasItemProperty(oCastItem, ITEM_PROPERTY_USE_LIMITATION_CLASS))
|
||
{
|
||
// No: Can cast normally
|
||
return TRUE;
|
||
}
|
||
|
||
// Do the checks above.
|
||
// Is it on our spell list
|
||
int nClassLevel = SMP_SpellItemHighestLevelActivator(oCastItem, oCaster);
|
||
// If FALSE, we return 0.
|
||
if(nClassLevel == FALSE)
|
||
{
|
||
// No: Using UMD. Can cast normally.
|
||
return TRUE;
|
||
}
|
||
|
||
// If the user meets all the requirements noted above, and her caster level is
|
||
// at least equal to the spell<6C>s caster level, she can automatically activate
|
||
// the spell without a check.
|
||
int nScrollLevel = SMP_GetSpellScrollLevel(oCastItem);
|
||
if(nClassLevel >= nScrollLevel)
|
||
{
|
||
// All A-OK, as normal. Can cast normally.
|
||
return TRUE;
|
||
}
|
||
|
||
// Else, need a spellcraft check to cast this scroll.
|
||
|
||
// If she meets all three requirements but her own caster level is lower
|
||
// than the scroll spell<6C>s caster level, then she has to make a caster
|
||
// level check (DC = scroll<6C>s caster level + 1) to cast the spell successfully.
|
||
int nDC = nScrollLevel + 1;
|
||
if(nClassLevel + d20() >= nDC)
|
||
{
|
||
// All OK. Can cast normally.
|
||
FloatingTextStringOnCreature("*Caster level check for casting a higher level scroll sucessful*", oCaster, FALSE);
|
||
return TRUE;
|
||
}
|
||
// Else, not alright, we must check for random badness
|
||
/*
|
||
If she fails, she must make a DC 5 Wisdom check to avoid a mishap (see
|
||
Scroll Mishaps, below). A natural roll of 1 always fails, whatever the
|
||
modifiers.
|
||
*/
|
||
// Fail visual
|
||
SMP_ApplyVFX(oCaster, EffectVisualEffect(SMP_VFX_FNF_SPELL_FAIL_HAND));
|
||
|
||
// DC 5 Wisdom Check. A 1 auto-fails.
|
||
int n20 = d20();
|
||
if(GetAbilityScore(oCaster, ABILITY_WISDOM) + n20 <= 5 || n20 == 1)
|
||
{
|
||
SendMessageToPC(oCaster, "Wisdom Ability Check: Fail");
|
||
/*
|
||
Scroll Mishaps: When a mishap occurs, the spell on the scroll has a reversed
|
||
or harmful effect. Possible mishaps are given below.
|
||
|
||
* A surge of uncontrolled magical energy deals 1d6 points of damage per
|
||
spell level to the scroll user.
|
||
* The scroll user suffers some minor but bizarre effect related to the spell
|
||
in some way. Most such effects should last only as long as the original
|
||
spell<6C>s duration, or 2d10 minutes for instantaneous spells.
|
||
* Some innocuous item or items appear in the spell<6C>s area.
|
||
*/
|
||
FloatingTextStringOnCreature("*You failed to cast the spell on the scroll, and a mishap happened!*", oCaster, FALSE);
|
||
location lTarget = GetSpellTargetLocation();
|
||
|
||
// Randomly determine the effects.
|
||
switch(d4())
|
||
{
|
||
// 1: d6 points per spell level of damage to the scroll user.
|
||
case 1:
|
||
{
|
||
// Do damage
|
||
effect eVis = EffectVisualEffect(VFX_IMP_MIRV);
|
||
SMP_ApplyDamageVFXToObject(oCaster, eVis, d6(nScrollLevel));
|
||
}
|
||
break;
|
||
// 2: Minor but bizarre effect...this case, it is being a visual effect
|
||
case 2:
|
||
{
|
||
effect eDur = EffectVisualEffect(SMP_VFX_DUR_SCROLL_MISHAP);
|
||
float fDuration = SMP_GetRandomDuration(SMP_MINUTES, 10, 2, FALSE);
|
||
SMP_ApplyDuration(oCaster, eDur, fDuration);
|
||
}
|
||
break;
|
||
// "Some innocuous item or items appear in the spell<6C>s area."
|
||
case 3:
|
||
{
|
||
// Create some stuff there.
|
||
|
||
}
|
||
break;
|
||
// Some bizarre visual effect at the spells location
|
||
case 4:
|
||
{
|
||
effect eImpact = EffectVisualEffect(SMP_VFX_FNF_SCROLL_MISHAP);
|
||
SMP_ApplyLocationVFX(lTarget, eImpact);
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Passed, but cannot use the scroll still!
|
||
SendMessageToPC(oCaster, "Wisdom Ability Check: Pass");
|
||
FloatingTextStringOnCreature("*You failed to cast the spell on the scroll, but no mishap happens*", oCaster, FALSE);
|
||
|
||
// Not good. something bad happened. Stop the spell.
|
||
return FALSE;
|
||
}
|
||
|
||
// Returns the level of the spell on the scroll
|
||
int SMP_GetSpellScrollLevel(object oScroll)
|
||
{
|
||
// Check item properties
|
||
itemproperty IP_Check = GetFirstItemProperty(oScroll);
|
||
while(GetIsItemPropertyValid(IP_Check))
|
||
{
|
||
// Check for the spell on the scroll.
|
||
if(GetItemPropertyType(IP_Check) == ITEM_PROPERTY_CAST_SPELL)
|
||
{
|
||
// only one property for each scroll. First one, return the level.
|
||
// Get it from the 2da file.
|
||
return SMP_ArrayItemCasterLevel(GetItemPropertySubType(IP_Check));
|
||
}
|
||
// Next property
|
||
IP_Check = GetNextItemProperty(oScroll);
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
// End of file Debug lines. Uncomment below "/*" with "//" and compile.
|
||
/*
|
||
void main()
|
||
{
|
||
return;
|
||
}
|
||
//*/
|