/* ************************************************************************ * file: act.obj2.c , Implementation of commands. Part of DIKUMUD * * Usage : Commands mainly using objects. * * Copyright (C) 1990, 1991 - see 'license.doc' for complete information. * ************************************************************************* */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include "structs.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" #include "limits.h" /* extern variables */ extern struct str_app_type str_app[]; extern struct room_data *world; extern struct descriptor_data *descriptor_list; extern struct room_data *world; extern char *drinks[]; extern int drink_aff[][3]; /* extern functions */ struct obj_data *get_object_in_equip_vis(struct char_data *ch, char *arg, struct obj_data **equipment, int *j); void weight_change_object(struct obj_data *obj, int weight) { struct obj_data *tmp_obj; struct char_data *tmp_ch; if (obj->in_room != NOWHERE) { GET_OBJ_WEIGHT(obj) += weight; } else if (tmp_ch = obj->carried_by) { obj_from_char(obj); GET_OBJ_WEIGHT(obj) += weight; obj_to_char(obj, tmp_ch); } else if (tmp_obj = obj->in_obj) { obj_from_obj(obj); GET_OBJ_WEIGHT(obj) += weight; obj_to_obj(obj, tmp_obj); } else { log("SYSERR: Unknown attempt to subtract weight from an object."); } } void name_from_drinkcon(struct obj_data *obj) { int i; char *new_name; extern struct obj_data *obj_proto; for (i = 0; (*((obj->name) + i) != ' ') && (*((obj->name) + i) != '\0'); i++) ; if (*((obj->name) + i) == ' ') { new_name = str_dup((obj->name) + i + 1); if (obj->item_number < 0 || obj->name != obj_proto[obj->item_number].name) free(obj->name); obj->name = new_name; } } void name_to_drinkcon(struct obj_data *obj, int type) { char *new_name; extern struct obj_data *obj_proto; extern char *drinknames[]; CREATE(new_name, char, strlen(obj->name) + strlen(drinknames[type]) + 2); sprintf(new_name, "%s %s", drinknames[type], obj->name); if (obj->item_number < 0 || obj->name != obj_proto[obj->item_number].name) free(obj->name); obj->name = new_name; } ACMD(do_drink) { struct obj_data *temp; struct affected_type af; int amount, weight; int on_ground = 0; if (!*argument) { send_to_char("Drink from what?\n\r", ch); return; } one_argument(argument, buf); if (!(temp = get_obj_in_list_vis(ch, buf, ch->carrying))) { if (!(temp = get_obj_in_list_vis(ch, buf, world[ch->in_room].contents))) { act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR); return; } else on_ground = 1; } if ((GET_ITEM_TYPE(temp) != ITEM_DRINKCON) && (GET_ITEM_TYPE(temp) != ITEM_FOUNTAIN)) { act("You can't drink from that!", FALSE, ch, 0, 0, TO_CHAR); return; } if (on_ground && (GET_ITEM_TYPE(temp) == ITEM_DRINKCON)) { send_to_char("You have to be holding that to drink from it.\n\r", ch); return; } if ((GET_COND(ch, DRUNK) > 10) && (GET_COND(ch, THIRST) > 0)) /* The pig is drunk */ { act("You simply fail to reach your mouth!", FALSE, ch, 0, 0, TO_CHAR); act("$n tried to drink but missed $s mouth!", TRUE, ch, 0, 0, TO_ROOM); return; } if ((GET_COND(ch, FULL) > 20) && (GET_COND(ch, THIRST) > 0)) /* Stomach full */ { act("Your stomach can't contain anymore!", FALSE, ch, 0, 0, TO_CHAR); return; } if ((temp->obj_flags.type_flag == ITEM_DRINKCON) || (temp->obj_flags.type_flag == ITEM_FOUNTAIN)) { if (temp->obj_flags.value[1] > 0) /* Not empty */ { if (temp->obj_flags.type_flag != ITEM_FOUNTAIN) { sprintf(buf, "$n drinks %s from $p.", drinks[temp->obj_flags.value[2]]); act(buf, TRUE, ch, temp, 0, TO_ROOM); } sprintf(buf, "You drink the %s.\n\r", drinks[temp->obj_flags.value[2]]); send_to_char(buf, ch); if (drink_aff[temp->obj_flags.value[2]][DRUNK] > 0 ) amount = (25 - GET_COND(ch, THIRST)) / drink_aff[temp->obj_flags.value[2]][DRUNK]; else amount = number(3, 10); amount = MIN(amount, temp->obj_flags.value[1]); /* You can't subtract more than the object weighs */ weight = MIN(amount, temp->obj_flags.weight); weight_change_object(temp, -weight); /* Subtract amount */ gain_condition(ch, DRUNK, (int)((int)drink_aff [temp->obj_flags.value[2]][DRUNK]*amount) / 4); gain_condition(ch, FULL, (int)((int)drink_aff [temp->obj_flags.value[2]][FULL]*amount) / 4); gain_condition(ch, THIRST, (int)((int)drink_aff [temp->obj_flags.value[2]][THIRST]*amount) / 4); if (GET_COND(ch, DRUNK) > 10) act("You feel drunk.", FALSE, ch, 0, 0, TO_CHAR); if (GET_COND(ch, THIRST) > 20) act("You do not feel thirsty.", FALSE, ch, 0, 0, TO_CHAR); if (GET_COND(ch, FULL) > 20) act("You are full.", FALSE, ch, 0, 0, TO_CHAR); if (temp->obj_flags.value[3]) /* The shit was poisoned ! */ { act("Oops, it tasted rather strange!!", FALSE, ch, 0, 0, TO_CHAR); act("$n chokes and utters some strange sounds.", TRUE, ch, 0, 0, TO_ROOM); af.type = SPELL_POISON; af.duration = amount * 3; af.modifier = 0; af.location = APPLY_NONE; af.bitvector = AFF_POISON; affect_join(ch, &af, FALSE, FALSE); } /* empty the container, and no longer poison. */ temp->obj_flags.value[1] -= amount; if (!temp->obj_flags.value[1]) { /* The last bit */ temp->obj_flags.value[2] = 0; temp->obj_flags.value[3] = 0; name_from_drinkcon(temp); } return; } } act("It's empty already.", FALSE, ch, 0, 0, TO_CHAR); return; } ACMD(do_eat) { struct obj_data *temp; struct affected_type af; one_argument(argument, buf); if (!(temp = get_obj_in_list_vis(ch, buf, ch->carrying))) { act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR); return; } if ((temp->obj_flags.type_flag != ITEM_FOOD) && (GET_LEVEL(ch) < LEVEL_GOD)) { act("Your stomach refuses to eat that!?!", FALSE, ch, 0, 0, TO_CHAR); return; } if (GET_COND(ch, FULL) > 20) /* Stomach full */ { act("You are too full to eat more!", FALSE, ch, 0, 0, TO_CHAR); return; } act("$n eats $p.", TRUE, ch, temp, 0, TO_ROOM); act("You eat the $o.", FALSE, ch, temp, 0, TO_CHAR); gain_condition(ch, FULL, temp->obj_flags.value[0]); if (GET_COND(ch, FULL) > 20) act("You are full.", FALSE, ch, 0, 0, TO_CHAR); if (temp->obj_flags.value[3] && (GET_LEVEL(ch) < LEVEL_IMMORT)) /* The shit was poisoned ! */ { act("Oops, it tasted rather strange!!", FALSE, ch, 0, 0, TO_CHAR); act("$n coughs and utters some strange sounds.", FALSE, ch, 0, 0, TO_ROOM); af.type = SPELL_POISON; af.duration = temp->obj_flags.value[0] * 2; af.modifier = 0; af.location = APPLY_NONE; af.bitvector = AFF_POISON; affect_join(ch, &af, FALSE, FALSE); } extract_obj(temp); } ACMD(do_pour) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; struct obj_data *from_obj; struct obj_data *to_obj; int amount; argument_interpreter(argument, arg1, arg2); if (subcmd == SCMD_POUR) { if (!*arg1) /* No arguments */ { act("What do you want to pour from?", FALSE, ch, 0, 0, TO_CHAR); return; } if (!(from_obj = get_obj_in_list_vis(ch, arg1, ch->carrying))) { act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR); return; } if (from_obj->obj_flags.type_flag != ITEM_DRINKCON) { act("You can't pour from that!", FALSE, ch, 0, 0, TO_CHAR); return; } } if (subcmd == SCMD_FILL) { if (!*arg1) /* no arguments */ { send_to_char("What do you want to fill? And what are you filling it from?\n\r", ch); return; } if (!(to_obj = get_obj_in_list_vis(ch, arg1, ch->carrying))) { send_to_char("You can't find it!", ch); return; } if (GET_ITEM_TYPE(to_obj) != ITEM_DRINKCON) { act("You can't fill $p!", FALSE, ch, to_obj, 0, TO_CHAR); return; } if (!*arg2) /* no 2nd argument */ { act("What do you want to fill $p from?", FALSE, ch, to_obj, 0, TO_CHAR); return; } if (!(from_obj = get_obj_in_list_vis(ch, arg2, world[ch->in_room].contents))) { sprintf(buf, "There doesn't seem to be any '%s' here.\n\r", arg2); send_to_char(buf, ch); return; } if (GET_ITEM_TYPE(from_obj) != ITEM_FOUNTAIN) { act("You can't fill something from $p.", FALSE, ch, from_obj, 0, TO_CHAR); return; } } if (from_obj->obj_flags.value[1] == 0) { act("The $p is empty.", FALSE, ch, from_obj, 0, TO_CHAR); return; } if (subcmd == SCMD_POUR) /* pour */ { if (!*arg2) { act("Where do you want it? Out or in what?", FALSE, ch, 0, 0, TO_CHAR); return; } if (!str_cmp(arg2, "out")) { act("$n empties $p.", TRUE, ch, from_obj, 0, TO_ROOM); act("You empty $p.", FALSE, ch, from_obj, 0, TO_CHAR); weight_change_object(from_obj, -from_obj->obj_flags.value[1]); /* Empty */ from_obj->obj_flags.value[1] = 0; from_obj->obj_flags.value[2] = 0; from_obj->obj_flags.value[3] = 0; name_from_drinkcon(from_obj); return; } if (!(to_obj = get_obj_in_list_vis(ch, arg2, ch->carrying))) { act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR); return; } if ((to_obj->obj_flags.type_flag != ITEM_DRINKCON) && (to_obj->obj_flags.type_flag != ITEM_FOUNTAIN)) { act("You can't pour anything into that.", FALSE, ch, 0, 0, TO_CHAR); return; } } if (to_obj == from_obj) { act("A most unproductive effort.", FALSE, ch, 0, 0, TO_CHAR); return; } if ((to_obj->obj_flags.value[1] != 0) && (to_obj->obj_flags.value[2] != from_obj->obj_flags.value[2])) { act("There is already another liquid in it!", FALSE, ch, 0, 0, TO_CHAR); return; } if (!(to_obj->obj_flags.value[1] < to_obj->obj_flags.value[0])) { act("There is no room for more.", FALSE, ch, 0, 0, TO_CHAR); return; } if (subcmd == SCMD_POUR) { sprintf(buf, "You pour the %s into the %s.", drinks[from_obj->obj_flags.value[2]], arg2); send_to_char(buf, ch); } if (subcmd == SCMD_FILL) { act("You gently fill $p from $P.", FALSE, ch, to_obj, from_obj, TO_CHAR); act("$n gently fills $p from $P.", TRUE, ch, to_obj, from_obj, TO_ROOM); } /* New alias */ if (to_obj->obj_flags.value[1] == 0) name_to_drinkcon(to_obj, from_obj->obj_flags.value[2]); /* First same type liq. */ to_obj->obj_flags.value[2] = from_obj->obj_flags.value[2]; /* Then how much to pour */ from_obj->obj_flags.value[1] -= (amount = (to_obj->obj_flags.value[0] - to_obj->obj_flags.value[1])); to_obj->obj_flags.value[1] = to_obj->obj_flags.value[0]; if (from_obj->obj_flags.value[1] < 0) /* There was too little */ { to_obj->obj_flags.value[1] += from_obj->obj_flags.value[1]; amount += from_obj->obj_flags.value[1]; from_obj->obj_flags.value[1] = 0; from_obj->obj_flags.value[2] = 0; from_obj->obj_flags.value[3] = 0; name_from_drinkcon(from_obj); } /* Then the poison boogie */ to_obj->obj_flags.value[3] = (to_obj->obj_flags.value[3] || from_obj->obj_flags.value[3]); /* And the weight boogie */ weight_change_object(from_obj, -amount); weight_change_object(to_obj, amount); /* Add weight */ return; } ACMD(do_sip) { struct affected_type af; struct obj_data *temp; one_argument(argument, arg); if (!(temp = get_obj_in_list_vis(ch, arg, ch->carrying))) { act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR); return; } if ((temp->obj_flags.type_flag != ITEM_DRINKCON) && (temp->obj_flags.type_flag != ITEM_DRINKCON)) { act("You can't sip from that!", FALSE, ch, 0, 0, TO_CHAR); return; } if (GET_COND(ch, DRUNK) > 10) /* The pig is drunk ! */ { act("You simply fail to reach your mouth!", FALSE, ch, 0, 0, TO_CHAR); act("$n tries to sip, but fails!", TRUE, ch, 0, 0, TO_ROOM); return; } if (!temp->obj_flags.value[1]) /* Empty */ { act("But there is nothing in it?", FALSE, ch, 0, 0, TO_CHAR); return; } act("$n sips from the $o", TRUE, ch, temp, 0, TO_ROOM); sprintf(buf, "It tastes like %s.\n\r", drinks[temp->obj_flags.value[2]]); send_to_char(buf, ch); gain_condition(ch, DRUNK, (int)(drink_aff[temp->obj_flags.value[2]][DRUNK] / 4)); gain_condition(ch, FULL, (int)(drink_aff[temp->obj_flags.value[2]][FULL] / 4)); gain_condition(ch, THIRST, (int)(drink_aff[temp->obj_flags.value[2]][THIRST] / 4)); weight_change_object(temp, -1); /* Subtract one unit */ if (GET_COND(ch, DRUNK) > 10) act("You feel drunk.", FALSE, ch, 0, 0, TO_CHAR); if (GET_COND(ch, THIRST) > 20) act("You do not feel thirsty.", FALSE, ch, 0, 0, TO_CHAR); if (GET_COND(ch, FULL) > 20) act("You are full.", FALSE, ch, 0, 0, TO_CHAR); if (temp->obj_flags.value[3] && !IS_AFFECTED(ch, AFF_POISON)) /* The shit was poisoned ! */ { act("But it also had a strange taste!", FALSE, ch, 0, 0, TO_CHAR); af.type = SPELL_POISON; af.duration = 3; af.modifier = 0; af.location = APPLY_NONE; af.bitvector = AFF_POISON; affect_to_char(ch, &af); } temp->obj_flags.value[1]--; if (!temp->obj_flags.value[1]) /* The last bit */ { temp->obj_flags.value[2] = 0; temp->obj_flags.value[3] = 0; name_from_drinkcon(temp); } return; } ACMD(do_taste) { struct affected_type af; struct obj_data *temp; one_argument(argument, arg); if (!(temp = get_obj_in_list_vis(ch, arg, ch->carrying))) { act("You can't find it!", FALSE, ch, 0, 0, TO_CHAR); return; } if ((temp->obj_flags.type_flag == ITEM_DRINKCON) || (temp->obj_flags.type_flag == ITEM_FOUNTAIN)) { do_sip(ch, argument, 0, 0); return; } if (!(temp->obj_flags.type_flag == ITEM_FOOD)) { act("Taste that?!? Your stomach refuses!", FALSE, ch, 0, 0, TO_CHAR); return; } act("$n tastes the $o", FALSE, ch, temp, 0, TO_ROOM); act("You taste the $o", FALSE, ch, temp, 0, TO_CHAR); gain_condition(ch, FULL, 1); if (GET_COND(ch, FULL) > 20) act("You are full.", FALSE, ch, 0, 0, TO_CHAR); if (temp->obj_flags.value[3] && !IS_AFFECTED(ch, AFF_POISON)) /* The shit was poisoned ! */ { act("Oops, it did not taste good at all!", FALSE, ch, 0, 0, TO_CHAR); af.type = SPELL_POISON; af.duration = 2; af.modifier = 0; af.location = APPLY_NONE; af.bitvector = AFF_POISON; affect_to_char(ch, &af); } temp->obj_flags.value[0]--; if (!temp->obj_flags.value[0]) /* Nothing left */ { act("There is nothing left now.", FALSE, ch, 0, 0, TO_CHAR); extract_obj(temp); } return; } /* functions related to wear */ void perform_wear(struct char_data *ch, struct obj_data *obj_object, int keyword) { switch (keyword) { case 0 : act("$n lights $p and holds it.", FALSE, ch, obj_object, 0, TO_ROOM); act("You light $p and hold it.", FALSE, ch, obj_object, 0, TO_CHAR); break; case 1 : act("$n wears $p on $s finger.", TRUE, ch, obj_object, 0, TO_ROOM); /* No message to char; routine below differentiates between left finger and right finger in message to char. */ break; case 2 : act("$n wears $p around $s neck.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p around your neck.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 3 : act("$n wears $p on $s body.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p on your body.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 4 : act("$n wears $p on $s head.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p on your head.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 5 : act("$n wears $p on $s legs.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p on your legs.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 6 : act("$n wears $p on $s feet.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p on your feet.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 7 : act("$n wears $p on $s hands.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p on your hands.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 8 : act("$n wears $p on $s arms.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p on your arms.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 9 : act("$n wears $p about $s body.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p about your body.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 10 : act("$n wears $p about $s waist.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wear $p about your waist.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 11 : act("$n wears $p around $s wrist.", TRUE, ch, obj_object, 0, TO_ROOM); /* No message to char; routine below differentiates between left wrist and right wrist in message to char. */ break; case 12 : act("$n wields $p.", TRUE, ch, obj_object, 0, TO_ROOM); act("You wield $p.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 13 : act("$n grabs $p.", TRUE, ch, obj_object, 0, TO_ROOM); act("You grab $p.", TRUE, ch, obj_object, 0, TO_CHAR); break; case 14 : act("$n starts using $p as shield.", TRUE, ch, obj_object, 0, TO_ROOM); act("You start using $p as shield.", TRUE, ch, obj_object, 0, TO_CHAR); break; } } void wear(struct char_data *ch, struct obj_data *obj_object, int keyword, bool wear_all) { char buffer[MAX_STRING_LENGTH]; switch (keyword) { case 0: /* LIGHT SOURCE */ if (ch->equipment[WEAR_LIGHT]) send_to_char("You are already holding a light source.\n\r", ch); else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_LIGHT); if (obj_object->obj_flags.value[2]) world[ch->in_room].light++; } break; case 1: if (CAN_WEAR(obj_object, ITEM_WEAR_FINGER)) { if ((ch->equipment[WEAR_FINGER_L]) && (ch->equipment[WEAR_FINGER_R])) { send_to_char("You are already wearing something on your fingers.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); if (ch->equipment[WEAR_FINGER_L]) { sprintf(buffer, "You put the %s on your right finger.\n\r", fname(obj_object->name)); send_to_char(buffer, ch); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_FINGER_R); } else { sprintf(buffer, "You put the %s on your left finger.\n\r", fname(obj_object->name)); send_to_char(buffer, ch); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_FINGER_L); } } } else send_to_char("You can't wear that on your finger.\n\r", ch); break; case 2: if (CAN_WEAR(obj_object, ITEM_WEAR_NECK)) { if ((ch->equipment[WEAR_NECK_1]) && (ch->equipment[WEAR_NECK_2])) { send_to_char("You can't wear any more around your neck.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); if (ch->equipment[WEAR_NECK_1]) { obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_NECK_2); } else { obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_NECK_1); } } } else send_to_char("You can't wear that around your neck.\n\r", ch); break; case 3: if (CAN_WEAR(obj_object, ITEM_WEAR_BODY)) { if (ch->equipment[WEAR_BODY]) { send_to_char("You already wear something on your body.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_BODY); } } else send_to_char("You can't wear that on your body.\n\r", ch); break; case 4: if (CAN_WEAR(obj_object, ITEM_WEAR_HEAD)) { if (ch->equipment[WEAR_HEAD]) { send_to_char("You already wear something on your head.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_HEAD); } } else send_to_char("You can't wear that on your head.\n\r", ch); break; case 5: if (CAN_WEAR(obj_object, ITEM_WEAR_LEGS)) { if (ch->equipment[WEAR_LEGS]) { send_to_char("You already wear something on your legs.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_LEGS); } } else send_to_char("You can't wear that on your legs.\n\r", ch); break; case 6: if (CAN_WEAR(obj_object, ITEM_WEAR_FEET)) { if (ch->equipment[WEAR_FEET]) { send_to_char("You already wear something on your feet.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_FEET); } } else send_to_char("You can't wear that on your feet.\n\r", ch); break; case 7: if (CAN_WEAR(obj_object, ITEM_WEAR_HANDS)) { if (ch->equipment[WEAR_HANDS]) { send_to_char("You already wear something on your hands.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_HANDS); } } else send_to_char("You can't wear that on your hands.\n\r", ch); break; case 8: if (CAN_WEAR(obj_object, ITEM_WEAR_ARMS)) { if (ch->equipment[WEAR_ARMS]) { send_to_char("You already wear something on your arms.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_ARMS); } } else send_to_char("You can't wear that on your arms.\n\r", ch); break; case 9: if (CAN_WEAR(obj_object, ITEM_WEAR_ABOUT)) { if (ch->equipment[WEAR_ABOUT]) { send_to_char("You already wear something about your body.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_ABOUT); } } else send_to_char("You can't wear that about your body.\n\r", ch); break; case 10: if (CAN_WEAR(obj_object, ITEM_WEAR_WAISTE)) { if (ch->equipment[WEAR_WAISTE]) { send_to_char("You already wear something about your waiste.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_WAISTE); } } else send_to_char("You can't wear that about your waist.\n\r", ch); break; case 11: if (CAN_WEAR(obj_object, ITEM_WEAR_WRIST)) { if ((ch->equipment[WEAR_WRIST_L]) && (ch->equipment[WEAR_WRIST_R])) { send_to_char( "You already wear something around both your wrists.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); if (ch->equipment[WEAR_WRIST_L]) { sprintf(buffer, "You wear the %s around your right wrist.\n\r", fname(obj_object->name)); send_to_char(buffer, ch); equip_char(ch, obj_object, WEAR_WRIST_R); } else { sprintf(buffer, "You wear the %s around your left wrist.\n\r", fname(obj_object->name)); send_to_char(buffer, ch); equip_char(ch, obj_object, WEAR_WRIST_L); } } } else send_to_char("You can't wear that around your wrist.\n\r", ch); break; case 12: if (CAN_WEAR(obj_object, ITEM_WIELD)) { if (ch->equipment[WIELD]) { send_to_char("You are already wielding something.\n\r", ch); } else { /* Cleric execption has been removed, and is temporarily placed */ /* at the end of this file */ if (GET_OBJ_WEIGHT(obj_object) > str_app[STRENGTH_APPLY_INDEX(ch)].wield_w) { send_to_char("It is too heavy for you to use.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WIELD); } } } else send_to_char("You can't wield that.\n\r", ch); break; case 13: if (CAN_WEAR(obj_object, ITEM_HOLD)) { if (ch->equipment[HOLD]) { send_to_char("You are already holding something.\n\r", ch); } else { /* Cleric execption has been removed, and is temporarily placed */ /* at the end of this file */ perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, HOLD); } } else send_to_char("You can't hold this.\n\r", ch); break; case 14: if (CAN_WEAR(obj_object, ITEM_WEAR_SHIELD)) { if ((ch->equipment[WEAR_SHIELD])) { send_to_char( "You are already using a shield.\n\r", ch); } else { perform_wear(ch, obj_object, keyword); /* sprintf(buffer, "You start using the %s.\n\r", fname(obj_object->name)); send_to_char(buffer, ch); */ obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_SHIELD); } } else { send_to_char("You can't use that as a shield.\n\r", ch); } break; case -1: sprintf(buffer, "Wear %s where?\n\r", OBJS(obj_object, ch)); send_to_char(buffer, ch); break; case -2: if (!wear_all) { sprintf(buffer, "You can't wear %s.\n\r", OBJS(obj_object, ch)); send_to_char(buffer, ch); } break; default: log("SYSERR: Unknown type called in wear."); break; } } ACMD(do_wear) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; struct obj_data *obj_object; struct obj_data *next_object; int keyword; static char *keywords[] = { "finger", "neck", "body", "head", "legs", "feet", "hands", "arms", "about", "waist", "wrist", "shield", "\n" }; argument_interpreter(argument, arg1, arg2); if (*arg1) { if (!str_cmp(arg1, "all")) { for (obj_object = ch->carrying; obj_object; obj_object = next_object) { next_object = obj_object->next_content; keyword = -2; if (CAN_WEAR(obj_object, ITEM_WEAR_SHIELD)) keyword = 14; if (CAN_WEAR(obj_object, ITEM_WEAR_FINGER)) keyword = 1; if (CAN_WEAR(obj_object, ITEM_WEAR_NECK)) keyword = 2; if (CAN_WEAR(obj_object, ITEM_WEAR_WRIST)) keyword = 11; if (CAN_WEAR(obj_object, ITEM_WEAR_WAISTE)) keyword = 10; if (CAN_WEAR(obj_object, ITEM_WEAR_ARMS)) keyword = 8; if (CAN_WEAR(obj_object, ITEM_WEAR_HANDS)) keyword = 7; if (CAN_WEAR(obj_object, ITEM_WEAR_FEET)) keyword = 6; if (CAN_WEAR(obj_object, ITEM_WEAR_LEGS)) keyword = 5; if (CAN_WEAR(obj_object, ITEM_WEAR_ABOUT)) keyword = 9; if (CAN_WEAR(obj_object, ITEM_WEAR_HEAD)) keyword = 4; if (CAN_WEAR(obj_object, ITEM_WEAR_BODY)) keyword = 3; wear(ch, obj_object, keyword, TRUE); } } else { obj_object = get_obj_in_list_vis(ch, arg1, ch->carrying); if (obj_object) { if (*arg2) { keyword = search_block(arg2, keywords, FALSE); /* Partial Match */ if (keyword == -1) { sprintf(buf, "%s is an unknown body location.\n\r", arg2); send_to_char(buf, ch); } else { wear(ch, obj_object, keyword + 1, FALSE); } } else { keyword = -2; if (CAN_WEAR(obj_object, ITEM_WEAR_SHIELD)) keyword = 14; if (CAN_WEAR(obj_object, ITEM_WEAR_FINGER)) keyword = 1; if (CAN_WEAR(obj_object, ITEM_WEAR_NECK)) keyword = 2; if (CAN_WEAR(obj_object, ITEM_WEAR_WRIST)) keyword = 11; if (CAN_WEAR(obj_object, ITEM_WEAR_WAISTE)) keyword = 10; if (CAN_WEAR(obj_object, ITEM_WEAR_ARMS)) keyword = 8; if (CAN_WEAR(obj_object, ITEM_WEAR_HANDS)) keyword = 7; if (CAN_WEAR(obj_object, ITEM_WEAR_FEET)) keyword = 6; if (CAN_WEAR(obj_object, ITEM_WEAR_LEGS)) keyword = 5; if (CAN_WEAR(obj_object, ITEM_WEAR_ABOUT)) keyword = 9; if (CAN_WEAR(obj_object, ITEM_WEAR_HEAD)) keyword = 4; if (CAN_WEAR(obj_object, ITEM_WEAR_BODY)) keyword = 3; wear(ch, obj_object, keyword, FALSE); } } else { sprintf(buf2, "You do not seem to have the '%s'.\n\r", arg1); send_to_char(buf2, ch); } } } else { send_to_char("Wear what?\n\r", ch); } } ACMD(do_wield) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; struct obj_data *obj_object; int keyword = 12; argument_interpreter(argument, arg1, arg2); if (*arg1) { obj_object = get_obj_in_list_vis(ch, arg1, ch->carrying); if (obj_object) { wear(ch, obj_object, keyword, FALSE); } else { sprintf(buf, "You do not seem to have the '%s'.\n\r", arg1); send_to_char(buf, ch); } } else { send_to_char("Wield what?\n\r", ch); } } ACMD(do_grab) { char arg1[MAX_STRING_LENGTH]; char arg2[MAX_STRING_LENGTH]; struct obj_data *obj_object; argument_interpreter(argument, arg1, arg2); if (*arg1) { obj_object = get_obj_in_list(arg1, ch->carrying); if (obj_object) { if (obj_object->obj_flags.type_flag == ITEM_LIGHT) wear(ch, obj_object, WEAR_LIGHT, FALSE); else wear(ch, obj_object, 13, FALSE); } else { sprintf(buf, "You do not seem to have the '%s'.\n\r", arg1); send_to_char(buf, ch); } } else { send_to_char("Hold what?\n\r", ch); } } ACMD(do_remove) { char arg1[MAX_STRING_LENGTH]; struct obj_data *obj_object; int j; one_argument(argument, arg1); if (*arg1) { obj_object = get_object_in_equip_vis(ch, arg1, ch->equipment, &j); if (obj_object) { if (CAN_CARRY_N(ch) != IS_CARRYING_N(ch)) { obj_to_char(unequip_char(ch, j), ch); if (obj_object->obj_flags.type_flag == ITEM_LIGHT) if (obj_object->obj_flags.value[2]) world[ch->in_room].light--; act("You stop using $p.", FALSE, ch, obj_object, 0, TO_CHAR); act("$n stops using $p.", TRUE, ch, obj_object, 0, TO_ROOM); } else { send_to_char("You can't carry that many items.\n\r", ch); } } else { send_to_char("You are not using it.\n\r", ch); } } else { send_to_char("Remove what?\n\r", ch); } } /* case 12: ... if ( ( (ch->player.class == CLASS_CLERIC) && ( (GET_ITEM_TYPE(obj_object) == ITEM_WEAPON) && (sharp[obj_object->obj_flags.value[3]]) ) || ( (ch->player.class == CLASS_CLERIC) && ( (GET_ITEM_TYPE(obj_object) == ITEM_FIREWEAPON) && (sharp[obj_object->obj_flags.value[3]]) ) ) ) ) { if (GET_ITEM_TYPE(obj_object) == ITEM_WEAPON) { strcpy(buf, "You can't wield that! its SHARP.\n\r"); strcat(buf, "You are forbidden to use sharp weapons!\n\r"); send_to_char(buf, ch); } if (GET_ITEM_TYPE(obj_object) == ITEM_FIREWEAPON) { strcpy(buf, "You can't wield that! it fires only SHARP things.\n\r"); strcat(buf, "You are forbidden to use sharp weapons!\n\r"); send_to_char(buf, ch); } } else { */ /* case 13: ... if ( (ch->player.class == CLASS_CLERIC) && ( (GET_ITEM_TYPE(obj_object) == ITEM_MISSILE) && (sharp[obj_object->obj_flags.value[3]]) ) ) { strcpy(buf, "This is a SHARP thing, to be used in a weapon.\n\r."); strcat(buf, "You are forbidden to use sharp weapons!\n\r"); send_to_char(buf, ch); } else { */