#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;
}