forage/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"
#include "interp.h"
#include "recycle.h"
#include "tables.h"
#include "thri_look.h"
#include "thri_monsters.h"
#include "thri_forage.h"


/*
            Forage idea:
            'dig' to find an herb
            based on room->herb_type
 */
 
/*          Herb List:

            Parsley
            Basil
            Garlic
            Red Clover
            Rosemary
            Sage
            Thyme
            Pennywort
            Spider Silk
            Feverfew
            Fennel
            Blood Moss
            Vervain
            Ginsing
            Foxglove
            Henbane
            Mugwort
            Mandrake
            Sulfer ash
            Monkshood
            Wormwood
            Hemlock
            Nightshade
            Black Pearl
 */

const struct herbs_type herbs_table[] =
{
/* 0*/{"Green Clover",     VERY_COMMON,          ECOSYSTEM_GRASS},
/* 1*/{"Parsley",          VERY_COMMON,          ECOSYSTEM_FOREST},
/* 2*/{"Basil",            VERY_COMMON,          ECOSYSTEM_GRASS},
/* 3*/{"Garlic",           VERY_COMMON,          ECOSYSTEM_MOUNTIANS},
/* 4*/{"Red Clover",       VERY_COMMON,          ECOSYSTEM_ARID},
/* 5*/{"Rosemary",         VERY_COMMON,          ECOSYSTEM_FOREST},
/* 6*/{"Sage",             VERY_COMMON,          ECOSYSTEM_HILLS},
/* 7*/{"Thyme",            COMMON,               ECOSYSTEM_FOREST},
/* 8*/{"Pennywort",        COMMON,               ECOSYSTEM_CITY},
/* 9*/{"Spider Silk",      COMMON,               ECOSYSTEM_MOUNTIANS},
/*10*/{"Feverfew",         COMMON,               ECOSYSTEM_GRASS},
/*11*/{"Fennel",           COMMON,               ECOSYSTEM_SWAMP},
/*12*/{"Blood Moss",       COMMON,               ECOSYSTEM_SWAMP},
/*13*/{"Vervain",          COMMON,               ECOSYSTEM_ARID},
/*14*/{"Ginsing",          COMMON,               ECOSYSTEM_HILLS},
/*15*/{"Foxglove",         COMMON,               ECOSYSTEM_FOREST},
/*16*/{"Henbane",          UNCOMMON,             ECOSYSTEM_FOREST},
/*17*/{"Mugwort",          UNCOMMON,             ECOSYSTEM_FOREST},
/*18*/{"Mandrake",         RARE,                 ECOSYSTEM_FOREST},
/*19*/{"Sulfer Ash",       UNCOMMON,             ECOSYSTEM_ARID},
/*20*/{"Monkshood",        RARE,                 ECOSYSTEM_FOREST},
/*21*/{"Wormwood",         RARE,                 ECOSYSTEM_GRASS},
/*22*/{"Hemlock",          RARE,                 ECOSYSTEM_FOREST},
/*23*/{"Nightshade",       VERY_RARE,            ECOSYSTEM_FOREST},
/*24*/{"Black Pearl",      VERY_RARE,            ECOSYSTEM_OCEAN},
/*25*/{"Abhaya Wood",      VERY_RARE,            ECOSYSTEM_ARID},
/*26*/{"Adriel Bark",      COMMON,               ECOSYSTEM_ARID},
/*27*/{"Anete Fiber",      VERY_RARE,            ECOSYSTEM_SWAMP},
/*28*/{"Becker's Bark",    VERY_COMMON,          ECOSYSTEM_DESERT},
/*29*/{"Beng Amber",       COMMON,               ECOSYSTEM_HILLS},
/*30*/{"Big Shell",        VERY_RARE,            ECOSYSTEM_MOUNTIANS},
/*31*/{"Buo Fiber",        COMMON,               ECOSYSTEM_GRASS},
/*32*/{"Caprice Seed",     UNCOMMON,             ECOSYSTEM_MOUNTIANS},
/*33*/{"Cuty Shell",       UNCOMMON,             ECOSYSTEM_FOREST},
/*34*/{"Dante Sap",        RARE,                 ECOSYSTEM_SWAMP},
/*35*/{"Dung Resin",       UNCOMMON,             ECOSYSTEM_MOUNTIANS},
/*36*/{"Dzao Fiber",       UNCOMMON,             ECOSYSTEM_HILLS},
/*37*/{"Enola Sap",        UNCOMMON,             ECOSYSTEM_GRASS},
/*38*/{"Fung Resin",       COMMON,               ECOSYSTEM_SNOW},
/*39*/{"Glue Resin",       VERY_RARE,            ECOSYSTEM_SWAMP},
/*40*/{"Gulatch Oil",      VERY_COMMON,          ECOSYSTEM_MOUNTIANS},
/*41*/{"Hash Amber",       VERY_RARE,            ECOSYSTEM_SWAMP},
/*42*/{"Horny Shell",      RARE,                 ECOSYSTEM_SNOW},
/*43*/{"Kachine Wood",     UNCOMMON,             ECOSYSTEM_SWAMP},
/*44*/{"Moon Resin",       COMMON,               ECOSYSTEM_CITY},
/*45*/{"Motega Wood",      COMMON,               ECOSYSTEM_ARID},
/*46*/{"Nita Wood Node",   VERY_RARE,            ECOSYSTEM_SWAMP},
/*47*/{"Oath Bark",        COMMON,               ECOSYSTEM_DESERT},
/*48*/{"Patee Wood Node",  UNCOMMON,             ECOSYSTEM_FOREST},
/*49*/{"Pha Amber",        RARE,                 ECOSYSTEM_SWAMP},
/*50*/{"Pilan Oil",        VERY_COMMON,          ECOSYSTEM_GRASS},
/*51*/{"Sarina Seed",      VERY_COMMON,          ECOSYSTEM_FOREST},
/*52*/{"Saurona Seed",     UNCOMMON,             ECOSYSTEM_CITY},
/*53*/{"Scarth Wood Node", VERY_COMMON,          ECOSYSTEM_SNOW},
/*54*/{"Sha Amber",        COMMON,               ECOSYSTEM_MOUNTIANS},
/*55*/{"Silverweed sap",   COMMON,               ECOSYSTEM_SWAMP},
/*56*/{"Silvio Seed",      UNCOMMON,             ECOSYSTEM_MOUNTIANS},
/*57*/{"Smart Shell",      VERY_COMMON,          ECOSYSTEM_ARID},
/*58*/{"Soo Amber",        VERY_RARE,            ECOSYSTEM_DESERT},
/*59*/{"Splinter Shell",   UNCOMMON,             ECOSYSTEM_HILLS},
/*60*/{"Tama Wood",        RARE,                 ECOSYSTEM_OCEAN},
/*61*/{"Tansy Wood Node",  VERY_COMMON,          ECOSYSTEM_ARID},
/*62*/{"Visc Sap",         VERY_COMMON,          ECOSYSTEM_DESERT},
/*63*/{"Yana Wood Node",   VERY_COMMON,          ECOSYSTEM_DESERT},
/*64*/{"Zun Amber",        UNCOMMON,             ECOSYSTEM_FOREST},
};

