Taint Fluid - Thief poisoning skill This is a skill used mainly toward pkill on Dibrova, but can be used for mobs as well. It allows a thief that is carrying a liquid container that is poisoned to slip that poison into someone else's canteen, virtually undetected. As it works now, this code only allows drink containers to be poisoned but there is no reason why fountains and/or other objs that might contain liquids can't be added. So - here it is: *In spells.h, define your skill: (taint fluid was the 100th skill added to Dibrova, your number might be less than that depending how many skills you've already added to your mud) #define SKILL_TAINT_FLUID 100 /* Thief skill to poison liquids */ *In class.c, give thieves the skill (change the level if you like): abil_level(ABT_SKILL, SKILL_TAINT_FLUID, CLASS_THIEF, 105); *In spell_parser.c, add your skillo: (just look for 'End of skills') + "taint fluid", /* End of skills */ "\n" }; *In interpreter.c, add do_taint to the command interpreter: ACMD(do_taint); { "taint" , POS_STANDING, do_taint , 0, 0 }, *In act.item.c, the meat 'n' potatoes of the skill: ACMD(do_taint) { struct obj_data *target, *source, *next_obj; struct char_data *vict; int percent, prob; two_arguments(argument, arg, buf); if (!GET_SKILL(ch, SKILL_TAINT_FLUID)) { send_to_char("You don't know how!\r\n", ch); return; } if (!*arg) { send_to_char("Who's fluid do you want to taint?\r\n", ch); return; } if (!(vict = get_char_room_vis(ch, arg))) { send_to_char("Your victim does not seem to be in the room.\r\n", ch); return; } if (!*buf) { sprintf(buf2, "Which item of %s's do you wish to taint?\r\n", GET_NAME(vict) ); send_to_char(buf2, ch); return; } if (!(target = get_obj_in_list_vis(vict, buf, vict->carrying))) { sprintf(buf2, "%s doesn't have one of those.\r\n", GET_NAME(vict)); send_to_char(buf2, ch); return; } for (target = vict->carrying; target; target = next_obj) { next_obj = target->next_content; if (CAN_SEE_OBJ(ch, target) && GET_OBJ_TYPE(target) == ITEM_DRINKCON) { if (GET_OBJ_VAL(target, 1) <= 0) { sprintf(buf2, "Drat! %s's %s is currently empty. You'll wait until it ge ts filled up.\r\n", GET_NAME(vict), target->short_description); send_to_char(buf2, ch); return; } if (GET_OBJ_VAL(target, 3)) { sprintf(buf2, "The contents of %s are already poisoned.\r\nLooks like so meone else already beat you to it!\r\n", target->short_description); send_to_char(buf2, ch); return; } percent = number(1, 110); prob = GET_SKILL(ch, SKILL_TAINT_FLUID); for (source = ch->carrying; source; source = next_obj) { next_obj = source->next_content; if (CAN_SEE_OBJ(ch, source) && GET_OBJ_TYPE(source) == ITEM_DRINKCON) { if (GET_OBJ_VAL(source, 3) <= 0) { send_to_char("How can you poison something with liquid that isn't po isoned?!\r\n", ch); return; } if (GET_OBJ_VAL(source, 3) >= 1 && percent < prob) { sprintf(buf2, "\r\nYou unobtrusively slip the contents of %s into %s 's %s.\r\n", source->short_description, GET_NAME(vict), target->s hort_description); send_to_char(buf2, ch); GET_OBJ_VAL(target, 3)++; GET_OBJ_VAL(source, 1) = 0; sprintf(buf2, "\r\n%s gives you a little wink and a chuckle and turn s away.\r\n", GET_NAME(ch)); send_to_char(buf2, vict); act("$n gives a little smirk as $e brushes up against $N.", FALSE, ch, 0, vict, TO_NOTVICT); return; } send_to_char("Uh oh. Looks like you've been caught!\r\n", ch); act("$n just tried to poison your $p!", FALSE, ch, target, 0, TO_VICT) ; act("$n just tried to poison $N's $p!", FALSE, ch, target, vict, TO_NO TVICT); WAIT_STATE(ch, 10); return; } } send_to_char("You have nothing in your inventory which could be used to po ison.\r\n", ch); return; } } } That should be it. Any questions or problems, feel free to visit dibrova.thevedic.net 5150 and ask for Kaan. If I'm not on, just send a mudmail.