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.
		
			
				
	
	
		
			169 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//::///////////////////////////////////////////////
 | 
						|
//:: Name     Avascular Mass
 | 
						|
//:: FileName   sp_avas_mass.nss
 | 
						|
//:: Copyright (c) 2001 Bioware Corp.
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
/*Avascular Mass
 | 
						|
  Necromancy [Death, Evil]
 | 
						|
  Sorc/Wizard 8
 | 
						|
  Range: Close
 | 
						|
  Saving Throw: Fortitude partial and Reflex negates
 | 
						|
  Spell Resistance: yes
 | 
						|
 | 
						|
  You shoot a ray of necromantic energy from your outstretched 
 | 
						|
  hand, causing any living creature struck by the ray to violently 
 | 
						|
  purge blood vessels through its skin. You must succeed 
 | 
						|
  on a ranged touch attack to affect the subject. If successful, the 
 | 
						|
  subject is reduced to half of its current hit points (rounded down) 
 | 
						|
  and stunned for 1 round. On a successful Fortitude saving throw the 
 | 
						|
  subject is not stunned.
 | 
						|
  
 | 
						|
  Also, the purged blood vessels are magically animated, creating a many
 | 
						|
  layered mass of magically strong, adhesive tissue that traps those caught
 | 
						|
  in it... Creatures caught within a 20 foot radius become entangled unless 
 | 
						|
  the succeed on a Reflex save. The original target of the spell is automatically 
 | 
						|
  entangled.
 | 
						|
 | 
						|
  The entangled creature takes a -2 penalty on attack rolls, -4 to effective Dex, 
 | 
						|
  and can't move. An entangled character that attempts to cast a spell must succeed 
 | 
						|
  in a concentration check. Because the avascular mass is magically animate, and 
 | 
						|
  gradually tightens on those it holds, the Concentration check DC is 30...Once loose,
 | 
						|
  a creature may progress through the writhing blood vessels very slowly.  
 | 
						|
 | 
						|
  Spell is modeled after Entanglement, using three seperate scripts.
 | 
						|
*/
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//:: Created By: Tenjac
 | 
						|
//:: Created On: 10/05/05
 | 
						|
//:://////////////////////////////////////////////
 | 
						|
//::Added hold ray functionality - HackyKid
 | 
						|
 | 
						|
 | 
						|
#include "prc_inc_sp_tch"
 | 
						|
#include "prc_sp_func"
 | 
						|
#include "prc_add_spell_dc"
 | 
						|
 | 
						|
//Implements the spell impact, put code here
 | 
						|
//  if called in many places, return TRUE if
 | 
						|
//  stored charges should be decreased
 | 
						|
//  eg. touch attack hits
 | 
						|
//
 | 
						|
//  Variables passed may be changed if necessary
 | 
						|
