In mix.cpp
Below void do_herbalism add:
void do_cook( char_data *ch, char *argument)
{
mix_data *m;
OBJ_DATA *container;
OBJ_DATA *obj;
OBJ_DATA *fire;
ROOM_INDEX_DATA *pIndexRoom = ch->in_room;
vn_int vnum_elements[6], vtemp = 0;
sh_int num_elements[6];
int total_elements = 0;
int i;
int chance;
int level;
bool mFound = false;
bool foundfire = false;
for ( fire = pIndexRoom->contents; fire; fire = fire->next_content ) {
if ( fire->pIndexData->vnum == OBJ_VNUM_FIRE ) {
foundfire = true;
break;
}
}
if ( !foundfire ) {
ch->println("There needs to be a fire for you to cook properly.");
return;
}
// see if they know how to cook in the first place
if ( get_skill( ch, gsn_cook ) == 0 )
{
ch->println( "You don't know the first thing about cooking." );
return;
}
if ( IS_NULLSTR( argument ))
{
ch->println( "You must specify a valid pot or pan in which to cook your ingredients." );
return;
}
// start off easy, get the container obj
if (( container = get_obj_carry( ch, argument )) == NULL )
{
ch->println( "You are not carrying that." );
return;
}
// determine if it's a valid container
switch ( container->item_type )
{
default:
{
ch->println( "You can't cook with that." );
return;
}
case ITEM_CAULDRON:
{
ch->println( "You can't cook in a cauldron.\nThose are for making potions." );
return;
}
case ITEM_POT:
case ITEM_PAN:
break;
}
// check for an empty container to crap out at the earliest point
if ( container->contains == NULL )
{
ch->printlnf( "There is nothing in %s.", container->short_descr );
return;
}
// initialize
for ( i = 0; i < 5; i++ )
{
num_elements[i] = 0;
vnum_elements[i] = 0;
}
// main counting loop to catalogue all the items in the container
for ( obj = container->contains; obj; obj = obj->next_content )
{
vtemp = obj->pIndexData->vnum;
for ( i=0; i < 5; i++ )
{
// increment count of elements if same object found
if ( vtemp == vnum_elements[i] )
{
num_elements[i]++;
break;
}
else if ( vnum_elements[i] == 0 )
{
// found a new unique item
vnum_elements[i] = vtemp;
num_elements[i]++;
total_elements++;
break;
}
}
}
// finally catalogued all items in the container, time to sort'em
mix_bsort( vnum_elements, num_elements, 5 );
// time to compare the catalogued contents vs the mixture dbase
// by now, both are sorted by this point for easier comparison
for ( m = mix_list; m; m = m->next )
{
if ( m->type == MIXTYPE_COOKING )
{
for ( i = 0; i < 5; i++ )
{
mFound = false;
if (!( vnum_elements[i] == m->ingredients[i]
&& num_elements[i] == m->ingredients_num[i] ))
{
mFound = false;
break;
}
mFound = true;
}
}
if ( mFound )
break;
}
// if we didn't find a matching mix, ditch all the ingredients
if ( !mFound )
{
ch->println( "You try to combine the ingredients.\nThey yield no useful result." );
empty_container( container );
return;
}
level = UMAX(1, ch->level - (( 5 - modifier_table[m->difficulty].type ) * 3 ));
if ( !IS_IMMORTAL(ch) && level > LEVEL_HERO ){
level = LEVEL_HERO;
}
// VESSEL CHECK ?
// skill check to see if the result will happen or not
chance = (( get_skill( ch, gsn_herbalism ) - m->difficulty ) + ch->modifiers[STAT_IN] );
if ( chance >= number_percent() )
{
OBJ_INDEX_DATA *obj_template;
OBJ_DATA *result;
// success, let's restring
if (( obj_template = get_obj_index( m->vnum_template )) == NULL )
{
ch->printlnf( "Vnum %d is missing for the %s mix, write a note to realm/admin",
m->vnum_template, m->name );
return;
}
result = create_object( obj_template);
replace_string( result->name, m->rname );
replace_string( result->short_descr, m->rshort );
replace_string( result->description, m->rlong );
result->level = ch->level;
result->item_type = m->ritem_type;
result->wear_flags = m->rwear;
for ( i = 1; i < 5; i++ ){
result->value[i] = m->rvalue[i];
}
result->value[0] = level;
ch->printlnf( "You cook the ingredients within %s.\nYou have made %s.",
container->short_descr, m->rshort );
act( "$n busies $mself and cooks some food within $p.", ch, container, NULL, TO_ROOM );
empty_container( container );
obj_to_obj( result, container );
WAIT_STATE( ch, skill_table[gsn_cook].beats );
check_improve( ch, gsn_cook, true, 3 );
}
// failed, create a bad result
else
{
OBJ_INDEX_DATA *obj_template;
OBJ_DATA *result;
if (( obj_template = get_obj_index( number_range( BADMIX_LVNUM, BADMIX_HVNUM ))) == NULL )
{
ch->printlnf( "Vnum %d (between BADMIX_LVNUM and BADMIX_HVNUM) is missing for the %s mix, write a note to realm/admin",
m->vnum_template, m->name );
return;
}
result = create_object( obj_template);
ch->printlnf( "You cook the ingredients within %s and have made %s.",
container->short_descr, m->rshort );
replace_string( result->name, m->rname );
replace_string( result->short_descr, m->rshort );
replace_string( result->description, m->rlong );
result->level= level;
act( "$n busies $mself and cooks some food within $p.", ch, container, NULL, TO_ROOM );
WAIT_STATE( ch, skill_table[gsn_cook].beats );
check_improve( ch, gsn_cook, true, 3 );
empty_container( container );
obj_to_obj( result, container );
}
}