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.
132 lines
4.7 KiB
Plaintext
132 lines
4.7 KiB
Plaintext
//::///////////////////////////////////////////////
|
||
//:: Name Bloodfreeze Arrow
|
||
//:: FileName sp_bldfrz_arrow.nss
|
||
//:://////////////////////////////////////////////
|
||
/**@file Bloodfreeze Arrow
|
||
Transmutation
|
||
Level: Assassin 4, ranger 4, justice of weald and woe 4
|
||
Components: V, M
|
||
Casting Time: 1 swift action
|
||
Range: Long
|
||
Target: One creature
|
||
Duration: Instantaneous
|
||
Saving Throw: Fortitude partial; see text
|
||
Spell Resistance: Yes
|
||
|
||
When you cast this spell, you fire an arrow at the target and transform
|
||
the arrow head into blue ice. In addition to taking normal damage from
|
||
the missile, the target takes 2d6 points of cold damage and is
|
||
paralyzed. A successful Fortitude save negates the paralysis, and
|
||
the target can make a new save each round (at the start of the
|
||
caster’s turn).
|
||
|
||
Material Component: Masterwork arrow or bolt.
|
||
|
||
Author: Tenjac
|
||
Created: 8/22/07
|
||
*/
|
||
//:://////////////////////////////////////////////
|
||
//:://////////////////////////////////////////////
|
||
|
||
void ParaLoop(object oTarget, int nDC, object oPC);
|
||
|
||
#include "prc_inc_spells"
|
||
#include "prc_craft_inc"
|
||
#include "prc_add_spell_dc"
|
||
#include "prc_inc_combat"
|
||
|
||
void main()
|
||
{
|
||
if(!X2PreSpellCastCode()) return;
|
||
|
||
PRCSetSchool(SPELL_SCHOOL_TRANSMUTATION);
|
||
|
||
object oPC = OBJECT_SELF;
|
||
object oTarget = PRCGetSpellTargetObject();
|
||
int nCasterLvl = PRCGetCasterLevel(oPC);
|
||
effect eVis = EffectVisualEffect(VFX_IMP_FROST_S);
|
||
object oWeap = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
|
||
int nType = GetBaseItemType(oWeap);
|
||
object oAmmo;
|
||
|
||
//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;
|
||
}
|
||
|
||
//Normal Attack
|
||
PerformAttack(oTarget, oPC, eVis);
|
||
|
||
//if hit
|
||
if(GetLocalInt(oTarget, "PRCCombat_StruckByAttack"))
|
||
{
|
||
if(!PRCDoResistSpell(oPC, oTarget, nCasterLvl + SPGetPenetr()))
|
||
{
|
||
int nDam = d6(2) + SpellDamagePerDice(oPC, 2);
|
||
ApplyEffectToObject(DURATION_TYPE_INSTANT, PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_COLD), oTarget);
|
||
|
||
int nDC = PRCGetSaveDC(oTarget, oPC);
|
||
|
||
//Save
|
||
if(!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_COLD))
|
||
{
|
||
//Paralyze
|
||
SPApplyEffectToObject(DURATION_TYPE_PERMANENT, EffectParalyze(), oTarget);
|
||
|
||
//Start saving loop
|
||
DelayCommand(RoundsToSeconds(1), ParaLoop(oTarget, nDC, oPC));
|
||
}
|
||
}
|
||
}
|
||
|
||
PRCSetSchool();
|
||
}
|
||
|
||
void ParaLoop(object oTarget, int nDC, object oPC)
|
||
{
|
||
if(PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nDC, SAVING_THROW_TYPE_COLD))
|
||
{
|
||
effect eTest = GetFirstEffect(oTarget);
|
||
while(GetIsEffectValid(eTest))
|
||
{
|
||
if(GetEffectCreator(eTest) == oPC)
|
||
{
|
||
if(GetEffectType(eTest) == EFFECT_TYPE_PARALYZE)
|
||
{
|
||
if(GetEffectSpellId(eTest) == SPELL_BLOODFREEZE_ARROW)
|
||
{
|
||
RemoveEffect(oTarget, eTest);
|
||
}
|
||
}
|
||
}
|
||
eTest = GetNextEffect(oTarget);
|
||
}
|
||
}
|
||
|
||
else DelayCommand(RoundsToSeconds(1), ParaLoop(oTarget, nDC, oPC));
|
||
} |