void DoDig(object oPC, location lChest, int iMapLevel, object oMap);
void DoFailDig(object oPC, object oMap, location lTemp);
void DoChest(object oPC, location lTemp, int iMapLevel, object oMap);
void CreatePlaceable(location lTemp, string sResRef, float fDelay);
void CreatePlaceable2(location lTemp, string sResRef, float fDelay, int iMapLevel, object oPC);

void main()
{

  object oPC = OBJECT_SELF;
  if (GetLocalInt(oPC,"iAmDiggingMap")!=0)
   {
    FloatingTextStringOnCreature("You are already digging a treasure map!",oPC,FALSE);
    return;
   }
  object oMapUsed = GetLocalObject(oPC,"oMapUsed");
  if (GetStringLeft(GetResRef(oMapUsed),10)!="_uoa_tmap_")
   {
    FloatingTextStringOnCreature("That is not a decoded treasure map!",oPC,FALSE);
    DeleteLocalObject(oPC,"oMapUsed");
    return;
   }
  SetLocalInt(oPC,"iAmDiggingMap",99);
  AssignCommand(GetArea(oPC),DelayCommand(31.0,DeleteLocalInt(oPC,"iAmDiggingMap")));
  DeleteLocalObject(oPC,"oMapUsed");
  if (GetLocalInt(oMapUsed,"iAmInUse")!=0) return;
  SetLocalInt(oMapUsed,"iAmInUse",99);
  AssignCommand(oMapUsed,DelayCommand(30.1,DeleteLocalInt(oMapUsed,"iAmInUse")));


  //Determine Skills and chances
  int iDigSkill = GetCampaignInt("UOACraft","iDigSkill",oPC);
  int iDigChance=iDigSkill;

  if (iDigChance < 350)
   {
    iDigChance = GetAbilityScore(oPC,ABILITY_STRENGTH)*5;
    iDigChance = iDigChance + (GetAbilityScore(oPC,ABILITY_CONSTITUTION)*3);
    iDigChance = iDigChance + (GetAbilityScore(oPC,ABILITY_DEXTERITY)*2);
    iDigChance = iDigChance*3;
    if (iDigChance >350) iDigChance = 350;
    if (iDigSkill>iDigChance)iDigChance=iDigSkill;
   }
  ////////////////////////////////////////////////////////////////


  int iMapLevel = StringToInt(GetStringRight(GetResRef(oMapUsed),2));
  int iDigChanceNeeded = iMapLevel*100;

  if (iDigChance<iDigChanceNeeded)
   {
    FloatingTextStringOnCreature("You are not skilled enough in digging to unearth this treasure!",oPC,FALSE);
    return;
   }

  string sMapTag = GetTag(oMapUsed);
  string sTemp;
  sMapTag = GetStringRight(sMapTag,GetStringLength(sMapTag)-10);
  sTemp ="0000"+sMapTag;
  sMapTag = GetStringRight(sTemp,4);
  string sMapWaypointTag = "_UOA_TCHEST_NUMBER_"+sMapTag;

  object oMapWaypoint = GetWaypointByTag(sMapWaypointTag);

  if (oMapWaypoint==OBJECT_INVALID)
   {
    SendMessageToPC(oPC,"Chest location not valid!");
    SendMessageToAllDMs(GetName(oPC)+" cannot locate treasure map location do to invalid location: "+sMapWaypointTag);
    return;
   }

  object oPCArea = GetArea(oPC);
  object oMapArea = GetArea(oMapWaypoint);

  if (oPCArea!=oMapArea)
   {
    DoFailDig(oPC,oMapUsed,GetLocation(oPC));
    return;
   }

  location lChestLocation = GetLocation(oMapWaypoint);
  location lPCLocation = GetLocation(oPC);

  float fDistance = GetDistanceBetweenLocations(lChestLocation,lPCLocation);

  AssignCommand(oMapUsed,DelayCommand(0.1,DoDig(oPC,lChestLocation,iMapLevel,oMapUsed)));

}

void DoDig(object oPC, location lChest, int iMapLevel, object oMap)
 {
  object oArea = GetArea(oPC);
  object oTemp;
  location lTemp = GetLocation(oPC);
  int iCanDigChest = 0;
  float fMaxDigDistance = IntToFloat(11-iMapLevel)*1.2;

  if (GetDistanceBetweenLocations(lChest,lTemp)<=fMaxDigDistance) iCanDigChest=99;
  DoFailDig(oPC, oMap, lTemp);
  if (iCanDigChest==99) DoChest(oPC,lTemp,iMapLevel,oMap);
  return;
 }

void DoFailDig(object oPC, object oMap, location lTemp)
 {
  //Digging animation for the hole
  AssignCommand(oPC,DelayCommand(0.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(0.2,PlaySound("as_cv_chiseling1")));
  AssignCommand(oPC,DelayCommand(0.3,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oPC,DelayCommand(0.6,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oPC,DelayCommand(0.9,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oPC,DelayCommand(1.2,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oPC,DelayCommand(1.5,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oPC,DelayCommand(2.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  AssignCommand(oMap,DelayCommand(3.0,CreatePlaceable(lTemp,"_uoa_thole001",13.0)));
  AssignCommand(oPC,DelayCommand(3.2,PlaySound("as_cv_chiseling1")));
  AssignCommand(oPC,DelayCommand(3.3,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oPC,DelayCommand(3.6,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oPC,DelayCommand(4.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(6.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(6.2,PlaySound("as_cv_mineshovl1")));
  AssignCommand(oPC,DelayCommand(8.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(10.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(12.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(12.2,PlaySound("as_cv_mineshovl1")));
  AssignCommand(oPC,DelayCommand(14.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  AssignCommand(oMap,DelayCommand(15.0,CreatePlaceable(lTemp,"uoa_thole_002",1800.0)));
  AssignCommand(oPC,DelayCommand(16.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(18.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(18.2,PlaySound("as_cv_mineshovl1")));
  AssignCommand(oPC,DelayCommand(20.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(22.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(24.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(24.2,PlaySound("as_cv_mineshovl1")));
  AssignCommand(oPC,DelayCommand(26.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_MID,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(28.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  AssignCommand(oPC,DelayCommand(30.1,ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW,1.0,2.0)));
  return;
 }

void DoChest(object oPC, location lTemp, int iMapLevel, object oMap)
 {
  //Chest Animation for success
  location lTemp2;
  vector vTemp2 = GetPositionFromLocation(lTemp);
  vTemp2.z = vTemp2.z+0.1;
  lTemp2 = Location(GetArea(oPC),vTemp2,GetFacingFromLocation(lTemp));
  AssignCommand(oMap,DelayCommand(24.0,CreatePlaceable(lTemp,"_uoa_unuse_chest",3.5)));
  AssignCommand(oMap,DelayCommand(20.1,PlaySound("as_cv_woodframe1")));
  AssignCommand(oMap,DelayCommand(21.1,PlaySound("as_cv_woodframe1")));
  AssignCommand(oMap,DelayCommand(22.1,PlaySound("as_cv_woodframe2")));
  AssignCommand(oMap,DelayCommand(26.0,CreatePlaceable(lTemp2,"_uoa_unuse_chest",3.5)));
  AssignCommand(oMap,DelayCommand(23.1,PlaySound("as_cv_woodframe2")));
  AssignCommand(oMap,DelayCommand(24.1,PlaySound("as_cv_woodframe1")));
  AssignCommand(oMap,DelayCommand(25.1,PlaySound("as_cv_woodframe2")));
  AssignCommand(oMap,DelayCommand(28.0,CreatePlaceable(lTemp,"_uoa_unuse_ch001",4.5)));
  AssignCommand(oPC,DelayCommand(28.3,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oPC,DelayCommand(28.6,SetFacingPoint(GetPositionFromLocation(lTemp))));
  AssignCommand(oMap,DelayCommand(26.1,PlaySound("as_cv_woodframe1")));
  AssignCommand(oMap,DelayCommand(27.1,PlaySound("as_cv_woodframe2")));
  AssignCommand(oMap,DelayCommand(28.1,PlaySound("as_cv_woodframe2")));
  AssignCommand(oMap,DelayCommand(29.1,PlaySound("as_cv_woodframe1")));
  AssignCommand(oMap,DelayCommand(30.0,CreatePlaceable2(lTemp2,"_uoa_treas_chest",2100.0,iMapLevel,oPC)));
  AssignCommand(oMap,DelayCommand(30.1,PlaySound("as_cv_woodframe2")));
  AssignCommand(oMap,DelayCommand(35.0,DestroyObject(oMap,1.0)));
  return;
 }

void CreatePlaceable(location lTemp, string sResRef, float fDelay)
 {
  object oTemp = CreateObject(OBJECT_TYPE_PLACEABLE,sResRef,lTemp,FALSE);
  if (fDelay!=0.0) DestroyObject(oTemp,fDelay);
  AssignCommand(oTemp,DelayCommand(0.1,PlaySound("as_na_x2iccrmb7")));
  AssignCommand(oTemp,DelayCommand(0.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
  AssignCommand(oTemp,DelayCommand(2.1,PlaySound("as_na_x2iccrmb7")));
  AssignCommand(oTemp,DelayCommand(2.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
  AssignCommand(oTemp,DelayCommand(4.1,PlaySound("as_na_x2iccrmb7")));
  AssignCommand(oTemp,DelayCommand(4.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
  if (GetResRef(oTemp)=="_uoa_thole001")
   {
    AssignCommand(oTemp,DelayCommand(6.1,PlaySound("as_na_x2iccrmb7")));
    AssignCommand(oTemp,DelayCommand(6.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
    AssignCommand(oTemp,DelayCommand(8.1,PlaySound("as_na_x2iccrmb7")));
    AssignCommand(oTemp,DelayCommand(8.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
    AssignCommand(oTemp,DelayCommand(10.1,PlaySound("as_na_x2iccrmb7")));
    AssignCommand(oTemp,DelayCommand(10.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
    AssignCommand(oTemp,DelayCommand(12.1,PlaySound("as_na_x2iccrmb7")));
    AssignCommand(oTemp,DelayCommand(12.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
   }
  if (GetResRef(oTemp)=="uoa_thole_002")
   {
    AssignCommand(oTemp,DelayCommand(6.1,PlaySound("as_na_x2iccrmb7")));
    AssignCommand(oTemp,DelayCommand(6.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
    AssignCommand(oTemp,DelayCommand(8.1,PlaySound("as_na_x2iccrmb7")));
    AssignCommand(oTemp,DelayCommand(8.2,ApplyEffectAtLocation(DURATION_TYPE_INSTANT,EffectVisualEffect(VFX_COM_CHUNK_STONE_SMALL,FALSE),GetLocation(OBJECT_SELF))));
   }
  return;
 }

void CreatePlaceable2(location lTemp, string sResRef, float fDelay, int iMapLevel, object oPC)
 {
  object oTemp = CreateObject(OBJECT_TYPE_PLACEABLE,sResRef,lTemp,FALSE);
  if (fDelay!=0.0) DestroyObject(oTemp,fDelay);
  SetLocalInt(oTemp,"iChestLevel",iMapLevel);
  SetLocalObject(oTemp,"oDiggingPC",oPC);
  SetLocalInt(oTemp,"iAmTrapped",99);
  SetLocalInt(oTemp,"iAmLocked",99);
  AssignCommand(oTemp,ExecuteScript("_map_chst_spawn",oTemp));
  AssignCommand(oTemp,DelayCommand(2.0,ExecuteScript("_open_tchest",oTemp)));
  return;
 }