//::///////////////////////////////////////////////
//:: Heal
//:: [NW_S0_Heal.nss]
//:: Copyright (c) 2000 Bioware Corp.
//:://////////////////////////////////////////////
//:: Heals the target to full unless they are undead.
//:: If undead they reduced to 1d4 HP.
//:://////////////////////////////////////////////
//:: Created By: Preston Watamaniuk
//:: Created On: Jan 12, 2001
//:://////////////////////////////////////////////
//:: Update Pass By: Preston W, On: Aug 1, 2001

//:: modified by mr_bumpkin Dec 4, 2003 for PRC stuff

//::Added code to maximize for Faith Healing and Blast Infidel
//::Aaon Graywolf - Jan 7, 2004

#include "prc_inc_clsfunc"

void main()
{


  //Declare major variables
  object oTarget = OBJECT_SELF;
  effect eHeal;
  int  nHeal;
  effect eSun = EffectVisualEffect(VFX_IMP_SUNSTRIKE);
  effect eHealVis = EffectVisualEffect(VFX_IMP_HEALING_S);

  effect eRegen = EffectRegenerate(3, 6.0);
  effect eVis = EffectVisualEffect(VFX_IMP_HEAD_NATURE);
  effect eDur = EffectVisualEffect(VFX_DUR_CESSATE_POSITIVE);
  effect eLink = EffectLinkEffects(eRegen, eDur);
         eLink = EffectLinkEffects(eLink, eVis);


  if (!GetHasFeat(FEAT_DRAGONSONG_STRENGTH, OBJECT_SELF))
  {
        FloatingTextStringOnCreature("This ability is tied to your dragons song ability, which has no more uses for today.",OBJECT_SELF); // no more bardsong uses left
        return;
  }

  if (PRCGetHasEffect(EFFECT_TYPE_SILENCE,OBJECT_SELF))
  {
       FloatingTextStrRefOnCreature(85764,OBJECT_SELF); // not useable when silenced
       return;
  }

  if (PRCGetHasEffect(EFFECT_TYPE_DEAF,OBJECT_SELF) && d100(1) <= 20)
  {
      FloatingTextStringOnCreature("Your deafness has caused you to fail.",OBJECT_SELF);
      DecrementRemainingFeatUses(OBJECT_SELF, FEAT_DRAGONSONG_STRENGTH);
      return;
  }

  effect eFNF = EffectVisualEffect(VFX_FNF_LOS_NORMAL_30);
  ApplyEffectAtLocation(DURATION_TYPE_INSTANT, eFNF, GetLocation(OBJECT_SELF));

  RemoveOldSongEffects(OBJECT_SELF,SPELL_DSL_SONG_HEALING);
  RemoveOldSongs(OBJECT_SELF);

  int nEpic = GetHasFeat(FEAT_EPIC_DRAGONSONG_HEALING) ? TRUE:FALSE;
  //Fire cast spell at event for the specified target
  SignalEvent(oTarget, EventSpellCastAt(OBJECT_SELF, SPELL_HEAL, FALSE));

    int nLevel = GetLevelByClass(CLASS_TYPE_DRAGONSONG_LYRIST);

    //Determine spell duration as an integer for later conversion to Rounds, Turns or Hours.
    int nDuration = 10*nLevel;

        //Check to see if the caster has Lasting Impression and increase duration.
    if(GetHasFeat(870))
    {
        nDuration *= 10;
    }

    // lingering song
    if(GetHasFeat(424)) // lingering song
    {
        nDuration += 5;
    }

  //Get first target in shape
  oTarget = GetFirstObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, PRCGetSpellTargetLocation());
  while (GetIsObjectValid(oTarget))
  {

     if(GetIsReactionTypeFriendly(oTarget)|| GetFactionEqual(oTarget))
     {
        //Figure out how much to heal
        nHeal = (nEpic) ? (d8(4) + 2 * nLevel) : (d8(2) + 2 * nLevel); // cure moderate or cure critical (epic)

        //Set the heal effect
        eHeal = EffectHeal(nHeal);
        //Apply the heal effect and the VFX impact
        SPApplyEffectToObject(DURATION_TYPE_INSTANT, eHealVis, oTarget);
        SPApplyEffectToObject(DURATION_TYPE_INSTANT, eHeal, oTarget);

        if (nEpic)
        {
            SPApplyEffectToObject(DURATION_TYPE_TEMPORARY, SupernaturalEffect(eLink), oTarget, RoundsToSeconds(nDuration),FALSE);
            StoreSongRecipient(oTarget, OBJECT_SELF, GetSpellId(), nDuration);
         }
        // Code for FB to remove damage that would be caused at end of Frenzy
        SetLocalInt(oTarget, "PC_Damage", 0);
     }
     //Get next target in the shape
     oTarget = GetNextObjectInShape(SHAPE_SPHERE, RADIUS_SIZE_HUGE, PRCGetSpellTargetLocation());
  }

  DecrementRemainingFeatUses(OBJECT_SELF, FEAT_DRAGONSONG_STRENGTH);

}