// hb - By Deva Bryson Winblood -  heart beat script for wards

object fnNearestEnemy(object oMaster,float fRange=5.0)
{ // PURPOSE: Return nearest enemy within fRange
  object oRet=OBJECT_INVALID;
  object oMe=OBJECT_SELF;
  object oCreature;
  int nN=1;
  oCreature=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oMe,nN);
  while(oRet==OBJECT_INVALID&&oCreature!=OBJECT_INVALID&&GetDistanceBetween(oMe,oCreature)<=fRange)
  { // check each creature
    if (GetIsEnemy(oCreature,oMaster)) oRet=oCreature;
    else
    { // next
      nN++;
      oCreature=GetNearestCreature(CREATURE_TYPE_IS_ALIVE,TRUE,oMe,nN);
    } // next
  } // check each creature
  return oRet;
} // fnNearestEnemy()

void fnWard(object oMaster,float fRange)
{
  object oMe=OBJECT_SELF;
  int nPower=GetLocalInt(oMe,"nPower");
  object oTarget;
  effect eE;
  if (nPower>0)
  { // ward has power
    oTarget=fnNearestEnemy(oMaster,fRange);
    if (oTarget!=OBJECT_INVALID)
    { // target exists
      SetIsTemporaryEnemy(oTarget,oMe,TRUE);
      if (nPower<5)
      { // 1 point spells
        nPower=nPower-1;
        AssignCommand(oMe,ActionCastSpellAtObject(SPELL_ACID_SPLASH,oTarget,METAMAGIC_ANY,TRUE,1,PROJECTILE_PATH_TYPE_DEFAULT,TRUE));
      } // 1 point spells
      else if (nPower<21)
      { // 5 point spells
        nPower=nPower-5;
        AssignCommand(oMe,ActionCastSpellAtObject(SPELL_NEGATIVE_ENERGY_RAY,oTarget,METAMAGIC_ANY,TRUE,2,PROJECTILE_PATH_TYPE_DEFAULT,TRUE));
      } // 5 point spells
      else if (nPower<31)
      { // 10 point spells
        nPower=nPower-10;
        AssignCommand(oMe,ActionCastSpellAtObject(SPELL_MELFS_ACID_ARROW,oTarget,METAMAGIC_ANY,TRUE,3,PROJECTILE_PATH_TYPE_DEFAULT,TRUE));
      } // 10 point spells
      else if (nPower<41)
      { // 15 point spells
        nPower=nPower-15;
        AssignCommand(oMe,ActionCastSpellAtObject(SPELL_FLAME_ARROW,oTarget,METAMAGIC_ANY,TRUE,5,PROJECTILE_PATH_TYPE_DEFAULT,TRUE));
      } // 15 point spells
      else if (nPower<51)
      { // 20 point spells
        nPower=nPower-20;
        AssignCommand(oMe,ActionCastSpellAtObject(SPELL_FEAR,oTarget,METAMAGIC_ANY,TRUE,8,PROJECTILE_PATH_TYPE_DEFAULT,TRUE));
      } // 20 point spells
      else if (nPower<61)
      { // 25 point spells
        nPower=nPower-25;
        AssignCommand(oMe,ActionCastSpellAtObject(SPELL_FIREBRAND,oTarget,METAMAGIC_ANY,TRUE,10,PROJECTILE_PATH_TYPE_DEFAULT,TRUE));
      } // 25 point spells
      else
      { // 30 point spells
        nPower=nPower-30;
        AssignCommand(oMe,ActionCastSpellAtObject(SPELL_ISAACS_GREATER_MISSILE_STORM,oTarget,METAMAGIC_ANY,TRUE,12,PROJECTILE_PATH_TYPE_DEFAULT,TRUE));
      } // 30 point spells
      SetLocalInt(oMe,"nPower",nPower);
    } // target exists
    DelayCommand(4.0,fnWard(oMaster,fRange));
  } // ward has power
  else
  { // despawn
    DestroyObject(oMe);
  } // despawn
} // fnWardMinor()

////////////////////////////////////////////////////////////////////////////////
void main()
{
    object oMe=OBJECT_SELF;
    object oMaster=GetLocalObject(oMe,"oMaster");
    string sTag;
    int nEffect;
    float fRange;
    effect eE;
    if (oMaster!=OBJECT_INVALID)
    { // master exists
      sTag=GetTag(oMe);
      sTag=GetStringRight(sTag,3);
      if (sTag=="d25")
      { // minor
        nEffect=VFX_DUR_PROTECTION_GOOD_MINOR;
        fRange=5.0;
      } // minor
      else if (sTag=="d50")
      { // medium
        nEffect=VFX_DUR_PROTECTION_GOOD_MAJOR;
        fRange=8.0;
      } // medium
      else if (sTag=="100")
      { // major
        nEffect=VFX_DUR_PROTECTION_ELEMENTS;
        fRange=11.0;
      } // major
      eE=EffectVisualEffect(nEffect);
      if (GetNearestCreature(CREATURE_TYPE_PLAYER_CHAR,PLAYER_CHAR_IS_PC,oMe,1)!=OBJECT_INVALID)
               ApplyEffectToObject(DURATION_TYPE_TEMPORARY,eE,oMe,6.1); // player's in area...
      if (GetLocalInt(oMe,"bActivated")==FALSE)
      { // activate
        fnWard(oMaster,fRange);
      } // activate
    } // master exists
    else
    { // despawn
      DestroyObject(oMe);
    } // despawn
}
////////////////////////////////////////////////////////////////////////////////