const struct ecosystem_type ecosystem_table[] =
{
/* 0 Forest: 1*/{HERB_NIGHTSHADE,
                {HERB_THYME, HERB_FOXGLOVE},
                {HERB_HENBANE, HERB_MUGWORT, HERB_CUTY_SHELL, HERB_SARINA_SEED},
                "Forest Type I"},
/* 1 Forest: 2*/{HERB_MONKSHOOD,
                {HERB_ZUN_AMBER, HERB_PATEE_WOOD_NODE},
                {HERB_PARSLEY, HERB_ROSEMARY, HERB_SARINA_SEED, HERB_HENBANE},
                "Forest Type II"}, 
/* 2 Forest: 3*/{HERB_HEMLOCK,
                {HERB_THYME, HERB_MUGWORT},
                {HERB_HENBANE, HERB_ROSEMARY, HERB_SARINA_SEED, HERB_CUTY_SHELL},
                "Forest Type III"},   
/* 3 Forest: 4*/{HERB_MANDRAKE,
                {HERB_ZUN_AMBER, HERB_MUGWORT},
                {HERB_PARSLEY, HERB_ROSEMARY, HERB_SARINA_SEED, HERB_CUTY_SHELL},
                "Forest Type IV"},         
};

/*
  Prospect Command: Currently an Immortal utlity that tells you the exact life
  of each vein of herbs.
 */
 
