#include <sys/types.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "emlen.h" static char bah[500]; extern char *const dir_rev[]; void do_drag (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; char buf[500]; SINGLE_OBJECT *obj; CHAR_DATA *rch; char arg2[SML_LENGTH]; int dir; ROOM_DATA *oldroom; DEFINE_COMMAND ("drag", do_drag, POSITION_STANDING, 0, LOG_NORMAL, "This command allows you to drag a corpse.") arg1[0] = '\0'; arg2[0] = '\0'; if (strlen (argy) >= 50) return; argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); if (arg1[0] == '\0') { send_to_char ("Drag what?\n\r", ch); return; } if (arg2[0] == '\0') { send_to_char ("In which direction?\n\r", ch); return; } if ((obj = get_obj_here (ch, arg1, SEARCH_ROOM_FIRST)) == NULL || obj->carried_by != NULL || obj->in_room == NULL) { send_to_char ("I don't see that object here....\n\r", ch); return; } if (obj->pIndexData->item_type != ITEM_CORPSE_PC && obj->pIndexData->item_type != ITEM_CORPSE_NPC && !CAN_WEAR (obj, ITEM_TAKE)) { send_to_char ("You can't drag that object...\n\r", ch); return; } if (ch->move < 10) { send_to_char ("You are too exhausted to drag anything...\n\r", ch); return; } dir = -1; if (arg2[0] == 'n' || arg2[0] == 'N') dir = DIR_NORTH; if (arg2[0] == 'w' || arg2[0] == 'W') dir = DIR_WEST; if (arg2[0] == 'e' || arg2[0] == 'E') dir = DIR_EAST; if (arg2[0] == 's' || arg2[0] == 'S') dir = DIR_SOUTH; if (arg2[0] == 'u' || arg2[0] == 'U') dir = DIR_UP; if (arg2[0] == 'd' || arg2[0] == 'D') dir = DIR_DOWN; if (dir == -1) { send_to_char ("Which direction?\n\r", ch); return; } oldroom = ch->in_room; if (!move_char (ch, dir)) { send_to_char ("How can you drag something to someplace you can't even go!\n\r", ch); return; } sprintf (buf, "%s drags %s %s.\n\r", NAME (ch), (obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr), dir_name[dir]); if (oldroom->more) for (rch = oldroom->more->people; rch != NULL; rch = rch->next_in_room) { if (rch == ch) continue; if (!IS_AWAKE (rch)) continue; send_to_char (buf, rch); } obj_from (obj); obj_to (obj, ch->in_room); sprintf (buf, "You drag %s into the room.\n\r", (obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr)); send_to_char (buf, ch); sprintf (buf, "%s drags %s in from %s.\n\r", NAME (ch), (obj->short_descr ? obj->short_descr : obj->pIndexData->short_descr), dir_rev[rev_dir[dir]]); for (rch = ch->in_room->more->people; rch != NULL; rch = rch->next_in_room) { if (rch == ch) continue; if (!IS_AWAKE (rch)) continue; send_to_char (buf, rch); } SUBMOVE(ch, number_range (8, 10)); return; } void do_meditate (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("meditate", do_meditate, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to meditate, and focus on magical energy regeneration.") if (RIDING (ch) != NULL) { send_to_char ("If you wanted to sit and meditate, you would not be riding!\n\r", ch); return; } if (ch->fgt && ch->fgt->ears > 9) { send_to_char ("You are bashed; you can't meditate...\n\r", ch); return; } if (FIGHTING(ch)) { if (FIGHTING(ch)->in_room != ch->in_room) { ch->fgt->fighting = NULL; NEW_POSITION(ch, POSITION_STANDING); } else { act ("You must start meditation from a standing or resting position.", ch, NULL, NULL, TO_CHAR); return; } } if (ch->position != POSITION_STANDING && ch->position != POSITION_RESTING && ch->position != POSITION_MEDITATING) { act ("You must start meditation from a standing or resting position.", ch, NULL, NULL, TO_CHAR); return; } if (ch->position == POSITION_MEDITATING) { NEW_POSITION(ch, POSITION_STANDING); act ("You stop meditating, and clamber to your feet.", ch, NULL, NULL, TO_CHAR); act ("$N stops meditating, and clambers to $s feet.", ch, NULL, ch, TO_ROOM); return; } NEW_POSITION(ch, POSITION_MEDITATING); act ("You sit down cross-legged and begin meditating.", ch, NULL, NULL, TO_CHAR); act ("$N sits down, clears $s mind, and begins meditating.", ch, NULL, ch, TO_ROOM); return; } void get_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj, SINGLE_OBJECT * container, bool opp_align) { CHAR_DATA *fch; CHAR_DATA *fch_next; if (!CAN_WEAR (obj, ITEM_TAKE)) { send_to_char ("You can't take that.\n\r", ch); return; } for (fch = ch->in_room->more->people; fch != NULL; fch = fch_next) { fch_next = fch->next_in_room; if (IS_MOB (fch) && IS_SET (fch->pIndexData->act3, ACT3_GUARD_ITEM) && obj->pIndexData->vnum == fch->pIndexData->guard) { do_say (fch, "Don't touch that!"); multi_hit (fch, ch, TYPE_UNDEFINED); } } if (!opp_align) { if (container != NULL) { act ("You get $p\x1B[37;0m from $P\x1B[0m.", ch, obj, container, TO_CHAR); act ("$n gets $p\x1B[37;0m from $P\x1B[0m.", ch, obj, container, TO_ROOM); } else { act ("You get $p\x1B[37;0m.", ch, obj, container, TO_CHAR); act ("$n gets $p\x1B[37;0m.", ch, obj, container, TO_ROOM); } } if (obj->pIndexData->vnum > 90000 && (obj->pIndexData->item_type == ITEM_FURNITURE || obj->pIndexData->item_type == ITEM_TOOL)) { fprintf (stderr, "FORGECRAP %s gotten by %s at %d.\n", OOSTR(obj, short_descr), NAME(ch), ch->in_room->vnum); } obj_from (obj); obj->wear_loc = -1; obj_to (obj, ch); if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) SET_BIT(ch->act, PLR_HAS_BOAT); } return; } void do_take (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("take", do_get, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to get an object from an object, or from the ground.") return; } void do_get (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; char arg2[SML_LENGTH]; char buffy[SML_LENGTH]; SINGLE_OBJECT *obj; SINGLE_OBJECT *obj_next; SINGLE_OBJECT *container; CHAR_DATA *fch; I_CONTAINER *cnt; bool found = FALSE; bool gonnasave = FALSE; bool opp_align = FALSE; DEFINE_COMMAND ("get", do_get, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to get an object from an object, or from the ground.") check_room_more (ch->in_room); if(IS_PLAYER(ch)) { for(fch = ch->in_room->more->people; fch != NULL; fch = fch->next_in_room) { if (IS_PLAYER(fch) && DIFF_ALIGN(ch, fch)) { opp_align = TRUE; break; } } } if (!str_cmp (argy, "all corpse")) { argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); } else { argy = one_argy (argy, arg1); while (str_prefix ("from", argy) && argy != "" && argy[0] != '\0') argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); while (argy != "" && argy[0] != '\0') argy = one_argy (argy, arg2); } if (arg1[0] == '\0') { send_to_char ("Get what?\n\r", ch); return; } if (arg2[0] == '\0') { if (str_cmp (arg1, "all") && str_prefix ("all.", arg1)) { if (!str_cmp (arg1, "coins") || !str_cmp (arg1, "coin")) { found = FALSE; if (ch->in_room->more->gold > 0) { found = TRUE; sprintf(bah, "You pick up \x1b[1;33m%d\x1b[0;37m gold.\n\r", ch->in_room->more->gold); send_to_char(bah, ch); ch->gold += ch->in_room->more->gold; ch->in_room->more->gold = 0; } if (ch->in_room->more->copper > 0) { found = TRUE; sprintf(bah, "You pick up \x1b[33m%d\x1b[0;37m copper.\n\r", ch->in_room->more->copper); send_to_char(bah, ch); ch->copper += ch->in_room->more->copper; ch->in_room->more->copper = 0; } if (!found) send_to_char("There are no coins here to pick up.\n\r", ch); return; } obj = get_obj_list (ch, arg1, ch->in_room->more->contents); if (obj == NULL || IS_SET (obj->extra_flags, ITEM_UNSEEN)) { act ("It isn't here.", ch, NULL, NULL, TO_CHAR); return; } get_obj (ch, obj, NULL, opp_align); if (opp_align) { act("You pick up $p.", ch, obj,NULL , TO_CHAR); act("$n picks up $p.", ch, obj, NULL, TO_ROOM); } } else { found = FALSE; if (ch->in_room->more->gold > 0) { found = TRUE; sprintf(bah, "You pick up \x1b[1;33m%d\x1b[0;37m gold.\n\r", ch->in_room->more->gold); send_to_char(bah, ch); ch->gold += ch->in_room->more->gold; ch->in_room->more->gold = 0; } if (ch->in_room->more->copper > 0) { found = TRUE; sprintf(bah, "You pick up \x1b[33m%d\x1b[0;37m copper.\n\r", ch->in_room->more->copper); send_to_char(bah, ch); ch->copper += ch->in_room->more->copper; ch->in_room->more->copper = 0; } for (obj = ch->in_room->more->contents; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if ((arg1[3] == '\0' || is_name (&arg1[4], obj->pIndexData->name)) && can_see_obj (ch, obj) && !IS_SET (obj->extra_flags, ITEM_UNSEEN)) { found = TRUE; get_obj (ch, obj, NULL, opp_align); } } if (!found) { if (arg1[3] == '\0') send_to_char ("I see nothing here.\n\r", ch); else act ("I don't see that here.", ch, NULL, NULL, TO_CHAR); } else if (opp_align) { act("You pick up several items.", ch, NULL,NULL , TO_CHAR); act("$n gathers up several things off the ground.", ch, NULL, NULL, TO_ROOM); } } } else { if (!str_cmp (arg2, "all") || !str_prefix ("all.", arg2)) { send_to_char ("You can't do that.\n\r", ch); return; } if ((container = (!str_prefix ("cor", arg2) ? get_obj_here (ch, arg2, SEARCH_ROOM_FIRST) : get_obj_here (ch, arg2, SEARCH_INV_FIRST))) == NULL) { send_to_char("That does not appear to be here.\n\r", ch); return; } switch (container->pIndexData->item_type) { default: send_to_char ("You can't look inside that...\n\r", ch); return; case ITEM_CONTAINER: case ITEM_CORPSE_NPC: { cnt = (I_CONTAINER *) container->more; if ((cnt->money > 0 || container->contains) && strlen (NAME (ch)) < 30) { if (cnt->looted_by[0] == '\0') { strcpy (cnt->looted_by, NAME (ch)); } else if (cnt->looted_by_two[0] == '\0' && str_cmp (NAME (ch), cnt->looted_by)) { strcpy (cnt->looted_by_two, NAME (ch)); } } } break; case ITEM_CORPSE_PC: { char name[SML_LENGTH]; char *pd; if (!pow.get_from_corpse_while_in_combat && FIGHTING (ch)) { send_to_char ("You don't have time to loot the corpse while you are fighting!\n\r", ch); return; } cnt = (I_CONTAINER *) container->more; pd = OOSTR (container, short_descr); pd = one_argy (pd, name); pd = one_argy (pd, name); pd = one_argy (pd, name); pd = one_argy (pd, name); /*name now equals the name of the person */ if (IS_PLAYER(ch) && LEVEL(ch)<=pow.loot_level && str_cmp(name,NAME(ch))) { send_to_char("You cannot loot another person's corpse at that low level.\n\r",ch); return; } if ((container->contains || cnt->money > 0) && str_cmp (NAME (ch), capitalize (name))) { if (strlen (NAME (ch)) < 30) { if (cnt->looted_by[0] == '\0') { strcpy (cnt->looted_by, NAME (ch)); } else if (cnt->looted_by_two[0] == '\0' && str_cmp (NAME (ch), cnt->looted_by)) { strcpy (cnt->looted_by_two, NAME (ch)); } } fprintf (stderr, "%s just took something from %s's corpse.\n", NAME (ch), capitalize (name)); } if (container->contains || cnt->money > 0) { sprintf (buffy, "%s%s.cor", PLAYER_DIR_2, capitalize (name)); unlink (buffy); } gonnasave = TRUE; if (IS_PLAYER (ch) && str_cmp (NAME (ch), capitalize (name))) { if (ch->pcdata->no_quit_pk < 4); ch->pcdata->no_quit_pk = 4;/*JRAJRA*/ } /* JRAJRA -noquit stuff */ } } cnt = (I_CONTAINER *) container->more; if (IS_SET (cnt->flags, CONT_CLOSED)) { act ("The $d is closed.", ch, NULL, container->pIndexData->name, TO_CHAR); return; } if (str_cmp (arg1, "all") && str_prefix ("all.", arg1)) { cnt = (I_CONTAINER *) container->more; if (!str_cmp (arg1, "coins")) { if (cnt->money < 1) { send_to_char ("I see no coins in there.\n\r", ch); return; } sprintf (bah, "You get %d copper from %s\x1B[0;37m.\n\r", cnt->money, OOSTR (container, short_descr)); ch->copper += cnt->money; cnt->money = 0; send_to_char (bah, ch); return; } obj = get_obj_list (ch, arg1, container->contains); if (obj == NULL) { act ("There is nothing like that in the $T\x1B[0m.", ch, NULL, arg2, TO_CHAR); return; } get_obj (ch, obj, container, opp_align); if (opp_align) { act("You get $p from $P.", ch, obj, container, TO_CHAR); act("$n reaches in and gets $p out of $P.", ch, obj, container, TO_ROOM); } } else { cnt = (I_CONTAINER *) container->more; found = FALSE; if (cnt->money > 0) { sprintf (bah, "You get %s from %s.\x1B[0;37m\n\r", name_amount (cnt->money), OOSTR (container, short_descr)); ch->copper += cnt->money; cnt->money = 0; send_to_char (bah, ch); found = TRUE; } for (obj = container->contains; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if ((arg1[3] == '\0' || is_name (&arg1[4], obj->pIndexData->name)) && can_see_obj (ch, obj)) { found = TRUE; get_obj (ch, obj, container, opp_align); } } if (!found) { if (arg1[3] == '\0') act ("I see nothing in $T\x1B[0m.", ch, NULL, arg2, TO_CHAR); else act ("I see nothing like that in $T\x1B[0m.", ch, NULL, arg2, TO_CHAR); } else { if (opp_align) { if (arg1[3] == '\0') { act ("You get some things from $P\x1B[0m.", ch, NULL,container,TO_CHAR); act ("$n gets some things from $P\x1b[0;37m.", ch, NULL,container,TO_ROOM); } else { act ("You get some things from $P\x1B[0m.", ch,NULL,container,TO_CHAR); act ("$n gets some stuff from $P\x1b[0;37m.", ch, NULL,container, TO_ROOM); } } } } } if (IS_PLAYER (ch)) update_weight_num (ch); check_clear_more (ch->in_room); return; } void do_put (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; char arg2[SML_LENGTH]; SINGLE_OBJECT *container; SINGLE_OBJECT *obj; SINGLE_OBJECT *obj_next; I_CONTAINER *cnt; DEFINE_COMMAND ("put", do_put, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to put an object in something.") argy = one_argy (argy, arg1); while (str_prefix ("in", argy) && argy != "" && argy[0] != '\0') argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); while (argy != "" && argy[0] != '\0') argy = one_argy (argy, arg2); if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char ("Put what in what?\n\r", ch); return; } if (!str_cmp (arg1, "all.coin") || !str_cmp (arg1, "coin") || !str_cmp (arg1, "all.coins") || !str_cmp (arg1, "coins")) { char buffu[500]; if ((container = get_obj_here (ch, arg2, SEARCH_INV_FIRST)) == NULL) { act ("I see no $T here.", ch, NULL, arg2, TO_CHAR); return; } if (container->pIndexData->item_type != ITEM_CONTAINER) { send_to_char ("You can't put anything inside of that.\n\r", ch); return; } cnt = (I_CONTAINER *) container->more; cnt->money += ch->copper; sprintf (buffu, "You put your copper in %s. (Gold pieces can't go inside containers).\n\r", OOSTR (container, short_descr)); act (buffu, ch, NULL, ch, TO_CHAR); ch->copper = 0; return; } if (!str_cmp (arg2, "all") || !str_prefix ("all.", arg2)) { send_to_char ("You can't do that.\n\r", ch); return; } if ((container = get_obj_here (ch, arg2, SEARCH_INV_FIRST)) == NULL) { act ("I see no $T here.", ch, NULL, arg2, TO_CHAR); return; } if (container->pIndexData->item_type != ITEM_CONTAINER) { send_to_char ("That's not a container.\n\r", ch); return; } cnt = (I_CONTAINER *) container->more; if (IS_SET (cnt->flags, CONT_CLOSED)) { act ("The $d is closed.", ch, NULL, container->pIndexData->name, TO_CHAR); return; } if (str_cmp (arg1, "all") && str_prefix ("all.", arg1)) { if ((obj = get_obj_inv (ch, arg1)) == NULL) { send_to_char ("You do not have that item.\n\r", ch); return; } if (obj->wear_loc!=WEAR_NONE && IS_SET (obj->extra_flags, ITEM_NOREMOVE)) { send_to_char("You can't remove that item!\n\r",ch); return; } if (obj == container) { send_to_char ("Now that would be a trick, eh?\n\r", ch); return; } if (!can_drop_obj (ch, obj)) { send_to_char ("You can't let go of it.\n\r", ch); return; } if ((cnt->max_weight + container->pIndexData->weight) < (get_obj_weight (obj) + get_obj_weight (container))) { send_to_char ("It won't fit.\n\r", ch); return; } obj_from (obj); obj_to (obj, container); if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) REMOVE_BIT(ch->act, PLR_HAS_BOAT); } act ("$n puts $p\x1B[0m in $P\x1B[0m.", ch, obj, container, TO_ROOM); act ("You put $p\x1B[0m in $P\x1B[0m.", ch, obj, container, TO_CHAR); } else { cnt = (I_CONTAINER *) container->more; for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if ((arg1[3] == '\0' || is_name (&arg1[4], obj->pIndexData->name)) && can_see_obj (ch, obj) && obj->wear_loc == WEAR_NONE && obj != container && can_drop_obj (ch, obj) && get_obj_weight (obj) + get_obj_weight (container) <= cnt->max_weight) { obj_from (obj); obj_to (obj, container); if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) REMOVE_BIT(ch->act, PLR_HAS_BOAT); } act ("$n puts $p\x1B[0m in $P\x1B[0m.", ch, obj, container, TO_ROOM); act ("You put $p\x1B[0m in $P\x1B[0m.", ch, obj, container, TO_CHAR); } } } return; } void do_drop (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; char buf[SML_LENGTH]; CHAR_DATA *fch; bool opp_align = FALSE; int amount; SINGLE_OBJECT *obj_next; bool found = FALSE; char arg2[SML_LENGTH]; DEFINE_COMMAND ("drop", do_drop, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to drop an object.") argy = one_argy (argy, arg); if (!is_number (arg)) { while (argy != "" && argy[0] != '\0') argy = one_argy (argy, arg); } argy = one_argy (argy, arg2); if (!ch->in_room || !ch->in_room->more) return; if (IS_PLAYER(ch) && ch->pcdata->no_quit_pk >= 6) { bool opp_align_in_room = FALSE; CHAR_DATA *rch; for (rch = ch->in_room->more->people; rch != NULL; rch = rch->next_in_room) { if (IS_PLAYER(rch) && DIFF_ALIGN(ch, rch)) { opp_align_in_room = TRUE; break; } } /* if (!opp_align_in_room) { send_to_char("You cannot drop things now! Your heart is racing too much!\n\r", ch); return; } */ } CAN_DROP_ITEMS_IN_BGROUND (no) CAN_DROP_ITEMS_IN_ARENA (no) if (IS_PLAYER(ch)) for (fch = ch->in_room->more->people; fch != NULL; fch = fch->next_in_room) { if (IS_PLAYER(fch) && DIFF_ALIGN(ch, fch)) { opp_align = TRUE; break; } } if (arg[0] == '\0') { send_to_char ("Drop what?\n\r", ch); return; } if (!str_cmp (arg, "coin") || !str_cmp (arg, "coins") || !str_cmp (arg, "all.coin") || !str_cmp (arg, "all.coins")) { char bufff[500]; if (tally_coins (ch) < 0) { send_to_char ("You have no coins in your inventory!\n\r", ch); return; } if (LEVEL (ch) < 100 || IS_REAL_GOD (ch)) { ch->in_room->more->copper += ch->copper; ch->in_room->more->gold += ch->gold; } sprintf (bufff, "You drop your coins.\n\r"); act("$n drops some coins.", ch, NULL,NULL, TO_ROOM); send_to_char (bufff, ch); ch->gold = 0; ch->copper = 0; return; } if (IS_PLAYER (ch)) { update_weight_num (ch); /*save_char_obj(ch); */ } if ((!str_cmp (arg2, "gold")) && (is_number (arg) && atoi (arg) > 0)) { amount = atoi (arg); if (amount < 1) return; if (ch->gold < amount) { send_to_char ("You don't have that many \x1B[1;33mgold\x1B[37;0m coins.\n\r", ch); return; } ch->gold -= amount; if (ch->in_room->sector_type != SECT_WATER_SWIM && ch->in_room->sector_type != SECT_WATER_NOSWIM && ((LEVEL (ch) < 100) || IS_REAL_GOD (ch))) ch->in_room->more->gold += amount; sprintf (buf, "You drop %d \x1B[1;33mgold\x1B[37;0m coins.\n\r", amount); send_to_char (buf, ch); act ("$n drops some \x1B[1;33mgold\x1B[37;0m coins.", ch, NULL, NULL, TO_ROOM); return; } if ((!str_cmp (arg2, "copper")) && (is_number (arg) && atoi (arg) > 0)) { amount = atoi (arg); if (amount < 1) return; if (ch->copper < amount) { send_to_char ("You don't have that many \x1B[33mcopper\x1B[37;0m coins.\n\r", ch); return; } ch->copper -= amount; if (ch->in_room->sector_type != SECT_WATER_SWIM && ch->in_room->sector_type != SECT_WATER_NOSWIM && ((LEVEL (ch) < 100) || IS_REAL_GOD (ch))) ch->in_room->more->copper += amount; sprintf (buf, "You drop %d \x1B[33mcopper\x1B[37;0m coins.\n\r", amount); send_to_char (buf, ch); act ("$n drops some \x1B[33mcopper\x1B[37;0m coins.", ch, NULL, NULL, TO_ROOM); return; } if ((str_cmp (arg, "all") && str_prefix ("all.", arg)) || (ch->fgt && ch->fgt->combat_delay_count == 9)) { if ((obj = get_obj_inv (ch, arg)) == NULL) { send_to_char ("You do not have that item.\n\r", ch); return; } else if ((!NOT_WORN (obj)) /*|| (obj->wear_loc==WEAR_HOLD_1) || (obj->wear_loc==WEAR_HOLD_2) */ ) { send_to_char ("You will have to remove it first.\n\r", ch); return; } if (!can_drop_obj (ch, obj)) { send_to_char ("You can't let go of it.\n\r", ch); return; } if (obj->wear_loc == -1 && !IS_SET (obj->extra_flags, ITEM_UNSEEN) && (ch->fgt && ch->fgt->combat_delay_count == 9)) { act ("You hide $p\x1B[0m in the room.", ch, obj, NULL, TO_CHAR); ch->fgt->combat_delay_count = 0; obj->extra_flags ^= ITEM_UNSEEN; obj_from (obj); if (ch->in_room->sector_type == SECT_WATER_SWIM || ch->in_room->sector_type == SECT_WATER_NOSWIM) { act ("The waters cause $p to sink beneath them; lost forever.", ch, obj, NULL, TO_CHAR); free_it (obj); return; } obj_to (obj, ch->in_room); if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) REMOVE_BIT(ch->act, PLR_HAS_BOAT); } if (number_percent () > ch->pcdata->learned[gsn_hide] + ch->pcdata->plus_hide) act ("$n hides $p\x1B[0m.", ch, obj, NULL, TO_ROOM); return; } act ("You drop $p\x1B[37;0m.", ch, obj, NULL, TO_CHAR); act ("$n drops $p\x1B[37;0m.", ch, obj, NULL, TO_ROOM); obj_from (obj); if (obj->pIndexData->item_type != ITEM_BOAT && (ch->in_room->sector_type == SECT_WATER_SWIM || ch->in_room->sector_type == SECT_WATER_NOSWIM)) { act ("The waters cause $p to sink beneath them; lost forever.", ch, obj, NULL, TO_CHAR); free_it (obj); } else { obj_to (obj, ch->in_room); if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) REMOVE_BIT(ch->act, PLR_HAS_BOAT); } if (IS_OBJ_STAT(obj, ITEM_DROPSCRIPT)) { again_8: /* Dropped item, check for triggers on object! */ { SINGLE_TRIGGER *tr; SCRIPT_INFO *s; for (tr = trigger_list[TDROPPED]; tr != NULL; tr = tr->next) { if (obj->pIndexData->vnum == tr->attached_to_obj) { if (tr->running_info && !tr->interrupted) continue; /* Already running, interrupted, but script says not to allow interruptions. */ if (tr->running_info && tr->interrupted != 2) { end_script (tr->running_info); goto again_8; } { char tmp[500]; sprintf(tmp,"%d",ch->in_room->vnum); if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords)) continue; } /* ----------------- */ /* Start the script! */ /* ----------------- */ tr->running_info = mem_alloc (sizeof (*tr->running_info)); s = tr->running_info; bzero (s, sizeof (*s)); s->current = ch; s->obj = obj; strcpy (s->code_seg, tr->code_label); s->current_line = 0; s->called_by = tr; s->next = info_list; info_list = s; execute_code (s); /* ----------------- */ } } } } /* End trigger check! */ if (IS_SET(ch->in_room->room_flags, ROOM_DROPSCRIPT)) { again_9: /* Dropped item, check for triggers on room! */ { SINGLE_TRIGGER *tr; SCRIPT_INFO *s; for (tr = trigger_list[TDROPPED]; tr != NULL; tr = tr->next) { if (ch->in_room->vnum == tr->attached_to_room) { if (tr->running_info && !tr->interrupted) continue; /* Already running, interrupted, but script says not to allow interruptions. */ if (tr->running_info && tr->interrupted != 2) { end_script (tr->running_info); goto again_9; } { char tmp[50]; sprintf(tmp,"%d",obj->pIndexData->vnum); if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords)) continue; } /* ----------------- */ /* Start the script! */ /* ----------------- */ tr->running_info = mem_alloc (sizeof (*tr->running_info)); s = tr->running_info; bzero (s, sizeof (*s)); s->current = ch; s->room = ch->in_room; s->obj = obj; strcpy (s->code_seg, tr->code_label); s->current_line = 0; s->called_by = tr; s->next = info_list; info_list = s; execute_code (s); /* ----------------- */ } } } } /* End trigger check! */ } } else { if (!str_cmp (arg, "all")) { found = FALSE; if (tally_coins (ch) > 0) { char bunl[500]; if (ch->in_room->sector_type != SECT_WATER_SWIM && ch->in_room->sector_type != SECT_WATER_NOSWIM && (LEVEL (ch) < 100 || IS_REAL_GOD (ch))) { ch->in_room->more->gold += ch->gold; ch->in_room->more->copper += ch->copper; } sprintf (bunl, "You drop your coins.\n\r"); send_to_char (bunl, ch); found = TRUE; ch->gold = 0; ch->copper = 0; } } for (obj = ch->carrying; obj != NULL; obj = obj_next) { if (!obj->next_content) obj_next = NULL; else obj_next = obj->next_content; if ((arg[3] == '\0' || is_name (&arg[4], obj->pIndexData->name)) && can_see_obj (ch, obj) && (obj->wear_loc == WEAR_NONE) && can_drop_obj (ch, obj)) { found = TRUE; if (IS_PLAYER(ch) && !opp_align) { act ("$n drops $p\x1B[37;0m.", ch, obj, NULL, TO_ROOM); act ("You drop $p\x1B[37;0m.", ch, obj, NULL, TO_CHAR); } obj_from (obj); if (obj->pIndexData->item_type != ITEM_BOAT && (ch->in_room->sector_type == SECT_WATER_SWIM || ch->in_room->sector_type == SECT_WATER_NOSWIM)) { act ("The waters cause $p to sink beneath them; lost forever.", ch, obj, NULL, TO_CHAR); free_it (obj); } else { if (IS_OBJ_STAT(obj, ITEM_DROPSCRIPT)) { again_10: /* Dropped item, check for triggers on object! */ { SINGLE_TRIGGER *tr; SCRIPT_INFO *s; for (tr = trigger_list[TDROPPED]; tr != NULL; tr = tr->next) { if (obj->pIndexData->vnum == tr->attached_to_obj) { if (tr->running_info && !tr->interrupted) continue; /* Already running, interrupted, but script says not to allow interruptions. */ if (tr->running_info && tr->interrupted != 2) { end_script (tr->running_info); goto again_10; } { char tmp[50]; sprintf(tmp,"%d",ch->in_room->vnum); if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords)) continue; } /* ----------------- */ /* Start the script! */ /* ----------------- */ tr->running_info = mem_alloc (sizeof (*tr->running_info)); s = tr->running_info; bzero (s, sizeof (*s)); s->current = ch; s->obj = obj; strcpy (s->code_seg, tr->code_label); s->current_line = 0; s->called_by = tr; s->next = info_list; info_list = s; execute_code (s); /* ----------------- */ } } } } /* End trigger check! */ if (IS_SET(ch->in_room->room_flags, ROOM_DROPSCRIPT)) { again_11: /* Dropped item, check for triggers on room! */ { SINGLE_TRIGGER *tr; SCRIPT_INFO *s; for (tr = trigger_list[TDROPPED]; tr != NULL; tr = tr->next) { if (ch->in_room->vnum == tr->attached_to_room) { if (tr->running_info && !tr->interrupted) continue; /* Already running, interrupted, but script says not to allow interruptions. */ if (tr->running_info && tr->interrupted != 2) { end_script (tr->running_info); goto again_11; } { char tmp[50]; sprintf(tmp,"%d",obj->pIndexData->vnum); if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords)) continue; } /* ----------------- */ /* Start the script! */ /* ----------------- */ tr->running_info = mem_alloc (sizeof (*tr->running_info)); s = tr->running_info; bzero (s, sizeof (*s)); s->current = ch; s->room = ch->in_room; s->obj = obj; strcpy (s->code_seg, tr->code_label); s->current_line = 0; s->called_by = tr; s->next = info_list; info_list = s; execute_code (s); /* ----------------- */ } } } } /* End trigger check! */ obj_to (obj, ch->in_room); if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) REMOVE_BIT(ch->act, PLR_HAS_BOAT); } } } } if (!found) { if (arg[3] == '\0') act ("You are not carrying anything.", ch, NULL, arg, TO_CHAR); else act ("You are not carrying $T.", ch, NULL, &arg[4], TO_CHAR); } else if (IS_PLAYER(ch) && opp_align) { act("$n drops some stuff.", ch, NULL, NULL, TO_ROOM); act("You drop some stuff.", ch, NULL, NULL, TO_CHAR); } } return; } void do_give (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; char arg2[SML_LENGTH]; char arg3[SML_LENGTH]; CHAR_DATA *victim; SINGLE_OBJECT *obj; int amount; char buf[STD_LENGTH]; DEFINE_COMMAND ("give", do_give, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to give something to someone.") if (FIGHTING (ch) && !pow.give_while_fighting) { send_to_char ("You may not give objects while fighting!\n\r", ch); return; } CAN_GIVE_ITEMS_IN_ARENA (no) CAN_GIVE_ITEMS_IN_BGROUND (no) argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); argy = one_argy (argy, arg3); if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char ("Give what to whom?\n\r", ch); return; } if ((!str_cmp (arg2, "gold")) && (is_number (arg1) && atoi (arg1) > 0)) { amount = atoi (arg1); if (amount < 1) return; if (ch->gold < amount) { send_to_char ("You don't have that many \x1B[1;33mgold\x1B[37;0m coins.\n\r", ch); return; } if ((victim = get_char_room (ch, arg3)) == NULL) { send_to_char ("You don't see them here.\n\r", ch); return; } if (IS_PLAYER(victim) && IS_PLAYER(ch) && DIFF_ALIGN(ch, victim)) { send_to_char("You cannot give anything to enemies!\n\r", ch); return; } if (victim == ch) return; ch->gold -= amount; victim->gold += amount; sprintf (buf, "You give %d \x1B[1;33mgold\x1B[37;0m coins to %s.\n\r", amount, NAME (victim)); send_to_char (buf, ch); act ("$n gives some \x1B[1;33mgold\x1B[37;0m to $N.", ch, NULL, victim, TO_NOTVICT); sprintf (buf, "%s gives you %d \x1B[1;33mgold\x1B[37;0m coins.\n\r", NAME (ch), amount); send_to_char (buf, victim); /* if ( IS_MOB(victim) && victim->npcdata->hire == ch ) { victim->npcdata->paid += (amount*100); if ( victim->npcdata->wage > victim->npcdata->paid ) { sprintf(buf,"%s You still owe me %s.", NAME(ch), name_amount(victim->npcdata->wage - victim->npcdata->paid )); } else { sprintf(buf,"%s Thanks.", NAME(ch)); victim->leader = ch; victim->master = ch; act("$N joins your group.",ch,NULL,victim,TO_CHAR); } do_tell(victim,buf); } */ return; } if ((!str_cmp (arg2, "copper")) && (is_number (arg1) && atoi (arg1) > 0)) { amount = atoi (arg1); if (amount < 1) return; if (ch->copper < amount) { send_to_char ("You don't have that many \x1B[33mcopper\x1B[37;0m coins.\n\r", ch); return; } if ((victim = get_char_room (ch, arg3)) == NULL) { send_to_char ("You don't see them here.\n\r", ch); return; } if (IS_PLAYER(victim) && IS_PLAYER(ch) && DIFF_ALIGN(ch, victim)) { send_to_char("You cannot give anything to enemies!\n\r", ch); return; } if (victim == ch) return; ch->copper -= amount; victim->copper += amount; sprintf (buf, "You give %d \x1B[33mcopper\x1B[37;0m coins to %s.\n\r", amount, NAME (victim)); send_to_char (buf, ch); act ("$n gives some \x1B[33mcopper\x1B[37;0m to $N.", ch, NULL, victim, TO_NOTVICT); sprintf (buf, "%s gives you %d \x1B[33mcopper\x1B[37;0m coins.\n\r", NAME (ch), amount); send_to_char (buf, victim); /* if ( IS_MOB(victim) && victim->npcdata->hire == ch ) { victim->npcdata->paid += (amount); if ( victim->npcdata->wage > victim->npcdata->paid ) { sprintf(buf,"%s You still owe me %s.", NAME(ch), name_amount(victim->npcdata->wage - victim->npcdata->paid )); } else { sprintf(buf,"%s Thanks.", NAME(ch)); victim->leader = ch; victim->master = ch; ch->num_in_group++; act("$N joins your group.",ch,NULL,victim,TO_CHAR); } do_tell(victim,buf); } */ return; } if ((victim = get_char_room (ch, arg2)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (IS_PLAYER(victim) && IS_PLAYER(ch) && DIFF_ALIGN(ch, victim)) { send_to_char("You cannot give anything to enemies!\n\r", ch); return; } if ((obj = get_obj_inv (ch, arg1)) == NULL) { send_to_char ("You do not have that item.\n\r", ch); return; } if (!NOT_WORN (obj)) { send_to_char ("You must remove it first.\n\r", ch); return; } if ((victim = get_char_room (ch, arg2)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (!can_drop_obj (ch, obj)) { send_to_char ("You can't let go of it.\n\r", ch); return; } if (!can_see_obj (victim, obj)) { act ("$N can't see it.", ch, NULL, victim, TO_CHAR); return; } if (obj->pIndexData->vnum > 90000 && (obj->pIndexData->item_type == ITEM_FURNITURE || obj->pIndexData->item_type == ITEM_TOOL)) { fprintf (stderr, "FORGECRAP %s given by %s to %s at %d.\n", OOSTR(obj, short_descr), NAME(ch), NAME(victim), ch->in_room->vnum); } obj_from (obj); obj_to (obj, victim); if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) REMOVE_BIT(ch->act, PLR_HAS_BOAT); } if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(victim)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) REMOVE_BIT(victim->act, PLR_HAS_BOAT); } obj->wear_loc = -1; if (IS_SET (obj->extra_flags, ITEM_INVENTORY)) obj->extra_flags ^= ITEM_INVENTORY; act ("$n gives $p\x1B[0m to $N.", ch, obj, victim, TO_NOTVICT); act ("$n gives you $p\x1B[0m.", ch, obj, victim, TO_VICT); act ("You give $p\x1B[0m to $N.", ch, obj, victim, TO_CHAR); if (IS_OBJ_STAT(obj, ITEM_GIVESCRIPT)) { again_12: /* Given item, check for triggers on mobbie! */ if (IS_MOB (victim)) { SINGLE_TRIGGER *tr; SCRIPT_INFO *s; for (tr = trigger_list[TGIVEN]; tr != NULL; tr = tr->next) { if (victim->pIndexData->vnum == tr->attached_to_mob) { if (tr->running_info && !tr->interrupted) continue; /* Already running, interrupted, but script says not to allow interruptions. */ if (tr->running_info && tr->interrupted != 2) { end_script (tr->running_info); goto again_12; } {char tmp[50]; sprintf(tmp,"%d",obj->pIndexData->vnum); if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp, tr->keywords)) continue; } /* ----------------- */ /* Start the script! */ /* ----------------- */ tr->running_info = mem_alloc (sizeof (*tr->running_info)); s = tr->running_info; bzero (s, sizeof (*s)); s->current = ch; s->mob = victim; strcpy (s->code_seg, tr->code_label); s->current_line = 0; s->called_by = tr; s->next = info_list; info_list = s; execute_code (s); /* ----------------- */ } } /* End trigger check! */ again_13: { SINGLE_TRIGGER *tr; SCRIPT_INFO *s; for (tr = trigger_list[TGIVEN]; tr != NULL; tr = tr->next) { if (obj->pIndexData->vnum == tr->attached_to_obj) { if (tr->running_info && !tr->interrupted) continue; /* Already running, interrupted, but script says not to allow interruptions. */ if (tr->running_info && tr->interrupted != 2) { end_script (tr->running_info); goto again_13; } {char tmp[50]; sprintf(tmp,"%d",victim->pIndexData->vnum); if (tr->keywords[0] != '\0' && !one_is_in_list_two (tmp , tr->keywords)) continue; } /* ----------------- */ /* Start the script! */ /* ----------------- */ tr->running_info = mem_alloc (sizeof (*tr->running_info)); s = tr->running_info; bzero (s, sizeof (*s)); s->current = ch; s->obj = obj; s->mob = victim; strcpy (s->code_seg, tr->code_label); s->current_line = 0; s->called_by = tr; s->next = info_list; info_list = s; execute_code (s); /* ----------------- */ } } } } } /* End trigger check! */ return; } void do_fill (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; SINGLE_OBJECT *fountain; I_DRINK *dr; bool found; DEFINE_COMMAND ("fill", do_fill, POSITION_STANDING, 0, LOG_NORMAL, "This command allows you to fill a container or lamp.") argy = one_argy (argy, arg); if (arg[0] == '\0') { send_to_char ("Fill what?\n\r", ch); return; } /*held */ if ((obj = get_obj_inv (ch, arg)) == NULL) { send_to_char ("You do not have that item.\n\r", ch); return; } if (obj->pIndexData->item_type == ITEM_DRINK_CON) { found = FALSE; dr = (I_DRINK *) obj->more; for (fountain = ch->in_room->more->contents; fountain != NULL; fountain = fountain->next_content) { if (fountain->pIndexData->item_type == ITEM_FOUNTAIN) { found = TRUE; break; } } if (!found) { send_to_char ("There is no fountain here!\n\r", ch); return; } if (dr->liquid_now != 0 && dr->liquid_type != 0) { send_to_char ("It already has some other liquid in it.\n\r", ch); return; } if (IS_SET(dr->not_poison, 1)) { send_to_char("That container cannot be refilled.\n\r", ch); return; } if (dr->liquid_now >= dr->max_liquid) { send_to_char ("The container is full.\n\r", ch); return; } act ("You fill $p\x1B[0m.", ch, obj, NULL, TO_CHAR); dr->liquid_type = 0; dr->liquid_now = dr->max_liquid; } else if (obj->pIndexData->item_type == ITEM_LIGHT) { SINGLE_OBJECT *obj2; I_LIGHT *lg = (I_LIGHT *) obj->more; I_DRINK *dr; /*get_item_hold */ if ((obj2 = get_item_held (ch, ITEM_DRINK_CON)) == NULL) { send_to_char ("You don't have anything in your hand to fill it with.\n\r", ch); return; } dr = (I_DRINK *) obj2->more; if (!IS_SET (lg->light_lit, LIGHT_FILLABLE) && !IS_SET (lg->light_fillable, LIGHT_FILLABLE)) { send_to_char ("It can't be refueled.\n\r", ch); return; } if (dr->liquid_type != -1) { send_to_char ("There's no oil in that container.\n\r", ch); return; } if (lg->light_now != 0) { send_to_char ("There is already some oil in it.\n\r", ch); return; } CAN_FILL_LIGHT_WHILE_LIT (yes); if (dr->liquid_now < 1) { send_to_char ("There is no liquid left to fill it with.\n\r", ch); return; } if (dr->liquid_now >= lg->max_light) { act ("You fill $p\x1B[0m with $P\x1B[0m.", ch, obj, obj2, TO_CHAR); lg->light_now = lg->max_light; dr->liquid_now += -(lg->max_light); } else { act ("You empty $P\x1B[0m into $p\x1B[0m.", ch, obj, obj2, TO_CHAR); lg->light_now = lg->max_light; dr->liquid_now = 0; } } else { send_to_char ("You can't fill that.\n\r", ch); return; } return; } void do_empty (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; DEFINE_COMMAND ("empty", do_empty, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to empty a container of liquid.") argy = one_argy (argy, arg); if (arg[0] == '\0') { send_to_char ("Empty what?\n\r", ch); return; } /*held */ if ((obj = get_obj_inv (ch, arg)) == NULL) { send_to_char ("You do not have that item.\n\r", ch); return; } if (obj->pIndexData->item_type == ITEM_DRINK_CON) { I_DRINK *dr = (I_DRINK *) obj->more; if (dr->liquid_now < 1) { send_to_char ("Your container is empty.\n\r", ch); return; } act ("You empty $p\x1B[0m.", ch, obj, NULL, TO_CHAR); dr->liquid_type = 0; dr->liquid_now = 0; } return; } void do_drink (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; int amount; bool thirsty; int liquid; DEFINE_COMMAND ("drink", do_drink, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to drink from something.") while (argy != "" && argy[0] != '\0') argy = one_argy (argy, arg); if (arg[0] == '\0') { for (obj = ch->in_room->more->contents; obj; obj = obj->next_content) { if (obj->pIndexData->item_type == ITEM_FOUNTAIN) break; } if (obj == NULL) { send_to_char ("Drink what?\n\r", ch); return; } } else { if ((obj = get_obj_here (ch, arg, SEARCH_ROOM_FIRST)) == NULL) { send_to_char ("You can't find it.\n\r", ch); return; } } if (IS_PLAYER (ch) && ch->pcdata->condition[COND_DRUNK] > 10) { send_to_char ("You are too drunk, dazed, and confused to drink any more.\n\r", ch); return; } if (IS_PLAYER (ch) && ch->pcdata->condition[COND_THIRST] < 7) thirsty = TRUE; else thirsty = FALSE; if (IS_PLAYER (ch) && ch->pcdata->condition[COND_THIRST] > 40) { send_to_char ("If you drank any more, your bladder would explode.\n\r", ch); return; } switch (obj->pIndexData->item_type) { default: send_to_char ("You can't drink from that.\n\r", ch); break; case ITEM_FOUNTAIN: { I_FOUNTAIN *fn = (I_FOUNTAIN *) obj->more; if (IS_PLAYER (ch)) ch->pcdata->condition[COND_THIRST] = 48; act ("$n drinks from $p\x1B[0m.", ch, obj, NULL, TO_ROOM); act ("You drink from $p\x1B[0m.", ch, obj, NULL, TO_CHAR); if (fn->spells[0] > 0) obj_cast_spell (fn->spells[0], fn->liquid, ch, ch, NULL); if (fn->spells[1] > 0) obj_cast_spell (fn->spells[1], fn->liquid, ch, ch, NULL); if (fn->spells[2] > 0) obj_cast_spell (fn->spells[2], fn->liquid, ch, ch, NULL); break; } case ITEM_DRINK_CON: { I_DRINK *dr = (I_DRINK *) obj->more; if (dr->liquid_now <= 0) { send_to_char ("It is empty.\n\r", ch); return; } if ((liquid = dr->liquid_type) >= LIQ_MAX) { bug ("Bad liquid number %d.", liquid); liquid = dr->liquid_type = 0; } if (liquid == -1) { act ("$n drinks lamp oil from $p\x1B[0m, and grimaces in pain.", ch, obj, NULL, TO_ROOM); act ("You drink oil from $p\x1B[0m. Ugh!", ch, obj, NULL, TO_CHAR); amount = 0; } else { act ("$n drinks $T\x1B[0m from $p\x1B[0m.", ch, obj, liq_table[liquid].liq_name, TO_ROOM); act ("You drink $T\x1B[0m from $p\x1B[0m.", ch, obj, liq_table[liquid].liq_name, TO_CHAR); amount = number_range (3, 10); amount = UMIN (amount, dr->liquid_now); gain_condition (ch, COND_DRUNK, amount * liq_table[liquid].liq_affect[COND_DRUNK]); gain_condition (ch, COND_FULL, amount * liq_table[liquid].liq_affect[COND_FULL]); gain_condition (ch, COND_THIRST, amount * liq_table[liquid].liq_affect[COND_THIRST]); if (IS_PLAYER (ch) && ch->pcdata->condition[COND_DRUNK] > 10) send_to_char ("You feel drunk.\n\r", ch); if (IS_PLAYER (ch) && ch->pcdata->condition[COND_FULL] > 40) send_to_char ("You are full.\n\r", ch); if (IS_PLAYER (ch) && ch->pcdata->condition[COND_THIRST] > 40) send_to_char ("You are no longer thirsty.\n\r", ch); if (dr->not_poison >= 2) { AFFECT_DATA af; bzero (&af, sizeof (af)); act ("$n's face pales.", ch, NULL, NULL, TO_ROOM); send_to_char ("Your intestines feel like they are on fire!\n\r", ch); af.type = gsn_poison; af.duration = 3 * amount; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_POISON; affect_join (ch, &af); } } dr->liquid_now -= amount; if (dr->liquid_now <= 0) { dr->not_poison = 0; dr->liquid_type = 0; } break; } } return; } void do_eat (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; DEFINE_COMMAND ("eat", do_eat, POSITION_RESTING, 0, LOG_NORMAL, "This command allows you to eat something.") argy = one_argy (argy, arg); if (!str_cmp (arg, "the") || !str_cmp (arg, "some")) argy = one_argy (argy, arg); if (arg[0] == '\0') { send_to_char ("Eat what?\n\r", ch); return; } if ((obj = get_obj_inv (ch, arg)) == NULL) { send_to_char ("You do not have that item.\n\r", ch); return; } if (!IS_IMMORTAL (ch)) { if (obj->pIndexData->item_type != ITEM_FOOD && obj->pIndexData->item_type != ITEM_PILL) { send_to_char ("That's not edible.\n\r", ch); return; } if (IS_PLAYER (ch) && ch->pcdata->condition[COND_FULL] > 40) { send_to_char ("You are too full to eat more.\n\r", ch); return; } } else { if (obj->pIndexData->item_type == ITEM_LIGHT && IS_LIT (obj)) --ch->in_room->light; if (ch->in_room->light < 0) ch->in_room->light = 0; if (obj->wear_loc != -1) remove_obj (ch, obj->wear_loc, TRUE); } act ("$n eats $p\x1B[0m.", ch, obj, NULL, TO_ROOM); act ("You eat $p\x1B[0m.", ch, obj, NULL, TO_CHAR); switch (obj->pIndexData->item_type) { case ITEM_FOOD: { I_FOOD *fd = (I_FOOD *) obj->more; if (IS_PLAYER (ch)) { int conditiona; conditiona = ch->pcdata->condition[COND_FULL]; gain_condition (ch, COND_FULL, fd->hours); if (conditiona < 4 && ch->pcdata->condition[COND_FULL] > 4) send_to_char ("You feel a bit less hungry.\n\r", ch); else if (ch->pcdata->condition[COND_FULL] > 40) send_to_char ("You are full.\n\r", ch); } if (fd->not_poison != 0) { /* The shit was poisoned! */ AFFECT_DATA af; bzero (&af, sizeof (af)); act ("$n's face pales, and $e clutches $s stomach.", ch, 0, 0, TO_ROOM); send_to_char ("Ouch! You feel very sick!\n\r", ch); af.type = gsn_poison; af.duration = fd->hours / 2; af.location = APPLY_NONE; af.modifier = 0; af.bitvector = AFF_POISON; affect_join (ch, &af); } break; } case ITEM_PILL: { I_POTION *pl = (I_POTION *) obj->more; if (pl->spells[0] > 0) obj_cast_spell (pl->spells[0], pl->spell_level, ch, ch, NULL); if (pl->spells[1] > 0) obj_cast_spell (pl->spells[1], pl->spell_level, ch, ch, NULL); if (pl->spells[2] > 0) obj_cast_spell (pl->spells[2], pl->spell_level, ch, ch, NULL); break; } } obj_from (obj); free_it (obj); return; } bool draw_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj) { if (obj->wear_loc != WEAR_BELT_1 && obj->wear_loc != WEAR_BELT_2 && obj->wear_loc != WEAR_BELT_3 && obj->wear_loc != WEAR_BELT_4 && obj->wear_loc != WEAR_BELT_5) return FALSE; if (hand_empty (ch) == WEAR_NONE) return FALSE; obj->wear_loc = -1; equip_char (ch, obj, hand_empty (ch)); act ("$n draws $p\x1B[0m from $s belt.", ch, obj, NULL, TO_ROOM); act ("You draw $p\x1B[0m from your belt.", ch, obj, NULL, TO_CHAR); return TRUE; } bool sheath_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj) { if (obj == NULL) return FALSE; if (!IS_SET (obj->pIndexData->wear_flags, ITEM_WEAR_BELT)) return FALSE; if (get_eq_char (ch, WEAR_WAIST) == NULL) { send_to_char ("You need a belt to sheath it in.\n\r", ch); return TRUE; } if ( obj->wear_loc != WEAR_HOLD_1 && obj->wear_loc != WEAR_HOLD_2) { send_to_char ("You must be holding the weapon to sheath it!\n\r", ch); return FALSE; } if (IS_OBJ_STAT(obj, ITEM_POLEARM) || IS_OBJ_STAT(obj, ITEM_RANGED)) { send_to_char("You cannot sheath polearms.\n\r", ch); return FALSE; } if (belt_empty (ch) == WEAR_NONE) { send_to_char ("Remove something from your belt first.\n\r", ch); return TRUE; } unequip_char (ch, obj); obj->wear_loc = belt_empty (ch); act ("$n sheaths $p\x1B[0m in $s belt.", ch, obj, NULL, TO_ROOM); act ("You sheath $p\x1B[0m in your belt.", ch, obj, NULL, TO_CHAR); return TRUE; } bool remove_obj (CHAR_DATA * ch, int iWear, bool fReplace) { SINGLE_OBJECT *obj; if ((obj = get_eq_char (ch, iWear)) == NULL) return TRUE; if (!fReplace) return FALSE; if (obj->wear_loc == WEAR_NONE) { return FALSE; } if (IS_SET (obj->extra_flags, ITEM_NOREMOVE) && !IS_IMMORTAL (ch)) { act ("You can't remove $p\x1B[0m.", ch, obj, NULL, TO_CHAR); return FALSE; } if (obj->wear_loc == WEAR_WAIST) { SINGLE_OBJECT *obj2; bool fFound = FALSE; int curwear; for (curwear = WEAR_BELT_1; curwear <= WEAR_BELT_3; curwear++) { obj2 = get_eq_char (ch, curwear); if (obj2 != NULL) { fFound = TRUE; obj2->wear_loc = -1; } } if (fFound) { } } if (unequip_char (ch, obj)) { act ("$n stops using $p\x1B[0m.", ch, obj, NULL, TO_ROOM); act ("You stop using $p\x1B[0m.", ch, obj, NULL, TO_CHAR); } else { send_to_char ("You've got your hands full.\n\r", ch); return FALSE; } return TRUE; } void wear_obj (CHAR_DATA * ch, SINGLE_OBJECT * obj, bool fReplace, int loc) { SHOP_DATA *pShop; OBJ_PROTOTYPE *pObj = obj->pIndexData; SINGLE_OBJECT *obj1; SINGLE_OBJECT *obj2; SINGLE_OBJECT *obj3; pShop = NULL; if (IS_MOB (ch) && (pShop = ch->pIndexData->pShop) != NULL) return; else { /*OKAY, not a shopkeeper, go ahead and wear stuff */ // Check to see if the person is in a guild that does not allow this item if(is_member(ch,GUILD_TINKER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_TINKER) || is_member(ch,GUILD_WARRIOR) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_WARRIOR) || is_member(ch,GUILD_THIEFG) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_THIEF) || is_member(ch,GUILD_HEALER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_HEALER) || is_member(ch,GUILD_WIZARD) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_WIZARD) || is_member(ch,GUILD_RANGER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_RANGER) || is_member(ch,GUILD_ROGUE) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_ROGUE) || is_member(ch,GUILD_CONJURER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_CONJURER) || is_member(ch,GUILD_MYSTIC) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_MYSTIC) || is_member(ch,GUILD_BATTLEMASTER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_BATTLEMASTER) || is_member(ch,GUILD_NECROMANCER) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_NECROMANCER) || is_member(ch,GUILD_MONK) && IS_OBJ_GUILD_STAT(obj,ITEM_ANTI_MONK)){ send_to_char("One of your guilds restricts you from using this item.\n\r",ch); return; } if (pObj != NULL) { int i; if (pObj->value[10] != 0) for (i = 0; str_cmp(guild_data[i].what_you_type, "end_of_list");i++) { if (IS_SET(pObj->value[10], guild_data[i].mob_guildmaster_bit) && !IS_SET(ch->pcdata->guilds, guild_data[i].mob_guildmaster_bit)) { send_to_char ("You do not have the proper training to wear this item!\n\r", ch); return; } } } if (CAN_WEAR (obj, ITEM_WEAR_FINGER)) { if (loc == 0 || loc == ITEM_WEAR_FINGER) { if (get_eq_char (ch, WEAR_FINGER_1) != NULL && get_eq_char (ch, WEAR_FINGER_2) != NULL && !remove_obj (ch, WEAR_FINGER_1, fReplace) && !remove_obj (ch, WEAR_FINGER_2, fReplace)) return; if (get_eq_char (ch, WEAR_FINGER_1) == NULL) { act ("$n slips $p\x1B[0m onto $s left finger.", ch, obj, NULL, TO_ROOM); act ("You slip $p\x1B[0m onto your left finger.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_FINGER_1); return; } if (get_eq_char (ch, WEAR_FINGER_2) == NULL) { act ("$n slips $p onto $s right finger.", ch, obj, NULL, TO_ROOM); act ("You slip $p onto your right finger.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_FINGER_2); return; } bug ("Wear_obj: no free finger.", 0); send_to_char ("You already wear two rings.\n\r", ch); return; } } if (CAN_WEAR (obj, ITEM_WEAR_NECK)) { if (loc == 0 || loc == ITEM_WEAR_NECK) { if (get_eq_char (ch, WEAR_NECK_1) != NULL && get_eq_char (ch, WEAR_NECK_2) != NULL && !remove_obj (ch, WEAR_NECK_1, fReplace) && !remove_obj (ch, WEAR_NECK_2, fReplace)) return; if (get_eq_char (ch, WEAR_NECK_1) == NULL) { act ("$n clasps $p\x1B[0m around $s neck.", ch, obj, NULL, TO_ROOM); act ("You clasp $p\x1B[0m around your neck.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_NECK_1); return; } if (get_eq_char (ch, WEAR_NECK_2) == NULL) { act ("$n clasps $p\x1B[0m around $s neck.", ch, obj, NULL, TO_ROOM); act ("You clasp $p\x1B[0m around your neck.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_NECK_2); return; } bug ("Wear_obj: no free neck.", 0); send_to_char ("You already wear two neck items.\n\r", ch); return; } } if (CAN_WEAR (obj, ITEM_FLOATING)) { if (loc == 0 || loc == ITEM_FLOATING) { if (get_eq_char (ch, WEAR_FLOATING_1) != NULL && get_eq_char (ch, WEAR_FLOATING_2) != NULL && !remove_obj (ch, WEAR_FLOATING_1, fReplace) && !remove_obj (ch, WEAR_FLOATING_2, fReplace)) return; if (get_eq_char (ch, WEAR_FLOATING_1) == NULL) { act ("$p starts floating around $n's head.", ch, obj, NULL, TO_ROOM); act ("Your $p starts floating nearby your head.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_FLOATING_1); return; } if (get_eq_char (ch, WEAR_FLOATING_2) == NULL) { act ("$p starts floating around $n's head.", ch, obj, NULL, TO_ROOM); act ("Your $p starts floating nearby your head.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_FLOATING_2); return; } bug ("Wear_obj: no free floater.", 0); send_to_char ("You already have two items floating nearby.\n\r", ch); return; } } if (CAN_WEAR (obj, ITEM_WEAR_ELBOW)) { if (loc == 0 || loc == ITEM_WEAR_ELBOW) { if (get_eq_char (ch, WEAR_ELBOW_1) != NULL && get_eq_char (ch, WEAR_ELBOW_2) != NULL && !remove_obj (ch, WEAR_ELBOW_1, fReplace) && !remove_obj (ch, WEAR_ELBOW_2, fReplace)) return; if (get_eq_char (ch, WEAR_ELBOW_1) == NULL) { act ("$n straps $p\x1B[0m onto $s elbow.", ch, obj, NULL, TO_ROOM); act ("You strap $p\x1B[0m onto your elbow.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_ELBOW_1); return; } if (get_eq_char (ch, WEAR_ELBOW_2) == NULL) { act ("$n strap $p\x1B[0m onto $s elbow.", ch, obj, NULL, TO_ROOM); act ("You strap $p\x1B[0m onto your elbow.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_ELBOW_2); return; } bug ("Wear_obj: no free elbow.", 0); send_to_char ("You already wear an item on each elbow.\n\r", ch); return; } } if (CAN_WEAR (obj, ITEM_WEAR_KNEE)) { if (loc == 0 || loc == ITEM_WEAR_KNEE) { if (get_eq_char (ch, WEAR_KNEE_1) != NULL && get_eq_char (ch, WEAR_KNEE_2) != NULL && !remove_obj (ch, WEAR_KNEE_1, fReplace) && !remove_obj (ch, WEAR_KNEE_2, fReplace)) return; if (get_eq_char (ch, WEAR_KNEE_1) == NULL) { act ("$n straps $p\x1B[0m onto $s knee.", ch, obj, NULL, TO_ROOM); act ("You strap $p\x1B[0m onto your knee.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_KNEE_1); return; } if (get_eq_char (ch, WEAR_KNEE_2) == NULL) { act ("$n strap $p\x1B[0m onto $s knee.", ch, obj, NULL, TO_ROOM); act ("You strap $p\x1B[0m onto your knee.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_KNEE_2); return; } bug ("Wear_obj: no free knee.", 0); send_to_char ("You already wear an item on each knee.\n\r", ch); return; } } if (CAN_WEAR (obj, ITEM_WEAR_BODY)) { if (loc == 0 || loc == ITEM_WEAR_BODY) { if (!remove_obj (ch, WEAR_BODY, fReplace)) return; act ("$n wears $p\x1B[0m on $s body.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m on your body.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_BODY); return; } } if (CAN_WEAR (obj, ITEM_WEAR_HEAD)) { if (loc == 0 || loc == ITEM_WEAR_HEAD) { if (!remove_obj (ch, WEAR_HEAD, fReplace)) return; act ("$n dons $p\x1B[0m on $s head.", ch, obj, NULL, TO_ROOM); act ("You don $p\x1B[0m on your head.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_HEAD); return; } } if (CAN_WEAR (obj, ITEM_WEAR_FACE)) { if (loc == 0 || loc == ITEM_WEAR_FACE) { if (!remove_obj (ch, WEAR_FACE, fReplace)) return; act ("$n straps $p\x1B[0m onto $s face.", ch, obj, NULL, TO_ROOM); act ("You strap $p onto your face.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_FACE); return; } } if (CAN_WEAR (obj, ITEM_WEAR_LEGS)) { if (loc == 0 || loc == ITEM_WEAR_LEGS) { if (!remove_obj (ch, WEAR_LEGS, fReplace)) return; act ("$n wears $p\x1B[0m on $s legs.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m on your legs.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_LEGS); return; } } if (CAN_WEAR (obj, ITEM_WEAR_FEET)) { if (loc == 0 || loc == ITEM_WEAR_FEET) { if (!remove_obj (ch, WEAR_FEET, fReplace)) return; act ("$n slips $s feet into $p\x1B[0m.", ch, obj, NULL, TO_ROOM); act ("You slip your feet into $p\x1B[0m.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_FEET); return; } } if (CAN_WEAR (obj, ITEM_WEAR_HANDS)) { if (loc == 0 || loc == ITEM_WEAR_HANDS) { if (!remove_obj (ch, WEAR_HANDS, fReplace)) return; act ("$n wears $p\x1B[0m on $s hands.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m on your hands.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_HANDS); return; } } if (CAN_WEAR (obj, ITEM_WEAR_ARMS)) { if (loc == 0 || loc == ITEM_WEAR_ARMS) { if (!remove_obj (ch, WEAR_ARMS, fReplace)) return; act ("$n wears $p\x1B[0m on $s arms.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m on your arms.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_ARMS); return; } } if (CAN_WEAR (obj, ITEM_WEAR_ABOUT)) { if (loc == 0 || loc == ITEM_WEAR_ABOUT) { if (!remove_obj (ch, WEAR_ABOUT, fReplace)) return; act ("$n wears $p\x1B[0m about $s body.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m about your body.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_ABOUT); return; } } if (CAN_WEAR (obj, ITEM_WEAR_EYES)) { if (loc == 0 || loc == ITEM_WEAR_EYES) { if (!remove_obj (ch, WEAR_EYES, fReplace)) return; act ("$n wears $p\x1B[0m on $s eyes.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m on your eyes.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_EYES); return; } } if (CAN_WEAR (obj, ITEM_WEAR_BACK)) { if (loc == 0 || loc == ITEM_WEAR_BACK) { if (!remove_obj (ch, WEAR_BACK, fReplace)) return; act ("$n wears $p\x1B[0m on $s back.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m on your back.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_BACK); return; } } if (CAN_WEAR (obj, ITEM_WEAR_WAIST)) { if (loc == 0 || loc == ITEM_WEAR_WAIST) { if (!remove_obj (ch, WEAR_WAIST, fReplace)) return; act ("$n fastens $p\x1B[0m around $s waist.", ch, obj, NULL, TO_ROOM); act ("You fasten $p\x1B[0m around your waist.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_WAIST); return; } } if (CAN_WEAR (obj, ITEM_WEAR_EAR1)) { if (loc == 0 || loc == ITEM_WEAR_EAR1) { if ((get_eq_char (ch, WEAR_EAR_1) != NULL) && (get_eq_char (ch, WEAR_EAR_2) != NULL)) return; if (get_eq_char (ch, WEAR_EAR_1) == NULL) { act ("$n wears $p\x1B[0m in $s right ear.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m in your right ear.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_EAR_1); return; } if (get_eq_char (ch, WEAR_EAR_2) == NULL) { act ("$n wears $p\x1B[0m in $s left ear.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m in your left ear.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_EAR_2); return; } } } if (CAN_WEAR (obj, ITEM_WEAR_ANKLE)) { if (loc == 0 || loc == ITEM_WEAR_ANKLE) { if ((get_eq_char (ch, WEAR_ANKLE_1) != NULL) && (get_eq_char (ch, WEAR_ANKLE_2) != NULL)) return; if (get_eq_char (ch, WEAR_ANKLE_1) == NULL) { act ("$n wears $p\x1B[0m around $s right ankle.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m around your right ankle.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_ANKLE_1); return; } if (get_eq_char (ch, WEAR_ANKLE_2) == NULL) { act ("$n wears $p\x1B[0m around $s left ankle.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m around your left ankle.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_ANKLE_2); return; } } } if (CAN_WEAR (obj, ITEM_WEAR_WRIST)) { if (loc == 0 || loc == ITEM_WEAR_WRIST) { if (get_eq_char (ch, WEAR_WRIST_1) != NULL && get_eq_char (ch, WEAR_WRIST_2) != NULL && !remove_obj (ch, WEAR_WRIST_1, fReplace) && !remove_obj (ch, WEAR_WRIST_2, fReplace)) return; if (get_eq_char (ch, WEAR_WRIST_1) == NULL) { act ("$n wears $p\x1B[0m around $s left wrist.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m around your left wrist.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_WRIST_1); return; } if (get_eq_char (ch, WEAR_WRIST_2) == NULL) { act ("$n wears $p\x1B[0m around $s right wrist.", ch, obj, NULL, TO_ROOM); act ("You wear $p\x1B[0m around your right wrist.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_WRIST_2); return; } bug ("Wear_obj: no free wrist.", 0); send_to_char ("You already wear two wrist items.\n\r", ch); return; } } if (CAN_WEAR (obj, ITEM_WEAR_TATTOO)) { if (loc == 0 || loc == ITEM_WEAR_TATTOO) { if (get_eq_char (ch, WEAR_TATTOO) != NULL && !remove_obj (ch, WEAR_TATTOO, fReplace)) return; if (get_eq_char (ch, WEAR_TATTOO) == NULL) { act ("$n cuts $p\x1B[0m into $s arm.", ch, obj, NULL, TO_ROOM); act ("You cut $p\x1B[0m into your arm.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_TATTOO); return; } bug ("Wear_obj: no free tattoo.", 0); send_to_char ("You already wear a tattoo.\n\r", ch); return; } } if (CAN_WEAR (obj, ITEM_WEAR_SHOULDER)) { if (loc == 0 || loc == ITEM_WEAR_SHOULDER) { if (get_eq_char (ch, WEAR_SHOULDER_1) != NULL && get_eq_char (ch, WEAR_SHOULDER_2) != NULL && !remove_obj (ch, WEAR_SHOULDER_1, fReplace) && !remove_obj (ch, WEAR_SHOULDER_2, fReplace)) return; if (get_eq_char (ch, WEAR_SHOULDER_1) == NULL) { act ("$n slings $p\x1B[0m over $s left shoulder.", ch, obj, NULL, TO_ROOM); act ("You sling $p\x1B[0m over your left shoulder.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_SHOULDER_1); return; } if (get_eq_char (ch, WEAR_SHOULDER_2) == NULL) { act ("$n slings $p\x1B[0m over $s right shoulder.", ch, obj, NULL, TO_ROOM); act ("You sling $p\x1B[0m over your right shoulder.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_SHOULDER_2); return; } bug ("Wear_obj: no free shoulder.", 0); send_to_char ("You already wear two items on your shoulders.\n\r", ch); return; } } if (CAN_WEAR (obj, ITEM_WEAR_SHIELD)) { if (IS_PLAYER(ch) && is_member(ch, GUILD_MONK)) { act ("Monks of the divine order need to keep their arms free.", ch, NULL, NULL, TO_CHAR); return; } if (!remove_obj (ch, WEAR_SHIELD, fReplace)) return; obj1 = get_eq_char (ch, WEAR_HOLD_1); obj2 = get_eq_char (ch, WEAR_HOLD_2); if ((obj2 != NULL && (IS_OBJ_STAT(obj2, ITEM_POLEARM) ||IS_OBJ_STAT(obj2, ITEM_RANGED)))|| (obj1 != NULL && (IS_OBJ_STAT(obj1, ITEM_POLEARM) || IS_OBJ_STAT(obj1, ITEM_RANGED)))) { send_to_char("You may not wear a shield while you wield a polearm.\n\r", ch); return; } if (obj->pIndexData->item_type == ITEM_ARMOR && (obj1 != NULL && obj1->pIndexData->item_type == ITEM_WEAPON) && (obj2 != NULL && obj2->pIndexData->item_type == ITEM_WEAPON)) { send_to_char ("You can't use a shield while wielding two weapons!\n\r", ch); return; } act ("$n straps $p\x1B[0m to $s arm.", ch, obj, NULL, TO_ROOM); act ("You strap $p\x1B[0m to your arm.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, WEAR_SHIELD); return; } if ((CAN_WEAR (obj, ITEM_HOLD) || CAN_WEAR (obj, ITEM_WIELD)) /*&& hand_empty( ch ) != WEAR_NONE */ ) { if (IS_PLAYER(ch) && is_member(ch, GUILD_MONK) && obj->pIndexData->item_type == ITEM_WEAPON) { act ("Monks of the divine order may not use such brutal objects.", ch, NULL, NULL, TO_CHAR); return; } if (hand_empty (ch) == WEAR_NONE) { act ("Your hands are full! Remove something first.", ch, NULL, NULL, TO_CHAR); return; } obj1 = get_eq_char (ch, WEAR_HOLD_1); obj2 = get_eq_char (ch, WEAR_HOLD_2); obj3 = get_eq_char (ch, WEAR_SHIELD); if ((obj2 != NULL && (IS_OBJ_STAT(obj2, ITEM_POLEARM) || IS_OBJ_STAT(obj2, ITEM_RANGED))) || (obj1 != NULL && (IS_OBJ_STAT(obj1, ITEM_POLEARM) || IS_OBJ_STAT(obj1, ITEM_RANGED)))) { send_to_char("You may not hold anything else while you wield a polearm or ranged weapon.\n\r", ch); return; } if ((IS_OBJ_STAT(obj, ITEM_POLEARM) || IS_OBJ_STAT(obj, ITEM_RANGED)) && (obj1 != NULL || obj2 != NULL || obj3 != NULL)) { send_to_char("You may not wield a polearmor ranged weapon while you have anything in either hand, or while you wear a shield.\n\r", ch); return; } if (obj3 && obj->pIndexData->item_type == ITEM_WEAPON && ((obj1 != NULL && obj1->pIndexData->item_type == ITEM_WEAPON) || (obj2 != NULL && obj2->pIndexData->item_type == ITEM_WEAPON))) { send_to_char ("You can't wield two weapons while using a shield!\n\r", ch); return; } if (IS_PLAYER(ch)) { int canwield = (get_curr_str(ch)*2 / 3); if (IS_AUGMENTED(ch, AUG_ARM_POWER)) canwield +=2; if (IS_AUGMENTED(ch, AUG_HAND_POWER)) canwield +=1; if (IS_AUGMENTED(ch, AUG_BODY_POWER)) canwield +=2; if (obj->pIndexData->weight > canwield*WGT_MULT){ act ("Unfortunately, $p is too heavy for you to use!", ch, obj, NULL, TO_CHAR); return; } } act ("$n holds $p\x1B[0m in $s hand.", ch, obj, NULL, TO_ROOM); act ("You hold $p\x1B[0m in your hand.", ch, obj, NULL, TO_CHAR); equip_char (ch, obj, hand_empty (ch)); return; } if (fReplace) send_to_char ("You can't wear, wield, or hold that there.\n\r", ch); return; /*REMOVE this next } if you remove the check for shopkeeper thingy */ } return; } void do_swap (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("swap", do_exchange, POSITION_RESTING, 0, LOG_NORMAL, "This command exchanges what you have in your primary and secondary hand.") return; } void do_exchange (CHAR_DATA * ch, char *argy) { SINGLE_OBJECT *objh1; SINGLE_OBJECT *objh2; bool hone; bool htwo; DEFINE_COMMAND ("exchange", do_exchange, POSITION_FIGHTING, 0, LOG_NORMAL, "This command exchanges what you have in your primary and secondary hand.") hone = FALSE; htwo = FALSE; if ((objh1 = ch->hold1) != NULL) hone = TRUE; if ((objh2 = ch->hold2) != NULL) htwo = TRUE; if ((!hone) && (!htwo)) { act ("You aren't holding anything in your hands!", ch, NULL, NULL, TO_CHAR); return; } if ((!hone) && (htwo)) { objh2->wear_loc = WEAR_HOLD_1; act ("The object in your secondary hand is now in your primary hand.", ch, NULL, NULL, TO_CHAR); ch->hold2 = NULL; ch->hold1 = objh2; return; } if ((hone) && (!htwo)) { objh1->wear_loc = WEAR_HOLD_2; act ("The object in your primary hand is now in your secondary hand.", ch, NULL, NULL, TO_CHAR); ch->hold1 = NULL; ch->hold2 = objh1; return; } if ((hone) && (htwo)) { objh1->wear_loc = WEAR_HOLD_2; objh2->wear_loc = WEAR_HOLD_1; act ("You now hold $p\x1B[0m in your primary hand.", ch, objh2, NULL, TO_CHAR); act ("You now hold $p\x1B[0m in your secondary hand.", ch, objh1, NULL, TO_CHAR); ch->hold1 = objh2; ch->hold2 = objh1; return; } return; } void do_wield (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("wield", do_wear, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to wear/wield or hold an object.") return; } void do_hold (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("hold", do_wear, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to wear/wield or hold an object.") return; } void do_wear (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; char arg2[SML_LENGTH]; SINGLE_OBJECT *obj; DEFINE_COMMAND ("wear", do_wear, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to wear/wield or hold an object.") argy = one_argy (argy, arg1); one_argy (argy, arg2); if (arg1[0] == '\0') { send_to_char ("Please specify what you want to wear/wield/hold.\n\r", ch); return; } if (!str_cmp (arg1, "all")) { SINGLE_OBJECT *obj_next; if (FIGHTING (ch) != NULL && !pow.equip_in_combat) { send_to_char ("Not while you're fighting; you'd get creamed!\n\r", ch); return; } for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; if ((CAN_WEAR (obj, ITEM_HOLD))) if (hand_empty (ch) == WEAR_NONE) continue; if ((obj->wear_loc == -1 || obj->wear_loc == WEAR_NONE /*|| obj->wear_loc == WEAR_HOLD_1 || obj->wear_loc == WEAR_HOLD_2 */ ) && can_see_obj (ch, obj)) wear_obj (ch, obj, FALSE, 0); } return; } else { /*held */ if ((obj = get_obj_inv (ch, arg1)) == NULL) { send_to_char ("You do not have that item.\n\r", ch); return; } if ((CAN_WEAR (obj, ITEM_HOLD))) if (hand_empty (ch) == WEAR_NONE) { send_to_char ("Your hands are already full!\n\r", ch); return; } if (FIGHTING (ch) != NULL && !pow.equip_in_combat && !CAN_WEAR (obj, ITEM_HOLD)) { send_to_char ("Not while you're fighting; you'd get creamed!\n\r", ch); return; } if (obj->wear_loc == -1) { wear_obj (ch, obj, TRUE, wear_name_bit (arg2)); } } return; } void do_sheath (CHAR_DATA * ch, char *argy) { char arg1[STD_LENGTH]; SINGLE_OBJECT *obj; DEFINE_COMMAND ("sheath", do_sheath, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to sheath a weapon in your belt.") argy = one_argy (argy, arg1); /*get_obj_held */ if ((obj = get_obj_inv (ch, arg1)) == NULL) { /*item_held */ if (get_item_held (ch, ITEM_WEAPON) != NULL) sheath_obj (ch, get_item_held (ch, ITEM_WEAPON)); if (get_item_held (ch, ITEM_WEAPON) != NULL) sheath_obj (ch, get_item_held (ch, ITEM_WEAPON)); return; } if (!sheath_obj (ch, obj)) send_to_char ("You can't do that!\n\r", ch); return; } void do_draw (CHAR_DATA * ch, char *argy) { char arg1[STD_LENGTH]; SINGLE_OBJECT *obj; SINGLE_OBJECT *obj1; SINGLE_OBJECT *obj2; DEFINE_COMMAND ("draw", do_draw, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to draw a weapon from your belt.") obj2 = get_item_held(ch, ITEM_WEAPON); obj1 = get_eq_char(ch, WEAR_SHIELD); if ((obj2 != NULL) && (IS_OBJ_STAT(obj2, ITEM_POLEARM) || IS_OBJ_STAT(obj2, ITEM_RANGED))) { send_to_char("You cannot draw a weapon while wielding a polearm.\n\r", ch); return; } argy = one_argy (argy, arg1); if ((obj = get_obj_wear (ch, arg1)) == NULL) { send_to_char ("You do not have that item in your belt.\n\r", ch); return; } if (obj->pIndexData->item_type == ITEM_WEAPON && obj2 != NULL && obj1 != NULL) { send_to_char("You cannot wear two weapons and a shield!\n\r", ch); return; } if (!draw_obj (ch, obj)) send_to_char ("You can't do that!\n\r", ch); return; } void do_remove (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; DEFINE_COMMAND ("remove", do_remove, POSITION_FIGHTING, 0, LOG_NORMAL, "This command allows you to remove a weapon/armor/etc... that is worn.") one_argy (argy, arg); if (arg[0] == '\0') { send_to_char ("Remove what?\n\r", ch); return; } if (!str_cmp (argy, "all")) { SINGLE_OBJECT *obj_next; if (!pow.remove_while_fighting && FIGHTING (ch)) { send_to_char ("No way; you'd get creamed!\n\r", ch); return; } for (obj = ch->carrying; obj != NULL; obj = obj_next) { obj_next = obj->next_content; /* if ( (obj->wear_loc == -1 || obj->wear_loc == WEAR_NONE || obj->wear_loc == WEAR_HOLD_1 || obj->wear_loc == WEAR_HOLD_2) && can_see_obj( ch, obj ) ) wear_obj( ch, obj, FALSE, 0 ); */ if (obj->wear_loc != WEAR_NONE && obj->wear_loc != -1) remove_obj (ch, obj->wear_loc, TRUE); } if (ch->move > ch->max_move) MAXMOVE(ch); return; } if ((obj = get_obj_wear (ch, arg)) == NULL) { send_to_char ("You do not have that item.\n\r", ch); return; } if (!pow.remove_while_fighting && obj->wear_loc != WEAR_HOLD_1 && obj->wear_loc != WEAR_HOLD_2 && FIGHTING (ch)) { send_to_char ("No way; you'd get creamed!\n\r", ch); return; } if (obj->wear_loc != -1) { remove_obj (ch, obj->wear_loc, TRUE); } if (ch->move > ch->max_move) MAXMOVE(ch); if (ch->hit > ch->max_hit) ch->hit = ch->max_hit; return; } void do_bury (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("bury", do_sacrifice, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to sacrifice something to the gods... helps clean up the game.") return; } void do_sacrifice (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; const char *god; int n_god; char buf[STD_LENGTH]; DEFINE_COMMAND ("sacrifice", do_sacrifice, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to sacrifice something to the gods... helps clean up the game.") if (argy == "" || argy[0] == '\0') return; one_argy (argy, arg); if (arg[0] == '\0' || !str_cmp (arg, NAME (ch))) { act ("$n offers $mself to the gods, who decline.", ch, NULL, NULL, TO_ROOM); send_to_char ( "The gods appreciate your self-sacrifice, but refuse.\n\r", ch); return; } obj = get_obj_list (ch, arg, ch->in_room->more->contents); if (obj == NULL) { if (get_obj_inv (ch, arg) != NULL) { send_to_char ("The object must be lying on the ground in order to sacrifice it.\n\r", ch); return; } send_to_char ("You don't see that object here to sacrifice.\n\r", ch); return; } if (!CAN_WEAR (obj, ITEM_TAKE)) { act ("$p\x1B[0m is not a sacrificable object.", ch, obj, 0, TO_CHAR); return; } if (obj->pIndexData->item_type == ITEM_BOAT) { send_to_char ("You cannot sacrifice something that large!\n\r", ch); return; } n_god = number_range (0, 4); god = pow.god_names[n_god]; //TEMPORARY TO TRY TO LET CASTERS EXP //Lowered Wisdom Requirement - Sabelis if (ch->pcdata->no_quit_pk < 5 && get_curr_int(ch) > 19 && get_curr_wis(ch) > 19 && obj->pIndexData->item_type == ITEM_CORPSE_NPC) { int count; for (count = 0; count < 8; count++) { mana_gain(ch, TRUE); } } sprintf (buf, "$n sacrifices $p\x1B[0m to \x1B[1m%s\x1B[0m.", god); act (buf, ch, obj, NULL, TO_ROOM); sprintf (buf, "You sacrifice $p\x1B[0m to \x1B[1m%s\x1B[0m.", god); act (buf, ch, obj, NULL, TO_CHAR); if (LEVEL (ch) < 9 && obj->pIndexData->item_type == ITEM_CORPSE_NPC) { send_to_char ("You recieve a copper coin as a gift from the gods for this sacrifice!\n\r", ch); ch->copper++; } if (obj->carried_by != NULL) obj_from (obj); free_it (obj); return; } void do_quaff (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; I_POTION *pt; DEFINE_COMMAND ("quaff", do_quaff, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to quaff a potion.") one_argy (argy, arg); if (arg[0] == '\0') { send_to_char ("Quaff what?\n\r", ch); return; } if ((obj = get_obj_inv (ch, arg)) == NULL) { send_to_char ("You do not have that potion.\n\r", ch); return; } if (obj->pIndexData->item_type != ITEM_POTION) { send_to_char ("You can quaff only potions.\n\r", ch); return; } pt = (I_POTION *) obj->more; act ("$n quaffs $p\x1B[0m.", ch, obj, NULL, TO_ROOM); act ("You quaff $p\x1B[0m.", ch, obj, NULL, TO_CHAR); if (pt->spells[0] > 0) obj_cast_spell (pt->spells[0], pt->spell_level, ch, ch, NULL); if (pt->spells[1] > 0) obj_cast_spell (pt->spells[1], pt->spell_level, ch, ch, NULL); if (pt->spells[2] > 0) obj_cast_spell (pt->spells[2], pt->spell_level, ch, ch, NULL); obj_from (obj); free_it (obj); return; } void do_read (CHAR_DATA * ch, char *argy) { DEFINE_COMMAND ("read", do_look, POSITION_RESTING, 0, LOG_NORMAL, "Same as look.") return; } void do_recite (CHAR_DATA * ch, char *argy) { char arg1[SML_LENGTH]; char arg2[SML_LENGTH]; CHAR_DATA *victim; I_POTION *sc; SINGLE_OBJECT *scroll; SINGLE_OBJECT *obj; DEFINE_COMMAND ("recite", do_recite, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to recite a scroll.") argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); if ((scroll = get_obj_inv (ch, arg1)) == NULL) { send_to_char ("You do not have that scroll.\n\r", ch); return; } if (scroll->pIndexData->item_type != ITEM_SCROLL) { send_to_char ("You can recite only scrolls.\n\r", ch); return; } sc = (I_POTION *) scroll->more; obj = NULL; if (arg2[0] == '\0') { victim = ch; } else { if ((victim = get_char_room (ch, arg2)) == NULL && (obj = get_obj_here (ch, arg2, SEARCH_INV_FIRST)) == NULL) { send_to_char ("You can't find it.\n\r", ch); return; } } act ("$n recites $p\x1B[0m.", ch, scroll, NULL, TO_ROOM); act ("You recite $p\x1B[0m.", ch, scroll, NULL, TO_CHAR); if (sc->spells[0] > 0) obj_cast_spell (sc->spells[0], sc->spell_level, ch, victim, obj); if (sc->spells[1] > 0) obj_cast_spell (sc->spells[1], sc->spell_level, ch, victim, obj); if (sc->spells[2] > 0) obj_cast_spell (sc->spells[2], sc->spell_level, ch, victim, obj); free_it (scroll); return; } void do_brandish (CHAR_DATA * ch, char *argy) { CHAR_DATA *vch; CHAR_DATA *vch_next; SINGLE_OBJECT *staff; SPELL_DATA *spell; I_WAND *stf; DEFINE_COMMAND ("brandish", do_brandish, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to brandish a staff.") if ((staff = get_item_held (ch, ITEM_STAFF)) == NULL) { send_to_char ("You don't have the staff in your hand.\n\r", ch); return; } stf = (I_WAND *) staff->more; if ((spell = skill_lookup (NULL, stf->spells[0])) == NULL) { bug ("Do_brandish: bad sn %d.", 9999); return; } WAIT_STATE (ch, 2 * PULSE_VIOLENCE); if (stf->current_charges > 0) { act ("$n raises $p\x1B[0m into the air and utters some mystical words under $s breath.", ch, staff, NULL, TO_ROOM); act ("You brandish $p\x1B[0m.", ch, staff, NULL, TO_CHAR); for (vch = ch->in_room->more->people; vch; vch = vch_next) { vch_next = vch->next_in_room; switch (spell->spell_type) { default: bug ("Do_brandish: bad target for sn %d.", spell->gsn); return; case TAR_IGNORE: if (vch != ch) continue; break; case TAR_CHAR_OFFENSIVE: if (IS_MOB (ch) ? IS_MOB (vch) : IS_PLAYER (vch)) continue; break; case TAR_CHAR_DEFENSIVE: if (IS_MOB (ch) ? IS_PLAYER (vch) : IS_MOB (vch)) continue; break; case TAR_CHAR_SELF: if (vch != ch) continue; break; } if (stf->spells[0] > 0) obj_cast_spell (stf->spells[0], stf->spell_level, ch, vch, NULL); } } if (--stf->current_charges <= 0) { act ("$n's $p\x1B[0m blazes bright and is gone.", ch, staff, NULL, TO_ROOM); act ("Your $p\x1B[0m blazes bright and is gone.", ch, staff, NULL, TO_CHAR); free_it (staff); } return; } void do_zap (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; CHAR_DATA *victim; SINGLE_OBJECT *wand; SINGLE_OBJECT *obj; SPELL_DATA *spell; I_WAND *wnd; DEFINE_COMMAND ("zap", do_zap, POSITION_FIGHTING, 0, LOG_NORMAL, "Allows you to zap a wand.") one_argy (argy, arg); if (arg[0] == '\0' && FIGHTING (ch) == NULL) { send_to_char ("Zap whom or what?\n\r", ch); return; } if ((wand = get_item_held (ch, ITEM_WAND)) == NULL) { send_to_char ("You don't have a wand in your hand.\n\r", ch); return; } wnd = (I_WAND *) wand->more; if ((spell = skill_lookup (NULL, wnd->spells[0])) == NULL) { bug ("Do_zap: bad sn %d.", 0); return; } obj = NULL; if (arg[0] == '\0') { if (FIGHTING (ch) != NULL) { victim = FIGHTING (ch); } else { send_to_char ("Zap whom or what?\n\r", ch); return; } } else { if ((victim = get_char_room (ch, arg)) == NULL && (obj = get_obj_here (ch, arg, SEARCH_INV_FIRST)) == NULL) { send_to_char ("You can't find it.\n\r", ch); return; } } WAIT_STATE (ch, 2 * PULSE_VIOLENCE); if (wnd->current_charges > 0) { if (victim != NULL) { act ("$n zaps $N with $p\x1B[0m.", ch, wand, victim, TO_ROOM); act ("You zap $N with $p\x1B[0m.", ch, wand, victim, TO_CHAR); } else { act ("$n zaps $P with $p\x1B[0m.", ch, wand, obj, TO_ROOM); act ("You zap $P with $p\x1B[0m.", ch, wand, obj, TO_CHAR); } if (wnd->spells[0] > 0) obj_cast_spell (wnd->spells[0], wnd->spell_level, ch, victim, obj); } if (--wnd->current_charges <= 0) { act ("$n's $p\x1B[0m explodes into fragments.", ch, wand, NULL, TO_ROOM); act ("Your $p\x1B[0m explodes into fragments.", ch, wand, NULL, TO_CHAR); free_it (wand); } return; } void do_study (CHAR_DATA * ch, char *argy) { SINGLE_OBJECT *obj; SPELL_DATA *spell; I_BOOK *bk; DEFINE_COMMAND ("study", do_study, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to study a book.") if ((obj = get_obj_inv (ch, argy)) == NULL) { send_to_char ("You don't have that to study.\n\r", ch); return; } if (obj->pIndexData->item_type != ITEM_BOOK) { send_to_char ("That's not a book.. wouldn't want it to BURST into FLAMES! heh.\n\r", ch); return; } bk = (I_BOOK *) obj->more; if (bk->teaches == 0) { send_to_char ("You begin to read... Blah blah blah...\n\rYou soon discover that there is nothing you can learn from this book.\n\r", ch); return; } spell = skill_lookup (NULL, bk->teaches); if (spell == NULL) { send_to_char ("Some LAME builder created this book wrong - it doesn't do SHIT!\n\rHAHAHAHAHA!", ch); return; } /*past this point the book FRIES.. */ if (ch->pcdata->learned[(bk->teaches)] > 25) { send_to_char ("You read the book and a knowledge and understanding begins to\n\rmeld into your open mind... Unfortunately the book doesn't seem to\n\rteach you anything you don't already know! DOH!\n\r", ch); } else { char buf[STD_LENGTH]; send_to_char ("You read the book and a knowledge and understanding begins to\n\rmeld into your open mind...\n\r", ch); sprintf (buf, "You now understand the very basics of %s!!\n\r", spell->spell_funky_name); send_to_char (buf, ch); ch->pcdata->learned[(bk->teaches)] = 26; } act ("$n reads $p\x1B[0m, and it bursts into flames!", ch, obj, NULL, TO_ROOM); act ("After you read $p\x1B[0m, it bursts into flames!", ch, obj, NULL, TO_CHAR); free_it (obj); return; } void do_steal (CHAR_DATA * ch, char *argy) { char buf[STD_LENGTH]; char arg1[SML_LENGTH]; char arg2[SML_LENGTH]; CHAR_DATA *victim; SINGLE_OBJECT *obj; DEFINE_COMMAND ("steal", do_steal, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to steal things from others.") argy = one_argy (argy, arg1); argy = one_argy (argy, arg2); if (ch->pcdata->alignment == 0) { send_to_char ("Neutral eq whore? Go join an align!\n\r", ch); return; } if (arg1[0] == '\0' || arg2[0] == '\0') { send_to_char ("Steal what from whom?\n\r", ch); return; } if (IS_PLAYER (ch) && (ch->fgt->in_battle || ch->fgt->challenge == 10)) { send_to_char ("Not in the battleground or arena!\n\r", ch); return; } if ((victim = get_char_room (ch, arg2)) == NULL) { send_to_char ("They aren't here.\n\r", ch); return; } if (LEVEL(victim) >= IMM_LEVEL) { send_to_char ("Forget it.\n\r", ch); return; } if (victim == ch) { send_to_char ("Like a dull sword, that's pointless.\n\r", ch); return; } if (victim->pcdata->alignment == 0) { send_to_char ("Stealing from Neuts? Your kit must SUCK!!\n\r", ch); return; } if (ch->pcdata->alignment == victim->pcdata->alignment) { send_to_char ("You cannot steal from your own alignment.\n\r", ch); return; } /* ------------------------------------------------------ */ /* Do not allow stealing from the neutral alignment */ /* ------------------------------------------------------ */ if (victim->pcdata->alignment == 0 && ch->pcdata->alignment != 0) { act("\x1B[1;32mA moral dilemma rages in your head! Steal from the Protected!? *Tisk Tisk*\x1B[0m",ch,NULL,NULL,TO_CHAR); return; } if (ch->pcdata->alignment == 0 && victim->pcdata->alignment != 0) { act("\x1B[1;32mYour code of honor prohibits you from stealing from anyone other than your own kind.\x1B[0m",ch,NULL,NULL,TO_CHAR); return; } WAIT_STATE (ch, 200); if (is_safe (ch, victim)) { if (IS_PLAYER (ch)) { act ("\x1B[1;37mYou feel as if the gods are watching, and a hot pain spreads", ch, NULL, NULL, TO_CHAR); act ("through your hand. OUCH! Perhaps you should not steal here...\x1B[0m", ch, NULL, NULL, TO_CHAR); } return; } else { if (victim->position == POSITION_FIGHTING || !is_member(ch, GUILD_THIEFG) || !is_member(ch, GUILD_ROGUE) || get_curr_dex(ch) < 28 || number_range(1,2) == 2 || (IS_PLAYER (ch) && ch->pcdata->learned[gsn_steal] < 60) || (IS_MOB (ch) && (number_range (1, 20) < 19)) || (IS_MOB (victim))) { send_to_char ("Oops.\n\r", ch); act ("$n tried to steal from you.\n\r", ch, NULL, victim, TO_VICT); act ("$n tried to steal from $N.\n\r", ch, NULL, victim, TO_NOTVICT); sprintf (buf, "%s is a bloody thief!", NAME (ch)); send_to_char (buf, victim); if (IS_PLAYER (ch)) { if (IS_MOB (victim)) multi_hit (victim, ch, TYPE_UNDEFINED); else multi_hit (victim, ch, TYPE_UNDEFINED); } return; } else { if ((obj = get_obj_inv (victim, arg1)) == NULL) { send_to_char ("You can't find it.\n\r", ch); return; } if (obj->wear_loc != -1) { send_to_char ("You can't steal things people are WEARING or HOLDING!!!\n\r", ch); return; } if (!can_drop_obj (ch, obj) || IS_SET (obj->extra_flags, ITEM_INVENTORY)) { send_to_char ("You can't pry it away.\n\r", ch); return; } if (number_range (1, 5) == 2) { act ("$N's suddenly looks your way, and you whistle innocently.", ch, NULL, victim, TO_CHAR); return; } obj_from (obj); obj_to (obj, ch); if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(ch)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) SET_BIT(ch->act, PLR_HAS_BOAT); } if (obj->pIndexData->item_type == ITEM_VEHICLE && IS_PLAYER(victim)) { I_VEHICLE *veh = (I_VEHICLE *) obj->more; if (veh->sector_use == SECT_WATER_SWIM || veh->sector_use == SECT_WATER_NOSWIM) REMOVE_BIT(victim->act, PLR_HAS_BOAT); } obj->wear_loc = -1; send_to_char ("Stolen.\n\r", ch); skill_gain (ch, gsn_steal, FALSE); } return; } return; } void do_light (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; SINGLE_OBJECT *obj2; I_LIGHT *lt; I_TOOL *tb; DEFINE_COMMAND ("light", do_light, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to light a light source.") argy = one_argy (argy, arg); if (arg[0] == '\0') obj = get_item_held (ch, ITEM_LIGHT); else obj = get_obj_inv (ch, arg); obj2 = get_obj_inv (ch, "tinderbox"); if (obj == NULL) { send_to_char ("You don't have the light.\n\r", ch); return; } if (obj->pIndexData->item_type != ITEM_LIGHT) { send_to_char ("You can't light that!\n\r", ch); return; } lt = (I_LIGHT *) obj->more; if (IS_LIT (obj)) { send_to_char ("It's lit already!\n\r", ch); return; } if (lt->light_now <= 0) { send_to_char ("It's out of fuel.\n\r", ch); return; } if (obj2 == NULL) { send_to_char ("You don't have anything to light it with!\n\r", ch); return; } tb = (I_TOOL *) obj2->more; if (use_tool (obj2, TOOL_TINDERBOX) && !IS_SET(lt->light_lit, LIGHT_LIT)) { SET_BIT (lt->light_lit, LIGHT_LIT); act ("$n lights $p with $P.", ch, obj, obj2, TO_ROOM); act ("You light $p with $P.", ch, obj, obj2, TO_CHAR); if (obj->wear_loc != -1) { if (ch->in_room->light < 0) ch->in_room->light = 0; ch->in_room->light++; if (IS_PLAYER(ch)) ch->pcdata->light++; } if (tb->uses == 1) { send_to_char ("Your tinderbox is almost out of tinder, and the flint is starting to chip.\n\r", ch); } if (tb->uses == 0) { send_to_char ("Your tinderbox is out of tinder and the flint is chipped...\n\rTime to buy a new one!\n\r", ch); obj_from (obj2); free_it (obj2); } return; } else { send_to_char ("You can't light it with that.\n\r", ch); return; } return; } void do_extinguish (CHAR_DATA * ch, char *argy) { char arg[SML_LENGTH]; SINGLE_OBJECT *obj; I_LIGHT *lt; DEFINE_COMMAND ("extinguish", do_extinguish, POSITION_RESTING, 0, LOG_NORMAL, "Allows you to extinguish a light source.") argy = one_argy (argy, arg); if (arg[0] == '\0') obj = get_item_held (ch, ITEM_LIGHT); /*held */ else obj = get_obj_inv (ch, arg); if (obj == NULL) { send_to_char ("You don't have the light in your hands.\n\r", ch); return; } if (obj->pIndexData->item_type != ITEM_LIGHT) { send_to_char ("That's not a light source.\n\r", ch); return; } lt = (I_LIGHT *) obj->more; if (!IS_LIT (obj)) { send_to_char ("It's extinguished already!\n\r", ch); return; } REMOVE_BIT (lt->light_lit, LIGHT_LIT); act ("$n extinguishes $p.", ch, obj, NULL, TO_ROOM); act ("You extinguish $p.", ch, obj, NULL, TO_CHAR); if (obj->wear_loc != -1) { ch->in_room->light--; if (ch->in_room->light < 0) ch->in_room->light = 0; if (IS_PLAYER(ch)) { ch->pcdata->light--; if (ch->pcdata->light < 0) ch->pcdata->light = 0; } } return; } void do_butcher (CHAR_DATA * ch, char *argy) /*By Arcane */ { SINGLE_OBJECT *obj, *weap, *steak; int count, x; char buf[80]; DEFINE_COMMAND ("butcher", do_butcher, POSITION_STANDING, 0, LOG_NORMAL, "Allows you to butcher a corpse into steaks. Based on your butcher skill.") if (argy[0] == '\0') { send_to_char ("What do you want to butcher?\n\r", ch); return; } if ((obj = get_obj_here (ch, argy, SEARCH_ROOM_FIRST)) == NULL) { send_to_char ("That's not here.\n\r", ch); return; } if (obj->pIndexData->item_type != ITEM_CORPSE_NPC) { send_to_char ("You can't butcher that!\n\r", ch); return; } if ((weap = get_item_held (ch, ITEM_WEAPON)) == NULL) { send_to_char ("You need something to cut with!\n\r", ch); return; } if (!IS_SET (weap->extra_flags, ITEM_PIERCE) && !IS_SET (weap->extra_flags, ITEM_SLASHING) && !IS_SET (weap->extra_flags, ITEM_HEAVY_SLASH) && !IS_SET (weap->extra_flags, ITEM_LIGHT_SLASH)) { send_to_char ("You need something sharp to cut with!\n\r", ch); return; } if (number_range (0, 100) > ch->pcdata->learned[gsn_butcher]) { send_to_char ("Your clumsy hands destroy the corpse.\n\r", ch); free_it (obj); return; } count = dice (1, 3); sprintf (buf, "You slice and dice the corpse into %d steak%s.\n\r", count, (count > 1 ? "s" : "")); send_to_char (buf, ch); for (x = 0; x < count; x++) { steak = create_object (get_obj_index (110), 0); steak->timer = number_range (13, 20); if (dice (1, 100) == 13) { /*sprintf(buf,"a greenish steak"); free_string( steak->short_descr ); steak->short_descr = str_dup( buf ); */ ((I_FOOD *) steak->more)->not_poison = 1; } obj_to (steak, ch->in_room); } skill_gain (ch, gsn_butcher, TRUE); free_it (obj); return; }