////////////////////////////////////////////////////////////////////////////////
//
//  Siege Arbalest Light - Initiates Load Sequence
//  os_arm_arbl
//  by Don Anderson
//  dandersonru@msn.com
//
////////////////////////////////////////////////////////////////////////////////

#include "os_inc"

void main()
{
  object oArbalest = OBJECT_SELF;

  int nSelfFaction = GetLocalInt(oArbalest,"FACTION");
  int nLoaded = GetLocalInt(oArbalest,"LOADED");
  location lLoc = GetLocation(oArbalest);

  //Find closest related Switch
  object oSwitch = GetNearestObjectByTag("SiegeSwitch",oArbalest,1);
  float fSDist = GetDistanceToObject(oSwitch);
  if(fSDist > SIEGE_SWITCH) return;

  int nFaction;
  object oTarget;
  object oAcquire;
  string sTarget;

  //Check for Active Fire Mode
  int nFMode = GetLocalInt(oSwitch,"FIREMODE");
  if(nFMode < 1)
  {
    AssignCommand(oArbalest,SpeakString("Light Arbalest standing down!"));
    SetLocalInt(oArbalest,"LOADED",0);
    SetLocalInt(oArbalest,"ACQUIRED",0);
    return;
  }

  //Find a Valid Spear Rack
  object oBSpear = GetNearestObjectByTag("ArbalestSpears",oArbalest,1);
  if(oBSpear != OBJECT_INVALID && nLoaded == 0)
  {
    float fDist = GetDistanceToObject(oBSpear);
    if(fDist <= SIEGE_SUPPLY)
    {
      //Check for Available Spears
      int nSpears = GetLocalInt(oBSpear,"AMMOQTY");
      if(nSpears > 0)
      {
        nSpears--;
        SetLocalInt(oBSpear,"AMMOQTY",nSpears);
        SetLocalInt(oArbalest,"LOADED",1);
        SetLocalInt(oArbalest,"ACQUIRED",0);
      }
      else
      {
        //Destroy Existing and Find Another
        DestroyObject(oBSpear,0.1);
        DelayCommand(1.0,ExecuteScript("os_arm_arbl",oArbalest));
      }
    }
  }
  else
  {
    DelayCommand(1.0,SpeakString("Light Arbalest standing down....no Spears available!"));
    SetLocalInt(oArbalest,"LOADED",0);
    SetLocalInt(oArbalest,"ACQUIRED",0);
    return;
  }

/*******************************************************************************/
//: SIEGE ARBALEST LIGHT

  //Now the ammunition is properly loaded and the firing sequence takes place
  if(GetLocalInt(oArbalest,"LOADED") == 1)
  {
    //Now we look for creatures
    if(GetLocalInt(oArbalest,"ACQUIRED") == 0)
    {
      object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGEARBALEST_LGT, lLoc, TRUE, OBJECT_TYPE_CREATURE);
      while (GetIsObjectValid(oTarget))
      {
        location lType = GetLocation(oTarget);
        string sType = GetTag(oTarget);

        fSDist = GetDistanceToObject(oTarget);
        if(fSDist >= MINRANGE_SIEGEARBALEST_LGT)
        {
          //OK to Fire On?
          if(GetPlotFlag(oTarget) == FALSE)
          {
            nFaction = GetLocalInt(oTarget,"FACTION");
            int nNPCHP = GetCurrentHitPoints(oTarget);
            if(nNPCHP >= 1 && (nFaction != nSelfFaction))
            {
              SetLocalInt(oArbalest,"ACQUIRED",1);
              oAcquire = oTarget;
              break;//Acquired Target
            }
          }
        }
        oTarget = GetNextObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGEARBALEST_LGT, lLoc, TRUE, OBJECT_TYPE_CREATURE);
      }
    }

    //Now we check for Siege Weapons
    if(GetLocalInt(oArbalest,"ACQUIRED") == 0)
    {
      object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGEARBALEST_LGT, lLoc, TRUE, OBJECT_TYPE_PLACEABLE);
      while (GetIsObjectValid(oTarget))
      {
        location lType = GetLocation(oTarget);
        string sType = GetTag(oTarget);

        fSDist = GetDistanceToObject(oTarget);
        if((fSDist >= MINRANGE_SIEGEARBALEST_LGT) &&
          (sType == SIEGEARBALEST_LGT || sType == SIEGEARBALEST_HVY
          || sType == SIEGECATAPULT_LGT || sType == SIEGECATAPULT_HVY
          || sType == SIEGEBRICOLE || sType == SIEGECOUILLARD || sType == SIEGEPERRIERE
          || sType == SIEGEONAGER))
        {
          //OK to Fire On?
          if(GetPlotFlag(oTarget) == FALSE)
          {
            nFaction = GetLocalInt(oTarget,"FACTION");
            int nNPCHP = GetCurrentHitPoints(oTarget);
            if(nNPCHP >= 1 && (nFaction != nSelfFaction))
            {
              SetLocalInt(oArbalest,"ACQUIRED",1);
              oAcquire = oTarget;
              break;//Acquired Target
            }
          }
        }
        oTarget = GetNextObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGEARBALEST_LGT, lLoc, TRUE, OBJECT_TYPE_PLACEABLE);
      }
    }

    //Now we look for doors
    if(GetLocalInt(oArbalest,"ACQUIRED") == 0)
    {
      object oTarget = GetFirstObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGEARBALEST_LGT, lLoc, TRUE, OBJECT_TYPE_DOOR);
      while (GetIsObjectValid(oTarget))
      {
        location lType = GetLocation(oTarget);
        string sType = GetTag(oTarget);

        fSDist = GetDistanceToObject(oTarget);
        if(fSDist >= MINRANGE_SIEGEARBALEST_LGT)
        {
          //OK to Fire On?
          if(GetPlotFlag(oTarget) == FALSE)
          {
            int nNPCHP = GetCurrentHitPoints(oTarget);
            if(nNPCHP >= 1)
            {
              SetLocalInt(oArbalest,"ACQUIRED",1);
              oAcquire = oTarget;
              break;//Acquired Target
            }
          }
        }
        oTarget = GetNextObjectInShape(SHAPE_SPHERE, MAXRANGE_SIEGEARBALEST_LGT, lLoc, TRUE, OBJECT_TYPE_DOOR);
      }
    }
  }

