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.
		
			
				
	
	
		
			161 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*:://////////////////////////////////////////////
 | 
						||
//:: Spell Name Meteor Swarm
 | 
						||
//:: Spell FileName PHS_S_MeteorSwrm
 | 
						||
//:://////////////////////////////////////////////
 | 
						||
//:: In Game Spell desctiption
 | 
						||
//:://////////////////////////////////////////////
 | 
						||
    Evocation [Fire]
 | 
						||
    Level: Sor/Wiz 9
 | 
						||
    Components: V, S
 | 
						||
    Casting Time: 1 standard action
 | 
						||
    Range: Long (40M)
 | 
						||
    Area: Four 13.33-M.-radius spreads; see text
 | 
						||
    Duration: Instantaneous
 | 
						||
    Saving Throw: None or Reflex half; see text
 | 
						||
    Spell Resistance: Yes
 | 
						||
 | 
						||
    Meteor swarm is a very powerful and spectacular spell that is similar to
 | 
						||
    fireball in many aspects. When you cast it, four flaming spheres spring from
 | 
						||
    your outstretched hand and streak in straight lines to the spots you select.
 | 
						||
    The meteor spheres leave a fiery trail of sparks.
 | 
						||
 | 
						||
    Once cast, the other flaming spheres will be targeted at 3 different targets
 | 
						||
    other then the target selected (if one is valid), in a 10-M radius sphere.
 | 
						||
 | 
						||
    If you aim a sphere at a specific creature, you may make a ranged touch
 | 
						||
    attack to strike the target with the meteor. Any creature struck by one of
 | 
						||
    these spheres takes 2d6 points of bludgeoning damage (no save) and receives
 | 
						||
    no saving throw against the sphere’s fire damage (see below). If a targeted
 | 
						||
    sphere misses its target, it simply explodes at the location of the target.
 | 
						||
 | 
						||
    Once a sphere reaches its destination, it explodes in a 13.33-meter-radius
 | 
						||
    spread, dealing 6d6 points of fire damage to each creature in the area. If
 | 
						||
    a creature is within the area of more than one sphere, it must save
 | 
						||
    separately against each. (Fire resistance applies to each sphere’s damage
 | 
						||
    individually.)
 | 
						||
//:://////////////////////////////////////////////
 | 
						||
//:: Spell Effects Applied / Notes
 | 
						||
//:://////////////////////////////////////////////
 | 
						||
    Ok:
 | 
						||
 | 
						||
    - We target one, and it explodes as normal, if a target is selected,
 | 
						||
      it won't be targeted by another.
 | 
						||
    - Then, 3 other "missiles" may be fired, up to 3, as long as it isn't us,
 | 
						||
      or the target just targeted.
 | 
						||
//:://////////////////////////////////////////////
 | 
						||
//:: Created By: Jasperre
 | 
						||
//::////////////////////////////////////////////*/
 | 
						||
 | 
						||
#include "PHS_INC_SPELLS"
 | 
						||
 | 
						||
// Constant used just in this spell
 | 
						||
const string PHS_METEOR_SWARM_ONLY_BLAST = "PHS_METEOR_SWARM_ONLY_BLAST";
 | 
						||
 | 
						||
