/* * file: act.obj1.c , Implementation of commands. Part of DIKUMUD * Usage : Commands mainly moving around objects. * Copyright (C) 1990, 1991 - see 'license.doc' for complete information. */ #include <stdio.h> #include <stdlib.h> /* #include <unistd.h> */ #include <sys/types.h> #include <signal.h> #include <string.h> #include <assert.h> #include <ctype.h> #include "global.h" #include "bug.h" #include "utils.h" #include "comm.h" #include "interpreter.h" #include "handler.h" #include "db.h" #include "spells.h" #include "trap.h" #include "constants.h" #include "spell_parser.h" #include "multiclass.h" #include "mudlimits.h" #include "fight.h" #include "act_info.h" #define _ACT_OBJ_C #include "act_obj.h" /* procedures related to get */ void get(struct char_data *ch, struct obj_data *obj_object, struct obj_data *sub_object) { if (DEBUG > 2) log_info("called %s with %s, %s, %s", __PRETTY_FUNCTION__, SAFE_NAME(ch), SAFE_ONAME(obj_object), SAFE_ONAME(sub_object)); if (sub_object) { if (!IS_SET(sub_object->obj_flags.value[1], CONT_CLOSED)) { obj_from_obj(obj_object); obj_to_char(obj_object, ch); act("You get $p from $P.", 0, ch, obj_object, sub_object, TO_CHAR); act("$n gets $p from $P.", 1, ch, obj_object, sub_object, TO_ROOM); } else { act("$P must be opened first.", 1, ch, 0, sub_object, TO_CHAR); return; } } else { /* jdb -- 11-9 */ if (obj_object->in_room == NOWHERE) { obj_object->in_room = ch->in_room; log_error("OBJ:%s got %s from room -1...", GET_NAME(ch), obj_object->name); } obj_from_room(obj_object); obj_to_char(obj_object, ch); act("You get $p.", 0, ch, obj_object, 0, TO_CHAR); act("$n gets $p.", 1, ch, obj_object, 0, TO_ROOM); } if ((obj_object->obj_flags.type_flag == ITEM_MONEY) && (obj_object->obj_flags.value[0] >= 1)) { obj_from_char(obj_object); cprintf(ch, "There was %d coins.\r\n", obj_object->obj_flags.value[0]); GET_GOLD(ch) += obj_object->obj_flags.value[0]; extract_obj(obj_object); } } void do_get(struct char_data *ch, const char *argument, int cmd) { char arg1[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0"; char arg2[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0"; struct obj_data *sub_object = NULL; struct obj_data *obj_object = NULL; struct obj_data *next_obj = NULL; char found = FALSE; char fail = FALSE; int type = 3; char newarg[100] = "\0\0\0\0\0\0\0"; int num = 0; int p = 0; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); argument_interpreter(argument, arg1, arg2); /* * get type */ if (!*arg1) type = 0; if (*arg1 && !*arg2) { if (!str_cmp(arg1, "all")) type = 1; else type = 2; } if (*arg1 && *arg2) { if (!str_cmp(arg1, "all")) { if (!str_cmp(arg2, "all")) type = 3; else type = 4; } else { if (!str_cmp(arg2, "all")) type = 5; else type = 6; } } switch (type) { /* * get */ case 0:{ cprintf(ch, "Get what?\r\n"); } break; /* * get all */ case 1:{ sub_object = 0; found = FALSE; fail = FALSE; for (obj_object = real_roomp(ch->in_room)->contents; obj_object; obj_object = next_obj) { next_obj = obj_object->next_content; /* * check for a trap (traps fire often) */ if (CheckForAnyTrap(ch, obj_object)) return; if (CAN_SEE_OBJ(ch, obj_object)) { if ((IS_CARRYING_N(ch) + 1) <= CAN_CARRY_N(ch)) { if ((IS_CARRYING_W(ch) + obj_object->obj_flags.weight) <= CAN_CARRY_W(ch)) { if (CAN_WEAR(obj_object, ITEM_TAKE)) { get(ch, obj_object, sub_object); found = TRUE; } else { cprintf(ch, "You can't take that\r\n"); fail = TRUE; } } else { cprintf(ch, "%s : You can't carry that much weight.\r\n", obj_object->short_description); fail = TRUE; } } else { cprintf(ch, "%s : You can't carry that many items.\r\n", obj_object->short_description); fail = TRUE; } } } if (found) { cprintf(ch, "OK.\r\n"); } else { if (!fail) cprintf(ch, "You see nothing here.\r\n"); } } break; /* * get ??? (something) */ case 2: { sub_object = 0; found = FALSE; fail = FALSE; if (getall(arg1, newarg) != FALSE) { strcpy(arg1, newarg); num = -1; } else if ((p = getabunch(arg1, newarg)) != FALSE) { strcpy(arg1, newarg); num = p; } else { num = 1; } while (num != 0) { obj_object = get_obj_in_list_vis(ch, arg1, real_roomp(ch->in_room)->contents); if (obj_object) { if (CheckForAnyTrap(ch, obj_object)) return; if ((IS_CARRYING_N(ch) + 1 < CAN_CARRY_N(ch))) { if ((IS_CARRYING_W(ch) + obj_object->obj_flags.weight) < CAN_CARRY_W(ch)) { if (CAN_WEAR(obj_object, ITEM_TAKE)) { get(ch, obj_object, sub_object); found = TRUE; } else { cprintf(ch, "You can't take that\r\n"); fail = TRUE; num = 0; } } else { cprintf(ch, "%s : You can't carry that much weight.\r\n", obj_object->short_description); fail = TRUE; num = 0; } } else { cprintf(ch, "%s : You can't carry that many items.\r\n", obj_object->short_description); fail = TRUE; num = 0; } } else { if (num > 0) { cprintf(ch, "You do not see a %s here.\r\n", arg1); } num = 0; fail = TRUE; } if (num > 0) num--; } } break; /* * get all all */ case 3: { cprintf(ch, "You must be joking?!\r\n"); } break; /* * get all ??? */ case 4: { found = FALSE; fail = FALSE; sub_object = (struct obj_data *)get_obj_vis_accessible(ch, arg2); if (sub_object) { if (GET_ITEM_TYPE(sub_object) == ITEM_CONTAINER) { for (obj_object = sub_object->contains; obj_object; obj_object = next_obj) { if (CheckForGetTrap(ch, obj_object)) return; next_obj = obj_object->next_content; if (CAN_SEE_OBJ(ch, obj_object)) { if ((IS_CARRYING_N(ch) + 1 < CAN_CARRY_N(ch))) { if ((IS_CARRYING_W(ch) + obj_object->obj_flags.weight) < CAN_CARRY_W(ch)) { if (CAN_WEAR(obj_object, ITEM_TAKE)) { get(ch, obj_object, sub_object); found = TRUE; } else { cprintf(ch, "You can't take that\r\n"); fail = TRUE; } } else { cprintf(ch, "%s : You can't carry that much weight.\r\n", obj_object->short_description); fail = TRUE; } } else { cprintf(ch, "%s : You can't carry that many items.\r\n", obj_object->short_description); fail = TRUE; } } } if (!found && !fail) { cprintf(ch, "You do not see anything in %s.\r\n", sub_object->short_description); fail = TRUE; } } else { cprintf(ch, "%s is not a container.\r\n", sub_object->short_description); fail = TRUE; } } else { cprintf(ch, "You do not see or have the %s.\r\n", arg2); fail = TRUE; } } break; case 5:{ cprintf(ch, "You can't take a thing from more than one container.\r\n"); } break; /* * take ??? from ??? (is it??) */ case 6:{ found = FALSE; fail = FALSE; sub_object = (struct obj_data *) get_obj_vis_accessible(ch, arg2); if (sub_object) { if (GET_ITEM_TYPE(sub_object) == ITEM_CONTAINER) { if (getall(arg1, newarg) != FALSE) { num = -1; strcpy(arg1, newarg); } else if ((p = getabunch(arg1, newarg)) != FALSE) { num = p; strcpy(arg1, newarg); } else { num = 1; } while (num != 0) { obj_object = get_obj_in_list_vis(ch, arg1, sub_object->contains); if (obj_object) { if (CheckForInsideTrap(ch, sub_object)) return; if ((IS_CARRYING_N(ch) + 1 < CAN_CARRY_N(ch))) { if ((IS_CARRYING_W(ch) + obj_object->obj_flags.weight) < CAN_CARRY_W(ch)) { if (CAN_WEAR(obj_object, ITEM_TAKE)) { get(ch, obj_object, sub_object); found = TRUE; } else { cprintf(ch, "You can't take that\r\n"); fail = TRUE; num = 0; } } else { cprintf(ch, "%s : You can't carry that much weight.\r\n", obj_object->short_description); fail = TRUE; num = 0; } } else { cprintf(ch, "%s : You can't carry that many items.\r\n", obj_object->short_description); fail = TRUE; num = 0; } } else { if (num > 0) { cprintf(ch, "%s does not contain the %s.\r\n", sub_object->short_description, arg1); } num = 0; fail = TRUE; } if (num > 0) num--; } } else { cprintf(ch, "%s is not a container.\r\n", sub_object->short_description); fail = TRUE; } } else { cprintf(ch, "You do not see or have the %s.\r\n", arg2); fail = TRUE; } } break; } } void do_drop(struct char_data *ch, const char *argument, int cmd) { struct obj_data *tmp_object = NULL; struct obj_data *next_obj = NULL; const char *s = NULL; char arg[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; char newarg[100] = "\0\0\0\0\0\0\0"; int test = FALSE; int amount = 0; int num = 0; int p = 0; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); s = one_argument(argument, arg); if (is_number(arg)) { amount = atoi(arg); strcpy(arg, s); /* * if (0!=str_cmp("coins",arg) && 0!=str_cmp("coin",arg)) { * cprintf(ch, "Sorry, you can't do that (yet)...\r\n"); * return; * } */ if (amount < 0) { cprintf(ch, "Sorry, you can't do that!\r\n"); return; } if (GET_GOLD(ch) < amount) { cprintf(ch, "You haven't got that many coins!\r\n"); return; } cprintf(ch, "OK.\r\n"); if (amount == 0) return; act("$n drops some gold.", FALSE, ch, 0, 0, TO_ROOM); tmp_object = create_money(amount); obj_to_room(tmp_object, ch->in_room); GET_GOLD(ch) -= amount; return; } else { only_argument(argument, arg); } if (*arg) { if (!str_cmp(arg, "all")) { for (tmp_object = ch->carrying; tmp_object; tmp_object = next_obj) { next_obj = tmp_object->next_content; if (!IS_SET(tmp_object->obj_flags.extra_flags, ITEM_NODROP) || IS_IMMORTAL(ch)) { if (CAN_SEE_OBJ(ch, tmp_object)) { cprintf(ch, "You drop %s.\r\n", tmp_object->short_description); } else { cprintf(ch, "You drop something.\r\n"); } act("$n drops $p.", 1, ch, tmp_object, 0, TO_ROOM); obj_from_char(tmp_object); obj_to_room(tmp_object, ch->in_room); test = TRUE; } else { if (CAN_SEE_OBJ(ch, tmp_object)) { cprintf(ch, "You can't drop %s, it must be CURSED!\r\n", tmp_object->short_description); test = TRUE; } } } if (!test) { cprintf(ch, "You do not seem to have anything.\r\n"); } } else { /* * &&&&&& */ if (getall(arg, newarg) != FALSE) { num = -1; strcpy(arg, newarg); } else if ((p = getabunch(arg, newarg)) != FALSE) { num = p; strcpy(arg, newarg); } else { num = 1; } while (num != 0) { tmp_object = get_obj_in_list_vis(ch, arg, ch->carrying); if (tmp_object) { if (!IS_SET(tmp_object->obj_flags.extra_flags, ITEM_NODROP) || IS_IMMORTAL(ch)) { cprintf(ch, "You drop %s.\r\n", tmp_object->short_description); act("$n drops $p.", 1, ch, tmp_object, 0, TO_ROOM); obj_from_char(tmp_object); obj_to_room(tmp_object, ch->in_room); } else { cprintf(ch, "You can't drop it, it must be CURSED!\r\n"); num = 0; } } else { if (num > 0) cprintf(ch, "You do not have that item.\r\n"); num = 0; } if (num > 0) num--; } } } else { cprintf(ch, "Drop what?\r\n"); } } void do_put(struct char_data *ch, const char *argument, int cmd) { struct obj_data *obj_object = NULL; struct obj_data *sub_object = NULL; struct char_data *tmp_char = NULL; char arg1[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; char arg2[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; char newarg[100] = "\0\0\0\0\0\0\0"; int bits = 0; int num = 0; int p = 0; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); argument_interpreter(argument, arg1, arg2); if (*arg1) { if (*arg2) { if (getall(arg1, newarg) != FALSE) { num = -1; strcpy(arg1, newarg); } else if ((p = getabunch(arg1, newarg)) != FALSE) { num = p; strcpy(arg1, newarg); } else { num = 1; } if (!strcmp(arg1, "all")) { cprintf(ch, "sorry, you can't do that (yet)\r\n"); return; } else { while (num != 0) { #if 1 bits = generic_find(arg1, FIND_OBJ_INV, ch, &tmp_char, &obj_object); #else obj_object = get_obj_in_list_vis(ch, arg1, ch->carrying); #endif if (obj_object) { bits = generic_find(arg2, FIND_OBJ_INV | FIND_OBJ_ROOM, ch, &tmp_char, &sub_object); if (sub_object) { if (GET_ITEM_TYPE(sub_object) == ITEM_CONTAINER) { if (!IS_SET(sub_object->obj_flags.value[1], CONT_CLOSED)) { if (obj_object == sub_object) { cprintf(ch, "You attempt to fold it into itself, but fail.\r\n"); return; } if (((sub_object->obj_flags.weight) + (obj_object->obj_flags.weight)) < (sub_object->obj_flags.value[0])) { act("You put $p in $P", TRUE, ch, obj_object, sub_object, TO_CHAR); if (bits == FIND_OBJ_INV) { obj_from_char(obj_object); /* * make up for above line */ IS_CARRYING_W(ch) += GET_OBJ_WEIGHT(obj_object); obj_to_obj(obj_object, sub_object); } else { obj_from_room(obj_object); obj_to_obj(obj_object, sub_object); } act("$n puts $p in $P", TRUE, ch, obj_object, sub_object, TO_ROOM); num--; } else { cprintf(ch, "It won't fit.\r\n"); num = 0; } } else { cprintf(ch, "It seems to be closed.\r\n"); num = 0; } } else { cprintf(ch, "%s is not a container.\r\n", sub_object->short_description); num = 0; } } else { cprintf(ch, "You don't have the %s.\r\n", arg2); num = 0; } } else { if ((num > 0) || (num == -1)) { cprintf(ch, "You don't have the %s.\r\n", arg1); } num = 0; } } } } else { cprintf(ch, "Put %s in what?\r\n", arg1); } } else { cprintf(ch, "Put what in what?\r\n"); } } void do_give(struct char_data *ch, const char *argument, int cmd) { struct char_data *vict = NULL; struct obj_data *obj = NULL; char obj_name[80] = "\0\0\0\0\0\0\0"; char vict_name[80] = "\0\0\0\0\0\0\0"; char arg[80] = "\0\0\0\0\0\0\0"; char newarg[100] = "\0\0\0\0\0\0\0"; int amount = 0; int num = 0; int p = 0; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); argument = one_argument(argument, obj_name); if (is_number(obj_name)) { amount = atoi(obj_name); argument = one_argument(argument, arg); /* * if (str_cmp("coins",arg) && str_cmp("coin",arg)) * { * cprintf(ch, "Sorry, you can't do that (yet)...\r\n"); * return; * } */ if (amount < 0) { cprintf(ch, "Sorry, you can't do that!\r\n"); return; } if ((GET_GOLD(ch) < amount) && (IS_NPC(ch) || (GetMaxLevel(ch) < DEMIGOD))) { cprintf(ch, "You haven't got that many coins!\r\n"); return; } argument = one_argument(argument, vict_name); if (!*vict_name) { cprintf(ch, "To who?\r\n"); return; } if (!(vict = get_char_room_vis(ch, vict_name))) { cprintf(ch, "To who?\r\n"); return; } cprintf(ch, "Ok.\r\n"); cprintf(vict, "%s gives you %d gold coins.\r\n", PERS(ch, vict), amount); act("$n gives some gold to $N.", 1, ch, 0, vict, TO_NOTVICT); if (IS_NPC(ch) || (GetMaxLevel(ch) < DEMIGOD)) GET_GOLD(ch) -= amount; GET_GOLD(vict) += amount; if ((amount > 1000) && (GetMaxLevel(ch) >= DEMIGOD)) { /* hmmm */ log_info("%s gave %d coins to %s", GET_NAME(ch), amount, GET_NAME(vict)); } return; } argument = one_argument(argument, vict_name); if (!*obj_name || !*vict_name) { cprintf(ch, "Give what to who?\r\n"); return; } /* * &&&& */ if (getall(obj_name, newarg) != FALSE) { num = -1; strcpy(obj_name, newarg); } else if ((p = getabunch(obj_name, newarg)) != FALSE) { num = p; strcpy(obj_name, newarg); } else { num = 1; } while (num != 0) { if (!(obj = get_obj_in_list_vis(ch, obj_name, ch->carrying))) { if (num >= -1) cprintf(ch, "You do not seem to have anything like that.\r\n"); return; } if (IS_SET(obj->obj_flags.extra_flags, ITEM_NODROP) && !IS_IMMORTAL(ch)) { cprintf(ch, "You can't let go of it! Yeech!!\r\n"); return; } if (!(vict = get_char_room_vis(ch, vict_name))) { cprintf(ch, "No one by that name around here.\r\n"); return; } if (vict == ch) { log_info("%s just tried to give all.X to %s", GET_NAME(ch), GET_NAME(ch)); cprintf(ch, "Ok.\r\n"); return; } if ((1 + IS_CARRYING_N(vict)) > CAN_CARRY_N(vict)) { act("$N seems to have $S hands full.", 0, ch, 0, vict, TO_CHAR); return; } if (obj->obj_flags.weight + IS_CARRYING_W(vict) > CAN_CARRY_W(vict)) { act("$E can't carry that much weight.", 0, ch, 0, vict, TO_CHAR); return; } obj_from_char(obj); obj_to_char(obj, vict); act("$n gives $p to $N.", 1, ch, obj, vict, TO_NOTVICT); act("$n gives you $p.", 0, ch, obj, vict, TO_VICT); act("You give $p to $N", 0, ch, obj, vict, TO_CHAR); if (num > 0) num--; } } /* * 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. */ void weight_change_object(struct obj_data *obj, int weight) { struct obj_data *tmp_obj = NULL; struct char_data *tmp_ch = NULL; if (DEBUG > 2) log_info("called %s with %s, %d", __PRETTY_FUNCTION__, SAFE_ONAME(obj), weight); 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_error("Unknown attempt to subtract weight from an object."); } } void name_from_drinkcon(struct obj_data *obj) { int i = 0; char buf[100] = "\0\0\0\0\0\0\0"; char *new_name = NULL; if (DEBUG > 2) log_info("called %s with %s", __PRETTY_FUNCTION__, SAFE_ONAME(obj)); one_argument(obj->name, buf); new_name = strdup(buf); DESTROY(obj->name); obj->name = new_name; return; for (i = 0; (*((obj->name) + i) != ' ') && (*((obj->name) + i) != '\0'); i++); if (*((obj->name) + i) == ' ') { *((obj->name) + i + 1) = '\0'; new_name = strdup(obj->name); DESTROY(obj->name); obj->name = new_name; } } void name_to_drinkcon(struct obj_data *obj, int type) { char *new_name = NULL; if (DEBUG > 2) log_info("called %s with %s, %d", __PRETTY_FUNCTION__, SAFE_ONAME(obj), type); CREATE(new_name, char, strlen (obj->name) + strlen(drinknames[type]) + 2); sprintf(new_name, "%s %s", obj->name, drinknames[type]); DESTROY(obj->name); obj->name = new_name; } void do_drink(struct char_data *ch, const char *argument, int cmd) { struct obj_data *temp = NULL; char buf[255] = "\0\0\0\0\0\0\0"; int amount = 0; struct affected_type af; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); only_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_DRINKCON) { act("You can't drink from that!", FALSE, ch, 0, 0, TO_CHAR); return; } if ((GET_COND(ch, DRUNK) > 15) && (GET_COND(ch, THIRST) > 0)) { /* The pig is drunk */ act("You're just sloshed.", FALSE, ch, 0, 0, TO_CHAR); act("$n looks really drunk.", 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) { if (temp->obj_flags.value[1] > 0) { /* Not empty */ act("$n drinks %s from $p", TRUE, ch, temp, 0, TO_ROOM, drinks[temp->obj_flags.value[2]]); cprintf(ch, "You drink the %s.\r\n", drinks[temp->obj_flags.value[2]]); 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]); /* Subtract amount */ if (temp->obj_flags.value[0] > 20) weight_change_object(temp, -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); } if (temp->obj_flags.value[1] < 1) { /* its empty */ if (temp->obj_flags.value[0] < 20) { extract_obj(temp); /* get rid of it */ } } return; } act("It's empty already.", FALSE, ch, 0, 0, TO_CHAR); return; } } void do_puke(struct char_data *ch, const char *argument, int cmd) { char buf[100] = "\0\0\0\0\0\0\0"; struct char_data *vict = NULL; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); one_argument(argument, buf); if (!*buf) { act("$n blows chunks all over the room!", FALSE, ch, 0, 0, TO_ROOM); act("You puke and spew filth all over the place.", FALSE, ch, 0, 0, TO_CHAR); } else if (!(vict = get_char_room_vis(ch, buf))) { cprintf(ch, "You can't puke on someone who isn't here.\r\n"); return; } else { act("$n walks up to $N and pukes up sickly green ichor all over them!", FALSE, ch, 0, vict, TO_ROOM); act("You vomit green chunks all over $N!", FALSE, ch, 0, vict, TO_CHAR); } if (IS_MORTAL(ch)) { gain_condition(ch, FULL, -3); if (GET_COND(ch, FULL) < 0) { GET_COND(ch, FULL) = 0; } damage(ch, ch, 1, TYPE_SUFFERING); } return; } void do_eat(struct char_data *ch, const char *argument, int cmd) { char buf[100] = "\0\0\0\0\0\0\0"; int j = 0; int num = 0; struct obj_data *temp = NULL; struct affected_type af; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); 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) && (GetMaxLevel(ch) < DEMIGOD)) { 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 to 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); for (j = 0; j < MAX_OBJ_AFFECT; j++) if (temp->affected[j].location == APPLY_EAT_SPELL) { num = temp->affected[j].modifier; /* hit 'em with the spell */ ((*spell_info[num].spell_pointer) (6, ch, "", SPELL_TYPE_POTION, ch, 0)); } if (temp->obj_flags.value[3] && (GetMaxLevel(ch) < LOW_IMMORTAL)) { act("That 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); } void do_pour(struct char_data *ch, const char *argument, int cmd) { char arg1[132] = "\0\0\0\0\0\0\0"; char arg2[132] = "\0\0\0\0\0\0\0"; struct obj_data *from_obj = NULL; struct obj_data *to_obj = NULL; int temp = 0; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); argument_interpreter(argument, arg1, arg2); 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 (from_obj->obj_flags.value[1] == 0) { act("The $p is empty.", FALSE, ch, from_obj, 0, TO_CHAR); return; } 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 the $p.", FALSE, ch, from_obj, 0, TO_CHAR); weight_change_object(from_obj, -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); 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) { act("You can't pour anything into that.", 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 (to_obj == from_obj) { act("You can't pour to-from the same container?", FALSE, ch, 0, 0, TO_CHAR); return; } cprintf(ch, "You pour the %s into the %s.", drinks[from_obj->obj_flags.value[2]], arg2); /* * 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]; /* * the new, improved way of doing this... */ temp = from_obj->obj_flags.value[1]; from_obj->obj_flags.value[1] = 0; to_obj->obj_flags.value[1] += temp; temp = to_obj->obj_flags.value[1] - to_obj->obj_flags.value[0]; if (temp > 0) { from_obj->obj_flags.value[1] = temp; } else { name_from_drinkcon(from_obj); } if (from_obj->obj_flags.value[1] > from_obj->obj_flags.value[0]) from_obj->obj_flags.value[1] = from_obj->obj_flags.value[0]; /* * Then the poison boogie */ to_obj->obj_flags.value[3] = (to_obj->obj_flags.value[3] || from_obj->obj_flags.value[3]); return; } void do_sip(struct char_data *ch, const char *argument, int cmd) { char arg[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0"; struct obj_data *temp = NULL; struct affected_type af; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); 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) { 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); cprintf(ch, "It tastes like %s.\r\n", drinks[temp->obj_flags.value[2]]); 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; } void do_taste(struct char_data *ch, const char *argument, int cmd) { struct affected_type af; char arg[80] = "\0\0\0\0\0\0\0"; struct obj_data *temp = NULL; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); 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) { do_sip(ch, argument, 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("Ooups, 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) { if (DEBUG > 2) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), SAFE_ONAME(obj_object), keyword); switch (keyword) { case 0: act("$n lights $p and holds it.", FALSE, ch, obj_object, 0, TO_ROOM); break; case 1: act("$n wears $p on $s finger.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 2: act("$n wears $p around $s neck.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 3: act("$n wears $p on $s body.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 4: act("$n wears $p on $s head.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 5: act("$n wears $p on $s legs.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 6: act("$n wears $p on $s feet.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 7: act("$n wears $p on $s hands.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 8: act("$n wears $p on $s arms.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 9: act("$n wears $p about $s body.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 10: act("$n wears $p about $s waist.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 11: act("$n wears $p around $s wrist.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 12: act("$n wields $p.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 13: act("$n grabs $p.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 14: act("$n starts using $p as shield.", TRUE, ch, obj_object, 0, TO_ROOM); break; case 15: act("$n wields $p two handed.", TRUE, ch, obj_object, 0, TO_ROOM); break; } } int IsRestricted(int Mask, int Class) { int i = 0; if (DEBUG > 2) log_info("called %s with %d, %d", __PRETTY_FUNCTION__, Mask, Class); for (i = CLASS_MAGIC_USER; i <= CLASS_DRUID; i *= 2) { if (IS_SET(Mask, i) && (IS_NOT_SET(i, Class))) { Mask -= i; } } if (Mask == Class) return (TRUE); return (FALSE); } void wear(struct char_data *ch, struct obj_data *obj_object, int keyword) { int BitMask = 0; if (DEBUG > 2) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), SAFE_ONAME(obj_object), keyword); if (!IS_IMMORTAL(ch)) { BitMask = GetItemClassRestrictions(obj_object); if (IsRestricted(BitMask, ch->player.class) && (IS_PC(ch) || IS_SET(ch->specials.act, ACT_POLYSELF))) { cprintf(ch, "You are forbidden to do that.\r\n"); return; } } if (!IsHumanoid(ch)) { if ((keyword != 13) || (!HasHands(ch))) { cprintf(ch, "You can't wear things!\r\n"); return; } } switch (keyword) { case 0: { /* LIGHT SOURCE */ if (ch->equipment[WEAR_LIGHT]) cprintf(ch, "You are already holding a light source.\r\n"); else { cprintf(ch, "Ok.\r\n"); 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]) real_roomp(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])) { cprintf(ch, "You are already wearing something on your fingers.\r\n"); } else { perform_wear(ch, obj_object, keyword); if (ch->equipment[WEAR_FINGER_L]) { cprintf(ch, "You put %s on your right finger.\r\n", obj_object->short_description); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_FINGER_R); } else { cprintf(ch, "You put %s on your left finger.\r\n", obj_object->short_description); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_FINGER_L); } } } else { cprintf(ch, "You can't wear that on your finger.\r\n"); } } break; case 2: { if (CAN_WEAR(obj_object, ITEM_WEAR_NECK)) { if ((ch->equipment[WEAR_NECK_1]) && (ch->equipment[WEAR_NECK_2])) { cprintf(ch, "You can't wear any more around your neck.\r\n"); } else { cprintf(ch, "OK.\r\n"); 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 { cprintf(ch, "You can't wear that around your neck.\r\n"); } } break; case 3: { if (CAN_WEAR(obj_object, ITEM_WEAR_BODY)) { if (ch->equipment[WEAR_BODY]) { cprintf(ch, "You already wear something on your body.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_BODY); } } else { cprintf(ch, "You can't wear that on your body.\r\n"); } } break; case 4: { if (CAN_WEAR(obj_object, ITEM_WEAR_HEAD)) { if (ch->equipment[WEAR_HEAD]) { cprintf(ch, "You already wear something on your head.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_HEAD); } } else { cprintf(ch, "You can't wear that on your head.\r\n"); } } break; case 5:{ if (CAN_WEAR(obj_object, ITEM_WEAR_LEGS)) { if (ch->equipment[WEAR_LEGS]) { cprintf(ch, "You already wear something on your legs.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_LEGS); } } else { cprintf(ch, "You can't wear that on your legs.\r\n"); } } break; case 6:{ if (CAN_WEAR(obj_object, ITEM_WEAR_FEET)) { if (ch->equipment[WEAR_FEET]) { cprintf(ch, "You already wear something on your feet.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_FEET); } } else { cprintf(ch, "You can't wear that on your feet.\r\n"); } } break; case 7:{ if (CAN_WEAR(obj_object, ITEM_WEAR_HANDS)) { if (ch->equipment[WEAR_HANDS]) { cprintf(ch, "You already wear something on your hands.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_HANDS); } } else { cprintf(ch, "You can't wear that on your hands.\r\n"); } } break; case 8:{ if (CAN_WEAR(obj_object, ITEM_WEAR_ARMS)) { if (ch->equipment[WEAR_ARMS]) { cprintf(ch, "You already wear something on your arms.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_ARMS); } } else { cprintf(ch, "You can't wear that on your arms.\r\n"); } } break; case 9:{ if (CAN_WEAR(obj_object, ITEM_WEAR_ABOUT)) { if (ch->equipment[WEAR_ABOUT]) { cprintf(ch, "You already wear something about your body.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_ABOUT); } } else { cprintf(ch, "You can't wear that about your body.\r\n"); } } break; case 10:{ if (CAN_WEAR(obj_object, ITEM_WEAR_WAISTE)) { if (ch->equipment[WEAR_WAISTE]) { cprintf(ch, "You already wear something about your waist.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_WAISTE); } } else { cprintf(ch, "You can't wear that about your waist.\r\n"); } } break; case 11:{ if (CAN_WEAR(obj_object, ITEM_WEAR_WRIST)) { if ((ch->equipment[WEAR_WRIST_L]) && (ch->equipment[WEAR_WRIST_R])) { cprintf(ch, "You already wear something around both your wrists.\r\n"); } else { perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); if (ch->equipment[WEAR_WRIST_L]) { cprintf(ch, "You wear the %s around your right wrist.\r\n", obj_object->short_description); equip_char(ch, obj_object, WEAR_WRIST_R); } else { cprintf(ch, "You wear the %s around your left wrist.\r\n", obj_object->short_description); equip_char(ch, obj_object, WEAR_WRIST_L); } } } else { cprintf(ch, "You can't wear that around your wrist.\r\n"); } } break; case 12: if (CAN_WEAR(obj_object, ITEM_WIELD)) { if (ch->equipment[WIELD] || ch->equipment[WIELD_TWOH]) { cprintf(ch, "You are already wielding something.\r\n"); } else { if (GET_OBJ_WEIGHT(obj_object) > str_app[STRENGTH_APPLY_INDEX(ch)].wield_w) { cprintf(ch, "It is too heavy for you to use.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WIELD); } } } else { cprintf(ch, "You can't wield that.\r\n"); } break; case 13: if (CAN_WEAR(obj_object, ITEM_HOLD)) { if (ch->equipment[HOLD]) { cprintf(ch, "You are already holding something.\r\n"); } else if (ch->equipment[WIELD_TWOH]) { cprintf(ch, "You are wielding a two handed blade, you can't hold things!\r\n"); } else if (ch->equipment[WEAR_SHIELD]) { cprintf(ch, "Your hands are full already, you loser.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, HOLD); } } else { cprintf(ch, "You can't hold this.\r\n"); } break; case 14: { if (CAN_WEAR(obj_object, ITEM_WEAR_SHIELD)) { if ((ch->equipment[WEAR_SHIELD])) { cprintf(ch, "You are already using a shield\r\n"); } else if (ch->equipment[WIELD_TWOH]) { cprintf(ch, "You can not use a shield while wielding a two handed weapon!\r\n"); } else if (ch->equipment[HOLD]) { cprintf(ch, "Your hands are full already, you are holding something.\r\n"); } else { perform_wear(ch, obj_object, keyword); cprintf(ch, "You start using the %s.\r\n", obj_object->short_description); obj_from_char(obj_object); equip_char(ch, obj_object, WEAR_SHIELD); } } else { cprintf(ch, "You can't use that as a shield.\r\n"); } } break; case 15: if (CAN_WEAR(obj_object, ITEM_WIELD_TWOH)) { if ((ch->equipment[WIELD]) || (ch->equipment[WIELD_TWOH])) { cprintf(ch, "You are already wielding something.\r\n"); } else if (ch->equipment[WEAR_SHIELD]) { cprintf(ch, "You can not wield two handed weapons and use a shield!\r\n"); } else if (ch->equipment[HOLD]) { cprintf(ch, "But you are holding something!\r\n"); } else { if (GET_OBJ_WEIGHT(obj_object) > str_app[STRENGTH_APPLY_INDEX(ch)].wield_w) { cprintf(ch, "It is too heavy for you to use.\r\n"); } else { cprintf(ch, "OK.\r\n"); perform_wear(ch, obj_object, keyword); obj_from_char(obj_object); equip_char(ch, obj_object, WIELD_TWOH); } } } else { cprintf(ch, "You can't wield that two handed.\r\n"); } break; case -1:{ cprintf(ch, "Wear %s where?.\r\n", obj_object->short_description); } break; case -2:{ cprintf(ch, "You can't wear %s.\r\n", obj_object->short_description); } break; default:{ log_error("Unknown type called in wear."); } break; } } void do_wear(struct char_data *ch, const char *argument, int cmd) { char arg1[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; char arg2[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; struct obj_data *obj_object = NULL; struct obj_data *next_obj = NULL; int keyword = 0; static const char *keywords[] = { "finger", "neck", "body", "head", "legs", "feet", "hands", "arms", "about", "waist", "wrist", "shield", "\n" }; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); argument_interpreter(argument, arg1, arg2); if (*arg1) { if (!strcmp(arg1, "all")) { for (obj_object = ch->carrying; obj_object; obj_object = next_obj) { next_obj = obj_object->next_content; keyword = -2; 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; if (CAN_WEAR(obj_object, ITEM_WIELD_TWOH)) keyword = 15; if (CAN_WEAR(obj_object, ITEM_WIELD)) keyword = 12; if (CAN_WEAR(obj_object, ITEM_WEAR_SHIELD)) keyword = 14; if (CAN_WEAR(obj_object, ITEM_HOLD)) keyword = 13; if (keyword != -2) { cprintf(ch, "%s :", obj_object->short_description); wear(ch, obj_object, keyword); } } } 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) { cprintf(ch, "%s is an unknown body location.\r\n", arg2); } else { wear(ch, obj_object, keyword + 1); } } 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); } } else { cprintf(ch, "You do not seem to have the '%s'.\r\n", arg1); } } } else { cprintf(ch, "Wear what?\r\n"); } } void do_wield(struct char_data *ch, const char *argument, int cmd) { char arg1[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0"; char arg2[MAX_STRING_LENGTH] = "\0\0\0\0\0\0\0"; struct obj_data *obj_object = NULL; int keyword = 12; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); argument_interpreter(argument, arg1, arg2); if (*arg1) { if (!strncmp("two", arg1, 3)) { if (*arg2) { obj_object = get_obj_in_list_vis(ch, arg2, ch->carrying); if (obj_object) { if (CAN_WEAR(obj_object, ITEM_WIELD_TWOH)) { keyword = 15; wear(ch, obj_object, keyword); } else { cprintf(ch, "That is not a two handed weapon!\r\n"); } } else { cprintf(ch, "You do not seem to have the '%s'.\r\n", arg2); } } else { /* no arg2, check if they can wield it one handed, arg1 */ obj_object = get_obj_in_list_vis(ch, arg1, ch->carrying); if (obj_object) { keyword = 12; wear(ch, obj_object, keyword); } else { cprintf(ch, "You do not seem to have the '%s'.\r\n", arg1); } } } else { obj_object = get_obj_in_list_vis(ch, arg1, ch->carrying); if (obj_object) { keyword = 12; wear(ch, obj_object, keyword); } else { cprintf(ch, "You do not seem to have the '%s'.\r\n", arg1); } } } else { cprintf(ch, "Wield what?\r\n"); } } void do_grab(struct char_data *ch, const char *argument, int cmd) { char arg1[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; char arg2[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; struct obj_data *obj_object = NULL; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); 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); else wear(ch, obj_object, 13); } else { cprintf(ch, "You do not seem to have the '%s'.\r\n", arg1); } } else { cprintf(ch, "Hold what?\r\n"); } } void do_remove(struct char_data *ch, const char *argument, int cmd) { char arg1[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; char *T = NULL; char *P = NULL; int Rem_List[20]; int Num_Equip = 0; struct obj_data *obj_object = NULL; int j = 0; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); one_argument(argument, arg1); if (*arg1) { if (!strcmp(arg1, "all")) { for (j = 0; j < MAX_WEAR; j++) { if (CAN_CARRY_N(ch) != IS_CARRYING_N(ch)) { if (ch->equipment[j]) { if ((obj_object = unequip_char(ch, j)) != NULL) { obj_to_char(obj_object, ch); if (obj_object->obj_flags.type_flag == ITEM_LIGHT) if (obj_object->obj_flags.value[2]) real_roomp(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 { cprintf(ch, "You can't carry any more stuff.\r\n"); j = MAX_WEAR; } } } if (isdigit(arg1[0])) { /* Make a list of item numbers for stuff to remove */ for (Num_Equip = j = 0; j < MAX_WEAR; j++) { if (CAN_CARRY_N(ch) != IS_CARRYING_N(ch)) { if (ch->equipment[j]) Rem_List[Num_Equip++] = j; } } T = arg1; while (isdigit(*T) && (*T != '\0')) { P = T; if (strchr(T, ',')) { P = strchr(T, ','); *P = '\0'; } if (atoi(T) > 0 && atoi(T) <= Num_Equip) { if (CAN_CARRY_N(ch) != IS_CARRYING_N(ch)) { j = Rem_List[atoi(T) - 1]; if (ch->equipment[j]) { if ((obj_object = unequip_char(ch, j)) != NULL) { obj_to_char(obj_object, ch); if (obj_object->obj_flags.type_flag == ITEM_LIGHT) if (obj_object->obj_flags.value[2]) real_roomp(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 { cprintf(ch, "You can't carry any more stuff.\r\n"); j = MAX_WEAR; } } else { cprintf(ch, "You dont seem to have the %s\r\n", T); } if (T != P) T = P + 1; else *T = '\0'; } } else { 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]) real_roomp(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 { cprintf(ch, "You can't carry that many items.\r\n"); } } else { cprintf(ch, "You are not using it.\r\n"); } } } else { cprintf(ch, "Remove what?\r\n"); } } void do_bury(struct char_data *ch, const char *argument, int cmd) { char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; struct obj_data *vict = NULL; struct obj_data *obj = NULL; struct obj_data *next = NULL; int experience = 0; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); one_argument(argument, buf); if (!*buf) { act("$n imitates Stalin, chanting 'We will bury you!'", FALSE, ch, 0, 0, TO_ROOM); act("You do a nice imitation of Stalin.", FALSE, ch, 0, 0, TO_CHAR); return; } else if (!(vict = get_obj_vis_accessible(ch, buf))) { cprintf(ch, "You feel you should go TO the %s first.\r\n", buf); return; } else if (!IS_CORPSE(vict)) { cprintf(ch, "You consider burying %s, but what if you can't find it again?\r\n", buf); return; } act("$n buries $p.", FALSE, ch, vict, ch, TO_ROOM); act("You bury $p.", FALSE, ch, vict, ch, TO_CHAR); for (obj = vict->contains; obj; obj = next) { next = obj->next_content; obj_from_obj(obj); extract_obj(obj); } extract_obj(vict); if (IS_MORTAL(ch)) { experience = number(1, 50); cprintf(ch, "You gain %d experience for your charity!\r\n", experience); GET_EXP(ch) += experience; GET_ALIGNMENT(ch) += number(0, 5); if (GET_ALIGNMENT(ch) > 999) GET_ALIGNMENT(ch) = 1000; WAIT_STATE(ch, 4); } return; } void do_desecrate(struct char_data *ch, const char *argument, int cmd) { char buf[MAX_INPUT_LENGTH] = "\0\0\0\0\0\0\0"; struct obj_data *vict = NULL; struct obj_data *obj = NULL; struct obj_data *next = NULL; int experience = 0; if (DEBUG) log_info("called %s with %s, %s, %d", __PRETTY_FUNCTION__, SAFE_NAME(ch), VNULL(argument), cmd); one_argument(argument, buf); if (!*buf) { act("$n looks around for things to desecrate.", FALSE, ch, 0, 0, TO_ROOM); act("You can't seem to find anything worth desecrating.", FALSE, ch, 0, 0, TO_CHAR); return; } else if (!(vict = get_obj_vis_accessible(ch, buf))) { cprintf(ch, "You feel you should go TO the %s first.\r\n", buf); return; } else if (!IS_CORPSE(vict)) { cprintf(ch, "You consider desecrating %s, but it just doesn't seem worth the bother.\r\n", buf); return; } act("$n stomps the bloody mush of $p into the ground and spits!", FALSE, ch, vict, ch, TO_ROOM); act("You stomp the bloody mush of $p into the dirt and spit!", FALSE, ch, vict, ch, TO_CHAR); for (obj = vict->contains; obj; obj = next) { next = obj->next_content; obj_from_obj(obj); extract_obj(obj); } extract_obj(vict); if (IS_MORTAL(ch)) { experience = number(1, 50); cprintf(ch, "You gain %d experience for your depravity!\r\n", experience); GET_EXP(ch) += experience; GET_ALIGNMENT(ch) -= number(0, 5); if (GET_ALIGNMENT(ch) < -999) GET_ALIGNMENT(ch) = -1000; WAIT_STATE(ch, 4); } return; }