PRC8/trunk/users/Tenjac/spells/sp_enshield.nss

107 lines
3.8 KiB
Plaintext
Raw Normal View History

//:://////////////////////////////////////////////
//:: Name Energy Shield
//:: FileName sp_enshield.nss
//:://////////////////////////////////////////////
/** @file Abjuration
Level: Paladin 2, Cleric 3
Components: V, S, DF,
Casting Time: 1 Standard Action
Range: Touch
Target: Shield touched
Duration: 1 round/level
Saving Throw: None
Spell Resistance: No
A silver aura surrounds the touched shield for a
moment before it appears to transform into the chosen
type of energy. The shield hums with power.
When this spell is cast, the shield touched appears
to be made entirely out of one type of energy (fire,
cold, electricity, acid, or sonic). Whoever bears the
shield gains resistance 10 against the chosen energy
type. Additionally, if the wielder successfully hits
someone with the shield with a shield bash attack, th
e victim takes 2d6 points of the appropriate energy
damage in addition to the normal shield bash damage.
The energy type must be chosen when the spell is cast
and cannot be changed during the duration of the spell.
The energy resistance overlaps (and does not stack)
with resist elements. A given shield cannot be the
subject of more than one lesser energized shield
or energized shield spell at the same time.
The descriptor of this spell is the same as the
energy type you choose when you cast it.
*/
//:://////////////////////////////////////////////
//:: Created By: Tenjac
//:: Created On: 6/19/2022
//:://////////////////////////////////////////////
#include "prc_sp_func"
#include "prc_add_spell_dc"
#include "prc_inc_fork"
void main()
{
if(!X2PreSpellCastCode()) return;
PRCSetSchool(SPELL_SCHOOL_ABJURATION);
object oPC = OBJECT_SELF;
int nCasterLvl = PRCGetCasterLevel(oPC);
float fDur = RoundsToSeconds(nCasterLvl);
int nMetaMagic = PRCGetMetaMagicFeat();
if(nMetaMagic & METAMAGIC_EXTEND) fDur += fDur;
object oTarget = PRCGetSpellTargetObject();
object oShield = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oTarget);
//Check that this is a shield, if not abort
if(GetIsShield(oShield) == FALSE)
{
SendMessageToPC(OBJECT_SELF, "Target has no equipped shield.");
break;
}
//The type of damage resistance we're choosing
int nDR;
//Get the type by which subradial spell is used to cast
int nSpell = GetSpellId();
if(nSpell == SPELL_ENERGIZED_SHIELD_FIRE)
{
nDR = IP_CONST_DAMAGETYPE_FIRE;
SetLocalInt(oTarget, "EnShieldType", DAMAGE_TYPE_FIRE);
}
if(nSpell == SPELL_ENERGIZED_SHIELD_COLD)
{
nDR = IP_CONST_DAMAGETYPE_COLD;
SetLocalInt(oTarget, "EnShieldType", DAMAGE_TYPE_COLD);
}
if(nSpell == SPELL_ENERGIZED_SHIELD_ELEC)
{
nDR = IP_CONST_DAMAGETYPE_ELECTRICAL;
SetLocalInt(oTarget, "EnShieldType", DAMAGE_TYPE_ELECTRICAL);
}
if(nSpell == SPELL_ENERGIZED_SHIELD_ACID)
{
nDR = IP_CONST_DAMAGETYPE_ACID;
SetLocalInt(oTarget, "EnShieldType", DAMAGE_TYPE_ACID);
}
if(nSpell == SPELL_ENERGIZED_SHIELD_SONIC)
{
nDR = IP_CONST_DAMAGETYPE_SONIC;
SetLocalInt(oTarget, "EnShieldType", DAMAGE_TYPE_SONIC);
}
//Set local int for amount of shield damage on the wielder of the shield
SetLocalInt(oTarget, "EnShieldD6", 2);
//Schedule ints for deletion
DelayCommand(fDur, DeleteLocalInt(oTarget, "EnShieldType"));
DelayCommand(fDur, DeleteLocalInt(oTarget, "EnShieldD6"));
//Add resistance property
IPSafeAddItemProperty(oShield, ItemPropertyDamageResistance(nDR, 10), fDur, X2_IP_ADDPROP_POLICY_KEEP_EXISTING);
PRCSetSchool();
}