void main()
 | 
						||
{
 | 
						||
    // Spell hook check
 | 
						||
    if(!PHS_SpellHookCheck(PHS_SPELL_METEOR_SWARM)) return;
 | 
						||
 | 
						||
    // Declare major variables
 | 
						||
    object oCaster = OBJECT_SELF;
 | 
						||
    object oSpellTarget = GetSpellTargetObject();
 | 
						||
    object oTarget;
 | 
						||
    location lTarget = GetSpellTargetLocation();
 | 
						||
    int nSpellSaveDC = PHS_GetSpellSaveDC(); // Special - see below
 | 
						||
    int nDam;
 | 
						||
    float fDelay;
 | 
						||
    // Compared to those in loop. If any == oTargetHit, no save!
 | 
						||
    object oTargetHit;
 | 
						||
 | 
						||
    // The old (and proper) stored DC is used if nOnlyBlast is > 0
 | 
						||
    // It is stored to it (onyl one variable needed then)
 | 
						||
    int nOnlyBlast = GetLocalInt(oCaster, PHS_METEOR_SWARM_ONLY_BLAST);
 | 
						||
    if(nOnlyBlast > 0)
 | 
						||
    {
 | 
						||
        nSpellSaveDC = nOnlyBlast;
 | 
						||
    }
 | 
						||
 | 
						||
    // Declare effects
 | 
						||
    effect eImpact = EffectVisualEffect(PHS_VFX_FNF_METEOR_SWARM);
 | 
						||
 | 
						||
    // Apply AOE visual
 | 
						||
    PHS_ApplyLocationVFX(lTarget, eImpact);
 | 
						||
 | 
						||
    // If oTarget is valid, we check if we hit them for extra damage
 | 
						||
    if(GetIsObjectValid(oSpellTarget))
 | 
						||
    {
 | 
						||
        // Make a touch attack
 | 
						||
        if(PHS_SpellTouchAttack(PHS_TOUCH_RANGED, oSpellTarget))
 | 
						||
        {
 | 
						||
            // Do some bludgeoning damage to this target
 | 
						||
            nDam = PHS_MaximizeOrEmpower(6, 2, FALSE);
 | 
						||
            // No delay to this damage as it should be the impact of the spell!
 | 
						||
            PHS_ApplyDamageToObject(oSpellTarget, nDam, DAMAGE_TYPE_BLUDGEONING);
 | 
						||
            // This target now gets no save against this blast!
 | 
						||
            oTargetHit = oSpellTarget;
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    // Always do damage for this script - the integer below specifices if we
 | 
						||
    // do more targets with it. Target all objects that can be damaged in 40ft radius.
 | 
						||
    oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 13.33, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
 | 
						||
    while(GetIsObjectValid(oTarget))
 | 
						||
    {
 | 
						||
        // PvP Check
 | 
						||
        if(!GetIsReactionTypeFriendly(oTarget, oCaster))
 | 
						||
        {
 | 
						||
            //Fire cast spell at event for the specified target
 | 
						||
            PHS_SignalSpellCastAt(oTarget, PHS_SPELL_METEOR_SWARM);
 | 
						||
 | 
						||
            //Get the distance between the explosion and the target to calculate delay
 | 
						||
            fDelay = GetDistanceBetweenLocations(lTarget, GetLocation(oTarget))/20;
 | 
						||
 | 
						||
            // Spell resistance And immunity checking.
 | 
						||
            if(!PHS_SpellResistanceCheck(oCaster, oTarget, fDelay))
 | 
						||
            {
 | 
						||
                // Roll damage for each target - 6d6
 | 
						||
                nDam = PHS_MaximizeOrEmpower(6, 6, FALSE);
 | 
						||
 | 
						||
                // Only do reflex save if not hit
 | 
						||
                if(oTarget != oTargetHit)
 | 
						||
                {
 | 
						||
                    // Adjust the damage based on the Reflex Save, Evasion and Improved Evasion.
 | 
						||
                    nDam = PHS_GetAdjustedDamage(SAVING_THROW_REFLEX, nDam, oTarget, nSpellSaveDC, SAVING_THROW_TYPE_FIRE);
 | 
						||
                }
 | 
						||
                // Need to do damage to apply visuals
 | 
						||
                if(nDam > 0)
 | 
						||
                {
 | 
						||
                    // Apply effects to the currently selected target.
 | 
						||
                    DelayCommand(fDelay, PHS_ApplyDamageToObject(oTarget, nDam, DAMAGE_TYPE_FIRE));
 | 
						||
                }
 | 
						||
            }
 | 
						||
        }
 | 
						||
        // Get next target
 | 
						||
        oTarget = GetNextObjectInShape(SHAPE_SPHERE, 13.33, lTarget, TRUE, OBJECT_TYPE_CREATURE | OBJECT_TYPE_DOOR | OBJECT_TYPE_PLACEABLE);
 | 
						||
    }
 | 
						||
 | 
						||
    // Check if we do more blasts
 | 
						||
    if(!nOnlyBlast) // PHS_METEOR_SWARM_ONLY_BLAST
 | 
						||
    {
 | 
						||
        // Stop what we are doing
 | 
						||
        ClearAllActions();
 | 
						||
        // Set so that the next 3 will only do damage, thats it.
 | 
						||
        SetLocalInt(OBJECT_SELF, PHS_METEOR_SWARM_ONLY_BLAST, nSpellSaveDC);
 | 
						||
        DelayCommand(2.5, DeleteLocalInt(OBJECT_SELF, PHS_METEOR_SWARM_ONLY_BLAST));
 | 
						||
 | 
						||
        // Get the targets
 | 
						||
        int nCnt = 0;
 | 
						||
        oTarget = GetFirstObjectInShape(SHAPE_SPHERE, 10.0, lTarget, TRUE);
 | 
						||
        // Max of 3 more, up to 10M from original location.
 | 
						||
        while(GetIsObjectValid(oTarget) && nCnt <= 3)
 | 
						||
        {
 | 
						||
            if(oTarget != OBJECT_SELF && oTarget != oSpellTarget)
 | 
						||
            {
 | 
						||
                nCnt++;
 | 
						||
                ActionCastSpellAtObject(PHS_SPELL_METEOR_SWARM, oTarget, METAMAGIC_NONE, TRUE, FALSE, PROJECTILE_PATH_TYPE_DEFAULT, TRUE);
 | 
						||
            }
 | 
						||
            oTarget = GetNextObjectInShape(SHAPE_SPHERE, 10.0, lTarget, TRUE);
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |