/////////////////////////////////////////////////////////
//
//  Craftable Natural Resources (CNR) by Festyx
//
//  Name:  cnr_gemdep_ou
//
//  Desc:  When a player uses a mineral deposit,
//         they must be equipped with a gem crafter's
//         chisel. They will dig something up 20% of
//         the time.
//
//  Author: David Bobeck 02Mar03
//
/////////////////////////////////////////////////////////
#include "cnr_config_inc"
#include "cnr_language_inc"

void SpawnNewGemDeposit(string sDepositTag, location locDeposit)
{
  CreateObject(OBJECT_TYPE_PLACEABLE, sDepositTag, locDeposit);
  DestroyObject(OBJECT_SELF);
}

void DoPostChiselingSuccessCheck(object oUser, location locUserAtStart, object oDeposit)
{
  DeleteLocalInt(oDeposit, "CnrStopRapidClicks");

  location locUser = GetLocation(oUser);
  if (locUser != locUserAtStart)
  {
    return;
  }

  object oMineral1 = OBJECT_INVALID;
  object oMineral2 = OBJECT_INVALID;
  object oMineral3 = OBJECT_INVALID;

  // chance of success
  if (cnr_d100(1) <= CNR_FLOAT_GEM_MINING_FIND_FIRST_MINERAL_PERCENTAGE)
  {
    string sDepositTag = GetTag(oDeposit);
    string sMineralTag = GetLocalString(GetModule(), sDepositTag + "_MineralTag");
    if (sMineralTag != "")
    {
      oMineral1 = CreateObject(OBJECT_TYPE_ITEM, sMineralTag, locUser);
      FloatingTextStringOnCreature(CNR_TEXT_YOU_CHISELED_OFF_A + GetName(oMineral1) + "!", oUser);

      if (cnr_d100(1) <= CNR_FLOAT_GEM_MINING_FIND_SECOND_MINERAL_PERCENTAGE)
      {
        oMineral2 = CreateObject(OBJECT_TYPE_ITEM, sMineralTag, locUser);
        FloatingTextStringOnCreature(CNR_TEXT_AND_A_SECOND + GetName(oMineral2) + "!", oUser);
      }

      if (cnr_d100(1) <= CNR_FLOAT_GEM_MINING_FIND_MYSTERY_MINERAL_PERCENTAGE)
      {
        oMineral3 = CreateObject(OBJECT_TYPE_ITEM, "cnrGemMineral000", locUser);
        FloatingTextStringOnCreature(CNR_TEXT_AND_A + GetName(oMineral3) + "!", oUser);
      }

      ActionPickUpItem(oMineral1);

      if (oMineral2 != OBJECT_INVALID)
      {
        ActionPickUpItem(oMineral2);
      }

      if (oMineral3 != OBJECT_INVALID)
      {
        ActionPickUpItem(oMineral3);
      }
    }
  }
  else
  {
    ActionPlayAnimation(ANIMATION_FIREFORGET_PAUSE_SCRATCH_HEAD, 1.0);
    //FloatingTextStringOnCreature("You failed to find anything in the deposit.", oUser);
    string sFloat;
    int nFloat = d6(1);
    if (nFloat == 1)      {sFloat = CNR_TEXT_GEMDEP_MUMBLE_1;}
    else if (nFloat == 2) {sFloat = CNR_TEXT_GEMDEP_MUMBLE_2;}
    else if (nFloat == 3) {sFloat = CNR_TEXT_GEMDEP_MUMBLE_3;}
    else if (nFloat == 4) {sFloat = CNR_TEXT_GEMDEP_MUMBLE_4;}
    else if (nFloat == 5) {sFloat = CNR_TEXT_GEMDEP_MUMBLE_5;}
    else if (nFloat == 6) {sFloat = CNR_TEXT_GEMDEP_MUMBLE_6;}
    DelayCommand(1.0, FloatingTextStringOnCreature(sFloat, oUser));
    DelayCommand(2.0, DoPlaceableObjectAction(oDeposit, PLACEABLE_ACTION_USE));
  }
}

void main()
{
  int bStopRapidClicks = GetLocalInt(OBJECT_SELF, "CnrStopRapidClicks");
  if (bStopRapidClicks == TRUE) return;
  SetLocalInt(OBJECT_SELF, "CnrStopRapidClicks", TRUE);

  object oDeposit = OBJECT_SELF;
  object oUser = GetLastUsedBy();

  int bValidTool = FALSE;
  object oChisel = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oUser);
  if (oChisel != OBJECT_INVALID)
  {
    if (GetTag(oChisel) == "cnrGemChisel")
    {
      bValidTool = TRUE;
    }
  }

  if (bValidTool == FALSE)
  {
    oChisel = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oUser);
    if (oChisel != OBJECT_INVALID)
    {
      if (GetTag(oChisel) == "cnrGemChisel")
      {
        bValidTool = TRUE;
      }
    }
  }

  if (!bValidTool)
  {
    FloatingTextStringOnCreature(CNR_TEXT_YOU_MUST_HOLD_A_CHISEL, oUser);
    SetLocalInt(OBJECT_SELF, "CnrStopRapidClicks", FALSE);
    return;
  }

  // there's a chance the chisel may break
  if (cnr_d100(1) <= CNR_FLOAT_GEM_MINING_CHISEL_BREAKAGE_PERCENTAGE)
  {
    DestroyObject(oChisel);
    FloatingTextStringOnCreature(CNR_TEXT_YOU_HAVE_BROKEN_YOUR_CHISEL, oUser);
    SetLocalInt(OBJECT_SELF, "CnrStopRapidClicks", FALSE);
    return;
  }

  location locDeposit = GetLocation(OBJECT_SELF);
  string sDepositTag = GetTag(OBJECT_SELF);

  // Sometimes the deposit will get used up
  if (cnr_d100(1) <= CNR_FLOAT_GEM_MINING_DEPOSIT_BREAKAGE_PERCENTAGE)
  {
    if (CNR_FLOAT_GEM_MINING_DEPOSIT_RESPAWN_TIME_SECS > 0.0)
    {
      ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectDeath(), OBJECT_SELF);
      object oSpawner = CreateObject(OBJECT_TYPE_PLACEABLE, "cnrobjectspawner", locDeposit);
      AssignCommand(oSpawner, DelayCommand(CNR_FLOAT_GEM_MINING_DEPOSIT_RESPAWN_TIME_SECS, SpawnNewGemDeposit(sDepositTag, locDeposit)));
      DestroyObject(OBJECT_SELF, 0.5); // provide time for death effect
      FloatingTextStringOnCreature(CNR_TEXT_THATS_THE_END_OF_THAT, oUser);
    }
    SetLocalInt(OBJECT_SELF, "CnrStopRapidClicks", FALSE);
    return;
  }

  AssignCommand(oUser, ActionPlayAnimation(ANIMATION_LOOPING_GET_LOW, 1.0, 3.0));
  DelayCommand(1.0, PlaySound("as_cv_chiseling2"));

  location locUser = GetLocation(oUser);
  AssignCommand(oUser, DelayCommand(3.0, DoPostChiselingSuccessCheck(oUser, locUser, oDeposit)));
}