//::///////////////////////////////////////////////
//:: Name      Mass Fire Shield
//:: FileName  sp_mass_frshld.nss
//:://////////////////////////////////////////////
/**@file Mass Fire Shield
Evocation [Fire or Cold]
Level: Sorcerer/wizard 5, warmage 5
Components: V, S, M
Casting Time: 1 standard action
Range: Close (25 ft. + 5 ft./2 levels)
Targets: One or more allied creatures, no two of which
can be more than 30 ft. apart
Duration: 1 round/level (D)
Save: Will negates (harmless)
Spell Resistance: Yes (harmless)

This spell functions like fire shield (see
page 230 of the Player’s Handbook),
except as noted above.

Author:    Tenjac
Created:   7/6/07
*/
//:://////////////////////////////////////////////
//:://////////////////////////////////////////////

#include "prc_inc_spells"

void main()
{
  PRCSetSchool(SPELL_SCHOOL_EVOCATION);

  if(!X2PreSpellCastCode()) return;

  object oPC = OBJECT_SELF;
  int nCasterLvl = PRCGetCasterLevel(oPC);
  location lLoc = PRCGetSpellTargetLocation();
  int nMetaMagic = PRCGetMetaMagicFeat();
  int nDam = PRCMin(40,nCasterLvl);
  float fDur = RoundsToSeconds(nCasterLvl);
  effect eVis, eShield, eReduce;
  int nSpell = GetSpellId();
  float fRadius = FeetToMeters(15.0);

  //Extend
  if(nMetaMagic & METAMAGIC_EXTEND) fDur += fDur;

  if(nSpell == SPELL_MASS_FIRE_SHIELD_RED)
  {
      eVis = EffectVisualEffect(VFX_DUR_ELEMENTAL_SHIELD);
      eShield = EffectDamageShield(nDam, DAMAGE_BONUS_1d6, ChangedElementalDamage(oPC, DAMAGE_TYPE_FIRE));
      eReduce = EffectDamageImmunityIncrease(DAMAGE_TYPE_COLD, 50);
  }
  else if (nSpell == SPELL_MASS_FIRE_SHIELD_BLUE)
  {
      eVis = EffectVisualEffect(VFX_DUR_CHILL_SHIELD);
      eShield = EffectDamageShield(nDam, DAMAGE_BONUS_1d6, ChangedElementalDamage(oPC, DAMAGE_TYPE_COLD));
      eReduce = EffectDamageImmunityIncrease(DAMAGE_TYPE_FIRE, 50);
  }
  effect eLink = EffectLinkEffects(eShield, eVis);
         eLink = EffectLinkEffects(eLink, eReduce);

  object oTarget = MyFirstObjectInShape(SHAPE_SPHERE, fRadius, lLoc, FALSE, OBJECT_TYPE_CREATURE);
  while(GetIsObjectValid(oTarget))
  {
    if(GetIsFriend(oTarget, oPC))
    {
      SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, eLink, oTarget, fDur, TRUE, nSpell, nCasterLvl);
    }
    oTarget = MyNextObjectInShape(SHAPE_SPHERE, fRadius, lLoc, FALSE, OBJECT_TYPE_CREATURE);
  }
  PRCSetSchool();
}