//: SIEGE ARBALEST LIGHT
/*******************************************************************************/

  if(GetLocalInt(oArbalest,"LOADED") == 1)
  {
    //Now we either stand down or range and face the target
    if(GetLocalInt(oArbalest,"ACQUIRED") == 0)
    {
      AssignCommand(oArbalest,DelayCommand(1.0,SpeakString("Light Arbalest standing down....no valid targets!")));
      SetLocalInt(oArbalest,"LOADED",0);
      return;
    }
    else
    {
      sTarget = GetName(oAcquire);
      float fDTarget = GetDistanceToObject(oAcquire);
      SetLocalFloat(oArbalest,"RANGE",fDTarget);

      SetFacingObject(oAcquire);
    }

    //Get Range in Integer Format
    int nDTarget = FloatToInt(GetLocalFloat(oArbalest,"RANGE"));

    //Now we start the Firing Process
    if(GetLocalInt(oArbalest,"LOADED") == 1)
    {
      AssignCommand(oArbalest,DelayCommand(1.0,SpeakString("Light Arbalest has acquired "+ sTarget +" as a Target!")));
      AssignCommand(oArbalest,DelayCommand(3.0,SpeakString("Range: "+ IntToString(nDTarget) +" Meters")));
      AssignCommand(oArbalest,DelayCommand(5.0,SpeakString("Arbalest Spear Ammunition Received!")));
      AssignCommand(oArbalest,DelayCommand(TIME_SIEGEARBALEST_LGT - 10.0,PlaySound("as_cv_ropepully1")));
      AssignCommand(oArbalest,DelayCommand(TIME_SIEGEARBALEST_LGT - 8.0,PlaySound("as_cv_ropecreak2")));
      AssignCommand(oArbalest,DelayCommand(TIME_SIEGEARBALEST_LGT - 6.0,SpeakString("Loaded!")));
      AssignCommand(oArbalest,DelayCommand(TIME_SIEGEARBALEST_LGT - 3.0,SpeakString("Ready!")));
      AssignCommand(oArbalest,DelayCommand(TIME_SIEGEARBALEST_LGT - 0.5,SpeakString("FIRE!")));
      AssignCommand(oArbalest,DelayCommand(TIME_SIEGEARBALEST_LGT,ExecuteScript("os_fire_arb",oArbalest)));
      AssignCommand(oArbalest,DelayCommand(TIME_SIEGEARBALEST_LGT + 10.0,ExecuteScript("os_arm_arbl",oArbalest)));
    }
  }
}