void do_prospect (CHAR_DATA * ch, char *argument)
{
          char buf[MSL];
          
          sprintf(buf, "Current Ecosystem: %s\n\r", ecosystem_table[ch->in_room->ecosystem].name);
          stc(buf, ch);
          send_to_char("Type         Life  Name\n\r", ch);
          send_to_char("-------      Life  Name\n\r", ch);
          sprintf(buf, "Rare Herb:   %-3d  %-10s\n\r",
                              ch->in_room->herb_life[2],
                              herbs_table[ecosystem_table[ch->in_room->ecosystem].level_1].name);
          stc(buf, ch);
          sprintf(buf, "Medium Herb: %-3d  %-10s  %-10s\n\r",
                              ch->in_room->herb_life[1],
                              herbs_table[ecosystem_table[ch->in_room->ecosystem].level_2[0]].name,
                              herbs_table[ecosystem_table[ch->in_room->ecosystem].level_2[1]].name);
          stc(buf, ch); 
          sprintf(buf, "Common Herb: %-3d  %-10s  %-10s  %-10s  %-10s\n\r",
                              ch->in_room->herb_life[0],
                              herbs_table[ecosystem_table[ch->in_room->ecosystem].level_3[0]].name, 
                              herbs_table[ecosystem_table[ch->in_room->ecosystem].level_3[1]].name, 
                              herbs_table[ecosystem_table[ch->in_room->ecosystem].level_3[2]].name, 
                              herbs_table[ecosystem_table[ch->in_room->ecosystem].level_3[3]].name);
          stc(buf, ch); 
                   
}
 
/*
   Primary Forage command,
   Uses:
   forage <no argument>          Forages blindly
   forage for <specific>         Attempts to forage for a Specific herb
   forage info <herb>            Displays information on a given herb
   forage ecosystem <ecosystem>  Displays Information on possible herbs in given ecosystem
   forage commonality <num>      Displays all herbs in common with given commonality
 */
 
void do_forage (CHAR_DATA * ch, char *argument)
{
          char buf[MSL];
          char arg1[MAX_INPUT_LENGTH];
          char arg2[MAX_INPUT_LENGTH];
          
          argument = one_argument (argument, arg1);
          argument = one_argument (argument, arg2);


          if (arg1[0] == '\0')
          {
                    OBJ_DATA * obj;
                    send_to_char("You forage a little..\n\r", ch);
                    int chance = number_range(1, 100);
                    int herb;
                    
                    if (chance >= 0 && chance <= 75)
                    {
                              if (ch->in_room->herb_life[0] == 0)
                              {
                                        stc("You cannot find an herb here.\n\r", ch);
                                        return;
                              }
                              herb = ecosystem_table[ch->in_room->ecosystem].level_3[number_range(0, 3)];
                              ch->in_room->herb_life[0]--;
                    }
                    else if (chance >= 76 && chance <= 95)
                    {
                              if (ch->in_room->herb_life[1] == 0)
                              {
                                        stc("You cannot find an herb here.\n\r", ch);
                              }
                              herb = ecosystem_table[ch->in_room->ecosystem].level_2[number_range(0, 1)];
                              ch->in_room->herb_life[1]--;
                    }
                    else
                    {
                              if (ch->in_room->herb_life[2] == 0)
                              {
                                        stc("You cannot find an herb here.\n\r", ch);
                              }
                              herb = ecosystem_table[ch->in_room->ecosystem].level_1;
                              ch->in_room->herb_life[2]--;
                    }
                    
                    
                    
                    obj = create_herb_object(herb);
                    obj_to_char (obj, ch);
                    sprintf(buf, "You have found a %s!\n\r", herbs_table[herb].name);
                    stc(buf, ch);
                    
                    return;
          }
          if (!str_prefix (arg1, "info"))
          {
                    int herb = return_herb_number(arg2);
                    
                    sprintf(buf, "Herb:        %s\n\r", herbs_table[herb].name);
                    stc(buf, ch);
                    sprintf(buf, "Ecosystem:   %s\n\r", return_ecosystem(herbs_table[herb].ecosystem));
                    stc(buf, ch);
                    sprintf(buf, "Commonality: %s\n\r", return_commonality(herbs_table[herb].commonality));
                    stc(buf, ch);
                    return;
          }
          if (!str_prefix (arg1, "ecosystem"))
          {
                    int value;
                    int temp = 0;
                                        
                    if (!is_number (arg2))
                    {
                              stc("Number must be Numeric\n\r", ch);
                              return;
                    }
                    
                    value = atoi (arg2);
                    
                    while (temp != MAX_HERBS)
                    {
                              int temp_herb = herbs_table[temp].ecosystem;
                              if (temp_herb == value)
                              {
                                        sprintf(buf, "%-15s %s\n\r",
                                         herbs_table[temp].name,
                                         return_commonality(herbs_table[temp].commonality));
                                        stc(buf, ch);
                              }
                              temp++;
                    }
                    return;
          }
          if (!str_prefix (arg1, "common"))
          {
                    int value;
                    int temp = 0;
                                        
                    if (!is_number (arg2))
                    {
                              stc("Number must be Numeric\n\r", ch);
                              return;
                    }
                    
                    value = atoi (arg2);
                    
                    while (temp != MAX_HERBS)
                    {
                              int temp_herb = herbs_table[temp].commonality;
                              if (temp_herb == value)
                              {
                                        sprintf(buf, "%-15s\n\r",
                                         herbs_table[temp].name);
                                        stc(buf, ch);
                              }
                              temp++;
                    }
                    return;
          }
          else
          {
                    stc("Error\n\r", ch);
                    return;
          }
          return;
           
}