int DoSpell(object oCaster, object oTarget, int nCasterLevel, int nEvent)
 | 
						|
{
 | 
						|
	int nMetaMagic = PRCGetMetaMagicFeat();
 | 
						|
	int nSaveDC = PRCGetSaveDC(oTarget, oCaster);
 | 
						|
	int nPenetr = nCasterLevel + SPGetPenetr();
 | 
						|
	int nHP = GetCurrentHitPoints(oTarget);
 | 
						|
	effect eHold = EffectEntangle();
 | 
						|
	effect eSlow = EffectSlow();
 | 
						|
	
 | 
						|
	PRCSignalSpellEvent(oTarget, TRUE, SPELL_AVASCULAR_MASS, oCaster);
 | 
						|
	
 | 
						|
	//temporary VFX
 | 
						|
	
 | 
						|
	effect eLink = EffectVisualEffect(VFX_DUR_ENTANGLE);
 | 
						|
	
 | 
						|
	//damage rounds up
 | 
						|
	int nDam = (nHP - (nHP / 2));
 | 
						|
	effect eDam = PRCEffectDamage(oTarget, nDam, DAMAGE_TYPE_MAGICAL);
 | 
						|
	
 | 
						|
	
 | 
						|
	//Blood gush
 | 
						|
	effect eBlood = EffectVisualEffect(VFX_COM_BLOOD_LRG_RED);
 | 
						|
	
 | 
						|
	//Make touch attack
 | 
						|
	int iAttackRoll= PRCDoRangedTouchAttack(oTarget);
 | 
						|
	
 | 
						|
	// Do attack beam VFX. Ornedan is my hero. 
 | 
						|
	ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectBeam(VFX_BEAM_EVIL, oCaster, BODY_NODE_HAND, !iAttackRoll), oTarget, 1.0f); 
 | 
						|
	
 | 
						|
	if (iAttackRoll)
 | 
						|
	{	
 | 
						|
		//Spell Resistance & Living Check
 | 
						|
		if (!PRCDoResistSpell(OBJECT_SELF, oTarget, nPenetr) && PRCGetIsAliveCreature(oTarget))
 | 
						|
		{
 | 
						|
			SPApplyEffectToObject(DURATION_TYPE_INSTANT, eDam, oTarget);
 | 
						|
			SPApplyEffectToObject(DURATION_TYPE_INSTANT, eBlood, oTarget);
 | 
						|
			
 | 
						|
			
 | 
						|
			//Apply AoE writing blood vessel VFX centered on oTarget
 | 
						|
			//ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eMass, lLocation, fDuration);
 | 
						|
			
 | 
						|
			//Orignial target automatically entangled
 | 
						|
			SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, RoundsToSeconds(2),FALSE);
 | 
						|
			
 | 
						|
			//Fortitude Save for Stun
 | 
						|
			if (!PRCMySavingThrow(SAVING_THROW_FORT, oTarget, nSaveDC, SAVING_THROW_TYPE_EVIL))
 | 
						|
			{
 | 
						|
				effect eStun = EffectStunned();
 | 
						|
				effect eStunVis = EffectVisualEffect(VFX_IMP_STUN);
 | 
						|
				SPApplyEffectToObject(DURATION_TYPE_INSTANT, eStunVis, oTarget);
 | 
						|
				SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eStun, oTarget, RoundsToSeconds(1));
 | 
						|
			}
 | 
						|
			
 | 
						|
			//Declare major variables for Mass including Area of Effect Object
 | 
						|
			effect eAOE = EffectAreaOfEffect(VFX_PER_AVASMASS);
 | 
						|
			location lTarget = PRCGetSpellTargetLocation();
 | 
						|
			
 | 
						|
			int nDuration = 3 + nCasterLevel / 2;
 | 
						|
			
 | 
						|
			//Make sure duration does not equal 0
 | 
						|
			if(nDuration < 1)
 | 
						|
			{
 | 
						|
				nDuration = 1;
 | 
						|
			}
 | 
						|
			//Check Extend metamagic feat
 | 
						|
			if(CheckMetaMagic(nMetaMagic, METAMAGIC_EXTEND))
 | 
						|
			{
 | 
						|
				nDuration = nDuration * 2;    //Duration is +100%
 | 
						|
			}
 | 
						|
			
 | 
						|
			
 | 
						|
			//Create an instance of the AOE Object using the Apply Effect function
 | 
						|
			ApplyEffectAtLocation(DURATION_TYPE_TEMPORARY, eAOE, lTarget, RoundsToSeconds(nDuration));
 | 
						|
			
 | 
						|
			object oAoE = GetAreaOfEffectObject(lTarget, GetAreaOfEffectTag(VFX_PER_AVASMASS));
 | 
						|
			SetAllAoEInts(SPELL_AVASCULAR_MASS, oAoE, PRCGetSpellSaveDC(SPELL_AVASCULAR_MASS, SPELL_SCHOOL_CONJURATION), 0, nCasterLevel);
 | 
						|
			
 | 
						|
			
 | 
						|
			
 | 
						|
			DeleteLocalInt(OBJECT_SELF, "X2_L_LAST_SPELLSCHOOL_VAR");
 | 
						|
			// Getting rid of the local integer storing the spellschool name
 | 
						|
		}
 | 
						|
	}
 | 
						|
	//SPEvilShift(oCaster);
 | 
						|
 | 
						|
	return iAttackRoll;    //return TRUE if spell charges should be decremented
 | 
						|
}
 | 
						|
 | 
						|
void main()
 | 
						|
{
 | 
						|
    object oCaster = OBJECT_SELF;
 | 
						|
    int nCasterLevel = PRCGetCasterLevel(oCaster);
 | 
						|
    PRCSetSchool(GetSpellSchool(PRCGetSpellId()));
 | 
						|
    if (!X2PreSpellCastCode()) return;
 | 
						|
    object oTarget = PRCGetSpellTargetObject();
 | 
						|
    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, nEvent);
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
        if(nEvent & PRC_SPELL_EVENT_ATTACK)
 | 
						|
        {
 | 
						|
            if(DoSpell(oCaster, oTarget, nCasterLevel, nEvent))
 | 
						|
                DecrementSpellCharges(oCaster);
 | 
						|
        }
 | 
						|
    }
 | 
						|
    PRCSetSchool();
 | 
						|
}
 | 
						|
 |