Updated Release Archive. Fixed Mage-killer prereqs. Removed old LETO & ConvoCC related files. Added organized spell scroll store. Fixed Gloura spellbook. Various TLK fixes. Reorganized Repo. Removed invalid user folders. Added DocGen back in.
116 lines
3.4 KiB
Plaintext
116 lines
3.4 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Name Spellslayer Arrow
|
|
//:: FileName sp_spslay_arrow.nss
|
|
//:://////////////////////////////////////////////
|
|
/**@file Spellslayer Arrow
|
|
Transmutation
|
|
Level: Assassin 2, ranger 2
|
|
Components: V, S, M
|
|
Casting Time: 1 swift action
|
|
Range: Long
|
|
Target: One creature
|
|
Duration: Instantaneous
|
|
Saving Throw: None
|
|
Spell Resistance: Yes
|
|
|
|
As you cast this spell, your fire a masterwork or
|
|
magical arrow or bolt, and transform it into a glowing
|
|
missile that destabilizes other forms of magic.In
|
|
addition to dealing normal damage, a spellslayer arrow
|
|
deals an extra 1d4 points of damage for the highest level
|
|
spell currently in effect on the target.
|
|
|
|
Material Component: Masterwork arrow or bolt.
|
|
|
|
Author: Tenjac
|
|
Created:
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:://////////////////////////////////////////////
|
|
|
|
#include "prc_inc_spells"
|
|
#include "prc_craft_inc"
|
|
#include "prc_inc_combat"
|
|
|
|
int GetHighestSpellLevel(object oTarget);
|
|
|
|
void main()
|
|
{
|
|
if(!X2PreSpellCastCode()) return;
|
|
|
|
PRCSetSchool(SPELL_SCHOOL_TRANSMUTATION);
|
|
|
|
object oPC = OBJECT_SELF;
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
int nCasterLvl = PRCGetCasterLevel(oPC);
|
|
object oWeap = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
|
int nType = GetBaseItemType(oWeap);
|
|
object oAmmo;
|
|
int nDam;
|
|
effect eVis;
|
|
|
|
//Has to be a bow of some sort
|
|
if(nType != BASE_ITEM_LONGBOW &&
|
|
nType != BASE_ITEM_SHORTBOW &&
|
|
nType != BASE_ITEM_LIGHTCROSSBOW &&
|
|
nType != BASE_ITEM_HEAVYCROSSBOW)
|
|
{
|
|
PRCSetSchool();
|
|
return;
|
|
}
|
|
|
|
if(nType == BASE_ITEM_LONGBOW || nType == BASE_ITEM_SHORTBOW)
|
|
{
|
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_ARROWS, oPC);
|
|
}
|
|
|
|
else if (nType == BASE_ITEM_LIGHTCROSSBOW || nType == BASE_ITEM_HEAVYCROSSBOW)
|
|
{
|
|
oAmmo = GetItemInSlot(INVENTORY_SLOT_BOLTS, oPC);
|
|
}
|
|
|
|
//Check for Masterwork or magical
|
|
string sMaterial = GetStringLeft(GetTag(oAmmo), 3);
|
|
|
|
if((!(GetMaterialString(StringToInt(sMaterial)) == sMaterial && sMaterial != "000") && !GetIsMagicItem(oAmmo)))
|
|
{
|
|
PRCSetSchool();
|
|
SendMessageToPC(oPC, "Invalid ammo type.");
|
|
return;
|
|
}
|
|
|
|
//The meat
|
|
PerformAttack(oTarget, oPC, eVis);
|
|
|
|
//if hit
|
|
if(GetLocalInt(oTarget, "PRCCombat_StruckByAttack"))
|
|
{
|
|
if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
|
|
{
|
|
int nHighest = GetHighestSpellLevel(oTarget);
|
|
nDam = d4(nHighest);
|
|
nDam += SpellDamagePerDice(oPC, nHighest);
|
|
ApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_MAGICAL), oTarget);
|
|
}
|
|
}
|
|
|
|
PRCSetSchool();
|
|
}
|
|
|
|
int GetHighestSpellLevel(object oTarget)
|
|
{
|
|
effect eTest = GetFirstEffect(oTarget);
|
|
int nMax = 1;
|
|
|
|
while(GetIsEffectValid(eTest))
|
|
{
|
|
int nSpell = GetEffectSpellId(eTest);
|
|
int nSpellLevel = StringToInt(Get2DACache("spells", "Innate", nSpell));
|
|
|
|
if(nSpellLevel > nMax) nMax = nSpellLevel;
|
|
|
|
eTest = GetNextEffect(oTarget);
|
|
}
|
|
|
|
return nMax;
|
|
} |