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.
99 lines
3.5 KiB
Plaintext
99 lines
3.5 KiB
Plaintext
//::///////////////////////////////////////////////
|
|
//:: Ray of Frost
|
|
//:: [NW_S0_RayFrost.nss]
|
|
//:: Copyright (c) 2000 Bioware Corp.
|
|
//::///////////////////////////////////////////////
|
|
/*
|
|
Evocation [Cold]
|
|
Level: Sor/Wiz 0
|
|
Components: V, S
|
|
Casting Time: 1 standard action
|
|
Range: Close (25 ft. + 5 ft./2 levels)
|
|
Effect: Ray
|
|
Duration: Instantaneous
|
|
Saving Throw: None
|
|
Spell Resistance: Yes
|
|
|
|
A ray of freezing air and ice projects from your
|
|
pointing finger. You must succeed on a ranged
|
|
touch attack with the ray to deal damage to a
|
|
target. The ray deals 1d3 points of cold damage.
|
|
|
|
*/
|
|
//:://////////////////////////////////////////////
|
|
//:: Created By: Preston Watamaniuk
|
|
//:: Created On: feb 4, 2001
|
|
//:://////////////////////////////////////////////
|
|
//:: Bug Fix: Andrew Nobbs, April 17, 2003
|
|
//:: Notes: Took out ranged attack roll.
|
|
//:://////////////////////////////////////////////
|
|
//:: modified by mr_bumpkin Dec 4, 2003 for PRC stuff
|
|
//:: added hold ray functionality - HackyKid
|
|
|
|
#include "prc_inc_sp_tch"
|
|
#include "prc_sp_func"
|
|
|
|
int DoSpell(object oCaster, object oTarget, int nCasterLevel)
|
|
{
|
|
//Declare major variables
|
|
int nPenetr = nCasterLevel + SPGetPenetr();
|
|
int nMetaMagic = PRCGetMetaMagicFeat();
|
|
int EleDmg = ChangedElementalDamage(oCaster, DAMAGE_TYPE_COLD);
|
|
int iAttackRoll = 0;//placeholder
|
|
effect eVis = EffectVisualEffect(VFX_IMP_FROST_S);
|
|
|
|
if(!GetIsReactionTypeFriendly(oTarget))
|
|
{
|
|
//Fire cast spell at event for the specified target
|
|
SignalEvent(oTarget, EventSpellCastAt(oCaster, SPELL_RAY_OF_FROST));
|
|
|
|
iAttackRoll = PRCDoRangedTouchAttack(oTarget);
|
|
if(iAttackRoll > 0)
|
|
{
|
|
//Make SR Check
|
|
if(!PRCDoResistSpell(oCaster, oTarget, nPenetr))
|
|
{
|
|
int nDamage = PRCMaximizeOrEmpower(3, 1, nMetaMagic);
|
|
nDamage += SpellDamagePerDice(oCaster, 1);
|
|
//Apply the VFX impact and damage effect
|
|
SPApplyEffectToObject(DURATION_TYPE_INSTANT, eVis, oTarget);
|
|
|
|
// perform ranged touch attack and apply sneak attack if any exists
|
|
ApplyTouchAttackDamage(oCaster, oTarget, iAttackRoll, nDamage, EleDmg);
|
|
}
|
|
}
|
|
effect eRay = EffectBeam(VFX_BEAM_COLD, oCaster, BODY_NODE_HAND, !iAttackRoll);
|
|
SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eRay, oTarget, 1.7, FALSE);
|
|
}
|
|
return iAttackRoll; //return TRUE if spell charges should be decremented
|
|
}
|
|
|
|
void main()
|
|
{
|
|
if (!X2PreSpellCastCode()) return;
|
|
PRCSetSchool(SPELL_SCHOOL_EVOCATION);
|
|
object oCaster = OBJECT_SELF;
|
|
object oTarget = PRCGetSpellTargetObject();
|
|
int nCasterLevel = PRCGetCasterLevel(oCaster);
|
|
int nEvent = GetLocalInt(oCaster, PRC_SPELL_EVENT); //use bitwise & to extract flags
|
|
if(!nEvent) //normal cast
|
|
{
|
|
if (GetLocalInt(oCaster, PRC_SPELL_HOLD) && GetHasFeat(FEAT_EF_HOLD_RAY, oCaster) && oCaster == oTarget)
|
|
{ //holding the charge, casting spell on self
|
|
SetLocalSpellVariables(oCaster, 1); //change 1 to number of charges
|
|
return;
|
|
}
|
|
if (oCaster != oTarget) //cant target self with this spell, only when holding charge
|
|
DoSpell(oCaster, oTarget, nCasterLevel);
|
|
}
|
|
else
|
|
{
|
|
if(nEvent & PRC_SPELL_EVENT_ATTACK)
|
|
{
|
|
if(DoSpell(oCaster, oTarget, nCasterLevel))
|
|
DecrementSpellCharges(oCaster);
|
|
}
|
|
}
|
|
PRCSetSchool();
|
|
}
|