/*
 * returns the number of given Herb
 */
int return_herb_number(const char *name)
{
          int i;
          
                    for (i = 0; i < MAX_HERBS; i++)
                    {
                              if (herbs_table[i].name == NULL)
                                break;
                              if (LOWER (name[0]) == LOWER (herbs_table[i].name[0])
                                && !str_prefix (name, herbs_table[i].name))
                               return i;
                    }
                    
           return -1;
}

/*
 * Displays commonality of given herb number
 */
char *return_commonality(int x)
{
          
          switch(x)
          {          default:
                     case 1:
                      return "very common";
                      break;
                     case 2:
                      return "common";
                      break;
                     case 3:
                      return "uncommon";
                      break;
                     case 4:
                      return "rare";
                      break;
                     case 5:
                      return "very rare";
                      break;
            }
            return "Error";
}

/*
 * Returns ecosystem name of given herb number
 */
char *return_ecosystem(int x)
{
          
          switch(x)
          {          default:
                     case 1:
                      return "arid";
                      break;
                     case 2:
                      return "forest";
                      break;
                     case 3:
                      return "desert";
                      break;
                     case 4:
                      return "ocean/water";
                      break;
                     case 5:
                      return "mountians";
                      break;
                     case 6:
                      return "hills";
                      break;
                     case 7:
                      return "swamp";
                      break;
                     case 8:
                      return "city/devloped";
                      break;
                     case 9:
                      return "snow/cold";
                      break;
                     case 10:
                      return "grasslands";
                      break;
            }
            return "Error";
}                  
/*
 *          Creates the base Material item.
 *          current item_type = HERB
 */

OBJ_DATA *create_herb_object (int herb)
{
          OBJ_DATA *obj;
          char name_set[MSL];
          char shor_set[MSL];
          char long_set[MSL];
          
          obj = create_object (get_obj_index (OBJ_VNUM_HERB), 0);
          obj->wear_flags =  ITEM_TAKE;
          obj->wear_flags += ITEM_HOLD;

          sprintf(name_set, "herb material %s", herbs_table[herb].name);
          sprintf(shor_set, "a %s", herbs_table[herb].name);
          sprintf(long_set, "a small herb is on the ground here.");
          obj->name         = str_dup (name_set);
          obj->short_descr  = str_dup (shor_set);
          obj->description  = str_dup (long_set);
          obj->value[1]     = herb;
          
          return obj;
}

/*
 * Called from reset_area, attempts to reset herb life/Values
 */
void reset_herbs (ROOM_INDEX_DATA * pRoom)
{
      int rare_total     = number_range(2, 4);
      int medium_total   = number_range(6, 12);
      int common_total   = number_range(15, 30);
      
      pRoom->herb_life[0] = common_total;
      pRoom->herb_life[1] = medium_total;
      pRoom->herb_life[2] = rare_total;
}