toc/
toc/account/a/
toc/area/backup/
toc/area/imc/
toc/caste/
toc/caste/backup/
toc/clans/
toc/classes/
toc/crash/
toc/gods/
toc/guilds/
toc/lname/s/
toc/maps/backup/
toc/player/a/
toc/src/
toc/system/backup/
toc/tableprog/
//Part of Rafermand Code
/* Treasure system created by Skan with Xerves help -- 1/4/01	*/


#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mud.h"

/* Dummy obj define */

#define DUMMY 1

void do_gem args((CHAR_DATA * ch, char *argument));

bool tchance args((int num));

bool tchance(int num)
{
   if (number_range(1, 100) <= num)
      return TRUE;
   else
      return FALSE;
}

OBJ_DATA *generate_tbox(CHAR_DATA *ch)
{
   BOX_DATA *box;
   OBJ_DATA *tbox;
   OBJ_INDEX_DATA *obj;
   int goldamt;
   int x;
   int lvl;
   int i;

   obj = NULL;

   // Check to see which a box is generated 

   tbox = create_object(get_obj_index(DUMMY), 0);

   x = number_range(1, box_num);
   i = 0;

   for (box = first_box; box; box = box->next)
   {
      i++;
      if (i == x)
      {
         obj = get_obj_index(box->vnum);
         break;
      }
   }

   if (obj == NULL)
   {
      bug("No box was created");
      return NULL;
   }
   else
      tbox = create_object(obj, 1);

   if (IN_WILDERNESS(ch))
   {
      lvl = ch->m1;
      
      if (lvl >0)
      {
         int lckmod;
         goldamt = number_range(50*lvl*lvl, 300*lvl*lvl);
         lckmod = (get_curr_lck(ch) - 14) * 4;
         if (number_range(1, 100) < lckmod)
            goldamt *= number_range(2, 4);
         obj_to_obj(create_money(goldamt), tbox);
      }
   }

   return tbox;
}

OBJ_DATA *generate_treasure(CHAR_DATA * mob)
{
   GEM_DATA *gem;
   OBJ_DATA *treas;
   OBJ_INDEX_DATA *obj;
   int x;
   int i;
   int lckmod;
   int lvl;

   obj = NULL;
   treas = NULL;
   lvl = mob->m1;
   lckmod = (get_curr_lck(mob) - 14) * 4;
   
   lckmod += 8*(lvl-1);


   x = number_range(1, gem_num);
   i = 0;

   for (gem = first_gem; gem; gem = gem->next)
   {
      i++;
      if (i == x)
      {
         obj = get_obj_index(gem->vnum);
         break;
      }
   }

   if (obj == NULL)
   {
      bug("No gems are loaded, using default");
      return create_object(get_obj_index(sysdata.gem_vnum), 1);
   }
   else
   {
      if (gem->rarity >1)
      {
         if (gem->rarity == 2)
         {
            if (tchance(10+lckmod))
               return create_object(obj, 1);
            else
               return create_object(get_obj_index(sysdata.gem_vnum), 1);
         }
         if (gem->rarity == 3)
         {
            if (tchance(lckmod))
               return create_object(obj, 1);
            else
               return create_object(get_obj_index(sysdata.gem_vnum), 1);
         }
         if (gem->rarity == 4)
         {
            if (tchance(lckmod/2))
               return create_object(obj, 1);
            else
               return create_object(get_obj_index(sysdata.gem_vnum), 1);
         }
      }
      return create_object(obj, 1);
   }
   treas = create_object(obj, 1);
   return treas;
}


void do_gem(CHAR_DATA * ch, char *argument)
{
   GEM_DATA *gem;
   char buf[MSL];
   char arg[MIL];
   CHAR_DATA *gemcutter;
   OBJ_DATA *obj;
   int cost;
   OBJ_INDEX_DATA *ogem;

   if (argument[0] == '\0')
   {
      send_to_char("Syntax: gem <list/sell> [item]", ch);
      return;
   }
   argument = one_argument(argument, arg);

   /* Checks for a character in the room with spec_gemcutter set. This special
      procedure must be defined in special.c. You could instead use an
      ACT_GEMCUTTER flag instead of a special procedure. */

   for (gemcutter = ch->in_room->first_person; gemcutter; gemcutter = gemcutter->next_in_room)
   {
      if (!IS_NPC(gemcutter))
         continue;
      if (gemcutter->spec_fun == spec_lookup("spec_gemcutter"))
         break;
   }

   if (!gemcutter)
   {
      send_to_char("You can't do that here.\n\r", ch);
      return;
   }

   if (gemcutter->position == POS_FIGHTING)
   {
      send_to_char("Wait until the fighting stops.\n\r", ch);
      return;
   }

   if (!first_gem)
   {
      send_to_char("No gems exist, tell an immortal!\n\r", ch);
      return;
   }
   if (!str_cmp(arg, "list"))
   {
      for (gem = first_gem; gem; gem = gem->next)
      {
         ogem = get_obj_index(gem->vnum);
         ch_printf(ch, "&G&W%-6d	&c&w%-40s\n\r", ogem->cost, ogem->short_descr);
      }
      send_to_char("If you have a gem to sell me, use gem sell <obj>.\n\r", ch);
      return;
   }
   if (!str_cmp(arg, "sell"))
   {
      if ((obj = get_obj_carry(ch, argument)) == NULL)
      {
         act(AT_TELL, "$n tells you 'You don't have that item.'", gemcutter, NULL, ch, TO_VICT);
         ch->reply = gemcutter;
         return;
      }
      if (!can_drop_obj(ch, obj))
      {
         send_to_char("You can't let go of it!\n\r", ch);
         return;
      }
      /* Prevents giving of special items (rare items) -- Xerves 3/24/98 */
      if (IS_OBJ_STAT(obj, ITEM_NOGIVE))
      {
         send_to_char("Xerves should personally smack you for trying to find a loophole.  Cannot sell this item.\n\r", ch);
         return;
      }
      if (obj->timer > 0)
      {
         act(AT_TELL, "$n tells you, '$p is depreciating in value too quickly...'", gemcutter, obj, ch, TO_VICT);
         return;
      }
      cost = 0;
      for (gem = first_gem; gem; gem = gem->next)
      {
         if (obj->pIndexData->vnum == gem->vnum)
         {
            cost = number_range(gem->cost * .8, gem->cost * 1.2);
            break;
         }
      }

      if (cost <= 0)
      {
         act(AT_ACTION, "$n looks uninterested in $p.", gemcutter, obj, ch, TO_VICT);
         return;
      }

      separate_obj(obj);
      act(AT_ACTION, "$n sells $p.", ch, obj, NULL, TO_ROOM);
      sprintf(buf, "You sell $p for %d gold piece%s.", cost, cost == 1 ? "" : "s");
      act(AT_ACTION, buf, ch, obj, NULL, TO_CHAR);

      ch->gold += cost;
      obj_from_char(obj);
      return;
   }
   do_gem(ch, "");
   return;
}