From: Paul Shinn Subject: Butcher! Hehehe... if you can remember, I made an embalmer spec a while back to make bags from corpses. Now, I modified it to make a spec that can make corpses into random edible body parts. ------------------------------------------------------------------------- Hello. This is another corpse modifying spec_proc from me, mendar. To add this spec proc to your mud, add a butcher command to interpreter.c defined as do_not_here, add the proto to spec_assign.c (in assign_mobs()) , as well as the assignment itself to the mobs, and add the rest of the code following the dotted line to the end of spec_procs.c . If you need help in installing this, I can be reached thru the mailing list or within my mud. - mendar telnet://conan.ids.net:4000/ ------------------------------------------------------------------------- #define NUM_BODY_PARTS 5 static char *headers[] = { "the corpse of The ", "the corpse of the ", "the corpse of an ", "the corpse of An ", "the corpse of a ", "the corpse of A ", "the corpse of " }; char *body_part[]= { "an arm of", "a leg of", "a foot of", "a rib of", "a hand of", "\n" }; char *body_word[]= { "arm", "leg", "foot", "rib", "hand", "\n" }; SPECIAL(butcher) { struct obj_data *obj; char loc_buf[MAX_STRING_LENGTH]=""; char loc_buf2[MAX_STRING_LENGTH]=""; int i=0, len=0, total_len=0, done=FALSE, part=0; if(!cmd&&!FIGHTING((struct char_data *)me)) { if(number(1,50)<2) { act("$n says 'Anyone have a corpse for me? I can butcher them " "for food!'", FALSE, me, 0, 0, TO_ROOM); return 1; } return 0; } if(CMD_IS("butcher")) { argument=one_argument(argument,buf); if(strcmp(buf,"corpse")==0) { obj=get_obj_in_list_vis(ch,"corpse",ch->carrying); if(!obj) { act("$N says to you 'Sorry. You don't seem to have" " any corpses.'",FALSE,ch,0,me,TO_CHAR); return TRUE; } if(GET_GOLD(ch)<500) { act("$N says to you 'Sorry. You don't have" " enough gold.'",FALSE,ch,0,me,TO_CHAR); return TRUE; } else { part=number(1,NUM_BODY_PARTS)-1; for (i = 0; (i < 7) || (!done); i++) { len=strlen(headers[i]); if(memcmp(obj->short_description,headers[i],len)==0) { total_len=strlen(obj->short_description); strncpy(loc_buf,obj->short_description+len, total_len-len); free(obj->name); sprintf(loc_buf2,"%s %s",body_word[part],loc_buf); obj->name=str_dup(loc_buf2); sprintf(loc_buf2,"%s %s lies here.", body_part[part],loc_buf); free(obj->description); obj->description=str_dup(loc_buf2); sprintf(loc_buf2,"%s %s",body_part[part],loc_buf); free(obj->short_description); obj->short_description=str_dup(loc_buf2); GET_OBJ_TYPE(obj)=ITEM_FOOD; GET_OBJ_WEAR(obj)=ITEM_WEAR_TAKE; GET_OBJ_VAL(obj,0)=5; /* adjust this for fill */ GET_OBJ_VAL(obj,1)=0; GET_OBJ_VAL(obj,2)=0; GET_OBJ_VAL(obj,3)=0; /* adjust this for poison */ GET_OBJ_WEIGHT(obj)=5; /* adjust this for weight */ GET_OBJ_COST(obj)=500; GET_OBJ_RENT(obj)=100; /* shouldn't be rentable.. unless you make a change to your mud to do so, because corpses have a vnum&rnum of -1 */ GET_OBJ_TIMER(obj)=-1; GET_GOLD(ch)-=1000; done=TRUE; act("$N says to you 'Done! Enjoy your meal!'", FALSE,ch,0,me,TO_CHAR); return 1; } } act("$N says to you 'Sorry, I can't make cuts with" "this.'",FALSE,ch,0,me,TO_CHAR); return 1; } } return 0; /* if it wasn't corpse... it wasn't meant for me... */ } return 0; }