/*
* Butcher Skill By TAKA
* I like the idea of steaks i saw this idea possibly in a snippet
* released by someone else!
*/
void do_butcher(CHAR_DATA *ch, char *argument)
{
/* If you have an interest in this skill, feel free */
/* to use it in your mud if you so desire. */
char buf[MSL];
char arg1[MSL];
int number_of_steaks = 0, sLoop;
OBJ_DATA *steak, *obj, *t_obj, *next_obj;
/* Check if they have the skill butcher */
if(!get_skill(ch,gsn_butcher))
{
printf_to_char(ch, "{RYou do not know how to butcher things!{x\n\r");
return;
}
one_argument(argument, arg1);
/* check if they entered something to butcher */
if(arg1[0]=='\0')
{
printf_to_char(ch, "{RWhat would you like to butcher?{x\n\r");
return;
}
/* check if the corpse is in the room */
obj = get_obj_list( ch, arg1, ch->in_room->contents );
/* If no corpse found */
if ( obj == NULL )
{
printf_to_char(ch, "{RYou do not see that in this room.{x\n\r");
return;
}
/* check item types for corpse PC and disallow it */
if(obj->item_type == ITEM_CORPSE_PC)
{
send_to_char( "{RThe gods would NOT approve.{x\n\r", ch );
return;
}
/* check item types for corpse NPC */
if(obj->item_type != ITEM_CORPSE_NPC)
{
send_to_char( "{RYou can only butcher corpses of NPCs.{x\n\r", ch );
return;
}
steak = create_object( get_obj_index(OBJ_VNUM_STEAK), 0 );
steak->value[0] = ch->level / 2;
steak->value[1] = ch->level;
/* Check the skill roll. */
if(number_percent( ) < get_skill(ch,gsn_butcher))
{
/* Allow 1 to 6 Steaks */
number_of_steaks = dice(1,6);
for(sLoop = 0; sLoop < number_of_steaks; sLoop++)
{
/* Create the steak and place it in the room */
steak = create_object( get_obj_index( OBJ_VNUM_STEAK ), 0 );
obj_to_room( steak, ch->in_room );
}
/* build message to room */
buf[0]='\0';
strcat(buf, "$n expertly butchers a corpse and creates ");
if(number_of_steaks < 2)
strcat(buf, "a steak");
else
strcat(buf, "some steaks");
act( buf, ch, NULL, NULL, TO_ROOM );
/* message to butcher */
printf_to_char(ch, "You butcher the corpse and create %s %s\n\r",
number_of_steaks == 1 ? "a" : number_of_steaks == 2 ? "two" : number_of_steaks == 3 ? "three" :
number_of_steaks == 4 ? "four" : number_of_steaks == 5 ? "five" : "six",
number_of_steaks < 2 ? "steak" : "steaks");
}
else
{
/* if failed */
act( "$n destroys a corpse with $s knife.", ch, NULL, NULL, TO_ROOM );
printf_to_char(ch, "You fail to butcher the corpse!");
}
/* check improvement here */
check_improve(ch,gsn_butcher,TRUE,1);
/* dump items caried */
/* Taken from the original ROM code update.c */
for (t_obj = obj->contains; t_obj != NULL; t_obj = next_obj)
{
next_obj = t_obj->next_content;
obj_from_obj(t_obj);
if (obj->in_obj) /* in another object */
obj_to_obj(t_obj,obj->in_obj);
else if (obj->carried_by) /* carried */
if (obj->wear_loc == WEAR_FLOAT)
if (obj->carried_by->in_room == NULL)
extract_obj(t_obj);
else
obj_to_room(t_obj,obj->carried_by->in_room);
else
obj_to_char(t_obj,obj->carried_by);
else if (obj->in_room == NULL) /* destroy it */
extract_obj(t_obj);
else /* to a room */
obj_to_room(t_obj,obj->in_room);
}
/* Now remove the corpse */
extract_obj(obj);
return;
}