////////////////////////////////////////////////////////////////////////////////
// Slave HB
// By Deva Bryson Winblood. 12/28/2003
////////////////////////////////////////////////////////////////////////////////
#include "antistuck_h"

void fnMine(object oMineable)
{ // PURPOSE: Handle the mining of the object
  object oMe=OBJECT_SELF;
  string sID=GetLocalString(oMe,"sTeamID");
  int nP=d100();
  object oItem;
  int nAmt=GetLocalInt(oMineable,"nResAmt");
  string sRes=GetResRef(oMineable);
  AssignCommand(oMe,ClearAllActions());
  AssignCommand(oMe,ActionAttack(oMineable,TRUE));
  AssignCommand(oMineable,PlaySound("as_cv_minepick1"));
  if (sRes=="resgold")
  { // gold
    if (nP<25)
    { // gold mined
      CreateItemOnObject("gold_nugget",oMe,1);
      nAmt=nAmt-1;
      SetLocalInt(oMineable,"nResAmt",nAmt);
      if (nAmt<1) DestroyObject(oMineable);
    } // gold mined
  } // gold
  else if (sRes=="resadm")
  { // adamantine
    if (nP<6)
    { // adamantine mined
      CreateItemOnObject("bar_admant",oMe,1);
      nAmt=nAmt-1;
      SetLocalInt(oMineable,"nResAmt",nAmt);
      if (nAmt<1) DestroyObject(oMineable);
    } // adamantine mined
  } // adamantine
  else if (sRes=="resiron")
  { // iron
    if (nP<10)
    { // iron mined
      CreateItemOnObject("bar_iron",oMe,1);
      nAmt=nAmt-1;
      SetLocalInt(oMineable,"nResAmt",nAmt);
      if (nAmt<1) DestroyObject(oMineable);
    } // iron mined
  } // iron
  else if (sRes=="mithral")
  { // mithral
    if (nP<3)
    { // mithral mined
      CreateItemOnObject("bar_mith",oMe,1);
      nAmt=nAmt-1;
      SetLocalInt(oMineable,"nResAmt",nAmt);
      if (nAmt<1) DestroyObject(oMineable);
    } // mithral mined
  } // mithral
} // fnMine()



void main()
{
   object oMe=OBJECT_SELF;
   object oMaster=GetLocalObject(oMe,"oMaster");
   object oOb;
   int nMode=GetLocalInt(oMe,"nMode");
   object oMod=GetModule();
   float fDist;
   int nC=1;
   string sRes;
   object oMineable=OBJECT_INVALID;
   int nDisableNonEssential=GetLocalInt(oMod,"nDisableNonEssential");
   if (nDisableNonEssential==TRUE) DestroyObject(oMe);
   else
   { // not disabled
   SetAILevel(oMe,AI_LEVEL_NORMAL);
   if (GetIsInCombat(oMe)==FALSE&&IsInConversation(oMe)==FALSE)
   { // not talking or fighting
   switch(nMode)
   { // main ai switch for slaves
     case 0: { // follow master
       if (GetArea(oMe)==GetArea(oMaster))
       { // same area follow
         fDist=GetDistanceBetween(oMe,oMaster);
         if (fDist>14.0)
         { // run
           if (GetCurrentAction(oMe)==ACTION_MOVETOPOINT) AssignCommand(oMe,ClearAllActions());
           AssignCommand(oMe,ASActionMoveToObject(oMaster,TRUE,7.0));
         } // run
         else if (fDist>7.0)
         { // walk
           if (GetCurrentAction(oMe)==ACTION_MOVETOPOINT) AssignCommand(oMe,ClearAllActions());
           AssignCommand(oMe,ASActionMoveToObject(oMaster,FALSE,7.0));
         } // walk
       } // same area follow
       else
       { // master in different area
         AssignCommand(oMe,ASActionMoveToObject(oMaster,TRUE,7.0));
       } // master in different area
       break;
     } // follow master
     case 1: { // stand where you are
       break;
     } // stand where you are
     case 2: { // mine
       oOb=GetNearestObject(OBJECT_TYPE_PLACEABLE,oMe,nC);
       fDist=GetDistanceBetween(oOb,oMe);
       while(oOb!=OBJECT_INVALID&&oMineable==OBJECT_INVALID&&fDist<10.0)
       { // look for mineable object
         sRes=GetResRef(oOb);
         if (sRes=="resgold"||sRes=="resadm"||sRes=="resiron"||sRes=="resmith") oMineable=oOb;
         nC++;
         oOb=GetNearestObject(OBJECT_TYPE_PLACEABLE,oMe,nC);
         fDist=GetDistanceBetween(oOb,oMe);
       } // look for mineable object
       if (oMineable!=OBJECT_INVALID)
       { // something to mine
         fDist=GetDistanceBetween(oMineable,oMe);
         if (fDist>2.0)
         { // move to object
           AssignCommand(oMe,ASActionMoveToObject(oMineable,FALSE,1.0));
         } // move to object
         else
         { // use object
           AssignCommand(oMe,fnMine(oMineable));
         } // use object
       } // something to mine
       break;
     } // mine
   } // main ai switch for slaves
   } // not talking or fighting
  } // not disabled
}